proteus 1.9.0
C/C++/Fortran libraries
Loading...
Searching...
No Matches
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
14double *dvector(long, long);
15double **dmatrix(long nrl, long nrh, long ncl, long nch);
16void free_dvector(double *, long , long );
17void free_dmatrix(double **m, long nrl, long nrh, long ncl, long nch);
18
19extern char Case[];
20
21#include "Headers.h"
22
23// **************************************************
24// CALCULATE INITIAL SOLUTION FROM LINEAR WAVE THEORY
25// **************************************************
26
27void init()
28{
29int i;
30double a, b, t;
31
32iff(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 }
39else
40 z[1]=2.*pi*height/Hoverd;
41
42z[2]=z[1]*Hoverd;
43z[4]=sqrt(tanh(z[1]));
44z[3]=2.*pi/z[4];
46 {
47 z[5]=Current*sqrt(z[2]);
48 z[6]=0.;
49 }
50else
51 {
52 z[6]=Current*sqrt(z[2]);
53 z[5]=0.;
54 }
55z[7]=z[4];
56z[8]=0.;
57z[9]=0.5*z[7]*z[7];
58cosa[0]=1.;
59sina[0]=0.;
60z[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 }
70z[n+11]=0.5*z[2]/z[7];
71
72for( i=1 ; i<=9 ; i++ )
73 sol[i][1] = z[i];
74for( i=10 ; i<=num ; i++ )
75 sol[i][1] = 0.;
76
77return;
78}
79
80// EVALUATION OF EQUATIONS.
81
82double Eqns(double *rhs)
83{
84int i, j, m, it, nm;
85double c, e, s, u, v;
86
87rhs[1]=z[2]-z[1]*Hoverd;
88
89iff(Case,Wavelength)
90 rhs[2]=z[2]-2.*pi*height;
91else
92 rhs[2]=z[2]-height*z[3]*z[3];
93
94rhs[3]=z[4]*z[3]-pi-pi;
95rhs[4]=z[5]+z[7]-z[4];
96rhs[5]=z[6]+z[7]-z[4];
97
98rhs[5]=rhs[5]-z[8]/z[1];
99for (i=1; i<=n; i++ )
100 {
101 coeff[i]=z[n+i+10];
102 Tanh[i] = tanh(i*z[1]);
103 }
104it=6;
105if(Current_criterion==1)it=5;
106rhs[6]=z[it]-Current*sqrt(z[1]); // Correction made 20.5.2013, z[2] changed to z[1]
107rhs[7]=z[10]+z[n+10];
108for (i=1 ; i<= n-1 ; i++ )
109 rhs[7]=rhs[7]+z[10+i]+z[10+i];
110rhs[8]=z[10]-z[n+10]-z[2];
111for ( 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
130for (j=1, s=0. ; j <= num ; j++ ) s += rhs[j]*rhs[j];
131return s;
132}
133
134// **************************************************
135// SET UP JACOBIAN MATRIX AND SOLVE MATRIX EQUATION
136// **************************************************
137
138double Newton(int count)
139{
140double **a, *rhs, *x;
141double h, sum;
142void Solve(double **, double *, int, int, double *, int, int);
143
144int i, j;
145
146Eqns(rhs1);
147
148if(count>=1)
149{
150++count;
151rhs=dvector(1,num);
152x=dvector(1,num);
153a=dmatrix(1,num,1,num);
154}
155
156for ( 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
172Solve(a, rhs, (int)num, (int)num, x, (int)num, (int)num);
173
174for ( i=1 ; i<=num ; i++ )
175 z[i] += x[i];
176
177for ( sum = 0., i=10 ; i<= n+10 ; i++ )
178 sum += fabs(x[i]);
179sum /= n;
180
181free_dvector(rhs,1,num);
182free_dvector(x,1,num);
183free_dmatrix(a,1,num,1,num);
184
185return(sum);
186}
187
void free_dmatrix(double **m, long nrl, long nrh, long ncl, long nch)
Definition Util.cpp:44
double ** dmatrix(long nrl, long nrh, long ncl, long nch)
Definition Util.cpp:16
void free_dvector(double *v, long nl, long nh)
Definition Util.cpp:38
double * dvector(long nl, long nh)
Definition Util.cpp:7
void init(void)
void Solve(void)
Int n
Definition Headers.h:28
Double * rhs1
Definition Headers.h:44
Int Current_criterion
Definition Headers.h:27
#define pi
Definition Headers.h:2
Double ** sol
Definition Headers.h:40
Double Hoverd
Definition Headers.h:68
Double sum
Definition Headers.h:85
Double height
Definition Headers.h:69
Double * cosa
Definition Headers.h:43
Double s
Definition Headers.h:84
Double u
Definition Headers.h:89
Int num
Definition Headers.h:32
Double * sina
Definition Headers.h:46
Double * z
Definition Headers.h:49
Double v
Definition Headers.h:95
Double * Tanh
Definition Headers.h:47
Double psi
Definition Headers.h:78
Double * coeff
Definition Headers.h:42
Double * rhs2
Definition Headers.h:45
Double Current
Definition Headers.h:59
#define iff(x, y)
Definition Headers.h:3
double Eqns(double *rhs)
char Case[]
double Newton(int count)
#define c(i)
Definition jf.h:21