|
FreeFem 3.5.x
|
this class drives the resolution of the pde using the Finite Element Method. More...
#include <femSolver.hpp>
Public Member Functions | |
| DECLARE_TYPE (femMesh::femPoint, femPoint) | |
| Typedefs. | |
| DECLARE_TYPE (femMesh::femTriangle, femTriangle) | |
| DECLARE_TYPE (creal *, cmatptr) | |
| DECLARE_TYPE (float *, matptr) | |
| FEM (femMeshPtr=0, int quadra=0) | |
| Constructors, destructor and methods. | |
| ~FEM () | |
| destructor | |
| float | solvePDE (fcts *param, int how) |
| solve the PDE | |
| creal | deriv (int m, creal *f, int ksolv, int i) |
| creal | convect (creal *f, creal *u1, creal *u2, float dt, int i) |
| creal | rhsConvect (creal *f, creal *u1, creal *u2, float dt, int i) |
| creal | fctval (creal *f, float x, float y) |
| int | getregion (int k) |
| creal | gfemuser (creal what, creal *f, int i) |
| creal | P1ctoP1 (creal *f, int i) |
| creal | prodscalar (creal *f, creal *g) |
| creal | ginteg (int, int, int, creal *, creal *, int) |
| creal | binteg (int, int, int, creal *, creal *, int) |
| void | initvarmat (int how, int flagcomplexe, int N, fcts *param) |
| void | assemble (int how, int flagcomplexe, int N, int k, creal *a, creal *b, fcts *param) |
| void | solvevarpde (int N, fcts *param, int how) |
Public Attributes | |
| float * | normlx |
| float * | normly |
| int | N |
this class drives the resolution of the pde using the Finite Element Method.
| fem::FEM::FEM | ( | femMeshPtr | __t = 0, |
| int | quadra = 0 |
||
| ) |
Constructors, destructor and methods.
default constructor
:
__mesh( __t ),
__quadra( quadra ),
bug( 0 ),
nhow( 0 ),
nhow1( 0 ),
nhow2( 0 ),
a1c(),
rhsQuadra( 0 )
{
int i, k, baux, nquad;
ns = __mesh->getNumberOfPoints();
nt = __mesh->getNumberOfCells();
q = __mesh->rp;
me = __mesh->tr;
ng = __mesh->ng;
ngt = __mesh->ngt;
bdth = 0;
nquad = __quadra ? 3 * nt : ns;
for (k = 0; k < nt; k++)
for (i = 0; i <= 2; i++)
{
baux = abss ((me[k][i] - me[k][next[i]]));
bdth = (bdth > baux) ? bdth : baux;
}
a2.destroy();
a2.init (nhowmax);
for( int __i = 0; __i < nhowmax; __i++)
{
a1c[__i] = 0;
}
area = new float[nt];
normlx = new float[nquad];
normly = new float[nquad];
for (i = 0;i < nquad;i++)
{
normlx[i] = 0.F;
normly[i] = 0.F;
}
nhow1 = 0;
nhow2 = 0;
connectiv ();
flag.fem = 1;
doedge ();
buildarea();
}
| int fem::FEM::getregion | ( | int | k | ) |
{
return __mesh->ngt[listHead[i]];
}
| float fem::FEM::solvePDE | ( | fcts * | param, |
| int | how | ||
| ) |
solve the PDE
| param | contain all the possible data for computation |
| how | defines if the P1 quadrature |
{
long nsl = ((long) ns) * (2 * ((long) bdth) + 1);
int factorize = 1;
if (how > nhowmax)
erreur ("Too many linear systems");
if (how < 0)
{
factorize = 0;
how = -how;
if (((how > nhow1) && (N == 1)) || ((how > nhow2) && (N == 2)))
{
sprintf (errbuf, "solve(..,'-%d') refers to an inexistant system", how);
erreur (errbuf);
}
}
if (((how > nhow1) && (N == 1)) || ((how > nhow2) && (N == 2)))
{
switch (N)
{
case 1:
if (flag.complexe)
a1c[nhow1++] = new creal[nsl];
else
a1[nhow1++] = new float[nsl];
break;
case 2:
a2[nhow2++].init (nsl);
break;
}
}
if (flag.complexe)
{
if (N == 1)
return pdeian (a1c[how - 1], param->sol1c, param->f1c, param->g1c, param->p1c, param->b1c,
param->nuxx1c, param->nuxy1c, param->nuyx1c, param->nuyy1c, param->a11c,
param->a21c, param->c1c, factorize);
else if (N == 2)
return pdeian (a2[how - 1], param->sol2, param->f2, param->g2, param->p2, param->b2,
param->nuxx2, param->nuxy2, param->nuyx2, param->nuyy2, param->a12,
param->a22, param->c2, factorize);
else
return -1.F;
}
else
{
if (N == 1)
return pdeian (a1[how - 1], param->sol1, param->f1, param->g1, param->p1, param->b1,
param->nuxx1, param->nuxy1, param->nuyx1, param->nuyy1, param->a11,
param->a21, param->c1, factorize);
else if (N == 2)
return pdeian (a2[how - 1], param->sol2, param->f2, param->g2, param->p2, param->b2,
param->nuxx2, param->nuxy2, param->nuyx2, param->nuyy2, param->a12,
param->a22, param->c2, factorize);
else
return -1.F;
}
}