/[MITgcm]/MITgcm_contrib/gael/matlab_class/gcmfaces_calc/gcmfaces_remap_3d.m
ViewVC logotype

Annotation of /MITgcm_contrib/gael/matlab_class/gcmfaces_calc/gcmfaces_remap_3d.m

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


Revision 1.3 - (hide annotations) (download)
Sat Mar 21 11:18:11 2015 UTC (10 years, 4 months ago) by gforget
Branch: MAIN
CVS Tags: checkpoint65x, checkpoint65r, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, HEAD
Changes since 1.2: +3 -4 lines
- introduce waitbar

1 gforget 1.2 function [fldOut]=gcmfaces_remap_3d(lon,lat,depIn,fldIn,nDblRes);
2 gforget 1.1 %object: use bin average to remap a lat-lon-depth field to mygrid.mskC
3     %input: lon,lat,dep,fld are the gridded product arrays (2D,2D,1D,3D)
4     %assumption:fld should show NaN for missing values
5    
6     gcmfaces_global;
7    
8     %initiate triangulation:
9     gcmfaces_bindata;
10    
11     %vertical levels:
12     nrIn=length(depIn);
13     depOut=-mygrid.RC;
14     nrOut=length(depOut);
15    
16 gforget 1.2 if isempty(whos('nDblRes')); nDblRes=3; end;
17    
18 gforget 1.1 %corresponding model mask: chosen to avoid vertical extrapolation later
19     % 1) from model just above
20     mskC=repmat(0*mygrid.XC,[1 1 nrIn]);
21     KK2=zeros(1,nrIn);
22     for kk=1:nrIn;
23     kk2=max(find(depOut<=depIn(kk)));%model level just above
24     if isempty(kk2); kk2=1; end;%pathological case
25     KK2(kk)=kk2;
26     mskC(:,:,kk)=mygrid.mskC(:,:,kk2);
27     end;
28     % 2) shift to above atlas level mask
29     for kk=nrIn:-1:2;
30     mskC(:,:,kk)=mskC(:,:,kk-1);%atlas level just above
31     end;
32    
33     %test vertical interpolation to mygrid.RC of the mask:
34     % => the printed result should be 0
35     if 0;
36     mskCout=atlas_interp_vert(mskC,depIn,depOut);
37     aa=convert2gcmfaces(isnan(mskCout)&~isnan(mygrid.mskC));
38     nansum(aa(:))
39     end;
40    
41     %horizontal mapping to mygrid.XC, mygrid.YC, mskC:
42     fld1=mskC;
43 gforget 1.3 wb=waitbar(0); waitbar(0,wb,'loop over vertical levels');
44 gforget 1.1 for kk=1:nrIn;
45 gforget 1.2 fld1(:,:,kk)=gcmfaces_remap_2d(lon,lat,fldIn(:,:,kk),nDblRes,mskC(:,:,kk));
46 gforget 1.3 waitbar(kk/nrIn,wb,'loop over vertical levels');
47 gforget 1.1 end;
48 gforget 1.3 close(wb);
49 gforget 1.1
50     %vertical interpolation to mygrid.RC
51     fld2=atlas_interp_vert(fld1,depIn,depOut);
52    
53    
54     %final mask handling:
55     %1) remask with mygrid.mskC (mskC was wider by design)
56     msk1=mygrid.mskC; tmp1=msk1.*fld2;
57     %2) extrapolate vertically (some deep canions may still miss data)
58     fldOut=atlas_extrap_vert(tmp1,msk1,depOut);
59    
60    
61     function [fldOut]=atlas_interp_vert(fldIn,depthIn,depthOut);
62     %vertical interpolation
63    
64     gcmfaces_global;
65    
66     nrIn=length(depthIn);
67     nrOut=length(depthOut);
68    
69     %map depthIn to depthOut:
70     coeff=interp1(depthIn,[1:nrIn],depthOut);
71     tmp1=find(isnan(coeff)); coeff(tmp1)=nrIn-0.01; %quick fix
72    
73     %vertical interpolation to mygrid.RC:
74     fldOut=repmat(0*mygrid.XC,[1 1 nrOut]);
75     for kk=1:nrOut;
76     tmp1=coeff(kk); tmp2=floor(tmp1); tmp1=tmp1-tmp2;
77     if tmp2==nrIn;
78     tmp3=fldIn(:,:,tmp2);
79     else;
80     tmp3=(1-tmp1)*fldIn(:,:,tmp2)+tmp1*fldIn(:,:,tmp2+1);
81     end;
82     fldOut(:,:,kk)=tmp3;
83     end;
84    
85     function [fldOut]=atlas_extrap_vert(fldIn,mskOut,depthIn);
86     %vertical extrapolation when needed
87    
88     fldOut=convert2array(fldIn);
89     mskOut=convert2array(mskOut);
90     nrIn=length(depthIn);
91    
92     for kk=2:nrIn;
93     tmp_kk=fldOut(:,:,kk);
94     msk_kk=mskOut(:,:,kk);
95     [II,JJ]=find(isnan(tmp_kk)&~isnan(msk_kk));
96     if ~isempty(II)&kk==2;
97     tmp_kkM1=fldOut(:,:,kk-1);
98     tmp1=find(isnan(tmp_kk)&~isnan(msk_kk)&~isnan(tmp_kkM1));
99     tmp_kk(tmp1)=tmp_kkM1(tmp1);
100     fldOut(:,:,kk)=tmp_kk;
101     elseif ~isempty(II);
102     tmp_kkM1=fldOut(:,:,kk-1);
103     tmp_kkM2=fldOut(:,:,kk-2);
104     coeff=(depthIn(kk)-depthIn(kk-1))/(depthIn(kk-1)-depthIn(kk-2));
105     tmp_kk_x=tmp_kkM1+coeff*(tmp_kkM1-tmp_kkM2);
106     tmp1=find(isnan(tmp_kk)&~isnan(msk_kk)&~isnan(tmp_kk_x));
107     tmp_kk(tmp1)=tmp_kk_x(tmp1);
108     fldOut(:,:,kk)=tmp_kk;
109     end;
110     end;
111    
112     fldOut=convert2array(fldOut);
113    

  ViewVC Help
Powered by ViewVC 1.1.22