CalCOFI hydrographic CTD data, particularly the thermodynamic properties, are computed by Seasoft based on EOS-80. Temperatures, typically from the primary temperature sensor, are merged with bottle sample data into station files which produce the hydrographic database and other data products, Hydrographic Reports, figures, IEHs. CTD sensor salinities, and oxygen values may also replace bottle measurements on mistrip or missing samples.

Currently (May 2014) no TEOS-10 calculation for absolute salinities are calculated.

Information from Seasoft v7.23.1 (May 2014)

Algorithms used for calculation of derived parameters in Data Conversion, Derive, Sea Plot, SeaCalc III [EOS-80 (Practical Salinity) tab], and Seasave are identical, except as noted in Derived Parameter Formulas (EOS-80; Practical Salinity), and are based on EOS-80 equations.

Derived Parameter Formulas (EOS-80)

For formulas for the calculation of conductivity, temperature, and pressure, see the calibration sheets for your instrument.
 
Formulas for the computation of salinity, density, potential temperature, specific volume anomaly, and sound velocity were obtained from "Algorithms for computation of fundamental properties of seawater", by N.P. Fofonoff and R.C Millard Jr.; Unesco technical papers in marine science #44, 1983.

Derive -- EOS-80 Practical Salinity (excerpt from SBE Data Processing Derive Module)

Derive uses pressure, temperature, and conductivity from the input .cnv file to compute the following oceanographic parameters:

NOTES

Formulas

Formulas for the computation of salinity, density, potential temperature, specific volume anomaly, and sound velocity were obtained from "Algorithms for computation of fundamental properties of seawater", by N.P. Fofonoff and R.C Millard Jr.; Unesco technical papers in marine science #44, 1983.

NOTES

 
Equations are provided for the following oceanographic parameters:

 

Formulas

image\derive_formulasDensity.gif


(density of seawater with salinity s, temperature t, and pressure p, based on the equation of state for seawater (EOS80))
Density calculation:
Using the following constants –
B0 = 8.24493e-1, B1 = -4.0899e-3, B2 = 7.6438e-5, B3 = -8.2467e-7, B4 = 5.3875e-9, C0 = -5.72466e-3, C1 = 1.0227e-4, C2 = -1.6546e-6, D0 = 4.8314e-4, A0 = 999.842594, A1 = 6.793952e-2, A2 = -9.095290e-3, A3 = 1.001685e-4, A4 = -1.120083e-6, A5 = 6.536332e-9, FQ0 = 54.6746, FQ1 = -0.603459, FQ2 = 1.09987e-2, FQ3 = -6.1670e-5, G0 = 7.944e-2, G1 = 1.6483e-2, G2 = -5.3009e-4, i0 = 2.2838e-3, i1 = -1.0981e-5, i2 = -1.6078e-6, J0 =1.91075e-4, M0 = -9.9348e-7, M1 = 2.0816e-8, M2 = 9.1697e-10, E0 = 19652.21, E1 = 148.4206, E2 = -2.327105, E3 = 1.360477e-2, E4 = -5.155288e-5, H0 = 3.239908, H1 = 1.43713e-3, H2 = 1.16092e-4, H3 = -5.77905e-7, K0 = 8.50935e-5, K1 =-6.12293e-6, K2 = 5.2787e-8
C Computer Code
double Density(double s, double t, double p)
// s = salinity PSU, t = temperature deg C ITPS-68, p = pressure in decibars
{
 double t2, t3, t4, t5, s32;
 double sigma, k, kw, aw, bw;
 double val;
 t2 = t*t;
 t3 = t*t2;
 t4 = t*t3;
 t5 = t*t4;
 if (s <= 0.0) s = 0.000001;
 s32 = pow(s, 1.5);
 p /= 10.0;   /* convert decibars to bars */
 sigma = A0 + A1*t + A2*t2 + A3*t3 + A4*t4 + A5*t5 + (B0 + B1*t + B2*t2 + B3*t3 + B4*t4)*s + (C0 + C1*t + C2*t2)*s32 + D0*s*s;
 kw = E0 + E1*t + E2*t2 + E3*t3 + E4*t4;
 aw = H0 + H1*t + H2*t2 + H3*t3;
 bw = K0 + K1*t + K2*t2;
 k = kw + (FQ0 + FQ1*t + FQ2*t2 + FQ3*t3)*s + (G0 + G1*t + G2*t2)*s32 + (aw + (i0 + i1*t + i2*t2)*s + (J0*s32))*p + (bw + (M0 + M1*t + M2*t2)*s)*p*p;
 val = 1 - p / k;
 if (val) sigma = sigma / val - 1000.0;
 return sigma;
}
 
image\derive_formulasSigmas.gif
 
 
depth = [m]
(When you select salt water depth as a derived variable, SBE Data Processing prompts you to input the latitude, which is needed to calculate local gravity. SBE Data Processing uses the user-input value, unless latitude is written in the input file header [from a NMEA navigation device]. If latitude is in the input data file header, SBE Data Processing uses the header value, and ignores the user-input latitude.
Note: You can also enter the user-input latitude on the Miscellaneous tab in Data Conversion or Derive, as applicable.)
Depth calculation:
C Computer Code –
// Depth
double Depth(int dtype, double p, double latitude)
// dtype = fresh water or salt water, p = pressure in decibars, latitude in degrees
{
 double x, d, gr;
 if (dtype == FRESH_WATER) /* fresh water */
  d = p * 1.019716;
 else {       /* salt water  */
  x = sin(latitude / 57.29578);
  x = x * x;
  gr = 9.780318 * (1.0 + (5.2788e-3 + 2.36e-5 * x) * x) + 1.092e-6 * p;
  d = (((-1.82e-15 * p + 2.279e-10) * p - 2.2512e-5) * p + 9.72659) * p;
  if (gr) d /= gr;
 }
 return(d);
}
 
seafloor depth = depth + altimeter reading [m]     
 
Practical Salinity = [PSU]
(Salinity is PSS-78, valid from 2 to 42 psu.)
Note: Absolute Salinity (TEOS-10) is available in our seawater calculator, SeaCalc III. All other SBE Data Processing modules output only Practical Salinity, and all parameters derived from salinity in those modules (density, sound velocity, etc.) are based on Practical Salinity.  
Salinity calculation:
Using the following constants
A1 = 2.070e-5, A2 = -6.370e-10, A3 = 3.989e-15, B1 = 3.426e-2, B2 = 4.464e-4, B3 = 4.215e-1, B4 = -3.107e-3, C0 = 6.766097e-1, C1 = 2.00564e-2, C2 = 1.104259e-4, C3 = -6.9698e-7, C4 = 1.0031e-9
C Computer Code –
static double a[6] = { /* constants for salinity calculation */
 0.0080, -0.1692, 25.3851, 14.0941, -7.0261, 2.7081
};
static double b[6]={ /* constants for salinity calculation */
 0.0005, -0.0056, -0.0066, -0.0375, 0.0636, -0.0144
};
double Salinity(double C, double T, double P)  /* compute salinity */
// C = conductivity S/m, T = temperature deg C ITPS-68, P = pressure in decibars
{
 double R, RT, RP, temp, sum1, sum2, result, val;
 int i;
 if (C <= 0.0)
  result = 0.0;
 else {
  C *= 10.0; /* convert Siemens/meter to mmhos/cm */
  R = C / 42.914;
  val = 1 + B1 * T + B2 * T * T + B3 * R + B4 * R * T;
  if (val) RP = 1 + (P * (A1 + P * (A2 + P * A3))) / val;
  val = RP * (C0 + (T * (C1 + T * (C2 + T * (C3 + T * C4)))));
  if (val) RT = R / val;
  if (RT <= 0.0) RT = 0.000001;
  sum1 = sum2 = 0.0;
  for (i = 0;i < 6;i++) {
   temp = pow(RT, (double)i/2.0);
   sum1 += a[i] * temp;
   sum2 += b[i] * temp;
  }
   val = 1.0 + 0.0162 * (T - 15.0);
  if (val)
   result = sum1 + sum2 * (T - 15.0) / val;
  else
   result = -99.;
 }
return result;
}
 
sound velocity = [m/sec]
(sound velocity can be calculated as Chen-Millero, DelGrosso, or Wilson)
Sound velocity calculation:
C Computer Code –
// Sound Velocity Chen and Millero
double SndVelC(double s, double t, double p0) /* sound velocity Chen and Millero 1977 */
      /* JASA,62,1129-1135 */
// s = salinity, t = temperature deg C ITPS-68, p = pressure in decibars
{
 double a, a0, a1, a2, a3;
 double b, b0, b1;
 double c, c0, c1, c2, c3;
 double p, sr, d, sv;
 p = p0 / 10.0;  /* scale pressure to bars */
 if (s < 0.0) s = 0.0;
 sr = sqrt(s);
 d = 1.727e-3 - 7.9836e-6 * p;
 b1 = 7.3637e-5 + 1.7945e-7 * t;
 b0 = -1.922e-2 - 4.42e-5 * t;
 b = b0 + b1 * p;
 a3 = (-3.389e-13 * t + 6.649e-12) * t + 1.100e-10;
 a2 = ((7.988e-12 * t - 1.6002e-10) * t + 9.1041e-9) * t - 3.9064e-7;
 a1 = (((-2.0122e-10 * t + 1.0507e-8) * t - 6.4885e-8) * t - 1.2580e-5) * t + 9.4742e-5;
 a0 = (((-3.21e-8 * t + 2.006e-6) * t + 7.164e-5) * t -1.262e-2) * t + 1.389;
 a = ((a3 * p + a2) * p + a1) * p + a0;
 c3 = (-2.3643e-12 * t + 3.8504e-10) * t - 9.7729e-9;
 c2 = (((1.0405e-12 * t -2.5335e-10) * t + 2.5974e-8) * t - 1.7107e-6) * t + 3.1260e-5;
 c1 = (((-6.1185e-10 * t + 1.3621e-7) * t - 8.1788e-6) * t + 6.8982e-4) * t + 0.153563;
 c0 = ((((3.1464e-9 * t - 1.47800e-6) * t + 3.3420e-4) * t - 5.80852e-2) * t + 5.03711) * t + 1402.388;
 c = ((c3 * p + c2) * p + c1) * p + c0;
 sv = c + (a + b * sr + d * s) * s;
 return sv;
}
 
// Sound Velocity Delgrosso
double SndVelD(double s, double t, double p) /* Delgrosso JASA, Oct. 1974, Vol 56, No 4 */
// s = salinity, t = temperature deg C ITPS-68, p = pressure in decibars
{
 double c000, dct, dcs, dcp, dcstp, sv;
 c000 = 1402.392;
 p = p / 9.80665;  /* convert pressure from decibars to KG / CM**2 */
 dct = (0.501109398873e1 - (0.550946843172e-1 - 0.22153596924e-3 * t) * t) * t;
 dcs = (0.132952290781e1 + 0.128955756844e-3 * s) * s;
 dcp = (0.156059257041e0 + (0.244998688441e-4 - 0.83392332513e-8 * p) * p) * p;
 dcstp = -0.127562783426e-1 * t * s + 0.635191613389e-2 * t * p + 0.265484716608e-7 * t * t * p * p - 0.159349479045e-5 * t * p * p + 0.522116437235e-9 * t * p * p * p - 0.438031096213e-6 * t * t * t * p - 0.161674495909e-8 * s * s * p * p + 0.968403156410e-4 * t * t * s + 0.485639620015e-5 * t * s * s * p - 0.340597039004e-3 * t * s * p;
 sv = c000 + dct + dcs + dcp + dcstp;
 return sv;
}
 
// sound velocity Wilson
double SndVelW(double s, double t, double p) /* wilson JASA, 1960, 32, 1357 */
// s = salinity, t = temperature deg C ITPS-68, p = pressure in decibars
{
 double pr, sd, a, v0, v1, sv;
 pr = 0.1019716 * (p + 10.1325);
 sd = s - 35.0;
 a = (((7.9851e-6 * t - 2.6045e-4) * t - 4.4532e-2) * t + 4.5721) * t + 1449.14;
 sv = (7.7711e-7 * t - 1.1244e-2) * t + 1.39799;
 v0 = (1.69202e-3 * sd + sv) * sd + a;
 a = ((4.5283e-8 * t + 7.4812e-6) * t - 1.8607e-4) * t + 0.16072;
 sv = (1.579e-9 * t + 3.158e-8) * t + 7.7016e-5;
 v1 = sv * sd + a;
 a = (1.8563e-9 * t - 2.5294e-7) * t + 1.0268e-5;
 sv = -1.2943e-7 * sd + a;
 a = -1.9646e-10 * t + 3.5216e-9;
 sv = (((-3.3603e-12 * pr + a) * pr + sv) * pr + v1) * pr + v0;
 return sv;
}
 
image\derive_formulasAvgSV.gif
Average sound velocity is the harmonic mean (average) from the surface to the current CTD depth, and is calculated on the downcast only. The first window begins when pressure is greater than a user-input minimum specified pressure and salinity is greater than a user-input minimum specified salinity. Depth is calculated from pressure based on user-input latitude (regardless of whether latitude data from a NMEA navigation device is in the data file).
When you select average sound velocity as a derived variable, SBE Data Processing prompts you to enter the minimum pressure, minimum salinity, and if applicable, pressure window size and time window size.
(Note: You can also enter the parameters on the Miscellaneous tab in Data Conversion or Derive, as applicable.)

 
image\derive_avgsvdwg.gif
 
 
(Potential temperature is the temperature an element of seawater would have if raised adiabatically with no change in salinity to reference pressure pr. Sea-Bird software uses a reference pressure of 0 decibars).
Potential Temperature [IPTS-68] calculation:
C Computer Code
// ATG (used in potential temperature calculation)
double ATG(double s, double t, double p) /* adiabatic temperature gradient deg C per decibar */
      /* ref broyden,h. Deep-Sea Res.,20,401-408 */
// s = salinity, t = temperature deg C ITPS-68, p = pressure in decibars
{
 double ds;
 ds = s - 35.0;
 return((((-2.1687e-16 * t + 1.8676e-14) * t - 4.6206e-13) * p + ((2.7759e-12 * t - 1.1351e-10) * ds + ((-5.4481e-14 * t + 8.733e-12) * t - 6.7795e-10) * t + 1.8741e-8)) * p + (-4.2393e-8 * t + 1.8932e-6) * ds + ((6.6228e-10 * t - 6.836e-8) * t + 8.5258e-6) * t + 3.5803e-5);
}
// potential temperature
double PoTemp(double s, double t0, double p0, double pr) /* local potential temperature at pr */
      /* using atg procedure for adiabadic lapse rate */
      /* Fofonoff,N.,Deep-Sea Res.,24,489-491 */
// s = salinity, t0 = local temperature deg C ITPS-68, p0 = local pressure in decibars, pr = reference pressure in decibars
{
 double p, t, h, xk, q, temp;
 p = p0;
 t = t0;
 h = pr - p;
 xk = h * ATG(s,t,p);
 t += 0.5 * xk;
 q = xk;
 p += 0.5 * h;
 xk = h * ATG(s,t,p);
 t += 0.29289322 * (xk-q);
 q = 0.58578644 * xk + 0.121320344 * q;
 xk = h * ATG(s,t,p);
 t += 1.707106781 * (xk-q);
 q = 3.414213562 * xk - 4.121320344 * q;
 p += 0.5 * h;
 xk = h * ATG(s,t,p);
 temp = t + (xk - 2.0 * q) / 6.0;
 return(temp);
}
 
image\derive_formulasPotT90.gif
 
potential temperature anomaly =
potential temperature - a0 - a1 x salinity

or
potential temperature - a0 - a1 x Sigma-theta
(When you select potential temperature anomaly as a derived variable, SBE Data Processing prompts you to enter a0, a1, and the selection of salinity or sigma-theta.
Note: You can also enter the parameters on the Miscellaneous tab in Data Conversion or Derive, as applicable.))
 
plume anomaly = potential temperature (s, t, p, Reference Pressure) – Theta-B – Theta-Z/Salinity-Z * (Salinity – Salinity-B)
(When you select plume anomaly as a derived variable, SBE Data Processing prompts you to enter Theta-B, Theta-Z/Salinity-Z, Salinity-B, and Reference Pressure.
Note: You can also enter the parameters on the Miscellaneous tab in Data Conversion; plume anomaly is not available as a derived variable in Derive.)
 
The plume anomaly equation is based on work in hydrothermal vent plumes (Reference: Baker, E.T., Feely, R.A., Mottl, M.J., Sansone, F. T., Wheat, C.G., Resing, J.A., Lupton, J.E., "Hydrothermal plumes along the East Pacific Rise, 8° 40′ to 11° 50′ N: Plume distribution and relationship to the apparent magmatic budget", Earth and Planetary Science Letters 128 (1994) 1-17.). The algorithm used for identifying hydrothermal vent plumes uses potential temperature, gradient conditions in the region, vent salinity, and ambient seawater conditions adjacent to the vent. This function is specific to hydrothermal vent plumes, and more specifically, temperature and potential density anomalies. It is not a generic function for plume tracking (for example, not for wastewater plumes). One anomaly for one region and application does not necessarily apply to another type of anomaly in another region for a different application. The terms are specific to corrections for hydrothermal vent salinity and local hydrographic features near vents. They are likely not relevant to other applications in this exact form.
 
If looking at wastewater plumes, you need to derive your own anomaly function that is specific to what it is you are looking for and that is defined to differentiate between surrounding waters and the wastewater plume waters.
 
specific conductivity = (C * 10,000) / (1 + A * [T – 25]) [microS/cm]
(C = conductivity (S/m), T = temperature (° C),
A = thermal coefficient of conductivity for a natural salt solution
[0.019 - 0.020]; Sea-Bird software uses 0.020.)
 
oxygen [ml/l] = (As applicable, see Application Note 64: SBE 43 Dissolved Oxygen Sensor or Application Note 13-1: SBE 13, 23, 30 Dissolved Oxygen Sensor Calibration & Deployment).
When you select oxygen as a derived variable, there are two correction options available:

(When you select oxygen as a derived variable, Data Conversion prompts you to enter the window size (seconds) and asks if you want to apply the Tau correction and the hysteresis correction; Derive prompts you to enter the window size (seconds) and asks if you want to apply the Tau correction.)
Note: You can also enter the window size and enable the correction(s) on the Miscellaneous tab in Data Conversion or Derive, as applicable.
 
NOTE
Oxygen [ml/l] for the SBE 63 Optical Dissolved Oxygen Sensor is calculated as described in its manual. Tau and hysteresis corrections are not applicable to the SBE 63.
 
oxygen [mmoles/kg] = 44660 * oxygen [ml/l] / (Sigma-theta + 1000)
 
Oxygen saturation is the theoretical saturation limit of the water at the local temperature and salinity value, but with local pressure reset to zero (1 atmosphere). This calculation represents what the local parcel of water could have absorbed from the atmosphere when it was last at the surface (p=0) but at the same (T,S) value. Oxygen saturation can be calculated as Garcia and Gordon, or Weiss --

Garcia and Gordon:
Oxsol(T,S)
= exp {A0 + A1(Ts) + A2(Ts) 2 + A3(Ts) 3 + A4(Ts) 4 + A5(Ts) 5

                                        + S * [B0 + B1(Ts) + B2(Ts) 2 + B3(Ts) 3] + C0(S) 2}

where

    • Oxsol(T,S) = oxygen saturation value (ml/l)
    • S = salinity (psu)
    • T = water temperature (ITS-90, deg C)
    • Ts = ln [(298.15 – T) / (273.15 + T)]
    • A0 = 2.00907   A1 = 3.22014     A2 = 4.0501
      A3 = 4.94457   A4 = - 0.256847   A5 = 3.88767
    • B0 = -0.00624523    B1 = -0.00737614
      B2 = -0.010341        B3 = -0.00817083
    • C0 = -0.000000488682

Weiss:
Oxsat(T,S)
= exp {[A1 + A2 * (100/Ta) + A3 * ln(Ta/100) + A4 * ( Ta/100)]

                                                 + S * [B1 + B2 * (Ta/100) + B3 * (Ta/100)2 ]}

where

    • Oxsat(T,S) = oxygen saturation value (ml/l)
    • S = salinity (psu)
    • T = water temperature (IPTS-68, deg C)
    • Ta = absolute water temperature (T + 273.15)
    • A1 = -173.4292     A2 = 249.6339     A3 = 143.3483     A4 = -21.8492
    • B1 = -0.033096     B2 = 0.014259      B3 = -0.00170

Notes:
- The oxygen saturation equation based on work from Garcia and Gordon (1992) reduces error in the Weiss (1970) parameterization at cold temperatures.
- As implemented in Sea-Bird software, the Garcia and Gordon equation is valid for -5 < T < 50 and 0 < S < 60. Outside of those ranges, the software returns a value of -99 for Oxsol.
- As implemented in Sea-Bird software, the Weiss equation is valid for -2 < T < 40 and 0 < S < 42. Outside of those ranges, the software returns a value of -99 for Oxsat.
 
Oxygen, percent saturation is the ratio of calculated oxygen to oxygen saturation, in percent:
(Oxygen / Oxygen saturation) * 100%.
The Oxygen Saturation value used in this calculation is the value that was used in the Oxygen calculation --
- SBE 43 -- if you selected the Sea-Bird equation in the .con or .xmlcon file, the software uses the Garcia and Gordon Oxsol in this ratio; if you selected the Owens-Millard equation in the .con or .xmlcon file, the software uses the Weiss Oxsat in this ratio.
- SBE 13, 23, or 30 -- the software uses the Weiss Oxsat in this ratio.
 
Nitrogen saturation is the theoretical saturation limit of the water at the local temperature and salinity value, but with local pressure reset to zero (1 atmosphere). This calculation represents what the local parcel of water could have absorbed from the atmosphere when it was last at the surface (p=0) but at the same (T,S) value.

N2Sat(T,S) = exp {[A1 + A2 * (100/Ta) + A3 * ln(Ta/100) + A4 * ( Ta/100)]

                                                + S * [B1 + B2 * (Ta/100) + B3 * (Ta/100)2 ]}

where

    • N2Sat(T,S) = nitrogen saturation value (ml/l)
    • S = salinity (psu)
    • T = water temperature (deg C)
    • Ta = absolute water temperature (deg C + 273.15)
    • A1 = -172.4965    A2 = 248.4262    A3 = 143.0738    A4 = -21.7120
    • B1 = -0.049781    B2 = 0.025018    B3 = -0.0034861

Note: The nitrogen saturation equation is based on work from  Weiss (1970).
 
Descent rate and acceleration are computed by calculating the derivative of the pressure signal with respect to time (with a user-input window size for calculating the derivative), using a linear regression to determine the slope. Values computed by Seasave and Data Conversion are somewhat different from values computed by Derive. Seasave and Data Conversion compute the derivative looking backward in time (with a user-input window size), since they share common code and Seasave cannot use future values of pressure while acquiring data in real time. Derive uses a centered window (equal number of points before and after the scan; user-input window size) to obtain a better estimate of the derivative. Use Seasave and Data Conversion to obtain a quick look at descent rate and acceleration; use Derive to obtain the most accurate values.
(When you select descent rate or acceleration as a derived variable, SBE Data Processing prompts you to enter the window size (seconds).
Note: You can also enter the window size on the Miscellaneous tab in Data Conversion or Derive, as applicable.)
 
Corrected Irradiance [CPAR] = 100 * ratio multiplier * underwater PAR / surface PAR
(ratio multiplier = scaling factor used for comparing light fields of disparate intensity, input in .con or .xmlcon file entry for surface PAR sensor;
underwater PAR = underwater PAR data;
surface PAR = surface PAR data)
Note: For complete description of ratio multiplier, see Application Note 11S (11plus Deck Unit) or 47 (SBE 33 or 36 Deck Unit).