/[MITgcm]/MITgcm_contrib/dfer/matlab_stuff/calcBolusVelCube.m
ViewVC logotype

Contents of /MITgcm_contrib/dfer/matlab_stuff/calcBolusVelCube.m

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


Revision 1.3 - (show annotations) (download)
Thu Apr 19 00:03:59 2018 UTC (7 years, 2 months ago) by dfer
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +0 -3 lines
Error occurred while calculating annotation data.
Some minor updates

1 function [ub,vb,wb]=calcBolusVelCube(d,g,GMform);
2
3 % [ub,vb] = calcBolusVelCube(d,g,GMform);
4 %
5 % Input arguments:
6 % The incoming field data (d) and grid data (g) must be in a structured
7 % array format (which is the format that comes from rdmnc):
8 % d [Field data] Kwx,Kwy
9 % g [Grid data ] drF,rA,dxC,dyC,dxG,dyG,HFacW,HFacS
10 % GMform [string] GM form, 'Skew' or 'Advc'
11 %
12 % Output arguments:
13 % ub, vb: GM-Bolus mass-weigthed velocity (i.e include
14 % implicitly hFac factor)
15 %
16 % Comments:
17 % For Skew-Flux form: uses Kwx & Kwy divided by 2
18 % compute Volume Stream function psiX,psiY above uVel.vVel
19 % (at interface between 2 levels), units=m^3/s :
20 % psiX=(rAc*kwx)_i / dXc ; psiY=(rAc*kwy)_j / dYc ;
21 % and then the bolus velocity (m/s):
22 % ub = d_k(psiX)/rAw/drF ; vb = d_k(psiY)/rAs/drF ;
23 %
24 %---------------------------------------------------------------------
25
26
27 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
28 % Prepare / reform incoming data %
29 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
30
31 nc = size(g.XC,2);
32 nr = length(g.drF);
33
34 switch GMform
35 case 'Skew'
36 nt = size(d.GM_Kwx,4);
37 case 'Advc'
38 nt = size(d.GM_PsiX,4);
39 end
40
41 dr = g.drF;
42 hw = reshape(g.HFacW(1:6*nc,1:nc,1:nr),[6*nc*nc,nr]);
43 hs = reshape(g.HFacS(1:6*nc,1:nc,1:nr),[6*nc*nc,nr]);
44 ra = reshape(g.rA(1:6*nc,1:nc) ,[6*nc*nc,1]);
45 rAs = reshape(g.rAs(1:6*nc,1:nc) ,[6*nc*nc,1]);
46 rAw = reshape(g.rAw(1:6*nc,1:nc) ,[6*nc*nc,1]);
47 dxc = reshape(g.dxC(1:6*nc,1:nc),[6*nc*nc,1]);
48 dyc = reshape(g.dyC(1:6*nc,1:nc),[6*nc*nc,1]);
49 dxg = reshape(g.dxG(1:6*nc,1:nc),[6*nc*nc,1]);
50 dyg = reshape(g.dyG(1:6*nc,1:nc),[6*nc*nc,1]);
51
52 %--- recip_hFac & mask :
53 mw=ceil(hw); mw=min(1,mw);
54 ms=ceil(hs); ms=min(1,ms);
55
56 hw(find(hw==0))=Inf;
57 hs(find(hs==0))=Inf;
58 hw_recip=1./hw; %hw_recip(find(hw==0))=0;
59 hs_recip=1./hs; %hs_recip(find(hs==0))=0;
60
61 ub_all = zeros(6*nc,nc,nr,nt);
62 vb_all = zeros(6*nc,nc,nr,nt);
63 wb_all = zeros(6*nc,nc,nr,nt);
64
65 switch GMform
66
67 %%%%%%% Skew-flux form case
68 case 'Skew'
69 kwx_all = reshape(d.GM_Kwx,[6*nc*nc,nr,nt]);
70 kwy_all = reshape(d.GM_Kwy,[6*nc*nc,nr,nt]);
71
72 kwx_all = 0.5*kwx_all;
73 kwy_all = 0.5*kwy_all;
74
75 for it = 1:nt
76 kwx = kwx_all(:,:,it);
77 kwy = kwy_all(:,:,it);
78
79 %-- K*ra + add 1 overlap :
80 kwx = (ra*ones(1,nr)).*kwx;
81 kwy = (ra*ones(1,nr)).*kwy;
82 kwx = reshape(kwx,[6*nc,nc,nr]);
83 kwy = reshape(kwy,[6*nc,nc,nr]);
84 v6X = split_C_cub(kwx,1);
85 v6Y = split_C_cub(kwy,1);
86 k6x = v6X(:,[2:nc+1],:,:);
87 k6y = v6Y([2:nc+1],:,:,:);
88
89 %-----------------
90 v6X = zeros(nc,nc,nr,6);
91 v6Y = zeros(nc,nc,nr,6);
92
93 v6X([1:nc],:,:,:) = k6x([2:nc+1],:,:,:) + k6x([1:nc],:,:,:);
94 v6Y(:,[1:nc],:,:) = k6y(:,[2:nc+1],:,:) + k6y(:,[1:nc],:,:);
95
96 v6X = v6X/2;
97 v6Y = v6Y/2;
98
99 psiX = zeros(6*nc,nc,nr+1);
100 psiY = zeros(6*nc,nc,nr+1);
101
102 for n = 1:6
103 is = 1+nc*(n-1);ie=nc*n;
104 psiX([is:ie],[1:nc],[1:nr]) = v6X([1:nc],[1:nc],[1:nr],n);
105 psiY([is:ie],[1:nc],[1:nr]) = v6Y([1:nc],[1:nc],[1:nr],n);
106 end
107
108 psiX = reshape(psiX,6*nc*nc,nr+1);
109 psiY = reshape(psiY,6*nc*nc,nr+1);
110
111 psiX(:,[1:nr]) = mw.*psiX(:,[1:nr]);
112 psiY(:,[1:nr]) = ms.*psiY(:,[1:nr]);
113 ub = psiX(:,[2:nr+1]) - psiX(:,[1:nr]);
114 vb = psiY(:,[2:nr+1]) - psiY(:,[1:nr]);
115
116 dr = reshape(dr,[1,length(dr)]);
117 % ub = reshape(hw_recip.*ub./(rAw*dr),[6*nc,nc,nr]);
118 ub = reshape(ub./(rAw*dr),[6*nc,nc,nr]);
119 % vb = reshape(hs_recip.*vb./(rAs*dr),[6*nc,nc,nr]);
120 vb = reshape(vb./(rAs*dr),[6*nc,nc,nr]);
121
122 ub_all(:,:,:,it) = ub;
123 vb_all(:,:,:,it) = vb;
124
125 %%%%%%%%%%%%%
126 [u6t,v6t] =split_UV_cub(ub,vb,0,1);
127 [hw6t,hs6t]=split_UV_cub(reshape(hw,6*nc,nc,nr),reshape(hs,6*nc,nc,nr),0,1);
128 [dy6t,dx6t]=split_UV_cub(reshape(dyg,6*nc,nc),reshape(dxg,6*nc,nc),0,1);
129
130 %F6tX = u6t.*hw6t.*permute(repmat(dy6t,[1 1 1 nr]),[1 2 4 3]);
131 %F6tY = v6t.*hs6t.*permute(repmat(dx6t,[1 1 1 nr]),[1 2 4 3]);
132 F6tX = u6t.*permute(repmat(dy6t,[1 1 1 nr]),[1 2 4 3]);
133 F6tY = v6t.*permute(repmat(dx6t,[1 1 1 nr]),[1 2 4 3]);
134
135 Hdiv = zeros(nc,nc,nr,6);
136 Hdiv = F6tX([2:nc+1],:,:,:) - F6tX([1:nc],:,:,:) ...
137 + F6tY(:,[2:nc+1],:,:) - F6tY(:,[1:nc],:,:);
138 for k=1:nr
139 Hdiv(:,:,k,:) = -Hdiv(:,:,k,:)*dr(k);
140 end
141
142 %psiX = zeros(6*nc,nc,nr);
143 %for n = 1:6
144 % is = 1+nc*(n-1);ie=nc*n;
145 % psiX([is:ie],[1:nc],[1:nr]) = Hdiv([1:nc],[1:nc],[1:nr],n);
146 %end
147 psiX = reshape(permute(Hdiv,[1 4 2 3]),6*nc,nc,nr);
148 %wb = psiX ./ repmat(reshape(ra,6*nc,nc),[1 1 nr]);
149
150 wb = zeros(6*nc,nc,nr+1);
151 for k=nr:-1:1
152 wb(:,:,k)= psiX(:,:,k) ./ reshape(ra,6*nc,nc) + wb(:,:,k+1);
153 end
154
155 wb_all(:,:,:,it) = wb(:,:,1:30);
156 %%%%%%%%%%%%
157 end
158
159 %%%%%%% Advective form case
160 case 'Advc'
161
162 PsiX_all = reshape(d.GM_PsiX(1:6*nc,1:nc,1:nr,:),[6*nc*nc,nr,nt]);
163 PsiY_all = reshape(d.GM_PsiY(1:6*nc,1:nc,1:nr,:),[6*nc*nc,nr,nt]);
164
165 dr3d = ones(6*nc*nc,1)*reshape(dr,[1,length(dr)]);
166
167 for it = 1:nt
168
169 psiX = zeros(6*nc*nc,nr+1);
170 psiY = zeros(6*nc*nc,nr+1);
171
172 psiX(:,1:nr) = mw.*PsiX_all(:,:,it);
173 psiY(:,1:nr) = ms.*PsiY_all(:,:,it);
174
175 % psiX(:,[1:nr]) = mw.*psiX(:,[1:nr]);
176 % psiY(:,[1:nr]) = ms.*psiY(:,[1:nr]);
177 ub = psiX(:,[2:nr+1]) - psiX(:,[1:nr]);
178 vb = psiY(:,[2:nr+1]) - psiY(:,[1:nr]);
179
180 % ub = reshape(hw_recip.*ub./(rAw*dr),[6*nc,nc,nr]);
181 % ub = reshape(ub./(rAw*dr),[6*nc,nc,nr]);
182 ub = reshape(ub./dr3d,[6*nc,nc,nr]);
183 % vb = reshape(hs_recip.*vb./(rAs*dr),[6*nc,nc,nr]);
184 % vb = reshape(vb./(rAs*dr),[6*nc,nc,nr]);
185 vb = reshape(vb./dr3d,[6*nc,nc,nr]);
186
187 ub_all(:,:,:,it) = ub;
188 vb_all(:,:,:,it) = vb;
189 end
190
191 otherwise
192 disp('Ce portnawak')
193 end
194
195 ub = ub_all;
196 vb = vb_all;
197 wb = wb_all;

  ViewVC Help
Powered by ViewVC 1.1.22