CoolProp  4.2.5
An open-source fluid property and humid air property database
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
AllFluids.cpp
Go to the documentation of this file.
1 // In this file, the code for all the fluids is included verbatim. This file is in turn included into FluidClass.cpp
2 
3 #include <map>
4 #include <string>
5 #include <exception>
6 #include <vector>
7 
8 #include "rapidjson_CoolProp.h"
9 
10 #include "CPExceptions.h"
11 #include "CoolPropTools.h"
12 #include "CoolPropDLL.h"
13 #include "Helmholtz.h"
14 #include "Units.h"
15 #include "AllFluids.h"
17 
18 #include "pseudopurefluids/Air.cpp"
25 
27 #include "purefluids/Argon.cpp"
28 #include "purefluids/Alkanes.cpp"
29 #include "purefluids/Benzene.cpp"
30 #include "purefluids/Butenes.cpp"
33 #include "purefluids/Deuterium.cpp"
34 #include "purefluids/DMC.cpp"
35 #include "purefluids/Ethanol.cpp"
36 #include "purefluids/Ether.cpp"
37 #include "purefluids/Ethylene.cpp"
38 #include "purefluids/FAME.cpp"
39 #include "purefluids/Fluorine.cpp"
40 #include "purefluids/Helium.cpp"
41 #include "purefluids/HFE143m.cpp"
42 #include "purefluids/Hydrogen.cpp"
44 #include "purefluids/Methanol.cpp"
45 #include "purefluids/Neon.cpp"
46 #include "purefluids/Nitrogen.cpp"
47 #include "purefluids/Oxygen.cpp"
48 #include "purefluids/Propylene.cpp"
49 #include "purefluids/R12_R113.cpp"
50 #include "purefluids/R124.cpp"
51 #include "purefluids/R125.cpp"
52 #include "purefluids/R1234yf.cpp"
53 #include "purefluids/R1234ze.cpp"
55 #include "purefluids/R134a.cpp"
56 #include "purefluids/R143A.cpp"
58 #include "purefluids/R22.cpp"
60 #include "purefluids/R23.cpp"
61 #include "purefluids/R236FA.cpp"
62 #include "purefluids/R236EA.cpp"
63 #include "purefluids/R290.cpp"
64 #include "purefluids/R32.cpp"
65 #include "purefluids/R717.cpp"
66 #include "purefluids/R744.cpp"
68 #include "purefluids/Siloxanes.cpp"
71 #include "purefluids/Undecane.cpp"
72 #include "purefluids/Water.cpp"
74 
75 // ------------------------------
76 // FluidsContainer Implementation
77 // ------------------------------
78 
80 {
81 
82  // The pure fluids
83  FluidsList.push_back(new WaterClass());
84  FluidsList.push_back(new R134aClass());
85  FluidsList.push_back(new HeliumClass());
86  FluidsList.push_back(new OxygenClass());
87  FluidsList.push_back(new HydrogenClass());
88  FluidsList.push_back(new ParaHydrogenClass());
89  FluidsList.push_back(new OrthoHydrogenClass());
90  FluidsList.push_back(new ArgonClass());
91  FluidsList.push_back(new R744Class());
92  FluidsList.push_back(new NitrogenClass());
93  FluidsList.push_back(new R290Class());
94  FluidsList.push_back(new R717Class());
95  FluidsList.push_back(new R1234yfClass());
96  FluidsList.push_back(new R1234zeClass());
97  FluidsList.push_back(new R32Class());
98  FluidsList.push_back(new R22Class());
99  FluidsList.push_back(new SES36Class());
100  FluidsList.push_back(new EthyleneClass());
101  FluidsList.push_back(new SulfurHexafluorideClass());
102  FluidsList.push_back(new EthanolClass());
103  FluidsList.push_back(new DimethylEtherClass());
104  FluidsList.push_back(new DimethylCarbonateClass());
105  FluidsList.push_back(new R143AClass());
106  FluidsList.push_back(new R23Class());
107  FluidsList.push_back(new nDodecaneClass());
108  FluidsList.push_back(new PropyleneClass());
109  FluidsList.push_back(new CyclopentaneClass());
110  FluidsList.push_back(new R236FAClass());
111  FluidsList.push_back(new R236EAClass());
112  FluidsList.push_back(new R227EAClass());
113  FluidsList.push_back(new R365MFCClass());
114  FluidsList.push_back(new R161Class());
115  FluidsList.push_back(new HFE143mClass());
116  FluidsList.push_back(new BenzeneClass());
117  FluidsList.push_back(new UndecaneClass());
118  FluidsList.push_back(new R125Class());
119  FluidsList.push_back(new CycloPropaneClass());
120  FluidsList.push_back(new NeonClass());
121  FluidsList.push_back(new R124Class());
122  FluidsList.push_back(new PropyneClass());
123  FluidsList.push_back(new FluorineClass());
124  FluidsList.push_back(new MethanolClass());
125  FluidsList.push_back(new RC318Class());
126  FluidsList.push_back(new R21Class());
127  FluidsList.push_back(new R114Class());
128  FluidsList.push_back(new R13Class());
129  FluidsList.push_back(new R14Class());
130  FluidsList.push_back(new R12Class());
131  FluidsList.push_back(new R113Class());
132  FluidsList.push_back(new R1234zeZClass());
133  FluidsList.push_back(new R1233zdEClass());
134  FluidsList.push_back(new AceticAcidClass());
135 
136  // The industrial fluids
137  FluidsList.push_back(new R245faClass());
138  FluidsList.push_back(new R41Class());
139  FluidsList.push_back(new CarbonMonoxideClass());
140  FluidsList.push_back(new CarbonylSulfideClass());
141  FluidsList.push_back(new DecaneClass());
142  FluidsList.push_back(new HydrogenSulfideClass());
143  FluidsList.push_back(new IsopentaneClass());
144  FluidsList.push_back(new NeopentaneClass());
145  FluidsList.push_back(new IsohexaneClass());
146  FluidsList.push_back(new KryptonClass());
147  FluidsList.push_back(new NonaneClass());
148  FluidsList.push_back(new TolueneClass());
149  FluidsList.push_back(new XenonClass());
150  FluidsList.push_back(new R116Class());
151  FluidsList.push_back(new AcetoneClass());
152  FluidsList.push_back(new NitrousOxideClass());
153  FluidsList.push_back(new SulfurDioxideClass());
154  FluidsList.push_back(new R141bClass());
155  FluidsList.push_back(new R142bClass());
156  FluidsList.push_back(new R218Class());
157 
158  FluidsList.push_back(new MethaneClass());
159  FluidsList.push_back(new EthaneClass());
160  FluidsList.push_back(new nButaneClass());
161  FluidsList.push_back(new IsoButaneClass());
162  // Span Non-Polar
163  FluidsList.push_back(new nPentaneClass());
164  FluidsList.push_back(new nHexaneClass());
165  FluidsList.push_back(new nHeptaneClass());
166  FluidsList.push_back(new nOctaneClass());
167  FluidsList.push_back(new CyclohexaneClass());
168  // Span Polar
169  FluidsList.push_back(new R152AClass());
170  FluidsList.push_back(new R123Class());
171  FluidsList.push_back(new R11Class());
172 
173  // The Siloxanes
174  FluidsList.push_back(new OctamethyltrisiloxaneClass()); //MDM
175  FluidsList.push_back(new DecamethyltetrasiloxaneClass()); //MD2M
176  FluidsList.push_back(new DodecamethylpentasiloxaneClass()); //MD3M
177  FluidsList.push_back(new DodecamethylcyclohexasiloxaneClass()); //D6
178  FluidsList.push_back(new HexamethyldisiloxaneClass());//MM
179  FluidsList.push_back(new TetradecamethylhexasiloxaneClass()); //MD4M
180  FluidsList.push_back(new OctamethylcyclotetrasiloxaneClass()); //D4
181  FluidsList.push_back(new DecamethylcyclopentasiloxaneClass()); //D5
182 
183  // The butenes
184  FluidsList.push_back(new OneButeneClass());
185  FluidsList.push_back(new IsoButeneClass());
186  FluidsList.push_back(new Cis2ButeneClass());
187  FluidsList.push_back(new Trans2ButeneClass());
188 
189  // The methyl ester components of biodiesel
190  FluidsList.push_back(new MethylPalmitateClass());
191  FluidsList.push_back(new MethylStearateClass());
192  FluidsList.push_back(new MethylOleateClass());
193  FluidsList.push_back(new MethylLinoleateClass());
194  FluidsList.push_back(new MethylLinolenateClass());
195 
196  // Xylene isomers and EthylBenzene
197  FluidsList.push_back(new oXyleneClass());
198  FluidsList.push_back(new mXyleneClass());
199  FluidsList.push_back(new pXyleneClass());
200  FluidsList.push_back(new EthylBenzeneClass());
201 
202  // Deuterium and spin isomers
203  FluidsList.push_back(new DeuteriumClass());
204  FluidsList.push_back(new ParaDeuteriumClass());
205  FluidsList.push_back(new OrthoDeuteriumClass());
206 
207  // The pseudo-pure fluids
208  FluidsList.push_back(new AirClass());
209  FluidsList.push_back(new R404AClass());
210  FluidsList.push_back(new R410AClass());
211  FluidsList.push_back(new R407CClass());
212  FluidsList.push_back(new R507AClass());
213  FluidsList.push_back(new R407FClass());
214 
215  // Includes the C++ JSON code for all the fluids as the variable JSON_code
216  #include "JSON_code.h"
217 
218  // Includes the C++ JSON code for the CAS number lookup as the variable JSON_cas
219  #include "JSON_CAS.h"
220 
221  JSON.Parse<0>(JSON_code);
222  JSON_CAS.Parse<0>(JSON_cas);
223 
224  // Build the map of fluid names mapping to pointers to the Fluid class instances
225  for (std::vector<Fluid*>::iterator it = FluidsList.begin(); it != FluidsList.end(); it++)
226  {
229  // Call the post_load routine
230  (*it)->post_load(JSON, JSON_CAS);
231  // Load up entry in map
232  fluid_name_map[(*it)->get_name()] = *it;
233 
234  std::string name = (*it)->get_name();
235  std::string ucasename = upper(name);
236 
237  if (!((*it)->isAlias(ucasename)) && ucasename.compare(name))
238  {
239  (*it)->add_alias(ucasename);
240  }
241  }
242 }
243 
244 // Destructor
246 {
247  while (!FluidsList.empty())
248  {
249  delete FluidsList.back();
250  FluidsList.pop_back();
251  }
252 }
253 
254 bool FluidsContainer::add_REFPROP_fluid(std::string FluidName, std::vector<double> xmol)
255 {
256  // Some fluids from REFPROP that are not included in CoolProp due to not having a Helmholtz energy EOS
257  Fluid * pREFPROPFluid = new REFPROPFluidClass(FluidName,xmol);
258  FluidsList.push_back(pREFPROPFluid);
259  // Add entry to the fluid name map
260  fluid_name_map.insert(std::pair<std::string,Fluid*>(FluidName,pREFPROPFluid));
261  return true;
262 }
263 
265 {
266  if (iFluid > -1)
267  {
268  return FluidsList[iFluid];
269  }
270  else
271  {
272  return NULL;
273  }
274 }
276 {
277  std::map<std::string,Fluid*>::iterator it;
278  // Try to find using the map if Fluid name is provided
279  it = fluid_name_map.find(name);
280  // If it is found the iterator will not be equal to end
281  if (it != fluid_name_map.end() )
282  {
283  // Return a pointer to the class
284  return (*it).second;
285  }
286 
287  // Wasn't found, now we need to check for an alias
288  for (std::vector<Fluid*>::iterator it = FluidsList.begin(); it != FluidsList.end(); it++)
289  {
290  if ( (*it)->isAlias(name) )
291  {
292  return *it;
293  }
294  }
295  return NULL;
296 }
297 
299 {
300  int i = 0;
301  // Iterate to find the 0-based index of the fluid
302  for (std::vector<Fluid*>::iterator it = FluidsList.begin(); it != FluidsList.end(); it++)
303  {
304  if ((*it) == pFluid)
305  {
306  return i;
307  }
308  i++;
309  }
310  return -1;
311 }
312 
314 {
315  // Return a std::string with the list of fluids
316  std::string FL;
317  for (std::vector<Fluid*>::iterator it = FluidsList.begin(); it != FluidsList.end(); it++)
318  {
319  FL+=(*it)->get_name();
320  FL+=",";
321  }
322  //Remove the tailing comma
323  FL = FL.substr (0,FL.length()-1);
324  return FL;
325 }
326 
327 #ifndef DISABLE_CATCH
328 #include "Catch/catch.hpp"
329 
330 TEST_CASE((char*)"Check ancillary curves for pure and pseudo-pure fluids","[slow],[ancillary]")
331 {
333 
334  SECTION((char*)"Saturated Liquid Pressure Ancillary")
335  {
336  for (std::vector<Fluid*>::const_iterator it = Fluids.FluidsList.begin(); it != Fluids.FluidsList.end(); it++)
337  {
338  std::string name = (*it)->get_name();
339  double Tmin = (*it)->limits.Tmin;
340  double Tmax = (*it)->crit.T-1;
341  int N = 5;
342  for (double T = Tmin; T <= Tmax; T += (Tmax-Tmin)/(N-1))
343  {
344  CAPTURE(name);
345  double pL,pV,rhoL,rhoV;
346  CHECK_NOTHROW((*it)->saturation_T(T,false,pL,pV,rhoL,rhoV));
347  double p_EOS = pL;
348  double p_ancillary = (*it)->pure() ? (*it)->psat(T): (*it)->psatL(T);
349  CAPTURE(p_EOS);
350  CAPTURE(p_ancillary);
351  CHECK(fabs(p_EOS/p_ancillary -1) <= 2e-2);
352  }
353  }
354  }
355  SECTION((char*)"Saturated Vapor Pressure Ancillary")
356  {
357  for (std::vector<Fluid*>::const_iterator it = Fluids.FluidsList.begin(); it != Fluids.FluidsList.end(); it++)
358  {
359  std::string name = (*it)->get_name();
360  double Tmin = (*it)->limits.Tmin;
361  double Tmax = (*it)->crit.T-1;
362  int N = 5;
363  for (double T = Tmin; T <= Tmax; T += (Tmax-Tmin)/(N-1))
364  {
365  double pL,pV,rhoL,rhoV;
366  (*it)->saturation_T(T,false,pL,pV,rhoL,rhoV);
367  double p_EOS = pV;
368  double p_ancillary = (*it)->pure() ? (*it)->psat(T): (*it)->psatV(T);
369 
370  CAPTURE(name);
371  CAPTURE(p_EOS);
372  CAPTURE(p_ancillary);
373  CHECK(fabs(p_EOS/p_ancillary -1) <= 2e-2);
374  }
375  }
376  }
377 
378  SECTION((char*)"Saturated Liquid Density Ancillary")
379  {
380  for (std::vector<Fluid*>::const_iterator it = Fluids.FluidsList.begin(); it != Fluids.FluidsList.end(); it++)
381  {
382  std::string name = (*it)->get_name();
383  double Tmin = (*it)->limits.Tmin;
384  double Tmax = (*it)->crit.T-1;
385  int N = 5;
386  for (double T = Tmin; T <= Tmax; T += (Tmax-Tmin)/(N-1))
387  {
388  double pL,pV,rhoL,rhoV;
389  (*it)->saturation_T(T,false,pL,pV,rhoL,rhoV);
390  double rho_EOS = rhoL;
391  double rho_ancillary = (*it)->rhosatL(T);
392  CAPTURE(name);
393  CAPTURE(rho_EOS);
394  CAPTURE(rho_ancillary);
395  CHECK(fabs(rho_EOS/rho_ancillary -1) <= 2e-2);
396  }
397  }
398  }
399 
400  SECTION((char*)"Saturated Vapor Density Ancillary")
401  {
402  for (std::vector<Fluid*>::const_iterator it = Fluids.FluidsList.begin(); it != Fluids.FluidsList.end(); it++)
403  {
404  std::string name = (*it)->get_name();
405  double Tmin = (*it)->limits.Tmin;
406  double Tmax = (*it)->crit.T-1;
407  int N = 5;
408  for (double T = Tmin; T <= Tmax; T += (Tmax-Tmin)/(N-1))
409  {
410  double pL,pV,rhoL,rhoV;
411  (*it)->saturation_T(T,false,pL,pV,rhoL,rhoV);
412  double rho_EOS = rhoV;
413  double rho_ancillary = (*it)->rhosatV(T);
414  CAPTURE(name);
415  CAPTURE(rho_EOS);
416  CAPTURE(rho_ancillary);
417  CHECK(fabs(rho_EOS/rho_ancillary -1) <= 2e-2);
418  }
419  }
420  }
421 }
422 
423 TEST_CASE((char*)"Fluid parameter checks not requiring saturation","[fast]")
424 {
425  FluidsContainer Fluids = FluidsContainer();
426 
427  SECTION((char*)"Check Tmin > Ttriple")
428  {
429  for (std::vector<Fluid*>::const_iterator it = Fluids.FluidsList.begin(); it != Fluids.FluidsList.end(); it++)
430  {
431  REQUIRE((*it)->params.Ttriple <= (*it)->limits.Tmin);
432  }
433  }
435  {
436  SECTION((char*)"Check pcrit matches REFPROP")
437  {
438  for (std::vector<Fluid*>::const_iterator it = Fluids.FluidsList.begin(); it != Fluids.FluidsList.end(); it++)
439  {
440  std::string RPName = std::string("REFPROP-")+get_fluid_param_string((*it)->get_name(), "REFPROPName");
441  if (RPName.compare("REFPROP-N/A"))
442  {
443  // Skip if not in REFPROP
444  double pcrit_CP = (*it)->crit.p.Pa;
445  double pcrit_RP = PropsSI((char*)"pcrit",(char*)"T",300,(char*)"D",1e-10,(char*)RPName.c_str());
446  CAPTURE(pcrit_CP);
447  CAPTURE(pcrit_RP);
448  CAPTURE(RPName);
449  CHECK(fabs(pcrit_RP/pcrit_CP-1) < 0.01);
450  }
451  }
452  }
453  }
454 }
455 
456 TEST_CASE((char*)"Fluid parameter checks requiring saturation","[slow]")
457 {
458  FluidsContainer Fluids = FluidsContainer();
459 
460  SECTION((char*)"Check ptriple")
461  {
462  for (std::vector<Fluid*>::const_iterator it = Fluids.FluidsList.begin(); it != Fluids.FluidsList.end(); it++)
463  {
464  std::string name = (*it)->get_name();
465  double pL,pV,rhoL,rhoV;
466  (*it)->saturation_T((*it)->limits.Tmin,false,pL,pV,rhoL,rhoV);
467  double ptriple_EOS = pV;
468  CAPTURE(name);
469  CAPTURE(ptriple_EOS);
470  INFO(name);
471  REQUIRE((*it)->params.ptriple == ptriple_EOS);
472  }
473  }
474  SECTION((char*)"Check accentric factor")
475  {
476  for (std::vector<Fluid*>::const_iterator it = Fluids.FluidsList.begin(); it != Fluids.FluidsList.end(); it++)
477  {
478  if ((*it)->limits.Tmin < 0.7*(*it)->crit.T)
479  {
480  std::string name = (*it)->get_name();
481  double pL,pV,rhoL,rhoV;
482  (*it)->saturation_T((*it)->crit.T*0.7,false,pL,pV,rhoL,rhoV);
483  double accentric_EOS = -log10(pV/(*it)->crit.p.Pa)-1;
484  double accentric_Fluid = (*it)->params.accentricfactor;
485  CAPTURE(name);
486  CAPTURE(accentric_EOS);
487  CAPTURE(accentric_Fluid);
488  INFO(format("accentric factor should be %0.7g",accentric_EOS));
489  REQUIRE(fabs(accentric_Fluid/accentric_EOS-1) < 1e-2);
490  }
491  }
492  }
493 }
494 TEST_CASE((char*)"Saturation consistency checks", (char*)"[slow],[consistency]" )
495 {
496  FluidsContainer Fluids = FluidsContainer();
497  SECTION((char*)"saturation_T")
498  {
499  for (std::vector<Fluid*>::const_iterator it = Fluids.FluidsList.begin(); it != Fluids.FluidsList.end(); it++)
500  {
501  double Tt = (*it)->limits.Tmin;
502  double Tc = (*it)->crit.T;
503  double N = 30;
504  for (double T = Tt; T<Tc; T+=(Tc-Tt)/(N-1))
505  {
506  double p, psatV, rhoL, rhoV;
507  std::string name = (*it)->get_name();
508  CAPTURE(name);
509  CAPTURE(T);
510  CAPTURE(Tc);
511  CHECK_NOTHROW((*it)->saturation_T(T, false, p, psatV, rhoL, rhoV));
512  }
513  }
514  }
515 
516  SECTION((char*)"TL->pL->TL")
517  {
518  for (std::vector<Fluid*>::const_iterator it = Fluids.FluidsList.begin(); it != Fluids.FluidsList.end(); it++)
519  {
520  if (!(*it)->pure()){continue;}
521  double Tt = (*it)->limits.Tmin;
522  double Tc = (*it)->crit.T;
523  double pc = (*it)->crit.p.Pa;
524  double N = 50;
525  for (double T = Tt; T<Tc; T+=(Tc-0.0001-Tt)/(N-1))
526  {
527  double psatL, psatV, TsatL, TsatV,rhoL,rhoV;
528  std::string name = (*it)->get_name();
529  CAPTURE(name);
530  CAPTURE(T);
531  CAPTURE(Tc);
532  CHECK_NOTHROW((*it)->saturation_T(T, false, psatL, psatV, rhoL, rhoV));
533  CAPTURE(pc);
534  CHECK_NOTHROW((*it)->saturation_p(psatL, false, TsatL, TsatV, rhoL, rhoV));
535  CAPTURE(TsatL);
536  INFO(name);
537  CHECK(fabs(T/TsatL-1) < 1e-3);
538  }
539  }
540  }
541  SECTION((char*)"TV->pV->TV")
542  {
543  for (std::vector<Fluid*>::const_iterator it = Fluids.FluidsList.begin(); it != Fluids.FluidsList.end(); it++)
544  {
545  if (!(*it)->pure()){continue;}
546  double Tt = (*it)->limits.Tmin;
547  double Tc = (*it)->crit.T;
548  double pc = (*it)->crit.p.Pa;
549  double N = 50;
550  for (double T = Tt; T<Tc; T+=(Tc-0.0001-Tt)/(N-1))
551  {
552  double psatL, psatV, TsatL, TsatV, rhoL, rhoV;
553  std::string name = (*it)->get_name();
554  CAPTURE(name);
555  CAPTURE(T);
556  CAPTURE(Tc);
557  CHECK_NOTHROW((*it)->saturation_T(T, false, psatL, psatV, rhoL, rhoV));
558  CAPTURE(psatV);
559  CAPTURE(pc);
560  CHECK_NOTHROW((*it)->saturation_p(psatV, false, TsatL, TsatV, rhoL, rhoV));
561  CAPTURE(TsatV);
562  INFO(name);
563  CHECK(fabs(T/TsatV-1) < 1e-3);
564  }
565  }
566  }
567 }
568 #endif
GenericDocument & Parse(const Ch *str)
Parse JSON text from a read-only string.
Definition: document.h:742
Definition: R717.h:5
Definition: Neon.h:6
Definition: R744.h:4
void set_critical_spline_constants(Fluid *pFluid)
Definition: R124.h:4
#define CHECK_NOTHROW(expr)
Definition: catch.hpp:8066
FluidsContainer Fluids
Definition: CoolProp.cpp:189
std::string format(const char *fmt,...)
Fluid is the abstract base class that is employed by all the other fluids.
Definition: FluidClass.h:147
#define CAPTURE(msg)
Definition: catch.hpp:8074
Definition: R23.h:4
double PropsSI(std::string Output, std::string Name1, double Prop1, std::string Name2, double Prop2, std::string Ref)
Definition: CoolProp.cpp:886
static bool refpropSupported()
Definition: REFPROP.cpp:1066
Definition: R290.h:4
const char JSON_cas[]
Definition: JSON_CAS.h:1
std::vector< Fluid * > FluidsList
A list of pointers to the instances of the fluids.
Definition: AllFluids.h:20
Definition: Air.h:4
std::string FluidList()
Returns a std::string of a comma-separated list of the CoolProp names of all the fluids that are load...
Definition: AllFluids.cpp:313
#define TEST_CASE(name, description)
Definition: catch.hpp:8085
Definition: R22.h:4
REQUIRE(fabs(CPWater.p()-RPWater.p())< 1e-4)
Definition: R32.h:4
Fluid * get_fluid(std::string name)
Definition: AllFluids.cpp:275
#define SECTION(name, description)
Definition: catch.hpp:8088
long get_fluid_index(Fluid *pFluid)
Definition: AllFluids.cpp:298
#define INFO(msg)
Definition: catch.hpp:8071
bool add_REFPROP_fluid(std::string FluidName, std::vector< double > xmol)
Definition: AllFluids.cpp:254
Definition: R125.h:4
std::string upper(const std::string str_)
std::string get_fluid_param_string(std::string FluidName, std::string ParamName)
Definition: CoolProp.cpp:1173
#define CHECK(expr)
Definition: catch.hpp:8058
const char JSON_code[]
Definition: JSON_code.h:1