[cig-commits] r6707 - short/3D/PyLith/trunk/libsrc/faults
brad at geodynamics.org
brad at geodynamics.org
Thu Apr 26 21:46:09 PDT 2007
Author: brad
Date: 2007-04-26 21:46:09 -0700 (Thu, 26 Apr 2007)
New Revision: 6707
Modified:
short/3D/PyLith/trunk/libsrc/faults/BruneSlipFn.cc
Log:
Added accommodation of slip field dimensions that matches spatial dimension (1 component of slip for 1-D, 2 for 2-D, 3 for 3-D).
Modified: short/3D/PyLith/trunk/libsrc/faults/BruneSlipFn.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/BruneSlipFn.cc 2007-04-27 03:27:20 UTC (rev 6706)
+++ short/3D/PyLith/trunk/libsrc/faults/BruneSlipFn.cc 2007-04-27 04:46:09 UTC (rev 6707)
@@ -15,6 +15,7 @@
#include "BruneSlipFn.hh" // implementation of object methods
#include "pylith/feassemble/ParameterManager.hh" // USES ParameterManager
+#include "pylith/utils/array.hh" // USES double_array
#include "spatialdata/spatialdb/SpatialDB.hh" // USES SpatialDB
#include "spatialdata/geocoords/CoordSys.hh" // USES CoordSys
@@ -70,6 +71,8 @@
assert(0 != _dbSlipTime);
assert(0 != _dbPeakRate);
+ const int spaceDim = cs->spaceDim();
+
// Create and allocate sections for parameters
delete _parameters;
_parameters = new feassemble::ParameterManager(faultMesh);
@@ -83,7 +86,7 @@
const ALE::Obj<real_section_type>& finalSlip =
_parameters->getReal("final slip");
assert(!finalSlip.isNull());
- finalSlip->setFiberDimension(faultMesh->depthStratum(0), 3);
+ finalSlip->setFiberDimension(faultMesh->depthStratum(0), spaceDim);
faultMesh->allocate(finalSlip);
// Parameter: slip initiation time
@@ -104,8 +107,23 @@
// Open databases and set query values
_dbFinalSlip->open();
- const char* slipValues[] = {"strike-slip", "dip-slip", "fault-opening"};
- _dbFinalSlip->queryVals(slipValues, 3);
+ switch (spaceDim) {
+ case 1 : {
+ const char* slipValues[] = {"slip"};
+ _dbFinalSlip->queryVals(slipValues, 1);
+ } // case 1
+ case 2 : {
+ const char* slipValues[] = {"slip", "fault-opening"};
+ _dbFinalSlip->queryVals(slipValues, 2);
+ } // case 2
+ case 3 : {
+ const char* slipValues[] = {"left-lateral-slip", "reverse-slip",
+ "fault-opening"};
+ _dbFinalSlip->queryVals(slipValues, 3);
+ } // case 3
+ default :
+ assert(0);
+ } // switch
_dbSlipTime->open();
const char* slipTimeValues[] = {"slip-time"};
@@ -119,10 +137,9 @@
const ALE::Obj<real_section_type>& coordinates =
mesh->getRealSection("coordinates");
assert(!coordinates.isNull());
- const int spaceDim = cs->spaceDim();
// Query databases for parameters
- double slipData[3];
+ double_array slipData(spaceDim);
double slipTimeData;
double peakRateData;
const vert_iterator vBegin = vertices.begin();
@@ -132,7 +149,7 @@
const real_section_type::value_type* vCoords =
coordinates->restrictPoint(*v_iter);
- int err = _dbFinalSlip->query(&slipData[0], 3, vCoords, spaceDim, cs);
+ int err = _dbFinalSlip->query(&slipData[0], spaceDim, vCoords, spaceDim, cs);
if (err) {
std::ostringstream msg;
msg << "Could not find final slip at (";
@@ -173,7 +190,7 @@
// Allocate slip field
_slipField = new real_section_type(faultMesh->comm(), faultMesh->debug());
- _slipField->setFiberDimension(faultMesh->depthStratum(0), 3);
+ _slipField->setFiberDimension(faultMesh->depthStratum(0), spaceDim);
faultMesh->allocate(_slipField);
} // initialize
@@ -201,11 +218,12 @@
_parameters->getReal("peak rate");
assert(!peakRate.isNull());
- double slipValues[3];
+ double_array slipValues(3);
const vert_iterator vBegin = vertices.begin();
const vert_iterator vEnd = vertices.end();
for (vert_iterator v_iter=vBegin; v_iter != vEnd; ++v_iter) {
// Get values of parameters at vertex
+ const int numSlipValues = finalSlip->getFiberDimension(*v_iter);
const real_section_type::value_type* vFinalSlip =
finalSlip->restrictPoint(*v_iter);
const real_section_type::value_type* vSlipTime =
@@ -213,14 +231,14 @@
const real_section_type::value_type* vPeakRate =
peakRate->restrictPoint(*v_iter);
- const double vFinalSlipMag = sqrt(vFinalSlip[0]*vFinalSlip[0] +
- vFinalSlip[1]*vFinalSlip[1] +
- vFinalSlip[2]*vFinalSlip[2]);
+ double vFinalSlipMag = 0.0;
+ for (int iSlip=0; iSlip < numSlipValues; ++iSlip)
+ vFinalSlipMag += vFinalSlip[iSlip]*vFinalSlip[iSlip];
+ vFinalSlipMag = sqrt(vFinalSlipMag);
const double vSlip = _slip(t-vSlipTime[0], vFinalSlipMag, vPeakRate[0]);
const double scale = vSlip / vFinalSlipMag;
- slipValues[0] = scale * vFinalSlip[0];
- slipValues[1] = scale * vFinalSlip[1];
- slipValues[2] = scale * vFinalSlip[2];
+ for (int iSlip=0; iSlip < numSlipValues; ++iSlip)
+ slipValues[iSlip] = scale * vFinalSlip[iSlip];
// Update field
_slipField->updatePoint(*v_iter, &slipValues[0]);
More information about the cig-commits
mailing list