diff --git a/python/dune/perftool/options.py b/python/dune/perftool/options.py index 5b5a6d158b7d38fdf814e06c196a73ba64316a27..e73ff9efe028c8a6f0524c7a50f9622e0093eb4f 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 9100e4593a907df28871e323a349c38d49c25621..a4ae3604c06af34a774ba0494751085fcffc1a9e 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 16f75495847532accedfd4e35a5a9c6a4bc2636c..f56ef3dfc554592ce741d8fd1251a90fb40574e7 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 5e9032060236d9fd0501701d7d1f5840381bfac2..4a374577055ffe6f3784bb9a9293488e1ac34b71 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 d535aebd7364ecf0bdac1edd00d139de20c06241..e9584d1d644ec6ec3c61b2b8cd863e54192b47c9 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 ecec31af151da1d9bbfda0e8a6ac46ac44b8cf94..c4471ee3ab329eef051bfd1a27f0eb0fce1bd4c3 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 8bbae0587de8d060873012a50cb8144e6bca2d57..012b3356b887eedc31a848b714790d2ac633445b 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