1 |
gforget |
1.2 |
function [budgO,budgI]=calc_budget_heat(kBudget); |
2 |
gforget |
1.1 |
% CALC_BUDGET_HEAT(kBudget) |
3 |
|
|
|
4 |
|
|
gcmfaces_global; |
5 |
|
|
|
6 |
|
|
%get variables from caller routine: |
7 |
|
|
%---------------------------------- |
8 |
|
|
|
9 |
|
|
global myparms; |
10 |
|
|
|
11 |
|
|
list_variables={'THETA','AB_gT','TRELAX','SIheff','SIhsnow',... |
12 |
|
|
'TFLUX','geothFlux','SItflux','SIaaflux','oceQnet',... |
13 |
|
|
'SIatmQnt','SIsnPrcp','SIacSubl','WTHMASS',... |
14 |
|
|
'ADVx_TH','DFxE_TH','ADVy_TH','DFyE_TH',... |
15 |
|
|
'ADVxHEFF','ADVxSNOW','DFxEHEFF','DFxESNOW',... |
16 |
|
|
'ADVyHEFF','ADVySNOW','DFyEHEFF','DFyESNOW'}; |
17 |
|
|
|
18 |
|
|
if kBudget>1; |
19 |
|
|
list_variables={list_variables{:},'oceQsw','ADVr_TH','DFrE_TH',... |
20 |
|
|
'DFrI_TH','ADVr_TH','DFrE_TH','DFrI_TH'}; |
21 |
|
|
end; |
22 |
|
|
|
23 |
|
|
for vv=1:length(list_variables); |
24 |
|
|
v = evalin('caller',list_variables{vv}); |
25 |
|
|
eval([list_variables{vv} '=v;']); |
26 |
|
|
end; |
27 |
|
|
clear v; |
28 |
|
|
|
29 |
|
|
test3d=length(size(ADVx_TH{1}))>2; |
30 |
|
|
|
31 |
|
|
%compute mapped budget: |
32 |
|
|
%---------------------- |
33 |
|
|
|
34 |
|
|
contOCN=myparms.rcp*THETA-myparms.rcp*AB_gT; |
35 |
|
|
contICE=-myparms.flami*(SIheff*myparms.rhoi+SIhsnow*myparms.rhosn); |
36 |
|
|
% |
37 |
gforget |
1.2 |
budgO.tend=mk3D(mygrid.RAC,contOCN).*contOCN;%Watt |
38 |
|
|
budgI.tend=mygrid.RAC.*contICE;%Watt |
39 |
gforget |
1.1 |
% |
40 |
|
|
contOCN=nansum(contOCN,3); |
41 |
|
|
contTOT=contOCN+contICE; |
42 |
|
|
|
43 |
|
|
%vertical divergence (air-sea fluxes or vertical adv/dif) |
44 |
|
|
zdivOCN=TFLUX+geothFlux; |
45 |
|
|
zdivICE=-(SItflux+TFLUX-TRELAX); |
46 |
|
|
%in linear surface we omit : |
47 |
|
|
if ~myparms.useNLFS; zdivOCN=zdivOCN-myparms.rcp*WTHMASS; end; |
48 |
|
|
%in virtual salt flux we omit : |
49 |
|
|
if ~myparms.useRFWF|~myparms.useNLFS; zdivICE=zdivICE+SIaaflux; end; |
50 |
|
|
%working approach for real fresh water (?) and virtual salt flux |
51 |
|
|
if 0; zdivICE=-oceQnet-SIatmQnt-myparms.flami*(SIsnPrcp-SIacSubl); end; |
52 |
|
|
%for deep ocean layer : |
53 |
|
|
if kBudget>1; |
54 |
|
|
zdivOCN=-(ADVr_TH+DFrE_TH+DFrI_TH)./mygrid.RAC*myparms.rcp; |
55 |
|
|
dd=mygrid.RF(kBudget); msk=mygrid.mskC(:,:,kBudget); |
56 |
|
|
swfrac=0.62*exp(dd/0.6)+(1-0.62)*exp(dd/20); |
57 |
|
|
if dd<-200; swfrac=0; end; |
58 |
|
|
zdivOCN=zdivOCN+swfrac*oceQsw+geothFlux;%.*msk; |
59 |
|
|
end; |
60 |
|
|
% |
61 |
|
|
zdivTOT=zdivOCN+zdivICE; |
62 |
|
|
% |
63 |
|
|
%note: geothFlux remains to be accounted for in the following |
64 |
|
|
if test3d; |
65 |
|
|
trWtop=-(ADVr_TH+DFrE_TH+DFrI_TH)*myparms.rcp; |
66 |
|
|
% |
67 |
|
|
dd=mygrid.RF(1:end-1); |
68 |
|
|
swfrac=0.62*exp(dd/0.6)+(1-0.62)*exp(dd/20); |
69 |
|
|
swfrac(dd<-200)=0; |
70 |
|
|
swtop=mk3D(swfrac,trWtop).*mk3D(mygrid.RAC.*oceQsw,trWtop); |
71 |
|
|
swtop(isnan(mygrid.mskC))=0; |
72 |
|
|
trWtop=trWtop+swtop; |
73 |
|
|
% |
74 |
|
|
trWtop(:,:,1)=zdivOCN.*mygrid.RAC; |
75 |
|
|
trWbot=trWtop(:,:,2:length(mygrid.RC)); |
76 |
|
|
trWbot(:,:,length(mygrid.RC))=0; |
77 |
|
|
% |
78 |
gforget |
1.2 |
budgO.trWtop=trWtop;%Watt |
79 |
|
|
budgO.trWbot=trWbot;%Watt |
80 |
gforget |
1.1 |
else; |
81 |
gforget |
1.2 |
budgO.trWtop=mygrid.RAC.*zdivOCN; budgO.trWbot=mygrid.RAC*0;%Watt |
82 |
gforget |
1.1 |
end; |
83 |
gforget |
1.2 |
budgI.trWtop=mygrid.RAC.*(zdivICE+zdivOCN); budgI.trWbot=mygrid.RAC.*zdivOCN;%Watt |
84 |
gforget |
1.1 |
|
85 |
|
|
%horizontal divergence (advection and diffusion) |
86 |
|
|
tmpUo=myparms.rcp*(ADVx_TH+DFxE_TH); tmpVo=myparms.rcp*(ADVy_TH+DFyE_TH); |
87 |
|
|
hdivOCN=calc_UV_conv(nansum(tmpUo,3),nansum(tmpVo,3)); |
88 |
|
|
tmpUi=-myparms.flami*(myparms.rhoi*DFxEHEFF+myparms.rhosn*DFxESNOW+myparms.rhoi*ADVxHEFF+myparms.rhosn*ADVxSNOW); |
89 |
|
|
tmpVi=-myparms.flami*(myparms.rhoi*DFyEHEFF+myparms.rhosn*DFyESNOW+myparms.rhoi*ADVyHEFF+myparms.rhosn*ADVySNOW); |
90 |
|
|
hdivICE=calc_UV_conv(tmpUi,tmpVi); %no dh needed here |
91 |
|
|
hdivTOT=hdivOCN+hdivICE; |
92 |
|
|
% |
93 |
gforget |
1.2 |
budgO.trU=tmpUo; budgO.trV=tmpVo;%Watt |
94 |
|
|
budgI.trU=tmpUi; budgI.trV=tmpVi;%Watt |
95 |
gforget |
1.1 |
|
96 |
gforget |
1.2 |
budgO.contOCN=contOCN; |
97 |
|
|
budgO.hdivOCN=hdivOCN; |
98 |
|
|
budgO.zdivOCN=zdivOCN; |
99 |
|
|
|
100 |
|
|
budgI.contICE=contICE; |
101 |
|
|
budgI.hdivICE=hdivICE; |
102 |
|
|
budgI.zdivICE=zdivICE; |
103 |
gforget |
1.1 |
|