diff --git a/Geo/GEdgeCompound.cpp b/Geo/GEdgeCompound.cpp index 354dd9fbb661dc715d821eefaa6735bd0f34f289..be9bae260380d7db0b523eb01cc59bafae9359fa 100644 --- a/Geo/GEdgeCompound.cpp +++ b/Geo/GEdgeCompound.cpp @@ -33,7 +33,6 @@ GEdgeCompound::GEdgeCompound(GModel *m, int tag, std::vector<GEdge*> &compound, } parametrize(); - } GEdgeCompound::GEdgeCompound(GModel *m, int tag, std::vector<GEdge*> &compound) diff --git a/Geo/GFaceCompound.cpp b/Geo/GFaceCompound.cpp index c4c965d62dee95685379d62e60dfec1ad79d4e43..b9e2864c3334688591492c853a528c0c126385e4 100644 --- a/Geo/GFaceCompound.cpp +++ b/Geo/GFaceCompound.cpp @@ -50,12 +50,10 @@ static void fixEdgeToValue(GEdge *ed, double value, dofManager<double> &myAssemb } } -//-------------------------------------------------------------- static int intersection_segments (SPoint3 &p1, SPoint3 &p2, SPoint3 &q1, SPoint3 &q2, - double x[2]){ - - + double x[2]) +{ double xp_max = std::max(p1.x(),p2.x()); double yp_max = std::max(p1.y(),p2.y()); double xq_max = std::max(q1.x(),q2.x()); @@ -65,8 +63,8 @@ static int intersection_segments (SPoint3 &p1, SPoint3 &p2, double yp_min = std::min(p1.y(),p2.y()); double xq_min = std::min(q1.x(),q2.x()); double yq_min = std::min(q1.y(),q2.y()); - if ( yq_min > yp_max || xq_min > xp_max || - yq_max < yp_min || xq_max < xp_min){ + if (yq_min > yp_max || xq_min > xp_max || + yq_max < yp_min || xq_max < xp_min){ return 0; } else{ @@ -80,11 +78,9 @@ static int intersection_segments (SPoint3 &p1, SPoint3 &p2, return (x[0] >= 0.0 && x[0] <= 1. && x[1] >= 0.0 && x[1] <= 1.); - } - + } } -//-------------------------------------------------------------- static bool orderVertices(const std::list<GEdge*> &e, std::vector<MVertex*> &l, std::vector<double> &coord) { @@ -147,7 +143,6 @@ static bool orderVertices(const std::list<GEdge*> &e, std::vector<MVertex*> &l, return true; } -//-------------------------------------------------------------- static void computeCGKernelPolygon(std::map<MVertex*,SPoint3> &coordinates, std::vector<MVertex*> &cavV, double &ucg, double &vcg) { @@ -229,7 +224,7 @@ static void computeCGKernelPolygon(std::map<MVertex*,SPoint3> &coordinates, vcg/=nbFinal; } else{ - Msg::Debug("----> No Kernel for polygon: place point at CG polygon."); + Msg::Debug("----> No Kernel for polygon: place point at CG polygon"); //place at CG polygon for(std::vector<MVertex*>::iterator it = cavV.begin() ; it != cavV.end() ; ++it){ SPoint3 vsp = coordinates[*it]; @@ -290,10 +285,10 @@ static void myPolygon(std::vector<MElement*> &vTri, std::vector<MVertex*> &vPoly // for(std::vector<MVertex*>::iterator itv = vPoly.begin(); itv != vPoly.end(); itv++){ // printf("VV=%d \n", (*itv)->getNum()); // } - } -bool checkCavity(std::vector<MElement*> &vTri, std::map<MVertex*, SPoint2> &vCoord) { +bool checkCavity(std::vector<MElement*> &vTri, std::map<MVertex*, SPoint2> &vCoord) +{ bool badCavity = false; unsigned int nbV = vTri.size(); @@ -315,7 +310,8 @@ bool checkCavity(std::vector<MElement*> &vTri, std::map<MVertex*, SPoint2> &vCoo return badCavity; } -static bool closedCavity(MVertex *v, std::vector<MElement*> &vTri){ +static bool closedCavity(MVertex *v, std::vector<MElement*> &vTri) +{ std::set<MVertex *> vs; for (unsigned int i = 0; i < vTri.size(); i++){ MElement *t = vTri[i]; @@ -330,10 +326,8 @@ static bool closedCavity(MVertex *v, std::vector<MElement*> &vTri){ return vs.empty(); } - void GFaceCompound::fillNeumannBCS() const { - fillTris.clear(); fillNodes.clear(); @@ -445,7 +439,7 @@ void GFaceCompound::fillNeumannBCS() const } //printing - if( !CTX::instance()->mesh.saveAll){ + if(!CTX::instance()->mesh.saveAll){ if (fillTris.size() > 0){ char name[256]; std::list<GFace*>::const_iterator itf = _compound.begin(); @@ -464,11 +458,8 @@ void GFaceCompound::fillNeumannBCS() const fclose(ftri); } } - } - - bool GFaceCompound::trivial() const { if(_compound.size() == 1 && @@ -481,12 +472,10 @@ bool GFaceCompound::trivial() const return false; } - -//For the conformal map the linear system cannot guarantee there is no overlapping -//of triangles +// For the conformal map the linear system cannot guarantee there is +// no overlapping of triangles bool GFaceCompound::checkOverlap() const { - bool has_no_overlap = true; for(std::list<std::list<GEdge*> >::const_iterator iloop = _interior_loops.begin(); @@ -526,12 +515,10 @@ bool GFaceCompound::checkOverlap() const } -//check if the discrete harmonic map is correct -//by checking that all the mapped triangles have -//the same normal orientation +// check if the discrete harmonic map is correct by checking that all +// the mapped triangles have the same normal orientation bool GFaceCompound::checkOrientation(int iter) const { - //Only check orientation for stl files (1 patch) //if(_compound.size() > 1.0) return true; @@ -577,7 +564,6 @@ bool GFaceCompound::checkOrientation(int iter) const } return oriented; - } void GFaceCompound::one2OneMap() const @@ -640,16 +626,14 @@ bool GFaceCompound::parametrize() const bool success = orderVertices(_U0, _ordered, _coords); if(!success) Msg::Error("Could not order vertices on boundary"); - //Laplace parametrization - //----------------- + // Laplace parametrization if (_mapping == HARMONIC){ Msg::Debug("Parametrizing surface %d with 'harmonic map'", tag()); fillNeumannBCS(); parametrize(ITERU,HARMONIC); parametrize(ITERV,HARMONIC); } - //Multiscale Laplace parametrization - //----------------- + // Multiscale Laplace parametrization else if (_mapping == MULTISCALE){ std::vector<MElement*> _elements; for( std::list<GFace*>::const_iterator itt = _compound.begin(); itt != _compound.end(); ++itt) @@ -657,8 +641,7 @@ bool GFaceCompound::parametrize() const _elements.push_back((*itt)->triangles[i]); multiscaleLaplace multiLaplace(_elements, coordinates); } - //Conformal map parametrization - //----------------- + // Conformal map parametrization else if (_mapping == CONFORMAL){ Msg::Debug("Parametrizing surface %d with 'conformal map'", tag()); fillNeumannBCS(); @@ -671,11 +654,11 @@ bool GFaceCompound::parametrize() const // Msg::Warning("!!! Overlap: parametrization switched to 'nonLIN conformal' map"); // noOverlap = parametrize_conformal_nonLinear() ; //} - if (!noOverlap || !checkOrientation(0) ){ - Msg::Warning("$$$ Flipping: parametrization switched to 'harmonic' map"); - parametrize(ITERU,HARMONIC); - parametrize(ITERV,HARMONIC); - } + if (!noOverlap || !checkOrientation(0) ){ + Msg::Warning("$$$ Flipping: parametrization switched to 'harmonic' map"); + parametrize(ITERU,HARMONIC); + parametrize(ITERV,HARMONIC); + } } buildOct(); @@ -691,7 +674,6 @@ bool GFaceCompound::parametrize() const buildOct(); } - double AR = checkAspectRatio(); if (floor(AR) > AR_MAX){ Msg::Warning("Geometrical aspect ratio is high AR=%d ", (int)AR); @@ -699,7 +681,6 @@ bool GFaceCompound::parametrize() const } return paramOK; - } void GFaceCompound::getBoundingEdges() @@ -715,7 +696,7 @@ void GFaceCompound::getBoundingEdges() l_edges.clear(); if(_U0.size()){ - //--- in case the bounding edges are explicitely given + // in case the bounding edges are explicitely given std::list<GEdge*>::const_iterator it = _U0.begin(); for( ; it != _U0.end() ; ++it){ l_edges.push_back(*it); @@ -731,7 +712,7 @@ void GFaceCompound::getBoundingEdges() while(!_unique.empty()) computeALoop(_unique,loop); } else{ - //--- in case the bounding edges are NOT explicitely given + // in case the bounding edges are NOT explicitely given std::set<GEdge*>::iterator itf = _unique.begin(); for( ; itf != _unique.end(); ++itf){ l_edges.push_back(*itf); @@ -741,7 +722,7 @@ void GFaceCompound::getBoundingEdges() computeALoop(_unique,loop); while(!_unique.empty()) computeALoop(_unique, loop); - //assign Derichlet BC (_U0) to bound with largest size + // assign Derichlet BC (_U0) to bound with largest size double maxSize = 0.0; for(std::list<std::list<GEdge*> >::iterator it = _interior_loops.begin(); it != _interior_loops.end(); it++){ @@ -753,14 +734,10 @@ void GFaceCompound::getBoundingEdges() } } - - return; - } double GFaceCompound::getSizeH() const { - SBoundingBox3d bb; std::vector<SPoint3> vertices; for(std::set<MVertex *>::iterator itv = allNodes.begin(); itv !=allNodes.end() ; ++itv){ @@ -774,11 +751,10 @@ double GFaceCompound::getSizeH() const //double H = obbox.getMaxSize(); return H; - } + double GFaceCompound::getSizeBB(const std::list<GEdge* > &elist) const { - //SOrientedBoundingBox obboxD = obb_boundEdges(elist); //double D = obboxD.getMaxSize(); @@ -786,11 +762,10 @@ double GFaceCompound::getSizeBB(const std::list<GEdge* > &elist) const double D = norm(SVector3(bboxD.max(), bboxD.min())); return D; - } + SBoundingBox3d GFaceCompound::boundEdges(const std::list<GEdge* > &elist) const { - SBoundingBox3d res; std::list<GEdge*>::const_iterator it = elist.begin(); for(; it != elist.end(); it++) @@ -798,9 +773,9 @@ SBoundingBox3d GFaceCompound::boundEdges(const std::list<GEdge* > &elist) const return res; } + SOrientedBoundingBox GFaceCompound::obb_boundEdges(const std::list<GEdge* > &elist) const { - SOrientedBoundingBox res; std::vector<SPoint3> vertices; @@ -864,12 +839,13 @@ void GFaceCompound::getUniqueEdges(std::set<GEdge*> &_unique) std::list<GEdge*> ed = (*it)->edges(); std::list<GEdge*>::iterator ite = ed.begin(); for( ; ite != ed.end() ; ++ite){ - if(!(*ite)->degenerate(0) && _touched.count(*ite) == 1) { - _unique.insert(*ite); } + if(!(*ite)->degenerate(0) && _touched.count(*ite) == 1){ + _unique.insert(*ite); + } } } - } + void GFaceCompound::computeALoop(std::set<GEdge*> &_unique, std::list<GEdge*> &loop) { std::list<GEdge*> _loop; @@ -929,9 +905,6 @@ void GFaceCompound::computeALoop(std::set<GEdge*> &_unique, std::list<GEdge*> &l loop = _loop; _interior_loops.push_back(loop); - - return; - } GFaceCompound::GFaceCompound(GModel *m, int tag, std::list<GFace*> &compound, @@ -942,7 +915,6 @@ GFaceCompound::GFaceCompound(GModel *m, int tag, std::list<GFace*> &compound, : GFace(m, tag), _compound(compound), _U0(U0), _U1(U1), _V0(V0), _V1(V1), oct(0), _lsys(lsys),_mapping(mpg), _allowPartition(allowPartition) { - ONE = new simpleFunction<double>(1.0); MONE = new simpleFunction<double>(-1.0); @@ -974,7 +946,6 @@ GFaceCompound::GFaceCompound(GModel *m, int tag, std::list<GFace*> &compound, nbSplit = 0; fillTris.clear(); - } GFaceCompound::~GFaceCompound() @@ -988,7 +959,6 @@ GFaceCompound::~GFaceCompound() delete MONE; } - SPoint2 GFaceCompound::getCoordinates(MVertex *v) const { if(trivial()){ @@ -1197,7 +1167,6 @@ void GFaceCompound::computeThetaDerivatives (MVertex *prev, MVertex *curr, MVert double &dTdu2, double &dTdv2, double &dTdu3, double &dTdv3) const { - SPoint2 p1 = getCoordinates(prev); SPoint2 p2 = getCoordinates(curr); SPoint2 p3 = getCoordinates(next); @@ -1235,7 +1204,6 @@ void GFaceCompound::computeThetaDerivatives (MVertex *prev, MVertex *curr, MVert bool GFaceCompound::parametrize_conformal_nonLinear() const { - bool converged = false; //--create dofManager @@ -1416,143 +1384,128 @@ bool GFaceCompound::parametrize_conformal_nonLinear() const //exit(1); return converged; - } bool GFaceCompound::parametrize_conformal_spectral() const { - #if !defined(HAVE_PETSC) && !defined(HAVE_SLEPC) - { - - Msg::Error("-----------------------------------------------------------------------------!"); - Msg::Error("Gmsh should be compiled with petsc and slepc for using the conformal map !"); - Msg::Error("Switch to harmonic map or see doc on the wiki for installing petsc and slepc !"); - Msg::Error("https://geuz.org/trac/gmsh/wiki/STLRemeshing (username:gmsh,passwd:gmsh) !"); - Msg::Error("-----------------------------------------------------------------------------!"); - Msg::Exit(1); - return false; - - } + Msg::Error("Gmsh should be compiled with petsc and slepc for using the conformal map."); + Msg::Error("Switch to harmonic map or see doc on the wiki for installing petsc and slepc:"); + Msg::Error("https://geuz.org/trac/gmsh/wiki/STLRemeshing (username:gmsh,passwd:gmsh)"); + return false; #else - { + linearSystem <double> *lsysA = new linearSystemPETSc<double>; + linearSystem <double> *lsysB = new linearSystemPETSc<double>; + dofManager<double> myAssembler(lsysA, lsysB); - linearSystem <double> *lsysA = new linearSystemPETSc<double>; - linearSystem <double> *lsysB = new linearSystemPETSc<double>; - dofManager<double> myAssembler(lsysA, lsysB); - - //printf("nbNodes = %d in spectral param \n", allNodes.size()); - //------------------------------- - myAssembler.setCurrentMatrix("A"); - for(std::set<MVertex *>::iterator itv = allNodes.begin(); itv !=allNodes.end() ; ++itv){ - MVertex *v = *itv; - myAssembler.numberVertex(v, 0, 1); - myAssembler.numberVertex(v, 0, 2); - } - - for(std::set<MVertex *>::iterator itv = fillNodes.begin(); itv !=fillNodes.end() ; ++itv){ - MVertex *v = *itv; - myAssembler.numberVertex(v, 0, 1); - myAssembler.numberVertex(v, 0, 2); - } - - laplaceTerm laplace1(model(), 1, ONE); - laplaceTerm laplace2(model(), 2, ONE); - crossConfTerm cross12(model(), 1, 2, ONE); - crossConfTerm cross21(model(), 2, 1, MONE); - std::list<GFace*>::const_iterator it = _compound.begin(); - for( ; it != _compound.end() ; ++it){ - for(unsigned int i = 0; i < (*it)->triangles.size(); ++i){ - SElement se((*it)->triangles[i]); - laplace1.addToMatrix(myAssembler, &se); - laplace2.addToMatrix(myAssembler, &se); - cross12.addToMatrix(myAssembler, &se); - cross21.addToMatrix(myAssembler, &se); - } - } - - for (std::list<MTriangle*>::iterator it2 = fillTris.begin(); it2 !=fillTris.end(); it2++ ){ - SElement se((*it2)); + myAssembler.setCurrentMatrix("A"); + for(std::set<MVertex *>::iterator itv = allNodes.begin(); itv !=allNodes.end() ; ++itv){ + MVertex *v = *itv; + myAssembler.numberVertex(v, 0, 1); + myAssembler.numberVertex(v, 0, 2); + } + + for(std::set<MVertex *>::iterator itv = fillNodes.begin(); itv !=fillNodes.end() ; ++itv){ + MVertex *v = *itv; + myAssembler.numberVertex(v, 0, 1); + myAssembler.numberVertex(v, 0, 2); + } + + laplaceTerm laplace1(model(), 1, ONE); + laplaceTerm laplace2(model(), 2, ONE); + crossConfTerm cross12(model(), 1, 2, ONE); + crossConfTerm cross21(model(), 2, 1, MONE); + std::list<GFace*>::const_iterator it = _compound.begin(); + for( ; it != _compound.end() ; ++it){ + for(unsigned int i = 0; i < (*it)->triangles.size(); ++i){ + SElement se((*it)->triangles[i]); laplace1.addToMatrix(myAssembler, &se); laplace2.addToMatrix(myAssembler, &se); cross12.addToMatrix(myAssembler, &se); cross21.addToMatrix(myAssembler, &se); } - - double epsilon = 1.e-7; - for(std::set<MVertex *>::iterator itv = allNodes.begin(); itv !=allNodes.end() ; ++itv){ - MVertex *v = *itv; - if (std::find(_ordered.begin(), _ordered.end(), v) == _ordered.end() ){ - myAssembler.assemble(v, 0, 1, v, 0, 1, epsilon); - myAssembler.assemble(v, 0, 2, v, 0, 2, epsilon); - } + } + + for (std::list<MTriangle*>::iterator it2 = fillTris.begin(); it2 != fillTris.end(); it2++){ + SElement se((*it2)); + laplace1.addToMatrix(myAssembler, &se); + laplace2.addToMatrix(myAssembler, &se); + cross12.addToMatrix(myAssembler, &se); + cross21.addToMatrix(myAssembler, &se); + } + + double epsilon = 1.e-7; + for(std::set<MVertex *>::iterator itv = allNodes.begin(); itv !=allNodes.end() ; ++itv){ + MVertex *v = *itv; + if (std::find(_ordered.begin(), _ordered.end(), v) == _ordered.end() ){ + myAssembler.assemble(v, 0, 1, v, 0, 1, epsilon); + myAssembler.assemble(v, 0, 2, v, 0, 2, epsilon); } - for(std::set<MVertex *>::iterator itv = fillNodes.begin(); itv !=fillNodes.end() ; ++itv){ - MVertex *v = *itv; - if (std::find(_ordered.begin(), _ordered.end(), v) == _ordered.end() ){ - myAssembler.assemble(v, 0, 1, v, 0, 1, epsilon); - myAssembler.assemble(v, 0, 2, v, 0, 2, epsilon); - } + } + for(std::set<MVertex *>::iterator itv = fillNodes.begin(); itv !=fillNodes.end() ; ++itv){ + MVertex *v = *itv; + if (std::find(_ordered.begin(), _ordered.end(), v) == _ordered.end() ){ + myAssembler.assemble(v, 0, 1, v, 0, 1, epsilon); + myAssembler.assemble(v, 0, 2, v, 0, 2, epsilon); } - - //------------------------------- - myAssembler.setCurrentMatrix("B"); - - //mettre max NC contraintes par bord - int NB = _ordered.size(); - int NC = std::min(70,NB); - int jump = (int) NB/NC; - int nbLoop = (int) NB/jump ; - //printf("nb bound nodes=%d jump =%d \n", NB, jump); - for (int i = 0; i< nbLoop; i++){ - MVertex *v1 = _ordered[i*jump]; - myAssembler.assemble(v1, 0, 1, v1, 0, 1, 1.0); - myAssembler.assemble(v1, 0, 2, v1, 0, 2, 1.0); - for (int j = 0; j< nbLoop; j++){ - MVertex *v2 = _ordered[j*jump]; - myAssembler.assemble(v1, 0, 1, v2, 0, 1, -1./NC); - myAssembler.assemble(v1, 0, 2, v2, 0, 2, -1./NC); - } + } + + myAssembler.setCurrentMatrix("B"); + + // mettre max NC contraintes par bord + int NB = _ordered.size(); + int NC = std::min(70,NB); + int jump = (int) NB/NC; + int nbLoop = (int) NB/jump ; + + for (int i = 0; i< nbLoop; i++){ + MVertex *v1 = _ordered[i*jump]; + myAssembler.assemble(v1, 0, 1, v1, 0, 1, 1.0); + myAssembler.assemble(v1, 0, 2, v1, 0, 2, 1.0); + for (int j = 0; j< nbLoop; j++){ + MVertex *v2 = _ordered[j*jump]; + myAssembler.assemble(v1, 0, 1, v2, 0, 1, -1./NC); + myAssembler.assemble(v1, 0, 2, v2, 0, 2, -1./NC); } - - //------------------------------- - //printf("Solve eigensystem \n"); - eigenSolver eig(&myAssembler, "B" , "A", true); - bool converged = eig.solve(1, "largest"); + } + + // FIXME: force non-hermitian. For some reason (roundoff errors?) + // on some machines et for some meshes slepc complains about bad IP + // norm otherwise + eigenSolver eig(&myAssembler, "B" , "A", false); + bool converged = eig.solve(1, "largest"); - if(converged) { - double Linfty = 0.0; - int k = 0; - std::vector<std::complex<double> > &ev = eig.getEigenVector(0); - for(std::set<MVertex *>::iterator itv = allNodes.begin(); itv !=allNodes.end() ; ++itv){ - double paramu = ev[k].real(); - double paramv = ev[k+1].real(); - Linfty=std::max(Linfty, sqrt(paramu*paramu+paramv*paramv)); - k = k+2; - } - k = 0; - for(std::set<MVertex *>::iterator itv = allNodes.begin(); itv !=allNodes.end() ; ++itv){ - MVertex *v = *itv; - double paramu = ev[k].real()/Linfty; - double paramv = ev[k+1].real()/Linfty; - coordinates[v] = SPoint3(paramu,paramv,0.0); - k = k+2; - } - - lsysA->clear(); - lsysB->clear(); - - return checkOverlap(); - + if(converged) { + double Linfty = 0.0; + int k = 0; + std::vector<std::complex<double> > &ev = eig.getEigenVector(0); + for(std::set<MVertex *>::iterator itv = allNodes.begin(); itv !=allNodes.end() ; ++itv){ + double paramu = ev[k].real(); + double paramv = ev[k+1].real(); + Linfty=std::max(Linfty, sqrt(paramu*paramu+paramv*paramv)); + k = k+2; } - else return false; - + k = 0; + for(std::set<MVertex *>::iterator itv = allNodes.begin(); itv !=allNodes.end() ; ++itv){ + MVertex *v = *itv; + double paramu = ev[k].real()/Linfty; + double paramv = ev[k+1].real()/Linfty; + coordinates[v] = SPoint3(paramu,paramv,0.0); + k = k+2; + } + + lsysA->clear(); + lsysB->clear(); + + return checkOverlap(); + } + else return false; #endif } + bool GFaceCompound::parametrize_conformal() const { - dofManager<double> myAssembler(_lsys); MVertex *v1 = _ordered[0]; @@ -1936,7 +1889,6 @@ void GFaceCompound::getTriangle(double u, double v, GFaceCompoundTriangle **lt, double &_u, double &_v) const { - double uv[3] = {u, v, 0}; *lt = (GFaceCompoundTriangle*)Octree_Search(uv, oct); // if(!(*lt)) { @@ -1969,7 +1921,6 @@ void GFaceCompound::getTriangle(double u, double v, void GFaceCompound::buildOct() const { - SBoundingBox3d bb; int count = 0; std::list<GFace*>::const_iterator it = _compound.begin(); @@ -2035,7 +1986,6 @@ void GFaceCompound::buildOct() const bool GFaceCompound::checkTopology() const { - // FIXME!!! I think those things are wrong with cross-patch reparametrization //if ((*(_compound.begin()))->geomType() != GEntity::DiscreteSurface)return true; @@ -2097,7 +2047,6 @@ bool GFaceCompound::checkTopology() const double GFaceCompound::checkAspectRatio() const { - //if ((*(_compound.begin()))->geomType() != GEntity::DiscreteSurface) // return true; @@ -2159,7 +2108,6 @@ double GFaceCompound::checkAspectRatio() const void GFaceCompound::coherencePatches() const { - Msg::Info("Re-orient all %d compound patches normals coherently", _compound.size()); std::map<MEdge, std::set<MElement*>, Less_Edge > edge2elems; @@ -2210,14 +2158,10 @@ void GFaceCompound::coherencePatches() const } } } - - return; - } void GFaceCompound::coherenceNormals() { - Msg::Info("Re-orient all %d face normals coherently", getNumMeshElements()); std::map<MEdge, std::set<MElement*>, Less_Edge > edge2elems; @@ -2263,14 +2207,10 @@ void GFaceCompound::coherenceNormals() } } } - - return; - } void GFaceCompound::buildAllNodes() const { - std::list<GFace*>::const_iterator it = _compound.begin(); for( ; it != _compound.end() ; ++it){ for(unsigned int i = 0; i < (*it)->triangles.size(); ++i){ @@ -2304,12 +2244,10 @@ int GFaceCompound::genusGeom() const int poincare = vs.size() - es.size() + N; return (int)(-poincare + 2 - _interior_loops.size())/2; - } void GFaceCompound::printStuff(int iNewton) const { - if( !CTX::instance()->mesh.saveAll) return; std::list<GFace*>::const_iterator it = _compound.begin(); @@ -2459,7 +2397,6 @@ void GFaceCompound::printStuff(int iNewton) const // fclose(xyzc); // fprintf(uvm,"};\n"); // fclose(uvm); - } #endif diff --git a/doc/VERSIONS.txt b/doc/VERSIONS.txt index f8488b096b0add34d1cc3ed6e219b6597d3dc5a6..832524a6c105b7f1a13903a57a58177e3868099e 100644 --- a/doc/VERSIONS.txt +++ b/doc/VERSIONS.txt @@ -1,12 +1,12 @@ -2.5.0 (?): new client/server visualization mode; new compound -geometrical entities (useful for remeshing); improved mesh -reclassification tool; new ability to watch a pattern of files to -merge; new integrated MPEG export; new option to force the type of -views dynamically; bumped mesh version format to 2.2 (change in the -meaning of the partition tags; this only affects partitioned -(parallel) meshes); renamed several post-processing plugins (as well -as plugin options) to make them easier to understand; many bug fixes -and usability improvements all over the place. +2.5.0 (?): new compound geometrical entities (for remeshing and/or +trans-patch meshing); improved mesh reclassification tool; new +client/server visualization mode; new ability to watch a pattern of +files to merge; new integrated MPEG export; new option to force the +type of views dynamically; bumped mesh version format to 2.2 (small +change in the meaning of the partition tags; this only affects +partitioned (i.e. parallel) meshes); renamed several post-processing +plugins (as well as plugin options) to make them easier to understand; +many bug fixes and usability improvements all over the place. 2.4.2 (Sep 21, 2009): solver code refactoring + better IDE integration.