10#include "nlohmann/json.hpp"
11#include "boost/math/tools/toms748_solve.hpp"
18namespace superancillary {
31double toms748(
const std::function<
double(
double)>& f,
double a,
double b,
double fa,
double fb,
unsigned int bits, std::size_t max_iter) {
32 using namespace boost::math::tools;
33 auto max_iter_ =
static_cast<boost::math::uintmax_t
>(max_iter);
34 auto [l, r] = toms748_solve(f, a, b, fa, fb, eps_tolerance<double>(bits), max_iter_);
42template <
typename ArrayType>
43std::vector<ChebyshevExpansion<ArrayType>> load_expansions(
const nlohmann::json& j,
const std::string& key) {
44 std::vector<ChebyshevExpansion<ArrayType>> buf;
45 for (
auto& block : j.at(key)) {
46 buf.emplace_back(block.at(
"xmin"), block.at(
"xmax"), block.at(
"coef"));
51template <
typename ArrayType>
52typename SuperAncillary<ArrayType>::LoadedData parse_loaded(
const std::string& s) {
54 typename SuperAncillary<ArrayType>::LoadedData d;
55 d.rhoL = load_expansions<ArrayType>(j,
"jexpansions_rhoL");
56 d.rhoV = load_expansions<ArrayType>(j,
"jexpansions_rhoV");
57 d.p = load_expansions<ArrayType>(j,
"jexpansions_p");
58 d.Tcrit_num = j.at(
"meta").at(
"Tcrittrue / K");
59 d.rhocrit_num = j.at(
"meta").at(
"rhocrittrue / mol/m^3");
60 if (j.contains(
"check_points")) {
61 for (
const auto& pt : j.at(
"check_points")) {
62 d.check_points.push_back({pt.at(
"T / K").get<double>(), pt.at(
"p(mp) / Pa").get<
double>(), pt.at(
"rho'(mp) / mol/m^3").get<
double>(),
63 pt.at(
"rho''(mp) / mol/m^3").get<
double>(), pt.at(
"p(SA)/p(mp)").get<
double>(),
64 pt.at(
"rho'(SA)/rho'(mp)").get<
double>(), pt.at(
"rho''(SA)/rho''(mp)").get<
double>()});
72template <
typename ArrayType>