1#ifndef COOLPROP_SVD_SVD_EVALUATOR_H
2#define COOLPROP_SVD_SVD_EVALUATOR_H
92 const auto nx =
static_cast<std::size_t
>(decomp.
NX);
93 const auto ny =
static_cast<std::size_t
>(decomp.
NY);
94 const auto r =
static_cast<std::size_t
>(decomp.
rank);
95 if (decomp.
NX < 2 || decomp.
NY < 2 || decomp.
rank <= 0 || decomp.
x_grid.size() != nx || decomp.
y_grid.size() != ny
96 || decomp.
U.size() != nx * r || decomp.
dU_dx.size() != nx * r || decomp.
V_S.size() != ny * r || decomp.
dV_S_dy.size() != ny * r) {
97 throw std::invalid_argument(
"SVDEvaluator: SVDDecomposition has inconsistent dimensions");
105 for (std::size_t i = 1; i < nx; ++i) {
107 throw std::invalid_argument(
"SVDEvaluator: x_grid must be strictly increasing");
110 for (std::size_t j = 1; j < ny; ++j) {
112 throw std::invalid_argument(
"SVDEvaluator: y_grid must be strictly increasing");
129 : throw std::invalid_argument(
130 "SVDEvaluator: shared_ptr<SVDDecomposition> must not be null"))
132 owned_ = std::move(decomp);
160 const auto r =
static_cast<std::size_t
>(d.
rank);
162 const double* U0 = d.
U.data() + c.i * r;
163 const double* U1 = d.
U.data() + (c.i + 1) * r;
164 const double* dU0 = d.
dU_dx.data() + c.i * r;
165 const double* dU1 = d.
dU_dx.data() + (c.i + 1) * r;
166 const double* V0 = d.
V_S.data() + c.j * r;
167 const double* V1 = d.
V_S.data() + (c.j + 1) * r;
168 const double* dV0 = d.
dV_S_dy.data() + c.j * r;
169 const double* dV1 = d.
dV_S_dy.data() + (c.j + 1) * r;
171 const double bx10_hx = c.bx.h10 * c.hx;
172 const double bx11_hx = c.bx.h11 * c.hx;
173 const double by10_hy = c.by.h10 * c.hy;
174 const double by11_hy = c.by.h11 * c.hy;
177 for (std::size_t k = 0; k < r; ++k) {
178 const double u_k = c.bx.h00 * U0[k] + bx10_hx * dU0[k] + c.bx.h01 * U1[k] + bx11_hx * dU1[k];
179 const double v_k = c.by.h00 * V0[k] + by10_hy * dV0[k] + c.by.h01 * V1[k] + by11_hy * dV1[k];
191 [[nodiscard]]
inline double eval(
double x,
double y)
const noexcept {
201 [[nodiscard]]
static inline std::size_t locate(
const std::vector<double>& g,
double x)
noexcept {
202 const std::size_t n = g.size();
203 if (x <= g.front()) {
210 std::size_t hi = n - 1;
211 while (hi - lo > 1) {
212 const std::size_t mid = (lo + hi) / 2;
222 const SVDDecomposition* d_;
226 std::shared_ptr<const SVDDecomposition> owned_;