double BGMBase::get_nodal_value(const MVertex *v, const DoubleStorageType &data) const { DoubleStorageType::const_iterator itfind = data.find(v); if(itfind == data.end()) { Msg::Error("Unknown vertex %d in BGMBase::get_nodal_value", v->getNum()); return 0.; } return itfind->second; }
void backgroundMesh2D::computeSizeField() { GFace *face = dynamic_cast<GFace*>(gf); if(!face) { Msg::Error("Entity is not a face in background mesh"); return; } list<GEdge*> e; replaceMeshCompound(face, e); list<GEdge*>::const_iterator it = e.begin(); DoubleStorageType sizes; for( ; it != e.end(); ++it ) { if (!(*it)->isSeam(face)) { for(unsigned int i = 0; i < (*it)->lines.size(); i++ ) { MVertex *v1 = (*it)->lines[i]->getVertex(0); MVertex *v2 = (*it)->lines[i]->getVertex(1); if (v1 != v2) { double d = sqrt((v1->x() - v2->x()) * (v1->x() - v2->x()) + (v1->y() - v2->y()) * (v1->y() - v2->y()) + (v1->z() - v2->z()) * (v1->z() -v2->z())); for (int k=0; k<2; k++) { MVertex *v = (*it)->lines[i]->getVertex(k); DoubleStorageType::iterator itv = sizes.find(v); if (itv == sizes.end()) sizes[v] = log(d); else itv->second = 0.5 * (itv->second + log(d)); } } } } } simpleFunction<double> ONE(1.0); propagateValues(sizes,ONE); std::map<MVertex*,MVertex*>::iterator itv2 = _2Dto3D.begin(); for ( ; itv2 != _2Dto3D.end(); ++itv2) { MVertex *v_2D = itv2->first; MVertex *v_3D = itv2->second; sizeField[v_2D] = exp(sizes[v_3D]); } }
void backgroundMesh2D::propagateValues(DoubleStorageType &dirichlet, simpleFunction<double> &eval_diffusivity, bool in_parametric_plane) { #if defined(HAVE_SOLVER) linearSystem<double> *_lsys = 0; #if defined(HAVE_PETSC) && !defined(HAVE_TAUCS) _lsys = new linearSystemPETSc<double>; #elif defined(HAVE_GMM) && !defined(HAVE_TAUCS) linearSystemGmm<double> *_lsysb = new linearSystemGmm<double>; _lsysb->setGmres(1); _lsys = _lsysb; #elif defined(HAVE_TAUCS) _lsys = new linearSystemCSRTaucs<double>; #else _lsys = new linearSystemFull<double>; #endif dofManager<double> myAssembler(_lsys); // fix boundary conditions DoubleStorageType::iterator itv = dirichlet.begin(); for ( ; itv != dirichlet.end(); ++itv) { myAssembler.fixVertex(itv->first, 0, 1, itv->second); } // Number vertices std::set<MVertex*> vs; GFace *face = dynamic_cast<GFace*>(gf); if(!face) { Msg::Error("Entity is not a face in background mesh"); delete _lsys; return; } for (unsigned int k = 0; k < face->triangles.size(); k++) for (int j=0; j<3; j++)vs.insert(face->triangles[k]->getVertex(j)); for (unsigned int k = 0; k < face->quadrangles.size(); k++) for (int j=0; j<4; j++)vs.insert(face->quadrangles[k]->getVertex(j)); std::map<MVertex*,SPoint3> theMap; if ( in_parametric_plane) { for (std::set<MVertex*>::iterator it = vs.begin(); it != vs.end(); ++it) { SPoint2 p; reparamMeshVertexOnFace ( *it, face, p); theMap[*it] = SPoint3((*it)->x(),(*it)->y(),(*it)->z()); (*it)->setXYZ(p.x(),p.y(),0.0); } } for (std::set<MVertex*>::iterator it = vs.begin(); it != vs.end(); ++it) myAssembler.numberVertex(*it, 0, 1); // Assemble laplaceTerm l(0, 1, &eval_diffusivity); for (unsigned int k = 0; k < face->triangles.size(); k++) { MTriangle *t = face->triangles[k]; SElement se(t); l.addToMatrix(myAssembler, &se); } // Solve if (myAssembler.sizeOfR()) { _lsys->systemSolve(); } // save solution for (std::set<MVertex*>::iterator it = vs.begin(); it != vs.end(); ++it) { myAssembler.getDofValue(*it, 0, 1, dirichlet[*it]); } if ( in_parametric_plane) { for (std::set<MVertex*>::iterator it = vs.begin(); it != vs.end(); ++it) { SPoint3 p = theMap[(*it)]; (*it)->setXYZ(p.x(),p.y(),p.z()); } } delete _lsys; #endif }