/[MITgcm]/MITgcm_contrib/mlosch/interp_llc/latlongrid.m
ViewVC logotype

Contents of /MITgcm_contrib/mlosch/interp_llc/latlongrid.m

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


Revision 1.1 - (show annotations) (download)
Thu May 3 21:07:21 2007 UTC (18 years, 2 months ago) by mlosch
Branch: MAIN
CVS Tags: HEAD
initial checkin of topography and hydrography interpolation scripts for
the llc-grid, based on old matlab scripts by Alistair Adcroft
Let's hope, they are useful.

1 % latlongrid.m creates the model grid and stores the grid information
2 % various arrays. Nominally set are:
3 % xc, yc, xg, yg, [2d]
4 % surface area of grid-cell on sphere (zA) [2d]
5 %
6 % It also stores the above information in a MATLAB file GRID.mat
7 % usage:
8 % load GRID.mat (loads everything above)
9 % load GRID.mat nxc nyc xc yc (loads just these variables/arrays)
10 %
11 % Uses data files: n/a
12 % Creates data files: GRID.mat
13 % Creates arrays: xc,yc,xg,yg,xcf,ycf,zA
14
15 load DATAPATH
16
17 periodic=1;
18
19 % read grid data
20 vnms = { 'XC' 'YC' 'XG' 'YG' 'rA'};
21 d2r = pi/180.0;
22 ginfo = {};
23 for k = 1:5
24 nc = netcdf(fullfile(gridpath,sprintf(fnamepattern,k)),'nowrite');
25 for j = 1:length(vnms)
26 eval(sprintf('ginfo(k).%s = nc{''%s''}(:);',vnms{j},vnms{j}));
27 end
28 nc = close(nc);
29 end
30
31 % assemble grid
32 xc = [ginfo(1).XC;ginfo(2).XC;ginfo(4).XC(end:-1:1,:)'; ...
33 ginfo(5).XC(end:-1:1,:)'];
34 yc = [ginfo(1).YC;ginfo(2).YC;ginfo(4).YC(end:-1:1,:)'; ...
35 ginfo(5).YC(end:-1:1,:)'];
36 xg = [ginfo(1).XG(1:end-1,:);ginfo(2).XG(1:end-1,:); ...
37 ginfo(4).XG(end:-1:1,1:end-1)';ginfo(5).XG(end:-1:1,:)'];
38 yg = [ginfo(1).YG(1:end-1,:);ginfo(2).YG(1:end-1,:); ...
39 ginfo(4).YG(end:-1:1,1:end-1)';ginfo(5).YG(end:-1:1,:)'];
40 zA = [ginfo(1).rA;ginfo(2).rA;ginfo(4).rA(end:-1:1,:)'; ...
41 ginfo(5).rA(end:-1:1,:)'];
42
43 % transform longitudes:
44 i1 = find(xc<0); xc(i1) = xc(i1) + 360;
45 i1 = find(xg<0); xg(i1) = xg(i1) + 360;
46 warning('remember the hack for xg');
47 xg(end,:) = 360; xg(1,:) = 0;
48
49 % do the rotation now for the side faces
50 xc = xc+s_lon;
51 xg = xg+s_lon;
52 yc = yc+s_lat;
53 yg = yg+s_lat;
54
55 disp( sprintf('# of recursive levels = %i',nfinepow) );
56
57 % Create fine grid for interpolation computations
58 nfine=2^nfinepow;
59
60 % first for the cap (remember the rotation)
61 xc3 = ginfo(3).XC+s_lon;
62 yc3 = ginfo(3).YC+s_lat;
63 xg3 = ginfo(3).XG+s_lon;
64 yg3 = ginfo(3).YG+s_lat;
65
66 clear xcf3 ycf3
67 xcf = zeros(size(xc3)*nfine);
68 ycf = zeros(size(yc3)*nfine);
69 xfine = [0.5:1:nfine]/nfine;
70 disp('generating fine grid')
71 % we need special treatment of the polar caps!
72 % $$$ xg1 = xg3; i1 = find(xg1<0); xg1(i1) = xg1(i1) + 360;
73 % $$$ i1 = find(xg1>=270); xg1(i1) = NaN;
74 % $$$ xg2 = xg3; i2 = find(xg2>=90); xg2(i2) = NaN;
75 for ix = 1:size(xc3,1)
76 for iy = 1:size(yc3,2)
77 xxg1 = xg3(ix:ix+1,iy:iy+1);
78 if ~isempty(find(xxg1(:) >= 100)) & ~isempty(find(xxg1(:) < 100))
79 i1 = find(xxg1(:) < 0); xxg1(i1) = xxg1(i1)+360;
80 end
81 xx = interp2([0 1],[0 1],xxg1',xfine,xfine')';
82 xcf3((ix-1)*nfine+1:ix*nfine,(iy-1)*nfine+1:iy*nfine) = xx;
83 yy = interp2([0 1],[0 1],yg3(ix:ix+1,iy:iy+1)',xfine,xfine')';
84 ycf3((ix-1)*nfine+1:ix*nfine,(iy-1)*nfine+1:iy*nfine) = yy;
85 end
86 end
87
88 xcf30{1}=xcf3;
89 for k=2:4
90 xcf30{k}=xcf30{k-1};
91 ii = find(xcf30{k}< (k-3)*90);
92 xcf30{k}(ii) = xcf30{k}(ii) + 360;
93 end
94
95 xcf3 = [rot90(xcf30{1});xcf30{2};rot90(xcf30{3},3);rot90(xcf30{4},2)];
96 ycf3 = [rot90(ycf3);ycf3;rot90(rot90(rot90(ycf3)));rot90(rot90(ycf3))];
97 %i1 = find(xcf3<0); xcf3(i1) = xcf3(i1) + 360;
98
99
100 xcf = zeros(size(xc)*nfine);
101 ycf = zeros(size(yc)*nfine);
102 xfine = [0.5:1:nfine]/nfine;
103 for ix = 1:size(xc,1)
104 for iy = 1:size(yc,2)
105 xx = interp2([0 1],[0 1],xg(ix:ix+1,iy:iy+1)',xfine,xfine')';
106 xcf((ix-1)*nfine+1:ix*nfine,(iy-1)*nfine+1:iy*nfine) = xx;
107 yy = interp2([0 1],[0 1],yg(ix:ix+1,iy:iy+1)',xfine,xfine')';
108 ycf((ix-1)*nfine+1:ix*nfine,(iy-1)*nfine+1:iy*nfine) = yy;
109 end
110 end
111
112 xcf = [xcf xcf3];
113 ycf = [ycf ycf3];
114
115 save HFGRID.mat xcf ycf nfinepow
116
117 disp( sprintf('Fine grid: %ix%i',size(xcf,1),size(ycf,2) ));
118 %disp( sprintf('Fine grid res.: %gx%g',[min(dlonf(:)) min(dlatf(:))]) );
119
120 % now create the "cap" for the coarse grid
121 xc3 = ginfo(3).XC;
122 xc3 = [rot90(xc3);xc3;rot90(rot90(rot90(xc3)));rot90(rot90(xc3))];
123 yc3 = ginfo(3).YC;
124 yc3 = [rot90(yc3);yc3;rot90(rot90(rot90(yc3)));rot90(rot90(yc3))];
125 xg3 = ginfo(3).XG;
126 xg3 = [rot90(xg3(:,1:end-1));xg3(1:end-1,:);rot90(rot90(rot90(xg3(:,2:end))));rot90(rot90(xg3))];
127 yg3 = ginfo(3).YG;
128 yg3 = [rot90(yg3(:,1:end-1));yg3(1:end-1,:);rot90(rot90(rot90(yg3(:,2:end))));rot90(rot90(yg3))];
129 zA3 = ginfo(3).rA;
130 zA3 = [rot90(zA3);zA3;rot90(rot90(rot90(zA3)));rot90(rot90(zA3))];
131
132 i1 = find(xc3<0); xc3(i1) = xc3(i1) + 360;
133 i1 = find(xg3<0); xg3(i1) = xg3(i1) + 360;
134
135 % assemble
136 xc = [xc xc3+s_lon];
137 yc = [yc yc3+s_lat];
138 xg = [xg xg3+s_lon];
139 yg = [yg yg3+s_lat];
140 zA = [zA zA3];
141
142 nxc=size(xc,1);
143 disp([sprintf('nxc = %i factors(nxc)=',nxc) sprintf(' %i',factor(nxc))]);
144 nyc=size(yc,2);
145 disp([sprintf('nyc = %i factors(nyc)=',nyc) sprintf(' %i',factor(nyc))]);
146
147 lon_lo=round(min(xg(:)));
148 lon_L=round(max(xg(:)))-lon_lo;
149 lat_lo=round(min(yg(:)));
150 lat_L=round(max(yg(:)))-lat_lo;
151 lon_hi=lon_lo+lon_L;
152 lat_hi=lat_lo+lat_L;
153
154 xu=(xg(:,1:end-1)+xg(:,2:end))/2;
155 yu=(yg(:,1:end-1)+yg(:,2:end))/2;
156 xv=(xg(1:end-1,:)+xg(2:end,:))/2;
157 yv=(yg(1:end-1,:)+yg(2:end,:))/2;
158
159 disp( sprintf('[lon_lo lon hi lat_lo lat_hi] = %f %f %f %f',[lon_lo lon_hi lat_lo lat_hi]));
160 disp( sprintf('Periodic = %i',periodic) );
161
162 % Structure
163 GRID.xc=xc;
164 GRID.yc=yc;
165 GRID.xg=xg;
166 GRID.yg=yg;
167 GRID.rac=zA;
168
169 % Store data in HGRID.mat
170 nt=1;
171 save HGRID.mat nxc nyc nt xc yc xu yu xv yv xg yg zA ...
172 lon_lo lon_hi lat_lo lat_hi periodic GRID
173

  ViewVC Help
Powered by ViewVC 1.1.22