1 |
gforget |
1.3 |
function []=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 |
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
18 |
|
|
%create dirModel/mat if needed: |
19 |
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
20 |
|
|
|
21 |
gforget |
1.3 |
if lChunk==0; return; end; |
22 |
|
|
|
23 |
gforget |
1.1 |
dirModel=[dirModel '/']; |
24 |
|
|
|
25 |
|
|
if isempty(dirMat); dirMat=[dirModel 'mat/']; end; |
26 |
|
|
if isempty(dir(dirMat)); eval(['!mkdir ' dirMat ';']); end; |
27 |
|
|
|
28 |
|
|
%list of subdirectories where to scan for output |
29 |
|
|
listSubdirs={[dirMat 'BUDG/' ],[dirModel 'diags/BUDG/' ],[dirModel 'diags/OTHER/' ],... |
30 |
|
|
[dirModel 'diags/STATE/' ],[dirModel 'diags/TRSP/'],[dirModel 'diags/' ]}; |
31 |
|
|
|
32 |
|
|
setDiagsParams=[]; |
33 |
|
|
if iscell(setDiags); |
34 |
|
|
setDiagsParams={setDiags{2:end}}; |
35 |
|
|
setDiags=setDiags{1}; |
36 |
|
|
end; |
37 |
|
|
|
38 |
|
|
%%%%%%%%%%%%%%%%%%%%%% |
39 |
|
|
%load grid and params: |
40 |
|
|
%%%%%%%%%%%%%%%%%%%%%% |
41 |
|
|
|
42 |
|
|
gcmfaces_global; global myparms; |
43 |
|
|
test0=~isempty(dir([dirMat 'diags_grid_parms.mat'])); |
44 |
|
|
test1=~isempty(dir([dirMat 'basic_diags_ecco_mygrid.mat'])); |
45 |
|
|
if test0;%load mygrid and myparms from file |
46 |
|
|
eval(['load ' dirMat 'diags_grid_parms.mat;']); |
47 |
|
|
elseif test1;%for backward compatibility |
48 |
|
|
eval(['load ' dirMat 'basic_diags_ecco_mygrid.mat;']); |
49 |
|
|
else; |
50 |
|
|
error('could not find diags_grid_parms.mat'); |
51 |
|
|
end; |
52 |
|
|
|
53 |
gforget |
1.2 |
%in case mygrid.memoryLimit=1, load the stuff that was not saved to diags_grid_parms.mat |
54 |
|
|
if mygrid.memoryLimit==1; |
55 |
|
|
list0={'hFacS','hFacW'}; |
56 |
|
|
for iFld=1:length(list0); |
57 |
|
|
eval(['mygrid.' list0{iFld} '=rdmds2gcmfaces([mygrid.dirGrid ''' list0{iFld} '*'']);']); |
58 |
|
|
end; |
59 |
|
|
% |
60 |
|
|
mygrid.hFacCsurf=mygrid.hFacC; |
61 |
|
|
for ff=1:mygrid.hFacC.nFaces; mygrid.hFacCsurf{ff}=mygrid.hFacC{ff}(:,:,1); end; |
62 |
|
|
% |
63 |
|
|
mskC=mygrid.hFacC; mskC(mskC==0)=NaN; mskC(mskC>0)=1; mygrid.mskC=mskC; |
64 |
|
|
mskW=mygrid.hFacW; mskW(mskW==0)=NaN; mskW(mskW>0)=1; mygrid.mskW=mskW; |
65 |
|
|
mskS=mygrid.hFacS; mskS(mskS==0)=NaN; mskS(mskS>0)=1; mygrid.mskS=mskS; |
66 |
|
|
% |
67 |
|
|
gcmfaces_lines_zonal; |
68 |
|
|
mygrid.LATS=[mygrid.LATS_MASKS.lat]'; |
69 |
|
|
[lonPairs,latPairs,names]=line_greatC_TUV_MASKS_v4; |
70 |
|
|
gcmfaces_lines_transp(lonPairs,latPairs,names); |
71 |
|
|
end; |
72 |
|
|
|
73 |
gforget |
1.1 |
%%%%%%%%%%%%%% |
74 |
|
|
%define diags: |
75 |
|
|
%%%%%%%%%%%%%% |
76 |
|
|
|
77 |
|
|
userStep=1; |
78 |
|
|
if ~isempty(which(['diags_set_' setDiags])); |
79 |
|
|
eval(['diags_set_' setDiags]); |
80 |
|
|
else; |
81 |
|
|
diags_set_user; |
82 |
|
|
end; |
83 |
|
|
|
84 |
|
|
%reformat listDiags to cell array: |
85 |
|
|
jj=strfind(listDiags,' '); jj=[0 jj length(listDiags)+1]; |
86 |
|
|
for ii=1:length(jj)-1; |
87 |
|
|
tmp1=listDiags(jj(ii)+1:jj(ii+1)-1); |
88 |
|
|
if ii==1; listDiags2={tmp1}; else; listDiags2{ii}=tmp1; end; |
89 |
|
|
end; |
90 |
|
|
listDiags=listDiags2; clear listDiags2; |
91 |
|
|
|
92 |
|
|
%%%%%%%%%%%%%% |
93 |
|
|
%detect files: |
94 |
|
|
%%%%%%%%%%%%%% |
95 |
|
|
|
96 |
|
|
userStep=2; |
97 |
|
|
if ~isempty(which(['diags_set_' setDiags])); |
98 |
|
|
eval(['diags_set_' setDiags]); |
99 |
|
|
else; |
100 |
|
|
diags_set_user; |
101 |
|
|
end; |
102 |
|
|
|
103 |
|
|
%remove blanks in pkg/diagnostics flds name |
104 |
|
|
listFlds=deblank(listFlds); |
105 |
|
|
listFldsNames=deblank(listFldsNames); |
106 |
|
|
|
107 |
|
|
%set the list of diags times |
108 |
|
|
[listTimes]=diags_list_times(listSubdirs,listFiles); |
109 |
|
|
|
110 |
|
|
%then scan directories (listSubdirs) for files (listFiles) |
111 |
|
|
for ii=1:length(listFiles); |
112 |
|
|
tmp0=''; |
113 |
|
|
for jj=1:length(listSubdirs); |
114 |
|
|
tmp1=listFiles{ii}; tmp2=listSubdirs{jj}; |
115 |
|
|
if ~isempty(dir([tmp2 '/' tmp1 '*meta'])); |
116 |
|
|
tmp0=[tmp2 '/' tmp1]; listFiles{ii}=tmp0; |
117 |
|
|
end; |
118 |
|
|
end; |
119 |
|
|
if isempty(tmp0); fprintf([' not found: ' tmp1 '\n']); listFiles{ii}=''; end; |
120 |
|
|
end; |
121 |
|
|
|
122 |
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
123 |
gforget |
1.3 |
%loop over chunks |
124 |
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
125 |
|
|
|
126 |
gforget |
1.4 |
if isdir([dirMat 'diags_set_' setDiags]); |
127 |
|
|
dirMat=[dirMat 'diags_set_' setDiags '/']; |
128 |
|
|
end; |
129 |
|
|
|
130 |
gforget |
1.3 |
for iChunk=listChunk; |
131 |
|
|
|
132 |
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
133 |
gforget |
1.1 |
%load records for computation: |
134 |
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
135 |
|
|
|
136 |
|
|
lTot=length(listTimes); |
137 |
|
|
i0=min(lChunk*(iChunk-1),lTot); |
138 |
|
|
i1=min(i0+lChunk,lTot); |
139 |
|
|
|
140 |
|
|
tic; |
141 |
|
|
tt=listTimes([i0+1:i1])'; |
142 |
|
|
for iFile=1:length(listFiles); |
143 |
|
|
fileFld=listFiles{iFile}; |
144 |
|
|
if ~isempty(fileFld); |
145 |
|
|
rdmds2workspace_list(fileFld,tt,listFlds); |
146 |
|
|
for ii=1:length(meta.fldList); |
147 |
|
|
tmp1=deblank(meta.fldList{ii}); |
148 |
|
|
jj=find(strcmp(tmp1,listFlds)); |
149 |
|
|
if ~isempty(jj); eval(['all_' listFldsNames{jj} '=' tmp1 ';']); end; |
150 |
|
|
eval(['clear ' tmp1]); |
151 |
|
|
end; |
152 |
|
|
end; |
153 |
|
|
end; |
154 |
|
|
fprintf([num2str(i1-i0) ' records loaded in ' num2str(toc) '\n']); |
155 |
|
|
|
156 |
|
|
%check that all fields were found, and otherwise reduce listFlds |
157 |
|
|
listFldsIsPresent=zeros(1,length(listFldsNames)); |
158 |
|
|
for iFld=1:length(listFldsNames); |
159 |
|
|
fldName=['all_' listFldsNames{iFld}]; |
160 |
|
|
if isempty(who(fldName)); |
161 |
|
|
fprintf([fldName ' is missing \n']); |
162 |
|
|
else; |
163 |
|
|
listFldsIsPresent(iFld)=1; |
164 |
|
|
% fprintf([fldName ' was found \n']); |
165 |
|
|
end; |
166 |
|
|
end; |
167 |
|
|
listFldsNames={listFldsNames{find(listFldsIsPresent)}}; |
168 |
|
|
listFlds={listFlds{find(listFldsIsPresent)}}; |
169 |
|
|
|
170 |
|
|
%%%%%%%%%%%%%%%%%%%% |
171 |
|
|
%do the computation: |
172 |
|
|
%%%%%%%%%%%%%%%%%%%% |
173 |
|
|
for ii=i0+1:i1; |
174 |
|
|
|
175 |
|
|
tic; |
176 |
|
|
tt=listTimes(ii); |
177 |
|
|
|
178 |
|
|
%get data from buffer |
179 |
|
|
for jj=1:length(listFldsNames); |
180 |
|
|
if lChunk==1|length(listTimes)==1; |
181 |
|
|
eval([listFldsNames{jj} '=all_' listFldsNames{jj} ';']); |
182 |
|
|
else; |
183 |
|
|
eval(['tmp1=size(all_' listFldsNames{jj} '{1});']); |
184 |
|
|
if length(tmp1)==4; eval([listFldsNames{jj} '=all_' listFldsNames{jj} '(:,:,:,ii-i0);']); |
185 |
|
|
else; eval([listFldsNames{jj} '=all_' listFldsNames{jj} '(:,:,ii-i0);']); |
186 |
|
|
end; |
187 |
|
|
end; |
188 |
|
|
end; |
189 |
|
|
fprintf([num2str(ii-i0) '/' num2str(i1-i0) ' started \n']); |
190 |
|
|
|
191 |
|
|
%generic output file name (that will potentially be overriden) |
192 |
|
|
tmp1=setDiags; |
193 |
|
|
fileMat=['diags_set_' tmp1 '_' num2str(tt) '.mat']; |
194 |
|
|
|
195 |
|
|
%the actual computations |
196 |
|
|
userStep=3; |
197 |
|
|
if ~isempty(which(['diags_set_' setDiags])); |
198 |
|
|
eval(['diags_set_' setDiags]); |
199 |
|
|
else; |
200 |
|
|
diags_set_user; |
201 |
|
|
end; |
202 |
gforget |
1.2 |
|
203 |
|
|
fprintf([num2str(ii) '/' num2str(length(listTimes)) ' done in ' num2str(toc) '\n']); |
204 |
|
|
|
205 |
gforget |
1.1 |
%package results |
206 |
|
|
onediag=[]; |
207 |
|
|
onediag.listTimes=myparms.yearFirst(1)+tt*myparms.timeStep/86400/365.25; |
208 |
|
|
onediag.listSteps=tt; |
209 |
|
|
for jj=1:length(listDiags); |
210 |
|
|
eval(['onediag.' listDiags{jj} '=' listDiags{jj} ';']); |
211 |
|
|
end; |
212 |
|
|
|
213 |
|
|
%write to disk |
214 |
|
|
diags_store_to_mat(dirMat,fileMat,onediag); |
215 |
|
|
|
216 |
gforget |
1.3 |
end;%for ii=i0+1:i1; |
217 |
|
|
|
218 |
|
|
end;%for iChunk=listChunk; |
219 |
gforget |
1.1 |
|
220 |
|
|
|