Пример #1
0
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;
}
Пример #2
0
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]);
    }
}
Пример #3
0
std::vector<double>
BGMBase::get_nodal_values(const MElement *element,
                          const DoubleStorageType &data) const
{
  std::vector<double> res(element->getNumVertices(), 0.);

  for(std::size_t i = 0; i < element->getNumVertices(); i++)
    // res[i] = (data.find(const_cast<MVertex*>(e->getVertex(i))))->second;
    res[i] = data.find(element->getVertex(i))->second;
  return res;
}
Пример #4
0
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
}