[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