From 9efad1ad4f68a89c037a2aff5eb05c3e6b2149c7 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, 16 Aug 2018 10:28:47 +0200 Subject: [PATCH] Make it possible to turn off sumfactorization for jacobian generation --- python/dune/perftool/options.py | 1 + .../dune/perftool/pdelab/driver/gridfunctionspace.py | 1 - python/dune/perftool/pdelab/geometry.py | 4 ++-- python/dune/perftool/pdelab/localoperator.py | 10 +++++++++- python/dune/perftool/sumfact/basis.py | 1 - python/dune/perftool/sumfact/geometry.py | 1 - test/sumfact/poisson/poisson_dg_3d_unstructured.mini | 3 ++- 7 files changed, 14 insertions(+), 7 deletions(-) diff --git a/python/dune/perftool/options.py b/python/dune/perftool/options.py index 5b5a6d15..e73ff9ef 100644 --- a/python/dune/perftool/options.py +++ b/python/dune/perftool/options.py @@ -79,6 +79,7 @@ class PerftoolFormOptionsArray(ImmutableRecord): constant_transformation_matrix = PerftoolOption(default=False, helpstr="set option if the jacobian of the transformation is constant on a cell") fastdg = PerftoolOption(default=False, helpstr="Use FastDGGridOperator from PDELab.") sumfact = PerftoolOption(default=False, helpstr="Use sumfactorization") + sumfact_regular_jacobians = PerftoolOption(default=False, helpstr="Generate non sum-factorized jacobians (only useful if sumfact is set)") vectorization_quadloop = PerftoolOption(default=False, helpstr="whether to generate code with explicit vectorization") vectorization_strategy = PerftoolOption(default="none", helpstr="The identifier of the vectorization cost model. Possible values: none|explicit|model") vectorization_not_fully_vectorized_error = PerftoolOption(default=False, helpstr="throw an error if nonquadloop vectorization did not fully vectorize") diff --git a/python/dune/perftool/pdelab/driver/gridfunctionspace.py b/python/dune/perftool/pdelab/driver/gridfunctionspace.py index 9100e459..a4ae3604 100644 --- a/python/dune/perftool/pdelab/driver/gridfunctionspace.py +++ b/python/dune/perftool/pdelab/driver/gridfunctionspace.py @@ -3,7 +3,6 @@ from dune.perftool.generation import (include_file, ) from dune.perftool.options import (get_form_option, get_option, - set_option, ) from dune.perftool.pdelab.driver import (FEM_name_mangling, get_cell, diff --git a/python/dune/perftool/pdelab/geometry.py b/python/dune/perftool/pdelab/geometry.py index 16f75495..f56ef3df 100644 --- a/python/dune/perftool/pdelab/geometry.py +++ b/python/dune/perftool/pdelab/geometry.py @@ -338,7 +338,7 @@ def define_jacobian_inverse_transposed(name, restriction): dim = world_dimension() temporary_variable(name, decl_method=define_jacobian_inverse_transposed_temporary(restriction), shape=(dim, dim)) geo = name_cell_geometry(restriction) - pos = get_backend("qp_in_cell", selector=option_switch(("blockstructured", "sumfact")))(restriction) + pos = get_backend("qp_in_cell", selector=option_switch("blockstructured"))(restriction) return quadrature_preamble("{} = {}.jacobianInverseTransposed({});".format(name, geo, @@ -392,7 +392,7 @@ def define_constant_jacobian_determinant(name): def define_jacobian_determinant(name): temporary_variable(name, shape=()) geo = name_geometry() - pos = get_backend("quad_pos", selector=option_switch(("blockstructured", "sumfact")))() + pos = get_backend("quad_pos", selector=option_switch("blockstructured"))() code = "{} = {}.integrationElement({});".format(name, geo, str(pos), diff --git a/python/dune/perftool/pdelab/localoperator.py b/python/dune/perftool/pdelab/localoperator.py index 5e903206..4a374577 100644 --- a/python/dune/perftool/pdelab/localoperator.py +++ b/python/dune/perftool/pdelab/localoperator.py @@ -7,7 +7,8 @@ import numpy as np from dune.perftool.options import (get_form_option, get_option, - option_switch) + option_switch, + set_form_option) from dune.perftool.generation import (backend, base_class, class_basename, @@ -840,6 +841,10 @@ def generate_jacobian_kernels(form, original_form): operator_kernels = {} with global_context(form_type="jacobian"): if get_form_option("generate_jacobians"): + if get_form_option("sumfact"): + was_sumfact = True + if get_form_option("sumfact_regular_jacobians"): + set_form_option("sumfact", False) for measure in set(i.integral_type() for i in jacform.integrals()): logger.info("generate_jacobian_kernels: measure {}".format(measure)) with global_context(integral_type=measure): @@ -857,6 +862,9 @@ def generate_jacobian_kernels(form, original_form): with global_context(integral_type=it): from dune.perftool.pdelab.signatures import assembly_routine_signature operator_kernels[(it, 'jacobian')] = [LoopyKernelMethod(assembly_routine_signature(), kernel=None)] + if get_form_option("sumfact_regular_jacobians"): + if was_sumfact: + set_form_option("sumfact", True) # Jacobian apply methods for matrix-free computations if get_form_option("matrix_free"): diff --git a/python/dune/perftool/sumfact/basis.py b/python/dune/perftool/sumfact/basis.py index d535aebd..e9584d1d 100644 --- a/python/dune/perftool/sumfact/basis.py +++ b/python/dune/perftool/sumfact/basis.py @@ -7,7 +7,6 @@ import itertools from dune.perftool.generation import (backend, domain, - get_backend, get_counted_variable, get_counter, get_global_context_value, diff --git a/python/dune/perftool/sumfact/geometry.py b/python/dune/perftool/sumfact/geometry.py index ecec31af..c4471ee3 100644 --- a/python/dune/perftool/sumfact/geometry.py +++ b/python/dune/perftool/sumfact/geometry.py @@ -3,7 +3,6 @@ from dune.perftool.generation import (backend, class_member, domain, - get_backend, get_counted_variable, iname, include_file, diff --git a/test/sumfact/poisson/poisson_dg_3d_unstructured.mini b/test/sumfact/poisson/poisson_dg_3d_unstructured.mini index 8bbae058..012b3356 100644 --- a/test/sumfact/poisson/poisson_dg_3d_unstructured.mini +++ b/test/sumfact/poisson/poisson_dg_3d_unstructured.mini @@ -1,4 +1,4 @@ -__name = sumfact_poisson_dg_2d_unstructured_{__exec_suffix} +__name = sumfact_poisson_dg_3d_unstructured_{__exec_suffix} __exec_suffix = {deg_suffix}_{diff_suffix}_{quadvec_suffix}_{gradvec_suffix} diff_suffix = numdiff, symdiff | expand num @@ -27,6 +27,7 @@ grid_unstructured = 1 [formcompiler.r] numerical_jacobian = 1, 0 | expand num sumfact = 1 +sumfact_regular_jacobians = 1 vectorization_quadloop = 1, 0 | expand quad vectorization_strategy = explicit, none | expand grad -- GitLab