1 |
function [budgO,budgI,budgOI]=calc_budget_mass(kBudget); |
2 |
% CALC_BUDGET_MASS(kBudget,doMoreBudgetOutput) |
3 |
% |
4 |
% note: within this routine `ETAN', `SIheff', and `SIhsnow' denote |
5 |
% the corresponding tendencies as computed by diags_diff_snapshots.m |
6 |
% rather than the state variables themselves. |
7 |
|
8 |
gcmfaces_global; |
9 |
|
10 |
%get variables from caller routine: |
11 |
%---------------------------------- |
12 |
|
13 |
global myparms; |
14 |
|
15 |
list_variables={'ETAN','SIheff','SIhsnow','oceFWflx','SIatmFW','oceFWflx',... |
16 |
'UVELMASS','VVELMASS',... |
17 |
'ADVxHEFF','ADVxSNOW','DFxEHEFF','DFxESNOW',... |
18 |
'ADVyHEFF','ADVySNOW','DFyEHEFF','DFyESNOW'}; |
19 |
|
20 |
for vv=1:length(list_variables); |
21 |
v = evalin('caller',list_variables{vv}); |
22 |
eval([list_variables{vv} '=v;']); |
23 |
end; |
24 |
clear v; |
25 |
|
26 |
test3d=length(size(UVELMASS{1}))>2; |
27 |
|
28 |
if test3d|kBudget>1; |
29 |
list_variables={'WVELMASS'}; |
30 |
for vv=1:length(list_variables); |
31 |
v = evalin('caller',list_variables{vv}); |
32 |
eval([list_variables{vv} '=v;']); |
33 |
end; |
34 |
clear v; |
35 |
end; |
36 |
|
37 |
%compute mapped budget: |
38 |
%---------------------- |
39 |
|
40 |
%mass = myparms.rhoconst * sea level |
41 |
budgO.tend=ETAN*myparms.rhoconst; |
42 |
budgI.tend=(SIheff*myparms.rhoi+SIhsnow*myparms.rhosn); |
43 |
%for deep ocean layer : |
44 |
if kBudget>1&myparms.useNLFS<2; |
45 |
budgO.tend=0; |
46 |
elseif kBudget>1;%rstar case |
47 |
tmp1=mk3D(mygrid.DRF,mygrid.hFacC).*mygrid.hFacC; |
48 |
tmp2=sum(tmp1(:,:,kBudget:length(mygrid.RC)),3)./mygrid.Depth; |
49 |
budgO.tend=tmp2.*ETAN*myparms.rhoconst; |
50 |
end; |
51 |
% |
52 |
if test3d; |
53 |
tmp1=mk3D(mygrid.DRF,mygrid.hFacC).*mygrid.hFacC; |
54 |
tmp2=tmp1./mk3D(mygrid.Depth,tmp1); |
55 |
budgO.tend=tmp2.*mk3D(ETAN,tmp2)*myparms.rhoconst; |
56 |
end; |
57 |
% |
58 |
tmptend=mk3D(mygrid.RAC,budgO.tend).*budgO.tend;%kg/s |
59 |
budgO.fluxes.tend=tmptend; |
60 |
budgO.tend=nansum(tmptend,3); |
61 |
budgI.tend=mygrid.RAC.*budgI.tend;%kg/s |
62 |
budgOI.tend=budgO.tend+budgI.tend; |
63 |
|
64 |
%vertical divergence (air-sea fluxes or vertical advection) |
65 |
budgO.zconv=oceFWflx; |
66 |
budgI.zconv=SIatmFW-oceFWflx; |
67 |
%in virtual salt flux we omit : |
68 |
if ~myparms.useRFWF; budgO.zconv=0*budgO.zconv; end; |
69 |
%for deep ocean layer : |
70 |
if kBudget>1; budgO.zconv=-WVELMASS*myparms.rhoconst; end; |
71 |
% |
72 |
if test3d; |
73 |
trWtop=-WVELMASS*myparms.rhoconst; |
74 |
%trWtop(:,:,1)=budgO.zconv; |
75 |
trWbot=trWtop(:,:,2:length(mygrid.RC)); |
76 |
trWbot(:,:,length(mygrid.RC))=0; |
77 |
% |
78 |
budgO.fluxes.trWtop=mk3D(mygrid.RAC,trWtop).*trWtop; |
79 |
budgO.fluxes.trWbot=mk3D(mygrid.RAC,trWbot).*trWbot;%kg/s |
80 |
else; |
81 |
budgO.fluxes.trWtop=-mygrid.RAC.*budgO.zconv; |
82 |
budgO.fluxes.trWbot=mygrid.RAC*0;%kg/s |
83 |
end; |
84 |
budgI.fluxes.trWtop=-mygrid.RAC.*(budgI.zconv+budgO.zconv); |
85 |
budgI.fluxes.trWbot=-mygrid.RAC.*budgO.zconv;%kg/s |
86 |
% |
87 |
budgO.zconv=mk3D(mygrid.RAC,budgO.zconv).*budgO.zconv;%kg/s |
88 |
budgI.zconv=mygrid.RAC.*budgI.zconv;%kg/s |
89 |
budgOI.zconv=budgO.zconv+budgI.zconv; |
90 |
|
91 |
%horizontal divergence (advection and ice diffusion) |
92 |
if test3d; |
93 |
%3D UVELMASS,VVELMASS are multiplied by DRF |
94 |
%(2D diagnostics are expectedly vertically integrated by MITgcm) |
95 |
tmp1=mk3D(mygrid.DRF,UVELMASS); |
96 |
UVELMASS=tmp1.*UVELMASS; |
97 |
VVELMASS=tmp1.*VVELMASS; |
98 |
end; |
99 |
dxg=mk3D(mygrid.DXG,VVELMASS); dyg=mk3D(mygrid.DYG,UVELMASS); |
100 |
tmpUo=myparms.rhoconst*dyg.*UVELMASS; |
101 |
tmpVo=myparms.rhoconst*dxg.*VVELMASS; |
102 |
budgO.hconv=calc_UV_conv(nansum(tmpUo,3),nansum(tmpVo,3)); |
103 |
tmpUi=(myparms.rhoi*DFxEHEFF+myparms.rhosn*DFxESNOW+... |
104 |
myparms.rhoi*ADVxHEFF+myparms.rhosn*ADVxSNOW); |
105 |
tmpVi=(myparms.rhoi*DFyEHEFF+myparms.rhosn*DFyESNOW+... |
106 |
myparms.rhoi*ADVyHEFF+myparms.rhosn*ADVySNOW); |
107 |
budgI.hconv=calc_UV_conv(tmpUi,tmpVi); %dh needed is alerady in DFxEHEFF etc |
108 |
% |
109 |
budgOI.hconv=budgO.hconv; |
110 |
budgOI.hconv(:,:,1)=budgOI.hconv(:,:,1)+budgI.hconv; |
111 |
% |
112 |
budgO.fluxes.trU=tmpUo; budgO.fluxes.trV=tmpVo;%kg/s |
113 |
budgI.fluxes.trU=tmpUi; budgI.fluxes.trV=tmpVi;%kg/s |
114 |
|