I found this problem in my own program. Here is the test code example:

int main(int argc, char** argv)
{
  LibMeshInit init(argc, argv);

  UnstructuredMesh *mesh;
  ExodusII_IO *exio;
  EquationSystems *eqsys;
  System *asys;
  libMesh::PointLocatorTree *locator;

  mesh = new Mesh(init.comm());
  exio = new ExodusII_IO(*mesh);
  locator = new PointLocatorTree(*mesh);
  exio->read("res.e");
  mesh->allow_renumbering(false);
  mesh->prepare_for_use();

  float pt[3] = {0, 0, 0};
  for (int i=0; i<20; i++)
  {
    Point p(pt[0]+(float)i/100., pt[1]+(float)i/100., pt[2]+(float)i/100.);

    const Elem *e = (*locator)(p); // it takes much time (at least 1s or even 
100s)

    if (e != NULL) fprintf(stderr, "point locate cell: %d\n", e->id());
    else fprintf(stderr, "locate NULL\n");
  }

  return 0;
}

I just selected 20 points and located the cells they were in. The locator took 
much time every time. 
The points can be found in elements when executing. But when enabling 
_out_of_mesh_mode, the elements can not be located. 
So It seems that the locator always falls into perform_linear_search 
<http://libmesh.github.io/doxygen/classlibMesh_1_1PointLocatorTree.html#acd313428c9a4551d7e1aaa141e7ae8e7>
 function when executing operator() 
<http://libmesh.github.io/doxygen/classlibMesh_1_1PointLocatorTree.html#a08990e437871fc26e3043806aef8dfaa>.
 

> On Jun 23, 2016, at 5:42 PM, John Peterson <[email protected]> wrote:
> 
> 
> 
> On Thu, Jun 23, 2016 at 4:23 PM, 张江 <[email protected] 
> <mailto:[email protected]>> wrote:
> Hi,
> 
> I am using libmesh to read a large unstructured grid data. The mesh info is 
> below:
> 
> Mesh Information:
>   elem_dimensions()={3}
>   spatial_dimension()=1
>   n_nodes()=67855938
>     n_local_nodes()=0
>   n_elem()=181423412
>     n_local_elem()=0
>     n_active_elem()=181423412
>   n_subdomains()=0
>   n_partitions()=1
>   n_processors()=1
>   n_threads()=1
>   processor_id()=0
> 
> I found that when locating a point by PointLocatorTree, it always took much 
> time (about 50s or even more).
> 
> How many points did you look for?  The cost to initially build the 
> PointLocator is expensive, but it's amortized by the fact that you can use it 
> multiple times once it's built... 
> 
>  
> It seems that the locator always falls into perform_linear_search 
> <http://libmesh.github.io/doxygen/classlibMesh_1_1PointLocatorTree.html#acd313428c9a4551d7e1aaa141e7ae8e7
>  
> <http://libmesh.github.io/doxygen/classlibMesh_1_1PointLocatorTree.html#acd313428c9a4551d7e1aaa141e7ae8e7>>
>  function when executing operator()
> 
> It "seems"?  The linear search should only happen if the point fails to be 
> found.  If the point is not being found in any element, you should look into 
> why that happens first...
> 
> -- 
> John

------------------------------------------------------------------------------
Attend Shape: An AT&T Tech Expo July 15-16. Meet us at AT&T Park in San
Francisco, CA to explore cutting-edge tech and listen to tech luminaries
present their vision of the future. This family event has something for
everyone, including kids. Get more information and register today.
http://sdm.link/attshape
_______________________________________________
Libmesh-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libmesh-users

Reply via email to