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_volumetric_solver_call
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
17
18from exahype2.solvers.rkdg.AdaptiveTimeSteppingCodeSnippets import AdaptiveTimeSteppingCodeSnippets
19
21
22
24 """!
25
26 RKDG solver with Rusanov Riemann solver employing global adaptive time stepping
27
28 Please consult GlobalFixedTimeStep for details. This version is very similar
29 with the big difference being that we add the evaluation and global
30 reduction of the maximum eigenvalue and then adopt the time step size
31 accordingly.
32
33 """
34 def __init__(self,
35 name,
36 rk_order,
37 polynomials,
38 unknowns,
39 auxiliary_variables,
40 min_cell_h,
41 max_cell_h,
42 time_step_relaxation,
43 flux=PDETerms.User_Defined_Implementation,
44 eigenvalues=PDETerms.User_Defined_Implementation,
45 ncp=PDETerms.None_Implementation,
46 point_source=PDETerms.None_Implementation,
47 boundary_conditions=PDETerms.User_Defined_Implementation,
48 refinement_criterion=PDETerms.Empty_Implementation,
49 initial_conditions=PDETerms.User_Defined_Implementation,
50 source_term=PDETerms.None_Implementation,
51 plot_grid_properties=False,
52 pde_terms_without_state=False,
53 ):
54 """!
55
56 Construct RKDG solver with adaptive global time step
57
58 """
59 super(GlobalAdaptiveTimeStep,self).__init__(name,
60 rk_order,
61 polynomials,
62 FaceProjections.Solution,
63 unknowns,
64 auxiliary_variables,
65 min_cell_h,
66 max_cell_h,
67 plot_grid_properties,
68 pde_terms_without_state,
69 )
70
71 self._time_step_relaxation = time_step_relaxation
73
75 self._volumetric_compute_kernel_call_volumetric_compute_kernel_call = create_volumetric_solver_call(self._basis, SolverVariant.WithVirtualFunctions)
76 self._volumetric_compute_kernel_call_stateless_volumetric_compute_kernel_call_stateless = create_volumetric_solver_call(self._basis, SolverVariant.Stateless)
77 self._Riemann_compute_kernel_call_Riemann_compute_kernel_call = create_Riemann_solver_call(self._basis, FaceProjections.Solution)
78 # TODO: self._Riemann_compute_kernel_call_stateless =
79 self._add_solver_contributions_call_add_solver_contributions_call = create_add_solver_contributions_call(self._basis)
80 self._multiply_with_inverted_mass_matrix_call_multiply_with_inverted_mass_matrix_call = create_multiply_with_inverted_mass_matrix_call(self._basis)
81
82 self.set_implementationset_implementation(boundary_conditions=boundary_conditions,
83 refinement_criterion=refinement_criterion,
84 initial_conditions=initial_conditions,
85 additional_action_set_includes="",
86 additional_user_includes="",
87 flux=flux,
88 eigenvalues=eigenvalues,
89 ncp=ncp,
90 source_term=source_term,
91 point_source=point_source
92 )
93
94
96 flux=None,
97 ncp=None,
98 eigenvalues=None,
99 boundary_conditions=None,
100 refinement_criterion=None,
101 initial_conditions=None,
102 source_term=None,
103 point_source=None,
104 additional_action_set_includes = "",
105 additional_user_includes = ""
106 ):
107 """
108 If you pass in User_Defined, then the generator will create C++ stubs
109 that you have to befill manually. If you pass in None_Implementation, it
110 will create nop, i.e., no implementation or defaults. Any other string
111 is copied 1:1 into the implementation. If you pass in None, then the
112 set value so far won't be overwritten.
113
114 Please note that not all options are supported by all solvers.
115
116 This routine should be the very last invoked by the constructor.
117 """
118 super(GlobalAdaptiveTimeStep,self).set_implementation(boundary_conditions=boundary_conditions,
119 refinement_criterion=refinement_criterion,
120 initial_conditions=initial_conditions,
121 additional_action_set_includes=additional_action_set_includes,
122 additional_user_includes=additional_user_includes,
123 flux=flux,
124 ncp=ncp,
125 eigenvalues=eigenvalues,
126 source_term=source_term,
127 point_source=point_source
128 )
129
131
133 self._abstract_solver_user_declarations_abstract_solver_user_declarations += solver_code_snippets.create_abstract_solver_user_declarations()
135 self._abstract_solver_user_definitions_abstract_solver_user_definitions += solver_code_snippets.create_abstract_solver_user_definitions()
136
139
140 self._compute_time_step_size_compute_time_step_size = solver_code_snippets.create_compute_time_step_size()
141 self._compute_new_time_step_size_compute_new_time_step_size = solver_code_snippets.create_compute_new_time_step_size()
142
143 self._start_time_step_implementation_start_time_step_implementation = solver_code_snippets.create_start_time_step_implementation()
144 self._finish_time_step_implementation_finish_time_step_implementation = solver_code_snippets.create_finish_time_step_implementation()
145 self._constructor_implementation_constructor_implementation = solver_code_snippets.create_abstract_solver_constructor_statements()
146
147
148 @property
150 return super(GlobalAdaptiveTimeStep, self).user_action_set_includes + """
151#include "exahype2/dg/rusanov/Rusanov.h"
152"""
Code snippet generator for fixed time stepping in the Runge-Kutta schemes.
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...
Probably the simplest solver you could think off.
RKDG solver with Rusanov Riemann solver employing global adaptive time stepping.
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...
__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.
user_action_set_includes(self)
Add further includes to this property, if your action sets require some additional routines from othe...