[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