| 1 | gebbie | 1.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 |  |  |  |