-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgsw_CT_from_rho_exact.m
112 lines (100 loc) · 4.17 KB
/
gsw_CT_from_rho_exact.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
function [CT,CT_multiple] = gsw_CT_from_rho_exact(rho,SA,p)
% gsw_CT_from_rho_exact Conservative Temperature from density
% =========================================================================
%
% USAGE:
% [CT,CT_multiple] = gsw_CT_from_rho_exact(rho,SA,p)
%
% DESCRIPTION:
% Calculates the Conservative Temperature of a seawater sample, for given
% values of its density, Absolute Salinity and sea pressure (in dbar).
%
% Note that this function uses the full Gibbs function. There is an
% alternative to calling this function, namely gsw_CT_from_rho(rho,SA,p),
% which uses the computationally efficient 75-term expression for specific
% volume in terms of SA, CT and p (Roquet et al., 2015).
%
% INPUT:
% rho = density of a seawater sample (e.g. 1026 kg/m^3) [ kg/m^3 ]
% Note. This input has not had 1000 kg/m^3 subtracted from it.
% That is, it is 'density', not 'density anomaly'.
% SA = Absolute Salinity [ g/kg ]
% p = sea pressure [ dbar ]
% ( i.e. absolute pressure - 10.1325 dbar )
%
% rho & SA need to have the same dimensions.
% p may have dimensions 1x1 or Mx1 or 1xN or MxN, where rho & SA are MxN.
%
% OUTPUT:
% CT = Conservative Temperature [ deg C ]
% CT_multiple = Conservative Temperature [ deg C ]
% Note that at low salinities, in brackish water, there are two possible
% temperatures for a single density. This programme will output both
% valid solutions. To see this second solution the user must call the
% programme with two outputs (i.e. [CT,CT_multiple]), if there is only
% one possible solution and the programme has been called with two
% outputs the second variable will be set to NaN.
%
% AUTHOR:
% Trevor McDougall & Paul Barker [ help@teos-10.org ]
%
% VERSION NUMBER: 3.05 (27th January 2015)
%
% REFERENCES:
% IOC, SCOR and IAPSO, 2010: The international thermodynamic equation of
% seawater - 2010: Calculation and use of thermodynamic properties.
% Intergovernmental Oceanographic Commission, Manuals and Guides No. 56,
% UNESCO (English), 196 pp. Available from http://www.TEOS-10.org
%
% Roquet, F., G. Madec, T.J. McDougall, P.M. Barker, 2015: Accurate
% polynomial expressions for the density and specifc volume of seawater
% using the TEOS-10 standard. Ocean Modelling.
%
% The software is available from http://www.TEOS-10.org
%
%==========================================================================
%--------------------------------------------------------------------------
% Check variables and resize if necessary
%--------------------------------------------------------------------------
if ~(nargin==3)
error('gsw_CT_from_rho_exact: Requires three inputs')
end %if
[md,nd] = size(rho);
[ms,ns] = size(SA);
[mp,np] = size(p);
if (ms ~= md | ns ~= nd)
error('gsw_CT_from_rho_exact: rho and SA must have same dimensions')
end
if (mp == 1) & (np == 1) % p scalar - fill to size of rho
p = p*ones(size(rho));
elseif (nd == np) & (mp == 1) % p is row vector,
p = p(ones(1,md), :); % copy down each column.
elseif (md == mp) & (np == 1) % p is column vector,
p = p(:,ones(1,nd)); % copy across each row.
elseif (nd == mp) & (np == 1) % p is a transposed row vector,
p = p.'; % transposed then
p = p(ones(1,md), :); % copy down each column.
elseif (md == mp) & (nd == np)
% ok
else
error('gsw_CT_from_rho_exact: Inputs array dimensions arguments do not agree')
end %if
if md == 1
rho = rho.';
SA = SA.';
p = p.';
transposed = 1;
else
transposed = 0;
end
%--------------------------------------------------------------------------
% Start of the calculation
%--------------------------------------------------------------------------
[t,t_multiple] = gsw_t_from_rho_exact(rho,SA,p);
CT = gsw_CT_from_t(SA,t,p);
CT_multiple = gsw_CT_from_t(SA,t_multiple,p);
if transposed
CT = CT.';
CT_multiple = CT_multiple.';
end
end