Peano
Loading...
Searching...
No Matches
GlobalAdaptiveTimeStepWithEnclaveTasking.py
Go to the documentation of this file.
1# This file is part of the ExaHyPE2 project. For conditions of distribution and
2# use, please see the copyright notice at www.peano-framework.org
3from exahype2.solvers.PDETerms import PDETerms
4from exahype2.solvers.rkdg.SeparateSweepsWithEnclaveTasking import SeparateSweepsWithEnclaveTasking
5
6from exahype2.solvers.rkdg.kernels import create_abstract_solver_declarations
7from exahype2.solvers.rkdg.kernels import create_abstract_solver_definitions
8from exahype2.solvers.rkdg.kernels import create_solver_declarations
9from exahype2.solvers.rkdg.kernels import create_solver_definitions
10
11from exahype2.solvers.rkdg.kernels import SolverVariant
12
13from exahype2.solvers.rkdg.kernels import create_volumetric_solver_call_dsl
14from exahype2.solvers.rkdg.kernels import create_add_solver_contributions_call
15from exahype2.solvers.rkdg.kernels import create_multiply_with_inverted_mass_matrix_call
16from exahype2.solvers.rkdg.rusanov.kernels import create_Riemann_solver_call_dsl
17from exahype2.solvers.rkdg.kernels import create_cell_integral_kernel_definitions
18from exahype2.solvers.rkdg.rusanov.kernels import create_Riemann_solver_kernel_definitions
19from exahype2.solvers.rkdg.kernels import clear_dg_kernel_file
20
21from exahype2.solvers.rkdg.AdaptiveTimeSteppingCodeSnippets import AdaptiveTimeSteppingCodeSnippets
22
23from exahype2.solvers.rkdg.actionsets.ProjectLinearCombinationOfEstimatesOntoFaces import FaceProjections
24
25
26class GlobalAdaptiveTimeStepWithEnclaveTasking(SeparateSweepsWithEnclaveTasking):
27 """!
28
29 RKDG solver with global adaptive time step
30
31 Please consult GlobalAdaptiveTimeStep for more documentation. This version is
32 basically the same with the "only" exception being that we employ enclave
33 tasking here.
34
35 """
36 def __init__(self,
37 name,
38 rk_order,
39 polynomials,
40 unknowns,
41 auxiliary_variables,
42 min_cell_h,
43 max_cell_h,
44 time_step_relaxation,
45 flux=PDETerms.User_Defined_Implementation,
46 eigenvalues=PDETerms.User_Defined_Implementation,
47 ncp=PDETerms.None_Implementation,
48 point_source=PDETerms.None_Implementation,
49 boundary_conditions=PDETerms.User_Defined_Implementation,
50 refinement_criterion=PDETerms.Empty_Implementation,
51 initial_conditions=PDETerms.User_Defined_Implementation,
52 source_term=PDETerms.None_Implementation,
53 plot_grid_properties=False,
54 pde_terms_without_state=False,
55 ):
56 """!
57
58 Construct RKDG solver with adaptive global time step and enclave tasking
59
60 """
61 super(GlobalAdaptiveTimeStepWithEnclaveTasking,self).__init__(name,
62 rk_order,
63 polynomials,
64 FaceProjections.Solution,
65 unknowns,
66 auxiliary_variables,
67 min_cell_h,
68 max_cell_h,
69 plot_grid_properties,
70 pde_terms_without_state)
71
72 self._time_step_relaxation = time_step_relaxation
74
75 self._kernel_namespace = "rusanov"
76
77
78 self._volumetric_compute_kernel_call = create_volumetric_solver_call_dsl(self._basis, SolverVariant.WithVirtualFunctions)
79 self._volumetric_compute_kernel_call_stateless = create_volumetric_solver_call_dsl(self._basis, SolverVariant.Stateless)
80 self._Riemann_compute_kernel_call = create_Riemann_solver_call_dsl(self._basis, FaceProjections.Solution)
81 # TODO: self._Riemann_compute_kernel_call_stateless =
82 self._fused_volumetric_compute_kernel_call_stateless_cpu = create_volumetric_solver_call_dsl(self._basis, SolverVariant.Stateless)
83 self._fused_volumetric_compute_kernel_call_stateless_gpu = create_volumetric_solver_call_dsl(self._basis, SolverVariant.Accelerator)
84 # TODO: self._fused_Riemann_compute_kernel_call_cpu =
85 # TODO: self._fused_Riemann_compute_kernel_call_gpu =
86 self._add_solver_contributions_call = create_add_solver_contributions_call(self._basis)
87 self._multiply_with_inverted_mass_matrix_call = create_multiply_with_inverted_mass_matrix_call(self._basis)
88
89 self.set_implementation(boundary_conditions=boundary_conditions,
90 refinement_criterion=refinement_criterion,
91 initial_conditions=initial_conditions,
92 additional_action_set_includes="",
93 additional_user_includes="",
94 flux=flux,
95 eigenvalues=eigenvalues,
96 ncp=ncp,
97 source_term=source_term,
98 point_source=point_source
99 )
100
101
103 flux=None,
104 ncp=None,
105 eigenvalues=None,
106 boundary_conditions=None,
107 refinement_criterion=None,
108 initial_conditions=None,
109 source_term=None,
110 point_source=None,
111 additional_action_set_includes = "",
112 additional_user_includes = ""
113 ):
114 """
115 If you pass in User_Defined, then the generator will create C++ stubs
116 that you have to befill manually. If you pass in None_Implementation, it
117 will create nop, i.e., no implementation or defaults. Any other string
118 is copied 1:1 into the implementation. If you pass in None, then the
119 set value so far won't be overwritten.
120
121 Please note that not all options are supported by all solvers.
122
123 This routine should be the very last invoked by the constructor.
124 """
125 super(GlobalAdaptiveTimeStepWithEnclaveTasking,self).set_implementation(boundary_conditions=boundary_conditions,
126 refinement_criterion=refinement_criterion,
127 initial_conditions=initial_conditions,
128 additional_action_set_includes=additional_action_set_includes,
129 additional_user_includes=additional_user_includes,
130 flux=flux,
131 ncp=ncp,
132 eigenvalues=eigenvalues,
133 source_term=source_term,
134 point_source=point_source
135 )
136
137 clear_dg_kernel_file()
138 create_cell_integral_kernel_definitions(
140 self._basis.order,
143 flux,
144 ncp,
145 source_term,
146 point_source
147 )
148 create_Riemann_solver_kernel_definitions()
149
150 solver_code_snippets = AdaptiveTimeSteppingCodeSnippets(self._time_step_relaxation)
151
152 self._abstract_solver_user_declarations = create_abstract_solver_declarations(self._flux_implementation, self._ncp_implementation, self._eigenvalues_implementation, self._source_term_implementation, self._point_sources_implementation, pde_terms_without_state=self._pde_terms_without_state)
153 self._abstract_solver_user_declarations += solver_code_snippets.create_abstract_solver_user_declarations()
154 self._abstract_solver_user_definitions = create_abstract_solver_definitions( self._flux_implementation, self._ncp_implementation, self._eigenvalues_implementation, self._source_term_implementation, self._point_sources_implementation, pde_terms_without_state=self._pde_terms_without_state)
155 self._abstract_solver_user_definitions += solver_code_snippets.create_abstract_solver_user_definitions()
156
157 self._solver_user_declarations = create_solver_declarations(self._flux_implementation, self._ncp_implementation, self._eigenvalues_implementation, self._source_term_implementation, self._point_sources_implementation, pde_terms_without_state=self._pde_terms_without_state)
158 self._solver_user_definitions = create_solver_definitions( self._flux_implementation, self._ncp_implementation, self._eigenvalues_implementation, self._source_term_implementation, self._point_sources_implementation, pde_terms_without_state=self._pde_terms_without_state)
159
160 self._compute_time_step_size = solver_code_snippets.create_compute_time_step_size()
161 self._compute_new_time_step_size = solver_code_snippets.create_compute_new_time_step_size()
162
163 self._start_time_step_implementation = solver_code_snippets.create_start_time_step_implementation()
164 self._finish_time_step_implementation = solver_code_snippets.create_finish_time_step_implementation()
165 self._constructor_implementation = solver_code_snippets.create_abstract_solver_constructor_statements()
166
167
168 @property
170 return super(GlobalAdaptiveTimeStepWithEnclaveTasking, self).user_action_set_includes + """
171#include "exahype2/dg/rusanov/Rusanov.h"
172#include "kernels/dg.h"
173"""
__init__(self, name, rk_order, polynomials, unknowns, auxiliary_variables, min_cell_h, max_cell_h, time_step_relaxation, flux=PDETerms.User_Defined_Implementation, eigenvalues=PDETerms.User_Defined_Implementation, ncp=PDETerms.None_Implementation, point_source=PDETerms.None_Implementation, boundary_conditions=PDETerms.User_Defined_Implementation, refinement_criterion=PDETerms.Empty_Implementation, initial_conditions=PDETerms.User_Defined_Implementation, source_term=PDETerms.None_Implementation, plot_grid_properties=False, pde_terms_without_state=False)
Construct RKDG solver with adaptive global time step and enclave tasking.
set_implementation(self, flux=None, ncp=None, eigenvalues=None, boundary_conditions=None, refinement_criterion=None, initial_conditions=None, source_term=None, point_source=None, additional_action_set_includes="", additional_user_includes="")
If you pass in User_Defined, then the generator will create C++ stubs that you have to befill manuall...