DamBreak++ Wave Simulator 0.3
DamBreak++ Simulation Framework
Loading...
Searching...
No Matches
dbpp_FluxTensor.h
Go to the documentation of this file.
1#pragma once
2
3// C++ 17 includes
4#include <optional>
5#include <ranges> //C++20
6#include <algorithm>
7// STL include
8#include <map>
9#include <valarray>
10// SfxBase19 include
11#include "include/Sfx_DefineTypes.h"
12// logger
14
15namespace dbpp
16{
21 {
22 short m_cellIdx;
29 std::pair<float64/*FF1*/, float64/*FF2*/> asFFPair() const
30 {
31 return std::make_pair(FF1, FF2);
32 }
33
37 bool isZeroValue() const { return (FF1 == 0. && FF2 == 0.); }
42 std::tuple<short, float64, float64> asFFTuple() const
43 {
44 return std::make_tuple(m_cellIdx, FF1, FF2);
45 }
46 };
47#if 1
52 {
56 using sizeMapType = std::map<short, FluxTensor>::size_type;
57
61 enum class eFFcomp {FF1,FF2};
62
63 std::map<short, FluxTensor> m_fluxTensorMap;
67 bool insert( FluxTensor&& aFlux2Insert)
68 {
69 if( auto [pos,succeed] = // need a refctoring
70 m_fluxTensorMap.try_emplace(aFlux2Insert.m_cellIdx, aFlux2Insert.m_cellIdx, aFlux2Insert.FF1, aFlux2Insert.FF2); !succeed)
71 {
72 Sfx::Logger::instance()->OutputError(std::string{ "Couldn't insert flux tensor at index {} already in" }.data());
73 return false;
74 }
75 return true;
76 }
77
82 std::vector<float64> asStdVector(const eFFcomp& aFFcomp) const
83 {
84 std::vector<float64> w_stdVec;
85 w_stdVec.reserve(m_fluxTensorMap.size());
86 for(const auto& mapElem : m_fluxTensorMap | std::views::values)
87 {
88 if (aFFcomp==eFFcomp::FF1)
89 {
90 w_stdVec.push_back(mapElem.FF1);
91 }
92 else
93 {
94 w_stdVec.push_back(mapElem.FF2);
95 }
96 }
97 return w_stdVec;
98 }
99
104 std::valarray<float64> asStdValArray(const eFFcomp& aFFcomp) const
105 {
106 std::valarray<float64> w_stdValAray(m_fluxTensorMap.size());
107 auto i = 0;
108 for (const auto& mapElem : m_fluxTensorMap | std::views::values)
109 {
110 if (aFFcomp == eFFcomp::FF1)
111 {
112 w_stdValAray[i++] = mapElem.FF1;
113 }
114 else
115 {
116 w_stdValAray[i++] = mapElem.FF2;
117 }
118 }
119 return w_stdValAray;
120 }
121
126 bool isNullValues(const eFFcomp& aFFcomp) const
127 {
128 // give return value a name to use it as an 'lvalue'
129 auto&& w_FF12 = asStdVector(aFFcomp);
130 // Calling 'find_if_not' for a temporary, you have to pass it as an 'lvalue'
131 auto pos = std::ranges::find_if_not(w_FF12, [](float64 aVal) { return aVal != 0.; });
132 static_assert(!std::is_same_v<std::ranges::dangling, decltype(pos)>); // sanity check
133 if( pos!=w_FF12.end())
134 {
135 return false;
136 }
137 return true;
138 }
139
144 bool hasNAN(const eFFcomp& aFFcomp) const
145 {
146 // give return value a name to use it as an 'lvalue'
147 auto&& w_FF12 = asStdVector(aFFcomp);
148 //
149 return std::ranges::any_of( w_FF12, [](float64 aNumber) { return std::isnan(aNumber); });
150 }
151
156 std::optional<FluxTensor> operator[] (short aIdx) const
157 {
158 if( auto pos = m_fluxTensorMap.find(aIdx); pos!=m_fluxTensorMap.end())
159 {
160 return std::optional<FluxTensor>{pos->second};
161 }
162 return std::nullopt;
163 }
164
168 sizeMapType size() const noexcept { return m_fluxTensorMap.size(); }
173 [[nodiscard]] bool isEmpty() const noexcept { return m_fluxTensorMap.empty(); }
177 void clear() noexcept
178 {
179 if (!m_fluxTensorMap.empty()) m_fluxTensorMap.clear();
180 }
181 };
182#endif
183} // End of namespace
Definition DamBreakProb.h:15
double float64
Definition dbpp_LDeltaOperator.h:12
Flux tensor field (aggregate initialization).
Definition dbpp_FluxTensor.h:21
std::pair< float64, float64 > asFFPair() const
pair of flux componengt
Definition dbpp_FluxTensor.h:29
std::tuple< short, float64, float64 > asFFTuple() const
C++17 structured binding.
Definition dbpp_FluxTensor.h:42
float64 FF1
Definition dbpp_FluxTensor.h:23
float64 FF2
Definition dbpp_FluxTensor.h:24
bool isZeroValue() const
check zero value
Definition dbpp_FluxTensor.h:37
short m_cellIdx
Definition dbpp_FluxTensor.h:22
Map cell face and flux values.
Definition dbpp_FluxTensor.h:52
eFFcomp
Flux component.
Definition dbpp_FluxTensor.h:61
@ FF2
Definition dbpp_FluxTensor.h:61
@ FF1
Definition dbpp_FluxTensor.h:61
std::map< short, FluxTensor >::size_type sizeMapType
alias
Definition dbpp_FluxTensor.h:56
bool insert(FluxTensor &&aFlux2Insert)
Add a flux tensor.
Definition dbpp_FluxTensor.h:67
sizeMapType size() const noexcept
number of element
Definition dbpp_FluxTensor.h:168
std::optional< FluxTensor > operator[](short aIdx) const
element accessor
Definition dbpp_FluxTensor.h:156
std::map< short, FluxTensor > m_fluxTensorMap
Definition dbpp_FluxTensor.h:63
bool isNullValues(const eFFcomp &aFFcomp) const
check for null values
Definition dbpp_FluxTensor.h:126
std::valarray< float64 > asStdValArray(const eFFcomp &aFFcomp) const
flux component as valarray
Definition dbpp_FluxTensor.h:104
bool isEmpty() const noexcept
check for emptiness
Definition dbpp_FluxTensor.h:173
std::vector< float64 > asStdVector(const eFFcomp &aFFcomp) const
flux component as vector
Definition dbpp_FluxTensor.h:82
void clear() noexcept
resize
Definition dbpp_FluxTensor.h:177
bool hasNAN(const eFFcomp &aFFcomp) const
check for nan values
Definition dbpp_FluxTensor.h:144