ruby-netcdf 0.6.6.1 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,8 @@
1
1
  =begin
2
2
  =RubyNetCDF ��ե���󥹥ޥ˥奢��
3
3
 
4
+ RubyNetCDF version : 0.7.1
5
+
4
6
  * ((<�᥽�åɥ���ǥå���>))
5
7
 
6
8
  ---------------------------------------------
@@ -23,6 +25,8 @@ NumPy
23
25
  ((<NArrayMiss|URL:http://ruby.gfd-dennou.org/products/narray_miss/>))
24
26
  ��ɬ�פǤ��롣�ܤ�����((<����ˡ>))�򸫤衣
25
27
 
28
+ ���� NetCDF-4 �Υ��ݡ��Ȥ���ʬŪ�Ǥ���(�������ǡ�����ǥ�ϥ��ݡ��Ȥ��Ƥʤ�)��
29
+
26
30
  ===����
27
31
 
28
32
  RubyNetCDF �ϰʲ��Σ��ĤΥ��饹���鹽������롣
@@ -146,6 +150,9 @@ RubyNetCDF
146
150
  * ((<���饹 NetCDF>))
147
151
 
148
152
  ���饹�᥽�å�
153
+ * ((<NetCDF.nc4?>)) ��󥯤��줿 NetCDF �� version 4 ���ɤ����֤�
154
+ * ((<NetCDF.creation_format=>)) NetCDF.create�Ǻ����ե�����ե����ޥåȤ����ꤹ�� (NetCDF-4 ����).
155
+ * ((<NetCDF.creation_format>)) NetCDF.create�Ǻ����ե�����ե����ޥåȤ�������֤�. (NetCDF-4 ����).
149
156
  * ((<NetCDF.open>)) �ե����륪���ץ�ʥ��饹�᥽�åɡ�mode="w" �ǥե����뤬¸�ߤ��ʤ���п�������
150
157
  * ((<NetCDF.new>)) NetCDF.open�᥽�åɤΥ����ꥢ���Ǥ���
151
158
  * ((<NetCDF.create>)) NetCDF�ե��������ʥ��饹�᥽�å�)
@@ -199,6 +206,10 @@ RubyNetCDF
199
206
 
200
207
 
201
208
  ���󥹥��󥹥᥽�å�
209
+ * ((<deflate>)) ���� (deflation) ������. (netCDF-4 only)
210
+ * ((<deflate_params>)) ���ߤΰ���������礻. (netCDF-4 only)
211
+ * ((<endian=>)) ����ǥ���������� (netCDF-4 only)
212
+ * ((<endian>)) ����ǥ�����������֤�. (netCDF-4 only)
202
213
  * ((<dim>)) �����ѿ��ˤ����� dim_num ����(0���������)�μ��������碌�롣
203
214
  * ((<dims>)) �����ѿ���������������ˤ�����֤�
204
215
  * ((<shape_ul0>)) �ѿ��η����֤�. â��̵���¼�����Ĺ���ϥ���.
@@ -254,7 +265,36 @@ RubyNetCDF
254
265
  ---------------------------------------------
255
266
 
256
267
  =���饹 NetCDF
268
+ ===���
269
+ * NC_NOWRITE, NC_WRITE, NC_SHARE, NC_CLOBBER, NC_NOCLOBBER, NC_64BIT_OFFSET, NC_NETCDF4, NC_CLASSIC_MODEL, NCVERSION, SUPPORT_BIGMEM : ������ NumRu::NetCDF::NC_NOWRITE �ʤɥ����������롣
270
+
257
271
  ===���饹�᥽�å�
272
+ ---NetCDF.nc4?
273
+ ���Υ饤�֥�꤬ NetCDF version 4 ��Ȥ��褦�ˤʤäƤ����
274
+ �ʥ�󥯤���Ƥ� NetCDF �饤�֥�꤬ver 4�ʤ��true ��
275
+ �����Ǥʤ���� (NetCDF 3�ʤ�) false ���֤���
276
+
277
+ ---NetCDF.creation_format=(cmode)
278
+ (���Υ᥽�åɤ� NetCDF-4 ���Ȥ��Ƥ�Ȥ��Τ߻��Ѳ�ǽ�������Ǥʤ����
279
+ �㳰��ȯ������). NetCDF.create �Ǻ����ե�����Υե����ޥåȤ���ꤹ��.
280
+ �������� "classic".
281
+
282
+ ����
283
+ * cmode : �ʲ��Τ����줫��
284
+ * 0, nil, or NetCDF::NC_CLASSIC_MODEL : classic format
285
+ (��������� NetCDF-3 �Υե����ޥå�). ���줬�������.
286
+ * NetCDF::NC_64BIT_OFFSET : classic �������ѿ��Υ��������礭�������
287
+ * NetCDF::NC_NETCDF4 : HDF5 �١����� NetCDF-4 ���ե����ޥå�
288
+ * ( NetCDF::NC_NETCDF4 | NetCDF::NC_CLASSIC_MODEL) [�����
289
+ NetCDF::NC_NETCDF4 �� NetCDF::NC_CLASSIC_MODEL �� bit "or"]:
290
+ NetCDF-4 ���ե����ޥåȤ������������ǡ�����ǥ�ϻȤ��ʤ��褦����.
291
+
292
+
293
+ ---NetCDF.creation_format
294
+ (���Υ᥽�åɤ� NetCDF-4 ���Ȥ��Ƥ�Ȥ��Τ߻��Ѳ�ǽ�������Ǥʤ����
295
+ �㳰��ȯ������).
296
+ NetCDF.create �Ǻ����ե�����Υե����ޥåȤθ��ߤ�������֤�.
297
+
258
298
  ---NetCDF.open(filename, mode="r", share=false)
259
299
  �ե����륪���ץ�ʥ��饹�᥽�åɡ�mode="w" �ǥե����뤬¸�ߤ��ʤ���п�������
260
300
 
@@ -757,6 +797,61 @@ RubyNetCDF
757
797
  NArray::SFLOAT, or NArray::FLOAT
758
798
 
759
799
  ===���󥹥��󥹥᥽�å�
800
+ ---deflate(deflate_level, shuffle=false)
801
+ (���Υ᥽�åɤ� NetCDF-4 ���Ȥ��Ƥ�Ȥ��Τ߻��Ѳ�ǽ�������Ǥʤ����
802
+ �㳰��ȯ������).
803
+ (�������������줿)�ѿ�������(deflate)�����褦�ˤ���. ���Υ᥽�åɤϡ�
804
+ �ѿ������ (NetCDF#((<def_var>))) �����塤NetCDF#((<enddef>))
805
+ ��Ƥ����˸ƤФʤ���Фʤ�ʤ�.
806
+
807
+ ����
808
+ * deflate_level (Integer) :: 0 to 9. (0: no compression; 9:
809
+ highest compression; recommended: 1 or 2).
810
+ * shuffle (optional; true or false; default: false) if true,
811
+ turn on the shuffle filter.
812
+ * ((<URL:http://www.unidata.ucar.edu/software/netcdf/papers/AMS_2008.pdf>)):
813
+ ``The shuffle algorithm changes the byte order in the data stream;
814
+ when used with integers that are all close together, this
815
+ results in a better compression ratio. There is no benefit
816
+ from using the shuffle filter without also using
817
+ compression.''
818
+ * Note: shuffle is effective for float variables too (tested by horinouchi).
819
+
820
+ �����
821
+ * self
822
+
823
+ ---deflate_params
824
+ (���Υ᥽�åɤ� NetCDF-4 ���Ȥ��Ƥ�Ȥ��Τ߻��Ѳ�ǽ�������Ǥʤ����
825
+ �㳰��ȯ������).
826
+ ���ߤΰ���(deflation)�ѥ�᥿�����֤���
827
+
828
+ �����
829
+ * [shuffle, deflate, deflate_level] (a 3-element Array).
830
+ shuffle �� deflate �� true �ޤ��� false. deflate_level ������(0-9).
831
+
832
+ ---endian=(endian)
833
+ (���Υ᥽�åɤ� NetCDF-4 ���Ȥ��Ƥ�Ȥ��Τ߻��Ѳ�ǽ�������Ǥʤ����
834
+ �㳰��ȯ������).
835
+ ����ǥ���������ꤹ�롣���ѥ����ߥ󥰤� ((<deflate>)) ��Ʊ����
836
+
837
+ Arguments
838
+ * endian : ���Τ����줫:
839
+ NetCDF::NC_ENDIAN_NATIVE (=0) (default),
840
+ NetCDF::NC_ENDIAN_LITTLE (=1), or NetCDF::NC_ENDIAN_BIG (=2).
841
+
842
+ Return value
843
+ * self
844
+
845
+ ---endian
846
+ (���Υ᥽�åɤ� NetCDF-4 ���Ȥ��Ƥ�Ȥ��Τ߻��Ѳ�ǽ�������Ǥʤ����
847
+ �㳰��ȯ������).
848
+ ���ߤΥ���ǥ�����������֤�.
849
+
850
+ Return value
851
+ * ���Τ����줫:
852
+ NetCDF::NC_ENDIAN_NATIVE (=0) (default),
853
+ NetCDF::NC_ENDIAN_LITTLE (=1), or NetCDF::NC_ENDIAN_BIG (=2).
854
+
760
855
  ---dim(dim_num)
761
856
  �����ѿ��ˤ����� dim_num ����(0���������)�μ��������碌�롣
762
857
 
@@ -1,7 +1,7 @@
1
1
  #!/bin/csh
2
- nkf -e Ref_man_jp.rd | rd2 | \
2
+ nkf -m Ref_man_jp.rd | rd2 --out-code=utf-8 | \
3
3
  sed -e 's/<dt>/<dt><h4>/' -e 's/<\/dt>/<\/h4><\/dt>/' \
4
- >! Ref_man_jp.html
4
+ > Ref_man_jp.html
5
5
  rd2 Ref_man.rd | \
6
6
  sed -e 's/<dt>/<dt><h4>/' -e 's/<\/dt>/<\/h4><\/dt>/' \
7
- >! Ref_man.html
7
+ > Ref_man.html
data/extconf.rb CHANGED
@@ -1,14 +1,30 @@
1
- require "rubygems" unless defined?(Gem)
2
1
  require "mkmf"
2
+ require "rubygems" unless defined?(Gem)
3
3
 
4
- hoge = Gem::GemPathSearcher.new.find("narray")
5
- narray_fullname = hoge.full_name
6
- narray_installpath = hoge.installation_path
7
- narray_include = "#{narray_installpath}/gems/#{narray_fullname}/"
8
- narray_lib = "#{narray_installpath}/gems/#{narray_fullname}/"
4
+ ar = ARGV.grep( /^--with-netcdf-version=/ )
5
+ if ar.length > 0
6
+ ncversion = ar[0].sub(/^--with-netcdf-version=/,"")
7
+ else
8
+ ncversion = nil
9
+ end
9
10
 
10
- dir_config('narray',narray_include,narray_lib)
11
- dir_config('netcdf','/usr/local')
11
+ if Gem.respond_to?(:find_files)
12
+ require "rbconfig"
13
+ so = RbConfig::CONFIG["DLEXT"]
14
+ narray_include = File.expand_path(File.dirname(Gem.find_files("narray.h")[0]))
15
+ narray_lib = File.expand_path(File.dirname(Gem.find_files("narray." + so)[0]))
16
+ else
17
+ gem_home=(`gem environment GEM_HOME`).chomp
18
+ narray_dir = Dir.glob("#{gem_home}/gems/narray-*").sort[-1]
19
+ if narray_dir
20
+ narray_include = narray_lib = narray_dir
21
+ else
22
+ narray_include = narray_lib = [ $sitearchdir, $vendorarchdir]
23
+ end
24
+ end
25
+ dir_config('narray', narray_include, narray_lib)
26
+
27
+ dir_config('netcdf', '/usr/local')
12
28
 
13
29
  if ( ! ( have_header("narray.h") && have_header("narray_config.h") ) ) then
14
30
  print <<EOS
@@ -22,66 +38,26 @@ EOS
22
38
  exit(-1)
23
39
  end
24
40
 
25
- if xsystem("ncdap-config --libs")
26
- libncdods = "nc-dap"
27
- cflags = `ncdap-config --cflags`.gsub(/\n/, " ")
28
- libs = `ncdap-config --libs`.gsub(/\n/, " ")
29
- prefix_dods = `ncdap-config --prefix`.gsub(/\n/, "")
30
- elsif xsystem("opendap-config --libs")
31
- libncdods = "nc-dods"
32
- cflags = `opendap-config --cflags`.gsub(/\n/, " ")
33
- libs = `opendap-config --libs-nc`.gsub(/\n/, " ")
34
- prefix_dods = `opendap-config --prefix`.gsub(/\n/, "")
41
+ unless ncversion
42
+ # configure netcdf version
43
+ if xsystem("nc-config --version")
44
+ ncversion = `nc-config --version`.chomp!.sub!(/^n.* /i,"") # rm "netCDF "
45
+ ncversion.sub!(/^([^\.]+\.[^\.]+\.[^\.]+).+$/,'\1') # e.g. 4.2.1.1 -> 4.2.1
46
+ else
47
+ ncversion = "3.0.0" # assume version 3 (only for compilation)
48
+ # For compilation, there is no difference among subversions of netcdf 3
49
+ end
35
50
  end
36
51
 
37
- if File.directory?("/usr/include/netcdf") #-- for Vine linux
38
- cflags = "-I/usr/include/netcdf"
39
- libs = "-L/usr/lib"
40
- $CFLAGS += ' ' + cflags
41
- $LOCAL_LIBS += ' ' + libs
52
+ ncver0 = ncversion[0..0] # "3" or "4"
53
+ ncver = ncversion.gsub(/\./,'')
54
+ unless /^\d\d\d$/ =~ ncver # 3 digits
55
+ raise("Invalid netcdf version: #{ncversion}. Use --with-netcdf-version=")
42
56
  end
43
-
44
- if (enable_config('opendap',true) && ( xsystem("opendap-config --libs") ||
45
- xsystem("ncdap-config --libs") ) )
46
-
47
- dir_config(libncdods,prefix_dods)
57
+ $CFLAGS += ' -DNCVER='+ncver
48
58
 
49
- if (!have_library(libncdods))
50
- print <<-EOS
51
- ** ERROR ** Library not found: nc-dods (OPeNDAP/DODS-enabled NetCDF lib)
52
- Install it, or run extconf.rb with option --disable-opendap.
53
- ^^^^^^^^^^^^^^^^^
54
- EOS
55
- exit(-1)
56
- else
57
- print <<-EOS
58
- ** Message ** Compiling with OPeNDAP/DODS-enabled NetCDF library.
59
-
60
- This is because the command opendap-config is found in your system.
61
- If you want to use the ordinary (non-DODS) version of NetCDF,
62
- run extconf.rb with option --disable-opendap.
63
- ^^^^^^^^^^^^^^^^^
64
- EOS
65
- end
66
-
67
- $CFLAGS += ' '+cflags
68
- $LOCAL_LIBS += ' ' + libs
69
-
70
- # non portable treatments: should be improved (by Horinouchi)
71
- CONFIG['LDSHARED'].sub!(/gcc/,'g++')
72
- $LIBS.sub!(/-lc\s/,'') ; $LIBS.sub!(/-lc$/,'')
73
- print <<-EOS
74
- ** Warning ** non-portable treatments are made,
75
- which was sucessfull redhat linux 9:
76
- * gcc was replaced with g++ in CONFIG['LDSHARED']
77
- * -lc library was removed if in $LIBS
78
-
79
- EOS
80
- # p '@@@'
81
- # ary = []
82
- # CONFIG.each{|k,v| ary.push([k,v])}
83
- # ary.sort.each{|x| p x}
84
- else
59
+ case ncver0
60
+ when "4"
85
61
  if xsystem("nc-config --libs") # for NetCDF 4
86
62
  cflags = `nc-config --cflags`.gsub(/\n/, " ")
87
63
  libs = `nc-config --libs`.gsub(/\n/, " ")
@@ -91,23 +67,82 @@ else
91
67
  $CFLAGS += ' ' + cflags
92
68
  $LOCAL_LIBS += ' ' + libs
93
69
  end
94
- if ( ! ( have_header("netcdf.h") && have_library("netcdf") ) )then
95
- print <<-EOS
96
- ** configure error **
97
- Header netcdf.h or the compiled netcdf library is not found.
98
- If you have the library installed under /netcdfdir (that is, netcdf.h is
99
- in /netcdfdir/include and the library in /netcdfdir/lib/),
100
- try the following:
70
+ when "3"
71
+ # for NetCDF 3, which needs external libraries for OpenDAP
72
+ if xsystem("ncdap-config --libs")
73
+ libncdods = "nc-dap"
74
+ cflags = `ncdap-config --cflags`.gsub(/\n/, " ")
75
+ libs = `ncdap-config --libs`.gsub(/\n/, " ")
76
+ prefix_dods = `ncdap-config --prefix`.gsub(/\n/, "")
77
+ elsif xsystem("opendap-config --libs")
78
+ libncdods = "nc-dods"
79
+ cflags = `opendap-config --cflags`.gsub(/\n/, " ")
80
+ libs = `opendap-config --libs-nc`.gsub(/\n/, " ")
81
+ prefix_dods = `opendap-config --prefix`.gsub(/\n/, "")
82
+ end
83
+ if (enable_config('opendap',true) && ( xsystem("opendap-config --libs") ||
84
+ xsystem("ncdap-config --libs") ) )
85
+
86
+ dir_config(libncdods,prefix_dods)
87
+
88
+ if (!have_library(libncdods))
89
+ print <<-EOS
90
+ ** ERROR ** Library not found: nc-dods (OPeNDAP/DODS-enabled NetCDF lib)
91
+ Install it, or run extconf.rb with option --disable-opendap.
92
+ ^^^^^^^^^^^^^^^^^
93
+ EOS
94
+ exit(-1)
95
+ else
96
+ print <<-EOS
97
+ ** Message ** Compiling with OPeNDAP/DODS-enabled NetCDF library.
98
+
99
+ This is because the command opendap-config is found in your system.
100
+ If you want to use the ordinary (non-DODS) version of NetCDF,
101
+ run extconf.rb with option --disable-opendap.
102
+ ^^^^^^^^^^^^^^^^^
103
+ EOS
104
+ end
105
+
106
+ $CFLAGS += ' '+cflags
107
+ $LOCAL_LIBS += ' ' + libs
101
108
 
102
- % ruby extconf.rb --with-netcdf-dir=/netcdfdir
109
+ # non portable treatments: should be improved (by Horinouchi)
110
+ CONFIG['LDSHARED'].sub!(/gcc/,'g++')
111
+ $LIBS.sub!(/-lc\s/,'') ; $LIBS.sub!(/-lc$/,'')
112
+ print <<-EOS
113
+ ** Warning ** non-portable treatments are made,
114
+ which was sucessfull redhat linux 9:
115
+ * gcc was replaced with g++ in CONFIG['LDSHARED']
116
+ * -lc library was removed if in $LIBS
103
117
 
104
- Alternatively, you can specify the two directory separately
105
- with --with-netcdf-include and --with-netcdf-lib.
106
118
  EOS
107
- exit(-1)
119
+ # p '@@@'
120
+ # ary = []
121
+ # CONFIG.each{|k,v| ary.push([k,v])}
122
+ # ary.sort.each{|x| p x}
123
+ else
124
+ if ( ! ( have_header("netcdf.h") && have_library("netcdf") ) )then
125
+ print <<-EOS
126
+ ** configure error **
127
+ Header netcdf.h or the compiled netcdf library is not found.
128
+ If you have the library installed under /netcdfdir (that is, netcdf.h is
129
+ in /netcdfdir/include and the library in /netcdfdir/lib/),
130
+ try the following:
131
+
132
+ % ruby extconf.rb --with-netcdf-dir=/netcdfdir
133
+
134
+ Alternatively, you can specify the two directory separately
135
+ with --with-netcdf-include and --with-netcdf-lib.
136
+ EOS
137
+ exit(-1)
138
+ end
108
139
  end
140
+ else
141
+ raise "Netcdf version #{ncver0} is not supported"
109
142
  end
110
143
 
144
+
145
+
111
146
  if /cygwin|mingw/ =~ RUBY_PLATFORM
112
147
  have_library("narray") || raise("ERROR: narray library is not found")
113
148
  end
@@ -128,9 +163,9 @@ oldmkfl.each_line{ |line|
128
163
  newmkfl.puts("")
129
164
  newmkfl.puts("test: all") # insert the "test" target
130
165
  newmkfl.puts("\t\t@cd test && ruby test.rb && echo 'test did not fail :-p (please ignore the warnings)' && cd ..")
131
- when /lib\/netcdf/
132
- line = line.chomp! + "/"
133
- newmkfl.puts(line)
166
+ # when /lib\/netcdf/
167
+ # line = line.chomp! + "/"
168
+ # newmkfl.puts(line)
134
169
  else
135
170
  newmkfl.puts(line)
136
171
  end
@@ -1,12 +1,67 @@
1
1
  require 'narray'
2
2
  require 'numru/netcdfraw'
3
3
 
4
- # NetCDF$B%/%i%9$K4X$7$F(B
4
+ if NArray.const_defined?(:SUPPORT_BIGMEM) && NArray::SUPPORT_BIGMEM
5
+ unless NumRu::NetCDF::SUPPORT_BIGMEM
6
+ raise "Ruby-NetCDF was compiled with NArray with big memory supoort " +
7
+ "(NArray-bigmem). However the NArray loaded is not NArray-bigmem."
8
+ end
9
+ else
10
+ if NumRu::NetCDF::SUPPORT_BIGMEM
11
+ raise "Ruby-NetCDF was compiled with NArray without big memory support. " +
12
+ "However the NArray loaded is with the support (NArray-bigmem)."
13
+ end
14
+ end
15
+
5
16
  module NumRu
6
17
  class NetCDF
7
18
 
8
19
  Max_Try = 100
9
20
 
21
+ NCVERSION = NetCDF.libvers
22
+
23
+ if NCVERSION[0..0] >= "4"
24
+ @@nc4 = true
25
+ else
26
+ @@nc4 = false
27
+ end
28
+ def NetCDF.nc4?
29
+ @@nc4
30
+ end
31
+
32
+ @@cr_format = 0
33
+
34
+ def NetCDF.creation_format=(cmode)
35
+ raise("This method is available only for NetCDF >= 4") unless @@nc4
36
+ case cmode
37
+ when 0, nil, NC_CLASSIC_MODEL, /^CLASSIC$/i # classic netcdf ver 3 fmt
38
+ @@cr_format = 0
39
+ when NC_64BIT_OFFSET, /^64BIT_OFFSET$/i
40
+ @@cr_format = NC_64BIT_OFFSET
41
+ when NC_NETCDF4, /^NETCDF4$/i
42
+ @@cr_format = NC_NETCDF4
43
+ when ( NC_NETCDF4 | NC_CLASSIC_MODEL), /^NETCDF4_CLASSIC$/i
44
+ # NetCDF4 but disabling new data models
45
+ @@cr_format = NC_NETCDF4 | NC_CLASSIC_MODEL
46
+ else
47
+ raise ArgumentError, "Unsupported creation mode: #{cmod.to_s}"
48
+ end
49
+ end
50
+
51
+ def NetCDF.creation_format
52
+ raise("This method is available only for NetCDF >= 4") unless @@nc4
53
+ case @@cr_format
54
+ when 0
55
+ "TRADITIONAL"
56
+ when NC_64BIT_OFFSET
57
+ "64BIT_OFFSET"
58
+ when NC_NETCDF4
59
+ "NETCDF4"
60
+ when NC_NETCDF4 | NC_CLASSIC_MODEL
61
+ "NETCDF4_CLASSIC"
62
+ end
63
+ end
64
+
10
65
  def NetCDF.open(filename,mode="r",share=false)
11
66
  call_create=false # false-> nc_open; true->nc_create
12
67
  case(mode)
@@ -64,7 +119,7 @@ module NumRu
64
119
  raise NetcdfError,"share (3rd argument) must be true or false"
65
120
  end
66
121
 
67
- cmode=noclobber | share
122
+ cmode=noclobber | share | @@cr_format
68
123
  nc_create(filename,cmode)
69
124
  end
70
125
 
@@ -218,7 +273,6 @@ module NumRu
218
273
 
219
274
  end
220
275
 
221
- #NetCDFVar class $B$K4X$7$F(B
222
276
  class NetCDFVar
223
277
 
224
278
  class << NetCDFVar
@@ -522,77 +576,39 @@ module NumRu
522
576
  end
523
577
  elsif hash.key?("start")==true
524
578
  h_sta = hash["start"]
525
- endq = hash.key?("end")
526
- strq = hash.key?("stride")
527
- if endq == false && strq == false
528
- if t_var == "char"
529
- get_vars_char(h_sta,nil,nil)
530
- elsif t_var == "byte"
531
- get_vars_byte(h_sta,nil,nil)
532
- elsif t_var == "sint"
533
- get_vars_sint(h_sta,nil,nil)
534
- elsif t_var == "int"
535
- get_vars_int(h_sta,nil,nil)
536
- elsif t_var == "sfloat"
537
- get_vars_sfloat(h_sta,nil,nil)
538
- elsif t_var == "float"
539
- get_vars_float(h_sta,nil,nil)
540
- else
541
- raise NetcdfError, "varialbe type #{t_var} isn't supported in netCDF"
542
- end
543
- elsif endq == true && strq == false
544
- h_end = hash["end"]
545
- if t_var == "char"
546
- get_vars_char(h_sta,h_end,nil)
547
- elsif t_var == "byte"
548
- get_vars_byte(h_sta,h_end,nil)
549
- elsif t_var == "sint"
550
- get_vars_sint(h_sta,h_end,nil)
551
- elsif t_var == "int"
552
- get_vars_int(h_sta,h_end,nil)
553
- elsif t_var == "sfloat"
554
- get_vars_sfloat(h_sta,h_end,nil)
555
- elsif t_var == "float"
556
- get_vars_float(h_sta,h_end,nil)
557
- else
558
- raise NetcdfError, "variable type #{t_var} isn't supported in netCDF"
559
- end
560
- elsif endq == false && strq == true
561
- h_str = hash["stride"]
562
- if t_var == "char"
563
- get_vars_char(h_sta,nil,h_str)
564
- elsif t_var == "byte"
565
- get_vars_byte(h_sta,nil,h_str)
566
- elsif t_var == "sint"
567
- get_vars_sint(h_sta,nil,h_str)
568
- elsif t_var == "int"
569
- get_vars_int(h_sta,nil,h_str)
570
- elsif t_var == "sfloat"
571
- get_vars_sfloat(h_sta,nil,h_str)
572
- elsif t_var == "float"
573
- get_vars_float(h_sta,nil,h_str)
574
- else
575
- raise NetcdfError, "variable type #{t_var} isn't supported in netCDF"
576
- end
577
- else endq == true && strq == true
578
- h_end = hash["end"]
579
- h_str = hash["stride"]
580
- if t_var == "char"
581
- get_vars_char(h_sta,h_end,h_str)
582
- elsif t_var == "byte"
583
- get_vars_byte(h_sta,h_end,h_str)
584
- elsif t_var == "sint"
585
- get_vars_sint(h_sta,h_end,h_str)
586
- elsif t_var == "int"
587
- get_vars_int(h_sta,h_end,h_str)
588
- elsif t_var == "sfloat"
589
- get_vars_sfloat(h_sta,h_end,h_str)
590
- elsif t_var == "float"
591
- get_vars_float(h_sta,h_end,h_str)
592
- else
593
- raise NetcdfError, "variable type #{t_var} isn't supported in netCDF"
594
- end
579
+ h_end = hash["end"] # can be nill
580
+ h_str = hash["stride"] # can be nill
581
+ if NetCDF.nc4? && h_str && ((xstr=h_str[0]) != 1)
582
+ # Tentative treatment for the very slow netcdf-4 reading with step.
583
+ # Reading with step is generally slow with NetCDF 4, but it is
584
+ # particularly so for the first dimension.
585
+ # Ref: http://www.unidata.ucar.edu/mailing_lists/archives/netcdfgroup/2013/msg00311.html
586
+ h_str[0] = 1
587
+ nc4remedy = true
588
+ else
589
+ nc4remedy = false
590
+ end
591
+ if t_var == "char"
592
+ v = get_vars_char(h_sta,h_end,h_str)
593
+ elsif t_var == "byte"
594
+ v = get_vars_byte(h_sta,h_end,h_str)
595
+ elsif t_var == "sint"
596
+ v = get_vars_sint(h_sta,h_end,h_str)
597
+ elsif t_var == "int"
598
+ v = get_vars_int(h_sta,h_end,h_str)
599
+ elsif t_var == "sfloat"
600
+ v = get_vars_sfloat(h_sta,h_end,h_str)
601
+ elsif t_var == "float"
602
+ v = get_vars_float(h_sta,h_end,h_str)
603
+ else
604
+ raise NetcdfError, "variable type #{t_var} isn't supported in netCDF"
605
+ end
606
+ if nc4remedy
607
+ idx = []
608
+ (0...v.shape[0]).step(xstr){|k| idx.push(k)}
609
+ v = v[idx,false]
595
610
  end
611
+ v
596
612
  else
597
613
  raise ArgumentError,"{'start'}=>{ARRAY} or {'index'}=>{ARRAY} is needed"
598
614
  end