Completed specific volume anomaly function

This commit is contained in:
Daniele Tricoli 2011-01-15 00:40:36 +01:00
parent ccc8b31ffc
commit 3abc34747f
2 changed files with 44 additions and 2 deletions

View File

@ -70,8 +70,8 @@ double conductivity(double salinity, double temperature, double pressure)
double specific_volume_anomaly(double salinity, double temperature,
double pressure, double *sigma)
{
double sig, sr, r1, r2, r3, r4;
double a, b, c, d, e, a1, b1, aw, bw, k, ko, kw, k35, v350p, sva;
double sig, sr, r1, r2, r3, r4, a, b, c, d, e, a1, b1, aw, bw;
double ko, kw, k35, v350p, sva, gam, pk, dr35p, dk, dvan;
double r3500 = 1028.1063;
double dr350 = 28.106331;
@ -90,7 +90,37 @@ double specific_volume_anomaly(double salinity, double temperature,
v350p = 1.0 / r3500;
sva = -sig * v350p / (r3500 + sig);
*sigma = sig + dr350;
if (pressure == 0.0)
return sva * 1.0e+8;
e = (9.1697e-10 * temperature + 2.0816e-8) * temperature - 9.9348e-7;
bw = (5.2787e-8 * temperature - 6.12293e-6) * temperature + 3.47718e-5;
b = bw + e * salinity;
d = 1.91075e-4;
c = (-1.6078e-6 * temperature - 1.0981e-5) * temperature + 2.2838e-3;
aw = ((-5.77905e-7 * temperature + 1.16092e-4) * temperature +
1.43713e-3) * temperature - 0.1194975;
a = (d * sr + c) * salinity + aw;
b1 = (-5.3009e-4 * temperature + 1.6483e-2) * temperature + 7.944e-2;
a1 = ((-6.1670e-5 * temperature + 1.09987e-2) * temperature - 0.603459) *
temperature + 54.6746;
kw = (((-5.155288e-5 * temperature + 1.360477e-2) * temperature -
2.327105) * temperature +148.4206) * temperature - 1930.06;
ko = (b1 * sr + a1) * salinity + kw;
dk = (b * pressure + a) * pressure + ko;
k35 = (5.03217e-5 * pressure + 3.359406) * pressure + 21582.27;
gam = pressure / k35;
pk = 1.0 - gam;
sva = sva * pk + (v350p + sva) * pressure * dk / (k35 * (k35 + dk));
v350p = v350p * pk;
dr35p = gam / v350p;
dvan = sva / (v350p * (v350p + sva));
*sigma = dr350 + dr35p - dvan;
return sva * 1.0e+8;
}

View File

@ -38,10 +38,22 @@ END_TEST
START_TEST(test_specific_volume_anomaly)
{
double sigma;
ck_assert(cmp_double(specific_volume_anomaly(0, 0, 0, &sigma),
2749.539368));
ck_assert(cmp_double(sigma, -0.1574));
ck_assert(cmp_double(specific_volume_anomaly(0, 0, 1000, &sigma),
2692.644915));
ck_assert(cmp_double(sigma, 4.872729));
ck_assert(cmp_double(specific_volume_anomaly(40, 0, 0, &sigma),
-380.789102));
ck_assert(cmp_double(sigma, 32.147101));
ck_assert(cmp_double(specific_volume_anomaly(40, 40, 10000, &sigma),
981.301907));
ck_assert(cmp_double(sigma, 59.820375));
}
END_TEST