Mercurial > forge
diff main/netcdf/inst/ncread.m @ 11907:24f335b0c8df octave-forge
source code restructuration (1)
author | abarth93 |
---|---|
date | Tue, 02 Jul 2013 19:39:38 +0000 |
parents | |
children | 8476336c120c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main/netcdf/inst/ncread.m Tue Jul 02 19:39:38 2013 +0000 @@ -0,0 +1,112 @@ +## 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} {@var{x} =} ncread (@var{filename}, @var{varname}) +## @deftypefnx {Function File} {@var{x} =} ncread (@var{filename}, @var{varname},@var{start},@var{count},@var{stride}) +## +## Read the variable @var{varname} from the NetCDF file @var{filename}. +## +## If @var{start},@var{count} and @var{stride} are present, a subset of the +## variable is loaded. The parameter @var{start} contains the starting indices +## (1-based), @var{count} is the number of elements 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. Elements of +## @var{count} might be Inf which means that as many values as possible are +## loaded. +## +## If the variable has the _FillValue attribute, then the corresponding values +## are replaced by NaN. NetCDF attributes scale_factor (default 1) and +## add_offset (default 0) are use the transform the variable during the loading: +## +## x = scale_factor * x_in_file + add_offset +## +## The output data type matches the NetCDF datatype, except when the attributes +## _FillValue, add_offset or scale_factor are defined in which case the output +## is a array in double precision. +## +## @seealso{ncwrite,ncinfo,ncdisp} +## +## @end deftypefn + +function x = ncread(filename,varname,start,count,stride) + +ncid = netcdf_open(filename,'NC_NOWRITE'); +[gid,varid] = ncvarid(ncid,varname); +[varname_,xtype,dimids,natts] = netcdf_inqVar(gid,varid); + +% number of dimenions +nd = length(dimids); + +sz = zeros(1,nd); +for i=1:length(dimids) + [dimname, sz(i)] = netcdf_inqDim(gid,dimids(i)); +end + +if nargin < 3 + start = ones(1,nd); +end + +if nargin < 4 + count = inf*ones(1,nd); +end + +if nargin < 5 + stride = ones(1,nd); +end + +% replace inf in count +i = count == inf; +count(i) = (sz(i)-start(i))./stride(i) + 1; + +x = netcdf_getVar(gid,varid,start-1,count,stride); + +% 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(factor) || !isempty(factor) || !isempty(offset) + if !isa(x,'double') + x = double(x); + end +end + +if !isempty(fv) + x(x == fv) = NaN; +end + +if !isempty(factor) + x = x * factor; +end + +if !isempty(offset) + x = x + offset; +end + +netcdf_close(ncid);