salt_water/
salt_water_calculator.rs

1
2/// Unconstrained mole fraction derivatives for any property
3///
4/// The water mole fraction is ignored in the calculation; the salinity is determined
5/// from the NaCl mole fraction only (assuming that the mole fractions are normalized).
6/// So the derivative w.r.t. water mole fraction is identically zero.
7///
8/// # Arguments
9/// * `d_x_nacl` - NaCl mole fraction derivative, or an error
10///
11/// # Returns
12/// The mole fraction derivatives with respect to both compounds, or an error.
13pub 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]) //x[water] is unused
17		},
18		Err(e) => Err(e)
19	}		
20}
21
22///Mole number derivatives for intensive property for a total number of moles of 1
23///
24/// Mole numbers derivatives for intensive properties in CAPE-OPEN are defined as 
25/// the derivatives of the property w.r.t. the mole numbers, for a total number of
26/// moles of 1.
27///
28/// # Arguments:
29/// * `d_x_nacl` - NaCl mole fraction derivative, or an error
30///
31/// # Returns
32/// The mole number derivatives with respect to both compounds, or an error.
33pub 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
42///Mole number derivatives for extenstive property for a total number of moles of 1
43///
44/// Mole numbers derivatives for extensive properties in CAPE-OPEN are defined as 
45/// the derivatives of the total property (the molar property multiplied by the number
46/// of moles) w.r.t. the mole numbers, for a total number of moles of 1.
47///
48/// # Arguments:
49/// * `d_x_nacl` - NaCl mole fraction derivative, or an error
50/// * `prop_value` - density, mol/m3
51/// * `x_nacl` - the mole fraction of NaCl
52///
53/// # Returns
54/// The mole number derivatives with respect to both compounds, or an error.
55pub 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
67///Mole number derivatives for molar volume for a total number of moles of 1
68///
69/// Mole numbers derivatives for extensive properties in CAPE-OPEN are defined as 
70/// the derivatives of the total property (the molar property multiplied by the number
71/// of moles) w.r.t. the mole numbers, for a total number of moles of 1.
72///
73/// This routine gives the mole number derivatives of volume, given density.
74///
75/// # Arguments:
76/// * `d_x_nacl` - NaCl mole fraction derivative of density, or an error
77/// * `prop_value` - density, mol/m3
78/// * `x_nacl` - the mole fraction of NaCl
79///
80/// # Returns
81/// The mole number derivatives with respect to both compounds, or an error.
82pub 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
97/// Viscosity calculation
98/// 
99/// Viscosity, Pa*s, is calculated from:
100///
101/// Mostafa H. Sharqawy, John H. Lienhard V, Syed M. Zubair, Desalination and Water Treatment, doi 10.5004/dwt.2010.1079
102/// 
103/// It is pressure indepedendent, valid in the range of \[273.15-453.15\] K and x\[NaCl\]=\[0,0.05159128949\] mol/mol
104///
105/// #Arguments
106/// * `temperature` - temperature, K
107/// * `x_nacl` - mole fraction of NaCl, mol/mol
108///
109/// # Returns
110/// Viscosity, Pa*s, or an error
111pub 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
125/// Calculation of viscosity derivative w.r.t. pressure
126/// 
127/// Viscosity, Pa*s, is calculated from:
128///
129/// Mostafa H. Sharqawy, John H. Lienhard V, Syed M. Zubair, Desalination and Water Treatment, doi 10.5004/dwt.2010.1079
130/// 
131/// It is pressure indepedendent, valid in the range of \[273.15-453.15\] K and x\[NaCl\]=\[0,0.05159128949\] mol/mol
132///
133/// #Arguments
134/// * `temperature` - temperature, K
135/// * `x_nacl` - mole fraction of NaCl, mol/mol
136///
137/// # Returns
138/// Viscosity derivative w.r.t. pressure, Pa*s/Pa, or an error
139pub 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
149/// Calculation of viscosity derivative w.r.t. temperature
150/// 
151/// Viscosity, Pa*s, is calculated from:
152///
153/// Mostafa H. Sharqawy, John H. Lienhard V, Syed M. Zubair, Desalination and Water Treatment, doi 10.5004/dwt.2010.1079
154/// 
155/// It is pressure indepedendent, valid in the range of \[273.15-453.15\] K and x\[NaCl\]=\[0,0.05159128949\] mol/mol
156///
157/// #Arguments
158/// * `temperature` - temperature, K
159/// * `x_nacl` - mole fraction of NaCl, mol/mol
160///
161/// # Returns
162/// Viscosity derivative w.r.t. temperature, Pa*s/K, or an error
163pub 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
180/// Calculation of viscosity derivative w.r.t. mole fraction of NaCl
181/// 
182/// Viscosity, Pa*s, is calculated from:
183///
184/// Mostafa H. Sharqawy, John H. Lienhard V, Syed M. Zubair, Desalination and Water Treatment, doi 10.5004/dwt.2010.1079
185/// 
186/// It is pressure indepedendent, valid in the range of \[273.15-453.15\] K and x\[NaCl\]=\[0,0.05159128949\] mol/mol
187///
188/// #Arguments
189/// * `temperature` - temperature, K
190/// * `x_nacl` - mole fraction of NaCl, mol/mol
191///
192/// # Returns
193/// Viscosity derivative w.r.t. mole fraction of NaCl, Pa*s, or an error
194pub 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
208/// Thermal conductivity
209/// 
210/// Thermal conductivity, W/m/K, is calculated from:
211///
212/// Mostafa H. Sharqawy, John H. Lienhard V, Syed M. Zubair, Desalination and Water Treatment, doi 10.5004/dwt.2010.1079
213/// 
214/// It is pressure indepedendent, valid in the range of \[273.15-453.15\] K and x\[NaCl\]=\[0,0.05545875778\] mol/mol
215///
216/// #Arguments
217/// * `temperature` - temperature, K
218/// * `x_nacl` - mole fraction of NaCl, mol/mol
219///
220/// # Returns
221/// Thermal conductivity, W/m/K, or an error
222pub 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
245/// Calculation of thermal conductivity derivative w.r.t. temperature
246/// 
247/// Thermal conductivity, W/m/K, is calculated from:
248///
249/// Mostafa H. Sharqawy, John H. Lienhard V, Syed M. Zubair, Desalination and Water Treatment, doi 10.5004/dwt.2010.1079
250/// 
251/// It is pressure indepedendent, valid in the range of \[273.15-453.15\] K and x\[NaCl\]=\[0,0.05545875778\] mol/mol
252///
253/// #Arguments
254/// * `temperature` - temperature, K
255/// * `x_nacl` - mole fraction of NaCl, mol/mol
256///
257/// # Returns
258/// Derivative of thermal conductivity w.r.t. temperature, W/m/K^2, or an error
259pub 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
290/// Calculation of viscosity derivative w.r.t. pressure
291/// 
292/// Thermal conductivity, W/m/K, is calculated from:
293///
294/// Mostafa H. Sharqawy, John H. Lienhard V, Syed M. Zubair, Desalination and Water Treatment, doi 10.5004/dwt.2010.1079
295/// 
296/// It is pressure indepedendent, valid in the range of \[273.15-453.15\] K and x\[NaCl\]=\[0,0.05545875778\] mol/mol
297///
298/// #Arguments
299/// * `temperature` - temperature, K
300/// * `x_nacl` - mole fraction of NaCl, mol/mol
301///
302/// # Returns
303/// Derivative of thermal conductivity w.r.t. pressure, W/m/K/Pa, or an error
304pub 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
314/// Calculation of viscosity derivative w.r.t. NaCl mole fraction
315/// 
316/// Thermal conductivity, W/m/K, is calculated from:
317///
318/// Mostafa H. Sharqawy, John H. Lienhard V, Syed M. Zubair, Desalination and Water Treatment, doi 10.5004/dwt.2010.1079
319/// 
320/// It is pressure indepedendent, valid in the range of \[273.15-453.15\] K and x\[NaCl\]=\[0,0.05545875778\] mol/mol
321///
322/// #Arguments
323/// * `temperature` - temperature, K
324/// * `x_nacl` - mole fraction of NaCl, mol/mol
325///
326/// # Returns
327/// Derivative of thermal conductivity w.r.t. NaCl mole fraction, W/m/K, or an error
328pub 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
364/// Enthalpy
365/// 
366/// Enthalpy, J/mol, is calculated from:
367///
368/// Kishor G. Nayar, Mostafa H. Sharqawy, Leonardo D. Banchik, John H. Lienhard V, Desalination, doi 10.1016/j.desal.2016.02.024
369/// 
370/// It is valid in the range of \[273.15-393.15\] K, \[0-12e6\] Pa and x\[NaCl\]=\[0,0.04033898281\] mol/mol
371///
372/// #Arguments
373/// * `temperature` - temperature, K
374/// * `pressure` - pressure, Pa
375/// * `x_nacl` - mole fraction of NaCl, mol/mol
376///
377/// # Returns
378/// Enthalpy, J/mol, or an error
379pub 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
400/// Derivative of enthalpy w.r.t. temperature
401/// 
402/// Enthalpy, J/mol, is calculated from:
403///
404/// Kishor G. Nayar, Mostafa H. Sharqawy, Leonardo D. Banchik, John H. Lienhard V, Desalination, doi 10.1016/j.desal.2016.02.024
405/// 
406/// It is valid in the range of \[273.15-393.15\] K, \[0-12e6\] Pa and x\[NaCl\]=\[0,0.04033898281\] mol/mol
407///
408/// #Arguments
409/// * `temperature` - temperature, K
410/// * `pressure` - pressure, Pa
411/// * `x_nacl` - mole fraction of NaCl, mol/mol
412///
413/// # Returns
414/// Derivative of enthalpy w.r.t. temperature, J/mol/K, or an error
415pub 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
434/// Derivative of enthalpy w.r.t. pressure
435/// 
436/// Enthalpy, J/mol, is calculated from:
437///
438/// Kishor G. Nayar, Mostafa H. Sharqawy, Leonardo D. Banchik, John H. Lienhard V, Desalination, doi 10.1016/j.desal.2016.02.024
439/// 
440/// It is valid in the range of \[273.15-393.15\] K, \[0-12e6\] Pa and x\[NaCl\]=\[0,0.04033898281\] mol/mol
441///
442/// #Arguments
443/// * `temperature` - temperature, K
444/// * `pressure` - pressure, Pa
445/// * `x_nacl` - mole fraction of NaCl, mol/mol
446///
447/// # Returns
448/// Derivative of enthalpy w.r.t. pressure, J/mol/Pa, or an error
449pub 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
465/// Derivative of enthalpy w.r.t. NaCl mole fraction
466/// 
467/// Enthalpy, J/mol, is calculated from:
468///
469/// Kishor G. Nayar, Mostafa H. Sharqawy, Leonardo D. Banchik, John H. Lienhard V, Desalination, doi 10.1016/j.desal.2016.02.024
470/// 
471/// It is valid in the range of \[273.15-393.15\] K, \[0-12e6\] Pa and x\[NaCl\]=\[0,0.04033898281\] mol/mol
472///
473/// #Arguments
474/// * `temperature` - temperature, K
475/// * `pressure` - pressure, Pa
476/// * `x_nacl` - mole fraction of NaCl, mol/mol
477///
478/// # Returns
479/// Derivative of enthalpy w.r.t. NaCl mole fraction, J/mol, or an error
480pub 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
511/// Calculate temperature, given composition, pressure and enthalpy
512///
513/// This calculation underlies the pressure-enthalpy flash
514///
515/// Enthalpy is a monotonic function of temperature; a simple 
516/// bracketing and bisection approach is used where the amount
517/// that is bisected is estimated from a limited Newton step,
518/// with the derivative estimated from the bracket; a step
519/// size limiter of 95% if the bracketed domain is imposed.
520///
521/// # Arguments:
522/// * `enthalpy_value` - enthalpy, J/mol
523/// * `pressure` - pressure, Pa
524/// * `x_nacl` - NaCl mole fraction, mol/mol
525///
526/// # Returns
527/// Temperature, K, or an error
528pub fn solve_temperature_from_enthalpy(enthalpy_value: f64,pressure: f64, x_nacl: f64) -> Result<f64,String> {
529	//get enthalpy at lower limit
530	let mut t_min=273.15;
531	let h_min=enthalpy(t_min,pressure,x_nacl)?;
532	//get enthalpy at upper limit
533	let mut t_max=393.15;
534	let h_max=enthalpy(t_max,pressure,x_nacl)?;
535	//check if bracketed
536	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	//initial guess: linear interpolation
540	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		//get enthalpty at current T
545		let h=enthalpy(temperature,pressure,x_nacl)?;
546		//check for convergence
547		if f64::abs(h-enthalpy_value)<1e-10*f64::abs(enthalpy_value) {
548			return Ok(temperature);
549		}
550		//get derivative
551		let dh_dt=enthalpy_d_temperature(temperature,pressure,x_nacl)?;
552		//determine newton step
553		let mut delta_t=(enthalpy_value-h)/dh_dt;
554		//check against brackets
555		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		//update bracket, temperature and iteration
567		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
578/// Entropy
579/// 
580/// Entropy, J/mol/K, is calculated from:
581///
582/// Kishor G. Nayar, Mostafa H. Sharqawy, Leonardo D. Banchik, John H. Lienhard V, Desalination, doi 10.1016/j.desal.2016.02.024
583/// 
584/// It is valid in the range of \[273.15-393.15\] K, \[0-12e6\] Pa and x\[NaCl\]=\[0,0.04033898281\] mol/mol
585///
586/// #Arguments
587/// * `temperature` - temperature, K
588/// * `pressure` - pressure, Pa
589/// * `x_nacl` - mole fraction of NaCl, mol/mol
590///
591/// # Returns
592/// Entropy, J/mol/K, or an error
593pub 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
615/// Derivative of entropy w.r.t. temperature
616/// 
617/// Entropy, J/mol/K, is calculated from:
618///
619/// Kishor G. Nayar, Mostafa H. Sharqawy, Leonardo D. Banchik, John H. Lienhard V, Desalination, doi 10.1016/j.desal.2016.02.024
620/// 
621/// It is valid in the range of \[273.15-393.15\] K, \[0-12e6\] Pa and x\[NaCl\]=\[0,0.04033898281\] mol/mol
622///
623/// #Arguments
624/// * `temperature` - temperature, K
625/// * `pressure` - pressure, Pa
626/// * `x_nacl` - mole fraction of NaCl, mol/mol
627///
628/// # Returns
629/// Derivative of entropy w.r.t. temperature, J/mol/K^2, or an error
630pub 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
649/// Derivative of entropy w.r.t. pressure
650/// 
651/// Entropy, J/mol/K, is calculated from:
652///
653/// Kishor G. Nayar, Mostafa H. Sharqawy, Leonardo D. Banchik, John H. Lienhard V, Desalination, doi 10.1016/j.desal.2016.02.024
654/// 
655/// It is valid in the range of \[273.15-393.15\] K, \[0-12e6\] Pa and x\[NaCl\]=\[0,0.04033898281\] mol/mol
656///
657/// #Arguments
658/// * `temperature` - temperature, K
659/// * `pressure` - pressure, Pa
660/// * `x_nacl` - mole fraction of NaCl, mol/mol
661///
662/// # Returns
663/// Derivative of entropy w.r.t. pressure, J/mol/K/Pa, or an error
664pub 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
680/// Derivative of entropy w.r.t. NaCl mole fraction
681/// 
682/// Entropy, J/mol/K, is calculated from:
683///
684/// Kishor G. Nayar, Mostafa H. Sharqawy, Leonardo D. Banchik, John H. Lienhard V, Desalination, doi 10.1016/j.desal.2016.02.024
685/// 
686/// It is valid in the range of \[273.15-393.15\] K, \[0-12e6\] Pa and x\[NaCl\]=\[0,0.04033898281\] mol/mol
687///
688/// #Arguments
689/// * `temperature` - temperature, K
690/// * `pressure` - pressure, Pa
691/// * `x_nacl` - mole fraction of NaCl, mol/mol
692///
693/// # Returns
694/// Derivative of entropy w.r.t. NaCl mole fraction, J/mol/K, or an error
695pub 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
727/// Calculate temperature, given composition, pressure and entropy
728///
729/// This calculation underlies the pressure-enthalpy flash
730///
731/// Within the validity of this equation, entropy 
732/// is a monotonic function of temperature; a simple 
733/// bracketing and bisection approach is used where the amount
734/// that is bisected is estimated from a limited Newton step,
735/// with the derivative estimated from the bracket; a step
736/// size limiter of 95% if the bracketed domain is imposed.
737///
738/// # Arguments:
739/// * `entropy_value` - entropy, J/mol/K
740/// * `pressure` - pressure, Pa
741/// * `x_nacl` - NaCl mole fraction, mol/mol
742///
743/// # Returns
744/// Temperature, K, or an error
745pub fn solve_temperature_from_entropy(entropy_value: f64,pressure: f64, x_nacl: f64) -> Result<f64,String> {
746	//get entropy at lower limit
747	let mut t_min=273.15;
748	let h_min=entropy(t_min,pressure,x_nacl)?;
749	//get entropy at upper limit
750	let mut t_max=393.15;
751	let h_max=entropy(t_max,pressure,x_nacl)?;
752	//check if bracketed
753	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	//initial guess: linear interpolation
757	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		//get enthalpty at current T
762		let s=entropy(temperature,pressure,x_nacl)?;
763		//check for convergence
764		if f64::abs(s-entropy_value)<1e-10*f64::abs(entropy_value) {
765			return Ok(temperature);
766		}
767		//get derivative
768		let ds_dt=entropy_d_temperature(temperature,pressure,x_nacl)?;
769		//determine newton step
770		let mut delta_t=(entropy_value-s)/ds_dt;
771		//check against brackets
772		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		//update bracket, temperature and iteration
784		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
795/// Density
796/// 
797/// Density, mol/m3, is calculated from:
798///
799/// Kishor G. Nayar, Mostafa H. Sharqawy, Leonardo D. Banchik, John H. Lienhard V, Desalination, doi 10.1016/j.desal.2016.02.024
800/// 
801/// It is valid in the range of \[273.15-453.15\] K, \[0-12e6\] Pa and x\[NaCl\]=\[0,0.05159128949\] mol/mol
802///
803/// #Arguments
804/// * `temperature` - temperature, K
805/// * `pressure` - pressure, Pa
806/// * `x_nacl` - mole fraction of NaCl, mol/mol
807///
808/// # Returns
809/// Density, mol/m3, or an error
810pub 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
831/// Derivative of density w.r.t. temperature
832/// 
833/// Density, mol/m3, is calculated from:
834///
835/// Kishor G. Nayar, Mostafa H. Sharqawy, Leonardo D. Banchik, John H. Lienhard V, Desalination, doi 10.1016/j.desal.2016.02.024
836/// 
837/// It is valid in the range of \[273.15-453.15\] K, \[0-12e6\] Pa and x\[NaCl\]=\[0,0.05159128949\] mol/mol
838///
839/// #Arguments
840/// * `temperature` - temperature, K
841/// * `pressure` - pressure, Pa
842/// * `x_nacl` - mole fraction of NaCl, mol/mol
843///
844/// # Returns
845/// Derivative of density w.r.t. temperature, mol/m3/K, or an error
846pub 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
893/// Derivative of density w.r.t. pressure
894/// 
895/// Density, mol/m3, is calculated from:
896///
897/// Kishor G. Nayar, Mostafa H. Sharqawy, Leonardo D. Banchik, John H. Lienhard V, Desalination, doi 10.1016/j.desal.2016.02.024
898/// 
899/// It is valid in the range of \[273.15-453.15\] K, \[0-12e6\] Pa and x\[NaCl\]=\[0,0.05159128949\] mol/mol
900///
901/// #Arguments
902/// * `temperature` - temperature, K
903/// * `pressure` - pressure, Pa
904/// * `x_nacl` - mole fraction of NaCl, mol/mol
905///
906/// # Returns
907/// Derivative of density w.r.t. pressure, mol/m3/Pa, or an error
908pub 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
936/// Derivative of density w.r.t. NaCl mole fraction
937/// 
938/// Density, mol/m3, is calculated from:
939///
940/// Kishor G. Nayar, Mostafa H. Sharqawy, Leonardo D. Banchik, John H. Lienhard V, Desalination, doi 10.1016/j.desal.2016.02.024
941/// 
942/// It is valid in the range of \[273.15-453.15\] K, \[0-12e6\] Pa and x\[NaCl\]=\[0,0.05159128949\] mol/mol
943///
944/// #Arguments
945/// * `temperature` - temperature, K
946/// * `pressure` - pressure, Pa
947/// * `x_nacl` - mole fraction of NaCl, mol/mol
948///
949/// # Returns
950/// Derivative of density w.r.t. NaCl mole fraction, mol/m3, or an error
951pub 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