00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef __FEM_H
00031 #ifdef __GNUG__
00032 #pragma interface
00033 #endif
00034 #define __FEM_H 1
00035
00036 #define nhowmax 20
00037
00038 #include <femCommon.hpp>
00039
00040 #include <femMisc.hpp>
00041
00042 namespace fem
00043 {
00044 DECLARE_CLASS( FEM );
00045 DECLARE_CLASS( femMesh );
00046
00055 class FEM
00056 {
00057 public:
00058
00062 DECLARE_TYPE( femMesh::femPoint, femPoint );
00063 DECLARE_TYPE( femMesh::femTriangle, femTriangle );
00064
00065 DECLARE_TYPE( creal*, cmatptr );
00066 DECLARE_TYPE( float*, matptr );
00068
00072
00074 FEM( femMeshPtr = 0, int quadra = 0 );
00075
00077 ~FEM();
00078
00084 float solvePDE( fcts *param, int how);
00085
00088 creal deriv (int m, creal * f, int ksolv, int i);
00089
00092 creal convect(creal* f, creal* u1, creal* u2, float dt, int i);
00093
00096 creal rhsConvect(creal* f, creal* u1, creal* u2, float dt, int i);
00097
00100 creal fctval(creal* f,float x,float y);
00101
00105 int getregion(int k);
00106
00107 creal gfemuser( creal what, creal *f, int i);
00108 creal P1ctoP1(creal* f, int i);
00109 creal prodscalar(creal* f, creal* g);
00110
00111 creal ginteg(int, int, int, creal*, creal*, int);
00112 creal binteg(int, int, int, creal*, creal*, int);
00113
00114 void initvarmat ( int how, int flagcomplexe,int N, fcts* param);
00115 void assemble ( int how, int flagcomplexe,int N, int k, creal* a, creal* b, fcts* param);
00116 void solvevarpde(int N, fcts* param, int how);
00117
00119
00120 private:
00121
00122 float norm( float, float ) const;
00123
00124 int doedge (void);
00125 int Tconvect (int k, double u1k, double u2k, double x, double y, double *mu, double *nu);
00126 int xtoX (creal * u1, creal * u2, float *dt, float *x, float *y, int *k);
00127 int barycoor (float x, float y, int k, float *xl0, float *xl1, float *xl2);
00128 void rhsPDE(Acvect & fw, Acvect & f, Acvect & g);
00129 int buildarea();
00130 void connectiv (void);
00131
00134 cmat id(cvect& x);
00135
00136 void pdemat (Acmat & a, Acmat & alpha,
00137 Acmat & rho11, Acmat & rho12, Acmat & rho21, Acmat & rho22,
00138 Acmat & u1, Acmat & u2, Acmat & beta);
00139 float gaussband (Acmat & a, Acvect & x, long n, long bdth, int first, float eps);
00140 float pdeian (Acmat & a, Acvect & u, Acvect & f, Acvect & g, Acvect & u0,
00141 Acmat & alpha, Acmat & rho11, Acmat & rho12, Acmat & rho21, Acmat & rho22,
00142 Acmat & u1, Acmat & u2, Acmat & beta, int factorize);
00143
00144
00147 float id(float x);
00148
00155 void rhsPDE(float* fw, float* f, float* g);
00156
00164 float gaussband (float* a, float* x, long n, long bdthl, int first, float eps);
00165
00166 void pdemat (float* a, float* alpha,
00167 float* rho11, float* rho12, float* rho21, float* rho22,
00168 float* u1, float* u2, float* beta);
00175 float pdeian(float* a, float* u, float* f, float* g, float* u0,
00176 float* alpha, float* rho11, float* rho12, float* rho21, float* rho22,
00177 float* u1, float* u2, float* beta, int factorize);
00178
00181 void rhsPDE(creal* fw, creal* f, creal* g);
00182
00183 float gaussband (creal* a, creal* x, long n, long bdthl, int first, float eps);
00184
00185 float pdeian(creal* a, creal* u, creal* f, creal* g, creal* u0,
00186 creal* alpha, creal* rho11, creal* rho12, creal* rho21, creal* rho22,
00187 creal* u1, creal* u2, creal* beta, int factorize);
00188
00189 void pdemat (creal* a, creal* alpha,
00190 creal* rho11, creal* rho12, creal* rho21, creal* rho22,
00191 creal* u1, creal* u2, creal* beta);
00192
00196 creal binteg_t (int k, int ref1, int ref2, int ref3, creal* f, creal* g);
00197 creal ginteg_t (int k, creal* f, creal* g);
00198
00199 public:
00200
00201 float* normlx;
00202 float* normly;
00203
00204 private:
00205
00206 femMeshPtr __mesh;
00207 int __quadra;
00208
00209 int ns, nt;
00210 femPoint *q;
00211 femTriangle *me;
00212 int *ng;
00213 int *ngt;
00214
00215 int bug;
00216 int nhow;
00217 int nhow1;
00218 int nhow2;
00219
00220 struct
00221 {
00222 int N;
00223 int nhow;
00224 }whatmat[nhowmax];
00225
00226 float *area;
00227 AAcmat a2;
00228 creal *a1c[nhowmax];
00229 creal *gconvect;
00230 int rhsQuadra;
00231 float *a1[nhowmax];
00232 int *triauptr;
00233 int *triaunb;
00234 long bdth;
00235
00236 int *Tleft;
00237 int *Tright;
00238 int *lowV;
00239 int *highV;
00240 int *listHead;
00241 femTriangle *edgeT;
00242 int ne;
00243
00244 };
00245 }
00246 #endif