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.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.AdaptiveTimeSteppingCodeSnippets import AdaptiveTimeSteppingCodeSnippets
19
20
21class GlobalAdaptiveTimeStep(SingleSweep):
22 def __init__(self,
23 name, patch_size, unknowns, auxiliary_variables, min_volume_h, max_volume_h, time_step_relaxation,
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, overlap=1
33 ):
34 super(GlobalAdaptiveTimeStep,self).__init__(name,
35 patch_size,
36 overlap,
37 unknowns,
38 auxiliary_variables,
39 min_volume_h,
40 max_volume_h,
41 plot_grid_properties,
42 pde_terms_without_state,
43 kernel_namespace="rusanov")
44 self._time_step_relaxation = time_step_relaxation
45
46 self._flux_implementation = PDETerms.None_Implementation
47 self._ncp_implementation = PDETerms.None_Implementation
48 self._eigenvalues_implementation = PDETerms.None_Implementation
49 self._source_term_implementation = PDETerms.None_Implementation
50
52
53 self.set_implementation(flux=flux,
54 ncp=ncp,
55 eigenvalues=eigenvalues,
56 boundary_conditions=boundary_conditions,
57 refinement_criterion=refinement_criterion,
58 initial_conditions=initial_conditions,
59 source_term=source_term)
60
61
63 flux=None,ncp=None,
64 eigenvalues=None,
65 boundary_conditions=None,refinement_criterion=None,initial_conditions=None,source_term=None,
66 memory_location = None,
67 use_split_loop = False,
68 additional_action_set_includes = "",
69 additional_user_includes = ""
70 ):
71 """
72 If you pass in User_Defined, then the generator will create C++ stubs
73 that you have to befill manually. If you pass in None_Implementation, it
74 will create nop, i.e., no implementation or defaults. Any other string
75 is copied 1:1 into the implementation. If you pass in None, then the
76 set value so far won't be overwritten.
77
78 Please note that not all options are supported by all solvers.
79
80 This routine should be the very last invoked by the constructor.
81 """
82 if flux is not None: self._flux_implementation = flux
83 if ncp is not None: self._ncp_implementation = ncp
84 if eigenvalues is not None: self._eigenvalues_implementation = eigenvalues
85 if source_term is not None: self._source_term_implementation = source_term
86
87 create_rusanov_kernel_definitions(self._patch_size,
93 compute_max_eigenvalue_of_next_time_step = True
94 )
95
96 self._compute_kernel_call = create_compute_Riemann_kernel_for_Rusanov_dsl(
100 compute_max_eigenvalue_of_next_time_step = True,
101 solver_variant = SolverVariant.WithVirtualFunctions,
102 kernel_variant = KernelVariant.PatchWiseAoS
103 )
104
105 self._compute_kernel_call_stateless = create_compute_Riemann_kernel_for_Rusanov_dsl(
109 compute_max_eigenvalue_of_next_time_step = True,
110 solver_variant = SolverVariant.Stateless,
111 kernel_variant = KernelVariant.PatchWiseAoS
112 )
113
114 solver_code_snippets = AdaptiveTimeSteppingCodeSnippets(self._time_step_relaxation)
115
116 self._abstract_solver_user_declarations = create_abstract_solver_declarations(self._flux_implementation, self._ncp_implementation, self._eigenvalues_implementation, self._source_term_implementation, self._pde_terms_without_state)
117 self._abstract_solver_user_declarations += solver_code_snippets.create_abstract_solver_user_declarations()
118 self._abstract_solver_user_definitions = create_abstract_solver_definitions(self._flux_implementation, self._ncp_implementation, self._eigenvalues_implementation, self._source_term_implementation, self._pde_terms_without_state)
119 self._abstract_solver_user_definitions += solver_code_snippets.create_abstract_solver_user_definitions()
120
121 self._solver_user_declarations = create_solver_declarations(self._flux_implementation, self._ncp_implementation, self._eigenvalues_implementation, self._source_term_implementation, self._pde_terms_without_state)
122 self._solver_user_definitions = create_solver_definitions(self._flux_implementation, self._ncp_implementation, self._eigenvalues_implementation, self._source_term_implementation, self._pde_terms_without_state)
123
124 self._compute_time_step_size = solver_code_snippets.create_compute_time_step_size()
125 self._compute_new_time_step_size = solver_code_snippets.create_compute_new_time_step_size()
126
127 self._start_time_step_implementation = solver_code_snippets.create_start_time_step_implementation()
128 self._finish_time_step_implementation = solver_code_snippets.create_finish_time_step_implementation()
129 self._constructor_implementation = solver_code_snippets.create_abstract_solver_constructor_statements()
130
131 super(GlobalAdaptiveTimeStep,self).set_implementation(boundary_conditions, refinement_criterion, initial_conditions, memory_location, use_split_loop, additional_action_set_includes, additional_user_includes)
132
133
134 @property
136 return super(GlobalAdaptiveTimeStep, self).user_action_set_includes + """
137#include "kernels/rusanov.h"
138"""
__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, pde_terms_without_state=False, overlap=1)
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...