[PATCH 2/2] gas model: update to new coefficients, and simplify expressions

Linus Torvalds torvalds at linux-foundation.org
Sun Mar 13 12:40:54 PDT 2016


From: Linus Torvalds <torvalds at linux-foundation.org>
Date: Sun, 13 Mar 2016 12:23:16 -0700
Subject: [PATCH 2/2] gas model: update to new coefficients, and simplify expressions

This updates the gas model to use the new virial coefficients from the R
script, and simplifies the expression a tiny bit by avoiding the
division by 1000 for the gas fractions, and replacing it with a multiply
by 0.001 at the end.

The virial coefficients for Oxygen and Nitrogen changed in the last
digits due to the use of a different tool for the least-square fitting.
That also accounts for the change in format (the coefficients are not
using scientific notation).

The coefficients for Helium changed noticeably more, since they are now
based on the new least-squares fit from the raw data.

But the actual end result does not change appreciably, the main
advantage is that now the numbers are easily reproducible.

Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
---

The o2/n2 values really don't change very much, although visually they 
look different due to using scientific notation. The He coefficients are 
totally different due to using different data (although the first-order 
coefficient is not hugely different - which is not surprising, since it 
does give a very similar curve)

 subsurface-core/gas-model.c | 31 +++++++++++++++++--------------
 1 file changed, 17 insertions(+), 14 deletions(-)

diff --git a/subsurface-core/gas-model.c b/subsurface-core/gas-model.c
index 81765e003002..ad1160f3b352 100644
--- a/subsurface-core/gas-model.c
+++ b/subsurface-core/gas-model.c
@@ -26,36 +26,39 @@
 double gas_compressibility_factor(struct gasmix *gas, double bar)
 {
 	static const double o2_coefficients[3] = {
-		-0.00071809207370164567,
-		+0.00000281852572807643,
-		-0.00000000150290620491
+		-7.18092073703e-04,
+		+2.81852572808e-06,
+		-1.50290620492e-09
 	};
 	static const double n2_coefficients[3] = {
-		-0.00021926035329221337,
-		+0.00000292844845531647,
-		-0.00000000207613482075
+		-2.19260353292e-04,
+		+2.92844845532e-06,
+		-2.07613482075e-09
 	};
 	static const double he_coefficients[3] = {
-		+0.00047961098687979363,
-		-0.00000004077670019935,
-		+0.00000000000077707035
+		+4.87320026468e-04,
+		-8.83632921053e-08,
+		+5.33304543646e-11
 	};
-	double o2, he;
+	int o2, he;
 	double x1, x2, x3;
 	double Z;
 
-	o2 = get_o2(gas) / 1000.0;
-	he = get_he(gas) / 1000.0;
+	o2 = get_o2(gas);
+	he = get_he(gas);
 
 	x1 = bar; x2 = x1*x1; x3 = x2*x1;
 
 	Z = virial_m1(o2_coefficients, x1, x2, x3) * o2 +
 	    virial_m1(he_coefficients, x1, x2, x3) * he +
-	    virial_m1(n2_coefficients, x1, x2, x3) * (1.0 - o2 - he);
+	    virial_m1(n2_coefficients, x1, x2, x3) * (1000 - o2 - he);
 
 	/*
 	 * We add the 1.0 at the very end - the linear mixing of the
 	 * three 1.0 terms is still 1.0 regardless of the gas mix.
+	 *
+	 * The * 0.001 is because we did the linear mixing using the
+	 * raw permille gas values.
 	 */
-	return Z + 1.0;
+	return Z * 0.001 + 1.0;
 }
-- 
2.8.0.rc2



More information about the subsurface mailing list