| 1 | 
dfer | 
1.2 | 
function [ub,vb,wb]=calcBolusVelCube(d,g,GMform); | 
| 2 | 
dfer | 
1.1 | 
 | 
| 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 | 
dfer | 
1.2 | 
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 | 
dfer | 
1.1 | 
 | 
| 52 | 
  | 
  | 
%--- recip_hFac & mask : | 
| 53 | 
  | 
  | 
mw=ceil(hw); mw=min(1,mw); | 
| 54 | 
  | 
  | 
ms=ceil(hs); ms=min(1,ms); | 
| 55 | 
  | 
  | 
 | 
| 56 | 
dfer | 
1.2 | 
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 | 
dfer | 
1.1 | 
 | 
| 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 | 
dfer | 
1.2 | 
 | 
| 122 | 
dfer | 
1.1 | 
    ub_all(:,:,:,it) = ub; | 
| 123 | 
  | 
  | 
    vb_all(:,:,:,it) = vb; | 
| 124 | 
dfer | 
1.2 | 
 | 
| 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 | 
dfer | 
1.1 | 
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 | 
dfer | 
1.2 | 
wb = wb_all; |