/[MITgcm]/MITgcm/utils/matlab/rdmds.m
ViewVC logotype

Diff of /MITgcm/utils/matlab/rdmds.m

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

revision 1.24 by jmc, Thu Mar 22 18:49:18 2007 UTC revision 1.25 by jmc, Thu Jan 7 23:20:33 2010 UTC
# Line 1  Line 1 
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)
# Line 67  function [AA,iters,MM] = rdmds(fnamearg, Line 67  function [AA,iters,MM] = rdmds(fnamearg,
67  % $Name$  % $Name$
68    
69  AA=[];  AA=[];
70  iters=[];  itrs=[];
71  MM=[];  MM=[];
72    
73  % Default options  % Default options
# Line 100  for ind=1:size(varargin,2); Line 100  for ind=1:size(varargin,2);
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
# Line 127  for ind=1:size(varargin,2); Line 127  for ind=1:size(varargin,2);
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  %-------------------------------------------------------------------------------  %-------------------------------------------------------------------------------
# Line 471  st=fclose(fid); Line 511  st=fclose(fid);
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']);
# Line 483  else Line 523  else
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);

Legend:
Removed from v.1.24  
changed lines
  Added in v.1.25

  ViewVC Help
Powered by ViewVC 1.1.22