diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp index 30f13816bad58ba1651e7317a959397eb97a13c1..e693d950565e0f672c1b1538a266b825e01ad344 100644 --- a/Geo/GModel.cpp +++ b/Geo/GModel.cpp @@ -48,6 +48,7 @@ GModel::GModel(std::string name) list.push_back(this); // at the moment we always create (at least an empty) GEO model _createGEOInternals(); + _newElemNumbers = NULL; #if defined(HAVE_OCC) _factory = new OCCFactory(); #endif @@ -63,6 +64,7 @@ GModel::~GModel() destroy(); _deleteGEOInternals(); _deleteOCCInternals(); + if(_newElemNumbers) delete _newElemNumbers; #if defined(HAVE_MESH) delete _fields; #endif @@ -618,8 +620,9 @@ void GModel::getMeshVerticesForPhysicalGroup(int dim, int num, std::vector<MVert v.insert(v.begin(), sv.begin(), sv.end()); } -MElement *GModel::getMeshElementByTag(int n) +MElement *GModel::getMeshElementByTag(int num) { + int n = (*_newElemNumbers)(num); if(_elementVectorCache.empty() && _elementMapCache.empty()){ Msg::Debug("Rebuilding mesh element cache"); _elementVectorCache.clear(); @@ -634,14 +637,14 @@ MElement *GModel::getMeshElementByTag(int n) for(unsigned int i = 0; i < entities.size(); i++) for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++){ MElement *e = entities[i]->getMeshElement(j); - _elementVectorCache[e->getNum()] = e; + _elementVectorCache[(*_newElemNumbers)(e->getNum())] = e; } } else{ for(unsigned int i = 0; i < entities.size(); i++) for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++){ MElement *e = entities[i]->getMeshElement(j); - _elementMapCache[e->getNum()] = e; + _elementMapCache[(*_newElemNumbers)(e->getNum())] = e; } } } diff --git a/Geo/GModel.h b/Geo/GModel.h index 8d48df7e76ce4bc15e092e5c7364135e746e09e8..394776770d3e365313199d20cbd47aab1a0fb46d 100644 --- a/Geo/GModel.h +++ b/Geo/GModel.h @@ -52,6 +52,7 @@ class GModel std::map<int, MVertex*> _vertexMapCache; std::vector<MElement*> _elementVectorCache; std::map<int, MElement*> _elementMapCache; + fullVector<double> *_newElemNumbers; // ghost cell information (stores partitions for each element acting // as a ghost cell) @@ -293,6 +294,7 @@ class GModel // access a mesh element by tag, using the element cache MElement *getMeshElementByTag(int n); + int getMeshElementNumByTag(int n) { return (*_newElemNumbers)(n); } // return the total number of vertices in the mesh int getNumMeshVertices(); diff --git a/Geo/GModelIO_Mesh.cpp b/Geo/GModelIO_Mesh.cpp index 673be6a20ed752ad9a9a2a8d7f216069de7af20a..f6771098d1dcad12496cf8860f762f5b2e68b387 100644 --- a/Geo/GModelIO_Mesh.cpp +++ b/Geo/GModelIO_Mesh.cpp @@ -517,7 +517,7 @@ int GModel::readMSH(const std::string &name) template<class T> static void writeElementMSH(FILE *fp, GModel *model, T *ele, bool saveAll, double version, bool binary, int &num, int elementary, - std::vector<int> &physicals, int parentNum) + std::vector<int> &physicals, fullVector<double> *newElemNumbers, int parentNum=0) { std::vector<short> ghosts; if(model->getGhostCells().size()){ @@ -535,6 +535,7 @@ static void writeElementMSH(FILE *fp, GModel *model, T *ele, bool saveAll, for(unsigned int j = 0; j < physicals.size(); j++) ele->writeMSH(fp, version, binary, ++num, elementary, physicals[j], parentNum, &ghosts); + (*newElemNumbers)(ele->getNum()) = num; } template<class T> @@ -543,6 +544,7 @@ static void writeElementsMSH(FILE *fp, GModel *model, std::vector<T*> &ele, bool saveAll, int saveSinglePartition, double version, bool binary, int &num, int elementary, std::vector<int> &physicals, + fullVector<double> *newElemNumbers, std::map<MElement*, int> *parentsNum=0) { for(unsigned int i = 0; i < ele.size(); i++){ @@ -557,7 +559,7 @@ static void writeElementsMSH(FILE *fp, GModel *model, std::vector<T*> &ele, } } writeElementMSH(fp, model, ele[i], saveAll, version, binary, num, - elementary, physicals, parentNum); + elementary, physicals, newElemNumbers, parentNum); } } @@ -693,23 +695,25 @@ int GModel::writeMSH(const std::string &name, double version, bool binary, fprintf(fp, "%d\n", numElements); int num = elementStartNum; std::map<MElement*, int> parentsNum; + if(_newElemNumbers) delete _newElemNumbers; + _newElemNumbers = new fullVector<double>(numElements + 1); // points for(viter it = firstVertex(); it != lastVertex(); ++it) writeElementsMSH(fp, this, (*it)->points, saveAll, saveSinglePartition, - version, binary, num, (*it)->tag(), (*it)->physicals); + version, binary, num, (*it)->tag(), (*it)->physicals, _newElemNumbers); // lines for(std::map<MElement*, GEntity*>::const_iterator it = parents[0].begin(); it != parents[0].end(); it++) if(it->first->getType() == TYPE_LIN) { writeElementMSH(fp, this, it->first, saveAll, version, binary, num, - it->second->tag(), it->second->physicals, 0); + it->second->tag(), it->second->physicals, _newElemNumbers); parentsNum[it->first] = num; } for(eiter it = firstEdge(); it != lastEdge(); ++it) writeElementsMSH(fp, this, (*it)->lines, saveAll, saveSinglePartition, - version, binary, num, (*it)->tag(), (*it)->physicals, + version, binary, num, (*it)->tag(), (*it)->physicals, _newElemNumbers, &parentsNum); // triangles @@ -717,36 +721,36 @@ int GModel::writeMSH(const std::string &name, double version, bool binary, it != parents[1].end(); it++) if(it->first->getType() == TYPE_TRI) { writeElementMSH(fp, this, it->first, saveAll, version, binary, num, - it->second->tag(), it->second->physicals, 0); + it->second->tag(), it->second->physicals, _newElemNumbers); parentsNum[it->first] = num; } for(fiter it = firstFace(); it != lastFace(); ++it) writeElementsMSH(fp, this, (*it)->triangles, saveAll, saveSinglePartition, - version, binary, num, (*it)->tag(), (*it)->physicals); + version, binary, num, (*it)->tag(), (*it)->physicals, _newElemNumbers); // quads for(std::map<MElement*, GEntity*>::const_iterator it = parents[1].begin(); it != parents[1].end(); it++) if(it->first->getType() == TYPE_QUA) { writeElementMSH(fp, this, it->first, saveAll, version, binary, num, - it->second->tag(), it->second->physicals, 0); + it->second->tag(), it->second->physicals, _newElemNumbers); parentsNum[it->first] = num; } for(fiter it = firstFace(); it != lastFace(); ++it) writeElementsMSH(fp, this, (*it)->quadrangles, saveAll, saveSinglePartition, - version, binary, num, (*it)->tag(), (*it)->physicals); + version, binary, num, (*it)->tag(), (*it)->physicals, _newElemNumbers); // polygons for(std::map<MElement*, GEntity*>::const_iterator it = parents[1].begin(); it != parents[1].end(); it++) if(it->first->getType() == TYPE_POLYG) { writeElementMSH(fp, this, it->first, saveAll, version, binary, num, - it->second->tag(), it->second->physicals, 0); + it->second->tag(), it->second->physicals, _newElemNumbers); parentsNum[it->first] = num; } for(fiter it = firstFace(); it != lastFace(); it++) writeElementsMSH(fp, this, (*it)->polygons, saveAll, saveSinglePartition, - version, binary, num, (*it)->tag(), (*it)->physicals, + version, binary, num, (*it)->tag(), (*it)->physicals, _newElemNumbers, &parentsNum); // tets @@ -754,60 +758,60 @@ int GModel::writeMSH(const std::string &name, double version, bool binary, it != parents[2].end(); it++) if(it->first->getType() == TYPE_TET) { writeElementMSH(fp, this, it->first, saveAll, version, binary, num, - it->second->tag(), it->second->physicals, 0); + it->second->tag(), it->second->physicals, _newElemNumbers); parentsNum[it->first] = num; } for(riter it = firstRegion(); it != lastRegion(); ++it) writeElementsMSH(fp, this, (*it)->tetrahedra, saveAll, saveSinglePartition, - version, binary, num, (*it)->tag(), (*it)->physicals); + version, binary, num, (*it)->tag(), (*it)->physicals, _newElemNumbers); // hexas for(std::map<MElement*, GEntity*>::const_iterator it = parents[2].begin(); it != parents[2].end(); it++) if(it->first->getType() == TYPE_HEX) { writeElementMSH(fp, this, it->first, saveAll, version, binary, num, - it->second->tag(), it->second->physicals, 0); + it->second->tag(), it->second->physicals, _newElemNumbers); parentsNum[it->first] = num; } for(riter it = firstRegion(); it != lastRegion(); ++it) writeElementsMSH(fp, this, (*it)->hexahedra, saveAll, saveSinglePartition, - version, binary, num, (*it)->tag(), (*it)->physicals); + version, binary, num, (*it)->tag(), (*it)->physicals, _newElemNumbers); // prisms for(std::map<MElement*, GEntity*>::const_iterator it = parents[2].begin(); it != parents[2].end(); it++) if(it->first->getType() == TYPE_PRI) { writeElementMSH(fp, this, it->first, saveAll, version, binary, num, - it->second->tag(), it->second->physicals, 0); + it->second->tag(), it->second->physicals, _newElemNumbers); parentsNum[it->first] = num; } for(riter it = firstRegion(); it != lastRegion(); ++it) writeElementsMSH(fp, this, (*it)->prisms, saveAll, saveSinglePartition, - version, binary, num, (*it)->tag(), (*it)->physicals); + version, binary, num, (*it)->tag(), (*it)->physicals, _newElemNumbers); // pyramids for(std::map<MElement*, GEntity*>::const_iterator it = parents[2].begin(); it != parents[2].end(); it++) if(it->first->getType() == TYPE_PYR) { writeElementMSH(fp, this, it->first, saveAll, version, binary, num, - it->second->tag(), it->second->physicals, 0); + it->second->tag(), it->second->physicals, _newElemNumbers); parentsNum[it->first] = num; } for(riter it = firstRegion(); it != lastRegion(); ++it) writeElementsMSH(fp, this, (*it)->pyramids, saveAll, saveSinglePartition, - version, binary, num, (*it)->tag(), (*it)->physicals); + version, binary, num, (*it)->tag(), (*it)->physicals, _newElemNumbers); // polyhedra for(std::map<MElement*, GEntity*>::const_iterator it = parents[2].begin(); it != parents[2].end(); it++) if(it->first->getType() == TYPE_POLYH) { writeElementMSH(fp, this, it->first, saveAll, version, binary, num, - it->second->tag(), it->second->physicals, 0); + it->second->tag(), it->second->physicals, _newElemNumbers); parentsNum[it->first] = num; } for(riter it = firstRegion(); it != lastRegion(); ++it) writeElementsMSH(fp, this, (*it)->polyhedra, saveAll, saveSinglePartition, - version, binary, num, (*it)->tag(), (*it)->physicals, + version, binary, num, (*it)->tag(), (*it)->physicals, _newElemNumbers, &parentsNum); if(binary) fprintf(fp, "\n"); diff --git a/Post/PViewData.h b/Post/PViewData.h index e97dc2bb0454976049adf0c136c95cf97f6e9a96..baeacf25c052d6a0d97ab53906568ca8e5b023b0 100644 --- a/Post/PViewData.h +++ b/Post/PViewData.h @@ -83,10 +83,12 @@ class PViewData { virtual int getNumLines(int step=-1){ return 0; } virtual int getNumTriangles(int step=-1){ return 0; } virtual int getNumQuadrangles(int step=-1){ return 0; } + virtual int getNumPolygons(int step=-1){ return 0; } virtual int getNumTetrahedra(int step=-1){ return 0; } virtual int getNumHexahedra(int step=-1){ return 0; } virtual int getNumPrisms(int step=-1){ return 0; } virtual int getNumPyramids(int step=-1){ return 0; } + virtual int getNumPolyhedra(int step=-1){ return 0; } // return the number of geometrical entities in the view virtual int getNumEntities(int step=-1){ return 0; } diff --git a/Post/PViewDataGModel.cpp b/Post/PViewDataGModel.cpp index 926a081002b63e3b9416e3c85542b95ca591f305..5eeece085a960beed7bbdd40ede1599c46600f83 100644 --- a/Post/PViewDataGModel.cpp +++ b/Post/PViewDataGModel.cpp @@ -11,6 +11,7 @@ #include "MHexahedron.h" #include "MPrism.h" #include "MPyramid.h" +#include "MElementCut.h" #include "Numeric.h" #include "GmshMessage.h" @@ -74,6 +75,8 @@ bool PViewDataGModel::finalize() _addInterpolationMatricesForElement((*it)->triangles[0]); if((*it)->quadrangles.size()) _addInterpolationMatricesForElement((*it)->quadrangles[0]); + if((*it)->polygons.size()) + _addInterpolationMatricesForElement((*it)->polygons[0]); } for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); it++){ if((*it)->tetrahedra.size()) @@ -84,6 +87,8 @@ bool PViewDataGModel::finalize() _addInterpolationMatricesForElement((*it)->prisms[0]); if((*it)->pyramids.size()) _addInterpolationMatricesForElement((*it)->pyramids[0]); + if((*it)->polyhedra.size()) + _addInterpolationMatricesForElement((*it)->polyhedra[0]); } } @@ -216,6 +221,16 @@ int PViewDataGModel::getNumQuadrangles(int step) return n; } +int PViewDataGModel::getNumPolygons(int step) +{ + if(_steps.empty()) return 0; + GModel *m = _steps[0]->getModel(); // to generalize + int n = 0; + for(GModel::fiter it = m->firstFace(); it != m->lastFace(); ++it) + n += (*it)->polygons.size(); + return n; +} + int PViewDataGModel::getNumTetrahedra(int step) { if(_steps.empty()) return 0; @@ -256,6 +271,16 @@ int PViewDataGModel::getNumPyramids(int step) return n; } +int PViewDataGModel::getNumPolyhedra(int step) +{ + if(_steps.empty()) return 0; + GModel *m = _steps[0]->getModel(); // to generalize + int n = 0; + for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); ++it) + n += (*it)->polyhedra.size(); + return n; +} + int PViewDataGModel::getNumEntities(int step) { if(_steps.empty()) return 0; diff --git a/Post/PViewDataGModel.h b/Post/PViewDataGModel.h index 49118a32d186e0e28d404e0be068cfcebdbc6fe9..e94f914192c9ad948e416ba2f6d1704152c6a21f 100644 --- a/Post/PViewDataGModel.h +++ b/Post/PViewDataGModel.h @@ -146,10 +146,12 @@ class PViewDataGModel : public PViewData { int getNumLines(int step=-1); int getNumTriangles(int step=-1); int getNumQuadrangles(int step=-1); + int getNumPolygons(int step=-1); int getNumTetrahedra(int step=-1); int getNumHexahedra(int step=-1); int getNumPrisms(int step=-1); int getNumPyramids(int step=-1); + int getNumPolyhedra(int step=-1); int getNumEntities(int step=-1); int getNumElements(int step=-1, int ent=-1); int getDimension(int step, int ent, int ele); diff --git a/Post/PViewDataGModelIO.cpp b/Post/PViewDataGModelIO.cpp index 3eb0a19aa88e6be54528ec097116c97f0b53754d..910457560862d286f4810d2b64a98efd4af46e02 100644 --- a/Post/PViewDataGModelIO.cpp +++ b/Post/PViewDataGModelIO.cpp @@ -184,7 +184,7 @@ bool PViewDataGModel::writeMSH(std::string fileName, bool binary) // Warning: this will not work if the mesh we just saved // above changed the renumbering of the elements (which is // usually the case)... - int num = e->getNum(); + int num = model->getMeshElementNumByTag(i); if(binary){ fwrite(&num, sizeof(int), 1, fp); if(_type == ElementNodeData) diff --git a/Post/PViewOptions.cpp b/Post/PViewOptions.cpp index 3f7c440bfc62f229a8b9dd7f7ff26c5cc1279e0f..a19fafab52f330d6a70cfda25a3b5a6a7cbc2be2 100644 --- a/Post/PViewOptions.cpp +++ b/Post/PViewOptions.cpp @@ -124,11 +124,12 @@ bool PViewOptions::skipElement(int type) case TYPE_LIN: return !drawLines; case TYPE_TRI: return !drawTriangles; case TYPE_QUA: return !drawQuadrangles; + case TYPE_POLYG: return false; case TYPE_TET: return !drawTetrahedra; case TYPE_HEX: return !drawHexahedra; case TYPE_PRI: return !drawPrisms; case TYPE_PYR: return !drawPyramids; - case TYPE_POLYG: case TYPE_POLYH: return false; + case TYPE_POLYH: return false; default: return true; } } diff --git a/Post/PViewOptions.h b/Post/PViewOptions.h index 4f0b60b7c4e41602782a5be1eab8d2d6aeb4c264..fe63b92df3c71668ebd4b80ebe40561e247be740 100644 --- a/Post/PViewOptions.h +++ b/Post/PViewOptions.h @@ -72,8 +72,8 @@ class PViewOptions { int vectorType, tensorType, glyphLocation, centerGlyphs; int timeStep; int drawStrings; - int drawPoints, drawLines, drawTriangles, drawQuadrangles; - int drawTetrahedra, drawHexahedra, drawPrisms, drawPyramids; + int drawPoints, drawLines, drawTriangles, drawQuadrangles, drawPolygons; + int drawTetrahedra, drawHexahedra, drawPrisms, drawPyramids, drawPolyhedra; int drawScalars, drawVectors, drawTensors; int boundary, pointType, lineType, drawSkinOnly; double pointSize, lineWidth; diff --git a/Post/PViewVertexArrays.cpp b/Post/PViewVertexArrays.cpp index 46cbcbef1ef197c70915dd6f33ec92a58b279175..6a1bdbb23d786463ff5c43d115bc0b1640fddbbd 100644 --- a/Post/PViewVertexArrays.cpp +++ b/Post/PViewVertexArrays.cpp @@ -609,6 +609,22 @@ static void addScalarQuadrangle(PView *p, double xyz[PVIEW_NMAX][3], addScalarTriangle(p, xyz, val, pre, it[i][0], it[i][1], it[i][2], unique); } +static void addOutlinePolygon(PView *p, double xyz[PVIEW_NMAX][3], + unsigned int color, bool pre, int numNodes) +{ + if(numNodes == 3) addOutlineTriangle(p, xyz, color, pre); + if(numNodes == 4) addOutlineQuadrangle(p, xyz, color, pre); + +} + +static void addScalarPolygon(PView *p, double xyz[PVIEW_NMAX][3], + double val[PVIEW_NMAX][9], bool pre, int numNodes) +{ + if(numNodes == 3) addScalarTriangle(p, xyz, val, pre); + if(numNodes == 4) {addScalarQuadrangle(p, xyz, val, pre, 0, 1, 2, 3); addScalarQuadrangle(p, xyz, val, pre, 1, 2, 3, 0);} + +} + static void addOutlineTetrahedron(PView *p, double xyz[PVIEW_NMAX][3], unsigned int color, bool pre) { @@ -770,7 +786,19 @@ static void addScalarPyramid(PView *p, double xyz[PVIEW_NMAX][3], addScalarTetrahedron(p, xyz, val, pre, is[i][0], is[i][1], is[i][2], is[i][3]); } -static void addOutlineElement(PView *p, int type, double xyz[PVIEW_NMAX][3], bool pre) +static void addOutlinePolyhedron(PView *p, double xyz[PVIEW_NMAX][3], + unsigned int color, bool pre) +{ + //TODO +} + +static void addScalarPolyhedron(PView *p, double xyz[PVIEW_NMAX][3], + double val[PVIEW_NMAX][9], bool pre, int NumNodes) +{ + //TODO +} + +static void addOutlineElement(PView *p, int type, double xyz[PVIEW_NMAX][3], bool pre, int numNodes=0) { PViewOptions *opt = p->getOptions(); switch(type){ @@ -778,25 +806,29 @@ static void addOutlineElement(PView *p, int type, double xyz[PVIEW_NMAX][3], boo case TYPE_LIN: addOutlineLine(p, xyz, opt->color.line, pre); break; case TYPE_TRI: addOutlineTriangle(p, xyz, opt->color.triangle, pre); break; case TYPE_QUA: addOutlineQuadrangle(p, xyz, opt->color.quadrangle, pre); break; + case TYPE_POLYG: addOutlinePolygon(p, xyz, opt->color.quadrangle, pre, numNodes); break; case TYPE_TET: addOutlineTetrahedron(p, xyz, opt->color.tetrahedron, pre); break; case TYPE_HEX: addOutlineHexahedron(p, xyz, opt->color.hexahedron, pre); break; case TYPE_PRI: addOutlinePrism(p, xyz, opt->color.prism, pre); break; case TYPE_PYR: addOutlinePyramid(p, xyz, opt->color.pyramid, pre); break; + case TYPE_POLYH: addOutlinePolyhedron(p, xyz, opt->color.pyramid, pre); break; } } static void addScalarElement(PView *p, int type, double xyz[PVIEW_NMAX][3], - double val[PVIEW_NMAX][9], bool pre) + double val[PVIEW_NMAX][9], bool pre, int numNodes=0) { switch(type){ case TYPE_PNT: addScalarPoint(p, xyz, val, pre); break; case TYPE_LIN: addScalarLine(p, xyz, val, pre); break; case TYPE_TRI: addScalarTriangle(p, xyz, val, pre); break; case TYPE_QUA: addScalarQuadrangle(p, xyz, val, pre); break; + case TYPE_POLYG: addScalarPolygon(p, xyz, val, pre, numNodes); break; case TYPE_TET: addScalarTetrahedron(p, xyz, val, pre); break; case TYPE_HEX: addScalarHexahedron(p, xyz, val, pre); break; case TYPE_PRI: addScalarPrism(p, xyz, val, pre); break; case TYPE_PYR: addScalarPyramid(p, xyz, val, pre); break; + case TYPE_POLYH: addScalarPolyhedron(p, xyz, val, pre, numNodes); break; } } @@ -979,7 +1011,7 @@ static void addElementsInArrays(PView *p, bool preprocessNormalsOnly) for(int j = 0; j < numNodes; j++) opt->tmpBBox += SPoint3(xyz[j][0], xyz[j][1], xyz[j][2]); - + if(opt->showElement && !data->useGaussPoints()) addOutlineElement(p, type, xyz, preprocessNormalsOnly); @@ -993,7 +1025,7 @@ static void addElementsInArrays(PView *p, bool preprocessNormalsOnly) for(int k = 0; k < numComp; k++) val2[0][k] = val[j][k]; if(numComp == 1 && opt->drawScalars) - addScalarElement(p, TYPE_PNT, xyz2, val2, preprocessNormalsOnly); + addScalarElement(p, TYPE_PNT, xyz2, val2, preprocessNormalsOnly, numNodes); else if(numComp == 3 && opt->drawVectors) addVectorElement(p, ent, i, 1, TYPE_PNT, xyz2, val2, preprocessNormalsOnly); else if(numComp == 9 && opt->drawTensors) @@ -1001,7 +1033,7 @@ static void addElementsInArrays(PView *p, bool preprocessNormalsOnly) } } else if(numComp == 1 && opt->drawScalars) - addScalarElement(p, type, xyz, val, preprocessNormalsOnly); + addScalarElement(p, type, xyz, val, preprocessNormalsOnly, numNodes); else if(numComp == 3 && opt->drawVectors) addVectorElement(p, ent, i, numNodes, type, xyz, val, preprocessNormalsOnly); else if(numComp == 9 && opt->drawTensors)