From 0171e5d8ecc105b5b9f992a53819ba44fbecaefa Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Sat, 5 Nov 2011 14:06:38 -0500
Subject: [PATCH] Add simple FEM assembly test without prefetch.

---
 test/test_fem_assembly.py | 79 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 79 insertions(+)
 create mode 100644 test/test_fem_assembly.py

diff --git a/test/test_fem_assembly.py b/test/test_fem_assembly.py
new file mode 100644
index 000000000..72f310765
--- /dev/null
+++ b/test/test_fem_assembly.py
@@ -0,0 +1,79 @@
+from __future__ import division
+
+import numpy as np
+import numpy.linalg as la
+import pyopencl as cl
+import pyopencl.array as cl_array
+import loopy as lp
+
+from pyopencl.tools import pytest_generate_tests_for_pyopencl \
+        as pytest_generate_tests
+
+
+
+
+def test_laplacian_stiffness(ctx_factory):
+    dtype = np.float32
+    ctx = ctx_factory()
+    order = "C"
+
+    # FIXME: make dim-independent
+
+    dim = 2
+
+    Nq = 40 # num. quadrature points
+    Nc = 1000 # num. cells
+    Nb = 20 # num. basis functions
+
+    # K - run-time symbolic
+
+    from pymbolic import var
+    Nc_sym = var("Nc")
+
+    print "[Nc] -> {[K,i,j,q]: 0<=K<Nc and 0<=i,j<%(Nb)d and 0<=q<%(Nq)d}" % dict(Nb=Nb, Nq=Nq),
+    knl = lp.make_kernel(ctx.devices[0],
+            "[Nc] -> {[K,i,j,q]: 0<=K<Nc and 0<=i,j<%(Nb)d and 0<=q<%(Nq)d}" 
+            % dict(Nb=Nb, Nq=Nq),
+            [
+                "SUBST: dPsi(a,dxi) = jacInv[K,q,0,dxi] * DPsi[a,q,0] "
+                    "+ jacInv[K,q,1,dxi] * DPsi[a,q,1]",
+                "A[K, i, j] = sum_float32(q, w[q] * jacDet[K,q] * ("
+                    "dPsi(0,0)*dPsi(1,0) + dPsi(0,1)*dPsi(1,1)))"
+
+                ],
+            [
+            lp.ArrayArg("jacInv", dtype, shape=(Nc, Nq, dim, dim), order=order),
+            lp.ConstantArrayArg("DPsi", dtype, shape=(Nb, Nq, dim), order=order),
+            lp.ArrayArg("jacDet", dtype, shape=(Nc, Nq), order=order),
+            lp.ConstantArrayArg("w", dtype, shape=(Nq, dim), order=order),
+            lp.ArrayArg("A", dtype, shape=(Nc, Nb, Nb), order=order),
+            lp.ScalarArg("Nc",  np.int32, approximately=1000),
+            ],
+            name="semlap", assumptions="Nc>=1")
+
+    seq_knl = knl
+
+    knl = lp.split_dimension(knl, "K", 16, outer_tag="g.0", slabs=(0,1))
+    knl = lp.split_dimension(knl, "K_inner", 4, inner_tag="ilp")
+    knl = lp.tag_dimensions(knl, {"i": "l.0", "j": "l.1"})
+
+    kernel_gen = lp.generate_loop_schedules(knl,
+            loop_priority=["K", "i", "j"])
+    kernel_gen = lp.check_kernels(kernel_gen, dict(Nc=1000))
+
+    Nc = 1000
+    lp.auto_test_vs_seq(seq_knl, ctx, kernel_gen,
+            op_count=0, op_label="GFlops",
+            parameters={"Nc": 1000}, print_seq_code=True,
+            timing_rounds=30)
+
+
+
+if __name__ == "__main__":
+    import sys
+    if len(sys.argv) > 1:
+        exec(sys.argv[1])
+    else:
+        from py.test.cmdline import main
+        main([__file__])
+
-- 
GitLab