diff --git a/Plugin/Distance.cpp b/Plugin/Distance.cpp index 40327ce80c94173abbbfdc9a00d8efd401ab2d70..8c672069f8b88f8356d8cf31038db02b61391fd5 100644 --- a/Plugin/Distance.cpp +++ b/Plugin/Distance.cpp @@ -54,7 +54,7 @@ GMSH_DistancePlugin::GMSH_DistancePlugin() std::string GMSH_DistancePlugin::getHelp() const { - return "Plugin(Distance) computes distances to physical entities in " + return "XXX Plugin(Distance) computes distances to physical entities in " "a mesh.\n\n" "Define the physical entities to which the distance is computed. " "If Point=0, Line=0, and Surface=0, then the distance is computed " @@ -90,83 +90,106 @@ StringXString *GMSH_DistancePlugin::getOptionStr(int iopt) return &DistanceOptions_String[iopt]; } -void GMSH_DistancePlugin::printView(std::vector<GEntity*> _entities, - std::map<MVertex*,double > _distance_map ) +void GMSH_DistancePlugin::printView(std::vector<GEntity*> _entities, + std::map<MVertex*,double > _distance_map ) { - _fileName = DistanceOptions_String[0].def; + _fileName = DistanceOptions_String[0].def; _minScale = (double) DistanceOptions_Number[4].def; _maxScale = (double) DistanceOptions_Number[5].def; - + double minDist=1.e4; double maxDist=0.0; - for(std::map<MVertex*,double >::iterator itv = _distance_map.begin(); - itv != _distance_map.end() ; ++itv){ + for (std::map<MVertex*,double >::iterator itv=_distance_map.begin(); itv!=_distance_map.end(); ++itv){ double dist = itv->second; - if (dist > maxDist) maxDist = dist; - if (dist < minDist) minDist = dist; + if (dist>maxDist) maxDist = dist; + if (dist<minDist) minDist = dist; itv->second = dist; } - - Msg::Info("Writing %s",_fileName.c_str()); - FILE * fName = fopen(_fileName.c_str(),"w"); - fprintf(fName,"View \"distance \"{\n"); - for(unsigned int ii = 0; ii < _entities.size(); ii++){ - if(_entities[ii]->dim() == _maxDim) { - for(unsigned int i = 0; i < _entities[ii]->getNumMeshElements(); i++){ - MElement *e = _entities[ii]->getMeshElement(i); - - int numNodes = e->getNumVertices(); - if(e->getNumChildren()) numNodes = e->getNumChildren() * e->getChild(0)->getNumVertices(); - std::vector<double> x(numNodes), y(numNodes), z(numNodes); - std::vector<double> *out = _data->incrementList(1, e->getType(), numNodes); + + Msg::Info("Writing %s", _fileName.c_str()); + FILE *fName = fopen(_fileName.c_str(),"w"); + fprintf(fName, "View \"distance \"{\n"); + + for (unsigned int ii=0; ii<_entities.size(); ii++) { + if (_entities[ii]->dim() == _maxDim) { + for (unsigned int i=0; i<_entities[ii]->getNumMeshElements(); i++) { + MElement *e = _entities[ii]->getMeshElement(i); + int numNodes = e->getNumVertices(); + if (e->getNumChildren()) + numNodes = e->getNumChildren() * e->getChild(0)->getNumVertices(); + std::vector<double> x(numNodes), y(numNodes), z(numNodes); + std::vector<double> *out = _data->incrementList(1, e->getType(), numNodes); std::vector<MVertex*> nods; - if(!e->getNumChildren()) + + if (!e->getNumChildren()) for(int i = 0; i < numNodes; i++) nods.push_back(e->getVertex(i)); else for(int i = 0; i < e->getNumChildren(); i++) for(int j = 0; j < e->getChild(i)->getNumVertices(); j++) nods.push_back(e->getChild(i)->getVertex(j)); - for(int nod = 0; nod < numNodes; nod++) out->push_back((nods[nod])->x()); - for(int nod = 0; nod < numNodes; nod++) out->push_back((nods[nod])->y()); - for(int nod = 0; nod < numNodes; nod++) out->push_back((nods[nod])->z()); - - if (_maxDim == 3) fprintf(fName,"SS("); - else if (_maxDim == 2) fprintf(fName,"ST("); - std::vector<double> dist; - for(int j = 0; j < numNodes; j++) { - MVertex *v = nods[j]; - if(j) fprintf(fName,",%.16g,%.16g,%.16g",v->x(),v->y(), v->z()); - else fprintf(fName,"%.16g,%.16g,%.16g", v->x(),v->y(), v->z()); - std::map<MVertex*, double>::iterator it = _distance_map.find(v); - dist.push_back(it->second); - } - fprintf(fName,"){"); - for (unsigned int i = 0; i < dist.size(); i++){ - if (_minScale > 0 && _maxScale > 0) - dist[i]=_minScale+((dist[i]-minDist)/(maxDist-minDist))*(_maxScale-_minScale); - else if (_minScale > 0 && _maxScale < 0) - dist[i]=_minScale+dist[i]; - out->push_back(dist[i]); - if (i) fprintf(fName,",%.16g", dist[i]); - else fprintf(fName,"%.16g", dist[i]); - } - fprintf(fName,"};\n"); + + for (int nod=0; nod<numNodes; nod++) out->push_back((nods[nod])->x()); + for (int nod=0; nod<numNodes; nod++) out->push_back((nods[nod])->y()); + for (int nod=0; nod<numNodes; nod++) out->push_back((nods[nod])->z()); + + if (_maxDim == 2) + switch (numNodes) { + case 2: fprintf(fName,"SL("); break; + case 3: fprintf(fName,"ST("); break; + case 4: fprintf(fName,"SQ("); break; + default: Msg::Error("Error in Plugin 'Distance' (numNodes=%d).",numNodes); break; + } + else if (_maxDim == 3) + switch (numNodes) { + case 4: fprintf(fName,"SS("); break; + case 8: fprintf(fName,"SH("); break; + case 6: fprintf(fName,"SI("); break; + case 5: fprintf(fName,"SY("); break; + default: Msg::Error("Error in Plugin 'Distance' (numNodes=%d).",numNodes); break; + } + + std::vector<double> dist; + for (int j=0; j<numNodes; j++) { + MVertex *v = nods[j]; + if (j) + fprintf(fName, ",%.16g,%.16g,%.16g", v->x(), v->y(), v->z()); + else + fprintf(fName, "%.16g,%.16g,%.16g", v->x(), v->y(), v->z()); + std::map<MVertex*, double>::iterator it = _distance_map.find(v); + dist.push_back(it->second); + } + + fprintf(fName,"){"); + for (unsigned int i=0; i<dist.size(); i++) { + if (_minScale>0 && _maxScale>0) + dist[i] = _minScale+((dist[i]-minDist)/(maxDist-minDist))*(_maxScale-_minScale); + else if (_minScale>0 && _maxScale<0) + dist[i] = _minScale+dist[i]; + out->push_back(dist[i]); + if (i) + fprintf(fName, ",%.16g", dist[i]); + else + fprintf(fName, "%.16g", dist[i]); + } + fprintf(fName,"};\n"); + } } } fprintf(fName,"};\n"); + fclose(fName); } PView *GMSH_DistancePlugin::execute(PView *v) { - int id_pt = (int) DistanceOptions_Number[0].def; - int id_line = (int) DistanceOptions_Number[1].def; - int id_face = (int) DistanceOptions_Number[2].def; - double type = (double) DistanceOptions_Number[3].def; - int ortho = (int) DistanceOptions_Number[6].def; - + int id_pt = (int) DistanceOptions_Number[0].def; + int id_line = (int) DistanceOptions_Number[1].def; + int id_face = (int) DistanceOptions_Number[2].def; + double type = (double) DistanceOptions_Number[3].def; + int ortho = (int) DistanceOptions_Number[6].def; + PView *view = new PView(); _data = getDataList(view); #if defined(HAVE_SOLVER) @@ -180,24 +203,23 @@ PView *GMSH_DistancePlugin::execute(PView *v) #endif dofManager<double> * dofView = new dofManager<double>(lsys); #endif - + std::vector<GEntity*> _entities; GModel::current()->getEntities(_entities); - if(!_entities.size() || !_entities[_entities.size()-1]->getMeshElement(0)){ + if (!_entities.size() || !_entities[_entities.size()-1]->getMeshElement(0)) { Msg::Error("This plugin needs a mesh !"); return view; } + GEntity* ge = _entities[_entities.size()-1]; - int integrationPointTetra[2]; - integrationPointTetra[0]=0; - integrationPointTetra[1]=0; - + int integrationPointTetra[2] = {0,0}; + int numnodes = 0; - for(unsigned int i = 0; i < _entities.size()-1; i++) + for (unsigned int i = 0; i < _entities.size()-1; i++) numnodes += _entities[i]->mesh_vertices.size(); - int totNodes=numnodes + _entities[_entities.size()-1]->mesh_vertices.size(); - int order=ge->getMeshElement(0)->getPolynomialOrder(); - int totNumNodes = totNodes+ge->getNumMeshElements()*integrationPointTetra[order-1]; + int totNodes = numnodes + _entities[_entities.size()-1]->mesh_vertices.size(); + int order = ge->getMeshElement(0)->getPolynomialOrder(); + int totNumNodes = totNodes + ge->getNumMeshElements()*integrationPointTetra[order-1]; std::vector<SPoint3> pts; std::vector<double> distances; @@ -208,98 +230,111 @@ PView *GMSH_DistancePlugin::execute(PView *v) pts.reserve(totNumNodes); distances.reserve(totNumNodes); pt2Vertex.reserve(totNumNodes); - + std::map<MVertex*,double> _distanceE_map; std::map<MVertex*,int> _isInYarn_map; std::vector<int> index; std::vector<double> distancesE; - std::vector<int> isInYarn; - std::vector<SPoint3> closePts; std::vector<double> distances2; std::vector<double> distancesE2; + std::vector<int> isInYarn; std::vector<int> isInYarn2; + std::vector<SPoint3> closePts; std::vector<SPoint3> closePts2; - - for (int i = 0; i < totNumNodes; i++) { + + for (int i=0; i<totNumNodes; i++) { distances.push_back(1.e22); } - + int k = 0; - for(unsigned int i = 0; i < _entities.size(); i++){ - GEntity* ge = _entities[i]; + for (unsigned int i=0; i<_entities.size(); i++){ + GEntity* ge = _entities[i]; _maxDim = std::max(_maxDim, ge->dim()); - for(unsigned int j = 0; j < ge->mesh_vertices.size(); j++){ + for (unsigned int j=0; j<ge->mesh_vertices.size(); j++) { MVertex *v = ge->mesh_vertices[j]; - pts.push_back(SPoint3(v->x(), v->y(),v->z())); + pts.push_back(SPoint3(v->x(), v->y(), v->z())); _distance_map.insert(std::make_pair(v, 0.0)); +/* TO DO (by AM) + SPoint3 p_empty(); + _closePts_map.insert(std::make_pair(v, p_empty)); +*/ pt2Vertex[k] = v; k++; } } - + // Compute geometrical distance to mesh boundaries //------------------------------------------------------ - if (type < 0.0 ){ - + if (type < 0.0 ) { + bool existEntity = false; - for(unsigned int i = 0; i < _entities.size(); i++){ + + for (unsigned int i=0; i<_entities.size(); i++) { GEntity* g2 = _entities[i]; int tag = g2->tag(); int gDim = g2->dim(); std::vector<int> phys = g2->getPhysicalEntities(); bool computeForEntity = false; - for(int k = 0; k< phys.size(); k++){ - int tagp = phys[k]; - if (id_pt==0 && id_line==0 && id_face==0 && gDim==_maxDim-1 ) - computeForEntity = true; - else if ( (tagp==id_pt && gDim==0)|| (tagp==id_line && gDim==1) || (tagp==id_face && gDim==2) ) - computeForEntity = true; + for(int k = 0; k<phys.size(); k++) { + int tagp = phys[k]; + if (id_pt==0 && id_line==0 && id_face==0 && gDim==_maxDim-1 ) + computeForEntity = true; + else if ( (tagp==id_pt && gDim==0) || (tagp==id_line && gDim==1) || (tagp==id_face && gDim==2) ) + computeForEntity = true; } - if (computeForEntity){ - existEntity = true; - for(unsigned int k = 0; k < g2->getNumMeshElements(); k++){ - std::vector<double> iDistances; - std::vector<SPoint3> iClosePts; + if (computeForEntity) { + existEntity = true; + for (unsigned int k=0; k<g2->getNumMeshElements(); k++) { + std::vector<double> iDistances; + std::vector<SPoint3> iClosePts; std::vector<double> iDistancesE; std::vector<int> iIsInYarn; - MElement *e = g2->getMeshElement(k); - MVertex *v1 = e->getVertex(0); - MVertex *v2 = e->getVertex(1); - SPoint3 p1(v1->x(), v1->y(), v1->z()); - SPoint3 p2(v2->x(), v2->y(), v2->z()); - if((e->getNumVertices() == 2 && order==1) || (e->getNumVertices() == 3 && order==2)){ - signedDistancesPointsLine(iDistances, iClosePts, pts, p1,p2); - } - else if((e->getNumVertices() == 3 && order == 1) || (e->getNumVertices() == 6 && order==2)){ - MVertex *v3 = e->getVertex(2); - SPoint3 p3 (v3->x(),v3->y(),v3->z()); - signedDistancesPointsTriangle(iDistances, iClosePts, pts, p1, p2, p3); - } - for (unsigned int kk = 0; kk< pts.size(); kk++) { - if (std::abs(iDistances[kk]) < distances[kk]){ - distances[kk] = std::abs(iDistances[kk]); - MVertex *v = pt2Vertex[kk]; - _distance_map[v] = distances[kk]; + MElement *e = g2->getMeshElement(k); + MVertex *v1 = e->getVertex(0); + MVertex *v2 = e->getVertex(1); + SPoint3 p1(v1->x(), v1->y(), v1->z()); + SPoint3 p2(v2->x(), v2->y(), v2->z()); + if ((e->getNumVertices() == 2 && order==1) || (e->getNumVertices() == 3 && order==2)) { + signedDistancesPointsLine(iDistances, iClosePts, pts, p1,p2); + } + else if ((e->getNumVertices() == 3 && order == 1) || (e->getNumVertices() == 6 && order==2)) { + MVertex *v3 = e->getVertex(2); + SPoint3 p3 (v3->x(),v3->y(),v3->z()); + signedDistancesPointsTriangle(iDistances, iClosePts, pts, p1, p2, p3); + } + for (unsigned int kk=0; kk<pts.size(); kk++) { + if (std::abs(iDistances[kk]) < distances[kk]) { + distances[kk] = std::abs(iDistances[kk]); + MVertex *v = pt2Vertex[kk]; + _distance_map[v] = distances[kk]; +/* TO DO (by AM) + _closePts_map[v] = iClosePts[kk]; +*/ } - } - } + } + } } } if (!existEntity){ - if (id_pt != 0) Msg::Error("The Physical Point does not exist !"); + if (id_pt != 0) Msg::Error("The Physical Point does not exist !"); if (id_line != 0) Msg::Error("The Physical Line does not exist !"); if (id_face != 0) Msg::Error("The Physical Surface does not exist !"); return view; } - printView(_entities, _distance_map); + + printView(_entities, _distance_map); + +/* TO DO (by AM) + printView(_entities, _closePts_map); +*/ } - + // Compute PDE for distance function //----------------------------------- - else if (type > 0.0){ - + else if (type > 0.0) { + #if defined(HAVE_SOLVER) - + bool existEntity = false; SBoundingBox3d bbox; for(unsigned int i = 0; i < _entities.size(); i++){ @@ -308,65 +343,65 @@ PView *GMSH_DistancePlugin::execute(PView *v) int gDim = ge->dim(); bool fixForEntity = false; std::vector<int> phys = ge->getPhysicalEntities(); - for(int k = 0; k< phys.size(); k++){ - int tagp = phys[k]; - if (id_pt==0 && id_line==0 && id_face==0 && gDim==_maxDim-1 ) - fixForEntity = true; - else if ( (tagp==id_pt && gDim==0)|| (tagp==id_line && gDim==1) || (tagp==id_face && gDim==2) ) - fixForEntity = true; + for(int k=0; k<phys.size(); k++) { + int tagp = phys[k]; + if (id_pt==0 && id_line==0 && id_face==0 && gDim==_maxDim-1 ) + fixForEntity = true; + else if ( (tagp==id_pt && gDim==0) || (tagp==id_line && gDim==1) || (tagp==id_face && gDim==2) ) + fixForEntity = true; } - if (fixForEntity){ - existEntity = true; - for(unsigned int i = 0; i < ge->getNumMeshElements(); ++i){ - MElement *t = ge->getMeshElement(i); - for(int k = 0; k < t->getNumVertices(); k++){ - MVertex *v = t->getVertex(k); - dofView->fixVertex(v, 0, 1, 0.0); - bbox += SPoint3(v->x(),v->y(),v->z()); - } - } + if (fixForEntity) { + existEntity = true; + for (unsigned int i=0; i<ge->getNumMeshElements(); ++i) { + MElement *t = ge->getMeshElement(i); + for (int k=0; k<t->getNumVertices(); k++) { + MVertex *v = t->getVertex(k); + dofView->fixVertex(v, 0, 1, 0.); + bbox += SPoint3(v->x(), v->y(), v->z()); + } + } } } + if (!existEntity){ - if (id_pt != 0) Msg::Error("The Physical Point does not exist !"); + if (id_pt != 0) Msg::Error("The Physical Point does not exist !"); if (id_line != 0) Msg::Error("The Physical Line does not exist !"); if (id_face != 0) Msg::Error("The Physical Surface does not exist !"); return view; } - + std::vector<MElement *> allElems; - for(unsigned int ii = 0; ii < _entities.size(); ii++){ + for(unsigned int ii=0; ii<_entities.size(); ii++){ if(_entities[ii]->dim() == _maxDim) { - GEntity *ge = _entities[ii]; - for(unsigned int i = 0; i < ge->getNumMeshElements(); ++i){ - MElement *t = ge->getMeshElement(i); - allElems.push_back(t); - for(int k = 0; k < t->getNumVertices(); k++){ - dofView->numberVertex(t->getVertex(k), 0, 1); - } - } - } + GEntity *ge = _entities[ii]; + for(unsigned int i=0; i<ge->getNumMeshElements(); ++i) { + MElement *t = ge->getMeshElement(i); + allElems.push_back(t); + for (int k=0; k<t->getNumVertices(); k++) + dofView->numberVertex(t->getVertex(k), 0, 1); + } + } } - + double L = norm(SVector3(bbox.max(), bbox.min())); double mu = type*L; - + simpleFunction<double> DIFF(mu*mu), ONE(1.0); distanceTerm distance(GModel::current(), 1, &DIFF, &ONE); - + for (std::vector<MElement* >::iterator it = allElems.begin(); it != allElems.end(); it++){ SElement se((*it)); distance.addToMatrix(*dofView, &se); } groupOfElements gr(allElems); distance.addToRightHandSide(*dofView, gr); - + Msg::Info("Distance Computation: Assembly done"); lsys->systemSolve(); Msg::Info("Distance Computation: System solved"); - - for(std::map<MVertex*,double >::iterator itv = _distance_map.begin(); - itv != _distance_map.end() ; ++itv){ + + for (std::map<MVertex*,double >::iterator itv = _distance_map.begin(); + itv != _distance_map.end() ; ++itv) { MVertex *v = itv->first; double value; dofView->getDofValue(v, 0, 1, value); @@ -374,12 +409,12 @@ PView *GMSH_DistancePlugin::execute(PView *v) double dist = -mu * log(1. - value); itv->second = dist; } - + printView(_entities, _distance_map); - + #endif } - + _data->setName("distance"); _data->Time.push_back(0); _data->setFileName(_fileName.c_str()); @@ -389,112 +424,135 @@ PView *GMSH_DistancePlugin::execute(PView *v) //compute also orthogonal vector to distance field // A Uortho = -C DIST //------------------------------------------------ - if (ortho > 0){ + if (ortho > 0) { #if defined(HAVE_SOLVER) #ifdef HAVE_TAUCS - linearSystemCSRTaucs<double> *lsys2 = new linearSystemCSRTaucs<double>; + linearSystemCSRTaucs<double> *lsys2 = new linearSystemCSRTaucs<double>; #else - linearSystemCSRGmm<double> *lsys2 = new linearSystemCSRGmm<double>; - lsys->setNoisy(1); - lsys->setGmres(1); - lsys->setPrec(5.e-8); + linearSystemCSRGmm<double> *lsys2 = new linearSystemCSRGmm<double>; + lsys->setNoisy(1); + lsys->setGmres(1); + lsys->setPrec(5.e-8); #endif - dofManager<double> myAssembler(lsys2); - simpleFunction<double> ONE(1.0); - - double dMax = 1.0; //EMI TO CHANGE - - std::vector<MElement *> allElems; - for(unsigned int ii = 0; ii < _entities.size(); ii++){ - if(_entities[ii]->dim() == _maxDim) { - GEntity *ge = _entities[ii]; - for(unsigned int i = 0; i < ge->getNumMeshElements(); ++i){ - MElement *t = ge->getMeshElement(i); - double vMean = 0.0; - for(int k = 0; k < t->getNumVertices(); k++){ - std::map<MVertex*, double>::iterator it = _distance_map.find(t->getVertex(k)); - vMean += it->second; - } - vMean/=t->getNumVertices(); - if (vMean < dMax) - allElems.push_back(ge->getMeshElement(i)); + dofManager<double> myAssembler(lsys2); + simpleFunction<double> ONE(1.0); + + double dMax = 1.0; //EMI TO CHANGE + + std::vector<MElement *> allElems; + for(unsigned int ii = 0; ii < _entities.size(); ii++){ + if (_entities[ii]->dim() == _maxDim) { + GEntity *ge = _entities[ii]; + for (unsigned int i=0; i<ge->getNumMeshElements(); ++i) { + MElement *t = ge->getMeshElement(i); + double vMean = 0.0; + for (int k=0; k<t->getNumVertices(); k++) { + std::map<MVertex*, double>::iterator it = _distance_map.find(t->getVertex(k)); + vMean += it->second; + } + vMean/=t->getNumVertices(); + if (vMean < dMax) + allElems.push_back(ge->getMeshElement(i)); + } } + } + + int mid = (int)floor(allElems.size() / 2.); + MElement *e = allElems[mid]; + MVertex *vFIX = e->getVertex(0); + myAssembler.fixVertex(vFIX, 0, 1, 0.0); + + for (std::vector<MElement* >::iterator it = allElems.begin(); it != allElems.end(); it++){ + MElement *t = *it; + for(int k = 0; k < t->getNumVertices(); k++) + myAssembler.numberVertex(t->getVertex(k), 0, 1); } - } - int mid = (int)floor(allElems.size() / 2.); - MElement *e = allElems[mid]; - MVertex *vFIX = e->getVertex(0); - myAssembler.fixVertex(vFIX, 0, 1, 0.0); - - for (std::vector<MElement* >::iterator it = allElems.begin(); it != allElems.end(); it++){ - MElement *t = *it; - for(int k = 0; k < t->getNumVertices(); k++) - myAssembler.numberVertex(t->getVertex(k), 0, 1); - } - - orthogonalTerm *ortho; - ortho = new orthogonalTerm(GModel::current(), 1, &ONE, &_distance_map); - // if (type < 0) - // ortho = new orthogonalTerm(GModel::current(), 1, &ONE, view); - // else - // ortho = new orthogonalTerm(GModel::current(), 1, &ONE, dofView); - - for (std::vector<MElement* >::iterator it = allElems.begin(); it != allElems.end(); it++){ - SElement se((*it)); - ortho->addToMatrix(myAssembler, &se); - } - groupOfElements gr(allElems); - ortho->addToRightHandSide(myAssembler, gr); - - Msg::Info("Orthogonal Computation: Assembly done"); - lsys2->systemSolve(); - Msg::Info("Orthogonal Computation: System solved"); - - PView *view2 = new PView(); - PViewDataList *data2 = getDataList(view2); - data2->setName("ortogonal field"); - - Msg::Info("Writing orthogonal.pos"); - FILE * f5 = fopen("orthogonal.pos","w"); - fprintf(f5,"View \"orthogonal\"{\n"); - for (std::vector<MElement* >::iterator it = allElems.begin(); it != allElems.end(); it++){ - MElement *e = *it; - + + orthogonalTerm *ortho; + ortho = new orthogonalTerm(GModel::current(), 1, &ONE, &_distance_map); + // if (type < 0) + // ortho = new orthogonalTerm(GModel::current(), 1, &ONE, view); + // else + // ortho = new orthogonalTerm(GModel::current(), 1, &ONE, dofView); + + for (std::vector<MElement* >::iterator it = allElems.begin(); it != allElems.end(); it++){ + SElement se((*it)); + ortho->addToMatrix(myAssembler, &se); + } + groupOfElements gr(allElems); + ortho->addToRightHandSide(myAssembler, gr); + + Msg::Info("Orthogonal Computation: Assembly done"); + lsys2->systemSolve(); + Msg::Info("Orthogonal Computation: System solved"); + + PView *view2 = new PView(); + PViewDataList *data2 = getDataList(view2); + data2->setName("ortogonal field"); + + Msg::Info("Writing orthogonal.pos"); + FILE * f5 = fopen("orthogonal.pos","w"); + fprintf(f5,"View \"orthogonal\"{\n"); + for (std::vector<MElement* >::iterator it = allElems.begin(); it != allElems.end(); it++){ + MElement *e = *it; + int numNodes = e->getNumVertices(); - if(e->getType() == TYPE_POLYG) numNodes = e->getNumChildren() * e->getChild(0)->getNumVertices(); + if (e->getType() == TYPE_POLYG) + numNodes = e->getNumChildren() * e->getChild(0)->getNumVertices(); std::vector<double> x(numNodes), y(numNodes), z(numNodes); std::vector<double> *out2 = data2->incrementList(1, e->getType(), numNodes); std::vector<MVertex*> nods; + std::vector<double> orth; + if(!e->getNumChildren()) - for(int i = 0; i < numNodes; i++) + for(int i=0; i<numNodes; i++) nods.push_back(e->getVertex(i)); else for(int i = 0; i < e->getNumChildren(); i++) for(int j = 0; j < e->getChild(i)->getNumVertices(); j++) nods.push_back(e->getChild(i)->getVertex(j)); + for(int nod = 0; nod < numNodes; nod++) out2->push_back((nods[nod])->x()); for(int nod = 0; nod < numNodes; nod++) out2->push_back((nods[nod])->y()); for(int nod = 0; nod < numNodes; nod++) out2->push_back((nods[nod])->z()); - - if (_maxDim == 3) fprintf(f5,"SS("); - else if (_maxDim == 2) fprintf(f5,"ST("); - std::vector<double> orth; - for(int j = 0; j < numNodes; j++) { + + if (_maxDim == 2) + switch (numNodes) { + case 2: fprintf(f5,"SL("); break; + case 3: fprintf(f5,"ST("); break; + case 4: fprintf(f5,"SQ("); break; + default: Msg::Fatal("Error in Plugin 'Distance' (numNodes=%g).",numNodes); break; + } + else if (_maxDim == 3) + switch (numNodes) { + case 4: fprintf(f5,"SS("); break; + case 8: fprintf(f5,"SH("); break; + case 6: fprintf(f5,"SI("); break; + case 5: fprintf(f5,"SY("); break; + default: Msg::Fatal("Error in Plugin 'Distance' (numNodes=%g).",numNodes); break; + } + + for (int j=0; j<numNodes; j++) { MVertex *v = nods[j]; - if(j) fprintf(f5,",%g,%g,%g",v->x(),v->y(), v->z()); - else fprintf(f5,"%g,%g,%g", v->x(),v->y(), v->z()); + if (j) + fprintf(f5, ",%g,%g,%g", v->x(), v->y(), v->z()); + else + fprintf(f5, "%g,%g,%g", v->x(), v->y(), v->z()); double value; - myAssembler.getDofValue(v, 0, 1, value ); + myAssembler.getDofValue(v, 0, 1, value); orth.push_back(value); } fprintf(f5,"){"); - for (unsigned int i = 0; i < orth.size(); i++){ + for (unsigned int i=0; i<orth.size(); i++) { out2->push_back(orth[i]); - if (i) fprintf(f5,",%g", orth[i]); - else fprintf(f5,"%g", orth[i]); + if (i) + fprintf(f5,",%g", orth[i]); + else + fprintf(f5,"%g", orth[i]); } fprintf(f5,"};\n"); + } fprintf(f5,"};\n"); fclose(f5); diff --git a/Plugin/Distance.h b/Plugin/Distance.h index f35cb34e072103cbad2fe237bd419721936d0142..0a8f18a72c836ceed339052a05814bba8b8c9415 100644 --- a/Plugin/Distance.h +++ b/Plugin/Distance.h @@ -25,6 +25,7 @@ class GMSH_DistancePlugin : public GMSH_PostPlugin PViewDataList *_data; public: std::map<MVertex*,double > _distance_map; + std::map<MVertex*,SPoint3 > _closePts_map; GMSH_DistancePlugin(); std::string getName() const { return "Distance"; } std::string getShortHelp() const