/[MITgcm]/MITgcm_contrib/gael/matlab_class/gcmfaces_smooth/diffsmooth2D_extrap_inv.m
ViewVC logotype

Annotation of /MITgcm_contrib/gael/matlab_class/gcmfaces_smooth/diffsmooth2D_extrap_inv.m

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


Revision 1.6 - (hide annotations) (download)
Wed Aug 1 01:48:33 2012 UTC (12 years, 11 months ago) by gforget
Branch: MAIN
Changes since 1.5: +0 -1 lines
- diffsmooth2D_extrap_fwd.m : use gcmfaces_timestep.m
- diffsmooth2D_extrap_inv.m : rm unused DXG/DYG.

1 gforget 1.5 function [FLD]=diffsmooth2D_extrap_inv(fld,mskOut,varargin);
2     %object: extrapolate an incomplete field to create a full field, by
3     % solving for a diffusion equation equilibrium state.
4     %inputs: fld incomplete field of interest (masked with NaN)
5     % mskOut land mask (1s and NaNs) for the full field (output)
6     %output: FLD full field
7 gforget 1.1
8     global mygrid;
9    
10     dxC=mygrid.DXC; dyC=mygrid.DYC;
11     rA=mygrid.RAC;
12    
13     dxCsm=dxC; dyCsm=dyC;
14     mskFreeze=fld; mskFreeze(find(~isnan(mskFreeze)))=0; mskFreeze(find(isnan(mskFreeze)))=1;
15    
16     %check for domain edge points where no exchange is possible:
17     tmp1=mskOut; tmp1(:)=1; tmp2=exch_T_N(tmp1);
18     for iF=1:mskOut.nFaces;
19     tmp3=mskOut{iF}; tmp4=tmp2{iF};
20     tmp4=tmp4(2:end-1,1:end-2)+tmp4(2:end-1,3:end)+tmp4(1:end-2,2:end-1)+tmp4(3:end,2:end-1);
21     if ~isempty(find(isnan(tmp4)&~isnan(tmp3))); fprintf('warning: mask was modified\n'); end;
22     tmp3(isnan(tmp4))=NaN; mskOut{iF}=tmp3;
23     end;
24    
25     %put 0 first guess if needed and switch land mask:
26     fld(find(isnan(fld)))=0; fld=fld.*mskOut;
27    
28     %scale the diffusive operator:
29     tmp0=dxCsm./dxC; tmp0(isnan(mskOut))=NaN; tmp00=nanmax(tmp0);
30     tmp0=dyCsm./dyC; tmp0(isnan(mskOut))=NaN; tmp00=max([tmp00 nanmax(tmp0)]);
31     smooth2D_nbt=tmp00;
32     smooth2D_nbt=ceil(1.1*2*smooth2D_nbt^2);
33    
34     smooth2D_dt=1;
35     smooth2D_T=smooth2D_nbt*smooth2D_dt;
36     smooth2D_Kux=dxCsm.*dxCsm/smooth2D_T/2;
37     smooth2D_Kvy=dyCsm.*dyCsm/smooth2D_T/2;
38    
39     %form matrix problem:
40     tmp1=convert2array(mskOut);
41     kk=find(~isnan(tmp1));
42 gforget 1.4 KK=tmp1; KK(kk)=kk; KK=convert2array(KK);
43 gforget 1.1 nn=length(kk);
44 gforget 1.4 NN=tmp1; NN(kk)=[1:nn]; %NN=convert2array(NN);
45 gforget 1.1
46 gforget 1.2 if nargin==3; doFormMatrix=varargin{1}; else; doFormMatrix=1; end;
47    
48     global dFLDdt_op;
49     if doFormMatrix==1;
50    
51 gforget 1.1 dFLDdt_op=sparse([],[],[],nn,nn,nn*5);
52    
53     for iF=1:fld.nFaces; for ii=1:3; for jj=1:3;
54     FLDones=fld; FLDones(find(~isnan(fld)))=0;
55     FLDones{iF}(ii:3:end,jj:3:end)=1;
56     FLDones(find(isnan(fld)))=NaN;
57    
58     FLDkkFROMtmp=fld; FLDkkFROMtmp(find(~isnan(fld)))=0;
59     FLDkkFROMtmp{iF}(ii:3:end,jj:3:end)=KK{iF}(ii:3:end,jj:3:end);
60     FLDkkFROMtmp(find(isnan(fld)))=0;
61    
62     FLDkkFROM=exch_T_N(FLDkkFROMtmp);
63 gforget 1.3 FLDkkFROM(find(isnan(FLDkkFROM)))=0;
64 gforget 1.1 for iF2=1:fld.nFaces;
65     tmp1=FLDkkFROM{iF2}; tmp2=zeros(size(tmp1)-2);
66     for ii2=1:3; for jj2=1:3; tmp2=tmp2+tmp1(ii2:end-3+ii2,jj2:end-3+jj2); end; end;
67     FLDkkFROM{iF2}=tmp2;
68     end;
69     %clear FLDkkFROMtmp;
70    
71     [dTdxAtU,dTdyAtV]=calc_T_grad(FLDones,0);
72     tmpU=dTdxAtU.*smooth2D_Kux;
73     tmpV=dTdyAtV.*smooth2D_Kvy;
74     [fldDIV]=calc_UV_div(tmpU,tmpV);
75     dFLDdt=smooth2D_dt*fldDIV./rA;
76     dFLDdt=dFLDdt.*mskFreeze;
77    
78     dFLDdt=convert2array(dFLDdt); FLDkkFROM=convert2array(FLDkkFROM); FLDkkTO=convert2array(KK);
79     tmp1=find(dFLDdt~=0&~isnan(dFLDdt));
80     dFLDdt=dFLDdt(tmp1); FLDkkFROM=FLDkkFROM(tmp1); FLDkkTO=FLDkkTO(tmp1);
81     dFLDdt_op=dFLDdt_op+sparse(NN(FLDkkTO),NN(FLDkkFROM),dFLDdt,nn,nn);
82    
83     end; end; end;
84    
85 gforget 1.2 end;%if doFormMatrix==1;
86    
87 gforget 1.1 %figure; spy(dFLDdt_op);
88    
89     FLD_vec=convert2array(fld);
90     mskFreeze_vec=convert2array(mskFreeze);
91     FLD_vec(find(mskFreeze_vec==1))=0;
92     FLD_vec=FLD_vec(kk);
93    
94     INV_op=1-mskFreeze_vec(kk);
95     INV_op=sparse([1:nn],[1:nn],INV_op,nn,nn);
96     INV_op=INV_op+dFLDdt_op;
97     INV_vec=INV_op\FLD_vec;
98     INV_fld=convert2array(mskOut);
99     INV_fld(find(~isnan(INV_fld)))=INV_vec;
100    
101 gforget 1.4 FLD=convert2array(INV_fld);
102 gforget 1.1
103     return;
104    
105     %time step using matrix:
106     FLD_vec=convert2array(fld);
107     FLD_vec=FLD_vec(find(~isnan(FLD_vec)));
108     dFLDdt_vec=dFLDdt_op*FLD_vec;
109     dFLDdt_fld=convert2array(FLD);
110     dFLDdt_fld(find(~isnan(dFLDdt_fld)))=dFLDdt_vec;
111     dFLDdt_fld(find(isnan(dFLDdt_fld)))=0;
112    
113     %time-stepping loop:
114     FLD=fld;
115    
116     test1=0; it=0;
117     while ~test1;
118    
119     it=it+1;
120    
121     [dTdxAtU,dTdyAtV]=calc_T_grad(FLD,0);
122     tmpU=dTdxAtU.*smooth2D_Kux;
123     tmpV=dTdyAtV.*smooth2D_Kvy;
124     [fldDIV]=calc_UV_div(tmpU,tmpV);
125     dFLDdt=smooth2D_dt*fldDIV./rA;
126     dFLDdt=dFLDdt.*mskFreeze;
127     FLD=FLD-dFLDdt;
128    
129     tmp1=max(abs(dFLDdt));
130     if mod(it,10)==0; fprintf([num2str(it) ' del=' num2str(tmp1) ' eps=' num2str(eps) ' \n']); end;
131     test1=tmp1<eps;
132    
133     FLDstore{it}=dFLDdt;
134     end;
135    
136     if 1;
137     jj=1; FLDstore2=zeros([size(FLD{jj}) length(FLDstore)]);
138     for ii=1:length(FLDstore); FLDstore2(:,:,ii)=FLDstore{ii}{jj}; end;
139     tmp1=abs(FLDstore2(:,:,end)); [ii,jj]=find(tmp1==max(tmp1(:)));
140     figure; plot(cumsum(squeeze(FLDstore2(ii,jj,:))));
141     end;
142    
143    
144    

  ViewVC Help
Powered by ViewVC 1.1.22