/[MITgcm]/MITgcm_contrib/jmc_script/read_StD.m
ViewVC logotype

Annotation of /MITgcm_contrib/jmc_script/read_StD.m

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


Revision 1.6 - (hide annotations) (download)
Mon Apr 1 22:04:43 2019 UTC (5 years ago) by jmc
Branch: MAIN
CVS Tags: HEAD
Changes since 1.5: +23 -20 lines
fix output of level number list (listK): instead of returning the content of header file,
now return the effective level number that corresponds to the output variable selection.

1 jmc 1.6 function [nIt,rList,tim,vvA,listV,listK]=read_StD(namF,sufx,listV);
2     % [nIt,rList,tim,vvA,listV,listK]=read_StD(namF,sufx,listV);
3 jmc 1.1 %
4     % read ASCII stat-Diags output files (after splitted by script extract_StD)
5     %
6     % input: listV = list of fileds to read in ; if ='all_flds' => read all fields
7     % namF = prefix of all file names to read (after extract_StD)
8     % sufx = suffix of all file names to read (after extract_StD)
9 jmc 1.6 % output:
10 jmc 1.1 % nIt = number of time reccords
11     % rList = list of region number
12     % tim(:,1) = iterations number ; tim(:,2) = time in simulation
13     % listV = list of fields
14 jmc 1.6 % listK = list of level numbers
15 jmc 1.1 % vvA = 5 dims output array:
16     % ( kLev, time_rec, region_rec, [ave,std,min,max,vol], var_rec )
17    
18 jmc 1.6 % $Header: /u/gcmpack/MITgcm_contrib/jmc_script/read_StD.m,v 1.5 2014/05/14 16:53:04 jmc Exp $
19 jmc 1.1 % $Name: $
20    
21 jmc 1.3 %- Remove insignificant whitespace:
22 jmc 1.4 %sufx=strtrim(char(sufx)); % <-- only with matlab-7 or more recent
23     sufx=strrep(char(sufx),' ','');
24 jmc 1.1 namfhd=[namF,'_head','.',sufx];
25     namfil=[namF,'_Iter','.',sufx];
26     fprintf(['read ',sufx,' :']);
27     rf=-1; if strcmp(char(listV),'all_flds'), rf=0; end
28    
29 jmc 1.6 %- read from Header file:
30 jmc 1.1 % frequency ; list of regions ; list of levels ; (+ list of Var, if rf=0)
31     fid=fopen(namfhd,'r');
32     D=dir(namfhd);
33     if size(D,1) == 1,
34     fprintf(' head');
35     else error(['file: ',namfhd,' not found']); return; end
36 jmc 1.6 flag=1; l=0; k=3;
37 jmc 1.1 while flag > 0
38     tline=fgetl(fid);
39 jmc 1.6 if ischar(tline), l=l+1;
40 jmc 1.1 %disp(tline);
41 jmc 1.6 if tline(2:12) == ' frequency ',
42 jmc 1.1 frq=sscanf(tline(17:end),'%f');
43     k=k-1;
44     end
45     if tline(2:10) == ' Regions ',
46     rList=sscanf(tline(17:end),'%i');
47     k=k-1;
48     end
49 jmc 1.6 if tline(2:15) == ' Nb of levels ',
50 jmc 1.1 kList=sscanf(tline(17:end),'%i');
51     k=k-1;
52     end
53 jmc 1.6 if rf >=0 & tline(2:10) == ' Fields ',
54 jmc 1.1 tmp=[tline(17:end),' ']; i1=0;
55     for i=1:length(tmp),
56 jmc 1.6 if isspace(tmp(i)),
57 jmc 1.1 if i1 > 0 & i > i1,
58     if rf == 0, listV=cellstr(tmp(i1:i-1));
59     else listV(rf+1)=cellstr(tmp(i1:i-1)); end
60     i1=i+1; rf=rf+1;
61 jmc 1.6 else i1=i+1;
62 jmc 1.1 end
63     end
64     end
65     end
66 jmc 1.6 if tline(2:15) == ' end of header',
67 jmc 1.1 flag=0;
68     end
69     else flag=-1; end
70     end
71     fclose(fid);
72     if rf > 0,
73     %- rename fields (consistent with script "extract_StD"):
74 jmc 1.2 for j=1:rf,
75     var1=char(listV(j));
76     switch var1
77     case 'ETAN' , var2='Eta';
78     case 'ETANSQ' , var2='Et2';
79     case 'THETA' , var2='T';
80     case 'SALT' , var2='S';
81     case 'UVEL' , var2='U';
82     case 'VVEL' , var2='V';
83     case 'WVEL' , var2='W';
84     case 'PHIHYD' , var2='Phi';
85     case 'UVELSQ' , var2='U2';
86     case 'VVELSQ' , var2='V2';
87     case 'WVELSQ' , var2='W2';
88     case 'THETASQ' , var2='T2';
89     otherwise var2=var1;
90     end
91 jmc 1.6 listV(j)=cellstr(var2);
92 jmc 1.2 if strcmp(var1,var2), fprintf(' %s\n',var2);
93     else fprintf(' %s --> %s\n',var1,var2); end
94     end
95     % listV
96 jmc 1.1 end
97     if flag ~= 0 | k > 0, frq,rList,kList, end
98     if flag ~= 0, error(['not normal end after reading ',int2str(l),' lines']); end
99     if k > 0, error(['missing ',int2str(k),' flds (freq,regions,levels)']); end
100     if flag ~= 0 | k > 0, frq=0; rList=0; kList=0; return; end
101     nReg=size(rList,1);
102     nbV=size(listV,2);
103     %fprintf('\n kList=');fprintf(' %i',kList);fprintf('\n');
104     %if rf > 0, for l=1:nbV, fprintf([' ',char(listV(l))]); end; fprintf('\n'); end
105     if ( rf > 0 & nbV < length(kList) ) | nbV > length(kList),
106     fprintf('\n Warning: nbV= %i but (only) %i in kList\n',nbV,length(kList))
107     end
108     %- set Max Nb of levels: n3d
109     n3d=max(kList); if n3d > 1, n3d=1+n3d ; end
110    
111     %- load Iter:
112     D=dir(namfil);
113     if size(D,1) == 1,
114     fprintf(' & Iter'); var=load(namfil);
115     else fprintf(['file: ',namfil,' not found => EXIT \n']); return; end
116     nIt=size(var,1);
117    
118     %- initialize output & save Iter:
119     tim=zeros(nIt,2); vvA=zeros(n3d,nIt,nReg,5,nbV);
120     msgA=' '; msgB=' ';
121 jmc 1.6 tim(:,1)=var;
122    
123 jmc 1.1 dIt=ones(1,nIt);
124     if nIt > 1, dIt(2:nIt)=tim(2:nIt,1)-tim(1:nIt-1,1); dIt(1)=dIt(2); end
125     % fprintf(' (dIt: %i %i)',min(dIt(1:nIt)),max(dIt(1:nIt)));
126     %- take the inverse : will be used to correct the volume
127     % (frq<0 : no volume correction if snap-shot)
128     if frq > 0, dIt=1./max(1,dIt); else dIt=ones(1,nIt); end
129    
130 jmc 1.6 %- build time:
131 jmc 1.1 delT=0;
132 jmc 1.5 if nIt > 1, delT=(tim(nIt,1)-tim(1,1))/(nIt-1); delT=max(0,delT); end
133 jmc 1.1 if delT > 0,
134     delT=abs(frq)/delT;
135     delta=delT-round(delT);
136     delta=abs(delta*(tim(2,1)-tim(1,1)));
137     if delta <= 0.5, delT=round(delT); end
138     end
139     fprintf(': nReg= %i ; delta.T= %6.1f ; freq= %8.0f',nReg,delT,frq);
140     if delT > 0, fprintf(' (= %8.3f it)',frq/delT); end
141     fprintf('\n')
142    
143     if delT > 0,
144     tim(:,2)=delT*tim(:,1);
145     else
146     tim(:,2)=tim(:,1);
147     end
148     fprintf(' + var:'); var=load(namfil);
149    
150     %---------
151     for nv=1:nbV,
152     namV=char(listV(nv));
153     [vv1,nk,msg]=read_StD_1v(namF,namV,sufx,nReg,nIt,dIt);
154     if nk > 0, fprintf('_%i',nk); elseif nk < 0, msgA=sprintf([msgA,msg]);
155     else msgB=sprintf([msgB,msg]) ; end
156     if nk > n3d,
157     error([' too many levels(=',int2str(nk),' > ',int2str(n3d), ...
158     ' reading field: ',namV]);
159     end
160     if nk > 0, vvA(1:nk,:,:,:,nv)=vv1; end
161 jmc 1.6 if nv == 1, listK=nk; else listK=[listK nk]; end
162 jmc 1.1 end
163     fprintf(' <= end \n');
164     if length(msgA) ~= 1, fprintf([' not found:',msgA,'\n']) ; end
165     if length(msgB) ~= 1, fprintf([' dim Pb:',msgB,'\n']) ; end
166 jmc 1.6 if n3d == 0, n3d=1; vvA=zeros(n3d,nIt,nReg,5,nbV); else
167     s3d=max(listK); if n3d > s3d, vvA=vvA(1:s3d,:,:,:,:); end
168     end
169 jmc 1.1
170     return
171    
172     function [vvm,nk,msg] = read_StD_1v(namF,nmV,sufx,nReg,nit,dit)
173     msg=' '; nk=0; fprintf([' ',nmV]);
174     namfil=[namF,'_',nmV,'.',sufx]; D=dir(namfil);
175     if size(D,1) == 1,
176     var=load(namfil);
177     nk=1+max(var(:,1));
178     if size(var,1) == nk*nReg*nit,
179     vv1=reshape(var(:,2:6),[nk*nReg nit 5]);
180     %-- put back Integrated Volume (was cumulated over the time period) in 5:
181     vv1(:,:,5)=vv1(:,:,5).*(ones(nk*nReg,1)*dit);
182     vv1=reshape(vv1,[nk nReg nit 5]);
183     vvm=permute(vv1,[1 3 2 4]);
184     else
185 jmc 1.6 %fprintf(['\n ERROR in Dim, var=',nmV,' :']); fprintf(' %i',size(var));
186 jmc 1.1 %fprintf(' ; nk,nReg,nit= %i %i %i\n',nk,nReg,nit);
187     msg=sprintf([' in ',nmV,' : %i <> %ix%ix%i'],size(var,1),nk,nReg,nit); nk=0;
188     vvm=zeros(1,nit,nReg,5);
189     return
190     end
191     else msg=sprintf([msg,namfil,' ']); nk=-1; vvm=zeros(1,nit,nReg,5);
192     end
193     return

  ViewVC Help
Powered by ViewVC 1.1.22