[cig-commits] r4466 - cs/benchmark/trunk/benchmark

baagaard at geodynamics.org baagaard at geodynamics.org
Mon Sep 4 13:14:46 PDT 2006


Author: baagaard
Date: 2006-09-04 13:14:46 -0700 (Mon, 04 Sep 2006)
New Revision: 4466

Modified:
   cs/benchmark/trunk/benchmark/ProjectionQuadPts.py
Log:
Vectorized loops in ProjectionQuadPts.py.

Modified: cs/benchmark/trunk/benchmark/ProjectionQuadPts.py
===================================================================
--- cs/benchmark/trunk/benchmark/ProjectionQuadPts.py	2006-09-02 10:11:53 UTC (rev 4465)
+++ cs/benchmark/trunk/benchmark/ProjectionQuadPts.py	2006-09-04 20:14:46 UTC (rev 4466)
@@ -157,13 +157,10 @@
 
         fieldProj = numpy.zeros((nelems, nquadpts, ndims),
                                 dtype=numpy.Float32)
+        fieldLocal = solnfield[simplices,:]
+        tmp = dot(basisfns_quad, fieldLocal)
+        fieldProj[:] = tmp.astype(numpy.Float32)
 
-        for ielem in xrange(nelems):
-            nodeIndices = simplices[ielem]
-            fieldLocal = solnfield[nodeIndices,:]
-            tmp = dot(basisfns_quad, fieldLocal)
-            fieldProj[ielem] = tmp.astype(numpy.Float32)
-
         group = tablewaiter.createGroup(self.workspace,
                                         self.workspace.root,
                                         "projection/data/%s/snapshot%d" % \
@@ -213,8 +210,6 @@
         'error'.
         """
 
-        from numpy import dot, sqrt, reshape
-
         dataA = tablewaiter.getNode(self.workspace.root,
                                     "projection/data/%s/snapshot%d/%s" % \
                                     (labelA, timestep, field))[:]
@@ -224,7 +219,7 @@
         (quadpts, quadwts) = \
                   self.discretization.getQuadPts(self.quadratureOrder)
         nquadpts = quadwts.shape[0]
-        quadwts = reshape(quadwts, (1,nquadpts))
+        quadwts = numpy.reshape(quadwts, (1,nquadpts))
         jacobian = self.workspace.root.integration.jacobian
         ndims = self.workspace.root._v_attrs.spatial_dim
 
@@ -232,13 +227,18 @@
         localerr = numpy.zeros( (nelems,), dtype=numpy.Float32)
         globalerr = 0.0
         globalvol = 0.0
-        for ielem in xrange(nelems):
-            diff = reshape(dataA[ielem] - dataB[ielem], (nquadpts, ndims))
-            localvol = jacobian[ielem] * sum(quadwts)
-            err = jacobian[ielem] * sum(sum(dot(quadwts, diff**2)))
-            localerr[ielem] = sqrt(err / localvol)
-            globalerr += err
-            globalvol += localvol
+
+        dataA = numpy.reshape(dataA, (nelems, nquadpts, ndims))
+        dataB = numpy.reshape(dataB, (nelems, nquadpts, ndims))
+        diff = dataA - dataB
+        localvol = jacobian * sum(quadwts)
+        err = jacobian * numpy.sum(numpy.sum(numpy.dot(quadwts, diff**2),
+                                             axis=2),
+                                   axis=0)
+        localerr[:] = numpy.sqrt(err / localvol).astype(numpy.Float32)
+        globalerr = sum(err)
+        globalvol = sum(localvol)
+        
         group = tablewaiter.createGroup(self.workspace,
                                         self.workspace.root,
                                         "difference/%s_%s/snapshot%d" % \
@@ -248,6 +248,7 @@
             dataset = getattr(group, field)
             dataset._f_remove()
         self.workspace.createArray(group, field, localerr)
+        from math import sqrt
         return sqrt(globalerr/globalvol)
 
 
@@ -290,7 +291,7 @@
         """
         Setup quadrature information.
         """
-        self._info.log("Seeting up integration information...")
+        self._info.log("Setting up integration information...")
 
         workspace = self.workspace
         vertices = workspace.root.geometry.vertices[:]
@@ -326,12 +327,9 @@
         ndims = len(quadpts[0])
         
         points = numpy.zeros((nelems, nquadpts, ndims), dtype=numpy.Float32)
-        for ielem in xrange(nelems):
-            j = mapFromRef[ielem]
-            origin = mapOrigin[ielem]
-            for iquad in xrange(nquadpts):   # TODO: vectorize this loop
-                pts = origin + dot(j, quadpts[iquad])
-                points[ielem, iquad] = pts.astype(numpy.Float32)
+        for iquad in xrange(nquadpts):
+            pts = mapOrigin + dot(mapFromRef, quadpts[iquad])
+            points[:,iquad] = pts.astype(numpy.Float32)
 
         group = tablewaiter.createGroup(workspace, workspace.root,
                                         "projection")



More information about the cig-commits mailing list