| 1 |
function ADTG = sw_adtg(S,T,P) |
| 2 |
|
| 3 |
% SW_ADTG Adiabatic temperature gradient |
| 4 |
%=========================================================================== |
| 5 |
% SW_ADTG $Revision: 1.4 $ $Date: 1994/10/10 04:16:37 $ |
| 6 |
% Copyright (C) CSIRO, Phil Morgan 1992. |
| 7 |
% |
| 8 |
% adtg = sw_adtg(S,T,P) |
| 9 |
% |
| 10 |
% DESCRIPTION: |
| 11 |
% Calculates adiabatic temperature gradient as per UNESCO 1983 routines. |
| 12 |
% |
| 13 |
% INPUT: (all must have same dimensions) |
| 14 |
% S = salinity [psu (PSS-78) ] |
| 15 |
% T = temperature [degree C (IPTS-68)] |
| 16 |
% P = pressure [db] |
| 17 |
% (P may have dims 1x1, mx1, 1xn or mxn for S(mxn) ) |
| 18 |
% |
| 19 |
% OUTPUT: |
| 20 |
% ADTG = adiabatic temperature gradient [degree_C/db] |
| 21 |
% |
| 22 |
% AUTHOR: Phil Morgan 92-04-03 (morgan@ml.csiro.au) |
| 23 |
% |
| 24 |
% DISCLAIMER: |
| 25 |
% This software is provided "as is" without warranty of any kind. |
| 26 |
% See the file sw_copy.m for conditions of use and licence. |
| 27 |
% |
| 28 |
% REFERENCES: |
| 29 |
% Fofonoff, P. and Millard, R.C. Jr |
| 30 |
% Unesco 1983. Algorithms for computation of fundamental properties of |
| 31 |
% seawater. Unesco Tech. Pap. in Mar. Sci., No. 44, 53 pp. Eqn.(31) p.39 |
| 32 |
% |
| 33 |
% Bryden, H. 1973. |
| 34 |
% "New Polynomials for thermal expansion, adiabatic temperature gradient |
| 35 |
% and potential temperature of sea water." |
| 36 |
% DEEP-SEA RES., 1973, Vol20,401-408. |
| 37 |
%========================================================================= |
| 38 |
|
| 39 |
%------------- |
| 40 |
% CHECK INPUTS |
| 41 |
%------------- |
| 42 |
if nargin ~= 3 |
| 43 |
error('sw_adtg.m: Must pass 3 parameters ') |
| 44 |
end %if |
| 45 |
|
| 46 |
% CHECK S,T,P dimensions and verify consistent |
| 47 |
[ms,ns] = size(S); |
| 48 |
[mt,nt] = size(T); |
| 49 |
[mp,np] = size(P); |
| 50 |
|
| 51 |
|
| 52 |
% CHECK THAT S & T HAVE SAME SHAPE |
| 53 |
if (ms~=mt) | (ns~=nt) |
| 54 |
error('check_stp: S & T must have same dimensions') |
| 55 |
end %if |
| 56 |
|
| 57 |
% CHECK OPTIONAL SHAPES FOR P |
| 58 |
if mp==1 & np==1 % P is a scalar. Fill to size of S |
| 59 |
P = P(1)*ones(ms,ns); |
| 60 |
elseif np==ns & mp==1 % P is row vector with same cols as S |
| 61 |
P = P( ones(1,ms), : ); % Copy down each column. |
| 62 |
elseif mp==ms & np==1 % P is column vector |
| 63 |
P = P( :, ones(1,ns) ); % Copy across each row |
| 64 |
elseif mp==ms & np==ns % PR is a matrix size(S) |
| 65 |
% shape ok |
| 66 |
else |
| 67 |
error('check_stp: P has wrong dimensions') |
| 68 |
end %if |
| 69 |
[mp,np] = size(P); |
| 70 |
|
| 71 |
|
| 72 |
|
| 73 |
% IF ALL ROW VECTORS ARE PASSED THEN LET US PRESERVE SHAPE ON RETURN. |
| 74 |
Transpose = 0; |
| 75 |
if mp == 1 % row vector |
| 76 |
P = P(:); |
| 77 |
T = T(:); |
| 78 |
S = S(:); |
| 79 |
|
| 80 |
Transpose = 1; |
| 81 |
end %if |
| 82 |
%***check_stp |
| 83 |
|
| 84 |
%------------- |
| 85 |
% BEGIN |
| 86 |
%------------- |
| 87 |
a0 = 3.5803E-5; |
| 88 |
a1 = +8.5258E-6; |
| 89 |
a2 = -6.836E-8; |
| 90 |
a3 = 6.6228E-10; |
| 91 |
|
| 92 |
b0 = +1.8932E-6; |
| 93 |
b1 = -4.2393E-8; |
| 94 |
|
| 95 |
c0 = +1.8741E-8; |
| 96 |
c1 = -6.7795E-10; |
| 97 |
c2 = +8.733E-12; |
| 98 |
c3 = -5.4481E-14; |
| 99 |
|
| 100 |
d0 = -1.1351E-10; |
| 101 |
d1 = 2.7759E-12; |
| 102 |
|
| 103 |
e0 = -4.6206E-13; |
| 104 |
e1 = +1.8676E-14; |
| 105 |
e2 = -2.1687E-16; |
| 106 |
|
| 107 |
ADTG = a0 + (a1 + (a2 + a3.*T).*T).*T ... |
| 108 |
+ (b0 + b1.*T).*(S-35) ... |
| 109 |
+ ( (c0 + (c1 + (c2 + c3.*T).*T).*T) + (d0 + d1.*T).*(S-35) ).*P ... |
| 110 |
+ ( e0 + (e1 + e2.*T).*T ).*P.*P; |
| 111 |
|
| 112 |
if Transpose |
| 113 |
ADTG = ADTG'; |
| 114 |
end %if |
| 115 |
|
| 116 |
return |
| 117 |
%========================================================================== |