You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 5 Next »

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

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
  • No labels