[cig-commits] r4666 - short/3D/PyLith/trunk/libsrc/feassemble

baagaard at geodynamics.org baagaard at geodynamics.org
Thu Sep 28 22:07:59 PDT 2006


Author: baagaard
Date: 2006-09-28 22:07:58 -0700 (Thu, 28 Sep 2006)
New Revision: 4666

Added:
   short/3D/PyLith/trunk/libsrc/feassemble/Quadrature2Din3D.cc
   short/3D/PyLith/trunk/libsrc/feassemble/Quadrature2Din3D.hh
   short/3D/PyLith/trunk/libsrc/feassemble/Quadrature2Din3D.icc
   short/3D/PyLith/trunk/libsrc/feassemble/Quadrature3D.cc
   short/3D/PyLith/trunk/libsrc/feassemble/Quadrature3D.hh
   short/3D/PyLith/trunk/libsrc/feassemble/Quadrature3D.icc
Modified:
   short/3D/PyLith/trunk/libsrc/feassemble/Makefile.am
   short/3D/PyLith/trunk/libsrc/feassemble/Quadrature2D.cc
Log:
Added Quadrature2Din3D and Quadrature3D (not tested yet).

Modified: short/3D/PyLith/trunk/libsrc/feassemble/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/libsrc/feassemble/Makefile.am	2006-09-29 01:57:35 UTC (rev 4665)
+++ short/3D/PyLith/trunk/libsrc/feassemble/Makefile.am	2006-09-29 05:07:58 UTC (rev 4666)
@@ -20,7 +20,9 @@
 	Quadrature1D.cc \
 	Quadrature1Din2D.cc \
 	Quadrature1Din3D.cc \
-	Quadrature2D.cc
+	Quadrature2D.cc \
+	Quadrature2Din3D.cc \
+	Quadrature3D.cc
 
 subpkginclude_HEADERS = \
 	Quadrature.hh \
@@ -32,7 +34,11 @@
 	Quadrature1Din3D.hh \
 	Quadrature1Din3D.icc \
 	Quadrature2D.hh \
-	Quadrature2D.icc
+	Quadrature2D.icc \
+	Quadrature2Din3D.hh \
+	Quadrature2Din3D.icc \
+	Quadrature3D.hh \
+	Quadrature3D.icc
 
 noinst_HEADERS =
 

Modified: short/3D/PyLith/trunk/libsrc/feassemble/Quadrature2D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/feassemble/Quadrature2D.cc	2006-09-29 01:57:35 UTC (rev 4665)
+++ short/3D/PyLith/trunk/libsrc/feassemble/Quadrature2D.cc	2006-09-29 05:07:58 UTC (rev 4666)
@@ -83,26 +83,25 @@
     // dy/dp = sum[i=0,n-1] (dNi/dp * yi)
     // dx/dq = sum[i=0,n-1] (dNi/dq * xi)
     // dy/dq = sum[i=0,n-1] (dNi/dq * yi)
-    for (int iVertex=0;
-	 iVertex < _numCorners;
-	 ++iVertex)
+    for (int iVertex=0; iVertex < _numCorners; ++iVertex)
       for (int iRow=0, 
 	     iB=iQuadPt*_numCorners*_spaceDim+iVertex*_cellDim;
 	   iRow < _cellDim;
 	   ++iRow) {
 	const double deriv = _basisDeriv[iB+iRow];
 	for (int iCol=0, iJ=iQuadPt*_cellDim*_spaceDim + iRow*_spaceDim;
-	     iCol < _spaceDim; ++iCol)
-	  _jacobian[iJ + iCol] += deriv * vertCoords[iVertex*_spaceDim+iCol];
+	     iCol < _spaceDim;
+	     ++iCol)
+	  _jacobian[iJ+iCol] += deriv * vertCoords[iVertex*_spaceDim+iCol];
       } // for
   
     // Compute determinant of Jacobian at quadrature point
     // |J| = j00*j11-j01*j10
     const int iJ = iQuadPt*_cellDim*_spaceDim;
     const int i00 = iJ + 0*_spaceDim + 0;
-    const int i11 = iJ + 1*_spaceDim + 1;
     const int i01 = iJ + 0*_spaceDim + 1;
     const int i10 = iJ + 1*_spaceDim + 0;
+    const int i11 = iJ + 1*_spaceDim + 1;
     const double det = 
       _jacobian[i00]*_jacobian[i11] - _jacobian[i01]*_jacobian[i10];
     _checkJacobianDet(det);

Added: short/3D/PyLith/trunk/libsrc/feassemble/Quadrature2Din3D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/feassemble/Quadrature2Din3D.cc	2006-09-29 01:57:35 UTC (rev 4665)
+++ short/3D/PyLith/trunk/libsrc/feassemble/Quadrature2Din3D.cc	2006-09-29 05:07:58 UTC (rev 4666)
@@ -0,0 +1,193 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#include <portinfo>
+
+#include "Quadrature2Din3D.hh" // implementation of class methods
+
+#include <assert.h> // USES assert()
+#include <stdexcept> // USES internal_error
+
+// ----------------------------------------------------------------------
+// Constructor
+pylith::feassemble::Quadrature2Din3D::Quadrature2Din3D(void)
+{ // constructor
+} // constructor
+
+// ----------------------------------------------------------------------
+// Destructor
+pylith::feassemble::Quadrature2Din3D::~Quadrature2Din3D(void)
+{ // destructor
+} // destructor
+  
+// ----------------------------------------------------------------------
+// Copy constructor.
+pylith::feassemble::Quadrature2Din3D::Quadrature2Din3D(const Quadrature2Din3D& q) :
+  Quadrature(q)
+{ // copy constructor
+} // copy constructor
+
+// ----------------------------------------------------------------------
+// Compute geometric quantities for a cell.
+void
+pylith::feassemble::Quadrature2Din3D::_computeGeometry(
+		       const ALE::Obj<ALE::Mesh::section_type>& coordinates,
+		       const ALE::Mesh::point_type& cell)
+{ // _computeGeometry
+  assert(2 == _cellDim);
+  assert(3 == _spaceDim);
+  assert(0 != _basisDeriv);
+  assert(0 != _quadPtsRef);
+  assert(0 != _quadPts);
+  assert(0 != _quadWts);
+  assert(0 != _jacobian);
+  assert(0 != _jacobianInv);
+
+  _resetGeometry();
+
+  // Get coordinates of cell's vertices
+  const ALE::Mesh::topology_type::patch_type patch  = 0;
+  const ALE::Mesh::section_type::value_type* vertCoords = 
+    coordinates->restrict(patch, cell);
+  //assert(3 == coordinates.GetFiberDimensionByDepth(patch,
+  //*vertices->begin(), 0));
+
+  // Loop over quadrature points
+  for (int iQuadPt=0; iQuadPt < _numQuadPts; ++iQuadPt) {
+    
+    // Compute coordinates of quadrature point in cell
+    // x = sum[i=0,n-1] (Ni * xi)
+    // y = sum[i=0,n-1] (Ni * yi)
+    // z = sum[i=0,n-1] (Ni * zi)
+    for (int iVertex=0, iB=iQuadPt*_numCorners;
+	 iVertex < _numCorners;
+	 ++iVertex) {
+      const double basis = _basis[iB+iVertex];
+      for (int iDim=0, iQ=iQuadPt*_spaceDim, iV=iVertex*_spaceDim;
+	   iDim < _spaceDim;
+	   ++iDim)
+	_quadPts[iQ+iDim] +=  basis * vertCoords[iV+iDim];
+    } // for
+    
+    // Compute Jacobian at quadrature point
+    // J = [dx/dp dy/dp dz/dp]
+    //     [dx/dq dy/dq dz/dq]
+    // dx/dp = sum[i=0,n-1] (dNi/dp * xi)
+    // dy/dp = sum[i=0,n-1] (dNi/dp * yi)
+    // dz/dp = sum[i=0,n-1] (dNi/dp * zi)
+    // dx/dq = sum[i=0,n-1] (dNi/dq * xi)
+    // dy/dq = sum[i=0,n-1] (dNi/dq * yi)
+    // dz/dq = sum[i=0,n-1] (dNi/dq * zi)
+    for (int iVertex=0; iVertex < _numCorners; ++iVertex)
+      for (int iRow=0, 
+	     iB=iQuadPt*_numCorners*_spaceDim+iVertex*_cellDim;
+	   iRow < _cellDim;
+	   ++iRow) {
+      const double deriv = _basisDeriv[iB+iRow];
+      for (int iCol=0, iJ=iQuadPt*_cellDim*_spaceDim + iRow*_spaceDim;
+	     iCol < _spaceDim;
+	     ++iCol)
+	_jacobian[iJ+iCol] += deriv * vertCoords[iVertex*+_spaceDim+iCol];
+    } // for
+
+    // Compute determinant of Jacobian at quadrature point
+    // |J| = sqrt(J transpose(J))
+    const int iJ = iQuadPt*_cellDim*_spaceDim;
+    const int i00 = iJ + 0*_spaceDim + 0;
+    const int i01 = iJ + 0*_spaceDim + 1;
+    const int i02 = iJ + 0*_spaceDim + 2;
+    const int i10 = iJ + 1*_spaceDim + 0;
+    const int i11 = iJ + 1*_spaceDim + 1;
+    const int i12 = iJ + 1*_spaceDim + 2;
+    // JJ = J transpose(J)
+    const double jj00 = 
+      _jacobian[i00]*_jacobian[i00] +
+      _jacobian[i01]*_jacobian[i01] +
+      _jacobian[i02]*_jacobian[i02];
+    const double jj01 =
+      _jacobian[i00]*_jacobian[i10] +
+      _jacobian[i01]*_jacobian[i11] +
+      _jacobian[i02]*_jacobian[i12];
+    const double jj10 = jj01;
+    const double jj11 = 
+      _jacobian[i10]*_jacobian[i10] +
+      _jacobian[i11]*_jacobian[i11] +
+      _jacobian[i12]*_jacobian[i12];
+    const double det = sqrt(jj00*jj11 - jj01*jj10);
+    _checkJacobianDet(det);
+    _jacobianDet[iQuadPt] = det;
+
+    // Compute inverse of Jacobian at quadrature point
+    const double d01 = 
+      _jacobian[i00]*_jacobian[i11] - _jacobian[i10]*_jacobian[i01];
+    const double d12 = 
+      _jacobian[i01]*_jacobian[i12] - _jacobian[i11]*_jacobian[i02];
+    const double d02 = 
+      _jacobian[i00]*_jacobian[i12] - _jacobian[i10]*_jacobian[i02];
+    if (d01 > _minJacobian) {
+      // Jinv00 = 1/d01 * J11
+      // Jinv10 = 1/d01 * -J10
+      // Jinv01 = 1/d01 * -J01
+      // Jinv11 = 1/d01 * J00
+      _jacobianInv[iJ+0] = _jacobian[i11] / d01; // Jinv00
+      _jacobianInv[iJ+1] = -_jacobian[i10] / d01; // Jinv10
+      _jacobianInv[iJ+2] = -_jacobian[i01] / d01; // Jinv01
+      _jacobianInv[iJ+3] = _jacobian[i00] / d01; // Jinv11
+      if (d12 > _minJacobian) {
+	// Jinv20 = 1/d12 -J11
+	// Jinv21 = 1/d12 J01
+	_jacobianInv[iJ+4] = -_jacobian[i11] / d12; // Jinv20
+	_jacobianInv[iJ+5] = _jacobian[i01] / d12; // Jinv21
+      } else if (d02 > _minJacobian) {
+	// Jinv20 = 1/d02 -J10
+	// Jinv21 = 1/d02 J00
+	_jacobianInv[iJ+4] = -_jacobian[i10] / d02; // Jinv20
+	_jacobianInv[iJ+5] = _jacobian[i00] / d02; // Jinv21
+      } else {
+	_jacobianInv[iJ+4] = 0.0; // Jinv20
+	_jacobianInv[iJ+5] = 0.0; // Jinv21
+      } // if/else
+    } else if (d02 > _minJacobian) {
+      // Jinv00 = 1/d02 * J12
+      // Jinv01 = 1/d02 * -J02
+      // Jinv20 = 1/d02 * -J10
+      // Jinv21 = 1/d02 * J00
+      _jacobianInv[iJ+0] = _jacobian[i12] / d02; // Jinv00
+      _jacobianInv[iJ+1] = -_jacobian[i02] / d02; // Jinv01
+      _jacobianInv[iJ+4] = -_jacobian[i10] / d02; // Jinv20
+      _jacobianInv[iJ+5] = _jacobian[i00] / d02; // Jinv21
+      if (d12 > _minJacobian) {
+	// Jinv10 = 1/d12 J12
+	// Jinv11 = 1/d12 -J02
+	_jacobianInv[iJ+2] = -_jacobian[i12] / d12; // Jinv10
+	_jacobianInv[iJ+3] = _jacobian[i02] / d12; // Jinv11
+      } else {
+	_jacobianInv[iJ+2] = 0.0; // Jinv10
+	_jacobianInv[iJ+3] = 0.0; // Jinv11
+      } // if/else
+    } else if (d12 > _minJacobian) {
+      _jacobianInv[iJ+0] = 0.0; // Jinv00
+      _jacobianInv[iJ+1] = 0.0; // Jinv01
+      // Jinv10 = 1/d12 J12
+      // Jinv11 = 1/d12 -J02
+      // Jinv20 = 1/d12 -J11
+      // Jinv21 = 1/d12 J01
+      _jacobianInv[iJ+2] = _jacobian[i12] / d12; // Jinv10
+      _jacobianInv[iJ+3] = -_jacobian[i02] / d12; // Jin11
+      _jacobianInv[iJ+4] = -_jacobian[i11] / d12; // Jinv20
+      _jacobianInv[iJ+5] = _jacobian[i01] / d12; // Jinv21
+    } else
+      throw std::runtime_error("Could not invert Jacobian.");
+  } // for
+} // _computeGeometry
+
+// End of file 

Added: short/3D/PyLith/trunk/libsrc/feassemble/Quadrature2Din3D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/feassemble/Quadrature2Din3D.hh	2006-09-29 01:57:35 UTC (rev 4665)
+++ short/3D/PyLith/trunk/libsrc/feassemble/Quadrature2Din3D.hh	2006-09-29 05:07:58 UTC (rev 4666)
@@ -0,0 +1,77 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+/**
+ * @file pylith/feassemble/Quadrature2Din3D.hh
+ *
+ * @brief Quadrature for 2-D finite-elements in 3-D space.
+ */
+
+#if !defined(pylith_feassemble_quadrature2din3d_hh)
+#define pylith_feassemble_quadrature2din3d_hh
+
+#include "Quadrature.hh"
+
+namespace pylith {
+  namespace feassemble {
+    class Quadrature2Din3D;
+    class TestQuadrature2Din3D;
+  } // feassemble
+} // pylith
+
+class pylith::feassemble::Quadrature2Din3D : public Quadrature
+{ // Quadrature2D
+  friend class TestQuadrature2Din3D; // unit testing
+
+// PUBLIC MEMBERS ///////////////////////////////////////////////////////
+public :
+
+  /// Constructor
+  Quadrature2Din3D(void);
+
+  /// Destructor
+  virtual ~Quadrature2Din3D(void);
+
+  /// Create a copy of this object.
+  virtual
+  Quadrature* clone(void) const;
+
+// PROTECTED METHODS ////////////////////////////////////////////////////
+protected :
+
+  /** Copy constructor.
+   *
+   * @param q Quadrature to copy
+   */
+  Quadrature2Din3D(const Quadrature2Din3D& q);
+
+  /** Compute geometric quantities for a cell.
+   *
+   * @param coordinates Section containing vertex coordinates
+   * @param cell Finite-element cell
+   */
+  void _computeGeometry(const ALE::Obj<ALE::Mesh::section_type>& coordinates,
+			const ALE::Mesh::point_type& cell);
+
+// PRIVATE METHODS //////////////////////////////////////////////////////
+private :
+
+  /// Not implemented
+  const Quadrature2Din3D& operator=(const Quadrature2Din3D&);
+
+}; // Quadrature2Din3D
+
+#include "Quadrature2Din3D.icc" // inline methods
+
+#endif // pylith_feassemble_quadrature2din3d_hh
+
+// End of file 

Added: short/3D/PyLith/trunk/libsrc/feassemble/Quadrature2Din3D.icc
===================================================================
--- short/3D/PyLith/trunk/libsrc/feassemble/Quadrature2Din3D.icc	2006-09-29 01:57:35 UTC (rev 4665)
+++ short/3D/PyLith/trunk/libsrc/feassemble/Quadrature2Din3D.icc	2006-09-29 05:07:58 UTC (rev 4666)
@@ -0,0 +1,26 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#if !defined(pylith_feassemble_quadrature2din3d_hh)
+#error "Quadrature2Din3D.icc must be included only from Quadrature2Din3D.hh"
+#else
+
+// Create a copy of this object.
+inline
+pylith::feassemble::Quadrature*
+pylith::feassemble::Quadrature2Din3D::clone(void) const {
+  return new Quadrature2Din3D(*this);
+} // clone
+
+#endif
+
+// End of file

Added: short/3D/PyLith/trunk/libsrc/feassemble/Quadrature3D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/feassemble/Quadrature3D.cc	2006-09-29 01:57:35 UTC (rev 4665)
+++ short/3D/PyLith/trunk/libsrc/feassemble/Quadrature3D.cc	2006-09-29 05:07:58 UTC (rev 4666)
@@ -0,0 +1,151 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#include <portinfo>
+
+#include "Quadrature3D.hh" // implementation of class methods
+
+#include <assert.h> // USES assert()
+
+// ----------------------------------------------------------------------
+// Constructor
+pylith::feassemble::Quadrature3D::Quadrature3D(void)
+{ // constructor
+} // constructor
+
+// ----------------------------------------------------------------------
+// Destructor
+pylith::feassemble::Quadrature3D::~Quadrature3D(void)
+{ // destructor
+} // destructor
+  
+// ----------------------------------------------------------------------
+// Copy constructor.
+pylith::feassemble::Quadrature3D::Quadrature3D(const Quadrature3D& q) :
+  Quadrature(q)
+{ // copy constructor
+} // copy constructor
+
+// ----------------------------------------------------------------------
+// Compute geometric quantities for a cell.
+void
+pylith::feassemble::Quadrature3D::_computeGeometry(
+		       const ALE::Obj<ALE::Mesh::section_type>& coordinates,
+		       const ALE::Mesh::point_type& cell)
+{ // _computeGeometry
+  assert(3 == _cellDim);
+  assert(3 == _spaceDim);
+  assert(0 != _basisDeriv);
+  assert(0 != _quadPtsRef);
+  assert(0 != _quadPts);
+  assert(0 != _quadWts);
+  assert(0 != _jacobian);
+  assert(0 != _jacobianInv);
+
+  _resetGeometry();
+
+  // Get coordinates of cell's vertices
+  const ALE::Mesh::topology_type::patch_type patch  = 0;
+  const ALE::Mesh::section_type::value_type* vertCoords = 
+    coordinates->restrict(patch, cell);
+  //assert(3 == coordinates.GetFiberDimensionByDepth(patch,
+  //*vertices->begin(), 0));
+
+  // Loop over quadrature points
+  for (int iQuadPt=0; iQuadPt < _numQuadPts; ++iQuadPt) {
+    
+    // Compute coordinates of quadrature point in cell
+    // x = sum[i=0,n-1] (Ni * xi)
+    // y = sum[i=0,n-1] (Ni * yi)
+    // z = sum[i=0,n-1] (Ni * zi)
+    for (int iVertex=0, iB=iQuadPt*_numCorners;
+	 iVertex < _numCorners;
+	 ++iVertex) {
+      const double basis = _basis[iB+iVertex];
+      for (int iDim=0, iQ=iQuadPt*_spaceDim, iV=iVertex*_spaceDim;
+	   iDim < _spaceDim;
+	   ++iDim)
+	_quadPts[iQ+iDim] +=  basis * vertCoords[iV+iDim];
+    } // for
+    
+    // Compute Jacobian at quadrature point
+    // J = [dx/dp dy/dp dz/dp]
+    //     [dx/dq dy/dq dz/dq]
+    //     [dx/dr dy/dr dz/dr]
+    // dx/dp = sum[i=0,n-1] (dNi/dp * xi)
+    // dy/dp = sum[i=0,n-1] (dNi/dp * yi)
+    // dz/dp = sum[i=0,n-1] (dNi/dp * zi)
+    // dx/dq = sum[i=0,n-1] (dNi/dq * xi)
+    // dy/dq = sum[i=0,n-1] (dNi/dq * yi)
+    // dz/dq = sum[i=0,n-1] (dNi/dq * zi)
+    // dx/dr = sum[i=0,n-1] (dNi/dr * xi)
+    // dy/dr = sum[i=0,n-1] (dNi/dr * yi)
+    // dz/dr = sum[i=0,n-1] (dNi/dr * zi)
+    for (int iVertex=0; iVertex < _numCorners; ++iVertex)
+      for (int iRow=0, 
+	     iB=iQuadPt*_numCorners*_spaceDim+iVertex*_cellDim;
+	   iRow < _cellDim;
+	   ++iRow) {
+	const double deriv = _basisDeriv[iB+iRow];
+	for (int iCol=0, iJ=iQuadPt*_cellDim*_spaceDim + iRow*_spaceDim;
+	     iCol < _spaceDim;
+	     ++iCol)
+	  _jacobian[iJ+iCol] += deriv * vertCoords[iVertex*_spaceDim+iCol];
+      } // for
+
+    // Compute determinant of Jacobian at quadrature point
+    // |J| = j00*(j11*j22-j12*j21) +
+    //      -j01*(j10*j22-j12*j20) +
+    //       j02*(j10*j21-j11*j20)
+    const int iJ = iQuadPt*_cellDim*_spaceDim;
+    const int i00 = iJ + 0*_spaceDim + 0;
+    const int i01 = iJ + 0*_spaceDim + 1;
+    const int i02 = iJ + 0*_spaceDim + 2;
+    const int i10 = iJ + 1*_spaceDim + 0;
+    const int i11 = iJ + 1*_spaceDim + 1;
+    const int i12 = iJ + 1*_spaceDim + 2;
+    const int i20 = iJ + 2*_spaceDim + 0;
+    const int i21 = iJ + 2*_spaceDim + 1;
+    const int i22 = iJ + 2*_spaceDim + 2;
+    const double det = 
+      _jacobian[i00]*(_jacobian[i11]*_jacobian[i22] -
+		      _jacobian[i12]*_jacobian[i21]) -
+      _jacobian[i01]*(_jacobian[i10]*_jacobian[i22] -
+		      _jacobian[i12]*_jacobian[i20]) +
+      _jacobian[i02]*(_jacobian[i10]*_jacobian[i21] -
+		      _jacobian[i11]*_jacobian[i20]);
+    _checkJacobianDet(det);
+    _jacobianDet[iQuadPt] = det;
+
+    // Compute inverse of Jacobian at quadrature point
+    _jacobianInv[i00] = (_jacobian[i11]*_jacobian[i22] -
+			 _jacobian[i12]*_jacobian[i21]) / det;
+    _jacobianInv[i01] = (_jacobian[i02]*_jacobian[i21] -
+			 _jacobian[i01]*_jacobian[i22]) / det;
+    _jacobianInv[i02] = (_jacobian[i01]*_jacobian[i12] -
+			 _jacobian[i02]*_jacobian[i11]) / det;
+    _jacobianInv[i10] = (_jacobian[i12]*_jacobian[i20] -
+			 _jacobian[i10]*_jacobian[i22]) / det;
+    _jacobianInv[i11] = (_jacobian[i00]*_jacobian[i22] -
+			 _jacobian[i02]*_jacobian[i20]) / det;
+    _jacobianInv[i12] = (_jacobian[i02]*_jacobian[i10] -
+			 _jacobian[i00]*_jacobian[i12]) / det;
+    _jacobianInv[i20] = (_jacobian[i10]*_jacobian[i21] -
+			 _jacobian[i11]*_jacobian[i20]) / det;
+    _jacobianInv[i21] = (_jacobian[i01]*_jacobian[i20] -
+			 _jacobian[i00]*_jacobian[i21]) / det;
+    _jacobianInv[i22] = (_jacobian[i00]*_jacobian[i11] -
+			 _jacobian[i01]*_jacobian[i10]) / det;
+  } // for
+} // _computeGeometry
+
+// End of file 

Added: short/3D/PyLith/trunk/libsrc/feassemble/Quadrature3D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/feassemble/Quadrature3D.hh	2006-09-29 01:57:35 UTC (rev 4665)
+++ short/3D/PyLith/trunk/libsrc/feassemble/Quadrature3D.hh	2006-09-29 05:07:58 UTC (rev 4666)
@@ -0,0 +1,77 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+/**
+ * @file pylith/feassemble/Quadrature3D.hh
+ *
+ * @brief Quadrature for 3-D finite-elements.
+ */
+
+#if !defined(pylith_feassemble_quadrature3d_hh)
+#define pylith_feassemble_quadrature3d_hh
+
+#include "Quadrature.hh"
+
+namespace pylith {
+  namespace feassemble {
+    class Quadrature3D;
+    class TestQuadrature3D;
+  } // feassemble
+} // pylith
+
+class pylith::feassemble::Quadrature3D : public Quadrature
+{ // Quadrature1D
+  friend class TestQuadrature3D; // unit testing
+
+// PUBLIC MEMBERS ///////////////////////////////////////////////////////
+public :
+
+  /// Constructor
+  Quadrature3D(void);
+
+  /// Destructor
+  virtual ~Quadrature3D(void);
+
+  /// Create a copy of this object.
+  virtual
+  Quadrature* clone(void) const;
+
+// PROTECTED METHODS ////////////////////////////////////////////////////
+protected :
+
+  /** Copy constructor.
+   *
+   * @param q Quadrature to copy
+   */
+  Quadrature3D(const Quadrature3D& q);
+
+  /** Compute geometric quantities for a cell.
+   *
+   * @param coordinates Section containing vertex coordinates
+   * @param cell Finite-element cell
+   */
+  void _computeGeometry(const ALE::Obj<ALE::Mesh::section_type>& coordinates,
+			const ALE::Mesh::point_type& cell);
+
+// PRIVATE METHODS //////////////////////////////////////////////////////
+private :
+
+  /// Not implemented
+  const Quadrature3D& operator=(const Quadrature3D&);
+
+}; // Quadrature3D
+
+#include "Quadrature3D.icc" // inline methods
+
+#endif // pylith_feassemble_quadrature3d_hh
+
+// End of file 

Added: short/3D/PyLith/trunk/libsrc/feassemble/Quadrature3D.icc
===================================================================
--- short/3D/PyLith/trunk/libsrc/feassemble/Quadrature3D.icc	2006-09-29 01:57:35 UTC (rev 4665)
+++ short/3D/PyLith/trunk/libsrc/feassemble/Quadrature3D.icc	2006-09-29 05:07:58 UTC (rev 4666)
@@ -0,0 +1,26 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#if !defined(pylith_feassemble_quadrature3d_hh)
+#error "Quadrature3D.icc must be included only from Quadrature3D.hh"
+#else
+
+// Create a copy of this object.
+inline
+pylith::feassemble::Quadrature*
+pylith::feassemble::Quadrature3D::clone(void) const {
+  return new Quadrature3D(*this);
+} // clone
+
+#endif
+
+// End of file



More information about the cig-commits mailing list