12#ifndef CD_LookupTableImplem_H
13#define CD_LookupTableImplem_H
24#include <CD_NamespaceHeader.H>
26template <
typename T,
size_t N,
typename I>
32template <
typename T,
size_t N,
typename I>
37 m_grid =
std::make_tuple(LookupTable::Spacing::Uniform, 0, -1.0, -1.0, -1.0);
38 m_rangeStrategyLo = LookupTable::OutOfRangeStrategy::Constant;
39 m_rangeStrategyHi = LookupTable::OutOfRangeStrategy::Constant;
42 m_structuredData.clear();
45template <
typename T,
size_t N,
typename I>
46template <
typename...
Ts>
52 m_rawData.emplace_back(
arr);
55template <
typename T,
size_t N,
typename I>
59 m_rawData.emplace_back(
x);
62template <
typename T,
size_t N,
typename I>
66 for (
auto&
r : m_rawData) {
73 for (
auto&
r : m_structuredData) {
90template <
typename T,
size_t N,
typename I>
95 for (
auto&
r : m_rawData) {
99 for (
auto&
r : m_structuredData) {
108template <
typename T,
size_t N,
typename I>
114 for (
const auto&
xy : m_rawData) {
123template <
typename T,
size_t N,
typename I>
130template <
typename T,
size_t N,
typename I>
137template <
typename T,
size_t N,
typename I>
157 return X1[i] < X2[i];
171 case LookupTable::Spacing::Uniform: {
180 case LookupTable::Spacing::Exponential: {
181 if (
xmin <= std::numeric_limits<T>::min()) {
202 m_structuredData.clear();
207 while (
curRow < m_rawData.size() - 1) {
215 const auto t = (
x -
x1) / (
x2 -
x1);
219 for (
size_t i = 0;
i <=
N;
i++) {
223 m_structuredData.emplace_back(
interpRow);
237template <
typename T,
size_t N,
typename I>
244template <
typename T,
size_t N,
typename I>
248 return (m_structuredData);
251template <
typename T,
size_t N,
typename I>
258template <
typename T,
size_t N,
typename I>
262 return (m_structuredData);
265template <
typename T,
size_t N,
typename I>
269 this->writeToFile(
a_file, m_rawData);
272template <
typename T,
size_t N,
typename I>
276 this->writeToFile(
a_file, m_structuredData);
279template <
typename T,
size_t N,
typename I>
286template <
typename T,
size_t N,
typename I>
290 this->outputData(
a_ostream, m_structuredData);
293template <
typename T,
size_t N,
typename I>
299 for (
const auto& c :
r) {
306template <
typename T,
size_t N,
typename I>
325template <
typename T,
size_t N,
typename I>
336 case LookupTable::Spacing::Uniform: {
341 case LookupTable::Spacing::Exponential: {
347 throw std::runtime_error(
"LookupTable1D<T,N,I>::getIndexLo - logic bust (unsupported table spacing system)");
354template <
typename T,
size_t N,
typename I>
359 throw std::runtime_error(
"LookupTable1D<T, N, I>::interpolate(array) but need to call 'prepareTable first'");
369 switch (m_rangeStrategyLo) {
370 case LookupTable::OutOfRangeStrategy::Constant: {
371 ret = m_structuredData.front();
375 case LookupTable::OutOfRangeStrategy::Interpolate: {
379 ret = m_structuredData.front();
381 for (
size_t i = 0;
i <
N + 1;
i++) {
382 const T
slope = (m_structuredData[1][
i] - m_structuredData[0][
i]) /
diffDx;
390 throw std::runtime_error(
"LookupTable1D<T, N, I>::interpolate(array) unsupported range strategy at low end");
397 switch (m_rangeStrategyHi) {
398 case LookupTable::OutOfRangeStrategy::Constant: {
399 ret = m_structuredData.back();
403 case LookupTable::OutOfRangeStrategy::Interpolate: {
404 const size_t& size = m_structuredData.size();
406 const T
diffDx = m_structuredData[size - 1][
indVar] - m_structuredData[size - 2][
indVar];
409 ret = m_structuredData.back();
411 for (
size_t i = 0;
i <
N + 1;
i++) {
412 const T
slope = (m_structuredData[size - 1][
i] - m_structuredData[size - 2][
i]) /
diffDx;
420 throw std::runtime_error(
"LookupTable1D<T, N, I>::interpolate(array) unsupported range strategy at low end");
427 const size_t idx = this->getIndexLo(
a_x);
432 ret = m_structuredData[
idx];
434 for (
size_t i = 0;
i <
N + 1;
i++) {
444template <
typename T,
size_t N,
typename I>
452template <
typename T,
size_t N,
typename I>
453template <
size_t M,
typename...
Ts>
457 static_assert(
M <=
N,
"LookupTable1D<T, N,I>::slice must have have 'M <= N'");
463 for (
const auto&
r : m_rawData) {
466 for (
size_t i = 0;
i <
M + 1;
i++) {
476#include <CD_NamespaceFooter.H>
Declaration of a lookup table in one independent variable.
OutOfRangeStrategy
Strategy for obtaining data when requesting data that is out of range. We can use either constant (i....
Definition CD_LookupTable.H:32
Spacing
Enum for classifying the coordinate system.
Definition CD_LookupTable.H:41
std::vector< std::array< T, N+1 > > & getStructuredData() noexcept
Access function for structured data.
Definition CD_LookupTable1DImplem.H:246
T interpolate(const T &a_x) const
Interpolation function for specific dependent variable K.
Definition CD_LookupTable1DImplem.H:447
void addData(const Ts &... x) noexcept
Add entry.
Definition CD_LookupTable1DImplem.H:48
void setRangeStrategyLo(const LookupTable::OutOfRangeStrategy &a_strategy) noexcept
Set the out-of-range strategy on the low end.
Definition CD_LookupTable1DImplem.H:125
size_t getIndexLo(const T &a_x) const
Get the lower index that brackets the input variable between two data points in the structured grid.
Definition CD_LookupTable1DImplem.H:327
void swap(const size_t a_columnOne, const size_t a_columnTwo) noexcept
Utility function for swapping columns.
Definition CD_LookupTable1DImplem.H:64
void truncate(const T &a_min, const T &a_max, const size_t a_column) noexcept
Utility function for truncating raw data along one of the variables (either dependent or independent)...
Definition CD_LookupTable1DImplem.H:110
void setRangeStrategyHi(const LookupTable::OutOfRangeStrategy &a_strategy) noexcept
Set the out-of-range strategy on the high end.
Definition CD_LookupTable1DImplem.H:132
LookupTable1D() noexcept
Default constructor. Creates a table without any entries.
Definition CD_LookupTable1DImplem.H:27
void writeRawData(const std::string &a_file) const noexcept
Dump raw table data to file.
Definition CD_LookupTable1DImplem.H:267
void outputStructuredData(std::ostream &a_ostream=std::cout) const noexcept
Dump structured table data to file.
Definition CD_LookupTable1DImplem.H:288
void reset() noexcept
Reset everything.
Definition CD_LookupTable1DImplem.H:34
void outputRawData(std::ostream &a_ostream=std::cout) const noexcept
Dump raw table data to output stream.
Definition CD_LookupTable1DImplem.H:281
void prepareTable(const size_t &a_independentVariable, const size_t &a_numPoints, const LookupTable::Spacing &a_spacing)
Turn the raw data into uniform data for fast lookup.
Definition CD_LookupTable1DImplem.H:139
void scale(const T &a_scale) noexcept
Utility function which scales one of the columns (either dependent or independent variable)
Definition CD_LookupTable1DImplem.H:93
void writeToFile(const std::string &a_file, const std::vector< std::array< T, N+1 > > &a_data) const noexcept
Utility function for outputting data to a file.
Definition CD_LookupTable1DImplem.H:308
void writeStructuredData(const std::string &a_file) const noexcept
Dump structured table data to file.
Definition CD_LookupTable1DImplem.H:274
LookupTable1D< T, M, I > slice(const Ts &... a_columns) const noexcept
Slice this table, keeping only the user-specified columns.
Definition CD_LookupTable1DImplem.H:455
void outputData(std::ostream &a_ostream, const std::vector< std::array< T, N+1 > > &a_data) const noexcept
Utility function for outputting data.
Definition CD_LookupTable1DImplem.H:295
std::vector< std::array< T, N+1 > > & getRawData() noexcept
Access function for raw data.
Definition CD_LookupTable1DImplem.H:239
Base class for a tracer particle solver. This solver can advance particles in a pre-defined velocity ...
Definition CD_TracerParticleSolver.H:37
TracerParticleSolver()
Default constructor.
Definition CD_TracerParticleSolverImplem.H:25