408 def _generate_kernels(self, namespace, output, subdirectory, dimensions):
410 self._init_dictionary_with_default_parameters(d)
411 self.add_entries_to_text_replacement_dictionary(d)
412 d["DIMENSIONS"] = dimensions
413 d["NUMBER_OF_DOF_3D"] = 1 if dimensions == 2 else d["NUMBER_OF_DOF"]
414 d["NUMBER_OF_DOF_LIMITER_3D"] = 1 if dimensions == 2 else d["NUMBER_OF_DOF_LIMITER"]
415 d["GHOST_LAYER_WIDTH_3D"] = 0 if dimensions == 2 else d["GHOST_LAYER_WIDTH"]
416 d["FULL_QUALIFIED_SOLVER_NAME"] ="::".join(namespace) + "::" + self._name
418 kernels_namespace = namespace + ["kernels", self._name]
419 kernels_output_path = subdirectory + "kernels/" + self._name
420 kernels_templates_prefix = os.path.dirname(os.path.realpath(__file__)) + "/kernels/"
422 if not os.path.exists(kernels_output_path):
423 os.makedirs(kernels_output_path)
425 exahype2.solvers.limiting.kernels.Quadrature(d).generate_kernels(
426 kernels_namespace, output, subdirectory, kernels_templates_prefix, kernels_output_path
429 exahype2.solvers.limiting.kernels.Limiter(d).generate_kernels(
430 kernels_namespace, output, subdirectory, kernels_templates_prefix, kernels_output_path
438 def add_implementation_files_to_project(self, namespace, output, dimensions, subdirectory=""):
440 The ExaHyPE2 project will call this operation when it sets
441 up the overall environment.
443 This routine is typically not invoked by a user.
445 output: peano4.output.Output
451 HeaderDictionary = {}
452 self._init_dictionary_with_default_parameters(HeaderDictionary)
454 generated_abstract_files = (
455 peano4.output.Jinja2TemplatedHeaderImplementationFilePair(
456 os.path.dirname(os.path.realpath(__file__)) + "/PosterioriLimitingAbstract.template.h",
457 os.path.dirname(os.path.realpath(__file__)) + "/PosterioriLimitingAbstract.template.cpp",
458 "Abstract" + self._name,
467 generated_solver_files = (
468 peano4.output.Jinja2TemplatedHeaderImplementationFilePair(
469 os.path.dirname(os.path.realpath(__file__)) + "/PosterioriLimiting.template.h",
470 os.path.dirname(os.path.realpath(__file__)) + "/PosterioriLimiting.template.cpp",
480 output.add(generated_abstract_files)
481 output.makefile.add_cpp_file(subdirectory + "Abstract" + self._name + ".cpp", generated=True)
482 output.makefile.add_h_file(subdirectory + "Abstract" + self._name + ".h", generated=True)
484 output.add(generated_solver_files)
485 output.makefile.add_cpp_file(subdirectory + self._name + ".cpp", generated=True)
486 output.makefile.add_h_file(subdirectory + self._name + ".h", generated=True)
488 self._generate_kernels(namespace, output, subdirectory, dimensions)
498 def _init_dictionary_with_default_parameters(self, d):
499 d["SOLVER_INSTANCE"] = self.get_name_of_global_instance()
500 d["REGULAR_SOLVER_INSTANCE"] = self._regular_solver.get_name_of_global_instance()
501 d["LIMITER_SOLVER_INSTANCE"] = self._limiter_solver.get_name_of_global_instance()
503 d["SOLVER_NAME"] = self._name
504 d["REGULAR_SOLVER_NAME"] = self._regular_solver._name
505 d["LIMITER_SOLVER_NAME"] = self._limiter_solver._name
507 d["UNKNOWN_IDENTIFIER"] = self._unknown_identifier()
508 d["REGULAR_SOLVER_UNKNOWN_IDENTIFIER"] = self._regular_solver._unknown_identifier()
509 d["LIMITER_SOLVER_UNKNOWN_IDENTIFIER"] = self._limiter_solver._unknown_identifier()
511 d["ALIGNMENT"] = Architectures.get_alignment(self._regular_solver._architecture)
512 d["SIMD_WIDTH"] = Architectures.get_simd_width(self._regular_solver._architecture)
513 d["ORDER"] = self._regular_solver._order
514 d["NUMBER_OF_DOF"] = self._regular_solver._order + 1
515 d["NUMBER_OF_DOF_PADDED"] = Architectures.get_size_with_padding(self._regular_solver._architecture, self._regular_solver._order + 1)
516 d["NUMBER_OF_DOF_LIMITER"] = self._limiter_solver.patch_size if self._limiter_solver.patch_size >= 0 else 2 * self._regular_solver._order + 1
517 d["NUMBER_OF_DOF_LIMITER_PADDED"] = Architectures.get_size_with_padding(self._regular_solver._architecture, d["NUMBER_OF_DOF_LIMITER"])
518 d["NUMBER_OF_UNKNOWNS"] = self._regular_solver._unknowns
519 d["NUMBER_OF_UNKNOWNS_PADDED"] = Architectures.get_size_with_padding(self._regular_solver._architecture, self._regular_solver._unknowns)
520 d["NUMBER_OF_AUXILIARY_VARIABLES"] = self._regular_solver._auxiliary_variables
521 d["NUMBER_OF_AUXILIARY_VARIABLES_PADDED"] = Architectures.get_size_with_padding(self._regular_solver._architecture, self._regular_solver._auxiliary_variables)
522 d["NUMBER_OF_DATA"] = self._regular_solver._unknowns + self._regular_solver._auxiliary_variables
523 d["NUMBER_OF_DATA_PADDED"] = Architectures.get_size_with_padding(self._regular_solver._architecture, self._regular_solver._unknowns + self._regular_solver._auxiliary_variables)
524 d["NUMBER_OF_OBSERVABLES"] = self._number_of_dmp_observables
525 d["GHOST_LAYER_WIDTH"] = self._halo_size
527 d["NUMBER_OF_DOFS_PER_CELL_2D"] = (
528 (self._regular_solver.unknowns + self._regular_solver.auxiliary_variables)
529 * (self._regular_solver.order+1) * (self._regular_solver.order+1) )
530 d["NUMBER_OF_DOFS_PER_CELL_3D"] = (
531 (self._regular_solver.unknowns + self._regular_solver.auxiliary_variables)
532 * (self._regular_solver.order+1) * (self._regular_solver.order+1) * (self._regular_solver.order+1) )
534 d["USE_GAUSS_LOBATTO"] = ( "true" if self._regular_solver._polynomials is Polynomials.Gauss_Lobatto else "false" )
535 d["POLYNOMIAL_TYPE"] = ( "lobatto" if self._regular_solver._polynomials is Polynomials.Gauss_Lobatto else "legendre" )
537 d["SOLVER_INCLUDES"] = self.get_user_solver_includes()
539 d["SOLVER_USER_DECLARATIONS"] = jinja2.Template(
540 self._solver_user_declarations, undefined=jinja2.DebugUndefined
542 d["SOLVER_USER_DEFINITIONS"] = jinja2.Template(
543 self._solver_user_definitions, undefined=jinja2.DebugUndefined
546 d["START_TIME_STEP_IMPLEMENTATION"] = jinja2.Template(
547 self._start_time_step_implementation, undefined=jinja2.DebugUndefined
549 d["FINISH_TIME_STEP_IMPLEMENTATION"] = jinja2.Template(
550 self._finish_time_step_implementation, undefined=jinja2.DebugUndefined
553 d["CONSTRUCTOR_IMPLEMENTATION"] = jinja2.Template(
554 self._constructor_implementation, undefined=jinja2.DebugUndefined
557 d["DMP_DIFFERENCES_SCALING"] = self._dmp_differences_scaling
558 d["DMP_RELAXATION_PARAMETER"] = self._dmp_relaxation_parameter
559 d["NUMBER_OF_DMP_OBSERVABLES"] = self._number_of_dmp_observables
560 d["ADMISSIBILITY_IMPLEMENTATION"] = self._physical_admissibility_criterion
562 d["QUADRATURE_POINTS"] = ", ".join(self._regular_solver._basis.quadrature_points())
564 d["USE_LIBXSMM"] = self._regular_solver._use_libxsmm
565 d["ARCHITECTURE"] = self._regular_solver._architecture