diff --git a/Geo/MElementCut.cpp b/Geo/MElementCut.cpp index ec619d73caaa227be627af4173f060b0edce68d9..c589eecc39b6ce02edb68a8064603444a57143fc 100644 --- a/Geo/MElementCut.cpp +++ b/Geo/MElementCut.cpp @@ -1126,45 +1126,41 @@ GModel *buildCutMesh(GModel *gm, gLevelset *ls, std::vector<const gLevelset *> primitives; ls->getPrimitivesPO(primitives); + int primS = primitives.size(); int numVert = gm->indexMeshVertices(true); - int nbLs = (cutElem) ? primitives.size() : 1; + int nbLs = (cutElem) ? ((primS > 1) ? primS + 1 : 1) : 1; fullMatrix<double> verticesLs(nbLs, numVert + 1); //Emi test compute all at once for POINTS (type = 11) std::vector<MVertex *> vert; - std::map<MVertex*, double> myMap; for(unsigned int i = 0; i < gmEntities.size(); i++) { for(unsigned int j = 0; j < gmEntities[i]->getNumMeshVertices(); j++) { vert.push_back(gmEntities[i]->getMeshVertex(j)); } } - if(cutElem){ - for(unsigned int k = 0; k < primitives.size(); k++){ - if (primitives[k]->type() == 11){ //points - ((gLevelsetPoints*)primitives[k])->computeLS(vert, myMap); - } + for(int k = 0; k < primS; k++){ + if (primitives[k]->type() == 11){ //points + ((gLevelsetPoints*)primitives[k])->computeLS(vert); } } - else{ - if (ls->type() == 11)((gLevelsetPoints*)ls)->computeLS(vert, myMap); - } //compute and store levelset values for(unsigned int i = 0; i < gmEntities.size(); i++) { for(unsigned int j = 0; j < gmEntities[i]->getNumMeshVertices(); j++) { MVertex *vi = gmEntities[i]->getMeshVertex(j); if(cutElem){ - for(unsigned int k = 0; k < primitives.size(); k++){ - //std::map<MVertex*,double>::iterator it = myMap.find(vi); - //verticesLs(k, vi->getIndex()) = it->second; - verticesLs(k, vi->getIndex()) = (*primitives[k])(vi->x(), vi->y(), vi->z()); + int k = 0; + for(; k < primS; k++){ + verticesLs(k, vi->getIndex()) = (*primitives[k])(vi->x(), vi->y(), vi->z()); } + if(primS > 1) + verticesLs(k, vi->getIndex()) = (*ls)(vi->x(), vi->y(), vi->z()); } else verticesLs(0, vi->getIndex()) = (*ls)(vi->x(), vi->y(), vi->z()); } } - + std::map<int, int> newElemTags[4]; //map<oldElementary,newElementary>[dim] std::map<int, int> newPhysTags[4]; //map<oldPhysical,newPhysical>[dim] for(int d = 0; d < 4; d++){ diff --git a/Mesh/meshGRegionMMG3D.cpp b/Mesh/meshGRegionMMG3D.cpp index 938fc8f38d231086ae100ce90c3ddb98b9669c06..56fd75d03a09568205ab6917fddef0f6090c81e5 100644 --- a/Mesh/meshGRegionMMG3D.cpp +++ b/Mesh/meshGRegionMMG3D.cpp @@ -255,8 +255,9 @@ void refineMeshMMG(GRegion *gr){ mmg3d::MMG_mmg3dlib(opt,mmg,sol); Msg::Debug("-------- MG3D TERMINATED -------------------"); updateSizes (gr,mmg, sol); - } - MMG_saveMesh(mmg,"test.mesh"); + } + char test[] = "test.mesh"; + MMG_saveMesh(mmg, test); gr->deleteVertexArrays(); for (int i=0;i<gr->tetrahedra.size();++i)delete gr->tetrahedra[i]; diff --git a/contrib/DiscreteIntegration/DILevelset.cpp b/contrib/DiscreteIntegration/DILevelset.cpp index 18e308d538a52acf2a0566e7cdaa4b1da89ebfb5..1fbe43fb2de9ea0215deb747c9f308e12247f038 100644 --- a/contrib/DiscreteIntegration/DILevelset.cpp +++ b/contrib/DiscreteIntegration/DILevelset.cpp @@ -307,9 +307,14 @@ gLevelsetPoints::gLevelsetPoints(const gLevelsetPoints &lv) : gLevelsetPrimitive double gLevelsetPoints::operator()(const double &x, const double &y, const double &z) const{ + if(mapP.empty()) printf("Levelset Points : call computeLS() before calling operator()\n"); + SPoint3 sp(x,y,z); std::map<SPoint3,double>::const_iterator it = mapP.find(sp); - return it->second; + if(it != mapP.end()) + return it->second; + printf("Levelset Points : Point not found\n"); + return 0; // fullMatrix<double> xyz_eval(1, 3), surf_eval(1,1); // xyz_eval(0,0) = x; @@ -320,9 +325,8 @@ double gLevelsetPoints::operator()(const double &x, const double &y, const doubl } -void gLevelsetPoints::computeLS(std::vector<MVertex*> &vert, std::map<MVertex*, double> &myMap){ +void gLevelsetPoints::computeLS(std::vector<MVertex*> &vert){ - fullMatrix<double> xyz_eval(vert.size(), 3), surf_eval(vert.size(), 1); for (int i = 0; i< vert.size(); i++){ xyz_eval(i,0) = vert[i]->x(); @@ -331,7 +335,6 @@ void gLevelsetPoints::computeLS(std::vector<MVertex*> &vert, std::map<MVertex*, } evalRbfDer(0, 1, points, xyz_eval, surf, surf_eval); for (int i = 0; i< vert.size(); i++){ - myMap[vert[i]] = surf_eval(i,0); mapP[SPoint3(vert[i]->x(), vert[i]->y(),vert[i]->z())] = surf_eval(i,0); } } diff --git a/contrib/DiscreteIntegration/DILevelset.h b/contrib/DiscreteIntegration/DILevelset.h index 7c84f07abc9f10aa1fee4108b8c91f77e365e83b..d4e25ad161b99fa88930a55dfe8a01fc5b8cd396 100644 --- a/contrib/DiscreteIntegration/DILevelset.h +++ b/contrib/DiscreteIntegration/DILevelset.h @@ -36,7 +36,7 @@ public: gLevelset() : tag_(-1) {} gLevelset(const gLevelset &); virtual ~gLevelset(){} - virtual gLevelset * clone() const{printf("Error virtual fct called gLevelset::clone()"); return 0;} + virtual gLevelset * clone() const{printf("Error virtual fct called gLevelset::clone()"); return 0;} virtual double operator() (const double &x, const double &y, const double &z) const = 0; // inline double operator () (const SPoint3 &p) const {return this->operator()(p.x(),p.y(),p.z());} bool isInsideDomain (const double &x, const double &y, const double &z) const {return this->operator()(x,y,z) * insideDomain > 0.;} @@ -165,7 +165,7 @@ public: virtual gLevelset * clone() const{return new gLevelsetPoints(*this);} // return negative value inward and positive value outward virtual double operator() (const double &x, const double &y, const double &z) const; - void computeLS(std::vector<MVertex*> &vert, std::map<MVertex*, double> &myMap); + void computeLS(std::vector<MVertex*> &vert); int type() const {return POINTS;} }; diff --git a/contrib/DiscreteIntegration/Integration3D.cpp b/contrib/DiscreteIntegration/Integration3D.cpp index dc7403f22b9db2f6edaae34e77c73ee808f5927a..c25e70f72ef17cebb8ba7836bde10ac302ff8178 100644 --- a/contrib/DiscreteIntegration/Integration3D.cpp +++ b/contrib/DiscreteIntegration/Integration3D.cpp @@ -2035,14 +2035,14 @@ bool DI_Line::cut (std::vector<const gLevelset *> &RPN, std::vector<DI_Integrati } } else{ - ll_subLines[0]->addLs(this, RPN.back()); for(int l = 0; l < (int)RPN.size(); l++) { const gLevelset *Lsi = RPN[l]; - RPNi.push_back(Lsi); if(Lsi->isPrimitive()) { ll->addLs(this, Lsi, iPrim++, nodeLs); } } + if(iPrim == 1) iPrim--; + ll_subLines[0]->addLs(this, RPN.back(), iPrim, nodeLs); } for(int l = 0; l < (int)ll_subLines.size(); l++) { @@ -2190,14 +2190,14 @@ bool DI_Triangle::cut (std::vector<const gLevelset *> &RPN, std::vector<DI_Integ } } else{ - tt_subTriangles[0]->addLs(this, RPN.back()); for(int l = 0; l < (int)RPN.size(); l++) { const gLevelset *Lsi = RPN[l]; - RPNi.push_back(Lsi); if(Lsi->isPrimitive()) { tt->addLs(this, Lsi, iPrim++, nodeLs); } } + if(iPrim == 1) iPrim--; + tt_subTriangles[0]->addLs(this, RPN.back(), iPrim, nodeLs); } for(int q = 0; q < (int)tt_subQuads.size(); q++) { @@ -2373,14 +2373,14 @@ bool DI_Quad::cut (std::vector<const gLevelset *> &RPN, std::vector<DI_Integrati } } else { - qq_subQuads[0]->addLs(this, RPN.back()); for(int l = 0; l < (int)RPN.size(); l++) { const gLevelset *Lsi = RPN[l]; - RPNi.push_back(Lsi); if(Lsi->isPrimitive()) { qq->addLs(this, Lsi, iPrim++, nodeLs); } } + if(iPrim == 1) iPrim--; + qq_subQuads[0]->addLs(this, RPN.back(), iPrim, nodeLs); } for(int q = 0; q < (int)qq_subQuads.size(); q++) { @@ -2548,14 +2548,14 @@ bool DI_Tetra::cut (std::vector<const gLevelset *> &RPN, std::vector<DI_Integrat } } else { - tt_subTetras[0]->addLs(this, RPN.back()); for(int l = 0; l < (int)RPN.size(); l++) { const gLevelset *Lsi = RPN[l]; - RPNi.push_back(Lsi); if(Lsi->isPrimitive()) { tt->addLs(this, Lsi, iPrim++, nodeLs); } } + if(iPrim == 1) iPrim--; + tt_subTetras[0]->addLs(this, RPN.back(), iPrim, nodeLs); } for(int i = 0; i < (int)QError.size(); i++) { @@ -2779,14 +2779,14 @@ bool DI_Hexa::cut (std::vector<const gLevelset *> &RPN, std::vector<DI_Integrati } } else { - hh_subHexas[0]->addLs(this, RPN.back()); for(int l = 0; l < (int)RPN.size(); l++) { const gLevelset *Lsi = RPN[l]; - RPNi.push_back(Lsi); if(Lsi->isPrimitive()) { hh->addLs(this, Lsi, iPrim++, nodeLs); } } + if(iPrim == 1) iPrim--; + hh_subHexas[0]->addLs(this, RPN.back(), iPrim, nodeLs); } for(int i = 0; i < (int)QError.size(); i++) {