[cig-commits] r22616 - short/3D/PyLith/trunk/libsrc/pylith/faults
knepley at geodynamics.org
knepley at geodynamics.org
Mon Jul 15 06:21:13 PDT 2013
Author: knepley
Date: 2013-07-15 06:21:13 -0700 (Mon, 15 Jul 2013)
New Revision: 22616
Modified:
short/3D/PyLith/trunk/libsrc/pylith/faults/CohesiveTopology.cc
Log:
Some fixes for interpolated cohesive cells
Modified: short/3D/PyLith/trunk/libsrc/pylith/faults/CohesiveTopology.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/faults/CohesiveTopology.cc 2013-07-15 13:20:22 UTC (rev 22615)
+++ short/3D/PyLith/trunk/libsrc/pylith/faults/CohesiveTopology.cc 2013-07-15 13:21:13 UTC (rev 22616)
@@ -55,6 +55,35 @@
if (groupField) {err = DMLabelGetName(groupField, &groupName);PYLITH_CHECK_ERROR(err);}
err = DMPlexCreateSubmesh(dmMesh, groupName, 1, &subdm);PYLITH_CHECK_ERROR(err);
+
+ if (flipFault) {
+ PetscInt maxConeSize, *revcone, *revconeO;
+ PetscInt pStart, pEnd, h;
+
+ err = DMPlexGetVTKCellHeight(subdm, &h);PYLITH_CHECK_ERROR(err);
+ err = DMPlexGetHeightStratum(subdm, h, &pStart, &pEnd);PYLITH_CHECK_ERROR(err);
+ err = DMPlexGetMaxSizes(subdm, &maxConeSize, NULL);PYLITH_CHECK_ERROR(err);
+ err = DMGetWorkArray(subdm, maxConeSize, PETSC_INT, &revcone);PYLITH_CHECK_ERROR(err);
+ err = DMGetWorkArray(subdm, maxConeSize, PETSC_INT, &revconeO);PYLITH_CHECK_ERROR(err);
+ for (PetscInt p = pStart; p < pEnd; ++p) {
+ const PetscInt *cone, *coneO;
+ PetscInt coneSize, faceSize, c;
+
+ err = DMPlexGetConeSize(subdm, p, &coneSize);PYLITH_CHECK_ERROR(err);
+ err = DMPlexGetCone(subdm, p, &cone);PYLITH_CHECK_ERROR(err);
+ err = DMPlexGetConeOrientation(subdm, p, &coneO);PYLITH_CHECK_ERROR(err);
+ for (c = 0; c < coneSize; ++c) {
+ err = DMPlexGetConeSize(subdm, cone[coneSize-1-c], &faceSize);PYLITH_CHECK_ERROR(err);
+ revcone[c] = cone[coneSize-1-c];
+ revconeO[c] = coneO[coneSize-1-c] >= 0 ? -(faceSize-coneO[coneSize-1-c]) : faceSize+coneO[coneSize-1-c];
+ }
+ err = DMPlexSetCone(subdm, p, revcone);PYLITH_CHECK_ERROR(err);
+ err = DMPlexSetConeOrientation(subdm, p, revconeO);PYLITH_CHECK_ERROR(err);
+ }
+ err = DMRestoreWorkArray(subdm, maxConeSize, PETSC_INT, &revcone);PYLITH_CHECK_ERROR(err);
+ err = DMRestoreWorkArray(subdm, maxConeSize, PETSC_INT, &revconeO);PYLITH_CHECK_ERROR(err);
+ }
+
err = DMPlexCreateLabel(subdm, labelName);PYLITH_CHECK_ERROR(err);
err = DMPlexGetLabel(subdm, labelName, &label);PYLITH_CHECK_ERROR(err);
err = DMPlexMarkBoundaryFaces(subdm, label);PYLITH_CHECK_ERROR(err);
@@ -644,17 +673,19 @@
assert(mesh);
assert(faultBoundary);
assert(groupField);
- PetscDM sdm = NULL;
- PetscDMLabel label = NULL;
- const char *labelName = "faultSurface";
+ PetscDM sdm = NULL;
+ PetscDMLabel subpointMap = NULL, label = NULL;
PetscErrorCode err;
PetscDM dm = mesh->dmMesh();assert(dm);
- err = DMPlexGetLabel(dm, labelName, &label);PYLITH_CHECK_ERROR(err);
+ err = DMPlexGetSubpointMap(faultMesh.dmMesh(), &subpointMap);PYLITH_CHECK_ERROR(err);
+ err = DMLabelDuplicate(subpointMap, &label);PYLITH_CHECK_ERROR(err);
+ err = DMLabelClearStratum(label, mesh->dimension());PYLITH_CHECK_ERROR(err);
// Completes the set of cells scheduled to be replaced
// Have to do internal fault vertices before fault boundary vertices, and this is the only thing I use faultBoundary for
err = DMPlexLabelCohesiveComplete(dm, label);PYLITH_CHECK_ERROR(err);
err = DMPlexConstructCohesiveCells(dm, label, &sdm);PYLITH_CHECK_ERROR(err);
+ err = DMLabelDestroy(&label);PYLITH_CHECK_ERROR(err);
PetscReal lengthScale = 1.0;
err = DMPlexGetScale(dm, PETSC_UNIT_LENGTH, &lengthScale);PYLITH_CHECK_ERROR(err);
More information about the CIG-COMMITS
mailing list