diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp index 72e235675bc94f5bf7bc4ecdd1063a689e5461f9..52e8153362d92b35f43d2bdc83bd36ce2ac09d86 100644 --- a/Geo/MElement.cpp +++ b/Geo/MElement.cpp @@ -25,6 +25,7 @@ #include "Numeric.h" #include "CondNumBasis.h" #include "Context.h" +#include "qualityMeasuresJacobian.h" #define SQU(a) ((a)*(a)) @@ -233,6 +234,11 @@ double MElement::maxDistToStraight() const return maxdx; } +double MElement::minAnisotropyMeasure() +{ + return jacobianBasedQuality::minAnisotropyMeasure(this); +} + void MElement::scaledJacRange(double &jmin, double &jmax, GEntity *ge) const { jmin = jmax = 1.0; @@ -667,7 +673,7 @@ void MElement::getSignedJacobian(fullVector<double> &jacobian, int o) const void MElement::getNodesCoord(fullMatrix<double> &nodesXYZ) const { - const int numNodes = getNumShapeFunctions(); + const int numNodes = getNumVertices(); for (int i = 0; i < numNodes; i++) { const MVertex *v = getShapeFunctionNode(i); nodesXYZ(i,0) = v->x(); diff --git a/Geo/MElement.h b/Geo/MElement.h index b3d1e46fa0a90700a4f427747ab55cf2af181ad4..e504498a8bc026f3db8f281d2601238ca024252d 100644 --- a/Geo/MElement.h +++ b/Geo/MElement.h @@ -216,6 +216,7 @@ class MElement signedInvCondNumRange(sICNMin, sICNMax); return sICNMin; } + double minAnisotropyMeasure(); virtual double angleShapeMeasure() { return 1.0; } virtual void scaledJacRange(double &jmin, double &jmax, GEntity *ge = 0) const; virtual void idealJacRange(double &jmin, double &jmax, GEntity *ge = 0); diff --git a/Mesh/simple3D.cpp b/Mesh/simple3D.cpp index 2cee003ee5214b1ffd0d3f35427662c320a5d712..0180eff13635351dbca49e456561b4885d18c16f 100644 --- a/Mesh/simple3D.cpp +++ b/Mesh/simple3D.cpp @@ -144,10 +144,10 @@ bool rtree_callback(Node* neighbour,void* w) if(neighbour!=parent){ distance = infinity_distance(individual->get_point(),neighbour->get_point(),m); - if(distance<k1*h){ - wrapper->set_ok(0); - return false; - } + if(distance<k1*h){ + wrapper->set_ok(0); + return false; + } } return true; @@ -312,9 +312,9 @@ void Filler::treat_model() for(it=model->firstRegion();it!=model->lastRegion();it++) { gr = *it; - if(gr->getNumMeshElements()>0){ - treat_region(gr); - } + if(gr->getNumMeshElements()>0){ + treat_region(gr); + } } } @@ -371,15 +371,15 @@ void Filler::treat_region(GRegion* gr) faces = gr->faces(); for(it2=faces.begin();it2!=faces.end();it2++){ gf = *it2; - limit = code(gf->tag()); - for(i=0;i<gf->getNumMeshElements();i++){ - element = gf->getMeshElement(i); + limit = code(gf->tag()); + for(i=0;i<gf->getNumMeshElements();i++){ + element = gf->getMeshElement(i); for(j=0;j<element->getNumVertices();j++){ - vertex = element->getVertex(j); - temp.insert(vertex); - limits.insert(std::pair<MVertex*,int>(vertex,limit)); - } - } + vertex = element->getVertex(j); + temp.insert(vertex); + limits.insert(std::pair<MVertex*,int>(vertex,limit)); + } + } } /*for(i=0;i<gr->getNumMeshElements();i++){ @@ -392,20 +392,20 @@ void Filler::treat_region(GRegion* gr) for(it=temp.begin();it!=temp.end();it++){ if((*it)->onWhat()->dim()==0){ - boundary_vertices.push_back(*it); - } + boundary_vertices.push_back(*it); + } } for(it=temp.begin();it!=temp.end();it++){ if((*it)->onWhat()->dim()==1){ - boundary_vertices.push_back(*it); - } + boundary_vertices.push_back(*it); + } } for(it=temp.begin();it!=temp.end();it++){ if((*it)->onWhat()->dim()==2){ - boundary_vertices.push_back(*it); - } + boundary_vertices.push_back(*it); + } } /*for(it=temp.begin();it!=temp.end();it++){ @@ -423,72 +423,72 @@ void Filler::treat_region(GRegion* gr) node = new Node(SPoint3(x,y,z)); compute_parameters(node,gr); - node->set_layer(0); + node->set_layer(0); - it3 = limits.find(boundary_vertices[i]); - node->set_limit(it3->second); + it3 = limits.find(boundary_vertices[i]); + node->set_limit(it3->second); - rtree.Insert(node->min,node->max,node); - fifo.push(node); + rtree.Insert(node->min,node->max,node); + fifo.push(node); //print_node(node,file); } count = 1; while(!fifo.empty()){ parent = fifo.front(); - fifo.pop(); - garbage.push_back(parent); - - if(parent->get_limit()!=-1 && parent->get_layer()>=parent->get_limit()){ - continue; - } - - spawns.clear(); - spawns.resize(6); - - for(i=0;i<6;i++){ - spawns[i] = new Node(); - } - - create_spawns(gr,octree,parent,spawns); - - for(i=0;i<6;i++){ - ok2 = 0; - individual = spawns[i]; - point = individual->get_point(); - x = point.x(); - y = point.y(); - z = point.z(); - - if(inside_domain(octree,x,y,z)){ - compute_parameters(individual,gr); - individual->set_layer(parent->get_layer()+1); - individual->set_limit(parent->get_limit()); - - if(far_from_boundary(octree,individual)){ - wrapper.set_ok(1); - wrapper.set_individual(individual); - wrapper.set_parent(parent); - rtree.Search(individual->min,individual->max,rtree_callback,&wrapper); - - if(wrapper.get_ok()){ - fifo.push(individual); - rtree.Insert(individual->min,individual->max,individual); - vertex = new MVertex(x,y,z,gr,0); - new_vertices.push_back(vertex); - ok2 = 1; - //print_segment(individual->get_point(),parent->get_point(),file); - } - } - } - - if(!ok2) delete individual; - } - - if(count%100==0){ - printf("%d\n",count); - } - count++; + fifo.pop(); + garbage.push_back(parent); + + if(parent->get_limit()!=-1 && parent->get_layer()>=parent->get_limit()){ + continue; + } + + spawns.clear(); + spawns.resize(6); + + for(i=0;i<6;i++){ + spawns[i] = new Node(); + } + + create_spawns(gr,octree,parent,spawns); + + for(i=0;i<6;i++){ + ok2 = 0; + individual = spawns[i]; + point = individual->get_point(); + x = point.x(); + y = point.y(); + z = point.z(); + + if(inside_domain(octree,x,y,z)){ + compute_parameters(individual,gr); + individual->set_layer(parent->get_layer()+1); + individual->set_limit(parent->get_limit()); + + if(far_from_boundary(octree,individual)){ + wrapper.set_ok(1); + wrapper.set_individual(individual); + wrapper.set_parent(parent); + rtree.Search(individual->min,individual->max,rtree_callback,&wrapper); + + if(wrapper.get_ok()){ + fifo.push(individual); + rtree.Insert(individual->min,individual->max,individual); + vertex = new MVertex(x,y,z,gr,0); + new_vertices.push_back(vertex); + ok2 = 1; + //print_segment(individual->get_point(),parent->get_point(),file); + } + } + } + + if(!ok2) delete individual; + } + + if(count%100==0){ + printf("%d\n",count); + } + count++; } //file << "};\n"; @@ -589,9 +589,9 @@ double Filler::get_size(double x,double y,double z,GEntity* ge) manager = ge->model()->getFields(); if(manager->getBackgroundField()>0){ field = manager->get(manager->getBackgroundField()); - if(field){ - h = (*field)(x,y,z,ge); - } + if(field){ + h = (*field)(x,y,z,ge); + } } return h; @@ -754,11 +754,11 @@ int Filler::code(int tag){ if(s.length()>=5){ if(s.at(0)=='1' && s.at(1)=='1' && s.at(2)=='1' && s.at(3)=='1' && s.at(4)=='1'){ - limit = 0; - } - else if(s.at(0)=='2' && s.at(1)=='2' && s.at(2)=='2' && s.at(3)=='2' && s.at(4)=='2'){ - limit = 1; - } + limit = 0; + } + else if(s.at(0)=='2' && s.at(1)=='2' && s.at(2)=='2' && s.at(3)=='2' && s.at(4)=='2'){ + limit = 1; + } } return limit;