// initialize exact solution void setExactSolution(FVMesh2D &m,FVVect<double> &sol,Parameter ¶) { FVCell2D *ptr_c; m.beginCell(); while((ptr_c=m.nextCell())) { sol[ptr_c->label-1]=ptr_c->getMeanValue(solExact,para); } }
// compute source term void setRHS(FVMesh2D &m,FVVect<double> &rhs,Parameter ¶) { FVCell2D *ptr_c; m.beginCell(); while((ptr_c=m.nextCell())) { rhs[ptr_c->label-1]=ptr_c->getMeanValue(RHS,para); } }
void Gmsh::FVMesh2Gmsh(FVMesh2D &m) // constructor which convert a FVMesh2D into a gmah struct { _dim=2; // a two dimension mesh FVVertex2D* ptr_v; _nb_node=m.getNbVertex(); _node.resize(_nb_node); for((ptr_v=m.beginVertex()); (ptr_v=m.nextVertex());) { size_t i=ptr_v->label; _node[i-1].label = i; _node[i-1].coord.x= ptr_v->coord.x; _node[i-1].coord.y= ptr_v->coord.y; _node[i-1].coord.z= 0; } FVCell2D *ptr_c; double order[4],doux; size_t noux; FVPoint2D<double> Paux; _nb_element=m.getNbCell(); _element.resize(_nb_element); for((ptr_c=m.beginCell()); (ptr_c=m.nextCell());) { size_t i=ptr_c->label; _element[i-1].label=i; switch(ptr_c->nb_vertex) { case 3: _element[i-1].type_element=2; // we use triangle break; case 4: _element[i-1].type_element=3; // we use quadrangle break; default: cout<<"cell does not correspond to a gmsh element. Abort convertion"<<endl; _nb_node=0; _nb_element=0; return; } _element[i-1].code_physical=ptr_c->code; _element[i-1].code_elementary=ptr_c->code; _element[i-1].dim=_dim; _element[i-1].nb_node=ptr_c->nb_vertex; for(size_t j=0; j<ptr_c->nb_vertex; j++) { _element[i-1].node[j]=ptr_c->vertex[j]->label; Paux.x=_node[_element[i-1].node[j]-1].coord.x-ptr_c->centroid.x; Paux.y=_node[_element[i-1].node[j]-1].coord.y-ptr_c->centroid.y; Paux/=Norm(Paux); order[j]=(1-Paux.x)*0.5; if(Paux.y<0) order[j]*=-1; } // reordering the node (bubble sort) to cast in the gmah framework following order for(size_t j=ptr_c->nb_vertex-1; j>0; j--) { for(size_t k=0; k<j; k++) { if(order[k+1]<order[k]) { doux=order[k+1]; noux=_element[i-1].node[k+1]; order[k+1]=order[k]; _element[i-1].node[k+1]=_element[i-1].node[k]; order[k]=doux; _element[i-1].node[k]=noux; } } } } }