diff --git a/Solver/_ b/Solver/_ deleted file mode 100644 index 0f2c8223facb9a348b52c3edb0df2d2cb909cfed..0000000000000000000000000000000000000000 --- a/Solver/_ +++ /dev/null @@ -1,330 +0,0 @@ -#include "dgGroupOfElements.h" -#include "MElement.h" -#include "functionSpace.h" -#include "Numeric.h" -#include "MTriangle.h" -#include "MLine.h" - -static fullMatrix<double> * dgGetIntegrationRule (MElement *e, int p){ - int npts; - IntPt *pts; - e->getIntegrationPoints(2*p+1, &npts, &pts); - fullMatrix<double> *m = new fullMatrix<double> (npts, 4); - for (int i=0;i<npts;i++){ - (*m)(i,0) = pts[i].pt[0]; - (*m)(i,1) = pts[i].pt[1]; - (*m)(i,2) = pts[i].pt[2]; - (*m)(i,3) = pts[i].weight; - } - return m; -} - -static fullMatrix<double> * dgGetFaceIntegrationRuleOnElement ( - const functionSpace *fsFace, - const fullMatrix<double> &intgFace, - const functionSpace *fsElement, - const std::vector <int> *closure) { - int npts=intgFace.size1(); - fullMatrix<double> *m = new fullMatrix<double> (npts, 4); - double f[256]; - for (int i=0;i<npts;i++){ - fsFace->f(intgFace(i,0),intgFace(i,1),intgFace(i,2),f); - for(size_t j=0; j<closure->size();j++){ - int jNod=(*closure)[j]; - (*m)(i,0) += f[j] * fsElement->points(jNod,0); - (*m)(i,1) += f[j] * fsElement->points(jNod,1); - (*m)(i,2) += f[j] * fsElement->points(jNod,2); - (*m)(i,3) = intgFace(i,3); - } - } - return m; -} - - -dgGroupOfElements::dgGroupOfElements(const std::vector<MElement*> &e, int polyOrder) - : _elements(e), - _fs(*_elements[0]->getFunctionSpace(polyOrder)), - _integration(dgGetIntegrationRule (_elements[0], polyOrder) - ) -{ - _dimUVW = _dimXYZ = e[0]->getDim(); - // this is the biggest piece of data ... the mappings - int nbNodes = _fs.coefficients.size1(); - _redistributionFluxes[0] = new fullMatrix<double> (nbNodes,_integration->size1()); - _redistributionFluxes[1] = new fullMatrix<double> (nbNodes,_integration->size1()); - _redistributionFluxes[2] = new fullMatrix<double> (nbNodes,_integration->size1()); - _redistributionSource = new fullMatrix<double> (nbNodes,_integration->size1()); - _collocation = new fullMatrix<double> (_integration->size1(),nbNodes); - _mapping = new fullMatrix<double> (e.size(), 10 * _integration->size1()); - _imass = new fullMatrix<double> (nbNodes,nbNodes*e.size()); - double g[256][3],f[256]; - for (int i=0;i<_elements.size();i++){ - MElement *e = _elements[i]; - fullMatrix<double> imass(*_imass,nbNodes*i,nbNodes); - for (int j=0;j< _integration->size1() ; j++ ){ - _fs.f((*_integration)(j,0), (*_integration)(j,1), (*_integration)(j,2), f); - double jac[3][3],ijac[3][3],detjac; - (*_mapping)(i,10*j + 9) = - e->getJacobian ((*_integration)(j,0), (*_integration)(j,1), (*_integration)(j,2), jac); - const double weight = (*_integration)(j,3); - detjac=inv3x3(jac,ijac); - (*_mapping)(i,10*j + 0) = ijac[0][0]; - (*_mapping)(i,10*j + 1) = ijac[0][1]; - (*_mapping)(i,10*j + 2) = ijac[0][2]; - (*_mapping)(i,10*j + 3) = ijac[1][0]; - (*_mapping)(i,10*j + 4) = ijac[1][1]; - (*_mapping)(i,10*j + 5) = ijac[1][2]; - (*_mapping)(i,10*j + 6) = ijac[2][0]; - (*_mapping)(i,10*j + 7) = ijac[2][1]; - (*_mapping)(i,10*j + 8) = ijac[2][2]; - (*_mapping)(i,10*j + 9) = detjac; - for (int k=0;k<_fs.coefficients.size1();k++){ - for (int l=0;l<_fs.coefficients.size1();l++) { - imass(k,l) += f[k]*f[l]*weight*detjac; - } - } - } - imass.invertInPlace(); - } - // redistribution matrix - // quadrature weight x parametric gradients in quadrature points - - for (int j=0;j<_integration->size1();j++) { - _fs.df((*_integration)(j,0), - (*_integration)(j,1), - (*_integration)(j,2), g); - _fs.f((*_integration)(j,0), - (*_integration)(j,1), - (*_integration)(j,2), f); - const double weight = (*_integration)(j,3); - for (int k=0;k<_fs.coefficients.size1();k++){ - (*_redistributionFluxes[0])(k,j) = g[k][0] * weight; - (*_redistributionFluxes[1])(k,j) = g[k][1] * weight; - (*_redistributionFluxes[2])(k,j) = g[k][2] * weight; - (*_redistributionSource)(k,j) = f[k] * weight; - (*_collocation)(j,k) = f[k]; - } - } -} - -dgGroupOfElements::~dgGroupOfElements(){ - delete _integration; - delete _redistributionFluxes[0]; - delete _redistributionFluxes[1]; - delete _redistributionFluxes[2]; - delete _redistributionSource; - delete _mapping; - delete _collocation; - delete _imass; -} - - -void dgGroupOfFaces::computeFaceNormals () { - double g[256][3]; - _normals = new fullMatrix<double> (3,_fsFace->points.size1()*_faces.size()); - int index = 0; - for (size_t i=0; i<_faces.size();i++){ - const std::vector<int> &closure=*_closuresLeft[i]; - fullMatrix<double> *intLeft=dgGetFaceIntegrationRuleOnElement(_fsFace,*_integration,_fsLeft,&closure); - for (int j=0; j<intLeft->size1(); j++){ - _fsLeft->df((*intLeft)(j,0),(*intLeft)(j,1),(*intLeft)(j,2),g); - double &nx=(*_normals)(0,index); - double &ny=(*_normals)(1,index); - double &nz=(*_normals)(2,index); - for (size_t k=0; k<closure.size(); k++){ - nx += g[closure[k]][0]; - ny += g[closure[k]][1]; - nz += g[closure[k]][2]; - } - double norm = sqrt(nx*nx+ny*ny+nz*nz); - nx/=norm; - ny/=norm; - nz/=norm; - index++; - } - delete intLeft; - } -} - -void dgGroupOfFaces::addFace(const MFace &topoFace, int iElLeft, int iElRight){ - // compute all closures - // compute closures for the interpolation - _left.push_back(iElLeft); - _right.push_back(iElRight); - MElement &elRight = *_groupRight.getElement(iElRight); - MElement &elLeft = *_groupLeft.getElement(iElLeft); - int ithFace, sign, rot; - elLeft.getFaceInfo (topoFace, ithFace, sign, rot); - _closuresLeft.push_back(&(_fsLeft->getFaceClosure(ithFace, sign, rot))); - elRight.getFaceInfo (topoFace, ithFace, sign, rot); - _closuresRight.push_back(&(_fsRight->getFaceClosure(ithFace, sign, rot))); - // compute the face element that correspond to the geometrical closure - // get the vertices of the face - std::vector<MVertex*> vertices; - for(int j=0;j<topoFace.getNumVertices();j++) - vertices.push_back(topoFace.getVertex(j)); - const std::vector<int> & geomClosure = elRight.getFunctionSpace()->getFaceClosure(ithFace, sign, rot); - for (int j=0; j<geomClosure.size() ; j++) - vertices.push_back( elRight.getVertex(geomClosure[j]) ); - // triangular face - if (topoFace.getNumVertices() == 3){ - switch(vertices.size()){ - case 3 : _faces.push_back(new MTriangle (vertices) ); break; - case 6 : _faces.push_back(new MTriangle6 (vertices) ); break; - case 10 : _faces.push_back(new MTriangleN (vertices, 3) ); break; - case 15 : _faces.push_back(new MTriangleN (vertices, 4) ); break; - case 21 : _faces.push_back(new MTriangleN (vertices, 5) ); break; - default : throw; - } - } - // quad face 2 do - else throw; -} -static std::vector<int> *fakeClosure2d(const functionSpace *fs, int ithEdge, int sign){ - std::vector<int> closure; - if(sign==1){ - closure.push_back(ithEdge); - closure.push_back((ithEdge+1)%3); - }else{ - closure.push_back((ithEdge+1)%3); - closure.push_back(ithEdge); - } - std::vector<int> closureHO = fs->getEdgeClosure(ithEdge, sign); - closure.insert(closure.end(),closureHO.begin(),closureHO.end()); - return new std::vector<int>(closure); -} - -void dgGroupOfFaces::addEdge(const MEdge &topoEdge, int iElLeft, int iElRight){ - _left.push_back(iElLeft); - _right.push_back(iElRight); - MElement &elRight = *_groupRight.getElement(iElRight); - MElement &elLeft = *_groupLeft.getElement(iElLeft); - int ithEdge, sign; - elLeft.getEdgeInfo (topoEdge, ithEdge, sign); - _closuresLeft.push_back(fakeClosure2d(_fsLeft, ithEdge, sign)); - elRight.getEdgeInfo (topoEdge, ithEdge, sign); - _closuresRight.push_back(fakeClosure2d(_fsRight, ithEdge, sign)); - const std::vector<int> &geomClosure = elRight.getFunctionSpace()->getEdgeClosure(ithEdge, sign); - std::vector<MVertex*> vertices; - for(int j=0;j<topoEdge.getNumVertices();j++) - vertices.push_back(topoEdge.getVertex(j)); - for (int j=0; j<geomClosure.size() ; j++) - vertices.push_back( elRight.getVertex(geomClosure[j]) ); - switch(vertices.size()){ - case 2 : _faces.push_back(new MLine (vertices) ); break; - case 3 : _faces.push_back(new MLine3 (vertices) ); break; - default : _faces.push_back(new MLineN (vertices) ); break; - } -} - -void dgGroupOfFaces::init(int pOrder) { - _fsFace = _faces[0]->getFunctionSpace (pOrder); - _integration=dgGetIntegrationRule (_faces[0],pOrder); - _redistribution = new fullMatrix<double> (_fsFace->coefficients.size1(),_integration->size1()); - _collocation = new fullMatrix<double> (_fsFace->coefficients.size1(), _integration->size1()); - _detJac = new fullMatrix<double> (_integration->size1(), _faces.size()); - double f[256]; - for (int j=0;j<_integration->size1();j++) { - _fsFace->f((*_integration)(j,0), (*_integration)(j,1), (*_integration)(j,2), f); - const double weight = (*_integration)(j,3); - for (int k=0;k<_fsFace->coefficients.size1();k++){ - (*_redistribution)(k,j) = f[j] * weight; - (*_collocation)(k,j) = f[k]; - } - } - for (int i=0;i<_faces.size();i++){ - MElement *f = _faces[i]; - for (int j=0;j< _integration->size1() ; j++ ){ - double jac[3][3],ijac[3][3],detjac; - f->getJacobian ((*_integration)(j,0), (*_integration)(j,1), (*_integration)(j,2), jac); - const double weight = (*_integration)(j,3); - (*_detJac)(j,i) = inv3x3(jac,ijac); - } - } - computeFaceNormals(); -} - -dgGroupOfFaces::~dgGroupOfFaces() -{ - -} - -dgGroupOfFaces::dgGroupOfFaces (const dgGroupOfElements &elGroup, int pOrder): - _groupLeft(elGroup),_groupRight(elGroup) -{ - _fsLeft=_groupLeft.getElement(0)->getFunctionSpace(pOrder); - _fsRight=_groupRight.getElement(0)->getFunctionSpace(pOrder); - switch (_groupLeft.getElement(0)->getDim()) { - case 2 : { - std::map<MEdge,int,Less_Edge> edgeMap; - for(int i=0; i<elGroup.getNbElements(); i++){ - MElement &el = *elGroup.getElement(i); - for (int j=0; j<el.getNumEdges(); j++){ - MEdge edge = el.getEdge(j); - if(edgeMap.find(edge) == edgeMap.end()){ - edgeMap[edge] = i; - }else{ - addEdge(edge,edgeMap[edge],i); - } - } - } - break; - } - case 3 : { - std::map<MFace,int,Less_Face> faceMap; - for(int i=0; i<elGroup.getNbElements(); i++){ - MElement &el = *elGroup.getElement(i); - for (int j=0; j<el.getNumFaces(); j++){ - MFace face = el.getFace(j); - if(faceMap.find(face) == faceMap.end()){ - faceMap[face] = i; - }else{ - addFace(face,faceMap[face],i); - } - } - } - break; - } - default : throw; - } - init(pOrder); -} - -void dgGroupOfFaces::mapToInterface ( int nFields, - const fullMatrix<double> &vLeft, - const fullMatrix<double> &vRight, - fullMatrix<double> &v) -{ - for(int i=0; i<getNbElements(); i++) { - const std::vector<int> &closureRight = *getClosureRight(i); - const std::vector<int> &closureLeft = *getClosureLeft(i); - for (int iField=0; iField<nFields; iField++){ - printf("closure size=%i\n",closureLeft.size()); - for(size_t j =0; j < closureLeft.size(); j++){ - v(j, i*2*nFields + iField) = vLeft(closureLeft[j], _left[i]*nFields + iField); - printf("vv=%e\n",v(j, i*2*nFields + iField)); - } - for(size_t j =0; j < closureRight.size(); j++) - v(j, (i*2+1)*nFields + iField) = vRight(closureRight[j], _right[i]*nFields + iField); - } - } - v.print(); -} - -void dgGroupOfFaces::mapFromInterface ( int nFields, - const fullMatrix<double> &v, - fullMatrix<double> &vLeft, - fullMatrix<double> &vRight - ) -{ - for(int i=0; i<getNbElements(); i++) { - const std::vector<int> &closureRight = *getClosureRight(i); - const std::vector<int> &closureLeft = *getClosureLeft(i); - for (int iField=0; iField<nFields; iField++){ - for(size_t j =0; j < closureLeft.size(); j++) - vLeft(closureLeft[j], _left[i]*nFields + iField) = v(j, i*2*nFields + iField); - for(size_t j =0; j < closureRight.size(); j++) - vRight(closureRight[j], _right[i]*nFields + iField) = v(j, (i*2+1)*nFields + iField); - } - } -}