diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp index 1f309a4cecb422ee36da0cd12274a16ce8ee2554..b4881526e2fdb10873e1a34c00960eba60ad77ba 100644 --- a/Mesh/Generator.cpp +++ b/Mesh/Generator.cpp @@ -779,10 +779,10 @@ static void Mesh3D(GModel *m) } if(treat_region_ok && (CTX::instance()->mesh.recombine3DAll || gr->meshAttributes.recombine3D)){ - if (CTX::instance()->mesh.optimize){ - optimizeMeshGRegionGmsh opt; - opt(gr); - } + if (CTX::instance()->mesh.optimize){ + optimizeMeshGRegionGmsh opt; + opt(gr); + } double a = Cpu(); if (CTX::instance()->mesh.recombine3DLevel >= 0){ Recombinator rec; @@ -797,18 +797,18 @@ static void Mesh3D(GModel *m) CTX::instance()->mesh.recombine3DConformity); // 0: no pyramid, 1: single-step, 2: two-steps (conforming), // true: fill non-conformities with trihedra - // while(LaplaceSmoothing (gr)){ - // } + // while(LaplaceSmoothing (gr)){ + // } nb_elements_recombination += post.get_nb_elements(); nb_hexa_recombination += post.get_nb_hexahedra(); vol_element_recombination += post.get_vol_elements(); vol_hexa_recombination += post.get_vol_hexahedra(); // partial export - // stringstream ss; - // ss << "yamakawa_part_"; - // ss << gr->tag(); - // ss << ".msh"; - // export_gregion_mesh(gr, ss.str().c_str()); + // stringstream ss; + // ss << "yamakawa_part_"; + // ss << gr->tag(); + // ss << ".msh"; + // export_gregion_mesh(gr, ss.str().c_str()); time_recombination += (Cpu() - a); } } diff --git a/Mesh/directions3D.cpp b/Mesh/directions3D.cpp index ad92e9d78623ef3d0eb8423611522423efb196f0..d35020558aa5b4526ed319b9be2a2b5ead584999 100644 --- a/Mesh/directions3D.cpp +++ b/Mesh/directions3D.cpp @@ -43,15 +43,15 @@ void Frame_field::init_region(GRegion* gr){ for(it=faces.begin();it!=faces.end();it++){ gf = *it; - init_face(gf); + init_face(gf); } ANNpointArray duplicate = annAllocPts(field.size(),3); for(i=0;i<field.size();i++){ duplicate[i][0] = field[i].first.x(); - duplicate[i][1] = field[i].first.y(); - duplicate[i][2] = field[i].first.z(); + duplicate[i][1] = field[i].first.y(); + duplicate[i][2] = field[i].first.z(); } kd_tree = new ANNkd_tree(duplicate,field.size(),3); @@ -70,24 +70,24 @@ void Frame_field::init_face(GFace* gf){ for(i=0;i<gf->storage1.size();i++){ point = gf->storage1[i]; - v1 = gf->storage2[i]; - v2 = gf->storage3[i]; - - v1.normalize(); - v2.normalize(); - v3 = crossprod(v1,v2); - v3.normalize(); - m.set_m11(v1.x()); - m.set_m21(v1.y()); - m.set_m31(v1.z()); - m.set_m12(v2.x()); - m.set_m22(v2.y()); - m.set_m32(v2.z()); - m.set_m13(v3.x()); - m.set_m23(v3.y()); - m.set_m33(v3.z()); - field.push_back(std::pair<SPoint3,STensor3>(point,m)); - labels.push_back(gf->tag()); + v1 = gf->storage2[i]; + v2 = gf->storage3[i]; + + v1.normalize(); + v2.normalize(); + v3 = crossprod(v1,v2); + v3.normalize(); + m.set_m11(v1.x()); + m.set_m21(v1.y()); + m.set_m31(v1.z()); + m.set_m12(v2.x()); + m.set_m22(v2.y()); + m.set_m32(v2.z()); + m.set_m13(v3.x()); + m.set_m23(v3.y()); + m.set_m33(v3.z()); + field.push_back(std::pair<SPoint3,STensor3>(point,m)); + labels.push_back(gf->tag()); } } @@ -135,11 +135,11 @@ STensor3 Frame_field::search(double x,double y,double z){ if(fabs(sqrt(distance2)-sqrt(distance1))<e2){ if(labels[index2]<labels[index1]){ - return field[index2].second; - } - else{ - return field[index1].second; - } + return field[index2].second; + } + else{ + return field[index1].second; + } } else{ return field[index1].second; @@ -163,37 +163,37 @@ STensor3 Frame_field::combine(double x,double y,double z){ if(ok){ vec1 = SVector3(m.get_m11(),m.get_m21(),m.get_m31()); - vec2 = SVector3(m.get_m12(),m.get_m22(),m.get_m32()); - vec3 = SVector3(m.get_m13(),m.get_m23(),m.get_m33()); - - val1 = fabs(dot(vec,vec1)); - val2 = fabs(dot(vec,vec2)); - val3 = fabs(dot(vec,vec3)); - - if(val1<=val2 && val1<=val3){ - other = vec1; - } - else if(val2<=val1 && val2<=val3){ - other = vec2; - } - else{ - other = vec3; - } - - final1 = crossprod(vec,other); - final1.normalize(); - final2 = crossprod(vec,final1); - final2.normalize(); + vec2 = SVector3(m.get_m12(),m.get_m22(),m.get_m32()); + vec3 = SVector3(m.get_m13(),m.get_m23(),m.get_m33()); + + val1 = fabs(dot(vec,vec1)); + val2 = fabs(dot(vec,vec2)); + val3 = fabs(dot(vec,vec3)); + + if(val1<=val2 && val1<=val3){ + other = vec1; + } + else if(val2<=val1 && val2<=val3){ + other = vec2; + } + else{ + other = vec3; + } + + final1 = crossprod(vec,other); + final1.normalize(); + final2 = crossprod(vec,final1); + final2.normalize(); m2.set_m11(vec.x()); - m2.set_m21(vec.y()); - m2.set_m31(vec.z()); - m2.set_m12(final1.x()); - m2.set_m22(final1.y()); - m2.set_m32(final1.z()); - m2.set_m13(final2.x()); - m2.set_m23(final2.y()); - m2.set_m33(final2.z()); + m2.set_m21(vec.y()); + m2.set_m31(vec.z()); + m2.set_m12(final1.x()); + m2.set_m22(final1.y()); + m2.set_m32(final1.z()); + m2.set_m13(final2.x()); + m2.set_m23(final2.y()); + m2.set_m33(final2.z()); } return m2; @@ -225,33 +225,33 @@ void Frame_field::print_field1(){ for(i=0;i<field.size();i++){ point = field[i].first; - m = field[i].second; - - p1 = SPoint3(point.x() + k*m.get_m11(), - point.y() + k*m.get_m21(), - point.z() + k*m.get_m31()); - p2 = SPoint3(point.x() - k*m.get_m11(), - point.y() - k*m.get_m21(), - point.z() - k*m.get_m31()); + m = field[i].second; + + p1 = SPoint3(point.x() + k*m.get_m11(), + point.y() + k*m.get_m21(), + point.z() + k*m.get_m31()); + p2 = SPoint3(point.x() - k*m.get_m11(), + point.y() - k*m.get_m21(), + point.z() - k*m.get_m31()); p3 = SPoint3(point.x() + k*m.get_m12(), - point.y() + k*m.get_m22(), - point.z() + k*m.get_m32()); - p4 = SPoint3(point.x() - k*m.get_m12(), - point.y() - k*m.get_m22(), - point.z() - k*m.get_m32()); - p5 = SPoint3(point.x() + k*m.get_m13(), - point.y() + k*m.get_m23(), - point.z() + k*m.get_m33()); - p6 = SPoint3(point.x() - k*m.get_m13(), - point.y() - k*m.get_m23(), - point.z() - k*m.get_m33()); - - print_segment(point,p1,color1,color2,file); - print_segment(point,p2,color1,color2,file); - print_segment(point,p3,color1,color2,file); - print_segment(point,p4,color1,color2,file); - print_segment(point,p5,color1,color2,file); - print_segment(point,p6,color1,color2,file); + point.y() + k*m.get_m22(), + point.z() + k*m.get_m32()); + p4 = SPoint3(point.x() - k*m.get_m12(), + point.y() - k*m.get_m22(), + point.z() - k*m.get_m32()); + p5 = SPoint3(point.x() + k*m.get_m13(), + point.y() + k*m.get_m23(), + point.z() + k*m.get_m33()); + p6 = SPoint3(point.x() - k*m.get_m13(), + point.y() - k*m.get_m23(), + point.z() - k*m.get_m33()); + + print_segment(point,p1,color1,color2,file); + print_segment(point,p2,color1,color2,file); + print_segment(point,p3,color1,color2,file); + print_segment(point,p4,color1,color2,file); + print_segment(point,p5,color1,color2,file); + print_segment(point,p6,color1,color2,file); } file << "};\n"; @@ -278,38 +278,38 @@ void Frame_field::print_field2(GRegion* gr){ for(i=0;i<gr->getNumMeshElements();i++){ element = gr->getMeshElement(i); - for(j=0;j<element->getNumVertices();j++){ - vertex = element->getVertex(j); - if(vertex->onWhat()->dim()>2){ - point = SPoint3(vertex->x(),vertex->y(),vertex->z()); - m = search(vertex->x(),vertex->y(),vertex->z()); - - p1 = SPoint3(point.x() + k*m.get_m11(), - point.y() + k*m.get_m21(), - point.z() + k*m.get_m31()); - p2 = SPoint3(point.x() - k*m.get_m11(), - point.y() - k*m.get_m21(), - point.z() - k*m.get_m31()); - p3 = SPoint3(point.x() + k*m.get_m12(), - point.y() + k*m.get_m22(), - point.z() + k*m.get_m32()); - p4 = SPoint3(point.x() - k*m.get_m12(), - point.y() - k*m.get_m22(), - point.z() - k*m.get_m32()); - p5 = SPoint3(point.x() + k*m.get_m13(), - point.y() + k*m.get_m23(), - point.z() + k*m.get_m33()); - p6 = SPoint3(point.x() - k*m.get_m13(), - point.y() - k*m.get_m23(), - point.z() - k*m.get_m33()); - - print_segment(point,p1,color1,color2,file); - print_segment(point,p2,color1,color2,file); - print_segment(point,p3,color1,color2,file); - print_segment(point,p4,color1,color2,file); - print_segment(point,p5,color1,color2,file); - print_segment(point,p6,color1,color2,file); - } + for(j=0;j<element->getNumVertices();j++){ + vertex = element->getVertex(j); + if(vertex->onWhat()->dim()>2){ + point = SPoint3(vertex->x(),vertex->y(),vertex->z()); + m = search(vertex->x(),vertex->y(),vertex->z()); + + p1 = SPoint3(point.x() + k*m.get_m11(), + point.y() + k*m.get_m21(), + point.z() + k*m.get_m31()); + p2 = SPoint3(point.x() - k*m.get_m11(), + point.y() - k*m.get_m21(), + point.z() - k*m.get_m31()); + p3 = SPoint3(point.x() + k*m.get_m12(), + point.y() + k*m.get_m22(), + point.z() + k*m.get_m32()); + p4 = SPoint3(point.x() - k*m.get_m12(), + point.y() - k*m.get_m22(), + point.z() - k*m.get_m32()); + p5 = SPoint3(point.x() + k*m.get_m13(), + point.y() + k*m.get_m23(), + point.z() + k*m.get_m33()); + p6 = SPoint3(point.x() - k*m.get_m13(), + point.y() - k*m.get_m23(), + point.z() - k*m.get_m33()); + + print_segment(point,p1,color1,color2,file); + print_segment(point,p2,color1,color2,file); + print_segment(point,p3,color1,color2,file); + print_segment(point,p4,color1,color2,file); + print_segment(point,p5,color1,color2,file); + print_segment(point,p6,color1,color2,file); + } } } @@ -359,14 +359,14 @@ int Frame_field::build_vertex_to_vertices(GEntity* gr, int onWhat, bool initiali std::map<MVertex*,std::set<MVertex*> >::iterator it = vertex_to_vertices.find(pVertex); if(it != vertex_to_vertices.end()){ - for(unsigned int k=1; k<n; k++) - it->second.insert(pElem->getVertex((j+k) % n)); + for(unsigned int k=1; k<n; k++) + it->second.insert(pElem->getVertex((j+k) % n)); } else{ - vertices.clear(); - for(unsigned int k=1; k<n; k++) - vertices.insert(pElem->getVertex((j+k) % n)); - vertex_to_vertices.insert(std::pair<MVertex*,std::set<MVertex*> >(pVertex,vertices)); + vertices.clear(); + for(unsigned int k=1; k<n; k++) + vertices.insert(pElem->getVertex((j+k) % n)); + vertex_to_vertices.insert(std::pair<MVertex*,std::set<MVertex*> >(pVertex,vertices)); } } @@ -384,11 +384,11 @@ int Frame_field::build_vertex_to_elements(GEntity* gr, bool initialize){ MVertex* pVertex = pElem->getVertex(j); std::map<MVertex*,std::set<MElement*> >::iterator it = vertex_to_elements.find(pVertex); if(it != vertex_to_elements.end()) - it->second.insert(pElem); + it->second.insert(pElem); else{ - elements.clear(); - elements.insert(pElem); - vertex_to_elements.insert(std::pair<MVertex*,std::set<MElement*> >(pVertex,elements)); + elements.clear(); + elements.insert(pElem); + vertex_to_elements.insert(std::pair<MVertex*,std::set<MElement*> >(pVertex,elements)); } } } @@ -402,7 +402,7 @@ void Frame_field::build_listVertices(GEntity* gr, int dim, bool initialize){ for(int j=0; j<pElem->getNumVertices(); j++){ MVertex * pVertex = pElem->getVertex(j); if(pVertex->onWhat()->dim() == dim) - list.insert(pVertex); + list.insert(pVertex); } } if(initialize) listVertices.clear(); @@ -459,19 +459,19 @@ void Frame_field::initFace(GFace* gf){ // at all vertices of the GFace gf build_vertex_to_elements(gf); for(std::map<MVertex*, std::set<MElement*> >::const_iterator it - = vertex_to_elements.begin(); it != vertex_to_elements.end(); it++){ + = vertex_to_elements.begin(); it != vertex_to_elements.end(); it++){ std::set<MElement*> elements = it->second; SVector3 Area = SVector3(0,0,0); for(std::set<MElement*>::const_iterator iter=elements.begin(); - iter != elements.end(); iter++){ + iter != elements.end(); iter++){ MElement *pElem = *iter; int n = pElem->getNumVertices(); int i; for(i=0; i<n; i++){ - if(pElem->getVertex(i) == it->first) break; - if(i == n-1) { - std::cout << "This should not happen" << std:: endl; exit(1); - } + if(pElem->getVertex(i) == it->first) break; + if(i == n-1) { + std::cout << "This should not happen" << std:: endl; exit(1); + } } SVector3 V0 = pElem->getVertex(i)->point(); SVector3 V1 = pElem->getVertex((i+n-1)%n)->point(); // previous vertex @@ -513,7 +513,7 @@ void Frame_field::initFace(GFace* gf){ // align crosses of the contour of "gf" with the tangent to the contour for(std::map<MVertex*, std::set<MElement*> >::const_iterator it - = vertex_to_elements.begin(); it != vertex_to_elements.end(); it++){ + = vertex_to_elements.begin(); it != vertex_to_elements.end(); it++){ MVertex* pVertex = it->first; std::set<MElement*> elements = it->second; if(elements.size() != 2){ @@ -549,7 +549,7 @@ void Frame_field::initFace(GFace* gf){ // when the option PackingOfParallelogram is on. build_vertex_to_elements(gf); for(std::map<MVertex*, std::set<MElement*> >::const_iterator it - = vertex_to_elements.begin(); it != vertex_to_elements.end(); it++){ + = vertex_to_elements.begin(); it != vertex_to_elements.end(); it++){ //for(unsigned int i=0; i<gf->getNumMeshVertices(); i++){ //MVertex* pVertex0 = gf->getMeshVertex(i); @@ -631,7 +631,7 @@ double Frame_field::findBarycenter(std::map<MVertex*, std::set<MVertex*> >::cons std::set<MVertex*> list = iter->second; cross3D x(m0); if(debug) std::cout << "# " << pVertex0->getNum() - << " with " << list.size() << " neighbours" << std::endl; + << " with " << list.size() << " neighbours" << std::endl; SVector3 T = SVector3(0.), dT; double temp = 0.; @@ -675,87 +675,87 @@ double Frame_field::findBarycenter(std::map<MVertex*, std::set<MVertex*> >::cons } void Frame_field::buildSmoothness(){ - GModel *m = GModel::current(); - std::vector<GEntity*> entities; - m->getEntities(entities); - //pour commencer on va creer une map de connectique des Mvertex - std::map<MVertex*, std::vector<MVertex* > > Neighbours; - for(unsigned int i = 0; i < entities.size(); i++){ - GEntity* eTmp = entities[i]; - for (unsigned int j = 0; j < eTmp->getNumMeshElements();j++){ - MElement* elem = eTmp->getMeshElement(j); - for (int k = 0;k < elem->getNumVertices();k++){ - for (int l = k;l < elem->getNumVertices();l++){ - if (k != l){ - MVertex* v1 = elem->getVertex(k); - MVertex* v2 = elem->getVertex(l); - Neighbours[v1].push_back(v2); - Neighbours[v2].push_back(v1); - } - } - } - } - } - for(unsigned int i = 0; i < entities.size(); i++){ - for (unsigned int j = 0;j < entities[i]->mesh_vertices.size();j++){ - //on va traiter chaque noeud - std::set<MVertex*> V1; - std::set<MVertex*> V2; - std::set<MVertex*> V3; - MVertex* v0 = entities[i]->mesh_vertices[j]; - V1.insert(v0); - std::vector<MVertex* > v0vec = Neighbours[v0]; - for (unsigned int k = 0;k < v0vec.size();k++){ - V1.insert(v0vec[k]); - } - for (std::set<MVertex*>::iterator itSet = V1.begin();itSet != V1.end();itSet++){ - MVertex* vTmp = (*itSet); - V2.insert(vTmp); - v0vec = Neighbours[vTmp]; - for (unsigned int k = 0;k < v0vec.size();k++){ - V2.insert(v0vec[k]); - } - } - for (std::set<MVertex*>::iterator itSet = V2.begin();itSet != V2.end();itSet++){ - MVertex* vTmp = (*itSet); - V3.insert(vTmp); - v0vec = Neighbours[vTmp]; - for (unsigned int k = 0;k < v0vec.size();k++){ - V3.insert(v0vec[k]); - } - } - //we have all three set here, time to compute the smoothnesses for each one - std::vector<cross3D> C1; - std::vector<cross3D> C2; - std::vector<cross3D> C3; - double S1 = 0.0; - double S2 = 0.0; - double S3 = 0.0; - for (std::set<MVertex*>::iterator itSet = V1.begin();itSet != V1.end();itSet++){ - MVertex* vTmp = (*itSet); - STensor3 tTmp = crossField[vTmp]; - cross3D cTmp = cross3D(tTmp); - C1.push_back(cTmp); - } - for (std::set<MVertex*>::iterator itSet = V2.begin();itSet != V2.end();itSet++){ - MVertex* vTmp = (*itSet); - STensor3 tTmp = crossField[vTmp]; - cross3D cTmp = cross3D(tTmp); - C2.push_back(cTmp); - } - for (std::set<MVertex*>::iterator itSet = V3.begin();itSet != V3.end();itSet++){ - MVertex* vTmp = (*itSet); - STensor3 tTmp = crossField[vTmp]; - cross3D cTmp = cross3D(tTmp); - C3.push_back(cTmp); - } - S1 = computeSetSmoothness(C1); - S2 = computeSetSmoothness(C2); - S3 = computeSetSmoothness(C3); - double finalSmoothness = (9.0 * S1 + 3.0 * S2 + S3) / 13.0 ; - crossFieldSmoothness[v0] = finalSmoothness; - } - } + GModel *m = GModel::current(); + std::vector<GEntity*> entities; + m->getEntities(entities); + //pour commencer on va creer une map de connectique des Mvertex + std::map<MVertex*, std::vector<MVertex* > > Neighbours; + for(unsigned int i = 0; i < entities.size(); i++){ + GEntity* eTmp = entities[i]; + for (unsigned int j = 0; j < eTmp->getNumMeshElements();j++){ + MElement* elem = eTmp->getMeshElement(j); + for (int k = 0;k < elem->getNumVertices();k++){ + for (int l = k;l < elem->getNumVertices();l++){ + if (k != l){ + MVertex* v1 = elem->getVertex(k); + MVertex* v2 = elem->getVertex(l); + Neighbours[v1].push_back(v2); + Neighbours[v2].push_back(v1); + } + } + } + } + } + for(unsigned int i = 0; i < entities.size(); i++){ + for (unsigned int j = 0;j < entities[i]->mesh_vertices.size();j++){ + //on va traiter chaque noeud + std::set<MVertex*> V1; + std::set<MVertex*> V2; + std::set<MVertex*> V3; + MVertex* v0 = entities[i]->mesh_vertices[j]; + V1.insert(v0); + std::vector<MVertex* > v0vec = Neighbours[v0]; + for (unsigned int k = 0;k < v0vec.size();k++){ + V1.insert(v0vec[k]); + } + for (std::set<MVertex*>::iterator itSet = V1.begin();itSet != V1.end();itSet++){ + MVertex* vTmp = (*itSet); + V2.insert(vTmp); + v0vec = Neighbours[vTmp]; + for (unsigned int k = 0;k < v0vec.size();k++){ + V2.insert(v0vec[k]); + } + } + for (std::set<MVertex*>::iterator itSet = V2.begin();itSet != V2.end();itSet++){ + MVertex* vTmp = (*itSet); + V3.insert(vTmp); + v0vec = Neighbours[vTmp]; + for (unsigned int k = 0;k < v0vec.size();k++){ + V3.insert(v0vec[k]); + } + } + //we have all three set here, time to compute the smoothnesses for each one + std::vector<cross3D> C1; + std::vector<cross3D> C2; + std::vector<cross3D> C3; + double S1 = 0.0; + double S2 = 0.0; + double S3 = 0.0; + for (std::set<MVertex*>::iterator itSet = V1.begin();itSet != V1.end();itSet++){ + MVertex* vTmp = (*itSet); + STensor3 tTmp = crossField[vTmp]; + cross3D cTmp = cross3D(tTmp); + C1.push_back(cTmp); + } + for (std::set<MVertex*>::iterator itSet = V2.begin();itSet != V2.end();itSet++){ + MVertex* vTmp = (*itSet); + STensor3 tTmp = crossField[vTmp]; + cross3D cTmp = cross3D(tTmp); + C2.push_back(cTmp); + } + for (std::set<MVertex*>::iterator itSet = V3.begin();itSet != V3.end();itSet++){ + MVertex* vTmp = (*itSet); + STensor3 tTmp = crossField[vTmp]; + cross3D cTmp = cross3D(tTmp); + C3.push_back(cTmp); + } + S1 = computeSetSmoothness(C1); + S2 = computeSetSmoothness(C2); + S3 = computeSetSmoothness(C3); + double finalSmoothness = (9.0 * S1 + 3.0 * S2 + S3) / 13.0 ; + crossFieldSmoothness[v0] = finalSmoothness; + } + } } double Frame_field::smoothFace(GFace *gf, int n){ @@ -787,7 +787,7 @@ double Frame_field::smooth(){ double energy = 0; for(std::map<MVertex*, std::set<MVertex*> >::const_iterator iter - = vertex_to_vertices.begin(); iter != vertex_to_vertices.end(); ++iter){ + = vertex_to_vertices.begin(); iter != vertex_to_vertices.end(); ++iter){ //MVertex* pVertex0 = iter->first; SVector3 T(0, 0, 0); @@ -812,7 +812,7 @@ double Frame_field::smooth(){ } void Frame_field::save(const std::vector<std::pair<SPoint3, STensor3> > data, - const std::string& filename){ + const std::string& filename){ const cross3D origin(SVector3(1,0,0), SVector3(0,1,0)); SPoint3 p1; double k = 0.1; @@ -823,28 +823,28 @@ void Frame_field::save(const std::vector<std::pair<SPoint3, STensor3> > data, STensor3 m = data[i].second; double val1 = eulerAngleFromQtn(cross3D(m).rotationTo(origin)), val2=val1; p1 = SPoint3(p.x() + k*m.get_m11(), - p.y() + k*m.get_m21(), - p.z() + k*m.get_m31()); + p.y() + k*m.get_m21(), + p.z() + k*m.get_m31()); print_segment(p,p1,val1,val2,file); p1 = SPoint3(p.x() - k*m.get_m11(), - p.y() - k*m.get_m21(), - p.z() - k*m.get_m31()); + p.y() - k*m.get_m21(), + p.z() - k*m.get_m31()); print_segment(p,p1,val1,val2,file); p1 = SPoint3(p.x() + k*m.get_m12(), - p.y() + k*m.get_m22(), - p.z() + k*m.get_m32()); + p.y() + k*m.get_m22(), + p.z() + k*m.get_m32()); print_segment(p,p1,val1,val2,file); p1 = SPoint3(p.x() - k*m.get_m12(), - p.y() - k*m.get_m22(), - p.z() - k*m.get_m32()); + p.y() - k*m.get_m22(), + p.z() - k*m.get_m32()); print_segment(p,p1,val1,val2,file); p1 = SPoint3(p.x() + k*m.get_m13(), - p.y() + k*m.get_m23(), - p.z() + k*m.get_m33()); + p.y() + k*m.get_m23(), + p.z() + k*m.get_m33()); print_segment(p,p1,val1,val2,file); p1 = SPoint3(p.x() - k*m.get_m13(), - p.y() - k*m.get_m23(), - p.z() - k*m.get_m33()); + p.y() - k*m.get_m23(), + p.z() - k*m.get_m33()); print_segment(p,p1,val1,val2,file); } file << "};\n"; @@ -854,10 +854,10 @@ void Frame_field::save(const std::vector<std::pair<SPoint3, STensor3> > data, // BARYCENTRIC End void Frame_field::recur_connect_vert(FILE *fi, int count, - MVertex *v, - STensor3 &cross, - std::multimap<MVertex*,MVertex*> &v2v, - std::set<MVertex*> &touched) + MVertex *v, + STensor3 &cross, + std::multimap<MVertex*,MVertex*> &v2v, + std::set<MVertex*> &touched) { if (touched.find(v) != touched.end()) return; touched.insert(v); @@ -955,7 +955,7 @@ void Frame_field::continuousCrossField(GRegion *gr, GFace *gf) build_vertex_to_vertices(gr, -1, true); std::multimap<MVertex*,MVertex*> v2v; for(std::map<MVertex*, std::set<MVertex*> >::const_iterator iter - = vertex_to_vertices.begin(); iter != vertex_to_vertices.end(); ++iter){ + = vertex_to_vertices.begin(); iter != vertex_to_vertices.end(); ++iter){ MVertex *v = iter->first; std::set<MVertex*> mySet = iter->second; for (std::set<MVertex*>::iterator it = mySet.begin(); it!=mySet.end(); ++it){ @@ -996,30 +996,30 @@ void Frame_field::saveCrossField(const std::string& filename, double scale, bool //double val1 = eulerAngleFromQtn(cross3D(m).rotationTo(origin))*180./M_PI, val2=val1; double val1=1.0, val2=1.0; p1 = SPoint3(p.x() + k*m.get_m11(), - p.y() + k*m.get_m21(), - p.z() + k*m.get_m31()); + p.y() + k*m.get_m21(), + p.z() + k*m.get_m31()); print_segment(p,p1,val1,val2,file); p1 = SPoint3(p.x() - k*m.get_m11(), - p.y() - k*m.get_m21(), - p.z() - k*m.get_m31()); + p.y() - k*m.get_m21(), + p.z() - k*m.get_m31()); if(full) print_segment(p,p1,val1,val2,file); val1=2.0; val2=2.0; p1 = SPoint3(p.x() + k*m.get_m12(), - p.y() + k*m.get_m22(), - p.z() + k*m.get_m32()); + p.y() + k*m.get_m22(), + p.z() + k*m.get_m32()); print_segment(p,p1,val1,val2,file); p1 = SPoint3(p.x() - k*m.get_m12(), - p.y() - k*m.get_m22(), - p.z() - k*m.get_m32()); + p.y() - k*m.get_m22(), + p.z() - k*m.get_m32()); if(full) print_segment(p,p1,val1,val2,file); val1=3.0; val2=3.0; p1 = SPoint3(p.x() + k*m.get_m13(), - p.y() + k*m.get_m23(), - p.z() + k*m.get_m33()); + p.y() + k*m.get_m23(), + p.z() + k*m.get_m33()); if(full) print_segment(p,p1,val1,val2,file); p1 = SPoint3(p.x() - k*m.get_m13(), - p.y() - k*m.get_m23(), - p.z() - k*m.get_m33()); + p.y() - k*m.get_m23(), + p.z() - k*m.get_m33()); if(full) print_segment(p,p1,val1,val2,file); } file << "};\n"; @@ -1038,9 +1038,9 @@ void Frame_field::save_dist(const std::string& filename){ if(it->first.length()) value /= it->first.length(); file << "SL (" - << pVerta->x() << ", " << pVerta->y() << ", " << pVerta->z() << ", " - << pVertb->x() << ", " << pVertb->y() << ", " << pVertb->z() << ")" - << "{" << value << "," << value << "};\n"; + << pVerta->x() << ", " << pVerta->y() << ", " << pVerta->z() << ", " + << pVertb->x() << ", " << pVertb->y() << ", " << pVertb->z() << ")" + << "{" << value << "," << value << "};\n"; } file << "};\n"; file.close(); @@ -1055,9 +1055,9 @@ void Frame_field::checkAnnData(GEntity* ge, const std::string& filename){ MVertex* pVertb = listVertices[findAnnIndex(pVerta->point())]; double value = pVerta->distance(pVertb); file << "SL (" - << pVerta->x() << ", " << pVerta->y() << ", " << pVerta->z() << ", " - << pVertb->x() << ", " << pVertb->y() << ", " << pVertb->z() << ")" - << "{" << value << "," << value << "};\n"; + << pVerta->x() << ", " << pVerta->y() << ", " << pVerta->z() << ", " + << pVertb->x() << ", " << pVertb->y() << ", " << pVertb->z() << ")" + << "{" << value << "," << value << "};\n"; } file << "};\n"; file.close(); @@ -1076,9 +1076,9 @@ void Frame_field::save_energy(GRegion* gr, const std::string& filename){ for(unsigned int i = 0; i < gr->getNumMeshElements(); i++){ pElem = gr->getMeshElement(i); MTetrahedron* pTet = new MTetrahedron(pElem->getVertex(0), - pElem->getVertex(1), - pElem->getVertex(2), - pElem->getVertex(3)); + pElem->getVertex(1), + pElem->getVertex(2), + pElem->getVertex(3)); //std::vector<double> *out = data->incrementList(1, TYPE_TET, NumNodes); std::vector<double> *out = data->incrementList(3, TYPE_TET, NumNodes); for(int j = 0; j < pTet->getNumVertices(); j++) @@ -1098,15 +1098,15 @@ void Frame_field::save_energy(GRegion* gr, const std::string& filename){ inv3x3(jac, inv); SVector3 sum(0,0,0); for(int k = 0; k < pTet->getNumEdges(); k++){ - int nod1 = pTet->edges_tetra(k,0); - int nod2 = pTet->edges_tetra(k,1); - double grd1[3], grd2[3]; - matvec(inv, gsf[nod1], grd1); - matvec(inv, gsf[nod2], grd2); - SVector3 esf = sf[nod1] * SVector3(grd2) - sf[nod2] * SVector3(grd1); - std::map<MEdge, double, Less_Edge>::iterator it = crossDist.find(pTet->getEdge(k)); - sum += it->second * esf; - //sum += (pTet->getVertex(nod2)->z() - pTet->getVertex(nod1)->z()) * esf; + int nod1 = pTet->edges_tetra(k,0); + int nod2 = pTet->edges_tetra(k,1); + double grd1[3], grd2[3]; + matvec(inv, gsf[nod1], grd1); + matvec(inv, gsf[nod2], grd2); + SVector3 esf = sf[nod1] * SVector3(grd2) - sf[nod2] * SVector3(grd1); + std::map<MEdge, double, Less_Edge>::iterator it = crossDist.find(pTet->getEdge(k)); + sum += it->second * esf; + //sum += (pTet->getVertex(nod2)->z() - pTet->getVertex(nod1)->z()) * esf; } out->push_back(sum[0]); out->push_back(sum[1]); @@ -1152,20 +1152,20 @@ void Size_field::init_region(GRegion* gr){ for(it=faces.begin();it!=faces.end();it++){ gf = *it; - for(i=0;i<gf->storage1.size();i++){ - point = gf->storage1[i]; - h = gf->storage4[i]; + for(i=0;i<gf->storage1.size();i++){ + point = gf->storage1[i]; + h = gf->storage4[i]; - field.push_back(std::pair<SPoint3,double>(point,h)); - } + field.push_back(std::pair<SPoint3,double>(point,h)); + } } ANNpointArray duplicate = annAllocPts(field.size(),3); for(i=0;i<field.size();i++){ duplicate[i][0] = field[i].first.x(); - duplicate[i][1] = field[i].first.y(); - duplicate[i][2] = field[i].first.z(); + duplicate[i][1] = field[i].first.y(); + duplicate[i][2] = field[i].first.z(); } kd_tree = new ANNkd_tree(duplicate,field.size(),3); @@ -1182,22 +1182,22 @@ void Size_field::init_region(GRegion* gr){ for(it=faces.begin();it!=faces.end();it++){ gf = *it; - for(i=0;i<gf->getNumMeshElements();i++){ + for(i=0;i<gf->getNumMeshElements();i++){ element = gf->getMeshElement(i); - for(j=0;j<element->getNumVertices();j++){ - vertex = element->getVertex(j); + for(j=0;j<element->getNumVertices();j++){ + vertex = element->getVertex(j); - query[0] = vertex->x(); - query[1] = vertex->y(); - query[2] = vertex->z(); + query[0] = vertex->x(); + query[1] = vertex->y(); + query[2] = vertex->z(); - kd_tree->annkSearch(query,1,indices,distances,e); - index = indices[0]; + kd_tree->annkSearch(query,1,indices,distances,e); + index = indices[0]; - boundary.insert(std::pair<MVertex*,double>(vertex,field[index].second)); - } - } + boundary.insert(std::pair<MVertex*,double>(vertex,field[index].second)); + } + } } octree = new MElementOctree(model); @@ -1456,53 +1456,53 @@ void Nearest_point::init_region(GRegion* gr){ for(it=faces.begin();it!=faces.end();it++){ gf = *it; - for(i=0;i<gf->getNumMeshElements();i++){ - element = gf->getMeshElement(i); + for(i=0;i<gf->getNumMeshElements();i++){ + element = gf->getMeshElement(i); - x1 = element->getVertex(0)->x(); - y1 = element->getVertex(0)->y(); - z1 = element->getVertex(0)->z(); + x1 = element->getVertex(0)->x(); + y1 = element->getVertex(0)->y(); + z1 = element->getVertex(0)->z(); - x2 = element->getVertex(1)->x(); - y2 = element->getVertex(1)->y(); - z2 = element->getVertex(1)->z(); + x2 = element->getVertex(1)->x(); + y2 = element->getVertex(1)->y(); + z2 = element->getVertex(1)->z(); - x3 = element->getVertex(2)->x(); - y3 = element->getVertex(2)->y(); - z3 = element->getVertex(2)->z(); + x3 = element->getVertex(2)->x(); + y3 = element->getVertex(2)->y(); + z3 = element->getVertex(2)->z(); - for(j=0;j<gauss_num;j++){ - u = gauss_points(j,0); - v = gauss_points(j,1); + for(j=0;j<gauss_num;j++){ + u = gauss_points(j,0); + v = gauss_points(j,1); - x = T(u,v,x1,x2,x3); - y = T(u,v,y1,y2,y3); - z = T(u,v,z1,z2,z3); + x = T(u,v,x1,x2,x3); + y = T(u,v,y1,y2,y3); + z = T(u,v,z1,z2,z3); - field.push_back(SPoint3(x,y,z)); - vicinity.push_back(element); - } + field.push_back(SPoint3(x,y,z)); + vicinity.push_back(element); + } - temp.insert(element->getVertex(0)); - temp.insert(element->getVertex(1)); - temp.insert(element->getVertex(2)); - } + temp.insert(element->getVertex(0)); + temp.insert(element->getVertex(1)); + temp.insert(element->getVertex(2)); + } } for(it2=temp.begin();it2!=temp.end();it2++){ - x = (*it2)->x(); - y = (*it2)->y(); - z = (*it2)->z(); + x = (*it2)->x(); + y = (*it2)->y(); + z = (*it2)->z(); //field.push_back(SPoint3(x,y,z)); - //vicinity.push_back(NULL); + //vicinity.push_back(NULL); } ANNpointArray duplicate = annAllocPts(field.size(),3); for(i=0;i<field.size();i++){ - duplicate[i][0] = field[i].x(); - duplicate[i][1] = field[i].y(); - duplicate[i][2] = field[i].z(); + duplicate[i][0] = field[i].x(); + duplicate[i][1] = field[i].y(); + duplicate[i][2] = field[i].z(); } kd_tree = new ANNkd_tree(duplicate,field.size(),3); @@ -1538,7 +1538,7 @@ bool Nearest_point::search(double x,double y,double z,SVector3& vec) delete[] distances; if(vicinity[index]!=NULL){ - found = closest(vicinity[index],SPoint3(x,y,z)); + found = closest(vicinity[index],SPoint3(x,y,z)); } else{ found = field[index]; @@ -1549,11 +1549,11 @@ bool Nearest_point::search(double x,double y,double z,SVector3& vec) if(fabs(found.x()-x)>e2 || fabs(found.y()-y)>e2 || fabs(found.z()-z)>e2){ vec = SVector3(found.x()-x,found.y()-y,found.z()-z); vec.normalize(); - val = 1; + val = 1; } else{ vec = SVector3(1.0,0.0,0.0); - val = 0; + val = 0; } #endif @@ -1568,11 +1568,11 @@ double Nearest_point::T(double u,double v,double val1,double val2,double val3){ //It can also be found on this page : geometrictools.com/LibMathematics/Distance/Distance.html SPoint3 Nearest_point::closest(MElement* element,SPoint3 point){ SVector3 edge0 = SVector3(element->getVertex(1)->x()-element->getVertex(0)->x(),element->getVertex(1)->y()-element->getVertex(0)->y(), - element->getVertex(1)->z()-element->getVertex(0)->z()); + element->getVertex(1)->z()-element->getVertex(0)->z()); SVector3 edge1 = SVector3(element->getVertex(2)->x()-element->getVertex(0)->x(),element->getVertex(2)->y()-element->getVertex(0)->y(), - element->getVertex(2)->z()-element->getVertex(0)->z()); + element->getVertex(2)->z()-element->getVertex(0)->z()); SVector3 v0 = SVector3(element->getVertex(0)->x()-point.x(),element->getVertex(0)->y()-point.y(), - element->getVertex(0)->z()-point.z()); + element->getVertex(0)->z()-point.z()); double a = dot(edge0,edge0); double b = dot(edge0,edge1); @@ -1586,68 +1586,68 @@ SPoint3 Nearest_point::closest(MElement* element,SPoint3 point){ if(s+t<det){ if(s<0.0){ - if(t<0.0){ - if(d<0.0){ - s = clamp(-d/a,0.0,1.0); - t = 0.0; - } - else{ - s = 0.0; - t = clamp(-e/c,0.0,1.0); - } - } - else{ - s = 0.0; - t = clamp(-e/c,0.0,1.0); - } - } - else if(t<0.0){ - s = clamp(-d/a,0.0,1.0); - t = 0.0; - } - else{ - double invDet = 1.0/det; - s *= invDet; - t *= invDet; - } + if(t<0.0){ + if(d<0.0){ + s = clamp(-d/a,0.0,1.0); + t = 0.0; + } + else{ + s = 0.0; + t = clamp(-e/c,0.0,1.0); + } + } + else{ + s = 0.0; + t = clamp(-e/c,0.0,1.0); + } + } + else if(t<0.0){ + s = clamp(-d/a,0.0,1.0); + t = 0.0; + } + else{ + double invDet = 1.0/det; + s *= invDet; + t *= invDet; + } } else{ if(s<0.0){ - double tmp0 = b+d; - double tmp1 = c+e; - if(tmp1>tmp0){ - double numer = tmp1-tmp0; - double denom = a-2.0*b+c; - s = clamp(numer/denom,0.0,1.0); - t = 1.0-s; - } - else{ - t = clamp(-e/c,0.0,1.0); - s = 0.0; - } - } - else if(t<0.0){ - if(a+d>b+e){ - double numer = c+e-b-d; - double denom = a-2.0*b+c; - s = clamp(numer/denom,0.0,1.0); - t = 1.0-s; - } - else{ - s = clamp(-e/c,0.0,1.0); - t = 0.0; - } - } - else{ - double numer = c+e-b-d; - double denom = a-2.0*b+c; - s = clamp(numer/denom,0.0,1.0); - t = 1.0-s; - } + double tmp0 = b+d; + double tmp1 = c+e; + if(tmp1>tmp0){ + double numer = tmp1-tmp0; + double denom = a-2.0*b+c; + s = clamp(numer/denom,0.0,1.0); + t = 1.0-s; + } + else{ + t = clamp(-e/c,0.0,1.0); + s = 0.0; + } + } + else if(t<0.0){ + if(a+d>b+e){ + double numer = c+e-b-d; + double denom = a-2.0*b+c; + s = clamp(numer/denom,0.0,1.0); + t = 1.0-s; + } + else{ + s = clamp(-e/c,0.0,1.0); + t = 0.0; + } + } + else{ + double numer = c+e-b-d; + double denom = a-2.0*b+c; + s = clamp(numer/denom,0.0,1.0); + t = 1.0-s; + } } return SPoint3(element->getVertex(0)->x()+s*edge0.x()+t*edge1.x(),element->getVertex(0)->y()+s*edge0.y()+t*edge1.y(), - element->getVertex(0)->z()+s*edge0.z()+t*edge1.z()); + element->getVertex(0)->z()+s*edge0.z()+t*edge1.z()); } double Nearest_point::clamp(double x,double min,double max){ @@ -1681,17 +1681,17 @@ void Nearest_point::print_field(GRegion* gr){ for(i=0;i<gr->getNumMeshElements();i++){ element = gr->getMeshElement(i); - for(j=0;j<element->getNumVertices();j++){ - vertex = element->getVertex(j); - x = vertex->x(); - y = vertex->y(); - z = vertex->z(); - val = search(x,y,z,vec); - if(val){ - print_segment(SPoint3(x+k*vec.x(),y+k*vec.y(),z+k*vec.z()), - SPoint3(x-k*vec.x(),y-k*vec.y(),z-k*vec.z()),file); - } - } + for(j=0;j<element->getNumVertices();j++){ + vertex = element->getVertex(j); + x = vertex->x(); + y = vertex->y(); + z = vertex->z(); + val = search(x,y,z,vec); + if(val){ + print_segment(SPoint3(x+k*vec.x(),y+k*vec.y(),z+k*vec.z()), + SPoint3(x-k*vec.x(),y-k*vec.y(),z-k*vec.z()),file); + } + } } file << "};\n"; diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp index d5653566b6009e62ac7d32dcc12115fc7d7bf8ae..8b2f3cbd608038dac21841adb9d053df1239c7b1 100644 --- a/Mesh/meshGFace.cpp +++ b/Mesh/meshGFace.cpp @@ -87,29 +87,29 @@ public: std::list<GEdge*> edges = gf->edges(); std::list<GEdge*>::iterator ite = edges.begin(); while(ite != edges.end()){ - if(!(*ite)->isMeshDegenerated()){ - std::vector<MLine*> temp; - (*ite)->mesh_vertices.clear(); - for(unsigned int i = 0; i< (*ite)->lines.size(); i+=2){ - if (i+1 >= (*ite)->lines.size()){ - Msg::Error("1D mesh cannot be divided by 2"); - break; - } - MVertex *v1 = (*ite)->lines[i]->getVertex(0); - MVertex *v2 = (*ite)->lines[i]->getVertex(1); - MVertex *v3 = (*ite)->lines[i+1]->getVertex(1); - v2->x() = 0.5*(v1->x()+v3->x()); - v2->y() = 0.5*(v1->y()+v3->y()); - v2->z() = 0.5*(v1->z()+v3->z()); - temp.push_back(new MLine(v1,v3)); - if (v1->onWhat() == *ite) (*ite)->mesh_vertices.push_back(v1); - _middle[MEdge(v1,v3)] = v2; - } - _backup[*ite] = (*ite)->lines; - // printf("line %d goes from %d to %d\n",(*ite)->tag(), (*ite)->lines.size()-1,temp.size()-1); - (*ite)->lines = temp; - } - ++ite; + if(!(*ite)->isMeshDegenerated()){ + std::vector<MLine*> temp; + (*ite)->mesh_vertices.clear(); + for(unsigned int i = 0; i< (*ite)->lines.size(); i+=2){ + if (i+1 >= (*ite)->lines.size()){ + Msg::Error("1D mesh cannot be divided by 2"); + break; + } + MVertex *v1 = (*ite)->lines[i]->getVertex(0); + MVertex *v2 = (*ite)->lines[i]->getVertex(1); + MVertex *v3 = (*ite)->lines[i+1]->getVertex(1); + v2->x() = 0.5*(v1->x()+v3->x()); + v2->y() = 0.5*(v1->y()+v3->y()); + v2->z() = 0.5*(v1->z()+v3->z()); + temp.push_back(new MLine(v1,v3)); + if (v1->onWhat() == *ite) (*ite)->mesh_vertices.push_back(v1); + _middle[MEdge(v1,v3)] = v2; + } + _backup[*ite] = (*ite)->lines; + // printf("line %d goes from %d to %d\n",(*ite)->tag(), (*ite)->lines.size()-1,temp.size()-1); + (*ite)->lines = temp; + } + ++ite; } CTX::instance()->mesh.lcFactor *=2.0; } @@ -124,28 +124,28 @@ public: MVertex *v[3]; SPoint2 m[3]; for (int j=0;j<3;j++){ - MEdge E = _gf->triangles[i]->getEdge(j); - SPoint2 p1, p2; - reparamMeshEdgeOnFace(E.getVertex(0),E.getVertex(1),_gf,p1,p2); - std::map<MEdge, MVertex *, Less_Edge>::iterator it = _middle.find(E); - std::map<MEdge, MVertex *, Less_Edge>::iterator it2 = eds.find(E); - m[j] = p1; - if (it == _middle.end() && it2 == eds.end()){ - GPoint gp = _gf->point((p1+p2)*0.5); - double XX = 0.5*(E.getVertex(0)->x()+E.getVertex(1)->x()); - double YY = 0.5*(E.getVertex(0)->y()+E.getVertex(1)->y()); - double ZZ = 0.5*(E.getVertex(0)->z()+E.getVertex(1)->z()); - v[j] = new MFaceVertex (XX,YY,ZZ,_gf,gp.u(),gp.v()); - _gf->mesh_vertices.push_back(v[j]); - eds[E] = v[j]; - } - else if (it == _middle.end()){ - v[j] = it2->second; - } - else { - v[j] = it->second; - v[j]->onWhat()->mesh_vertices.push_back(v[j]); - } + MEdge E = _gf->triangles[i]->getEdge(j); + SPoint2 p1, p2; + reparamMeshEdgeOnFace(E.getVertex(0),E.getVertex(1),_gf,p1,p2); + std::map<MEdge, MVertex *, Less_Edge>::iterator it = _middle.find(E); + std::map<MEdge, MVertex *, Less_Edge>::iterator it2 = eds.find(E); + m[j] = p1; + if (it == _middle.end() && it2 == eds.end()){ + GPoint gp = _gf->point((p1+p2)*0.5); + double XX = 0.5*(E.getVertex(0)->x()+E.getVertex(1)->x()); + double YY = 0.5*(E.getVertex(0)->y()+E.getVertex(1)->y()); + double ZZ = 0.5*(E.getVertex(0)->z()+E.getVertex(1)->z()); + v[j] = new MFaceVertex (XX,YY,ZZ,_gf,gp.u(),gp.v()); + _gf->mesh_vertices.push_back(v[j]); + eds[E] = v[j]; + } + else if (it == _middle.end()){ + v[j] = it2->second; + } + else { + v[j] = it->second; + v[j]->onWhat()->mesh_vertices.push_back(v[j]); + } } GPoint gp = _gf->point((m[0]+m[1]+m[2])*(1./3.)); double XX = (v[0]->x()+v[1]->x()+v[2]->x())*(1./3.); @@ -163,28 +163,28 @@ public: MVertex *v[4]; SPoint2 m[4]; for (int j=0;j<4;j++){ - MEdge E = _gf->quadrangles[i]->getEdge(j); - SPoint2 p1, p2; - reparamMeshEdgeOnFace(E.getVertex(0),E.getVertex(1),_gf,p1,p2); - std::map<MEdge, MVertex *, Less_Edge>::iterator it = _middle.find(E); - std::map<MEdge, MVertex *, Less_Edge>::iterator it2 = eds.find(E); - m[j] = p1; - if (it == _middle.end() && it2 == eds.end()){ - GPoint gp = _gf->point((p1+p2)*0.5); - double XX = 0.5*(E.getVertex(0)->x()+E.getVertex(1)->x()); - double YY = 0.5*(E.getVertex(0)->y()+E.getVertex(1)->y()); - double ZZ = 0.5*(E.getVertex(0)->z()+E.getVertex(1)->z()); - v[j] = new MFaceVertex (XX,YY,ZZ,_gf,gp.u(),gp.v()); - _gf->mesh_vertices.push_back(v[j]); - eds[E] = v[j]; - } - else if (it == _middle.end()){ - v[j] = it2->second; - } - else { - v[j] = it->second; - v[j]->onWhat()->mesh_vertices.push_back(v[j]); - } + MEdge E = _gf->quadrangles[i]->getEdge(j); + SPoint2 p1, p2; + reparamMeshEdgeOnFace(E.getVertex(0),E.getVertex(1),_gf,p1,p2); + std::map<MEdge, MVertex *, Less_Edge>::iterator it = _middle.find(E); + std::map<MEdge, MVertex *, Less_Edge>::iterator it2 = eds.find(E); + m[j] = p1; + if (it == _middle.end() && it2 == eds.end()){ + GPoint gp = _gf->point((p1+p2)*0.5); + double XX = 0.5*(E.getVertex(0)->x()+E.getVertex(1)->x()); + double YY = 0.5*(E.getVertex(0)->y()+E.getVertex(1)->y()); + double ZZ = 0.5*(E.getVertex(0)->z()+E.getVertex(1)->z()); + v[j] = new MFaceVertex (XX,YY,ZZ,_gf,gp.u(),gp.v()); + _gf->mesh_vertices.push_back(v[j]); + eds[E] = v[j]; + } + else if (it == _middle.end()){ + v[j] = it2->second; + } + else { + v[j] = it->second; + v[j]->onWhat()->mesh_vertices.push_back(v[j]); + } } GPoint gp = _gf->point((m[0]+m[1]+m[2]+m[3])*0.25); // FIXME : NOT EXACTLY CORRECT, BUT THAT'S THE PLACE WE WANT THE POINT TO RESIDE @@ -215,11 +215,11 @@ public: restore(); recombineIntoQuads(_gf,true,true,1.e-3,false); computeElementShapes(_gf, - _gf->meshStatistics.worst_element_shape, - _gf->meshStatistics.average_element_shape, - _gf->meshStatistics.best_element_shape, - _gf->meshStatistics.nbTriangle, - _gf->meshStatistics.nbGoodQuality); + _gf->meshStatistics.worst_element_shape, + _gf->meshStatistics.average_element_shape, + _gf->meshStatistics.best_element_shape, + _gf->meshStatistics.nbTriangle, + _gf->meshStatistics.nbGoodQuality); } } void restore () @@ -228,7 +228,7 @@ public: std::list<GEdge*>::iterator ite = edges.begin(); while(ite != edges.end()){ for(unsigned int i = 0; i< (*ite)->lines.size(); i++){ - delete (*ite)->lines[i]; + delete (*ite)->lines[i]; } (*ite)->lines = _backup[*ite]; ++ite; @@ -354,9 +354,9 @@ static void copyMesh(GFace *source, GFace *target) } if (!vt[0] || !vt[1] ||!vt[2]){ Msg::Error("Problem in mesh copying procedure %p %p %p %d %d %d", - vt[0], vt[1], vt[2], source->triangles[i]->getVertex(0)->onWhat()->dim(), - source->triangles[i]->getVertex(1)->onWhat()->dim(), - source->triangles[i]->getVertex(2)->onWhat()->dim()); + vt[0], vt[1], vt[2], source->triangles[i]->getVertex(0)->onWhat()->dim(), + source->triangles[i]->getVertex(1)->onWhat()->dim(), + source->triangles[i]->getVertex(2)->onWhat()->dim()); return; } target->triangles.push_back(new MTriangle(vt[0], vt[1], vt[2])); @@ -369,11 +369,11 @@ static void copyMesh(GFace *source, GFace *target) MVertex *v4 = vs2vt[source->quadrangles[i]->getVertex(3)]; if (!v1 || !v2 || !v3 || !v4){ Msg::Error("Problem in mesh copying procedure %p %p %p %p %d %d %d %d", - v1, v2, v3, v4, - source->quadrangles[i]->getVertex(0)->onWhat()->dim(), - source->quadrangles[i]->getVertex(1)->onWhat()->dim(), - source->quadrangles[i]->getVertex(2)->onWhat()->dim(), - source->quadrangles[i]->getVertex(3)->onWhat()->dim()); + v1, v2, v3, v4, + source->quadrangles[i]->getVertex(0)->onWhat()->dim(), + source->quadrangles[i]->getVertex(1)->onWhat()->dim(), + source->quadrangles[i]->getVertex(2)->onWhat()->dim(), + source->quadrangles[i]->getVertex(3)->onWhat()->dim()); } target->quadrangles.push_back(new MQuadrangle(v1, v2, v3, v4)); } @@ -549,12 +549,12 @@ static bool recoverEdge(BDS_Mesh *m, GEdge *ge, BDS_Edge *e = m->recover_edge(pstart->iD, pend->iD, _fatallyFailed, e2r, notRecovered); if(e) e->g = g; else { - if (_fatallyFailed) + if (_fatallyFailed) Msg::Error("Unable to recover an edge %g %g && %g %g (%d/%d)", vstart->x(), vstart->y(), vend->x(), vend->y(), i, ge->mesh_vertices.size()); - return !_fatallyFailed; - } + return !_fatallyFailed; + } } } } @@ -657,40 +657,40 @@ static void modifyInitialMeshForTakingIntoAccountBoundaryLayers(GFace *gf) MEdge dv(v1,v2); addOrRemove(v1,v2,bedges); for (unsigned int SIDE = 0 ; SIDE < _columns->_normals.count(dv); SIDE ++){ - std::vector<MElement*> myCol; - edgeColumn ec = _columns->getColumns(v1, v2, SIDE); - const BoundaryLayerData & c1 = ec._c1; - const BoundaryLayerData & c2 = ec._c2; - int N = std::min(c1._column.size(),c2._column.size()); - for (int l=0;l < N ;++l){ - MVertex *v11,*v12,*v21,*v22; - v21 = c1._column[l]; - v22 = c2._column[l]; - if (l == 0){ - v11 = v1; - v12 = v2; - } - else { - v11 = c1._column[l-1]; - v12 = c2._column[l-1]; - } - MEdge dv2 (v21,v22); - - //avoid convergent errors - if (dv2.length() < 0.03 * dv.length())break; - MQuadrangle *qq = new MQuadrangle(v11,v21,v22,v12); - myCol.push_back(qq); - blQuads.push_back(qq); + std::vector<MElement*> myCol; + edgeColumn ec = _columns->getColumns(v1, v2, SIDE); + const BoundaryLayerData & c1 = ec._c1; + const BoundaryLayerData & c2 = ec._c2; + int N = std::min(c1._column.size(),c2._column.size()); + for (int l=0;l < N ;++l){ + MVertex *v11,*v12,*v21,*v22; + v21 = c1._column[l]; + v22 = c2._column[l]; + if (l == 0){ + v11 = v1; + v12 = v2; + } + else { + v11 = c1._column[l-1]; + v12 = c2._column[l-1]; + } + MEdge dv2 (v21,v22); + + //avoid convergent errors + if (dv2.length() < 0.03 * dv.length())break; + MQuadrangle *qq = new MQuadrangle(v11,v21,v22,v12); + myCol.push_back(qq); + blQuads.push_back(qq); if(ff2) fprintf(ff2,"SQ (%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g){1,1,1,1};\n", v11->x(),v11->y(),v11->z(), v12->x(),v12->y(),v12->z(), v22->x(),v22->y(),v22->z(), v21->x(),v21->y(),v21->z()); - } - // int M = std::max(c1._column.size(),c2._column.size()); - for (unsigned int l=0;l<myCol.size();l++)_columns->_toFirst[myCol[l]] = myCol[0]; - _columns->_elemColumns[myCol[0]] = myCol; + } + // int M = std::max(c1._column.size(),c2._column.size()); + for (unsigned int l=0;l<myCol.size();l++)_columns->_toFirst[myCol[l]] = myCol[0]; + _columns->_elemColumns[myCol[0]] = myCol; } } ++ite; @@ -707,38 +707,38 @@ static void modifyInitialMeshForTakingIntoAccountBoundaryLayers(GFace *gf) const BoundaryLayerData & c2 = _columns->getColumn(v,i+1); int N = std::min(c1._column.size(),c2._column.size()); for (int l=0;l < N ;++l){ - MVertex *v11,*v12,*v21,*v22; - v21 = c1._column[l]; - v22 = c2._column[l]; - if (l == 0){ - v11 = v; - v12 = v; - } - else { - v11 = c1._column[l-1]; - v12 = c2._column[l-1]; - } - if (v11 != v12){ - MQuadrangle *qq = new MQuadrangle(v11,v12,v22,v21); - myCol.push_back(qq); - blQuads.push_back(qq); - if(ff2) + MVertex *v11,*v12,*v21,*v22; + v21 = c1._column[l]; + v22 = c2._column[l]; + if (l == 0){ + v11 = v; + v12 = v; + } + else { + v11 = c1._column[l-1]; + v12 = c2._column[l-1]; + } + if (v11 != v12){ + MQuadrangle *qq = new MQuadrangle(v11,v12,v22,v21); + myCol.push_back(qq); + blQuads.push_back(qq); + if(ff2) fprintf(ff2,"SQ (%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g){1,1,1,1};\n", v11->x(),v11->y(),v11->z(), v12->x(),v12->y(),v12->z(), v22->x(),v22->y(),v22->z(), v21->x(),v21->y(),v21->z()); - } - else { - MTriangle *qq = new MTriangle(v,v22,v21); - myCol.push_back(qq); - blTris.push_back(qq); + } + else { + MTriangle *qq = new MTriangle(v,v22,v21); + myCol.push_back(qq); + blTris.push_back(qq); if(ff2) fprintf(ff2,"ST (%g,%g,%g,%g,%g,%g,%g,%g,%g){1,1,1,1};\n", v->x(),v->y(),v->z(), v22->x(),v22->y(),v22->z(), v21->x(),v21->y(),v21->z()); - } + } } } for (unsigned int l=0;l<myCol.size();l++)_columns->_toFirst[myCol[l]] = myCol[0]; @@ -769,7 +769,7 @@ static void modifyInitialMeshForTakingIntoAccountBoundaryLayers(GFace *gf) } discreteEdge ne (gf->model(), 444444,0, - (*edges.begin())->getEndVertex()); + (*edges.begin())->getEndVertex()); std::list<GEdge*> hop; std::set<MEdge,Less_Edge>::iterator it = bedges.begin(); @@ -955,10 +955,10 @@ static void directions_storage(GFace* gf) // Builds An initial triangular mesh that respects the boundaries of // the domain, including embedded points and surfaces bool meshGenerator(GFace *gf, int RECUR_ITER, - bool repairSelfIntersecting1dMesh, - bool onlyInitialMesh, - bool debug, - std::list<GEdge*> *replacement_edges) + bool repairSelfIntersecting1dMesh, + bool onlyInitialMesh, + bool debug, + std::list<GEdge*> *replacement_edges) { //onlyInitialMesh=true; BDS_GeomEntity CLASS_F(1, 2); @@ -984,11 +984,11 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, if((*ite)->isSeam(gf)) return false; if(!(*ite)->isMeshDegenerated()){ for(unsigned int i = 0; i< (*ite)->lines.size(); i++) - medgesToRecover.push_back(MEdge((*ite)->lines[i]->getVertex(0), - (*ite)->lines[i]->getVertex(1))); + medgesToRecover.push_back(MEdge((*ite)->lines[i]->getVertex(0), + (*ite)->lines[i]->getVertex(1))); for(unsigned int i = 0; i< (*ite)->lines.size(); i++){ - MVertex *v1 = (*ite)->lines[i]->getVertex(0); - MVertex *v2 = (*ite)->lines[i]->getVertex(1); + MVertex *v1 = (*ite)->lines[i]->getVertex(0); + MVertex *v2 = (*ite)->lines[i]->getVertex(1); all_vertices.insert(v1); all_vertices.insert(v2); if(boundary.find(v1) == boundary.end()) @@ -1018,7 +1018,7 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, while(ite != emb_edges.end()){ for(unsigned int i = 0; i< (*ite)->lines.size(); i++) medgesToRecover.push_back(MEdge((*ite)->lines[i]->getVertex(0), - (*ite)->lines[i]->getVertex(1))); + (*ite)->lines[i]->getVertex(1))); if(!(*ite)->isMeshDegenerated()){ all_vertices.insert((*ite)->mesh_vertices.begin(), (*ite)->mesh_vertices.end() ); @@ -1055,7 +1055,7 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, MVertex *vv[3]; int i = 0; for(std::set<MVertex*, MVertexLessThanNum>::iterator it = all_vertices.begin(); - it != all_vertices.end(); it++){ + it != all_vertices.end(); it++){ vv[i++] = *it; } gf->triangles.push_back(new MTriangle(vv[0], vv[1], vv[2])); @@ -1102,9 +1102,9 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, DocRecord doc(points.size() + 4); for(unsigned int i = 0; i < points.size(); i++){ double XX = CTX::instance()->mesh.randFactor * LC2D * (double)rand() / - (double)RAND_MAX; + (double)RAND_MAX; double YY = CTX::instance()->mesh.randFactor * LC2D * (double)rand() / - (double)RAND_MAX; + (double)RAND_MAX; // printf("%22.15E %22.15E \n",XX,YY); doc.points[i].where.h = points[i]->u + XX; doc.points[i].where.v = points[i]->v + YY; @@ -1119,9 +1119,9 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, // add 4 points than encloses the domain (use negative number to // distinguish those fake vertices) double bb[4][2] = {{bbox.min().x(), bbox.min().y()}, - {bbox.min().x(), bbox.max().y()}, - {bbox.max().x(), bbox.min().y()}, - {bbox.max().x(), bbox.max().y()}}; + {bbox.min().x(), bbox.max().y()}, + {bbox.max().x(), bbox.min().y()}, + {bbox.max().x(), bbox.max().y()}}; for(int ip = 0; ip < 4; ip++){ BDS_Point *pp = m->add_point(-ip - 1, bb[ip][0], bb[ip][1], gf); m->add_geom(gf->tag(), 2); @@ -1156,8 +1156,8 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, int c = doc.triangles[i].c; int n = doc.numPoints; if(a < 0 || a >= n || b < 0 || b >= n || c < 0 || c >= n){ - Msg::Warning("Skipping bad triangle %d", i); - continue; + Msg::Warning("Skipping bad triangle %d", i); + continue; } BDS_Point *p1 = (BDS_Point*)doc.points[doc.triangles[i].a].data; BDS_Point *p2 = (BDS_Point*)doc.points[doc.triangles[i].b].data; @@ -1242,31 +1242,31 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, while(ite != edges.end()){ if(!(*ite)->isMeshDegenerated()){ if (!recoverEdge(m, *ite, recoverMapInv, &edgesToRecover, &edgesNotRecovered, 2)){ - delete m; - gf->meshStatistics.status = GFace::FAILED; - return false; + delete m; + gf->meshStatistics.status = GFace::FAILED; + return false; } } ++ite; } Msg::Debug("Recovering %d mesh Edges (%d not recovered)", edgesToRecover.size(), - edgesNotRecovered.size()); + edgesNotRecovered.size()); if(edgesNotRecovered.size()){ std::ostringstream sstream; for(std::set<EdgeToRecover>::iterator itr = edgesNotRecovered.begin(); - itr != edgesNotRecovered.end(); ++itr) + itr != edgesNotRecovered.end(); ++itr) sstream << " " << itr->ge->tag(); Msg::Warning(":-( There are %d intersections in the 1D mesh (curves%s)", - edgesNotRecovered.size(), sstream.str().c_str()); + edgesNotRecovered.size(), sstream.str().c_str()); if (repairSelfIntersecting1dMesh) Msg::Warning("8-| Gmsh splits those edges and tries again"); if(debug){ char name[245]; sprintf(name, "surface%d-not_yet_recovered-real-%d.msh", gf->tag(), - RECUR_ITER); + RECUR_ITER); gf->model()->writeMSH(name); } @@ -1278,14 +1278,14 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, //int *_error = new int[3 * edgesNotRecovered.size()]; int I = 0; for(; itr != edgesNotRecovered.end(); ++itr){ - int p1 = itr->p1; - int p2 = itr->p2; - int tag = itr->ge->tag(); - Msg::Error("Edge not recovered: %d %d %d", p1, p2, tag); - //_error[3 * I + 0] = p1; - //_error[3 * I + 1] = p2; - //_error[3 * I + 2] = tag; - I++; + int p1 = itr->p1; + int p2 = itr->p2; + int tag = itr->ge->tag(); + Msg::Error("Edge not recovered: %d %d %d", p1, p2, tag); + //_error[3 * I + 0] = p1; + //_error[3 * I + 1] = p2; + //_error[3 * I + 2] = tag; + I++; } //throw _error; } @@ -1294,14 +1294,14 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, delete m; if(RECUR_ITER < 10 && facesToRemesh.size() == 0) return meshGenerator - (gf, RECUR_ITER + 1, repairSelfIntersecting1dMesh, onlyInitialMesh, - debug, replacement_edges); + (gf, RECUR_ITER + 1, repairSelfIntersecting1dMesh, onlyInitialMesh, + debug, replacement_edges); return false; } if(RECUR_ITER > 0) Msg::Warning(":-) Gmsh was able to recover all edges after %d iterations", - RECUR_ITER); + RECUR_ITER); Msg::Debug("Boundary Edges recovered for surface %d", gf->tag()); @@ -1319,9 +1319,9 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, BDS_Point *n[4]; t->getNodes(n); if (n[0]->iD < 0 || n[1]->iD < 0 || - n[2]->iD < 0 ) { - recur_tag(t, &CLASS_EXTERIOR); - break; + n[2]->iD < 0 ) { + recur_tag(t, &CLASS_EXTERIOR); + break; } ++itt; } @@ -1334,14 +1334,14 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, while (ite != m->edges.end()){ BDS_Edge *e = *ite; if(e->g && e->numfaces() == 2){ - if(e->faces(0)->g == &CLASS_EXTERIOR){ - recur_tag(e->faces(1), &CLASS_F); - break; - } - else if(e->faces(1)->g == &CLASS_EXTERIOR){ - recur_tag(e->faces(0), &CLASS_F); - break; - } + if(e->faces(0)->g == &CLASS_EXTERIOR){ + recur_tag(e->faces(1), &CLASS_F); + break; + } + else if(e->faces(1)->g == &CLASS_EXTERIOR){ + recur_tag(e->faces(0), &CLASS_F); + break; + } } ++ite; } @@ -1357,16 +1357,16 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, while (ite != m->edges.end()){ BDS_Edge *e = *ite; if(e->g && e->numfaces() == 2){ - BDS_Point *oface[2]; - e->oppositeof(oface); - if(oface[0]->iD < 0){ - recur_tag(e->faces(1), &CLASS_F); - break; - } - else if(oface[1]->iD < 0){ - recur_tag(e->faces(0), &CLASS_F); - break; - } + BDS_Point *oface[2]; + e->oppositeof(oface); + if(oface[0]->iD < 0){ + recur_tag(e->faces(1), &CLASS_F); + break; + } + else if(oface[1]->iD < 0){ + recur_tag(e->faces(0), &CLASS_F); + break; + } } ++ite; } @@ -1382,28 +1382,28 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, // compute characteristic lengths at vertices if (!onlyInitialMesh){ Msg::Debug("Computing mesh size field at mesh vertices %d", - edgesToRecover.size()); + edgesToRecover.size()); std::set<BDS_Point*, PointLessThan>::iterator it = m->points.begin(); for(; it != m->points.end();++it){ - // for(int i = 0; i < doc.numPoints; i++){ - // BDS_Point *pp = (BDS_Point*)doc.points[i].data; - BDS_Point *pp = *it; - std::map<BDS_Point*, MVertex*,PointLessThan>::iterator itv = recoverMap.find(pp); - if(itv != recoverMap.end()){ - MVertex *here = itv->second; - GEntity *ge = here->onWhat(); - if(ge->dim() == 0){ - pp->lcBGM() = BGM_MeshSize(ge, 0, 0, here->x(), here->y(), here->z()); - } - else if(ge->dim() == 1){ - double u; - here->getParameter(0, u); - pp->lcBGM() = BGM_MeshSize(ge, u, 0, here->x(), here->y(), here->z()); - } - else - pp->lcBGM() = MAX_LC; - pp->lc() = pp->lcBGM(); - } + // for(int i = 0; i < doc.numPoints; i++){ + // BDS_Point *pp = (BDS_Point*)doc.points[i].data; + BDS_Point *pp = *it; + std::map<BDS_Point*, MVertex*,PointLessThan>::iterator itv = recoverMap.find(pp); + if(itv != recoverMap.end()){ + MVertex *here = itv->second; + GEntity *ge = here->onWhat(); + if(ge->dim() == 0){ + pp->lcBGM() = BGM_MeshSize(ge, 0, 0, here->x(), here->y(), here->z()); + } + else if(ge->dim() == 1){ + double u; + here->getParameter(0, u); + pp->lcBGM() = BGM_MeshSize(ge, u, 0, here->x(), here->y(), here->z()); + } + else + pp->lcBGM() = MAX_LC; + pp->lc() = pp->lcBGM(); + } } } @@ -1503,10 +1503,10 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, /* computeMeshSizeFieldAccuracy(gf, *m, gf->meshStatistics.efficiency_index, - gf->meshStatistics.longest_edge_length, - gf->meshStatistics.smallest_edge_length, - gf->meshStatistics.nbEdge, - gf->meshStatistics.nbGoodLength); + gf->meshStatistics.longest_edge_length, + gf->meshStatistics.smallest_edge_length, + gf->meshStatistics.nbEdge, + gf->meshStatistics.nbGoodLength); */ //printf("=== Efficiency index is tau=%g\n", gf->meshStatistics.efficiency_index); @@ -1575,8 +1575,8 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, gf->meshStatistics.nbGoodQuality); gf->mesh_vertices.insert(gf->mesh_vertices.end(), - gf->additionalVertices.begin(), - gf->additionalVertices.end()); + gf->additionalVertices.begin(), + gf->additionalVertices.end()); gf->additionalVertices.clear(); if(CTX::instance()->mesh.algo3d==ALGO_3D_RTREE){ @@ -1925,7 +1925,7 @@ static bool meshGeneratorPeriodic(GFace *gf, bool debug = true) MVertex *vv[3]; int i = 0; for(std::map<BDS_Point*, MVertex*, PointLessThan>::iterator it = recoverMap.begin(); - it != recoverMap.end(); it++){ + it != recoverMap.end(); it++){ vv[i++] = it->second; } gf->triangles.push_back(new MTriangle(vv[0], vv[1], vv[2])); @@ -2022,8 +2022,8 @@ static bool meshGeneratorPeriodic(GFace *gf, bool debug = true) std::vector<BDS_Point*> &edgeLoop_BDS = edgeLoops_BDS[i]; for(unsigned int j = 0; j < edgeLoop_BDS.size(); j++){ BDS_Point *pp = edgeLoop_BDS[j]; - v.push_back(recoverMap[pp]); - recoverMapInv[recoverMap[pp]] = pp; + v.push_back(recoverMap[pp]); + recoverMapInv[recoverMap[pp]] = pp; } } @@ -2237,29 +2237,29 @@ static bool meshGeneratorPeriodic(GFace *gf, bool debug = true) BDS_Point *bds = it->first; std::map<MVertex*, BDS_Point*>::iterator invIt = invertMap.find(mv1); if (invIt != invertMap.end()){ - // create a new "fake" vertex that will be destroyed afterwards - MVertex *mv2 = 0; - if (mv1->onWhat()->dim() == 1) { - double t; - mv1->getParameter(0,t); - mv2 = new MEdgeVertex(mv1->x(),mv1->y(),mv1->z(),mv1->onWhat(), t, - ((MEdgeVertex*)mv1)->getLc()); - } - else if (mv1->onWhat()->dim() == 0) { - mv2 = new MVertex (mv1->x(),mv1->y(),mv1->z(),mv1->onWhat()); - } - else - Msg::Error("Could not reconstruct seam"); - if(mv2){ - it->second = mv2; - equivalence[mv2] = mv1; - parametricCoordinates[mv2] = SPoint2(bds->u,bds->v); - invertMap[mv2] = bds; - } + // create a new "fake" vertex that will be destroyed afterwards + MVertex *mv2 = 0; + if (mv1->onWhat()->dim() == 1) { + double t; + mv1->getParameter(0,t); + mv2 = new MEdgeVertex(mv1->x(),mv1->y(),mv1->z(),mv1->onWhat(), t, + ((MEdgeVertex*)mv1)->getLc()); + } + else if (mv1->onWhat()->dim() == 0) { + mv2 = new MVertex (mv1->x(),mv1->y(),mv1->z(),mv1->onWhat()); + } + else + Msg::Error("Could not reconstruct seam"); + if(mv2){ + it->second = mv2; + equivalence[mv2] = mv1; + parametricCoordinates[mv2] = SPoint2(bds->u,bds->v); + invertMap[mv2] = bds; + } } else { - parametricCoordinates[mv1] = SPoint2(bds->u,bds->v); - invertMap[mv1] = bds; + parametricCoordinates[mv1] = SPoint2(bds->u,bds->v); + invertMap[mv1] = bds; } ++it; } @@ -2298,11 +2298,11 @@ static bool meshGeneratorPeriodic(GFace *gf, bool debug = true) // may be created, for example on a sphere that contains one // pole if(v1 != v2 && v1 != v3 && v2 != v3){ - // we are in the periodic case. if we aim at - // using delaunay mesh generation in thoses cases, - // we should double some of the vertices + // we are in the periodic case. if we aim at + // using delaunay mesh generation in thoses cases, + // we should double some of the vertices gf->triangles.push_back(new MTriangle(v1, v2, v3)); - } + } } else{ MVertex *v4 = recoverMap[n[3]]; @@ -2396,6 +2396,8 @@ void meshGFace::operator() (GFace *gf, bool print) deMeshGFace dem; dem(gf); + // FIXME: if transfinite surface, impossible to use ALGO_3D_RTREE + // because meshGenerator never called if(MeshTransfiniteSurface(gf)) return; if(MeshExtrudedSurface(gf)) return; if(gf->meshMaster() != gf){ @@ -2455,7 +2457,7 @@ void meshGFace::operator() (GFace *gf, bool print) (noSeam(gf) || gf->getNativeType() == GEntity::GmshModel || gf->edgeLoops.empty())){ meshGenerator(gf, 0, repairSelfIntersecting1dMesh, onlyInitialMesh, - debugSurface >= 0 || debugSurface == -100); + debugSurface >= 0 || debugSurface == -100); } else { if(!meshGeneratorPeriodic @@ -2524,7 +2526,7 @@ void partitionAndRemesh(GFaceCompound *gf) int allowType = gf->allowPartition(); multiscalePartition *msp = new multiscalePartition(elements, abs(gf->nbSplit), - method, allowType); + method, allowType); int NF = msp->getNumberOfParts(); int numv = gf->model()->getMaxElementaryNumber(0) + 1; @@ -2569,7 +2571,7 @@ void partitionAndRemesh(GFaceCompound *gf) num_gfc, pf->tag()); GFaceCompound *gfc = new GFaceCompound(gf->model(), num_gfc, f_compound, U0, - gf->getTypeOfCompound()); + gf->getTypeOfCompound()); gfc->meshAttributes.recombine = gf->meshAttributes.recombine; gf->model()->add(gfc); @@ -2617,9 +2619,9 @@ void partitionAndRemesh(GFaceCompound *gf) //update mesh statistics gf->meshStatistics.efficiency_index += gfc->meshStatistics.efficiency_index; gf->meshStatistics.longest_edge_length = std::max(gf->meshStatistics.longest_edge_length, - gfc->meshStatistics.longest_edge_length); + gfc->meshStatistics.longest_edge_length); gf->meshStatistics.smallest_edge_length= std::min(gf->meshStatistics.smallest_edge_length, - gfc->meshStatistics.smallest_edge_length); + gfc->meshStatistics.smallest_edge_length); gf->meshStatistics.nbGoodLength += gfc->meshStatistics.nbGoodLength; gf->meshStatistics.nbGoodQuality += gfc->meshStatistics.nbGoodQuality; gf->meshStatistics.nbEdge += gfc->meshStatistics.nbEdge; diff --git a/Mesh/meshGFaceOptimize.cpp b/Mesh/meshGFaceOptimize.cpp index ed134404a4ddddcfed278ed791fad1529d7bbdb0..ef22671c94205569b4954f811ef1c15358c2dc54 100644 --- a/Mesh/meshGFaceOptimize.cpp +++ b/Mesh/meshGFaceOptimize.cpp @@ -92,14 +92,14 @@ static void setLcs(MTriangle *t, std::map<MVertex*, double> &vSizes, bidimMeshDa MVertex *vi = t->getVertex(i); MVertex *vj = t->getVertex(j); if (vi != data.equivalent(vj) && vj != data.equivalent(vi) ){ - double dx = vi->x() - vj->x(); - double dy = vi->y() - vj->y(); - double dz = vi->z() - vj->z(); - double l = sqrt(dx * dx + dy * dy + dz * dz); - std::map<MVertex*,double>::iterator iti = vSizes.find(vi); - std::map<MVertex*,double>::iterator itj = vSizes.find(vj); - if(iti->second < 0 || iti->second > l) iti->second = l; - if(itj->second < 0 || itj->second > l) itj->second = l; + double dx = vi->x() - vj->x(); + double dy = vi->y() - vj->y(); + double dz = vi->z() - vj->z(); + double l = sqrt(dx * dx + dy * dy + dz * dz); + std::map<MVertex*,double>::iterator iti = vSizes.find(vi); + std::map<MVertex*,double>::iterator itj = vSizes.find(vj); + if(iti->second < 0 || iti->second > l) iti->second = l; + if(itj->second < 0 || itj->second > l) itj->second = l; } } } @@ -107,7 +107,7 @@ static void setLcs(MTriangle *t, std::map<MVertex*, double> &vSizes, bidimMeshDa void buildMeshGenerationDataStructures(GFace *gf, std::set<MTri3*, compareTri3Ptr> &AllTris, - bidimMeshData & data) + bidimMeshData & data) { std::map<MVertex*, double> vSizesMap; std::list<GEdge*> edges = gf->edges(); @@ -140,9 +140,9 @@ void buildMeshGenerationDataStructures(GFace *gf, std::list<GEdge*>::iterator ite = embedded_edges.begin(); while(ite != embedded_edges.end()){ if(!(*ite)->isMeshDegenerated()){ - for (unsigned int i = 0; i < (*ite)->lines.size(); i++) - data.internalEdges.insert(MEdge((*ite)->lines[i]->getVertex(0), - (*ite)->lines[i]->getVertex(1))); + for (unsigned int i = 0; i < (*ite)->lines.size(); i++) + data.internalEdges.insert(MEdge((*ite)->lines[i]->getVertex(0), + (*ite)->lines[i]->getVertex(1))); } ++ite; } @@ -173,11 +173,11 @@ void computeEquivalences(GFace *gf, bidimMeshData & data) MTriangle *t = gf->triangles[i]; MVertex *v[3]; for (int j=0;j<3;j++){ - v[j] = t->getVertex(j); - std::map<MVertex* , MVertex*>::iterator it = data.equivalence->find(v[j]); - if (it != data.equivalence->end()){ - v[j] = it->second; - } + v[j] = t->getVertex(j); + std::map<MVertex* , MVertex*>::iterator it = data.equivalence->find(v[j]); + if (it != data.equivalence->end()){ + v[j] = it->second; + } } if (v[0] != v[1] && v[0] != v[2] && v[2] != v[1]) newT.push_back(new MTriangle (v[0],v[1],v[2])); @@ -210,7 +210,7 @@ struct equivalentTriangle { }; bool computeEquivalentTriangles (GFace *gf, - std::map<MVertex* , MVertex*>* equivalence) + std::map<MVertex* , MVertex*>* equivalence) { if (!equivalence)return false; std::vector<MTriangle*> WTF; @@ -277,8 +277,8 @@ void transferDataStructure(GFace *gf, std::set<MTri3*, compareTri3Ptr> &AllTris, index1 = data.getIndex (v1); index2 = data.getIndex (v2); normal3points(data.Us[index0], data.Vs[index0], 0., - data.Us[index1], data.Vs[index1], 0., - data.Us[index2], data.Vs[index2], 0., n2); + data.Us[index1], data.Vs[index1], 0., + data.Us[index2], data.Vs[index2], 0., n2); double pp; prosca(n1, n2, &pp); if(pp < 0) t->reverse(); } @@ -420,7 +420,7 @@ int _removeThreeTrianglesNodes(GFace *gf) n++; gf->triangles.push_back(newt); for(int i=0;i<3;i++) { - touched.insert(lt[i]); + touched.insert(lt[i]); } } it++; @@ -484,18 +484,18 @@ static int _removeTwoQuadsNodes(GFace *gf) q2->writePOS(stdout,true,false,false,false,false,false); return 0; } - MQuadrangle *q = new MQuadrangle(v1,v2,v3,v4); - double s1 = surfaceFaceUV(q,gf); - double s2 = surfaceFaceUV(q1,gf) + surfaceFaceUV(q2,gf);; - if (s1 > s2){ - delete q; - } - else{ - touched.insert(q1); - touched.insert(q2); - gf->quadrangles.push_back(q); - vtouched.insert(it->first); - } + MQuadrangle *q = new MQuadrangle(v1,v2,v3,v4); + double s1 = surfaceFaceUV(q,gf); + double s2 = surfaceFaceUV(q1,gf) + surfaceFaceUV(q2,gf);; + if (s1 > s2){ + delete q; + } + else{ + touched.insert(q1); + touched.insert(q2); + gf->quadrangles.push_back(q); + vtouched.insert(it->first); + } } } it++; @@ -539,11 +539,11 @@ int removeTwoQuadsNodes(GFace *gf) // collapse v1 & v2 to their middle and replace into e1 & e2 static bool _tryToCollapseThatVertex (GFace *gf, - std::vector<MElement*> &e1, - std::vector<MElement*> &e2, - MElement *q, - MVertex *v1, - MVertex *v2) + std::vector<MElement*> &e1, + std::vector<MElement*> &e2, + MElement *q, + MVertex *v1, + MVertex *v2) { std::vector<MElement*> e = e1; @@ -599,11 +599,11 @@ static bool _tryToCollapseThatVertex (GFace *gf, v1->setParameter(0,pp.u());v1->setParameter(1,pp.v()); for (unsigned int j=0;j<e.size();++j){ if (e[j] != q){ - for (int k=0;k<4;k++){ - if (e[j]->getVertex(k) == v2){ - e[j]->setVertex(k,v1); - } - } + for (int k=0;k<4;k++){ + if (e[j]->getVertex(k) == v2){ + e[j]->setVertex(k,v1); + } + } } } return true; @@ -683,32 +683,32 @@ static int _removeDiamonds(GFace *gf) touched.find(v3) == touched.end() && touched.find(v4) == touched.end() ) { if (v1->onWhat()->dim() == 2 && - v2->onWhat()->dim() == 2 && - v3->onWhat()->dim() == 2 && - v4->onWhat()->dim() == 2 && - it1->second.size() ==3 && it3->second.size() == 3 && - _tryToCollapseThatVertex (gf, it1->second, it3->second, - q, v1, v3)){ - touched.insert(v1); - touched.insert(v2); - touched.insert(v3); - touched.insert(v4); - deleted.insert(v3); - diamonds.insert(q); + v2->onWhat()->dim() == 2 && + v3->onWhat()->dim() == 2 && + v4->onWhat()->dim() == 2 && + it1->second.size() ==3 && it3->second.size() == 3 && + _tryToCollapseThatVertex (gf, it1->second, it3->second, + q, v1, v3)){ + touched.insert(v1); + touched.insert(v2); + touched.insert(v3); + touched.insert(v4); + deleted.insert(v3); + diamonds.insert(q); } else if (v1->onWhat()->dim() == 2 && - v2->onWhat()->dim() == 2 && - v3->onWhat()->dim() == 2 && - v4->onWhat()->dim() == 2 && - it2->second.size() ==3 && it4->second.size() == 3 && - _tryToCollapseThatVertex (gf, it2->second, it4->second, - q, v2, v4)){ - touched.insert(v1); - touched.insert(v2); - touched.insert(v3); - touched.insert(v4); - deleted.insert(v4); - diamonds.insert(q); + v2->onWhat()->dim() == 2 && + v3->onWhat()->dim() == 2 && + v4->onWhat()->dim() == 2 && + it2->second.size() ==3 && it4->second.size() == 3 && + _tryToCollapseThatVertex (gf, it2->second, it4->second, + q, v2, v4)){ + touched.insert(v1); + touched.insert(v2); + touched.insert(v3); + touched.insert(v4); + deleted.insert(v4); + diamonds.insert(q); } else { quadrangles2.push_back(q); @@ -770,12 +770,12 @@ void _relocateVertex(GFace *gf, MVertex *ver, MEdge e = lt[i]->getEdge(j); SPoint2 param0, param1; if (e.getVertex(0) == ver){ - reparamMeshEdgeOnFace(e.getVertex(0), e.getVertex(1), gf, param0, param1); - pts[e.getVertex(1)] = param1; + reparamMeshEdgeOnFace(e.getVertex(0), e.getVertex(1), gf, param0, param1); + pts[e.getVertex(1)] = param1; } else if (e.getVertex(1) == ver){ - reparamMeshEdgeOnFace(e.getVertex(0), e.getVertex(1), gf, param0, param1); - pts[e.getVertex(0)] = param0; + reparamMeshEdgeOnFace(e.getVertex(0), e.getVertex(1), gf, param0, param1); + pts[e.getVertex(0)] = param0; } } } @@ -791,8 +791,8 @@ void _relocateVertex(GFace *gf, MVertex *ver, d.normalize(); buildMetric (gf,adj,metric); const double F = sqrt(metric[0]*d.x()*d.x() + - 2*metric[1]*d.x()*d.y() + - metric[2]*d.y()*d.y()); + 2*metric[1]*d.x()*d.y() + + metric[2]*d.y()*d.y()); // printf("%g ",F); after += adj*F; COUNT += F; @@ -809,12 +809,12 @@ void _relocateVertex(GFace *gf, MVertex *ver, if (success){ GPoint pt = gf->point(trial); if(pt.succeeded()){ - actual = trial; - ver->setParameter(0, trial.x()); - ver->setParameter(1, trial.y()); - ver->x() = pt.x(); - ver->y() = pt.y(); - ver->z() = pt.z(); + actual = trial; + ver->setParameter(0, trial.x()); + ver->setParameter(1, trial.y()); + ver->x() = pt.x(); + ver->y() = pt.y(); + ver->z() = pt.z(); } } FACTOR /= 1.4; @@ -888,11 +888,11 @@ bool edgeSwap(std::set<swapquad> &configs, MTri3 *t1, GFace *gf, int iLocalEdge, const double triQuality = std::min(qmTriangle::gamma(t1b), qmTriangle::gamma(t2b)); if (!edgeSwapDelProj(v1,v2,v3,v4)){ - if(triQuality < triQualityRef){ - delete t1b; - delete t2b; - return false; - } + if(triQuality < triQualityRef){ + delete t1b; + delete t2b; + return false; + } } break; } @@ -1120,8 +1120,8 @@ static int _recombineIntoQuads(GFace *gf, double minqual, bool cubicGraph = 1) if (pairs[i].n2->onWhat()->dim() < 2) NB++; if (pairs[i].n3->onWhat()->dim() < 2) NB++; if (pairs[i].n4->onWhat()->dim() < 2) NB++; - if (elen[i] > (int)1000*exp(.1) && NB > 2) { elen[i] = 5000; } - else if (elen[i] >= 1000 && NB > 2) { elen[i] = 10000; } + if (elen[i] > (int)1000*exp(.1) && NB > 2) { elen[i] = 5000; } + else if (elen[i] >= 1000 && NB > 2) { elen[i] = 10000; } } if (cubicGraph){ @@ -1140,9 +1140,9 @@ static int _recombineIntoQuads(GFace *gf, double minqual, bool cubicGraph = 1) sprintf(MATCHFILE,".face.match"); if(perfect_match(ncount, NULL, ecount, &elist, &elen, NULL, MATCHFILE, 0, 0, 0, 0, &matzeit)){ - Msg::Error("Perfect Match failed in Quadrangulation, try something else"); - free(elist); - pairs.clear(); + Msg::Error("Perfect Match failed in Quadrangulation, try something else"); + free(elist); + pairs.clear(); } else{ // TEST @@ -1150,8 +1150,8 @@ static int _recombineIntoQuads(GFace *gf, double minqual, bool cubicGraph = 1) int i1 = elist[1+3*k], i2 = elist[1+3*k+1], an=elist[1+3*k+2]; // FIXME ! if (an == 100000 /*|| an == 1000*/){ - // toProcess.push_back(std::make_pair(n2t[i1],n2t[i2])); - // Msg::Warning("Extra edge found in blossom algorithm, optimization will be required"); + // toProcess.push_back(std::make_pair(n2t[i1],n2t[i2])); + // Msg::Warning("Extra edge found in blossom algorithm, optimization will be required"); } else{ MElement *t1 = n2t[i1]; @@ -1185,7 +1185,7 @@ static int _recombineIntoQuads(GFace *gf, double minqual, bool cubicGraph = 1) } free(elist); pairs.clear(); - Msg::Debug("Perfect Match Succeeded in Quadrangulation (%g sec)", matzeit); + Msg::Debug("Perfect Match Succeeded in Quadrangulation (%g sec)", matzeit); } } @@ -1269,8 +1269,8 @@ static double printStats(GFace *gf,const char *message) void recombineIntoQuads(GFace *gf, bool topologicalOpti, bool nodeRepositioning, - double minqual, - bool firstpass) + double minqual, + bool firstpass) { double t1 = Cpu(); @@ -1294,15 +1294,15 @@ void recombineIntoQuads(GFace *gf, if (saveAll) gf->model()->writeMSH("smoothed.msh"); int ITER=0; std::set<MEdge,Less_Edge> prioritory; - int nbTwoQuadNodes = 1; - int nbDiamonds = 1; - while(nbTwoQuadNodes || nbDiamonds){ - nbTwoQuadNodes = removeTwoQuadsNodes(gf); - nbDiamonds = removeDiamonds(gf) ; - if(haveParam) RelocateVertices (gf,CTX::instance()->mesh.nbSmoothing); - // printStats (gf, "toto"); - if (ITER > 20) break; - ITER ++; + int nbTwoQuadNodes = 1; + int nbDiamonds = 1; + while(nbTwoQuadNodes || nbDiamonds){ + nbTwoQuadNodes = removeTwoQuadsNodes(gf); + nbDiamonds = removeDiamonds(gf) ; + if(haveParam) RelocateVertices (gf,CTX::instance()->mesh.nbSmoothing); + // printStats (gf, "toto"); + if (ITER > 20) break; + ITER ++; } } } diff --git a/Mesh/meshGRegion.cpp b/Mesh/meshGRegion.cpp index 2d1bc52f6148dcad6c2c5436eaf6320a5f538baa..106361cc392ce06c4d80aec39620756035a3bcd1 100644 --- a/Mesh/meshGRegion.cpp +++ b/Mesh/meshGRegion.cpp @@ -70,48 +70,48 @@ class splitQuadRecovery { for (std::multimap<GEntity*, std::pair<MVertex*,MFace> >::iterator it2 = _data.lower_bound(*it); it2 != _data.upper_bound(*it) ; ++it2){ const MFace &f = it2->second.second; - MVertex *v = it2->second.first; - v->onWhat()->mesh_vertices.erase(std::find(v->onWhat()->mesh_vertices.begin(), - v->onWhat()->mesh_vertices.end(), v)); - std::set<MFace, Less_Face>::iterator itf0 = allFaces.find(MFace(f.getVertex(0), - f.getVertex(1),v)); - std::set<MFace, Less_Face>::iterator itf1 = allFaces.find(MFace(f.getVertex(1), - f.getVertex(2),v)); - std::set<MFace, Less_Face>::iterator itf2 = allFaces.find(MFace(f.getVertex(2), - f.getVertex(3),v)); - std::set<MFace, Less_Face>::iterator itf3 = allFaces.find(MFace(f.getVertex(3), - f.getVertex(0),v)); - if (itf0 != allFaces.end() && itf1 != allFaces.end() && - itf2 != allFaces.end() && itf3 != allFaces.end()){ - (*it)->quadrangles.push_back(new MQuadrangle(f.getVertex(0), f.getVertex(1), - f.getVertex(2), f.getVertex(3))); - allFaces.erase(*itf0); - allFaces.erase(*itf1); - allFaces.erase(*itf2); - allFaces.erase(*itf3); - // printf("some pyramids should be created %d regions\n", (*it)->numRegions()); - for (int iReg = 0; iReg < (*it)->numRegions(); iReg++){ - if (iReg == 1) { - Msg::Error("Cannot build pyramids on non manifold faces"); - v = new MVertex(v->x(), v->y(), v->z(), (*it)->getRegion(iReg)); - } - else - v->setEntity ((*it)->getRegion(iReg)); - // A quad face connected to an hex or a primsm --> leave the quad face as is - if (_toDelete.find(f) == _toDelete.end()){ - (*it)->getRegion(iReg)->pyramids.push_back - (new MPyramid(f.getVertex(0), f.getVertex(1), f.getVertex(2), f.getVertex(3), v)); - (*it)->getRegion(iReg)->mesh_vertices.push_back(v); - NBPY++; - } - else { - delete v; - } - } - } + MVertex *v = it2->second.first; + v->onWhat()->mesh_vertices.erase(std::find(v->onWhat()->mesh_vertices.begin(), + v->onWhat()->mesh_vertices.end(), v)); + std::set<MFace, Less_Face>::iterator itf0 = allFaces.find(MFace(f.getVertex(0), + f.getVertex(1),v)); + std::set<MFace, Less_Face>::iterator itf1 = allFaces.find(MFace(f.getVertex(1), + f.getVertex(2),v)); + std::set<MFace, Less_Face>::iterator itf2 = allFaces.find(MFace(f.getVertex(2), + f.getVertex(3),v)); + std::set<MFace, Less_Face>::iterator itf3 = allFaces.find(MFace(f.getVertex(3), + f.getVertex(0),v)); + if (itf0 != allFaces.end() && itf1 != allFaces.end() && + itf2 != allFaces.end() && itf3 != allFaces.end()){ + (*it)->quadrangles.push_back(new MQuadrangle(f.getVertex(0), f.getVertex(1), + f.getVertex(2), f.getVertex(3))); + allFaces.erase(*itf0); + allFaces.erase(*itf1); + allFaces.erase(*itf2); + allFaces.erase(*itf3); + // printf("some pyramids should be created %d regions\n", (*it)->numRegions()); + for (int iReg = 0; iReg < (*it)->numRegions(); iReg++){ + if (iReg == 1) { + Msg::Error("Cannot build pyramids on non manifold faces"); + v = new MVertex(v->x(), v->y(), v->z(), (*it)->getRegion(iReg)); + } + else + v->setEntity ((*it)->getRegion(iReg)); + // A quad face connected to an hex or a primsm --> leave the quad face as is + if (_toDelete.find(f) == _toDelete.end()){ + (*it)->getRegion(iReg)->pyramids.push_back + (new MPyramid(f.getVertex(0), f.getVertex(1), f.getVertex(2), f.getVertex(3), v)); + (*it)->getRegion(iReg)->mesh_vertices.push_back(v); + NBPY++; + } + else { + delete v; + } + } + } } for (std::set<MFace, Less_Face>::iterator itf = allFaces.begin(); - itf != allFaces.end(); ++itf){ + itf != allFaces.end(); ++itf){ (*it)->triangles.push_back (new MTriangle(itf->getVertex(0), itf->getVertex(1), itf->getVertex(2))); } @@ -334,76 +334,76 @@ void TransferTetgenMesh(GRegion *gr, tetgenio &in, tetgenio &out, double guess[2] = {0, 0}; if (needParam) { - int Count = 0; - for(int j = 0; j < 3; j++){ - if(!v[j]->onWhat()){ - Msg::Error("Uncategorized vertex %d", v[j]->getNum()); - } - else if(v[j]->onWhat()->dim() == 2){ - double uu,vv; - v[j]->getParameter(0, uu); - v[j]->getParameter(1, vv); - guess[0] += uu; - guess[1] += vv; - Count++; - } - else if(v[j]->onWhat()->dim() == 1){ - GEdge *ge = (GEdge*)v[j]->onWhat(); - double UU; - v[j]->getParameter(0, UU); - SPoint2 param; - param = ge->reparamOnFace(gf, UU, 1); - guess[0] += param.x(); - guess[1] += param.y(); - Count++; - } - else if(v[j]->onWhat()->dim() == 0){ - SPoint2 param; - GVertex *gv = (GVertex*)v[j]->onWhat(); - param = gv->reparamOnFace(gf,1); - guess[0] += param.x(); - guess[1] += param.y(); - Count++; - } - } - if(Count != 0){ - guess[0] /= Count; - guess[1] /= Count; - } + int Count = 0; + for(int j = 0; j < 3; j++){ + if(!v[j]->onWhat()){ + Msg::Error("Uncategorized vertex %d", v[j]->getNum()); + } + else if(v[j]->onWhat()->dim() == 2){ + double uu,vv; + v[j]->getParameter(0, uu); + v[j]->getParameter(1, vv); + guess[0] += uu; + guess[1] += vv; + Count++; + } + else if(v[j]->onWhat()->dim() == 1){ + GEdge *ge = (GEdge*)v[j]->onWhat(); + double UU; + v[j]->getParameter(0, UU); + SPoint2 param; + param = ge->reparamOnFace(gf, UU, 1); + guess[0] += param.x(); + guess[1] += param.y(); + Count++; + } + else if(v[j]->onWhat()->dim() == 0){ + SPoint2 param; + GVertex *gv = (GVertex*)v[j]->onWhat(); + param = gv->reparamOnFace(gf,1); + guess[0] += param.x(); + guess[1] += param.y(); + Count++; + } + } + if(Count != 0){ + guess[0] /= Count; + guess[1] /= Count; + } } for(int j = 0; j < 3; j++){ - if (out.trifacelist[i * 3 + j] - 1 >= initialSize){ - printf("aaaaaaaaaaaaaaargh\n"); - // if(v[j]->onWhat()->dim() == 3){ - v[j]->onWhat()->mesh_vertices.erase - (std::find(v[j]->onWhat()->mesh_vertices.begin(), - v[j]->onWhat()->mesh_vertices.end(), - v[j])); - MVertex *v1b; - if(needParam){ - // parametric coordinates should be set for the vertex ! (this is - // not 100 % safe yet, so we reserve that operation for high order - // meshes) - GPoint gp = gf->closestPoint(SPoint3(v[j]->x(), v[j]->y(), v[j]->z()), guess); - if(gp.g()){ - v1b = new MFaceVertex(gp.x(), gp.y(), gp.z(), gf, gp.u(), gp.v()); - } - else{ - v1b = new MVertex(v[j]->x(), v[j]->y(), v[j]->z(), gf); - Msg::Warning("The point was not projected back to the surface (%g %g %g)", - v[j]->x(), v[j]->y(), v[j]->z()); - } - } - else{ - v1b = new MVertex(v[j]->x(), v[j]->y(), v[j]->z(), gf); - } - - gf->mesh_vertices.push_back(v1b); - numberedV[out.trifacelist[i * 3 + j] - 1] = v1b; - delete v[j]; - v[j] = v1b; - } + if (out.trifacelist[i * 3 + j] - 1 >= initialSize){ + printf("aaaaaaaaaaaaaaargh\n"); + // if(v[j]->onWhat()->dim() == 3){ + v[j]->onWhat()->mesh_vertices.erase + (std::find(v[j]->onWhat()->mesh_vertices.begin(), + v[j]->onWhat()->mesh_vertices.end(), + v[j])); + MVertex *v1b; + if(needParam){ + // parametric coordinates should be set for the vertex ! (this is + // not 100 % safe yet, so we reserve that operation for high order + // meshes) + GPoint gp = gf->closestPoint(SPoint3(v[j]->x(), v[j]->y(), v[j]->z()), guess); + if(gp.g()){ + v1b = new MFaceVertex(gp.x(), gp.y(), gp.z(), gf, gp.u(), gp.v()); + } + else{ + v1b = new MVertex(v[j]->x(), v[j]->y(), v[j]->z(), gf); + Msg::Warning("The point was not projected back to the surface (%g %g %g)", + v[j]->x(), v[j]->y(), v[j]->z()); + } + } + else{ + v1b = new MVertex(v[j]->x(), v[j]->y(), v[j]->z(), gf); + } + + gf->mesh_vertices.push_back(v1b); + numberedV[out.trifacelist[i * 3 + j] - 1] = v1b; + delete v[j]; + v[j] = v1b; + } } // printf("new triangle %d %d %d\n",v[0]->onWhat()->dim(), v[1]->onWhat()->dim(), v[2]->onWhat()->dim()); MTriangle *t = new MTriangle(v[0], v[1], v[2]); @@ -432,7 +432,7 @@ bool CreateAnEmptyVolumeMesh(GRegion *gr) buildTetgenStructure(gr, in, numberedV, sqr); printf("tetgen structure created\n"); sprintf(opts, "-Ype%sT%g", - (Msg::GetVerbosity() < 3) ? "Q" : (Msg::GetVerbosity() > 6) ? "V" : "", + (Msg::GetVerbosity() < 3) ? "Q" : (Msg::GetVerbosity() > 6) ? "V" : "", CTX::instance()->mesh.toleranceInitialDelaunay); try{ tetrahedralize(opts, &in, &out); @@ -952,8 +952,8 @@ void meshGRegion::operator() (GRegion *gr) if(CTX::instance()->mesh.algo3d == ALGO_3D_FRONTAL){ for(std::list<GFace*>::iterator it = faces.begin(); it != faces.end(); it++){ if((*it)->quadrangles.size()){ - Msg::Error("Cannot use frontal 3D algorithm with quadrangles on boundary"); - return; + Msg::Error("Cannot use frontal 3D algorithm with quadrangles on boundary"); + return; } } } diff --git a/Mesh/meshGRegionRelocateVertex.cpp b/Mesh/meshGRegionRelocateVertex.cpp index f913e1033a6a22267ed45b3a53c58a20dbd089d1..32522126bbd8537cd5cb8c0a361e360c42a463ce 100644 --- a/Mesh/meshGRegionRelocateVertex.cpp +++ b/Mesh/meshGRegionRelocateVertex.cpp @@ -11,8 +11,8 @@ #include "meshGFaceOptimize.h" static double objective_function (double xi, MVertex *ver, - double xTarget, double yTarget, double zTarget, - const std::vector<MElement*> <){ + double xTarget, double yTarget, double zTarget, + const std::vector<MElement*> <){ double x = ver->x(); double y = ver->y(); double z = ver->z(); @@ -25,6 +25,7 @@ static double objective_function (double xi, MVertex *ver, minQual = std::min((lt[i]->minSICNShapeMeasure()), minQual); else minQual = std::min(fabs(lt[i]->minSICNShapeMeasure()), minQual); +// minQual = std::min(lt[i]->minAnisotropyMeasure(), minQual); } ver->x() = x; ver->y() = y; @@ -33,8 +34,8 @@ static double objective_function (double xi, MVertex *ver, } static double objective_function (double xi, MVertex *ver, GFace *gf, - SPoint2 &p1, SPoint2 &p2, - const std::vector<MElement*> <){ + SPoint2 &p1, SPoint2 &p2, + const std::vector<MElement*> <){ double x = ver->x(); double y = ver->y(); double z = ver->z(); @@ -67,8 +68,8 @@ static int Stopping_Rule(double x0, double x1, double tol) } double Maximize_Quality_Golden_Section( MVertex *ver, - double xTarget, double yTarget, double zTarget, - const std::vector<MElement*> < , double tol) + double xTarget, double yTarget, double zTarget, + const std::vector<MElement*> < , double tol) { static const double lambda = 0.5 * (sqrt5 - 1.0); @@ -107,9 +108,9 @@ double Maximize_Quality_Golden_Section( MVertex *ver, double Maximize_Quality_Golden_Section( MVertex *ver, GFace *gf, - SPoint2 &p1, SPoint2 &p2, - const std::vector<MElement*> < , - double tol, double &worst) + SPoint2 &p1, SPoint2 &p2, + const std::vector<MElement*> < , + double tol, double &worst) { static const double lambda = 0.5 * (sqrt5 - 1.0); @@ -154,7 +155,7 @@ double Maximize_Quality_Golden_Section( MVertex *ver, GFace *gf, } static void _relocateVertex(MVertex *ver, - const std::vector<MElement*> <, double tol) + const std::vector<MElement*> <, double tol) { if(ver->onWhat()->dim() != 3) return; double x = 0, y=0, z=0; @@ -179,7 +180,7 @@ static void _relocateVertex(MVertex *ver, } static double _relocateVertex(GFace* gf, MVertex *ver, - const std::vector<MElement*> <, double tol) { + const std::vector<MElement*> <, double tol) { if(ver->onWhat()->dim() != 2) return 2.0; SPoint2 p1(0,0); @@ -195,9 +196,9 @@ static double _relocateVertex(GFace* gf, MVertex *ver, reparamMeshVertexOnFace(v, gf, pp); counter++; if (v->onWhat()->dim() == 1) { - GEdge *ge = dynamic_cast<GEdge*> (v->onWhat()); - // do not take any chance - if (ge->isSeam(gf))return 2.0; + GEdge *ge = dynamic_cast<GEdge*> (v->onWhat()); + // do not take any chance + if (ge->isSeam(gf))return 2.0; } p1 += pp; }