proteus
1.9.0
C/C++/Fortran libraries
Toggle main menu visibility
Loading...
Searching...
No Matches
work
cekees
proteus
proteus
fenton
Subroutines.cpp
Go to the documentation of this file.
1
2
// SUBROUTINES FOR FOURIER APPROXIMATION METHOD
3
4
#include <math.h>
5
#include <stdio.h>
6
#include <string.h>
7
8
#define iff(x,y) if(strcmp(x,#y)==0)
9
#define pi 3.14159265358979324
10
11
#define Int extern int
12
#define Double extern double
13
14
double
*
dvector
(
long
,
long
);
15
double
**
dmatrix
(
long
nrl,
long
nrh,
long
ncl,
long
nch);
16
void
free_dvector
(
double
*,
long
,
long
);
17
void
free_dmatrix
(
double
**m,
long
nrl,
long
nrh,
long
ncl,
long
nch);
18
19
extern
char
Case
[];
20
21
#include "
Headers.h
"
22
23
// **************************************************
24
// CALCULATE INITIAL SOLUTION FROM LINEAR WAVE THEORY
25
// **************************************************
26
27
void
init
()
28
{
29
int
i;
30
double
a, b, t;
31
32
iff
(
Case
,Period)
33
{
34
a=4.*
pi
*
pi
*
height
/
Hoverd
;
35
b=a/sqrt(tanh(a));
36
t=tanh(b);
37
z
[1]=b+(a-b*t)/(t+b*(1.-t*t));
38
}
39
else
40
z
[1]=2.*
pi
*
height
/
Hoverd
;
41
42
z
[2]=
z
[1]*
Hoverd
;
43
z
[4]=sqrt(tanh(
z
[1]));
44
z
[3]=2.*
pi
/
z
[4];
45
if
(
Current_criterion
==1)
46
{
47
z
[5]=
Current
*sqrt(
z
[2]);
48
z
[6]=0.;
49
}
50
else
51
{
52
z
[6]=
Current
*sqrt(
z
[2]);
53
z
[5]=0.;
54
}
55
z
[7]=
z
[4];
56
z
[8]=0.;
57
z
[9]=0.5*
z
[7]*
z
[7];
58
cosa
[0]=1.;
59
sina
[0]=0.;
60
z
[10]=0.5*
z
[2];
61
for
( i=1 ; i<=
n
; i++ )
62
{
63
cosa
[i]=cos(i*
pi
/
n
);
64
cosa
[i+
n
]=cos((i+
n
)*
pi
/
n
);
65
sina
[i]=sin(i*
pi
/
n
);
66
sina
[i+
n
]=sin((i+
n
)*
pi
/
n
);
67
z
[
n
+i+10]=0.;
68
z
[i+10]=0.5*
z
[2]*
cosa
[i];
69
}
70
z
[
n
+11]=0.5*
z
[2]/
z
[7];
71
72
for
( i=1 ; i<=9 ; i++ )
73
sol
[i][1] =
z
[i];
74
for
( i=10 ; i<=
num
; i++ )
75
sol
[i][1] = 0.;
76
77
return
;
78
}
79
80
// EVALUATION OF EQUATIONS.
81
82
double
Eqns
(
double
*rhs)
83
{
84
int
i, j, m, it, nm;
85
double
c
, e,
s
,
u
,
v
;
86
87
rhs[1]=
z
[2]-
z
[1]*
Hoverd
;
88
89
iff
(
Case
,Wavelength)
90
rhs[2]=
z
[2]-2.*
pi
*
height
;
91
else
92
rhs[2]=
z
[2]-
height
*
z
[3]*
z
[3];
93
94
rhs[3]=
z
[4]*
z
[3]-
pi
-
pi
;
95
rhs[4]=
z
[5]+
z
[7]-
z
[4];
96
rhs[5]=
z
[6]+
z
[7]-
z
[4];
97
98
rhs[5]=rhs[5]-
z
[8]/
z
[1];
99
for
(i=1; i<=
n
; i++ )
100
{
101
coeff
[i]=
z
[
n
+i+10];
102
Tanh
[i] = tanh(i*
z
[1]);
103
}
104
it=6;
105
if
(
Current_criterion
==1)it=5;
106
rhs[6]=
z
[it]-
Current
*sqrt(
z
[1]);
// Correction made 20.5.2013, z[2] changed to z[1]
107
rhs[7]=
z
[10]+
z
[
n
+10];
108
for
(i=1 ; i<=
n
-1 ; i++ )
109
rhs[7]=rhs[7]+
z
[10+i]+
z
[10+i];
110
rhs[8]=
z
[10]-
z
[
n
+10]-
z
[2];
111
for
( m=0 ; m <=
n
; m++ )
112
{
113
psi
=0.;
114
u
=0.;
115
v
=0.;
116
for
(j=1 ; j <=
n
; j++ )
117
{
118
nm = (m*j) % (
n
+
n
);
119
e=exp(j*(
z
[10+m]));
120
s
=0.5*(e-1./e);
121
c
=0.5*(e+1./e);
122
psi
=
psi
+
coeff
[j]*(
s
+
c
*
Tanh
[j])*
cosa
[nm];
123
u
=
u
+j*
coeff
[j]*(
c
+
s
*
Tanh
[j])*
cosa
[nm];
124
v
=
v
+j*
coeff
[j]*(
s
+
c
*
Tanh
[j])*
sina
[nm];
125
}
126
rhs[m+9]=
psi
-
z
[8]-
z
[7]*
z
[m+10];
127
rhs[
n
+m+10]=0.5*(pow((-
z
[7]+
u
),2.)+
v
*
v
)+
z
[m+10]-
z
[9];
128
}
129
130
for
(j=1,
s
=0. ; j <=
num
; j++ )
s
+= rhs[j]*rhs[j];
131
return
s
;
132
}
133
134
// **************************************************
135
// SET UP JACOBIAN MATRIX AND SOLVE MATRIX EQUATION
136
// **************************************************
137
138
double
Newton
(
int
count)
139
{
140
double
**a, *rhs, *x;
141
double
h,
sum
;
142
void
Solve
(
double
**,
double
*,
int
,
int
,
double
*,
int
,
int
);
143
144
int
i, j;
145
146
Eqns
(
rhs1
);
147
148
if
(count>=1)
149
{
150
++count;
151
rhs=
dvector
(1,
num
);
152
x=
dvector
(1,
num
);
153
a=
dmatrix
(1,
num
,1,
num
);
154
}
155
156
for
( i=1 ; i<=
num
; i++ )
157
{
158
h=0.01*
z
[i];
159
if
(fabs(
z
[i]) < 1.e-4) h = 1.e-5;
160
z
[i]=
z
[i]+h;
161
Eqns
(
rhs2
);
162
z
[i]=
z
[i]-h;
163
rhs[i] = -
rhs1
[i];
164
for
( j=1 ; j<=
num
; j++ )
165
a[j][i] = (
rhs2
[j] -
rhs1
[j])/h;
166
}
167
168
// **************************************************
169
// SOLVE MATRIX EQUATION
170
// **************************************************
171
172
Solve
(a, rhs, (
int
)
num
, (
int
)
num
, x, (
int
)
num
, (
int
)
num
);
173
174
for
( i=1 ; i<=
num
; i++ )
175
z
[i] += x[i];
176
177
for
(
sum
= 0., i=10 ; i<=
n
+10 ; i++ )
178
sum
+= fabs(x[i]);
179
sum
/=
n
;
180
181
free_dvector
(rhs,1,
num
);
182
free_dvector
(x,1,
num
);
183
free_dmatrix
(a,1,
num
,1,
num
);
184
185
return
(
sum
);
186
}
187
free_dmatrix
void free_dmatrix(double **m, long nrl, long nrh, long ncl, long nch)
Definition
Util.cpp:44
dmatrix
double ** dmatrix(long nrl, long nrh, long ncl, long nch)
Definition
Util.cpp:16
free_dvector
void free_dvector(double *v, long nl, long nh)
Definition
Util.cpp:38
dvector
double * dvector(long nl, long nh)
Definition
Util.cpp:7
init
void init(void)
Solve
void Solve(void)
Headers.h
n
Int n
Definition
Headers.h:28
rhs1
Double * rhs1
Definition
Headers.h:44
Current_criterion
Int Current_criterion
Definition
Headers.h:27
pi
#define pi
Definition
Headers.h:2
sol
Double ** sol
Definition
Headers.h:40
Hoverd
Double Hoverd
Definition
Headers.h:68
sum
Double sum
Definition
Headers.h:85
height
Double height
Definition
Headers.h:69
cosa
Double * cosa
Definition
Headers.h:43
s
Double s
Definition
Headers.h:84
u
Double u
Definition
Headers.h:89
num
Int num
Definition
Headers.h:32
sina
Double * sina
Definition
Headers.h:46
z
Double * z
Definition
Headers.h:49
v
Double v
Definition
Headers.h:95
Tanh
Double * Tanh
Definition
Headers.h:47
psi
Double psi
Definition
Headers.h:78
coeff
Double * coeff
Definition
Headers.h:42
rhs2
Double * rhs2
Definition
Headers.h:45
Current
Double Current
Definition
Headers.h:59
iff
#define iff(x, y)
Definition
Headers.h:3
Eqns
double Eqns(double *rhs)
Definition
Subroutines.cpp:82
Case
char Case[]
Newton
double Newton(int count)
Definition
Subroutines.cpp:138
c
#define c(i)
Definition
jf.h:21
Generated on
for proteus by
1.18.0