| 1 |
function [mld,rho] = mldepth(T,S,depth,epsilon) |
| 2 |
%function [mld,rho] = mldepth(T,S,depth,epsilon) |
| 3 |
% |
| 4 |
% Solve for mixed layer depth on a 1-meter resolution grid. |
| 5 |
% |
| 6 |
% Handles input temperature and salinity of any dimension, i.e. 2-D, 3-D, |
| 7 |
% 4-D, with time and space in any order. |
| 8 |
% |
| 9 |
% Returns mixed layer depth in same dimension as T,S, except without |
| 10 |
% the vertical dimension. |
| 11 |
% |
| 12 |
% depth = depths on which theta and S are defined. |
| 13 |
% epsilon = threshold for density difference, surface to mixld. |
| 14 |
% |
| 15 |
% Method: Solve for potential density with the surface reference pressure. |
| 16 |
% Interpolate density onto a 1-meter resolution grid. |
| 17 |
% Search for the depth where surface density differs by some |
| 18 |
% threshold. This depth is the mixed layer depth. |
| 19 |
% |
| 20 |
% G. Gebbie, MIT-WHOI, August 22, 2001. on board the R/V Oceanus. |
| 21 |
% |
| 22 |
% Vectorized for Matlab, November 2003. GG. MIT-WHOI. |
| 23 |
% |
| 24 |
% required: seawater toolbox. WARNING: SEAWATER TOOLBOX SYNTAX |
| 25 |
% MAY HAVE CHANGED. |
| 26 |
|
| 27 |
mldlimit = 500 ;% a priori maximum limit of mixed layer depth |
| 28 |
|
| 29 |
S( S == 0) = NaN; |
| 30 |
T( T == 0) = NaN; |
| 31 |
|
| 32 |
% mldlimit is the limit of mixed layer depth here. |
| 33 |
grrid = (2*depth(1)):1:mldlimit; |
| 34 |
|
| 35 |
% Set reference pressure to zero. Should not make a difference if mixld < 500. |
| 36 |
pr =0; |
| 37 |
|
| 38 |
%% The vertical direction is special. Its dimension is specified by "depth". |
| 39 |
nz = length(depth); |
| 40 |
|
| 41 |
nn = size(T); |
| 42 |
|
| 43 |
%% Find vertical dimension. |
| 44 |
zindex = find(nn==nz); |
| 45 |
|
| 46 |
oindex = 1:ndims(T); |
| 47 |
oindex(oindex==zindex)=[]; |
| 48 |
nx = prod(nn(oindex)); |
| 49 |
|
| 50 |
%% Put the vertical direction at the end. Squeeze the rest. |
| 51 |
temp = permute(T,[oindex zindex]); |
| 52 |
temp = reshape(temp,nx,nz); |
| 53 |
% temp (temp==0) = nan; |
| 54 |
|
| 55 |
salt = permute(S,[1 2 4 3]); |
| 56 |
salt = reshape(salt,nx,nz); |
| 57 |
% salt (salt==0) = nan; |
| 58 |
|
| 59 |
pden = sw_pden(salt,temp,depth,pr); |
| 60 |
|
| 61 |
if nargout ==2 |
| 62 |
rho = reshape(pden,[nn(oindex) nz]) ; |
| 63 |
rho = permute(rho,[1 2 4 3]); |
| 64 |
end |
| 65 |
|
| 66 |
temphi = interp1( depth', pden', grrid); |
| 67 |
differ = cumsum(diff(temphi)); |
| 68 |
|
| 69 |
%% preallocate memory. |
| 70 |
mld = zeros(nx,1); |
| 71 |
|
| 72 |
% how would one vectorize this section? |
| 73 |
for i = 1:nx |
| 74 |
index =find(differ(:,i)> epsilon); |
| 75 |
if( isempty ( index) ==1) |
| 76 |
tmpmld = NaN; |
| 77 |
else |
| 78 |
tmpmld = grrid( index(1)); |
| 79 |
end |
| 80 |
mld(i) = tmpmld; |
| 81 |
end |
| 82 |
|
| 83 |
% Make the user happy. Return mixed layer depth in the same form as the |
| 84 |
% input T,S, except vertical dimension is gone. |
| 85 |
|
| 86 |
mld = reshape(mld,[nn(oindex) 1]); |
| 87 |
mld = squeeze(mld); |
| 88 |
|
| 89 |
mld(isnan(mld)) = 0; |
| 90 |
|
| 91 |
return |
| 92 |
|
| 93 |
|
| 94 |
|
| 95 |
|
| 96 |
|
| 97 |
|