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_musclhancock_kernel_definitions
13from .kernels import create_compute_Riemann_kernel_for_MUSCLHancock_dsl
14
15from exahype2.solvers.fv.AdaptiveTimeSteppingCodeSnippets import AdaptiveTimeSteppingCodeSnippets
16
17from .kernels import SolverVariant
18from .kernels import KernelVariant
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=2
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="musclhancock")
44
45 self._time_step_relaxation = time_step_relaxation
46
47 self._flux_implementation = PDETerms.None_Implementation
48 self._ncp_implementation = PDETerms.None_Implementation
49 self._eigenvalues_implementation = PDETerms.None_Implementation
50 self._source_term_implementation = PDETerms.None_Implementation
51
53
54 self.set_implementation(flux=flux,
55 ncp=ncp,
56 eigenvalues=eigenvalues,
57 boundary_conditions=boundary_conditions,
58 refinement_criterion=refinement_criterion,
59 initial_conditions=initial_conditions,
60 source_term=source_term )
61
62
64 flux=None,ncp=None,
65 eigenvalues=None,
66 boundary_conditions=None,refinement_criterion=None,initial_conditions=None,source_term=None,
67 memory_location = None,
68 use_split_loop = False,
69 additional_action_set_includes = "",
70 additional_user_includes = ""
71 ):
72 """
73 If you pass in User_Defined, then the generator will create C++ stubs
74 that you have to befill manually. If you pass in None_Implementation, it
75 will create nop, i.e. no implementation or defaults. Any other string
76 is copied 1:1 into the implementation. If you pass in None, then the
77 set value so far won't be overwritten.
78
79 Please note that not all options are supported by all solvers.
80
81 This routine should be the very last invoked by the constructor.
82 """
83 if flux is not None: self._flux_implementation = flux
84 if ncp is not None: self._ncp_implementation = ncp
85 if eigenvalues is not None: self._eigenvalues_implementation = eigenvalues
86 if source_term is not None: self._source_term_implementation = source_term
87
88 create_musclhancock_kernel_definitions()
89
90 #self._compute_kernel_call = create_compute_Riemann_kernel_for_MusclHancock(
91 # self._flux_implementation, self._ncp_implementation, self._source_term_implementation,
92 # compute_max_eigenvalue_of_next_time_step=True,
93 # solver_variant = SolverVariant.WithVirtualFunctions,
94 # riemann_kernel_variant = RiemannKernelVariant.PatchWiseAoSHeap
95 #)
96
97 self._compute_kernel_call = create_compute_Riemann_kernel_for_MUSCLHancock_dsl(
101 compute_max_eigenvalue_of_next_time_step = True,
102 solver_variant = SolverVariant.WithVirtualFunctions,
103 kernel_variant = KernelVariant.PatchWiseAoS
104 )
105
106 self._compute_kernel_call_stateless = create_compute_Riemann_kernel_for_MUSCLHancock_dsl(
110 compute_max_eigenvalue_of_next_time_step = True,
111 solver_variant = SolverVariant.Stateless,
112 kernel_variant = KernelVariant.PatchWiseAoS
113 )
114
115 solver_code_snippets = AdaptiveTimeSteppingCodeSnippets(self._time_step_relaxation)
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/musclhancock.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=2)
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...