Peano
Loading...
Searching...
No Matches
GlobalFixedTimeStep.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 .kernels import SolverVariant
16from .kernels import KernelVariant
17
18from exahype2.solvers.fv.FixedTimeSteppingCodeSnippets import FixedTimeSteppingCodeSnippets
19
20
22 def __init__(self,
23 name, patch_size, unknowns, auxiliary_variables, min_volume_h, max_volume_h, normalised_time_step_size,
24 flux=PDETerms.User_Defined_Implementation,
25 ncp=PDETerms.None_Implementation,
26 eigenvalues=PDETerms.User_Defined_Implementation,
27 boundary_conditions=PDETerms.User_Defined_Implementation,
28 refinement_criterion=PDETerms.Empty_Implementation,
29 initial_conditions=PDETerms.User_Defined_Implementation,
30 source_term=PDETerms.None_Implementation,
31 plot_grid_properties=False,
32 pde_terms_without_state=False,
33 ):
34 """!
35
36 Construct a Finite Volume scheme with a Rusanov solver and fixed time step sizes
37
38 @param time_step_size: Float
39 This is the normalised time step size w.r.t. the coarsest admissible h value. If
40 the code employs AMR on top of it and refines further, it will automatically
41 downscale the time step size accordingly. So hand in a valid time step size w.r.t.
42 to max_volume_h.
43
44 @param normalised_time_step_size: Float
45 Please consult exahype2.solvers.fv.FixedTimeSteppingCodeSnippets. The logic how
46 this field is translated into a time step size is outsourced into this utility
47 class.
48
49 """
50 super(GlobalFixedTimeStep,self).__init__(name,
51 patch_size,
52 1, # overlap
53 unknowns,
54 auxiliary_variables,
55 min_volume_h,
56 max_volume_h,
57 plot_grid_properties,
58 pde_terms_without_state,
59 kernel_namespace="rusanov")
60 self._normalised_time_step_size = normalised_time_step_size
61
62 self._flux_implementation_flux_implementation = PDETerms.None_Implementation
63 self._ncp_implementation_ncp_implementation = PDETerms.None_Implementation
66
68
70#include "exahype2/fv/rusanov/rusanov.h"
71"""
72
74 flux=flux,
75 ncp=ncp,
76 eigenvalues=eigenvalues,
77 boundary_conditions=boundary_conditions,
78 refinement_criterion=refinement_criterion,
79 initial_conditions=initial_conditions,
80 source_term=source_term
81 )
82
83
85 flux = None,
86 ncp = None,
87 eigenvalues = None,
88 boundary_conditions = None,
89 refinement_criterion = None,
90 initial_conditions = None,
91 source_term = None,
92 memory_location = None,
93 use_split_loop = False,
94 additional_action_set_includes = "",
95 additional_user_includes = ""
96 ):
97 """!
98
99 Configure implementation
100
101 If you pass in User_Defined, then the generator will create C++ stubs
102 that you have to befill manually. If you pass in None_Implementation, it
103 will create nop, i.e., no implementation or defaults. Any other string
104 is copied 1:1 into the implementation. If you pass in None, then the
105 set value so far won't be overwritten.
106
107 Please note that not all options are supported by all solvers.
108
109 This routine should be the very last invoked by the constructor.
110 """
111 if flux is not None: self._flux_implementation_flux_implementation = flux
112 if ncp is not None: self._ncp_implementation_ncp_implementation = ncp
113 if eigenvalues is not None: self._eigenvalues_implementation_eigenvalues_implementation = eigenvalues
114 if source_term is not None: self._source_term_implementation_source_term_implementation = source_term
115
116 create_rusanov_kernel_definitions()
117
118 self._compute_kernel_call_compute_kernel_call = create_compute_Riemann_kernel_for_Rusanov_dsl(
122 compute_max_eigenvalue_of_next_time_step = False,
123 solver_variant = SolverVariant.WithVirtualFunctions,
124 kernel_variant = KernelVariant.PatchWiseAoS
125 )
126
127 self._compute_kernel_call_stateless_compute_kernel_call_stateless = create_compute_Riemann_kernel_for_Rusanov_dsl(
131 compute_max_eigenvalue_of_next_time_step = False,
132 solver_variant = SolverVariant.Stateless,
133 kernel_variant = KernelVariant.PatchWiseAoS
134 )
135
137
139 self._abstract_solver_user_declarations_abstract_solver_user_declarations += solver_code_snippets.create_abstract_solver_user_declarations()
141 self._abstract_solver_user_definitions_abstract_solver_user_definitions += solver_code_snippets.create_abstract_solver_user_definitions()
142
143 self._compute_time_step_size_compute_time_step_size = solver_code_snippets.create_compute_time_step_size()
144 self._compute_new_time_step_size_compute_new_time_step_size = solver_code_snippets.create_compute_new_time_step_size()
145
148
149 self._start_time_step_implementation_start_time_step_implementation = solver_code_snippets.create_start_time_step_implementation()
150 self._finish_time_step_implementation_finish_time_step_implementation = solver_code_snippets.create_finish_time_step_implementation()
151 self._constructor_implementation_constructor_implementation = solver_code_snippets.create_abstract_solver_constructor_statements()
152
153 super(GlobalFixedTimeStep,self).set_implementation(boundary_conditions, refinement_criterion, initial_conditions, memory_location, use_split_loop, additional_action_set_includes, additional_user_includes)
154
155 @property
157 return super(GlobalFixedTimeStep, self).user_action_set_includes + """
158#include "exahype2/fv/rusanov/rusanov.h"
159#include "kernels/rusanov.h"
160"""
Code snippet generator for fixed time stepping in the Runge-Kutta schemes.
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...
user_action_set_includes(self)
Add further includes to this property, if your action sets require some additional routines from othe...
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="")
Configure implementation.
__init__(self, name, patch_size, unknowns, auxiliary_variables, min_volume_h, max_volume_h, normalised_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, pde_terms_without_state=False)
Construct a Finite Volume scheme with a Rusanov solver and fixed time step sizes.