Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

...

Source

...

MatLab:

...

http://ecco2.jpl.nasa.gov/data1/matlab/netcdf_toolbox/netcdf/@ncvar/resize.m

No Format
 
function theResult = resize(self, newSize)

% ncvar/resize -- Resize variable dimensions.
%  resize(self, newSize) resizes the dimensions of self,
%   an "ncvar" object.  All variables related to the
%   changed dimensions are similarly affected.  The
%   newSize must have the same number of dimensions
%   as the existing variable.  The new self is returned.

% Copyright (C) 1998 Dr. Charles R. Denham, ZYDECO.
%  All Rights Reserved.
%   Disclosure without explicit written consent from the
%    copyright owner does not constitute publication.

% Version of 03-Nov-1998 08:52:22.
% Updated    12-Aug-1999 09:42:01.

if nargin < 1, help(mfilename), return, end
if nargout > 0, theResult = self; end

% Check for no-change.

if isequal(ncsize(self), newSize)
	result = self;
	if nargout > 0
		theResult = result;
	else
		ncans(result)
	end
	return
end

theItemName = name(self);

% Check for writeability.

f = parent(self);
thePermission = permission(f);
theSrcName = name(f);

if isequal(thePermission, 'nowrite')
	disp([' ## NetCDF source file must be writeable.'])
	return
end

% Check request.

d = dim(self);
for i = 1:length(d)
	if \~isrecdim(d{[i}]) & newSize(i) <= 0
		disp(\[' ## Dimension "' name(d{[i}]) '" size requires positive integer.'\])
		return
	end
end

% Create temporary file.

g = \[\];

i = 0;
while isempty(g)
	i = i + 1;
	theTmpName = ['tmp_' int2str(i) '.nc'|'tmp_' int2str(i) '.nc'];
	if exist(theTmpName, 'file') \~= 2
		g = netcdf(theTmpName, 'noclobber');
	end
end

theTmpName = name(g);

% Copy affected dimensions first.

d = dim(self);
for i = 1:length(d)
	if isrecdim(d{[i}])
		g(name(d{[i}])) = 0;
	elseif newSize(i) <= 0
		error(\[' ## Dimension "' name(d{[i}]) '" requires positive integer.'\])
	else
		g(name(d{[i}])) = newSize(i) ;
	end
end

% Copy other dimensions.

d = dim(f);
for i = 1:length(d)
	g(name(d{[i}])) = ncsize(d{[i}]);
end

% Copy global attributes.

a = att(f);
for i = 1:length(a)
	copy(a{[i}], g)
end

% Copy variable definitions and attributes.

v = var(f);
for i = 1:length(v)
	copy(v{[i}], g, 0, 1)
end

% Copy variable data as minimal rectangular array.
%  Note that the "()" operator is out-of-context
%  inside this method, so we have to build our own
%  calls to "ncvar/subsref" and "ncvar/subsasgn".
%  It might be easier for us to use "virtual"
%  variables instead, which could be transferred
%  with the more intelligent "ncvar/copy" method.

v = var(f);
w = var(g);

for i = 1:length(v)
	sv = ncsize(v{[i}]);
	sw = ncsize(w{[i}]);
	if \~isempty(sw)
		d = dim(w{[i}]);
		if isrecdim(d{[1}])
			if sw(1) == 0
				if isequal(name(d{[1}]), theItemName)
					sw(1) = newSize;
				else
					sw(1) = sv(1);
				end
			end
		end
	end
	theMinimalSize = min(sv, sw);
	if prod(theMinimalSize) > 0
		if isequal(sv, sw)
			copy(v{[i}], g, 1)
		else
			theIndices = cell(size(theMinimalSize));
			for j = 1:length(theIndices)
				theIndices{[j}] = 1:theMinimalSize(j);
			end
			theStruct.type = '()';
			theStruct.subs = theIndices;
			theData = subsref(v{[i}], theStruct);
			w{[i}] = subsasgn(w{[i}], theStruct, theData);
		end
	end
end

% Close both files.

f = close(f);
g = close(g);

{color:#ff0000}% Delete old file.{color}

{color:#ff0000}delete(theSrcName){color}

{color:#ff0000}% Rename new file to old file name.{color}

{color:#ff0000}fcopy(theTmpName, theSrcName){color}
{color:#ff0000}delete(theTmpName){color}

{color:#ff0000}% Open the new file.{color}

{color:#ff0000}g = netcdf(theSrcName, thePermission);{color}

% Return the resized variable.

result = g{[theItemName}];

if nargout > 0
	theResult = result;
else
	ncans(result)
end