1 |
function [AA,iters,MM] = rdmds(fnamearg,varargin) |
function [AA,itrs,MM] = rdmds(fnamearg,varargin) |
2 |
% RDMDS Read MITgcmUV meta/data files |
% RDMDS Read MITgcmUV meta/data files |
3 |
% |
% |
4 |
% A = RDMDS(FNAME) |
% A = RDMDS(FNAME) |
67 |
% $Name$ |
% $Name$ |
68 |
|
|
69 |
AA=[]; |
AA=[]; |
70 |
iters=[]; |
itrs=[]; |
71 |
MM=[]; |
MM=[]; |
72 |
|
|
73 |
% Default options |
% Default options |
100 |
else |
else |
101 |
if userecords==1 |
if userecords==1 |
102 |
recnum=arg; |
recnum=arg; |
103 |
elseif isempty(iters) |
elseif isempty(itrs) |
104 |
if isnan(arg) |
if isnan(arg) |
105 |
iters=scanforfiles(fname); |
itrs=scanforfiles(fname); |
106 |
disp([ sprintf('Reading %i time levels:',size(iters,2)) sprintf(' %i',iters) ]); |
disp([ sprintf('Reading %i time levels:',size(itrs,2)) sprintf(' %i',itrs) ]); |
107 |
elseif isinf(arg) |
elseif isinf(arg) |
108 |
iters=scanforfiles(fname); |
itrs=scanforfiles(fname); |
109 |
if isempty(iters) |
if isempty(itrs) |
110 |
AA=[];iters=[];return; |
AA=[];itrs=[];return; |
111 |
end |
end |
112 |
disp([ sprintf('Found %i time levels, reading %i',size(iters,2),iters(end)) ]); |
disp([ sprintf('Found %i time levels, reading %i',size(itrs,2),itrs(end)) ]); |
113 |
iters=iters(end); |
itrs=itrs(end); |
114 |
% elseif prod(double(arg>=0)) & prod(double(round(arg)==arg)) |
% elseif prod(double(arg>=0)) & prod(double(round(arg)==arg)) |
115 |
% elseif prod(arg>=0) & prod(round(arg)==arg) |
% elseif prod(arg>=0) & prod(round(arg)==arg) |
116 |
elseif min(arg)>=0 & isempty(find(round(arg)~=arg)) |
elseif min(arg)>=0 & isempty(find(round(arg)~=arg)) |
117 |
if arg>=9999999999 |
if arg>=9999999999 |
118 |
error(sprintf('Argument %i > 9999999999',arg)) |
error(sprintf('Argument %i > 9999999999',arg)) |
119 |
end |
end |
120 |
iters=arg; |
itrs=arg; |
121 |
else |
else |
122 |
error(sprintf('Argument %i must be a positive integer',arg)) |
error(sprintf('Argument %i must be a positive integer',arg)) |
123 |
end |
end |
127 |
end |
end |
128 |
end |
end |
129 |
|
|
130 |
if isempty(iters) |
if isempty(itrs) |
131 |
iters=-1; |
itrs=-1; |
132 |
end |
end |
133 |
|
|
134 |
% Loop over each iteration |
% Loop over each iteration |
135 |
for iter=1:size(iters,2); |
for iter=1:size(itrs,2); |
136 |
if iters(iter)>=0 |
if itrs(iter)>=0 |
137 |
fname=sprintf('%s.%10.10i',fnamearg,iters(iter)); |
fname=sprintf('%s.%10.10i',fnamearg,itrs(iter)); |
138 |
end |
end |
139 |
|
|
140 |
% Figure out if there is a path in the filename |
% Figure out if there is a path in the filename |
141 |
NS=findstr('/',fname); |
NS=findstr('/',fname); |
142 |
if size(NS)>0 |
if size(NS)>0 |
143 |
Dir=fname(1:NS(end)); |
Dir=fname(1:NS(end)); |
144 |
else |
else |
145 |
Dir='./'; |
Dir='./'; |
146 |
end |
end |
147 |
|
|
148 |
% Match name of all meta-files |
% Match name of all meta-files |
149 |
allfiles=dir( sprintf('%s*.meta',fname) ); |
allfiles=dir( sprintf('%s*.meta',fname) ); |
150 |
|
|
151 |
if size(allfiles,1)==0 |
if size(allfiles,1)==0 |
152 |
disp(sprintf('No files match the search: %s*.meta',fname)); |
disp(sprintf('No files match the search: %s*.meta',fname)); |
153 |
%allow partial reads% error('No files found.') |
%allow partial reads% error('No files found.') |
154 |
end |
end |
155 |
|
|
156 |
% Loop through allfiles |
% Loop through allfiles |
157 |
for j=1:size(allfiles,1); |
for j=1:size(allfiles,1); |
158 |
|
|
159 |
% Read meta- and data-file |
% Read meta- and data-file |
160 |
[A,N,M,mG] = localrdmds([Dir allfiles(j).name],ieee,recnum); |
[A,N,M,mG] = localrdmds([Dir allfiles(j).name],ieee,recnum); |
161 |
|
|
162 |
%- Merge local Meta file content (M) to MM string: |
%- Merge local Meta file content (M) to MM string: |
163 |
if j > 0, %- to comment out this block: "if j < 0" (since j is always > 0) |
if j > 0, %- to comment out this block: "if j < 0" (since j is always > 0) |
164 |
ind=findstr(M,' timeStepNumber'); |
ii=findstr(M,' timeStepNumber'); |
165 |
if isempty(ind), ind=0; |
if isempty(ii), ii1=0; ii2=0; |
166 |
else ind2=ind+min(findstr(M(1+ind:end),'];')); end |
else ii1=ii; ii2=ii+min(findstr(M(1+ii:end),'];')); end |
167 |
if iter==1 & j==1, |
ii=findstr(M,' timeInterval'); |
168 |
MM=M; ind1=ind; if ind1 > 0, M2=M(ind1:ind2); M3=M(1+ind2:end); end |
if isempty(ii), jj1=0; jj2=0; |
169 |
else |
else jj1=ii; jj2=ii+min(findstr(M(1+ii:end),'];')); end |
170 |
compar=(ind == ind1); |
if iter==1 & j==1, |
171 |
if compar & ind == 0, compar=strcmp(MM,M); end |
MM=M; ind2=0; is1=ii1; js1=jj1; M3=''; |
172 |
if compar & ind1 > 0, compar=strncmp(MM,M,ind1) ; end |
if ii1*jj1 > 0, |
173 |
if compar & ind1 > 0, compar=strcmp(M3,M(1+ind2:end)); end |
%ind1=min(ii1,jj1); ind2=max(ii2,jj2); |
174 |
if ~compar, |
%if ii1 < jj1, ii3=ii2+1; jj3=jj1-1; |
175 |
fprintf('WARNING: Meta file (%s) is different from 1rst one:\n',allfiles(j).name); |
%else ii3=jj2+1; jj3=ii1-1; end |
176 |
fprintf(' it=%i :MM:%s\n',iters(1),MM); |
order=sort([ii1 ii2 jj1 jj2]); |
177 |
fprintf(' it=%i :M :%s\n\n',iters(iter),M); |
ind1=order(1); ii3=order(2)+1; jj3=order(3)-1; ind2=order(4); |
178 |
elseif ind1 > 0, |
M2=M(ii1:ii2); M4=M(jj1:jj2); M3=M(ii3:jj3); |
179 |
Mj=M(ind1:ind2); ind=findstr(Mj,'['); Mj=Mj(1+ind:end); |
elseif ii1 > 0, |
180 |
|
ind1=ii1; ind2=ii2; |
181 |
|
M2=M(ii1:ii2); M4=''; |
182 |
|
elseif jj1 > 0, |
183 |
|
ind1=jj1; ind2=jj2; |
184 |
|
M4=M(jj1:jj2); M2=''; |
185 |
|
end |
186 |
|
M5=M(1+ind2:end); |
187 |
|
%fprintf(' ii1,ii2 = %i %i ; jj1,jj2= %i %i ;', ii1,ii2, jj1,jj2); |
188 |
|
%fprintf(' ii3,jj3= %i %i ; ind1,ind2= %i %i\n',ii3,jj3,ind1,ind2); |
189 |
|
%fprintf('M(1:ind1)=%s<\n',M(1:ind1)); |
190 |
|
%fprintf(' M2=%s<\n',M2); |
191 |
|
%fprintf(' M3=%s<\n',M3); |
192 |
|
%fprintf(' M4=%s<\n',M4); |
193 |
|
%fprintf(' M5=%s<\n',M5); |
194 |
|
else |
195 |
|
if ii1*jj1 > 0, |
196 |
|
order=sort([ii1 ii2 jj1 jj2]); |
197 |
|
ind=order(1); ii3=order(2)+1; jj3=order(3)-1; ind2=order(4); |
198 |
|
else ind=max(ii1,jj1); ind2=ii2+jj2; end |
199 |
|
compar=(ind == ind1); ii=0; |
200 |
|
if compar & ind1 == 0, ii=1; compar=strcmp (MM,M); end |
201 |
|
if compar & ind1 > 0, ii=2; compar=strncmp(MM,M,ind1) ; end |
202 |
|
if compar & ind1 > 0, ii=3; compar=strcmp(M5,M(1+ind2:end)); end |
203 |
|
if compar & ii1*jj1 > 0, ii=4; compar=strcmp(M3,M(ii3:jj3)); end |
204 |
|
if ~compar, |
205 |
|
fprintf('WARNING: Meta file (%s) is different (%i) from 1rst one:\n', ... |
206 |
|
allfiles(j).name,ii); |
207 |
|
fprintf(' it=%i :MM:%s\n',itrs(1),MM); |
208 |
|
fprintf(' it=%i :M :%s\n\n',itrs(iter),M); |
209 |
|
elseif ind1 > 0, |
210 |
|
if ii1 > 0, |
211 |
|
Mj=M(ii1:ii2); ii=findstr(Mj,'['); Mj=Mj(1+ii:end); |
212 |
% add it-number from Mj to M2 (if different): |
% add it-number from Mj to M2 (if different): |
213 |
if isempty(findstr(M2,Mj)), M2=[deblank(M2(1:end-1)),Mj]; end |
if isempty(findstr(M2,Mj)), M2=[deblank(M2(1:end-1)),Mj]; end |
214 |
% if isempty(findstr(M2,Mj)), M2=[M2(1:end-1) Mj]; end |
end |
215 |
end |
if jj1 > 0, |
216 |
end |
Mj=M(jj1:jj2); ii=findstr(Mj,'['); Mj=Mj(1+ii:end); |
217 |
|
% add time interval from Mj to M4 (if different): |
218 |
|
if isempty(findstr(M4,Mj)), M4=[deblank(M4(1:end-1)),' ;',Mj]; end |
219 |
|
end |
220 |
|
end |
221 |
|
end |
222 |
% save modifications: |
% save modifications: |
223 |
if ind1>0 & j==size(allfiles,1) & iter==size(iters,2), MM=[MM(1:ind1-1),M2,M3]; end |
if ind1>0 & j==size(allfiles,1) & iter==size(itrs,2), |
224 |
end |
if ii1 < jj1, MM=[MM(1:ind1-1),M2,M3,M4,M5]; |
225 |
|
else MM=[MM(1:ind1-1),M4,M3,M2,M5]; end |
226 |
|
end |
227 |
|
end |
228 |
|
|
229 |
%- put local data file content in global array AA: |
%- put local data file content in global array AA: |
230 |
bdims=N(1,:); |
bdims=N(1,:); |
231 |
r0=N(2,:); |
r0=N(2,:); |
232 |
rN=N(3,:); |
rN=N(3,:); |
233 |
ndims=prod(size(bdims)); |
ndims=prod(size(bdims)); |
234 |
if j==1 & iter==1, AA=zeros([bdims size(iters,2)]); end |
if j==1 & iter==1, AA=zeros([bdims size(itrs,2)]); end |
235 |
if mG(1)==0 & mG(2)==1, |
if mG(1)==0 & mG(2)==1, |
236 |
if (ndims == 1) |
if (ndims == 1) |
237 |
AA(r0(1):rN(1),iter)=A; |
AA(r0(1):rN(1),iter)=A; |
238 |
elseif (ndims == 2) |
elseif (ndims == 2) |
239 |
AA(r0(1):rN(1),r0(2):rN(2),iter)=A; |
AA(r0(1):rN(1),r0(2):rN(2),iter)=A; |
240 |
elseif (ndims == 3) |
elseif (ndims == 3) |
241 |
AA(r0(1):rN(1),r0(2):rN(2),r0(3):rN(3),iter)=A; |
AA(r0(1):rN(1),r0(2):rN(2),r0(3):rN(3),iter)=A; |
242 |
elseif (ndims == 4) |
elseif (ndims == 4) |
243 |
AA(r0(1):rN(1),r0(2):rN(2),r0(3):rN(3),r0(4):rN(4),iter)=A; |
AA(r0(1):rN(1),r0(2):rN(2),r0(3):rN(3),r0(4):rN(4),iter)=A; |
244 |
elseif (ndims == 5) |
elseif (ndims == 5) |
245 |
AA(r0(1):rN(1),r0(2):rN(2),r0(3):rN(3),r0(4):rN(4),r0(5):rN(5),iter)=A; |
AA(r0(1):rN(1),r0(2):rN(2),r0(3):rN(3),r0(4):rN(4),r0(5):rN(5),iter)=A; |
246 |
|
else |
247 |
|
error('Dimension of data set is larger than currently coded. Sorry!') |
248 |
|
end |
249 |
|
elseif (ndims == 1) |
250 |
|
AA(r0(1):rN(1),iter)=A; |
251 |
else |
else |
|
error('Dimension of data set is larger than currently coded. Sorry!') |
|
|
end |
|
|
elseif (ndims == 1) |
|
|
AA(r0(1):rN(1),iter)=A; |
|
|
else |
|
252 |
%- to debug: do simple stransfert (with a loop on 2nd index); |
%- to debug: do simple stransfert (with a loop on 2nd index); |
253 |
% will need to change this later, to improve efficiency: |
% will need to change this later, to improve efficiency: |
254 |
for i=0:rN(2)-r0(2), |
for i=0:rN(2)-r0(2), |
255 |
if (ndims == 2) |
if (ndims == 2) |
256 |
AA(r0(1)+i*mG(1):rN(1)+i*mG(1),r0(2)+i*mG(2),iter)=A(:,1+i); |
AA(r0(1)+i*mG(1):rN(1)+i*mG(1),r0(2)+i*mG(2),iter)=A(:,1+i); |
257 |
elseif (ndims == 3) |
elseif (ndims == 3) |
258 |
AA(r0(1)+i*mG(1):rN(1)+i*mG(1),r0(2)+i*mG(2), ... |
AA(r0(1)+i*mG(1):rN(1)+i*mG(1),r0(2)+i*mG(2), ... |
259 |
r0(3):rN(3),iter)=A(:,1+i,:); |
r0(3):rN(3),iter)=A(:,1+i,:); |
260 |
elseif (ndims == 4) |
elseif (ndims == 4) |
261 |
AA(r0(1)+i*mG(1):rN(1)+i*mG(1),r0(2)+i*mG(2), ... |
AA(r0(1)+i*mG(1):rN(1)+i*mG(1),r0(2)+i*mG(2), ... |
262 |
r0(3):rN(3),r0(4):rN(4),iter)=A(:,1+i,:,:); |
r0(3):rN(3),r0(4):rN(4),iter)=A(:,1+i,:,:); |
263 |
elseif (ndims == 5) |
elseif (ndims == 5) |
264 |
AA(r0(1)+i*mG(1):rN(1)+i*mG(1),r0(2)+i*mG(2), ... |
AA(r0(1)+i*mG(1):rN(1)+i*mG(1),r0(2)+i*mG(2), ... |
265 |
r0(3):rN(3),r0(4):rN(4),r0(5):rN(5),iter)=A(:,1+i,:,:,:); |
r0(3):rN(3),r0(4):rN(4),r0(5):rN(5),iter)=A(:,1+i,:,:,:); |
266 |
else |
else |
267 |
error('Dimension of data set is larger than currently coded. Sorry!') |
error('Dimension of data set is larger than currently coded. Sorry!') |
268 |
|
end |
269 |
|
end |
270 |
end |
end |
|
end |
|
|
end |
|
271 |
|
|
272 |
end % files |
end % files |
273 |
end % iterations |
end % iterations |
274 |
|
|
275 |
%------------------------------------------------------------------------------- |
%------------------------------------------------------------------------------- |
511 |
%arr=reshape(arr,N); |
%arr=reshape(arr,N); |
512 |
|
|
513 |
% |
% |
514 |
function [iters] = scanforfiles(fname) |
function [itrs] = scanforfiles(fname) |
515 |
|
|
516 |
iters=[]; |
itrs=[]; |
517 |
allfiles=dir([fname '.*.001.001.meta']); |
allfiles=dir([fname '.*.001.001.meta']); |
518 |
if isempty(allfiles) |
if isempty(allfiles) |
519 |
allfiles=dir([fname '.*.meta']); |
allfiles=dir([fname '.*.meta']); |
523 |
end |
end |
524 |
for k=1:size(allfiles,1); |
for k=1:size(allfiles,1); |
525 |
hh=allfiles(k).name; |
hh=allfiles(k).name; |
526 |
iters(k)=str2num( hh(end-14-ioff:end-5-ioff) ); |
itrs(k)=str2num( hh(end-14-ioff:end-5-ioff) ); |
527 |
end |
end |
528 |
iters=sort(iters); |
itrs=sort(itrs); |