[cig-commits] r15264 - short/3D/PyLith/trunk/libsrc/feassemble
brad at geodynamics.org
brad at geodynamics.org
Mon Jun 15 10:03:51 PDT 2009
Author: brad
Date: 2009-06-15 10:03:51 -0700 (Mon, 15 Jun 2009)
New Revision: 15264
Modified:
short/3D/PyLith/trunk/libsrc/feassemble/IntegratorElasticity.cc
Log:
Improved logic for calculation of stress and strain (use state variables when available).
Modified: short/3D/PyLith/trunk/libsrc/feassemble/IntegratorElasticity.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/feassemble/IntegratorElasticity.cc 2009-06-15 17:03:11 UTC (rev 15263)
+++ short/3D/PyLith/trunk/libsrc/feassemble/IntegratorElasticity.cc 2009-06-15 17:03:51 UTC (rev 15264)
@@ -335,44 +335,74 @@
_outputFields =
new topology::Fields<topology::Field<topology::Mesh> >(mesh);
- // FIX THIS LOGIC
+ if (0 == strcasecmp(name, "total_strain")) {
- if (0 == strcasecmp(name, "total_strain") &&
- !_material->hasStateVar("total_strain")) {
- assert(0 != fields);
- _allocateTensorField(mesh);
- topology::Field<topology::Mesh>& buffer =
- _outputFields->get("buffer (tensor)");
- buffer.label("total_strain");
- buffer.scale(1.0);
- buffer.addDimensionOkay(true);
- _calcStrainStressField(&buffer, name, fields);
- return buffer;
+ if (_material->hasStateVar("total_strain")) {
+ // total strain is available as a state variable
+ assert(0 != fields);
+ _allocateTensorField(mesh);
+ topology::Field<topology::Mesh>& buffer =
+ _outputFields->get("buffer (tensor)");
+ _material->getField(&buffer, "total_strain");
+ buffer.label(name);
+ buffer.scale(1.0);
+ buffer.addDimensionOkay(true);
+ return buffer;
- } else if (0 == strcasecmp(name, "stress") &&
- !_material->hasStateVar("total_strain")) {
- assert(0 != fields);
- _allocateTensorField(mesh);
- topology::Field<topology::Mesh>& buffer =
- _outputFields->get("buffer (tensor)");
- buffer.label("stress");
- buffer.scale(_normalizer->pressureScale());
- buffer.addDimensionOkay(true);
- _calcStrainStressField(&buffer, name, fields);
- return buffer;
+ } else { // must calculate total strain
+ assert(0 != fields);
+ _allocateTensorField(mesh);
+ topology::Field<topology::Mesh>& buffer =
+ _outputFields->get("buffer (tensor)");
+ buffer.label("total_strain");
+ buffer.scale(1.0);
+ buffer.addDimensionOkay(true);
+ _calcStrainStressField(&buffer, name, fields);
+ return buffer;
+ } // if/else
} else if (0 == strcasecmp(name, "stress")) {
- assert(0 != fields);
- _allocateTensorField(mesh);
- topology::Field<topology::Mesh>& buffer =
- _outputFields->get("buffer (tensor)");
- _material->getField(&buffer, "total_strain");
- buffer.label(name);
- buffer.scale(_normalizer->pressureScale());
- buffer.addDimensionOkay(true);
- _calcStressFromStrain(&buffer);
- return buffer;
+ if (_material->hasStateVar("stress")) {
+ // stress is available as a state variable
+ assert(0 != fields);
+ _allocateTensorField(mesh);
+ topology::Field<topology::Mesh>& buffer =
+ _outputFields->get("buffer (tensor)");
+ _material->getField(&buffer, "stress");
+ buffer.label(name);
+ buffer.scale(_normalizer->pressureScale());
+ buffer.addDimensionOkay(true);
+ return buffer;
+
+ } else { // must calculate stress from strain
+ if (_material->hasStateVar("strain")) {
+ // total strain is available as a state variable
+ assert(0 != fields);
+ _allocateTensorField(mesh);
+ topology::Field<topology::Mesh>& buffer =
+ _outputFields->get("buffer (tensor)");
+ _material->getField(&buffer, "total_strain");
+ buffer.label(name);
+ buffer.scale(_normalizer->pressureScale());
+ buffer.addDimensionOkay(true);
+ _calcStressFromStrain(&buffer);
+ return buffer;
+
+ } else { // must calculate strain
+ assert(0 != fields);
+ _allocateTensorField(mesh);
+ topology::Field<topology::Mesh>& buffer =
+ _outputFields->get("buffer (tensor)");
+ buffer.label("stress");
+ buffer.scale(_normalizer->pressureScale());
+ buffer.addDimensionOkay(true);
+ _calcStrainStressField(&buffer, name, fields);
+ return buffer;
+
+ } // else
+
+ } // else
} else {
if (!_outputFields->hasField("buffer (other)"))
_outputFields->add("buffer (other)", "buffer");
@@ -381,7 +411,9 @@
_material->getField(&buffer, name);
buffer.addDimensionOkay(true);
return buffer;
+
} // if/else
+
// Return tensor section to satisfy member function definition. Code
// should never get here.
More information about the CIG-COMMITS
mailing list