/[MITgcm]/MITgcm_contrib/gael/matlab_class/gcmfaces_IO/process2nctiles.m
ViewVC logotype

Contents of /MITgcm_contrib/gael/matlab_class/gcmfaces_IO/process2nctiles.m

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


Revision 1.12 - (show annotations) (download)
Tue Jan 20 12:01:19 2015 UTC (10 years, 5 months ago) by gforget
Branch: MAIN
CVS Tags: checkpoint65r, checkpoint65p, checkpoint65q, checkpoint65t
Changes since 1.11: +2 -2 lines
- process2nctiles.m : minor fixes
- struct2nctiles.m : output data structure to nctiles
- prep2nctiles.m : two examples using struct2nctiles.m

1 function []=process2nctiles(dirModel,fileModel,fldModel,tileSize);
2 %process2nctiles(dirModel);
3 %object : convert MITgcm binary output to netcdf files (tiled)
4 %inputs : dirModel is the MITgcm run directory
5 % It is expected to contain binaries in
6 % 'diags/STATE/', 'diags/TRSP/', etc. as well
7 % as the 'available_diagnostics.log' text file.
8 % fileModel the file name base e.g. 'state_2d_set1'
9 % By default : all variables in e.g. 'state_2d_set1*'
10 % files will be processed, and writen individually to
11 % nctiles (tiled netcdf) that will be located in 'nctiles/'
12 % fldModel (by default []) can be specified (as e.g. 'ETAN')
13 % when fldModel is empty, all fields are processed
14 % tileSize (optional) is e.g. [90 90] (by default tiles=faces)
15 %output : (netcdf files)
16
17 gcmfaces_global;
18
19 %listFiles={'state_2d_set1','state_2d_set2','state_3d_set1','state_3d_set2'};
20 %listFiles={'trsp_3d_set1','trsp_3d_set2','trsp_3d_set3'};
21 %for ff=1:length(listFiles); process2nctiles('iter12/',listFiles{ff},[],[90 90]); end;
22
23 %replace time series with monthly climatology?
24 doClim=0;
25
26 %directory names
27 listDirs={'STATE/','TRSP/'};%BUDG?
28 filAvailDiag=[dirModel 'available_diagnostics.log'];
29 filReadme=[dirModel 'README'];
30 dirOut=[dirModel 'nctiles_tmp/'];
31 if ~isdir(dirOut); mkdir(dirOut); end;
32
33 %search in subdirectories
34 subDir=[];
35 for ff=1:length(listDirs);
36 tmp1=dir([dirModel 'diags/' listDirs{ff} fileModel '*']);
37 if ~isempty(tmp1); subDir=listDirs{ff}; end;
38 end;
39
40 if isempty(subDir);
41 error(['file ' fileModel ' was not found']);
42 else;
43 dirIn=[dirModel 'diags/' subDir];
44 nn=length(dir([dirIn fileModel '*data']));
45 fprintf('%s (%d files) was found in \n %s \n',fileModel,nn,dirIn);
46 end;
47
48 %set list of variables to process
49 if ~isempty(fldModel);
50 if ischar(fldModel); listFlds={fldModel};
51 else; listFlds=fldModel;
52 end;
53 else;
54 meta=read_meta([dirIn fileModel '*']);
55 listFlds=meta.fldList;
56 end;
57
58 %determine map of tile indices (by default tiles=faces)
59 if isempty(whos('tileSize'));
60 tileNo=mygrid.XC;
61 for ff=1:mygrid.nFaces; tileNo{ff}(:)=ff; end;
62 else;
63 tileNo=gcmfaces_loc_tile(tileSize(1),tileSize(2));
64 end;
65
66 %now do the actual processing
67 for vv=1:length(listFlds);
68 nameDiag=deblank(listFlds{vv})
69
70 %get meta information
71 meta=read_meta([dirIn fileModel '*']);
72 irec=find(strcmp(deblank(meta.fldList),nameDiag));
73 if length(irec)~=1; error('field not in file\n'); end;
74
75 %read time series
76 myDiag=rdmds2gcmfaces([dirIn fileModel '*'],NaN,'rec',irec);
77
78 %replace time series with monthly climatology
79 if doClim; myDiag=compClim(myDiag); end;
80
81 %set ancilliary time variable
82 nn=length(size(myDiag{1}));
83 nn=size(myDiag{1},nn);
84 %tim=[1:nn];
85 tim=[1992*ones(nn,1) [1:nn]' 15*ones(nn,1)];
86 tim=datenum(tim)-datenum([1992 1 0]);
87 timUnits='days since 1992-1-1 0:0:0';
88
89 %get time step axis
90 [listTimes]=diags_list_times({dirIn},{fileModel});
91
92 %get units and long name from available_diagnostics.log
93 [avail_diag]=read_avail_diag(filAvailDiag,nameDiag);
94
95 %get description of estimate from README
96 [rdm]=read_readme(filReadme);
97 disp(rdm');
98
99 %set output directory/file name
100 myFile=[dirOut nameDiag];%first instance is for subdirectory name
101 if ~isdir(myFile); mkdir(myFile); end;
102 myFile=[myFile filesep nameDiag];%second instance is for file name base
103
104 %get grid params
105 [grid_diag]=set_grid_diag(avail_diag);
106
107 %apply mask, and convert to land mask
108 msk=grid_diag.msk;
109 if length(size(myDiag{1}))==3;
110 msk=repmat(msk(:,:,1),[1 1 size(myDiag{1},3)]);
111 end;
112 for kk=1:size(myDiag{1},4);
113 myDiag(:,:,:,kk)=myDiag(:,:,:,kk).*msk;
114 end;
115 clear msk;
116 %
117 land=isnan(grid_diag.msk);
118
119 %set 'coord' attribute
120 if avail_diag.nr~=1;
121 coord='lon lat dep tim';
122 else;
123 coord='lon lat tim';
124 end;
125
126 %replace time series with monthly climatology
127 if doClim;
128 listTimes=listTimes(1:12);
129 timUnits='days since year-1-1 0:0:0';
130 avail_diag.longNameDiag=[avail_diag.longNameDiag ' (climatology) '];
131 end;
132
133 %create netcdf file using write2nctiles
134 doCreate=1;
135 dimlist=write2nctiles(myFile,myDiag,doCreate,{'tileNo',tileNo},...
136 {'fldName',nameDiag},{'longName',avail_diag.longNameDiag},...
137 {'units',avail_diag.units},{'descr',nameDiag},{'coord',coord},{'rdm',rdm});
138
139 %determine relevant dimensions
140 for ff=1:length(dimlist);
141 dim.tim{ff}={dimlist{ff}{1}};
142 dim.twoD{ff}={dimlist{ff}{end-1:end}};
143 if avail_diag.nr~=1;
144 dim.threeD{ff}={dimlist{ff}{end-2:end}};
145 dim.dep{ff}={dimlist{ff}{end-2}};
146 else;
147 dim.threeD{ff}=dim.twoD{ff};
148 dim.dep{ff}=[];
149 end;
150 end;
151
152 %prepare to add fields
153 doCreate=0;
154
155 %now add fields
156 write2nctiles(myFile,tim,doCreate,{'tileNo',tileNo},...
157 {'fldName','tim'},{'longName','time'},...
158 {'units',timUnits},{'dimIn',dim.tim});
159 write2nctiles(myFile,listTimes,doCreate,{'tileNo',tileNo},...
160 {'fldName','step'},{'longName','final time step number'},...
161 {'units','1'},{'dimIn',dim.tim});
162 write2nctiles(myFile,grid_diag.lon,doCreate,{'tileNo',tileNo},...
163 {'fldName','lon'},{'units','degrees_east'},{'dimIn',dim.twoD});
164 write2nctiles(myFile,grid_diag.lat,doCreate,{'tileNo',tileNo},...
165 {'fldName','lat'},{'units','degrees_north'},{'dimIn',dim.twoD});
166 write2nctiles(myFile,grid_diag.msk,doCreate,{'tileNo',tileNo},...
167 {'fldName','land'},{'units','1'},{'longName','land mask'},{'dimIn',dim.threeD});
168 write2nctiles(myFile,grid_diag.RAC,doCreate,{'tileNo',tileNo},...
169 {'fldName','area'},{'units','m^2'},{'longName','grid cell area'},{'dimIn',dim.twoD});
170 if isfield(grid_diag,'dep');
171 write2nctiles(myFile,grid_diag.dep,doCreate,{'tileNo',tileNo},...
172 {'fldName','dep'},{'units','m'},{'dimIn',dim.dep});
173 write2nctiles(myFile,grid_diag.dz,doCreate,{'tileNo',tileNo},...
174 {'fldName','thic'},{'units','m'},{'dimIn',dim.dep});
175 end;
176
177 end;%for vv=1:length(listFlds);
178
179 function [meta]=read_meta(fileName);
180
181 %read meta file
182 tmp1=dir([fileName '*.meta']); tmp1=tmp1(1).name;
183 tmp2=strfind(fileName,filesep);
184 if ~isempty(tmp2); tmp2=tmp2(end); else; tmp2=0; end;
185 tmp1=[fileName(1:tmp2) tmp1]; fid=fopen(tmp1);
186 while 1;
187 tline = fgetl(fid);
188 if ~ischar(tline), break, end
189 if isempty(whos('tmp3')); tmp3=tline; else; tmp3=[tmp3 ' ' tline]; end;
190 end
191 fclose(fid);
192
193 %add meta variables to workspace
194 eval(tmp3);
195
196 %reformat to meta structure
197 meta.dataprec=dataprec;
198 meta.nDims=nDims;
199 meta.nFlds=nFlds;
200 meta.nrecords=nrecords;
201 meta.fldList=fldList;
202 meta.dimList=dimList;
203 if ~isempty(who('timeInterval')); meta.timeInterval=timeInterval; end;
204 if ~isempty(who('timeStepNumber')); meta.timeStepNumber=timeStepNumber; end;
205
206 %%
207
208 function [rdm]=read_readme(filReadme);
209
210 gcmfaces_global;
211
212 rdm=[];
213
214 fid=fopen(filReadme,'rt');
215 while ~feof(fid);
216 nn=length(rdm);
217 rdm{nn+1} = fgetl(fid);
218 end;
219 fclose(fid);
220
221 %%
222
223 function [avail_diag]=read_avail_diag(filAvailDiag,nameDiag);
224
225 gcmfaces_global;
226
227 avail_diag=[];
228
229 fid=fopen(filAvailDiag,'rt');
230 while ~feof(fid);
231 tline = fgetl(fid);
232 tmp1=8-length(nameDiag); tmp1=repmat(' ',[1 tmp1]);
233 tname = ['|' sprintf('%s',nameDiag) tmp1 '|'];
234 if ~isempty(strfind(tline,tname));
235 %e.g. tline=' 235 |SIatmQnt| 1 | |SM U1|W/m^2 |Net atmospheric heat flux, >0 decreases theta';
236 %
237 tmp1=strfind(tline,'|'); tmp1=tmp1(end-1:end);
238 avail_diag.units=strtrim(tline(tmp1(1)+1:tmp1(2)-1));
239 avail_diag.longNameDiag=tline(tmp1(2)+1:end);
240 %
241 tmp1=strfind(tline,'|'); tmp1=tmp1(4:5);
242 pars=tline(tmp1(1)+1:tmp1(2)-1);
243 %
244 if strcmp(pars(2),'M'); avail_diag.loc_h='C';
245 elseif strcmp(pars(2),'U'); avail_diag.loc_h='W';
246 elseif strcmp(pars(2),'V'); avail_diag.loc_h='S';
247 end;
248 %
249 avail_diag.loc_z=pars(9);
250 %
251 if strcmp(pars(10),'1'); avail_diag.nr=1;
252 else; avail_diag.nr=length(mygrid.RC);
253 end;
254 end;
255 end;
256 fclose(fid);
257
258 %%
259
260 function [grid_diag]=set_grid_diag(avail_diag);
261
262 gcmfaces_global;
263
264 %switch for non-tracer point values
265 if strcmp(avail_diag.loc_h,'C');
266 grid_diag.lon=mygrid.XC;
267 grid_diag.lat=mygrid.YC;
268 grid_diag.msk=mygrid.mskC(:,:,1:avail_diag.nr);
269 elseif strcmp(avail_diag.loc_h,'W');
270 grid_diag.lon=mygrid.XG;
271 grid_diag.lat=mygrid.YC;
272 grid_diag.msk=mygrid.mskW(:,:,1:avail_diag.nr);
273 elseif strcmp(avail_diag.loc_h,'S');
274 grid_diag.lon=mygrid.XC;
275 grid_diag.lat=mygrid.YG;
276 grid_diag.msk=mygrid.mskS(:,:,1:avail_diag.nr);
277 end;
278 grid_diag.RAC=mygrid.RAC;
279
280 %vertical grid
281 if avail_diag.nr~=1;
282 if strcmp(avail_diag.loc_z,'M');
283 grid_diag.dep=-mygrid.RC;
284 grid_diag.dz=mygrid.DRF;
285 elseif strcmp(avail_diag.loc_z,'L');
286 grid_diag.dep=-mygrid.RF(2:end);
287 grid_diag.dz=[mygrid.DRC(2:end) ; 228.25];%quick fix
288 else;
289 error('unknown vertical grid');
290 end;
291 grid_diag.dep=reshape(grid_diag.dep,[1 1 avail_diag.nr]);
292 grid_diag.dz=reshape(grid_diag.dz,[1 1 avail_diag.nr]);
293 end;
294
295 %%replace time series with monthly climatology
296 function [FLD]=compClim(fld);
297
298 gcmfaces_global;
299
300 ndim=length(size(fld{1}));
301 nyear=size(fld{1},ndim)/12;
302
303 if ndim==3; FLD=NaN*fld(:,:,1:12); end;
304 if ndim==4; FLD=NaN*fld(:,:,:,1:12); end;
305
306 for mm=1:12;
307 if ndim==3; FLD(:,:,mm)=mean(fld(:,:,mm:12:12*nyear),ndim); end;
308 if ndim==4; FLD(:,:,:,mm)=mean(fld(:,:,:,mm:12:12*nyear),ndim); end;
309 end;
310

  ViewVC Help
Powered by ViewVC 1.1.22