From f4b403a1c09942306210cd16566958fda747d4c8 Mon Sep 17 00:00:00 2001 From: Tristan Carrier Baudouin <tristan.carrier@uclouvain.be> Date: Wed, 21 Nov 2012 15:58:11 +0000 Subject: [PATCH] hexahedra --- Mesh/simple3D.cpp | 154 +++++++++++++++++++++++----------------------- 1 file changed, 77 insertions(+), 77 deletions(-) diff --git a/Mesh/simple3D.cpp b/Mesh/simple3D.cpp index 3087191536..2789acc215 100644 --- a/Mesh/simple3D.cpp +++ b/Mesh/simple3D.cpp @@ -74,18 +74,18 @@ class Node{ class Wrapper{ private: - bool too_close; - Node* spawn; + bool ok; + Node* individual; Node* parent; public: Wrapper(); Wrapper(Node*,Node*); ~Wrapper(); - void set_too_close(bool); - void set_spawn(Node*); + void set_ok(bool); + void set_individual(Node*); void set_parent(Node*); - bool get_too_close(); - Node* get_spawn(); + bool get_ok(); + Node* get_individual(); Node* get_parent(); }; @@ -123,19 +123,19 @@ bool rtree_callback(Node* neighbour,void* w){ double h; double distance; Metric m; - Node *spawn,*parent; + Node *individual,*parent; Wrapper* wrapper; wrapper = static_cast<Wrapper*>(w); - spawn = wrapper->get_spawn(); + individual = wrapper->get_individual(); parent = wrapper->get_parent(); - h = spawn->get_size(); - m = spawn->get_metric(); + h = individual->get_size(); + m = individual->get_metric(); if(neighbour!=parent){ - distance = infinity_distance(spawn->get_point(),neighbour->get_point(),m); + distance = infinity_distance(individual->get_point(),neighbour->get_point(),m); if(distance<k1*h){ - wrapper->set_too_close(1); + wrapper->set_ok(0); return false; } } @@ -268,35 +268,35 @@ SPoint3 Node::get_point(){ /*********class Wrapper*********/ Wrapper::Wrapper(){ - too_close = 0; + ok = 1; } -Wrapper::Wrapper(Node* new_spawn,Node* new_parent){ - too_close = 0; - spawn = new_spawn; +Wrapper::Wrapper(Node* new_individual,Node* new_parent){ + ok = 1; + individual = new_individual; parent = new_parent; } Wrapper::~Wrapper(){} -void Wrapper::set_too_close(bool new_too_close){ - too_close = new_too_close; +void Wrapper::set_ok(bool new_ok){ + ok = new_ok; } -void Wrapper::set_spawn(Node* new_spawn){ - spawn = new_spawn; +void Wrapper::set_individual(Node* new_individual){ + individual = new_individual; } void Wrapper::set_parent(Node* new_parent){ parent = new_parent; } -bool Wrapper::get_too_close(){ - return too_close; +bool Wrapper::get_ok(){ + return ok; } -Node* Wrapper::get_spawn(){ - return spawn; +Node* Wrapper::get_individual(){ + return individual; } Node* Wrapper::get_parent(){ @@ -328,20 +328,20 @@ void Filler::treat_region(GRegion* gr){ unsigned int i; int j; int count; - bool ok; + bool ok2; double x,y,z; SPoint3 point; - Node *node,*spawn,*parent,*n1,*n2,*n3,*n4,*n5,*n6; + Node *node,*individual,*parent; MVertex* vertex; MElement* element; MElementOctree* octree; deMeshGRegion deleter; Wrapper wrapper; std::queue<Node*> fifo; - std::vector<Node*> data; + std::vector<Node*> spawns; std::vector<Node*> garbage; std::vector<MVertex*> boundary_vertices; - std::set<MVertex*> old_vertices; + std::set<MVertex*> temp; std::set<MVertex*>::iterator it; RTree<Node*,double,3,double> rtree; @@ -349,16 +349,20 @@ void Filler::treat_region(GRegion* gr){ Size_field::init_region(gr); Size_field::solve(gr); octree = new MElementOctree(gr->model()); + garbage.clear(); + boundary_vertices.clear(); + temp.clear(); + new_vertices.clear(); for(i=0;i<gr->getNumMeshElements();i++){ element = gr->getMeshElement(i); for(j=0;j<element->getNumVertices();j++){ vertex = element->getVertex(j); - old_vertices.insert(vertex); + temp.insert(vertex); } } - for(it=old_vertices.begin();it!=old_vertices.end();it++){ + for(it=temp.begin();it!=temp.end();it++){ if((*it)->onWhat()->dim()<3){ boundary_vertices.push_back(*it); } @@ -370,7 +374,8 @@ void Filler::treat_region(GRegion* gr){ x = boundary_vertices[i]->x(); y = boundary_vertices[i]->y(); z = boundary_vertices[i]->z(); - node = new Node(SPoint3(x,y,z)); + + node = new Node(SPoint3(x,y,z)); compute_parameters(node,gr); rtree.Insert(node->min,node->max,node); fifo.push(node); @@ -384,47 +389,42 @@ void Filler::treat_region(GRegion* gr){ fifo.pop(); garbage.push_back(parent); - n1 = new Node(); - n2 = new Node(); - n3 = new Node(); - n4 = new Node(); - n5 = new Node(); - n6 = new Node(); - offsprings(gr,octree,parent,n1,n2,n3,n4,n5,n6); + spawns.clear(); + spawns.resize(6); + + for(i=0;i<6;i++){ + spawns[i] = new Node(); + } - data.clear(); - data.push_back(n1); - data.push_back(n2); - data.push_back(n3); - data.push_back(n4); - data.push_back(n5); - data.push_back(n6); + create_spawns(gr,octree,parent,spawns); for(i=0;i<6;i++){ - ok = 0; - spawn = data[i]; - point = spawn->get_point(); + 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(spawn,gr); - if(far_from_boundary(octree,spawn)){ - wrapper.set_too_close(0); - wrapper.set_spawn(spawn); + compute_parameters(individual,gr); + if(far_from_boundary(octree,individual)){ + wrapper.set_ok(1); + wrapper.set_individual(individual); wrapper.set_parent(parent); - rtree.Search(spawn->min,spawn->max,rtree_callback,&wrapper); - if(!wrapper.get_too_close()){ - fifo.push(spawn); - rtree.Insert(spawn->min,spawn->max,spawn); + 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); - ok = 1; + ok2 = 1; } } } - if(!ok) delete spawn; + + if(!ok2) delete individual; } printf("%d\n",count); @@ -438,10 +438,10 @@ void Filler::treat_region(GRegion* gr){ mesher(gr); //? MeshDelaunayVolume(regions); - delete octree; for(i=0;i<garbage.size();i++) delete garbage[i]; for(i=0;i<new_vertices.size();i++) delete new_vertices[i]; new_vertices.clear(); + delete octree; Size_field::clear(); Frame_field::clear(); #endif @@ -477,7 +477,7 @@ double Filler::get_size(double x,double y,double z,GEntity* ge){ Field* field; FieldManager* manager; - h = 0.25; + h = 1.0; manager = ge->model()->getFields(); if(manager->getBackgroundField()>0){ field = manager->get(manager->getBackgroundField()); @@ -542,7 +542,7 @@ void Filler::compute_parameters(Node* node,GEntity* ge){ node->max[2] = z + sqrt3*h; } -void Filler::offsprings(GEntity* ge,MElementOctree* octree,Node* node,Node* n1,Node* n2,Node* n3,Node* n4,Node* n5,Node* n6){ +void Filler::create_spawns(GEntity* ge,MElementOctree* octree,Node* node,std::vector<Node*>& spawns){ double x,y,z; double x1,y1,z1; double x2,y2,z2; @@ -592,37 +592,37 @@ void Filler::offsprings(GEntity* ge,MElementOctree* octree,Node* node,Node* n1,N y6 = y - h6*m.get_m23(); z6 = z - h6*m.get_m33(); - *n1 = Node(SPoint3(x1,y1,z1)); - *n2 = Node(SPoint3(x2,y2,z2)); - *n3 = Node(SPoint3(x3,y3,z3)); - *n4 = Node(SPoint3(x4,y4,z4)); - *n5 = Node(SPoint3(x5,y5,z5)); - *n6 = Node(SPoint3(x6,y6,z6)); + *spawns[0] = Node(SPoint3(x1,y1,z1)); + *spawns[1] = Node(SPoint3(x2,y2,z2)); + *spawns[2] = Node(SPoint3(x3,y3,z3)); + *spawns[3] = Node(SPoint3(x4,y4,z4)); + *spawns[4] = Node(SPoint3(x5,y5,z5)); + *spawns[5] = Node(SPoint3(x6,y6,z6)); } -double Filler::improvement(GEntity* ge,MElementOctree* octree,SPoint3 point,double h_nearer,SVector3 direction){ +double Filler::improvement(GEntity* ge,MElementOctree* octree,SPoint3 point,double h1,SVector3 direction){ double x,y,z; double average; - double h_farther; + double h2; double coeffA,coeffB; - x = point.x() + h_nearer*direction.x(); - y = point.y() + h_nearer*direction.y(); - z = point.z() + h_nearer*direction.z(); + x = point.x() + h1*direction.x(); + y = point.y() + h1*direction.y(); + z = point.z() + h1*direction.z(); if(inside_domain(octree,x,y,z)){ - h_farther = get_size(x,y,z); + h2 = get_size(x,y,z); } - else h_farther = h_nearer; + else h2 = h1; coeffA = 1.0; coeffB = 0.16; - if(h_farther>h_nearer){ - average = coeffA*h_nearer + (1.0-coeffA)*h_farther; + if(h2>h1){ + average = coeffA*h1 + (1.0-coeffA)*h2; } else{ - average = coeffB*h_nearer + (1.0-coeffB)*h_farther; + average = coeffB*h1 + (1.0-coeffB)*h2; } return average; -- GitLab