diff --git a/Solver/TESTCASES/Projection2D3D.lua b/Solver/TESTCASES/Projection2D3D.lua index a62c38aba2fc215ff0aed5a9ce839c1b0a8e36a4..19b3954c30920f429390e87c37387a2e6bd90c6d 100644 --- a/Solver/TESTCASES/Projection2D3D.lua +++ b/Solver/TESTCASES/Projection2D3D.lua @@ -1,10 +1,10 @@ model = GModel() -- model:load('tetrahedra.geo') -- model:load('tetrahedra.msh') --- model:load('prisms.geo') --- model:load('prisms.msh') -model:load('mixed.geo') -model:load('mixed.msh') +model:load('prisms.geo') +model:load('prisms.msh') +-- model:load('mixed.geo') +-- model:load('mixed.msh') order=1 -- initial condition @@ -13,11 +13,13 @@ function initial_condition( xyz , f ) x = xyz:get(i,0) y = xyz:get(i,1) z = xyz:get(i,2) - f:set (i, 0, math.exp(-50*((x-0.4)^2+(y-0.3)^2))) + f:set (i, 0, math.exp(-50*((x-0.5)^2+(y-0.5)^2))) -- f:set (i, 0, math.exp(-50*((x-0.4)^2+(z+0.3)^2))) end end +proj = linearSystemCSRGmmdouble() + init_cond = functionLua(1, 'initial_condition', {'XYZ'}):getName() gc=dgGroupCollection(model,3,order) solTmp=dgDofContainer(gc,1) @@ -25,10 +27,13 @@ solTmp:L2Projection(init_cond) gc:buildGroupsOfInterfaces(model,2,order) solution=dgDofContainer(gc,1) solution:L2Projection(init_cond) -solution:exportMsh('sol3d.msh'); +solution:exportMsh('sol3d.msh') + +gc2D = gc:newByTag(model,2,order,{"top"}) +solution2d=dgDofContainer(gc2D,1) +--solution2d:L2Projection(init_cond) -gc2D = gc:newByTag(model,2,order,{"top","side1"}); -solution2d=dgDofContainer(gc2D,1); -solution2d:L2Projection(init_cond); -solution2d:exportMsh('sol2d.msh'); +solution2d:Mesh2Mesh_BuildL2Projection(proj,solution) +solution2d:Mesh2Mesh_ApplyL2Projection(proj,solution) +solution2d:exportMsh('sol2d.msh') diff --git a/Solver/TESTCASES/prisms.geo b/Solver/TESTCASES/prisms.geo index 9a191a1edc08c11ee7a78829d2852fcb9bf2b703..2291c6120d79784dc00fd6ac3409c3c0e903c570 100644 --- a/Solver/TESTCASES/prisms.geo +++ b/Solver/TESTCASES/prisms.geo @@ -1,8 +1,8 @@ //*********** prisms.geo *************// C = 1; -Lup = 1; L = 1.; -lc = .1; +Lup = L; +lc = 0.1; Point(1) = {0.0, 0.0, -Lup, lc}; Point(2) = {C , 0.0, -Lup, lc}; @@ -18,7 +18,7 @@ Line(4) = {4,1}; Line Loop(5) = {1,2,3,4}; Plane Surface(6) = {5}; -outpri[]= Extrude {0,0,1.2*L}{ Surface{6}; Layers{Ceil(1.2*L/lc)};Recombine;}; +outpri[]= Extrude {0,0,L}{ Surface{6}; Layers{Ceil(L/lc)};Recombine;}; // outv[]= Extrude {0,0,0.5*L}{ Surface{7}; Layers{5};Recombine;}; // Printf("top surface = %g", outpri[0]); // Printf("volume = %g", outpri[1]); diff --git a/Solver/dgDofContainer.cpp b/Solver/dgDofContainer.cpp index 78c2b4f38774df3cff586e066151480b69c554e7..6270552d010ee663891d8841b843f8d60ba0f5f9 100644 --- a/Solver/dgDofContainer.cpp +++ b/Solver/dgDofContainer.cpp @@ -304,9 +304,39 @@ void dgDofContainer::Mesh2Mesh_BuildL2Projection(linearSystemCSRGmm<double> &pro jGlobal += dGroup.getNbNodes(); } } + multAddInverseMassMatrixL2Projection(projector); // buffer.print(); } +void dgDofContainer::multAddInverseMassMatrixL2Projection(linearSystemCSRGmm<double> &projector){ + dgGroupCollection* rGroups = this->getGroups(); + int *startIndex; + int *columns; + double *values; + projector.getMatrix(startIndex,columns,values); + + int iGlobal = 0; + for (int iGroup=0;iGroup<rGroups->getNbElementGroups();iGroup++) {// for 2d.groups + const dgGroupOfElements &rGroup = *rGroups->getElementGroup(iGroup); + for (int iElement=0 ; iElement<rGroup.getNbElements() ;++iElement) {// for elements + fullMatrix<double> buffer = fullMatrix<double> (rGroup.getNbNodes(),startIndex[iGlobal+1]-startIndex[iGlobal]); + fullMatrix<double> buffer2 = fullMatrix<double> (rGroup.getNbNodes(),startIndex[iGlobal+1]-startIndex[iGlobal]); + fullMatrix<double> iMassEl; + for (int iNode = 0 ; iNode<rGroup.getNbNodes() ;++iNode) { + for (int i = startIndex[iGlobal+iNode]; i < startIndex[iGlobal+iNode+1] ; i++) + buffer(iNode,i-startIndex[iGlobal+iNode]) = values[i]; + } + iMassEl.setAsProxy(rGroup.getInverseMassMatrix(),iElement*rGroup.getNbNodes(),rGroup.getNbNodes()); + buffer2.gemm(iMassEl,buffer); + for (int iNode = 0 ; iNode<rGroup.getNbNodes() ;++iNode) { + for (int i = startIndex[iGlobal+iNode]; i < startIndex[iGlobal+iNode+1] ; i++) + values[i] = buffer2(iNode,i-startIndex[iGlobal+iNode]); + } + iGlobal+=rGroup.getNbNodes(); + } + } +} + void dgDofContainer::Mesh2Mesh_ApplyL2Projection(linearSystemCSRGmm<double> &projector,dgDofContainer &donor){ scale(0.); @@ -327,7 +357,7 @@ int nbFields = 1; // TO DEFINE !!! for (int iGroup=0;iGroup<rGroups->getNbElementGroups();iGroup++) {// for 2d.groups const dgGroupOfElements &rGroup = *rGroups->getElementGroup(iGroup); - fullMatrix<double> buffer = fullMatrix<double> (rGroup.getNbNodes(),rGroup.getNbElements() * _nbFields); +// fullMatrix<double> buffer = fullMatrix<double> (rGroup.getNbNodes(),rGroup.getNbElements() * _nbFields); this->getGroupProxy(iGroup).scale(0); for (int iElement=0 ; iElement<rGroup.getNbElements() ;++iElement) {// for elements for (int iNode = 0 ; iNode<rGroup.getNbNodes() ;++iNode) { @@ -340,14 +370,14 @@ int nbFields = 1; // TO DEFINE !!! int jElement = (jGlobal-dGroupsStartIGlobal[jGroup])/dGroups->getElementGroup(jGroup)->getNbNodes(); int jNode = jGlobal-dGroupsStartIGlobal[jGroup]-jElement*dGroups->getElementGroup(jGroup)->getNbNodes(); for (int m = 0; m < nbFields; m++){ - buffer(iNode,iElement*nbFields+m) += values[i]*(donor.getGroupProxy(jGroup))(jNode,jElement*nbFields+m); + this->getGroupProxy(iGroup)(iNode,iElement*nbFields+m) += values[i]*(donor.getGroupProxy(jGroup))(jNode,jElement*nbFields+m); // printf("%d %d %d %f %f %f\n",iGlobal,jGlobal,i, buffer(iNode,iElement*nbFields+m),values[i],(donor.getGroupProxy(jGroup))(jNode,jElement*nbFields+m)); } } } }//*/ // buffer.print(); - dgAlgorithm::multAddInverseMassMatrix(rGroup, buffer, this->getGroupProxy(iGroup)); +// dgAlgorithm::multAddInverseMassMatrix(rGroup, buffer, this->getGroupProxy(iGroup)); // this->getGroupProxy(iGroup).print(); } } diff --git a/Solver/dgDofContainer.h b/Solver/dgDofContainer.h index 2565dd5cbf26f24faa35b7451540685380b50aa6..e4531cef00a6a2135582e533061c13b959d63d46 100644 --- a/Solver/dgDofContainer.h +++ b/Solver/dgDofContainer.h @@ -44,6 +44,7 @@ public: void setAll(double v); void L2Projection(std::string functionName); void Mesh2Mesh_BuildL2Projection(linearSystemCSRGmm<double> &projector,dgDofContainer &donor); + void multAddInverseMassMatrixL2Projection(linearSystemCSRGmm<double> &projector); // this method should be private void Mesh2Mesh_ApplyL2Projection(linearSystemCSRGmm<double> &projector,dgDofContainer &donor); void exportMsh(const std::string name); void exportGroupIdMsh();