[cig-commits] r12857 - in cs/cigma/trunk/src: . cigma
luis at geodynamics.org
luis at geodynamics.org
Wed Sep 10 12:51:13 PDT 2008
Author: luis
Date: 2008-09-10 12:51:13 -0700 (Wed, 10 Sep 2008)
New Revision: 12857
Added:
cs/cigma/trunk/src/FiatProxy.py
cs/cigma/trunk/src/cigma/FiatQuadrature.py
cs/cigma/trunk/src/cigma/FiatShapes.py
Log:
FiatProxy wrapper functions to call from C++. Objects are created
on the Python side.
Added: cs/cigma/trunk/src/FiatProxy.py
===================================================================
--- cs/cigma/trunk/src/FiatProxy.py (rev 0)
+++ cs/cigma/trunk/src/FiatProxy.py 2008-09-10 19:51:13 UTC (rev 12857)
@@ -0,0 +1,15 @@
+#!/usr/bin/env
+#
+# Wrapper functions called from FiatProxy C++ object
+#
+
+from cigma.api import quadrature as Q
+from cigma.api import tabulation as T
+
+def quadrature(shape, order):
+ return Q(shape, order)
+
+
+def tabulation(shape, degree, x):
+ return T(shape, degree, x)
+
Added: cs/cigma/trunk/src/cigma/FiatQuadrature.py
===================================================================
--- cs/cigma/trunk/src/cigma/FiatQuadrature.py (rev 0)
+++ cs/cigma/trunk/src/cigma/FiatQuadrature.py 2008-09-10 19:51:13 UTC (rev 12857)
@@ -0,0 +1,117 @@
+#!/usr/bin/env python
+import FIAT.shapes
+from FIAT.quadrature import make_quadrature_by_degree
+from numpy import array, zeros
+from FiatShapes import *
+
+
+def make_rule(shape):
+ def qr(order):
+ q = make_quadrature_by_degree(shape, order)
+ x = array(q.get_points())
+ w = array(q.get_weights())
+ return (x,w)
+ return qr
+
+line_qr = make_rule(FIAT.shapes.LINE)
+tri_qr = make_rule(FIAT.shapes.TRIANGLE)
+tet_qr = make_rule(FIAT.shapes.TETRAHEDRON)
+
+def quad_qr(order):
+ qpts,qwts = line_qr(order)
+ nq = len(qpts)
+ x = zeros((nq*nq, 2))
+ w = zeros((nq*nq,))
+ n = 0
+ # Bottom
+ for r in range(0,nq-1):
+ x[n,0] = qpts[r]
+ x[n,1] = qpts[0]
+ w[n] = qwts[r]*qwts[0]
+ n += 1
+ # Right
+ for q in range(0,nq-1):
+ x[n,0] = qpts[nq-1]
+ x[n,1] = qpts[q]
+ w[n] = qwts[nq-1]*qwts[q]
+ n += 1
+ # Top
+ for r in range(nq-1, 0, -1):
+ x[n,0] = qpts[r]
+ x[n,1] = qpts[nq-1]
+ w[n] = qwts[r]*qwts[nq-1]
+ n += 1
+ # Left
+ for q in range(nq-1, 0, -1):
+ x[n,0] = qpts[0]
+ x[n,1] = qpts[q]
+ w[n] = qwts[0]*qwts[q]
+ n += 1
+ # Interior
+ for q in range(1, nq-1):
+ for r in range(1, nq-1):
+ x[n,0] = qpts[r]
+ x[n,1] = qpts[q]
+ w[n] = qwts[r]*qwts[q]
+ n += 1
+ assert (n == nq*nq*nq)
+ return (x,w)
+
+
+def hex_qr(order):
+ qpts,qwts = line_qr(order)
+ nq = len(qpts)
+ x = zeros((nq*nq*nq, 3))
+ w = zeros((nq*nq*nq,))
+ n = 0
+ for s in range(nq):
+ # Bottom
+ for r in range(0,nq-1):
+ x[n,0] = qpts[r]
+ x[n,1] = qpts[0]
+ x[n,2] = qpts[s]
+ w[n] = qwts[r]*qwts[0]*qwts[s]
+ n += 1
+ # Right
+ for q in range(0,nq-1):
+ x[n,0] = qpts[nq-1]
+ x[n,1] = qpts[q]
+ x[n,2] = qpts[s]
+ w[n] = qwts[nq-1]*qwts[q]*qwts[s]
+ n += 1
+ # Top
+ for r in range(nq-1, 0, -1):
+ x[n,0] = qpts[r]
+ x[n,1] = qpts[nq-1]
+ x[n,2] = qpts[s]
+ w[n] = qwts[r]*qwts[nq-1]*qwts[s]
+ n += 1
+ # Left
+ for q in range(nq-1, 0, -1):
+ x[n,0] = qpts[0]
+ x[n,1] = qpts[q]
+ x[n,2] = qpts[s]
+ w[n] = qwts[0]*qwts[q]*qwts[s]
+ n += 1
+ # Interior
+ for q in range(1, nq-1):
+ for r in range(1, nq-1):
+ x[n,0] = qpts[r]
+ x[n,1] = qpts[q]
+ x[n,2] = qpts[s]
+ w[n] = qwts[r]*qwts[q]*qwts[s]
+ n += 1
+ assert (n == nq*nq*nq)
+ return (x,w)
+
+
+def quadrature(shape, order):
+ qr = {
+ LINE: line_qr,
+ TRI: tri_qr,
+ TETRA: tet_qr,
+ QUAD: quad_qr,
+ HEX: hex_qr,
+ }.get(shape)
+ return qr(order)
+
Added: cs/cigma/trunk/src/cigma/FiatShapes.py
===================================================================
--- cs/cigma/trunk/src/cigma/FiatShapes.py (rev 0)
+++ cs/cigma/trunk/src/cigma/FiatShapes.py 2008-09-10 19:51:13 UTC (rev 12857)
@@ -0,0 +1,8 @@
+#!/usr/bin/env python
+
+LINE = 1
+TRI = 2
+TETRA = 3
+QUAD = 4
+HEX = 5
+
More information about the cig-commits
mailing list