11 const double NaN = std::numeric_limits<double>::quiet_NaN();
28 const std::map<CoolProp::parameters, std::map<int, IsolineSupported>>
xy_switch = {
29 {
CoolProp::iDmass, {{
TS,
Flipped}, {
PH,
Flipped}, {
HS,
Yes }, {
PS,
Flipped}, {
PD,
No }, {
TD,
No }, {
PT,
Yes }}},
30 {
CoolProp::iHmass, {{
TS,
Yes }, {
PH,
No }, {
HS,
No }, {
PS,
Flipped}, {
PD,
Flipped}, {
TD,
Yes }, {
PT,
Yes }}},
31 {
CoolProp::iP, {{
TS,
Yes }, {
PH,
No }, {
HS,
Yes }, {
PS,
No }, {
PD,
No }, {
TD,
Yes }, {
PT,
No }}},
32 {
CoolProp::iSmass, {{
TS,
No }, {
PH,
Flipped}, {
HS,
No }, {
PS,
No }, {
PD,
Flipped}, {
TD,
Yes }, {
PT,
Flipped}}},
33 {
CoolProp::iT, {{
TS,
No }, {
PH,
Flipped}, {
HS,
Yes }, {
PS,
Yes }, {
PD,
Yes }, {
TD,
No }, {
PT,
No }}},
34 {
CoolProp::iQ, {{
TS,
Flipped}, {
PH,
Flipped}, {
HS,
Flipped}, {
PS,
Flipped}, {
PD,
Flipped}, {
TD,
Flipped}, {
PT,
Yes }}}
54 std::vector<double> fractions;
60 std::shared_ptr<CoolProp::AbstractState>
get_critical_point(
const std::shared_ptr<CoolProp::AbstractState>& state) {
68 crit_state.
T = state->T_critical();
69 crit_state.
p = state->p_critical();
70 crit_state.
rhomolar = state->rhomolar_critical();
75 if (crit_state_tmp.stable && (crit_state_tmp.T > crit_state.
T || !std::isfinite(crit_state.
T))) {
76 crit_state.
T = crit_state_tmp.T;
77 crit_state.
p = crit_state_tmp.p;
78 crit_state.
rhomolar = crit_state_tmp.rhomolar;
79 crit_state.
stable = crit_state_tmp.stable;
88 std::vector<double> masses = state->get_mass_fractions();
89 if (masses.size() > 1)
90 new_state->set_mass_fractions(masses);
92 if (std::isfinite(crit_state.
p) && std::isfinite(crit_state.
T)) {
104 if (std::isfinite(crit_state.
rhomolar) && std::isfinite(crit_state.
T)) {
145 double t_small = critical_state_->keyed_output(
CoolProp::iT) * s;
146 double p_small = critical_state_->keyed_output(
CoolProp::iP) * s;
164 void Isoline::calc_sat_range(
int count) {
166 std::vector<double> two =
::linspace(t.min, t.max, count);
167 std::vector<double> one(two.size(), value);
170 double t_crit = critical_state_->keyed_output(
CoolProp::iT);
171 double p_crit = critical_state_->keyed_output(
CoolProp::iP);
172 double x_crit = critical_state_->keyed_output(xkey_);
173 double y_crit = critical_state_->keyed_output(ykey_);
174 x.resize(one.size());
175 y.resize(one.size());
176 for (
int i = 0; i < one.size(); ++i) {
178 state_->update(input_pair, one[i], two[i]);
179 x[i] = state_->keyed_output(xkey_);
180 y[i] = state_->keyed_output(ykey_);
186 std::cerr <<
"ERROR near critical inputs" << std::endl;
190 std::cerr <<
"ERROR" << std::endl;
196 void Isoline::update_pair(
int& ipos,
int& xpos,
int& ypos,
int& pair) {
206 bool should_swap = (out1 != 0.0);
229 void Isoline::calc_range(std::vector<double>& xvals, std::vector<double>& yvals) {
231 calc_sat_range(xvals.size());
233 int ipos, xpos, ypos, pair;
234 update_pair(ipos, xpos, ypos, pair);
236 std::vector<double> ivals(xvals.size(), value);
237 std::vector<int> order = {ipos, xpos, ypos};
238 std::vector<CoolProp::parameters> idxs(3);
242 std::vector<std::vector<double>> vals(3);
247 for (
int i = 0; i < vals[2].size(); ++i) {
250 vals[2][i] = state_->keyed_output(idxs[2]);
256 for (
int i = 0; i < idxs.size(); ++i) {
257 if (idxs[i] == xkey_) x = vals[i];
258 if (idxs[i] == ykey_) y = vals[i];
277 swap_axis_inputs_for_update_ = (out1 == 1);
279 const double HI_FACTOR = 2.25;
280 const double LO_FACTOR = 1.01;
283 case TPLimits::Def: this->Tp_limits_ = {{LO_FACTOR, HI_FACTOR}, {LO_FACTOR, HI_FACTOR}};
break;
284 case TPLimits::Achp: this->Tp_limits_ = {{173.15, 493.15}, {0.25e5, HI_FACTOR}};
break;
285 case TPLimits::Orc: this->Tp_limits_ = {{273.15, 673.15}, {0.25e5, HI_FACTOR}};
break;
288 Range2D ranges = get_axis_limits();
305 for (
double val : values) {
306 Isoline line(key, xkey_, ykey_, val, state_);
307 line.calc_range(xvals, yvals);
308 lines.push_back(line);
315 std::vector<CoolProp::parameters> keys;
317 const std::map<int, Detail::IsolineSupported>& supported = it->second;
318 auto supported_xy = supported.find(ykey_ * 10 + xkey_);
320 keys.push_back(it->first);
326 if (key == xkey_)
return xvalue;
327 if (key == ykey_)
return yvalue;
330 if (swap_axis_inputs_for_update_)
331 std::swap(xvalue, yvalue);
332 state_->specify_phase(phase);
333 state_->update(axis_pair_, xvalue, yvalue);
351 double t_small = critical_state_->keyed_output(
CoolProp::iT) * s;
352 double p_small = critical_state_->keyed_output(
CoolProp::iP) * s;
370 PropertyPlot::Range2D PropertyPlot::get_Tp_limits()
const {
371 Range t = Tp_limits_.T;
372 Range p = Tp_limits_.p;
376 const double ID_FACTOR = 10.0;
377 if (std::isnan(t.min)) t.min = 0.0;
378 else if (t.min < ID_FACTOR) t.min *= tsat.min;
379 if (std::isnan(t.max)) t.max = 1e6;
380 else if (t.max < ID_FACTOR) t.max *= tsat.max;
381 if (std::isnan(p.min)) p.min = 0.0;
382 else if (p.min < ID_FACTOR) p.min *= psat.min;
383 if (std::isnan(p.max)) p.max = 1e10;
384 else if (p.max < ID_FACTOR) p.max *= psat.max;
386 try { t.min = std::max(t.min, state_->trivial_keyed_output(
CoolProp::iT_min)); }
catch (...) {}
387 try { t.max = std::min(t.max, state_->trivial_keyed_output(
CoolProp::iT_max)); }
catch (...) {}
388 try { p.min = std::max(p.min, state_->trivial_keyed_output(
CoolProp::iP_min)); }
catch (...) {}
389 try { p.max = std::min(p.max, state_->trivial_keyed_output(
CoolProp::iP_max)); }
catch (...) {}
397 if (xkey != this->xkey_ || ykey != this->ykey_ || autoscale) {
398 Range2D tp_limits = get_Tp_limits();
399 Range xrange = {std::numeric_limits<double>::max(), std::numeric_limits<double>::lowest()};
400 Range yrange = {std::numeric_limits<double>::max(), std::numeric_limits<double>::lowest()};
402 for (
double T : {tp_limits.T.min, tp_limits.T.max}) {
403 for (
double p : {tp_limits.p.min, tp_limits.p.max}) {
406 double x = state_->keyed_output(xkey);
407 double y = state_->keyed_output(ykey);
408 xrange.min = std::min(xrange.min, x);
409 xrange.max = std::max(xrange.max, x);
410 yrange.min = std::min(yrange.min, y);
411 yrange.max = std::max(yrange.max, y);
415 return {xrange, yrange};
426 # include <catch2/catch_all.hpp>
427 # include <catch2/matchers/catch_matchers_floating_point.hpp>
429 using Catch::Matchers::WithinAbs;
430 using Catch::Matchers::WithinRel;
432 TEST_CASE(
"Check value_at for p-h plots",
"[Plot]") {
435 CHECK_THAT(plot.value_at(
CoolProp::iP, 300000, 200000), WithinAbs(200000, 1e-10));
436 CHECK_THAT(plot.value_at(
CoolProp::iHmass, 300000, 200000), WithinAbs(300000, 1e-10));
437 CHECK_THAT(plot.value_at(
CoolProp::iT, 300000, 200000), WithinAbs(263.07372753976694, 1e-10));
438 CHECK_THAT(plot.value_at(
CoolProp::iQ, 300000, 200000), WithinAbs(0.55044347874344737, 1e-10));
441 TEST_CASE(
"Check that the isolines are the same as from Python",
"[Plot]") {
443 const int isoline_count = 5;
444 const int points_per_isoline = 5;
451 CHECK_THAT(plot.xaxis.min, WithinAbs(75373.1, 1));
452 CHECK_THAT(plot.xaxis.max, WithinAbs(577605, 1));
453 CHECK_THAT(plot.yaxis.min, WithinAbs(25000, 1));
454 CHECK_THAT(plot.yaxis.max, WithinAbs(9.133e6, 1));
456 std::vector<CoolProp::parameters> iso_types = plot.supported_isoline_keys();
457 REQUIRE(iso_types.size() == 4);
468 REQUIRE(q_isolines.size() == isoline_count);
469 CHECK_THAT(q_isolines[0].value, WithinAbs(0.0, 1e-10));
470 CHECK_THAT(q_isolines[1].value, WithinAbs(0.25, 1e-10));
471 CHECK_THAT(q_isolines[2].value, WithinAbs(0.5, 1e-10));
472 CHECK_THAT(q_isolines[3].value, WithinAbs(0.75, 1e-10));
473 CHECK_THAT(q_isolines[4].value, WithinAbs(1.0, 1e-10));
474 const double expected_x[isoline_count][points_per_isoline] = {
475 {71455.08256999, 132939.99472497, 198497.0525314, 271576.58908888, 389440.73899019},
476 {137326.83116781, 191267.05172013, 248359.90642508, 309538.95484829, 389511.40516519},
477 {203198.57976564, 249594.1087153, 298222.76031877, 347501.3206077, 389582.0713402},
478 {269070.32836347, 307921.16571046, 348085.61421246, 385463.68636711, 389652.73751521},
479 {334942.07696129, 366248.22270562, 397948.46810615, 423426.05212652, 389723.40369022}
481 const double expected_y[isoline_count][points_per_isoline] = {
482 {3.89567060e+02, 2.58505756e+04, 2.81105747e+05, 1.31691170e+06, 4.05910826e+06},
483 {3.89567060e+02, 2.58505756e+04, 2.81105747e+05, 1.31691170e+06, 4.05910826e+06},
484 {3.89567060e+02, 2.58505756e+04, 2.81105747e+05, 1.31691170e+06, 4.05910826e+06},
485 {3.89567060e+02, 2.58505756e+04, 2.81105747e+05, 1.31691170e+06, 4.05910826e+06},
486 {3.89567060e+02, 2.58505756e+04, 2.81105747e+05, 1.31691170e+06, 4.05910826e+06}
488 for (
int i = 0; i < q_isolines.size(); ++i) {
489 REQUIRE(q_isolines[i].size() == points_per_isoline);
490 for (
int j = 0; j < q_isolines[i].size(); ++j) {
491 CHECK_THAT(q_isolines[i].x[j], WithinRel(expected_x[i][j], 1e-8));
492 CHECK_THAT(q_isolines[i].y[j], WithinRel(expected_y[i][j], 1e-8));
501 REQUIRE(t_isolines.size() == isoline_count);
502 CHECK_THAT(t_isolines[0].value, WithinAbs(173.15, 1e-10));
503 CHECK_THAT(t_isolines[1].value, WithinAbs(243.6125, 1e-10));
504 CHECK_THAT(t_isolines[2].value, WithinAbs(314.075, 1e-10));
505 CHECK_THAT(t_isolines[3].value, WithinAbs(384.5375, 1e-10));
506 CHECK_THAT(t_isolines[4].value, WithinAbs(455.0, 1e-10));
507 const double expected_x[isoline_count][points_per_isoline] = {
508 {75373.12689908, 75410.99061368, 75576.57734102, 76301.46320034, 79487.71936123},
509 {382785.23058756, 161389.44197265, 161516.21527543, 162076.96181603, 164636.92352411},
510 {439466.64984328, 438148.19040202, 431912.24266074, 257605.32897193, 257512.80690587},
511 {504550.62606561, 503783.53950874, 500331.68636519, 482707.98489058, 366959.25257106},
512 {577604.59497521, 577097.07174302, 574850.21206939, 564444.22079795, 507878.75380996}
514 const double expected_y[isoline_count][points_per_isoline] = {
515 {25000.0, 109297.03270763, 477833.65434772, 2089032.02192197, 9133000.04909175},
516 {25000.0, 109297.03270763, 477833.65434772, 2089032.02192197, 9133000.04909175},
517 {25000.0, 109297.03270763, 477833.65434772, 2089032.02192197, 9133000.04909175},
518 {25000.0, 109297.03270763, 477833.65434772, 2089032.02192197, 9133000.04909175},
519 {25000.0, 109297.03270763, 477833.65434772, 2089032.02192197, 9133000.04909175}
521 for (
int i = 0; i < t_isolines.size(); ++i) {
522 REQUIRE(t_isolines[i].size() == points_per_isoline);
523 for (
int j = 0; j < t_isolines[i].size(); ++j) {
524 CHECK_THAT(t_isolines[i].x[j], WithinRel(expected_x[i][j], 1e-8));
525 CHECK_THAT(t_isolines[i].y[j], WithinRel(expected_y[i][j], 1e-8));
534 REQUIRE(s_isolines.size() == isoline_count);
535 CHECK_THAT(s_isolines[0].value, WithinAbs(426.0098553415565, 1e-10));
536 CHECK_THAT(s_isolines[1].value, WithinAbs(925.2753143522199, 1e-10));
537 CHECK_THAT(s_isolines[2].value, WithinAbs(1424.540773362883, 1e-10));
538 CHECK_THAT(s_isolines[3].value, WithinAbs(1923.8062323735467, 1e-10));
539 CHECK_THAT(s_isolines[4].value, WithinAbs(2423.07169138421, 1e-10));
540 const double expected_x[isoline_count][points_per_isoline] = {
541 {73758.20064883, 73811.34928194, 74043.68191583, 75058.90103546, 79487.71936135},
542 {176257.41124603, 179794.86552304, 180290.38376303, 181487.99233203, 186690.75978367},
543 {286286.21675221, 303984.6485323, 321692.18498473, 335551.56116185, 344087.52152244},
544 {399372.58517377, 433400.13264058, 471964.37092222, 513835.0906295, 555823.55477128},
545 {577604.59497522, 635257.81956317, 698998.52697158, 768744.13132575, std::nan(
"")}
547 const double expected_y[isoline_count][points_per_isoline] = {
548 {25000.0, 109297.03270763, 477833.65434772, 2089032.02192197, 9133000.04909175},
549 {25000.0, 109297.03270763, 477833.65434772, 2089032.02192197, 9133000.04909175},
550 {25000.0, 109297.03270763, 477833.65434772, 2089032.02192197, 9133000.04909175},
551 {25000.0, 109297.03270763, 477833.65434772, 2089032.02192197, 9133000.04909175},
552 {25000.0, 109297.03270763, 477833.65434772, 2089032.02192197, 9133000.04909175}
554 for (
int i = 0; i < s_isolines.size(); ++i) {
555 REQUIRE(s_isolines[i].size() == points_per_isoline);
556 for (
int j = 0; j < s_isolines[i].size(); ++j) {
557 if (std::isnan(s_isolines[i].x[j]))
558 CHECK(std::isnan(expected_x[i][j]));
560 CHECK_THAT(s_isolines[i].x[j], WithinRel(expected_x[i][j], 1e-8));
561 CHECK_THAT(s_isolines[i].y[j], WithinRel(expected_y[i][j], 1e-8));
570 REQUIRE(d_isolines.size() == isoline_count);
571 CHECK_THAT(d_isolines[0].value, WithinAbs(0.6749779869915704, 1e-10));
572 CHECK_THAT(d_isolines[1].value, WithinAbs(4.704765330619733, 1e-10));
573 CHECK_THAT(d_isolines[2].value, WithinAbs(32.793390662794806, 1e-10));
574 CHECK_THAT(d_isolines[3].value, WithinAbs(228.57813208316188, 1e-10));
575 CHECK_THAT(d_isolines[4].value, WithinAbs(1593.2467308391022, 1e-10));
576 const double expected_x[isoline_count][points_per_isoline] = {
577 {5.77604595e+05, 3.65397965e+06, 3.84283606e+07, 4.40954815e+08, 5.22494051e+09},
578 {2.02365849e+05, 4.19227802e+05, 1.84512838e+06, 1.78590373e+07, 2.01674048e+08},
579 {1.42114492e+05, 2.04387395e+05, 3.51213643e+05, 1.00846111e+06, 8.12669299e+06},
580 {1.33470419e+05, 1.72415441e+05, 2.35381904e+05, 3.57488786e+05, 6.69475618e+05},
581 {7.05185202e+04, 7.06013993e+04, 7.09637630e+04, 7.25484894e+04, 7.94877194e+04}
583 const double expected_y[isoline_count][points_per_isoline] = {
584 {25000.0, 109297.03270763, 477833.65434772, 2089032.02192197, 9133000.04909175},
585 {25000.0, 109297.03270763, 477833.65434772, 2089032.02192197, 9133000.04909175},
586 {25000.0, 109297.03270763, 477833.65434772, 2089032.02192197, 9133000.04909175},
587 {25000.0, 109297.03270763, 477833.65434772, 2089032.02192197, 9133000.04909175},
588 {25000.0, 109297.03270763, 477833.65434772, 2089032.02192197, 9133000.04909175}
590 for (
int i = 0; i < d_isolines.size(); ++i) {
591 REQUIRE(d_isolines[i].size() == points_per_isoline);
592 for (
int j = 0; j < d_isolines[i].size(); ++j) {
593 CHECK_THAT(d_isolines[i].x[j], WithinRel(expected_x[i][j], 1e-8));
594 CHECK_THAT(d_isolines[i].y[j], WithinRel(expected_y[i][j], 1e-8));
600 TEST_CASE(
"Basic TS Plot has same output as Python",
"[Plot]") {
602 const int isoline_count = 5;
603 const int points_per_isoline = 5;
610 CHECK_THAT(plot.xaxis.min, WithinAbs(426, 1));
611 CHECK_THAT(plot.xaxis.max, WithinAbs(2423, 1));
612 CHECK_THAT(plot.yaxis.min, WithinAbs(173, 1));
613 CHECK_THAT(plot.yaxis.max, WithinAbs(455, 1));
615 std::vector<CoolProp::parameters> iso_types = plot.supported_isoline_keys();
616 REQUIRE(iso_types.size() == 4);
627 REQUIRE(q_isolines.size() == isoline_count);
628 CHECK_THAT(q_isolines[0].value, WithinAbs(0.0, 1e-10));
629 CHECK_THAT(q_isolines[1].value, WithinAbs(0.25, 1e-10));
630 CHECK_THAT(q_isolines[2].value, WithinAbs(0.5, 1e-10));
631 CHECK_THAT(q_isolines[3].value, WithinAbs(0.75, 1e-10));
632 CHECK_THAT(q_isolines[4].value, WithinAbs(1.0, 1e-10));
634 const double expected_x[isoline_count][points_per_isoline] = {
635 {412.61753823, 728.71208313, 994.51958846, 1237.3122956, 1561.56967158},
636 {800.44043827, 992.70703491, 1177.81867482, 1354.79919476, 1561.75851162},
637 {1188.26333832, 1256.70198669, 1361.11776119, 1472.28609393, 1561.94735166},
638 {1576.08623836, 1520.69693847, 1544.41684755, 1589.77299309, 1562.1361917},
639 {1963.9091384, 1784.69189025, 1727.71593392, 1707.25989226, 1562.32503174}
641 const double expected_y[isoline_count][points_per_isoline] = {
642 {169.85007484, 220.94004678, 272.03001871, 323.11999064, 374.20996258},
643 {169.85007484, 220.94004678, 272.03001871, 323.11999064, 374.20996258},
644 {169.85007484, 220.94004678, 272.03001871, 323.11999064, 374.20996258},
645 {169.85007484, 220.94004678, 272.03001871, 323.11999064, 374.20996258},
646 {169.85007484, 220.94004678, 272.03001871, 323.11999064, 374.20996258}
649 for(
int i = 0; i < q_isolines.size(); i++) {
650 REQUIRE(q_isolines[i].size() == points_per_isoline);
651 for(
int j = 0; j < q_isolines[i].size(); j++) {
652 CHECK_THAT(q_isolines[i].x[j], WithinRel(expected_x[i][j], 1e-8));
653 CHECK_THAT(q_isolines[i].y[j], WithinRel(expected_y[i][j], 1e-8));
662 REQUIRE(p_isolines.size() == isoline_count);
663 CHECK_THAT(p_isolines[0].value, WithinAbs(25000.000000000007, 1e-8));
664 CHECK_THAT(p_isolines[1].value, WithinAbs(109297.03270763098, 1e-8));
665 CHECK_THAT(p_isolines[2].value, WithinAbs(477833.65434771683, 1e-8));
666 CHECK_THAT(p_isolines[3].value, WithinAbs(2089032.0219219688, 1e-8));
667 CHECK_THAT(p_isolines[4].value, WithinAbs(9133000.049091753, 1e-8));
669 const double expected_x[isoline_count][points_per_isoline] = {
670 {426.00985534, 925.27531435, 1424.54077336, 1923.80623237, 2423.07169138},
671 {426.00985534, 925.27531435, 1424.54077336, 1923.80623237, 2423.07169138},
672 {426.00985534, 925.27531435, 1424.54077336, 1923.80623237, 2423.07169138},
673 {426.00985534, 925.27531435, 1424.54077336, 1923.80623237, 2423.07169138},
674 {426.00985534, 925.27531435, 1424.54077336, 1923.80623237, 2423.07169138}
676 const double expected_y[isoline_count][points_per_isoline] = {
677 {171.78612656, 220.38136931, 220.38136931, 265.36250878, 455.0},
678 {171.7989644, 248.7449928, 248.7449928, 308.63364605, 506.38739121},
679 {171.85504128, 258.19575097, 287.47240852, 355.96420961, 560.29233808},
680 {172.09927987, 258.74250558, 342.56046108, 411.32270988, 618.0350615},
681 {173.15, 261.02100275, 371.32673696, 484.42563591, std::nan(
"")}
684 for(
int i = 0; i < p_isolines.size(); i++) {
685 REQUIRE(p_isolines[i].size() == points_per_isoline);
686 for(
int j = 0; j < p_isolines[i].size(); j++) {
687 if (std::isnan(expected_y[i][j])) {
688 CHECK(std::isnan(p_isolines[i].y[j]));
690 CHECK_THAT(p_isolines[i].x[j], WithinRel(expected_x[i][j], 1e-8));
691 CHECK_THAT(p_isolines[i].y[j], WithinRel(expected_y[i][j], 1e-8));
701 REQUIRE(h_isolines.size() == isoline_count);
702 CHECK_THAT(h_isolines[0].value, WithinAbs(75373.12689908482, 1e-10));
703 CHECK_THAT(h_isolines[1].value, WithinAbs(200930.99391811725, 1e-10));
704 CHECK_THAT(h_isolines[2].value, WithinAbs(326488.8609371497, 1e-10));
705 CHECK_THAT(h_isolines[3].value, WithinAbs(452046.72795618215, 1e-10));
706 CHECK_THAT(h_isolines[4].value, WithinAbs(577604.5949752146, 1e-10));
708 const double expected_x[isoline_count][points_per_isoline] = {
709 {426.00985534, 925.27531435, 1424.54077336, 1923.80623237, 2423.07169138},
710 {426.00985534, 925.27531435, 1424.54077336, 1923.80623237, 2423.07169138},
711 {426.00985534, 925.27531435, 1424.54077336, 1923.80623237, 2423.07169138},
712 {426.00985534, 925.27531435, 1424.54077336, 1923.80623237, 2423.07169138},
713 {426.00985534, 925.27531435, 1424.54077336, 1923.80623237, 2423.07169138}
715 const double expected_y[isoline_count][points_per_isoline] = {
716 {172.17461409, std::nan(
""), std::nan(
""), std::nan(
""), std::nan(
"")},
717 {196.07460266, 266.63119128, std::nan(
""), std::nan(
""), std::nan(
"")},
718 {213.66474036, 299.9847036, 301.72638717, std::nan(
""), std::nan(
"")},
719 {228.4112647, 322.84362137, 426.78791645, 331.52116588, 328.04216753},
720 {241.56832462, 341.66140042, 458.59389239, std::nan(
""), 455.0}
723 for(
int i = 0; i < h_isolines.size(); i++) {
724 REQUIRE(h_isolines[i].size() == points_per_isoline);
725 for(
int j = 0; j < h_isolines[i].size(); j++) {
726 if (std::isnan(expected_y[i][j])) {
727 CHECK(std::isnan(h_isolines[i].y[j]));
729 CHECK_THAT(h_isolines[i].x[j], WithinRel(expected_x[i][j], 1e-8));
730 CHECK_THAT(h_isolines[i].y[j], WithinRel(expected_y[i][j], 1e-8));
740 REQUIRE(d_isolines.size() == isoline_count);
741 CHECK_THAT(d_isolines[0].value, WithinAbs(0.6749779869915704, 1e-10));
742 CHECK_THAT(d_isolines[1].value, WithinAbs(4.704765330619733, 1e-10));
743 CHECK_THAT(d_isolines[2].value, WithinAbs(32.793390662794806, 1e-10));
744 CHECK_THAT(d_isolines[3].value, WithinAbs(228.57813208316188, 1e-10));
745 CHECK_THAT(d_isolines[4].value, WithinAbs(1593.2467308391022, 1e-10));
747 const double expected_x[isoline_count][points_per_isoline] = {
748 {524.17387831, 1911.09303198, 2092.95299736, 2262.71394473, 2423.07169138},
749 {448.10309047, 1715.11962047, 1932.46628376, 2103.15612883, 2263.90954344},
750 {437.18945214, 972.48976631, 1758.36242394, 1935.75229847, 2099.20644384},
751 {435.62370654, 865.94698069, 1292.02342121, 1720.27748872, 1899.3816054},
752 {426.00985534, 710.87738683, 946.96900373, 1151.9181105, 1335.56535146}
754 const double expected_y[isoline_count][points_per_isoline] = {
755 {173.15, 243.6125, 314.075, 384.5375, 455.0},
756 {173.15, 243.6125, 314.075, 384.5375, 455.0},
757 {173.15, 243.6125, 314.075, 384.5375, 455.0},
758 {173.15, 243.6125, 314.075, 384.5375, 455.0},
759 {173.15, 243.6125, 314.075, 384.5375, 455.0}
762 for(
int i = 0; i < d_isolines.size(); i++) {
763 REQUIRE(d_isolines[i].size() == points_per_isoline);
764 for(
int j = 0; j < d_isolines[i].size(); j++) {
765 CHECK_THAT(d_isolines[i].x[j], WithinRel(expected_x[i][j], 1e-8));
766 CHECK_THAT(d_isolines[i].y[j], WithinRel(expected_y[i][j], 1e-8));