1
2pub fn unconstrained_dx(d_x_nacl:Result<f64,String>) -> Result<[f64;2],String> {
14 match d_x_nacl {
15 Ok(d_x_nacl) => {
16 Ok([0.0,d_x_nacl]) },
18 Err(e) => Err(e)
19 }
20}
21
22pub fn intenstive_dn(d_x_nacl:Result<f64,String>,x_nacl: f64) -> Result<[f64;2],String> {
34 match d_x_nacl {
35 Ok(d_x_nacl) => {
36 Ok([-x_nacl*d_x_nacl,d_x_nacl*(1.0-x_nacl)])
37 },
38 Err(e) => Err(e)
39 }
40}
41
42pub fn extenstive_dn(d_x_nacl:Result<f64,String>,prop_value:Result<f64,String>,x_nacl: f64) -> Result<[f64;2],String> {
56 match d_x_nacl {
57 Ok(d_x_nacl) => {
58 match prop_value {
59 Ok(prop_value) => Ok([prop_value-x_nacl*d_x_nacl,prop_value-d_x_nacl*(x_nacl-1.0)]),
60 Err(e) => Err(e)
61 }
62 },
63 Err(e) => Err(e)
64 }
65}
66
67pub fn extenstive_reciprocal_dn(d_x_nacl:Result<f64,String>,prop_value:Result<f64,String>,x_nacl: f64) -> Result<[f64;2],String> {
83 match d_x_nacl {
84 Ok(d_x_nacl) => {
85 match prop_value {
86 Ok(prop_value) => {
87 let denom=1.0/(prop_value*prop_value);
88 Ok([(x_nacl*d_x_nacl+prop_value)*denom,(prop_value+ d_x_nacl*(x_nacl-1.0))*denom])
89 },
90 Err(e) => Err(e)
91 }
92 },
93 Err(e) => Err(e)
94 }
95}
96
97pub fn viscosity(temperature: f64,x_nacl: f64) -> Result<f64,String> {
112 if temperature<273.15 || temperature>453.15 {
113 return Err(format!("temperature of {} K is out of valid [273.15,453.15] K range for viscosity correlation",temperature));
114 }
115 if x_nacl<0.0 || x_nacl>0.05159128949 {
116 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.05159128949] mol/mol range for viscosity correlation",x_nacl));
117 }
118 let term1=temperature*temperature;
119 let term2=x_nacl*x_nacl;
120 let term3=0.4042772e2*x_nacl+0.1801528e2;
121 let term4=term3*term3;
122 Ok(0.9340370609e-5/(0.157e0*term1-0.65361298e2*temperature+0.6711409854e4)/term4*(term1*(x_nacl-0.7218318162e-1)*x_nacl+temperature*(-0.6982851317e3*term2+0.5458304152e2*x_nacl)+0.1395387535e6*term2-0.7306275892e4*x_nacl+0.2337263018e3)*(term1-0.4163140000e3*temperature+0.1914133818e6))
123}
124
125pub fn viscosity_d_pressure(temperature: f64,x_nacl: f64) -> Result<f64,String> {
140 if temperature<273.15 || temperature>453.15 {
141 return Err(format!("temperature of {} K is out of valid [273.15,453.15] K range for viscosity correlation",temperature));
142 }
143 if x_nacl<0.0 || x_nacl>0.05159128949 {
144 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.05159128949] mol/mol range for viscosity correlation",x_nacl));
145 }
146 Ok(0.0)
147}
148
149pub fn viscosity_d_temperature(temperature: f64,x_nacl: f64) -> Result<f64,String> {
164 if temperature<273.15 || temperature>453.15 {
165 return Err(format!("temperature of {} K is out of valid [273.15,453.15] K range for viscosity correlation",temperature));
166 }
167 if x_nacl<0.0 || x_nacl>0.05159128949 {
168 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.05159128949] mol/mol range for viscosity correlation",x_nacl));
169 }
170 let term1=x_nacl*x_nacl;
171 let term2=temperature*temperature;
172 let term3=term2*term2;
173 let term4=0.4042772e2*x_nacl+0.1801528e2;
174 let term5=term4*term4;
175 let term6=0.157e0*term2-0.65361298e2*temperature+0.6711409854e4;
176 let term7=term6*term6;
177 Ok(1.0/term7/term5*(term3*temperature*(0.2932876371e-5*term1-0.2117043476e-6*x_nacl)+term3*(-0.3465986968e-2*term1+0.256313624e-3*x_nacl)+term2*temperature*(0.1611670969e1*term1-0.1214375971e0*x_nacl)+term2*(-0.307940248e3*term1+0.2290305268e2*x_nacl+0.1e-9)+temperature*(-0.3960896e3*term1-0.139556869e4*x_nacl-0.1019087985e3)+0.2121302976e5-0.81689311e4*x_nacl+0.428573361e7*term1))
178}
179
180pub fn viscosity_d_x_nacl(temperature: f64,x_nacl: f64) -> Result<f64,String> {
195 if temperature<273.15 || temperature>453.15 {
196 return Err(format!("temperature of {} K is out of valid [273.15,453.15] K range for viscosity correlation",temperature));
197 }
198 if x_nacl<0.0 || x_nacl>0.05159128949 {
199 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.05159128949] mol/mol range for viscosity correlation",x_nacl));
200 }
201 let term1=temperature*temperature;
202 let term2=x_nacl*x_nacl;
203 let term3=0.4042772e2*x_nacl+0.1801528e2;
204 let term4=term3*term3;
205 Ok(1.0/term4/term3/(0.157e0*term1-0.65361298e2*temperature+0.6711409854e4)*(term1-0.416314e3*temperature+0.1914133818e6)*(-0.1405937326e1+0.3637958667e-3*term1*x_nacl-0.1214622007e-4*term1+0.2e-9*term2*temperature-0.255611125e0*temperature*x_nacl+0.91846552e-2*temperature+0.4971912439e2*x_nacl))
206}
207
208pub fn thermal_conductivity(temperature: f64,x_nacl: f64) -> Result<f64,String> {
223 if temperature<273.15 || temperature>453.15 {
224 return Err(format!("temperature of {} K is out of valid [273.15,453.15] K range for thermal conductivity correlation",temperature));
225 }
226 if x_nacl<0.0 || x_nacl>0.05545875778 {
227 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.05545875778] mol/mol range for thermal conductivity correlation",x_nacl));
228 }
229 let term1=f64::powf(((0.3488753105e9-0.5053465000e6*temperature)*x_nacl+0.145698577e9-0.225191e6*temperature)/(0.3488753105e9*x_nacl+0.145698577e9),0.001);
230 let term2=term1*term1;
231 let term3=term2*term2;
232 let term4=term3*term3;
233 let term5=term4*term4;
234 let term6=term5*term5;
235 let term7=term6*term6;
236 let term8=term7*term7;
237 let term9=term8*term8;
238 let term10=0.4042772000e2*x_nacl+0.1801528000e2;
239 let term11=1.0/term10;
240 let term12=f64::ln(term11*(0.9714341400e4*x_nacl+0.4323667200e4));
241 let term13=f64::exp(0.1e1/temperature*term11*(term9*term7*term4*term3*term1*((0.9292070654e2*x_nacl+0.4140704809e2)*temperature-0.1603843028e5*x_nacl-0.6184052623e4)+term12*temperature*term10));
242 Ok(0.001*term13)
243}
244
245pub fn thermal_conductivity_d_temperature(temperature: f64,x_nacl: f64) -> Result<f64,String> {
260 if temperature<273.15 || temperature>453.15 {
261 return Err(format!("temperature of {} K is out of valid [273.15,453.15] K range for thermal conductivity correlation",temperature));
262 }
263 if x_nacl<0.0 || x_nacl>0.05545875778 {
264 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.05545875778] mol/mol range for thermal conductivity correlation",x_nacl));
265 }
266 let term1=0.9292070654e2*x_nacl+0.4140704809e2;
267 let term2=1.0/(0.3488753105e9*x_nacl+0.145698577e9);
268 let term3=f64::powf(term2*((0.3488753105e9-0.5053465000e6*temperature)*x_nacl+0.145698577e9-0.225191e6*temperature),0.001);
269 let term4=term3*term3;
270 let term5=term4*term4;
271 let term6=term5*term5;
272 let term7=term6*term6;
273 let term8=term7*term7;
274 let term9=term8*term8;
275 let term10=term9*term9;
276 let term11=term10*term10;
277 let term12=term11*term9*term6*term5*term3;
278 let term13=temperature*term1-0.1603843028e5*x_nacl-0.6184052623e4;
279 let term14=term11*term11;
280 let term15=0.4042772000e2*x_nacl+0.1801528000e2;
281 let term16=1.0/term15;
282 let term17=f64::ln(term16*(0.9714341400e4*x_nacl+0.4323667200e4));
283 let term18=1.0/temperature;
284 let term19=term16*(term17*temperature*term15+term12*term13);
285 let term20=temperature*temperature;
286 let term21=f64::exp(term18*term19);
287 Ok(0.001*term21*(term18*term16*(term12*term1+0.333e3/0.1000e4*term2*(-0.5053465000e6*x_nacl-0.225191e6)/term14/term10/term7/term6/term4/term3*term13+term17*term15)-0.1e1/term20*term19))
288}
289
290pub fn thermal_conductivity_d_pressure(temperature: f64,x_nacl: f64) -> Result<f64,String> {
305 if temperature<273.15 || temperature>453.15 {
306 return Err(format!("temperature of {} K is out of valid [273.15,453.15] K range for thermal conductivity correlation",temperature));
307 }
308 if x_nacl<0.0 || x_nacl>0.05545875778 {
309 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.05545875778] mol/mol range for thermal conductivity correlation",x_nacl));
310 }
311 Ok(0.0)
312}
313
314pub fn thermal_conductivity_d_x_nacl(temperature: f64,x_nacl: f64) -> Result<f64,String> {
329 if temperature<273.15 || temperature>453.15 {
330 return Err(format!("temperature of {} K is out of valid [273.15,453.15] K range for thermal conductivity correlation",temperature));
331 }
332 if x_nacl<0.0 || x_nacl>0.05545875778 {
333 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.05545875778] mol/mol range for thermal conductivity correlation",x_nacl));
334 }
335 let term1=0.3488753105e9-0.5053465000e6*temperature;
336 let term2=x_nacl*term1+0.145698577e9-0.225191e6*temperature;
337 let term3=0.3488753105e9*x_nacl+0.145698577e9;
338 let term4=1.0/term3;
339 let term5=f64::powf(term4*term2,0.001);
340 let term6=term5*term5;
341 let term7=term6*term6;
342 let term8=term7*term7;
343 let term9=term8*term8;
344 let term10=term9*term9;
345 let term11=term10*term10;
346 let term12=term11*term11;
347 let term13=term12*term12;
348 let term14=term13*term11*term8*term7*term5;
349 let term15=(0.9292070654e2*x_nacl+0.4140704809e2)*temperature-0.1603843028e5*x_nacl-0.6184052623e4;
350 let term16=term13*term13;
351 let term17=term3*term3;
352 let term18=0.9714341400e4*x_nacl+0.4323667200e4;
353 let term19=0.4042772000e2*x_nacl+0.1801528000e2;
354 let term20=1.0/term19;
355 let term21=f64::ln(term20*term18);
356 let term22=term19*term19;
357 let term23=1.0/term22;
358 let term24=1.0/temperature;
359 let term25=term21*temperature*term19+term14*term15;
360 let term26=f64::exp(term24*term20*term25);
361 Ok(0.001*term26*(term24*term20*(term14*(0.9292070654e2*temperature-0.1603843028e5)+0.333e3/0.1000e4*(term4*term1-0.3488753105e9/term17*term2)/term16/term12/term9/term8/term6/term5*term15+0.4042772000e2*temperature*term21+0.1e1/term18*(0.9714341400e4*term20-0.4042772000e2*term23*term18)*temperature*term22)-0.4042772000e2*term24*term23*term25))
362}
363
364pub fn enthalpy(temperature: f64,pressure: f64, x_nacl: f64) -> Result<f64,String> {
380 if temperature<273.15 || temperature>393.15 {
381 return Err(format!("temperature of {} K is out of valid [273.15,393.15] K range for enthalpy correlation",temperature));
382 }
383 if x_nacl<0.0 || x_nacl>0.04033898281 {
384 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.04033898281] mol/mol range for enthalpy correlation",x_nacl));
385 }
386 if pressure<0.0 || pressure>12e6 {
387 return Err(format!("pressure of {} Pa is out of valid [0,12e6] Pa range for enthalpy correlation",pressure));
388 }
389 let term1=temperature-0.27315e3;
390 let term2=term1*term1;
391 let term3=term2*term1;
392 let term4=0.4042772e2*x_nacl+0.1801528e2;
393 let term5=1.0/term4*x_nacl;
394 let term6=x_nacl*x_nacl;
395 let term7=term4*term4;
396 let term8=1.0/term7*term6;
397 Ok((0.4042772e-1*x_nacl+0.1801528e-1)*(-0.1147654065e7+0.420207e4*temperature-0.535e0*term2+0.4e-2*term3-0.58443e2*(-0.2161173520e7+0.1842024007e8*term5+0.9572823819e10*term8-0.2886581450e13/term7/term4*term6*x_nacl+0.782607e4*temperature-0.441733e2*term2+0.21394e0*term3-0.1163646884e7*term1*term5+0.9490064212e8*term1*term8+0.5685340884e4*term2*term5)*term5+0.1e-5*(0.1881946590e4-0.32406e1*temperature+0.127e-1*term2-0.47723e-4*term3+0.58443e5*(-0.43679235e1+0.1169e-1*temperature-0.26185e-4*term2+0.70661e-7*term3)*term5)*(pressure-101325.0)))
398}
399
400pub fn enthalpy_d_temperature(temperature: f64,pressure: f64, x_nacl: f64) -> Result<f64,String> {
416 if temperature<273.15 || temperature>393.15 {
417 return Err(format!("temperature of {} K is out of valid [273.15,393.15] K range for enthalpy correlation",temperature));
418 }
419 if x_nacl<0.0 || x_nacl>0.04033898281 {
420 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.04033898281] mol/mol range for enthalpy correlation",x_nacl));
421 }
422 if pressure<0.0 || pressure>12e6 {
423 return Err(format!("pressure of {} Pa is out of valid [0,12e6] Pa range for enthalpy correlation",pressure));
424 }
425 let term1=temperature-0.27315e3;
426 let term2=term1*term1;
427 let term3=0.4042772e2*x_nacl+0.1801528e2;
428 let term4=1.0/term3*x_nacl;
429 let term5=x_nacl*x_nacl;
430 let term6=term3*term3;
431 Ok((0.4042772e-1*x_nacl+0.1801528e-1)*(0.449434050e4-0.1070e1*temperature+0.12e-1*term2-0.58443e2*(0.3195794379e5-0.883466e2*temperature+0.64182e0*term2-0.1163646884e7*term4+0.9490064212e8/term6*term5+0.1137068177e5*term1*term4)*term4+0.1e-5*(-0.10178610e2+0.254e-1*temperature-0.143169e-3*term2+0.58443e5*(0.2599486550e-1-0.52370e-4*temperature+0.211983e-6*term2)*term4)*(pressure-101325.0)))
432}
433
434pub fn enthalpy_d_pressure(temperature: f64,pressure: f64, x_nacl: f64) -> Result<f64,String> {
450 if temperature<273.15 || temperature>393.15 {
451 return Err(format!("temperature of {} K is out of valid [273.15,393.15] K range for enthalpy correlation",temperature));
452 }
453 if x_nacl<0.0 || x_nacl>0.04033898281 {
454 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.04033898281] mol/mol range for enthalpy correlation",x_nacl));
455 }
456 if pressure<0.0 || pressure>12e6 {
457 return Err(format!("pressure of {} Pa is out of valid [0,12e6] Pa range for enthalpy correlation",pressure));
458 }
459 let term1=temperature-0.27315e3;
460 let term2=term1*term1;
461 let term3=term2*term1;
462 Ok((0.4042772e-1*x_nacl+0.1801528e-1)*(0.1881946590e-2-0.32406e-5*temperature+0.127e-7*term2-0.47723e-10*term3+0.58443e-1*(-0.43679235e1+0.1169e-1*temperature-0.26185e-4*term2+0.70661e-7*term3)/(0.4042772e2*x_nacl+0.1801528e2)*x_nacl))
463}
464
465pub fn enthalpy_d_x_nacl(temperature: f64,pressure: f64, x_nacl: f64) -> Result<f64,String> {
481 if temperature<273.15 || temperature>393.15 {
482 return Err(format!("temperature of {} K is out of valid [273.15,393.15] K range for enthalpy correlation",temperature));
483 }
484 if x_nacl<0.0 || x_nacl>0.04033898281 {
485 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.04033898281] mol/mol range for enthalpy correlation",x_nacl));
486 }
487 if pressure<0.0 || pressure>12e6 {
488 return Err(format!("pressure of {} Pa is out of valid [0,12e6] Pa range for enthalpy correlation",pressure));
489 }
490 let term1=0.4042772e2*x_nacl+0.1801528e2;
491 let term2=1.0/term1;
492 let term3=term2*x_nacl;
493 let term4=x_nacl*x_nacl;
494 let term5=term1*term1;
495 let term6=1.0/term5;
496 let term7=term6*term4;
497 let term8=term4*x_nacl;
498 let term9=1.0/term5/term1;
499 let term10=temperature-0.27315e3;
500 let term11=term10*term10;
501 let term12=term11*term10;
502 let term13=-0.2161173520e7+0.1842024007e8*term3+0.9572823819e10*term7-0.2886581450e13*term9*term8+0.782607e4*temperature-0.441733e2*term11+0.21394e0*term12-0.1163646884e7*term10*term3+0.9490064212e8*term10*term7+0.5685340884e4*term11*term3;
503 let term14=term6*x_nacl;
504 let term15=term9*term4;
505 let term16=term5*term5;
506 let term17=pressure-101325.0;
507 let term18=-0.43679235e1+0.1169e-1*temperature-0.26185e-4*term11+0.70661e-7*term12;
508 Ok((0.4042772e-1*x_nacl+0.1801528e-1)*(-0.58443e2*term13*term2+0.2362717240e4*term13*term14-0.58443e2*(0.1842024007e8*term2+0.1840095933e11*term14-0.9433759232e13*term15+0.3500937199e15/term16*term8-0.1163646884e7*term10*term2+0.2368448746e9*term10*term14-0.7673233175e10*term10*term15+0.5685340884e4*term11*term2-0.2298453694e6*term11*term14)*term3+0.1e-5*(0.58443e5*term18*term2-0.2362717240e7*term18*term14)*term17)-0.4639703720e5+0.1698801094e3*temperature-0.2162883020e-1*term11+0.16171088e-3*term12-0.2362717240e1*term13*term3+0.4042772e-7*(0.1881946590e4-0.32406e1*temperature+0.127e-1*term11-0.47723e-4*term12+0.58443e5*term18*term3)*term17)
509}
510
511pub fn solve_temperature_from_enthalpy(enthalpy_value: f64,pressure: f64, x_nacl: f64) -> Result<f64,String> {
529 let mut t_min=273.15;
531 let h_min=enthalpy(t_min,pressure,x_nacl)?;
532 let mut t_max=393.15;
534 let h_max=enthalpy(t_max,pressure,x_nacl)?;
535 if (h_min-enthalpy_value)*(h_max-enthalpy_value)>0.0 {
537 return Err(format!("no solution for enthalpy of {} J/mol, pressure of {} Pa, NaCl mole fraction of {} mol/mol within valid temperature range of [273.15,393.15] K",enthalpy_value,pressure,x_nacl));
538 }
539 let mut temperature=t_min+(enthalpy_value-h_min)/(h_max-h_min)*(t_max-t_min);
541 let max_iterations=100;
542 let mut iteration=0;
543 while iteration<max_iterations {
544 let h=enthalpy(temperature,pressure,x_nacl)?;
546 if f64::abs(h-enthalpy_value)<1e-10*f64::abs(enthalpy_value) {
548 return Ok(temperature);
549 }
550 let dh_dt=enthalpy_d_temperature(temperature,pressure,x_nacl)?;
552 let mut delta_t=(enthalpy_value-h)/dh_dt;
554 if delta_t>0.0 {
556 let lim=temperature+0.95*(t_max-temperature);
557 if temperature+delta_t>lim {
558 delta_t=lim-temperature;
559 }
560 } else {
561 let lim=temperature-0.95*(temperature-t_min);
562 if temperature+delta_t<lim {
563 delta_t=lim-temperature;
564 }
565 }
566 if delta_t>0.0 {
568 t_min=temperature;
569 } else {
570 t_max=temperature;
571 }
572 temperature+=delta_t;
573 iteration+=1;
574 }
575 Err(format!("could not converge to temperature for enthalpy of {} J/mol, pressure of {} Pa, NaCl mole fraction of {} mol/mol",enthalpy_value,pressure,x_nacl))
576}
577
578pub fn entropy(temperature: f64,pressure: f64, x_nacl: f64) -> Result<f64,String> {
594 if temperature<273.15 || temperature>393.15 {
595 return Err(format!("temperature of {} K is out of valid [273.15,393.15] K range for entropy correlation",temperature));
596 }
597 if x_nacl<0.0 || x_nacl>0.04033898281 {
598 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.04033898281] mol/mol range for entropy correlation",x_nacl));
599 }
600 if pressure<0.0 || pressure>12e6 {
601 return Err(format!("pressure of {} Pa is out of valid [0,12e6] Pa range for entropy correlation",pressure));
602 }
603 let term1=temperature-0.27315e3;
604 let term2=term1*term1;
605 let term3=term2*term1;
606 let term4=term2*term2;
607 let term5=0.4042772e2*x_nacl+0.1801528e2;
608 let term6=x_nacl/term5;
609 let term7=x_nacl*x_nacl;
610 let term8=term5*term5;
611 let term9=term7/term8;
612 Ok((0.4042772e-1*x_nacl+0.1801528e-1)*(-0.420171215e4+0.15383e2*temperature-0.2996e-1*term2+0.8193e-4*term3-0.1370e-6*term4-0.58443e2*(-0.74212030e4+0.85502109e6*term6-0.3374597238e9*term9+0.6178145850e11/term8/term5*term7*x_nacl+0.2562e2*temperature-0.1443e0*term2+0.5879e-3*term3-0.357145173e4*term1*term6+0.2746471295e6*term1*term9+0.177374505e2*term2*term6)*term6+0.1e-5*(0.317881150e1-0.11654e-1*temperature+0.61154e-4*term2-0.20696e-6*term3+0.58443e5*(-0.1249385010e-1+0.40054e-4*temperature-0.14193e-6*term2+0.33142e-9*term3)*term6)*(pressure-101325.0)))
613}
614
615pub fn entropy_d_temperature(temperature: f64,pressure: f64, x_nacl: f64) -> Result<f64,String> {
631 if temperature<273.15 || temperature>393.15 {
632 return Err(format!("temperature of {} K is out of valid [273.15,393.15] K range for entropy correlation",temperature));
633 }
634 if x_nacl<0.0 || x_nacl>0.04033898281 {
635 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.04033898281] mol/mol range for entropy correlation",x_nacl));
636 }
637 if pressure<0.0 || pressure>12e6 {
638 return Err(format!("pressure of {} Pa is out of valid [0,12e6] Pa range for entropy correlation",pressure));
639 }
640 let term1=temperature-0.27315e3;
641 let term2=term1*term1;
642 let term3=0.4042772e2*x_nacl+0.1801528e2;
643 let term4=x_nacl/term3;
644 let term5=x_nacl*x_nacl;
645 let term6=term3*term3;
646 Ok((0.4042772e-1*x_nacl+0.1801528e-1)*(0.317501480e2-0.5992e-1*temperature+0.24579e-3*term2-0.5480e-6*term2*term1-0.58443e2*(0.104451090e3-0.2886e0*temperature+0.17637e-2*term2-0.357145173e4*term4+0.2746471295e6/term6*term5+0.354749010e2*term1*term4)*term4+0.1e-5*(-0.4506243020e-1+0.122308e-3*temperature-0.62088e-6*term2+0.58443e5*(0.1175903590e-3-0.28386e-6*temperature+0.99426e-9*term2)*term4)*(pressure-101325.0)))
647}
648
649pub fn entropy_d_pressure(temperature: f64,pressure: f64, x_nacl: f64) -> Result<f64,String> {
665 if temperature<273.15 || temperature>393.15 {
666 return Err(format!("temperature of {} K is out of valid [273.15,393.15] K range for entropy correlation",temperature));
667 }
668 if x_nacl<0.0 || x_nacl>0.04033898281 {
669 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.04033898281] mol/mol range for entropy correlation",x_nacl));
670 }
671 if pressure<0.0 || pressure>12e6 {
672 return Err(format!("pressure of {} Pa is out of valid [0,12e6] Pa range for entropy correlation",pressure));
673 }
674 let term1=temperature-0.27315e3;
675 let term2=term1*term1;
676 let term3=term2*term1;
677 Ok((0.4042772e-1*x_nacl+0.1801528e-1)*(0.317881150e-5-0.11654e-7*temperature+0.61154e-10*term2-0.20696e-12*term3+0.58443e-1*(-0.1249385010e-1+0.40054e-4*temperature-0.14193e-6*term2+0.33142e-9*term3)/(0.4042772e2*x_nacl+0.1801528e2)*x_nacl))
678}
679
680pub fn entropy_d_x_nacl(temperature: f64,pressure: f64, x_nacl: f64) -> Result<f64,String> {
696 if temperature<273.15 || temperature>393.15 {
697 return Err(format!("temperature of {} K is out of valid [273.15,393.15] K range for entropy correlation",temperature));
698 }
699 if x_nacl<0.0 || x_nacl>0.04033898281 {
700 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.04033898281] mol/mol range for entropy correlation",x_nacl));
701 }
702 if pressure<0.0 || pressure>12e6 {
703 return Err(format!("pressure of {} Pa is out of valid [0,12e6] Pa range for entropy correlation",pressure));
704 }
705 let term1=0.4042772e2*x_nacl+0.1801528e2;
706 let term2=1.0/term1;
707 let term3=term2*x_nacl;
708 let term4=x_nacl*x_nacl;
709 let term5=term1*term1;
710 let term6=1.0/term5;
711 let term7=term6*term4;
712 let term8=term4*x_nacl;
713 let term9=term6/term1;
714 let term10=temperature-0.27315e3;
715 let term11=term10*term10;
716 let term12=term11*term10;
717 let term13=-0.74212030e4+0.85502109e6*term3-0.3374597238e9*term7+0.6178145850e11*term9*term8+0.2562e2*temperature-0.1443e0*term11+0.5879e-3*term12-0.357145173e4*term10*term3+0.2746471295e6*term10*term7+0.177374505e2*term11*term3;
718 let term14=term6*x_nacl;
719 let term15=term9*term4;
720 let term16=term5*term5;
721 let term17=pressure-101325.0;
722 let term18=-0.1249385010e-1+0.40054e-4*temperature-0.14193e-6*term11+0.33142e-9*term12;
723 let term19=term11*term11;
724 Ok((0.4042772e-1*x_nacl+0.1801528e-1)*(-0.58443e2*term13*term2+0.2362717240e4*term13*term14-0.58443e2*(0.85502109e6*term2-0.7094860008e9*term14+0.2126298300e12*term15-0.7493050516e13/term16*term8-0.357145173e4*term10*term2+0.6936799095e6*term10*term14-0.2220671450e8*term10*term15+0.177374505e2*term11*term2-0.7170846823e3*term11*term14)*term3+0.1e-5*(0.58443e5*term18*term2-0.2362717240e7*term18*term14)*term17)-0.1698656423e3+0.6218996168e0*temperature-0.1211214491e-2*term11+0.3312243100e-5*term12-0.5538597640e-8*term19-0.2362717240e1*term13*term3+0.4042772e-7*(0.317881150e1-0.11654e-1*temperature+0.61154e-4*term11-0.20696e-6*term12+0.58443e5*term18*term3)*term17)
725}
726
727pub fn solve_temperature_from_entropy(entropy_value: f64,pressure: f64, x_nacl: f64) -> Result<f64,String> {
746 let mut t_min=273.15;
748 let h_min=entropy(t_min,pressure,x_nacl)?;
749 let mut t_max=393.15;
751 let h_max=entropy(t_max,pressure,x_nacl)?;
752 if (h_min-entropy_value)*(h_max-entropy_value)>0.0 {
754 return Err(format!("no solution for entropy of {} J/mol, pressure of {} Pa, NaCl mole fraction of {} mol/mol within valid temperature range of [273.15,393.15] K",entropy_value,pressure,x_nacl));
755 }
756 let mut temperature=t_min+(entropy_value-h_min)/(h_max-h_min)*(t_max-t_min);
758 let max_iterations=100;
759 let mut iteration=0;
760 while iteration<max_iterations {
761 let s=entropy(temperature,pressure,x_nacl)?;
763 if f64::abs(s-entropy_value)<1e-10*f64::abs(entropy_value) {
765 return Ok(temperature);
766 }
767 let ds_dt=entropy_d_temperature(temperature,pressure,x_nacl)?;
769 let mut delta_t=(entropy_value-s)/ds_dt;
771 if delta_t>0.0 {
773 let lim=temperature+0.95*(t_max-temperature);
774 if temperature+delta_t>lim {
775 delta_t=lim-temperature;
776 }
777 } else {
778 let lim=temperature-0.95*(temperature-t_min);
779 if temperature+delta_t<lim {
780 delta_t=lim-temperature;
781 }
782 }
783 if delta_t>0.0 {
785 t_min=temperature;
786 } else {
787 t_max=temperature;
788 }
789 temperature+=delta_t;
790 iteration+=1;
791 }
792 Err(format!("could not converge to temperature for entropy of {} J/mol, pressure of {} Pa, NaCl mole fraction of {} mol/mol",entropy_value,pressure,x_nacl))
793}
794
795pub fn density(temperature: f64,pressure: f64, x_nacl: f64) -> Result<f64,String> {
811 if temperature<273.15 || temperature>453.15 {
812 return Err(format!("temperature of {} K is out of valid [273.15,453.15] K range for density correlation",temperature));
813 }
814 if x_nacl<0.0 || x_nacl>0.05159128949 {
815 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.05159128949] mol/mol range for density correlation",x_nacl));
816 }
817 if pressure<0.0 || pressure>12e6 {
818 return Err(format!("pressure of {} Pa is out of valid [0,12e6] Pa range for density correlation",pressure));
819 }
820 let term1=temperature*temperature;
821 let term2=term1*temperature;
822 let term3=pressure*pressure;
823 let term4=f64::exp(0.1e1/(0.4042772000e2*x_nacl+0.1801528000e2)*(x_nacl*(term3*(0.9419635626e-15-0.5960391229e-17*temperature+0.2254029682e-19*term1-0.2750661641e-22*term2)-0.6896160478e-19*pressure*(term1-0.1389389905e4*temperature+0.5200208026e6)*(term1-0.6955982230e3*temperature+0.1360677953e6)*(temperature-0.1287510847e3)+0.6987534604e-14*(term1-0.1389348523e4*temperature+0.5200298103e6)*(term1-0.6956077280e3*temperature+0.1360524236e6)*(temperature-0.1287829628e3))+term3*(-0.1225741636e-22*term2+0.1004433984e-19*term1+0.2017682395e-15-0.2656051761e-17*temperature)-0.3073046462e-19*pressure*(term1-0.8553297432e3*temperature+0.2081777030e6)*(term1-0.5313454038e3*temperature+0.8146781323e5)*(temperature-0.8270640666e3)+0.3113764328e-14*(term1-0.8554353686e3*temperature+0.2082210058e6)*(term1-0.5313524700e3*temperature+0.8146583390e5)*(temperature-0.8269513755e3)));
824 let term5=x_nacl*x_nacl;
825 let term6=term1*term1;
826 let term7=0.4042772e2*x_nacl+0.1801528e2;
827 let term8=term7*term7;
828 Ok(-0.7611403333e-1/term8/term7*(term6*(term5+0.8912340347e0*x_nacl+0.1985745261e0)+term2*(-0.6282263540e3*term5-0.9831791048e3*x_nacl-0.3133715895e3)+term1*(-0.3203958077e6*term5+0.2926413653e6*x_nacl+0.1941721516e6)+temperature*(0.2958078762e9*term5+0.1483450978e8*x_nacl-0.5220792038e8)-0.9602488223e11*term5-0.4103990941e11*x_nacl+0.7907375557e9)*term4)
829}
830
831pub fn density_d_temperature(temperature: f64,pressure: f64, x_nacl: f64) -> Result<f64,String> {
847 if temperature<273.15 || temperature>453.15 {
848 return Err(format!("temperature of {} K is out of valid [273.15,453.15] K range for density correlation",temperature));
849 }
850 if x_nacl<0.0 || x_nacl>0.05159128949 {
851 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.05159128949] mol/mol range for density correlation",x_nacl));
852 }
853 if pressure<0.0 || pressure>12e6 {
854 return Err(format!("pressure of {} Pa is out of valid [0,12e6] Pa range for density correlation",pressure));
855 }
856 let term1=temperature*temperature;
857 let term2=pressure*pressure;
858 let term3=term1-0.6955982230e3*temperature+0.1360677953e6;
859 let term4=term1-0.1389389905e4*temperature+0.5200208026e6;
860 let term5=temperature-0.1287510847e3;
861 let term6=2.0*temperature;
862 let term7=pressure*term4;
863 let term8=term3*term5;
864 let term9=term1-0.6956077280e3*temperature+0.1360524236e6;
865 let term10=term1-0.1389348523e4*temperature+0.5200298103e6;
866 let term11=temperature-0.1287829628e3;
867 let term12=term9*term11;
868 let term13=term1-0.5313454038e3*temperature+0.8146781323e5;
869 let term14=term1-0.8553297432e3*temperature+0.2081777030e6;
870 let term15=temperature-0.8270640666e3;
871 let term16=pressure*term14;
872 let term17=term13*term15;
873 let term18=term1-0.5313524700e3*temperature+0.8146583390e5;
874 let term19=term1-0.8554353686e3*temperature+0.2082210058e6;
875 let term20=temperature-0.8269513755e3;
876 let term21=term18*term20;
877 let term22=1.0/(0.4042772000e2*x_nacl+0.1801528000e2);
878 let term23=term1*temperature;
879 let term24=f64::exp(term22*(x_nacl*(term2*(0.9419635626e-15-0.5960391229e-17*temperature+0.2254029682e-19*term1-0.2750661641e-22*term23)-0.6896160478e-19*term7*term8+0.6987534604e-14*term10*term12)+term2*(-0.1225741636e-22*term23+0.1004433984e-19*term1+0.2017682395e-15-0.2656051761e-17*temperature)-0.3073046462e-19*term17*term16+0.3113764328e-14*term19*term21));
880 let term25=x_nacl*x_nacl;
881 let term26=term25+0.8912340347e0*x_nacl+0.1985745261e0;
882 let term27=term1*term1;
883 let term28=-0.6282263540e3*term25-0.9831791048e3*x_nacl-0.3133715895e3;
884 let term29=-0.3203958077e6*term25+0.2926413653e6*x_nacl+0.1941721516e6;
885 let term30=0.2958078762e9*term25;
886 let term31=0.1483450978e8*x_nacl;
887 let term32=0.4042772e2*x_nacl+0.1801528e2;
888 let term33=term32*term32;
889 let term34=1.0/term33/term32;
890 Ok(-0.7611403333e-1*term34*(term27*term26+term23*term28+term1*term29+temperature*(term30+term31-0.5220792038e8)-0.9602488223e11*term25-0.4103990941e11*x_nacl+0.7907375557e9)*term24*term22*(x_nacl*(term2*(-0.5960391229e-17+0.4508059364e-19*temperature-0.8251984923e-22*term1)-0.6896160478e-19*pressure*term4*term3-0.6896160478e-19*term7*(term6-0.6955982230e3)*term5-0.6896160478e-19*pressure*(term6-0.1389389905e4)*term8+0.6987534604e-14*term10*term9+0.6987534604e-14*term10*(term6-0.6956077280e3)*term11+0.6987534604e-14*(term6-0.1389348523e4)*term12)+term2*(-0.3677224908e-22*term1+0.2008867968e-19*temperature-0.2656051761e-17)-0.3073046462e-19*pressure*term14*term13-0.3073046462e-19*term16*(term6-0.5313454038e3)*term15-0.3073046462e-19*pressure*(term6-0.8553297432e3)*term17+0.3113764328e-14*term19*term18+0.3113764328e-14*term19*(term6-0.5313524700e3)*term20+0.3113764328e-14*(term6-0.8554353686e3)*term21)-0.7611403333e-1*term34*(0.4e1*term23*term26+0.3e1*term1*term28+0.2e1*temperature*term29+term30+term31-0.5220792038e8)*term24)
891}
892
893pub fn density_d_pressure(temperature: f64,pressure: f64, x_nacl: f64) -> Result<f64,String> {
909 if temperature<273.15 || temperature>453.15 {
910 return Err(format!("temperature of {} K is out of valid [273.15,453.15] K range for density correlation",temperature));
911 }
912 if x_nacl<0.0 || x_nacl>0.05159128949 {
913 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.05159128949] mol/mol range for density correlation",x_nacl));
914 }
915 if pressure<0.0 || pressure>12e6 {
916 return Err(format!("pressure of {} Pa is out of valid [0,12e6] Pa range for density correlation",pressure));
917 }
918 let term1=temperature*temperature;
919 let term2=term1*temperature;
920 let term3=0.9419635626e-15-0.5960391229e-17*temperature+0.2254029682e-19*term1-0.2750661641e-22*term2;
921 let term4=(term1-0.6955982230e3*temperature+0.1360677953e6)*(temperature-0.1287510847e3);
922 let term5=term1-0.1389389905e4*temperature+0.5200208026e6;
923 let term6=-0.1225741636e-22*term2+0.1004433984e-19*term1+0.2017682395e-15-0.2656051761e-17*temperature;
924 let term7=(term1-0.5313454038e3*temperature+0.8146781323e5)*(temperature-0.8270640666e3);
925 let term8=term1-0.8553297432e3*temperature+0.2081777030e6;
926 let term9=1.0/(0.4042772000e2*x_nacl+0.1801528000e2);
927 let term10=pressure*pressure;
928 let term11=f64::exp(term9*(x_nacl*(term10*term3-0.6896160478e-19*pressure*term5*term4+0.6987534604e-14*(term1-0.1389348523e4*temperature+0.5200298103e6)*(term1-0.6956077280e3*temperature+0.1360524236e6)*(temperature-0.1287829628e3))+term10*term6-0.3073046462e-19*pressure*term8*term7+0.3113764328e-14*(term1-0.8554353686e3*temperature+0.2082210058e6)*(term1-0.5313524700e3*temperature+0.8146583390e5)*(temperature-0.8269513755e3)));
929 let term12=x_nacl*x_nacl;
930 let term13=term1*term1;
931 let term14=0.4042772e2*x_nacl+0.1801528e2;
932 let term15=term14*term14;
933 Ok(-0.7611403333e-1/term15/term14*(term13*(term12+0.8912340347e0*x_nacl+0.1985745261e0)+term2*(-0.6282263540e3*term12-0.9831791048e3*x_nacl-0.3133715895e3)+term1*(-0.3203958077e6*term12+0.2926413653e6*x_nacl+0.1941721516e6)+temperature*(0.2958078762e9*term12+0.1483450978e8*x_nacl-0.5220792038e8)-0.9602488223e11*term12-0.4103990941e11*x_nacl+0.7907375557e9)*term11*term9*(x_nacl*(0.2e1*pressure*term3-0.6896160478e-19*term5*term4)+0.2e1*pressure*term6-0.3073046462e-19*term8*term7))
934}
935
936pub fn density_d_x_nacl(temperature: f64,pressure: f64, x_nacl: f64) -> Result<f64,String> {
952 if temperature<273.15 || temperature>453.15 {
953 return Err(format!("temperature of {} K is out of valid [273.15,453.15] K range for density correlation",temperature));
954 }
955 if x_nacl<0.0 || x_nacl>0.05159128949 {
956 return Err(format!("NaCl mole fraction of {} mol/mol is out of valid [0,0.05159128949] mol/mol range for density correlation",x_nacl));
957 }
958 if pressure<0.0 || pressure>12e6 {
959 return Err(format!("pressure of {} Pa is out of valid [0,12e6] Pa range for density correlation",pressure));
960 }
961 let term1=temperature*temperature;
962 let term2=term1*temperature;
963 let term3=pressure*pressure;
964 let term4=term3*(0.9419635626e-15-0.5960391229e-17*temperature+0.2254029682e-19*term1-0.2750661641e-22*term2)-0.6896160478e-19*pressure*(term1-0.1389389905e4*temperature+0.5200208026e6)*(term1-0.6955982230e3*temperature+0.1360677953e6)*(temperature-0.1287510847e3)+0.6987534604e-14*(term1-0.1389348523e4*temperature+0.5200298103e6)*(term1-0.6956077280e3*temperature+0.1360524236e6)*(temperature-0.1287829628e3);
965 let term5=0.4042772000e2*x_nacl+0.1801528000e2;
966 let term6=1.0/term5;
967 let term7=x_nacl*term4+term3*(-0.1225741636e-22*term2+0.1004433984e-19*term1+0.2017682395e-15-0.2656051761e-17*temperature)-0.3073046462e-19*pressure*(term1-0.8553297432e3*temperature+0.2081777030e6)*(term1-0.5313454038e3*temperature+0.8146781323e5)*(temperature-0.8270640666e3)+0.3113764328e-14*(term1-0.8554353686e3*temperature+0.2082210058e6)*(term1-0.5313524700e3*temperature+0.8146583390e5)*(temperature-0.8269513755e3);
968 let term8=term5*term5;
969 let term9=f64::exp(term6*term7);
970 let term10=x_nacl*x_nacl;
971 let term11=term1*term1;
972 let term12=term11*(term10+0.8912340347e0*x_nacl+0.1985745261e0)+term2*(-0.6282263540e3*term10-0.9831791048e3*x_nacl-0.3133715895e3)+term1*(-0.3203958077e6*term10+0.2926413653e6*x_nacl+0.1941721516e6)+temperature*(0.2958078762e9*term10+0.1483450978e8*x_nacl-0.5220792038e8)-0.9602488223e11*term10-0.4103990941e11*x_nacl+0.7907375557e9;
973 let term13=0.4042772e2*x_nacl+0.1801528e2;
974 let term14=term13*term13;
975 let term15=1.0/term14/term13;
976 let term16=term14*term14;
977 Ok(-0.7611403333e-1*term15*term12*term9*(term6*term4-0.4042772000e2/term8*term7)-0.7611403333e-1*term15*(term11*(0.2e1*x_nacl+0.8912340347e0)+term2*(-0.1256452708e4*x_nacl-0.9831791048e3)+term1*(-0.6407916154e6*x_nacl+0.2926413653e6)+(0.5916157524e9*x_nacl+0.1483450978e8)*temperature-0.1920497645e12*x_nacl-0.4103990941e11)*term9+0.9231350483e1/term16*term12*term9)
978}
979
980