Peano
Loading...
Searching...
No Matches
SubcyclingAdaptiveTimeStepWithEnclaveTasking.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.fv.EnclaveTasking import EnclaveTasking
5
6import jinja2
7
8from .kernels import create_compute_Riemann_kernel_for_Rusanov
9from .kernels import create_abstract_solver_declarations
10from .kernels import create_abstract_solver_definitions
11from .kernels import create_solver_declarations
12from .kernels import create_solver_definitions
13from .kernels import create_compute_time_step_size_kernel_for_adaptive_time_stepping_with_subcycling
14
15from .kernels import create_compute_new_time_step_size_kernel_for_adaptive_time_stepping
16from .kernels import create_constructor_implementation_for_adaptive_time_stepping
17
18from .kernels import SolverVariant
19from .kernels import KernelVariant
20
21from .kernels import create_abstract_solver_user_declarations_for_adaptive_time_stepping
22from .kernels import create_abstract_solver_user_definitions_for_adaptive_time_stepping
23from .kernels import create_finish_time_step_implementation_for_adaptive_time_stepping
24from exahype2.solvers.fv.kernels import create_start_time_step_implementation_for_adaptive_time_stepping_with_subcycling
25
26from exahype2.solvers.fv.kernels import create_halo_layer_construction_with_interpolation_for_reconstructed_patch
27
28
30 def __init__(self,
31 name, patch_size, unknowns, auxiliary_variables, min_volume_h, max_volume_h, time_step_relaxation,
32 flux=PDETerms.User_Defined_Implementation,
33 ncp=PDETerms.None_Implementation,
34 eigenvalues=PDETerms.User_Defined_Implementation,
35 boundary_conditions=PDETerms.User_Defined_Implementation,
36 refinement_criterion=PDETerms.Empty_Implementation,
37 initial_conditions=PDETerms.User_Defined_Implementation,
38 source_term=PDETerms.None_Implementation,
39 plot_grid_properties=False,
40 interpolate_linearly_in_time=True,
41 pde_terms_without_state=False, overlap=1
42 ):
43 """
44 time_step_size: Float
45 This is the normalised time step size w.r.t. the coarsest admissible h value. If
46 the code employs AMR on top of it and refines further, it will automatically
47 downscale the time step size accordingly. So hand in a valid time step size w.r.t.
48 to max_volume_h.
49 """
50 self._interpolate_linearly_in_time = interpolate_linearly_in_time
51
52 super(SubcyclingAdaptiveTimeStepWithEnclaveTasking,self).__init__(name,
53 patch_size,
54 overlap,
55 unknowns,
56 auxiliary_variables,
57 min_volume_h,
58 max_volume_h,
59 plot_grid_properties,
60 pde_terms_without_state,
61 kernel_namespace="rusanov")
62 self._time_step_relaxation = time_step_relaxation
63
64 self._flux_implementation_flux_implementation = PDETerms.None_Implementation
65 self._ncp_implementation_ncp_implementation = PDETerms.None_Implementation
68
70
71 self._compute_time_step_size_compute_time_step_size = create_compute_time_step_size_kernel_for_adaptive_time_stepping_with_subcycling( name )
72 #self._compute_new_time_step_size = """
73# const double timeStepSize = dt;
74# const double timeStamp = t;
75#""" + create_compute_new_time_step_size_kernel_for_adaptive_time_stepping()
76 self._compute_new_time_step_size_compute_new_time_step_size = create_compute_new_time_step_size_kernel_for_adaptive_time_stepping()
77
79 ncp=ncp,
80 eigenvalues=eigenvalues,
81 boundary_conditions=boundary_conditions,
82 refinement_criterion=refinement_criterion,
83 initial_conditions=initial_conditions,
84 source_term=source_term)
85
86
88 flux=None,ncp=None,
89 eigenvalues=None,
90 boundary_conditions=None,refinement_criterion=None,initial_conditions=None,source_term=None,
91 memory_location = None,
92 use_split_loop = False,
93 additional_action_set_includes = "",
94 additional_user_includes = ""
95 ):
96 """
97 If you pass in User_Defined, then the generator will create C++ stubs
98 that you have to befill manually. If you pass in None_Implementation, it
99 will create nop, i.e., no implementation or defaults. Any other string
100 is copied 1:1 into the implementation. If you pass in None, then the
101 set value so far won't be overwritten.
102
103 Please note that not all options are supported by all solvers.
104
105 This routine should be the very last invoked by the constructor.
106 """
107 if flux is not None: self._flux_implementation_flux_implementation = flux
108 if ncp is not None: self._ncp_implementation_ncp_implementation = ncp
109 if eigenvalues is not None: self._eigenvalues_implementation_eigenvalues_implementation = eigenvalues
110 if source_term is not None: self._source_term_implementation_source_term_implementation = source_term
111
112 self._compute_kernel_call_compute_kernel_call = create_compute_Riemann_kernel_for_Rusanov(
116 compute_max_eigenvalue_of_next_time_step = True,
117 solver_variant = SolverVariant.WithVirtualFunctions,
118 kernel_variant = KernelVariant.PatchWiseAoS
119 )
120
121 self._compute_kernel_call_stateless_compute_kernel_call_stateless = create_compute_Riemann_kernel_for_Rusanov(
125 compute_max_eigenvalue_of_next_time_step = True,
126 solver_variant = SolverVariant.Stateless,
127 kernel_variant = KernelVariant.PatchWiseAoS
128 )
129
134 compute_max_eigenvalue_of_next_time_step = True,
135 solver_variant = SolverVariant.Stateless,
136 kernel_variant = KernelVariant.PatchWiseAoS
137 )
138
143 compute_max_eigenvalue_of_next_time_step = True,
144 solver_variant = SolverVariant.Accelerator,
145 kernel_variant = KernelVariant.VolumeWiseAoS
146 )
147
149 self._abstract_solver_user_declarations_abstract_solver_user_declarations += create_abstract_solver_user_declarations_for_adaptive_time_stepping()
151 self._abstract_solver_user_definitions_abstract_solver_user_definitions += create_abstract_solver_user_definitions_for_adaptive_time_stepping()
152
153 self._constructor_implementation_constructor_implementation = create_constructor_implementation_for_adaptive_time_stepping()
154
157
158 self._start_time_step_implementation_start_time_step_implementation = create_start_time_step_implementation_for_adaptive_time_stepping_with_subcycling(True)
159 self._finish_time_step_implementation_finish_time_step_implementation = """if (_solverState==SolverState::Secondary) {
160""" + create_finish_time_step_implementation_for_adaptive_time_stepping(self._time_step_relaxation) + """
161}
162"""
163
164 super(SubcyclingAdaptiveTimeStepWithEnclaveTasking,self).set_implementation(boundary_conditions, refinement_criterion, initial_conditions, memory_location, use_split_loop, additional_action_set_includes, additional_user_includes)
165
166
168 """
169 The actual action sets all are created by the superclass. So nothing
170 is to be done here. But we want to reset the actual updates and
171 projection, and these only happen if we are allowed to update
172 indeed.
173 """
174 super(SubcyclingAdaptiveTimeStepWithEnclaveTasking, self).create_action_sets()
175
176 update_cell_guard = "::exahype2::runTimeStepOnCell( fineGridCell" + self._name_name + "CellLabel, fineGridFaces" + self._name_name + "FaceLabel, repositories::getMinTimeStamp())"
177 #updated_cell_guard = "fineGridCell" + self._name + "CellLabel.getSemaphoreNumber()!=::exahype2::EnclaveBookkeeping::NoEnclaveTaskNumber"
178 self._action_set_update_cell_action_set_update_cell.guard += " and " + update_cell_guard
179 #self._action_set_merge_enclave_task_outcome.guard = updated_cell_guard
180
182 self._action_set_update_cell_action_set_update_cell._Template_TouchCellFirstTime_Fill_Halos = create_halo_layer_construction_with_interpolation_for_reconstructed_patch(self._name_name)
183
184 self._action_set_AMR.event_lifetime = 2*int(self._max_volume_h/self._min_volume_h+1)
185
186
187 @property
189 return super(SubcyclingAdaptiveTimeStepWithEnclaveTasking, self).user_action_set_includes + """
190#include "exahype2/TimeStepping.h"
191#include "exahype2/fv/rusanov/rusanov.h"
192"""
193
194
196 super(SubcyclingAdaptiveTimeStepWithEnclaveTasking, self).create_data_structures()
197
198 self._patch_overlap_old.generator.send_condition = self._patch_overlap_new.generator.send_condition
199 self._patch_overlap_old.generator.receive_and_merge_condition = self._patch_overlap_new.generator.receive_and_merge_condition
Enclave tasking variant of the Finite Volume scheme.
set_implementation(self, boundary_conditions, refinement_criterion, initial_conditions, memory_location, use_split_loop, 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...
__init__(self, name, patch_size, unknowns, auxiliary_variables, min_volume_h, max_volume_h, time_step_relaxation, flux=PDETerms.User_Defined_Implementation, ncp=PDETerms.None_Implementation, eigenvalues=PDETerms.User_Defined_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, interpolate_linearly_in_time=True, pde_terms_without_state=False, overlap=1)
time_step_size: Float This is the normalised time step size w.r.t.
create_data_structures(self)
This routine does not really add new data, but it heavily tailors when data are stored,...
set_implementation(self, flux=None, ncp=None, eigenvalues=None, boundary_conditions=None, refinement_criterion=None, initial_conditions=None, source_term=None, memory_location=None, use_split_loop=False, 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...
user_action_set_includes(self)
Add further includes to this property, if your action sets require some additional routines from othe...