Skip to content
Snippets Groups Projects
Commit dbee018e authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

*** empty log message ***

parent 5564ebca
Branches
Tags
No related merge requests found
// $Id: meshGFaceOptimize.cpp,v 1.11 2008-02-21 13:34:40 geuzaine Exp $
// $Id: meshGFaceOptimize.cpp,v 1.12 2008-03-01 10:52:05 geuzaine Exp $
//
// Copyright (C) 1997-2008 C. Geuzaine, J.-F. Remacle
//
......@@ -65,10 +65,13 @@ void buidMeshGenerationDataStructures(GFace *gf, std::set<MTri3*, compareTri3Ptr
std::vector<double> &Vs)
{
std::map<MVertex*, double> vSizesMap;
for (unsigned int i = 0;i < gf->triangles.size(); i++) setLcsMax(gf->triangles[i], vSizesMap);
for (unsigned int i = 0;i < gf->triangles.size(); i++) setLcs(gf->triangles[i], vSizesMap);
for (unsigned int i = 0;i < gf->triangles.size(); i++)
setLcsMax(gf->triangles[i], vSizesMap);
for (unsigned int i = 0;i < gf->triangles.size(); i++)
setLcs(gf->triangles[i], vSizesMap);
int NUM = 0;
for (std::map<MVertex*, double>::iterator it = vSizesMap.begin(); it != vSizesMap.end(); ++it){
for (std::map<MVertex*, double>::iterator it = vSizesMap.begin();
it != vSizesMap.end(); ++it){
it->first->setNum(NUM++);
vSizes.push_back(it->second);
vSizesBGM.push_back(it->second);
......@@ -199,9 +202,11 @@ double surfaceTriangleUV(MVertex *v1, MVertex *v2, MVertex *v3,
const std::vector<double> &Us,
const std::vector<double> &Vs)
{
const double v12[2] = {Us[v2->getNum()] - Us[v1->getNum()],Vs[v2->getNum()] - Vs[v1->getNum()]};
const double v13[2] = {Us[v3->getNum()] - Us[v1->getNum()],Vs[v3->getNum()] - Vs[v1->getNum()]};
return 0.5*fabs (v12[0]*v13[1]-v12[1]*v13[0]);
const double v12[2] = {Us[v2->getNum()] - Us[v1->getNum()],
Vs[v2->getNum()] - Vs[v1->getNum()]};
const double v13[2] = {Us[v3->getNum()] - Us[v1->getNum()],
Vs[v3->getNum()] - Vs[v1->getNum()]};
return 0.5 * fabs (v12[0] * v13[1] - v12[1] * v13[0]);
}
bool gmshEdgeSwap(std::set<swapquad> &configs, MTri3 *t1, GFace *gf, int iLocalEdge,
......@@ -224,7 +229,8 @@ bool gmshEdgeSwap(std::set<swapquad> &configs, MTri3 *t1, GFace *gf, int iLocalE
if (configs.find(sq) != configs.end()) return false;
configs.insert(sq);
const double volumeRef = surfaceTriangleUV(v1, v2, v3, Us, Vs) + surfaceTriangleUV(v1, v2, v4, Us, Vs);
const double volumeRef = surfaceTriangleUV(v1, v2, v3, Us, Vs) +
surfaceTriangleUV(v1, v2, v4, Us, Vs);
MTriangle *t1b = new MTriangle(v2, v3, v4);
MTriangle *t2b = new MTriangle(v4, v3, v1);
......@@ -271,13 +277,19 @@ bool gmshEdgeSwap(std::set<swapquad> &configs, MTri3 *t1, GFace *gf, int iLocalE
break;
case SWCR_CLOSE:
{
double avg1[3] = {(v1->x() + v2->x()) *.5,(v1->y() + v2->y()) *.5,(v1->z() + v2->z()) *.5};
double avg2[3] = {(v3->x() + v4->x()) *.5,(v3->y() + v4->y()) *.5,(v3->z() + v4->z()) *.5};
double avg1[3] = {(v1->x() + v2->x()) *.5,(v1->y() + v2->y()) *.5,
(v1->z() + v2->z()) *.5};
double avg2[3] = {(v3->x() + v4->x()) *.5,(v3->y() + v4->y()) *.5,
(v3->z() + v4->z()) *.5};
GPoint gp1 = gf->point(SPoint2((Us[v1->getNum()]+Us[v2->getNum()])*.5,(Vs[v1->getNum()]+Vs[v2->getNum()])*.5));
GPoint gp2 = gf->point(SPoint2((Us[v3->getNum()]+Us[v4->getNum()])*.5,(Vs[v3->getNum()]+Vs[v4->getNum()])*.5));
double d1 = (avg1[0]-gp1.x()) *(avg1[0]-gp1.x()) +(avg1[1]-gp1.y()) *(avg1[1]-gp1.y()) +(avg1[2]-gp1.z()) *(avg1[2]-gp1.z());
double d2 = (avg2[0]-gp2.x()) *(avg2[0]-gp2.x()) +(avg2[1]-gp2.y()) *(avg2[1]-gp2.y()) +(avg2[2]-gp2.z()) *(avg2[2]-gp2.z());
GPoint gp1 = gf->point(SPoint2((Us[v1->getNum()] + Us[v2->getNum()]) * .5,
(Vs[v1->getNum()] + Vs[v2->getNum()]) * .5));
GPoint gp2 = gf->point(SPoint2((Us[v3->getNum()] + Us[v4->getNum()]) * .5,
(Vs[v3->getNum()] + Vs[v4->getNum()]) * .5));
double d1 = (avg1[0] - gp1.x()) * (avg1[0] - gp1.x()) + (avg1[1] - gp1.y()) *
(avg1[1]-gp1.y()) + (avg1[2] - gp1.z()) * (avg1[2] - gp1.z());
double d2 = (avg2[0] - gp2.x()) * (avg2[0] - gp2.x()) + (avg2[1] - gp2.y()) *
(avg2[1] - gp2.y()) + (avg2[2] - gp2.z()) * (avg2[2] - gp2.z());
if (d1 < d2){
delete t1b;
delete t2b;
......@@ -290,44 +302,46 @@ bool gmshEdgeSwap(std::set<swapquad> &configs, MTri3 *t1, GFace *gf, int iLocalE
}
std::list<MTri3*> cavity;
for(int i=0;i<3;i++){
for(int i = 0; i < 3; i++){
if (t1->getNeigh(i) && t1->getNeigh(i) != t2){
bool found = false;
for (std::list<MTri3*>::iterator it = cavity.begin();it!=cavity.end();it++){
if (*it == t1->getNeigh(i))found = true;
for (std::list<MTri3*>::iterator it = cavity.begin(); it != cavity.end(); it++){
if (*it == t1->getNeigh(i)) found = true;
}
if (!found)cavity.push_back(t1->getNeigh(i));
}
}
for(int i=0;i<3;i++){
for(int i = 0; i < 3; i++){
if (t2->getNeigh(i) && t2->getNeigh(i) != t1){
bool found = false;
for (std::list<MTri3*>::iterator it = cavity.begin();it!=cavity.end();it++){
if (*it == t2->getNeigh(i))found = true;
for (std::list<MTri3*>::iterator it = cavity.begin(); it != cavity.end(); it++){
if (*it == t2->getNeigh(i)) found = true;
}
if (!found)cavity.push_back(t2->getNeigh(i));
}
}
double lc1 = 0.3333333333*(vSizes [t1b->getVertex(0)->getNum()]+
vSizes [t1b->getVertex(1)->getNum()]+
vSizes [t1b->getVertex(2)->getNum()]);
double lcBGM1 = 0.3333333333*(vSizesBGM [t1b->getVertex(0)->getNum()]+
vSizesBGM [t1b->getVertex(1)->getNum()]+
vSizesBGM [t1b->getVertex(2)->getNum()]);
double lc2 = 0.3333333333*(vSizes [t2b->getVertex(0)->getNum()]+
vSizes [t2b->getVertex(1)->getNum()]+
vSizes [t2b->getVertex(2)->getNum()]);
double lcBGM2 = 0.3333333333*(vSizesBGM [t2b->getVertex(0)->getNum()]+
vSizesBGM [t2b->getVertex(1)->getNum()]+
vSizesBGM [t2b->getVertex(2)->getNum()]);
MTri3 *t1b3 = new MTri3 ( t1b , Extend1dMeshIn2dSurfaces() ? std::min(lc1,lcBGM1) : lcBGM1 );
MTri3 *t2b3 = new MTri3 ( t2b , Extend1dMeshIn2dSurfaces() ? std::min(lc2,lcBGM2) : lcBGM2 );
double lc1 = 0.3333333333 * (vSizes[t1b->getVertex(0)->getNum()] +
vSizes[t1b->getVertex(1)->getNum()] +
vSizes[t1b->getVertex(2)->getNum()]);
double lcBGM1 = 0.3333333333 * (vSizesBGM[t1b->getVertex(0)->getNum()] +
vSizesBGM[t1b->getVertex(1)->getNum()] +
vSizesBGM[t1b->getVertex(2)->getNum()]);
double lc2 = 0.3333333333 * (vSizes[t2b->getVertex(0)->getNum()] +
vSizes[t2b->getVertex(1)->getNum()] +
vSizes[t2b->getVertex(2)->getNum()]);
double lcBGM2 = 0.3333333333 * (vSizesBGM[t2b->getVertex(0)->getNum()] +
vSizesBGM[t2b->getVertex(1)->getNum()] +
vSizesBGM[t2b->getVertex(2)->getNum()]);
MTri3 *t1b3 = new MTri3(t1b, Extend1dMeshIn2dSurfaces() ?
std::min(lc1, lcBGM1) : lcBGM1);
MTri3 *t2b3 = new MTri3(t2b, Extend1dMeshIn2dSurfaces() ?
std::min(lc2, lcBGM2) : lcBGM2);
cavity.push_back(t1b3);
cavity.push_back(t2b3);
t1->setDeleted(true);
t2->setDeleted(true);
connectTriangles ( cavity );
connectTriangles(cavity);
newTris.push_back(t1b3);
newTris.push_back(t2b3);
......@@ -335,71 +349,70 @@ bool gmshEdgeSwap(std::set<swapquad> &configs, MTri3 *t1, GFace *gf, int iLocalE
}
inline double computeEdgeAdimLength(MVertex *v1, MVertex *v2, GFace *f,
const std::vector<double> & Us,
const std::vector<double> & Vs,
const std::vector<double> & vSizes ,
const std::vector<double> & vSizesBGM ){
const double edgeCenter[2] ={(Us[v1->getNum()]+Us[v2->getNum()])*.5,
(Vs[v1->getNum()]+Vs[v2->getNum()])*.5};
GPoint GP = f->point (edgeCenter[0],edgeCenter[1]);
const std::vector<double> &Us,
const std::vector<double> &Vs,
const std::vector<double> &vSizes ,
const std::vector<double> &vSizesBGM)
{
const double edgeCenter[2] ={(Us[v1->getNum()] + Us[v2->getNum()]) * .5,
(Vs[v1->getNum()] + Vs[v2->getNum()]) * .5};
GPoint GP = f->point (edgeCenter[0], edgeCenter[1]);
const double dx1 = v1->x()-GP.x();
const double dy1 = v1->y()-GP.y();
const double dz1 = v1->z()-GP.z();
const double l1 = sqrt(dx1*dx1+dy1*dy1+dz1*dz1);
const double dx2 = v2->x()-GP.x();
const double dy2 = v2->y()-GP.y();
const double dz2 = v2->z()-GP.z();
const double l2 = sqrt(dx2*dx2+dy2*dy2+dz2*dz2);
if (Extend1dMeshIn2dSurfaces())return 2*(l1+l2)/(std::min(vSizes[v1->getNum()],vSizesBGM[v1->getNum()]) +
std::min(vSizes[v2->getNum()],vSizesBGM[v2->getNum()]));
return 2*(l1+l2)/(vSizesBGM[v1->getNum()] + vSizesBGM[v2->getNum()]);
const double dx1 = v1->x() - GP.x();
const double dy1 = v1->y() - GP.y();
const double dz1 = v1->z() - GP.z();
const double l1 = sqrt(dx1 * dx1 + dy1 * dy1 + dz1 * dz1);
const double dx2 = v2->x() - GP.x();
const double dy2 = v2->y() - GP.y();
const double dz2 = v2->z() - GP.z();
const double l2 = sqrt(dx2 * dx2 + dy2 * dy2 + dz2 * dz2);
if (Extend1dMeshIn2dSurfaces())
return 2 * (l1 + l2) / (std::min(vSizes[v1->getNum()], vSizesBGM[v1->getNum()]) +
std::min(vSizes[v2->getNum()], vSizesBGM[v2->getNum()]));
return 2 * (l1 + l2) / (vSizesBGM[v1->getNum()] + vSizesBGM[v2->getNum()]);
}
bool gmshEdgeSplit(const double lMax,
MTri3 *t1,
GFace *gf,
int iLocalEdge,
std::vector<MTri3*> &newTris,
const gmshSplitCriterion &cr,
std::vector<double> & Us,
std::vector<double> & Vs,
std::vector<double> & vSizes ,
std::vector<double> & vSizesBGM ){
bool gmshEdgeSplit(const double lMax, MTri3 *t1, GFace *gf, int iLocalEdge,
std::vector<MTri3*> &newTris, const gmshSplitCriterion &cr,
std::vector<double> &Us, std::vector<double> &Vs,
std::vector<double> &vSizes, std::vector<double> &vSizesBGM)
{
MTri3 *t2 = t1->getNeigh(iLocalEdge);
if (!t2) return false;
MVertex *v1 = t1->tri()->getVertex(iLocalEdge==0 ? 2 : iLocalEdge -1);
MVertex *v2 = t1->tri()->getVertex((iLocalEdge)%3);
double edgeCenter[2] ={(Us[v1->getNum()]+Us[v2->getNum()])*.5,
(Vs[v1->getNum()]+Vs[v2->getNum()])*.5};
MVertex *v1 = t1->tri()->getVertex(iLocalEdge == 0 ? 2 : iLocalEdge - 1);
MVertex *v2 = t1->tri()->getVertex(iLocalEdge % 3);
double edgeCenter[2] ={(Us[v1->getNum()] + Us[v2->getNum()]) * .5,
(Vs[v1->getNum()] + Vs[v2->getNum()]) * .5};
double al = computeEdgeAdimLength(v1, v2, gf,Us,Vs,vSizes,vSizesBGM);
if (al <= lMax )return false;
// printf("al,lMax %12.5E %12.5E \n",al,lMax);
double al = computeEdgeAdimLength(v1, v2, gf,Us, Vs, vSizes, vSizesBGM);
if (al <= lMax) return false;
MVertex *v3 = t1->tri()->getVertex((iLocalEdge+1)%3);
MVertex *v3 = t1->tri()->getVertex((iLocalEdge + 1) % 3);
MVertex *v4 = 0 ;
for (int i=0;i<3;i++)
for (int i = 0; i < 3; i++)
if (t2->tri()->getVertex(i) != v1 && t2->tri()->getVertex(i) != v2)
v4 = t2->tri()->getVertex(i);
GPoint p = gf->point (edgeCenter[0],edgeCenter[1]);
MVertex *vnew = new MFaceVertex (p.x(),p.y(),p.z(),gf,edgeCenter[0],edgeCenter[1]);
GPoint p = gf->point(edgeCenter[0], edgeCenter[1]);
MVertex *vnew = new MFaceVertex(p.x(), p.y(), p.z(), gf,
edgeCenter[0], edgeCenter[1]);
MTriangle *t1b = new MTriangle (v1,vnew,v3);
MTriangle *t2b = new MTriangle (vnew,v2,v3);
MTriangle *t3b = new MTriangle (v1,v4,vnew);
MTriangle *t4b = new MTriangle (v4,v2,vnew);
MTriangle *t1b = new MTriangle(v1, vnew, v3);
MTriangle *t2b = new MTriangle(vnew, v2, v3);
MTriangle *t3b = new MTriangle(v1, v4, vnew);
MTriangle *t4b = new MTriangle(v4, v2, vnew);
switch(cr){
case SPCR_QUAL:
{
const double triQualityRef = std::min(qmTriangle(t1->tri(),QMTRI_RHO),qmTriangle(t2->tri(),QMTRI_RHO));
const double triQualityRef = std::min(qmTriangle(t1->tri(), QMTRI_RHO),
qmTriangle(t2->tri(), QMTRI_RHO));
const double triQuality =
std::min(std::min(std::min(qmTriangle(t1b,QMTRI_RHO),qmTriangle(t2b,QMTRI_RHO)),
qmTriangle(t3b,QMTRI_RHO)),qmTriangle(t4b,QMTRI_RHO));
std::min(std::min(std::min(qmTriangle(t1b, QMTRI_RHO),
qmTriangle(t2b, QMTRI_RHO)),
qmTriangle(t3b, QMTRI_RHO)),
qmTriangle(t4b, QMTRI_RHO));
if (triQuality < triQualityRef){
delete t1b;
delete t2b;
......@@ -418,61 +431,61 @@ bool gmshEdgeSplit(const double lMax,
gf->mesh_vertices.push_back(vnew);
vnew->setNum(Us.size());
double lcN = 0.5 * (vSizes [v1->getNum()] + vSizes [v2->getNum()] );
double lcBGM = BGM_MeshSize(gf,edgeCenter[0],edgeCenter[1],p.x(),p.y(),p.z());
double lcN = 0.5 * (vSizes [v1->getNum()] + vSizes [v2->getNum()] );
double lcBGM = BGM_MeshSize(gf, edgeCenter[0], edgeCenter[1], p.x(), p.y(), p.z());
vSizesBGM.push_back( lcBGM );
vSizes.push_back ( lcN);
Us.push_back( edgeCenter[0] );
Vs.push_back( edgeCenter[1] );
vSizesBGM.push_back(lcBGM);
vSizes.push_back(lcN);
Us.push_back(edgeCenter[0]);
Vs.push_back(edgeCenter[1]);
std::list<MTri3*> cavity;
for(int i=0;i<3;i++){
for(int i = 0; i < 3; i++){
if (t1->getNeigh(i) && t1->getNeigh(i) != t2){
bool found = false;
for (std::list<MTri3*>::iterator it = cavity.begin();it!=cavity.end();it++){
if (*it == t1->getNeigh(i))found = true;
for (std::list<MTri3*>::iterator it = cavity.begin();it != cavity.end(); it++){
if (*it == t1->getNeigh(i)) found = true;
}
if (!found)cavity.push_back(t1->getNeigh(i));
if (!found) cavity.push_back(t1->getNeigh(i));
}
}
for(int i=0;i<3;i++){
for(int i = 0; i < 3; i++){
if (t2->getNeigh(i) && t2->getNeigh(i) != t1){
bool found = false;
for (std::list<MTri3*>::iterator it = cavity.begin();it!=cavity.end();it++){
for (std::list<MTri3*>::iterator it = cavity.begin(); it != cavity.end(); it++){
if (*it == t2->getNeigh(i))found = true;
}
if (!found)cavity.push_back(t2->getNeigh(i));
if (!found) cavity.push_back(t2->getNeigh(i));
}
}
double lc1 = 0.3333333333*(vSizes [t1b->getVertex(0)->getNum()]+
vSizes [t1b->getVertex(1)->getNum()]+
vSizes [t1b->getVertex(2)->getNum()]);
double lcBGM1 = 0.3333333333*(vSizesBGM [t1b->getVertex(0)->getNum()]+
vSizesBGM [t1b->getVertex(1)->getNum()]+
vSizesBGM [t1b->getVertex(2)->getNum()]);
double lc2 = 0.3333333333*(vSizes [t2b->getVertex(0)->getNum()]+
vSizes [t2b->getVertex(1)->getNum()]+
vSizes [t2b->getVertex(2)->getNum()]);
double lcBGM2 = 0.3333333333*(vSizesBGM [t2b->getVertex(0)->getNum()]+
vSizesBGM [t2b->getVertex(1)->getNum()]+
vSizesBGM [t2b->getVertex(2)->getNum()]);
double lc3 = 0.3333333333*(vSizes [t3b->getVertex(0)->getNum()]+
vSizes [t3b->getVertex(1)->getNum()]+
vSizes [t3b->getVertex(2)->getNum()]);
double lcBGM3 = 0.3333333333*(vSizesBGM [t3b->getVertex(0)->getNum()]+
vSizesBGM [t3b->getVertex(1)->getNum()]+
vSizesBGM [t3b->getVertex(2)->getNum()]);
double lc4 = 0.3333333333*(vSizes [t4b->getVertex(0)->getNum()]+
vSizes [t4b->getVertex(1)->getNum()]+
vSizes [t4b->getVertex(2)->getNum()]);
double lcBGM4 = 0.3333333333*(vSizesBGM [t4b->getVertex(0)->getNum()]+
vSizesBGM [t4b->getVertex(1)->getNum()]+
vSizesBGM [t4b->getVertex(2)->getNum()]);
MTri3 *t1b3 = new MTri3 ( t1b , Extend1dMeshIn2dSurfaces() ? std::min(lc1,lcBGM1) : lcBGM1 );
MTri3 *t2b3 = new MTri3 ( t2b , Extend1dMeshIn2dSurfaces() ? std::min(lc2,lcBGM2) : lcBGM2 );
MTri3 *t3b3 = new MTri3 ( t3b , Extend1dMeshIn2dSurfaces() ? std::min(lc3,lcBGM3) : lcBGM3 );
MTri3 *t4b3 = new MTri3 ( t4b , Extend1dMeshIn2dSurfaces() ? std::min(lc4,lcBGM4) : lcBGM4 );
double lc1 = 0.3333333333 * (vSizes[t1b->getVertex(0)->getNum()] +
vSizes[t1b->getVertex(1)->getNum()] +
vSizes[t1b->getVertex(2)->getNum()]);
double lcBGM1 = 0.3333333333 * (vSizesBGM[t1b->getVertex(0)->getNum()] +
vSizesBGM[t1b->getVertex(1)->getNum()] +
vSizesBGM[t1b->getVertex(2)->getNum()]);
double lc2 = 0.3333333333 * (vSizes[t2b->getVertex(0)->getNum()] +
vSizes[t2b->getVertex(1)->getNum()] +
vSizes[t2b->getVertex(2)->getNum()]);
double lcBGM2 = 0.3333333333 * (vSizesBGM[t2b->getVertex(0)->getNum()] +
vSizesBGM[t2b->getVertex(1)->getNum()] +
vSizesBGM[t2b->getVertex(2)->getNum()]);
double lc3 = 0.3333333333 * (vSizes[t3b->getVertex(0)->getNum()] +
vSizes[t3b->getVertex(1)->getNum()] +
vSizes[t3b->getVertex(2)->getNum()]);
double lcBGM3 = 0.3333333333 * (vSizesBGM[t3b->getVertex(0)->getNum()] +
vSizesBGM[t3b->getVertex(1)->getNum()] +
vSizesBGM[t3b->getVertex(2)->getNum()]);
double lc4 = 0.3333333333 * (vSizes[t4b->getVertex(0)->getNum()] +
vSizes[t4b->getVertex(1)->getNum()] +
vSizes[t4b->getVertex(2)->getNum()]);
double lcBGM4 = 0.3333333333 * (vSizesBGM[t4b->getVertex(0)->getNum()] +
vSizesBGM[t4b->getVertex(1)->getNum()] +
vSizesBGM[t4b->getVertex(2)->getNum()]);
MTri3 *t1b3 = new MTri3(t1b, Extend1dMeshIn2dSurfaces() ? std::min(lc1, lcBGM1) : lcBGM1);
MTri3 *t2b3 = new MTri3(t2b, Extend1dMeshIn2dSurfaces() ? std::min(lc2, lcBGM2) : lcBGM2);
MTri3 *t3b3 = new MTri3(t3b, Extend1dMeshIn2dSurfaces() ? std::min(lc3, lcBGM3) : lcBGM3);
MTri3 *t4b3 = new MTri3(t4b, Extend1dMeshIn2dSurfaces() ? std::min(lc4, lcBGM4) : lcBGM4);
cavity.push_back(t1b3);
cavity.push_back(t2b3);
......@@ -480,7 +493,7 @@ bool gmshEdgeSplit(const double lMax,
cavity.push_back(t4b3);
t1->setDeleted(true);
t2->setDeleted(true);
connectTriangles ( cavity );
connectTriangles(cavity);
newTris.push_back(t1b3);
newTris.push_back(t2b3);
newTris.push_back(t3b3);
......@@ -511,17 +524,14 @@ void computeNeighboringTrisOfACavity(const std::vector<MTri3*> &cavity,
}
}
}
if(!found)outside.push_back(neigh);
if(!found) outside.push_back(neigh);
}
}
}
}
bool gmshBuildVertexCavity(MTri3 *t,
int iLocalVertex,
MVertex **v1,
std::vector<MTri3*> &cavity,
std::vector<MTri3*> &outside,
bool gmshBuildVertexCavity(MTri3 *t, int iLocalVertex, MVertex **v1,
std::vector<MTri3*> &cavity, std::vector<MTri3*> &outside,
std::vector<MVertex*> &ring)
{
cavity.clear();
......@@ -529,75 +539,51 @@ bool gmshBuildVertexCavity(MTri3 *t,
*v1 = t->tri()->getVertex(iLocalVertex);
// printf("VERTEX %d\n",
// t->tri()->getVertex(iLocalVertex)->getNum());
MVertex *lastinring = t->tri()->getVertex((iLocalVertex+1)%3);
MVertex *lastinring = t->tri()->getVertex((iLocalVertex + 1) % 3);
ring.push_back(lastinring);
cavity.push_back(t);
// printf("START triangle %d %d %d, vertex %d\n",
// t->tri()->getVertex(0)->getNum(),
// t->tri()->getVertex(1)->getNum(),
// t->tri()->getVertex(2)->getNum(),
// lastinring->getNum());
while (1){
int iEdge = -1;
// printf("look for %d %d\n",(*v1)->getNum(),lastinring->getNum());
for (int i=0;i<3;i++){
MVertex *v2 = t->tri()->getVertex((i+2)%3);
for (int i = 0; i < 3; i++){
MVertex *v2 = t->tri()->getVertex((i + 2) % 3);
MVertex *v3 = t->tri()->getVertex(i);
// printf("--> %d %d\n",v2->getNum(),v3->getNum());
if ( (v2 == *v1 && v3 == lastinring ) ||
(v2 == lastinring && v3 == *v1 )){
if ((v2 == *v1 && v3 == lastinring) ||
(v2 == lastinring && v3 == *v1)){
iEdge = i;
t = t->getNeigh(i);
if (t==cavity[0]) {
computeNeighboringTrisOfACavity (cavity,outside);
if (t == cavity[0]) {
computeNeighboringTrisOfACavity(cavity, outside);
return true;
}
if (!t)return false;
if (t->isDeleted()){printf("weird\n");throw;}
if (!t) return false;
if (t->isDeleted()){ printf("weird\n"); throw; }
cavity.push_back(t);
for (int j=0;j<3;j++){
for (int j = 0; j < 3; j++){
if (t->tri()->getVertex(j) !=lastinring && t->tri()->getVertex(j) != *v1){
lastinring = t->tri()->getVertex(j);
ring.push_back(lastinring);
j = 100;
}
}
// printf("CONTINUE (%d) triangle %p = %d %d %d, vertex %d size %d\n",i,
// t,
// t->tri()->getVertex(0)->getNum(),
// t->tri()->getVertex(1)->getNum(),
// t->tri()->getVertex(2)->getNum(),
// lastinring->getNum(),ring.size());
break;
}
}
if (iEdge == -1) {printf("not found\n"); throw;}
if (iEdge == -1) { printf("not found\n"); throw; }
}
}
bool gmshVertexCollapse(const double lMin,
MTri3 *t1,
GFace *gf,
int iLocalVertex,
std::vector<MTri3*> &newTris,
std::vector<double> & Us,
std::vector<double> & Vs,
std::vector<double> & vSizes ,
std::vector<double> & vSizesBGM ){
bool gmshVertexCollapse(const double lMin, MTri3 *t1, GFace *gf,
int iLocalVertex, std::vector<MTri3*> &newTris,
std::vector<double> &Us, std::vector<double> &Vs,
std::vector<double> &vSizes, std::vector<double> &vSizesBGM)
{
MVertex *v;
std::vector<MTri3*> cavity;
std::vector<MTri3*> outside;
std::vector<MVertex*> ring ;
// printf("%p \n",t1);
if (!gmshBuildVertexCavity (t1,iLocalVertex, &v,cavity,outside,ring) )return false;
if (!gmshBuildVertexCavity(t1, iLocalVertex, &v, cavity, outside, ring)) return false;
double l_min = lMin;
int iMin = -1;
......@@ -650,24 +636,25 @@ bool gmshVertexCollapse(const double lMin,
return true;
}
int edgeSwapPass (GFace *gf, std::set<MTri3*,compareTri3Ptr> &allTris,
const gmshSwapCriterion &cr,
const std::vector<double> & Us ,
const std::vector<double> & Vs,
const std::vector<double> & vSizes ,
const std::vector<double> & vSizesBGM)
int edgeSwapPass (GFace *gf, std::set<MTri3*, compareTri3Ptr> &allTris,
const gmshSwapCriterion &cr,
const std::vector<double> &Us, const std::vector<double> &Vs,
const std::vector<double> &vSizes, const std::vector<double> &vSizesBGM)
{
typedef std::set<MTri3*,compareTri3Ptr> CONTAINER ;
typedef std::set<MTri3*, compareTri3Ptr> CONTAINER ;
int nbSwapTot=0;
int nbSwapTot = 0;
std::set<swapquad> configs;
for (int iter=0;iter<1200;iter++){
for (int iter = 0; iter < 1200; iter++){
int nbSwap = 0;
std::vector<MTri3*> newTris;
for (CONTAINER::iterator it = allTris.begin();it!=allTris.end();++it){
for (CONTAINER::iterator it = allTris.begin(); it != allTris.end(); ++it){
if (!(*it)->isDeleted()){
for (int i=0;i<3;i++){
if (gmshEdgeSwap(configs,*it,gf,i,newTris,cr,Us,Vs,vSizes,vSizesBGM)) {nbSwap++;break;}
for (int i = 0; i < 3; i++){
if (gmshEdgeSwap(configs, *it, gf, i, newTris, cr, Us, Vs, vSizes, vSizesBGM)){
nbSwap++;
break;
}
}
}
else{
......@@ -675,37 +662,33 @@ int edgeSwapPass (GFace *gf, std::set<MTri3*,compareTri3Ptr> &allTris,
CONTAINER::iterator itb = it;
++it;
allTris.erase(itb);
if (it == allTris.end())break;
if (it == allTris.end()) break;
}
}
allTris.insert(newTris.begin(),newTris.end());
// printf("iter %d nbswam %d\n",iter,nbSwap);
nbSwapTot+=nbSwap;
if (nbSwap == 0)break;
allTris.insert(newTris.begin(), newTris.end());
nbSwapTot += nbSwap;
if (nbSwap == 0) break;
}
// printf("B %d %d tris ",allTris.size(),newTris.size());
// printf("A %d %d tris\n",allTris.size(),newTris.size());
return nbSwapTot;
}
int edgeSplitPass (double maxLC,
GFace *gf, std::set<MTri3*,compareTri3Ptr> &allTris,
const gmshSplitCriterion &cr,
std::vector<double> & Us ,
std::vector<double> & Vs,
std::vector<double> & vSizes ,
std::vector<double> & vSizesBGM)
int edgeSplitPass(double maxLC, GFace *gf, std::set<MTri3*,compareTri3Ptr> &allTris,
const gmshSplitCriterion &cr,
std::vector<double> &Us, std::vector<double> &Vs,
std::vector<double> &vSizes, std::vector<double> &vSizesBGM)
{
typedef std::set<MTri3*,compareTri3Ptr> CONTAINER ;
typedef std::set<MTri3*, compareTri3Ptr> CONTAINER ;
std::vector<MTri3*> newTris;
int nbSplit = 0;
for (CONTAINER::iterator it = allTris.begin();it!=allTris.end();++it){
for (CONTAINER::iterator it = allTris.begin(); it != allTris.end(); ++it){
if (!(*it)->isDeleted()){
for (int i=0;i<3;i++){
if (gmshEdgeSplit (maxLC,*it,gf,i,newTris,cr,Us,Vs,vSizes,vSizesBGM)) {nbSplit++;break;}
for (int i = 0; i < 3; i++){
if (gmshEdgeSplit(maxLC, *it, gf, i, newTris, cr, Us, Vs, vSizes, vSizesBGM)) {
nbSplit++;
break;
}
}
}
else{
......@@ -713,7 +696,7 @@ int edgeSplitPass (double maxLC,
delete *it;
++it;
allTris.erase(itb);
if (it == allTris.end())break;
if (it == allTris.end()) break;
}
}
printf("B %d %d tris ", (int)allTris.size(), (int)newTris.size());
......@@ -722,22 +705,22 @@ int edgeSplitPass (double maxLC,
return nbSplit;
}
int edgeCollapsePass (double minLC,
GFace *gf, std::set<MTri3*,compareTri3Ptr> &allTris,
std::vector<double> & Us ,
std::vector<double> & Vs,
std::vector<double> & vSizes ,
std::vector<double> & vSizesBGM)
int edgeCollapsePass(double minLC, GFace *gf, std::set<MTri3*,compareTri3Ptr> &allTris,
std::vector<double> &Us, std::vector<double> &Vs,
std::vector<double> &vSizes, std::vector<double> &vSizesBGM)
{
typedef std::set<MTri3*,compareTri3Ptr> CONTAINER ;
std::vector<MTri3*> newTris;
int nbCollapse = 0;
for (CONTAINER::reverse_iterator it = allTris.rbegin();it!=allTris.rend();++it){
for (CONTAINER::reverse_iterator it = allTris.rbegin(); it != allTris.rend(); ++it){
if (!(*it)->isDeleted()){
for (int i=0;i<3;i++){
if (gmshVertexCollapse (minLC,*it,gf,i,newTris,Us,Vs,vSizes,vSizesBGM)) {nbCollapse++; break;}
for (int i = 0; i < 3; i++){
if (gmshVertexCollapse(minLC, *it, gf, i, newTris, Us, Vs, vSizes, vSizesBGM)) {
nbCollapse++;
break;
}
}
}
// else{
......@@ -754,4 +737,3 @@ int edgeCollapsePass (double minLC,
printf("A %d %d tris\n", (int)allTris.size(), (int)newTris.size());
return nbCollapse;
}
$Id: TODO,v 1.68 2008-02-17 10:24:50 geuzaine Exp $
$Id: TODO,v 1.69 2008-03-01 10:52:05 geuzaine Exp $
********************************************************************
......@@ -215,13 +215,3 @@ create "Volume visualization" range type? (interpolate on regular grid
+ create cut planes // to viewpoint with transparency; can be done in
a straightforward way or using 3D textures)
********************************************************************
Yves Krahenbuhl wrote:
> Lors de la creation des elements du 2eme ordre, et selon la courbure
> du contour exterieur, le jacobien de l'element peut devenir negatif.
> Cependant le programme genere le maillage sans protester. Il
> faudrait peut-etre faire apparaitre un message d'erreurs / ou se
> restreindre (automatiquement ou non) a une interpolation lineaire
> entre les points en question.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment