[cig-commits] r6475 - short/3D/PyLith/branches/pylith-0.8/pylith3d/module

leif at geodynamics.org leif at geodynamics.org
Fri Mar 30 14:05:10 PDT 2007


Author: leif
Date: 2007-03-30 14:05:09 -0700 (Fri, 30 Mar 2007)
New Revision: 6475

Added:
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/libpylith3d.cc
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/libpylith3d.h
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/mesh.cc
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/mesh.h
Removed:
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/autoprestr.cc
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/autoprestr.h
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/elastc.cc
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/elastc.h
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/numbering.cc
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/numbering.h
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/parser.cc
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/parser.h
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/scanner.cc
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/scanner.h
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/sorting.cc
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/sorting.h
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/sparse.cc
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/sparse.h
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/viscos.cc
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/viscos.h
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/write_modelinfo.cc
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/write_modelinfo.h
Modified:
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/Makefile.am
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/bindings.cc
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/interpolate.cc
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/misc.cc
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/misc.h
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/pylith3d_externs.h
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/setup.cc
   short/3D/PyLith/branches/pylith-0.8/pylith3d/module/setup.h
Log:
Merged all the Fortran bindings into a single file, in preparation for
the next step.


Modified: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/Makefile.am
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/Makefile.am	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/Makefile.am	2007-03-30 21:05:09 UTC (rev 6475)
@@ -30,37 +30,23 @@
 sources = \
 	array.cc \
 	array.h \
-	autoprestr.cc \
-	autoprestr.h \
 	bindings.cc \
 	bindings.h \
-	elastc.cc \
-	elastc.h \
 	exceptionhandler.cc \
 	exceptionhandler.h \
 	exceptions.cc \
 	exceptions.h \
+	libpylith3d.cc \
+	libpylith3d.h \
 	pylith3dmodule.cc \
 	pylith3dmodule.h \
 	pylith3d_externs.h \
+	mesh.cc \
+	mesh.h \
 	misc.cc \
 	misc.h \
-	numbering.cc \
-	numbering.h \
-	parser.cc \
-	parser.h \
-	scanner.cc \
-	scanner.h \
 	setup.cc \
-	setup.h \
-	sorting.cc \
-	sorting.h \
-	sparse.cc \
-	sparse.h \
-	viscos.cc \
-	viscos.h \
-	write_modelinfo.cc \
-	write_modelinfo.h
+	setup.h
 
 if ENABLE_GREENSFNS
 sources += interpolate.cc \

Deleted: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/autoprestr.cc
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/autoprestr.cc	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/autoprestr.cc	2007-03-30 21:05:09 UTC (rev 6475)
@@ -1,442 +0,0 @@
-// -*- C++ -*-
-// 
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
-//
-//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
-//
-//  Permission is hereby granted, free of charge, to any person obtaining
-//  a copy of this software and associated documentation files (the
-//  "Software"), to deal in the Software without restriction, including
-//  without limitation the rights to use, copy, modify, merge, publish,
-//  distribute, sublicense, and/or sell copies of the Software, and to
-//  permit persons to whom the Software is furnished to do so, subject to
-//  the following conditions:
-//
-//  The above copyright notice and this permission notice shall be
-//  included in all copies or substantial portions of the Software.
-//
-//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 
-
-#include <petscmat.h>
-#include <portinfo>
-#include "journal/debug.h"
-
-#include <Python.h>
-
-#include "autoprestr.h"
-#include "exceptionhandler.h"
-#include "pylith3d_externs.h"
-#include <stdio.h>
-#include <string.h>
-
-
-// Autocompute gravitational prestresses.
-
-char pypylith3d_autoprestr__doc__[] = "";
-char pypylith3d_autoprestr__name__[] = "autoprestr";
-
-PyObject * pypylith3d_autoprestr(PyObject *, PyObject *args)
-{
-  PyObject* pyA;                             // Sparse matrix array
-  PyObject* pyRhs;
-  PyObject* pySol;
-  PyObject* pyPointerToBextern;               // Force vectors
-  PyObject* pyPointerToBtraction;
-  PyObject* pyPointerToBgravity;
-  PyObject* pyPointerToBconcForce;
-  PyObject* pyPointerToBintern;
-  PyObject* pyPointerToBresid;
-  PyObject* pyPointerToBwink;
-  PyObject* pyPointerToBwinkx;
-  PyObject* pyPointerToDispVec;
-  PyObject* pyPointerToDprev;
-  PyObject* pyPointerToListArrayNforce;
-  PyObject* pyPointerToListArrayGrav;
-  PyObject* pyPointerToX;                     // Global arrays
-  PyObject* pyPointerToD;
-  PyObject* pyPointerToDeld;
-  PyObject* pyPointerToDcur;
-  PyObject* pyPointerToId;
-  PyObject* pyPointerToIwink;
-  PyObject* pyPointerToWink;
-  PyObject* pyPointerToListArrayNsysdat;
-  PyObject* pyPointerToListArrayIddmat;
-  PyObject* pyPointerToIbond;                 // Boundary condition arrays
-  PyObject* pyPointerToBond;
-  PyObject* pyPointerToDx;                    // Slippery node arrays
-  PyObject* pyPointerToDeldx;
-  PyObject* pyPointerToDxcur;
-  PyObject* pyPointerToDiforc;
-  PyObject* pyPointerToIdx;
-  PyObject* pyPointerToIwinkx;
-  PyObject* pyPointerToWinkx;
-  PyObject* pyPointerToIdslp;
-  PyObject* pyPointerToIpslp;
-  PyObject* pyPointerToIdhist;
-  PyObject* pyPointerToFault;                 // Split node arrays
-  PyObject* pyPointerToNfault;
-  PyObject* pyPointerToDfault;
-  PyObject* pyPointerToTfault;
-  PyObject* pyPointerToS;                     // Local stiffness matrix arrays
-  PyObject* pyPointerToStemp;
-  PyObject* pyPointerToState;                 // Element arrays
-  PyObject* pyPointerToDstate;
-  PyObject* pyPointerToState0;
-  PyObject* pyPointerToDmat;
-  PyObject* pyPointerToIens;
-  PyObject* pyPointerToLm;
-  PyObject* pyPointerToLmx;
-  PyObject* pyPointerToLmf;
-  PyObject* pyPointerToIvfamily;
-  PyObject* pyPointerToListArrayNpar;
-  PyObject* pyPointerToIelindx;
-  PyObject* pyPointerToTractionverts;         // Traction BC arrays
-  PyObject* pyPointerToTractionvals;
-  PyObject* pyPointerToGauss2d;
-  PyObject* pyPointerToSh2d;
-  PyObject* pyPointerToListArrayElementTypeInfo2d;
-  PyObject* pyPointerToListArrayPropertyList; // Material property arrays
-  PyObject* pyPointerToMaterialModelInfo;
-  PyObject* pyPointerToGauss;                 // Element type arrays
-  PyObject* pyPointerToSh;
-  PyObject* pyPointerToShj;
-  PyObject* pyPointerToListArrayElementTypeInfo;
-  PyObject* pyPointerToHistry;                // Time information
-  PyObject* pyPointerToListArrayRtimdat;
-  PyObject* pyPointerToListArrayNtimdat;
-  PyObject* pyPointerToListArrayNvisdat;
-  PyObject* pyPointerToMaxstp;
-  PyObject* pyPointerToDelt;
-  PyObject* pyPointerToAlfa;
-  PyObject* pyPointerToMaxit;
-  PyObject* pyPointerToNtdinit;
-  PyObject* pyPointerToLgdef;
-  PyObject* pyPointerToUtol;
-  PyObject* pyPointerToFtol;
-  PyObject* pyPointerToEtol;
-  PyObject* pyPointerToItmax;
-  PyObject* pyPointerToListArrayRgiter;       // Iterative solution information
-  PyObject* pyPointerToSkew;                  // Skew rotation information
-  PyObject* pyPointerToListArrayNcodat;       // Input/output information
-  PyObject* pyPointerToListArrayNunits;
-  PyObject* pyPointerToListArrayNprint;
-  PyObject* pyPointerToIstatout;
-  PyObject* pyPointerToNstatout;
-  char* asciiOutputFile;                      // Output file names
-  char* plotOutputFile;
-  char* ucdOutputRoot;
-  int autoprestrStage, iterateEvent;          // PETSc logging
-
-  int ok = PyArg_ParseTuple(args, "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOsssii:autoprestr",
-                            &pyA,                             // Sparse matrix arrays
-                            &pyRhs,
-                            &pySol,
-                            &pyPointerToBextern,               // Force vectors
-                            &pyPointerToBtraction,
-                            &pyPointerToBgravity,
-                            &pyPointerToBconcForce,
-                            &pyPointerToBintern,
-                            &pyPointerToBresid,
-                            &pyPointerToBwink,
-                            &pyPointerToBwinkx,
-                            &pyPointerToDispVec,
-                            &pyPointerToDprev,
-                            &pyPointerToListArrayNforce,
-                            &pyPointerToListArrayGrav,
-                            &pyPointerToX,                     // Global arrays
-                            &pyPointerToD,
-                            &pyPointerToDeld,
-                            &pyPointerToDcur,
-                            &pyPointerToId,
-                            &pyPointerToIwink,
-                            &pyPointerToWink,
-                            &pyPointerToListArrayNsysdat,
-                            &pyPointerToListArrayIddmat,
-                            &pyPointerToIbond,                 // Boundary condition arrays
-                            &pyPointerToBond,
-                            &pyPointerToDx,                    // Slippery node arrays
-                            &pyPointerToDeldx,
-                            &pyPointerToDxcur,
-                            &pyPointerToDiforc,
-                            &pyPointerToIdx,
-                            &pyPointerToIwinkx,
-                            &pyPointerToWinkx,
-                            &pyPointerToIdslp,
-                            &pyPointerToIpslp,
-                            &pyPointerToIdhist,
-                            &pyPointerToFault,                 // Split node arrays
-                            &pyPointerToNfault,
-                            &pyPointerToDfault,
-                            &pyPointerToTfault,
-                            &pyPointerToS,                     // Local stiffness matrix arrays
-                            &pyPointerToStemp,
-                            &pyPointerToState,                 // Element arrays
-                            &pyPointerToDstate,
-                            &pyPointerToState0,
-                            &pyPointerToDmat,
-                            &pyPointerToIens,
-                            &pyPointerToLm,
-                            &pyPointerToLmx,
-                            &pyPointerToLmf,
-                            &pyPointerToIvfamily,
-                            &pyPointerToListArrayNpar,
-                            &pyPointerToIelindx,
-                            &pyPointerToTractionverts,         // Traction BC arrays
-                            &pyPointerToTractionvals,
-                            &pyPointerToGauss2d,
-                            &pyPointerToSh2d,
-                            &pyPointerToListArrayElementTypeInfo2d,
-                            &pyPointerToListArrayPropertyList, // Material property arrays
-                            &pyPointerToMaterialModelInfo,
-                            &pyPointerToGauss,                 // Element type arrays
-                            &pyPointerToSh,
-                            &pyPointerToShj,
-                            &pyPointerToListArrayElementTypeInfo,
-                            &pyPointerToHistry,                // Time information
-                            &pyPointerToListArrayRtimdat,
-                            &pyPointerToListArrayNtimdat,
-                            &pyPointerToListArrayNvisdat,
-                            &pyPointerToMaxstp,
-                            &pyPointerToDelt,
-                            &pyPointerToAlfa,
-                            &pyPointerToMaxit,
-                            &pyPointerToNtdinit,
-                            &pyPointerToLgdef,
-                            &pyPointerToUtol,
-                            &pyPointerToFtol,
-                            &pyPointerToEtol,
-                            &pyPointerToItmax,
-                            &pyPointerToListArrayRgiter,       // Iterative solution information
-                            &pyPointerToSkew,                  // Skew rotation information
-                            &pyPointerToListArrayNcodat,       // Input/output information
-                            &pyPointerToListArrayNunits,
-                            &pyPointerToListArrayNprint,
-                            &pyPointerToIstatout,
-                            &pyPointerToNstatout,
-                            &asciiOutputFile,                  // Output file names
-                            &plotOutputFile,
-                            &ucdOutputRoot,
-                            &autoprestrStage,                  // PETSc logging
-                            &iterateEvent);
-
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  Mat      A = (Mat) PyCObject_AsVoidPtr(pyA);
-  Vec      rhs = (Vec) PyCObject_AsVoidPtr(pyRhs);
-  Vec      sol = (Vec) PyCObject_AsVoidPtr(pySol);
-  double*  pointerToBextern = (double*) PyCObject_AsVoidPtr(pyPointerToBextern);
-  double*  pointerToBtraction = (double*) PyCObject_AsVoidPtr(pyPointerToBtraction);
-  double*  pointerToBgravity = (double*) PyCObject_AsVoidPtr(pyPointerToBgravity);
-  double*  pointerToBconcForce = (double*) PyCObject_AsVoidPtr(pyPointerToBconcForce);
-  double*  pointerToBintern = (double*) PyCObject_AsVoidPtr(pyPointerToBintern);
-  double*  pointerToBresid = (double*) PyCObject_AsVoidPtr(pyPointerToBresid);
-  double*  pointerToBwink = (double*) PyCObject_AsVoidPtr(pyPointerToBwink);
-  double*  pointerToBwinkx = (double*) PyCObject_AsVoidPtr(pyPointerToBwinkx);
-  double*  pointerToDispVec = (double*) PyCObject_AsVoidPtr(pyPointerToDispVec);
-  double*  pointerToDprev = (double*) PyCObject_AsVoidPtr(pyPointerToDprev);
-  int*  pointerToListArrayNforce = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNforce);
-  double*  pointerToListArrayGrav = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayGrav);
-  double*  pointerToX = (double*) PyCObject_AsVoidPtr(pyPointerToX);
-  double*  pointerToD = (double*) PyCObject_AsVoidPtr(pyPointerToD);
-  double*  pointerToDeld = (double*) PyCObject_AsVoidPtr(pyPointerToDeld);
-  double*  pointerToDcur = (double*) PyCObject_AsVoidPtr(pyPointerToDcur);
-  int*  pointerToId = (int*) PyCObject_AsVoidPtr(pyPointerToId);
-  int*  pointerToIwink = (int*) PyCObject_AsVoidPtr(pyPointerToIwink);
-  double*  pointerToWink = (double*) PyCObject_AsVoidPtr(pyPointerToWink);
-  int*  pointerToListArrayNsysdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNsysdat);
-  int*  pointerToListArrayIddmat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayIddmat);
-  int*  pointerToIbond = (int*) PyCObject_AsVoidPtr(pyPointerToIbond);
-  double*  pointerToBond = (double*) PyCObject_AsVoidPtr(pyPointerToBond);
-  double*  pointerToDx = (double*) PyCObject_AsVoidPtr(pyPointerToDx);
-  double*  pointerToDeldx = (double*) PyCObject_AsVoidPtr(pyPointerToDeldx);
-  double*  pointerToDxcur = (double*) PyCObject_AsVoidPtr(pyPointerToDxcur);
-  double*  pointerToDiforc = (double*) PyCObject_AsVoidPtr(pyPointerToDiforc);
-  int*  pointerToIdx = (int*) PyCObject_AsVoidPtr(pyPointerToIdx);
-  int*  pointerToIwinkx = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkx);
-  double*  pointerToWinkx = (double*) PyCObject_AsVoidPtr(pyPointerToWinkx);
-  int*  pointerToIdslp = (int*) PyCObject_AsVoidPtr(pyPointerToIdslp);
-  int*  pointerToIpslp = (int*) PyCObject_AsVoidPtr(pyPointerToIpslp);
-  int*  pointerToIdhist = (int*) PyCObject_AsVoidPtr(pyPointerToIdhist);
-  double*  pointerToFault = (double*) PyCObject_AsVoidPtr(pyPointerToFault);
-  int*  pointerToNfault = (int*) PyCObject_AsVoidPtr(pyPointerToNfault);
-  double*  pointerToDfault = (double*) PyCObject_AsVoidPtr(pyPointerToDfault);
-  double*  pointerToTfault = (double*) PyCObject_AsVoidPtr(pyPointerToTfault);
-  double*  pointerToS = (double*) PyCObject_AsVoidPtr(pyPointerToS);
-  double*  pointerToStemp = (double*) PyCObject_AsVoidPtr(pyPointerToStemp);
-  double*  pointerToState = (double*) PyCObject_AsVoidPtr(pyPointerToState);
-  double*  pointerToDstate = (double*) PyCObject_AsVoidPtr(pyPointerToDstate);
-  double*  pointerToState0 = (double*) PyCObject_AsVoidPtr(pyPointerToState0);
-  double*  pointerToDmat = (double*) PyCObject_AsVoidPtr(pyPointerToDmat);
-  int*  pointerToIens = (int*) PyCObject_AsVoidPtr(pyPointerToIens);
-  int*  pointerToLm = (int*) PyCObject_AsVoidPtr(pyPointerToLm);
-  int*  pointerToLmx = (int*) PyCObject_AsVoidPtr(pyPointerToLmx);
-  int*  pointerToLmf = (int*) PyCObject_AsVoidPtr(pyPointerToLmf);
-  int*  pointerToIvfamily = (int*) PyCObject_AsVoidPtr(pyPointerToIvfamily);
-  int*  pointerToListArrayNpar = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNpar);
-  int*  pointerToIelindx = (int*) PyCObject_AsVoidPtr(pyPointerToIelindx);
-  int*  pointerToTractionverts = (int*) PyCObject_AsVoidPtr(pyPointerToTractionverts);
-  double*  pointerToTractionvals = (double*) PyCObject_AsVoidPtr(pyPointerToTractionvals);
-  double*  pointerToGauss2d = (double*) PyCObject_AsVoidPtr(pyPointerToGauss2d);
-  double*  pointerToSh2d = (double*) PyCObject_AsVoidPtr(pyPointerToSh2d);
-  int*  pointerToListArrayElementTypeInfo2d = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayElementTypeInfo2d);
-  double*  pointerToListArrayPropertyList = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayPropertyList);
-  int*  pointerToMaterialModelInfo = (int*) PyCObject_AsVoidPtr(pyPointerToMaterialModelInfo);
-  double*  pointerToGauss = (double*) PyCObject_AsVoidPtr(pyPointerToGauss);
-  double*  pointerToSh = (double*) PyCObject_AsVoidPtr(pyPointerToSh);
-  double*  pointerToShj = (double*) PyCObject_AsVoidPtr(pyPointerToShj);
-  int*  pointerToListArrayElementTypeInfo = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayElementTypeInfo);
-  double*  pointerToHistry = (double*) PyCObject_AsVoidPtr(pyPointerToHistry);
-  double*  pointerToListArrayRtimdat = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayRtimdat);
-  int*  pointerToListArrayNtimdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNtimdat);
-  int*  pointerToListArrayNvisdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNvisdat);
-  int*  pointerToMaxstp = (int*) PyCObject_AsVoidPtr(pyPointerToMaxstp);
-  double*  pointerToDelt = (double*) PyCObject_AsVoidPtr(pyPointerToDelt);
-  double*  pointerToAlfa = (double*) PyCObject_AsVoidPtr(pyPointerToAlfa);
-  int*  pointerToMaxit = (int*) PyCObject_AsVoidPtr(pyPointerToMaxit);
-  int*  pointerToNtdinit = (int*) PyCObject_AsVoidPtr(pyPointerToNtdinit);
-  int*  pointerToLgdef = (int*) PyCObject_AsVoidPtr(pyPointerToLgdef);
-  double*  pointerToUtol = (double*) PyCObject_AsVoidPtr(pyPointerToUtol);
-  double*  pointerToFtol = (double*) PyCObject_AsVoidPtr(pyPointerToFtol);
-  double*  pointerToEtol = (double*) PyCObject_AsVoidPtr(pyPointerToEtol);
-  int*  pointerToItmax = (int*) PyCObject_AsVoidPtr(pyPointerToItmax);
-  double*  pointerToListArrayRgiter = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayRgiter);
-  double*  pointerToSkew = (double*) PyCObject_AsVoidPtr(pyPointerToSkew);
-  int*  pointerToListArrayNcodat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNcodat);
-  int*  pointerToListArrayNunits = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNunits);
-  int*  pointerToListArrayNprint = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNprint);
-  int*  pointerToIstatout = (int*) PyCObject_AsVoidPtr(pyPointerToIstatout);
-  int*  pointerToNstatout = (int*) PyCObject_AsVoidPtr(pyPointerToNstatout);
-
-  autoprestr_f(&A,                                // Sparse matrix arrays
-               &rhs,
-               &sol,
-               pointerToBextern,                  // Force vectors
-               pointerToBtraction,
-               pointerToBgravity,
-               pointerToBconcForce,
-               pointerToBintern,
-               pointerToBresid,
-               pointerToBwink,
-               pointerToBwinkx,
-               pointerToDispVec,
-               pointerToDprev,
-               pointerToListArrayNforce,
-               pointerToListArrayGrav,
-               pointerToX,                        // Global arrays
-               pointerToD,
-               pointerToDeld,
-               pointerToDcur,
-               pointerToId,
-               pointerToIwink,
-               pointerToWink,
-               pointerToListArrayNsysdat,
-               pointerToListArrayIddmat,
-               pointerToIbond,                    // Boundary condition arrays
-               pointerToBond,
-               pointerToDx,                       // Slippery node arrays
-               pointerToDeldx,
-               pointerToDxcur,
-               pointerToDiforc,
-               pointerToIdx,
-               pointerToIwinkx,
-               pointerToWinkx,
-               pointerToIdslp,
-               pointerToIpslp,
-               pointerToIdhist,
-               pointerToFault,                    // Split node arrays
-               pointerToNfault,
-               pointerToDfault,
-               pointerToTfault,
-               pointerToS,                        // Local stiffness matrix arrays
-               pointerToStemp,
-               pointerToState,                    // Element arrays
-               pointerToDstate,
-               pointerToState0,
-               pointerToDmat,
-               pointerToIens,
-               pointerToLm,
-               pointerToLmx,
-               pointerToLmf,
-               pointerToIvfamily,
-               pointerToListArrayNpar,
-               pointerToIelindx,
-               pointerToTractionverts,            // Traction BC arrays
-               pointerToTractionvals,
-               pointerToGauss2d,
-               pointerToSh2d,
-               pointerToListArrayElementTypeInfo2d,
-               pointerToListArrayPropertyList,    // Material property arrays
-               pointerToMaterialModelInfo,
-               pointerToGauss,                    // Element type arrays
-               pointerToSh,
-               pointerToShj,
-               pointerToListArrayElementTypeInfo,
-               pointerToHistry,                   // Time information
-               pointerToListArrayRtimdat,
-               pointerToListArrayNtimdat,
-               pointerToListArrayNvisdat,
-               pointerToMaxstp,
-               pointerToDelt,
-               pointerToAlfa,
-               pointerToMaxit,
-               pointerToNtdinit,
-               pointerToLgdef,
-               pointerToUtol,
-               pointerToFtol,
-               pointerToEtol,
-               pointerToItmax,
-               pointerToListArrayRgiter,          // Iterative solution information
-               pointerToSkew,                     // Skew rotation information
-               pointerToListArrayNcodat,          // Input/output information
-               pointerToListArrayNunits,
-               pointerToListArrayNprint,
-               pointerToIstatout,
-               pointerToNstatout,
-               asciiOutputFile,                   // Output file names
-               plotOutputFile,
-               ucdOutputRoot,
-               &autoprestrStage,
-               &iterateEvent,
-               &errorcode,                        // Error codes
-               errorstring,
-               strlen(asciiOutputFile),           // String lengths
-               strlen(plotOutputFile),
-               strlen(ucdOutputRoot),
-               sizeof(errorstring));
-
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "asciiOutputFile:" << asciiOutputFile
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// version
-// $Id: autoprestr.cc,v 1.10 2005/06/07 19:39:11 willic3 Exp $
-
-// End of file

Deleted: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/autoprestr.h
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/autoprestr.h	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/autoprestr.h	2007-03-30 21:05:09 UTC (rev 6475)
@@ -1,45 +0,0 @@
-// -*- C++ -*-
-// 
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
-//
-//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
-//
-//  Permission is hereby granted, free of charge, to any person obtaining
-//  a copy of this software and associated documentation files (the
-//  "Software"), to deal in the Software without restriction, including
-//  without limitation the rights to use, copy, modify, merge, publish,
-//  distribute, sublicense, and/or sell copies of the Software, and to
-//  permit persons to whom the Software is furnished to do so, subject to
-//  the following conditions:
-//
-//  The above copyright notice and this permission notice shall be
-//  included in all copies or substantial portions of the Software.
-//
-//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 
-
-#if !defined(pypylith3d_autoprestr_h)
-#define pypylith3d_autoprestr_h
-
-// Compute gravitational prestresses.
-extern char pypylith3d_autoprestr__name__[];
-extern char pypylith3d_autoprestr__doc__[];
-extern "C"
-PyObject * pypylith3d_autoprestr(PyObject *, PyObject *);
-
-#endif
-
-// version
-// $Id: autoprestr.h,v 1.2 2005/03/31 23:27:58 willic3 Exp $
-
-// End of file

Modified: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/bindings.cc
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/bindings.cc	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/bindings.cc	2007-03-30 21:05:09 UTC (rev 6475)
@@ -33,18 +33,11 @@
 
 #include "bindings.h"
 
+#include "libpylith3d.h"   // fortran library functions
+
 #include "array.h"         // array allocation and conversion functions
-#include "autoprestr.h"    // prestress autocomputation
-#include "elastc.h"        // elastic solution driver
-#include "numbering.h"     // routines to create global equation numbers
-                           // and localize them.
-#include "parser.h"        // parsers
-#include "scanner.h"       // scanners
+#include "mesh.h"          // PETSc Sieve Mesh routines
 #include "setup.h"         // initialization/setup routines
-#include "sparse.h"        // sparse matrix routines
-#include "sorting.h"        // element sorting routines
-#include "viscos.h"        // time-dependent solution driver
-#include "write_modelinfo.h" // output routines
 #include "misc.h"          // miscellaneous methods
 
 #if defined(GREENSFNS)

Deleted: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/elastc.cc
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/elastc.cc	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/elastc.cc	2007-03-30 21:05:09 UTC (rev 6475)
@@ -1,445 +0,0 @@
-// -*- C++ -*-
-// 
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
-//
-//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
-//
-//  Permission is hereby granted, free of charge, to any person obtaining
-//  a copy of this software and associated documentation files (the
-//  "Software"), to deal in the Software without restriction, including
-//  without limitation the rights to use, copy, modify, merge, publish,
-//  distribute, sublicense, and/or sell copies of the Software, and to
-//  permit persons to whom the Software is furnished to do so, subject to
-//  the following conditions:
-//
-//  The above copyright notice and this permission notice shall be
-//  included in all copies or substantial portions of the Software.
-//
-//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 
-
-#include <petscmat.h>
-#include <portinfo>
-#include "journal/debug.h"
-
-#include <Python.h>
-
-#include "elastc.h"
-#include "exceptionhandler.h"
-#include "pylith3d_externs.h"
-#include <stdio.h>
-#include <string.h>
-
-#include <iostream>
-
-// Perform the elastic solution.
-
-char pypylith3d_elastc__doc__[] = "";
-char pypylith3d_elastc__name__[] = "elastc";
-
-PyObject * pypylith3d_elastc(PyObject *, PyObject *args)
-{
-  PyObject* pyA;                              // Sparse matrix arrays
-  PyObject* pyRhs;
-  PyObject* pySol;
-  PyObject* pyPointerToBextern;               // Force vectors
-  PyObject* pyPointerToBtraction;
-  PyObject* pyPointerToBgravity;
-  PyObject* pyPointerToBconcForce;
-  PyObject* pyPointerToBintern;
-  PyObject* pyPointerToBresid;
-  PyObject* pyPointerToBwink;
-  PyObject* pyPointerToBwinkx;
-  PyObject* pyPointerToDispVec;
-  PyObject* pyPointerToDprev;
-  PyObject* pyPointerToListArrayNforce;
-  PyObject* pyPointerToListArrayGrav;
-  PyObject* pyPointerToX;                     // Global arrays
-  PyObject* pyPointerToD;
-  PyObject* pyPointerToDeld;
-  PyObject* pyPointerToDcur;
-  PyObject* pyPointerToId;
-  PyObject* pyPointerToIwink;
-  PyObject* pyPointerToWink;
-  PyObject* pyPointerToListArrayNsysdat;
-  PyObject* pyPointerToListArrayIddmat;
-  PyObject* pyPointerToIbond;                 // Boundary condition arrays
-  PyObject* pyPointerToBond;
-  PyObject* pyPointerToDx;                    // Slippery node arrays
-  PyObject* pyPointerToDeldx;
-  PyObject* pyPointerToDxcur;
-  PyObject* pyPointerToDiforc;
-  PyObject* pyPointerToIdx;
-  PyObject* pyPointerToIwinkx;
-  PyObject* pyPointerToWinkx;
-  PyObject* pyPointerToIdslp;
-  PyObject* pyPointerToIpslp;
-  PyObject* pyPointerToIdhist;
-  PyObject* pyPointerToFault;                 // Split node arrays
-  PyObject* pyPointerToNfault;
-  PyObject* pyPointerToDfault;
-  PyObject* pyPointerToTfault;
-  PyObject* pyPointerToS;                     // Local stiffness matrix arrays
-  PyObject* pyPointerToStemp;
-  PyObject* pyPointerToState;                 // Element arrays
-  PyObject* pyPointerToDstate;
-  PyObject* pyPointerToState0;
-  PyObject* pyPointerToDmat;
-  PyObject* pyPointerToIen;
-  PyObject* pyPointerToLm;
-  PyObject* pyPointerToLmx;
-  PyObject* pyPointerToLmf;
-  PyObject* pyPointerToIvfamily;
-  PyObject* pyPointerToListArrayNpar;
-  PyObject* pyPointerToIelindx;
-  PyObject* pyPointerToTractionverts;         // Traction BC arrays
-  PyObject* pyPointerToTractionvals;
-  PyObject* pyPointerToGauss2d;
-  PyObject* pyPointerToSh2d;
-  PyObject* pyPointerToListArrayElementTypeInfo2d;
-  PyObject* pyPointerToListArrayPropertyList; // Material property arrays
-  PyObject* pyPointerToMaterialModelInfo;
-  PyObject* pyPointerToGauss;                 // Element type arrays
-  PyObject* pyPointerToSh;
-  PyObject* pyPointerToShj;
-  PyObject* pyPointerToListArrayElementTypeInfo;
-  PyObject* pyPointerToHistry;                // Time information
-  PyObject* pyPointerToListArrayRtimdat;
-  PyObject* pyPointerToListArrayNtimdat;
-  PyObject* pyPointerToListArrayNvisdat;
-  PyObject* pyPointerToMaxstp;
-  PyObject* pyPointerToDelt;
-  PyObject* pyPointerToAlfa;
-  PyObject* pyPointerToMaxit;
-  PyObject* pyPointerToNtdinit;
-  PyObject* pyPointerToLgdef;
-  PyObject* pyPointerToUtol;
-  PyObject* pyPointerToFtol;
-  PyObject* pyPointerToEtol;
-  PyObject* pyPointerToItmax;
-  PyObject* pyPointerToListArrayRgiter;       // Iterative solution information
-  PyObject* pyPointerToSkew;                  // Skew rotation information
-  PyObject* pyPointerToListArrayNcodat;       // Input/output information
-  PyObject* pyPointerToListArrayNunits;
-  PyObject* pyPointerToListArrayNprint;
-  PyObject* pyPointerToIstatout;
-  PyObject* pyPointerToNstatout;
-  char* asciiOutputFile;                      // Output file names
-  char* plotOutputFile;
-  char* ucdOutputRoot;
-  int elasticStage, iterateEvent;             // PETSc logging
-
-  int ok = PyArg_ParseTuple(args, "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOsssii:elastc",
-			    &pyA,                              // Sparse matrix arrays
-			    &pyRhs,
-			    &pySol,
-			    &pyPointerToBextern,               // Force vectors
-			    &pyPointerToBtraction,
-			    &pyPointerToBgravity,
-			    &pyPointerToBconcForce,
-			    &pyPointerToBintern,
-			    &pyPointerToBresid,
-			    &pyPointerToBwink,
-			    &pyPointerToBwinkx,
-			    &pyPointerToDispVec,
-			    &pyPointerToDprev,
-			    &pyPointerToListArrayNforce,
-			    &pyPointerToListArrayGrav,
-			    &pyPointerToX,                     // Global arrays
-			    &pyPointerToD,
-			    &pyPointerToDeld,
-			    &pyPointerToDcur,
-			    &pyPointerToId,
-			    &pyPointerToIwink,
-			    &pyPointerToWink,
-			    &pyPointerToListArrayNsysdat,
-			    &pyPointerToListArrayIddmat,
-			    &pyPointerToIbond,                 // Boundary condition arrays
-			    &pyPointerToBond,
-			    &pyPointerToDx,                    // Slippery node arrays
-			    &pyPointerToDeldx,
-			    &pyPointerToDxcur,
-			    &pyPointerToDiforc,
-			    &pyPointerToIdx,
-			    &pyPointerToIwinkx,
-			    &pyPointerToWinkx,
-			    &pyPointerToIdslp,
-			    &pyPointerToIpslp,
-			    &pyPointerToIdhist,
-			    &pyPointerToFault,                 // Split node arrays
-			    &pyPointerToNfault,
-			    &pyPointerToDfault,
-			    &pyPointerToTfault,
-			    &pyPointerToS,                     // Local stiffness matrix arrays
-			    &pyPointerToStemp,
-			    &pyPointerToState,                 // Element arrays
-			    &pyPointerToDstate,
-			    &pyPointerToState0,
-			    &pyPointerToDmat,
-			    &pyPointerToIen,
-			    &pyPointerToLm,
-			    &pyPointerToLmx,
-			    &pyPointerToLmf,
-			    &pyPointerToIvfamily,
-			    &pyPointerToListArrayNpar,
-                            &pyPointerToIelindx,
-                            &pyPointerToTractionverts,         // Traction BC arrays
-                            &pyPointerToTractionvals,
-                            &pyPointerToGauss2d,
-                            &pyPointerToSh2d,
-                            &pyPointerToListArrayElementTypeInfo2d,
-			    &pyPointerToListArrayPropertyList, // Material property arrays
-			    &pyPointerToMaterialModelInfo,
-			    &pyPointerToGauss,                 // Element type arrays
-			    &pyPointerToSh,
-			    &pyPointerToShj,
-			    &pyPointerToListArrayElementTypeInfo,
-			    &pyPointerToHistry,                // Time information
-			    &pyPointerToListArrayRtimdat,
-			    &pyPointerToListArrayNtimdat,
-			    &pyPointerToListArrayNvisdat,
-			    &pyPointerToMaxstp,
-			    &pyPointerToDelt,
-			    &pyPointerToAlfa,
-			    &pyPointerToMaxit,
-			    &pyPointerToNtdinit,
-			    &pyPointerToLgdef,
-			    &pyPointerToUtol,
-			    &pyPointerToFtol,
-			    &pyPointerToEtol,
-			    &pyPointerToItmax,
-			    &pyPointerToListArrayRgiter,       // Iterative solution information
-			    &pyPointerToSkew,                  // Skew rotation information
-			    &pyPointerToListArrayNcodat,       // Input/output information
-			    &pyPointerToListArrayNunits,
-			    &pyPointerToListArrayNprint,
-			    &pyPointerToIstatout,
-			    &pyPointerToNstatout,
-			    &asciiOutputFile,                  // Output file names
-			    &plotOutputFile,
-			    &ucdOutputRoot,
-                            &elasticStage,                    // PETSc logging
-                            &iterateEvent);
-
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  Mat      A = (Mat) PyCObject_AsVoidPtr(pyA);
-  Vec      rhs = (Vec) PyCObject_AsVoidPtr(pyRhs);
-  Vec      sol = (Vec) PyCObject_AsVoidPtr(pySol);
-  double*  pointerToBextern = (double*) PyCObject_AsVoidPtr(pyPointerToBextern);
-  double*  pointerToBtraction = (double*) PyCObject_AsVoidPtr(pyPointerToBtraction);
-  double*  pointerToBgravity = (double*) PyCObject_AsVoidPtr(pyPointerToBgravity);
-  double*  pointerToBconcForce = (double*) PyCObject_AsVoidPtr(pyPointerToBconcForce);
-  double*  pointerToBintern = (double*) PyCObject_AsVoidPtr(pyPointerToBintern);
-  double*  pointerToBresid = (double*) PyCObject_AsVoidPtr(pyPointerToBresid);
-  double*  pointerToBwink = (double*) PyCObject_AsVoidPtr(pyPointerToBwink);
-  double*  pointerToBwinkx = (double*) PyCObject_AsVoidPtr(pyPointerToBwinkx);
-  double*  pointerToDispVec = (double*) PyCObject_AsVoidPtr(pyPointerToDispVec);
-  double*  pointerToDprev = (double*) PyCObject_AsVoidPtr(pyPointerToDprev);
-  int*  pointerToListArrayNforce = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNforce);
-  double*  pointerToListArrayGrav = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayGrav);
-  double*  pointerToX = (double*) PyCObject_AsVoidPtr(pyPointerToX);
-  double*  pointerToD = (double*) PyCObject_AsVoidPtr(pyPointerToD);
-  double*  pointerToDeld = (double*) PyCObject_AsVoidPtr(pyPointerToDeld);
-  double*  pointerToDcur = (double*) PyCObject_AsVoidPtr(pyPointerToDcur);
-  int*  pointerToId = (int*) PyCObject_AsVoidPtr(pyPointerToId);
-  int*  pointerToIwink = (int*) PyCObject_AsVoidPtr(pyPointerToIwink);
-  double*  pointerToWink = (double*) PyCObject_AsVoidPtr(pyPointerToWink);
-  int*  pointerToListArrayNsysdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNsysdat);
-  int*  pointerToListArrayIddmat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayIddmat);
-  int*  pointerToIbond = (int*) PyCObject_AsVoidPtr(pyPointerToIbond);
-  double*  pointerToBond = (double*) PyCObject_AsVoidPtr(pyPointerToBond);
-  double*  pointerToDx = (double*) PyCObject_AsVoidPtr(pyPointerToDx);
-  double*  pointerToDeldx = (double*) PyCObject_AsVoidPtr(pyPointerToDeldx);
-  double*  pointerToDxcur = (double*) PyCObject_AsVoidPtr(pyPointerToDxcur);
-  double*  pointerToDiforc = (double*) PyCObject_AsVoidPtr(pyPointerToDiforc);
-  int*  pointerToIdx = (int*) PyCObject_AsVoidPtr(pyPointerToIdx);
-  int*  pointerToIwinkx = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkx);
-  double*  pointerToWinkx = (double*) PyCObject_AsVoidPtr(pyPointerToWinkx);
-  int*  pointerToIdslp = (int*) PyCObject_AsVoidPtr(pyPointerToIdslp);
-  int*  pointerToIpslp = (int*) PyCObject_AsVoidPtr(pyPointerToIpslp);
-  int*  pointerToIdhist = (int*) PyCObject_AsVoidPtr(pyPointerToIdhist);
-  double*  pointerToFault = (double*) PyCObject_AsVoidPtr(pyPointerToFault);
-  int*  pointerToNfault = (int*) PyCObject_AsVoidPtr(pyPointerToNfault);
-  double*  pointerToDfault = (double*) PyCObject_AsVoidPtr(pyPointerToDfault);
-  double*  pointerToTfault = (double*) PyCObject_AsVoidPtr(pyPointerToTfault);
-  double*  pointerToS = (double*) PyCObject_AsVoidPtr(pyPointerToS);
-  double*  pointerToStemp = (double*) PyCObject_AsVoidPtr(pyPointerToStemp);
-  double*  pointerToState = (double*) PyCObject_AsVoidPtr(pyPointerToState);
-  double*  pointerToDstate = (double*) PyCObject_AsVoidPtr(pyPointerToDstate);
-  double*  pointerToState0 = (double*) PyCObject_AsVoidPtr(pyPointerToState0);
-  double*  pointerToDmat = (double*) PyCObject_AsVoidPtr(pyPointerToDmat);
-  int*  pointerToIen = (int*) PyCObject_AsVoidPtr(pyPointerToIen);
-  int*  pointerToLm = (int*) PyCObject_AsVoidPtr(pyPointerToLm);
-  int*  pointerToLmx = (int*) PyCObject_AsVoidPtr(pyPointerToLmx);
-  int*  pointerToLmf = (int*) PyCObject_AsVoidPtr(pyPointerToLmf);
-  int*  pointerToIvfamily = (int*) PyCObject_AsVoidPtr(pyPointerToIvfamily);
-  int*  pointerToListArrayNpar = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNpar);
-  int*  pointerToIelindx = (int*) PyCObject_AsVoidPtr(pyPointerToIelindx);
-  int*  pointerToTractionverts = (int*) PyCObject_AsVoidPtr(pyPointerToTractionverts);
-  double*  pointerToTractionvals = (double*) PyCObject_AsVoidPtr(pyPointerToTractionvals);
-  double*  pointerToGauss2d = (double*) PyCObject_AsVoidPtr(pyPointerToGauss2d);
-  double*  pointerToSh2d = (double*) PyCObject_AsVoidPtr(pyPointerToSh2d);
-  int*  pointerToListArrayElementTypeInfo2d = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayElementTypeInfo2d);
-  double*  pointerToListArrayPropertyList = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayPropertyList);
-  int*  pointerToMaterialModelInfo = (int*) PyCObject_AsVoidPtr(pyPointerToMaterialModelInfo);
-  double*  pointerToGauss = (double*) PyCObject_AsVoidPtr(pyPointerToGauss);
-  double*  pointerToSh = (double*) PyCObject_AsVoidPtr(pyPointerToSh);
-  double*  pointerToShj = (double*) PyCObject_AsVoidPtr(pyPointerToShj);
-  int*  pointerToListArrayElementTypeInfo = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayElementTypeInfo);
-  double*  pointerToHistry = (double*) PyCObject_AsVoidPtr(pyPointerToHistry);
-  double*  pointerToListArrayRtimdat = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayRtimdat);
-  int*  pointerToListArrayNtimdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNtimdat);
-  int*  pointerToListArrayNvisdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNvisdat);
-  int*  pointerToMaxstp = (int*) PyCObject_AsVoidPtr(pyPointerToMaxstp);
-  double*  pointerToDelt = (double*) PyCObject_AsVoidPtr(pyPointerToDelt);
-  double*  pointerToAlfa = (double*) PyCObject_AsVoidPtr(pyPointerToAlfa);
-  int*  pointerToMaxit = (int*) PyCObject_AsVoidPtr(pyPointerToMaxit);
-  int*  pointerToNtdinit = (int*) PyCObject_AsVoidPtr(pyPointerToNtdinit);
-  int*  pointerToLgdef = (int*) PyCObject_AsVoidPtr(pyPointerToLgdef);
-  double*  pointerToUtol = (double*) PyCObject_AsVoidPtr(pyPointerToUtol);
-  double*  pointerToFtol = (double*) PyCObject_AsVoidPtr(pyPointerToFtol);
-  double*  pointerToEtol = (double*) PyCObject_AsVoidPtr(pyPointerToEtol);
-  int*  pointerToItmax = (int*) PyCObject_AsVoidPtr(pyPointerToItmax);
-  double*  pointerToListArrayRgiter = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayRgiter);
-  double*  pointerToSkew = (double*) PyCObject_AsVoidPtr(pyPointerToSkew);
-  int*  pointerToListArrayNcodat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNcodat);
-  int*  pointerToListArrayNunits = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNunits);
-  int*  pointerToListArrayNprint = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNprint);
-  int*  pointerToIstatout = (int*) PyCObject_AsVoidPtr(pyPointerToIstatout);
-  int*  pointerToNstatout = (int*) PyCObject_AsVoidPtr(pyPointerToNstatout);
-
-  elastc_f(&A,                                // Sparse matrix arrays
-           &rhs,
-	   &sol,
-	   pointerToBextern,                  // Force vectors
-	   pointerToBtraction,
-	   pointerToBgravity,
-	   pointerToBconcForce,
-	   pointerToBintern,
-	   pointerToBresid,
-	   pointerToBwink,
-	   pointerToBwinkx,
-	   pointerToDispVec,
-	   pointerToDprev,
-	   pointerToListArrayNforce,
-	   pointerToListArrayGrav,
-	   pointerToX,                        // Global arrays
-	   pointerToD,
-	   pointerToDeld,
-	   pointerToDcur,
-	   pointerToId,
-	   pointerToIwink,
-	   pointerToWink,
-	   pointerToListArrayNsysdat,
-	   pointerToListArrayIddmat,
-	   pointerToIbond,                    // Boundary condition arrays
-	   pointerToBond,
-	   pointerToDx,                       // Slippery node arrays
-	   pointerToDeldx,
-	   pointerToDxcur,
-	   pointerToDiforc,
-	   pointerToIdx,
-	   pointerToIwinkx,
-	   pointerToWinkx,
-	   pointerToIdslp,
-	   pointerToIpslp,
-	   pointerToIdhist,
-	   pointerToFault,                    // Split node arrays
-	   pointerToNfault,
-	   pointerToDfault,
-	   pointerToTfault,
-	   pointerToS,                        // Local stiffness matrix arrays
-	   pointerToStemp,
-	   pointerToState,                    // Element arrays
-	   pointerToDstate,
-	   pointerToState0,
-	   pointerToDmat,
-	   pointerToIen,
-	   pointerToLm,
-	   pointerToLmx,
-	   pointerToLmf,
-	   pointerToIvfamily,
-	   pointerToListArrayNpar,
-	   pointerToIelindx,
-	   pointerToTractionverts,            // Traction BC arrays
-	   pointerToTractionvals,
-	   pointerToGauss2d,
-	   pointerToSh2d,
-	   pointerToListArrayElementTypeInfo2d,
-	   pointerToListArrayPropertyList,    // Material property arrays
-	   pointerToMaterialModelInfo,
-	   pointerToGauss,                    // Element type arrays
-	   pointerToSh,
-	   pointerToShj,
-	   pointerToListArrayElementTypeInfo,
-	   pointerToHistry,                   // Time information
-	   pointerToListArrayRtimdat,
-	   pointerToListArrayNtimdat,
-	   pointerToListArrayNvisdat,
-	   pointerToMaxstp,
-	   pointerToDelt,
-	   pointerToAlfa,
-	   pointerToMaxit,
-	   pointerToNtdinit,
-	   pointerToLgdef,
-	   pointerToUtol,
-	   pointerToFtol,
-	   pointerToEtol,
-	   pointerToItmax,
-	   pointerToListArrayRgiter,          // Iterative solution information
-	   pointerToSkew,                     // Skew rotation information
-	   pointerToListArrayNcodat,          // Input/output information
-	   pointerToListArrayNunits,
-	   pointerToListArrayNprint,
-	   pointerToIstatout,
-	   pointerToNstatout,
-	   asciiOutputFile,                   // Output file names
-	   plotOutputFile,
-	   ucdOutputRoot,
-           &elasticStage,
-           &iterateEvent,
-	   &errorcode,                        // Error codes
-	   errorstring,
-	   strlen(asciiOutputFile),           // String lengths
-	   strlen(plotOutputFile),
-	   strlen(ucdOutputRoot),
-	   sizeof(errorstring));
-
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    //int *fail = NULL;
-    //int i = fail[0];
-    return NULL;
-  }
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "asciiOutputFile:" << asciiOutputFile
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// version
-// $Id: elastc.cc,v 1.15 2005/06/07 19:39:11 willic3 Exp $
-
-// End of file

Deleted: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/elastc.h
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/elastc.h	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/elastc.h	2007-03-30 21:05:09 UTC (rev 6475)
@@ -1,45 +0,0 @@
-// -*- C++ -*-
-// 
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
-//
-//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
-//
-//  Permission is hereby granted, free of charge, to any person obtaining
-//  a copy of this software and associated documentation files (the
-//  "Software"), to deal in the Software without restriction, including
-//  without limitation the rights to use, copy, modify, merge, publish,
-//  distribute, sublicense, and/or sell copies of the Software, and to
-//  permit persons to whom the Software is furnished to do so, subject to
-//  the following conditions:
-//
-//  The above copyright notice and this permission notice shall be
-//  included in all copies or substantial portions of the Software.
-//
-//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 
-
-#if !defined(pypylith3d_elastc_h)
-#define pypylith3d_elastc_h
-
-// drive elastic solution
-extern char pypylith3d_elastc__name__[];
-extern char pypylith3d_elastc__doc__[];
-extern "C"
-PyObject * pypylith3d_elastc(PyObject *, PyObject *);
-
-#endif
-
-// version
-// $Id: elastc.h,v 1.2 2005/03/31 23:27:58 willic3 Exp $
-
-// End of file

Modified: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/interpolate.cc
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/interpolate.cc	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/interpolate.cc	2007-03-30 21:05:09 UTC (rev 6475)
@@ -39,7 +39,6 @@
 
 #include "interpolate.h"
 #include "exceptionhandler.h"
-#include "pylith3d_externs.h"
 #include <stdio.h>
 #include <string.h>
 

Added: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/libpylith3d.cc
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/libpylith3d.cc	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/libpylith3d.cc	2007-03-30 21:05:09 UTC (rev 6475)
@@ -0,0 +1,5832 @@
+// -*- C++ -*-
+// 
+//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
+//
+//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
+//
+//  Permission is hereby granted, free of charge, to any person obtaining
+//  a copy of this software and associated documentation files (the
+//  "Software"), to deal in the Software without restriction, including
+//  without limitation the rights to use, copy, modify, merge, publish,
+//  distribute, sublicense, and/or sell copies of the Software, and to
+//  permit persons to whom the Software is furnished to do so, subject to
+//  the following conditions:
+//
+//  The above copyright notice and this permission notice shall be
+//  included in all copies or substantial portions of the Software.
+//
+//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
+//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
+//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
+//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
+//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// 
+
+#include <portinfo>
+#include "journal/debug.h"
+
+#include <Python.h>
+
+#include "libpylith3d.h"
+#include "exceptionhandler.h"
+#include "pylith3d_externs.h"
+#include <stdio.h>
+#include <string.h>
+
+
+// Autocompute gravitational prestresses.
+
+char pypylith3d_autoprestr__doc__[] = "";
+char pypylith3d_autoprestr__name__[] = "autoprestr";
+
+PyObject * pypylith3d_autoprestr(PyObject *, PyObject *args)
+{
+  PyObject* pyA;                             // Sparse matrix array
+  PyObject* pyRhs;
+  PyObject* pySol;
+  PyObject* pyPointerToBextern;               // Force vectors
+  PyObject* pyPointerToBtraction;
+  PyObject* pyPointerToBgravity;
+  PyObject* pyPointerToBconcForce;
+  PyObject* pyPointerToBintern;
+  PyObject* pyPointerToBresid;
+  PyObject* pyPointerToBwink;
+  PyObject* pyPointerToBwinkx;
+  PyObject* pyPointerToDispVec;
+  PyObject* pyPointerToDprev;
+  PyObject* pyPointerToListArrayNforce;
+  PyObject* pyPointerToListArrayGrav;
+  PyObject* pyPointerToX;                     // Global arrays
+  PyObject* pyPointerToD;
+  PyObject* pyPointerToDeld;
+  PyObject* pyPointerToDcur;
+  PyObject* pyPointerToId;
+  PyObject* pyPointerToIwink;
+  PyObject* pyPointerToWink;
+  PyObject* pyPointerToListArrayNsysdat;
+  PyObject* pyPointerToListArrayIddmat;
+  PyObject* pyPointerToIbond;                 // Boundary condition arrays
+  PyObject* pyPointerToBond;
+  PyObject* pyPointerToDx;                    // Slippery node arrays
+  PyObject* pyPointerToDeldx;
+  PyObject* pyPointerToDxcur;
+  PyObject* pyPointerToDiforc;
+  PyObject* pyPointerToIdx;
+  PyObject* pyPointerToIwinkx;
+  PyObject* pyPointerToWinkx;
+  PyObject* pyPointerToIdslp;
+  PyObject* pyPointerToIpslp;
+  PyObject* pyPointerToIdhist;
+  PyObject* pyPointerToFault;                 // Split node arrays
+  PyObject* pyPointerToNfault;
+  PyObject* pyPointerToDfault;
+  PyObject* pyPointerToTfault;
+  PyObject* pyPointerToS;                     // Local stiffness matrix arrays
+  PyObject* pyPointerToStemp;
+  PyObject* pyPointerToState;                 // Element arrays
+  PyObject* pyPointerToDstate;
+  PyObject* pyPointerToState0;
+  PyObject* pyPointerToDmat;
+  PyObject* pyPointerToIens;
+  PyObject* pyPointerToLm;
+  PyObject* pyPointerToLmx;
+  PyObject* pyPointerToLmf;
+  PyObject* pyPointerToIvfamily;
+  PyObject* pyPointerToListArrayNpar;
+  PyObject* pyPointerToIelindx;
+  PyObject* pyPointerToTractionverts;         // Traction BC arrays
+  PyObject* pyPointerToTractionvals;
+  PyObject* pyPointerToGauss2d;
+  PyObject* pyPointerToSh2d;
+  PyObject* pyPointerToListArrayElementTypeInfo2d;
+  PyObject* pyPointerToListArrayPropertyList; // Material property arrays
+  PyObject* pyPointerToMaterialModelInfo;
+  PyObject* pyPointerToGauss;                 // Element type arrays
+  PyObject* pyPointerToSh;
+  PyObject* pyPointerToShj;
+  PyObject* pyPointerToListArrayElementTypeInfo;
+  PyObject* pyPointerToHistry;                // Time information
+  PyObject* pyPointerToListArrayRtimdat;
+  PyObject* pyPointerToListArrayNtimdat;
+  PyObject* pyPointerToListArrayNvisdat;
+  PyObject* pyPointerToMaxstp;
+  PyObject* pyPointerToDelt;
+  PyObject* pyPointerToAlfa;
+  PyObject* pyPointerToMaxit;
+  PyObject* pyPointerToNtdinit;
+  PyObject* pyPointerToLgdef;
+  PyObject* pyPointerToUtol;
+  PyObject* pyPointerToFtol;
+  PyObject* pyPointerToEtol;
+  PyObject* pyPointerToItmax;
+  PyObject* pyPointerToListArrayRgiter;       // Iterative solution information
+  PyObject* pyPointerToSkew;                  // Skew rotation information
+  PyObject* pyPointerToListArrayNcodat;       // Input/output information
+  PyObject* pyPointerToListArrayNunits;
+  PyObject* pyPointerToListArrayNprint;
+  PyObject* pyPointerToIstatout;
+  PyObject* pyPointerToNstatout;
+  char* asciiOutputFile;                      // Output file names
+  char* plotOutputFile;
+  char* ucdOutputRoot;
+  int autoprestrStage, iterateEvent;          // PETSc logging
+
+  int ok = PyArg_ParseTuple(args, "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOsssii:autoprestr",
+                            &pyA,                             // Sparse matrix arrays
+                            &pyRhs,
+                            &pySol,
+                            &pyPointerToBextern,               // Force vectors
+                            &pyPointerToBtraction,
+                            &pyPointerToBgravity,
+                            &pyPointerToBconcForce,
+                            &pyPointerToBintern,
+                            &pyPointerToBresid,
+                            &pyPointerToBwink,
+                            &pyPointerToBwinkx,
+                            &pyPointerToDispVec,
+                            &pyPointerToDprev,
+                            &pyPointerToListArrayNforce,
+                            &pyPointerToListArrayGrav,
+                            &pyPointerToX,                     // Global arrays
+                            &pyPointerToD,
+                            &pyPointerToDeld,
+                            &pyPointerToDcur,
+                            &pyPointerToId,
+                            &pyPointerToIwink,
+                            &pyPointerToWink,
+                            &pyPointerToListArrayNsysdat,
+                            &pyPointerToListArrayIddmat,
+                            &pyPointerToIbond,                 // Boundary condition arrays
+                            &pyPointerToBond,
+                            &pyPointerToDx,                    // Slippery node arrays
+                            &pyPointerToDeldx,
+                            &pyPointerToDxcur,
+                            &pyPointerToDiforc,
+                            &pyPointerToIdx,
+                            &pyPointerToIwinkx,
+                            &pyPointerToWinkx,
+                            &pyPointerToIdslp,
+                            &pyPointerToIpslp,
+                            &pyPointerToIdhist,
+                            &pyPointerToFault,                 // Split node arrays
+                            &pyPointerToNfault,
+                            &pyPointerToDfault,
+                            &pyPointerToTfault,
+                            &pyPointerToS,                     // Local stiffness matrix arrays
+                            &pyPointerToStemp,
+                            &pyPointerToState,                 // Element arrays
+                            &pyPointerToDstate,
+                            &pyPointerToState0,
+                            &pyPointerToDmat,
+                            &pyPointerToIens,
+                            &pyPointerToLm,
+                            &pyPointerToLmx,
+                            &pyPointerToLmf,
+                            &pyPointerToIvfamily,
+                            &pyPointerToListArrayNpar,
+                            &pyPointerToIelindx,
+                            &pyPointerToTractionverts,         // Traction BC arrays
+                            &pyPointerToTractionvals,
+                            &pyPointerToGauss2d,
+                            &pyPointerToSh2d,
+                            &pyPointerToListArrayElementTypeInfo2d,
+                            &pyPointerToListArrayPropertyList, // Material property arrays
+                            &pyPointerToMaterialModelInfo,
+                            &pyPointerToGauss,                 // Element type arrays
+                            &pyPointerToSh,
+                            &pyPointerToShj,
+                            &pyPointerToListArrayElementTypeInfo,
+                            &pyPointerToHistry,                // Time information
+                            &pyPointerToListArrayRtimdat,
+                            &pyPointerToListArrayNtimdat,
+                            &pyPointerToListArrayNvisdat,
+                            &pyPointerToMaxstp,
+                            &pyPointerToDelt,
+                            &pyPointerToAlfa,
+                            &pyPointerToMaxit,
+                            &pyPointerToNtdinit,
+                            &pyPointerToLgdef,
+                            &pyPointerToUtol,
+                            &pyPointerToFtol,
+                            &pyPointerToEtol,
+                            &pyPointerToItmax,
+                            &pyPointerToListArrayRgiter,       // Iterative solution information
+                            &pyPointerToSkew,                  // Skew rotation information
+                            &pyPointerToListArrayNcodat,       // Input/output information
+                            &pyPointerToListArrayNunits,
+                            &pyPointerToListArrayNprint,
+                            &pyPointerToIstatout,
+                            &pyPointerToNstatout,
+                            &asciiOutputFile,                  // Output file names
+                            &plotOutputFile,
+                            &ucdOutputRoot,
+                            &autoprestrStage,                  // PETSc logging
+                            &iterateEvent);
+
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  Mat      A = (Mat) PyCObject_AsVoidPtr(pyA);
+  Vec      rhs = (Vec) PyCObject_AsVoidPtr(pyRhs);
+  Vec      sol = (Vec) PyCObject_AsVoidPtr(pySol);
+  double*  pointerToBextern = (double*) PyCObject_AsVoidPtr(pyPointerToBextern);
+  double*  pointerToBtraction = (double*) PyCObject_AsVoidPtr(pyPointerToBtraction);
+  double*  pointerToBgravity = (double*) PyCObject_AsVoidPtr(pyPointerToBgravity);
+  double*  pointerToBconcForce = (double*) PyCObject_AsVoidPtr(pyPointerToBconcForce);
+  double*  pointerToBintern = (double*) PyCObject_AsVoidPtr(pyPointerToBintern);
+  double*  pointerToBresid = (double*) PyCObject_AsVoidPtr(pyPointerToBresid);
+  double*  pointerToBwink = (double*) PyCObject_AsVoidPtr(pyPointerToBwink);
+  double*  pointerToBwinkx = (double*) PyCObject_AsVoidPtr(pyPointerToBwinkx);
+  double*  pointerToDispVec = (double*) PyCObject_AsVoidPtr(pyPointerToDispVec);
+  double*  pointerToDprev = (double*) PyCObject_AsVoidPtr(pyPointerToDprev);
+  int*  pointerToListArrayNforce = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNforce);
+  double*  pointerToListArrayGrav = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayGrav);
+  double*  pointerToX = (double*) PyCObject_AsVoidPtr(pyPointerToX);
+  double*  pointerToD = (double*) PyCObject_AsVoidPtr(pyPointerToD);
+  double*  pointerToDeld = (double*) PyCObject_AsVoidPtr(pyPointerToDeld);
+  double*  pointerToDcur = (double*) PyCObject_AsVoidPtr(pyPointerToDcur);
+  int*  pointerToId = (int*) PyCObject_AsVoidPtr(pyPointerToId);
+  int*  pointerToIwink = (int*) PyCObject_AsVoidPtr(pyPointerToIwink);
+  double*  pointerToWink = (double*) PyCObject_AsVoidPtr(pyPointerToWink);
+  int*  pointerToListArrayNsysdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNsysdat);
+  int*  pointerToListArrayIddmat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayIddmat);
+  int*  pointerToIbond = (int*) PyCObject_AsVoidPtr(pyPointerToIbond);
+  double*  pointerToBond = (double*) PyCObject_AsVoidPtr(pyPointerToBond);
+  double*  pointerToDx = (double*) PyCObject_AsVoidPtr(pyPointerToDx);
+  double*  pointerToDeldx = (double*) PyCObject_AsVoidPtr(pyPointerToDeldx);
+  double*  pointerToDxcur = (double*) PyCObject_AsVoidPtr(pyPointerToDxcur);
+  double*  pointerToDiforc = (double*) PyCObject_AsVoidPtr(pyPointerToDiforc);
+  int*  pointerToIdx = (int*) PyCObject_AsVoidPtr(pyPointerToIdx);
+  int*  pointerToIwinkx = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkx);
+  double*  pointerToWinkx = (double*) PyCObject_AsVoidPtr(pyPointerToWinkx);
+  int*  pointerToIdslp = (int*) PyCObject_AsVoidPtr(pyPointerToIdslp);
+  int*  pointerToIpslp = (int*) PyCObject_AsVoidPtr(pyPointerToIpslp);
+  int*  pointerToIdhist = (int*) PyCObject_AsVoidPtr(pyPointerToIdhist);
+  double*  pointerToFault = (double*) PyCObject_AsVoidPtr(pyPointerToFault);
+  int*  pointerToNfault = (int*) PyCObject_AsVoidPtr(pyPointerToNfault);
+  double*  pointerToDfault = (double*) PyCObject_AsVoidPtr(pyPointerToDfault);
+  double*  pointerToTfault = (double*) PyCObject_AsVoidPtr(pyPointerToTfault);
+  double*  pointerToS = (double*) PyCObject_AsVoidPtr(pyPointerToS);
+  double*  pointerToStemp = (double*) PyCObject_AsVoidPtr(pyPointerToStemp);
+  double*  pointerToState = (double*) PyCObject_AsVoidPtr(pyPointerToState);
+  double*  pointerToDstate = (double*) PyCObject_AsVoidPtr(pyPointerToDstate);
+  double*  pointerToState0 = (double*) PyCObject_AsVoidPtr(pyPointerToState0);
+  double*  pointerToDmat = (double*) PyCObject_AsVoidPtr(pyPointerToDmat);
+  int*  pointerToIens = (int*) PyCObject_AsVoidPtr(pyPointerToIens);
+  int*  pointerToLm = (int*) PyCObject_AsVoidPtr(pyPointerToLm);
+  int*  pointerToLmx = (int*) PyCObject_AsVoidPtr(pyPointerToLmx);
+  int*  pointerToLmf = (int*) PyCObject_AsVoidPtr(pyPointerToLmf);
+  int*  pointerToIvfamily = (int*) PyCObject_AsVoidPtr(pyPointerToIvfamily);
+  int*  pointerToListArrayNpar = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNpar);
+  int*  pointerToIelindx = (int*) PyCObject_AsVoidPtr(pyPointerToIelindx);
+  int*  pointerToTractionverts = (int*) PyCObject_AsVoidPtr(pyPointerToTractionverts);
+  double*  pointerToTractionvals = (double*) PyCObject_AsVoidPtr(pyPointerToTractionvals);
+  double*  pointerToGauss2d = (double*) PyCObject_AsVoidPtr(pyPointerToGauss2d);
+  double*  pointerToSh2d = (double*) PyCObject_AsVoidPtr(pyPointerToSh2d);
+  int*  pointerToListArrayElementTypeInfo2d = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayElementTypeInfo2d);
+  double*  pointerToListArrayPropertyList = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayPropertyList);
+  int*  pointerToMaterialModelInfo = (int*) PyCObject_AsVoidPtr(pyPointerToMaterialModelInfo);
+  double*  pointerToGauss = (double*) PyCObject_AsVoidPtr(pyPointerToGauss);
+  double*  pointerToSh = (double*) PyCObject_AsVoidPtr(pyPointerToSh);
+  double*  pointerToShj = (double*) PyCObject_AsVoidPtr(pyPointerToShj);
+  int*  pointerToListArrayElementTypeInfo = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayElementTypeInfo);
+  double*  pointerToHistry = (double*) PyCObject_AsVoidPtr(pyPointerToHistry);
+  double*  pointerToListArrayRtimdat = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayRtimdat);
+  int*  pointerToListArrayNtimdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNtimdat);
+  int*  pointerToListArrayNvisdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNvisdat);
+  int*  pointerToMaxstp = (int*) PyCObject_AsVoidPtr(pyPointerToMaxstp);
+  double*  pointerToDelt = (double*) PyCObject_AsVoidPtr(pyPointerToDelt);
+  double*  pointerToAlfa = (double*) PyCObject_AsVoidPtr(pyPointerToAlfa);
+  int*  pointerToMaxit = (int*) PyCObject_AsVoidPtr(pyPointerToMaxit);
+  int*  pointerToNtdinit = (int*) PyCObject_AsVoidPtr(pyPointerToNtdinit);
+  int*  pointerToLgdef = (int*) PyCObject_AsVoidPtr(pyPointerToLgdef);
+  double*  pointerToUtol = (double*) PyCObject_AsVoidPtr(pyPointerToUtol);
+  double*  pointerToFtol = (double*) PyCObject_AsVoidPtr(pyPointerToFtol);
+  double*  pointerToEtol = (double*) PyCObject_AsVoidPtr(pyPointerToEtol);
+  int*  pointerToItmax = (int*) PyCObject_AsVoidPtr(pyPointerToItmax);
+  double*  pointerToListArrayRgiter = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayRgiter);
+  double*  pointerToSkew = (double*) PyCObject_AsVoidPtr(pyPointerToSkew);
+  int*  pointerToListArrayNcodat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNcodat);
+  int*  pointerToListArrayNunits = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNunits);
+  int*  pointerToListArrayNprint = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNprint);
+  int*  pointerToIstatout = (int*) PyCObject_AsVoidPtr(pyPointerToIstatout);
+  int*  pointerToNstatout = (int*) PyCObject_AsVoidPtr(pyPointerToNstatout);
+
+  autoprestr_f(&A,                                // Sparse matrix arrays
+               &rhs,
+               &sol,
+               pointerToBextern,                  // Force vectors
+               pointerToBtraction,
+               pointerToBgravity,
+               pointerToBconcForce,
+               pointerToBintern,
+               pointerToBresid,
+               pointerToBwink,
+               pointerToBwinkx,
+               pointerToDispVec,
+               pointerToDprev,
+               pointerToListArrayNforce,
+               pointerToListArrayGrav,
+               pointerToX,                        // Global arrays
+               pointerToD,
+               pointerToDeld,
+               pointerToDcur,
+               pointerToId,
+               pointerToIwink,
+               pointerToWink,
+               pointerToListArrayNsysdat,
+               pointerToListArrayIddmat,
+               pointerToIbond,                    // Boundary condition arrays
+               pointerToBond,
+               pointerToDx,                       // Slippery node arrays
+               pointerToDeldx,
+               pointerToDxcur,
+               pointerToDiforc,
+               pointerToIdx,
+               pointerToIwinkx,
+               pointerToWinkx,
+               pointerToIdslp,
+               pointerToIpslp,
+               pointerToIdhist,
+               pointerToFault,                    // Split node arrays
+               pointerToNfault,
+               pointerToDfault,
+               pointerToTfault,
+               pointerToS,                        // Local stiffness matrix arrays
+               pointerToStemp,
+               pointerToState,                    // Element arrays
+               pointerToDstate,
+               pointerToState0,
+               pointerToDmat,
+               pointerToIens,
+               pointerToLm,
+               pointerToLmx,
+               pointerToLmf,
+               pointerToIvfamily,
+               pointerToListArrayNpar,
+               pointerToIelindx,
+               pointerToTractionverts,            // Traction BC arrays
+               pointerToTractionvals,
+               pointerToGauss2d,
+               pointerToSh2d,
+               pointerToListArrayElementTypeInfo2d,
+               pointerToListArrayPropertyList,    // Material property arrays
+               pointerToMaterialModelInfo,
+               pointerToGauss,                    // Element type arrays
+               pointerToSh,
+               pointerToShj,
+               pointerToListArrayElementTypeInfo,
+               pointerToHistry,                   // Time information
+               pointerToListArrayRtimdat,
+               pointerToListArrayNtimdat,
+               pointerToListArrayNvisdat,
+               pointerToMaxstp,
+               pointerToDelt,
+               pointerToAlfa,
+               pointerToMaxit,
+               pointerToNtdinit,
+               pointerToLgdef,
+               pointerToUtol,
+               pointerToFtol,
+               pointerToEtol,
+               pointerToItmax,
+               pointerToListArrayRgiter,          // Iterative solution information
+               pointerToSkew,                     // Skew rotation information
+               pointerToListArrayNcodat,          // Input/output information
+               pointerToListArrayNunits,
+               pointerToListArrayNprint,
+               pointerToIstatout,
+               pointerToNstatout,
+               asciiOutputFile,                   // Output file names
+               plotOutputFile,
+               ucdOutputRoot,
+               &autoprestrStage,
+               &iterateEvent,
+               &errorcode,                        // Error codes
+               errorstring,
+               strlen(asciiOutputFile),           // String lengths
+               strlen(plotOutputFile),
+               strlen(ucdOutputRoot),
+               sizeof(errorstring));
+
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "asciiOutputFile:" << asciiOutputFile
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+
+// Perform the elastic solution.
+
+char pypylith3d_elastc__doc__[] = "";
+char pypylith3d_elastc__name__[] = "elastc";
+
+PyObject * pypylith3d_elastc(PyObject *, PyObject *args)
+{
+  PyObject* pyA;                              // Sparse matrix arrays
+  PyObject* pyRhs;
+  PyObject* pySol;
+  PyObject* pyPointerToBextern;               // Force vectors
+  PyObject* pyPointerToBtraction;
+  PyObject* pyPointerToBgravity;
+  PyObject* pyPointerToBconcForce;
+  PyObject* pyPointerToBintern;
+  PyObject* pyPointerToBresid;
+  PyObject* pyPointerToBwink;
+  PyObject* pyPointerToBwinkx;
+  PyObject* pyPointerToDispVec;
+  PyObject* pyPointerToDprev;
+  PyObject* pyPointerToListArrayNforce;
+  PyObject* pyPointerToListArrayGrav;
+  PyObject* pyPointerToX;                     // Global arrays
+  PyObject* pyPointerToD;
+  PyObject* pyPointerToDeld;
+  PyObject* pyPointerToDcur;
+  PyObject* pyPointerToId;
+  PyObject* pyPointerToIwink;
+  PyObject* pyPointerToWink;
+  PyObject* pyPointerToListArrayNsysdat;
+  PyObject* pyPointerToListArrayIddmat;
+  PyObject* pyPointerToIbond;                 // Boundary condition arrays
+  PyObject* pyPointerToBond;
+  PyObject* pyPointerToDx;                    // Slippery node arrays
+  PyObject* pyPointerToDeldx;
+  PyObject* pyPointerToDxcur;
+  PyObject* pyPointerToDiforc;
+  PyObject* pyPointerToIdx;
+  PyObject* pyPointerToIwinkx;
+  PyObject* pyPointerToWinkx;
+  PyObject* pyPointerToIdslp;
+  PyObject* pyPointerToIpslp;
+  PyObject* pyPointerToIdhist;
+  PyObject* pyPointerToFault;                 // Split node arrays
+  PyObject* pyPointerToNfault;
+  PyObject* pyPointerToDfault;
+  PyObject* pyPointerToTfault;
+  PyObject* pyPointerToS;                     // Local stiffness matrix arrays
+  PyObject* pyPointerToStemp;
+  PyObject* pyPointerToState;                 // Element arrays
+  PyObject* pyPointerToDstate;
+  PyObject* pyPointerToState0;
+  PyObject* pyPointerToDmat;
+  PyObject* pyPointerToIen;
+  PyObject* pyPointerToLm;
+  PyObject* pyPointerToLmx;
+  PyObject* pyPointerToLmf;
+  PyObject* pyPointerToIvfamily;
+  PyObject* pyPointerToListArrayNpar;
+  PyObject* pyPointerToIelindx;
+  PyObject* pyPointerToTractionverts;         // Traction BC arrays
+  PyObject* pyPointerToTractionvals;
+  PyObject* pyPointerToGauss2d;
+  PyObject* pyPointerToSh2d;
+  PyObject* pyPointerToListArrayElementTypeInfo2d;
+  PyObject* pyPointerToListArrayPropertyList; // Material property arrays
+  PyObject* pyPointerToMaterialModelInfo;
+  PyObject* pyPointerToGauss;                 // Element type arrays
+  PyObject* pyPointerToSh;
+  PyObject* pyPointerToShj;
+  PyObject* pyPointerToListArrayElementTypeInfo;
+  PyObject* pyPointerToHistry;                // Time information
+  PyObject* pyPointerToListArrayRtimdat;
+  PyObject* pyPointerToListArrayNtimdat;
+  PyObject* pyPointerToListArrayNvisdat;
+  PyObject* pyPointerToMaxstp;
+  PyObject* pyPointerToDelt;
+  PyObject* pyPointerToAlfa;
+  PyObject* pyPointerToMaxit;
+  PyObject* pyPointerToNtdinit;
+  PyObject* pyPointerToLgdef;
+  PyObject* pyPointerToUtol;
+  PyObject* pyPointerToFtol;
+  PyObject* pyPointerToEtol;
+  PyObject* pyPointerToItmax;
+  PyObject* pyPointerToListArrayRgiter;       // Iterative solution information
+  PyObject* pyPointerToSkew;                  // Skew rotation information
+  PyObject* pyPointerToListArrayNcodat;       // Input/output information
+  PyObject* pyPointerToListArrayNunits;
+  PyObject* pyPointerToListArrayNprint;
+  PyObject* pyPointerToIstatout;
+  PyObject* pyPointerToNstatout;
+  char* asciiOutputFile;                      // Output file names
+  char* plotOutputFile;
+  char* ucdOutputRoot;
+  int elasticStage, iterateEvent;             // PETSc logging
+
+  int ok = PyArg_ParseTuple(args, "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOsssii:elastc",
+			    &pyA,                              // Sparse matrix arrays
+			    &pyRhs,
+			    &pySol,
+			    &pyPointerToBextern,               // Force vectors
+			    &pyPointerToBtraction,
+			    &pyPointerToBgravity,
+			    &pyPointerToBconcForce,
+			    &pyPointerToBintern,
+			    &pyPointerToBresid,
+			    &pyPointerToBwink,
+			    &pyPointerToBwinkx,
+			    &pyPointerToDispVec,
+			    &pyPointerToDprev,
+			    &pyPointerToListArrayNforce,
+			    &pyPointerToListArrayGrav,
+			    &pyPointerToX,                     // Global arrays
+			    &pyPointerToD,
+			    &pyPointerToDeld,
+			    &pyPointerToDcur,
+			    &pyPointerToId,
+			    &pyPointerToIwink,
+			    &pyPointerToWink,
+			    &pyPointerToListArrayNsysdat,
+			    &pyPointerToListArrayIddmat,
+			    &pyPointerToIbond,                 // Boundary condition arrays
+			    &pyPointerToBond,
+			    &pyPointerToDx,                    // Slippery node arrays
+			    &pyPointerToDeldx,
+			    &pyPointerToDxcur,
+			    &pyPointerToDiforc,
+			    &pyPointerToIdx,
+			    &pyPointerToIwinkx,
+			    &pyPointerToWinkx,
+			    &pyPointerToIdslp,
+			    &pyPointerToIpslp,
+			    &pyPointerToIdhist,
+			    &pyPointerToFault,                 // Split node arrays
+			    &pyPointerToNfault,
+			    &pyPointerToDfault,
+			    &pyPointerToTfault,
+			    &pyPointerToS,                     // Local stiffness matrix arrays
+			    &pyPointerToStemp,
+			    &pyPointerToState,                 // Element arrays
+			    &pyPointerToDstate,
+			    &pyPointerToState0,
+			    &pyPointerToDmat,
+			    &pyPointerToIen,
+			    &pyPointerToLm,
+			    &pyPointerToLmx,
+			    &pyPointerToLmf,
+			    &pyPointerToIvfamily,
+			    &pyPointerToListArrayNpar,
+                            &pyPointerToIelindx,
+                            &pyPointerToTractionverts,         // Traction BC arrays
+                            &pyPointerToTractionvals,
+                            &pyPointerToGauss2d,
+                            &pyPointerToSh2d,
+                            &pyPointerToListArrayElementTypeInfo2d,
+			    &pyPointerToListArrayPropertyList, // Material property arrays
+			    &pyPointerToMaterialModelInfo,
+			    &pyPointerToGauss,                 // Element type arrays
+			    &pyPointerToSh,
+			    &pyPointerToShj,
+			    &pyPointerToListArrayElementTypeInfo,
+			    &pyPointerToHistry,                // Time information
+			    &pyPointerToListArrayRtimdat,
+			    &pyPointerToListArrayNtimdat,
+			    &pyPointerToListArrayNvisdat,
+			    &pyPointerToMaxstp,
+			    &pyPointerToDelt,
+			    &pyPointerToAlfa,
+			    &pyPointerToMaxit,
+			    &pyPointerToNtdinit,
+			    &pyPointerToLgdef,
+			    &pyPointerToUtol,
+			    &pyPointerToFtol,
+			    &pyPointerToEtol,
+			    &pyPointerToItmax,
+			    &pyPointerToListArrayRgiter,       // Iterative solution information
+			    &pyPointerToSkew,                  // Skew rotation information
+			    &pyPointerToListArrayNcodat,       // Input/output information
+			    &pyPointerToListArrayNunits,
+			    &pyPointerToListArrayNprint,
+			    &pyPointerToIstatout,
+			    &pyPointerToNstatout,
+			    &asciiOutputFile,                  // Output file names
+			    &plotOutputFile,
+			    &ucdOutputRoot,
+                            &elasticStage,                    // PETSc logging
+                            &iterateEvent);
+
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  Mat      A = (Mat) PyCObject_AsVoidPtr(pyA);
+  Vec      rhs = (Vec) PyCObject_AsVoidPtr(pyRhs);
+  Vec      sol = (Vec) PyCObject_AsVoidPtr(pySol);
+  double*  pointerToBextern = (double*) PyCObject_AsVoidPtr(pyPointerToBextern);
+  double*  pointerToBtraction = (double*) PyCObject_AsVoidPtr(pyPointerToBtraction);
+  double*  pointerToBgravity = (double*) PyCObject_AsVoidPtr(pyPointerToBgravity);
+  double*  pointerToBconcForce = (double*) PyCObject_AsVoidPtr(pyPointerToBconcForce);
+  double*  pointerToBintern = (double*) PyCObject_AsVoidPtr(pyPointerToBintern);
+  double*  pointerToBresid = (double*) PyCObject_AsVoidPtr(pyPointerToBresid);
+  double*  pointerToBwink = (double*) PyCObject_AsVoidPtr(pyPointerToBwink);
+  double*  pointerToBwinkx = (double*) PyCObject_AsVoidPtr(pyPointerToBwinkx);
+  double*  pointerToDispVec = (double*) PyCObject_AsVoidPtr(pyPointerToDispVec);
+  double*  pointerToDprev = (double*) PyCObject_AsVoidPtr(pyPointerToDprev);
+  int*  pointerToListArrayNforce = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNforce);
+  double*  pointerToListArrayGrav = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayGrav);
+  double*  pointerToX = (double*) PyCObject_AsVoidPtr(pyPointerToX);
+  double*  pointerToD = (double*) PyCObject_AsVoidPtr(pyPointerToD);
+  double*  pointerToDeld = (double*) PyCObject_AsVoidPtr(pyPointerToDeld);
+  double*  pointerToDcur = (double*) PyCObject_AsVoidPtr(pyPointerToDcur);
+  int*  pointerToId = (int*) PyCObject_AsVoidPtr(pyPointerToId);
+  int*  pointerToIwink = (int*) PyCObject_AsVoidPtr(pyPointerToIwink);
+  double*  pointerToWink = (double*) PyCObject_AsVoidPtr(pyPointerToWink);
+  int*  pointerToListArrayNsysdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNsysdat);
+  int*  pointerToListArrayIddmat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayIddmat);
+  int*  pointerToIbond = (int*) PyCObject_AsVoidPtr(pyPointerToIbond);
+  double*  pointerToBond = (double*) PyCObject_AsVoidPtr(pyPointerToBond);
+  double*  pointerToDx = (double*) PyCObject_AsVoidPtr(pyPointerToDx);
+  double*  pointerToDeldx = (double*) PyCObject_AsVoidPtr(pyPointerToDeldx);
+  double*  pointerToDxcur = (double*) PyCObject_AsVoidPtr(pyPointerToDxcur);
+  double*  pointerToDiforc = (double*) PyCObject_AsVoidPtr(pyPointerToDiforc);
+  int*  pointerToIdx = (int*) PyCObject_AsVoidPtr(pyPointerToIdx);
+  int*  pointerToIwinkx = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkx);
+  double*  pointerToWinkx = (double*) PyCObject_AsVoidPtr(pyPointerToWinkx);
+  int*  pointerToIdslp = (int*) PyCObject_AsVoidPtr(pyPointerToIdslp);
+  int*  pointerToIpslp = (int*) PyCObject_AsVoidPtr(pyPointerToIpslp);
+  int*  pointerToIdhist = (int*) PyCObject_AsVoidPtr(pyPointerToIdhist);
+  double*  pointerToFault = (double*) PyCObject_AsVoidPtr(pyPointerToFault);
+  int*  pointerToNfault = (int*) PyCObject_AsVoidPtr(pyPointerToNfault);
+  double*  pointerToDfault = (double*) PyCObject_AsVoidPtr(pyPointerToDfault);
+  double*  pointerToTfault = (double*) PyCObject_AsVoidPtr(pyPointerToTfault);
+  double*  pointerToS = (double*) PyCObject_AsVoidPtr(pyPointerToS);
+  double*  pointerToStemp = (double*) PyCObject_AsVoidPtr(pyPointerToStemp);
+  double*  pointerToState = (double*) PyCObject_AsVoidPtr(pyPointerToState);
+  double*  pointerToDstate = (double*) PyCObject_AsVoidPtr(pyPointerToDstate);
+  double*  pointerToState0 = (double*) PyCObject_AsVoidPtr(pyPointerToState0);
+  double*  pointerToDmat = (double*) PyCObject_AsVoidPtr(pyPointerToDmat);
+  int*  pointerToIen = (int*) PyCObject_AsVoidPtr(pyPointerToIen);
+  int*  pointerToLm = (int*) PyCObject_AsVoidPtr(pyPointerToLm);
+  int*  pointerToLmx = (int*) PyCObject_AsVoidPtr(pyPointerToLmx);
+  int*  pointerToLmf = (int*) PyCObject_AsVoidPtr(pyPointerToLmf);
+  int*  pointerToIvfamily = (int*) PyCObject_AsVoidPtr(pyPointerToIvfamily);
+  int*  pointerToListArrayNpar = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNpar);
+  int*  pointerToIelindx = (int*) PyCObject_AsVoidPtr(pyPointerToIelindx);
+  int*  pointerToTractionverts = (int*) PyCObject_AsVoidPtr(pyPointerToTractionverts);
+  double*  pointerToTractionvals = (double*) PyCObject_AsVoidPtr(pyPointerToTractionvals);
+  double*  pointerToGauss2d = (double*) PyCObject_AsVoidPtr(pyPointerToGauss2d);
+  double*  pointerToSh2d = (double*) PyCObject_AsVoidPtr(pyPointerToSh2d);
+  int*  pointerToListArrayElementTypeInfo2d = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayElementTypeInfo2d);
+  double*  pointerToListArrayPropertyList = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayPropertyList);
+  int*  pointerToMaterialModelInfo = (int*) PyCObject_AsVoidPtr(pyPointerToMaterialModelInfo);
+  double*  pointerToGauss = (double*) PyCObject_AsVoidPtr(pyPointerToGauss);
+  double*  pointerToSh = (double*) PyCObject_AsVoidPtr(pyPointerToSh);
+  double*  pointerToShj = (double*) PyCObject_AsVoidPtr(pyPointerToShj);
+  int*  pointerToListArrayElementTypeInfo = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayElementTypeInfo);
+  double*  pointerToHistry = (double*) PyCObject_AsVoidPtr(pyPointerToHistry);
+  double*  pointerToListArrayRtimdat = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayRtimdat);
+  int*  pointerToListArrayNtimdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNtimdat);
+  int*  pointerToListArrayNvisdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNvisdat);
+  int*  pointerToMaxstp = (int*) PyCObject_AsVoidPtr(pyPointerToMaxstp);
+  double*  pointerToDelt = (double*) PyCObject_AsVoidPtr(pyPointerToDelt);
+  double*  pointerToAlfa = (double*) PyCObject_AsVoidPtr(pyPointerToAlfa);
+  int*  pointerToMaxit = (int*) PyCObject_AsVoidPtr(pyPointerToMaxit);
+  int*  pointerToNtdinit = (int*) PyCObject_AsVoidPtr(pyPointerToNtdinit);
+  int*  pointerToLgdef = (int*) PyCObject_AsVoidPtr(pyPointerToLgdef);
+  double*  pointerToUtol = (double*) PyCObject_AsVoidPtr(pyPointerToUtol);
+  double*  pointerToFtol = (double*) PyCObject_AsVoidPtr(pyPointerToFtol);
+  double*  pointerToEtol = (double*) PyCObject_AsVoidPtr(pyPointerToEtol);
+  int*  pointerToItmax = (int*) PyCObject_AsVoidPtr(pyPointerToItmax);
+  double*  pointerToListArrayRgiter = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayRgiter);
+  double*  pointerToSkew = (double*) PyCObject_AsVoidPtr(pyPointerToSkew);
+  int*  pointerToListArrayNcodat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNcodat);
+  int*  pointerToListArrayNunits = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNunits);
+  int*  pointerToListArrayNprint = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNprint);
+  int*  pointerToIstatout = (int*) PyCObject_AsVoidPtr(pyPointerToIstatout);
+  int*  pointerToNstatout = (int*) PyCObject_AsVoidPtr(pyPointerToNstatout);
+
+  elastc_f(&A,                                // Sparse matrix arrays
+           &rhs,
+	   &sol,
+	   pointerToBextern,                  // Force vectors
+	   pointerToBtraction,
+	   pointerToBgravity,
+	   pointerToBconcForce,
+	   pointerToBintern,
+	   pointerToBresid,
+	   pointerToBwink,
+	   pointerToBwinkx,
+	   pointerToDispVec,
+	   pointerToDprev,
+	   pointerToListArrayNforce,
+	   pointerToListArrayGrav,
+	   pointerToX,                        // Global arrays
+	   pointerToD,
+	   pointerToDeld,
+	   pointerToDcur,
+	   pointerToId,
+	   pointerToIwink,
+	   pointerToWink,
+	   pointerToListArrayNsysdat,
+	   pointerToListArrayIddmat,
+	   pointerToIbond,                    // Boundary condition arrays
+	   pointerToBond,
+	   pointerToDx,                       // Slippery node arrays
+	   pointerToDeldx,
+	   pointerToDxcur,
+	   pointerToDiforc,
+	   pointerToIdx,
+	   pointerToIwinkx,
+	   pointerToWinkx,
+	   pointerToIdslp,
+	   pointerToIpslp,
+	   pointerToIdhist,
+	   pointerToFault,                    // Split node arrays
+	   pointerToNfault,
+	   pointerToDfault,
+	   pointerToTfault,
+	   pointerToS,                        // Local stiffness matrix arrays
+	   pointerToStemp,
+	   pointerToState,                    // Element arrays
+	   pointerToDstate,
+	   pointerToState0,
+	   pointerToDmat,
+	   pointerToIen,
+	   pointerToLm,
+	   pointerToLmx,
+	   pointerToLmf,
+	   pointerToIvfamily,
+	   pointerToListArrayNpar,
+	   pointerToIelindx,
+	   pointerToTractionverts,            // Traction BC arrays
+	   pointerToTractionvals,
+	   pointerToGauss2d,
+	   pointerToSh2d,
+	   pointerToListArrayElementTypeInfo2d,
+	   pointerToListArrayPropertyList,    // Material property arrays
+	   pointerToMaterialModelInfo,
+	   pointerToGauss,                    // Element type arrays
+	   pointerToSh,
+	   pointerToShj,
+	   pointerToListArrayElementTypeInfo,
+	   pointerToHistry,                   // Time information
+	   pointerToListArrayRtimdat,
+	   pointerToListArrayNtimdat,
+	   pointerToListArrayNvisdat,
+	   pointerToMaxstp,
+	   pointerToDelt,
+	   pointerToAlfa,
+	   pointerToMaxit,
+	   pointerToNtdinit,
+	   pointerToLgdef,
+	   pointerToUtol,
+	   pointerToFtol,
+	   pointerToEtol,
+	   pointerToItmax,
+	   pointerToListArrayRgiter,          // Iterative solution information
+	   pointerToSkew,                     // Skew rotation information
+	   pointerToListArrayNcodat,          // Input/output information
+	   pointerToListArrayNunits,
+	   pointerToListArrayNprint,
+	   pointerToIstatout,
+	   pointerToNstatout,
+	   asciiOutputFile,                   // Output file names
+	   plotOutputFile,
+	   ucdOutputRoot,
+           &elasticStage,
+           &iterateEvent,
+	   &errorcode,                        // Error codes
+	   errorstring,
+	   strlen(asciiOutputFile),           // String lengths
+	   strlen(plotOutputFile),
+	   strlen(ucdOutputRoot),
+	   sizeof(errorstring));
+
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    //int *fail = NULL;
+    //int i = fail[0];
+    return NULL;
+  }
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "asciiOutputFile:" << asciiOutputFile
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+
+
+// Assign equation numbers to Iwink and Iwinkx arrays, and compact
+// Wink and Winkx arrays to correspond to assigned BC.
+
+char pypylith3d_assign_wink__doc__[] = "";
+char pypylith3d_assign_wink__name__[] = "assign_wink";
+
+PyObject * pypylith3d_assign_wink(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToWinkdef;
+  PyObject* pyPointerToWink;
+  PyObject* pyPointerToIwinkdef;
+  PyObject* pyPointerToIwinkid;
+  PyObject* pyPointerToIwink;
+  PyObject* pyPointerToId;
+  int numberNodes;
+  int numberWinklerForces;
+  int numberWinklerEntries;
+
+  int ok = PyArg_ParseTuple(args, "OOOOOOiii:assign_wink",
+			    &pyPointerToWinkdef,
+			    &pyPointerToWink,
+			    &pyPointerToIwinkdef,
+			    &pyPointerToIwinkid,
+			    &pyPointerToIwink,
+			    &pyPointerToId,
+			    &numberNodes,
+			    &numberWinklerForces,
+			    &numberWinklerEntries);
+
+  if (!ok) {
+    return 0;
+  }
+
+  double* pointerToWinkdef = (double*) PyCObject_AsVoidPtr(pyPointerToWinkdef);
+  double* pointerToWink = (double*) PyCObject_AsVoidPtr(pyPointerToWink);
+  int* pointerToIwinkdef = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkdef);
+  int* pointerToIwinkid = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkid);
+  int* pointerToIwink = (int*) PyCObject_AsVoidPtr(pyPointerToIwink);
+  int* pointerToId = (int*) PyCObject_AsVoidPtr(pyPointerToId);
+
+  assign_wink_f(pointerToWinkdef,
+		pointerToWink,
+		pointerToIwinkdef,
+		pointerToIwinkid,
+		pointerToIwink,
+		pointerToId,
+		&numberNodes,
+		&numberWinklerForces,
+		&numberWinklerEntries);
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberWinklerForces:" << numberWinklerForces
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+    
+
+// Create Id and Idx arrays, and determine the number of equations.
+
+char pypylith3d_create_id__doc__[] = "";
+char pypylith3d_create_id__name__[] = "create_id";
+
+PyObject * pypylith3d_create_id(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToId;
+  PyObject* pyPointerToIdx;
+  PyObject* pyPointerToIbond;
+  PyObject* pyPointerToNslip;
+  PyObject* pyPointerToIdslp;
+  int numberSlipperyNodeEntries;
+  int numberNodes;
+  int totalNumberSlipperyNodes;
+
+  int ok = PyArg_ParseTuple(args, "OOOOOiii:create_id",
+			    &pyPointerToId,
+			    &pyPointerToIdx,
+			    &pyPointerToIbond,
+			    &pyPointerToNslip,
+			    &pyPointerToIdslp,
+			    &numberSlipperyNodeEntries,
+			    &numberNodes,
+			    &totalNumberSlipperyNodes);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int* pointerToId = (int*) PyCObject_AsVoidPtr(pyPointerToId);
+  int* pointerToIdx = (int*) PyCObject_AsVoidPtr(pyPointerToIdx);
+  int* pointerToIbond = (int*) PyCObject_AsVoidPtr(pyPointerToIbond);
+  int* pointerToNslip = (int*) PyCObject_AsVoidPtr(pyPointerToNslip);
+  int* pointerToIdslp = (int*) PyCObject_AsVoidPtr(pyPointerToIdslp);
+  int numberGlobalEquations = 0;
+
+  create_id_f(pointerToId,
+	  pointerToIdx,
+	  pointerToIbond,
+	  pointerToNslip,
+	  pointerToIdslp,
+	  &numberSlipperyNodeEntries,
+	  &numberNodes,
+	  &totalNumberSlipperyNodes,
+	  &numberGlobalEquations);
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberGlobalEquations:" << numberGlobalEquations
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_BuildValue("i", numberGlobalEquations);
+}
+
+
+// Form id array for split nodes
+
+char pypylith3d_id_split__doc__[] = "";
+char pypylith3d_id_split__name__[] = "id_split";
+
+PyObject * pypylith3d_id_split(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToNfault;
+  PyObject* pyPointerToIdftn;
+  int numberNodes;
+  int numberSplitNodeEntries;
+  int totalNumberSplitNodes;
+
+  int ok = PyArg_ParseTuple(args, "OOiii:id_split",
+			    &pyPointerToNfault,
+			    &pyPointerToIdftn,
+			    &numberNodes,
+			    &numberSplitNodeEntries,
+			    &totalNumberSplitNodes);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int* pointerToNfault = (int*) PyCObject_AsVoidPtr(pyPointerToNfault);
+  int* pointerToIdftn = (int*) PyCObject_AsVoidPtr(pyPointerToIdftn);
+
+  id_split_f(pointerToNfault,
+	     pointerToIdftn,
+	     &numberNodes,
+	     &numberSplitNodeEntries,
+	     &totalNumberSplitNodes);
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberSplitNodeEntries:" << numberSplitNodeEntries
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+    
+
+// Find closest fault neighbors for slippery nodes
+
+char pypylith3d_nfind__doc__[] = "";
+char pypylith3d_nfind__name__[] = "nfind";
+
+PyObject * pypylith3d_nfind(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToX;
+  PyObject* pyPointerToXtmp;
+  PyObject* pyPointerToIdslp;
+  PyObject* pyPointerToIpslp;
+  PyObject* pyPointerToItmp;
+  PyObject* pyPointerToItmp1;
+  PyObject* pyPointerToItmp2;
+  PyObject* pyPointerToNslip;
+  int numberSlipperyNodeEntries;
+  int totalNumberSlipperyNodes;
+  int numberNodes;
+
+  int ok = PyArg_ParseTuple(args, "OOOOOOOOiii:nfind",
+			    &pyPointerToX,
+			    &pyPointerToXtmp,
+			    &pyPointerToIdslp,
+			    &pyPointerToIpslp,
+			    &pyPointerToItmp,
+			    &pyPointerToItmp1,
+			    &pyPointerToItmp2,
+			    &pyPointerToNslip,
+			    &numberSlipperyNodeEntries,
+			    &totalNumberSlipperyNodes,
+			    &numberNodes);
+
+  if (!ok) {
+    return 0;
+  }
+
+  double* pointerToX = (double*) PyCObject_AsVoidPtr(pyPointerToX);
+  double* pointerToXtmp = (double*) PyCObject_AsVoidPtr(pyPointerToXtmp);
+  int* pointerToIdslp = (int*) PyCObject_AsVoidPtr(pyPointerToIdslp);
+  int* pointerToIpslp = (int*) PyCObject_AsVoidPtr(pyPointerToIpslp);
+  int* pointerToItmp = (int*) PyCObject_AsVoidPtr(pyPointerToItmp);
+  int* pointerToItmp1 = (int*) PyCObject_AsVoidPtr(pyPointerToItmp1);
+  int* pointerToItmp2 = (int*) PyCObject_AsVoidPtr(pyPointerToItmp2);
+  int* pointerToNslip = (int*) PyCObject_AsVoidPtr(pyPointerToNslip);
+
+  nfind_f(pointerToX,
+	  pointerToXtmp,
+	  pointerToIdslp,
+	  pointerToIpslp,
+	  pointerToItmp,
+	  pointerToItmp1,
+	  pointerToItmp2,
+	  pointerToNslip,
+	  &numberSlipperyNodeEntries,
+	  &totalNumberSlipperyNodes,
+	  &numberNodes);
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "pointerToX:" << pointerToX
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Read boundary conditions
+
+char pypylith3d_read_bc__doc__[] = "";
+char pypylith3d_read_bc__name__[] = "read_bc";
+
+PyObject * pypylith3d_read_bc(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToBond;
+  double displacementScaleFactor;
+  double velocityScaleFactor;
+  double forceScaleFactor;
+  PyObject* pyPointerToIbond;
+  int numberNodes;
+  int numberBcEntries;
+  int f77FileInput;
+  char* bcInputFile;
+
+  int ok = PyArg_ParseTuple(args, "OdddOiiis:read_bc",
+			    &pyPointerToBond,
+			    &displacementScaleFactor,
+			    &velocityScaleFactor,
+			    &forceScaleFactor,
+			    &pyPointerToIbond,
+			    &numberNodes,
+			    &numberBcEntries,
+			    &f77FileInput,
+			    &bcInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  double* pointerToBond = (double*) PyCObject_AsVoidPtr(pyPointerToBond);
+  int* pointerToIbond = (int*) PyCObject_AsVoidPtr(pyPointerToIbond);
+  int numberConcForces = 0;
+
+  read_bc_f(pointerToBond,
+	    &displacementScaleFactor,
+	    &velocityScaleFactor,
+	    &forceScaleFactor,
+	    pointerToIbond,
+	    &numberNodes,
+	    &numberBcEntries,
+	    &numberConcForces,
+	    &f77FileInput,
+	    bcInputFile,
+	    &errorcode,
+	    errorstring,
+	    strlen(bcInputFile),
+	    sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberBcEntries:" << numberBcEntries
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_BuildValue("i", numberConcForces);
+}
+
+
+// Read connectivities
+
+char pypylith3d_read_connect__doc__[] = "";
+char pypylith3d_read_connect__name__[] = "read_connect";
+
+PyObject * pypylith3d_read_connect(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToIen;
+  PyObject* pyPointerToMat;
+  int numberVolumeElementNodes;
+  int numberVolumeElements;
+  int numberNodes;
+  int numberVolumeElementFamilies;
+  int f77FileInput;
+  char* connectivityInputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOiiiiis:read_connect",
+                            &pyPointerToIen,
+                            &pyPointerToMat,
+                            &numberVolumeElementNodes,
+                            &numberVolumeElements,
+                            &numberNodes,
+                            &numberVolumeElementFamilies,
+                            &f77FileInput,
+                            &connectivityInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int* pointerToIen = (int*) PyCObject_AsVoidPtr(pyPointerToIen);
+  int* pointerToMat = (int*) PyCObject_AsVoidPtr(pyPointerToMat);
+
+  read_connect_f(pointerToIen,
+		 pointerToMat,
+		 &numberVolumeElementNodes,
+                 &numberVolumeElements,
+                 &numberNodes,
+                 &numberVolumeElementFamilies,
+		 &f77FileInput,
+		 connectivityInputFile,
+		 &errorcode,
+		 errorstring,
+		 strlen(connectivityInputFile),
+		 sizeof(errorstring));
+
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberVolumeElementFamilies:" << numberVolumeElementFamilies
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Read coordinates
+
+char pypylith3d_read_coords__doc__[] = "";
+char pypylith3d_read_coords__name__[] = "read_coords";
+
+PyObject * pypylith3d_read_coords(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToX;
+  double coordinateScaleFactor;
+  int numberNodes;
+  int f77FileInput;
+  char* coordinateInputFile;
+
+  int ok = PyArg_ParseTuple(args, "Odiis:read_coords",
+			    &pyPointerToX,
+			    &coordinateScaleFactor,
+			    &numberNodes,
+			    &f77FileInput,
+			    &coordinateInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  double* pointerToX = (double*) PyCObject_AsVoidPtr(pyPointerToX);
+
+  read_coords_f(pointerToX,
+		&coordinateScaleFactor,
+		&numberNodes,
+		&f77FileInput,
+		coordinateInputFile,
+		&errorcode,
+		errorstring,
+		strlen(coordinateInputFile),
+		sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "coordinateScaleFactor:" << coordinateScaleFactor
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Read differential forces
+
+char pypylith3d_read_diff__doc__[] = "";
+char pypylith3d_read_diff__name__[] = "read_diff";
+
+PyObject * pypylith3d_read_diff(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToDiforc;
+  PyObject* pyPointerToNslip;
+  PyObject* pyPointerToIdhist;
+  int numberSlipperyNodeEntries;
+  int numberDifferentialForceEntries;
+  int numberNodes;
+  int f77FileInput;
+  char* differentialForceInputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOOiiiis:read_diff",
+			    &pyPointerToDiforc,
+			    &pyPointerToNslip,
+			    &pyPointerToIdhist,
+			    &numberSlipperyNodeEntries,
+			    &numberDifferentialForceEntries,
+			    &numberNodes,
+			    &f77FileInput,
+			    &differentialForceInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  double* pointerToDiforc = (double*) PyCObject_AsVoidPtr(pyPointerToDiforc);
+  int* pointerToNslip = (int*) PyCObject_AsVoidPtr(pyPointerToNslip);
+  int* pointerToIdhist = (int*) PyCObject_AsVoidPtr(pyPointerToIdhist);
+
+  read_diff_f(pointerToDiforc,
+	      pointerToNslip,
+	      pointerToIdhist,
+	      &numberSlipperyNodeEntries,
+	      &numberDifferentialForceEntries,
+	      &numberNodes,
+	      &f77FileInput,
+	      differentialForceInputFile,
+	      &errorcode,
+	      errorstring,
+	      strlen(differentialForceInputFile),
+	      sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberDifferentialForceEntries:" << numberDifferentialForceEntries
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Read time steps at which full output is desired
+
+char pypylith3d_read_fuldat__doc__[] = "";
+char pypylith3d_read_fuldat__name__[] = "read_fuldat";
+
+PyObject * pypylith3d_read_fuldat(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToIprint;
+  int numberFullOutputs;
+  int analysisTypeInt;
+  int numberCycles;
+  int totalNumberTimeSteps;
+  int f77FileInput;
+  char* fullOutputInputFile;
+
+  int ok = PyArg_ParseTuple(args, "Oiiiiis:read_fuldat",
+			    &pyPointerToIprint,
+			    &numberFullOutputs,
+			    &analysisTypeInt,
+			    &numberCycles,
+			    &totalNumberTimeSteps,
+			    &f77FileInput,
+			    &fullOutputInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int* pointerToIprint = (int*) PyCObject_AsVoidPtr(pyPointerToIprint);
+
+  read_fuldat_f(pointerToIprint,
+		&numberFullOutputs,
+		&analysisTypeInt,
+		&numberCycles,
+		&totalNumberTimeSteps,
+		&f77FileInput,
+		fullOutputInputFile,
+		&errorcode,
+		errorstring,
+		strlen(fullOutputInputFile),
+		sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberFullOutputs:" << numberFullOutputs
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Read load histories
+
+char pypylith3d_read_hist__doc__[] = "";
+char pypylith3d_read_hist__name__[] = "read_hist";
+
+PyObject * pypylith3d_read_hist(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToHistry;
+  PyObject* pyPointerToTimes;
+  int numberLoadHistories;
+  int totalNumberTimeSteps;
+  int f77FileInput;
+  char* loadHistoryInputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOiiis:read_hist",
+			    &pyPointerToHistry,
+			    &pyPointerToTimes,
+			    &numberLoadHistories,
+			    &totalNumberTimeSteps,
+			    &f77FileInput,
+			    &loadHistoryInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  double* pointerToHistry = (double*) PyCObject_AsVoidPtr(pyPointerToHistry);
+  double* pointerToTimes = (double*) PyCObject_AsVoidPtr(pyPointerToTimes);
+
+  read_hist_f(pointerToHistry,
+	      pointerToTimes,
+	      &numberLoadHistories,
+	      &totalNumberTimeSteps,
+	      &f77FileInput,
+	      loadHistoryInputFile,
+	      &errorcode,
+	      errorstring,
+	      strlen(loadHistoryInputFile),
+	      sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberLoadHistories:" << numberLoadHistories
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Read element prestresses
+
+// char pypylith3d_read_prestr__doc__[] = "";
+// char pypylith3d_read_prestr__name__[] = "read_prestr";
+
+// PyObject * pypylith3d_read_prestr(PyObject *, PyObject *args)
+// {
+  // PyObject* pyPointerToStn;
+  // PyObject* pyPointerToSt0;
+  // PyObject* pyPointerToListArrayPrscal;
+  // int numberStressComponents;
+  // int numberGaussPoints;
+  // int numberPrestressGaussPoints;
+  // int numberElements;
+  // int numberPrestressEntries;
+  // int prestressAutoComputeInt;
+  // int asciiOutputInt;
+  // int f77FileInput;
+  // int f77AsciiOutput;
+  // char* prestressInputFile;
+  // char* asciiOutputFile;
+
+  // int ok = PyArg_ParseTuple(args, "OOOiiiiiiiiiss:read_prestr",
+			    // &pyPointerToStn,
+			    // &pyPointerToSt0,
+			    // &pyPointerToListArrayPrscal,
+			    // &numberStressComponents,
+			    // &numberGaussPoints,
+			    // &numberPrestressGaussPoints,
+			    // &numberElements,
+			    // &numberPrestressEntries,
+			    // &prestressAutoComputeInt,
+			    // &asciiOutputInt,
+			    // &f77FileInput,
+			    // &f77AsciiOutput,
+			    // &prestressInputFile,
+			    // &asciiOutputFile);
+
+  // if (!ok) {
+    // return 0;
+  // }
+
+  // int errorcode = 0;
+  // const int maxsize = 4096;
+  // char errorstring[maxsize];
+  // double* pointerToStn = (double*) PyCObject_AsVoidPtr(pyPointerToStn);
+  // double* pointerToSt0 = (double*) PyCObject_AsVoidPtr(pyPointerToSt0);
+  // double* pointerToListArrayPrscal = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayPrscal);
+
+  // read_prestr_f(pointerToStn,
+		// pointerToSt0,
+		// pointerToListArrayPrscal,
+		// &numberStressComponents,
+		// &numberGaussPoints,
+		// &numberPrestressGaussPoints,
+		// &numberElements,
+		// &numberPrestressEntries,
+		// &prestressAutoComputeInt,
+		// &asciiOutputInt,
+		// &f77FileInput,
+		// &f77AsciiOutput,
+		// &errorcode,
+		// prestressInputFile,
+		// asciiOutputFile,
+		// strlen(prestressInputFile),
+		// strlen(asciiOutputFile));
+    
+// if(0 != exceptionhandler(errorcode, errorstring)) {
+    // return 0;
+  // }
+
+  // journal::debug_t debug("pylith3d");
+  // debug
+    // << journal::at(__HERE__)
+    // << "numberPrestressEntries:" << numberPrestressEntries
+    // << journal::endl;
+
+  // return
+  // Py_INCREF(Py_None);
+  // return Py_None;
+// }
+
+
+// Read local coordinate rotations
+
+char pypylith3d_read_skew__doc__[] = "";
+char pypylith3d_read_skew__name__[] = "read_skew";
+
+PyObject * pypylith3d_read_skew(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToSkew;
+  double rotationScaleFactor;
+  int numberRotationEntries;
+  int numberNodes;
+  int autoRotateSlipperyNodesInt;
+  int f77FileInput;
+  char* rotationInputFile;
+
+  int ok = PyArg_ParseTuple(args, "Odiiiis:read_skew",
+			    &pyPointerToSkew,
+			    &rotationScaleFactor,
+			    &numberRotationEntries,
+			    &numberNodes,
+			    &autoRotateSlipperyNodesInt,
+			    &f77FileInput,
+			    &rotationInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  double* pointerToSkew = (double*) PyCObject_AsVoidPtr(pyPointerToSkew);
+
+  read_skew_f(pointerToSkew,
+	      &rotationScaleFactor,
+	      &numberRotationEntries,
+	      &numberNodes,
+	      &autoRotateSlipperyNodesInt,
+	      &f77FileInput,
+	      rotationInputFile,
+	      &errorcode,
+	      errorstring,
+	      strlen(rotationInputFile),
+	      sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberRotationEntries:" << numberRotationEntries
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Read slippery node entries
+
+char pypylith3d_read_slip__doc__[] = "";
+char pypylith3d_read_slip__name__[] = "read_slip";
+
+PyObject * pypylith3d_read_slip(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToNslip;
+  int numberSlipperyNodeEntries;
+  int numberNodes;
+  int autoRotateSlipperyNodesInt;
+  int f77FileInput;
+  char* slipperyNodeInputFile;
+
+  int ok = PyArg_ParseTuple(args, "Oiiiis:read_slip",
+			    &pyPointerToNslip,
+			    &numberSlipperyNodeEntries,
+			    &numberNodes,
+			    &autoRotateSlipperyNodesInt,
+			    &f77FileInput,
+			    &slipperyNodeInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int* pointerToNslip = (int*) PyCObject_AsVoidPtr(pyPointerToNslip);
+  int totalNumberSlipperyNodes = 0;
+
+  read_slip_f(pointerToNslip,
+	      &numberSlipperyNodeEntries,
+	      &totalNumberSlipperyNodes,
+	      &numberNodes,
+	      &autoRotateSlipperyNodesInt,
+	      &f77FileInput,
+	      slipperyNodeInputFile,
+	      &errorcode,
+	      errorstring,
+	      strlen(slipperyNodeInputFile),
+	      sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "totalNumberSlipperyNodes:" << totalNumberSlipperyNodes
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_BuildValue("i", totalNumberSlipperyNodes);
+}
+
+
+// Read split node entries
+
+char pypylith3d_read_split__doc__[] = "";
+char pypylith3d_read_split__name__[] = "read_split";
+
+PyObject * pypylith3d_read_split(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToFault;
+  PyObject* pyPointerToNfault;
+  int numberSplitNodeEntries;
+  int numberNodes;
+  int numberVolumeElements;
+  int f77FileInput;
+  char* splitNodeInputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOiiiis:read_split",
+			    &pyPointerToFault,
+			    &pyPointerToNfault,
+			    &numberSplitNodeEntries,
+			    &numberNodes,
+			    &numberVolumeElements,
+			    &f77FileInput,
+			    &splitNodeInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  double* pointerToFault = (double*) PyCObject_AsVoidPtr(pyPointerToFault);
+  int* pointerToNfault = (int*) PyCObject_AsVoidPtr(pyPointerToNfault);
+  int totalNumberSplitNodes = 0;
+
+  read_split_f(pointerToFault,
+	       pointerToNfault,
+	       &numberSplitNodeEntries,
+	       &totalNumberSplitNodes,
+	       &numberNodes,
+	       &numberVolumeElements,
+	       &f77FileInput,
+	       splitNodeInputFile,
+	       &errorcode,
+	       errorstring,
+	       strlen(splitNodeInputFile),
+	       sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "totalNumberSplitNodes:" << totalNumberSplitNodes
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_BuildValue("i", totalNumberSplitNodes);
+}
+
+
+// Read state output information
+
+char pypylith3d_read_stateout__doc__[] = "";
+char pypylith3d_read_stateout__name__[] = "read_stateout";
+
+PyObject * pypylith3d_read_stateout(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToIstatout;
+  PyObject* pyPointerToNstatout;
+  int f77FileInput;
+  char* stateVariableInputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOis:read_stateout",
+			    &pyPointerToIstatout,
+			    &pyPointerToNstatout,
+			    &f77FileInput,
+			    &stateVariableInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int* pointerToIstatout = (int*) PyCObject_AsVoidPtr(pyPointerToIstatout);
+  int* pointerToNstatout = (int*) PyCObject_AsVoidPtr(pyPointerToNstatout);
+
+  read_stateout_f(pointerToIstatout,
+	          pointerToNstatout,
+	          &f77FileInput,
+	          stateVariableInputFile,
+	          &errorcode,
+	          errorstring,
+	          strlen(stateVariableInputFile),
+	          sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "pointerToIstatout:" << pointerToIstatout
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Read time step data
+
+char pypylith3d_read_timdat__doc__[] = "";
+char pypylith3d_read_timdat__name__[] = "read_timdat";
+
+PyObject * pypylith3d_read_timdat(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToDelt;
+  PyObject* pyPointerToAlfa;
+  PyObject* pyPointerToUtol;
+  PyObject* pyPointerToFtol;
+  PyObject* pyPointerToEtol;
+  PyObject* pyPointerToTimes;
+  double timeScaleFactor;
+  PyObject* pyPointerToMaxstp;
+  PyObject* pyPointerToMaxit;
+  PyObject* pyPointerToNtdinit;
+  PyObject* pyPointerToLgdef;
+  PyObject* pyPointerToItmax;
+  int numberTimeStepGroups;
+  int totalNumberTimeSteps;
+  int f77FileInput;
+  char* timeStepInputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOOOOOdOOOOOiiis:read_timdat",
+			    &pyPointerToDelt,
+			    &pyPointerToAlfa,
+			    &pyPointerToUtol,
+			    &pyPointerToFtol,
+			    &pyPointerToEtol,
+			    &pyPointerToTimes,
+			    &timeScaleFactor,
+			    &pyPointerToMaxstp,
+			    &pyPointerToMaxit,
+			    &pyPointerToNtdinit,
+			    &pyPointerToLgdef,
+			    &pyPointerToItmax,
+			    &numberTimeStepGroups,
+			    &totalNumberTimeSteps,
+			    &f77FileInput,
+			    &timeStepInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  double* pointerToDelt = (double*) PyCObject_AsVoidPtr(pyPointerToDelt);
+  double* pointerToAlfa = (double*) PyCObject_AsVoidPtr(pyPointerToAlfa);
+  double* pointerToUtol = (double*) PyCObject_AsVoidPtr(pyPointerToUtol);
+  double* pointerToFtol = (double*) PyCObject_AsVoidPtr(pyPointerToFtol);
+  double* pointerToEtol = (double*) PyCObject_AsVoidPtr(pyPointerToEtol);
+  double* pointerToTimes = (double*) PyCObject_AsVoidPtr(pyPointerToTimes);
+  int* pointerToMaxstp = (int*) PyCObject_AsVoidPtr(pyPointerToMaxstp);
+  int* pointerToMaxit = (int*) PyCObject_AsVoidPtr(pyPointerToMaxit);
+  int* pointerToNtdinit = (int*) PyCObject_AsVoidPtr(pyPointerToNtdinit);
+  int* pointerToLgdef = (int*) PyCObject_AsVoidPtr(pyPointerToLgdef);
+  int* pointerToItmax = (int*) PyCObject_AsVoidPtr(pyPointerToItmax);
+
+  read_timdat_f(pointerToDelt,
+		pointerToAlfa,
+		pointerToUtol,
+		pointerToFtol,
+		pointerToEtol,
+		pointerToTimes,
+		&timeScaleFactor,
+		pointerToMaxstp,
+		pointerToMaxit,
+		pointerToNtdinit,
+		pointerToLgdef,
+		pointerToItmax,
+		&numberTimeStepGroups,
+		&totalNumberTimeSteps,
+		&f77FileInput,
+		timeStepInputFile,
+		&errorcode,
+		errorstring,
+		strlen(timeStepInputFile),
+		sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "totalNumberTimeSteps:" << totalNumberTimeSteps
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Read traction BC
+
+char pypylith3d_read_tractions__doc__[] = "";
+char pypylith3d_read_tractions__name__[] = "read_tractions";
+
+PyObject * pypylith3d_read_tractions(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToTractionverts;
+  PyObject* pyPointerToTractionvals;
+  double tractionScaleFactor;
+  int numberTractionBc;
+  int numberSurfaceElementNodes;
+  int f77FileInput;
+  char* tractionInputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOdiiis:read_tractions",
+			    &pyPointerToTractionverts,
+			    &pyPointerToTractionvals,
+			    &tractionScaleFactor,
+			    &numberTractionBc,
+			    &numberSurfaceElementNodes,
+			    &f77FileInput,
+			    &tractionInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int* pointerToTractionverts = (int*) PyCObject_AsVoidPtr(pyPointerToTractionverts);
+  double* pointerToTractionvals = (double*) PyCObject_AsVoidPtr(pyPointerToTractionvals);
+
+  read_tractions_f(pointerToTractionverts,
+		   pointerToTractionvals,
+		   &tractionScaleFactor,
+		   &numberTractionBc,
+		   &numberSurfaceElementNodes,
+		   &f77FileInput,
+		   tractionInputFile,
+		   &errorcode,
+		   errorstring,
+		   strlen(tractionInputFile),
+		   sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "tractionScaleFactor:" << tractionScaleFactor
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Read winkler BC
+
+char pypylith3d_read_wink__doc__[] = "";
+char pypylith3d_read_wink__name__[] = "read_wink";
+
+PyObject * pypylith3d_read_wink(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToWinkdef;
+  PyObject* pyPointerToListArrayWscal;
+  PyObject* pyPointerToIwinkdef;
+  PyObject* pyPointerToIwinkid;
+  int numberWinklerForces;
+  int numberWinklerEntries;
+  int f77FileInput;
+  char* winklerInputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOOOiiis:read_wink",
+			    &pyPointerToWinkdef,
+			    &pyPointerToListArrayWscal,
+			    &pyPointerToIwinkdef,
+			    &pyPointerToIwinkid,
+			    &numberWinklerForces,
+			    &numberWinklerEntries,
+			    &f77FileInput,
+			    &winklerInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  double* pointerToWinkdef = (double*) PyCObject_AsVoidPtr(pyPointerToWinkdef);
+  double* pointerToListArrayWscal = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayWscal);
+  int* pointerToIwinkdef = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkdef);
+  int* pointerToIwinkid = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkid);
+
+  read_wink_f(pointerToWinkdef,
+	      pointerToListArrayWscal,
+	      pointerToIwinkdef,
+	      pointerToIwinkid,
+	      &numberWinklerForces,
+	      &numberWinklerEntries,
+	      &f77FileInput,
+	      winklerInputFile,
+	      &errorcode,
+	      errorstring,
+	      strlen(winklerInputFile),
+	      sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberWinklerForces:" << numberWinklerForces
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Sort elements into element families
+
+char pypylith3d_sort_elements__doc__[] = "";
+char pypylith3d_sort_elements__name__[] = "sort_elements";
+
+PyObject * pypylith3d_sort_elements(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToIen;
+  PyObject* pyPointerToMat;
+  PyObject* pyPointerToMaterialModelInfo;
+  PyObject* pyPointerToVolumeElementFamilyList;
+  PyObject* pyPointerToIvfamily;
+  PyObject* pyPointerToIens;
+  PyObject* pyPointerToIvftmp;
+  PyObject* pyPointerToIndxiel;
+  PyObject* pyPointerToIelindx;
+  int numberVolumeElementNodes;
+  int numberVolumeElementGaussPoints;
+  int maxNumberVolumeElementFamilies;
+  int numberVolumeElementFamilies;
+  int prestressFlag;
+  int numberVolumeElements;
+  int numberNodes;
+
+  int ok = PyArg_ParseTuple(args, "OOOOOOOOOiiiiiii:sort_elements",
+			    &pyPointerToIen,
+			    &pyPointerToMat,
+			    &pyPointerToMaterialModelInfo,
+			    &pyPointerToVolumeElementFamilyList,
+			    &pyPointerToIvfamily,
+			    &pyPointerToIens,
+			    &pyPointerToIvftmp,
+			    &pyPointerToIndxiel,
+			    &pyPointerToIelindx,
+			    &numberVolumeElementNodes,
+			    &numberVolumeElementGaussPoints,
+			    &maxNumberVolumeElementFamilies,
+			    &numberVolumeElementFamilies,
+			    &prestressFlag,
+			    &numberVolumeElements,
+			    &numberNodes);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int* pointerToIen = (int*) PyCObject_AsVoidPtr(pyPointerToIen);
+  int* pointerToMat = (int*) PyCObject_AsVoidPtr(pyPointerToMat);
+  int* pointerToMaterialModelInfo = (int*) PyCObject_AsVoidPtr(pyPointerToMaterialModelInfo);
+  int* pointerToVolumeElementFamilyList = (int*) PyCObject_AsVoidPtr(pyPointerToVolumeElementFamilyList);
+  int* pointerToIvfamily = (int*) PyCObject_AsVoidPtr(pyPointerToIvfamily);
+  int* pointerToIens = (int*) PyCObject_AsVoidPtr(pyPointerToIens);
+  int* pointerToIvftmp = (int*) PyCObject_AsVoidPtr(pyPointerToIvftmp);
+  int* pointerToIndxiel = (int*) PyCObject_AsVoidPtr(pyPointerToIndxiel);
+  int* pointerToIelindx = (int*) PyCObject_AsVoidPtr(pyPointerToIelindx);
+  int stateSize = 0;
+  int state0Size = 0;
+  int propertySize = 0;
+
+  sort_elements_f(pointerToIen,
+		  pointerToMat,
+		  pointerToMaterialModelInfo,
+		  pointerToVolumeElementFamilyList,
+		  pointerToIvfamily,
+		  pointerToIens,
+		  pointerToIvftmp,
+		  pointerToIndxiel,
+		  pointerToIelindx,
+		  &numberVolumeElementNodes,
+		  &numberVolumeElementGaussPoints,
+		  &maxNumberVolumeElementFamilies,
+		  &numberVolumeElementFamilies,
+		  &prestressFlag,
+		  &numberVolumeElements,
+		  &numberNodes,
+		  &stateSize,
+		  &state0Size,
+		  &propertySize,
+		  &errorcode,
+		  errorstring,
+		  sizeof(errorstring));
+
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "stateSize:" << stateSize
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_BuildValue("iii",
+		       stateSize,
+		       state0Size,
+		       propertySize);
+}
+
+// Sort slippery nodes according to reordered elements
+
+char pypylith3d_sort_slip_nodes__doc__[] = "";
+char pypylith3d_sort_slip_nodes__name__[] = "sort_slip_nodes";
+
+PyObject * pypylith3d_sort_slip_nodes(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToNslip;
+  PyObject* pyPointerToIndxiel;
+  int numberSlipperyNodeEntries;
+  int numberVolumeElements;
+
+  int ok = PyArg_ParseTuple(args, "OOii:sort_slip_nodes",
+			    &pyPointerToNslip,
+			    &pyPointerToIndxiel,
+			    &numberSlipperyNodeEntries,
+			    &numberVolumeElements);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int* pointerToNslip = (int*) PyCObject_AsVoidPtr(pyPointerToNslip);
+  int* pointerToIndxiel = (int*) PyCObject_AsVoidPtr(pyPointerToIndxiel);
+
+  sort_slip_nodes_f(pointerToNslip,
+		    pointerToIndxiel,
+		    &numberSlipperyNodeEntries,
+		    &numberVolumeElements);
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberSlipperyNodeEntries:" << numberSlipperyNodeEntries
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+    
+
+
+// Sort split nodes according to reordered elements
+
+char pypylith3d_sort_split_nodes__doc__[] = "";
+char pypylith3d_sort_split_nodes__name__[] = "sort_split_nodes";
+
+PyObject * pypylith3d_sort_split_nodes(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToNfault;
+  PyObject* pyPointerToIndxiel;
+  int numberSplitNodeEntries;
+  int numberVolumeElements;
+
+  int ok = PyArg_ParseTuple(args, "OOii:sort_split_nodes",
+			    &pyPointerToNfault,
+			    &pyPointerToIndxiel,
+			    &numberSplitNodeEntries,
+			    &numberVolumeElements);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int* pointerToNfault = (int*) PyCObject_AsVoidPtr(pyPointerToNfault);
+  int* pointerToIndxiel = (int*) PyCObject_AsVoidPtr(pyPointerToIndxiel);
+
+  sort_split_nodes_f(pointerToNfault,
+		    pointerToIndxiel,
+		    &numberSplitNodeEntries,
+		    &numberVolumeElements);
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberSplitNodeEntries:" << numberSplitNodeEntries
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Compute number of nonzero entries in stiffness matrix
+
+char pypylith3d_cmp_stiffsz__doc__[] = "";
+char pypylith3d_cmp_stiffsz__name__[] = "cmp_stiffsz";
+
+PyObject * pypylith3d_cmp_stiffsz(PyObject *, PyObject *args)
+{
+  int numberGlobalEquations;
+  PyObject* pyPointerToLm;
+  PyObject* pyPointerToLmx;
+  int numberVolumeElements;
+  int totalNumberSlipperyNodes;
+  int numberVolumeElementNodes;
+
+  int ok = PyArg_ParseTuple(args, "iOOiii:cmp_stiffsz",
+			    &numberGlobalEquations,
+			    &pyPointerToLm,
+			    &pyPointerToLmx,
+			    &numberVolumeElements,
+			    &totalNumberSlipperyNodes,
+			    &numberVolumeElementNodes);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int* pointerToLm = (int*) PyCObject_AsVoidPtr(pyPointerToLm);
+  int* pointerToLmx = (int*) PyCObject_AsVoidPtr(pyPointerToLmx);
+  int workingArraySize = 0;
+
+  cmp_stiffsz_f(&numberGlobalEquations,
+	   	pointerToLm,
+	   	pointerToLmx,
+	   	&numberVolumeElements,
+	   	&workingArraySize,
+	   	&totalNumberSlipperyNodes,
+	   	&numberVolumeElementNodes,
+	   	&errorcode,
+	   	errorstring,
+	   	sizeof(errorstring));
+
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+		  
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "workingArraySize:" << workingArraySize
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_BuildValue("i", workingArraySize);
+}
+
+
+
+// Create linked list of nonzero row and column entries in the stiffness matrix
+
+char pypylith3d_lnklst__doc__[] = "";
+char pypylith3d_lnklst__name__[] = "lnklst";
+
+PyObject * pypylith3d_lnklst(PyObject *, PyObject *args)
+{
+  int numberGlobalEquations;
+  PyObject* pyPointerToLm;
+  PyObject* pyPointerToLmx;
+  int numberVolumeElements;
+  int numberVolumeElementNodes;
+  int numberVolumeElementEquations;
+  PyObject* pyPointerToIndx;
+  PyObject* pyPointerToLink;
+  PyObject* pyPointerToNbrs;
+  int workingArraySize;
+  int totalNumberSlipperyNodes;
+
+  int ok = PyArg_ParseTuple(args, "iOOiiiOOOii:lnklst",
+			    &numberGlobalEquations,
+			    &pyPointerToLm,
+			    &pyPointerToLmx,
+			    &numberVolumeElements,
+			    &numberVolumeElementNodes,
+			    &numberVolumeElementEquations,
+			    &pyPointerToIndx,
+			    &pyPointerToLink,
+			    &pyPointerToNbrs,
+			    &workingArraySize,
+			    &totalNumberSlipperyNodes);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int* pointerToLm = (int*) PyCObject_AsVoidPtr(pyPointerToLm);
+  int* pointerToLmx = (int*) PyCObject_AsVoidPtr(pyPointerToLmx);
+  int* pointerToIndx = (int*) PyCObject_AsVoidPtr(pyPointerToIndx);
+  int* pointerToLink = (int*) PyCObject_AsVoidPtr(pyPointerToLink);
+  int* pointerToNbrs = (int*) PyCObject_AsVoidPtr(pyPointerToNbrs);
+  int stiffnessMatrixSize =0;
+  int stiffnessOffDiagonalSize =0;
+
+  lnklst_f(&numberGlobalEquations,
+	   pointerToLm,
+	   pointerToLmx,
+	   &numberVolumeElements,
+	   &numberVolumeElementNodes,
+	   &numberVolumeElementEquations,
+	   pointerToIndx,
+	   pointerToLink,
+	   pointerToNbrs,
+	   &workingArraySize,
+	   &stiffnessOffDiagonalSize,
+	   &stiffnessMatrixSize,
+	   &totalNumberSlipperyNodes,
+	   &errorcode,
+	   errorstring,
+	   sizeof(errorstring));
+
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+		  
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "stiffnessMatrixSize:" << stiffnessMatrixSize
+    << journal::endl;
+
+  // return
+  return Py_BuildValue("ii", stiffnessMatrixSize,
+   		  stiffnessOffDiagonalSize);
+}
+
+
+// Localize id array for reference by element
+
+char pypylith3d_local__doc__[] = "";
+char pypylith3d_local__name__[] = "local";
+
+PyObject * pypylith3d_local(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToId;
+  int numberNodes;
+  PyObject* pyPointerToIens;
+  PyObject* pyPointerToLm;
+  int numberVolumeElements;
+  int numberVolumeElementNodes;
+
+  int ok = PyArg_ParseTuple(args, "OiOOii:local",
+			    &pyPointerToId,
+			    &numberNodes,
+			    &pyPointerToIens,
+			    &pyPointerToLm,
+			    &numberVolumeElements,
+			    &numberVolumeElementNodes);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int* pointerToId = (int*) PyCObject_AsVoidPtr(pyPointerToId);
+  int* pointerToIens = (int*) PyCObject_AsVoidPtr(pyPointerToIens);
+  int* pointerToLm = (int*) PyCObject_AsVoidPtr(pyPointerToLm);
+
+  local_f(pointerToId,
+	  &numberNodes,
+	  pointerToIens,
+	  pointerToLm,
+	  &numberVolumeElements,
+	  &numberVolumeElementNodes);
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberVolumeElements:" << numberVolumeElements
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+    
+
+// Localize nfault array for reference by element
+
+char pypylith3d_localf__doc__[] = "";
+char pypylith3d_localf__name__[] = "localf";
+
+PyObject * pypylith3d_localf(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToIens;
+  PyObject* pyPointerToLmf;
+  int numberVolumeElements;
+  PyObject* pyPointerToNfault;
+  int numberSplitNodeEntries;
+  int numberVolumeElementNodes;
+
+  int ok = PyArg_ParseTuple(args, "OOiOii:localf",
+			    &pyPointerToIens,
+			    &pyPointerToLmf,
+			    &numberVolumeElements,
+			    &pyPointerToNfault,
+			    &numberSplitNodeEntries,
+			    &numberVolumeElementNodes);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int* pointerToIens = (int*) PyCObject_AsVoidPtr(pyPointerToIens);
+  int* pointerToLmf = (int*) PyCObject_AsVoidPtr(pyPointerToLmf);
+  int* pointerToNfault = (int*) PyCObject_AsVoidPtr(pyPointerToNfault);
+
+  localf_f(pointerToIens,
+	   pointerToLmf,
+	   &numberVolumeElements,
+	   pointerToNfault,
+	   &numberSplitNodeEntries,
+	   &numberVolumeElementNodes);
+		  
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberSplitNodeEntries:" << numberSplitNodeEntries
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+    
+
+// Localize idx array for reference by element
+
+char pypylith3d_localx__doc__[] = "";
+char pypylith3d_localx__name__[] = "localx";
+
+PyObject * pypylith3d_localx(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToIdx;
+  int numberNodes;
+  PyObject* pyPointerToIens;
+  PyObject* pyPointerToLmx;
+  int numberVolumeElements;
+  PyObject* pyPointerToNslip;
+  int numberSlipperyNodeEntries;
+  int numberVolumeElementNodes;
+
+  int ok = PyArg_ParseTuple(args, "OiOOiOii:localx",
+			    &pyPointerToIdx,
+  			    &numberNodes,
+  			    &pyPointerToIens,
+  			    &pyPointerToLmx,
+  			    &numberVolumeElements,
+  			    &pyPointerToNslip,
+			    &numberSlipperyNodeEntries,
+  			    &numberVolumeElementNodes);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int* pointerToIdx = (int*) PyCObject_AsVoidPtr(pyPointerToIdx);
+  int* pointerToIens = (int*) PyCObject_AsVoidPtr(pyPointerToIens);
+  int* pointerToLmx = (int*) PyCObject_AsVoidPtr(pyPointerToLmx);
+  int* pointerToNslip = (int*) PyCObject_AsVoidPtr(pyPointerToNslip);
+
+  localx_f(pointerToIdx,
+	   &numberNodes,
+	   pointerToIens,
+	   pointerToLmx,
+	   &numberVolumeElements,
+	   pointerToNslip,
+	   &numberSlipperyNodeEntries,
+	   &numberVolumeElementNodes);
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberVolumeElements:" << numberVolumeElements
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+// Transform linked list into index array for modified sparse row format
+
+char pypylith3d_makemsr__doc__[] = "";
+char pypylith3d_makemsr__name__[] = "makemsr";
+
+PyObject * pypylith3d_makemsr(PyObject *, PyObject *args)
+{
+  PyObject* pyA;
+  PyObject* pyPointerToIndx;
+  PyObject* pyPointerToLink;
+  PyObject* pyPointerToNbrs;
+  int numberGlobalEquations;
+  int stiffnessMatrixSize;
+  int workingArraySize;
+
+  int ok = PyArg_ParseTuple(args, "OOOOiii:makemsr",
+                            &pyA,
+			    &pyPointerToIndx,
+			    &pyPointerToLink,
+			    &pyPointerToNbrs,
+			    &numberGlobalEquations,
+			    &stiffnessMatrixSize,
+			    &workingArraySize);
+
+  if (!ok) {
+    return 0;
+  }
+  Mat A = (Mat) PyCObject_AsVoidPtr(pyA);
+  int* pointerToIndx = (int*) PyCObject_AsVoidPtr(pyPointerToIndx);
+  int* pointerToLink = (int*) PyCObject_AsVoidPtr(pyPointerToLink);
+  int* pointerToNbrs = (int*) PyCObject_AsVoidPtr(pyPointerToNbrs);
+  int minimumNonzeroTermsPerRow = 0;
+  int maximumNonzeroTermsPerRow = 0;
+  double averageNonzeroTermsPerRow = 0.0;
+
+  makemsr_f(&A,
+	    pointerToIndx,
+	    pointerToLink,
+	    pointerToNbrs,
+	    &numberGlobalEquations,
+	    &stiffnessMatrixSize,
+	    &workingArraySize,
+	    &minimumNonzeroTermsPerRow,
+	    &maximumNonzeroTermsPerRow,
+	    &averageNonzeroTermsPerRow);
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "workingArraySize:" << workingArraySize
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  // return Py_None;
+  return Py_BuildValue("iid",
+		       minimumNonzeroTermsPerRow,
+		       maximumNonzeroTermsPerRow,
+		       averageNonzeroTermsPerRow);
+}
+
+
+
+// Perform the time-dependent solution.
+
+char pypylith3d_viscos__doc__[] = "";
+char pypylith3d_viscos__name__[] = "viscos";
+
+PyObject * pypylith3d_viscos(PyObject *, PyObject *args)
+{
+  PyObject* pyA;                              // Sparse matrix arrays
+  PyObject* pyRhs;
+  PyObject* pySol;
+  PyObject* pyPointerToBextern;               // Force vectors
+  PyObject* pyPointerToBtraction;
+  PyObject* pyPointerToBgravity;
+  PyObject* pyPointerToBconcForce;
+  PyObject* pyPointerToBintern;
+  PyObject* pyPointerToBresid;
+  PyObject* pyPointerToBwink;
+  PyObject* pyPointerToBwinkx;
+  PyObject* pyPointerToDispVec;
+  PyObject* pyPointerToDprev;
+  PyObject* pyPointerToListArrayNforce;
+  PyObject* pyPointerToListArrayGrav;
+  PyObject* pyPointerToX;                     // Global arrays
+  PyObject* pyPointerToD;
+  PyObject* pyPointerToDeld;
+  PyObject* pyPointerToDcur;
+  PyObject* pyPointerToId;
+  PyObject* pyPointerToIwink;
+  PyObject* pyPointerToWink;
+  PyObject* pyPointerToListArrayNsysdat;
+  PyObject* pyPointerToListArrayIddmat;
+  PyObject* pyPointerToIbond;                 // Boundary condition arrays
+  PyObject* pyPointerToBond;
+  PyObject* pyPointerToDx;                    // Slippery node arrays
+  PyObject* pyPointerToDeldx;
+  PyObject* pyPointerToDxcur;
+  PyObject* pyPointerToDiforc;
+  PyObject* pyPointerToIdx;
+  PyObject* pyPointerToIwinkx;
+  PyObject* pyPointerToWinkx;
+  PyObject* pyPointerToIdslp;
+  PyObject* pyPointerToIpslp;
+  PyObject* pyPointerToIdhist;
+  PyObject* pyPointerToFault;                 // Split node arrays
+  PyObject* pyPointerToNfault;
+  PyObject* pyPointerToDfault;
+  PyObject* pyPointerToTfault;
+  PyObject* pyPointerToS;                     // Local stiffness matrix arrays
+  PyObject* pyPointerToStemp;
+  PyObject* pyPointerToState;                 // Element arrays
+  PyObject* pyPointerToDstate;
+  PyObject* pyPointerToState0;
+  PyObject* pyPointerToDmat;
+  PyObject* pyPointerToIen;
+  PyObject* pyPointerToLm;
+  PyObject* pyPointerToLmx;
+  PyObject* pyPointerToLmf;
+  PyObject* pyPointerToIvfamily;
+  PyObject* pyPointerToListArrayNpar;
+  PyObject* pyPointerToIelindx;
+  PyObject* pyPointerToTractionverts;         // Traction BC arrays
+  PyObject* pyPointerToTractionvals;
+  PyObject* pyPointerToGauss2d;
+  PyObject* pyPointerToSh2d;
+  PyObject* pyPointerToListArrayElementTypeInfo2d;
+  PyObject* pyPointerToListArrayPropertyList; // Material property arrays
+  PyObject* pyPointerToMaterialModelInfo;
+  PyObject* pyPointerToGauss;                 // Element type arrays
+  PyObject* pyPointerToSh;
+  PyObject* pyPointerToShj;
+  PyObject* pyPointerToListArrayElementTypeInfo;
+  PyObject* pyPointerToHistry;                // Time information
+  PyObject* pyPointerToListArrayRtimdat;
+  PyObject* pyPointerToListArrayNtimdat;
+  PyObject* pyPointerToListArrayNvisdat;
+  PyObject* pyPointerToMaxstp;
+  PyObject* pyPointerToDelt;
+  PyObject* pyPointerToAlfa;
+  PyObject* pyPointerToMaxit;
+  PyObject* pyPointerToNtdinit;
+  PyObject* pyPointerToLgdef;
+  PyObject* pyPointerToUtol;
+  PyObject* pyPointerToFtol;
+  PyObject* pyPointerToEtol;
+  PyObject* pyPointerToItmax;
+  PyObject* pyPointerToListArrayRgiter;       // Iterative solution information
+  PyObject* pyPointerToSkew;                  // Skew rotation information
+  PyObject* pyPointerToIprint;                // Input/output information
+  PyObject* pyPointerToListArrayNcodat;
+  PyObject* pyPointerToListArrayNunits;
+  PyObject* pyPointerToListArrayNprint;
+  PyObject* pyPointerToIstatout;
+  PyObject* pyPointerToNstatout;
+  char* asciiOutputFile;                      // Output file names
+  char* plotOutputFile;
+  char* ucdOutputRoot;
+  int viscousStage;
+  int iterateEvent;
+
+  int ok = PyArg_ParseTuple(args, "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOsssii:viscos",
+			    &pyA,                              // Sparse matrix arrays
+			    &pyRhs,
+			    &pySol,
+			    &pyPointerToBextern,               // Force vectors
+			    &pyPointerToBtraction,
+			    &pyPointerToBgravity,
+			    &pyPointerToBconcForce,
+			    &pyPointerToBintern,
+			    &pyPointerToBresid,
+			    &pyPointerToBwink,
+			    &pyPointerToBwinkx,
+			    &pyPointerToDispVec,
+			    &pyPointerToDprev,
+			    &pyPointerToListArrayNforce,
+			    &pyPointerToListArrayGrav,
+			    &pyPointerToX,                     // Global arrays
+			    &pyPointerToD,
+			    &pyPointerToDeld,
+			    &pyPointerToDcur,
+			    &pyPointerToId,
+			    &pyPointerToIwink,
+			    &pyPointerToWink,
+			    &pyPointerToListArrayNsysdat,
+			    &pyPointerToListArrayIddmat,
+			    &pyPointerToIbond,                 // Boundary condition arrays
+			    &pyPointerToBond,
+			    &pyPointerToDx,                    // Slippery node arrays
+			    &pyPointerToDeldx,
+			    &pyPointerToDxcur,
+			    &pyPointerToDiforc,
+			    &pyPointerToIdx,
+			    &pyPointerToIwinkx,
+			    &pyPointerToWinkx,
+			    &pyPointerToIdslp,
+			    &pyPointerToIpslp,
+			    &pyPointerToIdhist,
+			    &pyPointerToFault,                 // Split node arrays
+			    &pyPointerToNfault,
+			    &pyPointerToDfault,
+			    &pyPointerToTfault,
+			    &pyPointerToS,                     // Local stiffness matrix arrays
+			    &pyPointerToStemp,
+			    &pyPointerToState,                 // Element arrays
+			    &pyPointerToDstate,
+			    &pyPointerToState0,
+			    &pyPointerToDmat,
+			    &pyPointerToIen,
+			    &pyPointerToLm,
+			    &pyPointerToLmx,
+			    &pyPointerToLmf,
+			    &pyPointerToIvfamily,
+			    &pyPointerToListArrayNpar,
+			    &pyPointerToIelindx,
+                            &pyPointerToTractionverts,         // Traction BC arrays
+                            &pyPointerToTractionvals,
+                            &pyPointerToGauss2d,
+                            &pyPointerToSh2d,
+                            &pyPointerToListArrayElementTypeInfo2d,
+			    &pyPointerToListArrayPropertyList, // Material property arrays
+			    &pyPointerToMaterialModelInfo,
+			    &pyPointerToGauss,                 // Element type arrays
+			    &pyPointerToSh,
+			    &pyPointerToShj,
+			    &pyPointerToListArrayElementTypeInfo,
+			    &pyPointerToHistry,                // Time information
+			    &pyPointerToListArrayRtimdat,
+			    &pyPointerToListArrayNtimdat,
+			    &pyPointerToListArrayNvisdat,
+			    &pyPointerToMaxstp,
+			    &pyPointerToDelt,
+			    &pyPointerToAlfa,
+			    &pyPointerToMaxit,
+			    &pyPointerToNtdinit,
+			    &pyPointerToLgdef,
+			    &pyPointerToUtol,
+			    &pyPointerToFtol,
+			    &pyPointerToEtol,
+			    &pyPointerToItmax,
+			    &pyPointerToListArrayRgiter,       // Iterative solution information
+			    &pyPointerToSkew,                  // Skew rotation information
+			    &pyPointerToIprint,                // Input/output information
+			    &pyPointerToListArrayNcodat,
+			    &pyPointerToListArrayNunits,
+			    &pyPointerToListArrayNprint,
+			    &pyPointerToIstatout,
+			    &pyPointerToNstatout,
+			    &asciiOutputFile,                  // Output file names
+			    &plotOutputFile,
+			    &ucdOutputRoot,
+                            &viscousStage,
+                            &iterateEvent);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  Mat      A = (Mat) PyCObject_AsVoidPtr(pyA);
+  Vec      rhs = (Vec) PyCObject_AsVoidPtr(pyRhs);
+  Vec      sol = (Vec) PyCObject_AsVoidPtr(pySol);
+  double*  pointerToBextern = (double*) PyCObject_AsVoidPtr(pyPointerToBextern);
+  double*  pointerToBtraction = (double*) PyCObject_AsVoidPtr(pyPointerToBtraction);
+  double*  pointerToBgravity = (double*) PyCObject_AsVoidPtr(pyPointerToBgravity);
+  double*  pointerToBconcForce = (double*) PyCObject_AsVoidPtr(pyPointerToBconcForce);
+  double*  pointerToBintern = (double*) PyCObject_AsVoidPtr(pyPointerToBintern);
+  double*  pointerToBresid = (double*) PyCObject_AsVoidPtr(pyPointerToBresid);
+  double*  pointerToBwink = (double*) PyCObject_AsVoidPtr(pyPointerToBwink);
+  double*  pointerToBwinkx = (double*) PyCObject_AsVoidPtr(pyPointerToBwinkx);
+  double*  pointerToDispVec = (double*) PyCObject_AsVoidPtr(pyPointerToDispVec);
+  double*  pointerToDprev = (double*) PyCObject_AsVoidPtr(pyPointerToDprev);
+  int*  pointerToListArrayNforce = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNforce);
+  double*  pointerToListArrayGrav = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayGrav);
+  double*  pointerToX = (double*) PyCObject_AsVoidPtr(pyPointerToX);
+  double*  pointerToD = (double*) PyCObject_AsVoidPtr(pyPointerToD);
+  double*  pointerToDeld = (double*) PyCObject_AsVoidPtr(pyPointerToDeld);
+  double*  pointerToDcur = (double*) PyCObject_AsVoidPtr(pyPointerToDcur);
+  int*  pointerToId = (int*) PyCObject_AsVoidPtr(pyPointerToId);
+  int*  pointerToIwink = (int*) PyCObject_AsVoidPtr(pyPointerToIwink);
+  double*  pointerToWink = (double*) PyCObject_AsVoidPtr(pyPointerToWink);
+  int*  pointerToListArrayNsysdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNsysdat);
+  int*  pointerToListArrayIddmat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayIddmat);
+  int*  pointerToIbond = (int*) PyCObject_AsVoidPtr(pyPointerToIbond);
+  double*  pointerToBond = (double*) PyCObject_AsVoidPtr(pyPointerToBond);
+  double*  pointerToDx = (double*) PyCObject_AsVoidPtr(pyPointerToDx);
+  double*  pointerToDeldx = (double*) PyCObject_AsVoidPtr(pyPointerToDeldx);
+  double*  pointerToDxcur = (double*) PyCObject_AsVoidPtr(pyPointerToDxcur);
+  double*  pointerToDiforc = (double*) PyCObject_AsVoidPtr(pyPointerToDiforc);
+  int*  pointerToIdx = (int*) PyCObject_AsVoidPtr(pyPointerToIdx);
+  int*  pointerToIwinkx = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkx);
+  double*  pointerToWinkx = (double*) PyCObject_AsVoidPtr(pyPointerToWinkx);
+  int*  pointerToIdslp = (int*) PyCObject_AsVoidPtr(pyPointerToIdslp);
+  int*  pointerToIpslp = (int*) PyCObject_AsVoidPtr(pyPointerToIpslp);
+  int*  pointerToIdhist = (int*) PyCObject_AsVoidPtr(pyPointerToIdhist);
+  double*  pointerToFault = (double*) PyCObject_AsVoidPtr(pyPointerToFault);
+  int*  pointerToNfault = (int*) PyCObject_AsVoidPtr(pyPointerToNfault);
+  double*  pointerToDfault = (double*) PyCObject_AsVoidPtr(pyPointerToDfault);
+  double*  pointerToTfault = (double*) PyCObject_AsVoidPtr(pyPointerToTfault);
+  double*  pointerToS = (double*) PyCObject_AsVoidPtr(pyPointerToS);
+  double*  pointerToStemp = (double*) PyCObject_AsVoidPtr(pyPointerToStemp);
+  double*  pointerToState = (double*) PyCObject_AsVoidPtr(pyPointerToState);
+  double*  pointerToDstate = (double*) PyCObject_AsVoidPtr(pyPointerToDstate);
+  double*  pointerToState0 = (double*) PyCObject_AsVoidPtr(pyPointerToState0);
+  double*  pointerToDmat = (double*) PyCObject_AsVoidPtr(pyPointerToDmat);
+  int*  pointerToIen = (int*) PyCObject_AsVoidPtr(pyPointerToIen);
+  int*  pointerToLm = (int*) PyCObject_AsVoidPtr(pyPointerToLm);
+  int*  pointerToLmx = (int*) PyCObject_AsVoidPtr(pyPointerToLmx);
+  int*  pointerToLmf = (int*) PyCObject_AsVoidPtr(pyPointerToLmf);
+  int*  pointerToIvfamily = (int*) PyCObject_AsVoidPtr(pyPointerToIvfamily);
+  int*  pointerToListArrayNpar = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNpar);
+  int*  pointerToIelindx = (int*) PyCObject_AsVoidPtr(pyPointerToIelindx);
+  int*  pointerToTractionverts = (int*) PyCObject_AsVoidPtr(pyPointerToTractionverts);
+  double*  pointerToTractionvals = (double*) PyCObject_AsVoidPtr(pyPointerToTractionvals);
+  double*  pointerToGauss2d = (double*) PyCObject_AsVoidPtr(pyPointerToGauss2d);
+  double*  pointerToSh2d = (double*) PyCObject_AsVoidPtr(pyPointerToSh2d);
+  int*  pointerToListArrayElementTypeInfo2d = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayElementTypeInfo2d);
+  double*  pointerToListArrayPropertyList = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayPropertyList);
+  int*  pointerToMaterialModelInfo = (int*) PyCObject_AsVoidPtr(pyPointerToMaterialModelInfo);
+  double*  pointerToGauss = (double*) PyCObject_AsVoidPtr(pyPointerToGauss);
+  double*  pointerToSh = (double*) PyCObject_AsVoidPtr(pyPointerToSh);
+  double*  pointerToShj = (double*) PyCObject_AsVoidPtr(pyPointerToShj);
+  int*  pointerToListArrayElementTypeInfo = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayElementTypeInfo);
+  double*  pointerToHistry = (double*) PyCObject_AsVoidPtr(pyPointerToHistry);
+  double*  pointerToListArrayRtimdat = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayRtimdat);
+  int*  pointerToListArrayNtimdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNtimdat);
+  int*  pointerToListArrayNvisdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNvisdat);
+  int*  pointerToMaxstp = (int*) PyCObject_AsVoidPtr(pyPointerToMaxstp);
+  double*  pointerToDelt = (double*) PyCObject_AsVoidPtr(pyPointerToDelt);
+  double*  pointerToAlfa = (double*) PyCObject_AsVoidPtr(pyPointerToAlfa);
+  int*  pointerToMaxit = (int*) PyCObject_AsVoidPtr(pyPointerToMaxit);
+  int*  pointerToNtdinit = (int*) PyCObject_AsVoidPtr(pyPointerToNtdinit);
+  int*  pointerToLgdef = (int*) PyCObject_AsVoidPtr(pyPointerToLgdef);
+  double*  pointerToUtol = (double*) PyCObject_AsVoidPtr(pyPointerToUtol);
+  double*  pointerToFtol = (double*) PyCObject_AsVoidPtr(pyPointerToFtol);
+  double*  pointerToEtol = (double*) PyCObject_AsVoidPtr(pyPointerToEtol);
+  int*  pointerToItmax = (int*) PyCObject_AsVoidPtr(pyPointerToItmax);
+  double*  pointerToListArrayRgiter = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayRgiter);
+  double*  pointerToSkew = (double*) PyCObject_AsVoidPtr(pyPointerToSkew);
+  int*  pointerToIprint = (int*) PyCObject_AsVoidPtr(pyPointerToIprint);
+  int*  pointerToListArrayNcodat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNcodat);
+  int*  pointerToListArrayNunits = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNunits);
+  int*  pointerToListArrayNprint = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNprint);
+  int*  pointerToIstatout = (int*) PyCObject_AsVoidPtr(pyPointerToIstatout);
+  int*  pointerToNstatout = (int*) PyCObject_AsVoidPtr(pyPointerToNstatout);
+
+
+  viscos_f(&A,                            // 1: Sparse matrix arrays
+	   &rhs,
+	   &sol,
+	   pointerToBextern,                  // Force vectors
+	   pointerToBtraction,
+	   pointerToBgravity,
+	   pointerToBconcForce,
+	   pointerToBintern,
+	   pointerToBresid,
+	   pointerToBwink,                    // 10
+	   pointerToBwinkx,
+	   pointerToDispVec,
+	   pointerToDprev,
+	   pointerToListArrayNforce,
+	   pointerToListArrayGrav,
+	   pointerToX,                        // Global arrays
+	   pointerToD,
+	   pointerToDeld,
+	   pointerToDcur,
+	   pointerToId,                       // 20
+	   pointerToIwink,
+	   pointerToWink,
+	   pointerToListArrayNsysdat,
+	   pointerToListArrayIddmat,
+	   pointerToIbond,                    // Boundary condition arrays
+	   pointerToBond,
+	   pointerToDx,                       // Slippery node arrays
+	   pointerToDeldx,
+	   pointerToDxcur,
+	   pointerToDiforc,                   // 30
+	   pointerToIdx,
+	   pointerToIwinkx,
+	   pointerToWinkx,
+	   pointerToIdslp,
+	   pointerToIpslp,
+	   pointerToIdhist,
+	   pointerToFault,                    // Split node arrays
+	   pointerToNfault,
+	   pointerToDfault,
+	   pointerToTfault,                   // 40
+	   pointerToS,                        // Local stiffness matrix arrays
+	   pointerToStemp,
+	   pointerToState,                    // Element arrays
+	   pointerToDstate,
+	   pointerToState0,
+	   pointerToDmat,
+	   pointerToIen,
+	   pointerToLm,
+	   pointerToLmx,
+	   pointerToLmf,                      // 50
+	   pointerToIvfamily,
+	   pointerToListArrayNpar,
+	   pointerToIelindx,
+	   pointerToTractionverts,            // Traction BC arrays
+	   pointerToTractionvals,
+	   pointerToGauss2d,
+	   pointerToSh2d,
+	   pointerToListArrayElementTypeInfo2d,
+	   pointerToListArrayPropertyList,    // Material property arrays
+	   pointerToMaterialModelInfo,        // 60
+	   pointerToGauss,                    // Element type arrays
+	   pointerToSh,
+	   pointerToShj,
+	   pointerToListArrayElementTypeInfo,
+	   pointerToHistry,                   // Time information
+	   pointerToListArrayRtimdat,
+	   pointerToListArrayNtimdat,
+	   pointerToListArrayNvisdat,
+	   pointerToMaxstp,
+	   pointerToDelt,                     // 70
+	   pointerToAlfa,
+	   pointerToMaxit,
+	   pointerToNtdinit,
+	   pointerToLgdef,
+	   pointerToUtol,
+	   pointerToFtol,
+	   pointerToEtol,
+	   pointerToItmax,
+	   pointerToListArrayRgiter,          // Iterative solution information
+	   pointerToSkew,                     // 80: Skew rotation information
+	   pointerToIprint,                   // Input/output information
+	   pointerToListArrayNcodat,
+	   pointerToListArrayNunits,
+	   pointerToListArrayNprint,
+	   pointerToIstatout,
+	   pointerToNstatout,
+	   asciiOutputFile,                   // Output file names
+	   plotOutputFile,
+	   ucdOutputRoot,
+	   &viscousStage,                     // 90: PETSC logging
+	   &iterateEvent,
+	   &errorcode,                        // Error codes
+	   errorstring,
+	   strlen(asciiOutputFile),           // String lengths
+	   strlen(plotOutputFile),
+	   strlen(ucdOutputRoot),
+	   sizeof(errorstring));
+
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "asciiOutputFile:" << asciiOutputFile
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+// Perform the time-dependent solution.
+
+char pypylith3d_viscos_step__doc__[] = "";
+char pypylith3d_viscos_step__name__[] = "viscos_step";
+
+PyObject * pypylith3d_viscos_step(PyObject *, PyObject *args)
+{
+  PyObject* pyA;                              // Sparse matrix arrays
+  PyObject* pyRhs;
+  PyObject* pySol;
+  PyObject* pyPointerToBextern;               // Force vectors
+  PyObject* pyPointerToBtraction;
+  PyObject* pyPointerToBgravity;
+  PyObject* pyPointerToBconcForce;
+  PyObject* pyPointerToBintern;
+  PyObject* pyPointerToBresid;
+  PyObject* pyPointerToBwink;
+  PyObject* pyPointerToBwinkx;
+  PyObject* pyPointerToDispVec;
+  PyObject* pyPointerToDprev;
+  PyObject* pyPointerToListArrayNforce;
+  PyObject* pyPointerToListArrayGrav;
+  PyObject* pyPointerToX;                     // Global arrays
+  PyObject* pyPointerToD;
+  PyObject* pyPointerToDeld;
+  PyObject* pyPointerToDcur;
+  PyObject* pyPointerToId;
+  PyObject* pyPointerToIwink;
+  PyObject* pyPointerToWink;
+  PyObject* pyPointerToListArrayNsysdat;
+  PyObject* pyPointerToListArrayIddmat;
+  PyObject* pyPointerToIbond;                 // Boundary condition arrays
+  PyObject* pyPointerToBond;
+  PyObject* pyPointerToDx;                    // Slippery node arrays
+  PyObject* pyPointerToDeldx;
+  PyObject* pyPointerToDxcur;
+  PyObject* pyPointerToDiforc;
+  PyObject* pyPointerToIdx;
+  PyObject* pyPointerToIwinkx;
+  PyObject* pyPointerToWinkx;
+  PyObject* pyPointerToIdslp;
+  PyObject* pyPointerToIpslp;
+  PyObject* pyPointerToIdhist;
+  PyObject* pyPointerToFault;                 // Split node arrays
+  PyObject* pyPointerToNfault;
+  PyObject* pyPointerToDfault;
+  PyObject* pyPointerToTfault;
+  PyObject* pyPointerToS;                     // Local stiffness matrix arrays
+  PyObject* pyPointerToStemp;
+  PyObject* pyPointerToState;                 // Element arrays
+  PyObject* pyPointerToDstate;
+  PyObject* pyPointerToState0;
+  PyObject* pyPointerToDmat;
+  PyObject* pyPointerToIen;
+  PyObject* pyPointerToLm;
+  PyObject* pyPointerToLmx;
+  PyObject* pyPointerToLmf;
+  PyObject* pyPointerToIvfamily;
+  PyObject* pyPointerToListArrayNpar;
+  PyObject* pyPointerToIelindx;
+  PyObject* pyPointerToTractionverts;         // Traction BC arrays
+  PyObject* pyPointerToTractionvals;
+  PyObject* pyPointerToGauss2d;
+  PyObject* pyPointerToSh2d;
+  PyObject* pyPointerToListArrayElementTypeInfo2d;
+  PyObject* pyPointerToListArrayPropertyList; // Material property arrays
+  PyObject* pyPointerToMaterialModelInfo;
+  PyObject* pyPointerToGauss;                 // Element type arrays
+  PyObject* pyPointerToSh;
+  PyObject* pyPointerToShj;
+  PyObject* pyPointerToListArrayElementTypeInfo;
+  PyObject* pyPointerToHistry;                // Time information
+  PyObject* pyPointerToListArrayRtimdat;
+  PyObject* pyPointerToListArrayNtimdat;
+  PyObject* pyPointerToListArrayNvisdat;
+  PyObject* pyPointerToMaxstp;
+  PyObject* pyPointerToDelt;
+  PyObject* pyPointerToAlfa;
+  PyObject* pyPointerToMaxit;
+  PyObject* pyPointerToNtdinit;
+  PyObject* pyPointerToLgdef;
+  PyObject* pyPointerToUtol;
+  PyObject* pyPointerToFtol;
+  PyObject* pyPointerToEtol;
+  PyObject* pyPointerToItmax;
+  PyObject* pyPointerToListArrayRgiter;       // Iterative solution information
+  PyObject* pyPointerToSkew;                  // Skew rotation information
+  PyObject* pyPointerToIprint;                // Input/output information
+  PyObject* pyPointerToListArrayNcodat;
+  PyObject* pyPointerToListArrayNunits;
+  PyObject* pyPointerToListArrayNprint;
+  PyObject* pyPointerToIstatout;
+  PyObject* pyPointerToNstatout;
+  char* asciiOutputFile;                      // Output file names
+  char* plotOutputFile;
+  char* ucdOutputRoot;
+  int viscousStage;
+  int iterateEvent;
+  int ntot, ltim, indexx, jcyc, i, j, skc, nfirst, nstep, lgdefp;
+  double time, deltp;
+  PyObject *pyGtol;
+
+  int ok = PyArg_ParseTuple(args, "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOsssiiiiiiiiiiiddiO!:viscos_step",
+			    &pyA,                              // Sparse matrix arrays
+			    &pyRhs,
+			    &pySol,
+			    &pyPointerToBextern,               // Force vectors
+			    &pyPointerToBtraction,
+			    &pyPointerToBgravity,
+			    &pyPointerToBconcForce,
+			    &pyPointerToBintern,
+			    &pyPointerToBresid,
+			    &pyPointerToBwink,
+			    &pyPointerToBwinkx,
+			    &pyPointerToDispVec,
+			    &pyPointerToDprev,
+			    &pyPointerToListArrayNforce,
+			    &pyPointerToListArrayGrav,
+			    &pyPointerToX,                     // Global arrays
+			    &pyPointerToD,
+			    &pyPointerToDeld,
+			    &pyPointerToDcur,
+			    &pyPointerToId,
+			    &pyPointerToIwink,
+			    &pyPointerToWink,
+			    &pyPointerToListArrayNsysdat,
+			    &pyPointerToListArrayIddmat,
+			    &pyPointerToIbond,                 // Boundary condition arrays
+			    &pyPointerToBond,
+			    &pyPointerToDx,                    // Slippery node arrays
+			    &pyPointerToDeldx,
+			    &pyPointerToDxcur,
+			    &pyPointerToDiforc,
+			    &pyPointerToIdx,
+			    &pyPointerToIwinkx,
+			    &pyPointerToWinkx,
+			    &pyPointerToIdslp,
+			    &pyPointerToIpslp,
+			    &pyPointerToIdhist,
+			    &pyPointerToFault,                 // Split node arrays
+			    &pyPointerToNfault,
+			    &pyPointerToDfault,
+			    &pyPointerToTfault,
+			    &pyPointerToS,                     // Local stiffness matrix arrays
+			    &pyPointerToStemp,
+			    &pyPointerToState,                 // Element arrays
+			    &pyPointerToDstate,
+			    &pyPointerToState0,
+			    &pyPointerToDmat,
+			    &pyPointerToIen,
+			    &pyPointerToLm,
+			    &pyPointerToLmx,
+			    &pyPointerToLmf,
+			    &pyPointerToIvfamily,
+			    &pyPointerToListArrayNpar,
+			    &pyPointerToIelindx,
+                            &pyPointerToTractionverts,         // Traction BC arrays
+                            &pyPointerToTractionvals,
+                            &pyPointerToGauss2d,
+                            &pyPointerToSh2d,
+                            &pyPointerToListArrayElementTypeInfo2d,
+			    &pyPointerToListArrayPropertyList, // Material property arrays
+			    &pyPointerToMaterialModelInfo,
+			    &pyPointerToGauss,                 // Element type arrays
+			    &pyPointerToSh,
+			    &pyPointerToShj,
+			    &pyPointerToListArrayElementTypeInfo,
+			    &pyPointerToHistry,                // Time information
+			    &pyPointerToListArrayRtimdat,
+			    &pyPointerToListArrayNtimdat,
+			    &pyPointerToListArrayNvisdat,
+			    &pyPointerToMaxstp,
+			    &pyPointerToDelt,
+			    &pyPointerToAlfa,
+			    &pyPointerToMaxit,
+			    &pyPointerToNtdinit,
+			    &pyPointerToLgdef,
+			    &pyPointerToUtol,
+			    &pyPointerToFtol,
+			    &pyPointerToEtol,
+			    &pyPointerToItmax,
+			    &pyPointerToListArrayRgiter,       // Iterative solution information
+			    &pyPointerToSkew,                  // Skew rotation information
+			    &pyPointerToIprint,                // Input/output information
+			    &pyPointerToListArrayNcodat,
+			    &pyPointerToListArrayNunits,
+			    &pyPointerToListArrayNprint,
+			    &pyPointerToIstatout,
+			    &pyPointerToNstatout,
+			    &asciiOutputFile,                  // Output file names
+			    &plotOutputFile,
+			    &ucdOutputRoot,
+                &viscousStage,
+                &iterateEvent,
+                            &ntot,
+                            &ltim,
+                            &indexx,
+                            &jcyc,
+                            &i,
+                            &j,
+                            &skc,
+                            &nfirst,
+                            &nstep,
+                            &time,
+                            &deltp,
+                            &lgdefp,
+                            &PyList_Type, &pyGtol);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  Mat      A = (Mat) PyCObject_AsVoidPtr(pyA);
+  Vec      rhs = (Vec) PyCObject_AsVoidPtr(pyRhs);
+  Vec      sol = (Vec) PyCObject_AsVoidPtr(pySol);
+  double*  pointerToBextern = (double*) PyCObject_AsVoidPtr(pyPointerToBextern);
+  double*  pointerToBtraction = (double*) PyCObject_AsVoidPtr(pyPointerToBtraction);
+  double*  pointerToBgravity = (double*) PyCObject_AsVoidPtr(pyPointerToBgravity);
+  double*  pointerToBconcForce = (double*) PyCObject_AsVoidPtr(pyPointerToBconcForce);
+  double*  pointerToBintern = (double*) PyCObject_AsVoidPtr(pyPointerToBintern);
+  double*  pointerToBresid = (double*) PyCObject_AsVoidPtr(pyPointerToBresid);
+  double*  pointerToBwink = (double*) PyCObject_AsVoidPtr(pyPointerToBwink);
+  double*  pointerToBwinkx = (double*) PyCObject_AsVoidPtr(pyPointerToBwinkx);
+  double*  pointerToDispVec = (double*) PyCObject_AsVoidPtr(pyPointerToDispVec);
+  double*  pointerToDprev = (double*) PyCObject_AsVoidPtr(pyPointerToDprev);
+  int*  pointerToListArrayNforce = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNforce);
+  double*  pointerToListArrayGrav = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayGrav);
+  double*  pointerToX = (double*) PyCObject_AsVoidPtr(pyPointerToX);
+  double*  pointerToD = (double*) PyCObject_AsVoidPtr(pyPointerToD);
+  double*  pointerToDeld = (double*) PyCObject_AsVoidPtr(pyPointerToDeld);
+  double*  pointerToDcur = (double*) PyCObject_AsVoidPtr(pyPointerToDcur);
+  int*  pointerToId = (int*) PyCObject_AsVoidPtr(pyPointerToId);
+  int*  pointerToIwink = (int*) PyCObject_AsVoidPtr(pyPointerToIwink);
+  double*  pointerToWink = (double*) PyCObject_AsVoidPtr(pyPointerToWink);
+  int*  pointerToListArrayNsysdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNsysdat);
+  int*  pointerToListArrayIddmat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayIddmat);
+  int*  pointerToIbond = (int*) PyCObject_AsVoidPtr(pyPointerToIbond);
+  double*  pointerToBond = (double*) PyCObject_AsVoidPtr(pyPointerToBond);
+  double*  pointerToDx = (double*) PyCObject_AsVoidPtr(pyPointerToDx);
+  double*  pointerToDeldx = (double*) PyCObject_AsVoidPtr(pyPointerToDeldx);
+  double*  pointerToDxcur = (double*) PyCObject_AsVoidPtr(pyPointerToDxcur);
+  double*  pointerToDiforc = (double*) PyCObject_AsVoidPtr(pyPointerToDiforc);
+  int*  pointerToIdx = (int*) PyCObject_AsVoidPtr(pyPointerToIdx);
+  int*  pointerToIwinkx = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkx);
+  double*  pointerToWinkx = (double*) PyCObject_AsVoidPtr(pyPointerToWinkx);
+  int*  pointerToIdslp = (int*) PyCObject_AsVoidPtr(pyPointerToIdslp);
+  int*  pointerToIpslp = (int*) PyCObject_AsVoidPtr(pyPointerToIpslp);
+  int*  pointerToIdhist = (int*) PyCObject_AsVoidPtr(pyPointerToIdhist);
+  double*  pointerToFault = (double*) PyCObject_AsVoidPtr(pyPointerToFault);
+  int*  pointerToNfault = (int*) PyCObject_AsVoidPtr(pyPointerToNfault);
+  double*  pointerToDfault = (double*) PyCObject_AsVoidPtr(pyPointerToDfault);
+  double*  pointerToTfault = (double*) PyCObject_AsVoidPtr(pyPointerToTfault);
+  double*  pointerToS = (double*) PyCObject_AsVoidPtr(pyPointerToS);
+  double*  pointerToStemp = (double*) PyCObject_AsVoidPtr(pyPointerToStemp);
+  double*  pointerToState = (double*) PyCObject_AsVoidPtr(pyPointerToState);
+  double*  pointerToDstate = (double*) PyCObject_AsVoidPtr(pyPointerToDstate);
+  double*  pointerToState0 = (double*) PyCObject_AsVoidPtr(pyPointerToState0);
+  double*  pointerToDmat = (double*) PyCObject_AsVoidPtr(pyPointerToDmat);
+  int*  pointerToIen = (int*) PyCObject_AsVoidPtr(pyPointerToIen);
+  int*  pointerToLm = (int*) PyCObject_AsVoidPtr(pyPointerToLm);
+  int*  pointerToLmx = (int*) PyCObject_AsVoidPtr(pyPointerToLmx);
+  int*  pointerToLmf = (int*) PyCObject_AsVoidPtr(pyPointerToLmf);
+  int*  pointerToIvfamily = (int*) PyCObject_AsVoidPtr(pyPointerToIvfamily);
+  int*  pointerToListArrayNpar = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNpar);
+  int*  pointerToIelindx = (int*) PyCObject_AsVoidPtr(pyPointerToIelindx);
+  int*  pointerToTractionverts = (int*) PyCObject_AsVoidPtr(pyPointerToTractionverts);
+  double*  pointerToTractionvals = (double*) PyCObject_AsVoidPtr(pyPointerToTractionvals);
+  double*  pointerToGauss2d = (double*) PyCObject_AsVoidPtr(pyPointerToGauss2d);
+  double*  pointerToSh2d = (double*) PyCObject_AsVoidPtr(pyPointerToSh2d);
+  int*  pointerToListArrayElementTypeInfo2d = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayElementTypeInfo2d);
+  double*  pointerToListArrayPropertyList = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayPropertyList);
+  int*  pointerToMaterialModelInfo = (int*) PyCObject_AsVoidPtr(pyPointerToMaterialModelInfo);
+  double*  pointerToGauss = (double*) PyCObject_AsVoidPtr(pyPointerToGauss);
+  double*  pointerToSh = (double*) PyCObject_AsVoidPtr(pyPointerToSh);
+  double*  pointerToShj = (double*) PyCObject_AsVoidPtr(pyPointerToShj);
+  int*  pointerToListArrayElementTypeInfo = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayElementTypeInfo);
+  double*  pointerToHistry = (double*) PyCObject_AsVoidPtr(pyPointerToHistry);
+  double*  pointerToListArrayRtimdat = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayRtimdat);
+  int*  pointerToListArrayNtimdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNtimdat);
+  int*  pointerToListArrayNvisdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNvisdat);
+  int*  pointerToMaxstp = (int*) PyCObject_AsVoidPtr(pyPointerToMaxstp);
+  double*  pointerToDelt = (double*) PyCObject_AsVoidPtr(pyPointerToDelt);
+  double*  pointerToAlfa = (double*) PyCObject_AsVoidPtr(pyPointerToAlfa);
+  int*  pointerToMaxit = (int*) PyCObject_AsVoidPtr(pyPointerToMaxit);
+  int*  pointerToNtdinit = (int*) PyCObject_AsVoidPtr(pyPointerToNtdinit);
+  int*  pointerToLgdef = (int*) PyCObject_AsVoidPtr(pyPointerToLgdef);
+  double*  pointerToUtol = (double*) PyCObject_AsVoidPtr(pyPointerToUtol);
+  double*  pointerToFtol = (double*) PyCObject_AsVoidPtr(pyPointerToFtol);
+  double*  pointerToEtol = (double*) PyCObject_AsVoidPtr(pyPointerToEtol);
+  int*  pointerToItmax = (int*) PyCObject_AsVoidPtr(pyPointerToItmax);
+  double*  pointerToListArrayRgiter = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayRgiter);
+  double*  pointerToSkew = (double*) PyCObject_AsVoidPtr(pyPointerToSkew);
+  int*  pointerToIprint = (int*) PyCObject_AsVoidPtr(pyPointerToIprint);
+  int*  pointerToListArrayNcodat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNcodat);
+  int*  pointerToListArrayNunits = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNunits);
+  int*  pointerToListArrayNprint = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNprint);
+  int*  pointerToIstatout = (int*) PyCObject_AsVoidPtr(pyPointerToIstatout);
+  int*  pointerToNstatout = (int*) PyCObject_AsVoidPtr(pyPointerToNstatout);
+
+  double gtol[4];
+  if (PyList_Size(pyGtol) != 3) {
+    return 0;
+  }
+  for(int v = 0; v < 3; v++) {
+    PyObject *listitem = PyList_GetItem(pyGtol, v);
+
+    if(!PyFloat_Check(listitem)) {
+      return 0;
+    }
+    gtol[v] = PyFloat_AsDouble(listitem);
+  }
+
+  viscos_step_f(&A,                            // 1: Sparse matrix arrays
+	   &rhs,
+	   &sol,
+	   pointerToBextern,                  // Force vectors
+	   pointerToBtraction,
+	   pointerToBgravity,
+	   pointerToBconcForce,
+	   pointerToBintern,
+	   pointerToBresid,
+	   pointerToBwink,                    // 10
+	   pointerToBwinkx,
+	   pointerToDispVec,
+	   pointerToDprev,
+	   pointerToListArrayNforce,
+	   pointerToListArrayGrav,
+	   pointerToX,                        // Global arrays
+	   pointerToD,
+	   pointerToDeld,
+	   pointerToDcur,
+	   pointerToId,                       // 20
+	   pointerToIwink,
+	   pointerToWink,
+	   pointerToListArrayNsysdat,
+	   pointerToListArrayIddmat,
+	   pointerToIbond,                    // Boundary condition arrays
+	   pointerToBond,
+	   pointerToDx,                       // Slippery node arrays
+	   pointerToDeldx,
+	   pointerToDxcur,
+	   pointerToDiforc,                   // 30
+	   pointerToIdx,
+	   pointerToIwinkx,
+	   pointerToWinkx,
+	   pointerToIdslp,
+	   pointerToIpslp,
+	   pointerToIdhist,
+	   pointerToFault,                    // Split node arrays
+	   pointerToNfault,
+	   pointerToDfault,
+	   pointerToTfault,                   // 40
+	   pointerToS,                        // Local stiffness matrix arrays
+	   pointerToStemp,
+	   pointerToState,                    // Element arrays
+	   pointerToDstate,
+	   pointerToState0,
+	   pointerToDmat,
+	   pointerToIen,
+	   pointerToLm,
+	   pointerToLmx,
+	   pointerToLmf,                      // 50
+	   pointerToIvfamily,
+	   pointerToListArrayNpar,
+		pointerToIelindx,
+		pointerToTractionverts,            // Traction BC arrays
+	   pointerToTractionvals,
+	   pointerToGauss2d,
+	   pointerToSh2d,
+	   pointerToListArrayElementTypeInfo2d,
+	   pointerToListArrayPropertyList,    // Material property arrays
+	   pointerToMaterialModelInfo,        // 60
+	   pointerToGauss,                    // Element type arrays
+	   pointerToSh,
+	   pointerToShj,
+	   pointerToListArrayElementTypeInfo,
+	   pointerToHistry,                   // Time information
+	   pointerToListArrayRtimdat,
+	   pointerToListArrayNtimdat,
+	   pointerToListArrayNvisdat,
+	   pointerToMaxstp,
+	   pointerToDelt,                     // 70
+	   pointerToAlfa,
+	   pointerToMaxit,
+	   pointerToNtdinit,
+	   pointerToLgdef,
+	   pointerToUtol,
+	   pointerToFtol,
+	   pointerToEtol,
+	   pointerToItmax,
+	   pointerToListArrayRgiter,          // Iterative solution information
+	   pointerToSkew,                     // 80: Skew rotation information
+	   pointerToIprint,                   // Input/output information
+	   pointerToListArrayNcodat,
+	   pointerToListArrayNunits,
+	   pointerToListArrayNprint,
+	   pointerToIstatout,
+	   pointerToNstatout,
+	   asciiOutputFile,                   // Output file names
+	   plotOutputFile,
+	   ucdOutputRoot,
+	   &viscousStage,                     // 90: PETSC logging
+	   &iterateEvent,
+                &ntot,
+                &ltim,
+                &indexx,
+                &jcyc,
+                &i,
+                &j,
+                &skc,
+                &nfirst,
+                &nstep,
+                &time,
+                &deltp,
+                &lgdefp,
+                gtol,
+	   &errorcode,                        // Error codes
+	   errorstring,
+	   strlen(asciiOutputFile),           // String lengths
+	   strlen(plotOutputFile),
+	   strlen(ucdOutputRoot),
+	   sizeof(errorstring));
+
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+// Setup the time-dependent solution.
+
+char pypylith3d_viscos_setup__doc__[] = "";
+char pypylith3d_viscos_setup__name__[] = "viscos_setup";
+
+PyObject * pypylith3d_viscos_setup(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToListArrayNprint;
+  PyObject* pyPointerToListArrayNunits;
+  char* asciiOutputFile;                      // Output file names
+  char* plotOutputFile;
+  int viscousStage;
+
+  int ok = PyArg_ParseTuple(args, "OOssi:viscos_setup",
+			    &pyPointerToListArrayNprint,
+			    &pyPointerToListArrayNunits,
+			    &asciiOutputFile,                  // Output file names
+                &plotOutputFile,
+                &viscousStage);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int  errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int *pointerToListArrayNprint = (int *) PyCObject_AsVoidPtr(pyPointerToListArrayNprint);
+  int *pointerToListArrayNunits = (int *) PyCObject_AsVoidPtr(pyPointerToListArrayNunits);
+
+  viscos_setup_f(pointerToListArrayNprint,
+                 pointerToListArrayNunits,
+                 asciiOutputFile,                   // Output file names
+                 plotOutputFile,
+                 &viscousStage,                     // PETSC logging
+                 &errorcode,                        // Error codes
+                 errorstring,
+                 strlen(asciiOutputFile),           // String lengths
+                 strlen(plotOutputFile),
+                 sizeof(errorstring));
+
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "asciiOutputFile:" << asciiOutputFile
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+// Cleanup the time-dependent solution.
+
+char pypylith3d_viscos_cleanup__doc__[] = "";
+char pypylith3d_viscos_cleanup__name__[] = "viscos_cleanup";
+
+PyObject * pypylith3d_viscos_cleanup(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToListArrayNtimdat;
+  PyObject* pyPointerToListArrayNprint;
+  PyObject* pyPointerToListArrayNunits;
+
+  int ok = PyArg_ParseTuple(args, "OOO:viscos_cleanup",&pyPointerToListArrayNtimdat, &pyPointerToListArrayNprint, &pyPointerToListArrayNunits);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int  errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int *pointerToListArrayNtimdat = (int *) PyCObject_AsVoidPtr(pyPointerToListArrayNtimdat);
+  int *pointerToListArrayNprint = (int *) PyCObject_AsVoidPtr(pyPointerToListArrayNprint);
+  int *pointerToListArrayNunits  = (int *) PyCObject_AsVoidPtr(pyPointerToListArrayNunits);
+
+  viscos_cleanup_f(pointerToListArrayNtimdat,
+                   pointerToListArrayNprint,
+                   pointerToListArrayNunits,
+                   &errorcode,                        // Error codes
+                   errorstring,
+                   sizeof(errorstring));
+
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+
+// Write boundary conditions
+
+char pypylith3d_write_bc__doc__[] = "";
+char pypylith3d_write_bc__name__[] = "write_bc";
+
+PyObject * pypylith3d_write_bc(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToBond;
+  PyObject* pyPointerToIbond;
+  int numberNodes;
+  int f77AsciiOutput;
+  int asciiOutputInt;
+  char* asciiOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOiiis:write_bc",
+			    &pyPointerToBond,
+			    &pyPointerToIbond,
+			    &numberNodes,
+			    &f77AsciiOutput,
+			    &asciiOutputInt,
+			    &asciiOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  double* pointerToBond = (double*) PyCObject_AsVoidPtr(pyPointerToBond);
+  int* pointerToIbond = (int*) PyCObject_AsVoidPtr(pyPointerToIbond);
+
+  write_bc_f(pointerToBond,
+	     pointerToIbond,
+	     &numberNodes,
+	     &f77AsciiOutput,
+	     &asciiOutputInt,
+	     asciiOutputFile,
+	     &errorcode,
+	     errorstring,
+	     strlen(asciiOutputFile),
+	     sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberNodes:" << numberNodes
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write connectivities
+
+char pypylith3d_write_connect__doc__[] = "";
+char pypylith3d_write_connect__name__[] = "write_connect";
+
+PyObject * pypylith3d_write_connect(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToIens;
+  PyObject* pyPointerToIvfamily;
+  PyObject* pyPointerToIndxiel;
+  int numberVolumeElementNodes;
+  int numberVolumeElementGaussPoints;
+  int numberVolumeElements;
+  int volumeElementType;
+  int numberVolumeElementFamilies;
+  int f77AsciiOutput;
+  int f77PlotOutput;
+  int asciiOutputInt;
+  int plotOutputInt;
+  char* asciiOutputFile;
+  char* plotOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOOiiiiiiiiiss:write_connect",
+                            &pyPointerToIens,
+                            &pyPointerToIvfamily,
+                            &pyPointerToIndxiel,
+                            &numberVolumeElementNodes,
+                            &numberVolumeElementGaussPoints,
+                            &numberVolumeElements,
+                            &volumeElementType,
+                            &numberVolumeElementFamilies,
+                            &f77AsciiOutput,
+                            &f77PlotOutput,
+                            &asciiOutputInt,
+                            &plotOutputInt,
+                            &asciiOutputFile,
+                            &plotOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int* pointerToIens = (int*) PyCObject_AsVoidPtr(pyPointerToIens);
+  int* pointerToIvfamily = (int*) PyCObject_AsVoidPtr(pyPointerToIvfamily);
+  int* pointerToIndxiel = (int*) PyCObject_AsVoidPtr(pyPointerToIndxiel);
+
+  write_connect_f(pointerToIens,
+		  pointerToIvfamily,
+		  pointerToIndxiel,
+		  &numberVolumeElementNodes,
+		  &numberVolumeElementGaussPoints,
+		  &numberVolumeElements,
+		  &volumeElementType,
+		  &numberVolumeElementFamilies,
+		  &f77AsciiOutput,
+		  &f77PlotOutput,
+		  &asciiOutputInt,
+		  &plotOutputInt,
+		  asciiOutputFile,
+		  plotOutputFile,
+		  &errorcode,
+		  errorstring,
+		  strlen(asciiOutputFile),
+		  strlen(plotOutputFile),
+		  sizeof(errorstring));
+
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberVolumeElements:" << numberVolumeElements
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write coordinates
+
+char pypylith3d_write_coords__doc__[] = "";
+char pypylith3d_write_coords__name__[] = "write_coords";
+
+PyObject * pypylith3d_write_coords(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToX;
+  int numberNodes;
+  int f77AsciiOutput;
+  int f77PlotOutput;
+  int asciiOutputInt;
+  int plotOutputInt;
+  char* asciiOutputFile;
+  char* plotOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "Oiiiiiss:write_coords",
+			    &pyPointerToX,
+			    &numberNodes,
+			    &f77AsciiOutput,
+			    &f77PlotOutput,
+			    &asciiOutputInt,
+			    &plotOutputInt,
+			    &asciiOutputFile,
+			    &plotOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  double* pointerToX = (double*) PyCObject_AsVoidPtr(pyPointerToX);
+
+  write_coords_f(pointerToX,
+		 &numberNodes,
+		 &f77AsciiOutput,
+		 &f77PlotOutput,
+		 &asciiOutputInt,
+		 &plotOutputInt,
+		 asciiOutputFile,
+		 plotOutputFile,
+		 &errorcode,
+		 errorstring,
+		 strlen(asciiOutputFile),
+		 strlen(plotOutputFile),
+		 sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberNodes:" << numberNodes
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write differential forces
+
+char pypylith3d_write_diff__doc__[] = "";
+char pypylith3d_write_diff__name__[] = "write_diff";
+
+PyObject * pypylith3d_write_diff(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToDiforc;
+  PyObject* pyPointerToNslip;
+  PyObject* pyPointerToIdhist;
+  int numberSlipperyNodeEntries;
+  int numberDifferentialForceEntries;
+  int numberNodes;
+  int f77AsciiOutput;
+  int asciiOutputInt;
+  char* asciiOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOOiiiiis:write_diff",
+			    &pyPointerToDiforc,
+			    &pyPointerToNslip,
+			    &pyPointerToIdhist,
+			    &numberSlipperyNodeEntries,
+			    &numberDifferentialForceEntries,
+			    &numberNodes,
+			    &f77AsciiOutput,
+			    &asciiOutputInt,
+			    &asciiOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  double* pointerToDiforc = (double*) PyCObject_AsVoidPtr(pyPointerToDiforc);
+  int* pointerToNslip = (int*) PyCObject_AsVoidPtr(pyPointerToNslip);
+  int* pointerToIdhist = (int*) PyCObject_AsVoidPtr(pyPointerToIdhist);
+
+  write_diff_f(pointerToDiforc,
+	       pointerToNslip,
+	       pointerToIdhist,
+	       &numberSlipperyNodeEntries,
+	       &numberDifferentialForceEntries,
+	       &numberNodes,
+	       &f77AsciiOutput,
+	       &asciiOutputInt,
+	       asciiOutputFile,
+	       &errorcode,
+	       errorstring,
+	       strlen(asciiOutputFile),
+	       sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberDifferentialForceEntries:" << numberDifferentialForceEntries
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+// Write out element info
+
+char pypylith3d_write_element_info__doc__[] = "";
+char pypylith3d_write_element_info__name__[] = "write_element_info";
+
+PyObject * pypylith3d_write_element_info(PyObject *, PyObject *args)
+{
+  int numberVolumeElements;
+  int numberVolumeElementNodes;
+  int numberVolumeElementGaussPoints;
+  int volumeElementType;
+  int quadratureOrderInt;
+  int prestressAutoComputeInt;
+  int prestressAutoChangeElasticPropsInt;
+  double prestressAutoComputePoisson;
+  double prestressAutoComputeYoungs;
+  int f77AsciiOutput;
+  int asciiOutputInt;
+  char* asciiOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "iiiiiiiddiis:write_element_info",
+			    &numberVolumeElements,
+			    &numberVolumeElementNodes,
+			    &numberVolumeElementGaussPoints,
+			    &volumeElementType,
+			    &quadratureOrderInt,
+			    &prestressAutoComputeInt,
+			    &prestressAutoChangeElasticPropsInt,
+			    &prestressAutoComputePoisson,
+			    &prestressAutoComputeYoungs,
+			    &f77AsciiOutput,
+			    &asciiOutputInt,
+			    &asciiOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  write_element_info_f(&numberVolumeElements,
+		       &numberVolumeElementNodes,
+		       &numberVolumeElementGaussPoints,
+		       &volumeElementType,
+		       &quadratureOrderInt,
+		       &prestressAutoComputeInt,
+		       &prestressAutoChangeElasticPropsInt,
+		       &prestressAutoComputePoisson,
+		       &prestressAutoComputeYoungs,
+		       &f77AsciiOutput,
+		       &asciiOutputInt,
+		       asciiOutputFile,strlen(asciiOutputFile));
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberVolumeElements:" << numberVolumeElements
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write time steps at which full output is desired
+
+char pypylith3d_write_fuldat__doc__[] = "";
+char pypylith3d_write_fuldat__name__[] = "write_fuldat";
+
+PyObject * pypylith3d_write_fuldat(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToIprint;
+  int numberFullOutputs;
+  int analysisTypeInt;
+  int numberCycles;
+  int totalNumberTimeSteps;
+  int f77AsciiOutput;
+  int f77PlotOutput;
+  int asciiOutputInt;
+  int plotOutputInt;
+  char* asciiOutputFile;
+  char* plotOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "Oiiiiiiiiss:write_fuldat",
+			    &pyPointerToIprint,
+			    &numberFullOutputs,
+			    &analysisTypeInt,
+			    &numberCycles,
+			    &totalNumberTimeSteps,
+			    &f77AsciiOutput,
+			    &f77PlotOutput,
+			    &asciiOutputInt,
+			    &plotOutputInt,
+			    &asciiOutputFile,
+			    &plotOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int* pointerToIprint = (int*) PyCObject_AsVoidPtr(pyPointerToIprint);
+
+  write_fuldat_f(pointerToIprint,
+		 &numberFullOutputs,
+		 &analysisTypeInt,
+		 &numberCycles,
+		 &totalNumberTimeSteps,
+		 &f77AsciiOutput,
+		 &f77PlotOutput,
+		 &asciiOutputInt,
+		 &plotOutputInt,
+		 asciiOutputFile,
+		 plotOutputFile,
+		 &errorcode,
+		 errorstring,
+		 strlen(asciiOutputFile),
+		 strlen(plotOutputFile),
+		 sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberFullOutputs:" << numberFullOutputs
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write out global info
+
+char pypylith3d_write_global_info__doc__[] = "";
+char pypylith3d_write_global_info__name__[] = "write_global_info";
+
+PyObject * pypylith3d_write_global_info(PyObject *, PyObject *args)
+{
+  char* title;
+  int asciiOutputInt;
+  int plotOutputInt;
+  int numberNodes;
+  int analysisTypeInt;
+  int debuggingOutputInt;
+  int f77AsciiOutput;
+  int f77PlotOutput;
+  char* asciiOutputFile;
+  char* plotOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "siiiiiiiss:write_global_info",
+			    &title,
+			    &asciiOutputInt,
+			    &plotOutputInt,
+			    &numberNodes,
+			    &analysisTypeInt,
+			    &debuggingOutputInt,
+			    &f77AsciiOutput,
+			    &f77PlotOutput,
+			    &asciiOutputFile,
+			    &plotOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  write_global_info_f(title,
+		      &asciiOutputInt,
+		      &plotOutputInt,
+		      &numberNodes,
+		      &analysisTypeInt,
+		      &debuggingOutputInt,
+		      &f77AsciiOutput,
+		      &f77PlotOutput,
+		      asciiOutputFile,
+		      plotOutputFile,
+		      strlen(title),
+		      strlen(asciiOutputFile),
+		      strlen(plotOutputFile));
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "debuggingOutputInt:" << debuggingOutputInt
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write load histories
+
+char pypylith3d_write_hist__doc__[] = "";
+char pypylith3d_write_hist__name__[] = "write_hist";
+
+PyObject * pypylith3d_write_hist(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToHistry;
+  PyObject* pyPointerToTimes;
+  int numberLoadHistories;
+  int totalNumberTimeSteps;
+  int f77AsciiOutput;
+  int asciiOutputInt;
+  char* asciiOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOiiiis:write_hist",
+			    &pyPointerToHistry,
+			    &pyPointerToTimes,
+			    &numberLoadHistories,
+			    &totalNumberTimeSteps,
+			    &f77AsciiOutput,
+			    &asciiOutputInt,
+			    &asciiOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  double* pointerToHistry = (double*) PyCObject_AsVoidPtr(pyPointerToHistry);
+  double* pointerToTimes = (double*) PyCObject_AsVoidPtr(pyPointerToTimes);
+
+  write_hist_f(pointerToHistry,
+	       pointerToTimes,
+	       &numberLoadHistories,
+	       &totalNumberTimeSteps,
+	       &f77AsciiOutput,
+	       &asciiOutputInt,
+	       asciiOutputFile,
+	       &errorcode,
+	       errorstring,
+	       strlen(asciiOutputFile),
+	       sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberLoadHistories:" << numberLoadHistories
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write out material property info
+
+char pypylith3d_write_props__doc__[] = "";
+char pypylith3d_write_props__name__[] = "write_props";
+
+PyObject * pypylith3d_write_props(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToListArrayPropertyList;
+  PyObject* pyPointerToListArrayGrav;
+  PyObject* pyPointerToIvfamily;
+  PyObject* pyPointerToMaterialModelInfo;
+  int numberVolumeElementFamilies;
+  int propertySize;
+  int asciiOutputInt;
+  int plotOutputInt;
+  int f77AsciiOutput;
+  int f77PlotOutput;
+  char* asciiOutputFile;
+  char* plotOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOOOiiiiiiss:write_props",
+			    &pyPointerToListArrayPropertyList,
+			    &pyPointerToListArrayGrav,
+			    &pyPointerToIvfamily,
+			    &pyPointerToMaterialModelInfo,
+			    &numberVolumeElementFamilies,
+			    &propertySize,
+			    &asciiOutputInt,
+			    &plotOutputInt,
+			    &f77AsciiOutput,
+			    &f77PlotOutput,
+			    &asciiOutputFile,
+			    &plotOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  double* pointerToListArrayPropertyList = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayPropertyList);
+  double* pointerToListArrayGrav = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayGrav);
+  int* pointerToIvfamily = (int*) PyCObject_AsVoidPtr(pyPointerToIvfamily);
+  int* pointerToMaterialModelInfo = (int*) PyCObject_AsVoidPtr(pyPointerToMaterialModelInfo);
+
+  write_props_f(pointerToListArrayPropertyList,
+		pointerToListArrayGrav,
+		pointerToIvfamily,
+		pointerToMaterialModelInfo,
+		&numberVolumeElementFamilies,
+		&propertySize,
+		&asciiOutputInt,
+		&plotOutputInt,
+		&f77AsciiOutput,
+		&f77PlotOutput,
+		asciiOutputFile,
+		plotOutputFile,
+		&errorcode,
+		errorstring,
+		strlen(asciiOutputFile),
+		strlen(plotOutputFile),
+		sizeof(errorstring));
+
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberVolumeElementFamilies:" << numberVolumeElementFamilies
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write local coordinate rotations
+
+char pypylith3d_write_skew__doc__[] = "";
+char pypylith3d_write_skew__name__[] = "write_skew";
+
+PyObject * pypylith3d_write_skew(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToSkew;
+  int numberRotationEntries;
+  int autoRotateSlipperyNodesInt;
+  int numberNodes;
+  int f77AsciiOutput;
+  int asciiOutputInt;
+  char* asciiOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "Oiiiiis:write_skew",
+			    &pyPointerToSkew,
+			    &numberRotationEntries,
+			    &autoRotateSlipperyNodesInt,
+			    &numberNodes,
+			    &f77AsciiOutput,
+			    &asciiOutputInt,
+			    &asciiOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  double* pointerToSkew = (double*) PyCObject_AsVoidPtr(pyPointerToSkew);
+
+  write_skew_f(pointerToSkew,
+	       &numberRotationEntries,
+	       &autoRotateSlipperyNodesInt,
+	       &numberNodes,
+	       &f77AsciiOutput,
+	       &asciiOutputInt,
+	       asciiOutputFile,
+	       &errorcode,
+	       errorstring,
+	       strlen(asciiOutputFile),
+	       sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberRotationEntries:" << numberRotationEntries
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write slippery node entries
+
+char pypylith3d_write_slip__doc__[] = "";
+char pypylith3d_write_slip__name__[] = "write_slip";
+
+PyObject * pypylith3d_write_slip(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToNslip;
+  int numberSlipperyNodeEntries;
+  int totalNumberSlipperyNodes;
+  int f77AsciiOutput;
+  int f77PlotOutput;
+  int asciiOutputInt;
+  int plotOutputInt;
+  char* asciiOutputFile;
+  char* plotOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "Oiiiiiiss:write_slip",
+			    &pyPointerToNslip,
+			    &numberSlipperyNodeEntries,
+			    &totalNumberSlipperyNodes,
+			    &f77AsciiOutput,
+			    &f77PlotOutput,
+			    &asciiOutputInt,
+			    &plotOutputInt,
+			    &asciiOutputFile,
+			    &plotOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int* pointerToNslip = (int*) PyCObject_AsVoidPtr(pyPointerToNslip);
+
+  write_slip_f(pointerToNslip,
+	       &numberSlipperyNodeEntries,
+	       &totalNumberSlipperyNodes,
+	       &f77AsciiOutput,
+	       &f77PlotOutput,
+	       &asciiOutputInt,
+	       &plotOutputInt,
+	       asciiOutputFile,
+	       plotOutputFile,
+	       &errorcode,
+	       errorstring,
+	       strlen(asciiOutputFile),
+	       strlen(plotOutputFile),
+	       sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "totalNumberSlipperyNodes:" << totalNumberSlipperyNodes
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write out sparse matrix info
+
+char pypylith3d_write_sparse_info__doc__[] = "";
+char pypylith3d_write_sparse_info__name__[] = "write_sparse_info";
+
+PyObject * pypylith3d_write_sparse_info(PyObject *, PyObject *args)
+{
+  int numberGlobalEquations;
+  int stiffnessMatrixSize;
+  int minimumNonzeroTermsPerRow;
+  int maximumNonzeroTermsPerRow;
+  double averageNonzeroTermsPerRow;
+  int asciiOutputInt;
+  int f77AsciiOutput;
+  char* asciiOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "iiiidiis:write_sparse_info",
+			    &numberGlobalEquations,
+			    &stiffnessMatrixSize,
+			    &minimumNonzeroTermsPerRow,
+			    &maximumNonzeroTermsPerRow,
+			    &averageNonzeroTermsPerRow,
+			    &asciiOutputInt,
+			    &f77AsciiOutput,
+			    &asciiOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  write_sparse_info_f(&numberGlobalEquations,
+		      &stiffnessMatrixSize,
+		      &minimumNonzeroTermsPerRow,
+		      &maximumNonzeroTermsPerRow,
+		      &averageNonzeroTermsPerRow,
+		      &asciiOutputInt,
+		      &f77AsciiOutput,
+		      asciiOutputFile,strlen(asciiOutputFile));
+		  
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "minimumNonzeroTermsPerRow:" << minimumNonzeroTermsPerRow
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write split node entries
+
+char pypylith3d_write_split__doc__[] = "";
+char pypylith3d_write_split__name__[] = "write_split";
+
+PyObject * pypylith3d_write_split(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToFault;
+  PyObject* pyPointerToNfault;
+  int numberSplitNodeEntries;
+  int f77AsciiOutput;
+  int f77PlotOutput;
+  int asciiOutputInt;
+  int plotOutputInt;
+  char* asciiOutputFile;
+  char* plotOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOiiiiiss:write_split",
+			    &pyPointerToFault,
+			    &pyPointerToNfault,
+			    &numberSplitNodeEntries,
+			    &f77AsciiOutput,
+			    &f77PlotOutput,
+			    &asciiOutputInt,
+			    &plotOutputInt,
+			    &asciiOutputFile,
+			    &plotOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  double* pointerToFault = (double*) PyCObject_AsVoidPtr(pyPointerToFault);
+  int* pointerToNfault = (int*) PyCObject_AsVoidPtr(pyPointerToNfault);
+
+  write_split_f(pointerToFault,
+		pointerToNfault,
+		&numberSplitNodeEntries,
+		&f77AsciiOutput,
+		&f77PlotOutput,
+		&asciiOutputInt,
+		&plotOutputInt,
+		asciiOutputFile,
+		plotOutputFile,
+		&errorcode,
+		errorstring,
+		strlen(asciiOutputFile),
+		strlen(plotOutputFile),
+		sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberSplitNodeEntries:" << numberSplitNodeEntries
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write split node entries for plot output
+
+char pypylith3d_write_split_plot__doc__[] = "";
+char pypylith3d_write_split_plot__name__[] = "write_split_plot";
+
+PyObject * pypylith3d_write_split_plot(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToIdftn;
+  int totalNumberSplitNodes;
+  int f77PlotOutput;
+  int plotOutputInt;
+  char* plotOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "Oiiis:write_split_plot",
+			    &pyPointerToIdftn,
+			    &totalNumberSplitNodes,
+			    &f77PlotOutput,
+			    &plotOutputInt,
+			    &plotOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int* pointerToIdftn = (int*) PyCObject_AsVoidPtr(pyPointerToIdftn);
+
+  write_split_plot_f(pointerToIdftn,
+		     &totalNumberSplitNodes,
+		     &f77PlotOutput,
+		     &plotOutputInt,
+		     plotOutputFile,
+		     strlen(plotOutputFile));
+    
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "totalNumberSplitNodes:" << totalNumberSplitNodes
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write state output information
+
+char pypylith3d_write_stateout__doc__[] = "";
+char pypylith3d_write_stateout__name__[] = "write_stateout";
+
+PyObject * pypylith3d_write_stateout(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToIstatout;
+  PyObject* pyPointerToNstatout;
+  int f77AsciiOutput;
+  int f77PlotOutput;
+  int asciiOutputInt;
+  int plotOutputInt;
+  char* asciiOutputFile;
+  char* plotOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOiiiiss:write_stateout",
+			    &pyPointerToIstatout,
+			    &pyPointerToNstatout,
+			    &f77AsciiOutput,
+			    &f77PlotOutput,
+			    &asciiOutputInt,
+			    &plotOutputInt,
+			    &asciiOutputFile,
+			    &plotOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int* pointerToIstatout = (int*) PyCObject_AsVoidPtr(pyPointerToIstatout);
+  int* pointerToNstatout = (int*) PyCObject_AsVoidPtr(pyPointerToNstatout);
+
+  write_stateout_f(pointerToIstatout,
+		   pointerToNstatout,
+		   &f77AsciiOutput,
+		   &f77PlotOutput,
+		   &asciiOutputInt,
+		   &plotOutputInt,
+		   asciiOutputFile,
+		   plotOutputFile,
+		   &errorcode,
+		   errorstring,
+		   strlen(asciiOutputFile),
+		   strlen(plotOutputFile),
+		   sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "pointerToIstatout:" << pointerToIstatout
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write out stress integration parameters
+
+char pypylith3d_write_strscomp__doc__[] = "";
+char pypylith3d_write_strscomp__name__[] = "write_strscomp";
+
+PyObject * pypylith3d_write_strscomp(PyObject *, PyObject *args)
+{
+  double stressTolerance;
+  double minimumStrainPerturbation;
+  double initialStrainPerturbation;
+  int f77AsciiOutput;
+  int asciiOutputInt;
+  char* asciiOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "dddiis:write_strscomp",
+			    &stressTolerance,
+			    &minimumStrainPerturbation,
+			    &initialStrainPerturbation,
+			    &f77AsciiOutput,
+			    &asciiOutputInt,
+			    &asciiOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  write_strscomp_f(&stressTolerance,
+		   &minimumStrainPerturbation,
+		   &initialStrainPerturbation,
+		   &f77AsciiOutput,
+		   &asciiOutputInt,
+		   asciiOutputFile,strlen(asciiOutputFile));
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "initialStrainPerturbation:" << initialStrainPerturbation
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write out subiteration convergence parameters
+
+char pypylith3d_write_subiter__doc__[] = "";
+char pypylith3d_write_subiter__name__[] = "write_subiter";
+
+PyObject * pypylith3d_write_subiter(PyObject *, PyObject *args)
+{
+  int usePreviousDisplacementFlag;
+  int f77AsciiOutput;
+  int asciiOutputInt;
+  char* asciiOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "iiis:write_subiter",
+			    &usePreviousDisplacementFlag,
+			    &f77AsciiOutput,
+			    &asciiOutputInt,
+			    &asciiOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+
+  write_subiter_f(&usePreviousDisplacementFlag,
+		  &f77AsciiOutput,
+		  &asciiOutputInt,
+		  asciiOutputFile,strlen(asciiOutputFile));
+		  
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "usePreviousDisplacementFlag:" << usePreviousDisplacementFlag
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write time step data
+
+char pypylith3d_write_timdat__doc__[] = "";
+char pypylith3d_write_timdat__name__[] = "write_timdat";
+
+PyObject * pypylith3d_write_timdat(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToDelt;
+  PyObject* pyPointerToAlfa;
+  PyObject* pyPointerToUtol;
+  PyObject* pyPointerToFtol;
+  PyObject* pyPointerToEtol;
+  PyObject* pyPointerToTimes;
+  PyObject* pyPointerToMaxstp;
+  PyObject* pyPointerToMaxit;
+  PyObject* pyPointerToNtdinit;
+  PyObject* pyPointerToLgdef;
+  PyObject* pyPointerToItmax;
+  int numberTimeStepGroups;
+  int totalNumberTimeSteps;
+  int f77AsciiOutput;
+  int asciiOutputInt;
+  char* asciiOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOOOOOOOOOOiiiis:write_timdat",
+			    &pyPointerToDelt,
+			    &pyPointerToAlfa,
+			    &pyPointerToUtol,
+			    &pyPointerToFtol,
+			    &pyPointerToEtol,
+			    &pyPointerToTimes,
+			    &pyPointerToMaxstp,
+			    &pyPointerToMaxit,
+			    &pyPointerToNtdinit,
+			    &pyPointerToLgdef,
+			    &pyPointerToItmax,
+			    &numberTimeStepGroups,
+			    &totalNumberTimeSteps,
+			    &f77AsciiOutput,
+			    &asciiOutputInt,
+			    &asciiOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  double* pointerToDelt = (double*) PyCObject_AsVoidPtr(pyPointerToDelt);
+  double* pointerToAlfa = (double*) PyCObject_AsVoidPtr(pyPointerToAlfa);
+  double* pointerToUtol = (double*) PyCObject_AsVoidPtr(pyPointerToUtol);
+  double* pointerToFtol = (double*) PyCObject_AsVoidPtr(pyPointerToFtol);
+  double* pointerToEtol = (double*) PyCObject_AsVoidPtr(pyPointerToEtol);
+  double* pointerToTimes = (double*) PyCObject_AsVoidPtr(pyPointerToTimes);
+  int* pointerToMaxstp = (int*) PyCObject_AsVoidPtr(pyPointerToMaxstp);
+  int* pointerToMaxit = (int*) PyCObject_AsVoidPtr(pyPointerToMaxit);
+  int* pointerToNtdinit = (int*) PyCObject_AsVoidPtr(pyPointerToNtdinit);
+  int* pointerToLgdef = (int*) PyCObject_AsVoidPtr(pyPointerToLgdef);
+  int* pointerToItmax = (int*) PyCObject_AsVoidPtr(pyPointerToItmax);
+
+  write_timdat_f(pointerToDelt,
+		 pointerToAlfa,
+		 pointerToUtol,
+		 pointerToFtol,
+		 pointerToEtol,
+		 pointerToTimes,
+		 pointerToMaxstp,
+		 pointerToMaxit,
+		 pointerToNtdinit,
+		 pointerToLgdef,
+		 pointerToItmax,
+		 &numberTimeStepGroups,
+		 &totalNumberTimeSteps,
+		 &f77AsciiOutput,
+		 &asciiOutputInt,
+		 asciiOutputFile,
+		 &errorcode,
+		 errorstring,
+		 strlen(asciiOutputFile),
+		 sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "totalNumberTimeSteps:" << totalNumberTimeSteps
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write traction BC
+
+char pypylith3d_write_tractions__doc__[] = "";
+char pypylith3d_write_tractions__name__[] = "write_tractions";
+
+PyObject * pypylith3d_write_tractions(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToTractionverts;
+  PyObject* pyPointerToTractionvals;
+  int numberTractionBc;
+  int numberSurfaceElementNodes;
+  int f77AsciiOutput;
+  int asciiOutputInt;
+  char* asciiOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOiiiis:write_tractions",
+			    &pyPointerToTractionverts,
+			    &pyPointerToTractionvals,
+			    &numberTractionBc,
+			    &numberSurfaceElementNodes,
+			    &f77AsciiOutput,
+			    &asciiOutputInt,
+			    &asciiOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int* pointerToTractionverts = (int*) PyCObject_AsVoidPtr(pyPointerToTractionverts);
+  double* pointerToTractionvals = (double*) PyCObject_AsVoidPtr(pyPointerToTractionvals);
+
+  write_tractions_f(pointerToTractionverts,
+		    pointerToTractionvals,
+		    &numberTractionBc,
+		    &numberSurfaceElementNodes,
+		    &f77AsciiOutput,
+		    &asciiOutputInt,
+		    asciiOutputFile,
+		    &errorcode,
+		    errorstring,
+		    strlen(asciiOutputFile),
+		    sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberTractionBc:" << numberTractionBc
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write mesh info to UCD file
+
+char pypylith3d_write_ucd_mesh__doc__[] = "";
+char pypylith3d_write_ucd_mesh__name__[] = "write_ucd_mesh";
+
+PyObject * pypylith3d_write_ucd_mesh(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToX;
+  int numberNodes;
+  PyObject* pyPointerToIens;
+  PyObject* pyPointerToIvfamily;
+  int numberVolumeElements;
+  int numberVolumeElementFamilies;
+  PyObject* pyPointerToSh;
+  int numberVolumeElementNodes;
+  int numberVolumeElementGaussPoints;
+  int volumeElementType;
+  PyObject* pyPointerToIstatout;
+  PyObject* pyPointerToNstatout;
+  int f77UcdOutput;
+  int ucdOutputInt;
+  char* ucdOutputRoot;
+
+  int ok = PyArg_ParseTuple(args, "OiOOiiOiiiOOiis:write_ucd_mesh",
+			    &pyPointerToX,
+			    &numberNodes,
+			    &pyPointerToIens,
+			    &pyPointerToIvfamily,
+			    &numberVolumeElements,
+			    &numberVolumeElementFamilies,
+			    &pyPointerToSh,
+			    &numberVolumeElementNodes,
+			    &numberVolumeElementGaussPoints,
+			    &volumeElementType,
+			    &pyPointerToIstatout,
+			    &pyPointerToNstatout,
+			    &f77UcdOutput,
+			    &ucdOutputInt,
+			    &ucdOutputRoot);
+
+  if (!ok) {
+    return 0;
+  }
+
+  double* pointerToX = (double*) PyCObject_AsVoidPtr(pyPointerToX);
+  int* pointerToIens = (int*) PyCObject_AsVoidPtr(pyPointerToIens);
+  int* pointerToIvfamily = (int*) PyCObject_AsVoidPtr(pyPointerToIvfamily);
+  double* pointerToSh = (double*) PyCObject_AsVoidPtr(pyPointerToSh);
+  int* pointerToIstatout = (int*) PyCObject_AsVoidPtr(pyPointerToIstatout);
+  int* pointerToNstatout = (int*) PyCObject_AsVoidPtr(pyPointerToNstatout);
+
+  write_ucd_mesh_f(pointerToX,
+		   &numberNodes,
+		   pointerToIens,
+		   pointerToIvfamily,
+		   &numberVolumeElements,
+		   &numberVolumeElementFamilies,
+		   pointerToSh,
+		   &numberVolumeElementNodes,
+		   &numberVolumeElementGaussPoints,
+		   &volumeElementType,
+		   pointerToIstatout,
+		   pointerToNstatout,
+		   &f77UcdOutput,
+		   &ucdOutputInt,
+		   ucdOutputRoot,strlen(ucdOutputRoot));
+		  
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberVolumeElements:" << numberVolumeElements
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write winkler BC
+
+char pypylith3d_write_wink__doc__[] = "";
+char pypylith3d_write_wink__name__[] = "write_wink";
+
+PyObject * pypylith3d_write_wink(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToWinkdef;
+  PyObject* pyPointerToIwinkdef;
+  PyObject* pyPointerToIwinkid;
+  int numberWinklerEntries;
+  int f77AsciiOutput;
+  int asciiOutputInt;
+  char* asciiOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOOiiis:write_wink",
+			    &pyPointerToWinkdef,
+			    &pyPointerToIwinkdef,
+			    &pyPointerToIwinkid,
+			    &numberWinklerEntries,
+			    &f77AsciiOutput,
+			    &asciiOutputInt,
+			    &asciiOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  double* pointerToWinkdef = (double*) PyCObject_AsVoidPtr(pyPointerToWinkdef);
+  int* pointerToIwinkdef = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkdef);
+  int* pointerToIwinkid = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkid);
+
+  write_wink_f(pointerToWinkdef,
+	       pointerToIwinkdef,
+	       pointerToIwinkid,
+	       &numberWinklerEntries,
+	       &f77AsciiOutput,
+	       &asciiOutputInt,
+	       asciiOutputFile,
+	       &errorcode,
+	       errorstring,
+	       strlen(asciiOutputFile),
+	       sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberWinklerEntries:" << numberWinklerEntries
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Write slippery winkler BC
+
+char pypylith3d_write_winkx__doc__[] = "";
+char pypylith3d_write_winkx__name__[] = "write_winkx";
+
+PyObject * pypylith3d_write_winkx(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToWinkxdef;
+  PyObject* pyPointerToIwinkxdef;
+  PyObject* pyPointerToIwinkxid;
+  int numberSlipperyWinklerEntries;
+  int f77AsciiOutput;
+  int asciiOutputInt;
+  char* asciiOutputFile;
+
+  int ok = PyArg_ParseTuple(args, "OOOiiis:write_winkx",
+			    &pyPointerToWinkxdef,
+			    &pyPointerToIwinkxdef,
+			    &pyPointerToIwinkxid,
+			    &numberSlipperyWinklerEntries,
+			    &f77AsciiOutput,
+			    &asciiOutputInt,
+			    &asciiOutputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  double* pointerToWinkxdef = (double*) PyCObject_AsVoidPtr(pyPointerToWinkxdef);
+  int* pointerToIwinkxdef = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkxdef);
+  int* pointerToIwinkxid = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkxid);
+
+  write_winkx_f(pointerToWinkxdef,
+		pointerToIwinkxdef,
+		pointerToIwinkxid,
+		&numberSlipperyWinklerEntries,
+		&f77AsciiOutput,
+		&asciiOutputInt,
+		asciiOutputFile,
+		&errorcode,
+		errorstring,
+		strlen(asciiOutputFile),
+		sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberSlipperyWinklerEntries:" << numberSlipperyWinklerEntries
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+
+// Scan boundary conditions
+
+char pypylith3d_scan_bc__doc__[] = "";
+char pypylith3d_scan_bc__name__[] = "scan_bc";
+
+PyObject * pypylith3d_scan_bc(PyObject *, PyObject *args)
+{
+  int f77FileInput;
+  char* displacementUnits;
+  char* velocityUnits;
+  char* forceUnits;
+  char* bcInputFile;
+
+  int ok = PyArg_ParseTuple(args, (char *) "issss:scan_bc",
+			    &f77FileInput,
+			    &displacementUnits,
+			    &velocityUnits,
+			    &forceUnits,
+			    &bcInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int numberBcEntries = 0;
+
+  scan_bc_f(&numberBcEntries,
+	    &f77FileInput,
+	    displacementUnits,
+	    velocityUnits,
+	    forceUnits,
+	    bcInputFile,
+	    &errorcode,
+	    errorstring,
+	    strlen(displacementUnits),
+	    strlen(velocityUnits),
+	    strlen(forceUnits),
+	    strlen(bcInputFile),
+	    sizeof(errorstring));
+
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberBcEntries:" << numberBcEntries
+    << journal::endl;
+
+  // return
+  return Py_BuildValue((char *) "i", numberBcEntries);
+}
+
+
+// Scan connectivities
+
+char pypylith3d_scan_connect__doc__[] = "";
+char pypylith3d_scan_connect__name__[] = "scan_connect";
+
+PyObject * pypylith3d_scan_connect(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToListArrayNumberElementNodesBase;
+  PyObject* pyPointerToMaterialModelInfo;
+  PyObject* pyPointerToListArrayMaterialModel;
+  PyObject* pyPointerToVolumeElementFamilyList;
+  int maxNumberVolumeElementFamilies;
+  int numberMaterials;
+  int f77FileInput;
+  char* connectivityInputFile;
+
+  int ok = PyArg_ParseTuple(args, (char *) "OOOOiiis:scan_connect",
+			    &pyPointerToListArrayNumberElementNodesBase,
+			    &pyPointerToMaterialModelInfo,
+                            &pyPointerToListArrayMaterialModel,
+			    &pyPointerToVolumeElementFamilyList,
+			    &maxNumberVolumeElementFamilies,
+			    &numberMaterials,
+			    &f77FileInput,
+			    &connectivityInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int* pointerToListArrayNumberElementNodesBase = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNumberElementNodesBase);
+  int* pointerToMaterialModelInfo = (int*) PyCObject_AsVoidPtr(pyPointerToMaterialModelInfo);
+  int* pointerToListArrayMaterialModel = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayMaterialModel);
+  int* pointerToVolumeElementFamilyList = (int*) PyCObject_AsVoidPtr(pyPointerToVolumeElementFamilyList);
+  int numberVolumeElements = 0;
+  int numberVolumeElementFamilies = 0;
+  int volumeElementType = 0;
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+
+  scan_connect_f(pointerToListArrayNumberElementNodesBase,
+		 pointerToMaterialModelInfo,
+		 pointerToListArrayMaterialModel,
+		 pointerToVolumeElementFamilyList,
+		 &maxNumberVolumeElementFamilies,
+		 &numberMaterials,
+		 &numberVolumeElements,
+		 &numberVolumeElementFamilies,
+		 &volumeElementType,
+		 &f77FileInput,
+		 connectivityInputFile,
+		 &errorcode,
+		 errorstring,
+		 strlen(connectivityInputFile),
+		 sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberVolumeElementFamilies:" << numberVolumeElementFamilies
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_BuildValue((char *) "iii", numberVolumeElements,
+		       numberVolumeElementFamilies,
+		       volumeElementType);
+}
+
+
+// Scan coordinates
+
+char pypylith3d_scan_coords__doc__[] = "";
+char pypylith3d_scan_coords__name__[] = "scan_coords";
+
+PyObject * pypylith3d_scan_coords(PyObject *, PyObject *args)
+{
+  int f77FileInput;
+  char *coordinateUnits;
+  char *coordinateInputFile;
+
+  int ok = PyArg_ParseTuple(args, (char *) "iss:scan_coords",
+			    &f77FileInput,
+			    &coordinateUnits,
+			    &coordinateInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int numberNodes = 0;
+
+  scan_coords_f(&numberNodes,
+		&f77FileInput,
+		coordinateUnits,
+		coordinateInputFile,
+		&errorcode,
+		errorstring,
+		strlen(coordinateUnits),
+		strlen(coordinateInputFile),
+		sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberNodes:" << numberNodes
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_BuildValue((char *) "i", numberNodes);
+}
+
+
+// Scan differential forces
+
+char pypylith3d_scan_diff__doc__[] = "";
+char pypylith3d_scan_diff__name__[] = "scan_diff";
+
+PyObject * pypylith3d_scan_diff(PyObject *, PyObject *args)
+{
+  int numberSlipperyNodeEntries;
+  int f77FileInput;
+  char* differentialForceInputFile;
+
+  int ok = PyArg_ParseTuple(args, (char *) "iis:scan_diff",
+			    &numberSlipperyNodeEntries,
+			    &f77FileInput,
+			    &differentialForceInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int numberDifferentialForceEntries = 0;
+
+  scan_diff_f(&numberSlipperyNodeEntries,
+	      &numberDifferentialForceEntries,
+	      &f77FileInput,
+	      differentialForceInputFile,
+	      &errorcode,
+	      errorstring,
+	      strlen(differentialForceInputFile),
+	      sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberDifferentialForceEntries:" << numberDifferentialForceEntries
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_BuildValue((char *) "i", numberDifferentialForceEntries);
+}
+
+
+// Scan time steps at which full output is desired
+
+char pypylith3d_scan_fuldat__doc__[] = "";
+char pypylith3d_scan_fuldat__name__[] = "scan_fuldat";
+
+PyObject * pypylith3d_scan_fuldat(PyObject *, PyObject *args)
+{
+  int analysisTypeInt;
+  int totalNumberTimeSteps;
+  int f77FileInput;
+  char* fullOutputInputFile;
+
+  int ok = PyArg_ParseTuple(args, (char *) "iiis:scan_fuldat",
+			    &analysisTypeInt,
+			    &totalNumberTimeSteps,
+			    &f77FileInput,
+			    &fullOutputInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int numberFullOutputs = 0;
+
+  scan_fuldat_f(&analysisTypeInt,
+		&totalNumberTimeSteps,
+		&numberFullOutputs,
+		&f77FileInput,
+		fullOutputInputFile,
+		&errorcode,
+		errorstring,
+		strlen(fullOutputInputFile),
+		sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberFullOutputs:" << numberFullOutputs
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_BuildValue((char *) "i", numberFullOutputs);
+}
+
+
+// Scan load histories
+
+char pypylith3d_scan_hist__doc__[] = "";
+char pypylith3d_scan_hist__name__[] = "scan_hist";
+
+PyObject * pypylith3d_scan_hist(PyObject *, PyObject *args)
+{
+  int f77FileInput;
+  char* loadHistoryInputFile;
+
+  int ok = PyArg_ParseTuple(args, (char *) "is:scan_hist",
+			    &f77FileInput,
+			    &loadHistoryInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int numberLoadHistories = 0;
+
+  scan_hist_f(&numberLoadHistories,
+	      &f77FileInput,
+	      loadHistoryInputFile,
+	      &errorcode,
+	      errorstring,
+	      strlen(loadHistoryInputFile),
+	      sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberLoadHistories:" << numberLoadHistories
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_BuildValue((char *) "i", numberLoadHistories);
+}
+
+
+// Scan element prestresses
+
+  // char pypylith3d_scan_prestr__doc__[] = "";
+  // char pypylith3d_scan_prestr__name__[] = "scan_prestr";
+
+  // PyObject * pypylith3d_scan_prestr(PyObject *, PyObject *args)
+  // {
+  //   int numberStressComponents;
+  //   int numberPrestressGaussPoints;
+  //   int numberElements;
+  //   int prestressAutoComputeInt;
+  //   int f77FileInput;
+  //   char* prestressInputFile;
+
+  //   int ok = PyArg_ParseTuple(args, "iiiiis:scan_prestr",
+  // 			    &numberStressComponents,
+  // 			    &numberPrestressGaussPoints,
+  // 			    &numberElements,
+  // 			    &prestressAutoComputeInt,
+  // 			    &f77FileInput,
+  // 			    &prestressInputFile);
+
+  //   if (!ok) {
+  //     return 0;
+  //   }
+
+  //   int errorcode = 0;
+  //   const int maxsize = 4096;
+  //   char errorstring[maxsize];
+  //   int numberPrestressEntries = 0;
+
+  //   scan_prestr_f(&numberStressComponents,
+  // 		&numberPrestressGaussPoints,
+  // 		&numberPrestressEntries,
+  // 		&numberElements,
+  // 		&prestressAutoComputeInt,
+  // 		&f77FileInput,
+  // 		&errorcode,
+  // 		prestressInputFile,strlen(prestressInputFile));
+    
+  //   if(0 != exceptionhandler(errorcode, errorstring)) {
+  //     return 0;
+  //   }
+
+  //   journal::debug_t debug("pylith3d");
+  //   debug
+  //     << journal::at(__HERE__)
+  //     << "numberPrestressEntries:" << numberPrestressEntries
+  //     << journal::endl;
+
+  // return
+  //   Py_INCREF(Py_None);
+  //   return Py_BuildValue("i",numberPrestressEntries);
+  // }
+
+
+// Scan local coordinate rotations
+
+char pypylith3d_scan_skew__doc__[] = "";
+char pypylith3d_scan_skew__name__[] = "scan_skew";
+
+PyObject * pypylith3d_scan_skew(PyObject *, PyObject *args)
+{
+  int f77FileInput;
+  char* rotationUnits;
+  char* rotationInputFile;
+
+  int ok = PyArg_ParseTuple(args, (char *) "iss:scan_skew",
+			    &f77FileInput,
+			    &rotationUnits,
+			    &rotationInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int numberRotationEntries = 0;
+
+  scan_skew_f(&numberRotationEntries,
+	      &f77FileInput,
+	      rotationUnits,
+	      rotationInputFile,
+	      &errorcode,
+	      errorstring,
+	      strlen(rotationUnits),
+	      strlen(rotationInputFile),
+	      sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberRotationEntries:" << numberRotationEntries
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_BuildValue((char *) "i", numberRotationEntries);
+}
+
+
+// Scan slippery node entries
+
+char pypylith3d_scan_slip__doc__[] = "";
+char pypylith3d_scan_slip__name__[] = "scan_slip";
+
+PyObject * pypylith3d_scan_slip(PyObject *, PyObject *args)
+{
+  int f77FileInput;
+  char* slipperyNodeInputFile;
+
+  int ok = PyArg_ParseTuple(args, (char *) "is:scan_slip",
+			    &f77FileInput,
+			    &slipperyNodeInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int numberSlipperyNodeEntries = 0;
+
+  scan_slip_f(&numberSlipperyNodeEntries,
+	      &f77FileInput,
+	      slipperyNodeInputFile,
+	      &errorcode,
+	      errorstring,
+	      strlen(slipperyNodeInputFile),
+	      sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberSlipperyNodeEntries:" << numberSlipperyNodeEntries
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_BuildValue((char *) "i", numberSlipperyNodeEntries);
+}
+
+
+// Scan split node entries
+
+char pypylith3d_scan_split__doc__[] = "";
+char pypylith3d_scan_split__name__[] = "scan_split";
+
+PyObject * pypylith3d_scan_split(PyObject *, PyObject *args)
+{
+  int f77FileInput;
+  char* splitNodeInputFile;
+
+  int ok = PyArg_ParseTuple(args, (char *) "is:scan_split",
+			    &f77FileInput,
+			    &splitNodeInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int numberSplitNodeEntries = 0;
+
+  scan_split_f(&numberSplitNodeEntries,
+	       &f77FileInput,
+	       splitNodeInputFile,
+	       &errorcode,
+	       errorstring,
+	       strlen(splitNodeInputFile),
+	       sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberSplitNodeEntries:" << numberSplitNodeEntries
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_BuildValue((char *) "i", numberSplitNodeEntries);
+}
+
+
+// Scan time step data
+
+char pypylith3d_scan_timdat__doc__[] = "";
+char pypylith3d_scan_timdat__name__[] = "scan_timdat";
+
+PyObject * pypylith3d_scan_timdat(PyObject *, PyObject *args)
+{
+  int f77FileInput;
+  char* timeUnits;
+  char* timeStepInputFile;
+
+  int ok = PyArg_ParseTuple(args, (char *) "iss:scan_timdat",
+			    &f77FileInput,
+			    &timeUnits,
+			    &timeStepInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int numberTimeStepGroups = 0;
+  int totalNumberTimeSteps = 0;
+
+  scan_timdat_f(&totalNumberTimeSteps,
+		&numberTimeStepGroups,
+		&f77FileInput,
+		timeUnits,
+		timeStepInputFile,
+		&errorcode,
+		errorstring,
+		strlen(timeUnits),
+		strlen(timeStepInputFile),
+		sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "totalNumberTimeSteps:" << totalNumberTimeSteps
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_BuildValue((char *) "ii", numberTimeStepGroups,
+		       totalNumberTimeSteps);
+}
+
+
+
+// Scan traction BC
+
+char pypylith3d_scan_tractions__doc__[] = "";
+char pypylith3d_scan_tractions__name__[] = "scan_tractions";
+
+PyObject * pypylith3d_scan_tractions(PyObject *, PyObject *args)
+{
+  int maxElementNodes2d;
+  int f77FileInput;
+  char *tractionUnits;
+  char *tractionInputFile;
+
+  int ok = PyArg_ParseTuple(args, (char *) "iiss:scan_tractions",
+                            &maxElementNodes2d,
+			    &f77FileInput,
+			    &tractionUnits,
+			    &tractionInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int numberTractionBc = 0;
+
+  scan_tractions_f(&numberTractionBc,
+		   &maxElementNodes2d,
+		   &f77FileInput,
+		   tractionUnits,
+		   tractionInputFile,
+		   &errorcode,
+		   errorstring,
+		   strlen(tractionUnits),
+		   strlen(tractionInputFile),
+		   sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberTractionBc:" << numberTractionBc
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_BuildValue((char *) "i", numberTractionBc);
+}
+
+// Read winkler BC
+
+char pypylith3d_scan_wink__doc__[] = "";
+char pypylith3d_scan_wink__name__[] = "scan_wink";
+
+PyObject * pypylith3d_scan_wink(PyObject *, PyObject *args)
+{
+  int f77FileInput;
+  char* winklerInputFile;
+
+  int ok = PyArg_ParseTuple(args, (char *) "is:scan_wink",
+			    &f77FileInput,
+			    &winklerInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int numberWinklerEntries = 0;
+  int numberWinklerForces = 0;
+
+  scan_wink_f(&numberWinklerEntries,
+	      &numberWinklerForces,
+	      &f77FileInput,
+	      winklerInputFile,
+	      &errorcode,
+	      errorstring,
+	      strlen(winklerInputFile),
+	      sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberWinklerForces:" << numberWinklerForces
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_BuildValue((char *) "ii", numberWinklerEntries,
+	               numberWinklerForces);
+}
+
+
+// Read winkler BC for slippery nodes
+
+char pypylith3d_scan_winkx__doc__[] = "";
+char pypylith3d_scan_winkx__name__[] = "scan_winkx";
+
+PyObject * pypylith3d_scan_winkx(PyObject *, PyObject *args)
+{
+  int numberSlipperyNodeEntries;
+  int f77FileInput;
+  char* slipperyWinklerInputFile;
+
+  int ok = PyArg_ParseTuple(args, (char *) "iis:scan_winkx",
+			    &numberSlipperyNodeEntries,
+			    &f77FileInput,
+			    &slipperyWinklerInputFile);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+  int numberSlipperyWinklerEntries = 0;
+  int numberSlipperyWinklerForces = 0;
+
+  scan_winkx_f(&numberSlipperyNodeEntries,
+	       &numberSlipperyWinklerEntries,
+	       &numberSlipperyWinklerForces,
+	       &f77FileInput,
+	       slipperyWinklerInputFile,
+	       &errorcode,
+	       errorstring,
+	       strlen(slipperyWinklerInputFile),
+	       sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "numberSlipperyWinklerForces:" << numberSlipperyWinklerForces
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_BuildValue((char *) "ii", numberSlipperyWinklerEntries,
+		       numberSlipperyWinklerForces);
+}
+    
+
+// Initialize material model info
+
+char pypylith3d_matmod_def__doc__[] = "";
+char pypylith3d_matmod_def__name__[] = "matmod_def";
+
+PyObject * pypylith3d_matmod_def(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToMaterialModelInfo;
+
+  int ok = PyArg_ParseTuple(args, "O:matmod_def",
+			    &pyPointerToMaterialModelInfo);
+
+  if (!ok) {
+    return 0;
+  }
+
+  int* pointerToMaterialModelInfo = (int*) PyCObject_AsVoidPtr(pyPointerToMaterialModelInfo);
+
+  matmod_def_f(pointerToMaterialModelInfo);
+    
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "pointerToMaterialModelInfo:" << pointerToMaterialModelInfo
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+// Precompute shape function info
+
+char pypylith3d_preshape__doc__[] = "";
+char pypylith3d_preshape__name__[] = "preshape";
+
+PyObject * pypylith3d_preshape(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToSh;
+  PyObject* pyPointerToShj;
+  PyObject* pyPointerToGauss;
+  int quadratureOrderInt;
+  int elementType;
+  int numberVolumeElementNodes;
+  int numberVolumeElementGaussPoints;
+
+  int ok = PyArg_ParseTuple(args, "OOOiiii:preshape",
+			    &pyPointerToSh,
+			    &pyPointerToShj,
+			    &pyPointerToGauss,
+			    &quadratureOrderInt,
+			    &elementType,
+			    &numberVolumeElementNodes,
+			    &numberVolumeElementGaussPoints);
+
+  if (!ok) {
+    return 0;
+  }
+
+  double* pointerToSh = (double*) PyCObject_AsVoidPtr(pyPointerToSh);
+  double* pointerToShj = (double*) PyCObject_AsVoidPtr(pyPointerToShj);
+  double* pointerToGauss = (double*) PyCObject_AsVoidPtr(pyPointerToGauss);
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+
+  preshape_f(pointerToSh,
+	     pointerToShj,
+	     pointerToGauss,
+	     &quadratureOrderInt,
+	     &elementType,
+	     &numberVolumeElementNodes,
+	     &numberVolumeElementGaussPoints,
+	     &errorcode,
+	     errorstring,
+	     sizeof(errorstring));
+
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+    
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "quadratureOrderInt:" << quadratureOrderInt
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+// Precompute shape function info for element faces
+
+char pypylith3d_preshape2d__doc__[] = "";
+char pypylith3d_preshape2d__name__[] = "preshape2d";
+
+PyObject * pypylith3d_preshape2d(PyObject *, PyObject *args)
+{
+  PyObject* pyPointerToSh2d;
+  PyObject* pyPointerToGauss2d;
+  int quadratureOrderInt;
+  int elementType;
+  int numberSurfaceElementNodes;
+  int numberSurfaceElementGaussPoints;
+
+  int ok = PyArg_ParseTuple(args, "OOiiii:preshape2d",
+			    &pyPointerToSh2d,
+			    &pyPointerToGauss2d,
+			    &quadratureOrderInt,
+			    &elementType,
+			    &numberSurfaceElementNodes,
+			    &numberSurfaceElementGaussPoints);
+
+  if (!ok) {
+    return 0;
+  }
+
+  double* pointerToSh2d = (double*) PyCObject_AsVoidPtr(pyPointerToSh2d);
+  double* pointerToGauss2d = (double*) PyCObject_AsVoidPtr(pyPointerToGauss2d);
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+
+  preshape2d_f(pointerToSh2d,
+	       pointerToGauss2d,
+	       &quadratureOrderInt,
+	       &elementType,
+	       &numberSurfaceElementNodes,
+	       &numberSurfaceElementGaussPoints,
+	       &errorcode,
+	       errorstring,
+	       sizeof(errorstring));
+
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+    
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "quadratureOrderInt:" << quadratureOrderInt
+    << journal::endl;
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+// try_binio
+
+char pypylith3d_try_binio__doc__[] = "";
+char pypylith3d_try_binio__name__[] = "try_binio";
+
+PyObject * pypylith3d_try_binio(PyObject *, PyObject *args)
+{
+  int unit;
+
+  int ok = PyArg_ParseTuple(args, "i:try_binio",
+			    &unit);
+  if (!ok) {
+    return 0;
+  }
+
+  int errorcode = 0;
+  const int maxsize = 4096;
+  char errorstring[maxsize];
+
+  try_binio_f(&unit,
+	      &errorcode,
+	      errorstring,
+	      sizeof(errorstring));
+    
+  if(0 != exceptionhandler(errorcode, errorstring)) {
+    return 0;
+  }
+
+  // return
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+    
+// end of file

Added: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/libpylith3d.h
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/libpylith3d.h	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/libpylith3d.h	2007-03-30 21:05:09 UTC (rev 6475)
@@ -0,0 +1,491 @@
+// -*- C++ -*-
+// 
+//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
+//
+//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
+//
+//  Permission is hereby granted, free of charge, to any person obtaining
+//  a copy of this software and associated documentation files (the
+//  "Software"), to deal in the Software without restriction, including
+//  without limitation the rights to use, copy, modify, merge, publish,
+//  distribute, sublicense, and/or sell copies of the Software, and to
+//  permit persons to whom the Software is furnished to do so, subject to
+//  the following conditions:
+//
+//  The above copyright notice and this permission notice shall be
+//  included in all copies or substantial portions of the Software.
+//
+//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
+//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
+//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
+//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
+//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// 
+
+#if !defined(pypylith3d_libpylith3d_h)
+#define pypylith3d_libpylith3d_h
+
+
+// Compute gravitational prestresses.
+extern char pypylith3d_autoprestr__name__[];
+extern char pypylith3d_autoprestr__doc__[];
+extern "C"
+PyObject * pypylith3d_autoprestr(PyObject *, PyObject *);
+
+
+// drive elastic solution
+extern char pypylith3d_elastc__name__[];
+extern char pypylith3d_elastc__doc__[];
+extern "C"
+PyObject * pypylith3d_elastc(PyObject *, PyObject *);
+
+
+// assign equation numbers for Winkler BC
+extern char pypylith3d_assign_wink__name__[];
+extern char pypylith3d_assign_wink__doc__[];
+extern "C"
+PyObject * pypylith3d_assign_wink(PyObject *, PyObject *);
+
+// create id array
+extern char pypylith3d_create_id__name__[];
+extern char pypylith3d_create_id__doc__[];
+extern "C"
+PyObject * pypylith3d_create_id(PyObject *, PyObject *);
+
+// form id array for split nodes
+extern char pypylith3d_id_split__name__[];
+extern char pypylith3d_id_split__doc__[];
+extern "C"
+PyObject * pypylith3d_id_split(PyObject *, PyObject *);
+
+// find closest fault neignbors for slippery nodes
+extern char pypylith3d_nfind__name__[];
+extern char pypylith3d_nfind__doc__[];
+extern "C"
+PyObject * pypylith3d_nfind(PyObject *, PyObject *);
+
+
+// read boundary conditions
+extern char pypylith3d_read_bc__name__[];
+extern char pypylith3d_read_bc__doc__[];
+extern "C"
+PyObject * pypylith3d_read_bc(PyObject *, PyObject *);
+
+// read connectivities
+extern char pypylith3d_read_connect__name__[];
+extern char pypylith3d_read_connect__doc__[];
+extern "C"
+PyObject * pypylith3d_read_connect(PyObject *, PyObject *);
+
+// read coordinates
+extern char pypylith3d_read_coords__name__[];
+extern char pypylith3d_read_coords__doc__[];
+extern "C"
+PyObject * pypylith3d_read_coords(PyObject *, PyObject *);
+
+// read differential forces
+extern char pypylith3d_read_diff__name__[];
+extern char pypylith3d_read_diff__doc__[];
+extern "C"
+PyObject * pypylith3d_read_diff(PyObject *, PyObject *);
+
+// read time steps at which full output is desired
+extern char pypylith3d_read_fuldat__name__[];
+extern char pypylith3d_read_fuldat__doc__[];
+extern "C"
+PyObject * pypylith3d_read_fuldat(PyObject *, PyObject *);
+
+// read time history info
+extern char pypylith3d_read_hist__name__[];
+extern char pypylith3d_read_hist__doc__[];
+extern "C"
+PyObject * pypylith3d_read_hist(PyObject *, PyObject *);
+
+// read material history info
+// these are not being used for now
+// extern char pypylith3d_read_mathist__name__[];
+// extern char pypylith3d_read_mathist__doc__[];
+// extern "C"
+// PyObject * pypylith3d_read_mathist(PyObject *, PyObject *);
+
+// read prestresses
+// extern char pypylith3d_read_prestr__name__[];
+// extern char pypylith3d_read_prestr__doc__[];
+// extern "C"
+// PyObject * pypylith3d_read_prestr(PyObject *, PyObject *);
+
+// read local coordinate rotations
+extern char pypylith3d_read_skew__name__[];
+extern char pypylith3d_read_skew__doc__[];
+extern "C"
+PyObject * pypylith3d_read_skew(PyObject *, PyObject *);
+
+// read slippery node definitions
+extern char pypylith3d_read_slip__name__[];
+extern char pypylith3d_read_slip__doc__[];
+extern "C"
+PyObject * pypylith3d_read_slip(PyObject *, PyObject *);
+
+// read split node definitions
+extern char pypylith3d_read_split__name__[];
+extern char pypylith3d_read_split__doc__[];
+extern "C"
+PyObject * pypylith3d_read_split(PyObject *, PyObject *);
+
+// read state output information
+extern char pypylith3d_read_stateout__name__[];
+extern char pypylith3d_read_stateout__doc__[];
+extern "C"
+PyObject * pypylith3d_read_stateout(PyObject *, PyObject *);
+
+// read time step group informations
+extern char pypylith3d_read_timdat__name__[];
+extern char pypylith3d_read_timdat__doc__[];
+extern "C"
+PyObject * pypylith3d_read_timdat(PyObject *, PyObject *);
+
+// read traction boundary conditions
+extern char pypylith3d_read_tractions__name__[];
+extern char pypylith3d_read_tractions__doc__[];
+extern "C"
+PyObject * pypylith3d_read_tractions(PyObject *, PyObject *);
+
+// read winkler force information
+extern char pypylith3d_read_wink__name__[];
+extern char pypylith3d_read_wink__doc__[];
+extern "C"
+PyObject * pypylith3d_read_wink(PyObject *, PyObject *);
+
+
+// sort elements into element families
+extern char pypylith3d_sort_elements__name__[];
+extern char pypylith3d_sort_elements__doc__[];
+extern "C"
+PyObject * pypylith3d_sort_elements(PyObject *, PyObject *);
+
+// Sort slippery nodes according to reordered elements
+extern char pypylith3d_sort_slip_nodes__name__[];
+extern char pypylith3d_sort_slip_nodes__doc__[];
+extern "C"
+PyObject * pypylith3d_sort_slip_nodes(PyObject *, PyObject *);
+
+// Sort split nodes according to reordered elements
+extern char pypylith3d_sort_split_nodes__name__[];
+extern char pypylith3d_sort_split_nodes__doc__[];
+extern "C"
+PyObject * pypylith3d_sort_split_nodes(PyObject *, PyObject *);
+
+
+// compute maximum number of nonzero entries in stiffness matrix
+extern char pypylith3d_cmp_stiffsz__name__[];
+extern char pypylith3d_cmp_stiffsz__doc__[];
+extern "C"
+PyObject * pypylith3d_cmp_stiffsz(PyObject *, PyObject *);
+
+// create linked list for sparse matrix
+extern char pypylith3d_lnklst__name__[];
+extern char pypylith3d_lnklst__doc__[];
+extern "C"
+PyObject * pypylith3d_lnklst(PyObject *, PyObject *);
+
+// localize id array for reference by element
+extern char pypylith3d_local__name__[];
+extern char pypylith3d_local__doc__[];
+extern "C"
+PyObject * pypylith3d_local(PyObject *, PyObject *);
+
+// localize nfault array for reference by element
+extern char pypylith3d_localf__name__[];
+extern char pypylith3d_localf__doc__[];
+extern "C"
+PyObject * pypylith3d_localf(PyObject *, PyObject *);
+
+// localize idx array for reference by element
+extern char pypylith3d_localx__name__[];
+extern char pypylith3d_localx__doc__[];
+extern "C"
+PyObject * pypylith3d_localx(PyObject *, PyObject *);
+
+// create sparse matrix in modified sparse row format
+extern char pypylith3d_makemsr__name__[];
+extern char pypylith3d_makemsr__doc__[];
+extern "C"
+PyObject * pypylith3d_makemsr(PyObject *, PyObject *);
+
+
+// drive time-dependent solution
+extern char pypylith3d_viscos__name__[];
+extern char pypylith3d_viscos__doc__[];
+extern "C"
+PyObject * pypylith3d_viscos(PyObject *, PyObject *);
+
+// setup time-dependent solution
+extern char pypylith3d_viscos_setup__name__[];
+extern char pypylith3d_viscos_setup__doc__[];
+extern "C"
+PyObject * pypylith3d_viscos_setup(PyObject *, PyObject *);
+
+// drive time-dependent solution
+extern char pypylith3d_viscos_step__name__[];
+extern char pypylith3d_viscos_step__doc__[];
+extern "C"
+PyObject * pypylith3d_viscos_step(PyObject *, PyObject *);
+
+// cleanup time-dependent solution
+extern char pypylith3d_viscos_cleanup__name__[];
+extern char pypylith3d_viscos_cleanup__doc__[];
+extern "C"
+PyObject * pypylith3d_viscos_cleanup(PyObject *, PyObject *);
+
+
+// write boundary conditions
+extern char pypylith3d_write_bc__name__[];
+extern char pypylith3d_write_bc__doc__[];
+extern "C"
+PyObject * pypylith3d_write_bc(PyObject *, PyObject *);
+
+// write element node array
+extern char pypylith3d_write_connect__name__[];
+extern char pypylith3d_write_connect__doc__[];
+extern "C"
+PyObject * pypylith3d_write_connect(PyObject *, PyObject *);
+
+// write nodal coordinates
+extern char pypylith3d_write_coords__name__[];
+extern char pypylith3d_write_coords__doc__[];
+extern "C"
+PyObject * pypylith3d_write_coords(PyObject *, PyObject *);
+
+// write differential forces
+extern char pypylith3d_write_diff__name__[];
+extern char pypylith3d_write_diff__doc__[];
+extern "C"
+PyObject * pypylith3d_write_diff(PyObject *, PyObject *);
+
+// write out element and prestress information
+extern char pypylith3d_write_element_info__name__[];
+extern char pypylith3d_write_element_info__doc__[];
+extern "C"
+PyObject * pypylith3d_write_element_info(PyObject *, PyObject *);
+
+// write time steps at which full output is desired
+extern char pypylith3d_write_fuldat__name__[];
+extern char pypylith3d_write_fuldat__doc__[];
+extern "C"
+PyObject * pypylith3d_write_fuldat(PyObject *, PyObject *);
+
+// write out global control information
+extern char pypylith3d_write_global_info__name__[];
+extern char pypylith3d_write_global_info__doc__[];
+extern "C"
+PyObject * pypylith3d_write_global_info(PyObject *, PyObject *);
+
+// write load histories
+extern char pypylith3d_write_hist__name__[];
+extern char pypylith3d_write_hist__doc__[];
+extern "C"
+PyObject * pypylith3d_write_hist(PyObject *, PyObject *);
+
+// write out material property info
+extern char pypylith3d_write_props__name__[];
+extern char pypylith3d_write_props__doc__[];
+extern "C"
+PyObject * pypylith3d_write_props(PyObject *, PyObject *);
+
+// write local coordinate rotations
+extern char pypylith3d_write_skew__name__[];
+extern char pypylith3d_write_skew__doc__[];
+extern "C"
+PyObject * pypylith3d_write_skew(PyObject *, PyObject *);
+
+// write slippery node entries
+extern char pypylith3d_write_slip__name__[];
+extern char pypylith3d_write_slip__doc__[];
+extern "C"
+PyObject * pypylith3d_write_slip(PyObject *, PyObject *);
+
+// write out sparse matrix information
+extern char pypylith3d_write_sparse_info__name__[];
+extern char pypylith3d_write_sparse_info__doc__[];
+extern "C"
+PyObject * pypylith3d_write_sparse_info(PyObject *, PyObject *);
+
+// write split node entries
+extern char pypylith3d_write_split__name__[];
+extern char pypylith3d_write_split__doc__[];
+extern "C"
+PyObject * pypylith3d_write_split(PyObject *, PyObject *);
+
+// write split node entries for plot output
+extern char pypylith3d_write_split_plot__name__[];
+extern char pypylith3d_write_split_plot__doc__[];
+extern "C"
+PyObject * pypylith3d_write_split_plot(PyObject *, PyObject *);
+
+// write state output information
+extern char pypylith3d_write_stateout__name__[];
+extern char pypylith3d_write_stateout__doc__[];
+extern "C"
+PyObject * pypylith3d_write_stateout(PyObject *, PyObject *);
+
+// write out stress computation information
+extern char pypylith3d_write_strscomp__name__[];
+extern char pypylith3d_write_strscomp__doc__[];
+extern "C"
+PyObject * pypylith3d_write_strscomp(PyObject *, PyObject *);
+
+// write out subiteration convergence information
+extern char pypylith3d_write_subiter__name__[];
+extern char pypylith3d_write_subiter__doc__[];
+extern "C"
+PyObject * pypylith3d_write_subiter(PyObject *, PyObject *);
+
+// write time step data
+extern char pypylith3d_write_timdat__name__[];
+extern char pypylith3d_write_timdat__doc__[];
+extern "C"
+PyObject * pypylith3d_write_timdat(PyObject *, PyObject *);
+
+// write traction BC
+extern char pypylith3d_write_tractions__name__[];
+extern char pypylith3d_write_tractions__doc__[];
+extern "C"
+PyObject * pypylith3d_write_tractions(PyObject *, PyObject *);
+
+// write mesh info to UCD file
+extern char pypylith3d_write_ucd_mesh__name__[];
+extern char pypylith3d_write_ucd_mesh__doc__[];
+extern "C"
+PyObject * pypylith3d_write_ucd_mesh(PyObject *, PyObject *);
+
+// write winkler BC
+extern char pypylith3d_write_wink__name__[];
+extern char pypylith3d_write_wink__doc__[];
+extern "C"
+PyObject * pypylith3d_write_wink(PyObject *, PyObject *);
+
+// write slippery winkler BC
+extern char pypylith3d_write_winkx__name__[];
+extern char pypylith3d_write_winkx__doc__[];
+extern "C"
+PyObject * pypylith3d_write_winkx(PyObject *, PyObject *);
+
+
+// scan boundary condition file
+extern char pypylith3d_scan_bc__name__[];
+extern char pypylith3d_scan_bc__doc__[];
+extern "C"
+PyObject * pypylith3d_scan_bc(PyObject *, PyObject *);
+
+// scan connectivity file
+extern char pypylith3d_scan_connect__name__[];
+extern char pypylith3d_scan_connect__doc__[];
+extern "C"
+PyObject * pypylith3d_scan_connect(PyObject *, PyObject *);
+
+// scan coordinates file
+extern char pypylith3d_scan_coords__name__[];
+extern char pypylith3d_scan_coords__doc__[];
+extern "C"
+PyObject * pypylith3d_scan_coords(PyObject *, PyObject *);
+
+// scan differential forces file
+extern char pypylith3d_scan_diff__name__[];
+extern char pypylith3d_scan_diff__doc__[];
+extern "C"
+PyObject * pypylith3d_scan_diff(PyObject *, PyObject *);
+
+// scan time step output info file
+extern char pypylith3d_scan_fuldat__name__[];
+extern char pypylith3d_scan_fuldat__doc__[];
+extern "C"
+PyObject * pypylith3d_scan_fuldat(PyObject *, PyObject *);
+
+// scan time history definition file
+extern char pypylith3d_scan_hist__name__[];
+extern char pypylith3d_scan_hist__doc__[];
+extern "C"
+PyObject * pypylith3d_scan_hist(PyObject *, PyObject *);
+
+// scan prestress file
+// extern char pypylith3d_scan_prestr__name__[];
+// extern char pypylith3d_scan_prestr__doc__[];
+// extern "C"
+// PyObject * pypylith3d_scan_prestr(PyObject *, PyObject *);
+
+// scan local coordinate rotations file
+extern char pypylith3d_scan_skew__name__[];
+extern char pypylith3d_scan_skew__doc__[];
+extern "C"
+PyObject * pypylith3d_scan_skew(PyObject *, PyObject *);
+
+// scan slippery node definitions file
+extern char pypylith3d_scan_slip__name__[];
+extern char pypylith3d_scan_slip__doc__[];
+extern "C"
+PyObject * pypylith3d_scan_slip(PyObject *, PyObject *);
+
+// scan split node definitions file
+extern char pypylith3d_scan_split__name__[];
+extern char pypylith3d_scan_split__doc__[];
+extern "C"
+PyObject * pypylith3d_scan_split(PyObject *, PyObject *);
+
+// scan time step group info file
+extern char pypylith3d_scan_timdat__name__[];
+extern char pypylith3d_scan_timdat__doc__[];
+extern "C"
+PyObject * pypylith3d_scan_timdat(PyObject *, PyObject *);
+
+// scan traction boundary conditions file
+extern char pypylith3d_scan_tractions__name__[];
+extern char pypylith3d_scan_tractions__doc__[];
+extern "C"
+PyObject * pypylith3d_scan_tractions(PyObject *, PyObject *);
+
+// scan winkler forces info file
+extern char pypylith3d_scan_wink__name__[];
+extern char pypylith3d_scan_wink__doc__[];
+extern "C"
+PyObject * pypylith3d_scan_wink(PyObject *, PyObject *);
+
+// scan winkler forces info file for slippery nodes
+extern char pypylith3d_scan_winkx__name__[];
+extern char pypylith3d_scan_winkx__doc__[];
+extern "C"
+PyObject * pypylith3d_scan_winkx(PyObject *, PyObject *);
+
+// Initialize material model info
+extern char pypylith3d_matmod_def__name__[];
+extern char pypylith3d_matmod_def__doc__[];
+extern "C"
+PyObject * pypylith3d_matmod_def(PyObject *, PyObject *);
+
+// Precompute shape function info
+extern char pypylith3d_preshape__name__[];
+extern char pypylith3d_preshape__doc__[];
+extern "C"
+PyObject * pypylith3d_preshape(PyObject *, PyObject *);
+
+// Precompute shape function info for element faces
+extern char pypylith3d_preshape2d__name__[];
+extern char pypylith3d_preshape2d__doc__[];
+extern "C"
+PyObject * pypylith3d_preshape2d(PyObject *, PyObject *);
+
+// try_binio
+extern char pypylith3d_try_binio__name__[];
+extern char pypylith3d_try_binio__doc__[];
+extern "C"
+PyObject * pypylith3d_try_binio(PyObject *, PyObject *);
+
+
+#endif // pypylith3d_libpylith3d_h
+
+// end of file

Copied: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/mesh.cc (from rev 6472, short/3D/PyLith/branches/pylith-0.8/pylith3d/module/scanner.cc)
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/scanner.cc	2007-03-30 05:03:55 UTC (rev 6472)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/mesh.cc	2007-03-30 21:05:09 UTC (rev 6475)
@@ -0,0 +1,669 @@
+// -*- C++ -*-
+// 
+//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
+//
+//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
+//
+//  Permission is hereby granted, free of charge, to any person obtaining
+//  a copy of this software and associated documentation files (the
+//  "Software"), to deal in the Software without restriction, including
+//  without limitation the rights to use, copy, modify, merge, publish,
+//  distribute, sublicense, and/or sell copies of the Software, and to
+//  permit persons to whom the Software is furnished to do so, subject to
+//  the following conditions:
+//
+//  The above copyright notice and this permission notice shall be
+//  included in all copies or substantial portions of the Software.
+//
+//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
+//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
+//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
+//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
+//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// 
+
+#include <Distribution.hh>
+#include <petscmesh.h>
+#include <src/dm/mesh/meshpylith.h>
+#include <petscmat.h>
+#include <portinfo>
+#include "journal/debug.h"
+
+#include <Python.h>
+
+#include "mesh.h"
+#include "exceptionhandler.h"
+#include <stdio.h>
+#include <string.h>
+
+#undef __FUNCT__
+#define __FUNCT__ "IgnoreComments_PyLith"
+PetscErrorCode IgnoreComments_PyLith(char *buf, PetscInt bufSize, FILE *f)
+{
+  PetscFunctionBegin;
+  while((fgets(buf, bufSize, f) != NULL) && ((buf[0] == '#') || (buf[0] == '\0'))) {}
+  PetscFunctionReturn(0);
+}
+
+#undef __FUNCT__
+#define __FUNCT__ "ReadBoundary_PyLith"
+PetscErrorCode ReadBoundary_PyLith(const char *baseFilename, PetscTruth useZeroBase, PetscInt *numBoundaryVertices, PetscInt *numBoundaryComponents, PetscInt **boundaryVertices, PetscScalar **boundaryValues)
+{
+  FILE          *f;
+  PetscInt       maxVerts= 1024, vertexCount = 0;
+  PetscInt       numComp = 3;
+  PetscInt      *verts;
+  PetscScalar   *values;
+  char           bcFilename[2048];
+  char           buf[2048];
+  PetscErrorCode ierr;
+
+  PetscFunctionBegin;
+  ierr = PetscStrcpy(bcFilename, baseFilename);
+  // ierr = PetscStrcat(bcFilename, ".bc");
+  f = fopen(bcFilename, "r");CHKERRQ(ierr);
+  IgnoreComments_PyLith(buf, 2048, f);
+  /* Ignore displacement units */
+  /* Don't need this one since IgnoreComments reads until "failure".
+   * fgets(buf, 2048, f);
+   */
+  /* Ignore velocity units */
+  fgets(buf, 2048, f);
+  /* Ignore force units */
+  fgets(buf, 2048, f);
+  IgnoreComments_PyLith(buf, 2048, f);
+  ierr = PetscMalloc(maxVerts*(numComp+1) * sizeof(PetscInt),    &verts);CHKERRQ(ierr);
+  ierr = PetscMalloc(maxVerts*numComp * sizeof(PetscScalar), &values);CHKERRQ(ierr);
+  do {
+    const char *v = strtok(buf, " ");
+    int vertex = atoi(v);
+        
+    if (!useZeroBase) vertex -= 1;
+    if (vertexCount == maxVerts) {
+      PetscInt *vtmp;
+      PetscScalar *ctmp;
+
+      vtmp = verts;
+      ierr = PetscMalloc(maxVerts*2*(numComp+1) * sizeof(PetscInt), &verts);CHKERRQ(ierr);
+      ierr = PetscMemcpy(verts, vtmp, maxVerts*(numComp+1) * sizeof(PetscInt));CHKERRQ(ierr);
+      ierr = PetscFree(vtmp);CHKERRQ(ierr);
+      ctmp = values;
+      ierr = PetscMalloc(maxVerts*2*numComp * sizeof(PetscScalar), &values);CHKERRQ(ierr);
+      ierr = PetscMemcpy(values, ctmp, maxVerts*numComp * sizeof(PetscScalar));CHKERRQ(ierr);
+      ierr = PetscFree(ctmp);CHKERRQ(ierr);
+      maxVerts *= 2;
+    }
+    verts[vertexCount*(numComp+1)+0] = vertex;
+    /* X boundary condition*/
+    v = strtok(NULL, " ");
+    verts[vertexCount*(numComp+1)+1] = atoi(v);
+    /* Y boundary condition*/
+    v = strtok(NULL, " ");
+    verts[vertexCount*(numComp+1)+2] = atoi(v);
+    /* Z boundary condition*/
+    v = strtok(NULL, " ");
+    verts[vertexCount*(numComp+1)+3] = atoi(v);
+    /* X boundary value */
+    v = strtok(NULL, " ");
+    values[vertexCount*numComp+0] = atof(v);
+    /* Y boundary value */
+    v = strtok(NULL, " ");
+    values[vertexCount*numComp+1] = atof(v);
+    /* Z boundary value */
+    v = strtok(NULL, " ");
+    values[vertexCount*numComp+2] = atof(v);
+    vertexCount++;
+  } while(fgets(buf, 2048, f) != NULL);
+  fclose(f);
+  *numBoundaryVertices = vertexCount;
+  *numBoundaryComponents = numComp;
+  *boundaryVertices = verts;
+  *boundaryValues   = values;
+  PetscFunctionReturn(0);
+}
+
+#undef __FUNCT__
+#define __FUNCT__ "WriteBoundary_PyLith"
+PetscErrorCode WriteBoundary_PyLith(const char *baseFilename, const ALE::Obj<ALE::Mesh>& mesh)
+{
+  ALE::Mesh::foliated_section_type::patch_type      patch      = 0;
+  const ALE::Obj<ALE::Mesh::numbering_type>&        vNumbering = mesh->getFactory()->getLocalNumbering(mesh->getTopology(), patch, 0);
+  const ALE::Obj<ALE::Mesh::foliated_section_type>& boundaries = mesh->getBoundariesNew();
+  FILE          *f;
+  char           bcFilename[2048];
+  PetscErrorCode ierr;
+  MPI_Comm          comm = PETSC_COMM_WORLD;
+  PetscMPIInt       rank;
+  char           suff[9];
+
+  ierr = MPI_Comm_rank(comm, &rank);
+  sprintf(suff, "%s%d%s", ".", rank, ".bc");
+
+  PetscFunctionBegin;
+  if (mesh->debug()) {
+    boundaries->view("PyLith boundaries");
+  }
+  int slen = std::strlen(baseFilename);
+  std::strncpy(bcFilename, baseFilename, slen-3);
+  bcFilename[slen-3] = '\0';
+  // ierr = PetscStrcpy(bcFilename, baseFilename.substr(0,slen-4));
+  ierr = PetscStrcat(bcFilename, suff);
+
+  // Determine if we have bc stuff
+  const ALE::Obj<ALE::Mesh::topology_type::label_sequence>& vertices = boundaries->getTopology()->depthStratum(patch, 0);
+  bool haveBC = false;
+  for(ALE::Mesh::topology_type::label_sequence::iterator v_iter = vertices->begin(); v_iter != vertices->end(); ++v_iter)
+    if (boundaries->getFiberDimension(patch, *v_iter) > 0) {
+      haveBC = true;
+      break;
+    } // if
+
+  f = fopen(bcFilename, "w");CHKERRQ(ierr);
+  if (haveBC) {
+    // Only write header if bc file contains information
+    // If header is written and rest of file is empty,
+    // then we have a problem and reading will fail with
+    // error message.
+    fprintf(f, "displacement_units = m\n");
+    fprintf(f, "velocity_units = m/s\n");
+    fprintf(f, "force_units = newton\n");
+    fprintf(f, "#\n");
+    fprintf(f, "# The last row for each node applies\n");
+    fprintf(f, "#\n");
+    fprintf(f, "#  Node X BC Y BC Z BC   X Value          Y Value          Z Value\n");
+    fprintf(f, "#\n");
+  } // if
+
+  for(ALE::Mesh::topology_type::label_sequence::iterator v_iter = vertices->begin(); v_iter != vertices->end(); ++v_iter) {
+    int    constraints[3] = {0, 0, 0};
+    double values[3] = {0.0, 0.0, 0.0};
+    int    size = boundaries->getFiberDimension(patch, *v_iter);
+    const ALE::Mesh::foliated_section_type::value_type *array = boundaries->restrict(patch, *v_iter);
+
+    for(int c = 0; c < size; c++) {
+      constraints[array[c].first] = 1;
+      values[array[c].first]      = array[c].second;
+    }
+
+    if (constraints[0] || constraints[1] || constraints[2]) {
+      fprintf(f, "%7d %4d %4d %4d % 16.8E % 16.8E % 16.8E\n", vNumbering->getIndex(*v_iter)+1,
+              constraints[0], constraints[1], constraints[2], values[0], values[1], values[2]);
+    }
+  }
+  fclose(f);
+  PetscFunctionReturn(0);
+}
+
+// Process mesh
+
+PetscErrorCode MeshView_Sieve(const ALE::Obj<ALE::Mesh>& mesh, PetscViewer viewer);
+
+char pypylith3d_processMesh__doc__[] = "";
+char pypylith3d_processMesh__name__[] = "processMesh";
+
+PyObject * pypylith3d_processMesh(PyObject *, PyObject *args)
+{
+  char *meshInputFile;
+  char  *meshBcFile;
+  int   interpolateMesh;
+  char* partitioner;
+
+  int ok = PyArg_ParseTuple(args, (char *) "ssis:processMesh", &meshBcFile, &meshInputFile, &interpolateMesh, &partitioner);
+
+  if (!ok) {
+    return 0;
+  }
+
+  using ALE::Obj;
+  journal::debug_t  debug("pylith3d");
+  MPI_Comm          comm = PETSC_COMM_WORLD;
+  PetscMPIInt       rank;
+  Mesh              mesh;
+  Obj<ALE::Mesh>    m;
+  PetscViewer       viewer;
+  PetscInt         *boundaryVertices;
+  PetscScalar      *boundaryValues;
+  PetscInt          numBoundaryVertices, numBoundaryComponents;
+  int               debugFlag = 0;
+  PetscErrorCode    ierr;
+
+  ierr = MPI_Comm_rank(comm, &rank);
+  ierr = MeshCreatePyLith(comm, 3, meshInputFile, PETSC_FALSE, (PetscTruth) interpolateMesh, &mesh);
+  ierr = MeshGetMesh(mesh, m);
+  m->setDebug(debugFlag);
+  int numElements = m->getTopology()->heightStratum(0, 0)->size();
+  debug << journal::at(__HERE__) << "[" << rank << "]Created new PETSc Mesh for " << meshInputFile << journal::endl;
+  m = ALE::New::Distribution<ALE::Mesh::topology_type>::distributeMesh(m, partitioner);
+  ierr = MeshSetMesh(mesh, m);
+  debug << journal::at(__HERE__) << "[" << rank << "]Distributed PETSc Mesh"  << journal::endl;
+  ierr = ReadBoundary_PyLith(meshBcFile, PETSC_FALSE, &numBoundaryVertices, &numBoundaryComponents, &boundaryVertices, &boundaryValues);
+
+  const Obj<ALE::Mesh::foliated_section_type>& boundaries = m->getBoundariesNew();
+  ALE::Mesh::foliated_section_type::patch_type patch      = 0;
+  std::set<int> seen;
+
+  ierr = MPI_Bcast(&numElements, 1, MPI_INT, 0, comm);
+  boundaries->setTopology(m->getTopology());
+  // Reverse order allows newer conditions to override older, as required by PyLith
+  for(int v = numBoundaryVertices-1; v >= 0; v--) {
+    ALE::Mesh::point_type vertex(boundaryVertices[v*(numBoundaryComponents+1)] + numElements);
+    int size = 0;
+
+    if (seen.find(vertex) == seen.end()) {
+      for(int c = 0; c < numBoundaryComponents; c++) {
+        size += boundaryVertices[v*(numBoundaryComponents+1)+c+1];
+      }
+      boundaries->setFiberDimension(patch, vertex, size);
+      seen.insert(vertex);
+    }
+  }
+  boundaries->allocate();
+  for(int v = 0; v < numBoundaryVertices; v++) {
+    ALE::Mesh::point_type vertex(boundaryVertices[v*(numBoundaryComponents+1)] + numElements);
+    ALE::Mesh::foliated_section_type::value_type values[3];
+
+    for(int c = 0, i = 0; c < numBoundaryComponents; c++) {
+      if (boundaryVertices[v*(numBoundaryComponents+1)+c+1]) {
+        values[i].first  = c;
+        values[i].second = boundaryValues[v*numBoundaryComponents+c];
+        i++;
+      }
+    }
+    boundaries->update(patch, vertex, values);
+  }
+  debug << journal::at(__HERE__) << "[" << rank << "]Created boundary conditions"  << journal::endl;
+
+#if 0
+  bool refineMesh = false;
+  if (refineMesh) {
+    double refinementLimit = 2.4e4*2.4e4*2.4e4*0.01*0.5;
+    bool   interpolate     = true;
+    mesh = ALE::Generator::refine(mesh, refinementLimit, interpolate);
+  }
+#endif
+
+  ierr = PetscViewerCreate(comm, &viewer);
+  ierr = PetscViewerSetType(viewer, PETSC_VIEWER_ASCII);
+  ierr = PetscViewerSetFormat(viewer, PETSC_VIEWER_ASCII_PYLITH_LOCAL);
+  ierr = PetscViewerFileSetMode(viewer, FILE_MODE_READ);
+  ierr = PetscExceptionTry1(PetscViewerFileSetName(viewer, meshInputFile), PETSC_ERR_FILE_OPEN);
+  if (PetscExceptionValue(ierr)) {
+    /* this means that a caller above me has also tryed this exception so I don't handle it here, pass it up */
+  } else if (PetscExceptionCaught(ierr, PETSC_ERR_FILE_OPEN)) {
+    ierr = 0;
+  } 
+  ierr = MeshView(mesh, viewer);
+  ierr = PetscViewerDestroy(viewer);
+
+  char           bcFilename[2048];
+  char           suff[9];
+
+  sprintf(suff, "%s%d%s", ".", rank, ".bc");
+
+  int slen = std::strlen(meshBcFile);
+  std::strncpy(bcFilename, meshBcFile, slen-3);
+  // ierr = PetscStrcpy(bcFilename, meshBcFile.substr(0,slen-4));
+  ierr = PetscStrcat(bcFilename, suff);
+
+  debug << journal::at(__HERE__) << "[" << rank << "]Output new PyLith mesh into: " << bcFilename << journal::endl;
+
+  ierr = WriteBoundary_PyLith(meshBcFile, m);
+  debug << journal::at(__HERE__) << "[" << rank << "]Wrote PyLith boundary conditions"  << journal::endl;
+
+  const Obj<ALE::Mesh::topology_type::label_sequence>& vertices = m->getTopology()->depthStratum(0, 0);
+  SectionReal                       section;
+  Obj<ALE::Mesh::real_section_type> s;
+
+  ierr = MeshGetSectionReal(mesh, "default", &section);
+  ierr = PetscObjectSetName((PetscObject) section, "displacement");
+  ierr = MeshSetSectionReal(mesh, section);
+  ierr = SectionRealGetSection(section, s);
+  s->setFiberDimensionByDepth(0, 0, 3);
+  for(ALE::Mesh::topology_type::label_sequence::iterator v_iter = vertices->begin(); v_iter != vertices->end(); ++v_iter) {
+    int numConstraints = boundaries->getFiberDimension(patch, *v_iter);
+
+    if (numConstraints > 0) {
+      if (m->debug()) {
+        std::cout << "[" << rank << "]Setting dimension of " << *v_iter << " to " << 3 - numConstraints << std::endl;
+      }
+      s->setFiberDimension(0, *v_iter, 3 - numConstraints);
+    }
+  }
+  s->allocate();
+  if (m->debug()) {
+    s->view("Displacement field");
+  }
+  ierr = SectionRealDestroy(section);
+  debug << journal::at(__HERE__) << "[" << rank << "]Created displacement Field"  << journal::endl;
+
+  m->getFactory()->constructInverseOrder(m->getFactory()->getLocalNumbering(m->getTopology(), 0, m->getTopology()->depth()));
+
+  // return
+  PyObject *pyMesh = PyCObject_FromVoidPtr(mesh, NULL);
+  //PyObject *pyMesh = PyCObject_FromVoidPtr(mesh.ptr(), NULL);
+  //mesh.int_allocator->del(mesh.refCnt);
+  //mesh.refCnt = NULL;
+  return pyMesh;
+}
+
+// Create a PETSc Mat
+char pypylith3d_createPETScMat__doc__[] = "";
+char pypylith3d_createPETScMat__name__[] = "createPETScMat";
+
+PyObject * pypylith3d_createPETScMat(PyObject *, PyObject *args)
+{
+  using ALE::Obj;
+  PyObject *pyMesh, *pyA, *pyRhs, *pySol;
+  MPI_Comm comm = PETSC_COMM_WORLD;
+  Mat      A;
+  Vec      rhs, sol;
+  PetscErrorCode ierr;
+
+  int ok = PyArg_ParseTuple(args, (char *) "O:createPETScMat", &pyMesh);
+  if (!ok) {
+    return 0;
+  }
+
+  Mesh mesh = (Mesh) PyCObject_AsVoidPtr(pyMesh);
+  Obj<ALE::Mesh> m;
+
+  ierr = MeshGetMesh(mesh, m);
+  const ALE::Obj<ALE::Mesh::order_type>& offsets = m->getFactory()->getGlobalOrder(m->getTopology(), 0, "displacement", m->getRealSection("displacement")->getAtlas());
+  int localSize = offsets->getLocalSize();
+  int globalSize = offsets->getGlobalSize();
+
+  if (MatCreate(comm, &A)) {
+    PyErr_SetString(PyExc_RuntimeError, "Could not create PETSc Mat");
+    return 0;
+  }
+  if (MatSetSizes(A, localSize, localSize, globalSize, globalSize)) {
+    PyErr_SetString(PyExc_RuntimeError, "Could not set sizes for PETSc Mat");
+    return 0;
+  }
+  if (VecCreate(comm, &rhs)) {
+    PyErr_SetString(PyExc_RuntimeError, "Could not create PETSc Rhs");
+    return 0;
+  }
+  if (VecSetSizes(rhs, localSize, globalSize)) {
+    PyErr_SetString(PyExc_RuntimeError, "Could not set sizes for PETSc Rhs");
+    return 0;
+  }
+  if (VecSetFromOptions(rhs)) {
+    PyErr_SetString(PyExc_RuntimeError, "Could not set options for PETSc Rhs");
+    return 0;
+  }
+  if (VecDuplicate(rhs, &sol)) {
+    PyErr_SetString(PyExc_RuntimeError, "Could not create PETSc Sol");
+    return 0;
+  }
+
+  ierr = PetscObjectCompose((PetscObject) A, "mesh", (PetscObject) mesh);
+
+  VecScatter injection = NULL;
+  ierr = MeshGetGlobalScatter(mesh, &injection);
+  ierr = PetscObjectCompose((PetscObject) rhs, "mesh",      (PetscObject) mesh);
+  ierr = PetscObjectCompose((PetscObject) rhs, "injection", (PetscObject) injection);
+  ierr = PetscObjectCompose((PetscObject) sol, "mesh",      (PetscObject) mesh);
+  ierr = PetscObjectCompose((PetscObject) sol, "injection", (PetscObject) injection);
+
+  ierr = MatSetFromOptions(A);
+  ierr = preallocateMatrix(m->getTopology(), m->getRealSection("displacement")->getAtlas(), m->getFactory()->getGlobalOrder(m->getTopology(), 0, "displacement", m->getRealSection("displacement")->getAtlas()), A);
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "Created PETSc Mat: " << localSize << " " << globalSize
+    << journal::endl;
+
+  // return Py_None;
+  pyA = PyCObject_FromVoidPtr(A, NULL);
+  pyRhs = PyCObject_FromVoidPtr(rhs, NULL);
+  pySol = PyCObject_FromVoidPtr(sol, NULL);
+  return Py_BuildValue((char *) "NNN", pyA, pyRhs, pySol);
+}
+
+// Destroy a PETSc Mat
+
+char pypylith3d_destroyPETScMat__doc__[] = "";
+char pypylith3d_destroyPETScMat__name__[] = "destroyPETScMat";
+
+PyObject * pypylith3d_destroyPETScMat(PyObject *, PyObject *args)
+{
+  PyObject *pyA,*pyRhs, *pySol;
+  Mat A;
+  Vec rhs, sol;
+
+  int ok = PyArg_ParseTuple(args, (char *) "OOO:destroyPETScMat", &pyA, &pyRhs, &pySol);
+  if (!ok) {
+    return 0;
+  }
+
+  A = (Mat) PyCObject_AsVoidPtr(pyA);
+  if (MatDestroy(A)) {
+    PyErr_SetString(PyExc_RuntimeError, "Could not destroy PETSc Mat");
+    return 0;
+  }
+  rhs = (Vec) PyCObject_AsVoidPtr(pyRhs);
+  if (VecDestroy(rhs)) {
+    PyErr_SetString(PyExc_RuntimeError, "Could not destroy PETSc Rhs");
+    return 0;
+  }
+  sol = (Vec) PyCObject_AsVoidPtr(pySol);
+  if (VecDestroy(sol)) {
+    PyErr_SetString(PyExc_RuntimeError, "Could not destroy PETSc Sol");
+    return 0;
+  }
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "Destroyed PETSc Mat"
+    << journal::endl;
+
+  // return Py_None;
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+PetscErrorCode updateDisplacement(SectionReal displacement, Vec sol) {
+  VecScatter     injection;
+  Vec            lv;
+  PetscErrorCode ierr;
+
+  PetscFunctionBegin;
+  ierr = SectionRealGetLocalVector(displacement, &lv);CHKERRQ(ierr);
+  ierr = PetscObjectQuery((PetscObject) sol, "injection", (PetscObject *) &injection);CHKERRQ(ierr);
+  ierr = VecScatterBegin(sol, lv, INSERT_VALUES, SCATTER_REVERSE, injection);CHKERRQ(ierr);
+  ierr = VecScatterEnd(sol, lv, INSERT_VALUES, SCATTER_REVERSE, injection);CHKERRQ(ierr);
+  ierr = VecDestroy(lv);CHKERRQ(ierr);
+  PetscFunctionReturn(0);
+}
+
+// Create complete displacement field by adding BC
+PetscErrorCode createFullDisplacement(Mesh mesh, SectionReal *fullDisplacement) {
+  using ALE::Obj;
+  Obj<ALE::Mesh> m;
+  PetscErrorCode ierr;
+
+  PetscFunctionBegin;
+  ierr = MeshGetMesh(mesh, m);CHKERRQ(ierr);
+  if (!m->hasRealSection("full_displacement")) {
+    const Obj<ALE::Mesh::topology_type::sheaf_type>& patches    = m->getTopology()->getPatches();
+    const Obj<ALE::Mesh::real_section_type>&         full       = m->getRealSection("full_displacement");
+
+    for(ALE::Mesh::topology_type::sheaf_type::iterator p_iter = patches->begin(); p_iter != patches->end(); ++p_iter) {
+      full->setFiberDimensionByDepth(p_iter->first, 0, 3);
+    }
+    full->allocate();
+  }
+  const Obj<ALE::Mesh::foliated_section_type>&     boundaries = m->getBoundariesNew();
+  const Obj<ALE::Mesh::topology_type::sheaf_type>& patches    = m->getTopology()->getPatches();
+  const Obj<ALE::Mesh::real_section_type>&         disp       = m->getRealSection("displacement");
+  const Obj<ALE::Mesh::real_section_type>&         full       = m->getRealSection("full_displacement");
+
+  for(ALE::Mesh::topology_type::sheaf_type::iterator p_iter = patches->begin(); p_iter != patches->end(); ++p_iter) {
+    const ALE::Obj<ALE::Mesh::topology_type::label_sequence>& vertices = m->getTopology()->depthStratum(p_iter->first, 0);
+
+    for(ALE::Mesh::topology_type::label_sequence::iterator v_iter = vertices->begin(); v_iter != vertices->end(); ++v_iter) {
+      const ALE::Mesh::foliated_section_type::value_type *constVal = boundaries->restrict(p_iter->first, *v_iter);
+      const ALE::Mesh::real_section_type::value_type     *array    = disp->restrict(p_iter->first, *v_iter);
+      const int numConst = boundaries->size(p_iter->first, *v_iter);
+      const int dim      = disp->getFiberDimension(p_iter->first, *v_iter);
+      double    values[3];
+      int       v = 0;
+
+      for(int c = 0; c < 3; c++) {
+        int i;
+
+        for(i = 0; i < numConst; i++) {
+          if (constVal[i].first == c) {
+            values[c] = constVal[i].second;
+            break;
+          }
+        }
+        if (i == numConst) {
+          values[c] = array[v++];
+        }
+      }
+      if (v != dim) {
+        std::cout << "ERROR: Invalid size " << v << " used for " << *v_iter << " with index " << disp->getIndex(p_iter->first, *v_iter) << std::endl;
+      }
+      full->updateAdd(p_iter->first, *v_iter, values);
+    }
+  }
+  ierr = MeshGetSectionReal(mesh, "full_displacement", fullDisplacement);CHKERRQ(ierr);
+  PetscFunctionReturn(0);
+}
+
+char pypylith3d_outputMesh__doc__[] = "";
+char pypylith3d_outputMesh__name__[] = "outputMesh";
+
+PyObject * pypylith3d_outputMesh(PyObject *, PyObject *args)
+{
+  using ALE::Obj;
+  PyObject *pyMesh, *pySol;
+  char     *meshBaseFile;
+
+  int ok = PyArg_ParseTuple(args, (char *) "sOO:outputMesh", &meshBaseFile, &pyMesh, &pySol);
+  if (!ok) {
+    return 0;
+  }
+
+  Mesh           mesh = (Mesh) PyCObject_AsVoidPtr(pyMesh);
+  Vec            sol  = (Vec)  PyCObject_AsVoidPtr(pySol);
+  MPI_Comm       comm;
+  SectionReal    displacement, fullDisplacement;
+  std::string    filename(meshBaseFile);
+  PetscViewer    viewer;
+  //Vec       partition;
+  PetscTruth     hasMaterial;
+  PetscErrorCode ierr;
+
+  ierr = PetscObjectGetComm((PetscObject) mesh, &comm);
+  ierr = MeshGetSectionReal(mesh, "displacement", &displacement);
+  ierr = updateDisplacement(displacement, sol);
+  ierr = createFullDisplacement(mesh, &fullDisplacement);
+  ierr = PetscViewerCreate(comm, &viewer);
+  ierr = PetscViewerSetType(viewer, PETSC_VIEWER_ASCII);
+  ierr = PetscViewerSetFormat(viewer, PETSC_VIEWER_ASCII_VTK);
+  filename += ".vtk";
+  ierr = PetscViewerFileSetName(viewer, filename.c_str());
+  ierr = MeshView(mesh, viewer);
+  ierr = SectionRealView(fullDisplacement, viewer);
+  ierr = MeshHasSectionInt(mesh, "material", &hasMaterial);
+  if (hasMaterial) {
+    SectionInt material;
+
+    ierr = PetscViewerPushFormat(viewer, PETSC_VIEWER_ASCII_VTK_CELL);
+    ierr = MeshGetSectionInt(mesh, "material", &material);
+    ierr = SectionIntView(material, viewer);
+    ierr = PetscViewerPopFormat(viewer);
+    ierr = SectionIntDestroy(material);
+  }
+  //SectionIntView(partition, viewer);
+  ierr = PetscViewerDestroy(viewer);
+  ierr = SectionRealDestroy(displacement);
+  ierr = SectionRealDestroy(fullDisplacement);
+
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "Output PETSc Mesh and Solution"
+    << journal::endl;
+
+  // return Py_None;
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+#if 0
+#include "Numeric/arrayobject.h"
+
+char pypylith3d_interpolatePoints__doc__[] = "";
+char pypylith3d_interpolatePoints__name__[] = "interpolatePoints";
+
+PyObject * pypylith3d_interpolatePoints(PyObject *, PyObject *args)
+{
+  using ALE::Obj;
+  PyObject      *pyMesh, *pySol;
+  PyArrayObject *pyPoints;
+
+  int ok = PyArg_ParseTuple(args, (char *) "OOO!:interpolatePoints", &pyMesh, &pySol, &PyArray_Type, &pyPoints);
+  if (!ok) {
+    return 0;
+  }
+  if ((pyPoints->nd != 2) || (pyPoints->descr->type_num != PyArray_DOUBLE)) {
+    PyErr_SetString(PyExc_ValueError, "points must be a 2d array with double values");
+    return 0;
+  }
+  if (pyPoints->dimensions[1] != 3) {
+    PyErr_SetString(PyExc_ValueError, "points must be a 3d");
+    return 0;
+  }
+  if ((pyPoints->strides[0] != 3 * sizeof(double)) || (pyPoints->strides[1] != sizeof(double))) {
+    PyErr_SetString(PyExc_ValueError, "points must be a contiguous array");
+    return 0;
+  }
+
+  Mesh           mesh = (Mesh) PyCObject_AsVoidPtr(pyMesh);
+  Vec            sol  = (Vec)  PyCObject_AsVoidPtr(pySol);
+  SectionReal    displacement, fullDisplacement;
+  const int      numPoints = pyPoints->dimensions[0];
+  double        *values;
+  PetscErrorCode ierr;
+
+  ierr = MeshGetSectionReal(mesh, "displacement", &displacement);
+  ierr = updateDisplacement(displacement, sol);
+  ierr = createFullDisplacement(mesh, &fullDisplacement);
+  ierr = MeshInterpolatePoints(mesh, fullDisplacement, numPoints, (double *) pyPoints->data, &values);
+  ierr = SectionRealDestroy(displacement);
+  ierr = PetscFree(values);
+
+  int            dims[2]  = {numPoints, 3};
+  PyArrayObject *pyValues = (PyArrayObject *) PyArray_FromDims(2, dims, PyArray_DOUBLE);
+  double        *data     = (double *) pyValues->data;
+
+  for(int p = 0; p < numPoints; ++p) {
+    for(int d = 0; d < 3; d++) {
+      data[p*3+d] = values[p*3+d];
+    }
+  }
+
+  ierr = PetscFree(values);
+  journal::debug_t debug("pylith3d");
+  debug
+    << journal::at(__HERE__)
+    << "Interpolated points"
+    << journal::endl;
+
+  return Py_BuildValue((char *) "N", pyValues);
+}
+#endif
+
+// End of file

Copied: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/mesh.h (from rev 6472, short/3D/PyLith/branches/pylith-0.8/pylith3d/module/scanner.h)
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/scanner.h	2007-03-30 05:03:55 UTC (rev 6472)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/mesh.h	2007-03-30 21:05:09 UTC (rev 6475)
@@ -0,0 +1,60 @@
+// -*- C++ -*-
+// 
+//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
+//
+//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
+//
+//  Permission is hereby granted, free of charge, to any person obtaining
+//  a copy of this software and associated documentation files (the
+//  "Software"), to deal in the Software without restriction, including
+//  without limitation the rights to use, copy, modify, merge, publish,
+//  distribute, sublicense, and/or sell copies of the Software, and to
+//  permit persons to whom the Software is furnished to do so, subject to
+//  the following conditions:
+//
+//  The above copyright notice and this permission notice shall be
+//  included in all copies or substantial portions of the Software.
+//
+//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
+//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
+//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
+//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
+//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// 
+
+#if !defined(pypylith3d_mesh_h)
+#define pypylith3d_mesh_h
+
+// process mesh
+extern char pypylith3d_processMesh__name__[];
+extern char pypylith3d_processMesh__doc__[];
+extern "C"
+PyObject * pypylith3d_processMesh(PyObject *, PyObject *);
+
+// create a PETSc Mat
+extern char pypylith3d_createPETScMat__name__[];
+extern char pypylith3d_createPETScMat__doc__[];
+extern "C"
+PyObject * pypylith3d_createPETScMat(PyObject *, PyObject *);
+
+// destroy a PETSc Mat
+extern char pypylith3d_destroyPETScMat__name__[];
+extern char pypylith3d_destroyPETScMat__doc__[];
+extern "C"
+PyObject * pypylith3d_destroyPETScMat(PyObject *, PyObject *);
+
+// output a PETSc Mesh and Fields
+extern char pypylith3d_outputMesh__name__[];
+extern char pypylith3d_outputMesh__doc__[];
+extern "C"
+PyObject * pypylith3d_outputMesh(PyObject *, PyObject *);
+
+#endif
+
+// End of file

Modified: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/misc.cc
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/misc.cc	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/misc.cc	2007-03-30 21:05:09 UTC (rev 6475)
@@ -36,43 +36,8 @@
 
 #include "misc.h"
 #include "exceptionhandler.h"
-#include "pylith3d_externs.h"
 
 
-// try_binio
-
-char pypylith3d_try_binio__doc__[] = "";
-char pypylith3d_try_binio__name__[] = "try_binio";
-
-PyObject * pypylith3d_try_binio(PyObject *, PyObject *args)
-{
-  int unit;
-
-  int ok = PyArg_ParseTuple(args, "i:try_binio",
-			    &unit);
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-
-  try_binio_f(&unit,
-	      &errorcode,
-	      errorstring,
-	      sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-    
-
 // copyright
 
 char pypylith3d_copyright__doc__[] = "";

Modified: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/misc.h
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/misc.h	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/misc.h	2007-03-30 21:05:09 UTC (rev 6475)
@@ -31,12 +31,6 @@
 #if !defined(pypylith3d_misc_h)
 #define pypylith3d_misc_h
 
-// try_binio
-extern char pypylith3d_try_binio__name__[];
-extern char pypylith3d_try_binio__doc__[];
-extern "C"
-PyObject * pypylith3d_try_binio(PyObject *, PyObject *);
-
 // copyright
 extern char pypylith3d_copyright__name__[];
 extern char pypylith3d_copyright__doc__[];

Deleted: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/numbering.cc
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/numbering.cc	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/numbering.cc	2007-03-30 21:05:09 UTC (rev 6475)
@@ -1,282 +0,0 @@
-// -*- C++ -*-
-// 
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
-//
-//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
-//
-//  Permission is hereby granted, free of charge, to any person obtaining
-//  a copy of this software and associated documentation files (the
-//  "Software"), to deal in the Software without restriction, including
-//  without limitation the rights to use, copy, modify, merge, publish,
-//  distribute, sublicense, and/or sell copies of the Software, and to
-//  permit persons to whom the Software is furnished to do so, subject to
-//  the following conditions:
-//
-//  The above copyright notice and this permission notice shall be
-//  included in all copies or substantial portions of the Software.
-//
-//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 
-
-#include <petscmat.h>
-#include <portinfo>
-#include "journal/debug.h"
-
-#include <Python.h>
-
-#include "numbering.h"
-#include "exceptionhandler.h"
-#include "pylith3d_externs.h"
-#include <stdio.h>
-#include <string.h>
-
-
-
-// Assign equation numbers to Iwink and Iwinkx arrays, and compact
-// Wink and Winkx arrays to correspond to assigned BC.
-
-char pypylith3d_assign_wink__doc__[] = "";
-char pypylith3d_assign_wink__name__[] = "assign_wink";
-
-PyObject * pypylith3d_assign_wink(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToWinkdef;
-  PyObject* pyPointerToWink;
-  PyObject* pyPointerToIwinkdef;
-  PyObject* pyPointerToIwinkid;
-  PyObject* pyPointerToIwink;
-  PyObject* pyPointerToId;
-  int numberNodes;
-  int numberWinklerForces;
-  int numberWinklerEntries;
-
-  int ok = PyArg_ParseTuple(args, "OOOOOOiii:assign_wink",
-			    &pyPointerToWinkdef,
-			    &pyPointerToWink,
-			    &pyPointerToIwinkdef,
-			    &pyPointerToIwinkid,
-			    &pyPointerToIwink,
-			    &pyPointerToId,
-			    &numberNodes,
-			    &numberWinklerForces,
-			    &numberWinklerEntries);
-
-  if (!ok) {
-    return 0;
-  }
-
-  double* pointerToWinkdef = (double*) PyCObject_AsVoidPtr(pyPointerToWinkdef);
-  double* pointerToWink = (double*) PyCObject_AsVoidPtr(pyPointerToWink);
-  int* pointerToIwinkdef = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkdef);
-  int* pointerToIwinkid = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkid);
-  int* pointerToIwink = (int*) PyCObject_AsVoidPtr(pyPointerToIwink);
-  int* pointerToId = (int*) PyCObject_AsVoidPtr(pyPointerToId);
-
-  assign_wink_f(pointerToWinkdef,
-		pointerToWink,
-		pointerToIwinkdef,
-		pointerToIwinkid,
-		pointerToIwink,
-		pointerToId,
-		&numberNodes,
-		&numberWinklerForces,
-		&numberWinklerEntries);
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberWinklerForces:" << numberWinklerForces
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-    
-
-// Create Id and Idx arrays, and determine the number of equations.
-
-char pypylith3d_create_id__doc__[] = "";
-char pypylith3d_create_id__name__[] = "create_id";
-
-PyObject * pypylith3d_create_id(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToId;
-  PyObject* pyPointerToIdx;
-  PyObject* pyPointerToIbond;
-  PyObject* pyPointerToNslip;
-  PyObject* pyPointerToIdslp;
-  int numberSlipperyNodeEntries;
-  int numberNodes;
-  int totalNumberSlipperyNodes;
-
-  int ok = PyArg_ParseTuple(args, "OOOOOiii:create_id",
-			    &pyPointerToId,
-			    &pyPointerToIdx,
-			    &pyPointerToIbond,
-			    &pyPointerToNslip,
-			    &pyPointerToIdslp,
-			    &numberSlipperyNodeEntries,
-			    &numberNodes,
-			    &totalNumberSlipperyNodes);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int* pointerToId = (int*) PyCObject_AsVoidPtr(pyPointerToId);
-  int* pointerToIdx = (int*) PyCObject_AsVoidPtr(pyPointerToIdx);
-  int* pointerToIbond = (int*) PyCObject_AsVoidPtr(pyPointerToIbond);
-  int* pointerToNslip = (int*) PyCObject_AsVoidPtr(pyPointerToNslip);
-  int* pointerToIdslp = (int*) PyCObject_AsVoidPtr(pyPointerToIdslp);
-  int numberGlobalEquations = 0;
-
-  create_id_f(pointerToId,
-	  pointerToIdx,
-	  pointerToIbond,
-	  pointerToNslip,
-	  pointerToIdslp,
-	  &numberSlipperyNodeEntries,
-	  &numberNodes,
-	  &totalNumberSlipperyNodes,
-	  &numberGlobalEquations);
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberGlobalEquations:" << numberGlobalEquations
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_BuildValue("i", numberGlobalEquations);
-}
-
-
-// Form id array for split nodes
-
-char pypylith3d_id_split__doc__[] = "";
-char pypylith3d_id_split__name__[] = "id_split";
-
-PyObject * pypylith3d_id_split(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToNfault;
-  PyObject* pyPointerToIdftn;
-  int numberNodes;
-  int numberSplitNodeEntries;
-  int totalNumberSplitNodes;
-
-  int ok = PyArg_ParseTuple(args, "OOiii:id_split",
-			    &pyPointerToNfault,
-			    &pyPointerToIdftn,
-			    &numberNodes,
-			    &numberSplitNodeEntries,
-			    &totalNumberSplitNodes);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int* pointerToNfault = (int*) PyCObject_AsVoidPtr(pyPointerToNfault);
-  int* pointerToIdftn = (int*) PyCObject_AsVoidPtr(pyPointerToIdftn);
-
-  id_split_f(pointerToNfault,
-	     pointerToIdftn,
-	     &numberNodes,
-	     &numberSplitNodeEntries,
-	     &totalNumberSplitNodes);
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberSplitNodeEntries:" << numberSplitNodeEntries
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-    
-
-// Find closest fault neighbors for slippery nodes
-
-char pypylith3d_nfind__doc__[] = "";
-char pypylith3d_nfind__name__[] = "nfind";
-
-PyObject * pypylith3d_nfind(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToX;
-  PyObject* pyPointerToXtmp;
-  PyObject* pyPointerToIdslp;
-  PyObject* pyPointerToIpslp;
-  PyObject* pyPointerToItmp;
-  PyObject* pyPointerToItmp1;
-  PyObject* pyPointerToItmp2;
-  PyObject* pyPointerToNslip;
-  int numberSlipperyNodeEntries;
-  int totalNumberSlipperyNodes;
-  int numberNodes;
-
-  int ok = PyArg_ParseTuple(args, "OOOOOOOOiii:nfind",
-			    &pyPointerToX,
-			    &pyPointerToXtmp,
-			    &pyPointerToIdslp,
-			    &pyPointerToIpslp,
-			    &pyPointerToItmp,
-			    &pyPointerToItmp1,
-			    &pyPointerToItmp2,
-			    &pyPointerToNslip,
-			    &numberSlipperyNodeEntries,
-			    &totalNumberSlipperyNodes,
-			    &numberNodes);
-
-  if (!ok) {
-    return 0;
-  }
-
-  double* pointerToX = (double*) PyCObject_AsVoidPtr(pyPointerToX);
-  double* pointerToXtmp = (double*) PyCObject_AsVoidPtr(pyPointerToXtmp);
-  int* pointerToIdslp = (int*) PyCObject_AsVoidPtr(pyPointerToIdslp);
-  int* pointerToIpslp = (int*) PyCObject_AsVoidPtr(pyPointerToIpslp);
-  int* pointerToItmp = (int*) PyCObject_AsVoidPtr(pyPointerToItmp);
-  int* pointerToItmp1 = (int*) PyCObject_AsVoidPtr(pyPointerToItmp1);
-  int* pointerToItmp2 = (int*) PyCObject_AsVoidPtr(pyPointerToItmp2);
-  int* pointerToNslip = (int*) PyCObject_AsVoidPtr(pyPointerToNslip);
-
-  nfind_f(pointerToX,
-	  pointerToXtmp,
-	  pointerToIdslp,
-	  pointerToIpslp,
-	  pointerToItmp,
-	  pointerToItmp1,
-	  pointerToItmp2,
-	  pointerToNslip,
-	  &numberSlipperyNodeEntries,
-	  &totalNumberSlipperyNodes,
-	  &numberNodes);
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "pointerToX:" << pointerToX
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-// version
-// $Id: numbering.cc,v 1.4 2005/06/07 19:39:11 willic3 Exp $
-
-// End of file

Deleted: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/numbering.h
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/numbering.h	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/numbering.h	2007-03-30 21:05:09 UTC (rev 6475)
@@ -1,63 +0,0 @@
-// -*- C++ -*-
-// 
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
-//
-//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
-//
-//  Permission is hereby granted, free of charge, to any person obtaining
-//  a copy of this software and associated documentation files (the
-//  "Software"), to deal in the Software without restriction, including
-//  without limitation the rights to use, copy, modify, merge, publish,
-//  distribute, sublicense, and/or sell copies of the Software, and to
-//  permit persons to whom the Software is furnished to do so, subject to
-//  the following conditions:
-//
-//  The above copyright notice and this permission notice shall be
-//  included in all copies or substantial portions of the Software.
-//
-//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 
-
-#if !defined(pypylith3d_numbering_h)
-#define pypylith3d_numbering_h
-
-// assign equation numbers for Winkler BC
-extern char pypylith3d_assign_wink__name__[];
-extern char pypylith3d_assign_wink__doc__[];
-extern "C"
-PyObject * pypylith3d_assign_wink(PyObject *, PyObject *);
-
-// create id array
-extern char pypylith3d_create_id__name__[];
-extern char pypylith3d_create_id__doc__[];
-extern "C"
-PyObject * pypylith3d_create_id(PyObject *, PyObject *);
-
-// form id array for split nodes
-extern char pypylith3d_id_split__name__[];
-extern char pypylith3d_id_split__doc__[];
-extern "C"
-PyObject * pypylith3d_id_split(PyObject *, PyObject *);
-
-// find closest fault neignbors for slippery nodes
-extern char pypylith3d_nfind__name__[];
-extern char pypylith3d_nfind__doc__[];
-extern "C"
-PyObject * pypylith3d_nfind(PyObject *, PyObject *);
-
-#endif
-
-// version
-// $Id: numbering.h,v 1.3 2005/04/21 23:17:42 willic3 Exp $
-
-// End of file

Deleted: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/parser.cc
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/parser.cc	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/parser.cc	2007-03-30 21:05:09 UTC (rev 6475)
@@ -1,970 +0,0 @@
-// -*- C++ -*-
-// 
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
-//
-//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
-//
-//  Permission is hereby granted, free of charge, to any person obtaining
-//  a copy of this software and associated documentation files (the
-//  "Software"), to deal in the Software without restriction, including
-//  without limitation the rights to use, copy, modify, merge, publish,
-//  distribute, sublicense, and/or sell copies of the Software, and to
-//  permit persons to whom the Software is furnished to do so, subject to
-//  the following conditions:
-//
-//  The above copyright notice and this permission notice shall be
-//  included in all copies or substantial portions of the Software.
-//
-//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 
-
-#include <petscmat.h>
-#include <portinfo>
-#include "journal/debug.h"
-
-#include <Python.h>
-
-#include "parser.h"
-#include "exceptionhandler.h"
-#include "pylith3d_externs.h"
-#include <stdio.h>
-#include <string.h>
-
-
-// Read boundary conditions
-
-char pypylith3d_read_bc__doc__[] = "";
-char pypylith3d_read_bc__name__[] = "read_bc";
-
-PyObject * pypylith3d_read_bc(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToBond;
-  double displacementScaleFactor;
-  double velocityScaleFactor;
-  double forceScaleFactor;
-  PyObject* pyPointerToIbond;
-  int numberNodes;
-  int numberBcEntries;
-  int f77FileInput;
-  char* bcInputFile;
-
-  int ok = PyArg_ParseTuple(args, "OdddOiiis:read_bc",
-			    &pyPointerToBond,
-			    &displacementScaleFactor,
-			    &velocityScaleFactor,
-			    &forceScaleFactor,
-			    &pyPointerToIbond,
-			    &numberNodes,
-			    &numberBcEntries,
-			    &f77FileInput,
-			    &bcInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  double* pointerToBond = (double*) PyCObject_AsVoidPtr(pyPointerToBond);
-  int* pointerToIbond = (int*) PyCObject_AsVoidPtr(pyPointerToIbond);
-  int numberConcForces = 0;
-
-  read_bc_f(pointerToBond,
-	    &displacementScaleFactor,
-	    &velocityScaleFactor,
-	    &forceScaleFactor,
-	    pointerToIbond,
-	    &numberNodes,
-	    &numberBcEntries,
-	    &numberConcForces,
-	    &f77FileInput,
-	    bcInputFile,
-	    &errorcode,
-	    errorstring,
-	    strlen(bcInputFile),
-	    sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberBcEntries:" << numberBcEntries
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_BuildValue("i", numberConcForces);
-}
-
-
-// Read connectivities
-
-char pypylith3d_read_connect__doc__[] = "";
-char pypylith3d_read_connect__name__[] = "read_connect";
-
-PyObject * pypylith3d_read_connect(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToIen;
-  PyObject* pyPointerToMat;
-  int numberVolumeElementNodes;
-  int numberVolumeElements;
-  int numberNodes;
-  int numberVolumeElementFamilies;
-  int f77FileInput;
-  char* connectivityInputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOiiiiis:read_connect",
-                            &pyPointerToIen,
-                            &pyPointerToMat,
-                            &numberVolumeElementNodes,
-                            &numberVolumeElements,
-                            &numberNodes,
-                            &numberVolumeElementFamilies,
-                            &f77FileInput,
-                            &connectivityInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int* pointerToIen = (int*) PyCObject_AsVoidPtr(pyPointerToIen);
-  int* pointerToMat = (int*) PyCObject_AsVoidPtr(pyPointerToMat);
-
-  read_connect_f(pointerToIen,
-		 pointerToMat,
-		 &numberVolumeElementNodes,
-                 &numberVolumeElements,
-                 &numberNodes,
-                 &numberVolumeElementFamilies,
-		 &f77FileInput,
-		 connectivityInputFile,
-		 &errorcode,
-		 errorstring,
-		 strlen(connectivityInputFile),
-		 sizeof(errorstring));
-
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberVolumeElementFamilies:" << numberVolumeElementFamilies
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Read coordinates
-
-char pypylith3d_read_coords__doc__[] = "";
-char pypylith3d_read_coords__name__[] = "read_coords";
-
-PyObject * pypylith3d_read_coords(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToX;
-  double coordinateScaleFactor;
-  int numberNodes;
-  int f77FileInput;
-  char* coordinateInputFile;
-
-  int ok = PyArg_ParseTuple(args, "Odiis:read_coords",
-			    &pyPointerToX,
-			    &coordinateScaleFactor,
-			    &numberNodes,
-			    &f77FileInput,
-			    &coordinateInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  double* pointerToX = (double*) PyCObject_AsVoidPtr(pyPointerToX);
-
-  read_coords_f(pointerToX,
-		&coordinateScaleFactor,
-		&numberNodes,
-		&f77FileInput,
-		coordinateInputFile,
-		&errorcode,
-		errorstring,
-		strlen(coordinateInputFile),
-		sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "coordinateScaleFactor:" << coordinateScaleFactor
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Read differential forces
-
-char pypylith3d_read_diff__doc__[] = "";
-char pypylith3d_read_diff__name__[] = "read_diff";
-
-PyObject * pypylith3d_read_diff(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToDiforc;
-  PyObject* pyPointerToNslip;
-  PyObject* pyPointerToIdhist;
-  int numberSlipperyNodeEntries;
-  int numberDifferentialForceEntries;
-  int numberNodes;
-  int f77FileInput;
-  char* differentialForceInputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOOiiiis:read_diff",
-			    &pyPointerToDiforc,
-			    &pyPointerToNslip,
-			    &pyPointerToIdhist,
-			    &numberSlipperyNodeEntries,
-			    &numberDifferentialForceEntries,
-			    &numberNodes,
-			    &f77FileInput,
-			    &differentialForceInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  double* pointerToDiforc = (double*) PyCObject_AsVoidPtr(pyPointerToDiforc);
-  int* pointerToNslip = (int*) PyCObject_AsVoidPtr(pyPointerToNslip);
-  int* pointerToIdhist = (int*) PyCObject_AsVoidPtr(pyPointerToIdhist);
-
-  read_diff_f(pointerToDiforc,
-	      pointerToNslip,
-	      pointerToIdhist,
-	      &numberSlipperyNodeEntries,
-	      &numberDifferentialForceEntries,
-	      &numberNodes,
-	      &f77FileInput,
-	      differentialForceInputFile,
-	      &errorcode,
-	      errorstring,
-	      strlen(differentialForceInputFile),
-	      sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberDifferentialForceEntries:" << numberDifferentialForceEntries
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Read time steps at which full output is desired
-
-char pypylith3d_read_fuldat__doc__[] = "";
-char pypylith3d_read_fuldat__name__[] = "read_fuldat";
-
-PyObject * pypylith3d_read_fuldat(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToIprint;
-  int numberFullOutputs;
-  int analysisTypeInt;
-  int numberCycles;
-  int totalNumberTimeSteps;
-  int f77FileInput;
-  char* fullOutputInputFile;
-
-  int ok = PyArg_ParseTuple(args, "Oiiiiis:read_fuldat",
-			    &pyPointerToIprint,
-			    &numberFullOutputs,
-			    &analysisTypeInt,
-			    &numberCycles,
-			    &totalNumberTimeSteps,
-			    &f77FileInput,
-			    &fullOutputInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int* pointerToIprint = (int*) PyCObject_AsVoidPtr(pyPointerToIprint);
-
-  read_fuldat_f(pointerToIprint,
-		&numberFullOutputs,
-		&analysisTypeInt,
-		&numberCycles,
-		&totalNumberTimeSteps,
-		&f77FileInput,
-		fullOutputInputFile,
-		&errorcode,
-		errorstring,
-		strlen(fullOutputInputFile),
-		sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberFullOutputs:" << numberFullOutputs
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Read load histories
-
-char pypylith3d_read_hist__doc__[] = "";
-char pypylith3d_read_hist__name__[] = "read_hist";
-
-PyObject * pypylith3d_read_hist(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToHistry;
-  PyObject* pyPointerToTimes;
-  int numberLoadHistories;
-  int totalNumberTimeSteps;
-  int f77FileInput;
-  char* loadHistoryInputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOiiis:read_hist",
-			    &pyPointerToHistry,
-			    &pyPointerToTimes,
-			    &numberLoadHistories,
-			    &totalNumberTimeSteps,
-			    &f77FileInput,
-			    &loadHistoryInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  double* pointerToHistry = (double*) PyCObject_AsVoidPtr(pyPointerToHistry);
-  double* pointerToTimes = (double*) PyCObject_AsVoidPtr(pyPointerToTimes);
-
-  read_hist_f(pointerToHistry,
-	      pointerToTimes,
-	      &numberLoadHistories,
-	      &totalNumberTimeSteps,
-	      &f77FileInput,
-	      loadHistoryInputFile,
-	      &errorcode,
-	      errorstring,
-	      strlen(loadHistoryInputFile),
-	      sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberLoadHistories:" << numberLoadHistories
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Read element prestresses
-
-// char pypylith3d_read_prestr__doc__[] = "";
-// char pypylith3d_read_prestr__name__[] = "read_prestr";
-
-// PyObject * pypylith3d_read_prestr(PyObject *, PyObject *args)
-// {
-  // PyObject* pyPointerToStn;
-  // PyObject* pyPointerToSt0;
-  // PyObject* pyPointerToListArrayPrscal;
-  // int numberStressComponents;
-  // int numberGaussPoints;
-  // int numberPrestressGaussPoints;
-  // int numberElements;
-  // int numberPrestressEntries;
-  // int prestressAutoComputeInt;
-  // int asciiOutputInt;
-  // int f77FileInput;
-  // int f77AsciiOutput;
-  // char* prestressInputFile;
-  // char* asciiOutputFile;
-
-  // int ok = PyArg_ParseTuple(args, "OOOiiiiiiiiiss:read_prestr",
-			    // &pyPointerToStn,
-			    // &pyPointerToSt0,
-			    // &pyPointerToListArrayPrscal,
-			    // &numberStressComponents,
-			    // &numberGaussPoints,
-			    // &numberPrestressGaussPoints,
-			    // &numberElements,
-			    // &numberPrestressEntries,
-			    // &prestressAutoComputeInt,
-			    // &asciiOutputInt,
-			    // &f77FileInput,
-			    // &f77AsciiOutput,
-			    // &prestressInputFile,
-			    // &asciiOutputFile);
-
-  // if (!ok) {
-    // return 0;
-  // }
-
-  // int errorcode = 0;
-  // const int maxsize = 4096;
-  // char errorstring[maxsize];
-  // double* pointerToStn = (double*) PyCObject_AsVoidPtr(pyPointerToStn);
-  // double* pointerToSt0 = (double*) PyCObject_AsVoidPtr(pyPointerToSt0);
-  // double* pointerToListArrayPrscal = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayPrscal);
-
-  // read_prestr_f(pointerToStn,
-		// pointerToSt0,
-		// pointerToListArrayPrscal,
-		// &numberStressComponents,
-		// &numberGaussPoints,
-		// &numberPrestressGaussPoints,
-		// &numberElements,
-		// &numberPrestressEntries,
-		// &prestressAutoComputeInt,
-		// &asciiOutputInt,
-		// &f77FileInput,
-		// &f77AsciiOutput,
-		// &errorcode,
-		// prestressInputFile,
-		// asciiOutputFile,
-		// strlen(prestressInputFile),
-		// strlen(asciiOutputFile));
-    
-// if(0 != exceptionhandler(errorcode, errorstring)) {
-    // return 0;
-  // }
-
-  // journal::debug_t debug("pylith3d");
-  // debug
-    // << journal::at(__HERE__)
-    // << "numberPrestressEntries:" << numberPrestressEntries
-    // << journal::endl;
-
-  // return
-  // Py_INCREF(Py_None);
-  // return Py_None;
-// }
-
-
-// Read local coordinate rotations
-
-char pypylith3d_read_skew__doc__[] = "";
-char pypylith3d_read_skew__name__[] = "read_skew";
-
-PyObject * pypylith3d_read_skew(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToSkew;
-  double rotationScaleFactor;
-  int numberRotationEntries;
-  int numberNodes;
-  int autoRotateSlipperyNodesInt;
-  int f77FileInput;
-  char* rotationInputFile;
-
-  int ok = PyArg_ParseTuple(args, "Odiiiis:read_skew",
-			    &pyPointerToSkew,
-			    &rotationScaleFactor,
-			    &numberRotationEntries,
-			    &numberNodes,
-			    &autoRotateSlipperyNodesInt,
-			    &f77FileInput,
-			    &rotationInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  double* pointerToSkew = (double*) PyCObject_AsVoidPtr(pyPointerToSkew);
-
-  read_skew_f(pointerToSkew,
-	      &rotationScaleFactor,
-	      &numberRotationEntries,
-	      &numberNodes,
-	      &autoRotateSlipperyNodesInt,
-	      &f77FileInput,
-	      rotationInputFile,
-	      &errorcode,
-	      errorstring,
-	      strlen(rotationInputFile),
-	      sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberRotationEntries:" << numberRotationEntries
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Read slippery node entries
-
-char pypylith3d_read_slip__doc__[] = "";
-char pypylith3d_read_slip__name__[] = "read_slip";
-
-PyObject * pypylith3d_read_slip(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToNslip;
-  int numberSlipperyNodeEntries;
-  int numberNodes;
-  int autoRotateSlipperyNodesInt;
-  int f77FileInput;
-  char* slipperyNodeInputFile;
-
-  int ok = PyArg_ParseTuple(args, "Oiiiis:read_slip",
-			    &pyPointerToNslip,
-			    &numberSlipperyNodeEntries,
-			    &numberNodes,
-			    &autoRotateSlipperyNodesInt,
-			    &f77FileInput,
-			    &slipperyNodeInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int* pointerToNslip = (int*) PyCObject_AsVoidPtr(pyPointerToNslip);
-  int totalNumberSlipperyNodes = 0;
-
-  read_slip_f(pointerToNslip,
-	      &numberSlipperyNodeEntries,
-	      &totalNumberSlipperyNodes,
-	      &numberNodes,
-	      &autoRotateSlipperyNodesInt,
-	      &f77FileInput,
-	      slipperyNodeInputFile,
-	      &errorcode,
-	      errorstring,
-	      strlen(slipperyNodeInputFile),
-	      sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "totalNumberSlipperyNodes:" << totalNumberSlipperyNodes
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_BuildValue("i", totalNumberSlipperyNodes);
-}
-
-
-// Read split node entries
-
-char pypylith3d_read_split__doc__[] = "";
-char pypylith3d_read_split__name__[] = "read_split";
-
-PyObject * pypylith3d_read_split(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToFault;
-  PyObject* pyPointerToNfault;
-  int numberSplitNodeEntries;
-  int numberNodes;
-  int numberVolumeElements;
-  int f77FileInput;
-  char* splitNodeInputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOiiiis:read_split",
-			    &pyPointerToFault,
-			    &pyPointerToNfault,
-			    &numberSplitNodeEntries,
-			    &numberNodes,
-			    &numberVolumeElements,
-			    &f77FileInput,
-			    &splitNodeInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  double* pointerToFault = (double*) PyCObject_AsVoidPtr(pyPointerToFault);
-  int* pointerToNfault = (int*) PyCObject_AsVoidPtr(pyPointerToNfault);
-  int totalNumberSplitNodes = 0;
-
-  read_split_f(pointerToFault,
-	       pointerToNfault,
-	       &numberSplitNodeEntries,
-	       &totalNumberSplitNodes,
-	       &numberNodes,
-	       &numberVolumeElements,
-	       &f77FileInput,
-	       splitNodeInputFile,
-	       &errorcode,
-	       errorstring,
-	       strlen(splitNodeInputFile),
-	       sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "totalNumberSplitNodes:" << totalNumberSplitNodes
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_BuildValue("i", totalNumberSplitNodes);
-}
-
-
-// Read state output information
-
-char pypylith3d_read_stateout__doc__[] = "";
-char pypylith3d_read_stateout__name__[] = "read_stateout";
-
-PyObject * pypylith3d_read_stateout(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToIstatout;
-  PyObject* pyPointerToNstatout;
-  int f77FileInput;
-  char* stateVariableInputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOis:read_stateout",
-			    &pyPointerToIstatout,
-			    &pyPointerToNstatout,
-			    &f77FileInput,
-			    &stateVariableInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int* pointerToIstatout = (int*) PyCObject_AsVoidPtr(pyPointerToIstatout);
-  int* pointerToNstatout = (int*) PyCObject_AsVoidPtr(pyPointerToNstatout);
-
-  read_stateout_f(pointerToIstatout,
-	          pointerToNstatout,
-	          &f77FileInput,
-	          stateVariableInputFile,
-	          &errorcode,
-	          errorstring,
-	          strlen(stateVariableInputFile),
-	          sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "pointerToIstatout:" << pointerToIstatout
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Read time step data
-
-char pypylith3d_read_timdat__doc__[] = "";
-char pypylith3d_read_timdat__name__[] = "read_timdat";
-
-PyObject * pypylith3d_read_timdat(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToDelt;
-  PyObject* pyPointerToAlfa;
-  PyObject* pyPointerToUtol;
-  PyObject* pyPointerToFtol;
-  PyObject* pyPointerToEtol;
-  PyObject* pyPointerToTimes;
-  double timeScaleFactor;
-  PyObject* pyPointerToMaxstp;
-  PyObject* pyPointerToMaxit;
-  PyObject* pyPointerToNtdinit;
-  PyObject* pyPointerToLgdef;
-  PyObject* pyPointerToItmax;
-  int numberTimeStepGroups;
-  int totalNumberTimeSteps;
-  int f77FileInput;
-  char* timeStepInputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOOOOOdOOOOOiiis:read_timdat",
-			    &pyPointerToDelt,
-			    &pyPointerToAlfa,
-			    &pyPointerToUtol,
-			    &pyPointerToFtol,
-			    &pyPointerToEtol,
-			    &pyPointerToTimes,
-			    &timeScaleFactor,
-			    &pyPointerToMaxstp,
-			    &pyPointerToMaxit,
-			    &pyPointerToNtdinit,
-			    &pyPointerToLgdef,
-			    &pyPointerToItmax,
-			    &numberTimeStepGroups,
-			    &totalNumberTimeSteps,
-			    &f77FileInput,
-			    &timeStepInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  double* pointerToDelt = (double*) PyCObject_AsVoidPtr(pyPointerToDelt);
-  double* pointerToAlfa = (double*) PyCObject_AsVoidPtr(pyPointerToAlfa);
-  double* pointerToUtol = (double*) PyCObject_AsVoidPtr(pyPointerToUtol);
-  double* pointerToFtol = (double*) PyCObject_AsVoidPtr(pyPointerToFtol);
-  double* pointerToEtol = (double*) PyCObject_AsVoidPtr(pyPointerToEtol);
-  double* pointerToTimes = (double*) PyCObject_AsVoidPtr(pyPointerToTimes);
-  int* pointerToMaxstp = (int*) PyCObject_AsVoidPtr(pyPointerToMaxstp);
-  int* pointerToMaxit = (int*) PyCObject_AsVoidPtr(pyPointerToMaxit);
-  int* pointerToNtdinit = (int*) PyCObject_AsVoidPtr(pyPointerToNtdinit);
-  int* pointerToLgdef = (int*) PyCObject_AsVoidPtr(pyPointerToLgdef);
-  int* pointerToItmax = (int*) PyCObject_AsVoidPtr(pyPointerToItmax);
-
-  read_timdat_f(pointerToDelt,
-		pointerToAlfa,
-		pointerToUtol,
-		pointerToFtol,
-		pointerToEtol,
-		pointerToTimes,
-		&timeScaleFactor,
-		pointerToMaxstp,
-		pointerToMaxit,
-		pointerToNtdinit,
-		pointerToLgdef,
-		pointerToItmax,
-		&numberTimeStepGroups,
-		&totalNumberTimeSteps,
-		&f77FileInput,
-		timeStepInputFile,
-		&errorcode,
-		errorstring,
-		strlen(timeStepInputFile),
-		sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "totalNumberTimeSteps:" << totalNumberTimeSteps
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Read traction BC
-
-char pypylith3d_read_tractions__doc__[] = "";
-char pypylith3d_read_tractions__name__[] = "read_tractions";
-
-PyObject * pypylith3d_read_tractions(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToTractionverts;
-  PyObject* pyPointerToTractionvals;
-  double tractionScaleFactor;
-  int numberTractionBc;
-  int numberSurfaceElementNodes;
-  int f77FileInput;
-  char* tractionInputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOdiiis:read_tractions",
-			    &pyPointerToTractionverts,
-			    &pyPointerToTractionvals,
-			    &tractionScaleFactor,
-			    &numberTractionBc,
-			    &numberSurfaceElementNodes,
-			    &f77FileInput,
-			    &tractionInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int* pointerToTractionverts = (int*) PyCObject_AsVoidPtr(pyPointerToTractionverts);
-  double* pointerToTractionvals = (double*) PyCObject_AsVoidPtr(pyPointerToTractionvals);
-
-  read_tractions_f(pointerToTractionverts,
-		   pointerToTractionvals,
-		   &tractionScaleFactor,
-		   &numberTractionBc,
-		   &numberSurfaceElementNodes,
-		   &f77FileInput,
-		   tractionInputFile,
-		   &errorcode,
-		   errorstring,
-		   strlen(tractionInputFile),
-		   sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "tractionScaleFactor:" << tractionScaleFactor
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Read winkler BC
-
-char pypylith3d_read_wink__doc__[] = "";
-char pypylith3d_read_wink__name__[] = "read_wink";
-
-PyObject * pypylith3d_read_wink(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToWinkdef;
-  PyObject* pyPointerToListArrayWscal;
-  PyObject* pyPointerToIwinkdef;
-  PyObject* pyPointerToIwinkid;
-  int numberWinklerForces;
-  int numberWinklerEntries;
-  int f77FileInput;
-  char* winklerInputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOOOiiis:read_wink",
-			    &pyPointerToWinkdef,
-			    &pyPointerToListArrayWscal,
-			    &pyPointerToIwinkdef,
-			    &pyPointerToIwinkid,
-			    &numberWinklerForces,
-			    &numberWinklerEntries,
-			    &f77FileInput,
-			    &winklerInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  double* pointerToWinkdef = (double*) PyCObject_AsVoidPtr(pyPointerToWinkdef);
-  double* pointerToListArrayWscal = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayWscal);
-  int* pointerToIwinkdef = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkdef);
-  int* pointerToIwinkid = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkid);
-
-  read_wink_f(pointerToWinkdef,
-	      pointerToListArrayWscal,
-	      pointerToIwinkdef,
-	      pointerToIwinkid,
-	      &numberWinklerForces,
-	      &numberWinklerEntries,
-	      &f77FileInput,
-	      winklerInputFile,
-	      &errorcode,
-	      errorstring,
-	      strlen(winklerInputFile),
-	      sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberWinklerForces:" << numberWinklerForces
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-// version
-// $Id: parser.cc,v 1.12 2005/06/07 19:39:11 willic3 Exp $
-
-// End of file

Deleted: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/parser.h
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/parser.h	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/parser.h	2007-03-30 21:05:09 UTC (rev 6475)
@@ -1,130 +0,0 @@
-// -*- C++ -*-
-// 
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
-//
-//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
-//
-//  Permission is hereby granted, free of charge, to any person obtaining
-//  a copy of this software and associated documentation files (the
-//  "Software"), to deal in the Software without restriction, including
-//  without limitation the rights to use, copy, modify, merge, publish,
-//  distribute, sublicense, and/or sell copies of the Software, and to
-//  permit persons to whom the Software is furnished to do so, subject to
-//  the following conditions:
-//
-//  The above copyright notice and this permission notice shall be
-//  included in all copies or substantial portions of the Software.
-//
-//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 
-
-#if !defined(pypylith3d_parser_h)
-#define pypylith3d_parser_h
-
-// read boundary conditions
-extern char pypylith3d_read_bc__name__[];
-extern char pypylith3d_read_bc__doc__[];
-extern "C"
-PyObject * pypylith3d_read_bc(PyObject *, PyObject *);
-
-// read connectivities
-extern char pypylith3d_read_connect__name__[];
-extern char pypylith3d_read_connect__doc__[];
-extern "C"
-PyObject * pypylith3d_read_connect(PyObject *, PyObject *);
-
-// read coordinates
-extern char pypylith3d_read_coords__name__[];
-extern char pypylith3d_read_coords__doc__[];
-extern "C"
-PyObject * pypylith3d_read_coords(PyObject *, PyObject *);
-
-// read differential forces
-extern char pypylith3d_read_diff__name__[];
-extern char pypylith3d_read_diff__doc__[];
-extern "C"
-PyObject * pypylith3d_read_diff(PyObject *, PyObject *);
-
-// read time steps at which full output is desired
-extern char pypylith3d_read_fuldat__name__[];
-extern char pypylith3d_read_fuldat__doc__[];
-extern "C"
-PyObject * pypylith3d_read_fuldat(PyObject *, PyObject *);
-
-// read time history info
-extern char pypylith3d_read_hist__name__[];
-extern char pypylith3d_read_hist__doc__[];
-extern "C"
-PyObject * pypylith3d_read_hist(PyObject *, PyObject *);
-
-// read material history info
-// these are not being used for now
-// extern char pypylith3d_read_mathist__name__[];
-// extern char pypylith3d_read_mathist__doc__[];
-// extern "C"
-// PyObject * pypylith3d_read_mathist(PyObject *, PyObject *);
-
-// read prestresses
-// extern char pypylith3d_read_prestr__name__[];
-// extern char pypylith3d_read_prestr__doc__[];
-// extern "C"
-// PyObject * pypylith3d_read_prestr(PyObject *, PyObject *);
-
-// read local coordinate rotations
-extern char pypylith3d_read_skew__name__[];
-extern char pypylith3d_read_skew__doc__[];
-extern "C"
-PyObject * pypylith3d_read_skew(PyObject *, PyObject *);
-
-// read slippery node definitions
-extern char pypylith3d_read_slip__name__[];
-extern char pypylith3d_read_slip__doc__[];
-extern "C"
-PyObject * pypylith3d_read_slip(PyObject *, PyObject *);
-
-// read split node definitions
-extern char pypylith3d_read_split__name__[];
-extern char pypylith3d_read_split__doc__[];
-extern "C"
-PyObject * pypylith3d_read_split(PyObject *, PyObject *);
-
-// read state output information
-extern char pypylith3d_read_stateout__name__[];
-extern char pypylith3d_read_stateout__doc__[];
-extern "C"
-PyObject * pypylith3d_read_stateout(PyObject *, PyObject *);
-
-// read time step group informations
-extern char pypylith3d_read_timdat__name__[];
-extern char pypylith3d_read_timdat__doc__[];
-extern "C"
-PyObject * pypylith3d_read_timdat(PyObject *, PyObject *);
-
-// read traction boundary conditions
-extern char pypylith3d_read_tractions__name__[];
-extern char pypylith3d_read_tractions__doc__[];
-extern "C"
-PyObject * pypylith3d_read_tractions(PyObject *, PyObject *);
-
-// read winkler force information
-extern char pypylith3d_read_wink__name__[];
-extern char pypylith3d_read_wink__doc__[];
-extern "C"
-PyObject * pypylith3d_read_wink(PyObject *, PyObject *);
-
-#endif
-
-// version
-// $Id: parser.h,v 1.3 2005/03/31 23:27:58 willic3 Exp $
-
-// End of file

Modified: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/pylith3d_externs.h
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/pylith3d_externs.h	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/pylith3d_externs.h	2007-03-30 21:05:09 UTC (rev 6475)
@@ -32,6 +32,7 @@
 #define pylith3d_externs_h
 
 #include <stddef.h>
+#include <petscmat.h>
 
 #define assign_wink_f FC_FUNC_(assign_wink, ASSIGN_WINK)
 #define autoprestr_f FC_FUNC(autoprestr, AUTOPRESTR)

Deleted: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/scanner.cc
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/scanner.cc	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/scanner.cc	2007-03-30 21:05:09 UTC (rev 6475)
@@ -1,1418 +0,0 @@
-// -*- C++ -*-
-// 
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
-//
-//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
-//
-//  Permission is hereby granted, free of charge, to any person obtaining
-//  a copy of this software and associated documentation files (the
-//  "Software"), to deal in the Software without restriction, including
-//  without limitation the rights to use, copy, modify, merge, publish,
-//  distribute, sublicense, and/or sell copies of the Software, and to
-//  permit persons to whom the Software is furnished to do so, subject to
-//  the following conditions:
-//
-//  The above copyright notice and this permission notice shall be
-//  included in all copies or substantial portions of the Software.
-//
-//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 
-
-#include <Distribution.hh>
-#include <petscmesh.h>
-#include <src/dm/mesh/meshpylith.h>
-#include <petscmat.h>
-#include <portinfo>
-#include "journal/debug.h"
-
-#include <Python.h>
-
-#include "scanner.h"
-#include "exceptionhandler.h"
-#include "pylith3d_externs.h"
-#include <stdio.h>
-#include <string.h>
-
-#undef __FUNCT__
-#define __FUNCT__ "IgnoreComments_PyLith"
-PetscErrorCode IgnoreComments_PyLith(char *buf, PetscInt bufSize, FILE *f)
-{
-  PetscFunctionBegin;
-  while((fgets(buf, bufSize, f) != NULL) && ((buf[0] == '#') || (buf[0] == '\0'))) {}
-  PetscFunctionReturn(0);
-}
-
-#undef __FUNCT__
-#define __FUNCT__ "ReadBoundary_PyLith"
-PetscErrorCode ReadBoundary_PyLith(const char *baseFilename, PetscTruth useZeroBase, PetscInt *numBoundaryVertices, PetscInt *numBoundaryComponents, PetscInt **boundaryVertices, PetscScalar **boundaryValues)
-{
-  FILE          *f;
-  PetscInt       maxVerts= 1024, vertexCount = 0;
-  PetscInt       numComp = 3;
-  PetscInt      *verts;
-  PetscScalar   *values;
-  char           bcFilename[2048];
-  char           buf[2048];
-  PetscErrorCode ierr;
-
-  PetscFunctionBegin;
-  ierr = PetscStrcpy(bcFilename, baseFilename);
-  // ierr = PetscStrcat(bcFilename, ".bc");
-  f = fopen(bcFilename, "r");CHKERRQ(ierr);
-  IgnoreComments_PyLith(buf, 2048, f);
-  /* Ignore displacement units */
-  /* Don't need this one since IgnoreComments reads until "failure".
-   * fgets(buf, 2048, f);
-   */
-  /* Ignore velocity units */
-  fgets(buf, 2048, f);
-  /* Ignore force units */
-  fgets(buf, 2048, f);
-  IgnoreComments_PyLith(buf, 2048, f);
-  ierr = PetscMalloc(maxVerts*(numComp+1) * sizeof(PetscInt),    &verts);CHKERRQ(ierr);
-  ierr = PetscMalloc(maxVerts*numComp * sizeof(PetscScalar), &values);CHKERRQ(ierr);
-  do {
-    const char *v = strtok(buf, " ");
-    int vertex = atoi(v);
-        
-    if (!useZeroBase) vertex -= 1;
-    if (vertexCount == maxVerts) {
-      PetscInt *vtmp;
-      PetscScalar *ctmp;
-
-      vtmp = verts;
-      ierr = PetscMalloc(maxVerts*2*(numComp+1) * sizeof(PetscInt), &verts);CHKERRQ(ierr);
-      ierr = PetscMemcpy(verts, vtmp, maxVerts*(numComp+1) * sizeof(PetscInt));CHKERRQ(ierr);
-      ierr = PetscFree(vtmp);CHKERRQ(ierr);
-      ctmp = values;
-      ierr = PetscMalloc(maxVerts*2*numComp * sizeof(PetscScalar), &values);CHKERRQ(ierr);
-      ierr = PetscMemcpy(values, ctmp, maxVerts*numComp * sizeof(PetscScalar));CHKERRQ(ierr);
-      ierr = PetscFree(ctmp);CHKERRQ(ierr);
-      maxVerts *= 2;
-    }
-    verts[vertexCount*(numComp+1)+0] = vertex;
-    /* X boundary condition*/
-    v = strtok(NULL, " ");
-    verts[vertexCount*(numComp+1)+1] = atoi(v);
-    /* Y boundary condition*/
-    v = strtok(NULL, " ");
-    verts[vertexCount*(numComp+1)+2] = atoi(v);
-    /* Z boundary condition*/
-    v = strtok(NULL, " ");
-    verts[vertexCount*(numComp+1)+3] = atoi(v);
-    /* X boundary value */
-    v = strtok(NULL, " ");
-    values[vertexCount*numComp+0] = atof(v);
-    /* Y boundary value */
-    v = strtok(NULL, " ");
-    values[vertexCount*numComp+1] = atof(v);
-    /* Z boundary value */
-    v = strtok(NULL, " ");
-    values[vertexCount*numComp+2] = atof(v);
-    vertexCount++;
-  } while(fgets(buf, 2048, f) != NULL);
-  fclose(f);
-  *numBoundaryVertices = vertexCount;
-  *numBoundaryComponents = numComp;
-  *boundaryVertices = verts;
-  *boundaryValues   = values;
-  PetscFunctionReturn(0);
-}
-
-#undef __FUNCT__
-#define __FUNCT__ "WriteBoundary_PyLith"
-PetscErrorCode WriteBoundary_PyLith(const char *baseFilename, const ALE::Obj<ALE::Mesh>& mesh)
-{
-  ALE::Mesh::foliated_section_type::patch_type      patch      = 0;
-  const ALE::Obj<ALE::Mesh::numbering_type>&        vNumbering = mesh->getFactory()->getLocalNumbering(mesh->getTopology(), patch, 0);
-  const ALE::Obj<ALE::Mesh::foliated_section_type>& boundaries = mesh->getBoundariesNew();
-  FILE          *f;
-  char           bcFilename[2048];
-  PetscErrorCode ierr;
-  MPI_Comm          comm = PETSC_COMM_WORLD;
-  PetscMPIInt       rank;
-  char           suff[9];
-
-  ierr = MPI_Comm_rank(comm, &rank);
-  sprintf(suff, "%s%d%s", ".", rank, ".bc");
-
-  PetscFunctionBegin;
-  if (mesh->debug()) {
-    boundaries->view("PyLith boundaries");
-  }
-  int slen = std::strlen(baseFilename);
-  std::strncpy(bcFilename, baseFilename, slen-3);
-  bcFilename[slen-3] = '\0';
-  // ierr = PetscStrcpy(bcFilename, baseFilename.substr(0,slen-4));
-  ierr = PetscStrcat(bcFilename, suff);
-
-  // Determine if we have bc stuff
-  const ALE::Obj<ALE::Mesh::topology_type::label_sequence>& vertices = boundaries->getTopology()->depthStratum(patch, 0);
-  bool haveBC = false;
-  for(ALE::Mesh::topology_type::label_sequence::iterator v_iter = vertices->begin(); v_iter != vertices->end(); ++v_iter)
-    if (boundaries->getFiberDimension(patch, *v_iter) > 0) {
-      haveBC = true;
-      break;
-    } // if
-
-  f = fopen(bcFilename, "w");CHKERRQ(ierr);
-  if (haveBC) {
-    // Only write header if bc file contains information
-    // If header is written and rest of file is empty,
-    // then we have a problem and reading will fail with
-    // error message.
-    fprintf(f, "displacement_units = m\n");
-    fprintf(f, "velocity_units = m/s\n");
-    fprintf(f, "force_units = newton\n");
-    fprintf(f, "#\n");
-    fprintf(f, "# The last row for each node applies\n");
-    fprintf(f, "#\n");
-    fprintf(f, "#  Node X BC Y BC Z BC   X Value          Y Value          Z Value\n");
-    fprintf(f, "#\n");
-  } // if
-
-  for(ALE::Mesh::topology_type::label_sequence::iterator v_iter = vertices->begin(); v_iter != vertices->end(); ++v_iter) {
-    int    constraints[3] = {0, 0, 0};
-    double values[3] = {0.0, 0.0, 0.0};
-    int    size = boundaries->getFiberDimension(patch, *v_iter);
-    const ALE::Mesh::foliated_section_type::value_type *array = boundaries->restrict(patch, *v_iter);
-
-    for(int c = 0; c < size; c++) {
-      constraints[array[c].first] = 1;
-      values[array[c].first]      = array[c].second;
-    }
-
-    if (constraints[0] || constraints[1] || constraints[2]) {
-      fprintf(f, "%7d %4d %4d %4d % 16.8E % 16.8E % 16.8E\n", vNumbering->getIndex(*v_iter)+1,
-              constraints[0], constraints[1], constraints[2], values[0], values[1], values[2]);
-    }
-  }
-  fclose(f);
-  PetscFunctionReturn(0);
-}
-
-// Process mesh
-
-PetscErrorCode MeshView_Sieve(const ALE::Obj<ALE::Mesh>& mesh, PetscViewer viewer);
-
-char pypylith3d_processMesh__doc__[] = "";
-char pypylith3d_processMesh__name__[] = "processMesh";
-
-PyObject * pypylith3d_processMesh(PyObject *, PyObject *args)
-{
-  char *meshInputFile;
-  char  *meshBcFile;
-  int   interpolateMesh;
-  char* partitioner;
-
-  int ok = PyArg_ParseTuple(args, (char *) "ssis:processMesh", &meshBcFile, &meshInputFile, &interpolateMesh, &partitioner);
-
-  if (!ok) {
-    return 0;
-  }
-
-  using ALE::Obj;
-  journal::debug_t  debug("pylith3d");
-  MPI_Comm          comm = PETSC_COMM_WORLD;
-  PetscMPIInt       rank;
-  Mesh              mesh;
-  Obj<ALE::Mesh>    m;
-  PetscViewer       viewer;
-  PetscInt         *boundaryVertices;
-  PetscScalar      *boundaryValues;
-  PetscInt          numBoundaryVertices, numBoundaryComponents;
-  int               debugFlag = 0;
-  PetscErrorCode    ierr;
-
-  ierr = MPI_Comm_rank(comm, &rank);
-  ierr = MeshCreatePyLith(comm, 3, meshInputFile, PETSC_FALSE, (PetscTruth) interpolateMesh, &mesh);
-  ierr = MeshGetMesh(mesh, m);
-  m->setDebug(debugFlag);
-  int numElements = m->getTopology()->heightStratum(0, 0)->size();
-  debug << journal::at(__HERE__) << "[" << rank << "]Created new PETSc Mesh for " << meshInputFile << journal::endl;
-  m = ALE::New::Distribution<ALE::Mesh::topology_type>::distributeMesh(m, partitioner);
-  ierr = MeshSetMesh(mesh, m);
-  debug << journal::at(__HERE__) << "[" << rank << "]Distributed PETSc Mesh"  << journal::endl;
-  ierr = ReadBoundary_PyLith(meshBcFile, PETSC_FALSE, &numBoundaryVertices, &numBoundaryComponents, &boundaryVertices, &boundaryValues);
-
-  const Obj<ALE::Mesh::foliated_section_type>& boundaries = m->getBoundariesNew();
-  ALE::Mesh::foliated_section_type::patch_type patch      = 0;
-  std::set<int> seen;
-
-  ierr = MPI_Bcast(&numElements, 1, MPI_INT, 0, comm);
-  boundaries->setTopology(m->getTopology());
-  // Reverse order allows newer conditions to override older, as required by PyLith
-  for(int v = numBoundaryVertices-1; v >= 0; v--) {
-    ALE::Mesh::point_type vertex(boundaryVertices[v*(numBoundaryComponents+1)] + numElements);
-    int size = 0;
-
-    if (seen.find(vertex) == seen.end()) {
-      for(int c = 0; c < numBoundaryComponents; c++) {
-        size += boundaryVertices[v*(numBoundaryComponents+1)+c+1];
-      }
-      boundaries->setFiberDimension(patch, vertex, size);
-      seen.insert(vertex);
-    }
-  }
-  boundaries->allocate();
-  for(int v = 0; v < numBoundaryVertices; v++) {
-    ALE::Mesh::point_type vertex(boundaryVertices[v*(numBoundaryComponents+1)] + numElements);
-    ALE::Mesh::foliated_section_type::value_type values[3];
-
-    for(int c = 0, i = 0; c < numBoundaryComponents; c++) {
-      if (boundaryVertices[v*(numBoundaryComponents+1)+c+1]) {
-        values[i].first  = c;
-        values[i].second = boundaryValues[v*numBoundaryComponents+c];
-        i++;
-      }
-    }
-    boundaries->update(patch, vertex, values);
-  }
-  debug << journal::at(__HERE__) << "[" << rank << "]Created boundary conditions"  << journal::endl;
-
-#if 0
-  bool refineMesh = false;
-  if (refineMesh) {
-    double refinementLimit = 2.4e4*2.4e4*2.4e4*0.01*0.5;
-    bool   interpolate     = true;
-    mesh = ALE::Generator::refine(mesh, refinementLimit, interpolate);
-  }
-#endif
-
-  ierr = PetscViewerCreate(comm, &viewer);
-  ierr = PetscViewerSetType(viewer, PETSC_VIEWER_ASCII);
-  ierr = PetscViewerSetFormat(viewer, PETSC_VIEWER_ASCII_PYLITH_LOCAL);
-  ierr = PetscViewerFileSetMode(viewer, FILE_MODE_READ);
-  ierr = PetscExceptionTry1(PetscViewerFileSetName(viewer, meshInputFile), PETSC_ERR_FILE_OPEN);
-  if (PetscExceptionValue(ierr)) {
-    /* this means that a caller above me has also tryed this exception so I don't handle it here, pass it up */
-  } else if (PetscExceptionCaught(ierr, PETSC_ERR_FILE_OPEN)) {
-    ierr = 0;
-  } 
-  ierr = MeshView(mesh, viewer);
-  ierr = PetscViewerDestroy(viewer);
-
-  char           bcFilename[2048];
-  char           suff[9];
-
-  sprintf(suff, "%s%d%s", ".", rank, ".bc");
-
-  int slen = std::strlen(meshBcFile);
-  std::strncpy(bcFilename, meshBcFile, slen-3);
-  // ierr = PetscStrcpy(bcFilename, meshBcFile.substr(0,slen-4));
-  ierr = PetscStrcat(bcFilename, suff);
-
-  debug << journal::at(__HERE__) << "[" << rank << "]Output new PyLith mesh into: " << bcFilename << journal::endl;
-
-  ierr = WriteBoundary_PyLith(meshBcFile, m);
-  debug << journal::at(__HERE__) << "[" << rank << "]Wrote PyLith boundary conditions"  << journal::endl;
-
-  const Obj<ALE::Mesh::topology_type::label_sequence>& vertices = m->getTopology()->depthStratum(0, 0);
-  SectionReal                       section;
-  Obj<ALE::Mesh::real_section_type> s;
-
-  ierr = MeshGetSectionReal(mesh, "default", &section);
-  ierr = PetscObjectSetName((PetscObject) section, "displacement");
-  ierr = MeshSetSectionReal(mesh, section);
-  ierr = SectionRealGetSection(section, s);
-  s->setFiberDimensionByDepth(0, 0, 3);
-  for(ALE::Mesh::topology_type::label_sequence::iterator v_iter = vertices->begin(); v_iter != vertices->end(); ++v_iter) {
-    int numConstraints = boundaries->getFiberDimension(patch, *v_iter);
-
-    if (numConstraints > 0) {
-      if (m->debug()) {
-        std::cout << "[" << rank << "]Setting dimension of " << *v_iter << " to " << 3 - numConstraints << std::endl;
-      }
-      s->setFiberDimension(0, *v_iter, 3 - numConstraints);
-    }
-  }
-  s->allocate();
-  if (m->debug()) {
-    s->view("Displacement field");
-  }
-  ierr = SectionRealDestroy(section);
-  debug << journal::at(__HERE__) << "[" << rank << "]Created displacement Field"  << journal::endl;
-
-  m->getFactory()->constructInverseOrder(m->getFactory()->getLocalNumbering(m->getTopology(), 0, m->getTopology()->depth()));
-
-  // return
-  PyObject *pyMesh = PyCObject_FromVoidPtr(mesh, NULL);
-  //PyObject *pyMesh = PyCObject_FromVoidPtr(mesh.ptr(), NULL);
-  //mesh.int_allocator->del(mesh.refCnt);
-  //mesh.refCnt = NULL;
-  return pyMesh;
-}
-
-// Create a PETSc Mat
-char pypylith3d_createPETScMat__doc__[] = "";
-char pypylith3d_createPETScMat__name__[] = "createPETScMat";
-
-PyObject * pypylith3d_createPETScMat(PyObject *, PyObject *args)
-{
-  using ALE::Obj;
-  PyObject *pyMesh, *pyA, *pyRhs, *pySol;
-  MPI_Comm comm = PETSC_COMM_WORLD;
-  Mat      A;
-  Vec      rhs, sol;
-  PetscErrorCode ierr;
-
-  int ok = PyArg_ParseTuple(args, (char *) "O:createPETScMat", &pyMesh);
-  if (!ok) {
-    return 0;
-  }
-
-  Mesh mesh = (Mesh) PyCObject_AsVoidPtr(pyMesh);
-  Obj<ALE::Mesh> m;
-
-  ierr = MeshGetMesh(mesh, m);
-  const ALE::Obj<ALE::Mesh::order_type>& offsets = m->getFactory()->getGlobalOrder(m->getTopology(), 0, "displacement", m->getRealSection("displacement")->getAtlas());
-  int localSize = offsets->getLocalSize();
-  int globalSize = offsets->getGlobalSize();
-
-  if (MatCreate(comm, &A)) {
-    PyErr_SetString(PyExc_RuntimeError, "Could not create PETSc Mat");
-    return 0;
-  }
-  if (MatSetSizes(A, localSize, localSize, globalSize, globalSize)) {
-    PyErr_SetString(PyExc_RuntimeError, "Could not set sizes for PETSc Mat");
-    return 0;
-  }
-  if (VecCreate(comm, &rhs)) {
-    PyErr_SetString(PyExc_RuntimeError, "Could not create PETSc Rhs");
-    return 0;
-  }
-  if (VecSetSizes(rhs, localSize, globalSize)) {
-    PyErr_SetString(PyExc_RuntimeError, "Could not set sizes for PETSc Rhs");
-    return 0;
-  }
-  if (VecSetFromOptions(rhs)) {
-    PyErr_SetString(PyExc_RuntimeError, "Could not set options for PETSc Rhs");
-    return 0;
-  }
-  if (VecDuplicate(rhs, &sol)) {
-    PyErr_SetString(PyExc_RuntimeError, "Could not create PETSc Sol");
-    return 0;
-  }
-
-  ierr = PetscObjectCompose((PetscObject) A, "mesh", (PetscObject) mesh);
-
-  VecScatter injection = NULL;
-  ierr = MeshGetGlobalScatter(mesh, &injection);
-  ierr = PetscObjectCompose((PetscObject) rhs, "mesh",      (PetscObject) mesh);
-  ierr = PetscObjectCompose((PetscObject) rhs, "injection", (PetscObject) injection);
-  ierr = PetscObjectCompose((PetscObject) sol, "mesh",      (PetscObject) mesh);
-  ierr = PetscObjectCompose((PetscObject) sol, "injection", (PetscObject) injection);
-
-  ierr = MatSetFromOptions(A);
-  ierr = preallocateMatrix(m->getTopology(), m->getRealSection("displacement")->getAtlas(), m->getFactory()->getGlobalOrder(m->getTopology(), 0, "displacement", m->getRealSection("displacement")->getAtlas()), A);
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "Created PETSc Mat: " << localSize << " " << globalSize
-    << journal::endl;
-
-  // return Py_None;
-  pyA = PyCObject_FromVoidPtr(A, NULL);
-  pyRhs = PyCObject_FromVoidPtr(rhs, NULL);
-  pySol = PyCObject_FromVoidPtr(sol, NULL);
-  return Py_BuildValue((char *) "NNN", pyA, pyRhs, pySol);
-}
-
-// Destroy a PETSc Mat
-
-char pypylith3d_destroyPETScMat__doc__[] = "";
-char pypylith3d_destroyPETScMat__name__[] = "destroyPETScMat";
-
-PyObject * pypylith3d_destroyPETScMat(PyObject *, PyObject *args)
-{
-  PyObject *pyA,*pyRhs, *pySol;
-  Mat A;
-  Vec rhs, sol;
-
-  int ok = PyArg_ParseTuple(args, (char *) "OOO:destroyPETScMat", &pyA, &pyRhs, &pySol);
-  if (!ok) {
-    return 0;
-  }
-
-  A = (Mat) PyCObject_AsVoidPtr(pyA);
-  if (MatDestroy(A)) {
-    PyErr_SetString(PyExc_RuntimeError, "Could not destroy PETSc Mat");
-    return 0;
-  }
-  rhs = (Vec) PyCObject_AsVoidPtr(pyRhs);
-  if (VecDestroy(rhs)) {
-    PyErr_SetString(PyExc_RuntimeError, "Could not destroy PETSc Rhs");
-    return 0;
-  }
-  sol = (Vec) PyCObject_AsVoidPtr(pySol);
-  if (VecDestroy(sol)) {
-    PyErr_SetString(PyExc_RuntimeError, "Could not destroy PETSc Sol");
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "Destroyed PETSc Mat"
-    << journal::endl;
-
-  // return Py_None;
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-PetscErrorCode updateDisplacement(SectionReal displacement, Vec sol) {
-  VecScatter     injection;
-  Vec            lv;
-  PetscErrorCode ierr;
-
-  PetscFunctionBegin;
-  ierr = SectionRealGetLocalVector(displacement, &lv);CHKERRQ(ierr);
-  ierr = PetscObjectQuery((PetscObject) sol, "injection", (PetscObject *) &injection);CHKERRQ(ierr);
-  ierr = VecScatterBegin(sol, lv, INSERT_VALUES, SCATTER_REVERSE, injection);CHKERRQ(ierr);
-  ierr = VecScatterEnd(sol, lv, INSERT_VALUES, SCATTER_REVERSE, injection);CHKERRQ(ierr);
-  ierr = VecDestroy(lv);CHKERRQ(ierr);
-  PetscFunctionReturn(0);
-}
-
-// Create complete displacement field by adding BC
-PetscErrorCode createFullDisplacement(Mesh mesh, SectionReal *fullDisplacement) {
-  using ALE::Obj;
-  Obj<ALE::Mesh> m;
-  PetscErrorCode ierr;
-
-  PetscFunctionBegin;
-  ierr = MeshGetMesh(mesh, m);CHKERRQ(ierr);
-  if (!m->hasRealSection("full_displacement")) {
-    const Obj<ALE::Mesh::topology_type::sheaf_type>& patches    = m->getTopology()->getPatches();
-    const Obj<ALE::Mesh::real_section_type>&         full       = m->getRealSection("full_displacement");
-
-    for(ALE::Mesh::topology_type::sheaf_type::iterator p_iter = patches->begin(); p_iter != patches->end(); ++p_iter) {
-      full->setFiberDimensionByDepth(p_iter->first, 0, 3);
-    }
-    full->allocate();
-  }
-  const Obj<ALE::Mesh::foliated_section_type>&     boundaries = m->getBoundariesNew();
-  const Obj<ALE::Mesh::topology_type::sheaf_type>& patches    = m->getTopology()->getPatches();
-  const Obj<ALE::Mesh::real_section_type>&         disp       = m->getRealSection("displacement");
-  const Obj<ALE::Mesh::real_section_type>&         full       = m->getRealSection("full_displacement");
-
-  for(ALE::Mesh::topology_type::sheaf_type::iterator p_iter = patches->begin(); p_iter != patches->end(); ++p_iter) {
-    const ALE::Obj<ALE::Mesh::topology_type::label_sequence>& vertices = m->getTopology()->depthStratum(p_iter->first, 0);
-
-    for(ALE::Mesh::topology_type::label_sequence::iterator v_iter = vertices->begin(); v_iter != vertices->end(); ++v_iter) {
-      const ALE::Mesh::foliated_section_type::value_type *constVal = boundaries->restrict(p_iter->first, *v_iter);
-      const ALE::Mesh::real_section_type::value_type     *array    = disp->restrict(p_iter->first, *v_iter);
-      const int numConst = boundaries->size(p_iter->first, *v_iter);
-      const int dim      = disp->getFiberDimension(p_iter->first, *v_iter);
-      double    values[3];
-      int       v = 0;
-
-      for(int c = 0; c < 3; c++) {
-        int i;
-
-        for(i = 0; i < numConst; i++) {
-          if (constVal[i].first == c) {
-            values[c] = constVal[i].second;
-            break;
-          }
-        }
-        if (i == numConst) {
-          values[c] = array[v++];
-        }
-      }
-      if (v != dim) {
-        std::cout << "ERROR: Invalid size " << v << " used for " << *v_iter << " with index " << disp->getIndex(p_iter->first, *v_iter) << std::endl;
-      }
-      full->updateAdd(p_iter->first, *v_iter, values);
-    }
-  }
-  ierr = MeshGetSectionReal(mesh, "full_displacement", fullDisplacement);CHKERRQ(ierr);
-  PetscFunctionReturn(0);
-}
-
-char pypylith3d_outputMesh__doc__[] = "";
-char pypylith3d_outputMesh__name__[] = "outputMesh";
-
-PyObject * pypylith3d_outputMesh(PyObject *, PyObject *args)
-{
-  using ALE::Obj;
-  PyObject *pyMesh, *pySol;
-  char     *meshBaseFile;
-
-  int ok = PyArg_ParseTuple(args, (char *) "sOO:outputMesh", &meshBaseFile, &pyMesh, &pySol);
-  if (!ok) {
-    return 0;
-  }
-
-  Mesh           mesh = (Mesh) PyCObject_AsVoidPtr(pyMesh);
-  Vec            sol  = (Vec)  PyCObject_AsVoidPtr(pySol);
-  MPI_Comm       comm;
-  SectionReal    displacement, fullDisplacement;
-  std::string    filename(meshBaseFile);
-  PetscViewer    viewer;
-  //Vec       partition;
-  PetscTruth     hasMaterial;
-  PetscErrorCode ierr;
-
-  ierr = PetscObjectGetComm((PetscObject) mesh, &comm);
-  ierr = MeshGetSectionReal(mesh, "displacement", &displacement);
-  ierr = updateDisplacement(displacement, sol);
-  ierr = createFullDisplacement(mesh, &fullDisplacement);
-  ierr = PetscViewerCreate(comm, &viewer);
-  ierr = PetscViewerSetType(viewer, PETSC_VIEWER_ASCII);
-  ierr = PetscViewerSetFormat(viewer, PETSC_VIEWER_ASCII_VTK);
-  filename += ".vtk";
-  ierr = PetscViewerFileSetName(viewer, filename.c_str());
-  ierr = MeshView(mesh, viewer);
-  ierr = SectionRealView(fullDisplacement, viewer);
-  ierr = MeshHasSectionInt(mesh, "material", &hasMaterial);
-  if (hasMaterial) {
-    SectionInt material;
-
-    ierr = PetscViewerPushFormat(viewer, PETSC_VIEWER_ASCII_VTK_CELL);
-    ierr = MeshGetSectionInt(mesh, "material", &material);
-    ierr = SectionIntView(material, viewer);
-    ierr = PetscViewerPopFormat(viewer);
-    ierr = SectionIntDestroy(material);
-  }
-  //SectionIntView(partition, viewer);
-  ierr = PetscViewerDestroy(viewer);
-  ierr = SectionRealDestroy(displacement);
-  ierr = SectionRealDestroy(fullDisplacement);
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "Output PETSc Mesh and Solution"
-    << journal::endl;
-
-  // return Py_None;
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-#if 0
-#include "Numeric/arrayobject.h"
-
-char pypylith3d_interpolatePoints__doc__[] = "";
-char pypylith3d_interpolatePoints__name__[] = "interpolatePoints";
-
-PyObject * pypylith3d_interpolatePoints(PyObject *, PyObject *args)
-{
-  using ALE::Obj;
-  PyObject      *pyMesh, *pySol;
-  PyArrayObject *pyPoints;
-
-  int ok = PyArg_ParseTuple(args, (char *) "OOO!:interpolatePoints", &pyMesh, &pySol, &PyArray_Type, &pyPoints);
-  if (!ok) {
-    return 0;
-  }
-  if ((pyPoints->nd != 2) || (pyPoints->descr->type_num != PyArray_DOUBLE)) {
-    PyErr_SetString(PyExc_ValueError, "points must be a 2d array with double values");
-    return 0;
-  }
-  if (pyPoints->dimensions[1] != 3) {
-    PyErr_SetString(PyExc_ValueError, "points must be a 3d");
-    return 0;
-  }
-  if ((pyPoints->strides[0] != 3 * sizeof(double)) || (pyPoints->strides[1] != sizeof(double))) {
-    PyErr_SetString(PyExc_ValueError, "points must be a contiguous array");
-    return 0;
-  }
-
-  Mesh           mesh = (Mesh) PyCObject_AsVoidPtr(pyMesh);
-  Vec            sol  = (Vec)  PyCObject_AsVoidPtr(pySol);
-  SectionReal    displacement, fullDisplacement;
-  const int      numPoints = pyPoints->dimensions[0];
-  double        *values;
-  PetscErrorCode ierr;
-
-  ierr = MeshGetSectionReal(mesh, "displacement", &displacement);
-  ierr = updateDisplacement(displacement, sol);
-  ierr = createFullDisplacement(mesh, &fullDisplacement);
-  ierr = MeshInterpolatePoints(mesh, fullDisplacement, numPoints, (double *) pyPoints->data, &values);
-  ierr = SectionRealDestroy(displacement);
-  ierr = PetscFree(values);
-
-  int            dims[2]  = {numPoints, 3};
-  PyArrayObject *pyValues = (PyArrayObject *) PyArray_FromDims(2, dims, PyArray_DOUBLE);
-  double        *data     = (double *) pyValues->data;
-
-  for(int p = 0; p < numPoints; ++p) {
-    for(int d = 0; d < 3; d++) {
-      data[p*3+d] = values[p*3+d];
-    }
-  }
-
-  ierr = PetscFree(values);
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "Interpolated points"
-    << journal::endl;
-
-  return Py_BuildValue((char *) "N", pyValues);
-}
-#endif
-
-// Scan boundary conditions
-
-char pypylith3d_scan_bc__doc__[] = "";
-char pypylith3d_scan_bc__name__[] = "scan_bc";
-
-PyObject * pypylith3d_scan_bc(PyObject *, PyObject *args)
-{
-  int f77FileInput;
-  char* displacementUnits;
-  char* velocityUnits;
-  char* forceUnits;
-  char* bcInputFile;
-
-  int ok = PyArg_ParseTuple(args, (char *) "issss:scan_bc",
-			    &f77FileInput,
-			    &displacementUnits,
-			    &velocityUnits,
-			    &forceUnits,
-			    &bcInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int numberBcEntries = 0;
-
-  scan_bc_f(&numberBcEntries,
-	    &f77FileInput,
-	    displacementUnits,
-	    velocityUnits,
-	    forceUnits,
-	    bcInputFile,
-	    &errorcode,
-	    errorstring,
-	    strlen(displacementUnits),
-	    strlen(velocityUnits),
-	    strlen(forceUnits),
-	    strlen(bcInputFile),
-	    sizeof(errorstring));
-
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberBcEntries:" << numberBcEntries
-    << journal::endl;
-
-  // return
-  return Py_BuildValue((char *) "i", numberBcEntries);
-}
-
-
-// Scan connectivities
-
-char pypylith3d_scan_connect__doc__[] = "";
-char pypylith3d_scan_connect__name__[] = "scan_connect";
-
-PyObject * pypylith3d_scan_connect(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToListArrayNumberElementNodesBase;
-  PyObject* pyPointerToMaterialModelInfo;
-  PyObject* pyPointerToListArrayMaterialModel;
-  PyObject* pyPointerToVolumeElementFamilyList;
-  int maxNumberVolumeElementFamilies;
-  int numberMaterials;
-  int f77FileInput;
-  char* connectivityInputFile;
-
-  int ok = PyArg_ParseTuple(args, (char *) "OOOOiiis:scan_connect",
-			    &pyPointerToListArrayNumberElementNodesBase,
-			    &pyPointerToMaterialModelInfo,
-                            &pyPointerToListArrayMaterialModel,
-			    &pyPointerToVolumeElementFamilyList,
-			    &maxNumberVolumeElementFamilies,
-			    &numberMaterials,
-			    &f77FileInput,
-			    &connectivityInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int* pointerToListArrayNumberElementNodesBase = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNumberElementNodesBase);
-  int* pointerToMaterialModelInfo = (int*) PyCObject_AsVoidPtr(pyPointerToMaterialModelInfo);
-  int* pointerToListArrayMaterialModel = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayMaterialModel);
-  int* pointerToVolumeElementFamilyList = (int*) PyCObject_AsVoidPtr(pyPointerToVolumeElementFamilyList);
-  int numberVolumeElements = 0;
-  int numberVolumeElementFamilies = 0;
-  int volumeElementType = 0;
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-
-  scan_connect_f(pointerToListArrayNumberElementNodesBase,
-		 pointerToMaterialModelInfo,
-		 pointerToListArrayMaterialModel,
-		 pointerToVolumeElementFamilyList,
-		 &maxNumberVolumeElementFamilies,
-		 &numberMaterials,
-		 &numberVolumeElements,
-		 &numberVolumeElementFamilies,
-		 &volumeElementType,
-		 &f77FileInput,
-		 connectivityInputFile,
-		 &errorcode,
-		 errorstring,
-		 strlen(connectivityInputFile),
-		 sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberVolumeElementFamilies:" << numberVolumeElementFamilies
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_BuildValue((char *) "iii", numberVolumeElements,
-		       numberVolumeElementFamilies,
-		       volumeElementType);
-}
-
-
-// Scan coordinates
-
-char pypylith3d_scan_coords__doc__[] = "";
-char pypylith3d_scan_coords__name__[] = "scan_coords";
-
-PyObject * pypylith3d_scan_coords(PyObject *, PyObject *args)
-{
-  int f77FileInput;
-  char *coordinateUnits;
-  char *coordinateInputFile;
-
-  int ok = PyArg_ParseTuple(args, (char *) "iss:scan_coords",
-			    &f77FileInput,
-			    &coordinateUnits,
-			    &coordinateInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int numberNodes = 0;
-
-  scan_coords_f(&numberNodes,
-		&f77FileInput,
-		coordinateUnits,
-		coordinateInputFile,
-		&errorcode,
-		errorstring,
-		strlen(coordinateUnits),
-		strlen(coordinateInputFile),
-		sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberNodes:" << numberNodes
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_BuildValue((char *) "i", numberNodes);
-}
-
-
-// Scan differential forces
-
-char pypylith3d_scan_diff__doc__[] = "";
-char pypylith3d_scan_diff__name__[] = "scan_diff";
-
-PyObject * pypylith3d_scan_diff(PyObject *, PyObject *args)
-{
-  int numberSlipperyNodeEntries;
-  int f77FileInput;
-  char* differentialForceInputFile;
-
-  int ok = PyArg_ParseTuple(args, (char *) "iis:scan_diff",
-			    &numberSlipperyNodeEntries,
-			    &f77FileInput,
-			    &differentialForceInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int numberDifferentialForceEntries = 0;
-
-  scan_diff_f(&numberSlipperyNodeEntries,
-	      &numberDifferentialForceEntries,
-	      &f77FileInput,
-	      differentialForceInputFile,
-	      &errorcode,
-	      errorstring,
-	      strlen(differentialForceInputFile),
-	      sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberDifferentialForceEntries:" << numberDifferentialForceEntries
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_BuildValue((char *) "i", numberDifferentialForceEntries);
-}
-
-
-// Scan time steps at which full output is desired
-
-char pypylith3d_scan_fuldat__doc__[] = "";
-char pypylith3d_scan_fuldat__name__[] = "scan_fuldat";
-
-PyObject * pypylith3d_scan_fuldat(PyObject *, PyObject *args)
-{
-  int analysisTypeInt;
-  int totalNumberTimeSteps;
-  int f77FileInput;
-  char* fullOutputInputFile;
-
-  int ok = PyArg_ParseTuple(args, (char *) "iiis:scan_fuldat",
-			    &analysisTypeInt,
-			    &totalNumberTimeSteps,
-			    &f77FileInput,
-			    &fullOutputInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int numberFullOutputs = 0;
-
-  scan_fuldat_f(&analysisTypeInt,
-		&totalNumberTimeSteps,
-		&numberFullOutputs,
-		&f77FileInput,
-		fullOutputInputFile,
-		&errorcode,
-		errorstring,
-		strlen(fullOutputInputFile),
-		sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberFullOutputs:" << numberFullOutputs
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_BuildValue((char *) "i", numberFullOutputs);
-}
-
-
-// Scan load histories
-
-char pypylith3d_scan_hist__doc__[] = "";
-char pypylith3d_scan_hist__name__[] = "scan_hist";
-
-PyObject * pypylith3d_scan_hist(PyObject *, PyObject *args)
-{
-  int f77FileInput;
-  char* loadHistoryInputFile;
-
-  int ok = PyArg_ParseTuple(args, (char *) "is:scan_hist",
-			    &f77FileInput,
-			    &loadHistoryInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int numberLoadHistories = 0;
-
-  scan_hist_f(&numberLoadHistories,
-	      &f77FileInput,
-	      loadHistoryInputFile,
-	      &errorcode,
-	      errorstring,
-	      strlen(loadHistoryInputFile),
-	      sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberLoadHistories:" << numberLoadHistories
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_BuildValue((char *) "i", numberLoadHistories);
-}
-
-
-// Scan element prestresses
-
-  // char pypylith3d_scan_prestr__doc__[] = "";
-  // char pypylith3d_scan_prestr__name__[] = "scan_prestr";
-
-  // PyObject * pypylith3d_scan_prestr(PyObject *, PyObject *args)
-  // {
-  //   int numberStressComponents;
-  //   int numberPrestressGaussPoints;
-  //   int numberElements;
-  //   int prestressAutoComputeInt;
-  //   int f77FileInput;
-  //   char* prestressInputFile;
-
-  //   int ok = PyArg_ParseTuple(args, "iiiiis:scan_prestr",
-  // 			    &numberStressComponents,
-  // 			    &numberPrestressGaussPoints,
-  // 			    &numberElements,
-  // 			    &prestressAutoComputeInt,
-  // 			    &f77FileInput,
-  // 			    &prestressInputFile);
-
-  //   if (!ok) {
-  //     return 0;
-  //   }
-
-  //   int errorcode = 0;
-  //   const int maxsize = 4096;
-  //   char errorstring[maxsize];
-  //   int numberPrestressEntries = 0;
-
-  //   scan_prestr_f(&numberStressComponents,
-  // 		&numberPrestressGaussPoints,
-  // 		&numberPrestressEntries,
-  // 		&numberElements,
-  // 		&prestressAutoComputeInt,
-  // 		&f77FileInput,
-  // 		&errorcode,
-  // 		prestressInputFile,strlen(prestressInputFile));
-    
-  //   if(0 != exceptionhandler(errorcode, errorstring)) {
-  //     return 0;
-  //   }
-
-  //   journal::debug_t debug("pylith3d");
-  //   debug
-  //     << journal::at(__HERE__)
-  //     << "numberPrestressEntries:" << numberPrestressEntries
-  //     << journal::endl;
-
-  // return
-  //   Py_INCREF(Py_None);
-  //   return Py_BuildValue("i",numberPrestressEntries);
-  // }
-
-
-// Scan local coordinate rotations
-
-char pypylith3d_scan_skew__doc__[] = "";
-char pypylith3d_scan_skew__name__[] = "scan_skew";
-
-PyObject * pypylith3d_scan_skew(PyObject *, PyObject *args)
-{
-  int f77FileInput;
-  char* rotationUnits;
-  char* rotationInputFile;
-
-  int ok = PyArg_ParseTuple(args, (char *) "iss:scan_skew",
-			    &f77FileInput,
-			    &rotationUnits,
-			    &rotationInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int numberRotationEntries = 0;
-
-  scan_skew_f(&numberRotationEntries,
-	      &f77FileInput,
-	      rotationUnits,
-	      rotationInputFile,
-	      &errorcode,
-	      errorstring,
-	      strlen(rotationUnits),
-	      strlen(rotationInputFile),
-	      sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberRotationEntries:" << numberRotationEntries
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_BuildValue((char *) "i", numberRotationEntries);
-}
-
-
-// Scan slippery node entries
-
-char pypylith3d_scan_slip__doc__[] = "";
-char pypylith3d_scan_slip__name__[] = "scan_slip";
-
-PyObject * pypylith3d_scan_slip(PyObject *, PyObject *args)
-{
-  int f77FileInput;
-  char* slipperyNodeInputFile;
-
-  int ok = PyArg_ParseTuple(args, (char *) "is:scan_slip",
-			    &f77FileInput,
-			    &slipperyNodeInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int numberSlipperyNodeEntries = 0;
-
-  scan_slip_f(&numberSlipperyNodeEntries,
-	      &f77FileInput,
-	      slipperyNodeInputFile,
-	      &errorcode,
-	      errorstring,
-	      strlen(slipperyNodeInputFile),
-	      sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberSlipperyNodeEntries:" << numberSlipperyNodeEntries
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_BuildValue((char *) "i", numberSlipperyNodeEntries);
-}
-
-
-// Scan split node entries
-
-char pypylith3d_scan_split__doc__[] = "";
-char pypylith3d_scan_split__name__[] = "scan_split";
-
-PyObject * pypylith3d_scan_split(PyObject *, PyObject *args)
-{
-  int f77FileInput;
-  char* splitNodeInputFile;
-
-  int ok = PyArg_ParseTuple(args, (char *) "is:scan_split",
-			    &f77FileInput,
-			    &splitNodeInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int numberSplitNodeEntries = 0;
-
-  scan_split_f(&numberSplitNodeEntries,
-	       &f77FileInput,
-	       splitNodeInputFile,
-	       &errorcode,
-	       errorstring,
-	       strlen(splitNodeInputFile),
-	       sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberSplitNodeEntries:" << numberSplitNodeEntries
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_BuildValue((char *) "i", numberSplitNodeEntries);
-}
-
-
-// Scan time step data
-
-char pypylith3d_scan_timdat__doc__[] = "";
-char pypylith3d_scan_timdat__name__[] = "scan_timdat";
-
-PyObject * pypylith3d_scan_timdat(PyObject *, PyObject *args)
-{
-  int f77FileInput;
-  char* timeUnits;
-  char* timeStepInputFile;
-
-  int ok = PyArg_ParseTuple(args, (char *) "iss:scan_timdat",
-			    &f77FileInput,
-			    &timeUnits,
-			    &timeStepInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int numberTimeStepGroups = 0;
-  int totalNumberTimeSteps = 0;
-
-  scan_timdat_f(&totalNumberTimeSteps,
-		&numberTimeStepGroups,
-		&f77FileInput,
-		timeUnits,
-		timeStepInputFile,
-		&errorcode,
-		errorstring,
-		strlen(timeUnits),
-		strlen(timeStepInputFile),
-		sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "totalNumberTimeSteps:" << totalNumberTimeSteps
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_BuildValue((char *) "ii", numberTimeStepGroups,
-		       totalNumberTimeSteps);
-}
-
-
-
-// Scan traction BC
-
-char pypylith3d_scan_tractions__doc__[] = "";
-char pypylith3d_scan_tractions__name__[] = "scan_tractions";
-
-PyObject * pypylith3d_scan_tractions(PyObject *, PyObject *args)
-{
-  int maxElementNodes2d;
-  int f77FileInput;
-  char *tractionUnits;
-  char *tractionInputFile;
-
-  int ok = PyArg_ParseTuple(args, (char *) "iiss:scan_tractions",
-                            &maxElementNodes2d,
-			    &f77FileInput,
-			    &tractionUnits,
-			    &tractionInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int numberTractionBc = 0;
-
-  scan_tractions_f(&numberTractionBc,
-		   &maxElementNodes2d,
-		   &f77FileInput,
-		   tractionUnits,
-		   tractionInputFile,
-		   &errorcode,
-		   errorstring,
-		   strlen(tractionUnits),
-		   strlen(tractionInputFile),
-		   sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberTractionBc:" << numberTractionBc
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_BuildValue((char *) "i", numberTractionBc);
-}
-
-// Read winkler BC
-
-char pypylith3d_scan_wink__doc__[] = "";
-char pypylith3d_scan_wink__name__[] = "scan_wink";
-
-PyObject * pypylith3d_scan_wink(PyObject *, PyObject *args)
-{
-  int f77FileInput;
-  char* winklerInputFile;
-
-  int ok = PyArg_ParseTuple(args, (char *) "is:scan_wink",
-			    &f77FileInput,
-			    &winklerInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int numberWinklerEntries = 0;
-  int numberWinklerForces = 0;
-
-  scan_wink_f(&numberWinklerEntries,
-	      &numberWinklerForces,
-	      &f77FileInput,
-	      winklerInputFile,
-	      &errorcode,
-	      errorstring,
-	      strlen(winklerInputFile),
-	      sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberWinklerForces:" << numberWinklerForces
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_BuildValue((char *) "ii", numberWinklerEntries,
-	               numberWinklerForces);
-}
-
-
-// Read winkler BC for slippery nodes
-
-char pypylith3d_scan_winkx__doc__[] = "";
-char pypylith3d_scan_winkx__name__[] = "scan_winkx";
-
-PyObject * pypylith3d_scan_winkx(PyObject *, PyObject *args)
-{
-  int numberSlipperyNodeEntries;
-  int f77FileInput;
-  char* slipperyWinklerInputFile;
-
-  int ok = PyArg_ParseTuple(args, (char *) "iis:scan_winkx",
-			    &numberSlipperyNodeEntries,
-			    &f77FileInput,
-			    &slipperyWinklerInputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int numberSlipperyWinklerEntries = 0;
-  int numberSlipperyWinklerForces = 0;
-
-  scan_winkx_f(&numberSlipperyNodeEntries,
-	       &numberSlipperyWinklerEntries,
-	       &numberSlipperyWinklerForces,
-	       &f77FileInput,
-	       slipperyWinklerInputFile,
-	       &errorcode,
-	       errorstring,
-	       strlen(slipperyWinklerInputFile),
-	       sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberSlipperyWinklerForces:" << numberSlipperyWinklerForces
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_BuildValue((char *) "ii", numberSlipperyWinklerEntries,
-		       numberSlipperyWinklerForces);
-}
-    
-// version
-// $Id: scanner.cc,v 1.7 2005/06/07 19:39:11 willic3 Exp $
-
-// End of file

Deleted: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/scanner.h
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/scanner.h	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/scanner.h	2007-03-30 21:05:09 UTC (rev 6475)
@@ -1,147 +0,0 @@
-// -*- C++ -*-
-// 
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
-//
-//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
-//
-//  Permission is hereby granted, free of charge, to any person obtaining
-//  a copy of this software and associated documentation files (the
-//  "Software"), to deal in the Software without restriction, including
-//  without limitation the rights to use, copy, modify, merge, publish,
-//  distribute, sublicense, and/or sell copies of the Software, and to
-//  permit persons to whom the Software is furnished to do so, subject to
-//  the following conditions:
-//
-//  The above copyright notice and this permission notice shall be
-//  included in all copies or substantial portions of the Software.
-//
-//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 
-
-#if !defined(pypylith3d_scanner_h)
-#define pypylith3d_scanner_h
-
-// process mesh
-extern char pypylith3d_processMesh__name__[];
-extern char pypylith3d_processMesh__doc__[];
-extern "C"
-PyObject * pypylith3d_processMesh(PyObject *, PyObject *);
-
-// create a PETSc Mat
-extern char pypylith3d_createPETScMat__name__[];
-extern char pypylith3d_createPETScMat__doc__[];
-extern "C"
-PyObject * pypylith3d_createPETScMat(PyObject *, PyObject *);
-
-// destroy a PETSc Mat
-extern char pypylith3d_destroyPETScMat__name__[];
-extern char pypylith3d_destroyPETScMat__doc__[];
-extern "C"
-PyObject * pypylith3d_destroyPETScMat(PyObject *, PyObject *);
-
-// output a PETSc Mesh and Fields
-extern char pypylith3d_outputMesh__name__[];
-extern char pypylith3d_outputMesh__doc__[];
-extern "C"
-PyObject * pypylith3d_outputMesh(PyObject *, PyObject *);
-
-// scan boundary condition file
-extern char pypylith3d_scan_bc__name__[];
-extern char pypylith3d_scan_bc__doc__[];
-extern "C"
-PyObject * pypylith3d_scan_bc(PyObject *, PyObject *);
-
-// scan connectivity file
-extern char pypylith3d_scan_connect__name__[];
-extern char pypylith3d_scan_connect__doc__[];
-extern "C"
-PyObject * pypylith3d_scan_connect(PyObject *, PyObject *);
-
-// scan coordinates file
-extern char pypylith3d_scan_coords__name__[];
-extern char pypylith3d_scan_coords__doc__[];
-extern "C"
-PyObject * pypylith3d_scan_coords(PyObject *, PyObject *);
-
-// scan differential forces file
-extern char pypylith3d_scan_diff__name__[];
-extern char pypylith3d_scan_diff__doc__[];
-extern "C"
-PyObject * pypylith3d_scan_diff(PyObject *, PyObject *);
-
-// scan time step output info file
-extern char pypylith3d_scan_fuldat__name__[];
-extern char pypylith3d_scan_fuldat__doc__[];
-extern "C"
-PyObject * pypylith3d_scan_fuldat(PyObject *, PyObject *);
-
-// scan time history definition file
-extern char pypylith3d_scan_hist__name__[];
-extern char pypylith3d_scan_hist__doc__[];
-extern "C"
-PyObject * pypylith3d_scan_hist(PyObject *, PyObject *);
-
-// scan prestress file
-// extern char pypylith3d_scan_prestr__name__[];
-// extern char pypylith3d_scan_prestr__doc__[];
-// extern "C"
-// PyObject * pypylith3d_scan_prestr(PyObject *, PyObject *);
-
-// scan local coordinate rotations file
-extern char pypylith3d_scan_skew__name__[];
-extern char pypylith3d_scan_skew__doc__[];
-extern "C"
-PyObject * pypylith3d_scan_skew(PyObject *, PyObject *);
-
-// scan slippery node definitions file
-extern char pypylith3d_scan_slip__name__[];
-extern char pypylith3d_scan_slip__doc__[];
-extern "C"
-PyObject * pypylith3d_scan_slip(PyObject *, PyObject *);
-
-// scan split node definitions file
-extern char pypylith3d_scan_split__name__[];
-extern char pypylith3d_scan_split__doc__[];
-extern "C"
-PyObject * pypylith3d_scan_split(PyObject *, PyObject *);
-
-// scan time step group info file
-extern char pypylith3d_scan_timdat__name__[];
-extern char pypylith3d_scan_timdat__doc__[];
-extern "C"
-PyObject * pypylith3d_scan_timdat(PyObject *, PyObject *);
-
-// scan traction boundary conditions file
-extern char pypylith3d_scan_tractions__name__[];
-extern char pypylith3d_scan_tractions__doc__[];
-extern "C"
-PyObject * pypylith3d_scan_tractions(PyObject *, PyObject *);
-
-// scan winkler forces info file
-extern char pypylith3d_scan_wink__name__[];
-extern char pypylith3d_scan_wink__doc__[];
-extern "C"
-PyObject * pypylith3d_scan_wink(PyObject *, PyObject *);
-
-// scan winkler forces info file for slippery nodes
-extern char pypylith3d_scan_winkx__name__[];
-extern char pypylith3d_scan_winkx__doc__[];
-extern "C"
-PyObject * pypylith3d_scan_winkx(PyObject *, PyObject *);
-
-#endif
-
-// version
-// $Id: scanner.h,v 1.3 2005/03/31 23:27:58 willic3 Exp $
-
-// End of file

Modified: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/setup.cc
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/setup.cc	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/setup.cc	2007-03-30 21:05:09 UTC (rev 6475)
@@ -36,7 +36,6 @@
 
 #include "setup.h"
 #include "exceptionhandler.h"
-#include "pylith3d_externs.h"
 #include <stdio.h>
 #include <string.h>
 
@@ -144,155 +143,4 @@
   return _pyReturn;
 }
 
-// Initialize material model info
-
-char pypylith3d_matmod_def__doc__[] = "";
-char pypylith3d_matmod_def__name__[] = "matmod_def";
-
-PyObject * pypylith3d_matmod_def(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToMaterialModelInfo;
-
-  int ok = PyArg_ParseTuple(args, "O:matmod_def",
-			    &pyPointerToMaterialModelInfo);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int* pointerToMaterialModelInfo = (int*) PyCObject_AsVoidPtr(pyPointerToMaterialModelInfo);
-
-  matmod_def_f(pointerToMaterialModelInfo);
-    
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "pointerToMaterialModelInfo:" << pointerToMaterialModelInfo
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-// Precompute shape function info
-
-char pypylith3d_preshape__doc__[] = "";
-char pypylith3d_preshape__name__[] = "preshape";
-
-PyObject * pypylith3d_preshape(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToSh;
-  PyObject* pyPointerToShj;
-  PyObject* pyPointerToGauss;
-  int quadratureOrderInt;
-  int elementType;
-  int numberVolumeElementNodes;
-  int numberVolumeElementGaussPoints;
-
-  int ok = PyArg_ParseTuple(args, "OOOiiii:preshape",
-			    &pyPointerToSh,
-			    &pyPointerToShj,
-			    &pyPointerToGauss,
-			    &quadratureOrderInt,
-			    &elementType,
-			    &numberVolumeElementNodes,
-			    &numberVolumeElementGaussPoints);
-
-  if (!ok) {
-    return 0;
-  }
-
-  double* pointerToSh = (double*) PyCObject_AsVoidPtr(pyPointerToSh);
-  double* pointerToShj = (double*) PyCObject_AsVoidPtr(pyPointerToShj);
-  double* pointerToGauss = (double*) PyCObject_AsVoidPtr(pyPointerToGauss);
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-
-  preshape_f(pointerToSh,
-	     pointerToShj,
-	     pointerToGauss,
-	     &quadratureOrderInt,
-	     &elementType,
-	     &numberVolumeElementNodes,
-	     &numberVolumeElementGaussPoints,
-	     &errorcode,
-	     errorstring,
-	     sizeof(errorstring));
-
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-    
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "quadratureOrderInt:" << quadratureOrderInt
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-// Precompute shape function info for element faces
-
-char pypylith3d_preshape2d__doc__[] = "";
-char pypylith3d_preshape2d__name__[] = "preshape2d";
-
-PyObject * pypylith3d_preshape2d(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToSh2d;
-  PyObject* pyPointerToGauss2d;
-  int quadratureOrderInt;
-  int elementType;
-  int numberSurfaceElementNodes;
-  int numberSurfaceElementGaussPoints;
-
-  int ok = PyArg_ParseTuple(args, "OOiiii:preshape2d",
-			    &pyPointerToSh2d,
-			    &pyPointerToGauss2d,
-			    &quadratureOrderInt,
-			    &elementType,
-			    &numberSurfaceElementNodes,
-			    &numberSurfaceElementGaussPoints);
-
-  if (!ok) {
-    return 0;
-  }
-
-  double* pointerToSh2d = (double*) PyCObject_AsVoidPtr(pyPointerToSh2d);
-  double* pointerToGauss2d = (double*) PyCObject_AsVoidPtr(pyPointerToGauss2d);
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-
-  preshape2d_f(pointerToSh2d,
-	       pointerToGauss2d,
-	       &quadratureOrderInt,
-	       &elementType,
-	       &numberSurfaceElementNodes,
-	       &numberSurfaceElementGaussPoints,
-	       &errorcode,
-	       errorstring,
-	       sizeof(errorstring));
-
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-    
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "quadratureOrderInt:" << quadratureOrderInt
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-// version
-// $Id: setup.cc,v 1.4 2005/06/07 19:39:11 willic3 Exp $
-
 // End of file

Modified: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/setup.h
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/setup.h	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/setup.h	2007-03-30 21:05:09 UTC (rev 6475)
@@ -49,24 +49,6 @@
 extern "C"
 PyObject * pypylith3d_setup_petsc_logging(PyObject *, PyObject *);
 
-// Initialize material model info
-extern char pypylith3d_matmod_def__name__[];
-extern char pypylith3d_matmod_def__doc__[];
-extern "C"
-PyObject * pypylith3d_matmod_def(PyObject *, PyObject *);
-
-// Precompute shape function info
-extern char pypylith3d_preshape__name__[];
-extern char pypylith3d_preshape__doc__[];
-extern "C"
-PyObject * pypylith3d_preshape(PyObject *, PyObject *);
-
-// Precompute shape function info for element faces
-extern char pypylith3d_preshape2d__name__[];
-extern char pypylith3d_preshape2d__doc__[];
-extern "C"
-PyObject * pypylith3d_preshape2d(PyObject *, PyObject *);
-
 #endif
 
 // version

Deleted: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/sorting.cc
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/sorting.cc	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/sorting.cc	2007-03-30 21:05:09 UTC (rev 6475)
@@ -1,234 +0,0 @@
-// -*- C++ -*-
-// 
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
-//
-//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
-//
-//  Permission is hereby granted, free of charge, to any person obtaining
-//  a copy of this software and associated documentation files (the
-//  "Software"), to deal in the Software without restriction, including
-//  without limitation the rights to use, copy, modify, merge, publish,
-//  distribute, sublicense, and/or sell copies of the Software, and to
-//  permit persons to whom the Software is furnished to do so, subject to
-//  the following conditions:
-//
-//  The above copyright notice and this permission notice shall be
-//  included in all copies or substantial portions of the Software.
-//
-//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 
-
-#include <petscmat.h>
-#include <portinfo>
-#include "journal/debug.h"
-
-#include <Python.h>
-
-#include "sorting.h"
-#include "exceptionhandler.h"
-#include "pylith3d_externs.h"
-#include <stdio.h>
-#include <string.h>
-
-
-// Sort elements into element families
-
-char pypylith3d_sort_elements__doc__[] = "";
-char pypylith3d_sort_elements__name__[] = "sort_elements";
-
-PyObject * pypylith3d_sort_elements(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToIen;
-  PyObject* pyPointerToMat;
-  PyObject* pyPointerToMaterialModelInfo;
-  PyObject* pyPointerToVolumeElementFamilyList;
-  PyObject* pyPointerToIvfamily;
-  PyObject* pyPointerToIens;
-  PyObject* pyPointerToIvftmp;
-  PyObject* pyPointerToIndxiel;
-  PyObject* pyPointerToIelindx;
-  int numberVolumeElementNodes;
-  int numberVolumeElementGaussPoints;
-  int maxNumberVolumeElementFamilies;
-  int numberVolumeElementFamilies;
-  int prestressFlag;
-  int numberVolumeElements;
-  int numberNodes;
-
-  int ok = PyArg_ParseTuple(args, "OOOOOOOOOiiiiiii:sort_elements",
-			    &pyPointerToIen,
-			    &pyPointerToMat,
-			    &pyPointerToMaterialModelInfo,
-			    &pyPointerToVolumeElementFamilyList,
-			    &pyPointerToIvfamily,
-			    &pyPointerToIens,
-			    &pyPointerToIvftmp,
-			    &pyPointerToIndxiel,
-			    &pyPointerToIelindx,
-			    &numberVolumeElementNodes,
-			    &numberVolumeElementGaussPoints,
-			    &maxNumberVolumeElementFamilies,
-			    &numberVolumeElementFamilies,
-			    &prestressFlag,
-			    &numberVolumeElements,
-			    &numberNodes);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int* pointerToIen = (int*) PyCObject_AsVoidPtr(pyPointerToIen);
-  int* pointerToMat = (int*) PyCObject_AsVoidPtr(pyPointerToMat);
-  int* pointerToMaterialModelInfo = (int*) PyCObject_AsVoidPtr(pyPointerToMaterialModelInfo);
-  int* pointerToVolumeElementFamilyList = (int*) PyCObject_AsVoidPtr(pyPointerToVolumeElementFamilyList);
-  int* pointerToIvfamily = (int*) PyCObject_AsVoidPtr(pyPointerToIvfamily);
-  int* pointerToIens = (int*) PyCObject_AsVoidPtr(pyPointerToIens);
-  int* pointerToIvftmp = (int*) PyCObject_AsVoidPtr(pyPointerToIvftmp);
-  int* pointerToIndxiel = (int*) PyCObject_AsVoidPtr(pyPointerToIndxiel);
-  int* pointerToIelindx = (int*) PyCObject_AsVoidPtr(pyPointerToIelindx);
-  int stateSize = 0;
-  int state0Size = 0;
-  int propertySize = 0;
-
-  sort_elements_f(pointerToIen,
-		  pointerToMat,
-		  pointerToMaterialModelInfo,
-		  pointerToVolumeElementFamilyList,
-		  pointerToIvfamily,
-		  pointerToIens,
-		  pointerToIvftmp,
-		  pointerToIndxiel,
-		  pointerToIelindx,
-		  &numberVolumeElementNodes,
-		  &numberVolumeElementGaussPoints,
-		  &maxNumberVolumeElementFamilies,
-		  &numberVolumeElementFamilies,
-		  &prestressFlag,
-		  &numberVolumeElements,
-		  &numberNodes,
-		  &stateSize,
-		  &state0Size,
-		  &propertySize,
-		  &errorcode,
-		  errorstring,
-		  sizeof(errorstring));
-
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "stateSize:" << stateSize
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_BuildValue("iii",
-		       stateSize,
-		       state0Size,
-		       propertySize);
-}
-
-// Sort slippery nodes according to reordered elements
-
-char pypylith3d_sort_slip_nodes__doc__[] = "";
-char pypylith3d_sort_slip_nodes__name__[] = "sort_slip_nodes";
-
-PyObject * pypylith3d_sort_slip_nodes(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToNslip;
-  PyObject* pyPointerToIndxiel;
-  int numberSlipperyNodeEntries;
-  int numberVolumeElements;
-
-  int ok = PyArg_ParseTuple(args, "OOii:sort_slip_nodes",
-			    &pyPointerToNslip,
-			    &pyPointerToIndxiel,
-			    &numberSlipperyNodeEntries,
-			    &numberVolumeElements);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int* pointerToNslip = (int*) PyCObject_AsVoidPtr(pyPointerToNslip);
-  int* pointerToIndxiel = (int*) PyCObject_AsVoidPtr(pyPointerToIndxiel);
-
-  sort_slip_nodes_f(pointerToNslip,
-		    pointerToIndxiel,
-		    &numberSlipperyNodeEntries,
-		    &numberVolumeElements);
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberSlipperyNodeEntries:" << numberSlipperyNodeEntries
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-    
-
-
-// Sort split nodes according to reordered elements
-
-char pypylith3d_sort_split_nodes__doc__[] = "";
-char pypylith3d_sort_split_nodes__name__[] = "sort_split_nodes";
-
-PyObject * pypylith3d_sort_split_nodes(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToNfault;
-  PyObject* pyPointerToIndxiel;
-  int numberSplitNodeEntries;
-  int numberVolumeElements;
-
-  int ok = PyArg_ParseTuple(args, "OOii:sort_split_nodes",
-			    &pyPointerToNfault,
-			    &pyPointerToIndxiel,
-			    &numberSplitNodeEntries,
-			    &numberVolumeElements);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int* pointerToNfault = (int*) PyCObject_AsVoidPtr(pyPointerToNfault);
-  int* pointerToIndxiel = (int*) PyCObject_AsVoidPtr(pyPointerToIndxiel);
-
-  sort_split_nodes_f(pointerToNfault,
-		    pointerToIndxiel,
-		    &numberSplitNodeEntries,
-		    &numberVolumeElements);
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberSplitNodeEntries:" << numberSplitNodeEntries
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-// version
-// $Id: sorting.cc,v 1.2 2005/06/07 19:39:11 willic3 Exp $
-
-// End of file

Deleted: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/sorting.h
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/sorting.h	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/sorting.h	2007-03-30 21:05:09 UTC (rev 6475)
@@ -1,57 +0,0 @@
-// -*- C++ -*-
-// 
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
-//
-//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
-//
-//  Permission is hereby granted, free of charge, to any person obtaining
-//  a copy of this software and associated documentation files (the
-//  "Software"), to deal in the Software without restriction, including
-//  without limitation the rights to use, copy, modify, merge, publish,
-//  distribute, sublicense, and/or sell copies of the Software, and to
-//  permit persons to whom the Software is furnished to do so, subject to
-//  the following conditions:
-//
-//  The above copyright notice and this permission notice shall be
-//  included in all copies or substantial portions of the Software.
-//
-//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 
-
-#if !defined(pypylith3d_sorting_h)
-#define pypylith3d_sorting_h
-
-// sort elements into element families
-extern char pypylith3d_sort_elements__name__[];
-extern char pypylith3d_sort_elements__doc__[];
-extern "C"
-PyObject * pypylith3d_sort_elements(PyObject *, PyObject *);
-
-// Sort slippery nodes according to reordered elements
-extern char pypylith3d_sort_slip_nodes__name__[];
-extern char pypylith3d_sort_slip_nodes__doc__[];
-extern "C"
-PyObject * pypylith3d_sort_slip_nodes(PyObject *, PyObject *);
-
-// Sort split nodes according to reordered elements
-extern char pypylith3d_sort_split_nodes__name__[];
-extern char pypylith3d_sort_split_nodes__doc__[];
-extern "C"
-PyObject * pypylith3d_sort_split_nodes(PyObject *, PyObject *);
-
-#endif
-
-// version
-// $Id: sorting.h,v 1.2 2005/04/21 23:20:18 willic3 Exp $
-
-// End of file

Deleted: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/sparse.cc
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/sparse.cc	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/sparse.cc	2007-03-30 21:05:09 UTC (rev 6475)
@@ -1,403 +0,0 @@
-// -*- C++ -*-
-// 
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
-//
-//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
-//
-//  Permission is hereby granted, free of charge, to any person obtaining
-//  a copy of this software and associated documentation files (the
-//  "Software"), to deal in the Software without restriction, including
-//  without limitation the rights to use, copy, modify, merge, publish,
-//  distribute, sublicense, and/or sell copies of the Software, and to
-//  permit persons to whom the Software is furnished to do so, subject to
-//  the following conditions:
-//
-//  The above copyright notice and this permission notice shall be
-//  included in all copies or substantial portions of the Software.
-//
-//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 
-
-#include <petscmat.h>
-#include <portinfo>
-#include "journal/debug.h"
-
-#include <Python.h>
-
-#include "sparse.h"
-#include "exceptionhandler.h"
-#include "pylith3d_externs.h"
-#include <stdio.h>
-#include <string.h>
-
-
-// Compute number of nonzero entries in stiffness matrix
-
-char pypylith3d_cmp_stiffsz__doc__[] = "";
-char pypylith3d_cmp_stiffsz__name__[] = "cmp_stiffsz";
-
-PyObject * pypylith3d_cmp_stiffsz(PyObject *, PyObject *args)
-{
-  int numberGlobalEquations;
-  PyObject* pyPointerToLm;
-  PyObject* pyPointerToLmx;
-  int numberVolumeElements;
-  int totalNumberSlipperyNodes;
-  int numberVolumeElementNodes;
-
-  int ok = PyArg_ParseTuple(args, "iOOiii:cmp_stiffsz",
-			    &numberGlobalEquations,
-			    &pyPointerToLm,
-			    &pyPointerToLmx,
-			    &numberVolumeElements,
-			    &totalNumberSlipperyNodes,
-			    &numberVolumeElementNodes);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int* pointerToLm = (int*) PyCObject_AsVoidPtr(pyPointerToLm);
-  int* pointerToLmx = (int*) PyCObject_AsVoidPtr(pyPointerToLmx);
-  int workingArraySize = 0;
-
-  cmp_stiffsz_f(&numberGlobalEquations,
-	   	pointerToLm,
-	   	pointerToLmx,
-	   	&numberVolumeElements,
-	   	&workingArraySize,
-	   	&totalNumberSlipperyNodes,
-	   	&numberVolumeElementNodes,
-	   	&errorcode,
-	   	errorstring,
-	   	sizeof(errorstring));
-
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-		  
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "workingArraySize:" << workingArraySize
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_BuildValue("i", workingArraySize);
-}
-
-
-
-// Create linked list of nonzero row and column entries in the stiffness matrix
-
-char pypylith3d_lnklst__doc__[] = "";
-char pypylith3d_lnklst__name__[] = "lnklst";
-
-PyObject * pypylith3d_lnklst(PyObject *, PyObject *args)
-{
-  int numberGlobalEquations;
-  PyObject* pyPointerToLm;
-  PyObject* pyPointerToLmx;
-  int numberVolumeElements;
-  int numberVolumeElementNodes;
-  int numberVolumeElementEquations;
-  PyObject* pyPointerToIndx;
-  PyObject* pyPointerToLink;
-  PyObject* pyPointerToNbrs;
-  int workingArraySize;
-  int totalNumberSlipperyNodes;
-
-  int ok = PyArg_ParseTuple(args, "iOOiiiOOOii:lnklst",
-			    &numberGlobalEquations,
-			    &pyPointerToLm,
-			    &pyPointerToLmx,
-			    &numberVolumeElements,
-			    &numberVolumeElementNodes,
-			    &numberVolumeElementEquations,
-			    &pyPointerToIndx,
-			    &pyPointerToLink,
-			    &pyPointerToNbrs,
-			    &workingArraySize,
-			    &totalNumberSlipperyNodes);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int* pointerToLm = (int*) PyCObject_AsVoidPtr(pyPointerToLm);
-  int* pointerToLmx = (int*) PyCObject_AsVoidPtr(pyPointerToLmx);
-  int* pointerToIndx = (int*) PyCObject_AsVoidPtr(pyPointerToIndx);
-  int* pointerToLink = (int*) PyCObject_AsVoidPtr(pyPointerToLink);
-  int* pointerToNbrs = (int*) PyCObject_AsVoidPtr(pyPointerToNbrs);
-  int stiffnessMatrixSize =0;
-  int stiffnessOffDiagonalSize =0;
-
-  lnklst_f(&numberGlobalEquations,
-	   pointerToLm,
-	   pointerToLmx,
-	   &numberVolumeElements,
-	   &numberVolumeElementNodes,
-	   &numberVolumeElementEquations,
-	   pointerToIndx,
-	   pointerToLink,
-	   pointerToNbrs,
-	   &workingArraySize,
-	   &stiffnessOffDiagonalSize,
-	   &stiffnessMatrixSize,
-	   &totalNumberSlipperyNodes,
-	   &errorcode,
-	   errorstring,
-	   sizeof(errorstring));
-
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-		  
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "stiffnessMatrixSize:" << stiffnessMatrixSize
-    << journal::endl;
-
-  // return
-  return Py_BuildValue("ii", stiffnessMatrixSize,
-   		  stiffnessOffDiagonalSize);
-}
-
-
-// Localize id array for reference by element
-
-char pypylith3d_local__doc__[] = "";
-char pypylith3d_local__name__[] = "local";
-
-PyObject * pypylith3d_local(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToId;
-  int numberNodes;
-  PyObject* pyPointerToIens;
-  PyObject* pyPointerToLm;
-  int numberVolumeElements;
-  int numberVolumeElementNodes;
-
-  int ok = PyArg_ParseTuple(args, "OiOOii:local",
-			    &pyPointerToId,
-			    &numberNodes,
-			    &pyPointerToIens,
-			    &pyPointerToLm,
-			    &numberVolumeElements,
-			    &numberVolumeElementNodes);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int* pointerToId = (int*) PyCObject_AsVoidPtr(pyPointerToId);
-  int* pointerToIens = (int*) PyCObject_AsVoidPtr(pyPointerToIens);
-  int* pointerToLm = (int*) PyCObject_AsVoidPtr(pyPointerToLm);
-
-  local_f(pointerToId,
-	  &numberNodes,
-	  pointerToIens,
-	  pointerToLm,
-	  &numberVolumeElements,
-	  &numberVolumeElementNodes);
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberVolumeElements:" << numberVolumeElements
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-    
-
-// Localize nfault array for reference by element
-
-char pypylith3d_localf__doc__[] = "";
-char pypylith3d_localf__name__[] = "localf";
-
-PyObject * pypylith3d_localf(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToIens;
-  PyObject* pyPointerToLmf;
-  int numberVolumeElements;
-  PyObject* pyPointerToNfault;
-  int numberSplitNodeEntries;
-  int numberVolumeElementNodes;
-
-  int ok = PyArg_ParseTuple(args, "OOiOii:localf",
-			    &pyPointerToIens,
-			    &pyPointerToLmf,
-			    &numberVolumeElements,
-			    &pyPointerToNfault,
-			    &numberSplitNodeEntries,
-			    &numberVolumeElementNodes);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int* pointerToIens = (int*) PyCObject_AsVoidPtr(pyPointerToIens);
-  int* pointerToLmf = (int*) PyCObject_AsVoidPtr(pyPointerToLmf);
-  int* pointerToNfault = (int*) PyCObject_AsVoidPtr(pyPointerToNfault);
-
-  localf_f(pointerToIens,
-	   pointerToLmf,
-	   &numberVolumeElements,
-	   pointerToNfault,
-	   &numberSplitNodeEntries,
-	   &numberVolumeElementNodes);
-		  
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberSplitNodeEntries:" << numberSplitNodeEntries
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-    
-
-// Localize idx array for reference by element
-
-char pypylith3d_localx__doc__[] = "";
-char pypylith3d_localx__name__[] = "localx";
-
-PyObject * pypylith3d_localx(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToIdx;
-  int numberNodes;
-  PyObject* pyPointerToIens;
-  PyObject* pyPointerToLmx;
-  int numberVolumeElements;
-  PyObject* pyPointerToNslip;
-  int numberSlipperyNodeEntries;
-  int numberVolumeElementNodes;
-
-  int ok = PyArg_ParseTuple(args, "OiOOiOii:localx",
-			    &pyPointerToIdx,
-  			    &numberNodes,
-  			    &pyPointerToIens,
-  			    &pyPointerToLmx,
-  			    &numberVolumeElements,
-  			    &pyPointerToNslip,
-			    &numberSlipperyNodeEntries,
-  			    &numberVolumeElementNodes);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int* pointerToIdx = (int*) PyCObject_AsVoidPtr(pyPointerToIdx);
-  int* pointerToIens = (int*) PyCObject_AsVoidPtr(pyPointerToIens);
-  int* pointerToLmx = (int*) PyCObject_AsVoidPtr(pyPointerToLmx);
-  int* pointerToNslip = (int*) PyCObject_AsVoidPtr(pyPointerToNslip);
-
-  localx_f(pointerToIdx,
-	   &numberNodes,
-	   pointerToIens,
-	   pointerToLmx,
-	   &numberVolumeElements,
-	   pointerToNslip,
-	   &numberSlipperyNodeEntries,
-	   &numberVolumeElementNodes);
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberVolumeElements:" << numberVolumeElements
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-// Transform linked list into index array for modified sparse row format
-
-char pypylith3d_makemsr__doc__[] = "";
-char pypylith3d_makemsr__name__[] = "makemsr";
-
-PyObject * pypylith3d_makemsr(PyObject *, PyObject *args)
-{
-  PyObject* pyA;
-  PyObject* pyPointerToIndx;
-  PyObject* pyPointerToLink;
-  PyObject* pyPointerToNbrs;
-  int numberGlobalEquations;
-  int stiffnessMatrixSize;
-  int workingArraySize;
-
-  int ok = PyArg_ParseTuple(args, "OOOOiii:makemsr",
-                            &pyA,
-			    &pyPointerToIndx,
-			    &pyPointerToLink,
-			    &pyPointerToNbrs,
-			    &numberGlobalEquations,
-			    &stiffnessMatrixSize,
-			    &workingArraySize);
-
-  if (!ok) {
-    return 0;
-  }
-  Mat A = (Mat) PyCObject_AsVoidPtr(pyA);
-  int* pointerToIndx = (int*) PyCObject_AsVoidPtr(pyPointerToIndx);
-  int* pointerToLink = (int*) PyCObject_AsVoidPtr(pyPointerToLink);
-  int* pointerToNbrs = (int*) PyCObject_AsVoidPtr(pyPointerToNbrs);
-  int minimumNonzeroTermsPerRow = 0;
-  int maximumNonzeroTermsPerRow = 0;
-  double averageNonzeroTermsPerRow = 0.0;
-
-  makemsr_f(&A,
-	    pointerToIndx,
-	    pointerToLink,
-	    pointerToNbrs,
-	    &numberGlobalEquations,
-	    &stiffnessMatrixSize,
-	    &workingArraySize,
-	    &minimumNonzeroTermsPerRow,
-	    &maximumNonzeroTermsPerRow,
-	    &averageNonzeroTermsPerRow);
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "workingArraySize:" << workingArraySize
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  // return Py_None;
-  return Py_BuildValue("iid",
-		       minimumNonzeroTermsPerRow,
-		       maximumNonzeroTermsPerRow,
-		       averageNonzeroTermsPerRow);
-}
-
-
-// version
-// $Id: sparse.cc,v 1.18 2005/06/07 19:39:11 willic3 Exp $
-
-// End of file

Deleted: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/sparse.h
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/sparse.h	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/sparse.h	2007-03-30 21:05:09 UTC (rev 6475)
@@ -1,75 +0,0 @@
-// -*- C++ -*-
-// 
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
-//
-//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
-//
-//  Permission is hereby granted, free of charge, to any person obtaining
-//  a copy of this software and associated documentation files (the
-//  "Software"), to deal in the Software without restriction, including
-//  without limitation the rights to use, copy, modify, merge, publish,
-//  distribute, sublicense, and/or sell copies of the Software, and to
-//  permit persons to whom the Software is furnished to do so, subject to
-//  the following conditions:
-//
-//  The above copyright notice and this permission notice shall be
-//  included in all copies or substantial portions of the Software.
-//
-//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 
-
-#if !defined(pypylith3d_sparse_h)
-#define pypylith3d_sparse_h
-
-// compute maximum number of nonzero entries in stiffness matrix
-extern char pypylith3d_cmp_stiffsz__name__[];
-extern char pypylith3d_cmp_stiffsz__doc__[];
-extern "C"
-PyObject * pypylith3d_cmp_stiffsz(PyObject *, PyObject *);
-
-// create linked list for sparse matrix
-extern char pypylith3d_lnklst__name__[];
-extern char pypylith3d_lnklst__doc__[];
-extern "C"
-PyObject * pypylith3d_lnklst(PyObject *, PyObject *);
-
-// localize id array for reference by element
-extern char pypylith3d_local__name__[];
-extern char pypylith3d_local__doc__[];
-extern "C"
-PyObject * pypylith3d_local(PyObject *, PyObject *);
-
-// localize nfault array for reference by element
-extern char pypylith3d_localf__name__[];
-extern char pypylith3d_localf__doc__[];
-extern "C"
-PyObject * pypylith3d_localf(PyObject *, PyObject *);
-
-// localize idx array for reference by element
-extern char pypylith3d_localx__name__[];
-extern char pypylith3d_localx__doc__[];
-extern "C"
-PyObject * pypylith3d_localx(PyObject *, PyObject *);
-
-// create sparse matrix in modified sparse row format
-extern char pypylith3d_makemsr__name__[];
-extern char pypylith3d_makemsr__doc__[];
-extern "C"
-PyObject * pypylith3d_makemsr(PyObject *, PyObject *);
-
-#endif
-
-// version
-// $Id: sparse.h,v 1.5 2005/04/21 23:21:00 willic3 Exp $
-
-// End of file

Deleted: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/viscos.cc
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/viscos.cc	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/viscos.cc	2007-03-30 21:05:09 UTC (rev 6475)
@@ -1,981 +0,0 @@
-// -*- C++ -*-
-// 
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
-//
-//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
-//
-//  Permission is hereby granted, free of charge, to any person obtaining
-//  a copy of this software and associated documentation files (the
-//  "Software"), to deal in the Software without restriction, including
-//  without limitation the rights to use, copy, modify, merge, publish,
-//  distribute, sublicense, and/or sell copies of the Software, and to
-//  permit persons to whom the Software is furnished to do so, subject to
-//  the following conditions:
-//
-//  The above copyright notice and this permission notice shall be
-//  included in all copies or substantial portions of the Software.
-//
-//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 
-
-#include <petscmat.h>
-#include <portinfo>
-#include "journal/debug.h"
-
-#include <Python.h>
-
-#include "viscos.h"
-#include "exceptionhandler.h"
-#include "pylith3d_externs.h"
-#include <stdio.h>
-#include <string.h>
-
-
-// Perform the time-dependent solution.
-
-char pypylith3d_viscos__doc__[] = "";
-char pypylith3d_viscos__name__[] = "viscos";
-
-PyObject * pypylith3d_viscos(PyObject *, PyObject *args)
-{
-  PyObject* pyA;                              // Sparse matrix arrays
-  PyObject* pyRhs;
-  PyObject* pySol;
-  PyObject* pyPointerToBextern;               // Force vectors
-  PyObject* pyPointerToBtraction;
-  PyObject* pyPointerToBgravity;
-  PyObject* pyPointerToBconcForce;
-  PyObject* pyPointerToBintern;
-  PyObject* pyPointerToBresid;
-  PyObject* pyPointerToBwink;
-  PyObject* pyPointerToBwinkx;
-  PyObject* pyPointerToDispVec;
-  PyObject* pyPointerToDprev;
-  PyObject* pyPointerToListArrayNforce;
-  PyObject* pyPointerToListArrayGrav;
-  PyObject* pyPointerToX;                     // Global arrays
-  PyObject* pyPointerToD;
-  PyObject* pyPointerToDeld;
-  PyObject* pyPointerToDcur;
-  PyObject* pyPointerToId;
-  PyObject* pyPointerToIwink;
-  PyObject* pyPointerToWink;
-  PyObject* pyPointerToListArrayNsysdat;
-  PyObject* pyPointerToListArrayIddmat;
-  PyObject* pyPointerToIbond;                 // Boundary condition arrays
-  PyObject* pyPointerToBond;
-  PyObject* pyPointerToDx;                    // Slippery node arrays
-  PyObject* pyPointerToDeldx;
-  PyObject* pyPointerToDxcur;
-  PyObject* pyPointerToDiforc;
-  PyObject* pyPointerToIdx;
-  PyObject* pyPointerToIwinkx;
-  PyObject* pyPointerToWinkx;
-  PyObject* pyPointerToIdslp;
-  PyObject* pyPointerToIpslp;
-  PyObject* pyPointerToIdhist;
-  PyObject* pyPointerToFault;                 // Split node arrays
-  PyObject* pyPointerToNfault;
-  PyObject* pyPointerToDfault;
-  PyObject* pyPointerToTfault;
-  PyObject* pyPointerToS;                     // Local stiffness matrix arrays
-  PyObject* pyPointerToStemp;
-  PyObject* pyPointerToState;                 // Element arrays
-  PyObject* pyPointerToDstate;
-  PyObject* pyPointerToState0;
-  PyObject* pyPointerToDmat;
-  PyObject* pyPointerToIen;
-  PyObject* pyPointerToLm;
-  PyObject* pyPointerToLmx;
-  PyObject* pyPointerToLmf;
-  PyObject* pyPointerToIvfamily;
-  PyObject* pyPointerToListArrayNpar;
-  PyObject* pyPointerToIelindx;
-  PyObject* pyPointerToTractionverts;         // Traction BC arrays
-  PyObject* pyPointerToTractionvals;
-  PyObject* pyPointerToGauss2d;
-  PyObject* pyPointerToSh2d;
-  PyObject* pyPointerToListArrayElementTypeInfo2d;
-  PyObject* pyPointerToListArrayPropertyList; // Material property arrays
-  PyObject* pyPointerToMaterialModelInfo;
-  PyObject* pyPointerToGauss;                 // Element type arrays
-  PyObject* pyPointerToSh;
-  PyObject* pyPointerToShj;
-  PyObject* pyPointerToListArrayElementTypeInfo;
-  PyObject* pyPointerToHistry;                // Time information
-  PyObject* pyPointerToListArrayRtimdat;
-  PyObject* pyPointerToListArrayNtimdat;
-  PyObject* pyPointerToListArrayNvisdat;
-  PyObject* pyPointerToMaxstp;
-  PyObject* pyPointerToDelt;
-  PyObject* pyPointerToAlfa;
-  PyObject* pyPointerToMaxit;
-  PyObject* pyPointerToNtdinit;
-  PyObject* pyPointerToLgdef;
-  PyObject* pyPointerToUtol;
-  PyObject* pyPointerToFtol;
-  PyObject* pyPointerToEtol;
-  PyObject* pyPointerToItmax;
-  PyObject* pyPointerToListArrayRgiter;       // Iterative solution information
-  PyObject* pyPointerToSkew;                  // Skew rotation information
-  PyObject* pyPointerToIprint;                // Input/output information
-  PyObject* pyPointerToListArrayNcodat;
-  PyObject* pyPointerToListArrayNunits;
-  PyObject* pyPointerToListArrayNprint;
-  PyObject* pyPointerToIstatout;
-  PyObject* pyPointerToNstatout;
-  char* asciiOutputFile;                      // Output file names
-  char* plotOutputFile;
-  char* ucdOutputRoot;
-  int viscousStage;
-  int iterateEvent;
-
-  int ok = PyArg_ParseTuple(args, "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOsssii:viscos",
-			    &pyA,                              // Sparse matrix arrays
-			    &pyRhs,
-			    &pySol,
-			    &pyPointerToBextern,               // Force vectors
-			    &pyPointerToBtraction,
-			    &pyPointerToBgravity,
-			    &pyPointerToBconcForce,
-			    &pyPointerToBintern,
-			    &pyPointerToBresid,
-			    &pyPointerToBwink,
-			    &pyPointerToBwinkx,
-			    &pyPointerToDispVec,
-			    &pyPointerToDprev,
-			    &pyPointerToListArrayNforce,
-			    &pyPointerToListArrayGrav,
-			    &pyPointerToX,                     // Global arrays
-			    &pyPointerToD,
-			    &pyPointerToDeld,
-			    &pyPointerToDcur,
-			    &pyPointerToId,
-			    &pyPointerToIwink,
-			    &pyPointerToWink,
-			    &pyPointerToListArrayNsysdat,
-			    &pyPointerToListArrayIddmat,
-			    &pyPointerToIbond,                 // Boundary condition arrays
-			    &pyPointerToBond,
-			    &pyPointerToDx,                    // Slippery node arrays
-			    &pyPointerToDeldx,
-			    &pyPointerToDxcur,
-			    &pyPointerToDiforc,
-			    &pyPointerToIdx,
-			    &pyPointerToIwinkx,
-			    &pyPointerToWinkx,
-			    &pyPointerToIdslp,
-			    &pyPointerToIpslp,
-			    &pyPointerToIdhist,
-			    &pyPointerToFault,                 // Split node arrays
-			    &pyPointerToNfault,
-			    &pyPointerToDfault,
-			    &pyPointerToTfault,
-			    &pyPointerToS,                     // Local stiffness matrix arrays
-			    &pyPointerToStemp,
-			    &pyPointerToState,                 // Element arrays
-			    &pyPointerToDstate,
-			    &pyPointerToState0,
-			    &pyPointerToDmat,
-			    &pyPointerToIen,
-			    &pyPointerToLm,
-			    &pyPointerToLmx,
-			    &pyPointerToLmf,
-			    &pyPointerToIvfamily,
-			    &pyPointerToListArrayNpar,
-			    &pyPointerToIelindx,
-                            &pyPointerToTractionverts,         // Traction BC arrays
-                            &pyPointerToTractionvals,
-                            &pyPointerToGauss2d,
-                            &pyPointerToSh2d,
-                            &pyPointerToListArrayElementTypeInfo2d,
-			    &pyPointerToListArrayPropertyList, // Material property arrays
-			    &pyPointerToMaterialModelInfo,
-			    &pyPointerToGauss,                 // Element type arrays
-			    &pyPointerToSh,
-			    &pyPointerToShj,
-			    &pyPointerToListArrayElementTypeInfo,
-			    &pyPointerToHistry,                // Time information
-			    &pyPointerToListArrayRtimdat,
-			    &pyPointerToListArrayNtimdat,
-			    &pyPointerToListArrayNvisdat,
-			    &pyPointerToMaxstp,
-			    &pyPointerToDelt,
-			    &pyPointerToAlfa,
-			    &pyPointerToMaxit,
-			    &pyPointerToNtdinit,
-			    &pyPointerToLgdef,
-			    &pyPointerToUtol,
-			    &pyPointerToFtol,
-			    &pyPointerToEtol,
-			    &pyPointerToItmax,
-			    &pyPointerToListArrayRgiter,       // Iterative solution information
-			    &pyPointerToSkew,                  // Skew rotation information
-			    &pyPointerToIprint,                // Input/output information
-			    &pyPointerToListArrayNcodat,
-			    &pyPointerToListArrayNunits,
-			    &pyPointerToListArrayNprint,
-			    &pyPointerToIstatout,
-			    &pyPointerToNstatout,
-			    &asciiOutputFile,                  // Output file names
-			    &plotOutputFile,
-			    &ucdOutputRoot,
-                            &viscousStage,
-                            &iterateEvent);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  Mat      A = (Mat) PyCObject_AsVoidPtr(pyA);
-  Vec      rhs = (Vec) PyCObject_AsVoidPtr(pyRhs);
-  Vec      sol = (Vec) PyCObject_AsVoidPtr(pySol);
-  double*  pointerToBextern = (double*) PyCObject_AsVoidPtr(pyPointerToBextern);
-  double*  pointerToBtraction = (double*) PyCObject_AsVoidPtr(pyPointerToBtraction);
-  double*  pointerToBgravity = (double*) PyCObject_AsVoidPtr(pyPointerToBgravity);
-  double*  pointerToBconcForce = (double*) PyCObject_AsVoidPtr(pyPointerToBconcForce);
-  double*  pointerToBintern = (double*) PyCObject_AsVoidPtr(pyPointerToBintern);
-  double*  pointerToBresid = (double*) PyCObject_AsVoidPtr(pyPointerToBresid);
-  double*  pointerToBwink = (double*) PyCObject_AsVoidPtr(pyPointerToBwink);
-  double*  pointerToBwinkx = (double*) PyCObject_AsVoidPtr(pyPointerToBwinkx);
-  double*  pointerToDispVec = (double*) PyCObject_AsVoidPtr(pyPointerToDispVec);
-  double*  pointerToDprev = (double*) PyCObject_AsVoidPtr(pyPointerToDprev);
-  int*  pointerToListArrayNforce = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNforce);
-  double*  pointerToListArrayGrav = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayGrav);
-  double*  pointerToX = (double*) PyCObject_AsVoidPtr(pyPointerToX);
-  double*  pointerToD = (double*) PyCObject_AsVoidPtr(pyPointerToD);
-  double*  pointerToDeld = (double*) PyCObject_AsVoidPtr(pyPointerToDeld);
-  double*  pointerToDcur = (double*) PyCObject_AsVoidPtr(pyPointerToDcur);
-  int*  pointerToId = (int*) PyCObject_AsVoidPtr(pyPointerToId);
-  int*  pointerToIwink = (int*) PyCObject_AsVoidPtr(pyPointerToIwink);
-  double*  pointerToWink = (double*) PyCObject_AsVoidPtr(pyPointerToWink);
-  int*  pointerToListArrayNsysdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNsysdat);
-  int*  pointerToListArrayIddmat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayIddmat);
-  int*  pointerToIbond = (int*) PyCObject_AsVoidPtr(pyPointerToIbond);
-  double*  pointerToBond = (double*) PyCObject_AsVoidPtr(pyPointerToBond);
-  double*  pointerToDx = (double*) PyCObject_AsVoidPtr(pyPointerToDx);
-  double*  pointerToDeldx = (double*) PyCObject_AsVoidPtr(pyPointerToDeldx);
-  double*  pointerToDxcur = (double*) PyCObject_AsVoidPtr(pyPointerToDxcur);
-  double*  pointerToDiforc = (double*) PyCObject_AsVoidPtr(pyPointerToDiforc);
-  int*  pointerToIdx = (int*) PyCObject_AsVoidPtr(pyPointerToIdx);
-  int*  pointerToIwinkx = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkx);
-  double*  pointerToWinkx = (double*) PyCObject_AsVoidPtr(pyPointerToWinkx);
-  int*  pointerToIdslp = (int*) PyCObject_AsVoidPtr(pyPointerToIdslp);
-  int*  pointerToIpslp = (int*) PyCObject_AsVoidPtr(pyPointerToIpslp);
-  int*  pointerToIdhist = (int*) PyCObject_AsVoidPtr(pyPointerToIdhist);
-  double*  pointerToFault = (double*) PyCObject_AsVoidPtr(pyPointerToFault);
-  int*  pointerToNfault = (int*) PyCObject_AsVoidPtr(pyPointerToNfault);
-  double*  pointerToDfault = (double*) PyCObject_AsVoidPtr(pyPointerToDfault);
-  double*  pointerToTfault = (double*) PyCObject_AsVoidPtr(pyPointerToTfault);
-  double*  pointerToS = (double*) PyCObject_AsVoidPtr(pyPointerToS);
-  double*  pointerToStemp = (double*) PyCObject_AsVoidPtr(pyPointerToStemp);
-  double*  pointerToState = (double*) PyCObject_AsVoidPtr(pyPointerToState);
-  double*  pointerToDstate = (double*) PyCObject_AsVoidPtr(pyPointerToDstate);
-  double*  pointerToState0 = (double*) PyCObject_AsVoidPtr(pyPointerToState0);
-  double*  pointerToDmat = (double*) PyCObject_AsVoidPtr(pyPointerToDmat);
-  int*  pointerToIen = (int*) PyCObject_AsVoidPtr(pyPointerToIen);
-  int*  pointerToLm = (int*) PyCObject_AsVoidPtr(pyPointerToLm);
-  int*  pointerToLmx = (int*) PyCObject_AsVoidPtr(pyPointerToLmx);
-  int*  pointerToLmf = (int*) PyCObject_AsVoidPtr(pyPointerToLmf);
-  int*  pointerToIvfamily = (int*) PyCObject_AsVoidPtr(pyPointerToIvfamily);
-  int*  pointerToListArrayNpar = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNpar);
-  int*  pointerToIelindx = (int*) PyCObject_AsVoidPtr(pyPointerToIelindx);
-  int*  pointerToTractionverts = (int*) PyCObject_AsVoidPtr(pyPointerToTractionverts);
-  double*  pointerToTractionvals = (double*) PyCObject_AsVoidPtr(pyPointerToTractionvals);
-  double*  pointerToGauss2d = (double*) PyCObject_AsVoidPtr(pyPointerToGauss2d);
-  double*  pointerToSh2d = (double*) PyCObject_AsVoidPtr(pyPointerToSh2d);
-  int*  pointerToListArrayElementTypeInfo2d = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayElementTypeInfo2d);
-  double*  pointerToListArrayPropertyList = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayPropertyList);
-  int*  pointerToMaterialModelInfo = (int*) PyCObject_AsVoidPtr(pyPointerToMaterialModelInfo);
-  double*  pointerToGauss = (double*) PyCObject_AsVoidPtr(pyPointerToGauss);
-  double*  pointerToSh = (double*) PyCObject_AsVoidPtr(pyPointerToSh);
-  double*  pointerToShj = (double*) PyCObject_AsVoidPtr(pyPointerToShj);
-  int*  pointerToListArrayElementTypeInfo = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayElementTypeInfo);
-  double*  pointerToHistry = (double*) PyCObject_AsVoidPtr(pyPointerToHistry);
-  double*  pointerToListArrayRtimdat = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayRtimdat);
-  int*  pointerToListArrayNtimdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNtimdat);
-  int*  pointerToListArrayNvisdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNvisdat);
-  int*  pointerToMaxstp = (int*) PyCObject_AsVoidPtr(pyPointerToMaxstp);
-  double*  pointerToDelt = (double*) PyCObject_AsVoidPtr(pyPointerToDelt);
-  double*  pointerToAlfa = (double*) PyCObject_AsVoidPtr(pyPointerToAlfa);
-  int*  pointerToMaxit = (int*) PyCObject_AsVoidPtr(pyPointerToMaxit);
-  int*  pointerToNtdinit = (int*) PyCObject_AsVoidPtr(pyPointerToNtdinit);
-  int*  pointerToLgdef = (int*) PyCObject_AsVoidPtr(pyPointerToLgdef);
-  double*  pointerToUtol = (double*) PyCObject_AsVoidPtr(pyPointerToUtol);
-  double*  pointerToFtol = (double*) PyCObject_AsVoidPtr(pyPointerToFtol);
-  double*  pointerToEtol = (double*) PyCObject_AsVoidPtr(pyPointerToEtol);
-  int*  pointerToItmax = (int*) PyCObject_AsVoidPtr(pyPointerToItmax);
-  double*  pointerToListArrayRgiter = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayRgiter);
-  double*  pointerToSkew = (double*) PyCObject_AsVoidPtr(pyPointerToSkew);
-  int*  pointerToIprint = (int*) PyCObject_AsVoidPtr(pyPointerToIprint);
-  int*  pointerToListArrayNcodat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNcodat);
-  int*  pointerToListArrayNunits = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNunits);
-  int*  pointerToListArrayNprint = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNprint);
-  int*  pointerToIstatout = (int*) PyCObject_AsVoidPtr(pyPointerToIstatout);
-  int*  pointerToNstatout = (int*) PyCObject_AsVoidPtr(pyPointerToNstatout);
-
-
-  viscos_f(&A,                            // 1: Sparse matrix arrays
-	   &rhs,
-	   &sol,
-	   pointerToBextern,                  // Force vectors
-	   pointerToBtraction,
-	   pointerToBgravity,
-	   pointerToBconcForce,
-	   pointerToBintern,
-	   pointerToBresid,
-	   pointerToBwink,                    // 10
-	   pointerToBwinkx,
-	   pointerToDispVec,
-	   pointerToDprev,
-	   pointerToListArrayNforce,
-	   pointerToListArrayGrav,
-	   pointerToX,                        // Global arrays
-	   pointerToD,
-	   pointerToDeld,
-	   pointerToDcur,
-	   pointerToId,                       // 20
-	   pointerToIwink,
-	   pointerToWink,
-	   pointerToListArrayNsysdat,
-	   pointerToListArrayIddmat,
-	   pointerToIbond,                    // Boundary condition arrays
-	   pointerToBond,
-	   pointerToDx,                       // Slippery node arrays
-	   pointerToDeldx,
-	   pointerToDxcur,
-	   pointerToDiforc,                   // 30
-	   pointerToIdx,
-	   pointerToIwinkx,
-	   pointerToWinkx,
-	   pointerToIdslp,
-	   pointerToIpslp,
-	   pointerToIdhist,
-	   pointerToFault,                    // Split node arrays
-	   pointerToNfault,
-	   pointerToDfault,
-	   pointerToTfault,                   // 40
-	   pointerToS,                        // Local stiffness matrix arrays
-	   pointerToStemp,
-	   pointerToState,                    // Element arrays
-	   pointerToDstate,
-	   pointerToState0,
-	   pointerToDmat,
-	   pointerToIen,
-	   pointerToLm,
-	   pointerToLmx,
-	   pointerToLmf,                      // 50
-	   pointerToIvfamily,
-	   pointerToListArrayNpar,
-	   pointerToIelindx,
-	   pointerToTractionverts,            // Traction BC arrays
-	   pointerToTractionvals,
-	   pointerToGauss2d,
-	   pointerToSh2d,
-	   pointerToListArrayElementTypeInfo2d,
-	   pointerToListArrayPropertyList,    // Material property arrays
-	   pointerToMaterialModelInfo,        // 60
-	   pointerToGauss,                    // Element type arrays
-	   pointerToSh,
-	   pointerToShj,
-	   pointerToListArrayElementTypeInfo,
-	   pointerToHistry,                   // Time information
-	   pointerToListArrayRtimdat,
-	   pointerToListArrayNtimdat,
-	   pointerToListArrayNvisdat,
-	   pointerToMaxstp,
-	   pointerToDelt,                     // 70
-	   pointerToAlfa,
-	   pointerToMaxit,
-	   pointerToNtdinit,
-	   pointerToLgdef,
-	   pointerToUtol,
-	   pointerToFtol,
-	   pointerToEtol,
-	   pointerToItmax,
-	   pointerToListArrayRgiter,          // Iterative solution information
-	   pointerToSkew,                     // 80: Skew rotation information
-	   pointerToIprint,                   // Input/output information
-	   pointerToListArrayNcodat,
-	   pointerToListArrayNunits,
-	   pointerToListArrayNprint,
-	   pointerToIstatout,
-	   pointerToNstatout,
-	   asciiOutputFile,                   // Output file names
-	   plotOutputFile,
-	   ucdOutputRoot,
-	   &viscousStage,                     // 90: PETSC logging
-	   &iterateEvent,
-	   &errorcode,                        // Error codes
-	   errorstring,
-	   strlen(asciiOutputFile),           // String lengths
-	   strlen(plotOutputFile),
-	   strlen(ucdOutputRoot),
-	   sizeof(errorstring));
-
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "asciiOutputFile:" << asciiOutputFile
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-// Perform the time-dependent solution.
-
-char pypylith3d_viscos_step__doc__[] = "";
-char pypylith3d_viscos_step__name__[] = "viscos_step";
-
-PyObject * pypylith3d_viscos_step(PyObject *, PyObject *args)
-{
-  PyObject* pyA;                              // Sparse matrix arrays
-  PyObject* pyRhs;
-  PyObject* pySol;
-  PyObject* pyPointerToBextern;               // Force vectors
-  PyObject* pyPointerToBtraction;
-  PyObject* pyPointerToBgravity;
-  PyObject* pyPointerToBconcForce;
-  PyObject* pyPointerToBintern;
-  PyObject* pyPointerToBresid;
-  PyObject* pyPointerToBwink;
-  PyObject* pyPointerToBwinkx;
-  PyObject* pyPointerToDispVec;
-  PyObject* pyPointerToDprev;
-  PyObject* pyPointerToListArrayNforce;
-  PyObject* pyPointerToListArrayGrav;
-  PyObject* pyPointerToX;                     // Global arrays
-  PyObject* pyPointerToD;
-  PyObject* pyPointerToDeld;
-  PyObject* pyPointerToDcur;
-  PyObject* pyPointerToId;
-  PyObject* pyPointerToIwink;
-  PyObject* pyPointerToWink;
-  PyObject* pyPointerToListArrayNsysdat;
-  PyObject* pyPointerToListArrayIddmat;
-  PyObject* pyPointerToIbond;                 // Boundary condition arrays
-  PyObject* pyPointerToBond;
-  PyObject* pyPointerToDx;                    // Slippery node arrays
-  PyObject* pyPointerToDeldx;
-  PyObject* pyPointerToDxcur;
-  PyObject* pyPointerToDiforc;
-  PyObject* pyPointerToIdx;
-  PyObject* pyPointerToIwinkx;
-  PyObject* pyPointerToWinkx;
-  PyObject* pyPointerToIdslp;
-  PyObject* pyPointerToIpslp;
-  PyObject* pyPointerToIdhist;
-  PyObject* pyPointerToFault;                 // Split node arrays
-  PyObject* pyPointerToNfault;
-  PyObject* pyPointerToDfault;
-  PyObject* pyPointerToTfault;
-  PyObject* pyPointerToS;                     // Local stiffness matrix arrays
-  PyObject* pyPointerToStemp;
-  PyObject* pyPointerToState;                 // Element arrays
-  PyObject* pyPointerToDstate;
-  PyObject* pyPointerToState0;
-  PyObject* pyPointerToDmat;
-  PyObject* pyPointerToIen;
-  PyObject* pyPointerToLm;
-  PyObject* pyPointerToLmx;
-  PyObject* pyPointerToLmf;
-  PyObject* pyPointerToIvfamily;
-  PyObject* pyPointerToListArrayNpar;
-  PyObject* pyPointerToIelindx;
-  PyObject* pyPointerToTractionverts;         // Traction BC arrays
-  PyObject* pyPointerToTractionvals;
-  PyObject* pyPointerToGauss2d;
-  PyObject* pyPointerToSh2d;
-  PyObject* pyPointerToListArrayElementTypeInfo2d;
-  PyObject* pyPointerToListArrayPropertyList; // Material property arrays
-  PyObject* pyPointerToMaterialModelInfo;
-  PyObject* pyPointerToGauss;                 // Element type arrays
-  PyObject* pyPointerToSh;
-  PyObject* pyPointerToShj;
-  PyObject* pyPointerToListArrayElementTypeInfo;
-  PyObject* pyPointerToHistry;                // Time information
-  PyObject* pyPointerToListArrayRtimdat;
-  PyObject* pyPointerToListArrayNtimdat;
-  PyObject* pyPointerToListArrayNvisdat;
-  PyObject* pyPointerToMaxstp;
-  PyObject* pyPointerToDelt;
-  PyObject* pyPointerToAlfa;
-  PyObject* pyPointerToMaxit;
-  PyObject* pyPointerToNtdinit;
-  PyObject* pyPointerToLgdef;
-  PyObject* pyPointerToUtol;
-  PyObject* pyPointerToFtol;
-  PyObject* pyPointerToEtol;
-  PyObject* pyPointerToItmax;
-  PyObject* pyPointerToListArrayRgiter;       // Iterative solution information
-  PyObject* pyPointerToSkew;                  // Skew rotation information
-  PyObject* pyPointerToIprint;                // Input/output information
-  PyObject* pyPointerToListArrayNcodat;
-  PyObject* pyPointerToListArrayNunits;
-  PyObject* pyPointerToListArrayNprint;
-  PyObject* pyPointerToIstatout;
-  PyObject* pyPointerToNstatout;
-  char* asciiOutputFile;                      // Output file names
-  char* plotOutputFile;
-  char* ucdOutputRoot;
-  int viscousStage;
-  int iterateEvent;
-  int ntot, ltim, indexx, jcyc, i, j, skc, nfirst, nstep, lgdefp;
-  double time, deltp;
-  PyObject *pyGtol;
-
-  int ok = PyArg_ParseTuple(args, "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOsssiiiiiiiiiiiddiO!:viscos_step",
-			    &pyA,                              // Sparse matrix arrays
-			    &pyRhs,
-			    &pySol,
-			    &pyPointerToBextern,               // Force vectors
-			    &pyPointerToBtraction,
-			    &pyPointerToBgravity,
-			    &pyPointerToBconcForce,
-			    &pyPointerToBintern,
-			    &pyPointerToBresid,
-			    &pyPointerToBwink,
-			    &pyPointerToBwinkx,
-			    &pyPointerToDispVec,
-			    &pyPointerToDprev,
-			    &pyPointerToListArrayNforce,
-			    &pyPointerToListArrayGrav,
-			    &pyPointerToX,                     // Global arrays
-			    &pyPointerToD,
-			    &pyPointerToDeld,
-			    &pyPointerToDcur,
-			    &pyPointerToId,
-			    &pyPointerToIwink,
-			    &pyPointerToWink,
-			    &pyPointerToListArrayNsysdat,
-			    &pyPointerToListArrayIddmat,
-			    &pyPointerToIbond,                 // Boundary condition arrays
-			    &pyPointerToBond,
-			    &pyPointerToDx,                    // Slippery node arrays
-			    &pyPointerToDeldx,
-			    &pyPointerToDxcur,
-			    &pyPointerToDiforc,
-			    &pyPointerToIdx,
-			    &pyPointerToIwinkx,
-			    &pyPointerToWinkx,
-			    &pyPointerToIdslp,
-			    &pyPointerToIpslp,
-			    &pyPointerToIdhist,
-			    &pyPointerToFault,                 // Split node arrays
-			    &pyPointerToNfault,
-			    &pyPointerToDfault,
-			    &pyPointerToTfault,
-			    &pyPointerToS,                     // Local stiffness matrix arrays
-			    &pyPointerToStemp,
-			    &pyPointerToState,                 // Element arrays
-			    &pyPointerToDstate,
-			    &pyPointerToState0,
-			    &pyPointerToDmat,
-			    &pyPointerToIen,
-			    &pyPointerToLm,
-			    &pyPointerToLmx,
-			    &pyPointerToLmf,
-			    &pyPointerToIvfamily,
-			    &pyPointerToListArrayNpar,
-			    &pyPointerToIelindx,
-                            &pyPointerToTractionverts,         // Traction BC arrays
-                            &pyPointerToTractionvals,
-                            &pyPointerToGauss2d,
-                            &pyPointerToSh2d,
-                            &pyPointerToListArrayElementTypeInfo2d,
-			    &pyPointerToListArrayPropertyList, // Material property arrays
-			    &pyPointerToMaterialModelInfo,
-			    &pyPointerToGauss,                 // Element type arrays
-			    &pyPointerToSh,
-			    &pyPointerToShj,
-			    &pyPointerToListArrayElementTypeInfo,
-			    &pyPointerToHistry,                // Time information
-			    &pyPointerToListArrayRtimdat,
-			    &pyPointerToListArrayNtimdat,
-			    &pyPointerToListArrayNvisdat,
-			    &pyPointerToMaxstp,
-			    &pyPointerToDelt,
-			    &pyPointerToAlfa,
-			    &pyPointerToMaxit,
-			    &pyPointerToNtdinit,
-			    &pyPointerToLgdef,
-			    &pyPointerToUtol,
-			    &pyPointerToFtol,
-			    &pyPointerToEtol,
-			    &pyPointerToItmax,
-			    &pyPointerToListArrayRgiter,       // Iterative solution information
-			    &pyPointerToSkew,                  // Skew rotation information
-			    &pyPointerToIprint,                // Input/output information
-			    &pyPointerToListArrayNcodat,
-			    &pyPointerToListArrayNunits,
-			    &pyPointerToListArrayNprint,
-			    &pyPointerToIstatout,
-			    &pyPointerToNstatout,
-			    &asciiOutputFile,                  // Output file names
-			    &plotOutputFile,
-			    &ucdOutputRoot,
-                &viscousStage,
-                &iterateEvent,
-                            &ntot,
-                            &ltim,
-                            &indexx,
-                            &jcyc,
-                            &i,
-                            &j,
-                            &skc,
-                            &nfirst,
-                            &nstep,
-                            &time,
-                            &deltp,
-                            &lgdefp,
-                            &PyList_Type, &pyGtol);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  Mat      A = (Mat) PyCObject_AsVoidPtr(pyA);
-  Vec      rhs = (Vec) PyCObject_AsVoidPtr(pyRhs);
-  Vec      sol = (Vec) PyCObject_AsVoidPtr(pySol);
-  double*  pointerToBextern = (double*) PyCObject_AsVoidPtr(pyPointerToBextern);
-  double*  pointerToBtraction = (double*) PyCObject_AsVoidPtr(pyPointerToBtraction);
-  double*  pointerToBgravity = (double*) PyCObject_AsVoidPtr(pyPointerToBgravity);
-  double*  pointerToBconcForce = (double*) PyCObject_AsVoidPtr(pyPointerToBconcForce);
-  double*  pointerToBintern = (double*) PyCObject_AsVoidPtr(pyPointerToBintern);
-  double*  pointerToBresid = (double*) PyCObject_AsVoidPtr(pyPointerToBresid);
-  double*  pointerToBwink = (double*) PyCObject_AsVoidPtr(pyPointerToBwink);
-  double*  pointerToBwinkx = (double*) PyCObject_AsVoidPtr(pyPointerToBwinkx);
-  double*  pointerToDispVec = (double*) PyCObject_AsVoidPtr(pyPointerToDispVec);
-  double*  pointerToDprev = (double*) PyCObject_AsVoidPtr(pyPointerToDprev);
-  int*  pointerToListArrayNforce = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNforce);
-  double*  pointerToListArrayGrav = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayGrav);
-  double*  pointerToX = (double*) PyCObject_AsVoidPtr(pyPointerToX);
-  double*  pointerToD = (double*) PyCObject_AsVoidPtr(pyPointerToD);
-  double*  pointerToDeld = (double*) PyCObject_AsVoidPtr(pyPointerToDeld);
-  double*  pointerToDcur = (double*) PyCObject_AsVoidPtr(pyPointerToDcur);
-  int*  pointerToId = (int*) PyCObject_AsVoidPtr(pyPointerToId);
-  int*  pointerToIwink = (int*) PyCObject_AsVoidPtr(pyPointerToIwink);
-  double*  pointerToWink = (double*) PyCObject_AsVoidPtr(pyPointerToWink);
-  int*  pointerToListArrayNsysdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNsysdat);
-  int*  pointerToListArrayIddmat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayIddmat);
-  int*  pointerToIbond = (int*) PyCObject_AsVoidPtr(pyPointerToIbond);
-  double*  pointerToBond = (double*) PyCObject_AsVoidPtr(pyPointerToBond);
-  double*  pointerToDx = (double*) PyCObject_AsVoidPtr(pyPointerToDx);
-  double*  pointerToDeldx = (double*) PyCObject_AsVoidPtr(pyPointerToDeldx);
-  double*  pointerToDxcur = (double*) PyCObject_AsVoidPtr(pyPointerToDxcur);
-  double*  pointerToDiforc = (double*) PyCObject_AsVoidPtr(pyPointerToDiforc);
-  int*  pointerToIdx = (int*) PyCObject_AsVoidPtr(pyPointerToIdx);
-  int*  pointerToIwinkx = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkx);
-  double*  pointerToWinkx = (double*) PyCObject_AsVoidPtr(pyPointerToWinkx);
-  int*  pointerToIdslp = (int*) PyCObject_AsVoidPtr(pyPointerToIdslp);
-  int*  pointerToIpslp = (int*) PyCObject_AsVoidPtr(pyPointerToIpslp);
-  int*  pointerToIdhist = (int*) PyCObject_AsVoidPtr(pyPointerToIdhist);
-  double*  pointerToFault = (double*) PyCObject_AsVoidPtr(pyPointerToFault);
-  int*  pointerToNfault = (int*) PyCObject_AsVoidPtr(pyPointerToNfault);
-  double*  pointerToDfault = (double*) PyCObject_AsVoidPtr(pyPointerToDfault);
-  double*  pointerToTfault = (double*) PyCObject_AsVoidPtr(pyPointerToTfault);
-  double*  pointerToS = (double*) PyCObject_AsVoidPtr(pyPointerToS);
-  double*  pointerToStemp = (double*) PyCObject_AsVoidPtr(pyPointerToStemp);
-  double*  pointerToState = (double*) PyCObject_AsVoidPtr(pyPointerToState);
-  double*  pointerToDstate = (double*) PyCObject_AsVoidPtr(pyPointerToDstate);
-  double*  pointerToState0 = (double*) PyCObject_AsVoidPtr(pyPointerToState0);
-  double*  pointerToDmat = (double*) PyCObject_AsVoidPtr(pyPointerToDmat);
-  int*  pointerToIen = (int*) PyCObject_AsVoidPtr(pyPointerToIen);
-  int*  pointerToLm = (int*) PyCObject_AsVoidPtr(pyPointerToLm);
-  int*  pointerToLmx = (int*) PyCObject_AsVoidPtr(pyPointerToLmx);
-  int*  pointerToLmf = (int*) PyCObject_AsVoidPtr(pyPointerToLmf);
-  int*  pointerToIvfamily = (int*) PyCObject_AsVoidPtr(pyPointerToIvfamily);
-  int*  pointerToListArrayNpar = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNpar);
-  int*  pointerToIelindx = (int*) PyCObject_AsVoidPtr(pyPointerToIelindx);
-  int*  pointerToTractionverts = (int*) PyCObject_AsVoidPtr(pyPointerToTractionverts);
-  double*  pointerToTractionvals = (double*) PyCObject_AsVoidPtr(pyPointerToTractionvals);
-  double*  pointerToGauss2d = (double*) PyCObject_AsVoidPtr(pyPointerToGauss2d);
-  double*  pointerToSh2d = (double*) PyCObject_AsVoidPtr(pyPointerToSh2d);
-  int*  pointerToListArrayElementTypeInfo2d = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayElementTypeInfo2d);
-  double*  pointerToListArrayPropertyList = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayPropertyList);
-  int*  pointerToMaterialModelInfo = (int*) PyCObject_AsVoidPtr(pyPointerToMaterialModelInfo);
-  double*  pointerToGauss = (double*) PyCObject_AsVoidPtr(pyPointerToGauss);
-  double*  pointerToSh = (double*) PyCObject_AsVoidPtr(pyPointerToSh);
-  double*  pointerToShj = (double*) PyCObject_AsVoidPtr(pyPointerToShj);
-  int*  pointerToListArrayElementTypeInfo = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayElementTypeInfo);
-  double*  pointerToHistry = (double*) PyCObject_AsVoidPtr(pyPointerToHistry);
-  double*  pointerToListArrayRtimdat = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayRtimdat);
-  int*  pointerToListArrayNtimdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNtimdat);
-  int*  pointerToListArrayNvisdat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNvisdat);
-  int*  pointerToMaxstp = (int*) PyCObject_AsVoidPtr(pyPointerToMaxstp);
-  double*  pointerToDelt = (double*) PyCObject_AsVoidPtr(pyPointerToDelt);
-  double*  pointerToAlfa = (double*) PyCObject_AsVoidPtr(pyPointerToAlfa);
-  int*  pointerToMaxit = (int*) PyCObject_AsVoidPtr(pyPointerToMaxit);
-  int*  pointerToNtdinit = (int*) PyCObject_AsVoidPtr(pyPointerToNtdinit);
-  int*  pointerToLgdef = (int*) PyCObject_AsVoidPtr(pyPointerToLgdef);
-  double*  pointerToUtol = (double*) PyCObject_AsVoidPtr(pyPointerToUtol);
-  double*  pointerToFtol = (double*) PyCObject_AsVoidPtr(pyPointerToFtol);
-  double*  pointerToEtol = (double*) PyCObject_AsVoidPtr(pyPointerToEtol);
-  int*  pointerToItmax = (int*) PyCObject_AsVoidPtr(pyPointerToItmax);
-  double*  pointerToListArrayRgiter = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayRgiter);
-  double*  pointerToSkew = (double*) PyCObject_AsVoidPtr(pyPointerToSkew);
-  int*  pointerToIprint = (int*) PyCObject_AsVoidPtr(pyPointerToIprint);
-  int*  pointerToListArrayNcodat = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNcodat);
-  int*  pointerToListArrayNunits = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNunits);
-  int*  pointerToListArrayNprint = (int*) PyCObject_AsVoidPtr(pyPointerToListArrayNprint);
-  int*  pointerToIstatout = (int*) PyCObject_AsVoidPtr(pyPointerToIstatout);
-  int*  pointerToNstatout = (int*) PyCObject_AsVoidPtr(pyPointerToNstatout);
-
-  double gtol[4];
-  if (PyList_Size(pyGtol) != 3) {
-    return 0;
-  }
-  for(int v = 0; v < 3; v++) {
-    PyObject *listitem = PyList_GetItem(pyGtol, v);
-
-    if(!PyFloat_Check(listitem)) {
-      return 0;
-    }
-    gtol[v] = PyFloat_AsDouble(listitem);
-  }
-
-  viscos_step_f(&A,                            // 1: Sparse matrix arrays
-	   &rhs,
-	   &sol,
-	   pointerToBextern,                  // Force vectors
-	   pointerToBtraction,
-	   pointerToBgravity,
-	   pointerToBconcForce,
-	   pointerToBintern,
-	   pointerToBresid,
-	   pointerToBwink,                    // 10
-	   pointerToBwinkx,
-	   pointerToDispVec,
-	   pointerToDprev,
-	   pointerToListArrayNforce,
-	   pointerToListArrayGrav,
-	   pointerToX,                        // Global arrays
-	   pointerToD,
-	   pointerToDeld,
-	   pointerToDcur,
-	   pointerToId,                       // 20
-	   pointerToIwink,
-	   pointerToWink,
-	   pointerToListArrayNsysdat,
-	   pointerToListArrayIddmat,
-	   pointerToIbond,                    // Boundary condition arrays
-	   pointerToBond,
-	   pointerToDx,                       // Slippery node arrays
-	   pointerToDeldx,
-	   pointerToDxcur,
-	   pointerToDiforc,                   // 30
-	   pointerToIdx,
-	   pointerToIwinkx,
-	   pointerToWinkx,
-	   pointerToIdslp,
-	   pointerToIpslp,
-	   pointerToIdhist,
-	   pointerToFault,                    // Split node arrays
-	   pointerToNfault,
-	   pointerToDfault,
-	   pointerToTfault,                   // 40
-	   pointerToS,                        // Local stiffness matrix arrays
-	   pointerToStemp,
-	   pointerToState,                    // Element arrays
-	   pointerToDstate,
-	   pointerToState0,
-	   pointerToDmat,
-	   pointerToIen,
-	   pointerToLm,
-	   pointerToLmx,
-	   pointerToLmf,                      // 50
-	   pointerToIvfamily,
-	   pointerToListArrayNpar,
-		pointerToIelindx,
-		pointerToTractionverts,            // Traction BC arrays
-	   pointerToTractionvals,
-	   pointerToGauss2d,
-	   pointerToSh2d,
-	   pointerToListArrayElementTypeInfo2d,
-	   pointerToListArrayPropertyList,    // Material property arrays
-	   pointerToMaterialModelInfo,        // 60
-	   pointerToGauss,                    // Element type arrays
-	   pointerToSh,
-	   pointerToShj,
-	   pointerToListArrayElementTypeInfo,
-	   pointerToHistry,                   // Time information
-	   pointerToListArrayRtimdat,
-	   pointerToListArrayNtimdat,
-	   pointerToListArrayNvisdat,
-	   pointerToMaxstp,
-	   pointerToDelt,                     // 70
-	   pointerToAlfa,
-	   pointerToMaxit,
-	   pointerToNtdinit,
-	   pointerToLgdef,
-	   pointerToUtol,
-	   pointerToFtol,
-	   pointerToEtol,
-	   pointerToItmax,
-	   pointerToListArrayRgiter,          // Iterative solution information
-	   pointerToSkew,                     // 80: Skew rotation information
-	   pointerToIprint,                   // Input/output information
-	   pointerToListArrayNcodat,
-	   pointerToListArrayNunits,
-	   pointerToListArrayNprint,
-	   pointerToIstatout,
-	   pointerToNstatout,
-	   asciiOutputFile,                   // Output file names
-	   plotOutputFile,
-	   ucdOutputRoot,
-	   &viscousStage,                     // 90: PETSC logging
-	   &iterateEvent,
-                &ntot,
-                &ltim,
-                &indexx,
-                &jcyc,
-                &i,
-                &j,
-                &skc,
-                &nfirst,
-                &nstep,
-                &time,
-                &deltp,
-                &lgdefp,
-                gtol,
-	   &errorcode,                        // Error codes
-	   errorstring,
-	   strlen(asciiOutputFile),           // String lengths
-	   strlen(plotOutputFile),
-	   strlen(ucdOutputRoot),
-	   sizeof(errorstring));
-
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-// Setup the time-dependent solution.
-
-char pypylith3d_viscos_setup__doc__[] = "";
-char pypylith3d_viscos_setup__name__[] = "viscos_setup";
-
-PyObject * pypylith3d_viscos_setup(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToListArrayNprint;
-  PyObject* pyPointerToListArrayNunits;
-  char* asciiOutputFile;                      // Output file names
-  char* plotOutputFile;
-  int viscousStage;
-
-  int ok = PyArg_ParseTuple(args, "OOssi:viscos_setup",
-			    &pyPointerToListArrayNprint,
-			    &pyPointerToListArrayNunits,
-			    &asciiOutputFile,                  // Output file names
-                &plotOutputFile,
-                &viscousStage);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int  errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int *pointerToListArrayNprint = (int *) PyCObject_AsVoidPtr(pyPointerToListArrayNprint);
-  int *pointerToListArrayNunits = (int *) PyCObject_AsVoidPtr(pyPointerToListArrayNunits);
-
-  viscos_setup_f(pointerToListArrayNprint,
-                 pointerToListArrayNunits,
-                 asciiOutputFile,                   // Output file names
-                 plotOutputFile,
-                 &viscousStage,                     // PETSC logging
-                 &errorcode,                        // Error codes
-                 errorstring,
-                 strlen(asciiOutputFile),           // String lengths
-                 strlen(plotOutputFile),
-                 sizeof(errorstring));
-
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "asciiOutputFile:" << asciiOutputFile
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-// Cleanup the time-dependent solution.
-
-char pypylith3d_viscos_cleanup__doc__[] = "";
-char pypylith3d_viscos_cleanup__name__[] = "viscos_cleanup";
-
-PyObject * pypylith3d_viscos_cleanup(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToListArrayNtimdat;
-  PyObject* pyPointerToListArrayNprint;
-  PyObject* pyPointerToListArrayNunits;
-
-  int ok = PyArg_ParseTuple(args, "OOO:viscos_cleanup",&pyPointerToListArrayNtimdat, &pyPointerToListArrayNprint, &pyPointerToListArrayNunits);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int  errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int *pointerToListArrayNtimdat = (int *) PyCObject_AsVoidPtr(pyPointerToListArrayNtimdat);
-  int *pointerToListArrayNprint = (int *) PyCObject_AsVoidPtr(pyPointerToListArrayNprint);
-  int *pointerToListArrayNunits  = (int *) PyCObject_AsVoidPtr(pyPointerToListArrayNunits);
-
-  viscos_cleanup_f(pointerToListArrayNtimdat,
-                   pointerToListArrayNprint,
-                   pointerToListArrayNunits,
-                   &errorcode,                        // Error codes
-                   errorstring,
-                   sizeof(errorstring));
-
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// version
-// $Id: viscos.cc,v 1.15 2005/06/07 19:39:11 willic3 Exp $
-
-// End of file

Deleted: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/viscos.h
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/viscos.h	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/viscos.h	2007-03-30 21:05:09 UTC (rev 6475)
@@ -1,63 +0,0 @@
-// -*- C++ -*-
-// 
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
-//
-//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
-//
-//  Permission is hereby granted, free of charge, to any person obtaining
-//  a copy of this software and associated documentation files (the
-//  "Software"), to deal in the Software without restriction, including
-//  without limitation the rights to use, copy, modify, merge, publish,
-//  distribute, sublicense, and/or sell copies of the Software, and to
-//  permit persons to whom the Software is furnished to do so, subject to
-//  the following conditions:
-//
-//  The above copyright notice and this permission notice shall be
-//  included in all copies or substantial portions of the Software.
-//
-//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 
-
-#if !defined(pypylith3d_viscos_h)
-#define pypylith3d_viscos_h
-
-// drive time-dependent solution
-extern char pypylith3d_viscos__name__[];
-extern char pypylith3d_viscos__doc__[];
-extern "C"
-PyObject * pypylith3d_viscos(PyObject *, PyObject *);
-
-// setup time-dependent solution
-extern char pypylith3d_viscos_setup__name__[];
-extern char pypylith3d_viscos_setup__doc__[];
-extern "C"
-PyObject * pypylith3d_viscos_setup(PyObject *, PyObject *);
-
-// drive time-dependent solution
-extern char pypylith3d_viscos_step__name__[];
-extern char pypylith3d_viscos_step__doc__[];
-extern "C"
-PyObject * pypylith3d_viscos_step(PyObject *, PyObject *);
-
-// cleanup time-dependent solution
-extern char pypylith3d_viscos_cleanup__name__[];
-extern char pypylith3d_viscos_cleanup__doc__[];
-extern "C"
-PyObject * pypylith3d_viscos_cleanup(PyObject *, PyObject *);
-
-#endif
-
-// version
-// $Id: viscos.h,v 1.2 2005/03/31 23:27:58 willic3 Exp $
-
-// End of file

Deleted: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/write_modelinfo.cc
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/write_modelinfo.cc	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/write_modelinfo.cc	2007-03-30 21:05:09 UTC (rev 6475)
@@ -1,1473 +0,0 @@
-// -*- C++ -*-
-// 
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
-//
-//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
-//
-//  Permission is hereby granted, free of charge, to any person obtaining
-//  a copy of this software and associated documentation files (the
-//  "Software"), to deal in the Software without restriction, including
-//  without limitation the rights to use, copy, modify, merge, publish,
-//  distribute, sublicense, and/or sell copies of the Software, and to
-//  permit persons to whom the Software is furnished to do so, subject to
-//  the following conditions:
-//
-//  The above copyright notice and this permission notice shall be
-//  included in all copies or substantial portions of the Software.
-//
-//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 
-
-#include <petscmat.h>
-#include <portinfo>
-#include "journal/debug.h"
-
-#include <Python.h>
-
-#include "write_modelinfo.h"
-#include "exceptionhandler.h"
-#include "pylith3d_externs.h"
-#include <stdio.h>
-#include <string.h>
-
-
-// Write boundary conditions
-
-char pypylith3d_write_bc__doc__[] = "";
-char pypylith3d_write_bc__name__[] = "write_bc";
-
-PyObject * pypylith3d_write_bc(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToBond;
-  PyObject* pyPointerToIbond;
-  int numberNodes;
-  int f77AsciiOutput;
-  int asciiOutputInt;
-  char* asciiOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOiiis:write_bc",
-			    &pyPointerToBond,
-			    &pyPointerToIbond,
-			    &numberNodes,
-			    &f77AsciiOutput,
-			    &asciiOutputInt,
-			    &asciiOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  double* pointerToBond = (double*) PyCObject_AsVoidPtr(pyPointerToBond);
-  int* pointerToIbond = (int*) PyCObject_AsVoidPtr(pyPointerToIbond);
-
-  write_bc_f(pointerToBond,
-	     pointerToIbond,
-	     &numberNodes,
-	     &f77AsciiOutput,
-	     &asciiOutputInt,
-	     asciiOutputFile,
-	     &errorcode,
-	     errorstring,
-	     strlen(asciiOutputFile),
-	     sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberNodes:" << numberNodes
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write connectivities
-
-char pypylith3d_write_connect__doc__[] = "";
-char pypylith3d_write_connect__name__[] = "write_connect";
-
-PyObject * pypylith3d_write_connect(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToIens;
-  PyObject* pyPointerToIvfamily;
-  PyObject* pyPointerToIndxiel;
-  int numberVolumeElementNodes;
-  int numberVolumeElementGaussPoints;
-  int numberVolumeElements;
-  int volumeElementType;
-  int numberVolumeElementFamilies;
-  int f77AsciiOutput;
-  int f77PlotOutput;
-  int asciiOutputInt;
-  int plotOutputInt;
-  char* asciiOutputFile;
-  char* plotOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOOiiiiiiiiiss:write_connect",
-                            &pyPointerToIens,
-                            &pyPointerToIvfamily,
-                            &pyPointerToIndxiel,
-                            &numberVolumeElementNodes,
-                            &numberVolumeElementGaussPoints,
-                            &numberVolumeElements,
-                            &volumeElementType,
-                            &numberVolumeElementFamilies,
-                            &f77AsciiOutput,
-                            &f77PlotOutput,
-                            &asciiOutputInt,
-                            &plotOutputInt,
-                            &asciiOutputFile,
-                            &plotOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int* pointerToIens = (int*) PyCObject_AsVoidPtr(pyPointerToIens);
-  int* pointerToIvfamily = (int*) PyCObject_AsVoidPtr(pyPointerToIvfamily);
-  int* pointerToIndxiel = (int*) PyCObject_AsVoidPtr(pyPointerToIndxiel);
-
-  write_connect_f(pointerToIens,
-		  pointerToIvfamily,
-		  pointerToIndxiel,
-		  &numberVolumeElementNodes,
-		  &numberVolumeElementGaussPoints,
-		  &numberVolumeElements,
-		  &volumeElementType,
-		  &numberVolumeElementFamilies,
-		  &f77AsciiOutput,
-		  &f77PlotOutput,
-		  &asciiOutputInt,
-		  &plotOutputInt,
-		  asciiOutputFile,
-		  plotOutputFile,
-		  &errorcode,
-		  errorstring,
-		  strlen(asciiOutputFile),
-		  strlen(plotOutputFile),
-		  sizeof(errorstring));
-
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberVolumeElements:" << numberVolumeElements
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write coordinates
-
-char pypylith3d_write_coords__doc__[] = "";
-char pypylith3d_write_coords__name__[] = "write_coords";
-
-PyObject * pypylith3d_write_coords(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToX;
-  int numberNodes;
-  int f77AsciiOutput;
-  int f77PlotOutput;
-  int asciiOutputInt;
-  int plotOutputInt;
-  char* asciiOutputFile;
-  char* plotOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "Oiiiiiss:write_coords",
-			    &pyPointerToX,
-			    &numberNodes,
-			    &f77AsciiOutput,
-			    &f77PlotOutput,
-			    &asciiOutputInt,
-			    &plotOutputInt,
-			    &asciiOutputFile,
-			    &plotOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  double* pointerToX = (double*) PyCObject_AsVoidPtr(pyPointerToX);
-
-  write_coords_f(pointerToX,
-		 &numberNodes,
-		 &f77AsciiOutput,
-		 &f77PlotOutput,
-		 &asciiOutputInt,
-		 &plotOutputInt,
-		 asciiOutputFile,
-		 plotOutputFile,
-		 &errorcode,
-		 errorstring,
-		 strlen(asciiOutputFile),
-		 strlen(plotOutputFile),
-		 sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberNodes:" << numberNodes
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write differential forces
-
-char pypylith3d_write_diff__doc__[] = "";
-char pypylith3d_write_diff__name__[] = "write_diff";
-
-PyObject * pypylith3d_write_diff(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToDiforc;
-  PyObject* pyPointerToNslip;
-  PyObject* pyPointerToIdhist;
-  int numberSlipperyNodeEntries;
-  int numberDifferentialForceEntries;
-  int numberNodes;
-  int f77AsciiOutput;
-  int asciiOutputInt;
-  char* asciiOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOOiiiiis:write_diff",
-			    &pyPointerToDiforc,
-			    &pyPointerToNslip,
-			    &pyPointerToIdhist,
-			    &numberSlipperyNodeEntries,
-			    &numberDifferentialForceEntries,
-			    &numberNodes,
-			    &f77AsciiOutput,
-			    &asciiOutputInt,
-			    &asciiOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  double* pointerToDiforc = (double*) PyCObject_AsVoidPtr(pyPointerToDiforc);
-  int* pointerToNslip = (int*) PyCObject_AsVoidPtr(pyPointerToNslip);
-  int* pointerToIdhist = (int*) PyCObject_AsVoidPtr(pyPointerToIdhist);
-
-  write_diff_f(pointerToDiforc,
-	       pointerToNslip,
-	       pointerToIdhist,
-	       &numberSlipperyNodeEntries,
-	       &numberDifferentialForceEntries,
-	       &numberNodes,
-	       &f77AsciiOutput,
-	       &asciiOutputInt,
-	       asciiOutputFile,
-	       &errorcode,
-	       errorstring,
-	       strlen(asciiOutputFile),
-	       sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberDifferentialForceEntries:" << numberDifferentialForceEntries
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-// Write out element info
-
-char pypylith3d_write_element_info__doc__[] = "";
-char pypylith3d_write_element_info__name__[] = "write_element_info";
-
-PyObject * pypylith3d_write_element_info(PyObject *, PyObject *args)
-{
-  int numberVolumeElements;
-  int numberVolumeElementNodes;
-  int numberVolumeElementGaussPoints;
-  int volumeElementType;
-  int quadratureOrderInt;
-  int prestressAutoComputeInt;
-  int prestressAutoChangeElasticPropsInt;
-  double prestressAutoComputePoisson;
-  double prestressAutoComputeYoungs;
-  int f77AsciiOutput;
-  int asciiOutputInt;
-  char* asciiOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "iiiiiiiddiis:write_element_info",
-			    &numberVolumeElements,
-			    &numberVolumeElementNodes,
-			    &numberVolumeElementGaussPoints,
-			    &volumeElementType,
-			    &quadratureOrderInt,
-			    &prestressAutoComputeInt,
-			    &prestressAutoChangeElasticPropsInt,
-			    &prestressAutoComputePoisson,
-			    &prestressAutoComputeYoungs,
-			    &f77AsciiOutput,
-			    &asciiOutputInt,
-			    &asciiOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  write_element_info_f(&numberVolumeElements,
-		       &numberVolumeElementNodes,
-		       &numberVolumeElementGaussPoints,
-		       &volumeElementType,
-		       &quadratureOrderInt,
-		       &prestressAutoComputeInt,
-		       &prestressAutoChangeElasticPropsInt,
-		       &prestressAutoComputePoisson,
-		       &prestressAutoComputeYoungs,
-		       &f77AsciiOutput,
-		       &asciiOutputInt,
-		       asciiOutputFile,strlen(asciiOutputFile));
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberVolumeElements:" << numberVolumeElements
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write time steps at which full output is desired
-
-char pypylith3d_write_fuldat__doc__[] = "";
-char pypylith3d_write_fuldat__name__[] = "write_fuldat";
-
-PyObject * pypylith3d_write_fuldat(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToIprint;
-  int numberFullOutputs;
-  int analysisTypeInt;
-  int numberCycles;
-  int totalNumberTimeSteps;
-  int f77AsciiOutput;
-  int f77PlotOutput;
-  int asciiOutputInt;
-  int plotOutputInt;
-  char* asciiOutputFile;
-  char* plotOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "Oiiiiiiiiss:write_fuldat",
-			    &pyPointerToIprint,
-			    &numberFullOutputs,
-			    &analysisTypeInt,
-			    &numberCycles,
-			    &totalNumberTimeSteps,
-			    &f77AsciiOutput,
-			    &f77PlotOutput,
-			    &asciiOutputInt,
-			    &plotOutputInt,
-			    &asciiOutputFile,
-			    &plotOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int* pointerToIprint = (int*) PyCObject_AsVoidPtr(pyPointerToIprint);
-
-  write_fuldat_f(pointerToIprint,
-		 &numberFullOutputs,
-		 &analysisTypeInt,
-		 &numberCycles,
-		 &totalNumberTimeSteps,
-		 &f77AsciiOutput,
-		 &f77PlotOutput,
-		 &asciiOutputInt,
-		 &plotOutputInt,
-		 asciiOutputFile,
-		 plotOutputFile,
-		 &errorcode,
-		 errorstring,
-		 strlen(asciiOutputFile),
-		 strlen(plotOutputFile),
-		 sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberFullOutputs:" << numberFullOutputs
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write out global info
-
-char pypylith3d_write_global_info__doc__[] = "";
-char pypylith3d_write_global_info__name__[] = "write_global_info";
-
-PyObject * pypylith3d_write_global_info(PyObject *, PyObject *args)
-{
-  char* title;
-  int asciiOutputInt;
-  int plotOutputInt;
-  int numberNodes;
-  int analysisTypeInt;
-  int debuggingOutputInt;
-  int f77AsciiOutput;
-  int f77PlotOutput;
-  char* asciiOutputFile;
-  char* plotOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "siiiiiiiss:write_global_info",
-			    &title,
-			    &asciiOutputInt,
-			    &plotOutputInt,
-			    &numberNodes,
-			    &analysisTypeInt,
-			    &debuggingOutputInt,
-			    &f77AsciiOutput,
-			    &f77PlotOutput,
-			    &asciiOutputFile,
-			    &plotOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  write_global_info_f(title,
-		      &asciiOutputInt,
-		      &plotOutputInt,
-		      &numberNodes,
-		      &analysisTypeInt,
-		      &debuggingOutputInt,
-		      &f77AsciiOutput,
-		      &f77PlotOutput,
-		      asciiOutputFile,
-		      plotOutputFile,
-		      strlen(title),
-		      strlen(asciiOutputFile),
-		      strlen(plotOutputFile));
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "debuggingOutputInt:" << debuggingOutputInt
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write load histories
-
-char pypylith3d_write_hist__doc__[] = "";
-char pypylith3d_write_hist__name__[] = "write_hist";
-
-PyObject * pypylith3d_write_hist(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToHistry;
-  PyObject* pyPointerToTimes;
-  int numberLoadHistories;
-  int totalNumberTimeSteps;
-  int f77AsciiOutput;
-  int asciiOutputInt;
-  char* asciiOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOiiiis:write_hist",
-			    &pyPointerToHistry,
-			    &pyPointerToTimes,
-			    &numberLoadHistories,
-			    &totalNumberTimeSteps,
-			    &f77AsciiOutput,
-			    &asciiOutputInt,
-			    &asciiOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  double* pointerToHistry = (double*) PyCObject_AsVoidPtr(pyPointerToHistry);
-  double* pointerToTimes = (double*) PyCObject_AsVoidPtr(pyPointerToTimes);
-
-  write_hist_f(pointerToHistry,
-	       pointerToTimes,
-	       &numberLoadHistories,
-	       &totalNumberTimeSteps,
-	       &f77AsciiOutput,
-	       &asciiOutputInt,
-	       asciiOutputFile,
-	       &errorcode,
-	       errorstring,
-	       strlen(asciiOutputFile),
-	       sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberLoadHistories:" << numberLoadHistories
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write out material property info
-
-char pypylith3d_write_props__doc__[] = "";
-char pypylith3d_write_props__name__[] = "write_props";
-
-PyObject * pypylith3d_write_props(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToListArrayPropertyList;
-  PyObject* pyPointerToListArrayGrav;
-  PyObject* pyPointerToIvfamily;
-  PyObject* pyPointerToMaterialModelInfo;
-  int numberVolumeElementFamilies;
-  int propertySize;
-  int asciiOutputInt;
-  int plotOutputInt;
-  int f77AsciiOutput;
-  int f77PlotOutput;
-  char* asciiOutputFile;
-  char* plotOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOOOiiiiiiss:write_props",
-			    &pyPointerToListArrayPropertyList,
-			    &pyPointerToListArrayGrav,
-			    &pyPointerToIvfamily,
-			    &pyPointerToMaterialModelInfo,
-			    &numberVolumeElementFamilies,
-			    &propertySize,
-			    &asciiOutputInt,
-			    &plotOutputInt,
-			    &f77AsciiOutput,
-			    &f77PlotOutput,
-			    &asciiOutputFile,
-			    &plotOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  double* pointerToListArrayPropertyList = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayPropertyList);
-  double* pointerToListArrayGrav = (double*) PyCObject_AsVoidPtr(pyPointerToListArrayGrav);
-  int* pointerToIvfamily = (int*) PyCObject_AsVoidPtr(pyPointerToIvfamily);
-  int* pointerToMaterialModelInfo = (int*) PyCObject_AsVoidPtr(pyPointerToMaterialModelInfo);
-
-  write_props_f(pointerToListArrayPropertyList,
-		pointerToListArrayGrav,
-		pointerToIvfamily,
-		pointerToMaterialModelInfo,
-		&numberVolumeElementFamilies,
-		&propertySize,
-		&asciiOutputInt,
-		&plotOutputInt,
-		&f77AsciiOutput,
-		&f77PlotOutput,
-		asciiOutputFile,
-		plotOutputFile,
-		&errorcode,
-		errorstring,
-		strlen(asciiOutputFile),
-		strlen(plotOutputFile),
-		sizeof(errorstring));
-
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberVolumeElementFamilies:" << numberVolumeElementFamilies
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write local coordinate rotations
-
-char pypylith3d_write_skew__doc__[] = "";
-char pypylith3d_write_skew__name__[] = "write_skew";
-
-PyObject * pypylith3d_write_skew(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToSkew;
-  int numberRotationEntries;
-  int autoRotateSlipperyNodesInt;
-  int numberNodes;
-  int f77AsciiOutput;
-  int asciiOutputInt;
-  char* asciiOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "Oiiiiis:write_skew",
-			    &pyPointerToSkew,
-			    &numberRotationEntries,
-			    &autoRotateSlipperyNodesInt,
-			    &numberNodes,
-			    &f77AsciiOutput,
-			    &asciiOutputInt,
-			    &asciiOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  double* pointerToSkew = (double*) PyCObject_AsVoidPtr(pyPointerToSkew);
-
-  write_skew_f(pointerToSkew,
-	       &numberRotationEntries,
-	       &autoRotateSlipperyNodesInt,
-	       &numberNodes,
-	       &f77AsciiOutput,
-	       &asciiOutputInt,
-	       asciiOutputFile,
-	       &errorcode,
-	       errorstring,
-	       strlen(asciiOutputFile),
-	       sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberRotationEntries:" << numberRotationEntries
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write slippery node entries
-
-char pypylith3d_write_slip__doc__[] = "";
-char pypylith3d_write_slip__name__[] = "write_slip";
-
-PyObject * pypylith3d_write_slip(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToNslip;
-  int numberSlipperyNodeEntries;
-  int totalNumberSlipperyNodes;
-  int f77AsciiOutput;
-  int f77PlotOutput;
-  int asciiOutputInt;
-  int plotOutputInt;
-  char* asciiOutputFile;
-  char* plotOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "Oiiiiiiss:write_slip",
-			    &pyPointerToNslip,
-			    &numberSlipperyNodeEntries,
-			    &totalNumberSlipperyNodes,
-			    &f77AsciiOutput,
-			    &f77PlotOutput,
-			    &asciiOutputInt,
-			    &plotOutputInt,
-			    &asciiOutputFile,
-			    &plotOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int* pointerToNslip = (int*) PyCObject_AsVoidPtr(pyPointerToNslip);
-
-  write_slip_f(pointerToNslip,
-	       &numberSlipperyNodeEntries,
-	       &totalNumberSlipperyNodes,
-	       &f77AsciiOutput,
-	       &f77PlotOutput,
-	       &asciiOutputInt,
-	       &plotOutputInt,
-	       asciiOutputFile,
-	       plotOutputFile,
-	       &errorcode,
-	       errorstring,
-	       strlen(asciiOutputFile),
-	       strlen(plotOutputFile),
-	       sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "totalNumberSlipperyNodes:" << totalNumberSlipperyNodes
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write out sparse matrix info
-
-char pypylith3d_write_sparse_info__doc__[] = "";
-char pypylith3d_write_sparse_info__name__[] = "write_sparse_info";
-
-PyObject * pypylith3d_write_sparse_info(PyObject *, PyObject *args)
-{
-  int numberGlobalEquations;
-  int stiffnessMatrixSize;
-  int minimumNonzeroTermsPerRow;
-  int maximumNonzeroTermsPerRow;
-  double averageNonzeroTermsPerRow;
-  int asciiOutputInt;
-  int f77AsciiOutput;
-  char* asciiOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "iiiidiis:write_sparse_info",
-			    &numberGlobalEquations,
-			    &stiffnessMatrixSize,
-			    &minimumNonzeroTermsPerRow,
-			    &maximumNonzeroTermsPerRow,
-			    &averageNonzeroTermsPerRow,
-			    &asciiOutputInt,
-			    &f77AsciiOutput,
-			    &asciiOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  write_sparse_info_f(&numberGlobalEquations,
-		      &stiffnessMatrixSize,
-		      &minimumNonzeroTermsPerRow,
-		      &maximumNonzeroTermsPerRow,
-		      &averageNonzeroTermsPerRow,
-		      &asciiOutputInt,
-		      &f77AsciiOutput,
-		      asciiOutputFile,strlen(asciiOutputFile));
-		  
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "minimumNonzeroTermsPerRow:" << minimumNonzeroTermsPerRow
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write split node entries
-
-char pypylith3d_write_split__doc__[] = "";
-char pypylith3d_write_split__name__[] = "write_split";
-
-PyObject * pypylith3d_write_split(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToFault;
-  PyObject* pyPointerToNfault;
-  int numberSplitNodeEntries;
-  int f77AsciiOutput;
-  int f77PlotOutput;
-  int asciiOutputInt;
-  int plotOutputInt;
-  char* asciiOutputFile;
-  char* plotOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOiiiiiss:write_split",
-			    &pyPointerToFault,
-			    &pyPointerToNfault,
-			    &numberSplitNodeEntries,
-			    &f77AsciiOutput,
-			    &f77PlotOutput,
-			    &asciiOutputInt,
-			    &plotOutputInt,
-			    &asciiOutputFile,
-			    &plotOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  double* pointerToFault = (double*) PyCObject_AsVoidPtr(pyPointerToFault);
-  int* pointerToNfault = (int*) PyCObject_AsVoidPtr(pyPointerToNfault);
-
-  write_split_f(pointerToFault,
-		pointerToNfault,
-		&numberSplitNodeEntries,
-		&f77AsciiOutput,
-		&f77PlotOutput,
-		&asciiOutputInt,
-		&plotOutputInt,
-		asciiOutputFile,
-		plotOutputFile,
-		&errorcode,
-		errorstring,
-		strlen(asciiOutputFile),
-		strlen(plotOutputFile),
-		sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberSplitNodeEntries:" << numberSplitNodeEntries
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write split node entries for plot output
-
-char pypylith3d_write_split_plot__doc__[] = "";
-char pypylith3d_write_split_plot__name__[] = "write_split_plot";
-
-PyObject * pypylith3d_write_split_plot(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToIdftn;
-  int totalNumberSplitNodes;
-  int f77PlotOutput;
-  int plotOutputInt;
-  char* plotOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "Oiiis:write_split_plot",
-			    &pyPointerToIdftn,
-			    &totalNumberSplitNodes,
-			    &f77PlotOutput,
-			    &plotOutputInt,
-			    &plotOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int* pointerToIdftn = (int*) PyCObject_AsVoidPtr(pyPointerToIdftn);
-
-  write_split_plot_f(pointerToIdftn,
-		     &totalNumberSplitNodes,
-		     &f77PlotOutput,
-		     &plotOutputInt,
-		     plotOutputFile,
-		     strlen(plotOutputFile));
-    
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "totalNumberSplitNodes:" << totalNumberSplitNodes
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write state output information
-
-char pypylith3d_write_stateout__doc__[] = "";
-char pypylith3d_write_stateout__name__[] = "write_stateout";
-
-PyObject * pypylith3d_write_stateout(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToIstatout;
-  PyObject* pyPointerToNstatout;
-  int f77AsciiOutput;
-  int f77PlotOutput;
-  int asciiOutputInt;
-  int plotOutputInt;
-  char* asciiOutputFile;
-  char* plotOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOiiiiss:write_stateout",
-			    &pyPointerToIstatout,
-			    &pyPointerToNstatout,
-			    &f77AsciiOutput,
-			    &f77PlotOutput,
-			    &asciiOutputInt,
-			    &plotOutputInt,
-			    &asciiOutputFile,
-			    &plotOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int* pointerToIstatout = (int*) PyCObject_AsVoidPtr(pyPointerToIstatout);
-  int* pointerToNstatout = (int*) PyCObject_AsVoidPtr(pyPointerToNstatout);
-
-  write_stateout_f(pointerToIstatout,
-		   pointerToNstatout,
-		   &f77AsciiOutput,
-		   &f77PlotOutput,
-		   &asciiOutputInt,
-		   &plotOutputInt,
-		   asciiOutputFile,
-		   plotOutputFile,
-		   &errorcode,
-		   errorstring,
-		   strlen(asciiOutputFile),
-		   strlen(plotOutputFile),
-		   sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "pointerToIstatout:" << pointerToIstatout
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write out stress integration parameters
-
-char pypylith3d_write_strscomp__doc__[] = "";
-char pypylith3d_write_strscomp__name__[] = "write_strscomp";
-
-PyObject * pypylith3d_write_strscomp(PyObject *, PyObject *args)
-{
-  double stressTolerance;
-  double minimumStrainPerturbation;
-  double initialStrainPerturbation;
-  int f77AsciiOutput;
-  int asciiOutputInt;
-  char* asciiOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "dddiis:write_strscomp",
-			    &stressTolerance,
-			    &minimumStrainPerturbation,
-			    &initialStrainPerturbation,
-			    &f77AsciiOutput,
-			    &asciiOutputInt,
-			    &asciiOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  write_strscomp_f(&stressTolerance,
-		   &minimumStrainPerturbation,
-		   &initialStrainPerturbation,
-		   &f77AsciiOutput,
-		   &asciiOutputInt,
-		   asciiOutputFile,strlen(asciiOutputFile));
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "initialStrainPerturbation:" << initialStrainPerturbation
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write out subiteration convergence parameters
-
-char pypylith3d_write_subiter__doc__[] = "";
-char pypylith3d_write_subiter__name__[] = "write_subiter";
-
-PyObject * pypylith3d_write_subiter(PyObject *, PyObject *args)
-{
-  int usePreviousDisplacementFlag;
-  int f77AsciiOutput;
-  int asciiOutputInt;
-  char* asciiOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "iiis:write_subiter",
-			    &usePreviousDisplacementFlag,
-			    &f77AsciiOutput,
-			    &asciiOutputInt,
-			    &asciiOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-
-  write_subiter_f(&usePreviousDisplacementFlag,
-		  &f77AsciiOutput,
-		  &asciiOutputInt,
-		  asciiOutputFile,strlen(asciiOutputFile));
-		  
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "usePreviousDisplacementFlag:" << usePreviousDisplacementFlag
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write time step data
-
-char pypylith3d_write_timdat__doc__[] = "";
-char pypylith3d_write_timdat__name__[] = "write_timdat";
-
-PyObject * pypylith3d_write_timdat(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToDelt;
-  PyObject* pyPointerToAlfa;
-  PyObject* pyPointerToUtol;
-  PyObject* pyPointerToFtol;
-  PyObject* pyPointerToEtol;
-  PyObject* pyPointerToTimes;
-  PyObject* pyPointerToMaxstp;
-  PyObject* pyPointerToMaxit;
-  PyObject* pyPointerToNtdinit;
-  PyObject* pyPointerToLgdef;
-  PyObject* pyPointerToItmax;
-  int numberTimeStepGroups;
-  int totalNumberTimeSteps;
-  int f77AsciiOutput;
-  int asciiOutputInt;
-  char* asciiOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOOOOOOOOOOiiiis:write_timdat",
-			    &pyPointerToDelt,
-			    &pyPointerToAlfa,
-			    &pyPointerToUtol,
-			    &pyPointerToFtol,
-			    &pyPointerToEtol,
-			    &pyPointerToTimes,
-			    &pyPointerToMaxstp,
-			    &pyPointerToMaxit,
-			    &pyPointerToNtdinit,
-			    &pyPointerToLgdef,
-			    &pyPointerToItmax,
-			    &numberTimeStepGroups,
-			    &totalNumberTimeSteps,
-			    &f77AsciiOutput,
-			    &asciiOutputInt,
-			    &asciiOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  double* pointerToDelt = (double*) PyCObject_AsVoidPtr(pyPointerToDelt);
-  double* pointerToAlfa = (double*) PyCObject_AsVoidPtr(pyPointerToAlfa);
-  double* pointerToUtol = (double*) PyCObject_AsVoidPtr(pyPointerToUtol);
-  double* pointerToFtol = (double*) PyCObject_AsVoidPtr(pyPointerToFtol);
-  double* pointerToEtol = (double*) PyCObject_AsVoidPtr(pyPointerToEtol);
-  double* pointerToTimes = (double*) PyCObject_AsVoidPtr(pyPointerToTimes);
-  int* pointerToMaxstp = (int*) PyCObject_AsVoidPtr(pyPointerToMaxstp);
-  int* pointerToMaxit = (int*) PyCObject_AsVoidPtr(pyPointerToMaxit);
-  int* pointerToNtdinit = (int*) PyCObject_AsVoidPtr(pyPointerToNtdinit);
-  int* pointerToLgdef = (int*) PyCObject_AsVoidPtr(pyPointerToLgdef);
-  int* pointerToItmax = (int*) PyCObject_AsVoidPtr(pyPointerToItmax);
-
-  write_timdat_f(pointerToDelt,
-		 pointerToAlfa,
-		 pointerToUtol,
-		 pointerToFtol,
-		 pointerToEtol,
-		 pointerToTimes,
-		 pointerToMaxstp,
-		 pointerToMaxit,
-		 pointerToNtdinit,
-		 pointerToLgdef,
-		 pointerToItmax,
-		 &numberTimeStepGroups,
-		 &totalNumberTimeSteps,
-		 &f77AsciiOutput,
-		 &asciiOutputInt,
-		 asciiOutputFile,
-		 &errorcode,
-		 errorstring,
-		 strlen(asciiOutputFile),
-		 sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "totalNumberTimeSteps:" << totalNumberTimeSteps
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write traction BC
-
-char pypylith3d_write_tractions__doc__[] = "";
-char pypylith3d_write_tractions__name__[] = "write_tractions";
-
-PyObject * pypylith3d_write_tractions(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToTractionverts;
-  PyObject* pyPointerToTractionvals;
-  int numberTractionBc;
-  int numberSurfaceElementNodes;
-  int f77AsciiOutput;
-  int asciiOutputInt;
-  char* asciiOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOiiiis:write_tractions",
-			    &pyPointerToTractionverts,
-			    &pyPointerToTractionvals,
-			    &numberTractionBc,
-			    &numberSurfaceElementNodes,
-			    &f77AsciiOutput,
-			    &asciiOutputInt,
-			    &asciiOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  int* pointerToTractionverts = (int*) PyCObject_AsVoidPtr(pyPointerToTractionverts);
-  double* pointerToTractionvals = (double*) PyCObject_AsVoidPtr(pyPointerToTractionvals);
-
-  write_tractions_f(pointerToTractionverts,
-		    pointerToTractionvals,
-		    &numberTractionBc,
-		    &numberSurfaceElementNodes,
-		    &f77AsciiOutput,
-		    &asciiOutputInt,
-		    asciiOutputFile,
-		    &errorcode,
-		    errorstring,
-		    strlen(asciiOutputFile),
-		    sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberTractionBc:" << numberTractionBc
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write mesh info to UCD file
-
-char pypylith3d_write_ucd_mesh__doc__[] = "";
-char pypylith3d_write_ucd_mesh__name__[] = "write_ucd_mesh";
-
-PyObject * pypylith3d_write_ucd_mesh(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToX;
-  int numberNodes;
-  PyObject* pyPointerToIens;
-  PyObject* pyPointerToIvfamily;
-  int numberVolumeElements;
-  int numberVolumeElementFamilies;
-  PyObject* pyPointerToSh;
-  int numberVolumeElementNodes;
-  int numberVolumeElementGaussPoints;
-  int volumeElementType;
-  PyObject* pyPointerToIstatout;
-  PyObject* pyPointerToNstatout;
-  int f77UcdOutput;
-  int ucdOutputInt;
-  char* ucdOutputRoot;
-
-  int ok = PyArg_ParseTuple(args, "OiOOiiOiiiOOiis:write_ucd_mesh",
-			    &pyPointerToX,
-			    &numberNodes,
-			    &pyPointerToIens,
-			    &pyPointerToIvfamily,
-			    &numberVolumeElements,
-			    &numberVolumeElementFamilies,
-			    &pyPointerToSh,
-			    &numberVolumeElementNodes,
-			    &numberVolumeElementGaussPoints,
-			    &volumeElementType,
-			    &pyPointerToIstatout,
-			    &pyPointerToNstatout,
-			    &f77UcdOutput,
-			    &ucdOutputInt,
-			    &ucdOutputRoot);
-
-  if (!ok) {
-    return 0;
-  }
-
-  double* pointerToX = (double*) PyCObject_AsVoidPtr(pyPointerToX);
-  int* pointerToIens = (int*) PyCObject_AsVoidPtr(pyPointerToIens);
-  int* pointerToIvfamily = (int*) PyCObject_AsVoidPtr(pyPointerToIvfamily);
-  double* pointerToSh = (double*) PyCObject_AsVoidPtr(pyPointerToSh);
-  int* pointerToIstatout = (int*) PyCObject_AsVoidPtr(pyPointerToIstatout);
-  int* pointerToNstatout = (int*) PyCObject_AsVoidPtr(pyPointerToNstatout);
-
-  write_ucd_mesh_f(pointerToX,
-		   &numberNodes,
-		   pointerToIens,
-		   pointerToIvfamily,
-		   &numberVolumeElements,
-		   &numberVolumeElementFamilies,
-		   pointerToSh,
-		   &numberVolumeElementNodes,
-		   &numberVolumeElementGaussPoints,
-		   &volumeElementType,
-		   pointerToIstatout,
-		   pointerToNstatout,
-		   &f77UcdOutput,
-		   &ucdOutputInt,
-		   ucdOutputRoot,strlen(ucdOutputRoot));
-		  
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberVolumeElements:" << numberVolumeElements
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write winkler BC
-
-char pypylith3d_write_wink__doc__[] = "";
-char pypylith3d_write_wink__name__[] = "write_wink";
-
-PyObject * pypylith3d_write_wink(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToWinkdef;
-  PyObject* pyPointerToIwinkdef;
-  PyObject* pyPointerToIwinkid;
-  int numberWinklerEntries;
-  int f77AsciiOutput;
-  int asciiOutputInt;
-  char* asciiOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOOiiis:write_wink",
-			    &pyPointerToWinkdef,
-			    &pyPointerToIwinkdef,
-			    &pyPointerToIwinkid,
-			    &numberWinklerEntries,
-			    &f77AsciiOutput,
-			    &asciiOutputInt,
-			    &asciiOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  double* pointerToWinkdef = (double*) PyCObject_AsVoidPtr(pyPointerToWinkdef);
-  int* pointerToIwinkdef = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkdef);
-  int* pointerToIwinkid = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkid);
-
-  write_wink_f(pointerToWinkdef,
-	       pointerToIwinkdef,
-	       pointerToIwinkid,
-	       &numberWinklerEntries,
-	       &f77AsciiOutput,
-	       &asciiOutputInt,
-	       asciiOutputFile,
-	       &errorcode,
-	       errorstring,
-	       strlen(asciiOutputFile),
-	       sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberWinklerEntries:" << numberWinklerEntries
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-
-// Write slippery winkler BC
-
-char pypylith3d_write_winkx__doc__[] = "";
-char pypylith3d_write_winkx__name__[] = "write_winkx";
-
-PyObject * pypylith3d_write_winkx(PyObject *, PyObject *args)
-{
-  PyObject* pyPointerToWinkxdef;
-  PyObject* pyPointerToIwinkxdef;
-  PyObject* pyPointerToIwinkxid;
-  int numberSlipperyWinklerEntries;
-  int f77AsciiOutput;
-  int asciiOutputInt;
-  char* asciiOutputFile;
-
-  int ok = PyArg_ParseTuple(args, "OOOiiis:write_winkx",
-			    &pyPointerToWinkxdef,
-			    &pyPointerToIwinkxdef,
-			    &pyPointerToIwinkxid,
-			    &numberSlipperyWinklerEntries,
-			    &f77AsciiOutput,
-			    &asciiOutputInt,
-			    &asciiOutputFile);
-
-  if (!ok) {
-    return 0;
-  }
-
-  int errorcode = 0;
-  const int maxsize = 4096;
-  char errorstring[maxsize];
-  double* pointerToWinkxdef = (double*) PyCObject_AsVoidPtr(pyPointerToWinkxdef);
-  int* pointerToIwinkxdef = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkxdef);
-  int* pointerToIwinkxid = (int*) PyCObject_AsVoidPtr(pyPointerToIwinkxid);
-
-  write_winkx_f(pointerToWinkxdef,
-		pointerToIwinkxdef,
-		pointerToIwinkxid,
-		&numberSlipperyWinklerEntries,
-		&f77AsciiOutput,
-		&asciiOutputInt,
-		asciiOutputFile,
-		&errorcode,
-		errorstring,
-		strlen(asciiOutputFile),
-		sizeof(errorstring));
-    
-  if(0 != exceptionhandler(errorcode, errorstring)) {
-    return 0;
-  }
-
-  journal::debug_t debug("pylith3d");
-  debug
-    << journal::at(__HERE__)
-    << "numberSlipperyWinklerEntries:" << numberSlipperyWinklerEntries
-    << journal::endl;
-
-  // return
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-// version
-// $Id: write_modelinfo.cc,v 1.5 2005/06/24 20:17:43 willic3 Exp $
-
-// End of file

Deleted: short/3D/PyLith/branches/pylith-0.8/pylith3d/module/write_modelinfo.h
===================================================================
--- short/3D/PyLith/branches/pylith-0.8/pylith3d/module/write_modelinfo.h	2007-03-30 20:06:04 UTC (rev 6474)
+++ short/3D/PyLith/branches/pylith-0.8/pylith3d/module/write_modelinfo.h	2007-03-30 21:05:09 UTC (rev 6475)
@@ -1,171 +0,0 @@
-// -*- C++ -*-
-// 
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-//  PyLith by Charles A. Williams, Brad Aagaard, and Matt Knepley
-//
-//  Copyright (c) 2004-2006 Rensselaer Polytechnic Institute
-//
-//  Permission is hereby granted, free of charge, to any person obtaining
-//  a copy of this software and associated documentation files (the
-//  "Software"), to deal in the Software without restriction, including
-//  without limitation the rights to use, copy, modify, merge, publish,
-//  distribute, sublicense, and/or sell copies of the Software, and to
-//  permit persons to whom the Software is furnished to do so, subject to
-//  the following conditions:
-//
-//  The above copyright notice and this permission notice shall be
-//  included in all copies or substantial portions of the Software.
-//
-//  THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-//  EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-//  MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-//  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-//  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-//  OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-//  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 
-
-#if !defined(pypylith3d_write_modelinfo_h)
-#define pypylith3d_write_modelinfo_h
-
-// write boundary conditions
-extern char pypylith3d_write_bc__name__[];
-extern char pypylith3d_write_bc__doc__[];
-extern "C"
-PyObject * pypylith3d_write_bc(PyObject *, PyObject *);
-
-// write element node array
-extern char pypylith3d_write_connect__name__[];
-extern char pypylith3d_write_connect__doc__[];
-extern "C"
-PyObject * pypylith3d_write_connect(PyObject *, PyObject *);
-
-// write nodal coordinates
-extern char pypylith3d_write_coords__name__[];
-extern char pypylith3d_write_coords__doc__[];
-extern "C"
-PyObject * pypylith3d_write_coords(PyObject *, PyObject *);
-
-// write differential forces
-extern char pypylith3d_write_diff__name__[];
-extern char pypylith3d_write_diff__doc__[];
-extern "C"
-PyObject * pypylith3d_write_diff(PyObject *, PyObject *);
-
-// write out element and prestress information
-extern char pypylith3d_write_element_info__name__[];
-extern char pypylith3d_write_element_info__doc__[];
-extern "C"
-PyObject * pypylith3d_write_element_info(PyObject *, PyObject *);
-
-// write time steps at which full output is desired
-extern char pypylith3d_write_fuldat__name__[];
-extern char pypylith3d_write_fuldat__doc__[];
-extern "C"
-PyObject * pypylith3d_write_fuldat(PyObject *, PyObject *);
-
-// write out global control information
-extern char pypylith3d_write_global_info__name__[];
-extern char pypylith3d_write_global_info__doc__[];
-extern "C"
-PyObject * pypylith3d_write_global_info(PyObject *, PyObject *);
-
-// write load histories
-extern char pypylith3d_write_hist__name__[];
-extern char pypylith3d_write_hist__doc__[];
-extern "C"
-PyObject * pypylith3d_write_hist(PyObject *, PyObject *);
-
-// write out material property info
-extern char pypylith3d_write_props__name__[];
-extern char pypylith3d_write_props__doc__[];
-extern "C"
-PyObject * pypylith3d_write_props(PyObject *, PyObject *);
-
-// write local coordinate rotations
-extern char pypylith3d_write_skew__name__[];
-extern char pypylith3d_write_skew__doc__[];
-extern "C"
-PyObject * pypylith3d_write_skew(PyObject *, PyObject *);
-
-// write slippery node entries
-extern char pypylith3d_write_slip__name__[];
-extern char pypylith3d_write_slip__doc__[];
-extern "C"
-PyObject * pypylith3d_write_slip(PyObject *, PyObject *);
-
-// write out sparse matrix information
-extern char pypylith3d_write_sparse_info__name__[];
-extern char pypylith3d_write_sparse_info__doc__[];
-extern "C"
-PyObject * pypylith3d_write_sparse_info(PyObject *, PyObject *);
-
-// write split node entries
-extern char pypylith3d_write_split__name__[];
-extern char pypylith3d_write_split__doc__[];
-extern "C"
-PyObject * pypylith3d_write_split(PyObject *, PyObject *);
-
-// write split node entries for plot output
-extern char pypylith3d_write_split_plot__name__[];
-extern char pypylith3d_write_split_plot__doc__[];
-extern "C"
-PyObject * pypylith3d_write_split_plot(PyObject *, PyObject *);
-
-// write state output information
-extern char pypylith3d_write_stateout__name__[];
-extern char pypylith3d_write_stateout__doc__[];
-extern "C"
-PyObject * pypylith3d_write_stateout(PyObject *, PyObject *);
-
-// write out stress computation information
-extern char pypylith3d_write_strscomp__name__[];
-extern char pypylith3d_write_strscomp__doc__[];
-extern "C"
-PyObject * pypylith3d_write_strscomp(PyObject *, PyObject *);
-
-// write out subiteration convergence information
-extern char pypylith3d_write_subiter__name__[];
-extern char pypylith3d_write_subiter__doc__[];
-extern "C"
-PyObject * pypylith3d_write_subiter(PyObject *, PyObject *);
-
-// write time step data
-extern char pypylith3d_write_timdat__name__[];
-extern char pypylith3d_write_timdat__doc__[];
-extern "C"
-PyObject * pypylith3d_write_timdat(PyObject *, PyObject *);
-
-// write traction BC
-extern char pypylith3d_write_tractions__name__[];
-extern char pypylith3d_write_tractions__doc__[];
-extern "C"
-PyObject * pypylith3d_write_tractions(PyObject *, PyObject *);
-
-// write mesh info to UCD file
-extern char pypylith3d_write_ucd_mesh__name__[];
-extern char pypylith3d_write_ucd_mesh__doc__[];
-extern "C"
-PyObject * pypylith3d_write_ucd_mesh(PyObject *, PyObject *);
-
-// write winkler BC
-extern char pypylith3d_write_wink__name__[];
-extern char pypylith3d_write_wink__doc__[];
-extern "C"
-PyObject * pypylith3d_write_wink(PyObject *, PyObject *);
-
-// write slippery winkler BC
-extern char pypylith3d_write_winkx__name__[];
-extern char pypylith3d_write_winkx__doc__[];
-extern "C"
-PyObject * pypylith3d_write_winkx(PyObject *, PyObject *);
-
-#endif
-
-// version
-// $Id: write_modelinfo.h,v 1.1 2005/04/21 00:04:36 willic3 Exp $
-
-// End of file



More information about the cig-commits mailing list