Peano
Loading...
Searching...
No Matches
SubcyclingFixedTimeStep.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.SingleSweep import SingleSweep
5
6import jinja2
7
8from .kernels import create_abstract_solver_declarations
9from .kernels import create_abstract_solver_definitions
10from .kernels import create_solver_declarations
11from .kernels import create_solver_definitions
12from .kernels import create_rusanov_kernel_definitions
13from .kernels import create_compute_Riemann_kernel_for_Rusanov_dsl
14
15from exahype2.solvers.fv.FixedSubcyclingTimeSteppingCodeSnippets import FixedSubcyclingTimeSteppingCodeSnippets
16
17from .kernels import SolverVariant
18from .kernels import KernelVariant
19
20from exahype2.solvers.fv.kernels import create_halo_layer_construction_with_interpolation_for_reconstructed_patch
21
22
24 def __init__(self,
25 name, patch_size, unknowns, auxiliary_variables, min_volume_h, max_volume_h, time_step_size,
26 flux=PDETerms.User_Defined_Implementation,
27 ncp=PDETerms.None_Implementation,
28 eigenvalues=PDETerms.User_Defined_Implementation,
29 boundary_conditions=PDETerms.User_Defined_Implementation,
30 refinement_criterion=PDETerms.Empty_Implementation,
31 initial_conditions=PDETerms.User_Defined_Implementation,
32 source_term=PDETerms.None_Implementation,
33 plot_grid_properties=False,
34 interpolate_linearly_in_time=True, overlap=1
35 ):
36 """
37 time_step_size: Float
38 This is the normalised time step size w.r.t. the coarsest admissible h value. If
39 the code employs AMR on top of it and refines further, it will automatically
40 downscale the time step size accordingly. So hand in a valid time step size w.r.t.
41 to max_volume_h.
42 """
43 self._interpolate_linearly_in_time = interpolate_linearly_in_time
44
45 super(SubcyclingFixedTimeStep,self).__init__(name,
46 patch_size,
47 overlap,
48 unknowns,
49 auxiliary_variables,
50 min_volume_h,
51 max_volume_h,
52 plot_grid_properties,
53 kernel_namespace="rusanov")
54 self._time_step_size = time_step_size
55
56 self._flux_implementation_flux_implementation = PDETerms.None_Implementation
57 self._ncp_implementation_ncp_implementation = PDETerms.None_Implementation
60
62 ncp=ncp,
63 eigenvalues=eigenvalues,
64 boundary_conditions=boundary_conditions,
65 refinement_criterion=refinement_criterion,
66 initial_conditions=initial_conditions,
67 source_term=source_term )
68
69
71 flux=None,ncp=None,
72 eigenvalues=None,
73 boundary_conditions=None,refinement_criterion=None,initial_conditions=None,source_term=None,
74 memory_location = None,
75 use_split_loop = False,
76 additional_action_set_includes = "",
77 additional_user_includes = ""
78 ):
79 """
80 If you pass in User_Defined, then the generator will create C++ stubs
81 that you have to befill manually. If you pass in None_Implementation, it
82 will create nop, i.e., no implementation or defaults. Any other string
83 is copied 1:1 into the implementation. If you pass in None, then the
84 set value so far won't be overwritten.
85
86 Please note that not all options are supported by all solvers.
87
88 This routine should be the very last invoked by the constructor.
89 """
90 if flux is not None: self._flux_implementation_flux_implementation = flux
91 if ncp is not None: self._ncp_implementation_ncp_implementation = ncp
92 if eigenvalues is not None: self._eigenvalues_implementation_eigenvalues_implementation = eigenvalues
93 if source_term is not None: self._source_term_implementation_source_term_implementation = source_term
94
95 create_rusanov_kernel_definitions()
96
97 self._compute_kernel_call_compute_kernel_call = create_compute_Riemann_kernel_for_Rusanov_dsl(
101 compute_max_eigenvalue_of_next_time_step = False,
102 solver_variant = SolverVariant.WithVirtualFunctions,
103 kernel_variant = KernelVariant.PatchWiseAoS
104 )
105
106 self._compute_kernel_call_stateless_compute_kernel_call_stateless = create_compute_Riemann_kernel_for_Rusanov_dsl(
110 compute_max_eigenvalue_of_next_time_step = False,
111 solver_variant = SolverVariant.Stateless,
112 kernel_variant = KernelVariant.PatchWiseAoS
113 )
114
115 solver_code_snippets = FixedSubcyclingTimeSteppingCodeSnippets(self._time_step_size,False,True)
116
118 self._abstract_solver_user_declarations_abstract_solver_user_declarations += solver_code_snippets.create_abstract_solver_user_declarations()
120 self._abstract_solver_user_definitions_abstract_solver_user_definitions += solver_code_snippets.create_abstract_solver_user_definitions()
121
124
125 self._compute_time_step_size_compute_time_step_size = solver_code_snippets.create_compute_time_step_size()
126 self._compute_new_time_step_size_compute_new_time_step_size = solver_code_snippets.create_compute_new_time_step_size()
127
128 self._start_time_step_implementation_start_time_step_implementation = solver_code_snippets.create_start_time_step_implementation()
129 self._finish_time_step_implementation_finish_time_step_implementation = solver_code_snippets.create_finish_time_step_implementation()
130 self._constructor_implementation_constructor_implementation = solver_code_snippets.create_abstract_solver_constructor_statements()
131
132 self._user_action_set_includes += """
133#include "exahype2/TimeStepping.h"
134#include "kernels/rusanov.h"
135"""
136
137 super(SubcyclingFixedTimeStep,self).set_implementation(boundary_conditions, refinement_criterion, initial_conditions, memory_location, use_split_loop, additional_action_set_includes, additional_user_includes)
138
139
141 """
142 The actual action sets all are created by the superclass. So nothing
143 is to be done here. But we want to reset the actual updates and
144 projection, and these only happen if we are allowed to update
145 indeed.
146 """
147 super(SubcyclingFixedTimeStep, self).create_action_sets()
148
149 self._action_set_update_cell_action_set_update_cell.guard += " and ::exahype2::runTimeStepOnCell( fineGridCell" + self._name + "CellLabel, fineGridFaces" + self._name + "FaceLabel, repositories::getMinTimeStamp())"
150
152 self._action_set_update_cell_action_set_update_cell._Template_TouchCellFirstTime_Fill_Halos = create_halo_layer_construction_with_interpolation_for_reconstructed_patch(self._name)
153
154 self._action_set_AMR.event_lifetime = int(self._max_volume_h/self._min_volume_h+1)
155
156
158 super(SubcyclingFixedTimeStep, self).create_data_structures()
159
160 self._patch_overlap_old.generator.send_condition = "true"
161 self._patch_overlap_old.generator.receive_and_merge_condition = "true"
Probably the simplest solver you could think off.
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_size, 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, overlap=1)
time_step_size: Float This is the normalised time step size w.r.t.
create_data_structures(self)
Call the superclass' create_data_structures() to ensure that all the data structures are in place,...
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...
create_action_sets(self)
The actual action sets all are created by the superclass.