1 |
% Script to extract a subdomain from a CS510 simulation |
2 |
% and write in netCDF format on a regular lat/lon grid (1/4) |
3 |
% SPECIAL U V FIELDS !! |
4 |
% |
5 |
clear |
6 |
global sla |
7 |
pv_checkpath |
8 |
|
9 |
|
10 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Global setup: |
11 |
% Restrict global domain to: |
12 |
subdomain = 3; % North Atlantic |
13 |
|
14 |
% Path to find input binary Cube sphere files: |
15 |
pathi = './bin_cube49'; |
16 |
|
17 |
% Path where the netcdf outputs will be stored: |
18 |
patho = './ecco2_cube49_netcdf'; |
19 |
patho = strcat(patho,sla,'monthly'); |
20 |
%patho = strcat(patho,sla,'six_hourly'); |
21 |
|
22 |
% Time step (for date conversion): |
23 |
dt = 1200; |
24 |
|
25 |
% Variables to analyse (index into otab): |
26 |
otab = cs510grid_outputs_table; % from the 1/8 latlon definition |
27 |
wvar = []; |
28 |
dimen = 3; |
29 |
switch dimen |
30 |
case 3 % 3D fields: |
31 |
wvar = [wvar 39]; % UVEL |
32 |
wvar = [wvar 47]; % VVEL |
33 |
case 2 % 2D fields: |
34 |
end %switch number of dimensions |
35 |
|
36 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Pre-process |
37 |
% Get the grid: |
38 |
path_grid = './grid'; |
39 |
XC = readrec_cs510(sprintf('%s.data',strcat(path_grid,sla,'XC')),1,'float32'); |
40 |
YC = readrec_cs510(sprintf('%s.data',strcat(path_grid,sla,'YC')),1,'float32'); |
41 |
XG = readrec_cs510(sprintf('%s.data',strcat(path_grid,sla,'XG')),1,'float32'); |
42 |
YG = readrec_cs510(sprintf('%s.data',strcat(path_grid,sla,'YG')),1,'float32'); |
43 |
dxG = readrec_cs510(sprintf('%s.data',strcat(path_grid,sla,'DXG')),1,'float32'); |
44 |
dyG = readrec_cs510(sprintf('%s.data',strcat(path_grid,sla,'DYG')),1,'float32'); |
45 |
RAC = readrec_cs510(sprintf('%s.data',strcat(path_grid,sla,'RAC')),1,'float32'); |
46 |
GRID_125; |
47 |
ZC = - [0 cumsum(thk125(1:length(thk125)-1))]; |
48 |
clear dpt125 lat125 lon125 thk125 |
49 |
|
50 |
% How to move to a lat/lon grid: |
51 |
% CS510 is about 22km average resolution, ie: 1/4 degree |
52 |
XI = -180 : 1/4 : 180; |
53 |
YI = -90 : 1/4 : 90; |
54 |
ZI = ZC; |
55 |
if ~exist('CS510_to_LATLON025.mat','file') |
56 |
del = cube2latlon_preprocess(XC,YC,XI,YI); |
57 |
save('CS510_to_LATLON025.mat','XI','YI','XC','YC','del','-v6'); |
58 |
else |
59 |
load('CS510_to_LATLON025.mat') |
60 |
end |
61 |
|
62 |
% Set subrange - Longitude given as degrees east |
63 |
% (exact values come from the 1/8 lat-lon grid) |
64 |
switch subdomain |
65 |
case 3 |
66 |
sub_name = 'north_atlantic'; |
67 |
lonmin = 276.0625; |
68 |
lonmax = 359.9375; |
69 |
latmin = 12.0975; |
70 |
latmax = 53.2011; |
71 |
depmin = 1; % !!! indices |
72 |
depmax = 29; % !!! indices |
73 |
if dimen == 3, depmax = 29; |
74 |
else, depmax = 1;end |
75 |
LIMITS = [lonmin lonmax latmin latmax depmin depmax] |
76 |
if 0 |
77 |
m_proj('mercator','long',[270 365],'lat',[0 60]); |
78 |
clf;hold on;m_coast;m_grid; |
79 |
m_line(LIMITS([1 2 2 1 1]),LIMITS([3 3 4 4 3]),'color','k','linewidth',2); |
80 |
title(sub_name); |
81 |
end %if 1/0 |
82 |
end |
83 |
|
84 |
% Get subdomain horizontal axis: |
85 |
xi = XI(max(find(XI<=LIMITS(1))):max(find(XI<=LIMITS(2)))); |
86 |
yi = YI(max(find(YI<=LIMITS(3))):max(find(YI<=LIMITS(4)))); |
87 |
zi = ZI(LIMITS(5):LIMITS(6)); |
88 |
|
89 |
filU = otab{39,1}; ifield = 39; |
90 |
filV = otab{47,1}; |
91 |
|
92 |
% %%%%%%%%%%%%%%%%%%%%%%%%%%%% |
93 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Get info over the time loop |
94 |
% Get the file list: |
95 |
fildU = filU; % Insert condition here for special files: |
96 |
lU = dir(strcat(pathi,sla,fildU)); |
97 |
fildV = filV; % Insert condition here for special files: |
98 |
lV = dir(strcat(pathi,sla,fildV)); |
99 |
|
100 |
% Get the U files list: |
101 |
it = 0; |
102 |
clear ll |
103 |
for il = 1 : size(lU,1) |
104 |
if ~lU(il).isdir & ... |
105 |
findstr(lU(il).name,strcat(filU,'.')) % is'it the file type we want ? |
106 |
it = it + 1; |
107 |
ll(it).name = lU(il).name; |
108 |
end %if |
109 |
end %for il |
110 |
% Create the timetable of U: |
111 |
for il = 1 : size(ll,2) |
112 |
filin = ll(il).name; |
113 |
% Now extract the stepnum from : %s.%10.10d.data |
114 |
ic = findstr(filin,filU)+length(filU)+1; i = 1; clear stepnum |
115 |
while filin(ic) ~= '.' |
116 |
stepnum(i) = filin(ic); i = i + 1; ic = ic + 1; |
117 |
end |
118 |
ID = str2num(stepnum); |
119 |
TIME(il,:) = datestr(datenum(1992,1,1)+ID*dt/60/60/24,'yyyymmddHHMM'); |
120 |
end |
121 |
nt = size(TIME,1); |
122 |
|
123 |
% Then we check if we have V when we have U: |
124 |
for it = 1 : nt |
125 |
snapshot = TIME(it,:); |
126 |
filUs = ll(it).name; |
127 |
filVs = strcat(filV,filUs(findstr(filUs,filU)+length(filU):end)); |
128 |
if ~exist(strcat(pathi,sla,fildV,sla,filVs),'file') |
129 |
TIME(it,:) = NaN; |
130 |
end |
131 |
end |
132 |
itt = 0; |
133 |
for it = 1 : nt |
134 |
if find(isnan(TIME(it,:))==0) |
135 |
itt = itt + 1; |
136 |
TI(itt,:) = TIME(it,:); |
137 |
end |
138 |
end |
139 |
TIME = TI; clear TI |
140 |
nt = size(TIME,1); |
141 |
|
142 |
|
143 |
% %%%%%%%%%%%%%%% |
144 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Loop over time |
145 |
for it = 1 : nt |
146 |
snapshot = TIME(it,:); |
147 |
ID = 60*60*24/dt*( datenum(snapshot,'yyyymmddHHMM') - datenum(1992,1,1) ); |
148 |
filin = ll(it).name; |
149 |
disp('') |
150 |
disp(strcat('Processing: ',num2str(ID),'//',snapshot)) |
151 |
dirout = strcat(patho,sla,TIME(it,:),sla); |
152 |
filUout = sprintf('%s.%s.nc',filU,sub_name); |
153 |
filVout = sprintf('%s.%s.nc',filV,sub_name); |
154 |
|
155 |
if ~exist(strcat(dirout,sla,filUout),'file') % File already exists ? |
156 |
|
157 |
%%%% READ FILES U AND V |
158 |
switch otab{ifield,6} |
159 |
case 4, flt = 'float32'; |
160 |
case 8, flt = 'float64'; |
161 |
end |
162 |
t0 = clock; |
163 |
for iC = 1 : 2 |
164 |
if iC == 1, fild = fildU; end |
165 |
if iC == 2, fild = fildV; filin = strcat(filV,filin(findstr(filin,filU)+length(filU):end)); end |
166 |
if findstr(filin,'.gz') % Gunzip file, special care ! |
167 |
disp('|----> Find a file with gz extension, work on uncompressed file ...') |
168 |
|
169 |
% 1: copy the filename with it path into gunzip_1_file.txt |
170 |
fid1 = fopen('gunzip_1_file.txt','w'); |
171 |
fprintf(fid1,'%s',strcat(pathi,sla,fild,sla,filin));fclose(fid1); |
172 |
|
173 |
% 2: uncompress the file into a temporary folder: |
174 |
disp('|------> uncompressing the file ...') |
175 |
! ./gunzip_1_file.bat |
176 |
disp(strcat('|--------: ',num2str(etime(t0,clock)))) |
177 |
|
178 |
% 3: Read the uncompress file: |
179 |
disp('|--> reading it ...') |
180 |
C = readrec_cs510(strcat('gunzip_1_file',sla,'tempo.data'),LIMITS(6),flt); |
181 |
disp(strcat('|----: ',num2str(etime(t0,clock)))) |
182 |
|
183 |
% 4: Suppress it |
184 |
! \rm ./gunzip_1_file/tempo.data |
185 |
|
186 |
else % Simply read the file: |
187 |
disp('|--> reading it ...') |
188 |
C = readrec_cs510(strcat(pathi,sla,fild,sla,filin),LIMITS(6),flt); |
189 |
disp(strcat('|----: ',num2str(etime(t0,clock)))) |
190 |
end |
191 |
if iC == 1, CU = C; end |
192 |
if iC == 2, CV = C; end |
193 |
end %for iC |
194 |
clear C |
195 |
|
196 |
%%%% RESTRICT TO SUBDOMAIN |
197 |
disp('|--> get subdomain ...') |
198 |
% Restrict vertical to subdomain: |
199 |
if LIMITS(5) ~= 1 |
200 |
disp('|----> vertical ...'); |
201 |
CU = CU(:,:,LIMITS(5):end); |
202 |
CV = CV(:,:,LIMITS(5):end); |
203 |
end |
204 |
% Clean the field: |
205 |
CU(find(CU==0)) = NaN; |
206 |
CV(find(CV==0)) = NaN; |
207 |
% Move the field into lat/lon grid: |
208 |
disp('|----> Move to lat/lon grid ...'); |
209 |
[CU CV] = uvcube2latlon_fast3(del,CU,CV,XG,YG,RAC,dxG,dyG); |
210 |
|
211 |
% And then restrict horizontal to subdomain: |
212 |
disp('|----> horizontal ...'); |
213 |
CU = CU(max(find(XI<=LIMITS(1))):max(find(XI<=LIMITS(2))),... |
214 |
max(find(YI<=LIMITS(3))):max(find(YI<=LIMITS(4))),:); |
215 |
CV = CV(max(find(XI<=LIMITS(1))):max(find(XI<=LIMITS(2))),... |
216 |
max(find(YI<=LIMITS(3))):max(find(YI<=LIMITS(4))),:); |
217 |
|
218 |
|
219 |
%%%% RECORD |
220 |
disp('|--> record netcdf file ...') |
221 |
|
222 |
if 1 % Realy want to record ? |
223 |
|
224 |
if ~exist(dirout,'dir') |
225 |
mkdir(dirout); |
226 |
end |
227 |
|
228 |
for iC = 1 : 2 |
229 |
if iC==1, ifield=39; C = CU; fil = filU; filout = filUout; end |
230 |
if iC==2, ifield=47; C = CV; fil = filV; filout = filVout; end |
231 |
fid1 = fopen('inprogress.txt','w'); |
232 |
fprintf(fid1,'%s',strcat(dirout,sla,filout));fclose(fid1); |
233 |
|
234 |
nc = netcdf('inprogress.nc','clobber'); |
235 |
|
236 |
nc('X') = length(xi); |
237 |
nc('Y') = length(yi); |
238 |
nc('Z') = length(zi); |
239 |
|
240 |
nc{'X'}='X'; |
241 |
nc{'Y'}='Y'; |
242 |
nc{'Z'}='Z'; |
243 |
|
244 |
nc{'X'}.uniquename='X'; |
245 |
nc{'X'}.long_name='longitude'; |
246 |
nc{'X'}.gridtype=ncint(0); |
247 |
nc{'X'}.units='degrees_east'; |
248 |
nc{'X'}(:) = xi; |
249 |
|
250 |
nc{'Y'}.uniquename='Y'; |
251 |
nc{'Y'}.long_name='latitude'; |
252 |
nc{'Y'}.gridtype=ncint(0); |
253 |
nc{'Y'}.units='degrees_north'; |
254 |
nc{'Y'}(:) = yi; |
255 |
|
256 |
nc{'Z'}.uniquename='Z'; |
257 |
nc{'Z'}.long_name='depth'; |
258 |
nc{'Z'}.gridtype=ncint(0); |
259 |
nc{'Z'}.units='m'; |
260 |
nc{'Z'}(:) = zi; |
261 |
|
262 |
ncid = fil; |
263 |
nc{ncid}={'Z' 'Y' 'X'}; |
264 |
nc{ncid}.missing_value = ncdouble(NaN); |
265 |
nc{ncid}.FillValue_ = ncdouble(0.0); |
266 |
nc{ncid}(:,:,:) = permute(C,[3 2 1]); |
267 |
nc{ncid}.units = otab{ifield,5}; |
268 |
|
269 |
close(nc); |
270 |
! ./inprogress.bat |
271 |
|
272 |
end %if 1/0 want to record ? |
273 |
disp(strcat('|--: ',num2str(etime(t0,clock)))) |
274 |
|
275 |
else |
276 |
disp(strcat('|--> Skip file (already done):',dirout,sla,filout)) |
277 |
end %if %file exist |
278 |
|
279 |
|
280 |
end %for iC |
281 |
|
282 |
end %for it |
283 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% END Loop over time |
284 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
285 |
|