gphys 1.1.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (369) hide show
  1. data/.gitignore +17 -0
  2. data/ChangeLog +221 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +18 -30
  5. data/README +23 -26
  6. data/README.md +29 -0
  7. data/Rakefile +1 -56
  8. data/bin/gpaop +2 -1
  9. data/bin/gpcut +3 -2
  10. data/bin/gpedit +6 -2
  11. data/bin/gpmath +3 -2
  12. data/bin/gpmaxmin +3 -2
  13. data/bin/gpprint +2 -1
  14. data/bin/gpvect +28 -5
  15. data/bin/gpview +43 -5
  16. data/extconf.rb +5 -6
  17. data/gphys.gemspec +34 -0
  18. data/interpo.c +63 -24
  19. data/lib/gphys.rb +2 -0
  20. data/lib/numru/dclext.rb +2636 -0
  21. data/lib/numru/derivative.rb +53 -12
  22. data/lib/numru/ganalysis/eof.rb +4 -0
  23. data/lib/numru/ganalysis/histogram.rb +73 -5
  24. data/lib/numru/ganalysis/met.rb +163 -2
  25. data/lib/numru/ganalysis/planet.rb +230 -20
  26. data/lib/numru/ggraph.rb +147 -2247
  27. data/lib/numru/gphys/assoccoords.rb +19 -3
  28. data/lib/numru/gphys/axis.rb +1 -1
  29. data/lib/numru/gphys/coordmapping.rb +2 -2
  30. data/lib/numru/gphys/derivative.rb +56 -13
  31. data/lib/numru/gphys/gphys.rb +17 -1
  32. data/lib/numru/gphys/gphys_grads_io.rb +6 -5
  33. data/lib/numru/gphys/gphys_grib_io.rb +6 -6
  34. data/lib/numru/gphys/gphys_io.rb +25 -6
  35. data/lib/numru/gphys/grads_gridded.rb +31 -29
  36. data/lib/numru/gphys/grib.rb +13 -9
  37. data/lib/numru/gphys/interpolate.rb +153 -29
  38. data/lib/numru/gphys/unumeric.rb +29 -6
  39. data/lib/numru/gphys/varray.rb +9 -0
  40. data/lib/numru/gphys/varraygrib.rb +70 -8
  41. data/lib/version.rb +3 -0
  42. metadata +247 -531
  43. data/doc/attribute.html +0 -19
  44. data/doc/attributenetcdf.html +0 -15
  45. data/doc/axis.html +0 -376
  46. data/doc/coordmapping.html +0 -111
  47. data/doc/coordtransform.html +0 -36
  48. data/doc/derivative/gphys-derivative.html +0 -80
  49. data/doc/derivative/index.html +0 -21
  50. data/doc/derivative/index.rd +0 -14
  51. data/doc/derivative/math-doc/document/document.css +0 -30
  52. data/doc/derivative/math-doc/document/document.html +0 -57
  53. data/doc/derivative/math-doc/document/images.aux +0 -1
  54. data/doc/derivative/math-doc/document/images.log +0 -385
  55. data/doc/derivative/math-doc/document/images.pl +0 -186
  56. data/doc/derivative/math-doc/document/images.tex +0 -364
  57. data/doc/derivative/math-doc/document/img1.png +0 -0
  58. data/doc/derivative/math-doc/document/img10.png +0 -0
  59. data/doc/derivative/math-doc/document/img11.png +0 -0
  60. data/doc/derivative/math-doc/document/img12.png +0 -0
  61. data/doc/derivative/math-doc/document/img13.png +0 -0
  62. data/doc/derivative/math-doc/document/img14.png +0 -0
  63. data/doc/derivative/math-doc/document/img15.png +0 -0
  64. data/doc/derivative/math-doc/document/img16.png +0 -0
  65. data/doc/derivative/math-doc/document/img17.png +0 -0
  66. data/doc/derivative/math-doc/document/img18.png +0 -0
  67. data/doc/derivative/math-doc/document/img19.png +0 -0
  68. data/doc/derivative/math-doc/document/img2.png +0 -0
  69. data/doc/derivative/math-doc/document/img20.png +0 -0
  70. data/doc/derivative/math-doc/document/img21.png +0 -0
  71. data/doc/derivative/math-doc/document/img22.png +0 -0
  72. data/doc/derivative/math-doc/document/img23.png +0 -0
  73. data/doc/derivative/math-doc/document/img24.png +0 -0
  74. data/doc/derivative/math-doc/document/img25.png +0 -0
  75. data/doc/derivative/math-doc/document/img26.png +0 -0
  76. data/doc/derivative/math-doc/document/img27.png +0 -0
  77. data/doc/derivative/math-doc/document/img28.png +0 -0
  78. data/doc/derivative/math-doc/document/img29.png +0 -0
  79. data/doc/derivative/math-doc/document/img3.png +0 -0
  80. data/doc/derivative/math-doc/document/img30.png +0 -0
  81. data/doc/derivative/math-doc/document/img4.png +0 -0
  82. data/doc/derivative/math-doc/document/img5.png +0 -0
  83. data/doc/derivative/math-doc/document/img6.png +0 -0
  84. data/doc/derivative/math-doc/document/img7.png +0 -0
  85. data/doc/derivative/math-doc/document/img8.png +0 -0
  86. data/doc/derivative/math-doc/document/img9.png +0 -0
  87. data/doc/derivative/math-doc/document/index.html +0 -57
  88. data/doc/derivative/math-doc/document/labels.pl +0 -13
  89. data/doc/derivative/math-doc/document/next.png +0 -0
  90. data/doc/derivative/math-doc/document/next_g.png +0 -0
  91. data/doc/derivative/math-doc/document/node1.html +0 -238
  92. data/doc/derivative/math-doc/document/node2.html +0 -75
  93. data/doc/derivative/math-doc/document/prev.png +0 -0
  94. data/doc/derivative/math-doc/document/prev_g.png +0 -0
  95. data/doc/derivative/math-doc/document/up.png +0 -0
  96. data/doc/derivative/math-doc/document/up_g.png +0 -0
  97. data/doc/derivative/math-doc/document.pdf +0 -0
  98. data/doc/derivative/math-doc/document.tex +0 -158
  99. data/doc/derivative/numru-derivative.html +0 -129
  100. data/doc/ep_flux/ep_flux.html +0 -469
  101. data/doc/ep_flux/ggraph_on_merdional_section.html +0 -71
  102. data/doc/ep_flux/index.html +0 -31
  103. data/doc/ep_flux/index.rd +0 -24
  104. data/doc/ep_flux/math-doc/document/WARNINGS +0 -1
  105. data/doc/ep_flux/math-doc/document/contents.png +0 -0
  106. data/doc/ep_flux/math-doc/document/crossref.png +0 -0
  107. data/doc/ep_flux/math-doc/document/document.css +0 -30
  108. data/doc/ep_flux/math-doc/document/document.html +0 -101
  109. data/doc/ep_flux/math-doc/document/images.aux +0 -1
  110. data/doc/ep_flux/math-doc/document/images.log +0 -1375
  111. data/doc/ep_flux/math-doc/document/images.pl +0 -1328
  112. data/doc/ep_flux/math-doc/document/images.tex +0 -1471
  113. data/doc/ep_flux/math-doc/document/img1.png +0 -0
  114. data/doc/ep_flux/math-doc/document/img10.png +0 -0
  115. data/doc/ep_flux/math-doc/document/img100.png +0 -0
  116. data/doc/ep_flux/math-doc/document/img101.png +0 -0
  117. data/doc/ep_flux/math-doc/document/img102.png +0 -0
  118. data/doc/ep_flux/math-doc/document/img103.png +0 -0
  119. data/doc/ep_flux/math-doc/document/img104.png +0 -0
  120. data/doc/ep_flux/math-doc/document/img105.png +0 -0
  121. data/doc/ep_flux/math-doc/document/img106.png +0 -0
  122. data/doc/ep_flux/math-doc/document/img107.png +0 -0
  123. data/doc/ep_flux/math-doc/document/img108.png +0 -0
  124. data/doc/ep_flux/math-doc/document/img109.png +0 -0
  125. data/doc/ep_flux/math-doc/document/img11.png +0 -0
  126. data/doc/ep_flux/math-doc/document/img110.png +0 -0
  127. data/doc/ep_flux/math-doc/document/img111.png +0 -0
  128. data/doc/ep_flux/math-doc/document/img112.png +0 -0
  129. data/doc/ep_flux/math-doc/document/img113.png +0 -0
  130. data/doc/ep_flux/math-doc/document/img114.png +0 -0
  131. data/doc/ep_flux/math-doc/document/img115.png +0 -0
  132. data/doc/ep_flux/math-doc/document/img116.png +0 -0
  133. data/doc/ep_flux/math-doc/document/img117.png +0 -0
  134. data/doc/ep_flux/math-doc/document/img118.png +0 -0
  135. data/doc/ep_flux/math-doc/document/img119.png +0 -0
  136. data/doc/ep_flux/math-doc/document/img12.png +0 -0
  137. data/doc/ep_flux/math-doc/document/img120.png +0 -0
  138. data/doc/ep_flux/math-doc/document/img121.png +0 -0
  139. data/doc/ep_flux/math-doc/document/img122.png +0 -0
  140. data/doc/ep_flux/math-doc/document/img123.png +0 -0
  141. data/doc/ep_flux/math-doc/document/img124.png +0 -0
  142. data/doc/ep_flux/math-doc/document/img125.png +0 -0
  143. data/doc/ep_flux/math-doc/document/img126.png +0 -0
  144. data/doc/ep_flux/math-doc/document/img127.png +0 -0
  145. data/doc/ep_flux/math-doc/document/img128.png +0 -0
  146. data/doc/ep_flux/math-doc/document/img129.png +0 -0
  147. data/doc/ep_flux/math-doc/document/img13.png +0 -0
  148. data/doc/ep_flux/math-doc/document/img130.png +0 -0
  149. data/doc/ep_flux/math-doc/document/img131.png +0 -0
  150. data/doc/ep_flux/math-doc/document/img132.png +0 -0
  151. data/doc/ep_flux/math-doc/document/img133.png +0 -0
  152. data/doc/ep_flux/math-doc/document/img134.png +0 -0
  153. data/doc/ep_flux/math-doc/document/img135.png +0 -0
  154. data/doc/ep_flux/math-doc/document/img136.png +0 -0
  155. data/doc/ep_flux/math-doc/document/img137.png +0 -0
  156. data/doc/ep_flux/math-doc/document/img138.png +0 -0
  157. data/doc/ep_flux/math-doc/document/img139.png +0 -0
  158. data/doc/ep_flux/math-doc/document/img14.png +0 -0
  159. data/doc/ep_flux/math-doc/document/img140.png +0 -0
  160. data/doc/ep_flux/math-doc/document/img141.png +0 -0
  161. data/doc/ep_flux/math-doc/document/img142.png +0 -0
  162. data/doc/ep_flux/math-doc/document/img143.png +0 -0
  163. data/doc/ep_flux/math-doc/document/img144.png +0 -0
  164. data/doc/ep_flux/math-doc/document/img145.png +0 -0
  165. data/doc/ep_flux/math-doc/document/img146.png +0 -0
  166. data/doc/ep_flux/math-doc/document/img147.png +0 -0
  167. data/doc/ep_flux/math-doc/document/img148.png +0 -0
  168. data/doc/ep_flux/math-doc/document/img149.png +0 -0
  169. data/doc/ep_flux/math-doc/document/img15.png +0 -0
  170. data/doc/ep_flux/math-doc/document/img150.png +0 -0
  171. data/doc/ep_flux/math-doc/document/img151.png +0 -0
  172. data/doc/ep_flux/math-doc/document/img152.png +0 -0
  173. data/doc/ep_flux/math-doc/document/img153.png +0 -0
  174. data/doc/ep_flux/math-doc/document/img154.png +0 -0
  175. data/doc/ep_flux/math-doc/document/img155.png +0 -0
  176. data/doc/ep_flux/math-doc/document/img156.png +0 -0
  177. data/doc/ep_flux/math-doc/document/img157.png +0 -0
  178. data/doc/ep_flux/math-doc/document/img158.png +0 -0
  179. data/doc/ep_flux/math-doc/document/img159.png +0 -0
  180. data/doc/ep_flux/math-doc/document/img16.png +0 -0
  181. data/doc/ep_flux/math-doc/document/img160.png +0 -0
  182. data/doc/ep_flux/math-doc/document/img161.png +0 -0
  183. data/doc/ep_flux/math-doc/document/img162.png +0 -0
  184. data/doc/ep_flux/math-doc/document/img163.png +0 -0
  185. data/doc/ep_flux/math-doc/document/img164.png +0 -0
  186. data/doc/ep_flux/math-doc/document/img165.png +0 -0
  187. data/doc/ep_flux/math-doc/document/img166.png +0 -0
  188. data/doc/ep_flux/math-doc/document/img167.png +0 -0
  189. data/doc/ep_flux/math-doc/document/img168.png +0 -0
  190. data/doc/ep_flux/math-doc/document/img169.png +0 -0
  191. data/doc/ep_flux/math-doc/document/img17.png +0 -0
  192. data/doc/ep_flux/math-doc/document/img170.png +0 -0
  193. data/doc/ep_flux/math-doc/document/img171.png +0 -0
  194. data/doc/ep_flux/math-doc/document/img172.png +0 -0
  195. data/doc/ep_flux/math-doc/document/img173.png +0 -0
  196. data/doc/ep_flux/math-doc/document/img174.png +0 -0
  197. data/doc/ep_flux/math-doc/document/img175.png +0 -0
  198. data/doc/ep_flux/math-doc/document/img176.png +0 -0
  199. data/doc/ep_flux/math-doc/document/img177.png +0 -0
  200. data/doc/ep_flux/math-doc/document/img178.png +0 -0
  201. data/doc/ep_flux/math-doc/document/img179.png +0 -0
  202. data/doc/ep_flux/math-doc/document/img18.png +0 -0
  203. data/doc/ep_flux/math-doc/document/img180.png +0 -0
  204. data/doc/ep_flux/math-doc/document/img181.png +0 -0
  205. data/doc/ep_flux/math-doc/document/img182.png +0 -0
  206. data/doc/ep_flux/math-doc/document/img183.png +0 -0
  207. data/doc/ep_flux/math-doc/document/img184.png +0 -0
  208. data/doc/ep_flux/math-doc/document/img185.png +0 -0
  209. data/doc/ep_flux/math-doc/document/img186.png +0 -0
  210. data/doc/ep_flux/math-doc/document/img187.png +0 -0
  211. data/doc/ep_flux/math-doc/document/img188.png +0 -0
  212. data/doc/ep_flux/math-doc/document/img189.png +0 -0
  213. data/doc/ep_flux/math-doc/document/img19.png +0 -0
  214. data/doc/ep_flux/math-doc/document/img190.png +0 -0
  215. data/doc/ep_flux/math-doc/document/img191.png +0 -0
  216. data/doc/ep_flux/math-doc/document/img192.png +0 -0
  217. data/doc/ep_flux/math-doc/document/img193.png +0 -0
  218. data/doc/ep_flux/math-doc/document/img194.png +0 -0
  219. data/doc/ep_flux/math-doc/document/img195.png +0 -0
  220. data/doc/ep_flux/math-doc/document/img196.png +0 -0
  221. data/doc/ep_flux/math-doc/document/img197.png +0 -0
  222. data/doc/ep_flux/math-doc/document/img198.png +0 -0
  223. data/doc/ep_flux/math-doc/document/img199.png +0 -0
  224. data/doc/ep_flux/math-doc/document/img2.png +0 -0
  225. data/doc/ep_flux/math-doc/document/img20.png +0 -0
  226. data/doc/ep_flux/math-doc/document/img200.png +0 -0
  227. data/doc/ep_flux/math-doc/document/img21.png +0 -0
  228. data/doc/ep_flux/math-doc/document/img22.png +0 -0
  229. data/doc/ep_flux/math-doc/document/img23.png +0 -0
  230. data/doc/ep_flux/math-doc/document/img24.png +0 -0
  231. data/doc/ep_flux/math-doc/document/img25.png +0 -0
  232. data/doc/ep_flux/math-doc/document/img26.png +0 -0
  233. data/doc/ep_flux/math-doc/document/img27.png +0 -0
  234. data/doc/ep_flux/math-doc/document/img28.png +0 -0
  235. data/doc/ep_flux/math-doc/document/img29.png +0 -0
  236. data/doc/ep_flux/math-doc/document/img3.png +0 -0
  237. data/doc/ep_flux/math-doc/document/img30.png +0 -0
  238. data/doc/ep_flux/math-doc/document/img31.png +0 -0
  239. data/doc/ep_flux/math-doc/document/img32.png +0 -0
  240. data/doc/ep_flux/math-doc/document/img33.png +0 -0
  241. data/doc/ep_flux/math-doc/document/img34.png +0 -0
  242. data/doc/ep_flux/math-doc/document/img35.png +0 -0
  243. data/doc/ep_flux/math-doc/document/img36.png +0 -0
  244. data/doc/ep_flux/math-doc/document/img37.png +0 -0
  245. data/doc/ep_flux/math-doc/document/img38.png +0 -0
  246. data/doc/ep_flux/math-doc/document/img39.png +0 -0
  247. data/doc/ep_flux/math-doc/document/img4.png +0 -0
  248. data/doc/ep_flux/math-doc/document/img40.png +0 -0
  249. data/doc/ep_flux/math-doc/document/img41.png +0 -0
  250. data/doc/ep_flux/math-doc/document/img42.png +0 -0
  251. data/doc/ep_flux/math-doc/document/img43.png +0 -0
  252. data/doc/ep_flux/math-doc/document/img44.png +0 -0
  253. data/doc/ep_flux/math-doc/document/img45.png +0 -0
  254. data/doc/ep_flux/math-doc/document/img46.png +0 -0
  255. data/doc/ep_flux/math-doc/document/img47.png +0 -0
  256. data/doc/ep_flux/math-doc/document/img48.png +0 -0
  257. data/doc/ep_flux/math-doc/document/img49.png +0 -0
  258. data/doc/ep_flux/math-doc/document/img5.png +0 -0
  259. data/doc/ep_flux/math-doc/document/img50.png +0 -0
  260. data/doc/ep_flux/math-doc/document/img51.png +0 -0
  261. data/doc/ep_flux/math-doc/document/img52.png +0 -0
  262. data/doc/ep_flux/math-doc/document/img53.png +0 -0
  263. data/doc/ep_flux/math-doc/document/img54.png +0 -0
  264. data/doc/ep_flux/math-doc/document/img55.png +0 -0
  265. data/doc/ep_flux/math-doc/document/img56.png +0 -0
  266. data/doc/ep_flux/math-doc/document/img57.png +0 -0
  267. data/doc/ep_flux/math-doc/document/img58.png +0 -0
  268. data/doc/ep_flux/math-doc/document/img59.png +0 -0
  269. data/doc/ep_flux/math-doc/document/img6.png +0 -0
  270. data/doc/ep_flux/math-doc/document/img60.png +0 -0
  271. data/doc/ep_flux/math-doc/document/img61.png +0 -0
  272. data/doc/ep_flux/math-doc/document/img62.png +0 -0
  273. data/doc/ep_flux/math-doc/document/img63.png +0 -0
  274. data/doc/ep_flux/math-doc/document/img64.png +0 -0
  275. data/doc/ep_flux/math-doc/document/img65.png +0 -0
  276. data/doc/ep_flux/math-doc/document/img66.png +0 -0
  277. data/doc/ep_flux/math-doc/document/img67.png +0 -0
  278. data/doc/ep_flux/math-doc/document/img68.png +0 -0
  279. data/doc/ep_flux/math-doc/document/img69.png +0 -0
  280. data/doc/ep_flux/math-doc/document/img7.png +0 -0
  281. data/doc/ep_flux/math-doc/document/img70.png +0 -0
  282. data/doc/ep_flux/math-doc/document/img71.png +0 -0
  283. data/doc/ep_flux/math-doc/document/img72.png +0 -0
  284. data/doc/ep_flux/math-doc/document/img73.png +0 -0
  285. data/doc/ep_flux/math-doc/document/img74.png +0 -0
  286. data/doc/ep_flux/math-doc/document/img75.png +0 -0
  287. data/doc/ep_flux/math-doc/document/img76.png +0 -0
  288. data/doc/ep_flux/math-doc/document/img77.png +0 -0
  289. data/doc/ep_flux/math-doc/document/img78.png +0 -0
  290. data/doc/ep_flux/math-doc/document/img79.png +0 -0
  291. data/doc/ep_flux/math-doc/document/img8.png +0 -0
  292. data/doc/ep_flux/math-doc/document/img80.png +0 -0
  293. data/doc/ep_flux/math-doc/document/img81.png +0 -0
  294. data/doc/ep_flux/math-doc/document/img82.png +0 -0
  295. data/doc/ep_flux/math-doc/document/img83.png +0 -0
  296. data/doc/ep_flux/math-doc/document/img84.png +0 -0
  297. data/doc/ep_flux/math-doc/document/img85.png +0 -0
  298. data/doc/ep_flux/math-doc/document/img86.png +0 -0
  299. data/doc/ep_flux/math-doc/document/img87.png +0 -0
  300. data/doc/ep_flux/math-doc/document/img88.png +0 -0
  301. data/doc/ep_flux/math-doc/document/img89.png +0 -0
  302. data/doc/ep_flux/math-doc/document/img9.png +0 -0
  303. data/doc/ep_flux/math-doc/document/img90.png +0 -0
  304. data/doc/ep_flux/math-doc/document/img91.png +0 -0
  305. data/doc/ep_flux/math-doc/document/img92.png +0 -0
  306. data/doc/ep_flux/math-doc/document/img93.png +0 -0
  307. data/doc/ep_flux/math-doc/document/img94.png +0 -0
  308. data/doc/ep_flux/math-doc/document/img95.png +0 -0
  309. data/doc/ep_flux/math-doc/document/img96.png +0 -0
  310. data/doc/ep_flux/math-doc/document/img97.png +0 -0
  311. data/doc/ep_flux/math-doc/document/img98.png +0 -0
  312. data/doc/ep_flux/math-doc/document/img99.png +0 -0
  313. data/doc/ep_flux/math-doc/document/index.html +0 -101
  314. data/doc/ep_flux/math-doc/document/internals.pl +0 -258
  315. data/doc/ep_flux/math-doc/document/labels.pl +0 -265
  316. data/doc/ep_flux/math-doc/document/next.png +0 -0
  317. data/doc/ep_flux/math-doc/document/next_g.png +0 -0
  318. data/doc/ep_flux/math-doc/document/node1.html +0 -104
  319. data/doc/ep_flux/math-doc/document/node10.html +0 -164
  320. data/doc/ep_flux/math-doc/document/node11.html +0 -86
  321. data/doc/ep_flux/math-doc/document/node12.html +0 -166
  322. data/doc/ep_flux/math-doc/document/node13.html +0 -897
  323. data/doc/ep_flux/math-doc/document/node14.html +0 -1065
  324. data/doc/ep_flux/math-doc/document/node15.html +0 -72
  325. data/doc/ep_flux/math-doc/document/node16.html +0 -81
  326. data/doc/ep_flux/math-doc/document/node2.html +0 -82
  327. data/doc/ep_flux/math-doc/document/node3.html +0 -91
  328. data/doc/ep_flux/math-doc/document/node4.html +0 -149
  329. data/doc/ep_flux/math-doc/document/node5.html +0 -330
  330. data/doc/ep_flux/math-doc/document/node6.html +0 -99
  331. data/doc/ep_flux/math-doc/document/node7.html +0 -98
  332. data/doc/ep_flux/math-doc/document/node8.html +0 -83
  333. data/doc/ep_flux/math-doc/document/node9.html +0 -140
  334. data/doc/ep_flux/math-doc/document/prev.png +0 -0
  335. data/doc/ep_flux/math-doc/document/prev_g.png +0 -0
  336. data/doc/ep_flux/math-doc/document/up.png +0 -0
  337. data/doc/ep_flux/math-doc/document/up_g.png +0 -0
  338. data/doc/ep_flux/math-doc/document.pdf +0 -0
  339. data/doc/ep_flux/math-doc/document.tex +0 -2018
  340. data/doc/gdir.html +0 -412
  341. data/doc/gdir_client.html +0 -16
  342. data/doc/gdir_connect_ftp-like.html +0 -61
  343. data/doc/gdir_server.html +0 -45
  344. data/doc/ggraph.html +0 -1615
  345. data/doc/gpcat.html +0 -44
  346. data/doc/gpcut.html +0 -41
  347. data/doc/gphys.html +0 -532
  348. data/doc/gphys_fft.html +0 -324
  349. data/doc/gphys_grads_io.html +0 -69
  350. data/doc/gphys_grib_io.html +0 -82
  351. data/doc/gphys_io.html +0 -120
  352. data/doc/gphys_io_common.html +0 -18
  353. data/doc/gphys_netcdf_io.html +0 -283
  354. data/doc/gplist.html +0 -24
  355. data/doc/gpmath.html +0 -51
  356. data/doc/gpmaxmin.html +0 -31
  357. data/doc/gpprint.html +0 -34
  358. data/doc/gpview.html +0 -270
  359. data/doc/grads2nc_with_gphys.html +0 -21
  360. data/doc/grads_gridded.html +0 -307
  361. data/doc/grib.html +0 -144
  362. data/doc/grid.html +0 -212
  363. data/doc/index.html +0 -133
  364. data/doc/index.rd +0 -127
  365. data/doc/netcdf_convention.html +0 -136
  366. data/doc/unumeric.html +0 -176
  367. data/doc/update +0 -64
  368. data/doc/varray.html +0 -299
  369. data/doc/varraycomposite.html +0 -67
@@ -55,18 +55,34 @@ module NumRu
55
55
  @groups = Hash.new # axnames => assoc coord names
56
56
  assoc_crds.each do |gp|
57
57
  pushed = false
58
+ axnames_sv = acnames_sv = nil
58
59
  @groups.each do | axnames, acnames |
59
60
  a = gp.axnames
60
61
  if (axnames - a).length < axnames.length # included?
61
- axnames.concat(a).uniq!
62
- acnames.push(gp.name)
62
+ unless pushed
63
+ # first time in this loop
64
+ axnames.concat(a).uniq!
65
+ acnames.push(gp.name)
66
+ axnames_sv = axnames
67
+ acnames_sv = acnames
68
+ else
69
+ # second or greater time in this loop --> need merger to the first
70
+ @groups.delete(axnames)
71
+ axnames_sv.concat(axnames).uniq!
72
+ acnames_sv.concat(acnames).uniq!
73
+ end
63
74
  pushed = true
64
- break
75
+ #break # <-- old code; this doesn't work
65
76
  end
66
77
  end
67
78
  @groups[ gp.axnames ] = [gp.name] if !pushed # new group
68
79
  end
69
80
 
81
+ # < sort keys in @groups in the order of original axes >
82
+ # -- though its necesity was not originally supposed, but...
83
+ @groups.each_key do |axnames|
84
+ axnames.replace( @axnames - (@axnames - axnames) )
85
+ end
70
86
  end
71
87
 
72
88
  attr_reader :assoc_crds, :axnames, :axlens
@@ -823,7 +823,7 @@ module NumRu
823
823
  end
824
824
 
825
825
  def cyclic_extendible?
826
- @pos.axis_cyclic?
826
+ @pos.axis_cyclic_extendible?
827
827
  end
828
828
 
829
829
  ######### private methods ####################################
@@ -278,9 +278,9 @@ if $0 == __FILE__
278
278
  puts "<<forward>>"
279
279
  p p,q,r
280
280
  puts "<<inverse>>"
281
- p *mp.inverse_map(p,q,r)
281
+ p( *mp.inverse_map(p,q,r))
282
282
  puts "<<map grid>>"
283
283
  x = y = NArray[0.0, 1.0]
284
284
  z = NArray[0.0,1.0,2.0]
285
- p *mp.map_grid(x,y,z)
285
+ p( *mp.map_grid(x,y,z))
286
286
  end
@@ -82,6 +82,9 @@ module NumRu
82
82
  def threepoint_O2nd_deriv(*args)
83
83
  Derivative::threepoint_O2nd_deriv(self,*args)
84
84
  end
85
+ def deriv2nd(*args)
86
+ Derivative::deriv2nd(self,*args)
87
+ end
85
88
 
86
89
  module Derivative
87
90
 
@@ -93,15 +96,19 @@ module NumRu
93
96
 
94
97
  module_function
95
98
 
96
- def threepoint_O2nd_deriv(gp, dim, bc=LINEAR_EXT, altcoord=nil)
97
- __deriv(gp, dim, bc, altcoord, "threepoint_O2nd_deriv")
99
+ def threepoint_O2nd_deriv(gp, dim, bc=CYCLIC_OR_LINEAR, altcoord=nil)
100
+ __deriv(gp, dim, bc, altcoord, "threepoint_O2nd_deriv",1)
101
+ end
102
+
103
+ def cderiv(gp, dim, bc=CYCLIC_OR_LINEAR, altcoord=nil)
104
+ __deriv(gp, dim, bc, altcoord, "cderiv",1)
98
105
  end
99
106
 
100
- def cderiv(gp, dim, bc=LINEAR_EXT, altcoord=nil)
101
- __deriv(gp, dim, bc, altcoord, "cderiv")
107
+ def deriv2nd(gp, dim, bc=CYCLIC_OR_LINEAR, altcoord=nil)
108
+ __deriv(gp, dim, bc, altcoord, "deriv2nd",2)
102
109
  end
103
110
 
104
- def __deriv(gp,dim,bc, altcoord, dtype="cderiv")
111
+ def __deriv(gp,dim,bc, altcoord, dtype="cderiv", deriv_order=1)
105
112
  if bc == CYCLIC_OR_LINEAR
106
113
  bc = ( gp.axis(dim).cyclic_extendible? ? CYCLIC_EXT : LINEAR_EXT )
107
114
  end
@@ -127,22 +134,39 @@ module NumRu
127
134
  n_dgpdx = NumRu::Derivative::cderiv(n_data,n_x,dim,bc)
128
135
  when "threepoint_O2nd_deriv"
129
136
  n_dgpdx = NumRu::Derivative::threepoint_O2nd_deriv(n_data,n_x,dim,bc)
137
+ when "deriv2nd"
138
+ n_dgpdx = NumRu::Derivative::deriv2nd(n_data,n_x,dim,bc)
130
139
  else
131
140
  raise ArgumentError, "Unsupported derivative type :'#{dtype}'"
132
141
  end
133
- name = "d#{gp.name}_d#{v_x.name}" # ex. "dT_dx"
134
- v_dgpdx = VArray.new(n_dgpdx, gp.data, name) # make varray
142
+ case deriv_order
143
+ when 1
144
+ name = "d#{gp.name}_d#{v_x.name}" # ex. "dT_dx"
145
+ when 2
146
+ name = "d2#{gp.name}_d#{v_x.name}2" # ex. "d2T_dx2"
147
+ end
148
+ v_dgpdx = VArray.new(n_dgpdx, gp.data, name) # make varray
135
149
  g_dgpdx = GPhys.new( gp.grid_copy, v_dgpdx ) # make gphys
136
150
 
137
151
  # <<set attribute>>
138
152
  u_data = v_data.units
139
153
  u_x = v_x.units
140
- g_dgpdx.units = u_data/u_x # set units
141
- if v_data.get_att('long_name') && v_x.get_att('long_name')
142
- long_name = "d_#{v_data.get_att('long_name')}_d_#{v_x.get_att('long_name')}"
143
- else
144
- long_name = name
145
- end
154
+ case deriv_order
155
+ when 1
156
+ g_dgpdx.units = u_data/u_x # set units
157
+ if v_data.get_att('long_name') && v_x.get_att('long_name')
158
+ long_name = "d_#{v_data.get_att('long_name')}_d_#{v_x.get_att('long_name')}"
159
+ else
160
+ long_name = name
161
+ end
162
+ when 2
163
+ g_dgpdx.units = u_data/u_x**2 # set units
164
+ if v_data.get_att('long_name') && v_x.get_att('long_name')
165
+ long_name = "d2(#{v_data.get_att('long_name')})_d(#{v_x.get_att('long_name')})2"
166
+ else
167
+ long_name = name
168
+ end
169
+ end
146
170
  g_dgpdx.data.set_att("long_name",long_name) # set long_name
147
171
  return g_dgpdx
148
172
  end
@@ -277,6 +301,20 @@ if $0 == __FILE__
277
301
  show_attr(gp, deriv)
278
302
  end
279
303
 
304
+ def test5(x1, dim_or_dimname)
305
+ f1 = sin(x1)
306
+ gp1 = make_gp1D(f1, x1)
307
+ deriv = GPhys::Derivative::deriv2nd(gp1, dim_or_dimname)
308
+ dfdx1 = deriv.data.val
309
+ dfdx2 = -sin(x1)
310
+ p(dfdx1) if $VERBOSE
311
+ diff = (dfdx1 - dfdx2)[1..-2].abs
312
+ err = diff.mean
313
+ print "dfdx - kaiseki_kai (except boundary): "
314
+ print err, "\t", diff.max,"\n"
315
+ err
316
+ end
317
+
280
318
  ## main routine of test ---------------------------------------------
281
319
 
282
320
  [0, "lon"].each do |dim|
@@ -303,6 +341,11 @@ if $0 == __FILE__
303
341
  er2 = test2( gen_z2(21), dim )
304
342
  print "error change from nx=11->21: ", er2/er1,"\n"
305
343
 
344
+ print "**** equally spaced grid (2nd deriv) ****\n"
345
+ er1 = test5( gen_x(11), dim )
346
+ er2 = test5( gen_x(21), dim )
347
+ print "error change from nx=11->21: ", er2/er1,"\n"
348
+
306
349
  end
307
350
 
308
351
  print "************** multi-D *************\n"
@@ -409,7 +409,13 @@
409
409
  ((|You know what it is.|))
410
410
 
411
411
  ---shape_coerce(other)
412
- Like ((<coerce>)), but just changes shape without changing numeric type.
412
+ Like ((<coerce>)), but just changes shape without changing numeric type
413
+ by possibly inserting dimensions whose lengths are one (i.e.,
414
+ without changeing the total length of data).
415
+
416
+ ---shape_coerce_full(other)
417
+ Similar to ((<shape_coerce>)) but to return the gphyses having
418
+ really the same shape with possible expansion by replication.
413
419
 
414
420
  ---transpose(*dims)
415
421
  Transpose.
@@ -767,6 +773,16 @@ module NumRu
767
773
  end
768
774
  end
769
775
 
776
+ def shape_coerce_full(other)
777
+ o, s = shape_coerce(other)
778
+ if o.length < s.length
779
+ o = GPhys.new( s.grid, o + NArray.new(o.typecode,*s.shape) )
780
+ elsif o.length > s.length
781
+ s = GPhys.new( o.grid, s + NArray.new(s.typecode,*o.shape) )
782
+ end
783
+ [o, s]
784
+ end
785
+
770
786
  def transpose(*dims)
771
787
  grid = @grid.transpose(*dims)
772
788
  data = @data.transpose(*dims)
@@ -80,17 +80,18 @@ module NumRu
80
80
  raise ArgumentError, "1st arg must be a GrADS_Gridded or a file name"
81
81
  end
82
82
 
83
- grvar = file.var(varname)
83
+ grvar = GrADSVar.new(file,varname,true,false)
84
84
  data = VArrayGrADS.new(grvar)
85
85
 
86
- # axposnames = [ "lon", "lat", "lev", "time" ]
87
- axposnames = [ "x", "y", "z", "t" ]
88
- rank = 4
86
+ shape_current = grvar.shape_current
87
+ dimnames = grvar.dim_names
88
+ rank = dimnames.length
89
89
  bare_index = [ false ] * rank # will be true if coord var is not found
90
90
 
91
91
  axes = Array.new
92
92
  for i in 0...rank
93
- axpos = VArrayGrADS.new( file.var(axposnames[i]) )[0...data.shape_current[i]]
93
+ grvar = GrADSVar.new(file,dimnames[i],false,true)
94
+ axpos = VArrayGrADS.new(grvar)[0...shape_current[i]]
94
95
 
95
96
  cell_center = true
96
97
  cell = false
@@ -72,13 +72,13 @@ module NumRu
72
72
  module_function
73
73
 
74
74
  def is_a_Grib?(filename)
75
- Grib.is_a_Grib?(filename)
75
+ VArrayGrib.grib.is_a_Grib?(filename)
76
76
  end
77
77
 
78
78
  def open(file, varname)
79
79
  if file.is_a?(String)
80
- file = Grib.open(file)
81
- elsif ! Grib===file
80
+ file = VArrayGrib.grib.open(file)
81
+ elsif ! VArrayGrib.grib===file
82
82
  raise ArgumentError, "1st arg must be a Grib or a file name"
83
83
  end
84
84
 
@@ -157,8 +157,8 @@ module NumRu
157
157
  opened = false
158
158
  case file
159
159
  when String
160
- file = Grib.open(file)
161
- when Grib
160
+ file = VArrayGrib.grib.open(file)
161
+ when VArrayGrib.grib
162
162
  opened = true
163
163
  else
164
164
  raise ArgumentError, "arg must be a Grib or a file name"
@@ -197,7 +197,7 @@ if $0 == __FILE__
197
197
 
198
198
  puts "\n** test convert (T.jan.nc to tmp.grib) **"
199
199
  temp3 = GPhys::NetCDF_IO.open("../../../testdata/T.jan.nc","T")
200
- file = Grib.create("tmp.grib")
200
+ file = VArrayGrib.grib.create("tmp.grib")
201
201
  GPhys::Grib_IO.write(file,temp3)
202
202
  file.close
203
203
 
@@ -61,11 +61,11 @@ For example, (('GPhys::IO.open(file, name)')) simply calls
61
61
  ---parse_gturl(gturl)
62
62
  Parses GTOOL4-type URLs to specify path, variable name,
63
63
  and optionally subsets, whose format is
64
- (('path@varname[,dimname=pos1[:pos2[:thinning_intv]][,dimname=...]]'))
64
+ (('path[@|/]varname[,dimname=pos1[:pos2[:thinning_intv]][,dimname=...]]'))
65
65
 
66
66
  ARGUMENTS
67
67
  * gturl (String) GTOOL4 URL, whose format is
68
- (('path@varname[,dimname=pos1[:pos2[:thinning_intv]][,dimname=...]]'))
68
+ (('path[@|/]varname[,dimname=pos1[:pos2[:thinning_intv]][,dimname=...]]'))
69
69
 
70
70
  RETURN VALUES
71
71
  * An Array consisting of [file, var, slice, cut_slice, thinning], where
@@ -116,6 +116,15 @@ module NumRu
116
116
  module IO
117
117
  module_function
118
118
 
119
+ ## switches for io libraries
120
+ # switch grib library
121
+ def use_gphys_grib
122
+ VArrayGrib.use_gphys_grib
123
+ end
124
+ def use_rb_grib
125
+ VArrayGrib.use_rb_grib
126
+ end
127
+
119
128
  ## // module functions to be defined in specific IO modules -->
120
129
  def open(file, varname)
121
130
  file2specific_module(file)::open(file, varname)
@@ -158,9 +167,16 @@ module NumRu
158
167
  GTOOL3 => GPhys::Gtool3_IO}
159
168
  @@file_class = {NETCDF => NetCDF,
160
169
  GRADS => GrADS_Gridded,
161
- GRIB => Grib,
170
+ #GRIB => VArrayGrib.grib, # Hash is not dynamic: see below
162
171
  NUSDAS => NuSDaS,
163
172
  GTOOL3 => Gtool3}
173
+ def @@file_class.[](key)
174
+ if key == GRIB
175
+ VArrayGrib.grib
176
+ else
177
+ super
178
+ end
179
+ end
164
180
  @@nc_pattern = [/\.nc$/]
165
181
  @@grad_pattern = [/\.ctl$/]
166
182
  @@grib_pattern = [/\.grib$/, /\.grb$/]
@@ -181,7 +197,7 @@ module NumRu
181
197
  return NETCDF
182
198
  when GrADS_Gridded
183
199
  return GRADS
184
- when Grib
200
+ when VArrayGrib.grib
185
201
  return GRIB
186
202
  when NuSDaS
187
203
  return NUSDAS
@@ -260,14 +276,17 @@ module NumRu
260
276
  file2specific_module(file).var_names_except_coordinates(file)
261
277
  end
262
278
 
263
- GTURLfmt = "path@varname[,dimname=pos1[:pos2[:thinning_intv]][,dimname=...]]"
279
+ GTURLfmt = "path[@|/]varname[,dimname=pos1[:pos2[:thinning_intv]][,dimname=...]]"
264
280
 
265
281
  def parse_gturl(gturl)
266
282
  if /(.*)@(.*)/ =~ gturl
267
283
  file = $1
268
284
  var = $2
285
+ elsif /(.*)\/(.*)/ =~ gturl
286
+ file = $1
287
+ var = $2
269
288
  else
270
- raise "invalid URL: '@' between path & variable is not found\n\n" +
289
+ raise "invalid URL: '[@|/]' between path & variable is not found\n\n" +
271
290
  "URL format: " + GTURLfmt
272
291
  end
273
292
  if /,/ =~ var
@@ -1215,56 +1215,58 @@ EOS
1215
1215
 
1216
1216
  class GrADSVar
1217
1217
 
1218
- def initialize(file,varname)
1218
+ def initialize(file,varname,varonly=false,dimonly=false)
1219
1219
  @varname = varname
1220
1220
 
1221
1221
  if file.is_a?(String)
1222
1222
  file = GrADS_Gridded.open(file)
1223
- elsif ! file.is_a?(GrADS_Gridded)
1223
+ elsif !file.is_a?(GrADS_Gridded)
1224
1224
  raise ArgumentError, "1st arg must be a GrADS_Gridded or a file name"
1225
1225
  end
1226
1226
  @ctl = file # control file name
1227
- # @ctl = ctl
1228
-
1229
- @idim = -1
1230
- for i in 0...@ctl.dimensions.length
1231
- # p @ctl.dimensions[i][:name]
1232
- if @varname == @ctl.dimensions[i][:name]
1233
- @idim = i
1234
- end
1235
- end
1236
1227
 
1237
1228
  @attr = NumRu::Attribute.new
1238
- if( @idim != -1 )
1239
- @dimensions = [ @ctl.dimensions[@idim] ]
1240
- @rank = 1
1241
- @attr[:name] = @dimensions[0][:name]
1242
- @attr[:long_name] = @dimensions[0][:description]
1243
- @attr[:units] = @dimensions[0][:units]
1244
- if @attr[:long_name] == "time" && @ctl.get_att("365_day_calendar") == true
1245
- @attr[:calendar] = "365_day"
1246
- end
1247
1229
 
1248
- @shape = [@dimensions[0][:len]]
1249
- else
1230
+ found = false
1231
+ if !dimonly
1250
1232
  @dimensions = @ctl.dimensions
1251
1233
  @rank = @dimensions.length
1252
- found = false
1253
- for i in 0...@ctl.variables.length
1254
- if @varname == @ctl.variables[i][:name]
1255
- @attr[:long_name] = @ctl.variables[i][:description]
1256
- @attr[:nlev] = @ctl.variables[i][:nlev].to_s
1234
+ @ctl.variables.each do |var|
1235
+ if @varname == var[:name]
1236
+ @idim = -1
1237
+ @attr[:long_name] = var[:description]
1238
+ @attr[:nlev] = var[:nlev].to_s
1257
1239
 
1258
1240
  @shape = [@dimensions[0][:len],@dimensions[1][:len],
1259
1241
  @dimensions[2][:len],@dimensions[3][:len]]
1260
- @shape[2] = @ctl.variables[i][:nlev].to_i if( @ctl.variables[i][:nlev] )
1242
+ @shape[2] = var[:nlev].to_i if( var[:nlev] )
1261
1243
 
1262
1244
  @attr[:missing_value] = NArray.sfloat(1).fill!(@ctl.undef)
1263
1245
  found = true
1264
1246
  end
1265
1247
  end
1266
- raise "variable #{@varname} is not found" if !found
1267
1248
  end
1249
+
1250
+ if !found && !varonly
1251
+ @ctl.dimensions.each_with_index do |dim,i|
1252
+ if @varname == dim[:name]
1253
+ @idim = i
1254
+ @dimensions = [ dim ]
1255
+ @rank = 1
1256
+ @attr[:name] = dim[:name]
1257
+ @attr[:long_name] = dim[:description]
1258
+ @attr[:units] = dim[:units]
1259
+ if @attr[:long_name] == "time" && @ctl.get_att("365_day_calendar") == true
1260
+ @attr[:calendar] = "365_day"
1261
+ end
1262
+
1263
+ @shape = [dim[:len]]
1264
+ found = true
1265
+ end
1266
+ end
1267
+ end
1268
+
1269
+ raise "variable #{@varname} is not found" if !found
1268
1270
  end
1269
1271
 
1270
1272
  attr_accessor (:rank)
@@ -31,6 +31,7 @@ end
31
31
  ## <---/
32
32
 
33
33
  module NumRu
34
+ class GPhys
34
35
  module GribUtils
35
36
  require "numru/gphys/grib_params"
36
37
  private
@@ -230,7 +231,7 @@ module NumRu
230
231
  len = file.read(3).to_uint3
231
232
  bds = GribBDS.new(obj,file.pos,len)
232
233
  obj.bds = bds
233
- file.seek(len-3,IO::SEEK_CUR)
234
+ file.seek(len-3,::IO::SEEK_CUR)
234
235
 
235
236
  es = GribES.new(obj,file.read(4))
236
237
  unless es.grib?
@@ -1020,14 +1021,14 @@ module NumRu
1020
1021
  private
1021
1022
  def oct4
1022
1023
  return @oct4 if @oct4
1023
- @sgm.file.seek(@pos, IO::SEEK_SET)
1024
+ @sgm.file.seek(@pos, ::IO::SEEK_SET)
1024
1025
  @oct4 = @sgm.file.read(1).to_uint1
1025
1026
  return @oct4
1026
1027
  end
1027
1028
  def oct14
1028
1029
  return nil if flag4==0
1029
1030
  return @oct14 if @oct14
1030
- @sgm.file.seek(@pos+10, IO::SEEK_SET)
1031
+ @sgm.file.seek(@pos+10, ::IO::SEEK_SET)
1031
1032
  @oct14 = @sgm.file.read(1).to_uint1
1032
1033
  return @oct14
1033
1034
  end
@@ -1070,7 +1071,7 @@ module NumRu
1070
1071
  ebu = (8-(eb&7))/nstep unless ebu==0
1071
1072
  eb = (eb+7)/8
1072
1073
  return NArray.sfloat(0) if eb==sb
1073
- file.seek(pos+sb,IO::SEEK_SET)
1074
+ file.seek(pos+sb,::IO::SEEK_SET)
1074
1075
  str = file.read(eb-sb)
1075
1076
  return get_bits(str,nstep,nbits,sbu,ebu,NArray::SFLOAT)
1076
1077
  end
@@ -1183,19 +1184,19 @@ module NumRu
1183
1184
  end
1184
1185
  def offset
1185
1186
  return @offset if @offset
1186
- @sgm.file.seek(@pos+3, IO::SEEK_SET)
1187
+ @sgm.file.seek(@pos+3, ::IO::SEEK_SET)
1187
1188
  @offset = float_value(@sgm.file.read(4))
1188
1189
  return @offset
1189
1190
  end
1190
1191
  def efactor
1191
1192
  return @efactor if @efactor
1192
- @sgm.file.seek(@pos+1, IO::SEEK_SET)
1193
+ @sgm.file.seek(@pos+1, ::IO::SEEK_SET)
1193
1194
  @efactor = 2.0**str2int2( @sgm.file.read(2) )
1194
1195
  return @efactor
1195
1196
  end
1196
1197
  def value(shape,*arg)
1197
1198
  nbits_unuse = oct4&15
1198
- @sgm.file.seek(@pos+7, IO::SEEK_SET)
1199
+ @sgm.file.seek(@pos+7, ::IO::SEEK_SET)
1199
1200
  nbits_pack = @sgm.file.read(1).to_uint1
1200
1201
  if (nbits_pack%8) == 0
1201
1202
  nstep = 8
@@ -1280,7 +1281,7 @@ module NumRu
1280
1281
  else
1281
1282
  raise "not defined yet"
1282
1283
  n1 = @file.read(2).to_uint2
1283
- @sgm.file.seek(1, IO::SEEK_CUR)
1284
+ @sgm.file.seek(1, ::IO::SEEK_CUR)
1284
1285
  str = @sgm.file.read(6)
1285
1286
  n2 = str.to_uint2
1286
1287
  p1 = str.to_uint2(2)
@@ -1406,6 +1407,8 @@ module NumRu
1406
1407
  return defined?(is) && is
1407
1408
  end
1408
1409
  def open(fname)
1410
+ #warn "This grib library is obsoleted."
1411
+ #warn "Use http://ruby.gfd-dennou.org/products/rb-grib/ instead."
1409
1412
  f = Grib.new(fname,"r")
1410
1413
  mbio = NumRu::MultibitIO.new(fname)
1411
1414
  f.parse(mbio)
@@ -1427,7 +1430,7 @@ module NumRu
1427
1430
  while true
1428
1431
  @file.read(1)=="\000" && next
1429
1432
  @file.eof? && break
1430
- @file.seek(-1, IO::SEEK_CUR)
1433
+ @file.seek(-1, ::IO::SEEK_CUR)
1431
1434
  sgm = GribSegment.parse(@file, mbio)
1432
1435
  return nil unless sgm
1433
1436
  name = sgm.pds.sname
@@ -2015,6 +2018,7 @@ module NumRu
2015
2018
  end
2016
2019
 
2017
2020
  end
2021
+ end
2018
2022
 
2019
2023
 
2020
2024
  #####################################################