CoolProp 8.0.0
An open-source fluid property and humid air property database
emscripten_interface.cxx
Go to the documentation of this file.
1
7
8#ifdef EMSCRIPTEN
9
10# include "CoolProp/CoolProp.h"
16# include "CoolProp/CoolPropLib.h"
17
23
24# include <emscripten/bind.h>
25# include <emscripten/val.h>
26using namespace emscripten;
27
28namespace {
29// Convert std::vector<double> → JS Array via emscripten::val.
30// Used by the JS bindings so callers get native JS arrays (with .length /
31// [i] / iterator support) instead of an embind VectorDouble wrapper, and
32// so the binding surface doesn't depend on the optional<T> registration
33// that emcc's EMBIND_AOT path doesn't currently generate invokers for
34// (upstream emscripten-core#24540).
35template <class T>
36val vec_to_js_array(const std::vector<T>& v) {
37 val arr = val::array();
38 for (const auto& x : v)
39 arr.call<void>("push", x);
40 return arr;
41}
42
43std::vector<double> js_array_to_vec(const val& arr) {
44 const unsigned n = arr["length"].as<unsigned>();
45 std::vector<double> v;
46 v.reserve(n);
47 for (unsigned i = 0; i < n; ++i)
48 v.push_back(arr[i].as<double>());
49 return v;
50}
51} // namespace
52
53// Binding code
54EMSCRIPTEN_BINDINGS(coolprop_bindings) {
55 function("F2K", &F2K);
56 function("Props1SI", &CoolProp::Props1SI);
57 function("PropsSI", &CoolProp::PropsSI);
58 function("get_global_param_string", &CoolProp::get_global_param_string);
59 function("get_fluid_param_string", &CoolProp::get_fluid_param_string);
60 function("apply_simple_mixing_rule", &CoolProp::apply_simple_mixing_rule);
61 function("get_mixture_binary_pair_data", &CoolProp::get_mixture_binary_pair_data);
62 function("add_fluids_as_JSON", &CoolProp::add_fluids_as_JSON);
63
64 enum_<CoolProp::parameters>("parameters")
65 .value("igas_constant", CoolProp::igas_constant)
66 .value("imolar_mass", CoolProp::imolar_mass)
67 .value("iacentric_factor", CoolProp::iacentric_factor)
68 .value("irhomolar_reducing", CoolProp::irhomolar_reducing)
69 .value("irhomolar_critical", CoolProp::irhomolar_critical)
70 .value("iT_reducing", CoolProp::iT_reducing)
71 .value("iT_critical", CoolProp::iT_critical)
72 .value("irhomass_reducing", CoolProp::irhomass_reducing)
73 .value("irhomass_critical", CoolProp::irhomass_critical)
74 .value("iP_critical", CoolProp::iP_critical)
75 .value("iP_reducing", CoolProp::iP_reducing)
76 .value("iT_triple", CoolProp::iT_triple)
77 .value("iP_triple", CoolProp::iP_triple)
78 .value("iT_min", CoolProp::iT_min)
79 .value("iT_max", CoolProp::iT_max)
80 .value("iP_max", CoolProp::iP_max)
81 .value("iP_min", CoolProp::iP_min)
82 .value("idipole_moment", CoolProp::idipole_moment)
83 .value("iT", CoolProp::iT)
84 .value("iP", CoolProp::iP)
85 .value("iQ", CoolProp::iQ)
86 .value("iQmass", CoolProp::iQmass)
87 .value("iTau", CoolProp::iTau)
88 .value("iDelta", CoolProp::iDelta)
89 .value("iDmolar", CoolProp::iDmolar)
90 .value("iHmolar", CoolProp::iHmolar)
91 .value("iSmolar", CoolProp::iSmolar)
92 .value("iCpmolar", CoolProp::iCpmolar)
93 .value("iCp0molar", CoolProp::iCp0molar)
94 .value("iCvmolar", CoolProp::iCvmolar)
95 .value("iUmolar", CoolProp::iUmolar)
96 .value("iGmolar", CoolProp::iGmolar)
97 .value("iHelmholtzmolar", CoolProp::iHelmholtzmolar)
98 .value("iHmolar_residual", CoolProp::iHmolar_residual)
99 .value("iSmolar_residual", CoolProp::iSmolar_residual)
100 .value("iGmolar_residual", CoolProp::iGmolar_residual)
101 .value("iHmolar_idealgas", CoolProp::iHmolar_idealgas)
102 .value("iSmolar_idealgas", CoolProp::iSmolar_idealgas)
103 .value("iUmolar_idealgas", CoolProp::iUmolar_idealgas)
104 .value("iDmass", CoolProp::iDmass)
105 .value("iHmass", CoolProp::iHmass)
106 .value("iSmass", CoolProp::iSmass)
107 .value("iCpmass", CoolProp::iCpmass)
108 .value("iCp0mass", CoolProp::iCp0mass)
109 .value("iCvmass", CoolProp::iCvmass)
110 .value("iUmass", CoolProp::iUmass)
111 .value("iGmass", CoolProp::iGmass)
112 .value("iHelmholtzmass", CoolProp::iHelmholtzmass)
113 .value("iHmass_idealgas", CoolProp::iHmass_idealgas)
114 .value("iSmass_idealgas", CoolProp::iSmass_idealgas)
115 .value("iUmass_idealgas", CoolProp::iUmass_idealgas)
116 .value("iviscosity", CoolProp::iviscosity)
117 .value("iconductivity", CoolProp::iconductivity)
118 .value("isurface_tension", CoolProp::isurface_tension)
119 .value("iPrandtl", CoolProp::iPrandtl)
120 .value("ispeed_sound", CoolProp::ispeed_sound)
121 .value("iisothermal_compressibility", CoolProp::iisothermal_compressibility)
122 .value("iisobaric_expansion_coefficient", CoolProp::iisobaric_expansion_coefficient)
123 .value("iisentropic_expansion_coefficient", CoolProp::iisentropic_expansion_coefficient)
124 .value("ifundamental_derivative_of_gas_dynamics", CoolProp::ifundamental_derivative_of_gas_dynamics)
125 .value("ialphar", CoolProp::ialphar)
126 .value("idalphar_dtau_constdelta", CoolProp::idalphar_dtau_constdelta)
127 .value("idalphar_ddelta_consttau", CoolProp::idalphar_ddelta_consttau)
128 .value("ialpha0", CoolProp::ialpha0)
129 .value("idalpha0_dtau_constdelta", CoolProp::idalpha0_dtau_constdelta)
130 .value("idalpha0_ddelta_consttau", CoolProp::idalpha0_ddelta_consttau)
131 .value("id2alpha0_ddelta2_consttau", CoolProp::id2alpha0_ddelta2_consttau)
132 .value("id3alpha0_ddelta3_consttau", CoolProp::id3alpha0_ddelta3_consttau)
133 .value("iBvirial", CoolProp::iBvirial)
134 .value("iCvirial", CoolProp::iCvirial)
135 .value("idBvirial_dT", CoolProp::idBvirial_dT)
136 .value("idCvirial_dT", CoolProp::idCvirial_dT)
137 .value("iZ", CoolProp::iZ)
138 .value("iPIP", CoolProp::iPIP)
139 .value("ifraction_min", CoolProp::ifraction_min)
140 .value("ifraction_max", CoolProp::ifraction_max)
141 .value("iT_freeze", CoolProp::iT_freeze)
142 .value("iGWP20", CoolProp::iGWP20)
143 .value("iGWP100", CoolProp::iGWP100)
144 .value("iGWP500", CoolProp::iGWP500)
145 .value("iFH", CoolProp::iFH)
146 .value("iHH", CoolProp::iHH)
147 .value("iPH", CoolProp::iPH)
148 .value("iODP", CoolProp::iODP)
149 .value("iPhase", CoolProp::iPhase)
150 .value("iundefined_parameter", CoolProp::iundefined_parameter);
151
152 enum_<CoolProp::input_pairs>("input_pairs")
153 .value("QT_INPUTS", CoolProp::QT_INPUTS)
154 .value("QmassT_INPUTS", CoolProp::QmassT_INPUTS)
155 .value("PQ_INPUTS", CoolProp::PQ_INPUTS)
156 .value("PQmass_INPUTS", CoolProp::PQmass_INPUTS)
157 .value("QSmolar_INPUTS", CoolProp::QSmolar_INPUTS)
158 .value("QmassSmolar_INPUTS", CoolProp::QmassSmolar_INPUTS)
159 .value("QSmass_INPUTS", CoolProp::QSmass_INPUTS)
160 .value("QmassSmass_INPUTS", CoolProp::QmassSmass_INPUTS)
161 .value("HmolarQ_INPUTS", CoolProp::HmolarQ_INPUTS)
162 .value("HmolarQmass_INPUTS", CoolProp::HmolarQmass_INPUTS)
163 .value("HmassQ_INPUTS", CoolProp::HmassQ_INPUTS)
164 .value("HmassQmass_INPUTS", CoolProp::HmassQmass_INPUTS)
165 .value("DmolarQ_INPUTS", CoolProp::DmolarQ_INPUTS)
166 .value("DmolarQmass_INPUTS", CoolProp::DmolarQmass_INPUTS)
167 .value("DmassQ_INPUTS", CoolProp::DmassQ_INPUTS)
168 .value("DmassQmass_INPUTS", CoolProp::DmassQmass_INPUTS)
169 .value("PT_INPUTS", CoolProp::PT_INPUTS)
170 .value("DmassT_INPUTS", CoolProp::DmassT_INPUTS)
171 .value("DmolarT_INPUTS", CoolProp::DmolarT_INPUTS)
172 .value("HmolarT_INPUTS", CoolProp::HmolarT_INPUTS)
173 .value("HmassT_INPUTS", CoolProp::HmassT_INPUTS)
174 .value("SmolarT_INPUTS", CoolProp::SmolarT_INPUTS)
175 .value("SmassT_INPUTS", CoolProp::SmassT_INPUTS)
176 .value("TUmolar_INPUTS", CoolProp::TUmolar_INPUTS)
177 .value("TUmass_INPUTS", CoolProp::TUmass_INPUTS)
178 .value("DmassP_INPUTS", CoolProp::DmassP_INPUTS)
179 .value("DmolarP_INPUTS", CoolProp::DmolarP_INPUTS)
180 .value("HmassP_INPUTS", CoolProp::HmassP_INPUTS)
181 .value("HmolarP_INPUTS", CoolProp::HmolarP_INPUTS)
182 .value("PSmass_INPUTS", CoolProp::PSmass_INPUTS)
183 .value("PSmolar_INPUTS", CoolProp::PSmolar_INPUTS)
184 .value("PUmass_INPUTS", CoolProp::PUmass_INPUTS)
185 .value("PUmolar_INPUTS", CoolProp::PUmolar_INPUTS)
186 .value("HmassSmass_INPUTS", CoolProp::HmassSmass_INPUTS)
187 .value("HmolarSmolar_INPUTS", CoolProp::HmolarSmolar_INPUTS)
188 .value("SmassUmass_INPUTS", CoolProp::SmassUmass_INPUTS)
189 .value("SmolarUmolar_INPUTS", CoolProp::SmolarUmolar_INPUTS)
190 .value("DmassHmass_INPUTS", CoolProp::DmassHmass_INPUTS)
191 .value("DmolarHmolar_INPUTS", CoolProp::DmolarHmolar_INPUTS)
192 .value("DmassSmass_INPUTS", CoolProp::DmassSmass_INPUTS)
193 .value("DmolarSmolar_INPUTS", CoolProp::DmolarSmolar_INPUTS)
194 .value("DmassUmass_INPUTS", CoolProp::DmassUmass_INPUTS)
195 .value("DmolarUmolar_INPUTS", CoolProp::DmolarUmolar_INPUTS);
196
197 enum_<CoolProp::phases>("phases")
198 .value("iphase_liquid", CoolProp::iphase_liquid)
199 .value("iphase_supercritical", CoolProp::iphase_supercritical)
200 .value("iphase_supercritical_gas", CoolProp::iphase_supercritical_gas)
201 .value("iphase_supercritical_liquid", CoolProp::iphase_supercritical_liquid)
202 .value("iphase_critical_point", CoolProp::iphase_critical_point)
203 .value("iphase_gas", CoolProp::iphase_gas)
204 .value("iphase_twophase", CoolProp::iphase_twophase)
205 .value("iphase_unknown", CoolProp::iphase_unknown)
206 .value("iphase_not_imposed", CoolProp::iphase_not_imposed);
207
208 enum_<CoolProp::backend_families>("backend_families")
209 .value("INVALID_BACKEND_FAMILY", CoolProp::INVALID_BACKEND_FAMILY)
210 .value("HEOS_BACKEND_FAMILY", CoolProp::HEOS_BACKEND_FAMILY)
211 .value("REFPROP_BACKEND_FAMILY", CoolProp::REFPROP_BACKEND_FAMILY)
212 .value("INCOMP_BACKEND_FAMILY", CoolProp::INCOMP_BACKEND_FAMILY)
213 .value("IF97_BACKEND_FAMILY", CoolProp::IF97_BACKEND_FAMILY)
214 .value("TREND_BACKEND_FAMILY", CoolProp::TREND_BACKEND_FAMILY)
215 .value("TTSE_BACKEND_FAMILY", CoolProp::TTSE_BACKEND_FAMILY)
216 .value("BICUBIC_BACKEND_FAMILY", CoolProp::BICUBIC_BACKEND_FAMILY)
217 .value("SRK_BACKEND_FAMILY", CoolProp::SRK_BACKEND_FAMILY)
218 .value("PR_BACKEND_FAMILY", CoolProp::PR_BACKEND_FAMILY)
219 .value("VTPR_BACKEND_FAMILY", CoolProp::VTPR_BACKEND_FAMILY)
220 .value("PCSAFT_BACKEND_FAMILY", CoolProp::PCSAFT_BACKEND_FAMILY)
221 .value("SVDSBTL_BACKEND_FAMILY", CoolProp::SVDSBTL_BACKEND_FAMILY);
222}
223// Binding code
224EMSCRIPTEN_BINDINGS(humid_air_bindings) {
225 function("HAPropsSI", &HumidAir::HAPropsSI);
226}
227
228CoolProp::AbstractState* factory(const std::string& backend, const std::string& fluid_names) {
229 return CoolProp::AbstractState::factory(backend, strsplit(fluid_names, '&'));
230}
231
232// Binding code
233EMSCRIPTEN_BINDINGS(abstract_state_bindings) {
234
235 function("factory", &factory, allow_raw_pointers());
236
237 class_<CoolProp::AbstractState>("AbstractState")
238 .function("backend_name", &CoolProp::AbstractState::backend_name)
239 .function("using_mole_fractions", &CoolProp::AbstractState::using_mole_fractions)
240 .function("using_mass_fractions", &CoolProp::AbstractState::using_mass_fractions)
241 .function("using_volu_fractions", &CoolProp::AbstractState::using_volu_fractions)
242
243 // Fraction setters/getters: accept and return native JS Arrays via
244 // emscripten::val. JS callers do `AS.set_mole_fractions([0.4, 0.6])`
245 // and read `AS.get_mole_fractions()[i]` with no VectorDouble wrapper.
246 .function(
247 "set_mass_fractions", +[](CoolProp::AbstractState& self, val arr) { self.set_mass_fractions(js_array_to_vec(arr)); })
248 .function(
249 "set_volu_fractions", +[](CoolProp::AbstractState& self, val arr) { self.set_volu_fractions(js_array_to_vec(arr)); })
250 .function(
251 "set_mole_fractions", +[](CoolProp::AbstractState& self, val arr) { self.set_mole_fractions(js_array_to_vec(arr)); })
252 .function(
253 "mole_fractions_liquid", +[](CoolProp::AbstractState& self) { return vec_to_js_array(self.mole_fractions_liquid_double()); })
254 .function(
255 "mole_fractions_vapor", +[](CoolProp::AbstractState& self) { return vec_to_js_array(self.mole_fractions_vapor_double()); })
256 .function(
257 "get_mole_fractions", +[](CoolProp::AbstractState& self) { return vec_to_js_array(self.get_mole_fractions()); })
258 .function(
259 "get_mass_fractions", +[](CoolProp::AbstractState& self) { return vec_to_js_array(self.get_mass_fractions()); })
260
261 .function("update", &CoolProp::AbstractState::update)
262
263 .function("T", &CoolProp::AbstractState::T)
264 .function("rhomolar", &CoolProp::AbstractState::rhomolar)
265 .function("rhomass", &CoolProp::AbstractState::rhomass)
266 .function("p", &CoolProp::AbstractState::p)
267 .function("Q", &CoolProp::AbstractState::Q)
268 .function("tau", &CoolProp::AbstractState::tau)
269 .function("delta", &CoolProp::AbstractState::delta)
270 .function("molar_mass", &CoolProp::AbstractState::molar_mass)
271 .function("acentric_factor", &CoolProp::AbstractState::acentric_factor)
272 .function("gas_constant", &CoolProp::AbstractState::gas_constant)
273 .function("Bvirial", &CoolProp::AbstractState::Bvirial)
274 .function("Cvirial", &CoolProp::AbstractState::Cvirial)
275 .function("compressibility_factor", &CoolProp::AbstractState::compressibility_factor)
276 .function("hmolar", &CoolProp::AbstractState::hmolar)
277 .function("hmass", &CoolProp::AbstractState::hmass)
278 .function("smolar", &CoolProp::AbstractState::smolar)
279 .function("smass", &CoolProp::AbstractState::smass)
280 .function("umolar", &CoolProp::AbstractState::umolar)
281 .function("umass", &CoolProp::AbstractState::umass)
282 .function("cpmolar", &CoolProp::AbstractState::cpmolar)
283 .function("cpmass", &CoolProp::AbstractState::cpmass)
284 .function("cvmolar", &CoolProp::AbstractState::cvmolar)
285 .function("cvmass", &CoolProp::AbstractState::cvmass)
286 .function("gibbsmolar", &CoolProp::AbstractState::gibbsmolar)
287 .function("gibbsmass", &CoolProp::AbstractState::gibbsmass)
288 .function("helmholtzmolar", &CoolProp::AbstractState::helmholtzmolar)
289 .function("helmholtzmass", &CoolProp::AbstractState::helmholtzmass)
290
291 .function("speed_sound", &CoolProp::AbstractState::speed_sound)
292 .function("isothermal_compressibility", &CoolProp::AbstractState::isothermal_compressibility)
293 .function("isobaric_expansion_coefficient", &CoolProp::AbstractState::isobaric_expansion_coefficient)
294 .function("isentropic_expansion_coefficient", &CoolProp::AbstractState::isentropic_expansion_coefficient)
295 .function("viscosity", &CoolProp::AbstractState::viscosity)
296 .function("conductivity", &CoolProp::AbstractState::conductivity)
297 .function("surface_tension", &CoolProp::AbstractState::surface_tension)
298 .function("Prandtl", &CoolProp::AbstractState::Prandtl)
299
300 .function("keyed_output", &CoolProp::AbstractState::keyed_output)
301 .function("trivial_keyed_output", &CoolProp::AbstractState::trivial_keyed_output)
302 .function("saturated_liquid_keyed_output", &CoolProp::AbstractState::saturated_liquid_keyed_output)
303 .function("saturated_vapor_keyed_output", &CoolProp::AbstractState::saturated_vapor_keyed_output)
304
305 .function("first_partial_deriv", &CoolProp::AbstractState::first_partial_deriv)
306 .function("second_partial_deriv", &CoolProp::AbstractState::second_partial_deriv)
307 .function("first_saturation_deriv", &CoolProp::AbstractState::first_saturation_deriv)
308 .function("second_saturation_deriv", &CoolProp::AbstractState::second_saturation_deriv)
309 .function("first_two_phase_deriv", &CoolProp::AbstractState::first_two_phase_deriv)
310 .function("second_two_phase_deriv", &CoolProp::AbstractState::second_two_phase_deriv)
311 .function("first_two_phase_deriv_splined", &CoolProp::AbstractState::first_two_phase_deriv_splined)
312
313 .function("build_phase_envelope", &CoolProp::AbstractState::build_phase_envelope)
314 .function(
315 "get_phase_envelope_data",
316 +[](CoolProp::AbstractState& self) {
317 // Return a plain JS object with one Array per PHASE_ENVELOPE_VECTORS
318 // field (T, p, lnT, lnp, …). JS reads them as `data.T[i]` directly.
320 val obj = val::object();
321# define X(name) obj.set(#name, vec_to_js_array(d.name));
323# undef X
324 return obj;
325 })
326
327 .function("melting_line", &CoolProp::AbstractState::melting_line)
328 .function("saturation_ancillary", &CoolProp::AbstractState::saturation_ancillary)
329
330 .function("T_critical", &CoolProp::AbstractState::T_critical)
331 .function("p_critical", &CoolProp::AbstractState::p_critical)
332 .function("rhomolar_critical", &CoolProp::AbstractState::rhomolar_critical)
333 .function("rhomass_critical", &CoolProp::AbstractState::rhomass_critical)
334
335 .function("T_reducing", &CoolProp::AbstractState::T_reducing)
336 .function("rhomolar_reducing", &CoolProp::AbstractState::rhomolar_reducing)
337 .function("rhomass_reducing", &CoolProp::AbstractState::rhomass_reducing)
338
339 .function("p_triple", &CoolProp::AbstractState::p_triple)
340 .function("Ttriple", &CoolProp::AbstractState::Ttriple)
341 .function("Tmin", &CoolProp::AbstractState::Tmin)
342 .function("Tmax", &CoolProp::AbstractState::Tmax)
343 .function("pmax", &CoolProp::AbstractState::pmax)
344
345 .function("dipole_moment", &CoolProp::AbstractState::dipole_moment);
346}
347
348#endif