|
| 1 | +function [out]=budget_mom_vort(nmRun,tim); |
| 2 | +% BUDGET_MOM_VORT performs a simple check of momentum budget closure for output |
| 3 | +% in nmRun ('diags.20160531' by default) and time tim (62772 by default) |
| 4 | +% |
| 5 | +% example 1: budget_mom_vort('diags.20160531',62772); |
| 6 | +% |
| 7 | +% example 2: execute commands below to compute time mean BPV budget |
| 8 | +% |
| 9 | +%list0=dir('diags.20160531/budg_tendU.*.meta'); nt=240; |
| 10 | +%list1=zeros(nt,1); for tt=1:nt; list1(tt)=str2num(list0(tt).name(12:end-5)); end; |
| 11 | +% |
| 12 | +%tic; |
| 13 | +%for tt=1:nt; |
| 14 | +% disp(tt); |
| 15 | +% [out]=budget_mom_vort('diags.20160531',list1(tt)); |
| 16 | +% if tt==1; |
| 17 | +% list2=fieldnames(out); |
| 18 | +% for nn=1:length(list2); |
| 19 | +% ave.(list2{nn})=out.(list2{nn})/nt; |
| 20 | +% end; |
| 21 | +% else; |
| 22 | +% for nn=1:length(list2); |
| 23 | +% ave.(list2{nn})=ave.(list2{nn})+out.(list2{nn})/nt; |
| 24 | +% end; |
| 25 | +% end; |
| 26 | +%end; |
| 27 | +%toc; |
| 28 | +% |
| 29 | +%%save budget_mom_vort_ave.mat ave; |
| 30 | +% |
| 31 | +%rot.TOTUTEND=calc_UV_curl(ave.TOTUTEND,ave.TOTVTEND,1); |
| 32 | +%rot.AB_gU=calc_UV_curl(ave.AB_gU,ave.AB_gV,1); |
| 33 | +%rot.Um_Diss=calc_UV_curl(ave.Um_Diss,ave.Vm_Diss,1); |
| 34 | +%rot.Um_Advec=calc_UV_curl(ave.Um_Advec,ave.Vm_Advec,1); |
| 35 | +%rot.Um_dPHdx=calc_UV_curl(ave.Um_dPHdx,ave.Vm_dPHdx,1); |
| 36 | +%rot.Um_Ext=calc_UV_curl(ave.Um_Ext,ave.Vm_Ext,1); |
| 37 | +%rot.VISrI_Um=calc_UV_curl(ave.VISrI_Um,ave.VISrI_Vm,1); |
| 38 | +%rot.Um_dETANdx=calc_UV_curl(ave.Um_dETANdx,ave.Vm_dETANdy,1); |
| 39 | +% |
| 40 | +%%msk=mygrid.mskC(:,:,1); |
| 41 | +%msk=exch_T_N(mygrid.mskC(:,:,1)); |
| 42 | +%for ff=1:msk.nFaces; |
| 43 | +% tmp1=msk{ff}(2:end-1,2:end-1); |
| 44 | +% for ii=-1:1; for jj=-1:1; tmp1=tmp1.*msk{ff}(2+ii:end-1+ii,2+jj:end-1+jj); end; end; |
| 45 | +% msk{ff}=tmp1; |
| 46 | +%end; |
| 47 | +% |
| 48 | +%list2=fieldnames(rot); |
| 49 | +%distXC=3*mygrid.DXC; distYC=3*mygrid.DYC; |
| 50 | +%for nn=1:length(list2); |
| 51 | +% tmp1=msk.*rot.(list2{nn}); |
| 52 | +% tmp1=diffsmooth2D(tmp1,distXC,distYC); |
| 53 | +% eval([list2{nn} '=tmp1;']); |
| 54 | +%end; |
| 55 | +% |
| 56 | +%figureL; fac2=2; |
| 57 | +%subplot(3,2,1); qwckplot(TOTUTEND); caxis(fac2*[-1 1]*2e-10); colorbar; title('TEND'); |
| 58 | +%subplot(3,2,2); qwckplot(Um_dETANdx+Um_dPHdx); caxis(fac2*[-1 1]*2e-10); colorbar; title('PRESS'); |
| 59 | +%subplot(3,2,3); qwckplot(AB_gU+Um_Diss+VISrI_Um); caxis(fac2*[-1 1]*2e-10); colorbar; title('VARIOUS'); |
| 60 | +%subplot(3,2,4); qwckplot(Um_Advec); caxis(fac2*[-1 1]*2e-10); colorbar; title('ADVEC'); |
| 61 | +%subplot(3,2,5); qwckplot(Um_Ext); caxis(fac2*[-1 1]*2e-10); colorbar; title('EXT'); |
| 62 | +%subplot(3,2,6); qwckplot(TOTUTEND-Um_dETANdx-Um_dPHdx-AB_gU... |
| 63 | +% -Um_Diss-VISrI_Um-Um_Advec-Um_Ext); caxis(fac2*[-1 1]*2e-10); colorbar; title('RESIDUAL'); |
| 64 | + |
| 65 | +gcmfaces_global; |
| 66 | + |
| 67 | +doPlot=0; |
| 68 | +if nargin<1; nmRun='diags.20160531'; end; |
| 69 | +if nargin<2; tim=62772; end; |
| 70 | + |
| 71 | +dir00='eccov4_release2_mom/'; |
| 72 | +dir0=[dir00 nmRun '/']; |
| 73 | +dirGrid=[dir00 'GRID/']; |
| 74 | + |
| 75 | +if isempty(mygrid); grid_load(dirGrid,5,'compact'); end; |
| 76 | + |
| 77 | +RAW=rdmds2gcmfaces([dirGrid 'RAW']); |
| 78 | +RAS=rdmds2gcmfaces([dirGrid 'RAS']); |
| 79 | +nr=length(mygrid.RC); kk=1; fac0=1e3; fac1=1e3; |
| 80 | +doIce=0; |
| 81 | + |
| 82 | +listVars={'TOTUTEND','AB_gU ','Um_Diss ','Um_Advec','Um_dPHdx','Um_Ext ','VISrI_Um'}; |
| 83 | +listVars=deblank(listVars); |
| 84 | +for vv=1:7; |
| 85 | + fld=rdmds2gcmfaces([dir0 'budg_tendU'],tim,'rec',vv); |
| 86 | + %fld=fld(:,:,:,end); |
| 87 | + if vv==1; fld=fld/86400; |
| 88 | + elseif vv==7; |
| 89 | + fld=fld./repmat(RAW,[1 1 nr]); |
| 90 | + tmp1=mygrid.hFacW.*mk3D(mygrid.DRF,fld); |
| 91 | + tmp2=fld; tmp2(:,:,nr)=fld(:,:,nr); |
| 92 | + tmp2(:,:,1:nr-1)=fld(:,:,1:nr-1)-fld(:,:,2:nr); |
| 93 | + fld=tmp2./tmp1; |
| 94 | + end; |
| 95 | + tmp1=mygrid.hFacW.*mk3D(mygrid.DRF,fld); |
| 96 | + fld=nansum(tmp1.*fld,3); |
| 97 | + eval([listVars{vv} '=fld;']); |
| 98 | + eval(['out.' listVars{vv} '=fld;']); |
| 99 | +end; |
| 100 | + |
| 101 | +listVars_V={'TOTVTEND','AB_gV ','Vm_Diss ','Vm_Advec','Vm_dPHdx','Vm_Ext ','VISrI_Vm'}; |
| 102 | +listVars_V=deblank(listVars_V); |
| 103 | +for vv=1:7; |
| 104 | + fld=rdmds2gcmfaces([dir0 'budg_tendV'],tim,'rec',vv); |
| 105 | + %fld=fld(:,:,:,end); |
| 106 | + if vv==1; fld=fld/86400; |
| 107 | + elseif vv==7; |
| 108 | + fld=fld./repmat(RAS,[1 1 nr]); |
| 109 | + tmp1=mygrid.hFacS.*mk3D(mygrid.DRF,fld); |
| 110 | + tmp2=fld; tmp2(:,:,nr)=fld(:,:,nr); |
| 111 | + tmp2(:,:,1:nr-1)=fld(:,:,1:nr-1)-fld(:,:,2:nr); |
| 112 | + fld=tmp2./tmp1; |
| 113 | + end; |
| 114 | + tmp1=mygrid.hFacS.*mk3D(mygrid.DRF,fld); |
| 115 | + fld=nansum(tmp1.*fld,3); |
| 116 | + eval([listVars_V{vv} '=fld;']); |
| 117 | + eval(['out.' listVars_V{vv} '=fld;']); |
| 118 | +end; |
| 119 | + |
| 120 | +ETAN=1/9.81*rdmds2gcmfaces([dir0 'budg_aveSURF'],tim,'rec',6); |
| 121 | +[Um_dETANdx,Vm_dETANdy]=calc_T_grad(-9.81*mygrid.mskC(:,:,1).*ETAN,0); |
| 122 | + |
| 123 | +tmp1=nansum(mygrid.hFacW.*mk3D(mygrid.DRF,mygrid.hFacW),3); |
| 124 | +Um_dETANdx=Um_dETANdx.*tmp1; |
| 125 | +tmp1=nansum(mygrid.hFacS.*mk3D(mygrid.DRF,mygrid.hFacS),3); |
| 126 | +Vm_dETANdy=Vm_dETANdy.*tmp1; |
| 127 | + |
| 128 | +out.Um_dETANdx=Um_dETANdx; |
| 129 | +out.Vm_dETANdy=Vm_dETANdy; |
| 130 | + |
| 131 | +%% |
| 132 | + |
| 133 | +if nargout==0; |
| 134 | + |
| 135 | +m=mygrid.mskC(:,:,kk); |
| 136 | + |
| 137 | +figureL; |
| 138 | +subplot(3,2,1); qwckplot(m.*VISrI_Um(:,:,kk)); |
| 139 | +title('VISrI_Um (d/dr/rac of VISC)'); caxis(fac0*[-1 1]*1e-8); colorbar; |
| 140 | +subplot(3,2,2); qwckplot(m.*Um_dETANdx); |
| 141 | +title('Um_dETANdx (d/dx of PHI_SURF/g)'); caxis(fac0*[-1 1]*1e-5); colorbar; |
| 142 | +for jj=1:6; |
| 143 | + vv=listVars{jj+1}; |
| 144 | + subplot(3,3,jj+3); |
| 145 | + eval(['fld=' vv ';']); |
| 146 | + qwckplot(m.*fld(:,:,kk)); |
| 147 | + if strcmp(vv,'Um_Advec')|strcmp(vv,'Um_dPHdx')|strcmp(vv,'Um_Ext'); |
| 148 | + caxis(fac0*[-1 1]*1e-5); colorbar; |
| 149 | + else; |
| 150 | + caxis(fac0*[-1 1]*1e-8); colorbar; |
| 151 | + end; |
| 152 | + title(listVars{jj+1}); |
| 153 | +end; |
| 154 | + |
| 155 | +%compute R.H.S. |
| 156 | +fld=Um_dPHdx(:,:,kk)+Um_dETANdx+Um_Advec(:,:,kk); |
| 157 | +fld=fld+Um_Diss(:,:,kk)+Um_Ext(:,:,kk)+AB_gU(:,:,kk); |
| 158 | +fld=fld-VISrI_Um(:,:,kk); |
| 159 | + |
| 160 | +figureL; |
| 161 | +subplot(3,1,1); qwckplot(m.*TOTUTEND(:,:,kk)); |
| 162 | +title('TOTUTEND'); caxis(fac1*[-1 1]*1e-8); colorbar; |
| 163 | +subplot(3,1,2); qwckplot(m.*fld); |
| 164 | +title('R.H.S.'); caxis(fac1*[-1 1]*1e-8); colorbar; |
| 165 | +subplot(3,1,3); qwckplot(m.*TOTUTEND(:,:,kk)-fld); |
| 166 | +title('residual'); caxis(fac1*[-1 1]*1e-11); colorbar; |
| 167 | + |
| 168 | +%compute R.H.S. |
| 169 | +fld=Vm_dPHdx(:,:,kk)+Vm_dETANdy+Vm_Advec(:,:,kk); |
| 170 | +fld=fld+Vm_Diss(:,:,kk)+Vm_Ext(:,:,kk)+AB_gV(:,:,kk); |
| 171 | +fld=fld-VISrI_Vm(:,:,kk); |
| 172 | + |
| 173 | +figureL; |
| 174 | +subplot(3,1,1); qwckplot(m.*TOTVTEND(:,:,kk)); |
| 175 | +title('TOTVTEND'); caxis(fac1*[-1 1]*1e-8); colorbar; |
| 176 | +subplot(3,1,2); qwckplot(m.*fld); |
| 177 | +title('R.H.S.'); caxis(fac1*[-1 1]*1e-8); colorbar; |
| 178 | +subplot(3,1,3); qwckplot(m.*TOTVTEND(:,:,kk)-fld); |
| 179 | +title('residual'); caxis(fac1*[-1 1]*1e-11); colorbar; |
| 180 | + |
| 181 | +if 0; |
| 182 | +figureL; |
| 183 | +subplot(2,1,1); qwckplot(m.*TOTUTEND(:,:,kk)-fld); |
| 184 | +title('residual'); caxis(fac1*[-1 1]*1e-8); colorbar; |
| 185 | +subplot(2,1,2); qwckplot(m.*VISrI_Um(:,:,kk)); |
| 186 | +title('residual'); caxis(fac1*[-1 1]*1e-8); colorbar; |
| 187 | +end; |
| 188 | + |
| 189 | +end;%if nargout==0; |
| 190 | + |
0 commit comments