void exportMeshToDassault(GModel *gm, const std::string &fn, int dim) { FILE *f = fopen(fn.c_str(),"w"); int numVertices = gm->indexMeshVertices(true); std::vector<GEntity*> entities; gm->getEntities(entities); fprintf(f,"%d %d\n", numVertices, dim); for(unsigned int i = 0; i < entities.size(); i++) for(unsigned int j = 0; j < entities[i]->mesh_vertices.size(); j++){ MVertex *v = entities[i]->mesh_vertices[j]; if (dim == 2) fprintf(f,"%d %22.15E %22.15E\n", v->getIndex(), v->x(), v->y()); else if (dim == 3) fprintf(f,"%d %22.15E %22.15E %22.5E\n", v->getIndex(), v->x(), v->y(), v->z()); } if (dim == 2){ int nt = 0; int order = 0; for (GModel::fiter itf = gm->firstFace(); itf != gm->lastFace(); ++itf){ std::vector<MTriangle*> &tris = (*itf)->triangles; nt += tris.size(); if (tris.size())order = tris[0]->getPolynomialOrder(); } fprintf(f,"%d %d\n", nt,(order+1)*(order+2)/2); int count = 1; for (GModel::fiter itf = gm->firstFace(); itf != gm->lastFace(); ++itf){ std::vector<MTriangle*> &tris = (*itf)->triangles; for (size_t i=0;i<tris.size();i++){ MTriangle *t = tris[i]; fprintf(f,"%d ", count++); for (int j=0;j<t->getNumVertices();j++){ fprintf(f,"%d ", t->getVertex(j)->getIndex()); } fprintf(f,"\n"); } } int ne = 0; for (GModel::eiter ite = gm->firstEdge(); ite != gm->lastEdge(); ++ite){ std::vector<MLine*> &l = (*ite)->lines; ne += l.size(); } fprintf(f,"%d %d\n", ne,(order+1)); count = 1; for (GModel::eiter ite = gm->firstEdge(); ite != gm->lastEdge(); ++ite){ std::vector<MLine*> &l = (*ite)->lines; for (size_t i=0;i<l.size();i++){ MLine *t = l[i]; fprintf(f,"%d ", count++); for (int j=0;j<t->getNumVertices();j++){ fprintf(f,"%d ", t->getVertex(j)->getIndex()); } fprintf(f,"%d \n",(*ite)->tag()); } } } fclose(f); }
void backgroundMesh2D::create_mesh_copy() { // TODO: useful to extend it to other elements ??? //std::set<SPoint2> myBCNodes; GFace *face = dynamic_cast<GFace*>(gf); if(!face) { Msg::Error("Entity is not a face in background mesh"); return; } for (unsigned int i = 0; i < face->triangles.size(); i++) { MTriangle *e = face->triangles[i]; MVertex *news[3]; for (int j=0; j<3; j++) { MVertex *v = e->getVertex(j); std::map<MVertex*,MVertex*>::iterator it = _3Dto2D.find(v); MVertex *newv =0; if (it == _3Dto2D.end()) { SPoint2 p; reparamMeshVertexOnFace(v, face, p); newv = new MVertex (p.x(), p.y(), 0.0);// creates new vertex with xyz= u,v,0. vertices.push_back(newv); _3Dto2D[v] = newv; _2Dto3D[newv] = v; //if(v->onWhat()->dim()<2) myBCNodes.insert(p); } else newv = it->second; news[j] = newv; } elements.push_back(new MTriangle(news[0],news[1],news[2])); } }
// build the BDS from a list of GFace // This is a TRUE copy BDS_Mesh *gmsh2BDS(std::list<GFace*> &l) { BDS_Mesh *m = new BDS_Mesh; for (std::list<GFace*>::iterator it = l.begin(); it != l.end(); ++it){ GFace *gf = *it; m->add_geom(gf->tag(), 2); BDS_GeomEntity *g2 = m->get_geom(gf->tag(), 2); for (unsigned int i = 0; i < gf->triangles.size(); i++){ MTriangle *e = gf->triangles[i]; BDS_Point *p[3]; for (int j = 0; j < 3; j++){ p[j] = m->find_point(e->getVertex(j)->getNum()); if (!p[j]) { p[j] = m->add_point(e->getVertex(j)->getNum(), e->getVertex(j)->x(), e->getVertex(j)->y(), e->getVertex(j)->z()); SPoint2 param; reparamMeshVertexOnFace(e->getVertex(j), gf, param); p[j]->u = param[0]; p[j]->v = param[1]; m->add_geom(e->getVertex(j)->onWhat()->tag(), e->getVertex(j)->onWhat()->dim()); BDS_GeomEntity *g = m->get_geom(e->getVertex(j)->onWhat()->tag(), e->getVertex(j)->onWhat()->dim()); p[j]->g = g; } } BDS_Face *f = m->add_triangle(p[0]->iD, p[1]->iD, p[2]->iD); f->g = g2; } } return m; }
int GModel::writeMAIL(const std::string &name, bool saveAll, double scalingFactor) { // CEA triangulation (.mail format) for Eric Darrigrand. Note that // we currently don't save the edges of the triangulation (the last // part of the file). 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; int numVertices = indexMeshVertices(saveAll), numTriangles = 0; for(fiter it = firstFace(); it != lastFace(); ++it) if(saveAll || (*it)->physicals.size()) numTriangles += (*it)->triangles.size(); fprintf(fp, " %d %d\n", numVertices, numTriangles); 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++){ MVertex *v = entities[i]->mesh_vertices[j]; fprintf(fp, " %19.10E %19.10E %19.10E\n", v->x() * scalingFactor, v->y() * scalingFactor, v->z() * scalingFactor); } } for(fiter it = firstFace(); it != lastFace(); ++it){ if(saveAll || (*it)->physicals.size()){ for(unsigned int i = 0; i < (*it)->triangles.size(); i++){ MTriangle *t = (*it)->triangles[i]; fprintf(fp, " %d %d %d\n", t->getVertex(0)->getIndex(), t->getVertex(1)->getIndex(), t->getVertex(2)->getIndex()); } } } // TODO write edges (with signs) for(fiter it = firstFace(); it != lastFace(); ++it){ if(saveAll || (*it)->physicals.size()){ for(unsigned int i = 0; i < (*it)->triangles.size(); i++){ //MTriangle *t = (*it)->triangles[i]; fprintf(fp, " %d %d %d\n", 0, 0, 0); } } } fclose(fp); return 1; }
void Centerline::createFaces() { std::vector<std::vector<MTriangle*> > faces; std::multimap<MEdge, MTriangle*, Less_Edge> e2e; for(unsigned int i = 0; i < triangles.size(); ++i) for(int j = 0; j < 3; j++) e2e.insert(std::make_pair(triangles[i]->getEdge(j), triangles[i])); while(!e2e.empty()){ std::set<MTriangle*> group; std::set<MEdge, Less_Edge> touched; group.clear(); touched.clear(); std::multimap<MEdge, MTriangle*, Less_Edge>::iterator ite = e2e.begin(); MEdge me = ite->first; while (theCut.find(me) != theCut.end()){ ite++; me = ite->first; } recurConnectByMEdge(me,e2e, group, touched, theCut); std::vector<MTriangle*> temp; temp.insert(temp.begin(), group.begin(), group.end()); faces.push_back(temp); for(std::set<MEdge, Less_Edge>::iterator it = touched.begin(); it != touched.end(); ++it) e2e.erase(*it); } Msg::Info("Centerline: action (cutMesh) has cut surface mesh in %d faces ", (int)faces.size()); //create discFaces for(unsigned int i = 0; i < faces.size(); ++i){ int numF = current->getMaxElementaryNumber(2) + 1; discreteFace *f = new discreteFace(current, numF); current->add(f); discFaces.push_back(f); std::set<MVertex*> myVertices; std::vector<MTriangle*> myFace = faces[i]; for(unsigned int j= 0; j< myFace.size(); j++){ MTriangle *t = myFace[j]; f->triangles.push_back(t); for (int k= 0; k< 3; k++){ MVertex *v = t->getVertex(k); myVertices.insert(v); v->setEntity(f); } } f->mesh_vertices.insert(f->mesh_vertices.begin(), myVertices.begin(), myVertices.end()); } }
void printJacobians(GModel *m, const char *nm) { const int n = 100; double D[n][n], X[n][n], Y[n][n], Z[n][n]; FILE *f = Fopen(nm,"w"); fprintf(f,"View \"\"{\n"); for(GModel::fiter it = m->firstFace(); it != m->lastFace(); ++it){ for(unsigned int j = 0; j < (*it)->triangles.size(); j++){ MTriangle *t = (*it)->triangles[j]; for(int i = 0; i < n; i++){ for(int k = 0; k < n - i; k++){ SPoint3 pt; double u = (double)i / (n - 1); double v = (double)k / (n - 1); t->pnt(u, v, 0, pt); D[i][k] = 0.; //mesh_functional_distorsion_2D(t, u, v); //X[i][k] = u; //Y[i][k] = v; //Z[i][k] = 0.0; X[i][k] = pt.x(); Y[i][k] = pt.y(); Z[i][k] = pt.z(); } } for(int i= 0; i < n -1; i++){ for(int k = 0; k < n - i -1; k++){ fprintf(f,"ST(%g,%g,%g,%g,%g,%g,%g,%g,%g){%22.15E,%22.15E,%22.15E};\n", X[i][k],Y[i][k],Z[i][k], X[i+1][k],Y[i+1][k],Z[i+1][k], X[i][k+1],Y[i][k+1],Z[i][k+1], D[i][k], D[i+1][k], D[i][k+1]); if (i != n-2 && k != n - i -2) fprintf(f,"ST(%g,%g,%g,%g,%g,%g,%g,%g,%g){%22.15E,%22.15E,%22.15E};\n", X[i+1][k],Y[i+1][k],Z[i+1][k], X[i+1][k+1],Y[i+1][k+1],Z[i+1][k+1], X[i][k+1],Y[i][k+1],Z[i][k+1], D[i+1][k], D[i+1][k+1], D[i][k+1]); } } } } fprintf(f,"};\n"); fclose(f); }
double GRegion::computeSolidProperties(std::vector<double> cg, std::vector<double> inertia) { std::list<GFace*>::iterator it = l_faces.begin(); std::list<int>::iterator itdir = l_dirs.begin(); double volumex = 0; double volumey = 0; double volumez = 0; double surface = 0; cg[0] = cg[1] = cg[2] = 0.0; for ( ; it != l_faces.end(); ++it,++itdir){ for (unsigned int i = 0; i < (*it)->triangles.size(); ++i){ MTriangle *e = (*it)->triangles[i]; int npt; IntPt *pts; e->getIntegrationPoints (2*(e->getPolynomialOrder()-1)+3, &npt, &pts); for (int j=0;j<npt;j++){ SPoint3 pt; // compute x,y,z of the integration point e->pnt(pts[j].pt[0], pts[j].pt[1], pts[j].pt[2], pt); double jac[3][3]; // compute normal double detJ = e->getJacobian(pts[j].pt[0], pts[j].pt[1], pts[j].pt[2], jac); SVector3 n(jac[2][0], jac[2][1], jac[2][2]); n.normalize(); n *= (double)*itdir; surface += detJ* pts[j].weight; volumex += detJ * n.x() * pt.x() * pts[j].weight; volumey += detJ * n.y() * pt.y() * pts[j].weight; volumez += detJ * n.z() * pt.z() * pts[j].weight; cg[0] += detJ * n.x() * (pt.x() * pt.x()) * pts[j].weight * 0.5; cg[1] += detJ * n.y() * (pt.y() * pt.y()) * pts[j].weight * 0.5; cg[2] += detJ * n.z() * (pt.z() * pt.z()) * pts[j].weight * 0.5; } } } printf("%g -- %g %g %g\n", surface, volumex, volumey, volumez); double volume = volumex; cg[0] /= volume; cg[1] /= volume; cg[2] /= volume; it = l_faces.begin(); itdir = l_dirs.begin(); inertia[0] = inertia[1] = inertia[2] = inertia[3] = inertia[4] = inertia[5] = 0.0; for ( ; it != l_faces.end(); ++it,++itdir){ for (unsigned int i = 0; i < (*it)->getNumMeshElements(); ++i){ MElement *e = (*it)->getMeshElement(i); int npt; IntPt *pts; e->getIntegrationPoints(2 * (e->getPolynomialOrder() - 1) + 3, &npt, &pts); for (int j = 0; j < npt; j++){ SPoint3 pt; // compute x,y,z of the integration point e->pnt(pts[j].pt[0], pts[j].pt[1], pts[j].pt[2], pt); double jac[3][3]; // compute normal double detJ = e->getJacobian(pts[j].pt[0], pts[j].pt[1], pts[j].pt[2], jac); SVector3 n(jac[2][0], jac[2][1], jac[2][2]); n *= (double)*itdir; inertia[0] += pts[j].weight * detJ * n.x() * (pt.x() - cg[0]) * (pt.x() - cg[0]) * (pt.x() - cg[0]) / 3.0; inertia[1] += pts[j].weight * detJ * n.y() * (pt.y() - cg[1]) * (pt.y() - cg[1]) * (pt.y() - cg[1]) / 3.0; inertia[2] += pts[j].weight * detJ * n.z() * (pt.z() - cg[2]) * (pt.z() - cg[2]) * (pt.z() - cg[2]) / 3.0; inertia[3] += pts[j].weight * detJ * n.x() * (pt.y() - cg[1]) * (pt.x() - cg[0]) * (pt.x() - cg[0]) / 3.0; inertia[4] += pts[j].weight * detJ * n.x() * (pt.z() - cg[2]) * (pt.x() - cg[0]) * (pt.x() - cg[0]) / 3.0; inertia[5] += pts[j].weight * detJ * n.y() * (pt.z() - cg[2]) * (pt.y() - cg[1]) * (pt.y() - cg[1]) / 3.0; } } } return volume; }
void highOrderTools::computeStraightSidedPositions() { _clean(); // compute straigh sided positions that are actually X,Y,Z positions // that are NOT always on curves and surfaces // points classified on model vertices shall not move ! for(GModel::viter it = _gm->firstVertex(); it != _gm->lastVertex(); ++it){ if ((*it)->points.size()){ MPoint *p = (*it)->points[0]; MVertex *v = p->getVertex(0); _straightSidedLocation [v] = SVector3((*it)->x(),(*it)->y(),(*it)->z()); _targetLocation [v] = SVector3((*it)->x(),(*it)->y(),(*it)->z()); } } // printf("coucou2\n"); // compute stright sided positions of vertices that are classified on model edges for(GModel::eiter it = _gm->firstEdge(); it != _gm->lastEdge(); ++it){ for (unsigned int i=0;i<(*it)->lines.size();i++){ MLine *l = (*it)->lines[i]; int N = l->getNumVertices()-2; SVector3 p0((*it)->lines[i]->getVertex(0)->x(), (*it)->lines[i]->getVertex(0)->y(), (*it)->lines[i]->getVertex(0)->z()); SVector3 p1((*it)->lines[i]->getVertex(1)->x(), (*it)->lines[i]->getVertex(1)->y(), (*it)->lines[i]->getVertex(1)->z()); for (int j=1;j<=N;j++){ const double xi = (double)(j)/(N+1); // printf("xi = %g\n",xi); const SVector3 straightSidedPoint = p0 *(1.-xi) + p1*xi; MVertex *v = (*it)->lines[i]->getVertex(j+1); if (_straightSidedLocation.find(v) == _straightSidedLocation.end()){ _straightSidedLocation [v] = straightSidedPoint; _targetLocation[v] = SVector3(v->x(),v->y(),v->z()); } } } } // printf("coucou3\n"); // compute stright sided positions of vertices that are classified on model faces for(GModel::fiter it = _gm->firstFace(); it != _gm->lastFace(); ++it){ for (unsigned int i=0;i<(*it)->mesh_vertices.size();i++){ MVertex *v = (*it)->mesh_vertices[i]; _targetLocation[v] = SVector3(v->x(),v->y(),v->z()); } for (unsigned int i=0;i<(*it)->triangles.size();i++){ MTriangle *t = (*it)->triangles[i]; MFace face = t->getFace(0); const nodalBasis* fs = t->getFunctionSpace(); for (int j=0;j<t->getNumVertices();j++){ if (t->getVertex(j)->onWhat() == *it){ const double t1 = fs->points(j, 0); const double t2 = fs->points(j, 1); SPoint3 pc = face.interpolate(t1, t2); _straightSidedLocation [t->getVertex(j)] = SVector3(pc.x(),pc.y(),pc.z()); } } } for (unsigned int i=0;i<(*it)->quadrangles.size();i++){ // printf("coucou quad %d\n",i); MQuadrangle *q = (*it)->quadrangles[i]; MFace face = q->getFace(0); const nodalBasis* fs = q->getFunctionSpace(); for (int j=0;j<q->getNumVertices();j++){ if (q->getVertex(j)->onWhat() == *it){ const double t1 = fs->points(j, 0); const double t2 = fs->points(j, 1); SPoint3 pc = face.interpolate(t1, t2); _straightSidedLocation [q->getVertex(j)] = SVector3(pc.x(),pc.y(),pc.z()); } } } } for(GModel::riter it = _gm->firstRegion(); it != _gm->lastRegion(); ++it){ for (unsigned int i=0;i<(*it)->mesh_vertices.size();i++){ MVertex *v = (*it)->mesh_vertices[i]; _targetLocation[v] = SVector3(v->x(),v->y(),v->z()); } for (unsigned int i=0;i<(*it)->tetrahedra.size();i++){ _dim = 3; MTetrahedron *t = (*it)->tetrahedra[i]; MTetrahedron t_1 ((*it)->tetrahedra[i]->getVertex(0), (*it)->tetrahedra[i]->getVertex(1), (*it)->tetrahedra[i]->getVertex(2), (*it)->tetrahedra[i]->getVertex(3)); const nodalBasis* fs = t->getFunctionSpace(); for (int j=0;j<t->getNumVertices();j++){ if (t->getVertex(j)->onWhat() == *it){ double t1 = fs->points(j, 0); double t2 = fs->points(j, 1); double t3 = fs->points(j, 2); SPoint3 pc; t_1.pnt(t1, t2, t3,pc); _straightSidedLocation [t->getVertex(j)] = SVector3(pc.x(),pc.y(),pc.z()); } } } for (unsigned int i=0;i<(*it)->hexahedra.size();i++){ _dim = 3; MHexahedron *h = (*it)->hexahedra[i]; MHexahedron h_1 ((*it)->hexahedra[i]->getVertex(0), (*it)->hexahedra[i]->getVertex(1), (*it)->hexahedra[i]->getVertex(2), (*it)->hexahedra[i]->getVertex(3), (*it)->hexahedra[i]->getVertex(4), (*it)->hexahedra[i]->getVertex(5), (*it)->hexahedra[i]->getVertex(6), (*it)->hexahedra[i]->getVertex(7)); const nodalBasis* fs = h->getFunctionSpace(); for (int j=0;j<h->getNumVertices();j++){ if (h->getVertex(j)->onWhat() == *it){ double t1 = fs->points(j, 0); double t2 = fs->points(j, 1); double t3 = fs->points(j, 2); SPoint3 pc; h_1.pnt(t1, t2, t3,pc); _straightSidedLocation [h->getVertex(j)] = SVector3(pc.x(),pc.y(),pc.z()); } } } } Msg::Info("highOrderTools has been set up : %d nodes are considered", _straightSidedLocation.size()); }
static void Subdivide(GFace *gf, bool splitIntoQuads, bool splitIntoHexas, faceContainer &faceVertices) { if(!splitIntoQuads && !splitIntoHexas){ std::vector<MTriangle*> triangles2; for(unsigned int i = 0; i < gf->triangles.size(); i++){ MTriangle *t = gf->triangles[i]; if(t->getNumVertices() == 6){ triangles2.push_back (new MTriangle(t->getVertex(0), t->getVertex(3), t->getVertex(5))); triangles2.push_back (new MTriangle(t->getVertex(3), t->getVertex(4), t->getVertex(5))); triangles2.push_back (new MTriangle(t->getVertex(3), t->getVertex(1), t->getVertex(4))); triangles2.push_back (new MTriangle(t->getVertex(5), t->getVertex(4), t->getVertex(2))); } delete t; } gf->triangles = triangles2; } std::vector<MQuadrangle*> quadrangles2; for(unsigned int i = 0; i < gf->quadrangles.size(); i++){ MQuadrangle *q = gf->quadrangles[i]; if(q->getNumVertices() == 9){ quadrangles2.push_back (new MQuadrangle(q->getVertex(0), q->getVertex(4), q->getVertex(8), q->getVertex(7))); quadrangles2.push_back (new MQuadrangle(q->getVertex(4), q->getVertex(1), q->getVertex(5), q->getVertex(8))); quadrangles2.push_back (new MQuadrangle(q->getVertex(8), q->getVertex(5), q->getVertex(2), q->getVertex(6))); quadrangles2.push_back (new MQuadrangle(q->getVertex(7), q->getVertex(8), q->getVertex(6), q->getVertex(3))); } delete q; } if(splitIntoQuads || splitIntoHexas){ for(unsigned int i = 0; i < gf->triangles.size(); i++){ MTriangle *t = gf->triangles[i]; if(t->getNumVertices() == 6){ SPoint2 pt; SPoint3 ptx; t->pnt(0.5, 0.5, 0, ptx); bool reparamOK = true; for(int k = 0; k < 6; k++){ SPoint2 temp; reparamOK &= reparamMeshVertexOnFace(t->getVertex(k), gf, temp); pt[0] += temp[0] / 6.; pt[1] += temp[1] / 6.; } MVertex *newv; if (reparamOK){ GPoint gp = gf->point(pt); newv = new MFaceVertex(gp.x(), gp.y(), gp.z(), gf, pt[0], pt[1]); } else { newv = new MVertex(ptx.x(), ptx.y(), ptx.z(), gf); } gf->mesh_vertices.push_back(newv); if(splitIntoHexas) faceVertices[t->getFace(0)].push_back(newv); quadrangles2.push_back (new MQuadrangle(t->getVertex(0), t->getVertex(3), newv, t->getVertex(5))); quadrangles2.push_back (new MQuadrangle(t->getVertex(3), t->getVertex(1), t->getVertex(4), newv)); quadrangles2.push_back (new MQuadrangle(t->getVertex(5), newv,t->getVertex(4), t->getVertex(2))); delete t; } } gf->triangles.clear(); } gf->quadrangles = quadrangles2; for(unsigned int i = 0; i < gf->mesh_vertices.size(); i++) gf->mesh_vertices[i]->setPolynomialOrder(1); gf->deleteVertexArrays(); }