7#if defined(COOLPROP_NO_INCBIN)
20INCBIN(all_fluids_JSON_z,
"all_fluids.json.z");
26static JSONFluidLibrary library;
30 uLong outlen =
static_cast<uLong>(outbuffer.size());
32 std::string buf(outbuffer.begin(), outbuffer.begin() + outlen);
34 throw ValueError(
"Unable to uncompress the fluid data from z compressed form");
37 if (getenv(
"COOLPROP_DISABLE_SUPERANCILLARIES_ENTIRELY")){
38 std::cout <<
"CoolProp: superancillaries have been disabled because the COOLPROP_DISABLE_SUPERANCILLARIES_ENTIRELY environment variable has been defined" << std::endl;
41 rapidjson::Document dd;
43 dd.Parse<0>(buf.c_str());
44 if (dd.HasParseError()) {
45 throw ValueError(
"Unable to load all_fluids.json");
49 }
catch (std::exception& e) {
50 std::cout << e.what() << std::endl;
57 std::map<std::string, std::size_t>::const_iterator it = string_to_index_map.find(fluid);
58 if (it != string_to_index_map.end()) {
59 std::map<std::size_t, CoolPropFluid>::iterator it2 = fluid_map.find(it->second);
61 if (it2 != fluid_map.end()) {
63 throw ValueError(
format(
"Not possible to set reference state for fluid %s because offset values are NAN", fluid.c_str()));
65 it2->second.EOS().alpha0.EnthalpyEntropyOffset.set(delta_a1, delta_a2, ref);
70 HEOS->update(
DmolarT_INPUTS, it2->second.EOS().hs_anchor.rhomolar, it2->second.EOS().hs_anchor.T);
71 it2->second.EOS().hs_anchor.hmolar = HEOS->hmolar();
72 it2->second.EOS().hs_anchor.smolar = HEOS->smolar();
74 double f = (HEOS->name() ==
"Water" || HEOS->name() ==
"CarbonDioxide") ? 1.00001 : 1.0;
77 HEOS->update(
DmolarT_INPUTS, it2->second.EOS().reduce.rhomolar * f, it2->second.EOS().reduce.T * f);
78 it2->second.EOS().reduce.hmolar = HEOS->hmolar();
79 it2->second.EOS().reduce.smolar = HEOS->smolar();
82 HEOS->update(
DmolarT_INPUTS, it2->second.crit.rhomolar * f, it2->second.crit.T * f);
83 it2->second.crit.hmolar = HEOS->hmolar();
84 it2->second.crit.smolar = HEOS->smolar();
87 HEOS->update(
DmolarT_INPUTS, it2->second.triple_liquid.rhomolar, it2->second.triple_liquid.T);
88 it2->second.triple_liquid.hmolar = HEOS->hmolar();
89 it2->second.triple_liquid.smolar = HEOS->smolar();
92 HEOS->update(
DmolarT_INPUTS, it2->second.triple_vapor.rhomolar, it2->second.triple_vapor.T);
93 it2->second.triple_vapor.hmolar = HEOS->hmolar();
94 it2->second.triple_vapor.smolar = HEOS->smolar();
96 if (!HEOS->is_pure()) {
98 HEOS->update(
DmolarT_INPUTS, it2->second.EOS().max_sat_T.rhomolar, it2->second.EOS().max_sat_T.T);
99 it2->second.EOS().max_sat_T.hmolar = HEOS->hmolar();
100 it2->second.EOS().max_sat_T.smolar = HEOS->smolar();
102 HEOS->update(
DmolarT_INPUTS, it2->second.EOS().max_sat_p.rhomolar, it2->second.EOS().max_sat_p.T);
103 it2->second.EOS().max_sat_p.hmolar = HEOS->hmolar();
104 it2->second.EOS().max_sat_p.smolar = HEOS->smolar();
107 throw ValueError(
format(
"fluid [%s] was not found in JSONFluidLibrary", fluid.c_str()));
121 rapidjson::Document doc;
127 if (!listing.IsArray()) {
131 for (rapidjson::Value::ValueIterator itr = listing.Begin(); itr != listing.End(); ++itr) {
142 std::size_t index = fluid_map.size();
149 fluid.
name = fluid_json[
"INFO"][
"NAME"].GetString();
153 name_vector.push_back(fluid.
name);
157 if (!fluid_json[
"INFO"].HasMember(
"CAS")) {
160 fluid.
CAS = fluid_json[
"INFO"][
"CAS"].GetString();
163 if (!fluid_json[
"INFO"].HasMember(
"REFPROP_NAME")) {
164 throw ValueError(
format(
"fluid [%s] does not have \"REFPROP_NAME\" member", fluid.
name.c_str()));
166 fluid.
REFPROPname = fluid_json[
"INFO"][
"REFPROP_NAME"].GetString();
169 if (fluid_json[
"INFO"].HasMember(
"FORMULA")) {
176 if (fluid_json[
"INFO"].HasMember(
"INCHI_STRING")) {
182 if (fluid_json[
"INFO"].HasMember(
"INCHI_KEY")) {
188 if (fluid_json[
"INFO"].HasMember(
"SMILES")) {
194 if (fluid_json[
"INFO"].HasMember(
"CHEMSPIDER_ID")) {
200 if (fluid_json[
"INFO"].HasMember(
"2DPNG_URL")) {
207 if (!(fluid_json[
"INFO"].HasMember(
"ENVIRONMENTAL"))) {
209 std::cout <<
format(
"Environmental data are missing for fluid [%s]\n", fluid.
name.c_str());
219 if (!fluid_json.HasMember(
"STATES")) {
225 std::cout <<
format(
"Loading fluid %s with CAS %s; %d fluids loaded\n", fluid.
name.c_str(), fluid.
CAS.c_str(), index);
235 if (!fluid_json.HasMember(
"ANCILLARIES")) {
241 if (!(fluid_json[
"ANCILLARIES"].HasMember(
"surface_tension"))) {
243 std::cout <<
format(
"Surface tension curves are missing for fluid [%s]\n", fluid.
name.c_str());
250 if (!(fluid_json[
"ANCILLARIES"].HasMember(
"melting_line"))) {
252 std::cout <<
format(
"Melting line curves are missing for fluid [%s]\n", fluid.
name.c_str());
259 if (!(fluid_json.HasMember(
"TRANSPORT"))) {
273 if (string_to_index_map.find(fluid.
CAS) != string_to_index_map.end()) {
274 index = string_to_index_map.find(fluid.
CAS)->second;
275 }
else if (string_to_index_map.find(fluid.
name) != string_to_index_map.end()) {
276 index = string_to_index_map.find(fluid.
name)->second;
277 }
else if (string_to_index_map.find(
upper(fluid.
name)) != string_to_index_map.end()) {
278 index = string_to_index_map.find(
upper(fluid.
name))->second;
281 for (std::size_t i = 0; i < fluid.
aliases.size(); ++i) {
282 if (string_to_index_map.find(fluid.
aliases[i]) != string_to_index_map.end()) {
283 index = string_to_index_map.find(fluid.
aliases[i])->second;
286 if (string_to_index_map.find(
upper(fluid.
aliases[i])) != string_to_index_map.end()) {
287 index = string_to_index_map.find(
upper(fluid.
aliases[i]))->second;
293 bool fluid_exists =
false;
295 if (index != fluid_map.size()) {
297 name_vector.pop_back();
299 throw ValueError(
format(
"Cannot load fluid [%s:%s] because it is already in library; index = [%i] of [%i]; Consider enabling the "
300 "config boolean variable OVERWRITE_FLUIDS",
301 fluid.
name.c_str(), fluid.
CAS.c_str(), index, fluid_map.size()));
313 if (fluid_exists) fluid_map.erase(fluid_map.find(index));
315 fluid_map[index] = fluid;
322 if (fluid_exists) JSONstring_map.erase(JSONstring_map.find(index));
330 string_to_index_map[fluid.
CAS] = index;
335 string_to_index_map[fluid.
name] = index;
340 for (std::size_t i = 0; i < fluid.
aliases.size(); ++i) {
341 string_to_index_map[fluid.
aliases[i]] = index;
349 std::cout <<
format(
"Loaded fluid: %s - Number of fluids = %d\n", fluid.
name, fluid_map.size());
352 }
catch (
const std::exception& e) {
353 throw ValueError(
format(
"Unable to load fluid [%s] due to error: %s", fluid.
name.c_str(), e.what()));
368 return library.
get(fluid_string);