[cig-commits] r7049 - in short/3D/PyLith/trunk: pylith/feassemble unittests/pytests/feassemble

knepley at geodynamics.org knepley at geodynamics.org
Sat Jun 2 09:57:18 PDT 2007


Author: knepley
Date: 2007-06-02 09:57:17 -0700 (Sat, 02 Jun 2007)
New Revision: 7049

Modified:
   short/3D/PyLith/trunk/pylith/feassemble/FIATLagrange.py
   short/3D/PyLith/trunk/unittests/pytests/feassemble/TestFIATLagrange.py
Log:
Hex element tests now work


Modified: short/3D/PyLith/trunk/pylith/feassemble/FIATLagrange.py
===================================================================
--- short/3D/PyLith/trunk/pylith/feassemble/FIATLagrange.py	2007-06-02 16:35:15 UTC (rev 7048)
+++ short/3D/PyLith/trunk/pylith/feassemble/FIATLagrange.py	2007-06-02 16:57:17 UTC (rev 7049)
@@ -122,10 +122,10 @@
                 self.basisDeriv[q][r][f][g][0] = basisDeriv[q][f][0]*basis[r][g]
                 self.basisDeriv[q][r][f][g][1] = basis[q][f]*basisDeriv[r][g][0]
       elif dim == 3:
-        self.quadPts    = numpy.array((numQuadPts, numQuadPts, numQuadPts, dim))
-        self.quadWts    = numpy.array((numQuadPts, numQuadPts, numQuadPts))
-        self.basis      = numpy.array((numQuadPts, numQuadPts, numQuadPts, numBasisFns, numBasisFns, numBasisFns))
-        self.basisDeriv = numpy.array((numQuadPts, numQuadPts, numQuadPts, numBasisFns, numBasisFns, numBasisFns, dim))
+        self.quadPts    = numpy.zeros((numQuadPts, numQuadPts, numQuadPts, dim))
+        self.quadWts    = numpy.zeros((numQuadPts, numQuadPts, numQuadPts))
+        self.basis      = numpy.zeros((numQuadPts, numQuadPts, numQuadPts, numBasisFns, numBasisFns, numBasisFns))
+        self.basisDeriv = numpy.zeros((numQuadPts, numQuadPts, numQuadPts, numBasisFns, numBasisFns, numBasisFns, dim))
         for q in range(numQuadPts):
           for r in range(numQuadPts):
             for s in range(numQuadPts):
@@ -133,13 +133,13 @@
               self.quadPts[q][r][s][1] = quadpts[r]
               self.quadPts[q][r][s][2] = quadpts[s]
               self.quadWts[q][r][s]    = quadwts[q]*quadwts[r]*quadwts[s]
-            for f in range(numBasisFns):
-              for g in range(numBasisFns):
-                for h in range(numBasisFns):
-                  self.basis[q][r][s][f][g][h]         = basis[q][f]*basis[r][g]*basis[s][h]
-                  self.basisDeriv[q][r][s][f][g][h][0] = basisDeriv[q][f][0]*basis[r][g]*basis[s][h]
-                  self.basisDeriv[q][r][s][f][g][h][1] = basis[q][f]*basisDeriv[r][g][0]*basis[s][h]
-                  self.basisDeriv[q][r][s][f][g][h][2] = basis[q][f]*basis[r][g]*basisDeriv[s][h][0]
+              for f in range(numBasisFns):
+                for g in range(numBasisFns):
+                  for h in range(numBasisFns):
+                    self.basis[q][r][s][f][g][h]         = basis[q][f]*basis[r][g]*basis[s][h]
+                    self.basisDeriv[q][r][s][f][g][h][0] = basisDeriv[q][f][0]*basis[r][g]*basis[s][h]
+                    self.basisDeriv[q][r][s][f][g][h][1] = basis[q][f]*basisDeriv[r][g][0]*basis[s][h]
+                    self.basisDeriv[q][r][s][f][g][h][2] = basis[q][f]*basis[r][g]*basisDeriv[s][h][0]
       self.quadPts    = numpy.reshape(self.quadPts,    (self.numQuadPts, dim))
       self.quadWts    = numpy.reshape(self.quadWts,    (self.numQuadPts))
       self.basis      = numpy.reshape(self.basis,      (self.numQuadPts, self.numCorners))

Modified: short/3D/PyLith/trunk/unittests/pytests/feassemble/TestFIATLagrange.py
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/feassemble/TestFIATLagrange.py	2007-06-02 16:35:15 UTC (rev 7048)
+++ short/3D/PyLith/trunk/unittests/pytests/feassemble/TestFIATLagrange.py	2007-06-02 16:57:17 UTC (rev 7049)
@@ -55,14 +55,110 @@
 def N3q(p):
   return (1+p[0])/4.0
 
+def Q0(p):
+  return (1-p[0])*(1-p[1])*(1-p[2])/8.0
+
+def Q0p(p):
+  return -(1-p[1])*(1-p[2])/8.0
+
+def Q0q(p):
+  return -(1-p[0])*(1-p[2])/8.0
+
+def Q0r(p):
+  return -(1-p[0])*(1-p[1])/8.0
+
+def Q1(p):
+  return (1-p[0])*(1-p[1])*(1+p[2])/8.0
+
+def Q1p(p):
+  return -(1-p[1])*(1+p[2])/8.0
+
+def Q1q(p):
+  return -(1-p[0])*(1+p[2])/8.0
+
+def Q1r(p):
+  return (1-p[0])*(1-p[1])/8.0
+
+def Q2(p):
+  return (1-p[0])*(1+p[1])*(1-p[2])/8.0
+
+def Q2p(p):
+  return -(1+p[1])*(1-p[2])/8.0
+
+def Q2q(p):
+  return (1-p[0])*(1-p[2])/8.0
+
+def Q2r(p):
+  return -(1-p[0])*(1+p[1])/8.0
+
+def Q3(p):
+  return (1-p[0])*(1+p[1])*(1+p[2])/8.0
+
+def Q3p(p):
+  return -(1+p[1])*(1+p[2])/8.0
+
+def Q3q(p):
+  return (1-p[0])*(1+p[2])/8.0
+
+def Q3r(p):
+  return (1-p[0])*(1+p[1])/8.0
+
+def Q4(p):
+  return (1+p[0])*(1-p[1])*(1-p[2])/8.0
+
+def Q4p(p):
+  return (1-p[1])*(1-p[2])/8.0
+
+def Q4q(p):
+  return -(1+p[0])*(1-p[2])/8.0
+
+def Q4r(p):
+  return -(1+p[0])*(1-p[1])/8.0
+
+def Q5(p):
+  return (1+p[0])*(1-p[1])*(1+p[2])/8.0
+
+def Q5p(p):
+  return (1-p[1])*(1+p[2])/8.0
+
+def Q5q(p):
+  return -(1+p[0])*(1+p[2])/8.0
+
+def Q5r(p):
+  return (1+p[0])*(1-p[1])/8.0
+
+def Q6(p):
+  return (1+p[0])*(1+p[1])*(1-p[2])/8.0
+
+def Q6p(p):
+  return (1+p[1])*(1-p[2])/8.0
+
+def Q6q(p):
+  return (1+p[0])*(1-p[2])/8.0
+
+def Q6r(p):
+  return -(1+p[0])*(1+p[1])/8.0
+
+def Q7(p):
+  return (1+p[0])*(1+p[1])*(1+p[2])/8.0
+
+def Q7p(p):
+  return (1+p[1])*(1+p[2])/8.0
+
+def Q7q(p):
+  return (1+p[0])*(1+p[2])/8.0
+
+def Q7r(p):
+  return (1+p[0])*(1+p[1])/8.0
+
 # ----------------------------------------------------------------------
 class TestFIATLagrange(unittest.TestCase):
   """
   Unit testing of FIATLagrange object.
   """
-  
 
-  def test_initialize(self):
+
+  def test_initialize_quad(self):
     """
     Test initialize().
     """
@@ -109,4 +205,59 @@
     return
 
 
+  def test_initialize_hex(self):
+    """
+    Test initialize().
+    """
+    from pylith.feassemble.FIATLagrange import FIATLagrange
+    cell = FIATLagrange()
+    cell.cellDim = 3
+    cell.degree = 1
+    cell.order  = 2
+    quadPtsE = numpy.array( [(-1.0/3**0.5, -1.0/3**0.5, -1.0/3**0.5),
+                             (-1.0/3**0.5, -1.0/3**0.5, +1.0/3**0.5),
+                             (-1.0/3**0.5, +1.0/3**0.5, -1.0/3**0.5),
+                             (-1.0/3**0.5, +1.0/3**0.5, +1.0/3**0.5),
+                             (+1.0/3**0.5, -1.0/3**0.5, -1.0/3**0.5),
+                             (+1.0/3**0.5, -1.0/3**0.5, +1.0/3**0.5),
+                             (+1.0/3**0.5, +1.0/3**0.5, -1.0/3**0.5),
+                             (+1.0/3**0.5, +1.0/3**0.5, +1.0/3**0.5)],
+                            dtype=numpy.float64 )
+    quadWtsE = numpy.array( [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float64 )
+
+    # Compute basis fns and derivatives at quadrature points
+    iQuad = 0
+    basis = numpy.zeros( (8, 8), dtype=numpy.float64)
+    basisDeriv = numpy.zeros( (8, 8, 3), dtype=numpy.float64)
+    for q in quadPtsE:
+      basis[iQuad] = numpy.array([Q0(q), Q1(q), Q2(q), Q3(q), Q4(q), Q5(q), Q6(q), Q7(q)],
+                                 dtype=numpy.float64).reshape( (8,) )
+      deriv = numpy.array([[Q0p(q), Q0q(q), Q0r(q)],
+                           [Q1p(q), Q1q(q), Q1r(q)],
+                           [Q2p(q), Q2q(q), Q2r(q)],
+                           [Q3p(q), Q3q(q), Q3r(q)],
+                           [Q4p(q), Q4q(q), Q4r(q)],
+                           [Q5p(q), Q5q(q), Q5r(q)],
+                           [Q6p(q), Q6q(q), Q6r(q)],
+                           [Q7p(q), Q7q(q), Q7r(q)]],
+                          dtype=numpy.float64)
+      basisDeriv[iQuad] = deriv.reshape((8, 3))
+      iQuad += 1
+
+    cell.initialize()
+
+    # Check basic attributes
+    self.assertEqual(3, cell.cellDim)
+    self.assertEqual(8, cell.numCorners)
+    self.assertEqual(8, cell.numQuadPts)
+
+    # Check arrays
+    test_double(self, quadPtsE, cell.quadPts)
+    test_double(self, quadWtsE, cell.quadWts)
+    test_double(self, basis, cell.basis)
+    test_double(self, basisDeriv, cell.basisDeriv)
+
+    return
+
+
 # End of file 



More information about the cig-commits mailing list