From 542e13176bed5375f20308cf0d215b991405201e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ren=C3=A9=20He=C3=9F?= <rene.hess@iwr.uni-heidelberg.de>
Date: Thu, 13 Sep 2018 11:41:48 +0200
Subject: [PATCH] Make it possible to interpolate input for printresidual

---
 python/dune/perftool/options.py               |  1 +
 python/dune/perftool/pdelab/driver/solve.py   | 58 ++++++++++++++-----
 .../poisson/poisson_2d_unstructured.mini      |  1 +
 .../poisson/poisson_3d_unstructured.mini      |  1 +
 test/sumfact/poisson/poisson_dg_2d_gmsh.mini  |  1 +
 .../poisson/poisson_dg_2d_unstructured.mini   |  1 +
 test/sumfact/poisson/poisson_dg_3d_gmsh.mini  |  1 +
 .../poisson/poisson_dg_3d_unstructured.mini   |  1 +
 .../poisson/poisson_fastdg_3d_gmsh.mini       |  1 +
 9 files changed, 50 insertions(+), 16 deletions(-)

diff --git a/python/dune/perftool/options.py b/python/dune/perftool/options.py
index 9d4ccb3f..25fd5145 100644
--- a/python/dune/perftool/options.py
+++ b/python/dune/perftool/options.py
@@ -54,6 +54,7 @@ class PerftoolGlobalOptionsArray(ImmutableRecord):
     operators = PerftoolOption(default="r", helpstr="A comma separated list of operators, each name will be interpreted as a subsection name within the formcompiler section")
     target_name = PerftoolOption(default=None, helpstr="The target name from CMake")
     operator_to_build = PerftoolOption(default=None, helpstr="The operators from the list that is about to be build now. CMake sets this one!!!")
+    debug_interpolate_input = PerftoolOption(default=False, helpstr="Should the input for printresidual and printmatix be interpolated (instead of random input).")
 
     # Arguments that are mainly to be set by logic depending on other options
     max_vector_width = PerftoolOption(default=256, helpstr=None)
diff --git a/python/dune/perftool/pdelab/driver/solve.py b/python/dune/perftool/pdelab/driver/solve.py
index 0648df39..4603905e 100644
--- a/python/dune/perftool/pdelab/driver/solve.py
+++ b/python/dune/perftool/pdelab/driver/solve.py
@@ -9,6 +9,7 @@ from dune.perftool.pdelab.driver import (get_form_ident,
                                          name_initree,
                                          )
 from dune.perftool.pdelab.driver.gridfunctionspace import (name_trial_gfs,
+                                                           name_leafview,
                                                            type_domainfield,
                                                            type_trial_gfs,
                                                            )
@@ -19,7 +20,7 @@ from dune.perftool.pdelab.driver.gridoperator import (name_gridoperator,
                                                       type_gridoperator,
                                                       )
 from dune.perftool.pdelab.driver.interpolate import interpolate_dirichlet_data
-
+from dune.perftool.pdelab.geometry import world_dimension
 
 @preamble(section="solver")
 def dune_solve():
@@ -204,6 +205,31 @@ def name_stationarynonlinearproblemsolver(go_type, go):
     return name
 
 
+def random_input(v):
+    return ["  // Setup random input",
+            "  std::size_t seed = 0;",
+            "  auto rng = std::mt19937_64(seed);",
+            "  auto dist = std::uniform_real_distribution<>(-1., 1.);",
+            "  for (auto& v : {})".format(v),
+            "    v = dist(rng);"]
+
+
+def interpolate_input(v):
+    dim = world_dimension();
+    gv = name_leafview()
+    gfs = name_trial_gfs()
+    expr = []
+    for i in range(dim):
+        expr.append("x[{}]*x[{}]".format(i, i))
+    expr = "+".join(expr)
+    return ["  // Interpolate input",
+            "  auto interpolate_lambda = [] (const auto& x){",
+            "    return std::exp({});".format(expr),
+            "  };",
+            "  auto interpolate = Dune::PDELab::makeGridFunctionFromCallable({}, interpolate_lambda);".format(gv),
+            "  Dune::PDELab::interpolate(interpolate,{},{});".format(gfs, v),
+            ]
+
 @preamble(section="printing")
 def print_residual():
     ini = name_initree()
@@ -212,16 +238,15 @@ def print_residual():
     t_v = type_vector(get_form_ident())
     include_file("random", system=True, filetag="driver")
 
+    if get_option("debug_interpolate_input"):
+        input = interpolate_input(v)
+    else:
+        input = random_input(v)
+
     return ["if ({}.get<bool>(\"printresidual\", false)) {{".format(ini),
             "  using Dune::PDELab::Backend::native;",
-            "  {} r({});".format(t_v, v),
-            "  // Setup random input",
-            "  std::size_t seed = 0;",
-            "  auto rng = std::mt19937_64(seed);",
-            "  auto dist = std::uniform_real_distribution<>(-1., 1.);",
-            "  for (auto& v : {})".format(v),
-            "    v = dist(rng);",
-            "  r=0.0;",
+            "  {} r({});".format(t_v, v)] + input + \
+            ["  r=0.0;",
             "  {}.residual({}, r);".format(n_go, v),
             "  Dune::printvector(std::cout, native(r), \"residual vector\", \"row\");",
             "}"]
@@ -235,14 +260,15 @@ def print_matrix():
     v = name_vector(get_form_ident())
     t_v = type_vector(get_form_ident())
 
+    if get_option("debug_interpolate_input"):
+        input = interpolate_input(v)
+    else:
+        input = random_input(v)
+
     return ["if ({}.get<bool>(\"printmatrix\", false)) {{".format(ini),
-            "  // Setup random input",
-            "  std::size_t seed = 0;",
-            "  auto rng = std::mt19937_64(seed);",
-            "  auto dist = std::uniform_real_distribution<>(1., 10.);",
-            "  for (auto& v : {})".format(v),
-            "    v = dist(rng);",
-            "  using M = typename {}::Traits::Jacobian;".format(t_go),
+            "  using Dune::PDELab::Backend::native;",
+            "  {} r({});".format(t_v, v)] + input + \
+            ["  using M = typename {}::Traits::Jacobian;".format(t_go),
             "  M m({});".format(n_go),
             "  {}.jacobian({},m);".format(n_go, v),
             "  using Dune::PDELab::Backend::native;",
diff --git a/test/sumfact/poisson/poisson_2d_unstructured.mini b/test/sumfact/poisson/poisson_2d_unstructured.mini
index b797809b..bca80233 100644
--- a/test/sumfact/poisson/poisson_2d_unstructured.mini
+++ b/test/sumfact/poisson/poisson_2d_unstructured.mini
@@ -23,6 +23,7 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 5e-5, 5e-7 | expand deg
 grid_unstructured = 1
+debug_interpolate_input = 1
 
 [formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
diff --git a/test/sumfact/poisson/poisson_3d_unstructured.mini b/test/sumfact/poisson/poisson_3d_unstructured.mini
index 05f9a1d1..5e9eae24 100644
--- a/test/sumfact/poisson/poisson_3d_unstructured.mini
+++ b/test/sumfact/poisson/poisson_3d_unstructured.mini
@@ -23,6 +23,7 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-4, 1e-8 | expand deg
 grid_unstructured = 1
+debug_interpolate_input = 1
 
 [formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
diff --git a/test/sumfact/poisson/poisson_dg_2d_gmsh.mini b/test/sumfact/poisson/poisson_dg_2d_gmsh.mini
index 970da4de..79df9ea4 100644
--- a/test/sumfact/poisson/poisson_dg_2d_gmsh.mini
+++ b/test/sumfact/poisson/poisson_dg_2d_gmsh.mini
@@ -21,6 +21,7 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 5e-5, 5e-7 | expand deg
 grid_unstructured = 1
+debug_interpolate_input = 1
 
 [formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
diff --git a/test/sumfact/poisson/poisson_dg_2d_unstructured.mini b/test/sumfact/poisson/poisson_dg_2d_unstructured.mini
index 639b96da..fec1c93d 100644
--- a/test/sumfact/poisson/poisson_dg_2d_unstructured.mini
+++ b/test/sumfact/poisson/poisson_dg_2d_unstructured.mini
@@ -23,6 +23,7 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 5e-5, 5e-5 | expand deg
 grid_unstructured = 1
+debug_interpolate_input = 1
 
 [formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
diff --git a/test/sumfact/poisson/poisson_dg_3d_gmsh.mini b/test/sumfact/poisson/poisson_dg_3d_gmsh.mini
index 23f7ebc0..eb320a2d 100644
--- a/test/sumfact/poisson/poisson_dg_3d_gmsh.mini
+++ b/test/sumfact/poisson/poisson_dg_3d_gmsh.mini
@@ -23,6 +23,7 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-4, 5e-6 | expand deg
 grid_unstructured = 1
+debug_interpolate_input = 1
 
 [formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
diff --git a/test/sumfact/poisson/poisson_dg_3d_unstructured.mini b/test/sumfact/poisson/poisson_dg_3d_unstructured.mini
index 5c833f28..271b1f54 100644
--- a/test/sumfact/poisson/poisson_dg_3d_unstructured.mini
+++ b/test/sumfact/poisson/poisson_dg_3d_unstructured.mini
@@ -23,6 +23,7 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-4, 5e-6 | expand deg
 grid_unstructured = 1
+debug_interpolate_input = 1
 
 [formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
diff --git a/test/sumfact/poisson/poisson_fastdg_3d_gmsh.mini b/test/sumfact/poisson/poisson_fastdg_3d_gmsh.mini
index 380cef48..52de26ab 100644
--- a/test/sumfact/poisson/poisson_fastdg_3d_gmsh.mini
+++ b/test/sumfact/poisson/poisson_fastdg_3d_gmsh.mini
@@ -21,6 +21,7 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-4, 5e-6 | expand deg
 grid_unstructured = 1
+debug_interpolate_input = 1
 
 [formcompiler.r]
 numerical_jacobian = 0
-- 
GitLab