[cig-commits] r17222 - short/3D/PyLith/trunk/libsrc/topology

brad at geodynamics.org brad at geodynamics.org
Mon Sep 27 12:32:24 PDT 2010


Author: brad
Date: 2010-09-27 12:32:24 -0700 (Mon, 27 Sep 2010)
New Revision: 17222

Modified:
   short/3D/PyLith/trunk/libsrc/topology/CellRefinerTri3.cc
   short/3D/PyLith/trunk/libsrc/topology/CellRefinerTri3.hh
   short/3D/PyLith/trunk/libsrc/topology/MeshRefiner.cc
   short/3D/PyLith/trunk/libsrc/topology/MeshRefiner.hh
   short/3D/PyLith/trunk/libsrc/topology/RefineUniform.cc
Log:
Implemented general update of labels for global refinement.

Modified: short/3D/PyLith/trunk/libsrc/topology/CellRefinerTri3.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/topology/CellRefinerTri3.cc	2010-09-26 00:27:44 UTC (rev 17221)
+++ short/3D/PyLith/trunk/libsrc/topology/CellRefinerTri3.cc	2010-09-27 19:32:24 UTC (rev 17222)
@@ -202,6 +202,40 @@
 } // groupSetNewVertices
 
 // ----------------------------------------------------------------------
+// Add new vertices to label.
+void
+ALE::CellRefinerTri3::labelAddNewVertices(const ALE::Obj<mesh_type>& newMesh,
+					  const ALE::Obj<mesh_type>& oldMesh,
+					  const char* labelName)
+{ // labelAddNewVertices
+  assert(!newMesh.isNull());
+  assert(!oldMesh.isNull());
+
+  const Obj<mesh_type::label_sequence>& oldLabelVertices = oldMesh->getLabelStratum(labelName, 0);
+  assert(!oldLabelVertices.isNull());
+
+  const Obj<mesh_type::label_type>& oldLabel = oldMesh->getLabel(labelName);
+  assert(!oldLabel.isNull());
+  const Obj<mesh_type::label_type>& newLabel = newMesh->getLabel(labelName);
+  assert(!newLabel.isNull());
+
+  const edge_map_type::const_iterator edgesEnd = _edgeToVertex.end();
+  for (edge_map_type::const_iterator e_iter = _edgeToVertex.begin(); e_iter != edgesEnd; ++e_iter) {
+    const point_type newVertex = e_iter->second;
+    const point_type edgeVertexA = e_iter->first.first;
+    const point_type edgeVertexB = e_iter->first.second;
+
+#if 0
+    // NEED TO TEST IF OLD LABEL HAS ENDPOINTS 
+    if (oldLabel->supportContains<>(edgeVertexA) && oldLabel->supportContains<>(edgeVertexB)) {
+      assert(oldMesh->getValue(oldLabel, edgeVertexA) == oldMesh->getValue(oldLabel, edgeVertexB));
+      newMesh->setValue(newLabel, newVertex, oldMesh->getValue(oldLabel, edgeVertexA));
+    } // if
+#endif
+  } // for
+} // labelAddNewVertices
+
+// ----------------------------------------------------------------------
 // Get cell type.
 ALE::CellRefinerTri3::CellEnum
 ALE::CellRefinerTri3::_cellType(const point_type cell)

Modified: short/3D/PyLith/trunk/libsrc/topology/CellRefinerTri3.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/topology/CellRefinerTri3.hh	2010-09-26 00:27:44 UTC (rev 17221)
+++ short/3D/PyLith/trunk/libsrc/topology/CellRefinerTri3.hh	2010-09-27 19:32:24 UTC (rev 17222)
@@ -110,6 +110,16 @@
   void groupSetNewVertices(const ALE::Obj<mesh_type::int_section_type>& newGroup,
 			   const ALE::Obj<mesh_type::int_section_type>& oldGroup);
 
+  /** Add new vertices to label.
+   *
+   * @param newMesh Mesh with refined cells.
+   * @param oldMesh Original mesh.
+   * @param labelName Name of label.
+   */
+  void labelAddNewVertices(const ALE::Obj<mesh_type>& newMesh,
+			   const ALE::Obj<mesh_type>& oldMesh,
+			   const char* labelName);
+
 // PRIVATE TYPEDEFS /////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/topology/MeshRefiner.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/topology/MeshRefiner.cc	2010-09-26 00:27:44 UTC (rev 17221)
+++ short/3D/PyLith/trunk/libsrc/topology/MeshRefiner.cc	2010-09-27 19:32:24 UTC (rev 17222)
@@ -184,6 +184,7 @@
   _stratify(newMesh);
   _calcNewOverlap(newMesh, mesh);
   _createIntSections(newMesh, mesh, refiner);
+  _createLabels(newMesh, mesh, refiner);
 } // _refine
   
 // ----------------------------------------------------------------------
@@ -386,6 +387,7 @@
   _stratify(newMesh);
   _calcNewOverlap(newMesh, mesh);
   _createIntSections(newMesh, mesh, refiner);
+  _createLabels(newMesh, mesh, refiner);
 
   // Create sensored depth
   const ALE::Obj<Mesh::label_type>& censoredLabel = newMesh->createLabel("censored depth");
@@ -452,6 +454,9 @@
 				     const Obj<mesh_type>& mesh,
 				     CellRefinerTri3& refiner)
 { // _createIntSections
+  assert(!newMesh.isNull());
+  assert(!mesh.isNull());
+
   const ALE::Obj<std::set<std::string> >& sectionNames =
     mesh->getIntSections();  
   const std::set<std::string>::const_iterator namesBegin = 
@@ -515,11 +520,75 @@
 } // _createIntSections
 
 // ----------------------------------------------------------------------
+// Create labels in new mesh.
+void
+ALE::MeshRefiner::_createLabels(const Obj<mesh_type>& newMesh,
+				     const Obj<mesh_type>& mesh,
+				     CellRefinerTri3& refiner)
+{ // _createLabels
+  assert(!newMesh.isNull());
+  assert(!mesh.isNull());
+  assert(_orderOldMesh);
+  assert(_orderNewMesh);
+
+  const mesh_type::labels_type labels = mesh->getLabels();
+  const mesh_type::labels_type::const_iterator labelsEnd = labels.end();
+  for (mesh_type::labels_type::const_iterator l_iter=labels.begin(); l_iter != labelsEnd; ++l_iter) {
+    // Handle censored depth separately.
+    if ("censored depth" == l_iter->first || "depth" == l_iter->first || "height" == l_iter->first) {
+      continue;
+    } // if
+
+    const Obj<mesh_type::label_type>& oldLabel = l_iter->second;
+    assert(!oldLabel.isNull());
+    const Obj<mesh_type::label_type>& newLabel = newMesh->createLabel(l_iter->first);
+    assert(!newLabel.isNull());
+
+    typedef mesh_type::label_type::traits::arrow_container_type::set_type arrows_set_type;
+
+    arrows_set_type::const_iterator oldArrowsEnd = oldLabel->_arrows.set.end();
+    for (arrows_set_type::const_iterator a_iter=oldLabel->_arrows.set.begin(); a_iter != oldArrowsEnd; ++a_iter) {
+
+      const mesh_type::point_type pOld = a_iter->target;
+      const int value = mesh->getValue(oldLabel, pOld);
+      
+      if (_orderOldMesh->cellsNormal().hasPoint(pOld)) {
+	const int numNewCellsPerCell = refiner.numNewCells(pOld);
+	mesh_type::point_type pNew = _orderNewMesh->cellsNormal().min() + (pOld - _orderOldMesh->cellsNormal().min())*numNewCellsPerCell;
+	for(int i=0; i < numNewCellsPerCell; ++i, ++pNew)
+	  newMesh->setValue(newLabel, pNew, value);
+	  
+      } else if (_orderOldMesh->verticesNormal().hasPoint(pOld)) {
+	const mesh_type::point_type pNew = _orderNewMesh->verticesNormal().min() + (pOld - _orderOldMesh->verticesNormal().min());
+	newMesh->setValue(newLabel, pNew, value);
+	
+      } else if (_orderOldMesh->verticesCensored().hasPoint(pOld)) {
+	const mesh_type::point_type pNew = _orderNewMesh->verticesCensored().min() + (pOld - _orderOldMesh->verticesCensored().min());
+	newMesh->setValue(newLabel, pNew, value);
+	
+      } else if (_orderOldMesh->cellsCensored().hasPoint(pOld)) {
+	const int numNewCellsPerCell = refiner.numNewCells(pOld);
+	mesh_type::point_type pNew = _orderNewMesh->cellsCensored().min() + (pOld - _orderOldMesh->cellsCensored().min())*numNewCellsPerCell;
+	for(int i=0; i < numNewCellsPerCell; ++i, ++pNew)
+	  newMesh->setValue(newLabel, pNew, value);
+      } else {
+	throw ALE::Exception("Unexpected cell encountered when creating labels.");
+      } // if/else
+    } // for
+
+    refiner.labelAddNewVertices(newMesh, mesh, l_iter->first.c_str());
+  } // for
+} // _createLabels
+
+// ----------------------------------------------------------------------
 // Calculate new overlap.
 void
 ALE::MeshRefiner::_calcNewOverlap(const Obj<mesh_type>& newMesh,
 				  const Obj<mesh_type>& mesh)
 { // _calcNewOverlap
+  assert(!newMesh.isNull());
+  assert(!mesh.isNull());
+
   // Exchange new boundary vertices
   //   We can convert endpoints, and then just match to new vertex on this side
   //   1) Create the overlap of edges which are vertex pairs (do not need for interpolated meshes)

Modified: short/3D/PyLith/trunk/libsrc/topology/MeshRefiner.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/topology/MeshRefiner.hh	2010-09-26 00:27:44 UTC (rev 17221)
+++ short/3D/PyLith/trunk/libsrc/topology/MeshRefiner.hh	2010-09-27 19:32:24 UTC (rev 17222)
@@ -86,14 +86,6 @@
    */
   void _stratify(const Obj<mesh_type>& mesh);
 
-  /** Calculate new overlap.
-   *
-   * @param newMesh New (refined) mesh.
-   * @param mesh Current (unrefined) mesh with overlap.
-   */
-  void _calcNewOverlap(const Obj<mesh_type>& newMesh,
-		       const Obj<mesh_type>& mesh);
-  
   /** Create integer sections in new mesh.
    *
    * :WARNING: Only implemented for integer sections containing vertices.
@@ -105,6 +97,25 @@
 			  const Obj<mesh_type>& mesh,
 			  CellRefinerTri3& refiner);
 
+  /** Create labels in new mesh.
+   *
+   * :WARNING: Only implemented for integer sections containing vertices.
+   *
+   * @param newMesh New (refined) mesh.
+   * @param mesh Current (unrefined) mesh with integer sections.
+   */
+  void _createLabels(const Obj<mesh_type>& newMesh,
+		     const Obj<mesh_type>& mesh,
+		     CellRefinerTri3& refiner);
+
+  /** Calculate new overlap.
+   *
+   * @param newMesh New (refined) mesh.
+   * @param mesh Current (unrefined) mesh with overlap.
+   */
+  void _calcNewOverlap(const Obj<mesh_type>& newMesh,
+		       const Obj<mesh_type>& mesh);
+  
 // PRIVATE MEMBERS //////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/topology/RefineUniform.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/topology/RefineUniform.cc	2010-09-26 00:27:44 UTC (rev 17221)
+++ short/3D/PyLith/trunk/libsrc/topology/RefineUniform.cc	2010-09-27 19:32:24 UTC (rev 17222)
@@ -67,38 +67,6 @@
   ALE::MeshRefiner refiner;
   refiner.refine(newSieveMesh, sieveMesh, cellSplitter);
 
-  // Set material ids
-  const ALE::Obj<SieveMesh::label_sequence>& cells = 
-    sieveMesh->heightStratum(0);
-  assert(!cells.isNull());
-  const SieveMesh::label_sequence::iterator cellsBegin = 
-    cells->begin();
-  const SieveMesh::label_sequence::iterator cellsEnd = 
-    cells->end();
-  const ALE::Obj<SieveMesh::label_type>& materials =
-    sieveMesh->getLabel("material-id");
-
-  const ALE::Obj<SieveMesh::label_sequence>& newCells = 
-    newSieveMesh->heightStratum(0);
-  assert(!newCells.isNull());
-  const SieveMesh::label_sequence::iterator newCellsBegin = 
-    newCells->begin();
-  const SieveMesh::label_sequence::iterator newCellsEnd = 
-    newCells->end();
-  const ALE::Obj<SieveMesh::label_type>& newMaterials =
-    newSieveMesh->createLabel("material-id");
-  
-  for (SieveMesh::label_sequence::const_iterator c_iter = cellsBegin,
-	 cNew_iter = newCellsBegin;
-       c_iter != cellsEnd;
-       ++c_iter) {
-    const int numNewCellsPerCell = cellSplitter.numNewCells(*c_iter);
-    const int material = sieveMesh->getValue(materials, *c_iter);
-    
-    for(int i=0; i < numNewCellsPerCell; ++i, ++cNew_iter)
-      newSieveMesh->setValue(newMaterials, *cNew_iter, material);
-  } // for
-  
 } // refine
     
 



More information about the CIG-COMMITS mailing list