[cig-commits] r16813 - short/3D/PyLith/trunk/playpen/faultpc

brad at geodynamics.org brad at geodynamics.org
Thu May 27 14:16:10 PDT 2010


Author: brad
Date: 2010-05-27 14:16:10 -0700 (Thu, 27 May 2010)
New Revision: 16813

Modified:
   short/3D/PyLith/trunk/playpen/faultpc/checkfaultpc.py
Log:
Real check of fault preconditioner.

Modified: short/3D/PyLith/trunk/playpen/faultpc/checkfaultpc.py
===================================================================
--- short/3D/PyLith/trunk/playpen/faultpc/checkfaultpc.py	2010-05-27 20:45:43 UTC (rev 16812)
+++ short/3D/PyLith/trunk/playpen/faultpc/checkfaultpc.py	2010-05-27 21:16:10 UTC (rev 16813)
@@ -1,36 +1,57 @@
+# Jacobian matrix for twocells/twoquad4/dislocation.cfg.
+
 import numpy
 import numpy.linalg as linalg
 
-Afull = numpy.array([[1,1, 1,1, 1,1, 1,1, 0,0, 0,0, 0,0, 0,0],
-                     [1,1, 1,1, 1,1, 1,1, 0,0, 0,0, 0,0, 0,0],
-                     [1,1, 1,1, 1,1, 0,0, 0,0, 0,0, 0,0, 0,0],
-                     [1,1, 1,1, 1,1, 0,0, 0,0, 0,0, 0,0, 0,0],
-                     [1,1, 1,1, 1,1, 1,1, 0,0, 0,0, 0,0, 0,0],
-                     [1,1, 1,1, 1,1, 1,1, 0,0, 0,0, 0,0, 0,0],
-                     [1,1, 0,0, 1,1, 1,1, 0,0, 0,0, 0,0, 0,0],
-                     [1,1, 0,0, 1,1, 1,1, 0,0, 0,0, 0,0, 0,0],
-                     [0,0, 0,0, 0,0, 0,0, 1,1, 1,1, 0,0, 1,1],
-                     [0,0, 0,0, 0,0, 0,0, 1,1, 1,1, 0,0, 1,1],
-                     [0,0, 0,0, 0,0, 0,0, 1,1, 1,1, 1,1, 1,1],
-                     [0,0, 0,0, 0,0, 0,0, 1,1, 1,1, 1,1, 1,1],
-                     [0,0, 0,0, 0,0, 0,0, 0,0, 1,1, 1,1, 1,1],
-                     [0,0, 0,0, 0,0, 0,0, 0,0, 1,1, 1,1, 1,1],
-                     [0,0, 0,0, 0,0, 0,0, 1,1, 1,1, 1,1, 1,1],
-                     [0,0, 0,0, 0,0, 0,0, 1,1, 1,1, 1,1, 1,1]],
-                    dtype=numpy.float64)
+A = numpy.array([[4/3.0, -0.5, 1/6.0, 0,   0,0,0,0],
+                 [-0.5, 4/3.0, 0, -5/6.0,  0,0,0,0],
+                 [1/6.0, 0, 4/3.0, 0.5,    0,0,0,0],
+                 [0, -5/6.0, 0.5, 4/3.0,   0,0,0,0],
+                 [0,0,0,0,  4/3.0, 0.5, 1/6.0, 0],
+                 [0,0,0,0,  0.5, 4/3.0, 0, -5/6.0],
+                 [0,0,0,0, 1/6.0, 0, 4/3.0, -0.5],
+                 [0,0,0,0, 0, -5/6.0, -0.5, 4/3.0]],
+                dtype=numpy.float64)
+Ai = linalg.inv(A)
 
-#Ainv = linalg.inv(Afull)
-
-C = numpy.array([[0,0, 0,-1, 0,0, 0,0, 0,1, 0,0, 0,0, 0,0],
-                 [0,0, -1,0, 0,0, 0,0, 1,0, 0,0, 0,0, 0,0],
-                 [0,0, 0,0, 0,-1, 0,0, 0,0, 0,1, 0,0, 0,0],
-                 [0,0, 0,0, -1,0, 0,0, 0,0, 1,0, 0,0, 0,0],
-                 [0,0, 0,0, 0,0, 0,-1, 0,0, 0,0, 0,1, 0,0],
-                 [0,0, 0,0, 0,0, -1,0, 0,0, 0,0, 1,0, 0,0]],
+C = numpy.array([[0,-1,  0,0,  0,1, 0,0],
+                 [-1,0,  0,0,  1,0, 0,0],
+                 [0,0,  0,-1,  0,0, 0,1],
+                 [0,0, -1,0,   0,0, 1,0]],
                 dtype=numpy.float64)
-CAC = numpy.dot(numpy.dot(C, Afull), C.transpose())
+Z = numpy.zeros( (4,4), dtype=numpy.float64)
 
+J = numpy.vstack( (numpy.hstack( (A, C.transpose()) ),
+                   numpy.hstack( (C, Z) ) ) )
+Jinv = linalg.inv(J)
 
-print "Afull",Afull
-#print "Afull inverse",Ainv
-print "CACfull",CAC
+# Compute [C] [A]^(-1) [C]^T and its inverse.
+CAC = numpy.dot(numpy.dot(C, Ai), C.transpose())
+CACi = numpy.linalg.inv(CAC)
+
+# Compute diagonal approximation of CAC and its inverse
+Aid = 1.0 / A.diagonal() * numpy.identity(A.shape[0])
+CACd = numpy.dot(numpy.dot(C, Aid), C.transpose())
+CACdi = 1.0 / CACd.diagonal() * numpy.identity(CACd.shape[0])
+
+# Compute preconditioner using full matrices (no approximations)
+P = numpy.zeros(J.shape)
+P[0:8,0:8] = Ai + numpy.dot(numpy.dot(numpy.dot(numpy.dot(Ai, C.transpose()), -CACi), C), Ai)
+P[0:8,8:12] = numpy.dot(numpy.dot(-Ai, C.transpose()), CACi)
+P[8:12,0:8] = numpy.dot(CACi, numpy.dot(C, Ai))
+P[8:12,8:12] = -CACi
+
+# Compute preconditioner using diagonal approximations (but full Ai)
+Pd = numpy.zeros(J.shape)
+Pd[0:8,0:8] = Ai + numpy.dot(numpy.dot(numpy.dot(numpy.dot(Aid, C.transpose()), -CACdi), C), Aid)
+Pd[0:8,8:12] = numpy.dot(numpy.dot(-Aid, C.transpose()), CACdi)
+Pd[8:12,0:8] = numpy.dot(CACdi, numpy.dot(C, Aid))
+Pd[8:12,8:12] = -CACdi
+
+evals, evecs = numpy.linalg.eig(numpy.dot(P, J))
+print numpy.abs(evals)
+print numpy.max(numpy.abs(evals))/numpy.min(numpy.abs(evals))
+
+evals, evecs = numpy.linalg.eig(numpy.dot(Pd, J))
+print numpy.abs(evals)
+print numpy.max(numpy.abs(evals))/numpy.min(numpy.abs(evals))



More information about the CIG-COMMITS mailing list