Documentation of getnc2


Global Index (all files) (short | long) | Local Index (files in subdir) (short | long)


Function Synopsis

[varargout] = getnc2(varargin);

Help text


  [data, lat, lon, level, time] = getnc2(filin, varn, lims, lev, tim);
      for 4D variables (multi-level)
  [data, lat, lon, time] = getnc2(filin, varn, lims, lev, tim);
      for 3d variables (single level)

  You can output any or all of the above variables.

  Inputs include:
  filin           = name of input netcdf file
  varn (optional) = name of variable to retrieve.  If it is the 
                    only variable in the file, then it need not be input.
  lims (optional) = [minlon maxlon minlat maxlat] of output data.  
                    Default is [0 360 -90 90];
  lev  (optional) = level to output (may be multiple, staggered). 
                    Default is lev = 1.  lev = 'all' returns all levels
  tim  (optional) = time index to output (may be multiple, staggered)
                    Default is tim = 1.  tim = 'all' returns all levels

  If you do not input one or more of the input arguements (and hence
  wish to use the default values), then the names of the inputs must
  match the above input arguements (e.g., don't name your level vector 
  'level', name it 'lev').  This may be fixed some time, but I don't 
  currently care to do it.

  Dan Vimont, May 2000

Cross-Reference Information

This function calls This function is called by

Listing of function getnc2

function [varargout] = getnc2(varargin);

if nargchk(1, 5, nargin);
  error('Check input arguments - must have between one and five')
end

%  Get filename
filin = varargin{1};

%  Set defaults
lev = 1;
tim = 'all';
lims = [0 360 -90 90];
varn = 'all';

%  Define inputs
if nargin ~= 5;
  for i = 2:(nargin);
    eval([inputname(i) ' = varargin{i};']);
  end
else
  varn = varargin{2};
  lims = varargin{3}; % lims
  lev = varargin{4};
  tim = varargin{5};
end

if isstr(tim); tim = lower(tim); end;

%  Open NetCDF files

nc = netcdf(filin, 'nowrite');
if isempty(nc); error('Incorrect filename'); end;

  varnames = get_varn(nc);

  if strcmp(varn, 'all');
    if length(varnames) > 1;
      error('Too many NetCDF variables - must input varn');
    end
    varn = name(varnames{1});    
  end
 
  %  Get variable index 
  ncvarnames = []; i = 1;
  while (isempty(ncvarnames) & i <= length(varnames));
    if strcmp(lower(varn), lower(name(varnames{i})));
      ncvarnames = varnames{i};
    end
    i = i + 1;
  end
  if isempty(ncvarnames); error(['Variable ' varn ' not found']); end;
%  ncvarnames = varnames{1};
  vardims = dim(ncvarnames);

  if (length(vardims)+1 == nargout);  %  This saves some time
    time = nc{name(vardims{1}), 1}(:);
  end

  if length(vardims) == 3;  %  3-D var: tim, lat, lon

    lattot = nc{name(vardims{2}), 1}(:);
    lontot = nc{name(vardims{3}), 1}(:);
    [xk, yk] = keep_var(lims, lontot, lattot);

    if strcmp(tim, 'all');
      varout = nc{varn, 1}(:,yk,xk);
    elseif isempty(find(diff(tim) ~= 1));
      varout = nc{varn, 1}(tim,yk,xk);
    else
      varout = NaN*ones(length(tim), length(yk), length(xk));
      for i = 1:length(tim);
        varout(i,:,:) = nc{varn, 1}(tim(i), yk, xk);
      end
    end
    
  elseif length(vardims) == 4;  %  4-D var: tim, lev, lat, lon

    levtot = nc{name(vardims{2}), 1}(:);
    if ~strcmp(lev, 'all'); levind = find(ismember(levtot, lev)); end; 
    lattot = nc{name(vardims{3}), 1}(:);
    lontot = nc{name(vardims{4}), 1}(:);
    [xk, yk] = keep_var(lims, lontot, lattot);
    if strcmp(tim, 'all');
      if strcmp(lev, 'all');
	varout = nc{varn, 1}(:,:,yk,xk);
      elseif isempty(find(diff(levind) ~= 1));
	varout = nc{varn, 1}(:,levind,yk,xk);
      else
	varout = [];
	for i = 1:length(tim);
	  vartem = NaN*ones(1, length(levind), length(yk), length(xk));
	  for j = 1:length(levind);
	    vartem(1,j,:,:) = nc{varn, 1}(tim(i), levind(j), yk, xk);
	  end
	  varout = [varout; vartem];
	end
      end
    elseif isempty(find(diff(tim) ~= 1));
      if strcmp(lev, 'all');
	varout = nc{varn, 1}(tim,:,yk,xk);
      elseif isempty(find(diff(levind) ~= 1));
	varout = nc{varn, 1}(tim,levind,yk,xk);
      else
	varout = NaN*ones(length(tim), length(levind), length(yk), ...
			  length(xk));
	for i = 1:length(tim);
	  for j = 1:length(levind);
	    varout(i,j,:,:) = nc{varn, 1}(tim(i), levind(j), yk, xk);
	  end
	end
      end
    else
      if strcmp(lev, 'all');
	varout = NaN*ones(length(tim), length(levtot), length(yk), ...
			  length(xk));
	for i = 1:length(tim);
	  varout(i,:,:,:) = nc{varn, 1}(tim(i),:,yk,xk);
	end  
      elseif isempty(find(diff(levind) ~= 1));
	varout = NaN*ones(length(tim), length(levind), length(yk), ...
			  length(xk));
	for i = 1:length(tim);
	  varout(i,:,:,:) = nc{varn, 1}(tim(i),levind,yk,xk);
	end
      else
	varout = NaN*ones(length(tim), length(levind), length(yk), ...
			  length(xk));
	for i = 1:length(tim);
	  for j = 1:length(levind);
	    varout(i,j,:,:) = nc{varn, 1}(tim(i), levind(j), yk, xk);
	  end
	end
      end
    end  %  If strcmp(tim, 'all')
  end  %  If ndims = 4
  
  mv = nc{varn}.missing_value(:); if isempty(mv); mv = NaN; end;
  ao = nc{varn}.add_offset(:); if isempty(ao); ao = 0; end;
  sf = nc{varn}.scale_factor(:); if isempty(sf); sf = 1; end;
  mv = sf*mv+ao;
  
  if ~isnan(mv);
    varout(varout == mv) = NaN;
  end
  
nc = close(nc);


%  Deal out output variables

if nargout >= 1; varargout{1} = varout; end
if nargout >= 2; varargout{2} = lattot(yk); end;
if nargout >= 3; varargout{3} = lontot(xk); end;

if length(vardims) == 3;  %  3-D var: tim, lat, lon
  if nargout == 4;
    if ~isstr(tim); 
      varargout{4} = time(tim); 
    else
      varargout{4} = time;
    end
  end
elseif length(vardims) == 4;  %  4-D var: time, lev, lat, lon
  if nargout >= 4; 
    if strcmp(lev, 'all');
      varargout{4} = levtot; 
    else
      varargout{4} = levtot(levind); 
    end
  end
  if nargout == 5;
    if ~isstr(tim); 
      varargout{5} = time(tim); 
    else
      varargout{5} = time;
    end
  end
end