Skip to content
Snippets Groups Projects
Commit bd824018 authored by Yves Gouriou's avatar Yves Gouriou
Browse files

Développement de la focntion d'étalonnage.

Ajout de la bilbiothèque CSIRO à SVN (pas nécessaire)
parent 410b30a4
No related branches found
No related tags found
No related merge requests found
function [dist,phaseangle] = distance(lat,lon,units)
% SW_DIST Distance between two lat,lon coordinates
%===================================================================
% SW_DIST $Revision: 1.4 $ $Date: 1994/10/10 04:55:23 $
% Copyright (C) CSIRO, Phil Morgan & Steve Rintoul 1992.
%
% USAGE: [dist,phaseangle] = distance(lat,lon {,units} )
%
% DESCRIPTION:
% Calculate distance between two positions on glode using the "Plane
% Sailing" method. Also uses simple geometry to calculate the bearing of
% the path between position pairs.
%
% INPUT:
% lat = decimal degrees (+ve N, -ve S) [- 90.. +90]
% lon = decimal degrees (+ve E, -ve W) [-180..+180]
% units = optional string specifing units of distance
% 'nm' = nautical miles (default)
% 'km' = kilometres
%
% OUTPUT:
% dist = distance between positions in units
% phaseangle = angle of line between stations with x axis (East).
% Range of values are -180..+180. (E=0, N=90, S=-90)
%
% AUTHOR: Phil Morgan and Steve Rintoul 92-02-10
%
% DISCLAIMER:
% This software is provided "as is" without warranty of any kind.
% See the file sw_copy.m for conditions of use and licence.
%
% REFERENCE:
% The PLANE SAILING method as descriibed in "CELESTIAL NAVIGATION" 1989 by
% Dr. P. Gormley. The Australian Antartic Division.
%==================================================================
% CALLER: general purpose
% CALLEE: none
%----------------------
% CHECK INPUT ARGUMENTS
%----------------------
if nargin > 3
error('sw_dist.m: No more than 3 arguments allowed')
elseif nargin==3
if ~isstr(units)
error('sw_dist.m: units argument must be string')
end %if
elseif nargin==2
units = 'nm'; % default units
else
error('sw_dist.m: wrong number of arguments')
end%if
[mlat,nlat] = size(lat);
if mlat~=1 & nlat~=1
error('sw_dist.m: lat, lon must be vectors. No matrices allowed')
else
if mlat == 1
Transpose = 1; % row vector passed in
else
Transpose = 0; % accept column vector
end%if
end%if
lat = lat(:); %force to column vectors
lon = lon(:);
if length(lat)~=length(lon)
error('sw_dist.m: lat and lon must have same number of elements')
end%if
%-----------------
% DEFINE CONSTANTS
%-----------------
DEG2RAD = (2*pi/360);
RAD2DEG = 1/DEG2RAD;
DEG2MIN = 60;
DEG2NM = 60;
NM2KM = 1.8520; % Defined in Pond & Pickard p303.
% BEGIN
npositions = length(lat);
ind=1:npositions-1; % index to first of position pairs
dlon = diff(lon);
if any(abs(dlon)>180)
flag = find(abs(dlon)>180);
for ii=1:length(flag)
dlon(flag(ii))= -sign(dlon(flag(ii))) * (360 - abs(dlon(flag(ii))) );
end %for
end %if
latrad = abs(lat*DEG2RAD);
dep = cos( (latrad(ind+1)+latrad(ind))./2 ) .* dlon;
dlat = diff(lat);
dist = DEG2NM*sqrt(dlat.^2 + dep.^2); % in n.miles
if strcmp(units,'km') % defaults to n.miles
dist = dist * NM2KM;
end %if
% CALCUALTE ANGLE TO X AXIS
phaseangle = angle(dep+dlat*sqrt(-1))*RAD2DEG;
if Transpose
dist = dist';
phaseangle = phaseangle';
end %if
return
%--------------------------------------------------------------------
function DEPTHM = sw_dpth(P,LAT)
% SW_DPTH Depth from pressure
%===========================================================================
% SW_DPTH $Revision: 1.3 $ $Date: 1994/10/10 04:56:32 $
% Copyright (C) CSIRO, Phil Morgan 1992.
%
% USAGE: dpth = sw_dpth(P,LAT)
%
% DESCRIPTION:
% Calculates depth in metres from pressure in dbars.
%
% INPUT: (all must have same dimensions)
% P = Pressure [db]
% LAT = Latitude in decimal degress north [-90..+90]
% (lat may have dimensions 1x1 or 1xn where P(mxn).
%
% OUTPUT:
% dpth = depth [metres]
%
% AUTHOR: Phil Morgan 92-04-06 (morgan@ml.csiro.au)
%
% DISCLAIMER:
% This software is provided "as is" without warranty of any kind.
% See the file sw_copy.m for conditions of use and licence.
%
% REFERENCES:
% Unesco 1983. Algorithms for computation of fundamental properties of
% seawater, 1983. _Unesco Tech. Pap. in Mar. Sci._, No. 44, 53 pp.
%=========================================================================
% CALLER: general purpose
% CALLEE: none
%-------------
% CHECK INPUTS
%-------------
[mP,nP] = size(P);
[mL,nL] = size(LAT);
if mL==1 & nL==1
LAT = LAT*ones(size(P));
[mL,nL] = size(LAT);
end %if
if (mP~=mL) | (nP~=nL) % P & LAT are not the same shape
if (nP==nL) & (mL==1) % LAT for each column of P
LAT = LAT( ones(1,mP), : ); % copy LATS down each column
% s.t. dim(P)==dim(LAT)
else
error('sw_depth.m: Inputs arguments have wrong dimensions')
end %if
end %if
Transpose = 0;
if mP == 1 % row vector
P = P(:);
LAT = LAT(:);
Transpose = 1;
end %if
%-------------
% BEGIN
%-------------
% Eqn 25, p26. Unesco 1983.
DEG2RAD = pi/180;
c1 = +9.72659;
c2 = -2.2512E-5;
c3 = +2.279E-10;
c4 = -1.82E-15;
gam_dash = 2.184e-6;
LAT = abs(LAT);
X = sin(LAT*DEG2RAD); % convert to radians
X = X.*X;
bot_line = 9.780318*(1.0+(5.2788E-3+2.36E-5*X).*X) + gam_dash*0.5*P;
top_line = (((c4*P+c3).*P+c2).*P+c1).*P;
DEPTHM = top_line./bot_line;
if Transpose
DEPTHM = DEPTHM';
end %if
return
%===========================================================================
%
function f = sw_f(lat)
% SW_F Coriolis factor "f"
%===========================================================================
% SW_F $Revision: 1.3 $ $Date: 1994/10/10 04:57:08 $
% Copyright (C) CSIRO, Phil Morgan 1993.
%
% USAGE: f = sw_f(lat)
%
% DESCRIPTION:
% Calculates the Coriolis factor "f" defined by
% f = 2*Omega*Sin(lat) where Omega = 7.292e-5 radians/sec
%
% INPUT:
% lat = Latitude in decimal degress north [-90..+90]
%
% OUTPUT:
% f = Coriolis Factor "f" [s-1]
%
% AUTHOR: Phil Morgan 93-04-20 (morgan@ml.csiro.au)
%
% DISCLAIMER:
% This software is provided "as is" without warranty of any kind.
% See the file sw_copy.m for conditions of use and licence.
%
% REFERENCE:
% S. Pond & G.Pickard 2nd Edition 1986
% Introductory Dynamical Oceanogrpahy
% Pergamon Press Sydney. ISBN 0-08-028728-X
%
% A.E. Gill 1982. p.597
% "Atmosphere-Ocean Dynamics"
% Academic Press: New York. ISBN: 0-12-283522-0
%=========================================================================
% CALLER: general purpose
% CALLEE: none
%-------------
% CHECK INPUTS
%-------------
if nargin ~= 1
error('sw_f.m: Requires one input argument')
end %if
%-------------
% BEGIN
%-------------
% Eqn p27. Unesco 1983.
DEG2RAD = pi/180;
OMEGA = 7.292e-5; %s-1 A.E.Gill p.597
f = 2*OMEGA*sin(lat*DEG2RAD);
return
%===========================================================================
function fp = sw_fp(S,P)
% SW_FP Freezing point of sea water
%=========================================================================
% SW_FP % $Revision: 1.3 $ $Date: 1994/10/10 04:57:50 $
% Copyright (C) CSIRO, Phil Morgan 1993.
%
% USAGE: fp = sw_fp(S,P)
%
% DESCRIPTION:
% Heat Capacity of Sea Water using UNESCO 1983 polynomial.
%
% INPUT: (all must have same dimensions)
% S = salinity [psu (PSS-78)]
% P = pressure [db]
% (P may have dims 1x1, mx1, 1xn or mxn for S(mxn) )
%
% OUTPUT:
% fp = Freezing Point temperature [degree C (IPTS-68)]
%
% AUTHOR: Phil Morgan 93-04-20 (morgan@ml.csiro.au)
%
% DISCLAIMER:
% This software is provided "as is" without warranty of any kind.
% See the file sw_copy.m for conditions of use and licence.
%
% REFERENCES:
% Fofonff, P. and Millard, R.C. Jr
% Unesco 1983. Algorithms for computation of fundamental properties of
% seawater, 1983. _Unesco Tech. Pap. in Mar. Sci._, No. 44, 53 pp.
%=========================================================================
% CALLER: general purpose
% CALLEE: none
%----------------------
% CHECK INPUT ARGUMENTS
%----------------------
if nargin ~=2
error('sw_fp.m: Must pass 3 parameters')
end %if
[ms,ns] = size(S);
[mp,np] = size(P);
% CHECK OPTIONAL SHAPES FOR P
if mp==1 & np==1 % P is a scalar. Fill to size of S
P = P(1)*ones(ms,ns);
elseif np==ns & mp==1 % P is row vector with same cols as S
P = P( ones(1,ms), : ); % Copy down each column.
elseif mp==ms & np==1 % P is column vector
P = P( :, ones(1,ns) ); % Copy across each row
elseif mp==ms & np==ns % PR is a matrix size(S)
% shape ok
else
error('sw_fp.m: P has wrong dimensions')
end %if
[mp,np] = size(P);
% IF ALL ROW VECTORS ARE PASSED THEN LET US PRESERVE SHAPE ON RETURN.
Transpose = 0;
if mp == 1 % row vector
P = P(:);
S = S(:);
Transpose = 1;
end %if
%------
% BEGIN
%------
%P = P/10; % to convert db to Bar as used in Unesco routines
%------------
% eqn p.29
%------------
a0 = -0.0575;
a1 = 1.710523e-3;
a2 = -2.154996e-4;
b = -7.53e-4;
fp = a0.*S + a1.*S.*sqrt(S) + a2.*S.^2 + b.*P;
if Transpose
fp = fp';
end %if
return
%--------------------------------------------------------------------
function g = sw_g(LAT,z)
% SW_G Gravitational acceleration
%===========================================================================
% SW_G $Revision: 1.4 $ $Date: 1994/10/11 00:00:54 $
% Copyright (C) CSIRO, Phil Morgan 1993.
%
% USAGE: g = sw_g(lat,z)
%
% DESCRIPTION:
% Calculates acceleration due to gravity as function of latitude.
%
% INPUT: (all must have same dimensions)
% lat = Latitude in decimal degress north [-90..+90]
% z = height in metres (+ve above sea surface, -ve below)
%
% OUTPUT:
% g = gravity [m/s^2]
%
% AUTHOR: Phil Morgan 93-04-20 (morgan@ml.csiro.au)
%
% DISCLAIMER:
% This software is provided "as is" without warranty of any kind.
% See the file sw_copy.m for conditions of use and licence.
%
% REFERENCES:
% Unesco 1983. Algorithms for computation of fundamental properties of
% seawater, 1983. _Unesco Tech. Pap. in Mar. Sci._, No. 44, 53 pp.
%
% A.E. Gill 1982. p.597
% "Atmosphere-Ocean Dynamics"
% Academic Press: New York. ISBN: 0-12-283522-0
%=========================================================================
% CALLER: general purpose
% CALLEE: none
%-------------
% CHECK INPUTS
%-------------
if ~(nargin==1 | nargin==2)
error('sw_g.m: Requires one or two input arguments')
end %if
if nargin == 1
z = zeros(size(LAT));
end %if
[mL,nL] = size(LAT);
[mz,nz] = size(z);
if ~(mL==mz | nL==nz)
error('sw_g.m: Input arguments should have same dimensions')
end %if
%-------------
% BEGIN
%-------------
% Eqn p27. Unesco 1983.
a = 6371000; % mean radius of earth A.E.Gill
DEG2RAD = pi/180;
LAT = abs(LAT);
X = sin(LAT*DEG2RAD); % convert to radians
sin2 = X.*X;
g = 9.780318*(1.0+(5.2788E-3+2.36E-5*sin2).*sin2);
if any(any(z))
g = g./((1+z/a).^2); % from A.E.Gill p.597
end %if
return
%===========================================================================
function [ga, pe] = sw_gpan(S,T,P,LAT)
% SW_GPAN Geopotential anomaly
%=========================================================================
% SW_GPAN $Revision: 1.3 $ $Date: 1994/10/10 05:01:00 $
% Copyright (C) CSIRO, Phil Morgan 1992.
%
% USAGE: [gpan, pe]= sw_gpan(S,T,P,LAT)
%
% DESCRIPTION:
% Geopotential Anomaly calculated as the integral of svan from the
% the sea surface to the bottom. Thus RELATIVE TO SEA SURFACE.
%
% INPUT: (all must have same dimensions)
% S = salinity [psu (PSS-78)]
% T = temperature [degree C (ITP-68)]
% P = Pressure [db]
% LAT = latitude
% (P may have dims 1x1, mx1, 1xn or mxn for S(mxn) )
%
% OUTPUT:
% gpan = Geopotential Anomaly [m^3 kg^-1 Pa == m^2 s^-2 == J kg^-1]
% pe = anomalie d'energie potentielle en kg/s^2 * 10
%
% AUTHOR: Phil Morgan 92-11-05 (morgan@ml.csiro.au)
%
% DISCLAIMER:
% This software is provided "as is" without warranty of any kind.
% See the file sw_copy.m for conditions of use and licence.
%
% REFERENCE: S. Pond & G.Pickard 2nd Edition 1986
% Introductory Dynamical Oceanogrpahy
% Pergamon Press Sydney. ISBN 0-08-028728-X
%
% Note that older literature may use units of "dynamic decimeter' for above.
%
% Adapted method from Pond and Pickard (p76) to calc gpan rel to sea
% surface whereas P&P calculated relative to the deepest common depth.
%=========================================================================
%
% CALLER: general purpose
% CALLEE: sw_svan.m
%----------------------
% CHECK INPUT ARGUMENTS
%----------------------
if nargin ~= 4
error('sw_gpan.m: Must pass 4 parameters')
end %if
% CHECK S,T,P dimensions and verify consistent
[ms,ns] = size(S);
[mt,nt] = size(T);
[mp,np] = size(P);
% CHECK THAT S & T HAVE SAME SHAPE
if (ms~=mt) | (ns~=nt)
error('check_stp: S & T must have same dimensions')
end %if
% CHECK OPTIONAL SHAPES FOR P
if mp==1 & np==1 % P is a scalar. Fill to size of S
P = P(1)*ones(ms,ns);
elseif np==ns & mp==1 % P is row vector with same cols as S
P = P( ones(1,ms), : ); % Copy down each column.
elseif mp==ms & np==1 % P is column vector
P = P( :, ones(1,ns) ); % Copy across each row
elseif mp==ms & np==ns % PR is a matrix size(S)
% shape ok
else
error('check_stp: P has wrong dimensions')
end %if
[mp,np] = size(P);
% IF ALL ROW VECTORS ARE PASSED THEN LET US PRESERVE SHAPE ON RETURN.
Transpose = 0;
if mp == 1 % row vector
P = P(:);
T = T(:);
S = S(:);
Transpose = 1;
end %if
%***check_stp
%------
% BEGIN
%------
db2Pascal = 1e4;
[m,n] = size(P);
svan = sw_svan(S,T,P);
mean_svan = 0.5*(svan(2:m,:) + svan(1:m-1,:) );
if n==1
top = svan(1,1).*P(1,1)*db2Pascal;
else
top = svan(1,:).*P(1,:)*db2Pascal;
end %if
%press_diff = diff(P);
delta_ga = (mean_svan.*diff(P))*db2Pascal;
ga = cumsum([ top; delta_ga]);
% Rajoute par Y. Gouriou en se basant sur la routine de Millard
% pe[ref] = hdy[ref] * (ctd[ref].pres + ctd[ind].pres)*0.5F /
% (float)grav( (double)ctd[ref].pres,lat ); */
% pe[ref] = (float) ( fabs( (double)( pres[ref] - pres[ind]) )
% * (anvs[ref]*pres[ref] + anvs[ind]*pres[ind])
% * 0.5e-5 / (float)grav( (double)pres[ref],lat ));
mean_P = 0.5*( P(2:m,:) + P(1:m-1,:) );
delta_pe = delta_ga .* mean_P ./ sw_g( LAT, -sw_dpth(P(2:end),LAT));
pe = cumsum([ top/sw_g( LAT, 0); delta_pe]);
if Transpose
ga = ga';
pe = pe';
end %if
return
%--------------------------------------------------------------------
function vel = sw_gvel(ga,lat,lon)
% SW_GVEL Geostrophic velocity
%===================================================================
% GEOVEL $Revision: 1.5 $ $Date: 1994/11/15 04:00:36 $
% Copyright (C) CSIRO, Phil Morgan 1992
%
% USAGE: vel = sw_gvel(ga,lat,lon)
%
% DESCRIPTION:
% Calculates geostrophic velocity given the geopotential anomaly
% and position of each station.
%
% INPUT:
% ga = geopotential anomoly relative to the sea surface.
% dim(mxnstations)
% lat = latitude of each station (+ve = N, -ve = S) [ -90.. +90]
% lon = longitude of each station (+ve = E, -ve = W) [-180..+180]
%
% OUTPUT:
% vel = geostrophic velocity RELATIVE to the sea surface.
% dim(m,nstations-1)
%
% AUTHOR: Phil Morgan 1992/03/26 (morgan@ml.csiro.au)
%
% DISCLAIMER:
% This software is provided "as is" without warranty of any kind.
% See the file sw_copy.m for conditions of use and licence.
%
% REFERENCE: S. Pond & G.Pickard 2nd Edition 1986
% Introductory Dynamical Oceanogrpahy
% Pergamon Press Sydney. ISBN 0-08-028728-X
% Equation 8.9A p73 Pond & Pickard
%
% NOTE: This calls sw_dist.m. You can replace the call to this
% routine if you have a more appropraite distance routine.
%==================================================================
% CALLER: general purpose
% CALLEE: sw_dist.m
%
DEG2RAD = pi/180;
RAD2DEG = 180/pi;
OMEGA = 7.292e-5; % Angular velocity of Earth [radians/sec]
% You may replace the call to sw_dist if you have
% a more appropriate distance routine.
distm = 1000*sw_dist(lat,lon,'km');
[m,n] = size(ga);
f = 2*OMEGA*sin( (lat(1:n-1)+lat(2:n))*DEG2RAD/2 );
lf = f.*distm;
LF = lf(ones(m,1),:);
vel = -( ga(:,2:n)-ga(:,1:n-1) ) ./ LF;
return
%--------------------------------------------------------------------
% SW_INFO Computational routines for the properties of sea water
%
% SEAWATER - devloped by Phil Morgan, CSIRO
%
% DESCRIPTION:
% SEAWATER is a toolkit of MATLAB routines for calculating the
% properties of sea water. They are a self contained library and
% are extremely easy to use and will run on all computers that
% support MATLAB.
%
% MATLAB:
% For information on MATLAB contact info@mathworks.com
%
% DISCLAIMER
% This software is provided "as is" without warranty of any kind.
% See the file sw_copy.m for conditions of use and licence.
%
% MORE INFORMATION:
% http://www.marine.csiro.au/~morgan/seawater
%
% $Revision: 1.10 $ $Date: 1998/04/21 05:50:33 $
% Copyright (C) CSIRO, Phil Morgan 1993.
%=========================================================================
more on
help sw_info
more off
return
%--------------------------------------------------------------------
% SW_NEW What's new in this version of seawater.
%
% 22 April 1998 release 2.0.1 (For version 5.x of Matlab)
% ********************************************************
% This version is not optimised but will run under Matlab 5.x
% sw_satAr New routine. Solubility of Ar in seawater
% sw_satN2 New routine. Solubility of Ar in seawater
% sw_satO2 New routine. Solubility of Ar in seawater
% sw_test Updated to include tests for above
%
% April 1998 release 1.2e (For version 4.x of Matlab)
% ************************
% sw_alpha Fixed bug where temp used in calculations regardless of
% whether 'temp' or 'pmpt' was passed as keyword.
%
% sw_info Shorter version. Refer users to web pages
% http://www.marine.csiro.au
%
% sw_ver New routine. Returns version number of SEAWATER
%
% sw_test New Routine. Run a test on the SEAWATER routines
% and compare results with literature values
%
% 94/11/15 release 1.2d
% **********************
% sw_bfrq.m Now also returns potential vorticity.
% Thanks to Greg Johnson (gjohnson@pmel.noaa.gov)
%
% sw_gvel.m OMEGA=7.29e-5 changed to OMEGA=7.292e-5 to be
% consistent with sw_f.m
%
% IMPORTANT CHANGE: The usage of the following
% routines has changed!
%
% sw_alpha.m | All these routines expect (S,T,P) to
% sw_beta.m |-- be passed instead of (S,PTMP,P) as in
% sw_aonb.m | previous releases of seawater.
% Fast execution can still be obtained by passing
% ptmp with a string flag 'ptmp' see help.
%
% 94/10/19 release 1.2c
% **********************
% Added routine sw_new.m to inform of updates and new features.
% sw_bfrq.m Fixed bug where LAT = [] was needed as argument when
% no latitude values are being passed.
% Now pass PRESSURE instead of DEPTH -> more consistent
% though only a negligible change is answers.
%
% sw_info.m Updated to include a registration section.
% Noted that software is FREE.
% Noted best email address is seawater@ml.csiro.au
% Requests for Report also via email to library@ml.csiro.au
%
% 94/10/12 release 1.2b
% ********************
% First official release and announcement on the networks.
%
more on
help sw_new
more off
%-------------
function pden = sw_pden(S,T,P,PR)
% SW_PDEN Potential density
%===========================================================================
% SW_PDEN $Revision: 1.3 $ $Date: 1994/10/10 05:05:21 $
% Copyright (C) CSIRO, Phil Morgan 1992.
%
% USAGE: pden = sw_pden(S,T,P,PR)
%
% DESCRIPTION:
% Calculates potential density of water mass relative to the specified
% reference pressure by pden = sw_dens(S,ptmp,PR).
%
% INPUT: (all must have same dimensions)
% S = salinity [psu (PSS-78) ]
% T = temperature [degree C (IPTS-68)]
% P = pressure [db]
% PR = Reference pressure [db]
% (P may have dims 1x1, mx1, 1xn or mxn for S(mxn) )
%
% OUTPUT:
% pden = Potential denisty relative to the ref. pressure [kg/m^3]
%
% AUTHOR: Phil Morgan 1992/04/06 (morgan@ml.csiro.au)
%
% DISCLAIMER:
% This software is provided "as is" without warranty of any kind.
% See the file sw_copy.m for conditions of use and licence.
%
% REFERENCES:
% A.E. Gill 1982. p.54
% "Atmosphere-Ocean Dynamics"
% Academic Press: New York. ISBN: 0-12-283522-0
%=========================================================================
% CALLER: general purpose
% CALLEE: sw_ptmp.m sw_dens.m
%-------------
% CHECK INPUTS
%-------------
if nargin ~= 4
error('sw_pden.m: Must pass 4 parameters ')
end %if
% LET sw_ptmp.m DO DIMENSION CHECKING
%------
% BEGIN
%------
ptmp = sw_ptmp(S,T,P,PR);
pden = sw_dens(S,ptmp,PR);
return
%=========================================================================
function pres = sw_pres(DEPTH,LAT)
% SW_PRES Pressure from depth
%===========================================================================
% SW_PRES $Revision: 1.5 $ $Date: 1994/10/11 01:23:32 $
% Copyright (C) CSIRO, Phil Morgan 1993.
%
% USAGE: pres = sw_pres(depth,lat)
%
% DESCRIPTION:
% Calculates pressure in dbars from depth in meters.
%
% INPUT: (all must have same dimensions)
% depth = depth [metres]
% lat = Latitude in decimal degress north [-90..+90]
% (LAT may have dimensions 1x1 or 1xn where depth(mxn) )
%
% OUTPUT:
% pres = Pressure [db]
%
% AUTHOR: Phil Morgan 93-06-25 (morgan@ml.csiro.au)
%
% DISCLAIMER:
% This software is provided "as is" without warranty of any kind.
% See the file sw_copy.m for conditions of use and licence.
%
% REFERENCES:
% Saunders, P.M. 1981
% "Practical conversion of Pressure to Depth"
% Journal of Physical Oceanography, 11, 573-574
%
% CHECK VALUE:
% P=7500.00 db for LAT=30 deg, depth=7321.45 meters
%=========================================================================
% CALLER: general purpose
% CALLEE: none
%-------------
% CHECK INPUTS
%-------------
[mD,nD] = size(DEPTH);
[mL,nL] = size(LAT);
if mL==1 & nL==1
LAT = LAT*ones(size(DEPTH));
[mL,nL] = size(LAT);
end %if
if (mD~=mL) | (nD~=nL) % DEPTH & LAT are not the same shape
if (nD==nL) & (mL==1) % LAT for each column of DEPTH
LAT = LAT( ones(1,mD), : ); % copy LATS down each column
% s.t. dim(DEPTH)==dim(LAT)
else
error('sw_pres.m: Inputs arguments have wrong dimensions')
end %if
end %if
Transpose = 0;
if mD == 1 % row vector
DEPTH = DEPTH(:);
LAT = LAT(:);
Transpose = 1;
end %if
%-------------
% BEGIN
%-------------
DEG2RAD = pi/180;
X = sin(abs(LAT)*DEG2RAD); % convert to radians
C1 = 5.92E-3+X.^2*5.25E-3;
pres = ((1-C1)-sqrt(((1-C1).^2)-(8.84E-6*DEPTH)))/4.42E-6;
if Transpose
pres = pres';
end %if
return
%===========================================================================
function PT = sw_ptmp(S,T,P,PR)
% SW_PTMP Potential temperature
%===========================================================================
% SW_PTMP $Revision: 1.3 $ $Date: 1994/10/10 05:45:13 $
% Copyright (C) CSIRO, Phil Morgan 1992.
%
% USAGE: ptmp = sw_ptmp(S,T,P,PR)
%
% DESCRIPTION:
% Calculates potential temperature as per UNESCO 1983 report.
%
% INPUT: (all must have same dimensions)
% S = salinity [psu (PSS-78) ]
% T = temperature [degree C (IPTS-68)]
% P = pressure [db]
% PR = Reference pressure [db]
% (P & PR may have dims 1x1, mx1, 1xn or mxn for S(mxn) )
%
% OUTPUT:
% ptmp = Potential temperature relative to PR [degree C (IPTS-68)]
%
% AUTHOR: Phil Morgan 92-04-06 (morgan@ml.csiro.au)
%
% DISCLAIMER:
% This software is provided "as is" without warranty of any kind.
% See the file sw_copy.m for conditions of use and licence.
%
% REFERENCES:
% Fofonoff, P. and Millard, R.C. Jr
% Unesco 1983. Algorithms for computation of fundamental properties of
% seawater, 1983. _Unesco Tech. Pap. in Mar. Sci._, No. 44, 53 pp.
% Eqn.(31) p.39
%
% Bryden, H. 1973.
% "New Polynomials for thermal expansion, adiabatic temperature gradient
% and potential temperature of sea water."
% DEEP-SEA RES., 1973, Vol20,401-408.
%=========================================================================
% CALLER: general purpose
% CALLEE: sw_adtg.m
%-------------
% CHECK INPUTS
%-------------
if nargin ~= 4
error('sw_ptmp.m: Must pass 4 parameters ')
end %if
% CHECK S,T,P dimensions and verify consistent
[ms,ns] = size(S);
[mt,nt] = size(T);
[mp,np] = size(P);
[mpr,npr] = size(PR);
% CHECK THAT S & T HAVE SAME SHAPE
if (ms~=mt) | (ns~=nt)
error('check_stp: S & T must have same dimensions')
end %if
% CHECK OPTIONAL SHAPES FOR P
if mp==1 & np==1 % P is a scalar. Fill to size of S
P = P(1)*ones(ms,ns);
elseif np==ns & mp==1 % P is row vector with same cols as S
P = P( ones(1,ms), : ); % Copy down each column.
elseif mp==ms & np==1 % P is column vector
P = P( :, ones(1,ns) ); % Copy across each row
elseif mp==ms & np==ns % PR is a matrix size(S)
% shape ok
else
error('check_stp: P has wrong dimensions')
end %if
[mp,np] = size(P);
% CHECK OPTIONAL SHAPES FOR PR
if mpr==1 & npr==1 % PR is a scalar. Fill to size of S
PR = PR(1)*ones(ms,ns);
elseif npr==ns & mpr==1 % PR is row vector with same cols as S
PR = PR( ones(1,ms), : ); % Copy down each column.
elseif mpr==ms & npr==1 % P is column vector
PR = PR( :, ones(1,ns) ); % Copy across each row
elseif mpr==ms & npr==ns % PR is a matrix size(S)
% shape ok
else
error('check_stp: PR has wrong dimensions')
end %if
[mpr,npr] = size(PR);
% IF ALL ROW VECTORS ARE PASSED THEN LET US PRESERVE SHAPE ON RETURN.
Transpose = 0;
if mp == 1 % row vector
P = P(:);
T = T(:);
S = S(:);
PR = PR(:);
Transpose = 1;
end %if
%***check_stp
%------
% BEGIN
%------
% theta1
del_P = PR - P;
del_th = del_P.*sw_adtg(S,T,P);
th = T + 0.5*del_th;
q = del_th;
% theta2
del_th = del_P.*sw_adtg(S,th,P+0.5*del_P);
th = th + (1 - 1/sqrt(2))*(del_th - q);
q = (2-sqrt(2))*del_th + (-2+3/sqrt(2))*q;
% theta3
del_th = del_P.*sw_adtg(S,th,P+0.5*del_P);
th = th + (1 + 1/sqrt(2))*(del_th - q);
q = (2 + sqrt(2))*del_th + (-2-3/sqrt(2))*q;
% theta4
del_th = del_P.*sw_adtg(S,th,P+del_P);
PT = th + (del_th - 2*q)/6;
if Transpose
PT = PT';
end %if
return
%=========================================================================
function dS = sw_salds(Rtx,delT)
% SW_SALDS Differiential dS/d(sqrt(Rt)) at constant T.
%=========================================================================
% SW_SALDS $Revision: 1.3 $ $Date: 1994/10/10 05:46:08 $
% Copyright (C) CSIRO, Phil Morgan 1993.
%
% USAGE: dS = sw_salds(Rtx,delT)
%
% DESCRIPTION:
% Calculates Salinity differential dS/d(sqrt(Rt)) at constant T.
% UNESCO 1983 polynomial.
%
% INPUT: (all must have same dimensions)
% Rtx = sqrt(Rt) where Rt defined in sw_salt.m
% delT = T-15 [degree C (IPTS-68)]
%
% OUTPUT:
% dS = S differential dS/d(sqrt(Rt)) at constant T.
%
% AUTHOR: Phil Morgan 93-04-21 (morgan@ml.csiro.au)
%
% DISCLAIMER:
% This software is provided "as is" without warranty of any kind.
% See the file sw_copy.m for conditions of use and licence.
%
% REFERENCES:
% Fofonoff, P. and Millard, R.C. Jr
% Unesco 1983. Algorithms for computation of fundamental properties of
% seawater, 1983. _Unesco Tech. Pap. in Mar. Sci._, No. 44, 53 pp.
%=========================================================================
% CALLER: sw_cndr.m
% CALLEE: none
%-------------
% CHECK INPUTS
%-------------
if nargin~=2
error('sw_salds.m: must have 2 input arguments')
end %if
[m1,n1] = size(Rtx);
[m2,n2] = size(delT);
if ~(m1==m2 | n1==n2)
error('sw_salds.m: Rtx and delT must have the same shape')
end %if
%-------
% BEGIN
%-------
a0 = 0.0080;
a1 = -0.1692;
a2 = 25.3851;
a3 = 14.0941;
a4 = -7.0261;
a5 = 2.7081;
b0 = 0.0005;
b1 = -0.0056;
b2 = -0.0066;
b3 = -0.0375;
b4 = 0.0636;
b5 = -0.0144;
k = 0.0162;
dS = a1 + (2*a2 + (3*a3 + (4*a4 + 5*a5.*Rtx).*Rtx).*Rtx).*Rtx + ...
(delT./(1+k*delT))* ...
(b1 + (2*b2 + (3*b3 + (4*b4 + 5*b5.*Rtx).*Rtx).*Rtx).*Rtx);
return
%-----------------------------------------------------------------------
function Rp = sw_salrp(R,T,P)
% SW_SALRP Conductivity ratio Rp(S,T,P) = C(S,T,P)/C(S,T,0)
%=========================================================================
% SW_SALRP $Revision: 1.3 $ $Date: 1994/10/10 05:47:27 $
% Copyright (C) CSIRO, Phil Morgan 1993.
%
% USAGE: Rp = sw_salrp(R,T,P)
%
% DESCRIPTION:
% Equation Rp(S,T,P) = C(S,T,P)/C(S,T,0) used in calculating salinity.
% UNESCO 1983 polynomial.
%
% INPUT: (All must have same shape)
% R = Conductivity ratio R = C(S,T,P)/C(35,15,0) [no units]
% T = temperature [degree C (IPTS-68)]
% P = pressure [db]
%
% OUTPUT:
% Rp = conductivity ratio Rp(S,T,P) = C(S,T,P)/C(S,T,0) [no units]
%
% AUTHOR: Phil Morgan 93-04-17 (morgan@ml.csiro.au)
%
% DISCLAIMER:
% This software is provided "as is" without warranty of any kind.
% See the file sw_copy.m for conditions of use and licence.
%
% REFERENCES:
% Fofonoff, P. and Millard, R.C. Jr
% Unesco 1983. Algorithms for computation of fundamental properties of
% seawater, 1983. _Unesco Tech. Pap. in Mar. Sci._, No. 44, 53 pp.
%=========================================================================
% CALLER: sw_salt
% CALLEE: none
%-------------------
% CHECK INPUTS
%-------------------
if nargin~=3
error('sw_salrp.m: requires 3 input arguments')
end %if
[mr,nr] = size(R);
[mp,np] = size(P);
[mt,nt] = size(T);
if ~(mr==mp | mr==mt | nr==np | nr==nt)
error('sw_salrp.m: R,T,P must all have the same shape')
end %if
%-------------------
% eqn (4) p.8 unesco.
%-------------------
d1 = 3.426e-2;
d2 = 4.464e-4;
d3 = 4.215e-1;
d4 = -3.107e-3;
e1 = 2.070e-5;
e2 = -6.370e-10;
e3 = 3.989e-15;
Rp = 1 + ( P.*(e1 + e2.*P + e3.*P.^2) ) ...
./ (1 + d1.*T + d2.*T.^2 +(d3 + d4.*T).*R);
return
%-----------------------------------------------------------------------
function rt = sw_salrt(T)
% SW_SALRT Conductivity ratio rt(T) = C(35,T,0)/C(35,15,0)
%=========================================================================
% SW_SALRT $Revision: 1.3 $ $Date: 1994/10/10 05:48:34 $
% Copyright (C) CSIRO, Phil Morgan 1993.
%
% USAGE: rt = sw_salrt(T)
%
% DESCRIPTION:
% Equation rt(T) = C(35,T,0)/C(35,15,0) used in calculating salinity.
% UNESCO 1983 polynomial.
%
% INPUT:
% T = temperature [degree C (IPTS-68)]
%
% OUTPUT:
% rt = conductivity ratio [no units]
%
% AUTHOR: Phil Morgan 93-04-17 (morgan@ml.csiro.au)
%
% DISCLAIMER:
% This software is provided "as is" without warranty of any kind.
% See the file sw_copy.m for conditions of use and licence.
%
% REFERENCES:
% Fofonoff, P. and Millard, R.C. Jr
% Unesco 1983. Algorithms for computation of fundamental properties of
% seawater, 1983. _Unesco Tech. Pap. in Mar. Sci._, No. 44, 53 pp.
%=========================================================================
% CALLER: sw_salt
% CALLEE: none
% rt = rt(T) = C(35,T,0)/C(35,15,0)
% Eqn (3) p.7 Unesco.
c0 = 0.6766097;
c1 = 2.00564e-2;
c2 = 1.104259e-4;
c3 = -6.9698e-7;
% c4 = 1.0031e-9;
c4 = 1.e-9;
rt = c0 + (c1 + (c2 + (c3 + c4.*T).*T).*T).*T;
return
%--------------------------------------------------------------------
function S = sw_sals(Rt,T)
% SW_SALS Salinity of sea water
%=========================================================================
% SW_SALS $Revision: 1.3 $ $Date: 1994/10/10 05:49:13 $
% Copyright (C) CSIRO, Phil Morgan 1993.
%
% USAGE: S = sw_sals(Rt,T)
%
% DESCRIPTION:
% Salinity of sea water as a function of Rt and T.
% UNESCO 1983 polynomial.
%
% INPUT:
% Rt = Rt(S,T) = C(S,T,0)/C(35,T,0)
% T = temperature [degree C (IPTS-68)]
%
% OUTPUT:
% S = salinity [psu (PSS-78)]
%
% AUTHOR: Phil Morgan 93-04-17 (morgan@ml.csiro.au)
%
% DISCLAIMER:
% This software is provided "as is" without warranty of any kind.
% See the file sw_copy.m for conditions of use and licence.
%
% REFERENCES:
% Fofonoff, P. and Millard, R.C. Jr
% Unesco 1983. Algorithms for computation of fundamental properties of
% seawater, 1983. _Unesco Tech. Pap. in Mar. Sci._, No. 44, 53 pp.
%=========================================================================
% CALLER: sw_salt
% CALLEE: none
%--------------------------
% CHECK INPUTS
%--------------------------
if nargin~=2
error('sw_sals.m: requires 2 input arguments')
end %if
[mrt,nrt] = size(Rt);
[mT,nT] = size(T);
if ~(mrt==mT | nrt==nT)
error('sw_sals.m: Rt and T must have the same shape')
end %if
%--------------------------
% eqn (1) & (2) p6,7 unesco
%--------------------------
a0 = 0.0080;
a1 = -0.1692;
a2 = 25.3851;
a3 = 14.0941;
a4 = -7.0261;
a5 = 2.7081;
b0 = 0.0005;
b1 = -0.0056;
b2 = -0.0066;
b3 = -0.0375;
b4 = 0.0636;
b5 = -0.0144;
k = 0.0162;
Rtx = sqrt(Rt);
del_T = T - 15;
del_S = (del_T ./ (1+k*del_T) ) .* ...
( b0 + (b1 + (b2+ (b3 + (b4 + b5.*Rtx).*Rtx).*Rtx).*Rtx).*Rtx);
S = a0 + (a1 + (a2 + (a3 + (a4 + a5.*Rtx).*Rtx).*Rtx).*Rtx).*Rtx;
S = S + del_S;
return
%----------------------------------------------------------------------
function S = sw_salt(cndr,T,P)
% SW_SALT Salinity from cndr, T, P
%=========================================================================
% SW_SALT $Revision: 1.3 $ $Date: 1994/10/10 05:49:53 $
% Copyright (C) CSIRO, Phil Morgan 1993.
%
% USAGE: S = sw_salt(cndr,T,P)
%
% DESCRIPTION:
% Calculates Salinity from conductivity ratio. UNESCO 1983 polynomial.
%
% INPUT:
% cndr = Conductivity ratio R = C(S,T,P)/C(35,15,0) [no units]
% T = temperature [degree C (IPTS-68)]
% P = pressure [db]
%
% OUTPUT:
% S = salinity [psu (PSS-78)]
%
% AUTHOR: Phil Morgan 93-04-17 (morgan@ml.csiro.au)
%
% DISCLAIMER:
% This software is provided "as is" without warranty of any kind.
% See the file sw_copy.m for conditions of use and licence.
%
% REFERENCES:
% Fofonoff, P. and Millard, R.C. Jr
% Unesco 1983. Algorithms for computation of fundamental properties of
% seawater, 1983. _Unesco Tech. Pap. in Mar. Sci._, No. 44, 53 pp.
%=========================================================================
% CALLER: general purpose
% CALLEE: sw_sals.m sw_salrt.m sw_salrp.m
%----------------------------------
% CHECK INPUTS ARE SAME DIMENSIONS
%----------------------------------
[mc,nc] = size(cndr);
[mt,nt] = size(T);
[mp,np] = size(P);
if ~(mc==mt | mc==mp | nc==nt | nc==np)
error('sw_salt.m: cndr,T,P must all have the same dimensions')
end %if
%-------
% BEGIN
%-------
R = cndr;
rt = sw_salrt(T);
Rp = sw_salrp(R,T,P);
Rt = R./(Rp.*rt);
S = sw_sals(Rt,T);
return
%--------------------------------------------------------------------
%$$$
%$$$ #undef __PR
%$$$ #include "VARIANT.h"
function c = sw_satAr(S,T)
% SW_SATAr Satuaration of Ar in sea water
%=========================================================================
% sw_satAr $Revision: 1.1 $ $Date: 1998/04/22 02:15:56 $
% Copyright (C) CSIRO, Phil Morgan 1998.
%
% USAGE: satAr = sw_satAr(S,T,P)
%
% DESCRIPTION:
% Solubility (satuaration) of Argon (Ar) in sea water
%
% INPUT: (all must have same dimensions)
% S = salinity [psu (PSS-78)]
% T = temperature [degree C (IPTS-68)]
%
% OUTPUT:
% satAr = solubility of Ar [ml/l]
%
% AUTHOR: Phil Morgan 97-11-05 (morgan@ml.csiro.au)
%
%$$$ #include "disclaimer_in_code.inc"
%
% REFERENCES:
% Weiss, R. F. 1970
% "The solubility of nitrogen, oxygen and argon in water and seawater."
% Deap-Sea Research., 1970, Vol 17, pp721-735.
%=========================================================================
% CALLER: general purpose
% CALLEE:
%$$$ #ifdef VARIANT_PRIVATE
%$$$ %***********************************************************
%$$$ %$Id: sw_satAr.M,v 1.1 1998/04/22 02:15:56 morgan Exp $
%$$$ %
%$$$ %$Log: sw_satAr.M,v $
%$$$ %
%$$$ %***********************************************************
%$$$ #endif
%----------------------
% CHECK INPUT ARGUMENTS
%----------------------
if nargin ~=2
error('sw_satAr.m: Must pass 2 parameters')
end %if
% CHECK S,T dimensions and verify consistent
[ms,ns] = size(S);
[mt,nt] = size(T);
% CHECK THAT S & T HAVE SAME SHAPE
if (ms~=mt) | (ns~=nt)
error('sw_satAr: S & T must have same dimensions')
end %if
% IF ALL ROW VECTORS ARE PASSED THEN LET US PRESERVE SHAPE ON RETURN.
Transpose = 0;
if ms == 1 % row vector
T = T(:);
S = S(:);
Transpose = 1;
end %if
%------
% BEGIN
%------
% convert T to Kelvin
T = 273.15 + T;
% constants for Eqn (4) of Weiss 1970
a1 = -173.5146;
a2 = 245.4510;
a3 = 141.8222;
a4 = -21.8020;
b1 = -0.034474;
b2 = 0.014934;
b3 = -0.0017729;
% Eqn (4) of Weiss 1970
lnC = a1 + a2.*(100./T) + a3.*log(T./100) + a4.*(T./100) + ...
S.*( b1 + b2.*(T./100) + b3.*((T./100).^2) );
c = exp(lnC);
return
%$$$
%$$$ #undef __PR
%$$$ #include "VARIANT.h"
function c = sw_satN2(S,T)
% SW_SATN2 Satuaration of N2 in sea water
%=========================================================================
% sw_satN2 $Revision: 1.1 $ $Date: 1998/04/22 02:15:56 $
% Copyright (C) CSIRO, Phil Morgan 1998.
%
% USAGE: satN2 = sw_satN2(S,T,P)
%
% DESCRIPTION:
% Solubility (satuaration) of Nitrogen (N2) in sea water
%
% INPUT: (all must have same dimensions)
% S = salinity [psu (PSS-78)]
% T = temperature [degree C (IPTS-68)]
%
% OUTPUT:
% satN2 = solubility of N2 [ml/l]
%
% AUTHOR: Phil Morgan 97-11-05 (morgan@ml.csiro.au)
%
%$$$ #include "disclaimer_in_code.inc"
%
% REFERENCES:
% Weiss, R. F. 1970
% "The solubility of nitrogen, oxygen and argon in water and seawater."
% Deap-Sea Research., 1970, Vol 17, pp721-735.
%=========================================================================
% CALLER: general purpose
% CALLEE:
%$$$ #ifdef VARIANT_PRIVATE
%$$$ %***********************************************************
%$$$ %$Id: sw_satN2.M,v 1.1 1998/04/22 02:15:56 morgan Exp $
%$$$ %
%$$$ %$Log: sw_satN2.M,v $
%$$$ %
%$$$ %***********************************************************
%$$$ #endif
%----------------------
% CHECK INPUT ARGUMENTS
%----------------------
if nargin ~=2
error('sw_satN2.m: Must pass 2 parameters')
end %if
% CHECK S,T dimensions and verify consistent
[ms,ns] = size(S);
[mt,nt] = size(T);
% CHECK THAT S & T HAVE SAME SHAPE
if (ms~=mt) | (ns~=nt)
error('sw_satN2: S & T must have same dimensions')
end %if
% IF ALL ROW VECTORS ARE PASSED THEN LET US PRESERVE SHAPE ON RETURN.
Transpose = 0;
if ms == 1 % row vector
T = T(:);
S = S(:);
Transpose = 1;
end %if
%------
% BEGIN
%------
% convert T to Kelvin
T = 273.15 + T;
% constants for Eqn (4) of Weiss 1970
a1 = -172.4965;
a2 = 248.4262;
a3 = 143.0738;
a4 = -21.7120;
b1 = -0.049781;
b2 = 0.025018;
b3 = -0.0034861;
% Eqn (4) of Weiss 1970
lnC = a1 + a2.*(100./T) + a3.*log(T./100) + a4.*(T./100) + ...
S.*( b1 + b2.*(T./100) + b3.*((T./100).^2) );
c = exp(lnC);
return
%$$$
%$$$ #undef __PR
%$$$ #include "VARIANT.h"
function c = sw_satO2(S,T)
% SW_SATO2 Satuaration of O2 in sea water
%=========================================================================
% sw_satO2 $Revision: 1.1 $ $Date: 1998/04/22 02:15:56 $
% Copyright (C) CSIRO, Phil Morgan 1998.
%
% USAGE: satO2 = sw_satO2(S,T,P)
%
% DESCRIPTION:
% Solubility (satuaration) of Oxygen (O2) in sea water
%
% INPUT: (all must have same dimensions)
% S = salinity [psu (PSS-78)]
% T = temperature [degree C (IPTS-68)]
%
% OUTPUT:
% satO2 = solubility of O2 [ml/l]
%
% AUTHOR: Phil Morgan 97-11-05 (morgan@ml.csiro.au)
%
%$$$ #include "disclaimer_in_code.inc"
%
% REFERENCES:
% Weiss, R. F. 1970
% "The solubility of nitrogen, oxygen and argon in water and seawater."
% Deap-Sea Research., 1970, Vol 17, pp721-735.
%=========================================================================
% CALLER: general purpose
% CALLEE:
%$$$ #ifdef VARIANT_PRIVATE
%$$$ %***********************************************************
%$$$ %$Id: sw_satO2.M,v 1.1 1998/04/22 02:15:56 morgan Exp $
%$$$ %
%$$$ %$Log: sw_satO2.M,v $
%$$$ %
%$$$ %***********************************************************
%$$$ #endif
%----------------------
% CHECK INPUT ARGUMENTS
%----------------------
if nargin ~=2
error('sw_satO2.m: Must pass 2 parameters')
end %if
% CHECK S,T dimensions and verify consistent
[ms,ns] = size(S);
[mt,nt] = size(T);
% CHECK THAT S & T HAVE SAME SHAPE
if (ms~=mt) | (ns~=nt)
error('sw_satO2: S & T must have same dimensions')
end %if
% IF ALL ROW VECTORS ARE PASSED THEN LET US PRESERVE SHAPE ON RETURN.
Transpose = 0;
if ms == 1 % row vector
T = T(:);
S = S(:);
Transpose = 1;
end %if
%------
% BEGIN
%------
% convert T to Kelvin
T = 273.15 + T;
% constants for Eqn (4) of Weiss 1970
a1 = -173.4292;
a2 = 249.6339;
a3 = 143.3483;
a4 = -21.8492;
b1 = -0.033096;
b2 = 0.014259;
b3 = -0.0017000;
% Eqn (4) of Weiss 1970
lnC = a1 + a2.*(100./T) + a3.*log(T./100) + a4.*(T./100) + ...
S.*( b1 + b2.*(T./100) + b3.*((T./100).^2) );
c = exp(lnC);
return
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment