Peano
Loading...
Searching...
No Matches
GlobalAdaptiveTimeStep.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.SeparateSweeps import SeparateSweeps
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_cell_integral_kernel_definitions
14from exahype2.solvers.rkdg.kernels import clear_dg_kernel_file
15from exahype2.solvers.rkdg.kernels import create_volumetric_solver_call_dsl
16from exahype2.solvers.rkdg.kernels import create_add_solver_contributions_call
17from exahype2.solvers.rkdg.kernels import create_multiply_with_inverted_mass_matrix_call
18from exahype2.solvers.rkdg.rusanov.kernels import create_Riemann_solver_call
19from exahype2.solvers.rkdg.rusanov.kernels import create_Riemann_solver_kernel_definitions
20
21from exahype2.solvers.rkdg.AdaptiveTimeSteppingCodeSnippets import AdaptiveTimeSteppingCodeSnippets
22
23from exahype2.solvers.rkdg.actionsets.ProjectLinearCombinationOfEstimatesOntoFaces import FaceProjections
24
25
26class GlobalAdaptiveTimeStep(SeparateSweeps):
27 """!
28
29 RKDG solver with Rusanov Riemann solver employing global adaptive time stepping
30
31 Please consult GlobalFixedTimeStep for details. This version is very similar
32 with the big difference being that we add the evaluation and global
33 reduction of the maximum eigenvalue and then adopt the time step size
34 accordingly.
35
36 """
37 def __init__(self,
38 name,
39 rk_order,
40 polynomials,
41 unknowns,
42 auxiliary_variables,
43 min_cell_h,
44 max_cell_h,
45 time_step_relaxation,
46 flux=PDETerms.User_Defined_Implementation,
47 eigenvalues=PDETerms.User_Defined_Implementation,
48 ncp=PDETerms.None_Implementation,
49 point_source=PDETerms.None_Implementation,
50 boundary_conditions=PDETerms.User_Defined_Implementation,
51 refinement_criterion=PDETerms.Empty_Implementation,
52 initial_conditions=PDETerms.User_Defined_Implementation,
53 source_term=PDETerms.None_Implementation,
54 plot_grid_properties=False,
55 pde_terms_without_state=False,
56 ):
57 """!
58
59 Construct RKDG solver with adaptive global time step
60
61 """
62 super(GlobalAdaptiveTimeStep,self).__init__(name,
63 rk_order,
64 polynomials,
65 FaceProjections.Solution,
66 unknowns,
67 auxiliary_variables,
68 min_cell_h,
69 max_cell_h,
70 plot_grid_properties,
71 pde_terms_without_state,
72 )
73
74 self._time_step_relaxation = time_step_relaxation
76
77 self._kernel_namespace = "rusanov"
78
79 self._volumetric_compute_kernel_call = create_volumetric_solver_call_dsl(self._basis, SolverVariant.WithVirtualFunctions)
80 self._volumetric_compute_kernel_call_stateless = create_volumetric_solver_call_dsl(self._basis, SolverVariant.Stateless)
81 self._Riemann_compute_kernel_call = create_Riemann_solver_call(self._basis, FaceProjections.Solution)
82 # TODO: self._Riemann_compute_kernel_call_stateless =
83 self._add_solver_contributions_call = create_add_solver_contributions_call(self._basis)
84 self._multiply_with_inverted_mass_matrix_call = create_multiply_with_inverted_mass_matrix_call(self._basis)
85
86 self.set_implementation(boundary_conditions=boundary_conditions,
87 refinement_criterion=refinement_criterion,
88 initial_conditions=initial_conditions,
89 additional_action_set_includes="",
90 additional_user_includes="",
91 flux=flux,
92 eigenvalues=eigenvalues,
93 ncp=ncp,
94 source_term=source_term,
95 point_source=point_source
96 )
97
98
100 flux=None,
101 ncp=None,
102 eigenvalues=None,
103 boundary_conditions=None,
104 refinement_criterion=None,
105 initial_conditions=None,
106 source_term=None,
107 point_source=None,
108 additional_action_set_includes = "",
109 additional_user_includes = ""
110 ):
111 """
112 If you pass in User_Defined, then the generator will create C++ stubs
113 that you have to befill manually. If you pass in None_Implementation, it
114 will create nop, i.e., no implementation or defaults. Any other string
115 is copied 1:1 into the implementation. If you pass in None, then the
116 set value so far won't be overwritten.
117
118 Please note that not all options are supported by all solvers.
119
120 This routine should be the very last invoked by the constructor.
121 """
122 super(GlobalAdaptiveTimeStep,self).set_implementation(boundary_conditions=boundary_conditions,
123 refinement_criterion=refinement_criterion,
124 initial_conditions=initial_conditions,
125 additional_action_set_includes=additional_action_set_includes,
126 additional_user_includes=additional_user_includes,
127 flux=flux,
128 ncp=ncp,
129 eigenvalues=eigenvalues,
130 source_term=source_term,
131 point_source=point_source
132 )
133 clear_dg_kernel_file()
134 create_cell_integral_kernel_definitions(
136 self._basis.order,
139 flux,
140 ncp,
141 source_term,
142 point_source
143 )
144 create_Riemann_solver_kernel_definitions()
145
146 solver_code_snippets = AdaptiveTimeSteppingCodeSnippets(self._time_step_relaxation)
147
148 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, self._pde_terms_without_state)
149 self._abstract_solver_user_declarations += solver_code_snippets.create_abstract_solver_user_declarations()
150 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, self._pde_terms_without_state)
151 self._abstract_solver_user_definitions += solver_code_snippets.create_abstract_solver_user_definitions()
152
153 self._solver_user_declarations = create_solver_declarations(self._flux_implementation, self._ncp_implementation, self._eigenvalues_implementation, self._source_term_implementation, self._point_sources_implementation, self._pde_terms_without_state)
154 self._solver_user_definitions = create_solver_definitions( self._flux_implementation, self._ncp_implementation, self._eigenvalues_implementation, self._source_term_implementation, self._point_sources_implementation, self._pde_terms_without_state)
155
156 self._compute_time_step_size = solver_code_snippets.create_compute_time_step_size()
157 self._compute_new_time_step_size = solver_code_snippets.create_compute_new_time_step_size()
158
159 self._start_time_step_implementation = solver_code_snippets.create_start_time_step_implementation()
160 self._finish_time_step_implementation = solver_code_snippets.create_finish_time_step_implementation()
161 self._constructor_implementation = solver_code_snippets.create_abstract_solver_constructor_statements()
162
163
164 @property
166 return super(GlobalAdaptiveTimeStep, self).user_action_set_includes + """
167#include "exahype2/dg/rusanov/Rusanov.h"
168#include "kernels/dg.h"
169"""
RKDG solver with Rusanov Riemann solver employing global adaptive time stepping.
__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.
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...