[MOAB-dev] commit/MOAB: iulian07: add a new method of merging with a tag

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Mon Jul 14 16:10:12 CDT 2014


1 new commit in MOAB:

https://bitbucket.org/fathomteam/moab/commits/90aa282ddaf9/
Changeset:   90aa282ddaf9
Branch:      iulian07/merge_with_tag
User:        iulian07
Date:        2014-07-14 23:03:41
Summary:     add a new method of merging with a tag

in the classic method of merging, the vertices on the skin are merged first, using
a kd tree
after vertices are identified to be in close proximity, they are merged.

In this new method, vertices are merged if a tag has the same values
It will be used in the example that generates large mesh

Affected #:  2 files

diff --git a/src/MergeMesh.cpp b/src/MergeMesh.cpp
index cb43b85..62b0022 100644
--- a/src/MergeMesh.cpp
+++ b/src/MergeMesh.cpp
@@ -139,7 +139,79 @@ ErrorCode MergeMesh::perform_merge(Tag merge_tag)
   result = mbImpl->delete_entities(deadEnts);
   return result;
 }
+// merge vertices according to an input tag
+// merge them if the tags are equal
+struct handle_id
+{
+  EntityHandle eh;
+  int val;
+};
+
+// handle structure comparison function for qsort
+// if the id is the same , compare the handle.
+bool compare_handle_id(handle_id ia, handle_id ib) {
+
+  if(ia.val == ib.val) {
+    return ia.eh<ia.eh;
+  } else {
+    return ia.val<ib.val;
+  }
+}
+
+ErrorCode MergeMesh::merge_using_integer_tag(Range & verts, Tag user_tag, Tag merge_tag)
+{
+  ErrorCode rval;
+  DataType tag_type;
+  rval = mbImpl->tag_get_data_type(user_tag, tag_type);
+  if (rval!=MB_SUCCESS || tag_type!=MB_TYPE_INTEGER)
+    return MB_FAILURE;
 
+  std::vector<int> vals(verts.size());
+  rval = mbImpl->tag_get_data(user_tag, verts, &vals[0]);
+  if (rval!=MB_SUCCESS)
+    return rval;
+
+  if (0 == merge_tag)
+  {
+    EntityHandle def_val = 0;
+    rval = mbImpl->tag_get_handle("__merge_tag", 1, MB_TYPE_HANDLE, mbMergeTag,
+        MB_TAG_DENSE | MB_TAG_EXCL, &def_val);
+    if (MB_SUCCESS != rval)
+      return rval;
+  }
+  else
+    mbMergeTag = merge_tag;
+
+  std::vector<handle_id>  handles(verts.size());
+  int i=0;
+  for (Range::iterator vit = verts.begin(); vit!= verts.end(); vit++ )
+  {
+    handles[i].eh=*vit;
+    handles[i].val = vals[i];
+    i++;
+  }
+  std::sort(handles.begin(), handles.end(), compare_handle_id);
+
+  i=0;
+  while (i<(int)verts.size()-1)
+  {
+    handle_id  first = handles[i];
+    int j=i+1;
+    while (handles[j].val == first.val && j<(int)verts.size())
+    {
+      rval= mbImpl->tag_set_data(mbMergeTag, &(handles[j].eh), 1, &(first.eh));
+      if (rval!=MB_SUCCESS)
+        return rval;
+      deadEnts.insert(handles[j].eh);
+      j++;
+    }
+    i=j;
+  }
+
+  rval = perform_merge(mbMergeTag);
+
+  return rval;
+}
 ErrorCode MergeMesh::find_merged_to(EntityHandle &tree_root,
     AdaptiveKDTree &tree, Tag merge_tag)
 {

diff --git a/src/moab/MergeMesh.hpp b/src/moab/MergeMesh.hpp
index 8eef9a8..8f4d5bc 100644
--- a/src/moab/MergeMesh.hpp
+++ b/src/moab/MergeMesh.hpp
@@ -32,6 +32,9 @@ public:
   //Identify higher dimension to be merged
   ErrorCode merge_higher_dimensions(Range &elems);
 
+  // merge vertices according to an input tag
+  ErrorCode merge_using_integer_tag(Range & verts, Tag user_tag, Tag merge_tag=0);
+
   //- perform the actual merge
   ErrorCode perform_merge(Tag merged_to);
 private:
@@ -39,8 +42,6 @@ private:
 
   double mergeTol, mergeTolSq;
 
-  Tag mergeTag;
-
   //- given a kdtree, set tag on vertices in leaf nodes with vertices
   //- to which they should be merged
   ErrorCode find_merged_to(EntityHandle &tree_root,

Repository URL: https://bitbucket.org/fathomteam/moab/

--

This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.


More information about the moab-dev mailing list