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