/[MITgcm]/MITgcm_contrib/gael/matlab_class/gcmfaces_diags/diags_select.m
ViewVC logotype

Contents of /MITgcm_contrib/gael/matlab_class/gcmfaces_diags/diags_select.m

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


Revision 1.12 - (show annotations) (download)
Fri Dec 30 19:34:32 2016 UTC (8 years, 6 months ago) by gforget
Branch: MAIN
CVS Tags: checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66o, HEAD
Changes since 1.11: +5 -0 lines
- gcmfaces_diags/diags_select.m: set missing variables to 0 (e.g., for seaice fields in ocean only run)
- gcmfaces_diags/diags_grid_parms.m: allow parms.iceModel==0 case for ocean only run

1 function [fldsIn]=diags_select(dirModel,dirMat,setDiags,lChunk,listChunk);
2 %object: compute a set of basic diagnostics
3 %input: dirModel is the model run directory
4 % dirMat is the directory where diagnozed .mat files will be saved
5 % -> set it to '' to use the default [dirModel 'mat/']
6 % setDiags is the choice of diagnostics
7 % 'A') trasnports (see diags_set_A.m)
8 % 'B') air-sea fluxes
9 % 'C') state variables
10 % 'D') global and regional budgets
11 % 'LAYERS') T/S/RHO coordinate overturns
12 % 'user') is a placeholder for user diags additions
13 % lChunk states how many records are computed at once
14 % listChunk states which parts of the records should be
15 % computed (i0+1:i0+lChunk where i0~lTot/lChunk)
16
17 %to do: add second optional output argument for fldsOut
18
19 gcmfaces_global;
20
21 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22 %create dirModel/mat if needed:
23 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
24
25 if lChunk==0; return; end;
26
27 dirModel=[dirModel '/'];
28
29 if isempty(dirMat); dirMat=[dirModel 'mat/']; end;
30 if isempty(dir(dirMat)); mkdir(dirMat); end;
31
32 %list of subdirectories where to scan for output
33 listSubdirs={[dirMat 'BUDG/' ],[dirModel 'diags/BUDG/' ],[dirModel 'diags/OTHER/' ],...
34 [dirModel 'diags/STATE/' ],[dirModel 'diags/TRSP/'],[dirModel 'diags/' ]};
35
36 if isfield(myenv,'nctiles');
37 use_nctiles=myenv.nctiles;
38 else;
39 use_nctiles=0;
40 end;
41
42 setDiagsParams=[];
43 if iscell(setDiags);
44 setDiagsParams={setDiags{2:end}};
45 setDiags=setDiags{1};
46 end;
47
48 %%%%%%%%%%%%%%%%%%%%%%
49 %load grid and params:
50 %%%%%%%%%%%%%%%%%%%%%%
51
52 gcmfaces_global; global myparms;
53 test0=~isempty(dir([dirMat 'diags_grid_parms.mat']));
54 test1=~isempty(dir([dirMat 'basic_diags_ecco_mygrid.mat']));
55 if test0;%load mygrid and myparms from file
56 eval(['load ' dirMat 'diags_grid_parms.mat;']);
57 elseif test1;%for backward compatibility
58 eval(['load ' dirMat 'basic_diags_ecco_mygrid.mat;']);
59 else;
60 error('could not find diags_grid_parms.mat');
61 end;
62
63 test0=~isempty(dir([dirMat 'diags_select_budget_list.mat']));
64 if test0;
65 eval(['load ' dirMat 'diags_select_budget_list.mat;']);
66 else;
67 budget_list=1;
68 end;
69 myparms.budgetList=budget_list;
70
71 %in case mygrid.memoryLimit=1, load the stuff that was not saved to diags_grid_parms.mat
72 if mygrid.memoryLimit==1;
73 list0={'hFacS','hFacW'};
74 for iFld=1:length(list0);
75 eval(['mygrid.' list0{iFld} '=rdmds2gcmfaces([mygrid.dirGrid ''' list0{iFld} '*'']);']);
76 end;
77 %
78 mygrid.hFacCsurf=mygrid.hFacC;
79 for ff=1:mygrid.hFacC.nFaces; mygrid.hFacCsurf{ff}=mygrid.hFacC{ff}(:,:,1); end;
80 %
81 mskC=mygrid.hFacC; mskC(mskC==0)=NaN; mskC(mskC>0)=1; mygrid.mskC=mskC;
82 mskW=mygrid.hFacW; mskW(mskW==0)=NaN; mskW(mskW>0)=1; mygrid.mskW=mskW;
83 mskS=mygrid.hFacS; mskS(mskS==0)=NaN; mskS(mskS>0)=1; mygrid.mskS=mskS;
84 %
85 gcmfaces_lines_zonal;
86 mygrid.LATS=[mygrid.LATS_MASKS.lat]';
87 [lonPairs,latPairs,names]=gcmfaces_lines_pairs;
88 gcmfaces_lines_transp(lonPairs,latPairs,names);
89 end;
90
91 %%%%%%%%%%%%%%
92 %define diags:
93 %%%%%%%%%%%%%%
94
95 userStep=1;
96 if ~isempty(which(['diags_set_' setDiags]));
97 eval(['diags_set_' setDiags]);
98 else;
99 diags_set_user;
100 end;
101
102 %reformat listDiags to cell array:
103 jj=strfind(listDiags,' '); jj=[0 jj length(listDiags)+1];
104 for ii=1:length(jj)-1;
105 tmp1=listDiags(jj(ii)+1:jj(ii+1)-1);
106 if ii==1; listDiags2={tmp1}; else; listDiags2{ii}=tmp1; end;
107 end;
108 listDiags=listDiags2; clear listDiags2;
109
110 %%%%%%%%%%%%%%
111 %detect files:
112 %%%%%%%%%%%%%%
113
114 userStep=2;
115 if ~isempty(which(['diags_set_' setDiags]));
116 eval(['diags_set_' setDiags]);
117 else;
118 diags_set_user;
119 end;
120
121 listSubdirs={myenv.diagsdir,[dirModel 'diags/'],listSubdirs{:}};
122
123 %remove blanks in pkg/diagnostics flds name
124 listFlds=deblank(listFlds);
125 listFldsNames=deblank(listFldsNames);
126
127 %set the list of diags times
128 [listTimes]=diags_list_times(listSubdirs,listFiles);
129
130 %then scan directories (listSubdirs) for files (listFiles)
131 if ~use_nctiles;
132 for ii=1:length(listFiles);
133 tmp0='';
134 for jj=1:length(listSubdirs);
135 tmp1=listFiles{ii}; tmp2=listSubdirs{jj};
136 if ~isempty(dir([tmp2 '/' tmp1 '*meta']));
137 tmp0=[tmp2 '/' tmp1]; listFiles{ii}=tmp0;
138 end;
139 end;
140 if isempty(tmp0); fprintf([' not found: ' tmp1 '\n']); listFiles{ii}=''; end;
141 end;
142 end;
143
144 if use_nctiles;
145 for ii=1:length(listFlds);
146 tmp0=sum(strcmp(myenv.nctileslist,listFlds{ii}));
147 if tmp0==0; error([' not found: ' tmp1 '\n']); end;
148 if tmp0<1; error([' found several : ' tmp1 '\n']); end;
149 end;
150 end;
151
152 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
153 %loop over chunks
154 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
155
156 if isempty(strfind(dirMat,['diags_set_' setDiags]));
157 dirMat=[dirMat 'diags_set_' setDiags filesep];
158 if isempty(dir(dirMat)); mkdir(dirMat); end;
159 end;
160
161 for iChunk=listChunk;
162
163 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
164 %load records for computation:
165 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
166
167 lTot=length(listTimes);
168 i0=min(lChunk*(iChunk-1),lTot);
169 i1=min(i0+lChunk,lTot);
170 fldsIn=[];
171
172 tic;
173
174 if ~use_nctiles;
175 tt=listTimes([i0+1:i1])';
176 for iFile=1:length(listFiles);
177 fileFld=listFiles{iFile};
178 if ~isempty(fileFld);
179 rdmds2workspace_list(fileFld,tt,listFlds);
180 for ii=1:length(meta.fldList);
181 tmp1=deblank(meta.fldList{ii});
182 jj=find(strcmp(tmp1,listFlds));
183 if ~isempty(jj); eval(['fldsIn.' listFldsNames{jj} '=' tmp1 ';']); end;
184 eval(['clear ' tmp1]);
185 end;
186 end;
187 end;
188 end;
189
190 if use_nctiles;
191 tt=[i0+1:i1]';
192 di=myenv.nctilesdir;
193 for iFld=1:length(listFlds);
194 nm=listFlds{iFld};
195 fileIn=sprintf('%s/%s/%s',di,nm,nm);
196 fld=read_nctiles(fileIn,nm,tt);
197 eval(['fldsIn.' nm '=fld;']);
198 end;
199 end;
200
201 fprintf([num2str(i1-i0) ' records loaded in ' num2str(toc) '\n']);
202
203 %check that all fields were found, and otherwise reduce listFlds
204 listFldsIsPresent=zeros(1,length(listFldsNames));
205 for iFld=1:length(listFldsNames);
206 if ~isfield(fldsIn,listFlds{iFld});
207 fprintf([listFlds{iFld} ' is missing \n']);
208 else;
209 listFldsIsPresent(iFld)=1;
210 % fprintf([fldName ' was found \n']);
211 end;
212 end;
213 listFldsMissing={listFldsNames{find(~listFldsIsPresent)}};
214 listFldsNames={listFldsNames{find(listFldsIsPresent)}};
215 listFlds={listFlds{find(listFldsIsPresent)}};
216
217 %cut here for direct output\n');
218 if nargout==1;
219 return;
220 end;
221
222 %%%%%%%%%%%%%%%%%%%%
223 %do the computation:
224 %%%%%%%%%%%%%%%%%%%%
225 for ii=i0+1:i1;
226
227 tic;
228 tt=listTimes(ii);
229
230 %get data from buffer
231 for jj=1:length(listFldsNames);
232 if lChunk==1|length(listTimes)==1;
233 eval([listFldsNames{jj} '=fldsIn.' listFldsNames{jj} ';']);
234 else;
235 eval(['tmp1=size(fldsIn.' listFldsNames{jj} '{1});']);
236 if length(tmp1)==4; eval([listFldsNames{jj} '=fldsIn.' listFldsNames{jj} '(:,:,:,ii-i0);']);
237 else; eval([listFldsNames{jj} '=fldsIn.' listFldsNames{jj} '(:,:,ii-i0);']);
238 end;
239 end;
240 end;
241 for jj=1:length(listFldsMissing);
242 eval([listFldsMissing{jj} '=0;']);
243 end;
244
245 fprintf([num2str(ii-i0) '/' num2str(i1-i0) ' started \n']);
246
247 %generic output file name (that will potentially be overriden)
248 tmp1=setDiags;
249 fileMat=['diags_set_' tmp1 '_' num2str(tt) '.mat'];
250
251 %the actual computations
252 userStep=3;
253 if ~isempty(which(['diags_set_' setDiags]));
254 eval(['diags_set_' setDiags]);
255 else;
256 diags_set_user;
257 end;
258
259 fprintf([num2str(ii) '/' num2str(length(listTimes)) ' done in ' num2str(toc) '\n']);
260
261 %package results
262 onediag=[];
263 onediag.listTimes=myparms.yearFirst(1)+tt*myparms.timeStep/86400/365.25;
264 onediag.listSteps=tt;
265 for jj=1:length(listDiags);
266 eval(['onediag.' listDiags{jj} '=' listDiags{jj} ';']);
267 end;
268
269 %write to disk
270 diags_store_to_mat(dirMat,fileMat,onediag);
271
272 end;%for ii=i0+1:i1;
273
274 end;%for iChunk=listChunk;
275
276

  ViewVC Help
Powered by ViewVC 1.1.22