int GModel::writeGEO(const std::string &name, bool printLabels, bool onlyPhysicals) { FILE *fp = Fopen(name.c_str(), "w"); std::map<double, std::string> meshSizeParameters; int cpt = 0; for(viter it = firstVertex(); it != lastVertex(); it++){ double val = (*it)->prescribedMeshSizeAtVertex(); if(meshSizeParameters.find(val) == meshSizeParameters.end()){ std::ostringstream paramName; paramName << "cl__" << ++cpt; fprintf(fp, "%s = %.16g;\n", paramName.str().c_str(),val); meshSizeParameters.insert(std::make_pair(val, paramName.str())); } } for(viter it = firstVertex(); it != lastVertex(); it++){ double val = (*it)->prescribedMeshSizeAtVertex(); if(!onlyPhysicals || !skipVertex(*it)) (*it)->writeGEO(fp, meshSizeParameters[val]); } for(eiter it = firstEdge(); it != lastEdge(); it++){ if(!onlyPhysicals || !skipEdge(*it)) (*it)->writeGEO(fp); } for(fiter it = firstFace(); it != lastFace(); it++){ if(!onlyPhysicals || !skipFace(*it)) (*it)->writeGEO(fp); } for(riter it = firstRegion(); it != lastRegion(); it++){ if(!onlyPhysicals || !skipRegion(*it)) (*it)->writeGEO(fp); } std::map<int, std::string> labels; #if defined(HAVE_PARSER) // get "old-style" labels from parser for(std::map<std::string, gmsh_yysymbol>::iterator it = gmsh_yysymbols.begin(); it != gmsh_yysymbols.end(); ++it) for(unsigned int i = 0; i < it->second.value.size(); i++) labels[(int)it->second.value[i]] = it->first; #endif std::map<int, std::vector<GEntity*> > groups[4]; getPhysicalGroups(groups); for(int i = 0; i < 4; i++) std::for_each(groups[i].begin(), groups[i].end(), writePhysicalGroupGEO(fp, i, printLabels, labels, physicalNames)); std::for_each(getFields()->begin(), getFields()->end(), writeFieldGEO(fp)); if(getFields()->getBackgroundField() > 0) fprintf(fp, "Background Field = %i;\n", getFields()->getBackgroundField()); if(fp) fclose(fp); return 1; }
int GModel::writeKEY(const std::string &name, int saveAll, int saveGroupsOfNodes, double scalingFactor) { FILE *fp = Fopen(name.c_str(), "w"); if(!fp) { Msg::Error("Unable to open file '%s'", name.c_str()); return 0; } if(noPhysicalGroups()) saveAll = 0x51; indexMeshVertices(saveAll & 0x51); std::vector<GEntity *> entities; getEntities(entities); fprintf(fp, "$# LS-DYNA Keyword file created by Gmsh\n*KEYWORD\n*TITLE\n"); fprintf(fp, " %s\n", name.c_str()); fprintf(fp, "*NODE\n"); for(std::size_t i = 0; i < entities.size(); i++) for(std::size_t j = 0; j < entities[i]->mesh_vertices.size(); j++) entities[i]->mesh_vertices[j]->writeKEY(fp, scalingFactor); if(!(saveAll & 0x2)) // save or ignore Vertex, not in GUI for(viter it = firstVertex(); it != lastVertex(); ++it) { writeElementsKEY(fp, *it, (*it)->points, saveAll & 0x1); } if(!(saveAll & 0x8)) // save or ignore line for(eiter it = firstEdge(); it != lastEdge(); ++it) { writeElementsKEY(fp, *it, (*it)->lines, saveAll & 0x4); } if(!(saveAll & 0x20)) // save or ignore surface for(fiter it = firstFace(); it != lastFace(); ++it) { writeElementsKEY(fp, *it, (*it)->triangles, saveAll & 0x10); writeElementsKEY(fp, *it, (*it)->quadrangles, saveAll & 0x10); } if(!(saveAll & 0x80)) // save or ignore surface for(riter it = firstRegion(); it != lastRegion(); ++it) { writeElementsKEY(fp, *it, (*it)->tetrahedra, saveAll & 0x40); writeElementsKEY(fp, *it, (*it)->hexahedra, saveAll & 0x40); writeElementsKEY(fp, *it, (*it)->prisms, saveAll & 0x40); writeElementsKEY(fp, *it, (*it)->pyramids, saveAll & 0x40); } std::map<int, std::vector<GEntity *> > groups[4]; getPhysicalGroups(groups); int setid = 0; // save elements sets for each physical group if(saveGroupsOfNodes & 0x2) { for(int dim = 0; dim <= 3; dim++) { if(saveAll & (0x2 << (2 * dim))) continue; // elements are ignored for(std::map<int, std::vector<GEntity *> >::iterator it = groups[dim].begin(); it != groups[dim].end(); it++) { std::vector<GEntity *> &entities = it->second; int n = 0; for(std::size_t i = 0; i < entities.size(); i++) { for(std::size_t j = 0; j < entities[i]->getNumMeshElements(); j++) { MElement *e = entities[i]->getMeshElement(j); if(!n) { const char *str = (e->getDim() == 3) ? "SOLID" : (e->getDim() == 2) ? "SHELL" : (e->getDim() == 1) ? "BEAM" : "NODE"; fprintf(fp, "*SET_%s_LIST\n$# %s\n%d", str, physicalName(this, dim, it->first).c_str(), ++setid); } if(!(n % 8)) fprintf(fp, "\n%lu", e->getNum()); else fprintf(fp, ", %lu", e->getNum()); n++; } } if(n) fprintf(fp, "\n"); } } } // save node sets for each physical group, for easier load/b.c. if(saveGroupsOfNodes & 0x1) { for(int dim = 1; dim <= 3; dim++) { for(std::map<int, std::vector<GEntity *> >::iterator it = groups[dim].begin(); it != groups[dim].end(); it++) { std::set<MVertex *> nodes; std::vector<GEntity *> &entities = it->second; for(std::size_t i = 0; i < entities.size(); i++) { for(std::size_t j = 0; j < entities[i]->getNumMeshElements(); j++) { MElement *e = entities[i]->getMeshElement(j); for(std::size_t k = 0; k < e->getNumVertices(); k++) nodes.insert(e->getVertex(k)); } } fprintf(fp, "*SET_NODE_LIST\n$# %s\n%d", physicalName(this, dim, it->first).c_str(), ++setid); int n = 0; for(std::set<MVertex *>::iterator it2 = nodes.begin(); it2 != nodes.end(); it2++) { if(!(n % 8)) fprintf(fp, "\n%ld", (*it2)->getIndex()); else fprintf(fp, ", %ld", (*it2)->getIndex()); n++; } if(n) fprintf(fp, "\n"); } } } fprintf(fp, "*END\n"); fclose(fp); return 1; }
int GModel::writeINP(const std::string &name, bool saveAll, bool saveGroupsOfNodes, double scalingFactor) { FILE *fp = Fopen(name.c_str(), "w"); if(!fp){ Msg::Error("Unable to open file '%s'", name.c_str()); return 0; } if(noPhysicalGroups()) saveAll = true; indexMeshVertices(saveAll); std::vector<GEntity*> entities; getEntities(entities); fprintf(fp, "*Heading\n"); fprintf(fp, " %s\n", name.c_str()); fprintf(fp, "*Node\n"); for(unsigned int i = 0; i < entities.size(); i++) for(unsigned int j = 0; j < entities[i]->mesh_vertices.size(); j++) entities[i]->mesh_vertices[j]->writeINP(fp, scalingFactor); for(viter it = firstVertex(); it != lastVertex(); ++it){ writeElementsINP(fp, *it, (*it)->points, saveAll); } for(eiter it = firstEdge(); it != lastEdge(); ++it){ writeElementsINP(fp, *it, (*it)->lines, saveAll); } for(fiter it = firstFace(); it != lastFace(); ++it){ writeElementsINP(fp, *it, (*it)->triangles, saveAll); writeElementsINP(fp, *it, (*it)->quadrangles, saveAll); } for(riter it = firstRegion(); it != lastRegion(); ++it){ writeElementsINP(fp, *it, (*it)->tetrahedra, saveAll); writeElementsINP(fp, *it, (*it)->hexahedra, saveAll); writeElementsINP(fp, *it, (*it)->prisms, saveAll); writeElementsINP(fp, *it, (*it)->pyramids, saveAll); } std::map<int, std::vector<GEntity*> > groups[4]; getPhysicalGroups(groups); // save elements sets for each physical group for(int dim = 0; dim <= 3; dim++){ for(std::map<int, std::vector<GEntity*> >::iterator it = groups[dim].begin(); it != groups[dim].end(); it++){ std::vector<GEntity *> &entities = it->second; fprintf(fp, "*ELSET,ELSET=%s\n", physicalName(this, dim, it->first).c_str()); int n = 0; 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); if(n && !(n % 10)) fprintf(fp, "\n"); fprintf(fp, "%d, ", e->getNum()); n++; } } fprintf(fp, "\n"); } } // save node sets for each physical group if(saveGroupsOfNodes){ for(int dim = 1; dim <= 3; dim++){ for(std::map<int, std::vector<GEntity*> >::iterator it = groups[dim].begin(); it != groups[dim].end(); it++){ std::set<MVertex*> nodes; std::vector<GEntity *> &entities = it->second; 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); for (int k = 0; k < e->getNumVertices(); k++) nodes.insert(e->getVertex(k)); } } fprintf(fp, "*NSET,NSET=%s\n", physicalName(this, dim, it->first).c_str()); int n = 0; for(std::set<MVertex*>::iterator it2 = nodes.begin(); it2 != nodes.end(); it2++){ if(n && !(n % 10)) fprintf(fp, "\n"); fprintf(fp, "%d, ", (*it2)->getIndex()); n++; } fprintf(fp, "\n"); } } } fclose(fp); return 1; }
int GModel::writeSU2(const std::string &name, bool saveAll, double scalingFactor) { FILE *fp = Fopen(name.c_str(), "w"); if(!fp){ Msg::Error("Unable to open file '%s'", name.c_str()); return 0; } int ndime = getDim(); if(ndime != 2 && ndime != 3){ Msg::Error("SU2 mesh output valid only for 2D or 3D models (not %dD)", ndime); fclose(fp); return 0; } if(noPhysicalGroups()) saveAll = true; fprintf(fp, "NDIME= %d\n", ndime); // all interior elements are printed in a single section; indices start at 0; // node ordering is the same as VTK int nelem = 0; if(ndime == 2){ for(fiter it = firstFace(); it != lastFace(); it++) if(saveAll || (*it)->physicals.size()) nelem += (*it)->getNumMeshElements(); } else{ for(riter it = firstRegion(); it != lastRegion(); it++) if(saveAll || (*it)->physicals.size()) nelem += (*it)->getNumMeshElements(); } int npoin = indexMeshVertices(saveAll); Msg::Info("Writing %d elements and %d vertices", nelem, npoin); // elements fprintf(fp, "NELEM= %d\n", nelem); int num = 0; if(ndime == 2){ for(fiter it = firstFace(); it != lastFace(); it++) if(saveAll || (*it)->physicals.size()) for(unsigned int i = 0; i < (*it)->getNumMeshElements(); i++) (*it)->getMeshElement(i)->writeSU2(fp, num++); } else{ for(riter it = firstRegion(); it != lastRegion(); it++) if(saveAll || (*it)->physicals.size()) for(unsigned int i = 0; i < (*it)->getNumMeshElements(); i++) (*it)->getMeshElement(i)->writeSU2(fp, num++); } // vertices fprintf(fp, "NPOIN= %d\n", npoin); std::vector<GEntity*> entities; getEntities(entities); for(unsigned int i = 0; i < entities.size(); i++) for(unsigned int j = 0; j < entities[i]->mesh_vertices.size(); j++) entities[i]->mesh_vertices[j]->writeSU2(fp, ndime, scalingFactor); // markers for physical groups of dimension (ndime - 1) std::map<int, std::vector<GEntity*> > groups[4]; getPhysicalGroups(groups); int nmark = groups[ndime - 1].size(); if(nmark){ fprintf(fp, "NMARK= %d\n", nmark); for(std::map<int, std::vector<GEntity*> >::iterator it = groups[ndime - 1].begin(); it != groups[ndime - 1].end(); it++){ std::vector<GEntity *> &entities = it->second; int n = 0; for(unsigned int i = 0; i < entities.size(); i++) n += entities[i]->getNumMeshElements(); if(n){ fprintf(fp, "MARKER_TAG= %s\n", physicalName(this, ndime - 1, it->first).c_str()); fprintf(fp, "MARKER_ELEMS= %d\n", n); for(unsigned int i = 0; i < entities.size(); i++) for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++) entities[i]->getMeshElement(j)->writeSU2(fp, -1); } } } fclose(fp); return 1; }