[cig-commits] r22706 - short/3D/PyLith/trunk/libsrc/pylith/faults
knepley at geodynamics.org
knepley at geodynamics.org
Wed Aug 7 02:28:59 PDT 2013
Author: knepley
Date: 2013-08-07 02:28:59 -0700 (Wed, 07 Aug 2013)
New Revision: 22706
Modified:
short/3D/PyLith/trunk/libsrc/pylith/faults/CohesiveTopology.cc
Log:
Fix creation of cohesive cells for interpolated meshes
Modified: short/3D/PyLith/trunk/libsrc/pylith/faults/CohesiveTopology.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/faults/CohesiveTopology.cc 2013-08-07 09:27:10 UTC (rev 22705)
+++ short/3D/PyLith/trunk/libsrc/pylith/faults/CohesiveTopology.cc 2013-08-07 09:28:59 UTC (rev 22706)
@@ -55,6 +55,7 @@
if (groupField) {err = DMLabelGetName(groupField, &groupName);PYLITH_CHECK_ERROR(err);}
err = DMPlexCreateSubmesh(dmMesh, groupName, 1, &subdm);PYLITH_CHECK_ERROR(err);
+ err = DMPlexOrient(subdm);PYLITH_CHECK_ERROR(err);
if (flipFault) {
PetscInt maxConeSize, *revcone, *revconeO;
@@ -66,19 +67,32 @@
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;
+ const PetscInt *cone, *coneO, *support;
+ PetscInt coneSize, faceSize, supportSize, cp, sp;
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];
+ for (cp = 0; cp < coneSize; ++cp) {
+ err = DMPlexGetConeSize(subdm, cone[coneSize-1-cp], &faceSize);PYLITH_CHECK_ERROR(err);
+ revcone[cp] = cone[coneSize-1-cp];
+ revconeO[cp] = coneO[coneSize-1-cp] >= 0 ? -(faceSize-coneO[coneSize-1-cp]) : faceSize+coneO[coneSize-1-cp];
}
err = DMPlexSetCone(subdm, p, revcone);PYLITH_CHECK_ERROR(err);
err = DMPlexSetConeOrientation(subdm, p, revconeO);PYLITH_CHECK_ERROR(err);
+ /* Reverse orientations of support */
+ faceSize = coneSize;
+ err = DMPlexGetSupportSize(subdm, p, &supportSize);PYLITH_CHECK_ERROR(err);
+ err = DMPlexGetSupport(subdm, p, &support);PYLITH_CHECK_ERROR(err);
+ for (sp = 0; sp < supportSize; ++sp) {
+ err = DMPlexGetConeSize(subdm, support[sp], &coneSize);PYLITH_CHECK_ERROR(err);
+ err = DMPlexGetCone(subdm, support[sp], &cone);PYLITH_CHECK_ERROR(err);
+ err = DMPlexGetConeOrientation(subdm, support[sp], &coneO);PYLITH_CHECK_ERROR(err);
+ for (cp = 0; cp < coneSize; ++cp) {
+ if (cone[cp] != p) continue;
+ err = DMPlexInsertConeOrientation(subdm, support[sp], cp, coneO[cp] >= 0 ? -(faceSize-coneO[cp]) : faceSize+coneO[cp]);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);
@@ -683,10 +697,20 @@
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 = DMPlexLabelCohesiveComplete(dm, label, PETSC_TRUE, faultMesh.dmMesh());PYLITH_CHECK_ERROR(err);
err = DMPlexConstructCohesiveCells(dm, label, &sdm);PYLITH_CHECK_ERROR(err);
err = DMLabelDestroy(&label);PYLITH_CHECK_ERROR(err);
+ DMLabel mlabel;
+ PetscInt cMax, cEnd;
+
+ err = DMPlexGetLabel(sdm, "material-id", &mlabel);PYLITH_CHECK_ERROR(err);
+ err = DMPlexGetHeightStratum(sdm, 0, NULL, &cEnd);PYLITH_CHECK_ERROR(err);
+ err = DMPlexGetHybridBounds(sdm, &cMax, NULL, NULL, NULL);PYLITH_CHECK_ERROR(err);
+ for (PetscInt cell = cMax; cell < cEnd; ++cell) {
+ err = DMLabelSetValue(mlabel, cell, materialId);PYLITH_CHECK_ERROR(err);
+ }
+
PetscReal lengthScale = 1.0;
err = DMPlexGetScale(dm, PETSC_UNIT_LENGTH, &lengthScale);PYLITH_CHECK_ERROR(err);
err = DMPlexSetScale(sdm, PETSC_UNIT_LENGTH, lengthScale);PYLITH_CHECK_ERROR(err);
More information about the CIG-COMMITS
mailing list