1 |
gforget |
1.1 |
function [FLD]=calc_MeridinalTransport(fldU,fldV,LATS_MASKS,varargin); |
2 |
|
|
|
3 |
|
|
global mygrid; |
4 |
|
|
|
5 |
|
|
if nargin==4; doScaleWithArea=varargin{1}; else; doScaleWithArea=0; end; |
6 |
|
|
|
7 |
|
|
%initialize output: |
8 |
|
|
n3=max(size(fldU.f1,3),1); n4=max(size(fldV.f1,4),1); |
9 |
|
|
FLD=NaN*squeeze(zeros(length(LATS_MASKS),n4)); |
10 |
|
|
|
11 |
|
|
%prepare fldU/fldV: |
12 |
|
|
fldU(isnan(fldU))=0; fldV(isnan(fldV))=0; |
13 |
|
|
|
14 |
|
|
if doScaleWithArea; |
15 |
|
|
dxg=mk3D(mygrid.DXG,fldU); dyg=mk3D(mygrid.DYG,fldU); drf=mk3D(mygrid.DRF,fldU); |
16 |
|
|
for k4=1:n4; |
17 |
|
|
fldU(:,:,:,k4)=fldU(:,:,:,k4).*dyg.*drf.*mygrid.hFacW; |
18 |
|
|
fldV(:,:,:,k4)=fldV(:,:,:,k4).*dxg.*drf.*mygrid.hFacS; |
19 |
|
|
end; |
20 |
|
|
end; |
21 |
|
|
|
22 |
|
|
%use array format to speed up computation below: |
23 |
|
|
fldU=convert2array(fldU); fldV=convert2array(fldV); |
24 |
|
|
n1=size(fldU,1); n2=size(fldU,2); |
25 |
|
|
fldU=reshape(fldU,n1*n2,n3*n4); fldV=reshape(fldV,n1*n2,n3*n4); |
26 |
|
|
|
27 |
|
|
for iy=1:length(LATS_MASKS); |
28 |
|
|
|
29 |
|
|
%get list ofpoints that form a zonal band: |
30 |
|
|
mmu=convert2array(LATS_MASKS(iy).mmu); |
31 |
|
|
nnu=find(~isnan(mmu)); mmu=mmu(nnu)*ones(1,n3*n4); |
32 |
|
|
mmv=convert2array(LATS_MASKS(iy).mmv); |
33 |
|
|
nnv=find(~isnan(mmv)); mmv=mmv(nnv)*ones(1,n3*n4); |
34 |
|
|
|
35 |
|
|
%do the area weighed average along this band: |
36 |
|
|
tmpu=sum(fldU(nnu,:).*mmu,1); |
37 |
|
|
tmpv=sum(fldV(nnv,:).*mmv,1); |
38 |
|
|
|
39 |
|
|
%store: |
40 |
|
|
FLD(iy,:)=reshape(sum(tmpu+tmpv,2),[1 n4]); |
41 |
|
|
|
42 |
|
|
end; |
43 |
|
|
|
44 |
|
|
|