1 |
function [Psi] = overturning(GRID,v,varargin); |
2 |
%psi=overturning(GRID,v); |
3 |
%psi=overturning(GRID,v,mask); |
4 |
% |
5 |
%Calculates the volume overturning stream function (m^3/s). |
6 |
%e.g. |
7 |
% >> GRID=loadgrid; |
8 |
% >> STATE=loadstate; |
9 |
% >> psi=overturning(GRID,STATE.V,GRID.matl); |
10 |
% >> contourf(GRID.yg(1,:),GRID.rf,psi'/1e6);colorbar |
11 |
% |
12 |
%Written by adcroft@mit.edu, 2002 |
13 |
%$Header: |
14 |
|
15 |
if nargin==3 |
16 |
mapmsk=varargin{:}; |
17 |
elseif nargin==2 |
18 |
mapmsk=max( GRID.mskc(:,:,1), GRID.mskc(:,:,end) ); |
19 |
else |
20 |
error('Wrong number of arguments') |
21 |
end |
22 |
mapmsk=mapmsk.*mapmsk(:,[1 1:end-1]); |
23 |
|
24 |
N=size(GRID.hfacs); |
25 |
nxy=prod(size(GRID.rac)); |
26 |
nr=prod(size(GRID.drf)); |
27 |
|
28 |
DRF=spdiags(GRID.drf',0,nr,nr); |
29 |
dz=reshape(GRID.hfacs,[nxy nr])*DRF; |
30 |
area=dz.*( (GRID.dxg(:).*mapmsk(:))*ones(1,nr) ); |
31 |
area=reshape(area, N); |
32 |
|
33 |
V=squeeze( sum(v.*area,1) ); |
34 |
|
35 |
Psi=zeros(N(2),nr+1); |
36 |
for k=nr:-1:1; |
37 |
Psi(:,k)=Psi(:,k+1)-V(:,k); |
38 |
end |
39 |
|
40 |
vmsk=squeeze( sum(GRID.hfacs.*area,1) ); |
41 |
vmsk( find(vmsk~=0) )=1; |
42 |
pmsk=vmsk(:,[1 1:end]).*vmsk(:,[1:end end]); |
43 |
|
44 |
pmsk( find(pmsk==0) )=NaN; |
45 |
Psi=Psi.*pmsk(:,[1 1:end-1]); |