/[MITgcm]/MITgcm_contrib/gmaze_pv/subfct_getvol.m
ViewVC logotype

Annotation of /MITgcm_contrib/gmaze_pv/subfct_getvol.m

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (hide annotations) (download)
Thu Jun 15 15:20:34 2006 UTC (19 years, 1 month ago) by gmaze
Branch: MAIN
Initial check in

1 gmaze 1.1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2     % Master function:
3    
4     function varargout = subfct_getvol(CHP,Z,Y,X,LIMITS)
5    
6     % Limits:
7     %disp(strcat('Limits: ',num2str(LIMITS)));
8     O = LIMITS(1);
9     MZ = LIMITS(2);
10     MY = sort( LIMITS(3:4) );
11     MX = sort( LIMITS(5:6) );
12    
13     % Compute the volume:
14     [V Vmat dV] = getvol(Z,Y,X,O,MZ,MY,MX,CHP);
15    
16     % Outputs:
17     switch nargout
18     case 1
19     varargout(1) = {V};
20     case 2
21     varargout(1) = {V};
22     varargout(2) = {Vmat};
23     case 3
24     varargout(1) = {V};
25     varargout(2) = {Vmat};
26     varargout(3) = {dV};
27     end %switch nargout
28    
29    
30     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
31     % This function computes the volume limited southward by
32     % MY(1), northward by iso-O (or MY(2) if iso-O reaches it),
33     % eastward by MX(1), westward by MX(2) and downward by iso-O
34     % (or MZ if iso-O reaches it).
35     function varargout = getvol(Z,Y,X,O,MZ,MY,MX,CHP)
36    
37     %% Dim:
38     nz = length(Z);
39     ny = length(Y);
40     nx = length(X);
41     %disp(num2str([nz ny nx]));
42     %% Indices:
43     izmax = min( find( Z>=MZ ) );
44     iymin = min( find( Y>=MY(1) ) );
45     iymax = min( find( Y>=MY(2) ) );
46     ixmin = min( find( X>=MX(1) ) );
47     ixmax = min( find( X>=MX(2) ) );
48     %disp(num2str([1 izmax iymin iymax ixmin ixmax]));
49    
50     %% 1- determine the 3D matrix of volume elements defined by
51     % the grid:
52     dV = getdV(Z,Y,X);
53    
54     %% 2- compute the 3D volume matrix where 1 means dV must be
55     % counted and 0 must not:
56    
57     V = ones(nz,ny,nx); % initialy keep all points
58    
59     % Exclude northward iso-O limits:
60     % NB: here the test depends on the meridional gradient of CHP
61     % if CHP increase (resp. decreases) with LAT then we must
62     % keep lower (resp. higher) values than O limit
63     % a: determine test type:
64     N = iymax - iymin + 1; % Number of Y points in the domain
65     CHPsouth = nanmean(nanmean(squeeze(CHP(1,iymin:iymin+fix(N/2),ixmin:ixmax))));
66     CHPnorth = nanmean(nanmean(squeeze(CHP(1,iymin+fix(N/2):iymax,ixmin:ixmax))));
67     SNgrad = (CHPnorth - CHPsouth)./abs(CHPnorth - CHPsouth);
68     %disp(strcat('Northward gradient sign is:',num2str(SNgrad)));
69     switch SNgrad
70     case 1, testype = 'le'; % Less than or equal
71     case -1, testype = 'ge'; % Greater than or equal
72     end %switch
73     % b: exclude points
74     for iz=1:izmax
75     chpZ = squeeze(CHP(iz,:,:));
76     V(iz,:,:)=double(feval(testype,chpZ,O));
77     end %for iz
78    
79     % Exclude southward limit:
80     V(:,1:iymin,:) = zeros(nz,iymin,nx);
81    
82     % Exclude northward limit:
83     V(:,iymax:ny,:) = zeros(nz,(ny-iymax)+1,nx);
84    
85     % Exclude westward limit:
86     V(:,:,1:ixmin) = zeros(nz,ny,ixmin);
87    
88     % Exclude eastward limit:
89     V(:,:,ixmax:nx) = zeros(nz,ny,(nx-ixmax)+1);
90    
91     % Exclude downward limit:
92     V(izmax:nz,:,:) = zeros((nz-izmax)+1,ny,nx);
93    
94    
95     %% 3- Then compute the volume by summing dV elements
96     % for non 0 V points
97     Vkeep = V.*dV;
98     Vkeep = sum(sum(sum(Vkeep)));
99    
100     %% 4- Outputs:
101     switch nargout
102     case 1
103     varargout(1) = {Vkeep}; % Volume single value
104     case 2
105     varargout(1) = {Vkeep};
106     varargout(2) = {V}; % Logical V matrix with included/excluded points
107     case 3
108     varargout(1) = {Vkeep};
109     varargout(2) = {V};
110     varargout(3) = {dV}; % Volume elements matrix
111     end %switch nargout
112    
113    
114    
115     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
116     % This function computes the 3D dV volume elements.
117     function dv = getdV(Z,Y,X);
118    
119     nz = length(Z);
120     ny = length(Y);
121     nx = length(X);
122    
123     %%% Compute the DY:
124     % Assuming Y is independant of ix:
125     d = m_lldist([1 1]*X(1),Y);
126     dy = [d(1)/2 (d(2:length(d))+d(1:length(d)-1))/2 d(length(d))/2];
127     dy = meshgrid(dy,X)';
128    
129     %%% Compute the DX:
130     clear d
131     for iy = 1 : ny
132     d(:,iy) = m_lldist(X,Y([iy iy]));
133     end
134     dx = [d(1,:)/2 ; ( d(2:size(d,1),:) + d(1:size(d,1)-1,:) )./2 ; d(size(d,1),:)/2];
135     dx = dx';
136    
137     %% Compute the horizontal DS surface element:
138     ds = dx.*dy;
139    
140     %% Compute the DZ:
141     d = diff(Z);
142     dz = [d(1)/2 ( d(2:length(d)) + d(1:length(d)-1) )./2 d(length(d))/2];
143    
144     %% Then compute the DV volume elements:
145     dv = ones(nz,ny,nx)*NaN;
146     for iz=1:nz
147     dv(iz,:,:) = dz(iz).*ds;
148     end
149    

  ViewVC Help
Powered by ViewVC 1.1.22