Goby3 3.2.3
2025.05.13
Loading...
Searching...
No Matches
salinity_impl.h
Go to the documentation of this file.
1// Copyright 2013-2021:
2// GobySoft, LLC (2013-)
3// Massachusetts Institute of Technology (2007-2014)
4// Community contributors (see AUTHORS file)
5// File authors:
6// Toby Schneider <toby@gobysoft.org>
7//
8//
9// This file is part of the Goby Underwater Autonomy Project Libraries
10// ("The Goby Libraries").
11//
12// The Goby Libraries are free software: you can redistribute them and/or modify
13// them under the terms of the GNU Lesser General Public License as published by
14// the Free Software Foundation, either version 2.1 of the License, or
15// (at your option) any later version.
16//
17// The Goby Libraries are distributed in the hope that they will be useful,
18// but WITHOUT ANY WARRANTY; without even the implied warranty of
19// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20// GNU Lesser General Public License for more details.
21//
22// You should have received a copy of the GNU Lesser General Public License
23// along with Goby. If not, see <http://www.gnu.org/licenses/>.
24
25// modified for C++ by s. petillo spetillo@mit.edu
26// ocean engineering graduate student - mit / whoi joint program
27// massachusetts institute of technology (mit)
28// laboratory for autonomous marine sensing systems (lamss)
29
30//Algorithm from S. Petillo salinity.m
31// Function for calculation of salinity from conductivity.
32//
33// S.Petillo (spetillo@mit.edu) - 02 Aug. 2010
34//
35// Taken directly from:
36// 'Algorithms for computation of fundamental properties of seawater'
37// UNESCO 1983 equation
38// conductivity ratio to practical salinity conversion (SAL78)
39//
40// Valid over the ranges:
41// Temperaturature: -2<T<35 degC
42// Salinity: 2<S<42 psu
43// (from Prekin and Lewis, 1980)
44//
45// Units:
46// conductivity Cond mS/cm
47// salinity S (PSS-78)
48// temperature T (IPTS-68) degC
49// pressure P decibars
50
51// Cond(35,15,0) = 42.914 mS/cm
52// the electrical conductivity of the standard seawater.
53// Given by Jan Schultz (23 May, 2008) in
54// 'Conversion between conductivity and PSS-78 salinity' at
55// http://www.code10.info/index.php?option=com_content&view=category&id=54&Itemid=79
56
57#ifndef GOBY_UTIL_SEAWATER_DETAIL_SALINITY_IMPL_H
58#define GOBY_UTIL_SEAWATER_DETAIL_SALINITY_IMPL_H
59
60namespace goby
61{
62namespace util
63{
64namespace seawater
65{
66namespace detail
67{
69{
70 public:
71 enum
72 {
73 TO_SALINITY = false,
74 FROM_SALINITY = true
75 };
76 // returns salinity or conductivity, based on value of M
77 static double compute(double CND, double T, double P, bool M)
78 {
79 double SAL78 = 0;
80
81 // ZERO SALINITY/CONDUCTIVITY TRAP
82 if (((M == 0) && (CND <= 5e-4)) || ((M == 1) && (CND <= 0.2)))
83 return SAL78;
84
85 double DT = T - 15;
86
87 // SELECT BRANCH FOR SALINITY (M=0) OR CONDUCTIVITY (M=1)
88 if (M == 0)
89 {
90 // CONVERT CONDUCTIVITY TO SALINITY
91 double Res = CND;
92 double RT = Res / (RT35(T) * (1.0 + C(P) / (B(T) + A(T) * Res)));
93 RT = std::sqrt(std::abs(RT));
94 SAL78 = SAL(RT, DT);
95 return SAL78;
96 }
97 else
98 {
99 // INVERT SALINITY TO CONDUCTIVITY BY THE
100 // NEWTON-RAPHSON ITERATIVE METHOD
101 // FIRST APPROXIMATION
102
103 double RT = std::sqrt(CND / 35);
104 double SI = SAL(RT, DT);
105 double N = 0;
106
107 // TIERATION LOOP BEGINS HERE WITH A MAXIMUM OF 10 CYCLES
108 double DELS = 0;
109 do
110 {
111 RT = RT + (CND - SI) / DSAL(RT, DT);
112 SI = SAL(RT, DT);
113 N = N + 1;
114 DELS = std::abs(SI - CND);
115
116 } while ((DELS > 1e-4) && (N < 10));
117
118 //COMPUTE CONDUCTIVITY RATIO
119 double RTT = RT35(T) * RT * RT;
120 double AT = A(T);
121 double BT = B(T);
122 double CP = C(P);
123 CP = RTT * (CP + BT);
124 BT = BT - RTT * AT;
125
126 // SOLVE QUADRATIC EQUATION FOR R: R=RT35*RT*(1+C/AR+B)
127 // R := SQRT (ABS (BT * BT + 4.0 * AT * CP)) - BT;
128 double Res = std::sqrt(std::abs(BT * BT + 4 * AT * CP)) - BT;
129 // CONDUCTIVITY RETURN
130 SAL78 = 0.5 * Res / AT;
131 return SAL78;
132 }
133 }
134
135 private:
136 static double SAL(double XR, double XT)
137 {
138 // PRACTICAL SALINITY SCALE 1978 DEFINITION WITH TEMPERATURE
139 // CORRECTION;XT :=T-15.0; XR:=SQRT(RT);
140 double sal =
141 ((((2.7081 * XR - 7.0261) * XR + 14.0941) * XR + 25.3851) * XR - 0.1692) * XR + 0.0080 +
142 (XT / (1.0 + 0.0162 * XT)) *
143 (((((-0.0144 * XR + 0.0636) * XR - 0.0375) * XR - 0.0066) * XR - 0.0056) * XR +
144 0.0005);
145 return sal;
146 }
147
148 static double DSAL(double XR, double XT)
149 {
150 // FUNCTION FOR DERIVATIVE OF SAL(XR,XT) WITH XR
151 double dsal = ((((13.5405 * XR - 28.1044) * XR + 42.2823) * XR + 50.7702) * XR - 0.1692) +
152 (XT / (1.0 + 0.0162 * XT)) *
153 ((((-0.0720 * XR + 0.2544) * XR - 0.1125) * XR - 0.0132) * XR - 0.0056);
154 return dsal;
155 }
156
157 static double RT35(double XT)
158 {
159 // FUNCTION RT35: C(35,T,0)/C(35,15,0) VARIATION WITH TEMPERATURE
160 double rt35 =
161 (((1.0031E-9 * XT - 6.9698E-7) * XT + 1.104259E-4) * XT + 2.00564E-2) * XT + 0.6766097;
162 return rt35;
163 }
164
165 static double C(double XP)
166 {
167 // C(XP) POLYNOMIAL CORRESPONDS TO A1-A3 CONSTANTS: LEWIS 1980
168 double c = ((3.989E-15 * XP - 6.370E-10) * XP + 2.070E-5) * XP;
169 return c;
170 }
171
172 static double B(double XT)
173 {
174 double b = (4.464E-4 * XT + 3.426E-2) * XT + 1.0;
175 return b;
176 }
177
178 static double A(double XT)
179 {
180 //A(XT) POLYNOMIAL CORRESPONDS TO B3 AND B4 CONSTANTS: LEWIS 1980
181 double a = -3.107E-3 * XT + 0.4215;
182 return a;
183 }
184
185 SalinityCalculator();
186 ~SalinityCalculator();
187 SalinityCalculator(const SalinityCalculator&);
188 SalinityCalculator& operator=(const SalinityCalculator&);
189};
190} // namespace detail
191} // namespace seawater
192} // namespace util
193} // namespace goby
194
195#endif
static double compute(double CND, double T, double P, bool M)
detail namespace with internal helper functions
Definition json.hpp:247
constexpr T e
Definition constants.h:35
The global namespace for the Goby project.