20 {
iT,
"T",
"IO",
"K",
"Temperature",
false},
21 {
iP,
"P",
"IO",
"Pa",
"Pressure",
false},
22 {
iDmolar,
"Dmolar",
"IO",
"mol/m^3",
"Molar density",
false},
23 {
iHmolar,
"Hmolar",
"IO",
"J/mol",
"Molar specific enthalpy",
false},
24 {
iSmolar,
"Smolar",
"IO",
"J/mol/K",
"Molar specific entropy",
false},
25 {
iUmolar,
"Umolar",
"IO",
"J/mol",
"Molar specific internal energy",
false},
26 {
iGmolar,
"Gmolar",
"O",
"J/mol",
"Molar specific Gibbs energy",
false},
27 {
iHelmholtzmolar,
"Helmholtzmolar",
"O",
"J/mol",
"Molar specific Helmholtz energy",
false},
28 {
iDmass,
"Dmass",
"IO",
"kg/m^3",
"Mass density",
false},
29 {
iHmass,
"Hmass",
"IO",
"J/kg",
"Mass specific enthalpy",
false},
30 {
iSmass,
"Smass",
"IO",
"J/kg/K",
"Mass specific entropy",
false},
31 {
iUmass,
"Umass",
"IO",
"J/kg",
"Mass specific internal energy",
false},
32 {
iGmass,
"Gmass",
"O",
"J/kg",
"Mass specific Gibbs energy",
false},
33 {
iHelmholtzmass,
"Helmholtzmass",
"O",
"J/kg",
"Mass specific Helmholtz energy",
false},
34 {
iQ,
"Q",
"IO",
"mol/mol",
"Molar vapor quality",
false},
35 {
iQmass,
"Qmass",
"IO",
"kg/kg",
"Mass-basis vapor quality",
false},
36 {
iDelta,
"Delta",
"IO",
"-",
"Reduced density (rho/rhoc)",
false},
37 {
iTau,
"Tau",
"IO",
"-",
"Reciprocal reduced temperature (Tc/T)",
false},
39 {
iCpmolar,
"Cpmolar",
"O",
"J/mol/K",
"Molar specific constant pressure specific heat",
false},
40 {
iCpmass,
"Cpmass",
"O",
"J/kg/K",
"Mass specific constant pressure specific heat",
false},
41 {
iCvmolar,
"Cvmolar",
"O",
"J/mol/K",
"Molar specific constant volume specific heat",
false},
42 {
iCvmass,
"Cvmass",
"O",
"J/kg/K",
"Mass specific constant volume specific heat",
false},
43 {
iCp0molar,
"Cp0molar",
"O",
"J/mol/K",
"Ideal gas molar specific constant pressure specific heat",
false},
44 {
iCp0mass,
"Cp0mass",
"O",
"J/kg/K",
"Ideal gas mass specific constant pressure specific heat",
false},
45 {
iHmolar_residual,
"Hmolar_residual",
"O",
"J/mol",
"Residual molar enthalpy",
false},
46 {
iSmolar_residual,
"Smolar_residual",
"O",
"J/mol/K",
"Residual molar entropy (sr/R = s(T,rho) - s^0(T,rho))",
false},
47 {
iGmolar_residual,
"Gmolar_residual",
"O",
"J/mol",
"Residual molar Gibbs energy",
false},
48 {
iHmolar_idealgas,
"Hmolar_idealgas",
"O",
"J/mol",
"Ideal gas molar enthalpy",
false},
49 {
iSmolar_idealgas,
"Smolar_idealgas",
"O",
"J/mol/K",
"Ideal gas molar entropy",
false},
50 {
iUmolar_idealgas,
"Umolar_idealgas",
"O",
"J/mol",
"Ideal gas molar internal energy",
false},
51 {
iHmass_idealgas,
"Hmass_idealgas",
"O",
"J/kg",
"Ideal gas specific enthalpy",
false},
52 {
iSmass_idealgas,
"Smass_idealgas",
"O",
"J/kg/K",
"Ideal gas specific entropy",
false},
53 {
iUmass_idealgas,
"Umass_idealgas",
"O",
"J/kg",
"Ideal gas specific internal energy",
false},
54 {
iGWP20,
"GWP20",
"O",
"-",
"20-year global warming potential",
true},
55 {
iGWP100,
"GWP100",
"O",
"-",
"100-year global warming potential",
true},
56 {
iGWP500,
"GWP500",
"O",
"-",
"500-year global warming potential",
true},
57 {
iFH,
"FH",
"O",
"-",
"Flammability hazard",
true},
58 {
iHH,
"HH",
"O",
"-",
"Health hazard",
true},
59 {
iPH,
"PH",
"O",
"-",
"Physical hazard",
true},
60 {
iODP,
"ODP",
"O",
"-",
"Ozone depletion potential",
true},
61 {
iBvirial,
"Bvirial",
"O",
"-",
"Second virial coefficient",
false},
62 {
iCvirial,
"Cvirial",
"O",
"-",
"Third virial coefficient",
false},
63 {
idBvirial_dT,
"dBvirial_dT",
"O",
"-",
"Derivative of second virial coefficient with respect to T",
false},
64 {
idCvirial_dT,
"dCvirial_dT",
"O",
"-",
"Derivative of third virial coefficient with respect to T",
false},
65 {
igas_constant,
"gas_constant",
"O",
"J/mol/K",
"Molar gas constant",
true},
66 {
imolar_mass,
"molar_mass",
"O",
"kg/mol",
"Molar mass",
true},
68 {
idipole_moment,
"dipole_moment",
"O",
"C-m",
"Dipole moment",
true},
69 {
irhomass_reducing,
"rhomass_reducing",
"O",
"kg/m^3",
"Mass density at reducing point",
true},
70 {
irhomolar_reducing,
"rhomolar_reducing",
"O",
"mol/m^3",
"Molar density at reducing point",
true},
71 {
irhomolar_critical,
"rhomolar_critical",
"O",
"mol/m^3",
"Molar density at critical point",
true},
72 {
irhomass_critical,
"rhomass_critical",
"O",
"kg/m^3",
"Mass density at critical point",
true},
73 {
iT_reducing,
"T_reducing",
"O",
"K",
"Temperature at the reducing point",
true},
74 {
iT_critical,
"T_critical",
"O",
"K",
"Temperature at the critical point",
true},
75 {
iT_triple,
"T_triple",
"O",
"K",
"Temperature at the triple point",
true},
76 {
iT_max,
"T_max",
"O",
"K",
"Maximum temperature limit",
true},
77 {
iT_min,
"T_min",
"O",
"K",
"Minimum temperature limit",
true},
78 {
iP_min,
"P_min",
"O",
"Pa",
"Minimum pressure limit",
true},
79 {
iP_max,
"P_max",
"O",
"Pa",
"Maximum pressure limit",
true},
80 {
iP_critical,
"p_critical",
"O",
"Pa",
"Pressure at the critical point",
true},
81 {
iP_reducing,
"p_reducing",
"O",
"Pa",
"Pressure at the reducing point",
true},
82 {
iP_triple,
"p_triple",
"O",
"Pa",
"Pressure at the triple point (pure only)",
true},
83 {
ifraction_min,
"fraction_min",
"O",
"-",
"Fraction (mole, mass, volume) minimum value for incompressible solutions",
true},
84 {
ifraction_max,
"fraction_max",
"O",
"-",
"Fraction (mole, mass, volume) maximum value for incompressible solutions",
true},
85 {
iT_freeze,
"T_freeze",
"O",
"K",
"Freezing temperature for incompressible solutions",
true},
87 {
ispeed_sound,
"speed_of_sound",
"O",
"m/s",
"Speed of sound",
false},
88 {
iviscosity,
"viscosity",
"O",
"Pa-s",
"Viscosity",
false},
89 {
iconductivity,
"conductivity",
"O",
"W/m/K",
"Thermal conductivity",
false},
91 {
iPrandtl,
"Prandtl",
"O",
"-",
"Prandtl number",
false},
96 {
iZ,
"Z",
"O",
"-",
"Compressibility factor",
false},
98 {
iPIP,
"PIP",
"O",
"-",
"Phase identification parameter",
false},
100 {
ialphar,
"alphar",
"O",
"-",
"Residual Helmholtz energy",
false},
101 {
idalphar_dtau_constdelta,
"dalphar_dtau_constdelta",
"O",
"-",
"Derivative of residual Helmholtz energy with tau",
false},
102 {
idalphar_ddelta_consttau,
"dalphar_ddelta_consttau",
"O",
"-",
"Derivative of residual Helmholtz energy with delta",
false},
104 {
ialpha0,
"alpha0",
"O",
"-",
"Ideal Helmholtz energy",
false},
105 {
idalpha0_dtau_constdelta,
"dalpha0_dtau_constdelta",
"O",
"-",
"Derivative of ideal Helmholtz energy with tau",
false},
106 {
idalpha0_ddelta_consttau,
"dalpha0_ddelta_consttau",
"O",
"-",
"Derivative of ideal Helmholtz energy with delta",
false},
107 {
id2alpha0_ddelta2_consttau,
"d2alpha0_ddelta2_consttau",
"O",
"-",
"Second derivative of ideal Helmholtz energy with delta",
false},
108 {
id3alpha0_ddelta3_consttau,
"d3alpha0_ddelta3_consttau",
"O",
"-",
"Third derivative of ideal Helmholtz energy with delta",
false},
110 {
iPhase,
"Phase",
"O",
"-",
"Phase index as a float",
false},
123 IO_map.emplace(el.key, el.IO);
126 index_map_insert(el.short_desc, el.key);
130 index_map_insert(
"D",
iDmass);
131 index_map_insert(
"H",
iHmass);
133 index_map_insert(
"S",
iSmass);
134 index_map_insert(
"U",
iUmass);
135 index_map_insert(
"C",
iCpmass);
136 index_map_insert(
"O",
iCvmass);
137 index_map_insert(
"G",
iGmass);
146 index_map_insert(
"Tmin",
iT_min);
147 index_map_insert(
"Tmax",
iT_max);
148 index_map_insert(
"pmax",
iP_max);
149 index_map_insert(
"pmin",
iP_min);
157 void index_map_insert(
const std::string& desc,
int key) {
173 auto it = parameter_information.trivial_map.find(key);
174 if (it != parameter_information.trivial_map.end()) {
181 const std::map<int, std::string>* M =
nullptr;
185 M = &(parameter_information.IO_map);
186 }
else if (info ==
"short") {
187 M = &(parameter_information.short_desc_map);
188 }
else if (info ==
"long") {
189 M = &(parameter_information.description_map);
190 }
else if (info ==
"units") {
191 M = &(parameter_information.units_map);
193 throw ValueError(
format(
"Bad info string [%s] to get_parameter_information", std::string(info).c_str()));
196 auto it = M->find(key);
197 if (it != M->end()) {
200 throw ValueError(
format(
"Unable to match the key [%d] in get_parameter_information for info [%s]", key, std::string(info).c_str()));
206 std::vector<std::string> strings;
207 strings.reserve(parameter_information.index_map.size());
208 for (
auto& it : parameter_information.index_map) {
209 strings.push_back(it.first);
216 auto it = parameter_information.index_map.find(param_name);
218 if (it != parameter_information.index_map.end()) {
220 iOutput =
static_cast<parameters>(it->second);
229 std::cout <<
format(
"is_valid_first_derivative(%s)", name.c_str());
235 std::vector<std::string> split_at_bar =
strsplit(name,
'|');
236 if (split_at_bar.size() != 2) {
240 std::vector<std::string> split_at_slash =
strsplit(split_at_bar[0],
'/');
241 if (split_at_slash.size() != 2) {
245 std::size_t i0 = split_at_slash[0].find(
'(');
246 std::size_t
i1 = split_at_slash[0].find(
')', i0);
247 if (!((i0 > 0) && (i0 != std::string::npos) && (
i1 > (i0 + 1)) && (
i1 != std::string::npos))) {
250 std::string num = split_at_slash[0].substr(i0 + 1,
i1 - i0 - 1);
252 i0 = split_at_slash[1].find(
'(');
253 i1 = split_at_slash[1].find(
')', i0);
254 if (!((i0 > 0) && (i0 != std::string::npos) && (
i1 > (i0 + 1)) && (
i1 != std::string::npos))) {
257 std::string den = split_at_slash[1].substr(i0 + 1,
i1 - i0 - 1);
263 iConstant = Constant;
272 std::cout <<
format(
"is_valid_first_saturation_derivative(%s)", name.c_str());
278 std::vector<std::string> split_at_bar =
strsplit(name,
'|');
279 if (split_at_bar.size() != 2) {
283 std::vector<std::string> split_at_slash =
strsplit(split_at_bar[0],
'/');
284 if (split_at_slash.size() != 2) {
288 std::size_t i0 = split_at_slash[0].find(
'(');
289 std::size_t
i1 = split_at_slash[0].find(
')', i0);
290 if (!((i0 > 0) && (i0 != std::string::npos) && (
i1 > (i0 + 1)) && (
i1 != std::string::npos))) {
293 std::string num = split_at_slash[0].substr(i0 + 1,
i1 - i0 - 1);
295 i0 = split_at_slash[1].find(
'(');
296 i1 = split_at_slash[1].find(
')', i0);
297 if (!((i0 > 0) && (i0 != std::string::npos) && (
i1 > (i0 + 1)) && (
i1 != std::string::npos))) {
300 std::string den = split_at_slash[1].substr(i0 + 1,
i1 - i0 - 1);
315 std::cout <<
format(
"is_valid_second_derivative(%s)", name.c_str());
319 std::size_t i = name.rfind(
'|');
320 if ((i == 0) || (i == std::string::npos)) {
323 std::string constant2 = name.substr(i + 1);
327 std::string left_of_bar = name.substr(0, i);
329 i = left_of_bar.rfind(
'/');
330 if ((i == 0) || (i == std::string::npos)) {
333 std::string left_of_slash = left_of_bar.substr(0, i);
334 std::string right_of_slash = left_of_bar.substr(i + 1);
336 i = left_of_slash.find(
'(');
337 std::size_t
i1 = left_of_slash.rfind(
')');
338 if (!((i > 0) && (i != std::string::npos) && (
i1 > (i + 1)) && (
i1 != std::string::npos))) {
341 std::string num = left_of_slash.substr(i + 1,
i1 - i - 1);
346 i = right_of_slash.find(
'(');
347 i1 = right_of_slash.rfind(
')');
348 if (!((i > 0) && (i != std::string::npos) && (
i1 > (i + 1)) && (
i1 != std::string::npos))) {
351 std::string den = right_of_slash.substr(i + 1,
i1 - i - 1);
388 index_map.emplace(el->short_desc, el->key);
403 auto iter = coolprop_information.short_desc_map.find(phase);
404 if (iter != coolprop_information.short_desc_map.end()) {
407 throw ValueError(
"Cannot find the short phase description.");
412 auto it = phase_information.index_map.find(phase_name);
414 if (it != phase_information.index_map.end()) {
416 iOutput =
static_cast<phases>(it->second);
428 throw ValueError(
format(
"Your input name [%s] is not valid in get_phase_index (names are case sensitive)", param_name.c_str()));
439 {
i1,
"1"}, {
i2a,
"2A"}, {
i2b,
"2B"}, {
i3a,
"3A"}, {
i3b,
"3B"}, {
i4a,
"4A"}, {
i4b,
"4B"}, {
i4c,
"4C"},
451 index_map.emplace(el->short_desc, el->key);
466 auto it = coolprop_information.short_desc_map.find(scheme);
467 if (it != coolprop_information.short_desc_map.end()) {
470 throw ValueError(
"Cannot find the short scheme description.");
475 auto it = scheme_information.index_map.find(scheme_name);
477 if (it != scheme_information.index_map.end()) {
479 iOutput =
static_cast<schemes>(it->second);
491 throw ValueError(
format(
"Your input name [%s] is not valid in get_scheme_index (names are case sensitive)", scheme_name.c_str()));
500 throw ValueError(
format(
"Your input name [%s] is not valid in get_parameter_index (names are case sensitive)", param_name.c_str()));
511 {
QT_INPUTS,
"QT_INPUTS",
"Molar quality, Temperature in K"},
512 {
QmassT_INPUTS,
"QmassT_INPUTS",
"Mass-basis quality, Temperature in K"},
513 {
QSmolar_INPUTS,
"QS_INPUTS",
"Molar quality, Entropy in J/mol/K"},
515 {
QSmass_INPUTS,
"QS_INPUTS",
"Molar quality, Entropy in J/kg/K"},
517 {
HmolarQ_INPUTS,
"HQ_INPUTS",
"Enthalpy in J/mol, Molar quality"},
519 {
HmassQ_INPUTS,
"HQ_INPUTS",
"Enthalpy in J/kg, Molar quality"},
521 {
DmassQ_INPUTS,
"DmassQ_INPUTS",
"Molar density kg/m^3, Molar quality"},
522 {
DmassQmass_INPUTS,
"DmassQmass_INPUTS",
"Mass density kg/m^3, Mass-basis quality"},
523 {
DmolarQ_INPUTS,
"DmolarQ_INPUTS",
"Molar density in mol/m^3, Molar quality"},
524 {
DmolarQmass_INPUTS,
"DmolarQmass_INPUTS",
"Molar density in mol/m^3, Mass-basis quality"},
526 {
PQ_INPUTS,
"PQ_INPUTS",
"Pressure in Pa, Molar quality"},
527 {
PQmass_INPUTS,
"PQmass_INPUTS",
"Pressure in Pa, Mass-basis quality"},
529 {
PT_INPUTS,
"PT_INPUTS",
"Pressure in Pa, Temperature in K"},
531 {
DmassT_INPUTS,
"DmassT_INPUTS",
"Mass density in kg/m^3, Temperature in K"},
532 {
DmolarT_INPUTS,
"DmolarT_INPUTS",
"Molar density in mol/m^3, Temperature in K"},
533 {
HmassT_INPUTS,
"HmassT_INPUTS",
"Enthalpy in J/kg, Temperature in K"},
534 {
HmolarT_INPUTS,
"HmolarT_INPUTS",
"Enthalpy in J/mol, Temperature in K"},
535 {
SmassT_INPUTS,
"SmassT_INPUTS",
"Entropy in J/kg/K, Temperature in K"},
536 {
SmolarT_INPUTS,
"SmolarT_INPUTS",
"Entropy in J/mol/K, Temperature in K"},
537 {
TUmass_INPUTS,
"TUmass_INPUTS",
"Temperature in K, Internal energy in J/kg"},
538 {
TUmolar_INPUTS,
"TUmolar_INPUTS",
"Temperature in K, Internal energy in J/mol"},
540 {
DmassP_INPUTS,
"DmassP_INPUTS",
"Mass density in kg/m^3, Pressure in Pa"},
541 {
DmolarP_INPUTS,
"DmolarP_INPUTS",
"Molar density in mol/m^3, Pressure in Pa"},
542 {
HmassP_INPUTS,
"HmassP_INPUTS",
"Enthalpy in J/kg, Pressure in Pa"},
543 {
HmolarP_INPUTS,
"HmolarP_INPUTS",
"Enthalpy in J/mol, Pressure in Pa"},
544 {
PSmass_INPUTS,
"PSmass_INPUTS",
"Pressure in Pa, Entropy in J/kg/K"},
545 {
PSmolar_INPUTS,
"PSmolar_INPUTS",
"Pressure in Pa, Entropy in J/mol/K "},
546 {
PUmass_INPUTS,
"PUmass_INPUTS",
"Pressure in Pa, Internal energy in J/kg"},
547 {
PUmolar_INPUTS,
"PUmolar_INPUTS",
"Pressure in Pa, Internal energy in J/mol"},
549 {
DmassHmass_INPUTS,
"DmassHmass_INPUTS",
"Mass density in kg/m^3, Enthalpy in J/kg"},
550 {
DmolarHmolar_INPUTS,
"DmolarHmolar_INPUTS",
"Molar density in mol/m^3, Enthalpy in J/mol"},
551 {
DmassSmass_INPUTS,
"DmassSmass_INPUTS",
"Mass density in kg/m^3, Entropy in J/kg/K"},
552 {
DmolarSmolar_INPUTS,
"DmolarSmolar_INPUTS",
"Molar density in mol/m^3, Entropy in J/mol/K"},
553 {
DmassUmass_INPUTS,
"DmassUmass_INPUTS",
"Mass density in kg/m^3, Internal energy in J/kg"},
554 {
DmolarUmolar_INPUTS,
"DmolarUmolar_INPUTS",
"Molar density in mol/m^3, Internal energy in J/mol"},
558 {
SmassUmass_INPUTS,
"SmassUmass_INPUTS",
"Entropy in J/kg/K, Internal energy in J/kg"},
559 {
SmolarUmolar_INPUTS,
"SmolarUmolar_INPUTS",
"Entropy in J/mol/K, Internal energy in J/mol"},
572 index_map.emplace(el->short_desc, el->key);
587 auto it = coolprop_information.index_map.find(input_pair_name);
588 if (it != coolprop_information.index_map.end()) {
591 throw ValueError(
format(
"Your input name [%s] is not valid in get_input_pair_index (names are case sensitive)", input_pair_name.c_str()));
596 auto it = coolprop_information.short_desc_map.find(pair);
597 if (it != coolprop_information.short_desc_map.end()) {
600 throw ValueError(
"Cannot find the short input pair description.");
604 auto it = coolprop_information.long_desc_map.find(pair);
605 if (it != coolprop_information.long_desc_map.end()) {
608 throw ValueError(
"Cannot find the long input pair description.");
859 std::size_t i = backend_string.find(
'&');
860 std::map<std::string, backend_families>::const_iterator it;
861 if (i != std::string::npos) {
862 it = backend_information.family_name_map_r.find(backend_string.substr(0, i));
863 if (it != backend_information.family_name_map_r.end()) f1 = it->second;
864 it = backend_information.family_name_map_r.find(backend_string.substr(i + 1));
865 if (it != backend_information.family_name_map_r.end()) f2 = it->second;
867 it = backend_information.family_name_map_r.find(backend_string);
868 if (it != backend_information.family_name_map_r.end()) f1 = it->second;
876 std::map<backend_families, std::string>::const_iterator it;
877 it = backend_information.family_name_map.find(f2_enum);
878 if (it != backend_information.family_name_map.end())
886 std::map<backends, std::string>::const_iterator it;
887 it = backend_information.backend_name_map.find(backend);
888 if (it != backend_information.backend_name_map.end())
897# include <catch2/catch_all.hpp>
901TEST_CASE(
"Check that csv list of parameters is possible",
"[parameter_list]") {
905TEST_CASE(
"Check that all parameters are described",
"") {
907 std::ostringstream ss;
909 SECTION(ss.str(),
"") {
920TEST_CASE(
"Check that all phases are described",
"[phase_index]") {
922 std::ostringstream ss;
924 SECTION(ss.str(),
"") {
925 std::string stringrepr;