diff --git a/python/dune/codegen/options.py b/python/dune/codegen/options.py index 18fbebab787e6c470fe4672786a72433331d5260..40f2d1a520ca5506604d8f5ec98709d692b75fc3 100644 --- a/python/dune/codegen/options.py +++ b/python/dune/codegen/options.py @@ -108,6 +108,10 @@ class CodegenFormOptionsArray(ImmutableRecord): control_variable = CodegenOption(default=None, helpstr="Name of control variable in UFL file") block_preconditioner_diagonal = CodegenOption(default=False, helpstr="Whether this operator should implement the diagonal part of a block preconditioner") block_preconditioner_offdiagonal = CodegenOption(default=False, helpstr="Whether this operator should implement the off-diagonal part of a block preconditioner") + enable_volume = CodegenOption(default=True, helpstr="Whether to assemble volume integrals") + enable_skeleton = CodegenOption(default=True, helpstr="Whether to assemble skeleton integrals") + enable_boundary = CodegenOption(default=True, helpstr="Whether to assemble boundary integrals") + # Until more sophisticated logic is needed, we keep the actual option data in this module _global_options = CodegenGlobalOptionsArray() diff --git a/python/dune/codegen/pdelab/localoperator.py b/python/dune/codegen/pdelab/localoperator.py index 3b8b8f9cb2100762768d839a2dbbaba263784973..12793f96977e46ccb252285454f11344810892bc 100644 --- a/python/dune/codegen/pdelab/localoperator.py +++ b/python/dune/codegen/pdelab/localoperator.py @@ -776,6 +776,15 @@ def local_operator_default_settings(operator, form): .format(rf), classtag="operator") +def measure_is_enabled(measure): + option_dict = {"cell": "enable_volume", + "interior_facet": "enable_skeleton", + "exterior_facet": "enable_boundary", + } + + return get_form_option(option_dict[measure]) + + def generate_residual_kernels(form, original_form): if not get_form_option("generate_residuals"): return {} @@ -787,6 +796,10 @@ def generate_residual_kernels(form, original_form): # Generate the necessary residual methods for measure in set(i.integral_type() for i in form.integrals()): logger.info("generate_residual_kernels: measure {}".format(measure)) + + if not measure_is_enabled(measure): + continue + with global_context(integral_type=measure): from dune.codegen.pdelab.signatures import assembler_routine_name with global_context(kernel=assembler_routine_name()): @@ -897,6 +910,9 @@ def generate_jacobian_kernels(form, original_form): if get_form_option("sumfact_regular_jacobians"): set_form_option("sumfact", False) for measure in set(i.integral_type() for i in jacform.integrals()): + if not measure_is_enabled(measure): + continue + logger.info("generate_jacobian_kernels: measure {}".format(measure)) with global_context(integral_type=measure): from dune.codegen.pdelab.signatures import assembler_routine_name @@ -930,6 +946,9 @@ def generate_control_kernels(forms): # Generate the necessary residual methods for measure in set(i.integral_type() for form in forms for i in form.integrals()): + if not measure_is_enabled(measure): + continue + logger.info("generate_control_kernels: measure {}".format(measure)) with global_context(integral_type=measure): from dune.codegen.pdelab.signatures import assembler_routine_name