I'm doing some domain decomposition stuff, and I want to "stitch" 
distinct (conforming) meshes together into a single global mesh. The 
first step is to implement a "mesh union" operation, and I'll deal with 
merging "overlapping" nodes afterwards.

To do this, I wrote a function build_mesh_union, which is pasted below. 
Worth adding to MeshTools, or somewhere like that?

David

------------------------------------------------------------------------------


AutoPtr<MeshBase> build_mesh_union(std::vector<MeshBase*>& meshes)
{
   MeshBase* mesh_union;

   for(unsigned int i=0; i<meshes.size(); i++)
   {

     if(i==0)
     {
       // Need to initialize mesh_union on the first iteration
       AutoPtr<MeshBase> mesh_clone = meshes[0]->clone();
       mesh_union = mesh_clone.release();
     }
     else
     {
       MeshBase& mesh_i = *meshes[i];
       unsigned int node_delta = mesh_union->n_nodes();
       unsigned int elem_delta = mesh_union->n_elem();

       // need to increment node and element IDs of mesh_i before 
copying to mesh_union
       MeshBase::node_iterator node_it  = mesh_i.nodes_begin();
       MeshBase::node_iterator node_end = mesh_i.nodes_end();
       for (; node_it != node_end; ++node_it)
       {
         Node *node = *node_it;
         unsigned int new_id = node->id() + node_delta;
         node->set_id(new_id);
       }

       MeshBase::element_iterator elem_it  = mesh_i.elements_begin();
       MeshBase::element_iterator elem_end = mesh_i.elements_end();
       for (; elem_it != elem_end; ++elem_it)
       {
         Elem *elem = *elem_it;
         unsigned int new_id = elem->id() + elem_delta;
         elem->set_id(new_id);
       }

       // Copy mesh data
       UnstructuredMesh& mesh_union_unstructured = 
libmesh_cast_ref<UnstructuredMesh&>(*mesh_union);
       UnstructuredMesh& mesh_i_unstructured     = 
libmesh_cast_ref<UnstructuredMesh&>(mesh_i);
mesh_union_unstructured.copy_nodes_and_elements(mesh_i_unstructured);

       // then decrement node and element IDs of mesh_i to return to 
original state
       node_it  = mesh_i.nodes_begin();
       node_end = mesh_i.nodes_end();
       for (; node_it != node_end; ++node_it)
       {
         Node *node = *node_it;
         unsigned int new_id = node->id() - node_delta;
         node->set_id(new_id);
       }

       elem_it  = mesh_i.elements_begin();
       elem_end = mesh_i.elements_end();
       for (; elem_it != elem_end; ++elem_it)
       {
         Elem *elem = *elem_it;
         unsigned int new_id = elem->id() - elem_delta;
         elem->set_id(new_id);
       }
     }
   }

   return AutoPtr<MeshBase>(mesh_union);
}


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Libmesh-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libmesh-users

Reply via email to