JaiaBot  1.20.1
JaiaBot micro-AUV software
dissolved_oxygen_compensation.h
Go to the documentation of this file.
1 #include <cmath>
2 
20 double pressure_correction(double pressure_mmhg = 760.0) { return pressure_mmhg / 760.0; }
21 
34 double salinity_correction(double temperature_k, double salinity_ppt)
35 {
36  // base salinity correction
37  const double sal_corr_a = 0.017674;
38  // adjusts salinity correction based on temperature
39  const double sal_corr_b = 10.754;
40  // quadratic temp-based adjustment to salinity effect
41  const double sal_corr_c = 2140.7;
42 
43  return std::exp(-salinity_ppt * (sal_corr_a - (sal_corr_b / temperature_k) +
44  (sal_corr_c / (temperature_k * temperature_k))));
45 }
46 
60 double calculate_do_saturation_fresh(double temperature_k)
61 {
62  // Constants from Weiss (1970), Equation (7) in USGS WQ.2011.03
63  const double a0 = -173.4292;
64  const double a1 = 249.6339;
65  const double a2 = 143.3483;
66  const double a3 = -21.8492;
67  const double oxygen_conversion = 1.42905; // mL/L to mg/L at STP
68  const double temp_scale = 100.0;
69 
70  double scaled_temp = temperature_k / temp_scale;
71 
72  double ln_do =
73  a0 + a1 * (temp_scale / temperature_k) + a2 * std::log(scaled_temp) + a3 * scaled_temp;
74 
75  return oxygen_conversion * std::exp(ln_do);
76 }
77 
98 double calculate_dissolved_oxygen_solubility(double temperature_celsius, double salinity_ppt,
99  double pressure_mmhg = 760.0)
100 {
101  const double kelvin_offset = 273.15;
102  double temperature_k = temperature_celsius + kelvin_offset;
103  double do_saturation = calculate_do_saturation_fresh(temperature_k);
104  double salinity_factor = salinity_correction(temperature_k, salinity_ppt);
105  double pressure_factor = pressure_correction(pressure_mmhg);
106 
107  return do_saturation * salinity_factor * pressure_factor;
108 }
109 
124 double calculate_do_saturation_percent(double do_raw, double do_max)
125 {
126  return (do_raw / do_max) * 100.0;
127 }
double salinity_correction(double temperature_k, double salinity_ppt)
Computes the salinity correction factor for dissolved oxygen solubility.
double calculate_do_saturation_fresh(double temperature_k)
Calculates the saturation concentration of dissolved oxygen in freshwater at 1 atm and 0 ppt salinity...
double calculate_dissolved_oxygen_solubility(double temperature_celsius, double salinity_ppt, double pressure_mmhg=760.0)
Calculates the dissolved oxygen (DO) solubility in mg/L, corrected for temperature,...
double calculate_do_saturation_percent(double do_raw, double do_max)
Calculates dissolved oxygen (DO) percent saturation.
double pressure_correction(double pressure_mmhg=760.0)
Approximates the effect of barometric pressure on dissolved oxygen (DO) solubility.