2016-03-02 21:49:59 +00:00
|
|
|
|
/* gas-model.c */
|
|
|
|
|
/* gas compressibility model */
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include "dive.h"
|
|
|
|
|
|
|
|
|
|
/*
|
2016-03-03 21:57:54 +00:00
|
|
|
|
* Generic cubic polynomial
|
2016-03-02 21:49:59 +00:00
|
|
|
|
*/
|
2016-03-03 21:57:54 +00:00
|
|
|
|
static double cubic(double bar, const double coefficient[])
|
2016-03-03 00:30:24 +00:00
|
|
|
|
{
|
|
|
|
|
double x0 = 1.0,
|
|
|
|
|
x1 = bar,
|
|
|
|
|
x2 = x1*x1,
|
2016-03-03 21:57:54 +00:00
|
|
|
|
x3 = x2*x1;
|
2016-03-03 00:30:24 +00:00
|
|
|
|
|
|
|
|
|
return x0 * coefficient[0] +
|
|
|
|
|
x1 * coefficient[1] +
|
|
|
|
|
x2 * coefficient[2] +
|
2016-03-03 21:57:54 +00:00
|
|
|
|
x3 * coefficient[3];
|
2016-03-03 00:30:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2016-03-03 21:57:54 +00:00
|
|
|
|
* Cubic least-square coefficients for O2/N2/He based on data from
|
2016-03-02 22:11:53 +00:00
|
|
|
|
*
|
2016-03-03 21:57:54 +00:00
|
|
|
|
* PERRY’S CHEMICAL ENGINEERS’ HANDBOOK SEVENTH EDITION
|
2016-03-03 00:30:24 +00:00
|
|
|
|
*
|
2016-03-03 21:57:54 +00:00
|
|
|
|
* with the lookup and curve fitting by Lubomir.
|
2016-03-03 00:30:24 +00:00
|
|
|
|
*
|
2016-03-03 21:57:54 +00:00
|
|
|
|
* NOTE! Helium coefficients are a linear mix operation between the
|
|
|
|
|
* 323K and one for 273K isotherms, to make everything be at 300K.
|
2016-03-03 00:30:24 +00:00
|
|
|
|
*/
|
2016-03-03 21:57:54 +00:00
|
|
|
|
static const double o2_coefficients[4] = {
|
|
|
|
|
+1.00117935180448264158,
|
|
|
|
|
-0.00074149079841471884,
|
|
|
|
|
+0.00000291901111247509,
|
|
|
|
|
-0.00000000162092217461
|
2016-03-03 00:30:24 +00:00
|
|
|
|
};
|
|
|
|
|
|
2016-03-03 21:57:54 +00:00
|
|
|
|
static const double n2_coefficients[4] = {
|
|
|
|
|
+1.00030344355797817778,
|
|
|
|
|
-0.00022528077251905598,
|
|
|
|
|
+0.00000295430303276288,
|
|
|
|
|
-0.00000000210649996337
|
2016-03-03 00:30:24 +00:00
|
|
|
|
};
|
|
|
|
|
|
2016-03-03 21:57:54 +00:00
|
|
|
|
static const double he_coefficients[4] = {
|
|
|
|
|
+1.00000137322788319261,
|
|
|
|
|
+0.000488393024887620665,
|
|
|
|
|
-0.000000054210166760015,
|
|
|
|
|
+0.000000000010908069275
|
2016-03-03 00:30:24 +00:00
|
|
|
|
};
|
|
|
|
|
|
2016-03-03 21:57:54 +00:00
|
|
|
|
static double o2_compressibility_factor(double bar) { return cubic(bar, o2_coefficients); }
|
|
|
|
|
static double n2_compressibility_factor(double bar) { return cubic(bar, n2_coefficients); }
|
|
|
|
|
static double he_compressibility_factor(double bar) { return cubic(bar, he_coefficients); }
|
2016-03-02 22:11:53 +00:00
|
|
|
|
|
|
|
|
|
/*
|
2016-03-03 21:57:54 +00:00
|
|
|
|
* We end up using a simple linear mix of the gas-specific functions.
|
2016-03-02 22:11:53 +00:00
|
|
|
|
*/
|
|
|
|
|
double gas_compressibility_factor(struct gasmix *gas, double bar)
|
|
|
|
|
{
|
2016-03-03 00:30:24 +00:00
|
|
|
|
double o2, n2, he; // Z factors
|
|
|
|
|
double of, nf, hf; // gas fractions ("partial pressures")
|
|
|
|
|
|
|
|
|
|
o2 = o2_compressibility_factor(bar);
|
|
|
|
|
n2 = n2_compressibility_factor(bar);
|
|
|
|
|
he = he_compressibility_factor(bar);
|
|
|
|
|
|
2016-03-03 21:57:54 +00:00
|
|
|
|
of = get_o2(gas) / 1000.0;
|
|
|
|
|
hf = get_he(gas) / 1000.0;
|
2016-03-03 00:30:24 +00:00
|
|
|
|
nf = 1.0 - of - nf;
|
|
|
|
|
|
|
|
|
|
return o2*of + n2*nf + he*hf;
|
2016-03-02 22:11:53 +00:00
|
|
|
|
}
|