[cig-commits] r12969 - short/3D/PyLith/trunk/pylith/problems

willic3 at geodynamics.org willic3 at geodynamics.org
Wed Sep 24 20:43:15 PDT 2008


Author: willic3
Date: 2008-09-24 20:43:14 -0700 (Wed, 24 Sep 2008)
New Revision: 12969

Modified:
   short/3D/PyLith/trunk/pylith/problems/Formulation.py
Log:
Added code to allow output of PETSc binary representation of Jacobian matrix.


Modified: short/3D/PyLith/trunk/pylith/problems/Formulation.py
===================================================================
--- short/3D/PyLith/trunk/pylith/problems/Formulation.py	2008-09-24 16:12:19 UTC (rev 12968)
+++ short/3D/PyLith/trunk/pylith/problems/Formulation.py	2008-09-25 03:43:14 UTC (rev 12969)
@@ -54,7 +54,11 @@
     ## Python object for managing Formulation facilities and properties.
     ##
     ## \b Properties
-    ## @li None
+    ## @li \b view_jacobian Flag to output Jacobian matrix when it is reformed.
+    ## @li \b jacobian_filename Filename for Jacobian matrix.
+    ## @li \b jacobian_time_width String length of time stamp in Jacobian filename.
+    ## @li \b jacobian_time_constant Value used to normalize time stamp in filename.
+
     ##
     ## \b Facilities
     ## @li \b time_step Time step size manager.
@@ -63,6 +67,21 @@
 
     import pyre.inventory
 
+    viewJacobian = pyre.inventory.bool("view_jacobian", default=False)
+    viewJacobian.meta['tip'] = "Write Jacobian matrix to binary file."
+    
+    jacobianFilename = pyre.inventory.str("jacobian_filename",
+                                          default="jacobian.mat")
+    jacobianFilename.meta['tip'] = "Filename for Jacobian matrix."
+
+    jacobianTimeWidth = pyre.inventory.int("jacobian_time_width", default=5)
+    jacobianTimeWidth.meta['tip'] = "String length of time stamp in Jacobian filename."
+
+    jacobianTimeConstant = pyre.inventory.dimensional("jacobian_time_constant",
+                                                      default=1.0*second,
+                                                      validator=pyre.inventory.greater(0.0*second))
+    jacobianTimeConstant.meta['tip'] = "Values used to normalize time stamp in Jacobian filename."
+    
     from TimeStepUniform import TimeStepUniform
     timeStep = pyre.inventory.facility("time_step", family="time_step",
                                        factory=TimeStepUniform)
@@ -296,6 +315,10 @@
     self.timeStep = self.inventory.timeStep
     self.solver = self.inventory.solver
     self.output = self.inventory.output
+    self.viewJacobian = self.inventory.viewJacobian
+    self.jacobianFilename = self.inventory.jacobianFilename
+    self.jacobianTimeWidth = self.inventory.jacobianTimeWidth
+    self.jacobianTimeConstant = self.inventory.jacobianTimeConstant
 
     import journal
     self._debug = journal.debug(self.name)
@@ -396,10 +419,28 @@
       integrator.timeStep(dt)
       integrator.integrateJacobian(self.jacobian, t+dt, self.fields)
     petsc.mat_assemble(self.jacobian)
+    if self.viewJacobian:
+      filename = self._createJacobianFilename(t+dt)
+      petsc.mat_view_binary(self.jacobian, filename)
     self._debug.log(resourceUsageString())
     return
 
 
+  def _createJacobianFilename(self, t):
+    """
+    Create filename by extracting basename and adding a time stamp.
+    """
+    base = self.jacobianFilename.lstrip().rstrip()
+    baseLen = len(base)
+    if base.endswith(".mat"):
+      basename = base[0:baseLen-4]
+    else:
+      basename = base
+    time = int(t.value/self.jacobianTimeConstant.value)
+    timeStamp = repr(time).rjust(self.jacobianTimeWidth, '0')
+    filename = basename + "_t" + timeStamp + ".mat"
+    return filename
+      
   def _reformResidual(self, t, dt):
     """
     Reform residual vector for operator.



More information about the cig-commits mailing list