21 #ifndef FUB_HYPERBOLIC_SPLIT_SYSTEM_SOURCE_SOLVER_HPP
22 #define FUB_HYPERBOLIC_SPLIT_SYSTEM_SOURCE_SOLVER_HPP
26 #include "fub/split_method/StrangSplitting.hpp"
36 template <
typename SystemSolver,
typename SourceTerm,
37 typename SplittingMethod = StrangSplitting>
42 static const int Rank = std::max(SystemSolver::Rank, SourceTerm::Rank);
46 SourceTerm source_term,
47 SplittingMethod split = SplittingMethod());
51 SystemSolver&
GetSystem() noexcept {
return *
this; }
52 const SystemSolver&
GetSystem() const noexcept {
return *
this; }
57 using SystemSolver::GetContext;
58 using SystemSolver::GetCounterRegistry;
59 using SystemSolver::GetCycles;
60 using SystemSolver::GetGriddingAlgorithm;
61 using SystemSolver::GetMpiCommunicator;
62 using SystemSolver::GetTimePoint;
64 using SystemSolver::FillGhostLayerSingleLevel;
65 using SystemSolver::FillGhostLayerTwoLevels;
67 using SystemSolver::GetRatioToCoarserLevel;
68 using SystemSolver::LevelExists;
70 using SystemSolver::CoarsenConservatively;
72 using SystemSolver::ComputeNumericFluxes;
73 using SystemSolver::CopyDataToScratch;
74 using SystemSolver::CopyScratchToData;
75 using SystemSolver::UpdateConservatively;
77 using SystemSolver::AccumulateCoarseFineFluxes;
78 using SystemSolver::ApplyFluxCorrection;
79 using SystemSolver::ResetCoarseFineFluxes;
95 template <
typename... Args>
103 std::pair<int, int> subcycle = {0, 1});
113 template <
typename SystemSolver,
typename SourceTerm,
typename SplittingMethod>
116 SourceTerm source_term,
117 SplittingMethod split)
118 : SystemSolver(std::move(system_solver)),
119 source_term_{std::move(source_term)}, splitting_{split} {}
121 template <
typename SystemSolver,
typename SourceTerm,
typename SplittingMethod>
122 template <
typename... Args>
124 SystemSolver, SourceTerm,
130 template <
typename SystemSolver,
typename SourceTerm,
typename SplittingMethod>
137 source_term_.PreAdvanceHierarchy();
141 template <
typename SystemSolver,
typename SourceTerm,
typename SplittingMethod>
143 SystemSolver, SourceTerm,
147 source_term_.PostAdvanceHierarchy(dt);
149 source_term_.PostAdvanceHierarchy();
161 template <
typename SystemSolver,
typename SourceTerm,
typename SplittingMethod>
164 SplittingMethod>::ComputeStableDt(
int level) {
165 return std::min(SystemSolver::ComputeStableDt(level),
166 source_term_.ComputeStableDt(level));
169 template <
typename SystemSolver,
typename SourceTerm,
typename SplittingMethod>
171 SystemSolver, SourceTerm,
173 std::pair<int, int> subcycle) {
176 std::pair<int, int>>()) {
177 source_term_.PreAdvanceLevel(this_level, dt, subcycle);
181 template <
typename SystemSolver,
typename SourceTerm,
typename SplittingMethod>
185 std::pair<int, int> subcycle) {
187 std::pair<int, int>>()) {
188 source_term_.PostAdvanceLevel(this_level, dt, subcycle);
193 template <
typename SystemSolver,
typename SourceTerm,
typename SplittingMethod>
197 std::pair<int, int> subcycle) {
199 return SystemSolver::AdvanceLevelNonRecursively(this_level, dt, subcycle);
203 return source_term_.AdvanceLevel(SystemSolver::GetContext(), this_level,
206 return splitting_.Advance(dt, AdvanceSource, AdvanceSystem);
Definition: SplitSystemSourceLevelIntegrator.hpp:38
void ResetHierarchyConfiguration(const Args &... args)
Resets the hierarchy configuration of both sub solvers.
Definition: SplitSystemSourceLevelIntegrator.hpp:125
SourceTerm source_term_
Definition: SplitSystemSourceLevelIntegrator.hpp:106
Result< void, TimeStepTooLarge > PostAdvanceLevel(int level, Duration dt, std::pair< int, int > subcycle)
Definition: SplitSystemSourceLevelIntegrator.hpp:184
const SourceTerm & GetSource() const noexcept
Definition: SplitSystemSourceLevelIntegrator.hpp:55
SplitSystemSourceLevelIntegrator(SystemSolver system_solver, SourceTerm source_term, SplittingMethod split=SplittingMethod())
Constructs a system source solver from given sub solvers.
Definition: SplitSystemSourceLevelIntegrator.hpp:115
void PreAdvanceLevel(int level, Duration dt, std::pair< int, int > subcycle)
Definition: SplitSystemSourceLevelIntegrator.hpp:172
void PreAdvanceHierarchy()
Invokes any "pre-advance" logic of both sub solvers.
Definition: SplitSystemSourceLevelIntegrator.hpp:132
meta::GriddingAlgorithm< SystemSolver & > GriddingAlgorithm
Definition: SplitSystemSourceLevelIntegrator.hpp:40
void PostAdvanceHierarchy(Duration dt)
Invokes any "post-advance" logic of both sub solvers.
Definition: SplitSystemSourceLevelIntegrator.hpp:144
Result< void, TimeStepTooLarge > AdvanceLevelNonRecursively(int level, Duration dt, std::pair< int, int > subcycle={0, 1})
Definition: SplitSystemSourceLevelIntegrator.hpp:196
SourceTerm & GetSource() noexcept
Definition: SplitSystemSourceLevelIntegrator.hpp:54
SystemSolver & GetSystem() noexcept
Definition: SplitSystemSourceLevelIntegrator.hpp:51
Duration ComputeStableDt(int level)
Returns the minimum of stable time step sizes for both sub solvers.
Definition: SplitSystemSourceLevelIntegrator.hpp:164
const SystemSolver & GetSystem() const noexcept
Definition: SplitSystemSourceLevelIntegrator.hpp:52
static const int Rank
Definition: SplitSystemSourceLevelIntegrator.hpp:42
SplittingMethod splitting_
Definition: SplitSystemSourceLevelIntegrator.hpp:107
void CompleteFromCons(Equation &&equation, Complete< std::decay_t< Equation >> &complete, const Conservative< std::decay_t< Equation >> &cons)
Definition: CompleteFromCons.hpp:42
The fub namespace.
Definition: AnyBoundaryCondition.hpp:31
std::chrono::duration< double > Duration
Definition: Duration.hpp:31
void ResetHierarchyConfigurationIfDetected(T &&obj, Grid &&grid)
Invokes member function obj.ResetHierarchyConfiguration(grid)
Definition: Meta.hpp:77
boost::outcome_v2::result< T, E > Result
Definition: outcome.hpp:32
This is std::true_type if Op<Args...> is a valid SFINAE expression.
Definition: type_traits.hpp:92