Global Index (short | long) | Local contents | Local Index (short | long)
[varargout] = getnc2(varargin);
[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
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 vn_ind = 1; while (vn_ind <= length(varnames)); ncvarnames = varnames{vn_ind}; if strcmp(name(ncvarnames), varn) vardims = dim(ncvarnames); vn_ind = length(varnames)+1; % This is a hack. Fix it later. else vn_ind = vn_ind + 1; end end % 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; if isempty(levind) & (~mod(lev, 1) & lev < length(levtot)); levind = 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; varargout{4} = levtot(levind); end; if nargout == 5; if ~isstr(tim); varargout{5} = time(tim); else varargout{5} = time; end end end