[cig-commits] r21968 - short/3D/PyLith/trunk/unittests/libtests/faults

brad at geodynamics.org brad at geodynamics.org
Tue Apr 30 17:30:10 PDT 2013


Author: brad
Date: 2013-04-30 17:30:10 -0700 (Tue, 30 Apr 2013)
New Revision: 21968

Added:
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultMesh.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultMesh.hh
Log:
Added missing files.

Added: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultMesh.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultMesh.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultMesh.cc	2013-05-01 00:30:10 UTC (rev 21968)
@@ -0,0 +1,113 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard, U.S. Geological Survey
+// Charles A. Williams, GNS Science
+// Matthew G. Knepley, University of Chicago
+//
+// This code was developed as part of the Computational Infrastructure
+// for Geodynamics (http://geodynamics.org).
+//
+// Copyright (c) 2010-2013 University of California, Davis
+//
+// See COPYING for license information.
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "TestFaultMesh.hh" // Implementation of class methods
+
+#include "pylith/faults/CohesiveTopology.hh" // USES CohesiveTopology
+#include "pylith/topology/Mesh.hh" // USES Mesh
+#include "pylith/topology/SubMesh.hh" // USES SubMesh
+
+// ----------------------------------------------------------------------
+void
+pylith::faults::TestFaultMesh::createFaultMesh(topology::SubMesh* faultMesh,
+					       topology::Mesh* mesh,
+					       const char* faultLabel,
+					       const int faultId)
+{ // createFaultMesh
+  PYLITH_METHOD_BEGIN;
+  
+  CPPUNIT_ASSERT(faultMesh);
+  CPPUNIT_ASSERT(mesh);
+
+  PetscErrorCode err = 0;
+  { // Create mesh
+    PetscInt firstFaultVertex = 0;
+    PetscInt firstLagrangeVertex = 0, firstFaultCell = 0;
+    PetscDMLabel groupField = NULL;
+    const bool useLagrangeConstraints = true;
+    PetscDM faultBoundaryDM = NULL;
+    PetscDM dmMesh = mesh->dmMesh();CPPUNIT_ASSERT(dmMesh);
+    
+    err = DMPlexGetStratumSize(dmMesh, faultLabel, 1, &firstLagrangeVertex);PYLITH_CHECK_ERROR(err);
+    firstFaultCell = firstLagrangeVertex;
+    if (useLagrangeConstraints) {
+      firstFaultCell += firstLagrangeVertex;
+    } // if
+    err = DMPlexGetLabel(dmMesh, faultLabel, &groupField);PYLITH_CHECK_ERROR(err);
+    CPPUNIT_ASSERT(groupField);
+    ALE::Obj<SieveFlexMesh> faultBoundary = 0;
+    CohesiveTopology::createFault(faultMesh, faultBoundary, faultBoundaryDM, *mesh, groupField);
+    CohesiveTopology::create(mesh, *faultMesh, faultBoundary, faultBoundaryDM, groupField, faultId, firstFaultVertex, firstLagrangeVertex, firstFaultCell, useLagrangeConstraints);
+    err = DMDestroy(&faultBoundaryDM);PYLITH_CHECK_ERROR(err);
+  } // Create mesh
+
+  { // Need to copy coordinates from mesh to fault mesh since we are not
+    // using create() instead of createParallel().
+    PetscDM dmMesh = mesh->dmMesh();CPPUNIT_ASSERT(dmMesh);
+    PetscDM faultDMMesh = faultMesh->dmMesh();CPPUNIT_ASSERT(faultDMMesh);
+    const int  spaceDim = mesh->dimension();
+    PetscIS subpointIS = NULL;
+    const PetscInt *points = NULL;
+    PetscSection coordSection = NULL, fcoordSection = NULL;
+    PetscInt vStart, vEnd, ffStart, ffEnd;
+    
+    err = DMPlexGetDepthStratum(faultDMMesh, 0, &vStart, &vEnd);PYLITH_CHECK_ERROR(err);
+    err = DMPlexGetHeightStratum(faultDMMesh, 1, &ffStart, &ffEnd);PYLITH_CHECK_ERROR(err);
+    err = DMPlexCreateSubpointIS(faultDMMesh, &subpointIS);PYLITH_CHECK_ERROR(err);
+    err = DMPlexGetCoordinateSection(dmMesh, &coordSection);PYLITH_CHECK_ERROR(err);
+    err = DMPlexGetCoordinateSection(faultDMMesh, &fcoordSection);PYLITH_CHECK_ERROR(err);
+    err = PetscSectionSetChart(fcoordSection, vStart, vEnd);PYLITH_CHECK_ERROR(err);
+    for(PetscInt v = vStart; v < vEnd; ++v) {
+      err = PetscSectionSetDof(fcoordSection, v, spaceDim);PYLITH_CHECK_ERROR(err);
+    } // for
+    err = PetscSectionSetUp(fcoordSection);PYLITH_CHECK_ERROR(err);
+    PetscVec coordVec, fcoordVec;
+    PetscScalar *coords,  *fcoords;
+    PetscInt coordSize;
+    
+    err = PetscSectionGetStorageSize(fcoordSection, &coordSize);PYLITH_CHECK_ERROR(err);
+    err = DMGetCoordinatesLocal(dmMesh, &coordVec);PYLITH_CHECK_ERROR(err);
+    err = VecCreate(mesh->comm(), &fcoordVec);PYLITH_CHECK_ERROR(err);
+    err = VecSetSizes(fcoordVec, coordSize, PETSC_DETERMINE);PYLITH_CHECK_ERROR(err);
+    err = VecSetFromOptions(fcoordVec);PYLITH_CHECK_ERROR(err);
+    err = ISGetIndices(subpointIS, &points);PYLITH_CHECK_ERROR(err);
+    err = VecGetArray(coordVec, &coords);PYLITH_CHECK_ERROR(err);
+    err = VecGetArray(fcoordVec, &fcoords);PYLITH_CHECK_ERROR(err);
+    for(PetscInt v = vStart; v < vEnd; ++v) {
+      PetscInt off, foff;
+      
+      // Notice that subpointMap[] does not account for cohesive cells
+      err = PetscSectionGetOffset(coordSection, points[v]+(ffEnd-ffStart), &off);PYLITH_CHECK_ERROR(err);
+      err = PetscSectionGetOffset(fcoordSection, v, &foff);PYLITH_CHECK_ERROR(err);
+      for(PetscInt d = 0; d < spaceDim; ++d) {
+	fcoords[foff+d] = coords[off+d];
+      } // for
+    } // for
+    err = ISRestoreIndices(subpointIS, &points);PYLITH_CHECK_ERROR(err);
+    err = ISDestroy(&subpointIS);PYLITH_CHECK_ERROR(err);
+    err = VecRestoreArray(coordVec, &coords);PYLITH_CHECK_ERROR(err);
+    err = VecRestoreArray(fcoordVec, &fcoords);PYLITH_CHECK_ERROR(err);
+    err = DMSetCoordinatesLocal(faultDMMesh, fcoordVec);PYLITH_CHECK_ERROR(err);
+    err = VecDestroy(&fcoordVec);PYLITH_CHECK_ERROR(err);
+  } // Copy coordiantes
+
+
+  PYLITH_METHOD_END;
+} // createFaultMesh

Added: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultMesh.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultMesh.hh	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultMesh.hh	2013-05-01 00:30:10 UTC (rev 21968)
@@ -0,0 +1,63 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard, U.S. Geological Survey
+// Charles A. Williams, GNS Science
+// Matthew G. Knepley, University of Chicago
+//
+// This code was developed as part of the Computational Infrastructure
+// for Geodynamics (http://geodynamics.org).
+//
+// Copyright (c) 2010-2013 University of California, Davis
+//
+// See COPYING for license information.
+//
+// ----------------------------------------------------------------------
+//
+
+/**
+ * @file unittests/libtests/faults/TestFaultMesh.hh
+ *
+ * @brief C++ object for constructing fault mesh.
+ */
+
+#if !defined(pylith_faults_testfaultmesh_hh)
+#define pylith_faults_testfaultmesh_hh
+
+#include <cppunit/extensions/HelperMacros.h>
+
+/// Namespace for pylith package
+namespace pylith {
+  namespace faults {
+    class TestFaultMesh;
+  } // faults
+} // pylith
+
+#include "pylith/topology/topologyfwd.hh" // USES Mesh, SubMesh
+
+/// C++ object for constructing fault mesh.
+class pylith::faults::TestFaultMesh
+{ // class TestFaultMesh
+
+  // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+  /** Adjust topology of domain mesh and create fault mesh.
+   *
+   * @param faultMesh Fault mesh.
+   * @param mesh Domain mesh.
+   * @param faultLabel Label for fault.
+   * @param faultId Material id for fault.
+   */
+  static
+  void createFaultMesh(topology::SubMesh* faultMesh,
+		       topology::Mesh* mesh,
+		       const char* faultLabel,
+		       const int faultId);
+
+}; // class TestFaultMesh
+
+#endif // pylith_faults_testfaultmesh_hh
+
+// End of file 



More information about the CIG-COMMITS mailing list