rb-grib 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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