From 1a52b2d48242c974ad29380baf29682b28ab7c17 Mon Sep 17 00:00:00 2001
From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
Date: Fri, 6 Oct 2017 17:35:51 +0200
Subject: [PATCH] Implement meshsize as an operator-wide quantity

---
 .../poisson_dg_tensor/poisson_dg_tensor.ufl   |  1 +
 applications/poisson_dg_tensor/verify.mini    |  1 -
 python/dune/perftool/sumfact/geometry.py      | 22 +++++++++++++++----
 3 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/applications/poisson_dg_tensor/poisson_dg_tensor.ufl b/applications/poisson_dg_tensor/poisson_dg_tensor.ufl
index d3c95a52..2b1a7b98 100644
--- a/applications/poisson_dg_tensor/poisson_dg_tensor.ufl
+++ b/applications/poisson_dg_tensor/poisson_dg_tensor.ufl
@@ -33,3 +33,4 @@ r = (inner(A*grad(u), grad(v)) + (c*u-f)*v)*dx \
   - gamma_ext*g*v*ds
 
 forms = [r]
+exact_solution = g
diff --git a/applications/poisson_dg_tensor/verify.mini b/applications/poisson_dg_tensor/verify.mini
index de6607fd..b1f4672e 100644
--- a/applications/poisson_dg_tensor/verify.mini
+++ b/applications/poisson_dg_tensor/verify.mini
@@ -13,7 +13,6 @@ fastdg = 1
 sumfact = 1
 vectorize_quad = 1
 vectorize_grads = 1
-exact_solution_expression = g
 compare_l2errorsquared = 1e-6
 
 [formcompiler.ufl_variants]
diff --git a/python/dune/perftool/sumfact/geometry.py b/python/dune/perftool/sumfact/geometry.py
index 8df024fe..e0f4a85b 100644
--- a/python/dune/perftool/sumfact/geometry.py
+++ b/python/dune/perftool/sumfact/geometry.py
@@ -107,11 +107,25 @@ def define_corner(name, low):
                                              0 if low else 2 ** local_dimension() - 1)
 
 
-@preamble
+@class_member(classtag="operator")
 def define_mesh_width(name):
-    define_corner(name, False)
-    lower = name_lowerleft_corner()
-    return "{} -= {};".format(name, lower)
+    from dune.perftool.pdelab.localoperator import lop_template_range_field
+    rft = lop_template_range_field()
+    define_mesh_width_eval(name)
+    return "Dune::FieldVector<{}, {}> {};".format(rft, world_dimension(), name)
+
+
+def define_mesh_width_eval(name):
+    from dune.perftool.pdelab.localoperator import name_ansatz_gfs_constructor_param
+    gfs = name_ansatz_gfs_constructor_param()
+    code = ["{",
+            "  auto e = *({}.gridView().template begin<0>());".format(gfs),
+            "  {} = e.geometry().corner((1<<{}) - 1);".format(name, world_dimension()),
+            "  {} -= e.geometry().corner(0);".format(name),
+            "}",
+            ]
+    instruction(code="\n".join(code),
+                kernel="operator")
 
 
 def name_lowerleft_corner():
-- 
GitLab