345 def _generate_kernels(self, namespace, output, subdirectory, dimensions):
347 self._init_dictionary_with_default_parameters(d)
348 self.add_entries_to_text_replacement_dictionary(d)
349 d["DIMENSIONS"] = dimensions
350 d["NUMBER_OF_DOF_3D"] = 1 if dimensions == 2 else d["NUMBER_OF_DOF"]
351 d["NUMBER_OF_DOF_LIMITER_3D"] = 1 if dimensions == 2 else d["NUMBER_OF_DOF_LIMITER"]
352 d["GHOST_LAYER_WIDTH_3D"] = 0 if dimensions == 2 else d["GHOST_LAYER_WIDTH"]
353 d["FULL_QUALIFIED_SOLVER_NAME"] ="::".join(namespace) + "::" + self._name
355 kernels_namespace = namespace + ["kernels", self._name]
356 kernels_output_path = subdirectory + "kernels/" + self._name
357 kernels_templates_prefix = os.path.dirname(os.path.realpath(__file__)) + "/kernels/"
359 if not os.path.exists(kernels_output_path):
360 os.makedirs(kernels_output_path)
362 exahype2.solvers.limiting.kernels.Quadrature(d).generate_kernels(
363 kernels_namespace, output, subdirectory, kernels_templates_prefix, kernels_output_path
366 exahype2.solvers.limiting.kernels.Limiter(d).generate_kernels(
367 kernels_namespace, output, subdirectory, kernels_templates_prefix, kernels_output_path
375 def add_implementation_files_to_project(self, namespace, output, dimensions, subdirectory=""):
377 The ExaHyPE2 project will call this operation when it sets
378 up the overall environment.
380 This routine is typically not invoked by a user.
382 output: peano4.output.Output
388 HeaderDictionary = {}
389 self._init_dictionary_with_default_parameters(HeaderDictionary)
391 generated_abstract_files = (
392 peano4.output.Jinja2TemplatedHeaderImplementationFilePair(
393 os.path.dirname(os.path.realpath(__file__)) + "/StaticLimitingAbstract.template.h",
394 os.path.dirname(os.path.realpath(__file__)) + "/StaticLimitingAbstract.template.cpp",
395 "Abstract" + self._name,
404 generated_solver_files = (
405 peano4.output.Jinja2TemplatedHeaderImplementationFilePair(
406 os.path.dirname(os.path.realpath(__file__)) + "/StaticLimiting.template.h",
407 os.path.dirname(os.path.realpath(__file__)) + "/StaticLimiting.template.cpp",
417 output.add(generated_abstract_files)
418 output.makefile.add_cpp_file(subdirectory + "Abstract" + self._name + ".cpp", generated=True)
419 output.makefile.add_h_file(subdirectory + "Abstract" + self._name + ".h", generated=True)
421 output.add(generated_solver_files)
422 output.makefile.add_cpp_file(subdirectory + self._name + ".cpp", generated=True)
423 output.makefile.add_h_file(subdirectory + self._name + ".h", generated=True)
425 self._generate_kernels(namespace, output, subdirectory, dimensions)
435 def _init_dictionary_with_default_parameters(self, d):
436 d["SOLVER_INSTANCE"] = self.get_name_of_global_instance()
437 d["REGULAR_SOLVER_INSTANCE"] = self._regular_solver.get_name_of_global_instance()
438 d["LIMITER_SOLVER_INSTANCE"] = self._limiter_solver.get_name_of_global_instance()
440 d["SOLVER_NAME"] = self._name
441 d["REGULAR_SOLVER_NAME"] = self._regular_solver._name
442 d["LIMITER_SOLVER_NAME"] = self._limiter_solver._name
444 d["UNKNOWN_IDENTIFIER"] = self._unknown_identifier()
445 d["REGULAR_SOLVER_UNKNOWN_IDENTIFIER"] = self._regular_solver._unknown_identifier()
446 d["LIMITER_SOLVER_UNKNOWN_IDENTIFIER"] = self._limiter_solver._unknown_identifier()
448 d["ALIGNMENT"] = Architectures.get_alignment(self._regular_solver._architecture)
449 d["SIMD_WIDTH"] = Architectures.get_simd_width(self._regular_solver._architecture)
450 d["ORDER"] = self._regular_solver._order
451 d["NUMBER_OF_DOF"] = self._regular_solver._order + 1
452 d["NUMBER_OF_DOF_PADDED"] = Architectures.get_size_with_padding(self._regular_solver._architecture, self._regular_solver._order + 1)
453 d["NUMBER_OF_DOF_LIMITER"] = self._limiter_solver.patch_size if self._limiter_solver.patch_size >= 0 else 2 * self._regular_solver._order + 1
454 d["NUMBER_OF_DOF_LIMITER_PADDED"] = Architectures.get_size_with_padding(self._regular_solver._architecture, d["NUMBER_OF_DOF_LIMITER"])
455 d["NUMBER_OF_UNKNOWNS"] = self._regular_solver._unknowns
456 d["NUMBER_OF_UNKNOWNS_PADDED"] = Architectures.get_size_with_padding(self._regular_solver._architecture, self._regular_solver._unknowns)
457 d["NUMBER_OF_AUXILIARY_VARIABLES"] = self._regular_solver._auxiliary_variables
458 d["NUMBER_OF_AUXILIARY_VARIABLES_PADDED"] = Architectures.get_size_with_padding(self._regular_solver._architecture, self._regular_solver._auxiliary_variables)
459 d["NUMBER_OF_DATA"] = self._regular_solver._unknowns + self._regular_solver._auxiliary_variables
460 d["NUMBER_OF_DATA_PADDED"] = Architectures.get_size_with_padding(self._regular_solver._architecture, self._regular_solver._unknowns + self._regular_solver._auxiliary_variables)
461 d["NUMBER_OF_OBSERVABLES"] = 0
462 d["GHOST_LAYER_WIDTH"] = self._halo_size
464 d["NUMBER_OF_DOFS_PER_CELL_2D"] = (
465 (self._regular_solver.unknowns + self._regular_solver.auxiliary_variables)
466 * (self._regular_solver.order+1) * (self._regular_solver.order+1) )
467 d["NUMBER_OF_DOFS_PER_CELL_3D"] = (
468 (self._regular_solver.unknowns + self._regular_solver.auxiliary_variables)
469 * (self._regular_solver.order+1) * (self._regular_solver.order+1) * (self._regular_solver.order+1) )
471 d["USE_GAUSS_LOBATTO"] = ( "true" if self._regular_solver._polynomials is Polynomials.Gauss_Lobatto else "false" )
472 d["POLYNOMIAL_TYPE"] = ( "lobatto" if self._regular_solver._polynomials is Polynomials.Gauss_Lobatto else "legendre" )
474 d["SOLVER_INCLUDES"] = self.get_user_solver_includes()
476 d["SOLVER_USER_DECLARATIONS"] = jinja2.Template(
477 self._solver_user_declarations, undefined=jinja2.DebugUndefined
479 d["SOLVER_USER_DEFINITIONS"] = jinja2.Template(
480 self._solver_user_definitions, undefined=jinja2.DebugUndefined
483 d["START_TIME_STEP_IMPLEMENTATION"] = jinja2.Template(
484 self._start_time_step_implementation, undefined=jinja2.DebugUndefined
486 d["FINISH_TIME_STEP_IMPLEMENTATION"] = jinja2.Template(
487 self._finish_time_step_implementation, undefined=jinja2.DebugUndefined
490 d["CONSTRUCTOR_IMPLEMENTATION"] = jinja2.Template(
491 self._constructor_implementation, undefined=jinja2.DebugUndefined
494 d["ADMISSIBILITY_IMPLEMENTATION"] = self._physical_admissibility_criterion
496 d["QUADRATURE_POINTS"] = ", ".join(self._regular_solver._basis.quadrature_points())
498 d["USE_LIBXSMM"] = self._regular_solver._use_libxsmm
499 d["ARCHITECTURE"] = self._regular_solver._architecture