Hi Walter, My first impression is that it looks like you might indeed be setting the mesh field value using the mesh coordinates.
It's a little difficult to debug without an actual runnable program or the pos file that shows everything is OK. Would you mind sharing your program and pos file? Sincerely, Max On Sun, Nov 17, 2019 at 4:49 AM walter steffe <[email protected]> wrote: > > Hello everyone, I am still experimenting with adaptive meshing and I > wanted to set a background field based on a PView. > I have build the view and related background field with the following code: > > > //sf_ele, and getKeysValues are the same as in > gmsh-4.4.1-source/demos/api/adapt_mesh.cpp > getKeysValues(sf_ele, keys, values); > > > int viewTag = gmsh::view::add("mesh size"); > > const std::vector<double> listdata; > int nelem=keys.size(); > for(int i=0; i<nelem ; i++){ > int etag=keys[i]; > for(int j=0; j<mesh.elements()[etag]->nodesNum(); j++) > listdata.push_back(mesh.elements()[etag]->nodes()[j]->x()); > for(int j=0; j<mesh.elements()[etag]->nodesNum(); j++) > listdata.push_back(mesh.elements()[etag]->nodes()[j]->y()); > for(int j=0; j<mesh.elements()[etag]->nodesNum(); j++) > listdata.push_back(mesh.elements()[etag]->nodes()[j]->z()); > listdata.insert(listdata.end(),values[i].begin(),values[i].end()); > } > gmsh::view::addListData(viewTag, "SS", nelem, listdata); > > > // just to check the data: > gmsh::view::write(viewTag, "data.pos"); > // It seems OK > > ... > > GModel *gm0=new GModel(); > #importing of OCC geometry ... > > ... > > > FieldManager *fields = gm->getFields(); > int fieldTag=1; > Field *size_f=fields->newField(fieldTag, "PostView"); > size_f->options["ViewTag"]->numericalValue(viewTag); > fields->setBackgroundFieldId(fieldTag); > > > gm->mesh(1); > gm->mesh(2); > gm->mesh(3); > > > The problem is that the field computed in BGM_MeshSize is WRONG. > > Following lines are taken from BackgroundMeshTools.cpp: > > double BGM_MeshSize(GEntity *ge, double U, double V, double X, double Y, > double Z) > { > .... > // lc from fields > double l4 = MAX_LC; > if(ge){ > FieldManager *fields = ge->model()->getFields(); > if(fields->getBackgroundField() > 0) { > Field *f = fields->get(fields->getBackgroundField()); > if(f) l4 = (*f)(X, Y, Z, ge); > } > } > > .. > } > > > I have debugged the code going inside of that computation and I have > found that, quite often, it happens that > the value returned by (*f)(X, Y, Z, ge) coincides with the coordinate > (x,y,or z) of a vertex used in the view data. > > This could be produced by a wrong ordering of data passed to > gmsh::view::addListData. > But the data file printed by gmsh::view::write(viewTag, "data.pos") > seems good and the values are not exchanged with > the coordinates. > > So I do not understand where is the problem. May you please give me a > hint ? > > > Thanks in advance, > Walter Steffè > > > > > > > > > > > _______________________________________________ > gmsh mailing list > [email protected] > http://onelab.info/mailman/listinfo/gmsh > -- Max Orok Contractor www.mevex.com
_______________________________________________ gmsh mailing list [email protected] http://onelab.info/mailman/listinfo/gmsh
