Skip to content
Snippets Groups Projects
Commit ceb4b14f authored by Dominic Kempf's avatar Dominic Kempf
Browse files

Redesign signature generation to split types and arg names

parent 9a932226
No related branches found
No related tags found
No related merge requests found
......@@ -3,7 +3,8 @@ from functools import partial
from dune.perftool.generation import global_context
from dune.perftool.loopy.transformations import get_loopy_transformations
from dune.perftool.pdelab.localoperator import assembly_routine_signature, LoopyKernelMethod
from dune.perftool.pdelab.localoperator import LoopyKernelMethod
from dune.perftool.pdelab.signatures import assembly_routine_signature
import os
......
......@@ -114,13 +114,6 @@ def define_initree(name):
return "const Dune::ParameterTree& {};".format(name)
def ufl_measure_to_pdelab_measure(which):
return {'cell': 'Volume',
'exterior_facet': 'Boundary',
'interior_facet': 'Skeleton',
}.get(which)
@class_member(classtag="operator")
def _enum_pattern(which):
return "enum {{ doPattern{} = true }};".format(which)
......@@ -129,6 +122,7 @@ def _enum_pattern(which):
def enum_pattern():
from dune.perftool.generation import get_global_context_value
integral_type = get_global_context_value("integral_type")
from dune.perftool.pdelab.signatures import ufl_measure_to_pdelab_measure
return _enum_pattern(ufl_measure_to_pdelab_measure(integral_type))
......@@ -139,6 +133,7 @@ def _pattern_baseclass(measure):
def pattern_baseclass():
from dune.perftool.generation import get_global_context_value
integral_type = get_global_context_value("integral_type")
from dune.perftool.pdelab.signatures import ufl_measure_to_pdelab_measure
return _pattern_baseclass(ufl_measure_to_pdelab_measure(integral_type))
......@@ -150,6 +145,7 @@ def _enum_alpha(which):
def enum_alpha():
from dune.perftool.generation import get_global_context_value
integral_type = get_global_context_value("integral_type")
from dune.perftool.pdelab.signatures import ufl_measure_to_pdelab_measure
return _enum_alpha(ufl_measure_to_pdelab_measure(integral_type))
......@@ -181,89 +177,6 @@ def class_type_from_cache(classtag):
return basename, basename + tparam_str
def assembler_routine_name():
from dune.perftool.generation import get_global_context_value
integral_type = get_global_context_value("integral_type")
form_type = get_global_context_value("form_type")
part1 = {"residual": "alpha"}.get(form_type, form_type)
part2 = ufl_measure_to_pdelab_measure(integral_type).lower()
return "{}_{}".format(part1, part2)
def kernel_name():
arn = assembler_routine_name()
facedir_s = get_global_context_value("facedir_s", None)
facedir_n = get_global_context_value("facedir_n", None)
facemod_s = get_global_context_value("facemod_s", None)
facemod_n = get_global_context_value("facemod_n", None)
suffix = "{}{}{}{}".format("_facedirs{}".format(facedir_s) if facedir_s is not None else "",
"_facedirn{}".format(facedir_n) if facedir_n is not None else "",
"_facemods{}".format(facemod_s) if facemod_s is not None else "",
"_facemodn{}".format(facemod_n) if facemod_n is not None else "",
)
return "{}{}".format(arn, suffix)
def assembly_routine_signature():
from dune.perftool.generation import get_global_context_value
integral_type = get_global_context_value("integral_type")
form_type = get_global_context_value("form_type")
formdata = get_global_context_value("formdata")
# Check if form is linear
from dune.perftool.pdelab.driver import is_linear
linear = is_linear(formdata.original_form)
if form_type == 'residual':
if integral_type == 'cell':
from dune.perftool.pdelab.signatures import alpha_volume_signature
return alpha_volume_signature(kernel_name())
if integral_type == 'exterior_facet':
from dune.perftool.pdelab.signatures import alpha_boundary_signature
return alpha_boundary_signature(kernel_name())
if integral_type == 'interior_facet':
from dune.perftool.pdelab.signatures import alpha_skeleton_signature
return alpha_skeleton_signature(kernel_name())
if form_type == 'jacobian':
if integral_type == 'cell':
from dune.perftool.pdelab.signatures import jacobian_volume_signature
return jacobian_volume_signature(kernel_name())
if integral_type == 'exterior_facet':
from dune.perftool.pdelab.signatures import jacobian_boundary_signature
return jacobian_boundary_signature(kernel_name())
if integral_type == 'interior_facet':
from dune.perftool.pdelab.signatures import jacobian_skeleton_signature
return jacobian_skeleton_signature(kernel_name())
if form_type == 'jacobian_apply':
if linear:
if integral_type == 'cell':
from dune.perftool.pdelab.signatures import jacobian_apply_volume_signature
return jacobian_apply_volume_signature(kernel_name())
if integral_type == 'exterior_facet':
from dune.perftool.pdelab.signatures import jacobian_apply_boundary_signature
return jacobian_apply_boundary_signature(kernel_name())
if integral_type == 'interior_facet':
from dune.perftool.pdelab.signatures import jacobian_apply_skeleton_signature
return jacobian_apply_skeleton_signature(kernel_name())
else:
if integral_type == 'cell':
from dune.perftool.pdelab.signatures import nonlinear_jacobian_apply_volume_signature
return nonlinear_jacobian_apply_volume_signature(kernel_name())
if integral_type == 'exterior_facet':
from dune.perftool.pdelab.signatures import nonlinear_jacobian_apply_boundary_signature
return nonlinear_jacobian_apply_boundary_signature(kernel_name())
if integral_type == 'interior_facet':
from dune.perftool.pdelab.signatures import nonlinear_jacobian_apply_skeleton_signature
return nonlinear_jacobian_apply_skeleton_signature(kernel_name())
assert False
class AccumulationSpace(Record):
def __init__(self,
lfs=None,
......@@ -578,6 +491,7 @@ def extract_kernel_from_cache(tag, wrap_in_cgen=True):
if wrap_in_cgen:
# Wrap the kernel in something which can generate code
from dune.perftool.pdelab.signatures import assembly_routine_signature
signature = assembly_routine_signature()
kernel = LoopyKernelMethod(signature, kernel)
......@@ -658,6 +572,7 @@ class LoopyKernelMethod(ClassMember):
# Start timer
if add_timings and get_option('timer'):
from dune.perftool.pdelab.signatures import assembler_routine_name
timer_name = assembler_routine_name() + '_kernel'
name_example_kernel(name=timer_name)
post_include('HP_DECLARE_TIMER({});'.format(timer_name), filetag='operatorfile')
......@@ -765,6 +680,8 @@ def generate_localoperator_kernels(formdata, data):
enum_pattern()
pattern_baseclass()
enum_alpha()
from dune.perftool.pdelab.signatures import assembler_routine_name
with global_context(kernel=assembler_routine_name()):
kernel = [k for k in get_backend(interface="generate_kernels_per_integral")(form.integrals_by_type(measure))]
......@@ -775,6 +692,7 @@ def generate_localoperator_kernels(formdata, data):
# Numerical jacobian base class
_, loptype = class_type_from_cache("operator")
from dune.perftool.pdelab.signatures import ufl_measure_to_pdelab_measure
which = ufl_measure_to_pdelab_measure(measure)
base_class("Dune::PDELab::NumericalJacobian{}<{}>".format(which, loptype), classtag="operator")
......@@ -831,7 +749,9 @@ def generate_localoperator_kernels(formdata, data):
alpha_measures = set(i.integral_type() for i in form.integrals())
jacobian_measures = set(i.integral_type() for i in jacform.integrals())
for it in alpha_measures - jacobian_measures:
operator_kernels[(it, 'jacobian')] = None
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)]
# Jacobian apply methods for matrix-free computations
if get_option("matrix_free"):
......@@ -857,7 +777,9 @@ def generate_localoperator_kernels(formdata, data):
alpha_measures = set(i.integral_type() for i in form.integrals())
jacobian_apply_measures = set(i.integral_type() for i in jac_apply_form.integrals())
for it in alpha_measures - jacobian_apply_measures:
operator_kernels[(it, 'jacobian_apply')] = None
with global_context(integral_type=it):
from dune.perftool.pdelab.signatures import assembly_routine_signature
operator_kernels[(it, 'jacobian_apply')] = [LoopyKernelMethod(assembly_routine_signature(), kernel=None)]
# Return the set of generated kernels
return operator_kernels
......
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment