[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