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

Annotation 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 - (hide 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 gforget 1.8 function [fldsIn]=diags_select(dirModel,dirMat,setDiags,lChunk,listChunk);
2 gforget 1.1 %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 gforget 1.3 % listChunk states which parts of the records should be
15 gforget 1.1 % computed (i0+1:i0+lChunk where i0~lTot/lChunk)
16    
17 gforget 1.8 %to do: add second optional output argument for fldsOut
18    
19 gforget 1.5 gcmfaces_global;
20    
21 gforget 1.1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22     %create dirModel/mat if needed:
23     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
24    
25 gforget 1.3 if lChunk==0; return; end;
26    
27 gforget 1.1 dirModel=[dirModel '/'];
28    
29     if isempty(dirMat); dirMat=[dirModel 'mat/']; end;
30 gforget 1.6 if isempty(dir(dirMat)); mkdir(dirMat); end;
31 gforget 1.1
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 gforget 1.5 if isfield(myenv,'nctiles');
37 gforget 1.7 use_nctiles=myenv.nctiles;
38 gforget 1.5 else;
39 gforget 1.7 use_nctiles=0;
40 gforget 1.5 end;
41    
42 gforget 1.1 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 gforget 1.9 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 gforget 1.2 %in case mygrid.memoryLimit=1, load the stuff that was not saved to diags_grid_parms.mat
72     if mygrid.memoryLimit==1;
73 gforget 1.7 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 gforget 1.10 [lonPairs,latPairs,names]=gcmfaces_lines_pairs;
88 gforget 1.7 gcmfaces_lines_transp(lonPairs,latPairs,names);
89 gforget 1.2 end;
90    
91 gforget 1.1 %%%%%%%%%%%%%%
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 gforget 1.11 listSubdirs={myenv.diagsdir,[dirModel 'diags/'],listSubdirs{:}};
122 gforget 1.9
123 gforget 1.1 %remove blanks in pkg/diagnostics flds name
124 gforget 1.7 listFlds=deblank(listFlds);
125 gforget 1.1 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 gforget 1.5 if ~use_nctiles;
132 gforget 1.7 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 gforget 1.1 end;
140 gforget 1.7 if isempty(tmp0); fprintf([' not found: ' tmp1 '\n']); listFiles{ii}=''; end;
141 gforget 1.1 end;
142 gforget 1.5 end;
143    
144     if use_nctiles;
145 gforget 1.7 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 gforget 1.5 end;
151 gforget 1.1
152     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
153 gforget 1.3 %loop over chunks
154     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
155    
156 gforget 1.9 if isempty(strfind(dirMat,['diags_set_' setDiags]));
157     dirMat=[dirMat 'diags_set_' setDiags filesep];
158     if isempty(dir(dirMat)); mkdir(dirMat); end;
159 gforget 1.4 end;
160    
161 gforget 1.3 for iChunk=listChunk;
162 gforget 1.7
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 gforget 1.8 fldsIn=[];
171 gforget 1.7
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 gforget 1.8 if ~isempty(jj); eval(['fldsIn.' listFldsNames{jj} '=' tmp1 ';']); end;
184 gforget 1.7 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 gforget 1.8 eval(['fldsIn.' nm '=fld;']);
198 gforget 1.1 end;
199     end;
200    
201 gforget 1.7 fprintf([num2str(i1-i0) ' records loaded in ' num2str(toc) '\n']);
202 gforget 1.1
203 gforget 1.7 %check that all fields were found, and otherwise reduce listFlds
204     listFldsIsPresent=zeros(1,length(listFldsNames));
205     for iFld=1:length(listFldsNames);
206 gforget 1.8 if ~isfield(fldsIn,listFlds{iFld});
207     fprintf([listFlds{iFld} ' is missing \n']);
208 gforget 1.1 else;
209 gforget 1.7 listFldsIsPresent(iFld)=1;
210     % fprintf([fldName ' was found \n']);
211     end;
212     end;
213 gforget 1.12 listFldsMissing={listFldsNames{find(~listFldsIsPresent)}};
214 gforget 1.7 listFldsNames={listFldsNames{find(listFldsIsPresent)}};
215     listFlds={listFlds{find(listFldsIsPresent)}};
216    
217 gforget 1.8 %cut here for direct output\n');
218     if nargout==1;
219     return;
220     end;
221    
222 gforget 1.7 %%%%%%%%%%%%%%%%%%%%
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 gforget 1.8 eval([listFldsNames{jj} '=fldsIn.' listFldsNames{jj} ';']);
234 gforget 1.7 else;
235 gforget 1.8 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 gforget 1.7 end;
239 gforget 1.1 end;
240     end;
241 gforget 1.12 for jj=1:length(listFldsMissing);
242     eval([listFldsMissing{jj} '=0;']);
243     end;
244    
245 gforget 1.7 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 gforget 1.1
274 gforget 1.3 end;%for iChunk=listChunk;
275 gforget 1.1
276    

  ViewVC Help
Powered by ViewVC 1.1.22