[cig-commits] r14067 - short/3D/PyLith/branches/pylith-swig/libsrc/materials

brad at geodynamics.org brad at geodynamics.org
Tue Feb 17 21:44:44 PST 2009


Author: brad
Date: 2009-02-17 21:44:44 -0800 (Tue, 17 Feb 2009)
New Revision: 14067

Modified:
   short/3D/PyLith/branches/pylith-swig/libsrc/materials/ElasticMaterial.cc
   short/3D/PyLith/branches/pylith-swig/libsrc/materials/ElasticMaterial.hh
   short/3D/PyLith/branches/pylith-swig/libsrc/materials/ElasticMaterial.icc
   short/3D/PyLith/branches/pylith-swig/libsrc/materials/Material.cc
   short/3D/PyLith/branches/pylith-swig/libsrc/materials/Material.hh
Log:
More work on materials.

Modified: short/3D/PyLith/branches/pylith-swig/libsrc/materials/ElasticMaterial.cc
===================================================================
--- short/3D/PyLith/branches/pylith-swig/libsrc/materials/ElasticMaterial.cc	2009-02-18 00:02:02 UTC (rev 14066)
+++ short/3D/PyLith/branches/pylith-swig/libsrc/materials/ElasticMaterial.cc	2009-02-18 05:44:44 UTC (rev 14067)
@@ -14,23 +14,31 @@
 
 #include "ElasticMaterial.hh" // implementation of object methods
 
-#include "pylith/utils/array.hh" // USES double_array
+#include "pylith/topology/Mesh.hh" // USES Mesh
+#include "pylith/feassemble/Quadrature.hh" // USES Quadrature
+#include "pylith/utils/array.hh" // USES double_array, std::vector
 #include "pylith/utils/constdefs.h" // USES MAXDOUBLE
-#include "pylith/utils/sievetypes.hh" // USES Mesh
 
+#include "spatialdata/spatialdb/SpatialDB.hh" // USES SpatialDB
+#include "spatialdata/units/Nondimensional.hh" // USES Nondimensional
+
 #include <cstring> // USES memcpy()
+#include <strings.h> // USES strcasecmp()
 #include <cassert> // USES assert()
+#include <stdexcept> // USES std::runtime_error
+#include <sstream> // USES std::ostringstream
 
 // ----------------------------------------------------------------------
 // Default constructor.
-pylith::materials::ElasticMaterial::ElasticMaterial(const int tensorSize,
+pylith::materials::ElasticMaterial::ElasticMaterial(const int dimension,
+						    const int tensorSize,
 						    const int numElasticConsts,
-						    const char** dbValues,
-						    const char** initialStateDBValues,
-						    const int numDBValues,
-						    const PropMetaData* properties,
-						    const int numProperties) :
-  Material(tensorSize, dbValues, initialStateDBValues, numDBValues, properties, numProperties),
+						    const Metadata& metadata) :
+  Material(dimension, tensorSize, metadata),
+  _dbInitialStress(0),
+  _dbInitialStrain(0),
+  _initialStress(0),
+  _initialStrain(0),
   _numQuadPts(0),
   _numElasticConsts(numElasticConsts)
 { // constructor
@@ -40,9 +48,166 @@
 // Destructor.
 pylith::materials::ElasticMaterial::~ElasticMaterial(void)
 { // destructor
+  delete _initialStress; _initialStress = 0;
+  delete _initialStrain; _initialStrain = 0;
+
+  // Python db object owns databases, so just set point to null
+  // :KLUDGE: Should use shared pointer
+  _dbInitialStress = 0;
+  _dbInitialStrain = 0;
 } // destructor
 
 // ----------------------------------------------------------------------
+// Initialize material by getting physical property parameters from
+// database.
+void
+initialize(const topology::Mesh& mesh,
+	   feassemble::Quadrature<topology::Mesh>* quadrature)
+{ // initialize
+  Material::initialize(mesh, quadrature);
+
+  delete _initialStress; _initialStress = 0;
+  delete _initialStrain; _initialStrain = 0;
+
+  if (0 != _dbInitialStress)
+    _initializeInitialStress(mesh, quadrature);
+
+  if (0 != _dbInitialStrain)
+    _initializeInitialStrain(mesh, quadrature);
+} // initialize
+
+  // Get quadrature information
+  const int numQuadPts = quadrature->numQuadPts();
+  const int spaceDim = quadrature->spaceDim();
+
+  // Create arrays for querying
+  const int tensorSize = tensorSize();
+  double_array quadPtsGlobal(numQuadPts*spaceDim);
+  double_array valuesQuery(tensorSize);
+  double_array valuesCell(numQuadPts*tensorSize);
+
+  // Get cells associated with material
+  const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::label_sequence>& cells = 
+    sieveMesh->getLabelStratum("material-id", id());
+  assert(!cells.isNull());
+  const SieveMesh::label_sequence::iterator cellsEnd = cells->end();
+  const spatialdata::geocoords::CoordSys* cs = mesh.coordsys();
+
+  // Create field to hold initial stress state.
+  delete _initialStress; _initialStress = 0;
+  if (0 != _dbInitialStress) {
+    _initialStress = new topology::Field<topology::Mesh>(mesh);
+    assert(0 != _initialStress);
+    fiberDim = numQuadPts * tensorSize;
+    _initialStress->newSection(cells, fiberDim);
+    _initialStress->allocate();
+    _initialStress->zero();
+  } // if
+  const ALE::Obj<RealSection>& initialStressSection = 
+    (0 != _initialStress) ? _initialStress->section() : 0;
+
+  // Create field to hold initial strain state.
+  delete _initialStrain; _initialStrain = 0;
+  if (0 != _dbInitialStrain) {
+    _initialStrain = new topology::Field<topology::Mesh>(mesh);
+    assert(0 != _initialStrain);
+    fiberDim = numQuadPts * tensorSize;
+    if (0 == _initialStress)
+      _initialStrain->newSection(cells, fiberDim);
+    else { // reuse chart from inital stress
+      const ALE::Obj<RealSection::chart_type>& chart = 
+	initialStressSection->getChart();
+      assert(!chart.isNull());
+      _initialStrain->newSection(*chart, fiberDim);
+    } // else
+    _initialStrain->allocate();
+    _initialStrain->zero();
+  } // if
+  const ALE::Obj<RealSection>& initialStrainSection = 
+    (0 != _initialStrain) ? _initialStrain->section() : 0;
+
+  // Setup databases as necessary.
+  if (0 != _dbInitialStress) {
+    _dbInitialStress->open();
+    _dbInitialStress->queryVals(stressDBValues, tensorSize);
+  } // if
+  if (0 != _dbInitialStrain) {
+    _dbInitialStrain->open();
+    _dbInitialStrain->queryVals(strainDBValues, tensorSize);
+  } // if
+
+  assert(0 != _normalizer);
+  const double pressureScale = _normalizer->pressureScale();
+  const double lengthScale = _normalizer->pressureScale();
+    
+  for (Mesh::label_sequence::iterator c_iter=cells->begin();
+       c_iter != cellsEnd;
+       ++c_iter) {
+    // Compute geometry information for current cell
+    quadrature->retrieveGeometry(*c_iter);
+
+    const double_array& quadPtsNonDim = quadrature->quadPts();
+    quadPtsGlobal = quadPtsNonDim;
+    _normalizer->dimensionalize(&quadPtsGlobal[0], quadPtsGlobal.size(),
+				lengthScale);
+
+    // Loop over quadrature points in cell and query database
+    for (int iQuadPt=0, index=0; 
+	 iQuadPt < numQuadPts; 
+	 ++iQuadPt, index+=spaceDim) {
+      int err = _dbInitalStress->query(&valuesQuery[0], tensorSize,
+				       &quadPtsGlobal[index], spaceDim, cs);
+      if (err) {
+	std::ostringstream msg;
+	msg << "Could not find initial stress state at \n"
+	    << "(";
+	for (int i=0; i < spaceDim; ++i)
+	  msg << "  " << quadPtsGlobal[index+i];
+	msg << ") in material " << _label << "\n"
+	    << "using spatial database '" << _dbInitialStress->label() << "'.";
+	throw std::runtime_error(msg.str());
+      } // if
+      _dbToProperties(&propertiesCell[iQuadPt*_numPropsQuadPt], 
+		      propertiesQuery);
+      _nondimProperties(&propertiesCell[iQuadPt*_numPropsQuadPt],
+			_numPropsQuadPt);
+
+      if (0 != _dbInitialState) {
+	err = _dbInitialState->query(&stateVarsQuery[0], numDBStateVars,
+				     &quadPtsGlobal[index], spaceDim, cs);
+	if (err) {
+	  std::ostringstream msg;
+	  msg << "Could not find initial state values at \n" << "(";
+	  for (int i=0; i < spaceDim; ++i)
+	    msg << "  " << quadPtsGlobal[index+i];
+	  msg << ") in material " << _label << "\n"
+	      << "using spatial database '" << _dbInitialState->label()
+	      << "'.";
+	  throw std::runtime_error(msg.str());
+	} // if
+	_dbToStateVars(&stateVarsCell[iQuadPt*_numVarsQuadPt], 
+		       stateVarsQuery);
+	_nondimStateVars(&stateVarsCell[iQuadPt*_numVarsQuadPt],
+			 _numVarsQuadPt);
+      } // if
+
+    } // for
+    // Insert cell contribution into fields
+    propertiesSection->updatePoint(*c_iter, &propertiesCell[0]);
+    if (0 != _dbInitialState)
+      stateVarsSection->updatePoint(*c_iter, &stateVarsCell[0]);
+  } // for
+
+  // Close databases
+  _dbProperties->close();
+  if (0 != _dbInitialState)
+    _dbInitialState->close();
+  
+} // initialize
+  
+// ----------------------------------------------------------------------
 // Compute density for cell at quadrature points.
 const pylith::double_array&
 pylith::materials::ElasticMaterial::calcDensity(void)

Modified: short/3D/PyLith/branches/pylith-swig/libsrc/materials/ElasticMaterial.hh
===================================================================
--- short/3D/PyLith/branches/pylith-swig/libsrc/materials/ElasticMaterial.hh	2009-02-18 00:02:02 UTC (rev 14066)
+++ short/3D/PyLith/branches/pylith-swig/libsrc/materials/ElasticMaterial.hh	2009-02-18 05:44:44 UTC (rev 14067)
@@ -20,18 +20,10 @@
 #if !defined(pylith_materials_elasticmaterial_hh)
 #define pylith_materials_elasticmaterial_hh
 
+// Include directives ---------------------------------------------------
 #include "Material.hh" // ISA Material
 
-/// Namespace for pylith package
-namespace pylith {
-  namespace materials {
-    class ElasticMaterial;
-
-    class TestElasticMaterial; // unit testing
-  } // materials
-} // pylith
-
-/// C++ object for material constitutive model.
+// ElasticMaterial ------------------------------------------------------
 class pylith::materials::ElasticMaterial : public Material
 { // class ElasticMaterial
   friend class TestElasticMaterial; ///< unit testing
@@ -41,34 +33,42 @@
 
   /** Default constructor.
    *
-   * @param tensorSize Number of entries in stress tensor.
+   * @param dimension Spatial dimension associated with material.
+   * @param tensorSize Array of names of database values for material.
    * @param numElasticConsts Number of elastic constants.
-   * @param dbValues Array of names of database values for material.
-   * @param InitialStateDBValues Names of initial state database values for material.
-   * @param numDBValues Number of database values.
-   * @param properties Array of physical property meta data.
-   * @param numProperties Number of physical properties for material.
+   * @param metadata Metadata for physical properties and state variables.
    */
-  ElasticMaterial(const int tensorSize,
-		  const int numElasticConsts,
-		  const char** dbValues,
-		  const char** initialStateDBValues,
-		  const int numDBValues,
-		  const PropMetaData* properties,
-		  const int numProperties);
+  Material(const int dimension,
+	   const int tensorSize,
+	   const int numElasticConsts,
+	   const Metadata& metadata);
 
   /// Destructor.
   virtual
   ~ElasticMaterial(void);
 
-  /** Get cell's property information from material's section.
+  /** Set database for initial stress state.
    *
-   * @param cell Finite element cell
-   * @param numQuadPts Number of quadrature points
+   * @param db Spatial database.
    */
-  void getPropertiesCell(const Mesh::point_type& cell,
-			 const int numQuadPts);
+  void dbInitialStress(const spatialdata::spatialdb::SpatialDB* db);
 
+  /** Set database for initial strain state.
+   *
+   * @param db Spatial database.
+   */
+  void dbInitialStrain(const spatialdata::spatialdb::SpatialDB* db);
+
+  /** Initialize material by getting physical property parameters from
+   * database.
+   *
+   * @param mesh Finite-element mesh.
+   * @param quadrature Quadrature for finite-element integration
+   */
+  virtual
+  void initialize(const topology::Mesh& mesh,
+		  feassemble::Quadrature<topology::Mesh>* quadrature);
+  
   /** Compute density for cell at quadrature points.
    *
    * @returns Array of density values at cell's quadrature points.
@@ -163,6 +163,12 @@
   // PROTECTED METHODS //////////////////////////////////////////////////
 protected :
 
+  /** Allocate cell arrays.
+   *
+   * @param numQuadPts Number of quadrature points.
+   */
+  void _allocateCellArrays(void);
+
   /** Compute density from properties.
    *
    * @param density Array for density.
@@ -172,32 +178,43 @@
   virtual
   void _calcDensity(double* const density,
 		    const double* properties,
-		    const int numProperties) = 0;
+		    const int numProperties,
+		    const double* stateVars,
+		    const int numStateVars) = 0;
 
-  /** Compute stress tensor from properties. If the state variables
-   * are from the previous time step, then the computeStateVars flag
-   * should be set to true so that the state variables are updated
-   * (but not stored) when computing the stresses.
+  /** Compute stress tensor from properties and state variables. If
+   * the state variables are from the previous time step, then the
+   * computeStateVars flag should be set to true so that the state
+   * variables are updated (but not stored) when computing the
+   * stresses.
    *
    * @param stress Array for stress tensor.
    * @param stressSize Size of stress tensor.
    * @param properties Properties at location.
    * @param numProperties Number of properties.
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
    * @param totalStrain Total strain at location.
    * @param strainSize Size of strain tensor.
-   * @param initialState Initial state variable values.
-   * @param initialStateSize Size of initial state array.
-   * @param computeStateVars Flag indicating to compute updated state vars.
+   * @param initialStress Initial stress tensor at location.
+   * @param initialStressSize Size of initial stress array.
+   * @param initialStrain Initial strain tensor at location.
+   * @param initialStrainSize Size of initial strain array.
+   * @param computeStateVars Flag indicating to compute updated state variables.
    */
   virtual
   void _calcStress(double* const stress,
 		   const int stressSize,
 		   const double* properties,
 		   const int numProperties,
+		   const double* stateVars,
+		   const int numStateVars,
 		   const double* totalStrain,
 		   const int strainSize,
-		   const double* initialState,
-		   const int initialStateSize,
+		   const double* initialStress,
+		   const int initialStressSize,
+		   const double* initialStrain,
+		   const int initialStrainSize,
 		   const bool computeStateVars) = 0;
 
   /** Compute derivatives of elasticity matrix from properties.
@@ -206,55 +223,69 @@
    * @param numElasticConsts Number of elastic constants.
    * @param properties Properties at location.
    * @param numProperties Number of properties.
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
    * @param totalStrain Total strain at location.
    * @param strainSize Size of strain tensor.
-   * @param initialState Initial state variable values.
-   * @param initialStateSize Size of initial state array.
+   * @param initialStress Initial stress tensor at location.
+   * @param initialStressSize Size of initial stress array.
+   * @param initialStrain Initial strain tensor at location.
+   * @param initialStrainSize Size of initial strain array.
    */
   virtual
   void _calcElasticConsts(double* const elasticConsts,
 			  const int numElasticConsts,
 			  const double* properties,
 			  const int numProperties,
+			  const double* stateVars,
+			  const int numStateVars,
 			  const double* totalStrain,
 			  const int strainSize,
-			  const double* initialState,
-			  const int initialStateSize) = 0;
+			  const double* initialStress,
+			  const int initialStressSize,
+			  const double* initialStrain,
+			  const int initialStrainSize) = 0;
 
   /** Get stable time step for implicit time integration.
    *
+   * @param properties Properties at location.
+   * @param numProperties Number of properties.
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
+   *
    * @returns Time step
    */
   virtual
   double _stableTimeStepImplicit(const double* properties,
-				 const int numProperties) const = 0;
+				 const int numProperties,
+				 const double* stateVars,
+				 const int numStateVars) const = 0;
 
-  /** Update properties (for next time step).
+  /** Update state variables (for next time step).
    *
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
    * @param properties Properties at location.
    * @param numProperties Number of properties.
    * @param totalStrain Total strain at location.
    * @param strainSize Size of strain tensor.
-   * @param initialState Initial state variable values.
-   * @param initialStateSize Size of initial state array.
+   * @param initialStress Initial stress tensor at location.
+   * @param initialStressSize Size of initial stress array.
+   * @param initialStrain Initial strain tensor at location.
+   * @param initialStrainSize Size of initial strain array.
    */
   virtual
-  void _updateProperties(double* const properties,
+  void _updateProperties(double* const stateVars,
+			 const int numStateVars,
+			 double* const properties,
 			 const int numProperties,
 			 const double* totalStrain,
 			 const int strainSize,
-			 const double* initialState,
-			 const int initialStateSize);
+			 const double* initialStress,
+			 const int initialStressSize,
+			 const double* initialStrain,
+			 const int initialStrainSize);
 
-  // NOT IMPLEMENTED ////////////////////////////////////////////////////
-private :
-
-  /// Not implemented
-  ElasticMaterial(const ElasticMaterial& m);
-
-  /// Not implemented
-  const ElasticMaterial& operator=(const ElasticMaterial& m);
-
   // PRIVATE METHODS ////////////////////////////////////////////////////
 private :
 
@@ -267,23 +298,46 @@
   // PRIVATE MEMBERS ////////////////////////////////////////////////////
 private :
 
-  int _numQuadPts; ///< Number of quadrature points
-  int _numElasticConsts; ///< Number of elastic constants.
+  /// Database for initial stress tensor;
+  spatialdata::spatialdb:SpatialDB* _dbInitialStress;
 
+  /// Database for initial strain tensor;
+  spatialdata::spatialdb:SpatialDB* _dbInitialStrain;
+
+  /// Initial stress field.
+  topology::Field<topology::Mesh>* _initialStress;
+  
+  /// Initial strain field.
+  topology::Field<topology::Mesh>* _initialStrain;
+  
   /** Properties at quadrature points for current cell.
    *
-   * size = numQuadPts*numPropsQuadPt
-   * index = iQuadPt*iParam*iValue
+   * size = numQuadPts * numPropsQuadPt
+   * index = iQuadPt * numPropsQuadPt + iPropQuadPt
    */
   double_array _propertiesCell;
 
-  /** Initial state values at quadrature points for current cell.
+  /** State variables at quadrature points for current cell.
    *
-   * size = numQuadPts*initialStateSize
-   * index = iQuadPt*iValue
+   * size = numQuadPts * numVarsQuadPt
+   * index = iQuadPt * numVarsQuadPt + iStateVar
    */
-  double_array _initialStateCell;
+  double_array _stateVarsCell;
 
+  /** Initial stress state for current cell.
+   *
+   * size = numQuadPts * tensorSize
+   * index = iQuadPt * tensorSize + iComponent
+   */
+  double_array _initialStressCell;
+
+  /** Initial strain state for current cell.
+   *
+   * size = numQuadPts * tensorSize
+   * index = iQuadPt * tensorSize + iComponent
+   */
+  double_array _initialStrainCell;
+
   /** Density value at quadrature points for current cell.
    *
    * size = numQuadPts
@@ -293,18 +347,27 @@
 
   /** Stress tensor at quadrature points for current cell.
    *
-   * size = numQuadPts*tensorSize
-   * index = *iQuadPt*tensorSize + iStress
+   * size = numQuadPts * tensorSize
+   * index = iQuadPt * tensorSize + iStress
    */
   double_array _stress;
 
   /** Elasticity matrix at quadrature points for current cell.
    *
-   * size = numQuadPts*numElasticConsts
-   * index = iQuadPt*numElasticConsts+iConstant
+   * size = numQuadPts * numElasticConsts
+   * index = iQuadPt * numElasticConsts + iConstant
    */
   double_array _elasticConsts;
 
+  int _numQuadPts; ///< Number of quadrature points
+  int _numElasticConsts; ///< Number of elastic constants.
+
+  // NOT IMPLEMENTED ////////////////////////////////////////////////////
+private :
+
+  ElasticMaterial(const ElasticMaterial&); ///< Not implemented.
+  const ElasticMaterial& operator=(const ElasticMaterial&); ///< Not implemented
+
 }; // class ElasticMaterial
 
 #include "ElasticMaterial.icc" // inline methods

Modified: short/3D/PyLith/branches/pylith-swig/libsrc/materials/ElasticMaterial.icc
===================================================================
--- short/3D/PyLith/branches/pylith-swig/libsrc/materials/ElasticMaterial.icc	2009-02-18 00:02:02 UTC (rev 14066)
+++ short/3D/PyLith/branches/pylith-swig/libsrc/materials/ElasticMaterial.icc	2009-02-18 05:44:44 UTC (rev 14067)
@@ -14,6 +14,20 @@
 #error "ElasticMaterial.icc can only be included from ElasticMaterial.hh"
 #endif
 
+// Set database for initial stress state.
+inline
+void
+pylith::materials::ElasticMaterial::dbInitialStress(const spatialdata::spatialdb::SpatialDB* db) {
+  _dbInitialStress = db;
+}
+
+// Set database for initial strain state.
+inline
+void
+pylith::materials::ElasticMaterial::dbInitialStrain(const spatialdata::spatialdb::SpatialDB* db) {
+  _dbInitialStrain = db;
+}
+
 // Set whether elastic or inelastic constitutive relations are used.
 inline
 void

Modified: short/3D/PyLith/branches/pylith-swig/libsrc/materials/Material.cc
===================================================================
--- short/3D/PyLith/branches/pylith-swig/libsrc/materials/Material.cc	2009-02-18 00:02:02 UTC (rev 14066)
+++ short/3D/PyLith/branches/pylith-swig/libsrc/materials/Material.cc	2009-02-18 05:44:44 UTC (rev 14067)
@@ -21,8 +21,6 @@
 #include "spatialdata/spatialdb/SpatialDB.hh" // USES SpatialDB
 #include "spatialdata/units/Nondimensional.hh" // USES Nondimensional
 
-#include "pylith/utils/sievetypes.hh" // USES Mesh
-
 #include <cstring> // USES memcpy()
 #include <strings.h> // USES strcasecmp()
 #include <cassert> // USES assert()
@@ -114,16 +112,17 @@
   const SieveMesh::label_sequence::iterator cellsEnd = cells->end();
   const spatialdata::geocoords::CoordSys* cs = mesh.coordsys();
 
-  // Create sections to hold physical properties
+  // Create field to hold physical properties.
   delete _properties; _properties = new topology::Field<topology::Mesh>(mesh);
   assert(0 != _properties);
   int fiberDim = numQuadPts * _numPropsQuadPt;
   _properties->newSection(cells, fiberDim);
   _properties->allocate();
+  _properties->zero();
   const ALE::Obj<RealSection>& propertiesSection = _properties->section();
   assert(!propertiesSection.isNull());
 
-  // Create arrays for querying
+  // Create arrays for querying.
   const int numDBProperties = _metadata.numDBProperties();
   double_array quadPtsGlobal(numQuadPts*spaceDim);
   double_array propertiesQuery(numDBProperties);
@@ -134,25 +133,29 @@
   _dbProperties->queryVals(_metadata.dbProperties(),
 			   _metadata.numDBProperties());
 
-  // Create sections to hold state variables
+  // Create field to hold state variables. We create the field even
+  // if there is no initial state, because this we will use this field
+  // to hold the state variables.
   delete _stateVars; _stateVars = new topology::Field<topology::Mesh>(mesh);
-  assert(0 != _stateVars);
   fiberDim = numQuadPts * _numVarsQuadPt;
   if (fiberDim > 0) {
+    assert(0 != _stateVars);
     const ALE::Obj<RealSection::chart_type>& chart = 
       propertiesSection->getChart();
     assert(!chart.isNull());
     _stateVars->newSection(*chart, fiberDim);
     _stateVars->allocate();
+    _stateVars->zero();
   } // if
-  const ALE::Obj<RealSection>& stateVarsSection = _stateVars->section();
-  assert(!stateVarsSection.isNull());
+  const ALE::Obj<RealSection>& stateVarsSection = 
+    (fiberDim > 0) ? _stateVars->section() : 0;
 
   // Create arrays for querying
   const int numDBStateVars = _metadata.numDBStateVars();
   double_array stateVarsQuery;
   double_array stateVarsCell;
   if (0 != _dbInitialState) {
+    assert(!stateVarsSection.isNull());
     assert(numDBStateVars > 0);
     assert(_numVarsQuadPt > 0);
     stateVarsQuery.resize(numDBStateVars);

Modified: short/3D/PyLith/branches/pylith-swig/libsrc/materials/Material.hh
===================================================================
--- short/3D/PyLith/branches/pylith-swig/libsrc/materials/Material.hh	2009-02-18 00:02:02 UTC (rev 14066)
+++ short/3D/PyLith/branches/pylith-swig/libsrc/materials/Material.hh	2009-02-18 05:44:44 UTC (rev 14067)
@@ -123,6 +123,7 @@
    * @param mesh Finite-element mesh.
    * @param quadrature Quadrature for finite-element integration
    */
+  virtual
   void initialize(const topology::Mesh& mesh,
 		  feassemble::Quadrature<topology::Mesh>* quadrature);
   



More information about the CIG-COMMITS mailing list