[cig-commits] r13464 - in short/3D/PyLith/trunk: . libsrc/topology libsrc/utils modulesrc/topology pylith/topology

brad at geodynamics.org brad at geodynamics.org
Thu Dec 4 17:29:30 PST 2008


Author: brad
Date: 2008-12-04 17:29:30 -0800 (Thu, 04 Dec 2008)
New Revision: 13464

Added:
   short/3D/PyLith/trunk/pylith/topology/Field.py
Modified:
   short/3D/PyLith/trunk/TODO
   short/3D/PyLith/trunk/libsrc/topology/Field.cc
   short/3D/PyLith/trunk/libsrc/topology/Field.hh
   short/3D/PyLith/trunk/libsrc/utils/sievetypes.hh
   short/3D/PyLith/trunk/modulesrc/topology/topology.pyxe.src
Log:
Added more operations to Field (not tested).

Modified: short/3D/PyLith/trunk/TODO
===================================================================
--- short/3D/PyLith/trunk/TODO	2008-12-04 21:28:45 UTC (rev 13463)
+++ short/3D/PyLith/trunk/TODO	2008-12-05 01:29:30 UTC (rev 13464)
@@ -25,19 +25,23 @@
       Integrator::normalizer()
       DataWriter::normalizer()
 
-3. Clean-up interface for materials [Brad]
+3. Mesh, Field, and FieldUniform objects [Brad]
+    Change name of FieldsManager to SolutionFields
+      (more accurate description).
 
-4. Power-law nonlinear rheology [Charles]
+4. Clean-up interface for materials [Brad]
 
-5. Savage-Presscott benchmark [Charles]
+5. Power-law nonlinear rheology [Charles]
 
-6. Interface with PETSc nonlinear solvers [Brad and Matt]
+6. Savage-Presscott benchmark [Charles]
 
-7. Modularize output? [Matt]
+7. Interface with PETSc nonlinear solvers [Brad and Matt]
 
+8. Modularize output? [Matt]
+
 -- Release (v1.4) --
 
-8. Fault friction
+9. Fault friction
 
 Other
 
@@ -169,16 +173,6 @@
 
   1. Replace Pyrex/pyrexembed with SWIG
 
-  3. Fields and SolutionFields objects (containers for fields over same mesh)
-       PyLith Field and FieldUniform
-         Sieve real section
-         type of field (scalar, vector, tensor, vector at quad, tensor at quad)
-         name
-         spaceDim
-         scale
-         isTemporary
-       FieldUniform::create()
-
   4. HDF5 output
 
        HDF5 files

Modified: short/3D/PyLith/trunk/libsrc/topology/Field.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/topology/Field.cc	2008-12-04 21:28:45 UTC (rev 13463)
+++ short/3D/PyLith/trunk/libsrc/topology/Field.cc	2008-12-05 01:29:30 UTC (rev 13464)
@@ -74,6 +74,119 @@
 } // clear
 
 // ----------------------------------------------------------------------
+// Zero section values.
+void
+pylith::topology::Field::zero(void)
+{ // zero
+  assert(!_section.isNull());
+  _section->zero();
+} // zero
+
+// ----------------------------------------------------------------------
+// Complete section by assembling across processors.
+void
+pylith::topology::Field::complete(void)
+{ // complete
+  assert(!_section.isNull());
+  ALE::Completion::completeSectionAdd(_mesh->getSendOverlap(),
+				      _mesh->getRecvOverlap(), 
+				      _section, _section);
+} // complete
+
+// ----------------------------------------------------------------------
+// Copy field values and metadata.
+void
+pylith::topology::Field::copy(const Field& field)
+{ // copy
+  // Check compatibility of sections
+  assert(!_section.isNull());
+  assert(!field._section.isNull());
+  const int srcSize = field._section->size();
+  const int dstSize = _section->size();
+  if (field._spaceDim != _spaceDim ||
+      field._vecFieldType != _vecFieldType ||
+      field._scale != _scale ||
+      srcSize != dstSize) {
+    std::ostringstream msg;
+
+    msg << "Cannot copy values from section '" << field._name 
+	<< "' to section '" << _name << "'. Sections are incompatible.\n"
+	<< "  Source section:\n"
+	<< "    space dim: " << field._spaceDim << "\n"
+	<< "    vector field type: " << field._vecFieldType << "\n"
+	<< "    scale: " << field._scale << "\n"
+	<< "    size: " << srcSize
+	<< "  Destination section:\n"
+	<< "    space dim: " << _spaceDim << "\n"
+	<< "    vector field type: " << _vecFieldType << "\n"
+	<< "    scale: " << _scale << "\n"
+	<< "    size: " << dstSize;
+    throw std::runtime_error(msg.str());
+  } // if
+
+  // Copy values from field
+  const SieveRealSection::chart_type& chart = _section->getChart();
+  const SieveRealSection::chart_type::const_iterator chartEnd = chart.end();
+
+  for (SieveRealSection::chart_type::const_iterator c_iter = chart.begin();
+       c_iter != chartEnd;
+       ++c_iter) {
+    assert(field._section->getFiberDimension(*c_iter) ==
+	   _section->getFiberDimension(*c_iter));
+    _section->updatePoint(*c_iter, field._section->restrictPoint(*c_iter));
+  } // for
+} // copy
+
+// ----------------------------------------------------------------------
+// Add two fields, storing the result in one of the fields.
+void
+pylith::topology::Field::operator+=(const Field& field)
+{ // operator+=
+  // Check compatibility of sections
+  assert(!_section.isNull());
+  assert(!field._section.isNull());
+  const int srcSize = field._section->size();
+  const int dstSize = _section->size();
+  if (field._spaceDim != _spaceDim ||
+      field._vecFieldType != _vecFieldType ||
+      field._scale != _scale ||
+      srcSize != dstSize) {
+    std::ostringstream msg;
+
+    msg << "Cannot add values from section '" << field._name 
+	<< "' to section '" << _name << "'. Sections are incompatible.\n"
+	<< "  Source section:\n"
+	<< "    space dim: " << field._spaceDim << "\n"
+	<< "    vector field type: " << field._vecFieldType << "\n"
+	<< "    scale: " << field._scale << "\n"
+	<< "    size: " << srcSize
+	<< "  Destination section:\n"
+	<< "    space dim: " << _spaceDim << "\n"
+	<< "    vector field type: " << _vecFieldType << "\n"
+	<< "    scale: " << _scale << "\n"
+	<< "    size: " << dstSize;
+    throw std::runtime_error(msg.str());
+  } // if
+
+  // Add values from field
+  const SieveRealSection::chart_type& chart = _section->getChart();
+  const SieveRealSection::chart_type::const_iterator chartEnd = chart.end();
+
+  // Assume fiber dimension is uniform
+  const int fiberDim = _section->getFiberDimension(*chart.begin());
+  double_array values(fiberDim);
+
+  for (SieveRealSection::chart_type::const_iterator c_iter = chart.begin();
+       c_iter != chartEnd;
+       ++c_iter) {
+    assert(fiberDim == field._section->getFiberDimension(*c_iter));
+    assert(fiberDim == _section->getFiberDimension(*c_iter));
+    field._section->restrictPoint(*c_iter, &values[0], values.size());
+    _section->updateAddPoint(*c_iter, &values[0]);
+  } // for
+} // operator+=
+
+// ----------------------------------------------------------------------
 // Dimensionalize field.
 void
 pylith::topology::Field::dimensionalize(void)

Modified: short/3D/PyLith/trunk/libsrc/topology/Field.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/topology/Field.hh	2008-12-04 21:28:45 UTC (rev 13463)
+++ short/3D/PyLith/trunk/libsrc/topology/Field.hh	2008-12-05 01:29:30 UTC (rev 13464)
@@ -44,14 +44,14 @@
 public :
 
   enum VectorFieldEnum {
-    SCALAR, ///< Scalar.
-    VECTOR, ///< Vector.
-    TENSOR, ///< Tensor.
-    OTHER, ///< Not a scalar, vector, or tensor.
-    MULTI_SCALAR, ///< Scalar at multiple points.
-    MULTI_VECTOR, ///< Vector at multiple points.
-    MULTI_TENSOR, ///< Tensor at multiple points.
-    MULTI_OTHER, ///< Not a scalar, vector, or tensor at multiple points.
+    SCALAR=0, ///< Scalar.
+    VECTOR=1, ///< Vector.
+    TENSOR=2, ///< Tensor.
+    OTHER=3, ///< Not a scalar, vector, or tensor.
+    MULTI_SCALAR=4, ///< Scalar at multiple points.
+    MULTI_VECTOR=5, ///< Vector at multiple points.
+    MULTI_TENSOR=6, ///< Tensor at multiple points.
+    MULTI_OTHER=7, ///< Not a scalar, vector, or tensor at multiple points.
   }; // VectorFieldEnum
 
 // PUBLIC MEMBERS ///////////////////////////////////////////////////////
@@ -144,11 +144,35 @@
   /// Clear variables associated with section.
   void clear(void);
 
+  /// Zero section values.
+  void zero(void);
+
+  /// Complete section by assembling across processors.
+  void complete(void);
+
+  /** Copy field values and metadata.
+   *
+   * @param field Field to copy.
+   */
+  void copy(const Field& field);
+
+  /** Add two fields, storing the result in one of the fields.
+   *
+   * @param field Field to add.
+   */
+  void operator+=(const Field& field);
+
   /** Dimensionalize field. Throws runtime_error if field is not
    * allowed to be dimensionalized.
    */
   void dimensionalize(void);
 
+  /** Print section to standard out.
+   *
+   * @param label Label for output.
+   */
+  void view(const char* label);
+
 // PROTECTED MEMBERS ////////////////////////////////////////////////////
 protected :
 

Modified: short/3D/PyLith/trunk/libsrc/utils/sievetypes.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/utils/sievetypes.hh	2008-12-04 21:28:45 UTC (rev 13463)
+++ short/3D/PyLith/trunk/libsrc/utils/sievetypes.hh	2008-12-05 01:29:30 UTC (rev 13464)
@@ -27,6 +27,7 @@
   typedef ALE::IMesh<> SieveMesh;
   typedef ALE::IMesh<ALE::LabelSifter<int, SieveMesh::point_type> > SieveSubMesh;
   typedef SieveMesh::real_section_type SieveRealSection;
+  typedef SieveMesh::int_section_type SieveIntSection;
 
 #else
   typedef ALE::IMesh<> Mesh;

Modified: short/3D/PyLith/trunk/modulesrc/topology/topology.pyxe.src
===================================================================
--- short/3D/PyLith/trunk/modulesrc/topology/topology.pyxe.src	2008-12-04 21:28:45 UTC (rev 13463)
+++ short/3D/PyLith/trunk/modulesrc/topology/topology.pyxe.src	2008-12-05 01:29:30 UTC (rev 13464)
@@ -42,17 +42,6 @@
   void* malloc(size_t size)
   void free(void* mem)
 
-cdef void MeshPtr_destructor(void* obj):
-  """
-  Destroy Petsc Mesh.
-  """
-  #embed{ void MeshPtr_destructor_cpp(void* objVptr)
-  ALE::Obj<pylith::Mesh>* pMesh = (ALE::Obj<pylith::Mesh>*) objVptr;
-  delete pMesh;
-  #}embed
-  MeshPtr_destructor_cpp(obj)
-  return
-
 cdef void PetscMat_destructor(void* obj):
   """
   Destroy PetscMat.
@@ -69,23 +58,23 @@
   PetscMat_destructor_cpp(obj)
   return
 
-cdef void FieldsManager_destructor(void* obj):
-  """
-  Destroy FieldsManager.
-  """
-  #embed{ void FieldsManager_destructor_cpp(void* objVptr)
-  pylith::topology::FieldsManager* manager = (pylith::topology::FieldsManager*) objVptr;
-  delete manager;
-  #}embed
-  FieldsManager_destructor_cpp(obj)
-  return
-
 # ----------------------------------------------------------------------
 
 cimport mpi
 import mpi
 
 # ----------------------------------------------------------------------
+cdef void MeshPtr_destructor(void* obj):
+  """
+  Destroy Petsc Mesh.
+  """
+  #embed{ void MeshPtr_destructor_cpp(void* objVptr)
+  ALE::Obj<pylith::Mesh>* pMesh = (ALE::Obj<pylith::Mesh>*) objVptr;
+  delete pMesh;
+  #}embed
+  MeshPtr_destructor_cpp(obj)
+  return
+
 cdef class Mesh:
 
   cdef void* thisptr # Pointer to C++ object
@@ -728,6 +717,17 @@
 
 
 # ----------------------------------------------------------------------
+cdef void FieldsManager_destructor(void* obj):
+  """
+  Destroy FieldsManager.
+  """
+  #embed{ void FieldsManager_destructor_cpp(void* objVptr)
+  pylith::topology::FieldsManager* manager = (pylith::topology::FieldsManager*) objVptr;
+  delete manager;
+  #}embed
+  FieldsManager_destructor_cpp(obj)
+  return
+
 cdef class FieldsManager:
 
   cdef void* thisptr # Pointer to C++ object

Added: short/3D/PyLith/trunk/pylith/topology/Field.py
===================================================================
--- short/3D/PyLith/trunk/pylith/topology/Field.py	                        (rev 0)
+++ short/3D/PyLith/trunk/pylith/topology/Field.py	2008-12-05 01:29:30 UTC (rev 13464)
@@ -0,0 +1,211 @@
+#!/usr/bin/env python
+#
+# ----------------------------------------------------------------------
+#
+#                           Brad T. Aagaard
+#                        U.S. Geological Survey
+#
+# <LicenseText>
+#
+# ----------------------------------------------------------------------
+#
+
+## @file pylith/topology/Field.py
+##
+## @brief Python object for managing a vector field over vertices or
+## cells of a finite-element mesh.
+##
+## Factory: vector_field
+
+# Field class
+class Field(object):
+  """
+  Python object for managing a vector field over vertices or cells of
+  a finite-element mesh.
+  """
+
+  # PUBLIC METHODS /////////////////////////////////////////////////////
+
+  def __init__(self, mesh):
+    """
+    Constructor.
+    """
+    self.cppHandle = self._createCppHandle(mesh)
+    return
+
+
+  def setName(self, value):
+    """
+    Set name of field.
+    """
+    assert(None != self.cppHandle)
+    self.cppHandle.name = value
+    return
+
+
+  def getName(self):
+    """
+    Get name of field.
+    """
+    assert(None != self.cppHandle)
+    return self.cppHandle.name
+
+
+  def setVectorFieldType(self, value):
+    """
+    Set vector field type.
+    """
+    assert(None != self.cppHandle)
+    self.cppHandle.vectorFieldType = value
+    return
+
+
+  def getVectorFieldType(self):
+    """
+    Get vector field type.
+    """
+    assert(None != self.cppHandle)
+    return self.cppHandle.VectorFieldType
+    return
+
+
+  def setSpaceDim(self, value):
+    """
+    Set spaceDim of field.
+    """
+    assert(None != self.cppHandle)
+    self.cppHandle.spaceDim = value
+    return
+
+
+  def getSpaceDim(self, spaceDim):
+    """
+    Get spaceDim of field.
+    """
+    assert(None != self.cppHandle)
+    return self.cppHandle.spaceDim
+
+
+  def setScale(self, value):
+    """
+    Set scale of field.
+    """
+    assert(None != self.cppHandle)
+    self.cppHandle.scale = value
+    return
+
+
+  def getScale(self):
+    """
+    Get scale of field.
+    """
+    assert(None != self.cppHandle)
+    return self.cppHandle.scale
+
+
+  def setAddDimensionOkay(self, value):
+    """
+    Set addDimensionOkay.
+    """
+    assert(None != self.cppHandle)
+    self.cppHandle.addDimensionOkay = value
+    return
+
+
+  def getAddDimensionOkay(self):
+    """
+    Get addDimensionOkay.
+    """
+    assert(None != self.cppHandle)
+    return self.cppHandle.addDimensionOkay
+
+
+  def copyLayout(self, field):
+    """
+    Copy layout of field.
+    """
+    assert(None != self.cppHandle)
+    self.cppHandle.copyLayout(field.cppHandle)
+    return
+
+
+  def clear(self):
+    """
+    Clear variables associated with section.
+    """
+    assert(None != self.cppHandle)
+    self.cppHandle.clear()
+    return
+
+
+  def zero(self):
+    """
+    Zero section values.
+    """
+    assert(None != self.cppHandle)
+    self.cppHandle.zero()
+    return
+    
+    
+  def complete(self):
+    """
+    Complete section by assembling over processors.
+    """
+    assert(None != self.cppHandle)
+    self.cppHandle.complete()
+    return
+    
+    
+  def copy(self, field):
+    """
+    Copy field values and metadata.
+    """
+    assert(None != self.cppHandle)
+    self.cppHandle.copy(field.cppHandle)
+    return
+    
+    
+  def add(self, field):
+    """
+    Add two fields, storing result in field.
+    """
+    assert(None != self.cppHandle)
+    self.cppHandle.add(field.cppHandle)
+    return
+    
+
+  def dimensionalize(self):
+    """
+    Add dimensions to field.
+    """
+    okay = self.cppHandle.addDimensionOkay
+    if ~okay:
+      name = self.cppHandle.name
+      raise RuntimeError("Field '%s' is protected. Cannot dimensionalize." % \
+                         name)
+    assert(None != self.cppHandle)
+    self.cppHandle.dimensionalize()
+    
+
+  # PRIVATE METHODS ////////////////////////////////////////////////////
+
+  def _createCppHandle(self):
+    """
+    Create handle to corresponding C++ object.
+    """
+    if None == self.cppHandle:
+      import pylith.topology.topology as bindings
+      self.cppHandle = bindings.Field()
+    return
+  
+
+# FACTORIES ////////////////////////////////////////////////////////////
+
+def vector_field():
+  """
+  Factory associated with Mesh.
+  """
+  return Field()
+
+
+# End of file



More information about the CIG-COMMITS mailing list