DamBreak++ Wave Simulator 0.3
DamBreak++ Simulation Framework
Loading...
Searching...
No Matches
dbpp_NujicIntegrator.h
Go to the documentation of this file.
1
2#pragma once
3
4// C++ include
5#include <ranges>
6// App includes
9// SfxBase19 include
10#include "include/Sfx_UniversalConstants.h"
11// VS2019 includes
14
15// forward declaration
16namespace dbpp { class SweRhsAlgorithm; }
17
18namespace dbpp
19{
24 {
28 using slnpairvarray = std::pair<std::valarray<float64>, std::valarray<float64>>;
32 using slnpairvector = std::pair<std::vector<float64>, std::vector<float64>>;
33 public:
37 enum class eIntegratorStep {
40 };
41 public:
52 NujicIntegrator( std::size_t aNbGridPts, float64 aSpatialStep /*DamBreakData*/);
58 void step( dbpp::SweRhsData<float64, std::valarray<float64>>&& aRhs, float64 aDt);
64 void TwoInOneStep(dbpp::SweRhsAlgorithm* aRhsAlgo, const float64 aDt);
71 template<typename Range>
72 void initialSolution( const Range& aRng1, const Range& aRng2)
73 {
74 assert(std::ranges::size(aRng1) == std::ranges::size(aRng2));
75
76 if( std::ranges::size(aRng1) == Sfx::DIM::value+1)
77 {
78 if constexpr( std::is_same_v<Range,std::valarray<float64>>)
79 {
80 auto&& w_vw1 = std::views::counted(std::ranges::begin(aRng1), std::ranges::size(aRng1) - 1);
81 auto&& w_vw2 = std::views::counted(std::ranges::begin(aRng2), std::ranges::size(aRng2) - 1);
82 // resize first
83 m_currU1Values.resize(w_vw1.size());
84 m_currU2Values.resize(w_vw2.size());
85 std::ranges::copy(w_vw1, std::ranges::begin(m_currU1Values));
86 std::ranges::copy(w_vw2, std::ranges::begin(m_currU2Values));
87 }
88 else
89 {
90 auto&& w_vw1 = std::views::counted(aRng1.cbegin(), std::ranges::size(aRng1) - 1);
91 auto&& w_vw2 = std::views::counted(aRng2.cbegin(), std::ranges::size(aRng2) - 1);
92 // resize first
93 m_currU1Values.resize(w_vw1.size());
94 m_currU2Values.resize(w_vw2.size());
95 std::ranges::copy(w_vw1, std::ranges::begin(m_currU1Values));
96 std::ranges::copy(w_vw2, std::ranges::begin(m_currU2Values));
97 }
98 }
99 else if ( std::ranges::size(aRng1) == Sfx::DIM::value)
100 {
101 // resize first
102 m_currU1Values.resize(std::ranges::size(aRng1));
103 m_currU2Values.resize(std::ranges::size(aRng2));
104 std::ranges::copy(aRng1, std::ranges::begin(m_currU1Values));
105 std::ranges::copy(aRng2, std::ranges::begin(m_currU2Values));
106 }
107 else{
108 Sfx::Logger::instance()->OutputError(std::string{ "Not supported container (NujicIntegrator)" }.data());
109 }
110 allocField();
111 }
112
117 void setInitialState( StateVector aField); // pass by-value (move semantic??)
123 {
124 return m_currState;
125 }
126
132 {
133 return m_prevState;
134 }
135
147
152 {
154 {
155 /*auto vec1 = std::vector<float64>(std::begin(m_prevU1Values), std::end(m_prevU1Values));
156 auto vec2 = std::vector<float64>(std::begin(m_prevU2Values), std::end(m_prevU2Values));*/
157
158 // RVO (Return Value Optimization) copy elison C++17
159 return { std::vector<float64>(std::begin(m_prevU1Values), std::end(m_prevU1Values)),
160 std::vector<float64>(std::begin(m_prevU2Values), std::end(m_prevU2Values)) };
161 };
162
163 // RVO (Return Value Optimization) copy elison C++17
164 return { std::vector<float64>(std::begin(m_currU1Values), std::end(m_currU1Values)),
165 std::vector<float64>(std::begin(m_currU2Values), std::end(m_currU2Values)) };
166 }
167
172 {
174 {
175 return m_prevState;
176 }
177 return m_currState;
178 }
179
183 void setStep( float64 aStep) noexcept { m_step=aStep;}
188 float64 getStep() const noexcept { return m_step;}
193 void setIntegratorStep( const eIntegratorStep aIntegratorStep)
194 {
195 if( m_integratorStep!=aIntegratorStep)
196 {
197 m_integratorStep = aIntegratorStep;
198 }
199 }
200
208 void setPhysicalBoundaryCnd() {/*under construction*/ }
213 void setLeftNodeBCValues( const std::pair<float64, float64>& aPairLeftBC)
214 {
215 m_leftBCValues = aPairLeftBC;
216 }
217 protected:
223 void predictor( dbpp::SweRhsData<float64,std::valarray<float64>>&& aRhs, float64 aDt);
229 void corrector( dbpp::SweRhsData<float64,std::valarray<float64>>&& aRhs, float64 aDt);
230
231 private:
232 std::size_t m_numOfGridPts;
235 std::pair<float64, float64> m_leftBCValues;
237 std::valarray<float64> m_prevU1Values;
238 std::valarray<float64> m_prevU2Values;
240 std::valarray<float64> m_currU1Values;
241 std::valarray<float64> m_currU2Values;
246 void allocField();
247 };
248#if 0
249 //reserve must be done before assignment
250 template<typename Range>
251 void NujicIntegrator::initialSolution( const Range& aRng1, const Range& aRng2)
252 {
253 // for now we support valarray (under construction)??
254 assert(std::ranges::size(aRng1) == std::ranges::size(aRng2));
255
256 // concept of viewable range
257 if constexpr (std::ranges::view<Range>)
258 {
259 // if( std::ranges::size(aRng1) == Sfx::DIM::value + 1)
260 // {
261 auto&& w_vw1 = std::views::counted(aRng1.cbegin(), std::ranges::size(aRng1) - 1);
262 auto&& w_vw2 = std::views::counted(aRng2.cbegin(), std::ranges::size(aRng2) - 1);
263 // resize first
264 m_currU1Values.resize(w_vw1.size());
265 m_currU2Values.resize(w_vw2.size());
266 std::ranges::copy(w_vw1, std::ranges::begin(m_currU1Values));
267 std::ranges::copy(w_vw2, std::ranges::begin(m_currU2Values));
268 // }
269 // else // DIM computational domain
270 // {
271 // resize first
272 // m_currU1Values.resize(std::ranges::size(aRng1));
273 // m_currU2Values.resize(std::ranges::size(aRng2));
274 // std::ranges::copy(aRng1, std::ranges::begin(m_currU1Values));
275 // std::ranges::copy(aRng2, std::ranges::begin(m_currU2Values));
276 // }
277 }
278 else if constexpr (std::is_same_v<Range, std::valarray<float64>> )
279 {
280 m_currU1Values = aRng1; //move?? No because
281 m_currU2Values = aRng2;
282 }
283 else
284 {
285 std::copy(aRng1.cbegin(), aRng1.cend(), std::begin(m_currU1Values));
286 std::copy(aRng2.cbegin(), aRng2.cend(), std::begin(m_currU2Values));
287 }
288#endif
289
290} // end of namespace
std::pair< fieldptr, fieldptr > StateVector
Definition SimulationConfig.h:27
void allocField()
memory allocation
Definition dbpp_NujicIntegrator.cpp:405
slnpairvarray getSolutionAsVarray() const
solution of the integration step
Definition dbpp_NujicIntegrator.h:139
std::valarray< float64 > m_currU2Values
Definition dbpp_NujicIntegrator.h:241
StateVector getSolutionAsField() const noexcept
Getter.
Definition dbpp_NujicIntegrator.h:171
std::valarray< float64 > m_prevU2Values
Definition dbpp_NujicIntegrator.h:238
void step(dbpp::SweRhsData< float64, std::valarray< float64 > > &&aRhs, float64 aDt)
Step algorithm.
Definition dbpp_NujicIntegrator.cpp:361
StateVector getMidState() const
Getter.
Definition dbpp_NujicIntegrator.h:131
std::valarray< float64 > m_prevU1Values
Definition dbpp_NujicIntegrator.h:237
void corrector(dbpp::SweRhsData< float64, std::valarray< float64 > > &&aRhs, float64 aDt)
corrector algorithm
Definition dbpp_NujicIntegrator.cpp:271
eIntegratorStep
Enumeration integrator steps.
Definition dbpp_NujicIntegrator.h:37
@ predictor
Definition dbpp_NujicIntegrator.h:38
@ corrector
Definition dbpp_NujicIntegrator.h:39
void setIntegratorStep(const eIntegratorStep aIntegratorStep)
Set integrator algorithm step.
Definition dbpp_NujicIntegrator.h:193
void initialSolution(const Range &aRng1, const Range &aRng2)
Initial solution.
Definition dbpp_NujicIntegrator.h:72
void setInitialState(StateVector aField)
Initial state.
Definition dbpp_NujicIntegrator.cpp:392
eIntegratorStep m_integratorStep
Definition dbpp_NujicIntegrator.h:236
std::valarray< float64 > m_currU1Values
Definition dbpp_NujicIntegrator.h:240
StateVector m_currState
Definition dbpp_NujicIntegrator.h:242
slnpairvector getSolutionAsVector() const
Getter.
Definition dbpp_NujicIntegrator.h:151
float64 m_spatialStep
Definition dbpp_NujicIntegrator.h:234
void TwoInOneStep(dbpp::SweRhsAlgorithm *aRhsAlgo, const float64 aDt)
Step algorithm.
Definition dbpp_NujicIntegrator.cpp:20
StateVector m_prevState
Definition dbpp_NujicIntegrator.h:239
void predictor(dbpp::SweRhsData< float64, std::valarray< float64 > > &&aRhs, float64 aDt)
predictor algorithm
Definition dbpp_NujicIntegrator.cpp:232
std::pair< std::valarray< float64 >, std::valarray< float64 > > slnpairvarray
Alias (pair of numerical array fast floating)
Definition dbpp_NujicIntegrator.h:28
std::pair< std::vector< float64 >, std::vector< float64 > > slnpairvector
Alias (pair of vector)
Definition dbpp_NujicIntegrator.h:32
StateVector getCurrentState() const
Getter.
Definition dbpp_NujicIntegrator.h:122
float64 m_step
Definition dbpp_NujicIntegrator.h:233
std::pair< float64, float64 > m_leftBCValues
Definition dbpp_NujicIntegrator.h:235
float64 getStep() const noexcept
Getter.
Definition dbpp_NujicIntegrator.h:188
void setStep(float64 aStep) noexcept
Set time step.
Definition dbpp_NujicIntegrator.h:183
eIntegratorStep getIntegratorStep() const noexcept
Getter.
Definition dbpp_NujicIntegrator.h:204
NujicIntegrator()
Default ctor.
Definition dbpp_NujicIntegrator.cpp:313
std::size_t m_numOfGridPts
Definition dbpp_NujicIntegrator.h:232
void setPhysicalBoundaryCnd()
Not implemented.
Definition dbpp_NujicIntegrator.h:208
void setLeftNodeBCValues(const std::pair< float64, float64 > &aPairLeftBC)
Left node (far left computational domain)
Definition dbpp_NujicIntegrator.h:213
Abstract class. "Model" of the right-hand-side terms discretization. Hold discretization scheme or al...
Definition dbpp_SweRhsAlgorithm.h:28
Definition DamBreakProb.h:15
double float64
Definition dbpp_LDeltaOperator.h:12
Aggregate (must support operator[])
Definition dbpp_SweRhsData.hpp:17