Skip to content
Snippets Groups Projects
Commit e16e8130 authored by Tristan Carrier Baudouin's avatar Tristan Carrier Baudouin
Browse files

conformity

parent afe47ea6
No related branches found
No related tags found
No related merge requests found
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "MQuadrangle.h" #include "MQuadrangle.h"
#include "MPyramid.h" #include "MPyramid.h"
#include "MPrism.h" #include "MPrism.h"
#include "MTetrahedron.h"
/*****************************************/ /*****************************************/
/****************class Hex****************/ /****************class Hex****************/
...@@ -2822,16 +2823,19 @@ void PostOp::execute(){ ...@@ -2822,16 +2823,19 @@ void PostOp::execute(){
void PostOp::execute(GRegion* gr){ void PostOp::execute(GRegion* gr){
printf("................PYRAMIDS................\n"); printf("................PYRAMIDS................\n");
estimate1 = 0;
estimate2 = 0;
iterations = 0;
init_markings(gr); init_markings(gr);
build_vertex_to_tetrahedra(gr); build_vertex_to_tetrahedra(gr);
pyramids(gr,1); pyramids1(gr);
rearrange(gr); rearrange(gr);
init_markings(gr); init_markings(gr);
build_vertex_to_tetrahedra(gr); build_vertex_to_tetrahedra(gr);
build_vertex_to_pyramids(gr); build_vertex_to_pyramids(gr);
pyramids(gr,2); //pyramids2(gr);
rearrange(gr); rearrange(gr);
statistics(gr); statistics(gr);
...@@ -2845,23 +2849,38 @@ void PostOp::init_markings(GRegion* gr){ ...@@ -2845,23 +2849,38 @@ void PostOp::init_markings(GRegion* gr){
for(i=0;i<gr->getNumMeshElements();i++){ for(i=0;i<gr->getNumMeshElements();i++){
element = gr->getMeshElement(i); element = gr->getMeshElement(i);
if(four(element)){ if(four(element) || five(element)){
markings.insert(std::pair<MElement*,bool>(element,0)); markings.insert(std::pair<MElement*,bool>(element,0));
} }
} }
} }
void PostOp::pyramids(GRegion* gr,int step){ void PostOp::pyramids1(GRegion* gr){
unsigned int i; unsigned int i;
MVertex *a,*b,*c,*d; MVertex *a,*b,*c,*d;
MVertex *e,*f,*g,*h; MVertex *e,*f,*g,*h;
MElement* element; MElement* element;
std::vector<MElement*> hexahedra;
std::vector<MElement*> prisms;
std::vector<MTetrahedron*>::iterator it; std::vector<MTetrahedron*>::iterator it;
std::map<MElement*,bool>::iterator it2; std::map<MElement*,bool>::iterator it2;
hexahedra.clear();
prisms.clear();
for(i=0;i<gr->getNumMeshElements();i++){ for(i=0;i<gr->getNumMeshElements();i++){
element = gr->getMeshElement(i); element = gr->getMeshElement(i);
if(eight(element)){ if(eight(element)){
hexahedra.push_back(element);
}
else if(six(element)){
prisms.push_back(element);
}
}
for(i=0;i<hexahedra.size();i++){
element = hexahedra[i];
a = element->getVertex(0); a = element->getVertex(0);
b = element->getVertex(1); b = element->getVertex(1);
c = element->getVertex(2); c = element->getVertex(2);
...@@ -2871,7 +2890,6 @@ void PostOp::pyramids(GRegion* gr,int step){ ...@@ -2871,7 +2890,6 @@ void PostOp::pyramids(GRegion* gr,int step){
g = element->getVertex(6); g = element->getVertex(6);
h = element->getVertex(7); h = element->getVertex(7);
if(step==1){
pyramids1(a,b,c,d,gr); pyramids1(a,b,c,d,gr);
pyramids1(e,f,g,h,gr); pyramids1(e,f,g,h,gr);
pyramids1(a,b,f,e,gr); pyramids1(a,b,f,e,gr);
...@@ -2879,7 +2897,71 @@ void PostOp::pyramids(GRegion* gr,int step){ ...@@ -2879,7 +2897,71 @@ void PostOp::pyramids(GRegion* gr,int step){
pyramids1(d,c,g,h,gr); pyramids1(d,c,g,h,gr);
pyramids1(d,a,e,h,gr); pyramids1(d,a,e,h,gr);
} }
else if(step==2){
for(i=0;i<prisms.size();i++){
element = prisms[i];
a = element->getVertex(0);
b = element->getVertex(1);
c = element->getVertex(2);
d = element->getVertex(3);
e = element->getVertex(4);
f = element->getVertex(5);
pyramids1(a,d,f,c,gr);
pyramids1(a,b,e,d,gr);
pyramids1(b,c,f,e,gr);
}
it = gr->tetrahedra.begin();
while(it!=gr->tetrahedra.end()){
element = (MElement*)(*it);
it2 = markings.find(element);
if(it2->second==1){
it = gr->tetrahedra.erase(it);
}
else{
it++;
}
}
}
void PostOp::pyramids2(GRegion* gr){
unsigned int i;
MVertex *a,*b,*c,*d;
MVertex *e,*f,*g,*h;
MElement* element;
std::vector<MElement*> hexahedra;
std::vector<MElement*> prisms;
std::vector<MTetrahedron*>::iterator it1;
std::vector<MPyramid*>::iterator it2;
std::map<MElement*,bool>::iterator it;
hexahedra.clear();
prisms.clear();
for(i=0;i<gr->getNumMeshElements();i++){
element = gr->getMeshElement(i);
if(eight(element)){
hexahedra.push_back(element);
}
else if(six(element)){
prisms.push_back(element);
}
}
for(i=0;i<hexahedra.size();i++){
element = hexahedra[i];
a = element->getVertex(0);
b = element->getVertex(1);
c = element->getVertex(2);
d = element->getVertex(3);
e = element->getVertex(4);
f = element->getVertex(5);
g = element->getVertex(6);
h = element->getVertex(7);
pyramids2(a,b,c,d,gr); pyramids2(a,b,c,d,gr);
pyramids2(e,f,g,h,gr); pyramids2(e,f,g,h,gr);
pyramids2(a,b,f,e,gr); pyramids2(a,b,f,e,gr);
...@@ -2887,12 +2969,10 @@ void PostOp::pyramids(GRegion* gr,int step){ ...@@ -2887,12 +2969,10 @@ void PostOp::pyramids(GRegion* gr,int step){
pyramids2(d,c,g,h,gr); pyramids2(d,c,g,h,gr);
pyramids2(d,a,e,h,gr); pyramids2(d,a,e,h,gr);
} }
}
}
for(i=0;i<gr->getNumMeshElements();i++){ for(i=0;i<prisms.size();i++){
element = gr->getMeshElement(i); element = prisms[i];
if(six(element)){
a = element->getVertex(0); a = element->getVertex(0);
b = element->getVertex(1); b = element->getVertex(1);
c = element->getVertex(2); c = element->getVertex(2);
...@@ -2900,28 +2980,32 @@ void PostOp::pyramids(GRegion* gr,int step){ ...@@ -2900,28 +2980,32 @@ void PostOp::pyramids(GRegion* gr,int step){
e = element->getVertex(4); e = element->getVertex(4);
f = element->getVertex(5); f = element->getVertex(5);
if(step==1){
pyramids1(a,d,f,c,gr);
pyramids1(a,b,e,d,gr);
pyramids1(b,c,f,e,gr);
}
else if(step==2){
pyramids2(a,d,f,c,gr); pyramids2(a,d,f,c,gr);
pyramids2(a,b,e,d,gr); pyramids2(a,b,e,d,gr);
pyramids2(b,c,f,e,gr); pyramids2(b,c,f,e,gr);
} }
it1 = gr->tetrahedra.begin();
while(it1!=gr->tetrahedra.end()){
element = (MElement*)(*it1);
it = markings.find(element);
if(it->second==1){
it1 = gr->tetrahedra.erase(it1);
}
else{
it1++;
} }
} }
it = gr->tetrahedra.begin(); it2 = gr->pyramids.begin();
while(it!=gr->tetrahedra.end()){ while(it2!=gr->pyramids.end()){
element = (MElement*)(*it); element = (MElement*)(*it2);
it2 = markings.find(element); it = markings.find(element);
if(it2->second==1){ if(it->second==1){
it = gr->tetrahedra.erase(it); it2 = gr->pyramids.erase(it2);
} }
else{ else{
it++; it2++;
} }
} }
} }
...@@ -2958,9 +3042,9 @@ void PostOp::pyramids1(MVertex* a,MVertex* b,MVertex* c,MVertex* d,GRegion* gr){ ...@@ -2958,9 +3042,9 @@ void PostOp::pyramids1(MVertex* a,MVertex* b,MVertex* c,MVertex* d,GRegion* gr){
vertex = find(a,b,c,d,*it); vertex = find(a,b,c,d,*it);
if(vertex!=0){ if(vertex!=0){
gr->addPyramid(new MPyramid(a,b,c,d,vertex));
it1->second = 1; it1->second = 1;
it2->second = 1; it2->second = 1;
gr->addPyramid(new MPyramid(a,b,c,d,vertex));
} }
} }
} }
...@@ -2968,6 +3052,15 @@ void PostOp::pyramids1(MVertex* a,MVertex* b,MVertex* c,MVertex* d,GRegion* gr){ ...@@ -2968,6 +3052,15 @@ void PostOp::pyramids1(MVertex* a,MVertex* b,MVertex* c,MVertex* d,GRegion* gr){
void PostOp::pyramids2(MVertex* a,MVertex* b,MVertex* c,MVertex* d,GRegion* gr){ void PostOp::pyramids2(MVertex* a,MVertex* b,MVertex* c,MVertex* d,GRegion* gr){
bool flag; bool flag;
double x,y,z;
MVertex* mid;
MVertex *diagA,*diagB;
MVertex *N1,*N2;
MVertex *v1,*v2,*v3,*v4,*v5;
MTetrahedron* temp;
MPyramid* temp2;
std::vector<MElement*> movables;
std::set<MVertex*> Ns;
std::set<MElement*> bin1; std::set<MElement*> bin1;
std::set<MElement*> bin2; std::set<MElement*> bin2;
std::set<MElement*> bin3; std::set<MElement*> bin3;
...@@ -2975,6 +3068,7 @@ void PostOp::pyramids2(MVertex* a,MVertex* b,MVertex* c,MVertex* d,GRegion* gr){ ...@@ -2975,6 +3068,7 @@ void PostOp::pyramids2(MVertex* a,MVertex* b,MVertex* c,MVertex* d,GRegion* gr){
std::set<MElement*> tetrahedra; std::set<MElement*> tetrahedra;
std::set<MElement*> pyramids; std::set<MElement*> pyramids;
std::set<MElement*>::iterator it; std::set<MElement*>::iterator it;
std::map<MElement*,bool>::iterator it2;
flag = 0; flag = 0;
...@@ -3006,17 +3100,121 @@ void PostOp::pyramids2(MVertex* a,MVertex* b,MVertex* c,MVertex* d,GRegion* gr){ ...@@ -3006,17 +3100,121 @@ void PostOp::pyramids2(MVertex* a,MVertex* b,MVertex* c,MVertex* d,GRegion* gr){
pyramids.insert(*it); pyramids.insert(*it);
} }
if(pyramids.size()==1){ if(pyramids.size()==0 && tetrahedra.size()==1){
printf("A\n"); printf("tetrahedron deleted\n");
it2 = markings.find(*tetrahedra.begin());
it2->second = 1;
return;
}
if(flag){
diagA = a;
diagB = c;
}
else{
diagA = b;
diagB = d;
}
Ns.clear();
Ns.insert(diagA);
Ns.insert(diagB);
x = (diagA->x() + diagB->x())/2.0;
y = (diagA->y() + diagB->y())/2.0;
z = (diagA->z() + diagB->z())/2.0;
mid = 0;
movables.clear();
if(tetrahedra.size()>0 || pyramids.size()>0){
estimate1 = estimate1 + tetrahedra.size() + 2*pyramids.size();
estimate2 = estimate2 + 1;
mid = new MVertex(x,y,z);
gr->addMeshVertex(mid);
temp2 = new MPyramid(a,b,c,d,mid);
gr->addPyramid(temp2);
markings.insert(std::pair<MElement*,bool>(temp2,0));
build_vertex_to_pyramids(temp2);
for(it=tetrahedra.begin();it!=tetrahedra.end();it++){
N1 = other(*it,diagA,diagB);
N2 = other(*it,diagA,diagB,N1);
if(N1!=0 && N2!=0){
Ns.insert(N1);
Ns.insert(N2);
temp = new MTetrahedron(N1,N2,diagA,mid);
gr->addTetrahedron(temp);
markings.insert(std::pair<MElement*,bool>(temp,0));
build_vertex_to_tetrahedra(temp);
movables.push_back(temp);
temp = new MTetrahedron(N1,N2,diagB,mid);
gr->addTetrahedron(temp);
markings.insert(std::pair<MElement*,bool>(temp,0));
build_vertex_to_tetrahedra(temp);
movables.push_back(temp);
it2 = markings.find(*it);
it2->second = 1;
erase_vertex_to_tetrahedra(*it);
}
}
for(it=pyramids.begin();it!=pyramids.end();it++){
v1 = (*it)->getVertex(0);
v2 = (*it)->getVertex(1);
v3 = (*it)->getVertex(2);
v4 = (*it)->getVertex(3);
v5 = (*it)->getVertex(4);
temp2 = new MPyramid(v1,v2,v3,v4,mid);
gr->addPyramid(temp2);
markings.insert(std::pair<MElement*,bool>(temp2,0));
build_vertex_to_pyramids(temp2);
if(different(v1,v2,diagA,diagB)){
temp = new MTetrahedron(v1,v2,mid,v5);
gr->addTetrahedron(temp);
markings.insert(std::pair<MElement*,bool>(temp,0));
build_vertex_to_tetrahedra(temp);
movables.push_back(temp);
}
if(different(v2,v3,diagA,diagB)){
temp = new MTetrahedron(v2,v3,mid,v5);
gr->addTetrahedron(temp);
markings.insert(std::pair<MElement*,bool>(temp,0));
build_vertex_to_tetrahedra(temp);
movables.push_back(temp);
}
if(different(v3,v4,diagA,diagB)){
temp = new MTetrahedron(v3,v4,mid,v5);
gr->addTetrahedron(temp);
markings.insert(std::pair<MElement*,bool>(temp,0));
build_vertex_to_tetrahedra(temp);
movables.push_back(temp);
} }
else if(pyramids.size()==2){
printf("B\n"); if(different(v4,v1,diagA,diagB)){
temp = new MTetrahedron(v4,v1,mid,v5);
gr->addTetrahedron(temp);
markings.insert(std::pair<MElement*,bool>(temp,0));
build_vertex_to_tetrahedra(temp);
movables.push_back(temp);
} }
else if(pyramids.size()==0 && tetrahedra.size()>1){
printf("C\n"); it2 = markings.find(*it);
it2->second = 1;
erase_vertex_to_pyramids(*it);
} }
else if(pyramids.size()==0 && tetrahedra.size()==1){
printf("D\n"); mean(Ns,mid,movables);
} }
} }
...@@ -3062,7 +3260,7 @@ void PostOp::statistics(GRegion* gr){ ...@@ -3062,7 +3260,7 @@ void PostOp::statistics(GRegion* gr){
if(five(element)){ if(five(element)){
nbr5 = nbr5 + 1; nbr5 = nbr5 + 1;
vol5 = vol5 + element->getVolume(); vol5 = vol5 + workaround(element);
} }
if(four(element)){ if(four(element)){
...@@ -3071,8 +3269,14 @@ void PostOp::statistics(GRegion* gr){ ...@@ -3071,8 +3269,14 @@ void PostOp::statistics(GRegion* gr){
} }
nbr = nbr + 1; nbr = nbr + 1;
if(!five(element)){
vol = vol + element->getVolume(); vol = vol + element->getVolume();
} }
else{
vol = vol + workaround(element);
}
}
printf("Number :\n"); printf("Number :\n");
printf(" percentage of hexahedra : %.2f\n",nbr8*100.0/nbr); printf(" percentage of hexahedra : %.2f\n",nbr8*100.0/nbr);
...@@ -3085,6 +3289,8 @@ void PostOp::statistics(GRegion* gr){ ...@@ -3085,6 +3289,8 @@ void PostOp::statistics(GRegion* gr){
printf(" percentage of pyramids : %.2f\n",vol5*100.0/vol); printf(" percentage of pyramids : %.2f\n",vol5*100.0/vol);
printf(" percentage of tetrahedra : %.2f\n",vol4*100.0/vol); printf(" percentage of tetrahedra : %.2f\n",vol4*100.0/vol);
printf("Total number of elements : %d\n",gr->getNumMeshElements()); printf("Total number of elements : %d\n",gr->getNumMeshElements());
printf("Total volume : %f\n",vol);
printf("Misc : %d %d %f\n",estimate1,estimate2,iterations/estimate2);
} }
bool PostOp::four(MElement* element){ bool PostOp::four(MElement* element){
...@@ -3107,18 +3313,131 @@ bool PostOp::eight(MElement* element){ ...@@ -3107,18 +3313,131 @@ bool PostOp::eight(MElement* element){
else return 0; else return 0;
} }
bool PostOp::apex(MElement* element,MVertex* vertex){ bool PostOp::equal(MVertex* v1,MVertex* v2,MVertex* v3,MVertex* v4){
if((v1==v3 && v2==v4) || (v1==v4 && v2==v3)){
return 1;
}
else{
return 0;
}
}
bool PostOp::different(MVertex* v1,MVertex* v2,MVertex* v3,MVertex* v4){
if(v1!=v3 && v1!=v4 && v2!=v3 && v2!=v4){
return 1;
}
else{
return 0;
}
}
MVertex* PostOp::other(MElement* element,MVertex* v1,MVertex* v2){
int i;
MVertex* vertex;
MVertex* pointer;
pointer = 0;
for(i=0;i<element->getNumVertices();i++){
vertex = element->getVertex(i);
if(vertex!=v1 && vertex!=v2){
pointer = vertex;
break;
}
}
return pointer;
}
MVertex* PostOp::other(MElement* element,MVertex* v1,MVertex* v2,MVertex* v3){
int i;
MVertex* vertex;
MVertex* pointer;
pointer = 0;
for(i=0;i<element->getNumVertices();i++){
vertex = element->getVertex(i);
if(vertex!=v1 && vertex!=v2 && vertex!=v3){
pointer = vertex;
break;
}
}
return pointer;
}
void PostOp::mean(const std::set<MVertex*>& Ns,MVertex* mid,const std::vector<MElement*>& movables){
unsigned int i;
int j;
bool flag; bool flag;
double x,y,z;
double init_x,init_y,init_z;
std::set<MVertex*>::iterator it;
x = 0.0;
y = 0.0;
z = 0.0;
init_x = mid->x();
init_y = mid->y();
init_z = mid->z();
for(it=Ns.begin();it!=Ns.end();it++){
x = x + (*it)->x();
y = y + (*it)->y();
z = z + (*it)->z();
}
x = x/Ns.size();
y = y/Ns.size();
z = z/Ns.size();
for(i=0;i<movables.size();i++){
movables[i]->setVolumePositive();
}
mid->setXYZ(x,y,z);
for(j=0;j<100;j++){
flag = 0; flag = 0;
if(five(element)){ for(i=0;i<movables.size();i++){
if(element->getVertex(4)==vertex){ if(movables[i]->getVolume()<0.0){
flag = 1; flag = 1;
} }
} }
return flag; if(!flag){
break;
}
x = 0.1*init_x + 0.9*mid->x();
y = 0.1*init_y + 0.9*mid->y();
z = 0.1*init_z + 0.9*mid->z();
mid->setXYZ(x,y,z);
}
iterations = iterations + j;
}
double PostOp::workaround(MElement* element){
double volume;
MTetrahedron* temp1;
MTetrahedron* temp2;
volume = 0.0;
if(five(element)){
temp1 = new MTetrahedron(element->getVertex(0),element->getVertex(1),element->getVertex(2),element->getVertex(4));
temp2 = new MTetrahedron(element->getVertex(2),element->getVertex(3),element->getVertex(0),element->getVertex(4));
volume = fabs(temp1->getVolume()) + fabs(temp2->getVolume());
delete temp1;
delete temp2;
}
return volume;
} }
MVertex* PostOp::find(MVertex* v1,MVertex* v2,MVertex* v3,MVertex* v4,MElement* element){ MVertex* PostOp::find(MVertex* v1,MVertex* v2,MVertex* v3,MVertex* v4,MElement* element){
...@@ -3152,14 +3471,34 @@ void PostOp::find_tetrahedra(MVertex* v1,MVertex* v2,std::set<MElement*>& final) ...@@ -3152,14 +3471,34 @@ void PostOp::find_tetrahedra(MVertex* v1,MVertex* v2,std::set<MElement*>& final)
} }
void PostOp::find_pyramids(MVertex* v1,MVertex* v2,std::set<MElement*>& final){ void PostOp::find_pyramids(MVertex* v1,MVertex* v2,std::set<MElement*>& final){
bool flag1,flag2,flag3,flag4;
bool flag5,flag6,flag7,flag8;
std::set<MElement*>::iterator it;
std::map<MVertex*,std::set<MElement*> >::iterator it1; std::map<MVertex*,std::set<MElement*> >::iterator it1;
std::map<MVertex*,std::set<MElement*> >::iterator it2; std::map<MVertex*,std::set<MElement*> >::iterator it2;
std::set<MElement*> temp;
it1 = vertex_to_pyramids.find(v1); it1 = vertex_to_pyramids.find(v1);
it2 = vertex_to_pyramids.find(v2); it2 = vertex_to_pyramids.find(v2);
temp.clear();
if(it1!=vertex_to_pyramids.end() && it2!=vertex_to_pyramids.end()){ if(it1!=vertex_to_pyramids.end() && it2!=vertex_to_pyramids.end()){
intersection(it1->second,it2->second,final); intersection(it1->second,it2->second,temp);
}
for(it=temp.begin();it!=temp.end();it++){
flag1 = equal(v1,v2,(*it)->getVertex(0),(*it)->getVertex(1));
flag2 = equal(v1,v2,(*it)->getVertex(1),(*it)->getVertex(2));
flag3 = equal(v1,v2,(*it)->getVertex(2),(*it)->getVertex(3));
flag4 = equal(v1,v2,(*it)->getVertex(3),(*it)->getVertex(0));
flag5 = equal(v1,v2,(*it)->getVertex(0),(*it)->getVertex(4));
flag6 = equal(v1,v2,(*it)->getVertex(1),(*it)->getVertex(4));
flag7 = equal(v1,v2,(*it)->getVertex(2),(*it)->getVertex(4));
flag8 = equal(v1,v2,(*it)->getVertex(3),(*it)->getVertex(4));
if(flag1 || flag2 || flag3 || flag4 || flag5 || flag6 || flag7 || flag8){
final.insert(*it);
}
} }
} }
...@@ -3169,19 +3508,26 @@ void PostOp::intersection(const std::set<MElement*>& bin1,const std::set<MElemen ...@@ -3169,19 +3508,26 @@ void PostOp::intersection(const std::set<MElement*>& bin1,const std::set<MElemen
void PostOp::build_vertex_to_tetrahedra(GRegion* gr){ void PostOp::build_vertex_to_tetrahedra(GRegion* gr){
unsigned int i; unsigned int i;
int j;
MElement* element; MElement* element;
MVertex* vertex;
std::set<MElement*> bin;
std::map<MVertex*,std::set<MElement*> >::iterator it;
vertex_to_tetrahedra.clear(); vertex_to_tetrahedra.clear();
for(i=0;i<gr->getNumMeshElements();i++){ for(i=0;i<gr->getNumMeshElements();i++){
element = gr->getMeshElement(i); element = gr->getMeshElement(i);
if(four(element)){ if(four(element)){
for(j=0;j<element->getNumVertices();j++){ build_vertex_to_tetrahedra(element);
vertex = element->getVertex(j); }
}
}
void PostOp::build_vertex_to_tetrahedra(MElement* element){
int i;
MVertex* vertex;
std::set<MElement*> bin;
std::map<MVertex*,std::set<MElement*> >::iterator it;
for(i=0;i<element->getNumVertices();i++){
vertex = element->getVertex(i);
it = vertex_to_tetrahedra.find(vertex); it = vertex_to_tetrahedra.find(vertex);
if(it!=vertex_to_tetrahedra.end()){ if(it!=vertex_to_tetrahedra.end()){
...@@ -3194,24 +3540,44 @@ void PostOp::build_vertex_to_tetrahedra(GRegion* gr){ ...@@ -3194,24 +3540,44 @@ void PostOp::build_vertex_to_tetrahedra(GRegion* gr){
} }
} }
} }
void PostOp::erase_vertex_to_tetrahedra(MElement* element){
int i;
MVertex* vertex;
std::map<MVertex*,std::set<MElement*> >::iterator it;
for(i=0;i<element->getNumVertices();i++){
vertex = element->getVertex(i);
it = vertex_to_tetrahedra.find(vertex);
if(it!=vertex_to_tetrahedra.end()){
it->second.erase(element);
}
} }
} }
void PostOp::build_vertex_to_pyramids(GRegion* gr){ void PostOp::build_vertex_to_pyramids(GRegion* gr){
unsigned int i; unsigned int i;
int j;
MElement* element; MElement* element;
MVertex* vertex;
std::set<MElement*> bin;
std::map<MVertex*,std::set<MElement*> >::iterator it;
vertex_to_pyramids.clear(); vertex_to_pyramids.clear();
for(i=0;i<gr->getNumMeshElements();i++){ for(i=0;i<gr->getNumMeshElements();i++){
element = gr->getMeshElement(i); element = gr->getMeshElement(i);
if(five(element)){ if(five(element)){
for(j=0;j<element->getNumVertices();j++){ build_vertex_to_pyramids(element);
vertex = element->getVertex(j); }
}
}
void PostOp::build_vertex_to_pyramids(MElement* element){
int i;
MVertex* vertex;
std::set<MElement*> bin;
std::map<MVertex*,std::set<MElement*> >::iterator it;
for(i=0;i<element->getNumVertices();i++){
vertex = element->getVertex(i);
it = vertex_to_pyramids.find(vertex); it = vertex_to_pyramids.find(vertex);
if(it!=vertex_to_pyramids.end()){ if(it!=vertex_to_pyramids.end()){
...@@ -3224,5 +3590,18 @@ void PostOp::build_vertex_to_pyramids(GRegion* gr){ ...@@ -3224,5 +3590,18 @@ void PostOp::build_vertex_to_pyramids(GRegion* gr){
} }
} }
} }
void PostOp::erase_vertex_to_pyramids(MElement* element){
int i;
MVertex* vertex;
std::map<MVertex*,std::set<MElement*> >::iterator it;
for(i=0;i<element->getNumVertices();i++){
vertex = element->getVertex(i);
it = vertex_to_pyramids.find(vertex);
if(it!=vertex_to_pyramids.end()){
it->second.erase(element);
}
} }
} }
\ No newline at end of file
...@@ -231,6 +231,9 @@ class Supplementary{ ...@@ -231,6 +231,9 @@ class Supplementary{
class PostOp{ class PostOp{
private: private:
int estimate1;
int estimate2;
double iterations;
std::map<MElement*,bool> markings; std::map<MElement*,bool> markings;
std::map<MVertex*,std::set<MElement*> > vertex_to_tetrahedra; std::map<MVertex*,std::set<MElement*> > vertex_to_tetrahedra;
std::map<MVertex*,std::set<MElement*> > vertex_to_pyramids; std::map<MVertex*,std::set<MElement*> > vertex_to_pyramids;
...@@ -242,7 +245,8 @@ class PostOp{ ...@@ -242,7 +245,8 @@ class PostOp{
void execute(GRegion*); void execute(GRegion*);
void init_markings(GRegion*); void init_markings(GRegion*);
void pyramids(GRegion*,int); void pyramids1(GRegion*);
void pyramids2(GRegion*);
void pyramids1(MVertex*,MVertex*,MVertex*,MVertex*,GRegion*); void pyramids1(MVertex*,MVertex*,MVertex*,MVertex*,GRegion*);
void pyramids2(MVertex*,MVertex*,MVertex*,MVertex*,GRegion*); void pyramids2(MVertex*,MVertex*,MVertex*,MVertex*,GRegion*);
void rearrange(GRegion*); void rearrange(GRegion*);
...@@ -253,7 +257,12 @@ class PostOp{ ...@@ -253,7 +257,12 @@ class PostOp{
bool six(MElement*); bool six(MElement*);
bool eight(MElement*); bool eight(MElement*);
bool apex(MElement*,MVertex*); bool equal(MVertex*,MVertex*,MVertex*,MVertex*);
bool different(MVertex*,MVertex*,MVertex*,MVertex*);
MVertex* other(MElement*,MVertex*,MVertex*);
MVertex* other(MElement*,MVertex*,MVertex*,MVertex*);
void mean(const std::set<MVertex*>&,MVertex*,const std::vector<MElement*>&);
double workaround(MElement*);
MVertex* find(MVertex*,MVertex*,MVertex*,MVertex*,MElement*); MVertex* find(MVertex*,MVertex*,MVertex*,MVertex*,MElement*);
void find_tetrahedra(MVertex*,MVertex*,std::set<MElement*>&); void find_tetrahedra(MVertex*,MVertex*,std::set<MElement*>&);
...@@ -262,5 +271,10 @@ class PostOp{ ...@@ -262,5 +271,10 @@ class PostOp{
void intersection(const std::set<MElement*>&,const std::set<MElement*>&,std::set<MElement*>&); void intersection(const std::set<MElement*>&,const std::set<MElement*>&,std::set<MElement*>&);
void build_vertex_to_tetrahedra(GRegion*); void build_vertex_to_tetrahedra(GRegion*);
void build_vertex_to_tetrahedra(MElement*);
void erase_vertex_to_tetrahedra(MElement*);
void build_vertex_to_pyramids(GRegion*); void build_vertex_to_pyramids(GRegion*);
void build_vertex_to_pyramids(MElement*);
void erase_vertex_to_pyramids(MElement*);
}; };
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment