gphys 1.1.1a

Sign up to get free protection for your applications and to get access to all the features.
Files changed (428) hide show
  1. data/ChangeLog +1777 -0
  2. data/LICENSE.txt +34 -0
  3. data/README +33 -0
  4. data/Rakefile +57 -0
  5. data/TODO_ep_flux +6 -0
  6. data/bin/gdir_client +27 -0
  7. data/bin/gdir_server +129 -0
  8. data/bin/gpaop +146 -0
  9. data/bin/gpcat +148 -0
  10. data/bin/gpcut +102 -0
  11. data/bin/gpedit +228 -0
  12. data/bin/gplist +68 -0
  13. data/bin/gpmath +120 -0
  14. data/bin/gpmaxmin +128 -0
  15. data/bin/gpprint +60 -0
  16. data/bin/gpvect +706 -0
  17. data/bin/gpview +704 -0
  18. data/bin/grads2nc_with_gphys +61 -0
  19. data/doc/attribute.html +19 -0
  20. data/doc/attributenetcdf.html +15 -0
  21. data/doc/axis.html +376 -0
  22. data/doc/coordmapping.html +111 -0
  23. data/doc/coordtransform.html +36 -0
  24. data/doc/derivative/gphys-derivative.html +80 -0
  25. data/doc/derivative/index.html +21 -0
  26. data/doc/derivative/index.rd +14 -0
  27. data/doc/derivative/math-doc/document/document.css +30 -0
  28. data/doc/derivative/math-doc/document/document.html +57 -0
  29. data/doc/derivative/math-doc/document/images.aux +1 -0
  30. data/doc/derivative/math-doc/document/images.log +385 -0
  31. data/doc/derivative/math-doc/document/images.pl +186 -0
  32. data/doc/derivative/math-doc/document/images.tex +364 -0
  33. data/doc/derivative/math-doc/document/img1.png +0 -0
  34. data/doc/derivative/math-doc/document/img10.png +0 -0
  35. data/doc/derivative/math-doc/document/img11.png +0 -0
  36. data/doc/derivative/math-doc/document/img12.png +0 -0
  37. data/doc/derivative/math-doc/document/img13.png +0 -0
  38. data/doc/derivative/math-doc/document/img14.png +0 -0
  39. data/doc/derivative/math-doc/document/img15.png +0 -0
  40. data/doc/derivative/math-doc/document/img16.png +0 -0
  41. data/doc/derivative/math-doc/document/img17.png +0 -0
  42. data/doc/derivative/math-doc/document/img18.png +0 -0
  43. data/doc/derivative/math-doc/document/img19.png +0 -0
  44. data/doc/derivative/math-doc/document/img2.png +0 -0
  45. data/doc/derivative/math-doc/document/img20.png +0 -0
  46. data/doc/derivative/math-doc/document/img21.png +0 -0
  47. data/doc/derivative/math-doc/document/img22.png +0 -0
  48. data/doc/derivative/math-doc/document/img23.png +0 -0
  49. data/doc/derivative/math-doc/document/img24.png +0 -0
  50. data/doc/derivative/math-doc/document/img25.png +0 -0
  51. data/doc/derivative/math-doc/document/img26.png +0 -0
  52. data/doc/derivative/math-doc/document/img27.png +0 -0
  53. data/doc/derivative/math-doc/document/img28.png +0 -0
  54. data/doc/derivative/math-doc/document/img29.png +0 -0
  55. data/doc/derivative/math-doc/document/img3.png +0 -0
  56. data/doc/derivative/math-doc/document/img30.png +0 -0
  57. data/doc/derivative/math-doc/document/img4.png +0 -0
  58. data/doc/derivative/math-doc/document/img5.png +0 -0
  59. data/doc/derivative/math-doc/document/img6.png +0 -0
  60. data/doc/derivative/math-doc/document/img7.png +0 -0
  61. data/doc/derivative/math-doc/document/img8.png +0 -0
  62. data/doc/derivative/math-doc/document/img9.png +0 -0
  63. data/doc/derivative/math-doc/document/index.html +57 -0
  64. data/doc/derivative/math-doc/document/labels.pl +13 -0
  65. data/doc/derivative/math-doc/document/next.png +0 -0
  66. data/doc/derivative/math-doc/document/next_g.png +0 -0
  67. data/doc/derivative/math-doc/document/node1.html +238 -0
  68. data/doc/derivative/math-doc/document/node2.html +75 -0
  69. data/doc/derivative/math-doc/document/prev.png +0 -0
  70. data/doc/derivative/math-doc/document/prev_g.png +0 -0
  71. data/doc/derivative/math-doc/document/up.png +0 -0
  72. data/doc/derivative/math-doc/document/up_g.png +0 -0
  73. data/doc/derivative/math-doc/document.pdf +0 -0
  74. data/doc/derivative/math-doc/document.tex +158 -0
  75. data/doc/derivative/numru-derivative.html +129 -0
  76. data/doc/ep_flux/ep_flux.html +469 -0
  77. data/doc/ep_flux/ggraph_on_merdional_section.html +71 -0
  78. data/doc/ep_flux/index.html +31 -0
  79. data/doc/ep_flux/index.rd +24 -0
  80. data/doc/ep_flux/math-doc/document/WARNINGS +1 -0
  81. data/doc/ep_flux/math-doc/document/contents.png +0 -0
  82. data/doc/ep_flux/math-doc/document/crossref.png +0 -0
  83. data/doc/ep_flux/math-doc/document/document.css +30 -0
  84. data/doc/ep_flux/math-doc/document/document.html +101 -0
  85. data/doc/ep_flux/math-doc/document/images.aux +1 -0
  86. data/doc/ep_flux/math-doc/document/images.log +1375 -0
  87. data/doc/ep_flux/math-doc/document/images.pl +1328 -0
  88. data/doc/ep_flux/math-doc/document/images.tex +1471 -0
  89. data/doc/ep_flux/math-doc/document/img1.png +0 -0
  90. data/doc/ep_flux/math-doc/document/img10.png +0 -0
  91. data/doc/ep_flux/math-doc/document/img100.png +0 -0
  92. data/doc/ep_flux/math-doc/document/img101.png +0 -0
  93. data/doc/ep_flux/math-doc/document/img102.png +0 -0
  94. data/doc/ep_flux/math-doc/document/img103.png +0 -0
  95. data/doc/ep_flux/math-doc/document/img104.png +0 -0
  96. data/doc/ep_flux/math-doc/document/img105.png +0 -0
  97. data/doc/ep_flux/math-doc/document/img106.png +0 -0
  98. data/doc/ep_flux/math-doc/document/img107.png +0 -0
  99. data/doc/ep_flux/math-doc/document/img108.png +0 -0
  100. data/doc/ep_flux/math-doc/document/img109.png +0 -0
  101. data/doc/ep_flux/math-doc/document/img11.png +0 -0
  102. data/doc/ep_flux/math-doc/document/img110.png +0 -0
  103. data/doc/ep_flux/math-doc/document/img111.png +0 -0
  104. data/doc/ep_flux/math-doc/document/img112.png +0 -0
  105. data/doc/ep_flux/math-doc/document/img113.png +0 -0
  106. data/doc/ep_flux/math-doc/document/img114.png +0 -0
  107. data/doc/ep_flux/math-doc/document/img115.png +0 -0
  108. data/doc/ep_flux/math-doc/document/img116.png +0 -0
  109. data/doc/ep_flux/math-doc/document/img117.png +0 -0
  110. data/doc/ep_flux/math-doc/document/img118.png +0 -0
  111. data/doc/ep_flux/math-doc/document/img119.png +0 -0
  112. data/doc/ep_flux/math-doc/document/img12.png +0 -0
  113. data/doc/ep_flux/math-doc/document/img120.png +0 -0
  114. data/doc/ep_flux/math-doc/document/img121.png +0 -0
  115. data/doc/ep_flux/math-doc/document/img122.png +0 -0
  116. data/doc/ep_flux/math-doc/document/img123.png +0 -0
  117. data/doc/ep_flux/math-doc/document/img124.png +0 -0
  118. data/doc/ep_flux/math-doc/document/img125.png +0 -0
  119. data/doc/ep_flux/math-doc/document/img126.png +0 -0
  120. data/doc/ep_flux/math-doc/document/img127.png +0 -0
  121. data/doc/ep_flux/math-doc/document/img128.png +0 -0
  122. data/doc/ep_flux/math-doc/document/img129.png +0 -0
  123. data/doc/ep_flux/math-doc/document/img13.png +0 -0
  124. data/doc/ep_flux/math-doc/document/img130.png +0 -0
  125. data/doc/ep_flux/math-doc/document/img131.png +0 -0
  126. data/doc/ep_flux/math-doc/document/img132.png +0 -0
  127. data/doc/ep_flux/math-doc/document/img133.png +0 -0
  128. data/doc/ep_flux/math-doc/document/img134.png +0 -0
  129. data/doc/ep_flux/math-doc/document/img135.png +0 -0
  130. data/doc/ep_flux/math-doc/document/img136.png +0 -0
  131. data/doc/ep_flux/math-doc/document/img137.png +0 -0
  132. data/doc/ep_flux/math-doc/document/img138.png +0 -0
  133. data/doc/ep_flux/math-doc/document/img139.png +0 -0
  134. data/doc/ep_flux/math-doc/document/img14.png +0 -0
  135. data/doc/ep_flux/math-doc/document/img140.png +0 -0
  136. data/doc/ep_flux/math-doc/document/img141.png +0 -0
  137. data/doc/ep_flux/math-doc/document/img142.png +0 -0
  138. data/doc/ep_flux/math-doc/document/img143.png +0 -0
  139. data/doc/ep_flux/math-doc/document/img144.png +0 -0
  140. data/doc/ep_flux/math-doc/document/img145.png +0 -0
  141. data/doc/ep_flux/math-doc/document/img146.png +0 -0
  142. data/doc/ep_flux/math-doc/document/img147.png +0 -0
  143. data/doc/ep_flux/math-doc/document/img148.png +0 -0
  144. data/doc/ep_flux/math-doc/document/img149.png +0 -0
  145. data/doc/ep_flux/math-doc/document/img15.png +0 -0
  146. data/doc/ep_flux/math-doc/document/img150.png +0 -0
  147. data/doc/ep_flux/math-doc/document/img151.png +0 -0
  148. data/doc/ep_flux/math-doc/document/img152.png +0 -0
  149. data/doc/ep_flux/math-doc/document/img153.png +0 -0
  150. data/doc/ep_flux/math-doc/document/img154.png +0 -0
  151. data/doc/ep_flux/math-doc/document/img155.png +0 -0
  152. data/doc/ep_flux/math-doc/document/img156.png +0 -0
  153. data/doc/ep_flux/math-doc/document/img157.png +0 -0
  154. data/doc/ep_flux/math-doc/document/img158.png +0 -0
  155. data/doc/ep_flux/math-doc/document/img159.png +0 -0
  156. data/doc/ep_flux/math-doc/document/img16.png +0 -0
  157. data/doc/ep_flux/math-doc/document/img160.png +0 -0
  158. data/doc/ep_flux/math-doc/document/img161.png +0 -0
  159. data/doc/ep_flux/math-doc/document/img162.png +0 -0
  160. data/doc/ep_flux/math-doc/document/img163.png +0 -0
  161. data/doc/ep_flux/math-doc/document/img164.png +0 -0
  162. data/doc/ep_flux/math-doc/document/img165.png +0 -0
  163. data/doc/ep_flux/math-doc/document/img166.png +0 -0
  164. data/doc/ep_flux/math-doc/document/img167.png +0 -0
  165. data/doc/ep_flux/math-doc/document/img168.png +0 -0
  166. data/doc/ep_flux/math-doc/document/img169.png +0 -0
  167. data/doc/ep_flux/math-doc/document/img17.png +0 -0
  168. data/doc/ep_flux/math-doc/document/img170.png +0 -0
  169. data/doc/ep_flux/math-doc/document/img171.png +0 -0
  170. data/doc/ep_flux/math-doc/document/img172.png +0 -0
  171. data/doc/ep_flux/math-doc/document/img173.png +0 -0
  172. data/doc/ep_flux/math-doc/document/img174.png +0 -0
  173. data/doc/ep_flux/math-doc/document/img175.png +0 -0
  174. data/doc/ep_flux/math-doc/document/img176.png +0 -0
  175. data/doc/ep_flux/math-doc/document/img177.png +0 -0
  176. data/doc/ep_flux/math-doc/document/img178.png +0 -0
  177. data/doc/ep_flux/math-doc/document/img179.png +0 -0
  178. data/doc/ep_flux/math-doc/document/img18.png +0 -0
  179. data/doc/ep_flux/math-doc/document/img180.png +0 -0
  180. data/doc/ep_flux/math-doc/document/img181.png +0 -0
  181. data/doc/ep_flux/math-doc/document/img182.png +0 -0
  182. data/doc/ep_flux/math-doc/document/img183.png +0 -0
  183. data/doc/ep_flux/math-doc/document/img184.png +0 -0
  184. data/doc/ep_flux/math-doc/document/img185.png +0 -0
  185. data/doc/ep_flux/math-doc/document/img186.png +0 -0
  186. data/doc/ep_flux/math-doc/document/img187.png +0 -0
  187. data/doc/ep_flux/math-doc/document/img188.png +0 -0
  188. data/doc/ep_flux/math-doc/document/img189.png +0 -0
  189. data/doc/ep_flux/math-doc/document/img19.png +0 -0
  190. data/doc/ep_flux/math-doc/document/img190.png +0 -0
  191. data/doc/ep_flux/math-doc/document/img191.png +0 -0
  192. data/doc/ep_flux/math-doc/document/img192.png +0 -0
  193. data/doc/ep_flux/math-doc/document/img193.png +0 -0
  194. data/doc/ep_flux/math-doc/document/img194.png +0 -0
  195. data/doc/ep_flux/math-doc/document/img195.png +0 -0
  196. data/doc/ep_flux/math-doc/document/img196.png +0 -0
  197. data/doc/ep_flux/math-doc/document/img197.png +0 -0
  198. data/doc/ep_flux/math-doc/document/img198.png +0 -0
  199. data/doc/ep_flux/math-doc/document/img199.png +0 -0
  200. data/doc/ep_flux/math-doc/document/img2.png +0 -0
  201. data/doc/ep_flux/math-doc/document/img20.png +0 -0
  202. data/doc/ep_flux/math-doc/document/img200.png +0 -0
  203. data/doc/ep_flux/math-doc/document/img21.png +0 -0
  204. data/doc/ep_flux/math-doc/document/img22.png +0 -0
  205. data/doc/ep_flux/math-doc/document/img23.png +0 -0
  206. data/doc/ep_flux/math-doc/document/img24.png +0 -0
  207. data/doc/ep_flux/math-doc/document/img25.png +0 -0
  208. data/doc/ep_flux/math-doc/document/img26.png +0 -0
  209. data/doc/ep_flux/math-doc/document/img27.png +0 -0
  210. data/doc/ep_flux/math-doc/document/img28.png +0 -0
  211. data/doc/ep_flux/math-doc/document/img29.png +0 -0
  212. data/doc/ep_flux/math-doc/document/img3.png +0 -0
  213. data/doc/ep_flux/math-doc/document/img30.png +0 -0
  214. data/doc/ep_flux/math-doc/document/img31.png +0 -0
  215. data/doc/ep_flux/math-doc/document/img32.png +0 -0
  216. data/doc/ep_flux/math-doc/document/img33.png +0 -0
  217. data/doc/ep_flux/math-doc/document/img34.png +0 -0
  218. data/doc/ep_flux/math-doc/document/img35.png +0 -0
  219. data/doc/ep_flux/math-doc/document/img36.png +0 -0
  220. data/doc/ep_flux/math-doc/document/img37.png +0 -0
  221. data/doc/ep_flux/math-doc/document/img38.png +0 -0
  222. data/doc/ep_flux/math-doc/document/img39.png +0 -0
  223. data/doc/ep_flux/math-doc/document/img4.png +0 -0
  224. data/doc/ep_flux/math-doc/document/img40.png +0 -0
  225. data/doc/ep_flux/math-doc/document/img41.png +0 -0
  226. data/doc/ep_flux/math-doc/document/img42.png +0 -0
  227. data/doc/ep_flux/math-doc/document/img43.png +0 -0
  228. data/doc/ep_flux/math-doc/document/img44.png +0 -0
  229. data/doc/ep_flux/math-doc/document/img45.png +0 -0
  230. data/doc/ep_flux/math-doc/document/img46.png +0 -0
  231. data/doc/ep_flux/math-doc/document/img47.png +0 -0
  232. data/doc/ep_flux/math-doc/document/img48.png +0 -0
  233. data/doc/ep_flux/math-doc/document/img49.png +0 -0
  234. data/doc/ep_flux/math-doc/document/img5.png +0 -0
  235. data/doc/ep_flux/math-doc/document/img50.png +0 -0
  236. data/doc/ep_flux/math-doc/document/img51.png +0 -0
  237. data/doc/ep_flux/math-doc/document/img52.png +0 -0
  238. data/doc/ep_flux/math-doc/document/img53.png +0 -0
  239. data/doc/ep_flux/math-doc/document/img54.png +0 -0
  240. data/doc/ep_flux/math-doc/document/img55.png +0 -0
  241. data/doc/ep_flux/math-doc/document/img56.png +0 -0
  242. data/doc/ep_flux/math-doc/document/img57.png +0 -0
  243. data/doc/ep_flux/math-doc/document/img58.png +0 -0
  244. data/doc/ep_flux/math-doc/document/img59.png +0 -0
  245. data/doc/ep_flux/math-doc/document/img6.png +0 -0
  246. data/doc/ep_flux/math-doc/document/img60.png +0 -0
  247. data/doc/ep_flux/math-doc/document/img61.png +0 -0
  248. data/doc/ep_flux/math-doc/document/img62.png +0 -0
  249. data/doc/ep_flux/math-doc/document/img63.png +0 -0
  250. data/doc/ep_flux/math-doc/document/img64.png +0 -0
  251. data/doc/ep_flux/math-doc/document/img65.png +0 -0
  252. data/doc/ep_flux/math-doc/document/img66.png +0 -0
  253. data/doc/ep_flux/math-doc/document/img67.png +0 -0
  254. data/doc/ep_flux/math-doc/document/img68.png +0 -0
  255. data/doc/ep_flux/math-doc/document/img69.png +0 -0
  256. data/doc/ep_flux/math-doc/document/img7.png +0 -0
  257. data/doc/ep_flux/math-doc/document/img70.png +0 -0
  258. data/doc/ep_flux/math-doc/document/img71.png +0 -0
  259. data/doc/ep_flux/math-doc/document/img72.png +0 -0
  260. data/doc/ep_flux/math-doc/document/img73.png +0 -0
  261. data/doc/ep_flux/math-doc/document/img74.png +0 -0
  262. data/doc/ep_flux/math-doc/document/img75.png +0 -0
  263. data/doc/ep_flux/math-doc/document/img76.png +0 -0
  264. data/doc/ep_flux/math-doc/document/img77.png +0 -0
  265. data/doc/ep_flux/math-doc/document/img78.png +0 -0
  266. data/doc/ep_flux/math-doc/document/img79.png +0 -0
  267. data/doc/ep_flux/math-doc/document/img8.png +0 -0
  268. data/doc/ep_flux/math-doc/document/img80.png +0 -0
  269. data/doc/ep_flux/math-doc/document/img81.png +0 -0
  270. data/doc/ep_flux/math-doc/document/img82.png +0 -0
  271. data/doc/ep_flux/math-doc/document/img83.png +0 -0
  272. data/doc/ep_flux/math-doc/document/img84.png +0 -0
  273. data/doc/ep_flux/math-doc/document/img85.png +0 -0
  274. data/doc/ep_flux/math-doc/document/img86.png +0 -0
  275. data/doc/ep_flux/math-doc/document/img87.png +0 -0
  276. data/doc/ep_flux/math-doc/document/img88.png +0 -0
  277. data/doc/ep_flux/math-doc/document/img89.png +0 -0
  278. data/doc/ep_flux/math-doc/document/img9.png +0 -0
  279. data/doc/ep_flux/math-doc/document/img90.png +0 -0
  280. data/doc/ep_flux/math-doc/document/img91.png +0 -0
  281. data/doc/ep_flux/math-doc/document/img92.png +0 -0
  282. data/doc/ep_flux/math-doc/document/img93.png +0 -0
  283. data/doc/ep_flux/math-doc/document/img94.png +0 -0
  284. data/doc/ep_flux/math-doc/document/img95.png +0 -0
  285. data/doc/ep_flux/math-doc/document/img96.png +0 -0
  286. data/doc/ep_flux/math-doc/document/img97.png +0 -0
  287. data/doc/ep_flux/math-doc/document/img98.png +0 -0
  288. data/doc/ep_flux/math-doc/document/img99.png +0 -0
  289. data/doc/ep_flux/math-doc/document/index.html +101 -0
  290. data/doc/ep_flux/math-doc/document/internals.pl +258 -0
  291. data/doc/ep_flux/math-doc/document/labels.pl +265 -0
  292. data/doc/ep_flux/math-doc/document/next.png +0 -0
  293. data/doc/ep_flux/math-doc/document/next_g.png +0 -0
  294. data/doc/ep_flux/math-doc/document/node1.html +104 -0
  295. data/doc/ep_flux/math-doc/document/node10.html +164 -0
  296. data/doc/ep_flux/math-doc/document/node11.html +86 -0
  297. data/doc/ep_flux/math-doc/document/node12.html +166 -0
  298. data/doc/ep_flux/math-doc/document/node13.html +897 -0
  299. data/doc/ep_flux/math-doc/document/node14.html +1065 -0
  300. data/doc/ep_flux/math-doc/document/node15.html +72 -0
  301. data/doc/ep_flux/math-doc/document/node16.html +81 -0
  302. data/doc/ep_flux/math-doc/document/node2.html +82 -0
  303. data/doc/ep_flux/math-doc/document/node3.html +91 -0
  304. data/doc/ep_flux/math-doc/document/node4.html +149 -0
  305. data/doc/ep_flux/math-doc/document/node5.html +330 -0
  306. data/doc/ep_flux/math-doc/document/node6.html +99 -0
  307. data/doc/ep_flux/math-doc/document/node7.html +98 -0
  308. data/doc/ep_flux/math-doc/document/node8.html +83 -0
  309. data/doc/ep_flux/math-doc/document/node9.html +140 -0
  310. data/doc/ep_flux/math-doc/document/prev.png +0 -0
  311. data/doc/ep_flux/math-doc/document/prev_g.png +0 -0
  312. data/doc/ep_flux/math-doc/document/up.png +0 -0
  313. data/doc/ep_flux/math-doc/document/up_g.png +0 -0
  314. data/doc/ep_flux/math-doc/document.pdf +0 -0
  315. data/doc/ep_flux/math-doc/document.tex +2018 -0
  316. data/doc/gdir.html +412 -0
  317. data/doc/gdir_client.html +16 -0
  318. data/doc/gdir_connect_ftp-like.html +61 -0
  319. data/doc/gdir_server.html +45 -0
  320. data/doc/ggraph.html +1615 -0
  321. data/doc/gpcat.html +44 -0
  322. data/doc/gpcut.html +41 -0
  323. data/doc/gphys.html +532 -0
  324. data/doc/gphys_fft.html +324 -0
  325. data/doc/gphys_grads_io.html +69 -0
  326. data/doc/gphys_grib_io.html +82 -0
  327. data/doc/gphys_io.html +120 -0
  328. data/doc/gphys_io_common.html +18 -0
  329. data/doc/gphys_netcdf_io.html +283 -0
  330. data/doc/gplist.html +24 -0
  331. data/doc/gpmath.html +51 -0
  332. data/doc/gpmaxmin.html +31 -0
  333. data/doc/gpprint.html +34 -0
  334. data/doc/gpview.html +270 -0
  335. data/doc/grads2nc_with_gphys.html +21 -0
  336. data/doc/grads_gridded.html +307 -0
  337. data/doc/grib.html +144 -0
  338. data/doc/grid.html +212 -0
  339. data/doc/index.html +133 -0
  340. data/doc/index.rd +127 -0
  341. data/doc/netcdf_convention.html +136 -0
  342. data/doc/unumeric.html +176 -0
  343. data/doc/update +64 -0
  344. data/doc/varray.html +299 -0
  345. data/doc/varraycomposite.html +67 -0
  346. data/ext_coord.c +209 -0
  347. data/ext_init.c +7 -0
  348. data/extconf.rb +42 -0
  349. data/install.rb +130 -0
  350. data/interpo.c +497 -0
  351. data/lib/numru/dcl_mouse.rb +71 -0
  352. data/lib/numru/dclext_datetime_ax.rb +220 -0
  353. data/lib/numru/derivative.rb +348 -0
  354. data/lib/numru/ganalysis/covariance.rb +154 -0
  355. data/lib/numru/ganalysis/eof.rb +298 -0
  356. data/lib/numru/ganalysis/histogram.rb +252 -0
  357. data/lib/numru/ganalysis/met.rb +317 -0
  358. data/lib/numru/ganalysis/planet.rb +182 -0
  359. data/lib/numru/ganalysis.rb +7 -0
  360. data/lib/numru/gdir.rb +1038 -0
  361. data/lib/numru/gdir_connect_ftp-like.rb +149 -0
  362. data/lib/numru/ggraph.rb +5838 -0
  363. data/lib/numru/ggraph_on_merdional_section.rb +178 -0
  364. data/lib/numru/gphys/assoccoords.rb +359 -0
  365. data/lib/numru/gphys/attribute.rb +129 -0
  366. data/lib/numru/gphys/attributenetcdf.rb +80 -0
  367. data/lib/numru/gphys/axis.rb +963 -0
  368. data/lib/numru/gphys/coordmapping.rb +286 -0
  369. data/lib/numru/gphys/coordtransform.rb +209 -0
  370. data/lib/numru/gphys/derivative.rb +314 -0
  371. data/lib/numru/gphys/ep_flux.rb +868 -0
  372. data/lib/numru/gphys/gpcommon.rb +52 -0
  373. data/lib/numru/gphys/gphys.rb +1207 -0
  374. data/lib/numru/gphys/gphys_fft.rb +886 -0
  375. data/lib/numru/gphys/gphys_grads_io.rb +212 -0
  376. data/lib/numru/gphys/gphys_grib_io.rb +214 -0
  377. data/lib/numru/gphys/gphys_gtool3_io.rb +162 -0
  378. data/lib/numru/gphys/gphys_hdfeos5_io.rb +672 -0
  379. data/lib/numru/gphys/gphys_io.rb +452 -0
  380. data/lib/numru/gphys/gphys_io_common.rb +126 -0
  381. data/lib/numru/gphys/gphys_netcdf_io.rb +800 -0
  382. data/lib/numru/gphys/gphys_nusdas_io.rb +132 -0
  383. data/lib/numru/gphys/grads_gridded.rb +1638 -0
  384. data/lib/numru/gphys/grib.rb +2049 -0
  385. data/lib/numru/gphys/grib_params.rb +1465 -0
  386. data/lib/numru/gphys/grid.rb +723 -0
  387. data/lib/numru/gphys/gtool3.rb +771 -0
  388. data/lib/numru/gphys/interpolate.rb +854 -0
  389. data/lib/numru/gphys/narray_ext.rb +34 -0
  390. data/lib/numru/gphys/netcdf_convention.rb +406 -0
  391. data/lib/numru/gphys/subsetmapping.rb +332 -0
  392. data/lib/numru/gphys/unumeric.rb +522 -0
  393. data/lib/numru/gphys/varray.rb +1109 -0
  394. data/lib/numru/gphys/varraycomposite.rb +415 -0
  395. data/lib/numru/gphys/varraygrads.rb +225 -0
  396. data/lib/numru/gphys/varraygrib.rb +177 -0
  397. data/lib/numru/gphys/varraygtool3.rb +226 -0
  398. data/lib/numru/gphys/varrayhdfeos5.rb +451 -0
  399. data/lib/numru/gphys/varraynetcdf.rb +350 -0
  400. data/lib/numru/gphys/varraynusdas.rb +59 -0
  401. data/lib/numru/gphys.rb +9 -0
  402. data/lib/numru/htdir.rb +170 -0
  403. data/multibitIO.c +567 -0
  404. data/sample/cira86_to_nc.rb +122 -0
  405. data/sample/druby_cli1.rb +21 -0
  406. data/sample/druby_cli2.rb +34 -0
  407. data/sample/druby_serv1.rb +30 -0
  408. data/sample/druby_serv2.rb +64 -0
  409. data/sample/ep_flux/demo_NCEP_1.rb +48 -0
  410. data/sample/ep_flux/demo_NCEP_2.rb +57 -0
  411. data/sample/ep_flux/demo_NCEP_3.rb +81 -0
  412. data/sample/ggraph_latlon_labelling_dr002690.rb +159 -0
  413. data/sample/ggraph_mapfit-axes_dr002687.rb +131 -0
  414. data/sample/map_projection.rb +121 -0
  415. data/sample/ncep_theta_coord.rb +79 -0
  416. data/test/eof_slp.rb +28 -0
  417. data/test/mltbit.dat +0 -0
  418. data/test/test_ep_flux.rb +533 -0
  419. data/test/test_multibitIO.rb +19 -0
  420. data/testdata/T.jan.ctl +12 -0
  421. data/testdata/T.jan.dat +0 -0
  422. data/testdata/T.jan.grib +0 -0
  423. data/testdata/T.jan.nc +0 -0
  424. data/testdata/T.jan.packed.withmiss.nc +0 -0
  425. data/testdata/UV.jan.nc +0 -0
  426. data/testdata/assoc_crds.nc +0 -0
  427. data/testdata/cira86.dat +1332 -0
  428. metadata +621 -0
data/lib/numru/gdir.rb ADDED
@@ -0,0 +1,1038 @@
1
+ =begin
2
+ =class NumRu::GDir
3
+
4
+ A class to represent diretories and data files for GPhys.
5
+
6
+ ==Overview
7
+
8
+ A GDir object represents a directory, or a file (such as a NetCDF
9
+ file or GrADS control file), for which
10
+ GPhys objects can be defined for the variables in it.
11
+ This means that a NetCDF file, for example, is treated a
12
+ directory, rather than a plain file.
13
+
14
+ GDir serves a directory tree under a root (top) directory, which can
15
+ be set as a class variable with ((<GDir.top=>)). All the absolute path
16
+ of GDir is actually relative to the root directory, and to access
17
+ outside the root directory is prohibited. Furthermore, it has a
18
+ working directory as a class variable, whose initial value is the top
19
+ directory and can be changed by ((<GDir.cd>)).
20
+
21
+ NEW(2005/06): Now GDir can accept DODS URL as a path. Also,
22
+ the top directory can be set to a DODS URL.
23
+
24
+ ==Class Methods
25
+
26
+ ---GDir.top=(top)
27
+ Sets the root directory. This should be done before making
28
+ any GDir objects by ((<GDir.new>)). The default root directory
29
+ is the root directory of the local file system ('/').
30
+
31
+ ARGUMENTS
32
+ * ((|top|)) (String): path of the top directory
33
+
34
+ RETURN VALUE
35
+ * absolute path of the top directory (String) (followed by a '/')
36
+
37
+ ---GDir.top
38
+
39
+ RETURN VALUE
40
+ * absolute path of the top directory (String) (followed by a '/')
41
+
42
+ ---GDir.new(path)
43
+ Constructor.
44
+
45
+ ARGUMENTS
46
+ * ((|path|)) (String): path of the directory to open as a GDir.
47
+ The path is expressed in terms of the top directory.
48
+
49
+ RETURN VALUE
50
+ * a GDir
51
+
52
+ ERRORS
53
+ * ArgumentError if ((|path|)) is out of the directory
54
+ tree (originated at the top directory).
55
+
56
+ EXAMPLES
57
+ * If the top directory is "/hoge", you can open
58
+ "/hoge/ho" directory by any of the following.
59
+
60
+ gdir = GDir.new("/ho")
61
+ gdir = GDir.new("./ho")
62
+
63
+ If you want to open "/hoge" (the top directly), then
64
+
65
+ gdir = GDir.new("/")
66
+ gdir = GDir.new(".")
67
+
68
+ To open a NetCDF file or GrADS control file,
69
+
70
+ gdir = GDir.new("/ho/data.nc")
71
+ gdir = GDir.new("/ho/data.ctl")
72
+
73
+ ---GDir.set_text_pattern(*regexps)
74
+
75
+ Sets regular expressions to match the file name of text files.
76
+ The default is /\.txt$/ and /^\w*$/.
77
+
78
+ ARGUMENTS
79
+ * zero or more Regular expressions (zero means no file will be treated
80
+ as a NetCDF file).
81
+
82
+ RETURN VALUE
83
+ * nil
84
+
85
+ ERRORS
86
+ * TypeError if any of the arguments is not a Regexp
87
+
88
+ ---GDir.add_text_pattern(regexp [, regexp [, ...]])
89
+ Similar to ((<GDir.set_text_pattern>)), but adds regular expressions
90
+ instead of replacing existing ones.
91
+
92
+ RETURN VALUE
93
+ * nil
94
+
95
+ ERRORS
96
+ * TypeError if any of the arguments is not a Regexp
97
+
98
+ ---GDir.cd(path)
99
+
100
+ Changes the working directory of the class.
101
+
102
+ RETURN VALUE
103
+ * a GDir
104
+
105
+ ---GDir.cwd=(path)
106
+ Aliased to ((<GDir.cd>)).
107
+
108
+ ---GDir.cwd
109
+ Returns the current working directory as a GDir. The initial value of
110
+ the working directory is the top directory.
111
+
112
+ RETURN VALUE
113
+ * a GDir
114
+
115
+ ---GDir.cd(path)
116
+ Changes the working directory to path
117
+
118
+ RETURN VALUE
119
+ * a GDir (current working directory changed by path)
120
+
121
+ ---GDir[]
122
+ ---GDir.data
123
+ ---GDir.text
124
+ ---GDir.list_dirs
125
+ ---GDir.list_dirs_v
126
+ ---GDir.list_data
127
+ ---GDir.list_data_v
128
+ ---GDir.list_texts
129
+ ---GDir.list_texts_v
130
+ ---GDir.ls
131
+ ---GDir.ls_v
132
+
133
+ All of these are dispatched to the current working directory.
134
+ Thus, (('GDir.show')) is equivalent to (('GDir.cwd.show')), for example.
135
+
136
+ ==Instance Methods
137
+
138
+ ---close
139
+ Closes the file/directory objects in the GDir.
140
+
141
+ ---path
142
+ Returns the path (relative to the top directory)
143
+
144
+ RETURN VALUE
145
+ * a String
146
+
147
+ ---name
148
+ Name of the GDir
149
+
150
+ RETURN VALUE
151
+ * a String
152
+
153
+ ---inspect
154
+ Returns the path
155
+
156
+ RETURN VALUE
157
+ * a String
158
+
159
+ ---[](path)
160
+ Returns a GDir, GPhys, or File (text), by calling
161
+ ((<dir>)), ((<data>)), or ((<text>)) depending on (('path')).
162
+
163
+ ARGUMENTS
164
+ * ((|path|)) (String): Either relative or absolute.
165
+
166
+ RETURN VALUE
167
+ * a GDir, GPhys, or File (text assumed)
168
+
169
+ ERROR
170
+ * an exception is raised if ((|path|)) is not appropriate.
171
+
172
+
173
+ ---dir(path)
174
+ Returns a GDir specified the ((|path|)).
175
+
176
+ ARGUMENTS
177
+ * ((|path|)) (String): Either relative or absolute.
178
+
179
+ RETURN VALUE
180
+ * a GDir
181
+
182
+ ERROR
183
+ * an exception is raised if ((|path|)) is invalid as a GDir.
184
+
185
+ ---data(path)
186
+ Returns a GPhys specified the ((|path|)).
187
+
188
+ ARGUMENTS
189
+ * ((|path|)) (String): Either relative or absolute.
190
+
191
+ RETURN VALUE
192
+ * a GPhys
193
+
194
+ ERROR
195
+ * an exception is raised if ((|path|)) is invalid as a GPhys.
196
+
197
+ ---text(path)
198
+ Returns a text file object specified the ((|path|)).
199
+
200
+ ARGUMENTS
201
+ * ((|path|)) (String): Either relative or absolute.
202
+
203
+ RETURN VALUE
204
+ * a File
205
+
206
+ ERROR
207
+ * an exception is raised if ((|path|)) is invalid as a text file
208
+ (based on the pattern: see above).
209
+
210
+ ---find_dir( filt )
211
+ Recursively search a GDir whose name match ((|filt|))..
212
+
213
+ ARGUMENTS
214
+ * ((|filt|)) (Regexp or String) If String, converted to Regexp
215
+ with (('Regexp.new(filt)')).
216
+
217
+ RETURN VALUE
218
+ * an Array holding pathes (String) that matched.
219
+
220
+ ---find_data( name=nil,long_name=nil,units=nil )
221
+ Recursively search data variables under the directory.
222
+ Mathces are by taking "AND" for non-nil arguments.
223
+ (At least one of the three arguments must be non-nil.)
224
+
225
+ ARGUMENTS
226
+ * ((|name|)) (Regexp or String or nil) Variable name. If String,
227
+ converted to Regexp with (('Regexp.new(name)')).
228
+ * ((|long_name|)) (Regexp or String or nil) long_name. If String,
229
+ converted to Regexp with (('Regexp.new(long_name)')).
230
+ * ((|long_name|)) (Units or String or nil) long_name. If String,
231
+ converted to Units with (('Units.new(units)')).
232
+
233
+ RETURN VALUE
234
+ * an Array holding the path and variable name that matched
235
+ (two-element Array of String; [path, variable_name] ).
236
+
237
+ ---list_dirs(path=nil)
238
+ Returns the names of the directories.
239
+
240
+ See also ((<ls>)).
241
+
242
+ ARGUMENTS
243
+ * ((|path|)) (nil or String): if nil, the method is applied to the
244
+ current directory. If specified, listing is made for the directory
245
+ designated by it. Either relative or absolute.
246
+
247
+ RETURN VALUE
248
+ * an Array of String
249
+
250
+ ---list_dirs_v(path=nil)
251
+ Verbose version of ((<list_dirs>)), showing size and mtime like 'ls -l'.
252
+
253
+ See also ((<ls_l>)).
254
+
255
+ ARGUMENTS
256
+ * See ((<list_dirs>)).
257
+
258
+ RETURN VALUE
259
+ * an Array of String
260
+
261
+ Example of a string:
262
+ 275492 Apr 12 19:15 hogehoge_data.nc/
263
+
264
+ ---list_data(path=nil)
265
+ Returns the names of the data (variables on which GPhys objects
266
+ can be defined.) Returns a non-empty array if the GDir (current
267
+ or at the path) is actually a file recognized by GPhys (i.e.,
268
+ NetCDF or GrADS control file).
269
+
270
+ ARGUMENTS
271
+ * ((|path|)) (nil or String): if nil, the method is applied to the
272
+ current directory. If specified, listing is made for the directory
273
+ designated by it. Either relative or absolute.
274
+
275
+ RETURN VALUE
276
+ * an Array of String
277
+
278
+ ---list_data_v(path=nil)
279
+ Verbose version of ((<list_data>)), showing shape, long_name,
280
+ and units.
281
+
282
+ See also ((<ls_l>)).
283
+
284
+ ARGUMENTS
285
+ * See ((<list_data>)).
286
+
287
+ RETURN VALUE
288
+ * an Array of String
289
+
290
+ Example of a string:
291
+ u [lon=120,lat=120,z=40,t=73] 'x components of velocity' (m/s)
292
+
293
+ ---list_texts(path=nil)
294
+ Returns the names of the text files.
295
+ Whether a file is a text file or not is judged based on the
296
+ name of the file: That matched the predefined patters is
297
+ judged as a text file regardless whether it is really so.
298
+ The default pattern is /\.txt$/ and /^\w*$/. The patterns
299
+ can be customized by ((<set_text_patterns>)) or
300
+ ((<add_text_patterns>)).
301
+
302
+ ARGUMENTS
303
+ * ((|path|)) (nil or String): if nil, the method is applied to the
304
+ current directory. If specified, listing is made for the directory
305
+ designated by it. Either relative or absolute.
306
+
307
+ RETURN VALUE
308
+ * an Array of String
309
+
310
+ ---list_texts_v(path=nil)
311
+ Verbose version of ((<list_texts>)), showing size and mtime like 'ls -l'.
312
+
313
+ See also ((<ls_l>)).
314
+
315
+ ARGUMENTS
316
+ * See ((<list_texts>)).
317
+
318
+ RETURN VALUE
319
+ * an Array of String
320
+
321
+ ---ls(path=nil)
322
+ Prints the results of ((<list_dirs>)), ((<list_data>)), and
323
+ ((<list_texts>)) on the standard output.
324
+
325
+ RETURN VALUE
326
+ * nil
327
+
328
+ ---each_dir
329
+ Iterator for each directory (GDir) under self.
330
+
331
+ ---each_data
332
+ Iterator for each GPhys under self.
333
+
334
+ ---ls_l(path=nil)
335
+ Verbose version of ((<ls>)).
336
+ Prints the results of ((<list_dirs_v>)), ((<list_data_v>)), and
337
+ ((<list_texts_v>)) on the standard output.
338
+
339
+ RETURN VALUE
340
+ * nil
341
+
342
+ ---mtime
343
+ Returns the last modified time.
344
+
345
+ RETURN VALUE
346
+ * a Time
347
+
348
+ ---atime
349
+ Returns the last accessed time.
350
+
351
+ RETURN VALUE
352
+ * a Time
353
+
354
+ ---ctime
355
+ Returns ctime.
356
+
357
+ RETURN VALUE
358
+ * a Time
359
+
360
+ ---mtime_like_ls_l
361
+
362
+ Returns the last modified time formated as in ls -l.
363
+ That is, if the time of last modification is greater than
364
+ six months ago, it is shown in the format 'month date year';
365
+ otherwise, 'month date time'.
366
+
367
+ RETURN VALUE
368
+ * a String.
369
+
370
+ =end
371
+
372
+ require "numru/gphys"
373
+ require "numru/htdir"
374
+
375
+ module NumRu
376
+
377
+ class GDir
378
+
379
+ @@top = '/' # default
380
+ @@top_pat = Regexp.new('^'+@@top)
381
+
382
+ @@text_pattern = [/\.txt$/,/^\w*$/]
383
+
384
+ @@cwd = nil # current working directory
385
+
386
+ HtDir.dods_interpret = true
387
+
388
+ def initialize(path)
389
+ http = false
390
+ if /^http/ =~ path
391
+ http = true
392
+ abspath = path.sub(/\/+$/,'')
393
+ @path = @abspath = ( abspath + '/' )
394
+ elsif /^http/ =~ @@top
395
+ http = true
396
+ abspath = @@top + path.sub(/\/+$/,'')
397
+ abspath = File.expand_path( '/'+abspath ).sub(/^\//,'').sub(/^http:\//,'http://') # to clean up the path
398
+ @path = @abspath = ( abspath + '/' )
399
+ else
400
+ path = '/' + path if /^\// !~ path # to always start with '/'
401
+ path = File.expand_path( path ) # to clean up the path
402
+ abspath = @@top.sub(/^(\/.*)\/$/,'\1')+path.sub(/\/+$/,'')
403
+ @path = abspath.sub(@@top_pat,'') + '/'
404
+ @abspath = abspath + '/'
405
+ end
406
+ ftype = __ftype(abspath)
407
+ case ftype
408
+ when "directory"
409
+ if http
410
+ @dir = HtDir.new(abspath)
411
+ else
412
+ @dir = Dir.new(abspath)
413
+ end
414
+ @file = nil
415
+ when "file"
416
+ if (file_class = GPhys::IO::file2file_class( abspath ))
417
+ # non-nil means GPhys knows it.
418
+ @dir = nil
419
+ @file = file_class.open( abspath )
420
+ else
421
+ raise path+" are not dealt with GPhys. " +
422
+ "Use GPhys::IO::add_(nc|gr)_pattern if it should be."
423
+ end
424
+ else
425
+ raise ArgumentError, abspath+": Unsupported file type "+ftype
426
+ end
427
+ end
428
+
429
+ ####### CLASS METHODS ######
430
+
431
+ class << self
432
+ alias open new
433
+
434
+ def top=(top)
435
+ if /^http:\/\// =~ top
436
+ top = top.sub(/\/+$/,'')
437
+ else
438
+ top = File.expand_path( top ) # to absolute path
439
+ end
440
+ ### top.untaint
441
+ @@top_pat = Regexp.new('^'+top)
442
+ @@top = top + '/'
443
+ @@cwd = GDir.new('/') if @@cwd # reset to the top if set
444
+ @@top
445
+ end
446
+
447
+ alias set_top top=
448
+
449
+ def top
450
+ @@top
451
+ end
452
+
453
+ ## // private >>
454
+ def set_cwd
455
+ @@cwd = GDir.new('/') if !@@cwd
456
+ end
457
+ private :set_cwd
458
+ ## << private //
459
+
460
+ def cwd
461
+ set_cwd
462
+ @@cwd
463
+ end
464
+
465
+ def pwd
466
+ cwd.path
467
+ end
468
+
469
+ def cd(path)
470
+ if /^\// =~ path
471
+ # absolute path
472
+ @@cwd = GDir.new( path )
473
+ else
474
+ # relative path
475
+ set_cwd
476
+ @@cwd = GDir.new( @@cwd.path + path )
477
+ end
478
+ end
479
+
480
+ alias chdir cd
481
+ alias cwd= cd
482
+
483
+ [ ## 'mtime','ctime','atime',
484
+ ## 'size','mtime_like_ls_l',
485
+ '[]','data','text',
486
+ 'list_dirs','list_dirs_v','list_data','list_data_v',
487
+ 'list_texts','list_texts_v','ls','ls_l'
488
+ ].each do |method|
489
+ eval <<-EOS
490
+ def #{method}(*args)
491
+ set_cwd
492
+ @@cwd.#{method}(*args)
493
+ end
494
+ EOS
495
+ end
496
+
497
+ def add_text_pattern(*regexps)
498
+ regexps.each{ |regexp|
499
+ raise TypeError,"Regexp expected" unless Regexp===regexp
500
+ @@text_pattern.push(regexp)
501
+ }
502
+ nil
503
+ end
504
+
505
+ def GDir.set_text_pattern(*regexps)
506
+ regexps.each{ |regexp|
507
+ raise TypeError,"Regexp expected" unless Regexp===regexp
508
+ }
509
+ @@text_pattern = regexps
510
+ nil
511
+ end
512
+
513
+ end
514
+
515
+ ####### INSTANCE METHODS ######
516
+
517
+ def close
518
+ @dir.close if @dir
519
+ @file.close if @file
520
+ end
521
+
522
+ def path
523
+ @path
524
+ end
525
+ def name
526
+ @path=='/' ? @path : File.basename( @path.sub(/\/$/,'') )
527
+ end
528
+
529
+ def inspect
530
+ path
531
+ end
532
+
533
+ def [](path)
534
+ begin
535
+ begin
536
+ dir(path)
537
+ rescue
538
+ begin
539
+ data(path)
540
+ rescue
541
+ text(path)
542
+ end
543
+ end
544
+ rescue
545
+ pt = path || ''
546
+ raise @path+pt+': no such data, directory or text (or is outside the tree)'
547
+ end
548
+ end
549
+
550
+ def dir(path)
551
+ case path
552
+ when /^\//
553
+ # absolute path
554
+ GDir.new(path)
555
+ else
556
+ # relative path
557
+ GDir.new(@path+path)
558
+ end
559
+ end
560
+
561
+ alias cd dir
562
+
563
+ def data(path)
564
+ dirname = File.dirname(path)
565
+ if dirname != '.'
566
+ self.dir(dirname).data( File.basename(path) )
567
+ else
568
+ # path is for the current directory.
569
+ if @dir
570
+ raise "data #{path} is not found" # cannot be directly under a Dir
571
+ else
572
+ GPhys::IO::open(@file,path)
573
+ end
574
+ end
575
+ end
576
+
577
+ def text(path)
578
+ dirname = File.dirname(path)
579
+ if dirname != '.'
580
+ self.dir(dirname).text( File.basename(path) )
581
+ else
582
+ # path is for the current directory.
583
+ if @dir
584
+ if __ftype(@abspath+path) == "file"
585
+ case path
586
+ when *@@text_pattern
587
+ File.open(@abspath+path)
588
+ else
589
+ raise "#{path} does not match patterns to find text files"
590
+ end
591
+ else
592
+ raise "text #{path} is not a plain file"
593
+ end
594
+ else
595
+ raise "text #{path} is not found"
596
+ end
597
+ end
598
+ end
599
+
600
+ def open_all_data
601
+ hash = Hash.new
602
+ if @file
603
+ GPhys::IO::var_names(@file).each do |nm|
604
+ hash[nm.to_sym] = data(nm)
605
+ end
606
+ end
607
+ hash
608
+ end
609
+
610
+ def find_dir( filt )
611
+ # filt is a Regexp or String
612
+ filt = Regexp.new( filt ) if filt.is_a?(String)
613
+ if ( filt =~ name )
614
+ result = [ path ]
615
+ else
616
+ result = []
617
+ end
618
+
619
+ if @dir
620
+ dnames = []
621
+ @dir.rewind
622
+ @dir.each{|fnm|
623
+ if fnm != '.' && fnm != '..' && __can_be_a_gdir(@abspath+fnm)
624
+ dnames.push( @path+fnm )
625
+ end
626
+ }
627
+ dnames.each do |nm|
628
+ dir = GDir.new(nm)
629
+ result.push(*dir.find_dir(filt))
630
+ dir.close
631
+ end
632
+ end
633
+
634
+ result
635
+ end
636
+
637
+ def find_data(name=nil,long_name=nil,units=nil)
638
+ # GC.start
639
+ # name (Regexp (or String; partial match))
640
+ # long_name (Regexp (or String; partial match))
641
+ # units (Units or String)
642
+
643
+ if !(name || long_name || units)
644
+ raise ArgumentError,
645
+ "You must specify at least one of name, long_name, and units"
646
+ end
647
+
648
+ name = Regexp.new( name ) if name.is_a?(String)
649
+ long_name = Regexp.new( long_name ) if long_name.is_a?(String)
650
+ units = Units.new( units ) if units.is_a?(String)
651
+
652
+ result = []
653
+
654
+ if @file
655
+ #p @file.path
656
+ GPhys::IO::var_names(@file).each do |nm|
657
+ if !name || name =~ nm
658
+ # name inspection passed
659
+ gph = GPhys::IO::open(@file,nm) if long_name || units
660
+ if !long_name || long_name =~ gph.long_name
661
+ # long_name inspection passed
662
+ if !units || units == gph.units
663
+ # units inspection passed
664
+ result.push( [path, nm] )
665
+ end
666
+ end
667
+ end
668
+
669
+ end
670
+ end
671
+
672
+ if @dir
673
+ dnames = []
674
+ @dir.rewind
675
+ @dir.each{|fnm|
676
+ if fnm != '.' && fnm != '..' && __can_be_a_gdir(@abspath+fnm)
677
+ dnames.push( @path+fnm )
678
+ end
679
+ }
680
+ dnames.each do |nm|
681
+ dir = GDir.new(nm)
682
+ result.push(*dir.find_data(name,long_name,units))
683
+ dir.close
684
+ end
685
+ end
686
+
687
+ result
688
+ end
689
+
690
+ def list_dirs(path = nil)
691
+ if path
692
+ self.dir(path).list_dirs
693
+ else
694
+ if @dir
695
+ gdir_names = []
696
+ @dir.rewind
697
+ @dir.each{|fnm|
698
+ if fnm != '.' && fnm != '..' && __can_be_a_gdir(@abspath+fnm)
699
+ gdir_names.push( fnm )
700
+ end
701
+ }
702
+ gdir_names.sort
703
+ else
704
+ []
705
+ end
706
+ end
707
+ end
708
+
709
+ def list_dirs_v(path = nil)
710
+ # verbose version
711
+ if path
712
+ self.dir(path).list_dirs_v
713
+ else
714
+ if @dir
715
+ if /^http:\/\// =~ @abspath
716
+ return self.list_dirs
717
+ end
718
+ list = []
719
+ @dir.rewind
720
+ @dir.collect{|x| x}.sort.each{|fnm|
721
+ if fnm != '.' && fnm != '..' && __can_be_a_gdir(@abspath+fnm)
722
+ gdir = GDir.new(@path+fnm)
723
+ list.push( sprintf("%10d %s %s/",gdir.size.to_s,
724
+ gdir.mtime_like_ls_l, fnm) )
725
+ gdir.close
726
+ end
727
+ }
728
+ list
729
+ else
730
+ []
731
+ end
732
+ end
733
+ end
734
+
735
+ def list_data(path = nil)
736
+ if path
737
+ self.dir(path).list_data
738
+ else
739
+ if @file
740
+ GPhys::IO::var_names(@file)
741
+ else
742
+ []
743
+ end
744
+ end
745
+ end
746
+
747
+ def list_data_v(path = nil)
748
+ # verbose version
749
+ if path
750
+ self.dir(path).list_data_v
751
+ else
752
+ if @file
753
+ GPhys::IO::var_names(@file).collect do |nm|
754
+ gph = GPhys::IO::open(@file,nm)
755
+ axinfo = '['
756
+ (0...gph.rank).collect do |i|
757
+ axinfo += gph.axis(i).name + '=' + gph.shape[i].to_s + ','
758
+ end
759
+ axinfo.sub!(/,$/,']')
760
+ "#{nm}\t#{axinfo}\t'#{gph.long_name}'\t(#{gph.units.to_s})"
761
+ end
762
+ else
763
+ []
764
+ end
765
+ end
766
+ end
767
+
768
+ def list_texts(path = nil)
769
+ if path
770
+ self.dir(path).list_texts
771
+ else
772
+ if @dir
773
+ text_files = []
774
+ @dir.rewind
775
+ @dir.each{|fnm|
776
+ if __ftype(@abspath+fnm) == "file"
777
+ case fnm
778
+ when *@@text_pattern
779
+ text_files.push( fnm )
780
+ end
781
+ end
782
+ }
783
+ text_files.sort
784
+ else
785
+ []
786
+ end
787
+ end
788
+ end
789
+
790
+ def list_texts_v(path = nil)
791
+ # verbose version
792
+ if path
793
+ self.dir(path).list_texts_v
794
+ else
795
+ if @dir
796
+ if /^http:\/\// =~ @abspath
797
+ return self.list_texts
798
+ end
799
+ list = []
800
+ @dir.rewind
801
+ @dir.collect{|x| x}.sort.each{|fnm|
802
+ if __ftype(@abspath+fnm) == "file"
803
+ case fnm
804
+ when *@@text_pattern
805
+ path = @abspath + fnm
806
+ list.push( sprintf("%10d %s %s",File.size(path),
807
+ __fmt_like_ls_l(File.mtime(path)), fnm) )
808
+ end
809
+ end
810
+ }
811
+ list
812
+ else
813
+ []
814
+ end
815
+ end
816
+ end
817
+
818
+ def each_dir
819
+ if @dir
820
+ @dir.rewind
821
+ @dir.each do |fnm|
822
+ if fnm != '.' && fnm != '..' && __can_be_a_gdir(@abspath+fnm)
823
+ yield( self.dir(fnm) )
824
+ end
825
+ end
826
+ self
827
+ end
828
+ end
829
+
830
+ def each_data
831
+ if @file
832
+ GPhys::IO::var_names(@file).each do |vnm|
833
+ gphys = GPhys::IO::open(@file,vnm)
834
+ yield(gphys)
835
+ end
836
+ end
837
+ end
838
+
839
+ def list_all(path = nil)
840
+ result = ''
841
+ dirs = list_dirs(path)
842
+ if dirs.length > 0
843
+ result << "Directories:\n"
844
+ dirs.each{|s| result << " '#{s}/'\n"}
845
+ end
846
+ texts = list_texts(path)
847
+ if texts.length > 0
848
+ result << "Text files?:\n"
849
+ texts.each{|s| result << " '#{s}'\n"}
850
+ end
851
+ data = list_data(path)
852
+ if data.length > 0
853
+ result << "Data:\n"
854
+ data.each{|s| result << " '#{s}'\n"}
855
+ end
856
+ result
857
+ end
858
+
859
+ def ls(path = nil)
860
+ print list_all(path)
861
+ end
862
+
863
+ def list_all_v(path = nil)
864
+ result = ''
865
+ dirs = list_dirs_v(path)
866
+ if dirs.length > 0
867
+ result << "Directories:\n"
868
+ dirs.each{|s| result << " #{s}\n"}
869
+ end
870
+ texts = list_texts_v(path)
871
+ if texts.length > 0
872
+ result << "Text files?:\n"
873
+ texts.each{|s| result << " #{s}\n"}
874
+ end
875
+ data = list_data_v(path)
876
+ if data.length > 0
877
+ result << "Data:\n"
878
+ data.each{|s| result << " #{s}\n"}
879
+ end
880
+ result
881
+ end
882
+
883
+ def ls_l(path = nil)
884
+ print list_all_v(path)
885
+ end
886
+
887
+ def mtime
888
+ File.mtime(@abspath.sub(/\/$/,''))
889
+ end
890
+ def ctime
891
+ File.ctime(@abspath.sub(/\/$/,''))
892
+ end
893
+ def atime
894
+ File.ctime(@abspath.sub(/\/$/,''))
895
+ end
896
+ def size
897
+ File.size(@abspath.sub(/\/$/,''))
898
+ end
899
+
900
+ def mtime_like_ls_l
901
+ # format mtime like ls -l
902
+ __fmt_like_ls_l( self.mtime )
903
+ end
904
+
905
+ def __fmt_like_ls_l(time)
906
+ if ( (Time.now - time) < 15811200 ) # == 86400*183: a half year
907
+ time.strftime('%b %d %H:%M')
908
+ else
909
+ time.strftime('%b %d %Y')
910
+ end
911
+ end
912
+ private :__fmt_like_ls_l
913
+
914
+ #################################
915
+ private
916
+
917
+ def __ftype(path, _depth=0)
918
+ # Same as File.ftype, but traces symbolic links
919
+
920
+ if /^http/ =~ path
921
+ if /\.(nc|ctl|ctrl|grib|cdf|hdf|dat|bin|gz|jg)$/i =~ path
922
+ ftype = 'file'
923
+ else
924
+ ftype = 'directory'
925
+ end
926
+ else
927
+ ftype = File.ftype(path)
928
+ if ftype == "link"
929
+ if _depth < 10 # == max_depth
930
+ begin
931
+ lkpath = File.readlink(path)
932
+ unless /^\// === lkpath
933
+ lkpath = File.dirname(path)+'/'+lkpath
934
+ end
935
+ ftype = __ftype( lkpath, _depth+1 )
936
+ rescue
937
+ nil # possibly a link to non-existent file
938
+ end
939
+ else
940
+ nil # Max depth exeeded: Link too long (possibly circular)
941
+ end
942
+ end
943
+ end
944
+ ftype
945
+ end
946
+
947
+ def __can_be_a_gdir(path)
948
+ ftype = __ftype(path)
949
+ if ftype=="directory" || ftype=="file" && GPhys::IO::file2type(path)
950
+ true
951
+ else
952
+ false
953
+ end
954
+ end
955
+
956
+ end # class GDir
957
+ end # module NumRu
958
+
959
+
960
+ ###############################################
961
+ # test program usage
962
+ # % ruby gdir.rb [topdir]
963
+ # EXAMPLE
964
+ # % ruby gdir.rb
965
+ # % ruby gdir.rb ..
966
+
967
+ if __FILE__ == $0
968
+
969
+ include NumRu
970
+
971
+ def find_gphys(gdir)
972
+ gphyses = []
973
+ subdirs = gdir.list_dirs.collect{ |dnm| gdir[dnm] }
974
+ subdirs.each{ |subdir|
975
+ ary = find_gphys(subdir)
976
+ gphyses += ary if ary.length != 0
977
+ }
978
+ gdir.list_data.each{|var|
979
+ gp = gdir.data(var)
980
+ gphyses.push( gp )
981
+ }
982
+ gphyses
983
+ end
984
+
985
+ def find_txt(gdir)
986
+ texts = []
987
+ subdirs = gdir.list_dirs.collect{ |dnm| gdir[dnm] }
988
+ subdirs.each{ |subdir|
989
+ ary = find_txt(subdir)
990
+ texts += ary if ary.length != 0
991
+ }
992
+ gdir.list_texts.each{|var|
993
+ gp = gdir.text(var)
994
+ texts.push( gp )
995
+ }
996
+ texts
997
+ end
998
+
999
+ top = ARGV.shift || '.'
1000
+ GDir.top = top
1001
+
1002
+ gdir = GDir.new('/')
1003
+ #gdir = GDir.new('.') # same as above
1004
+
1005
+ print "*(test)* Set the top directory to #{top}\n"
1006
+
1007
+ p gdir.mtime
1008
+ p gdir.list_dirs
1009
+ gdir.list_dirs_v.each{|s| print s+"\n"}
1010
+ p gdir.list_texts
1011
+ gdir.list_texts_v.each{|s| print s+"\n"}
1012
+ p gdir.list_data
1013
+ gdir.list_data_v.each{|s| print s+"\n"}
1014
+ print gdir.path, ' ', gdir.name, "\n"
1015
+ # print gdir[gdir.list_dirs[0]].path, ' ', gdir[gdir.list_dirs[0]].name, "\n"
1016
+ # p gdir[gdir.list_dirs[0]]['.']['..']['..']
1017
+
1018
+ print "*(test)* Searching all NetCDF&GrADS files under the top dir...\n"
1019
+ gphyses = find_gphys(gdir)
1020
+ gphyses.each{ |gp|
1021
+ print gp.name, gp.shape_current.inspect, ' ', gp.data.file.path,"\n"
1022
+ }
1023
+
1024
+ print "*(test)* Searching all text files under the top dir...\n"
1025
+ find_txt(gdir).each{|txt| print txt.path,"\n"}
1026
+
1027
+ print "\n***(test)*** DODS access \n"
1028
+ gdir = GDir.new('http://davis-dods.rish.kyoto-u.ac.jp/cgi-bin/nph-dods/jmadata/gpv/latest/gpv')
1029
+ p gdir.ls
1030
+ gd2 = gdir.dir('latest/')
1031
+ p gd2.ls_l
1032
+ gd3 = gd2.dir('MSM00S.nc/')
1033
+ p gd3.ls_l
1034
+ GDir.top = 'http://davis-dods.rish.kyoto-u.ac.jp/cgi-bin/nph-dods/jmadata/gpv/latest/gpv'
1035
+ gdir = GDir.new('.')
1036
+ g2 = GDir.new('latest')
1037
+ p gdir.ls,g2.ls
1038
+ end