diff main/netcdf/inst/ncwrite.m @ 11907:24f335b0c8df octave-forge

source code restructuration (1)
author abarth93
date Tue, 02 Jul 2013 19:39:38 +0000
parents
children 105114c0833c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/netcdf/inst/ncwrite.m	Tue Jul 02 19:39:38 2013 +0000
@@ -0,0 +1,101 @@
+## Copyright (C) 2013 Alexander Barth
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; If not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn  {Function File} ncwrite (@var{filename}, @var{varname}, @var{x})
+## @deftypefnx  {Function File} ncwrite (@var{filename}, @var{varname}, @var{x}, @var{start}, @var{stride})
+##
+## Write array @var{x} to the the variable @var{varname} in the NetCDF file 
+## @var{filename}.
+##
+## The variable with the name @var{varname} and the appropriate dimension must 
+## already exist in the NetCDF file.
+##
+## If @var{start} and @var{stride} are present, a subset of the 
+## variable is written. The parameter @var{start} contains the starting indices 
+## (1-based) and @var{stride} the 
+## increment between two successive elements. These parameters are vectors whose
+## length is equal to the number of dimension of the variable. 
+##
+## If the variable has the _FillValue attribute, then the values equal to NaN 
+## are replaced by corresponding fill value NetCDF attributes scale_factor 
+## (default 1) and add_oddset (default 0) are use the transform the variable 
+## during the writting:
+##
+## x_in_file = (x - add_offset)/scale_factor
+##
+## @seealso{ncread,nccreate}
+##
+## @end deftypefn
+
+function ncwrite(filename,varname,x,start,stride)
+
+ncid = netcdf_open(filename,'NC_WRITE');
+[gid,varid] = ncvarid(ncid,varname);
+[varname_,xtype,dimids,natts] = netcdf_inqVar(gid,varid);
+
+% number of dimenions
+nd = length(dimids);
+
+sz = zeros(1,nd);
+count = zeros(1,nd);
+
+for i=1:length(dimids)
+  [dimname, sz(i)] = netcdf_inqDim(gid,dimids(i));
+  count(i) = size(x,i);
+end
+
+if nargin < 4
+  start = ones(1,nd);
+end
+
+if nargin < 5
+  stride = ones(1,nd);
+end
+
+
+% apply attributes
+
+factor = [];
+offset = [];
+fv = [];
+
+for i = 0:natts-1
+  attname = netcdf_inqAttName(gid,varid,i);
+
+  if strcmp(attname,'scale_factor')
+    factor = netcdf_getAtt(gid,varid,'scale_factor');
+  elseif strcmp(attname,'add_offset')
+    offset = netcdf_getAtt(gid,varid,'add_offset');
+  elseif strcmp(attname,'_FillValue')
+    fv = netcdf_getAtt(gid,varid,'_FillValue');
+  end    
+end
+
+if ~isempty(fv)
+  x(isnan(x)) = fv;
+end
+
+if ~isempty(offset)
+  x = x - offset;
+end
+
+if ~isempty(factor)
+  x = x / factor;
+end
+
+netcdf_putVar(gid,varid,start-1,count,stride,x);
+
+netcdf_close(ncid);