rb-grib 0.2.0 → 0.2.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.
data/ext/grib.c CHANGED
@@ -102,6 +102,12 @@ struct var_list {
102
102
  msg_array *ary;
103
103
  var_list *next;
104
104
  VALUE file;
105
+ long disc;
106
+ long mtabl;
107
+ long cent;
108
+ long ltabl;
109
+ long categ;
110
+ long pnum;
105
111
  };
106
112
  static var_list*
107
113
  var_list_alloc(VALUE file)
@@ -150,7 +156,7 @@ push_msg_var(var_list **pvar, grib_handle *handle, VALUE file)
150
156
  {
151
157
  size_t len = MAX_VALUE_LENGTH;
152
158
  char vname[MAX_VALUE_LENGTH];
153
- bzero(vname, len);
159
+ /*
154
160
  if (grib_get_string(handle, "shortName", vname, &len) != GRIB_SUCCESS ||
155
161
  strcmp("unknown", vname) == 0) {
156
162
  long id;
@@ -162,21 +168,48 @@ push_msg_var(var_list **pvar, grib_handle *handle, VALUE file)
162
168
  rb_raise(rb_eRuntimeError, "cannot get variable name");
163
169
  }
164
170
  }
171
+ */
172
+ long edition;
173
+ long cent, mtabl, pnum;
174
+ long disc, ltabl, categ;
165
175
  long ni, nj, ltype_id;
166
176
  char gtype[MAX_VALUE_LENGTH];
167
177
  len = MAX_VALUE_LENGTH;
168
- if (grib_get_long(handle, "Ni", &ni) != GRIB_SUCCESS ||
169
- grib_get_long(handle, "Nj", &nj) != GRIB_SUCCESS ||
170
- grib_get_string(handle, "typeOfGrid", gtype, &len) != GRIB_SUCCESS ||
171
- (grib_get_long(handle, "indicatorOfTypeOfLevel", &ltype_id) != GRIB_SUCCESS && grib_get_long(handle, "typeOfFirstFixedSurface", &ltype_id) != GRIB_SUCCESS)) {
178
+
179
+ grib_get_long(handle, "editionNumber", &edition);
180
+ grib_get_long(handle, "centre", &cent);
181
+ if(grib_get_long(handle, "Ni", &ni) != GRIB_SUCCESS ||
182
+ grib_get_long(handle, "Nj", &nj) != GRIB_SUCCESS ||
183
+ grib_get_string(handle, "typeOfGrid", gtype, &len) != GRIB_SUCCESS ||
184
+ (grib_get_long(handle, "indicatorOfTypeOfLevel", &ltype_id) != GRIB_SUCCESS && grib_get_long(handle, "typeOfFirstFixedSurface", &ltype_id) != GRIB_SUCCESS))
172
185
  rb_raise(rb_eRuntimeError, "connot identify grid type");
186
+ switch (edition) {
187
+ case 1:
188
+ if(grib_get_long(handle, "table2Version", &mtabl) != GRIB_SUCCESS ||
189
+ grib_get_long(handle, "indicatorOfParameter", &pnum) != GRIB_SUCCESS)
190
+ rb_raise(rb_eRuntimeError, "connot identify variable");
191
+ break;
192
+ case 2:
193
+ if (grib_get_long(handle, "tablesVersion", &mtabl) != GRIB_SUCCESS ||
194
+ grib_get_long(handle, "parameterNumber", &pnum) != GRIB_SUCCESS ||
195
+ grib_get_long(handle, "discipline", &disc) != GRIB_SUCCESS ||
196
+ grib_get_long(handle, "localTablesVersion", &ltabl) != GRIB_SUCCESS ||
197
+ grib_get_long(handle, "parameterCategory", &categ) != GRIB_SUCCESS)
198
+ rb_raise(rb_eRuntimeError, "connot identify variable");
173
199
  }
174
200
  var_list *last = NULL;
175
201
  var_list *var = pvar[0];
176
202
  if (var) {
177
203
  while (var) {
178
- if (strcmp(var->vname, vname)==0 && var->ni == ni && var->nj == nj && strcmp(var->gtype,gtype)==0 && var->ltype_id==ltype_id) {
179
- push_msg(var->ary, handle);
204
+ if (var->cent == cent && var->mtabl == mtabl && var->pnum == pnum &&
205
+ var->ni == ni && var->nj == nj &&
206
+ strcmp(var->gtype,gtype)==0 &&
207
+ var->ltype_id==ltype_id) {
208
+ if (edition == 1)
209
+ push_msg(var->ary, handle);
210
+ else if (edition == 2 &&
211
+ var->disc == disc && var->ltabl == ltabl && var->categ == categ)
212
+ push_msg(var->ary, handle);
180
213
  return;
181
214
  }
182
215
  last = var;
@@ -186,14 +219,46 @@ push_msg_var(var_list **pvar, grib_handle *handle, VALUE file)
186
219
  var_list *var_new = var_list_alloc(file);
187
220
  if (var_new == NULL)
188
221
  rb_raise(rb_eRuntimeError, "cannot allocate memory");
222
+ var_new->cent = cent;
223
+ var_new->mtabl = mtabl;
224
+ var_new->pnum = pnum;
225
+ if (edition == 2) {
226
+ var_new->disc = disc;
227
+ var_new->ltabl = ltabl;
228
+ var_new->categ = categ;
229
+ }
189
230
  var_new->ni = ni;
190
231
  var_new->nj = nj;
191
232
  var_new->ltype_id = ltype_id;
192
- strcpy(var_new->vname, vname);
193
233
  strcpy(var_new->gtype, gtype);
234
+
194
235
  len = MAX_VALUE_LENGTH;
236
+ bzero(vname, len);
237
+ if (grib_get_string(handle, "shortName", vname, &len) != GRIB_SUCCESS ||
238
+ strcmp("unknown", vname) == 0) {
239
+ sprintf(vname, "id%ld", pnum);
240
+ }
241
+ strcpy(var_new->vname, vname);
242
+
243
+ len = MAX_VALUE_LENGTH;
244
+ bzero(vname, len);
195
245
  check_error(grib_get_string(handle, "typeOfLevel", vname, &len));
196
- strcpy(var_new->ltype, vname);
246
+ if (strcmp(vname, "unknown")==0 || strcmp(vname,"isobaricInhPa")== 0 || strcmp(vname,"pl")==0)
247
+ strcpy(var_new->ltype, vname);
248
+ else {
249
+ int i, j;
250
+ var_new->ltype[0] = vname[0];
251
+ for (i=1,j=1; i<strlen(vname); i++) {
252
+ if (vname[i]>=65 && vname[i]<=90) {
253
+ var_new->ltype[j] = vname[i]+32;
254
+ j++;
255
+ }
256
+ }
257
+ if (j==1)
258
+ strcpy(var_new->ltype, vname);
259
+ else
260
+ var_new->ltype[j] = 0;
261
+ }
197
262
  push_msg(var_new->ary, handle);
198
263
  if (last)
199
264
  last->next = var_new;
@@ -75,9 +75,12 @@ module NumRu
75
75
  get_value("pressureUnits")
76
76
  end
77
77
  def date
78
+ return DateTime.parse(date_raw)
79
+ end
80
+ def date_raw
78
81
  d = get_value("dataDate").to_s.rjust(8,"0")
79
82
  h = get_value("dataTime").to_s.rjust(4,"0")
80
- return DateTime.parse(d << h)
83
+ d << h
81
84
  end
82
85
  def step
83
86
  get_value("step")
@@ -277,7 +280,7 @@ module NumRu
277
280
  end
278
281
  private
279
282
  def get_time(date)
280
- (date - Day0).to_f*24
283
+ (DateTime.parse(date) - Day0).to_f*24
281
284
  end
282
285
  def init
283
286
  @attr = Hash.new
@@ -312,7 +315,7 @@ module NumRu
312
315
  hash = Hash.new
313
316
  msgs.each_with_index do |msg,i|
314
317
  zv = msg.z_value
315
- tv = get_time(msg.date)
318
+ tv = msg.date_raw
316
319
  stv = msg.step
317
320
  tiv = msg.time_interval
318
321
  env = msg.ensemble_member
@@ -363,7 +366,7 @@ module NumRu
363
366
  d = def_dim("time", -1)
364
367
  d.put_att("long_name","time")
365
368
  d.put_att("units","hours since #{Day0.strftime('%Y-%m-%d %H:%M:%S')}")
366
- d.put(NArray.to_na(t))
369
+ d.put(NArray.to_na(t.map{|tv|get_time(tv)}))
367
370
  end
368
371
  if st.length == 1
369
372
  put_att("step", [msg.step]) if msg.step
@@ -1,10 +1,10 @@
1
- def_path = File.join(File.expand_path(File.dirname(__FILE__)),"grib","definitions")
1
+ def_path = File.join(File.expand_path(File.dirname(__FILE__)),"definitions")
2
2
  if File.exist?(def_path)
3
3
  env_name = 'GRIB_DEFINITION_PATH'
4
4
  if gdp = ENV[env_name]
5
5
  ENV[env_name] = "#{gdp}:#{def_path}"
6
6
  else
7
- path = `grib_info -d`
7
+ path = `grib_info -d`.strip
8
8
  if File.exist?(path)
9
9
  ENV[env_name] = "#{path}:#{def_path}"
10
10
  end
@@ -1,5 +1,5 @@
1
1
  module NumRu
2
2
  class Grib
3
- VERSION = "0.2.0"
3
+ VERSION = "0.2.1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rb-grib
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
5
- prerelease: false
4
+ hash: 21
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 0
10
- version: 0.2.0
9
+ - 1
10
+ version: 0.2.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Seiya Nishizawa
@@ -15,8 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-12-15 00:00:00 +09:00
19
- default_executable:
18
+ date: 2012-02-21 00:00:00 Z
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
21
  name: rspec
@@ -107,7 +106,6 @@ files:
107
106
  - rb-grib.gemspec
108
107
  - spec/grib_read_spec.rb
109
108
  - spec/spec_helper.rb
110
- has_rdoc: true
111
109
  homepage: http://ruby.gfd-dennou.org/products/rb-grib/
112
110
  licenses: []
113
111
 
@@ -137,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
137
135
  requirements: []
138
136
 
139
137
  rubyforge_project: rb-grib
140
- rubygems_version: 1.3.7
138
+ rubygems_version: 1.8.11
141
139
  signing_key:
142
140
  specification_version: 3
143
141
  summary: Ruby class library to hanlde GRIB file