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
@@ -0,0 +1,800 @@
1
+ require "numru/gphys/gphys"
2
+ require "numru/gphys/gphys_io_common"
3
+
4
+ =begin
5
+ =module NumRu::GPhys::NetCDF_Convention_Users_Guide
6
+
7
+ (To be written.)
8
+
9
+ =module NumRu::GPhys::NetCDF_IO
10
+
11
+ a NetCDF read/write helper by automatically interpreting conventions
12
+
13
+ ==Module functions
14
+ ---is_a_NetCDF?(filename)
15
+ test whether the file is a NetCDF file.
16
+
17
+ ARGUMENTS
18
+ * filename (String): filename to test.
19
+
20
+ RETURN VALUE
21
+ * true/false
22
+
23
+ ---open(files, varname)
24
+ a GPhys constructor from a NetCDF file (or multiple NetCDF files).
25
+
26
+ ARGUMENTS
27
+ * files (String, NetCDF, NArray, or Regexp): file specifier.
28
+ A single file is specified by a String (containing the path),
29
+ of a NetCDF. Multiple files can be specified by a NArray of
30
+ String or NetCDF or by a Regexp to match paths. In that case,
31
+ data and axes are represented by VArrayComposite.
32
+ * varname (String): name of the variable.
33
+
34
+ RETURN VALUE
35
+ * a GPhys
36
+
37
+ EXAMPLES
38
+ * From a single file:
39
+ file = NetCDF.open('hogehoge.nc')
40
+ gphys = GPhys::NetCDF_IO(file, 'temp')
41
+
42
+ file = NetCDF.open('hogehoge.nc', 'a') # writable
43
+ gphys = GPhys::NetCDF_IO(file, 'temp')
44
+
45
+ * From a single file:
46
+ gphys = GPhys::NetCDF_IO('hogehoge.nc', 'temp')
47
+
48
+ gphys = GPhys::NetCDF_IO('/data/netcdf/hogehoge.nc', 'temp')
49
+
50
+ If you use a String to specify a file path, the file is opened as
51
+ read-only.
52
+
53
+ * To use data separated into multiple files. Suppose that you have
54
+ hoge_yr2000.nc, hoge_yr2001.nc, and hoge_yr2002.nc in the current
55
+ directory. You can open it by using a regular expression as follows:
56
+
57
+ gphys = GPhys::NetCDF_IO(/hoge_yr(\d\d\d\d).nc/, 'temp')
58
+
59
+ Here, the parentheses to enclose \d\d\d\d is NEEDED.
60
+
61
+ The same thing can be done as follows by using Array or NArray:
62
+
63
+ files = ['hoge_yr2000.nc', 'hoge_yr2001.nc', 'hoge_yr2002.nc']
64
+ gphys = GPhys::NetCDF_IO(files, 'temp')
65
+
66
+ files = NArray['hoge_yr2000.nc', 'hoge_yr2001.nc', 'hoge_yr2002.nc']
67
+ gphys = GPhys::NetCDF_IO(files, 'temp')
68
+
69
+ * Same as above but to use the full path:
70
+
71
+ gphys = GPhys::NetCDF_IO(/\/data\/nc\/hoge_yr(\d\d\d\d).nc/, 'temp')
72
+
73
+ Here, the directory separator '/' is escaped as '\/'.
74
+
75
+ * To use data separated into multiple files. Suppose that you have
76
+ hoge_x0y0.nc, hoge_x1y0.nc, hoge_x0y1.nc, hoge_x1y1.nc, where
77
+ the data is separated 2 dimensionally into 2*2 = 4 files.
78
+
79
+ gphys = GPhys::NetCDF_IO(/hoge_x(\d)y(\d).nc/, 'temp')
80
+
81
+ Note that 2 pairs of parentheses are needed here. Alternatively,
82
+ you can also do it like this:
83
+
84
+ files = NArray[ ['hoge_x0y0.nc', 'hoge_x1y0.nc'],
85
+ ['hoge_x0y1.nc', 'hoge_x1y1.nc'] ]
86
+ gphys = GPhys::NetCDF_IO(files, 'temp')
87
+
88
+ ---write(file, gphys, name=nil)
89
+
90
+ Write a GPhys into a NetCDF file. The whole data under the GPhys
91
+ (such as coordinate vars) are written self-descriptively.
92
+
93
+ ARGUMENTS
94
+ * file (NetCDF): the NetCDF file to write in. Must be writable of course.
95
+ * gphys (GPhys): the GPhys to write.
96
+ * name (String): (optional) name in the new file -- if you want to save
97
+ with a different variable name than that of gphys.
98
+
99
+ RETURN VALUE
100
+ * nil
101
+
102
+ ---write_grid(file, grid_or_gphys)
103
+
104
+ Same as ((<write>)) but for writing only the contents of the grid.
105
+ (Used in ((<write>)).)
106
+
107
+ ARGUMENTS
108
+ * file (NetCDF): the NetCDF file to write in. Must be writable of course.
109
+ * grid_or_gphys (Grid or GPhys):
110
+
111
+ RETURN VALUE
112
+ * a Grid, in which all VArrays in the original grid are replaced
113
+ with the new ones in the file.
114
+
115
+ ---each_along_dims_write(gphyses, files, *loopdims){...} # a block is expected
116
+
117
+ Iterator to process GPhys objects too big to read on memory at once.
118
+ Makes a loop (loops) by dividing the GPhys object(s) (((|gphyses|)))
119
+ with the dimension(s) specified by ((|loopdims|)), and the results
120
+ (which is the return value of the block) are written in ((|files|)).
121
+
122
+ ARGUMENTS
123
+ * gphyses (GPhys or Array of GPhys): GPhys object(s) to be processed.
124
+ All of them must have dimensions spcified with ((|loopdims|)),
125
+ and their lengths must not vary among files. Other dimensions
126
+ are aribtary, so, for example, ((|gphyses|)) could be
127
+ [a(lon,lat,time), b(lat,time)] as long as loopdims==["time"].
128
+ * files (NetCDF or Array of NetCDF): the file in which the results are
129
+ written. The number of the file must be smaller than or equalt to
130
+ the number of resultant GPhys objects (following the multiple assignment
131
+ rule of Ruby).
132
+ * loopdims (Array of String or Integer) : name (when String) or
133
+ count starting from zero (when Integer)
134
+ * expected block : Number of arguments == number of GPhys objects in
135
+ ((|gphyses|)). Expected return value is an Array of GPhys objects
136
+ to be written ((|files|)).
137
+
138
+ RETURN VALUE
139
+ * GPhys objects in which the results are written
140
+
141
+ ERRORS
142
+
143
+ The following raise exceptions (in adition to errors in arguments).
144
+
145
+ * Dimensions specified by ((|loopdims|)) are not shared among
146
+ GPhys objects in ((|gphyses|)).
147
+ * Return value of the block is not an Array of GPhys.
148
+ * Dimension(s) used for looping (((|loopdims|))) is(are) eliminated
149
+ from the retunred GPhys objects.
150
+
151
+ USAGE
152
+
153
+ * EXAMPLE 1
154
+
155
+ Suppose that you want to do the following:
156
+
157
+ in = GPhys::NetCDF_IO.open(infile, varname)
158
+ ofile = NetCDF.create(ofilename)
159
+ out = in.mean(0)
160
+ GPhys::NetCDF_IO.write( ofile, out )
161
+ ofile.close
162
+
163
+ The data object (((|in|))) is read on memory and an averagin is made.
164
+ If the size of the data is too big to read on memory at once, you can
165
+ divid this process by using this iterator. The following gives the
166
+ same result as above, but the processing is made for each subset
167
+ divided at the last dimension (represented by -1, as in the negative
168
+ indexing of Array).
169
+
170
+ in = GPhys::NetCDF_IO.open(infile, varname)
171
+ ofile = NetCDF.create(ofilename)
172
+ out = GPhys::NetCDF_IO.each_along_dims_write(in, ofile, -1){|in_sub|
173
+ [ in_sub.mean(0) ]
174
+ }
175
+ ofile.close
176
+
177
+ In this case, each_along_dims_write makes a loop by substituting
178
+ ((|in[false,0..0]|)), ((|in[false,1..1]|)), ((|in[false,2..2]|)),..
179
+ into the argument of the block (((|in_sub|))). Thus, the return
180
+ value of the block (here, ((|[ in_sub.mean(0) ]|))) consists of
181
+ ((|in[false,0..0].mean(0)|)), ((|in[false,1..1].mean(0)|)),.. .
182
+ This iterator creates a GPhys object in ((|out|)) that
183
+ represents the whole part of the results (here, ((|in.mean(0)|))), and
184
+ write the resultant subsets in it one by one. Therefore, the output file
185
+ is filled correctly when exiting the iterator.
186
+
187
+ Note that the subset (((|in_sub|))) retains the last dimension
188
+ but the length is 1 becasue of the slicing by Range (0..0, 1..1,..).
189
+ Therefore, the subset has the same rank as the original.
190
+ The output GPhys objects, as given by the return value of the block,
191
+ must have the dimension retained, since the dimension (whose length
192
+ is one) is replaced by the original one when written in the file.
193
+ Therefore, THE FOLLOWING CAUSE AN ERROR (an exception is raised):
194
+
195
+ out = GPhys::NetCDF_IO.each_along_dims_write(in, ofile, 0){|in_sub|
196
+ [ in_sub.mean(0) ]
197
+ }
198
+
199
+ Here, looping is made by the first dimension (0), but it is eliminated
200
+ from the result by averaging with the same dimension. (Also, note
201
+ that this averaging is non-sense, since the length of the first
202
+ dimension of the subset is 1).
203
+
204
+ * EXAMPLE 2
205
+
206
+ You can specify mutiple dimensions for looping to further
207
+ decrease the size of data to read on memory:
208
+
209
+ GPhys::NetCDF_IO.each_along_dims_write(in, ofile, -2, -1){|in_sub|
210
+ ...
211
+ }
212
+
213
+ Also, you can specify the loop dimension(s) by name(s):
214
+
215
+ GPhys::NetCDF_IO.each_along_dims_write(in, ofile, "y"){|in_sub|
216
+ ...
217
+ }
218
+
219
+ GPhys::NetCDF_IO.each_along_dims_write(in, ofile, "y", "z"){|in_sub|
220
+ ...
221
+ }
222
+
223
+ * EXAMPLE 3
224
+
225
+ You can give multiple objects in the iterotor if they
226
+ have the same shape (in future, this restriction may been loosened),
227
+ as follows:
228
+
229
+ in1 = GPhys::NetCDF_IO.open(infile1, varname1)
230
+ in2 = GPhys::NetCDF_IO.open(infile2, varname2)
231
+ in3 = GPhys::NetCDF_IO.open(infile3, varname3)
232
+ ofile = NetCDF.create(ofilename)
233
+ outA, outB = \
234
+ GPhys::NetCDF_IO.each_along_dims_write([in1,in2,in3], ofile, -1){
235
+ |isub1,isub2,isub3|
236
+ osubA = (isub1*isub2).mean(0)
237
+ osubB = (isub2*isub3).mean(1)
238
+ [ osubA, osubB ]
239
+ }
240
+ ofile.close
241
+
242
+ In this case, two output objects (outA and outB) are made
243
+ from the three input objects (in1,in2,in3) and written in a
244
+ single file (ofile). If you want to separate into two files,
245
+ you can do it like this:
246
+
247
+ in1 = GPhys::NetCDF_IO.open(infile1, varname1)
248
+ in2 = GPhys::NetCDF_IO.open(infile2, varname2)
249
+ in3 = GPhys::NetCDF_IO.open(infile3, varname3)
250
+ ofile1 = NetCDF.create(ofilename1)
251
+ ofile2 = NetCDF.create(ofilename2)
252
+ outA, outB = \
253
+ GPhys::NetCDF_IO.each_along_dims_write([in1,in2,in3], [ofile1,ofile2], -1){
254
+ |isub1,isub2,isub3|
255
+ osubA = (isub1*isub2).mean(0)
256
+ osubB = (isub2*isub3).mean(1)
257
+ [ osubA, osubB ]
258
+ }
259
+ ofile.close
260
+
261
+ ---set_convention(convention)
262
+ Set a NetCDF convention to be interpreted.
263
+
264
+ ARGUMENTS
265
+ * convention (Module): the convention
266
+
267
+ RETURN VALUE
268
+ * convention (Module)
269
+
270
+ ---convention
271
+ Returns the current NetCDF convention to be interpreted.
272
+
273
+ RETURN VALUE
274
+ * convention (Module)
275
+
276
+ ---var_names(file)
277
+ ARGUMENTS
278
+ * file (NetCDF or String): if string,
279
+ it must be the name (path) of a NetCDF file.
280
+
281
+ RETURN VALUE
282
+ * names of variables (Array): this return the names of variables
283
+ which the file has.
284
+
285
+ ---var_names_except_coordinate(file)
286
+ ARGUMENTS
287
+ * file (NetCDF or String): if string,
288
+ it must be the name (path) of a NetCDF file.
289
+
290
+ RETURN VALUE
291
+ * names of variables (Array): this return the names of variables
292
+ which the file has, except variables for coordinate.
293
+
294
+ =end
295
+
296
+ module NumRu
297
+
298
+ class GPhys
299
+
300
+ module NetCDF_IO
301
+
302
+ module_function
303
+
304
+ def is_a_NetCDF?(filename)
305
+ file = nil
306
+ begin
307
+ file = File.open(filename,"rb")
308
+ str = file.read(3)
309
+ ensure
310
+ file.close if file
311
+ end
312
+ return str=="CDF"
313
+ end
314
+
315
+ def open(files, varname)
316
+ files, ncvar0 = __interpret_files( files, varname )
317
+ data = __files2varray( files, varname )
318
+ convention = NetCDF_Conventions.find( ncvar0.file )
319
+ axposnames = convention::coord_var_names( ncvar0 )
320
+ rank = data.rank
321
+ bare_index = [ false ] * rank # will be true if coord var is not found
322
+
323
+ axes = Array.new
324
+ var_names = ncvar0.file.var_names
325
+ for i in 0...rank
326
+ if var_names.include?(axposnames[i])
327
+ axpos = __files2varray( files, axposnames[i], i )
328
+ else
329
+ bare_index[i]=true
330
+ na = NArray.float(ncvar0.shape_current[i]).indgen!
331
+ axpos = VArray.new( na )
332
+ axpos.name = axposnames[i] # added by S. OTSUKA
333
+ end
334
+ cell_center, cell_bounds_name = convention::cell_center?( axpos )
335
+ cell_bounds, cell_center_name = convention::cell_bounds?( axpos )
336
+ cell = cell_center || cell_bounds
337
+ axis = Axis.new(cell,bare_index[i])
338
+ if !cell
339
+ axis.set_pos( axpos )
340
+ else
341
+ if cell_center
342
+ if cell_bounds_name
343
+ varray_cell_bounds = __files2varray(files, cell_bounds_name, i)
344
+ axis.set_cell(axpos, varray_cell_bounds).set_pos_to_center
345
+ else
346
+ p "cell bounds are guessed"
347
+ axis.set_cell_guess_bounds(axpos).set_pos_to_center
348
+ end
349
+ else # then it is cell_bounds
350
+ if cell_center_name
351
+ varray_cell_center = __files2varray(files, cell_center_name, i)
352
+ axis.set_cell(varray_cell_center, axpos).set_pos_to_bounds
353
+ else
354
+ p "cell center is guessed"
355
+ axis.set_cell_guess_center(axpos).set_pos_to_bounds
356
+ end
357
+ end
358
+ end
359
+
360
+ aux = convention::aux_var_names( axpos )
361
+ if aux
362
+ aux.each{|k,varname|
363
+ axis.set_aux( k, __files2varray(files,varname,i) )
364
+ }
365
+ end
366
+
367
+ axes[i] = axis
368
+ end
369
+
370
+ grid = Grid.new( *axes )
371
+
372
+ if (nms = convention::assoc_coord_names(data)) && !(nms.include?(varname))
373
+ if files.is_a?(NArray)
374
+ assoc_crds = nms.collect{|nm|
375
+ index_files_assoc = [0]*(files.rank)
376
+ tmp_assoc = GPhys::NetCDF_IO.open(files[0],nm)
377
+ tmp_assoc.rank.times{|i_assoc|
378
+ axes.length.times{|i_axes|
379
+ if tmp_assoc.axis(i_assoc).name == axes[i_axes].name
380
+ index_files_assoc[i_axes] = true
381
+ end
382
+ }
383
+ }
384
+ GPhys::NetCDF_IO.open(files[*(index_files_assoc)],nm)
385
+ }
386
+ else
387
+ assoc_crds = nms.collect{|nm| GPhys::NetCDF_IO.open(files,nm)}
388
+ end
389
+ grid.set_assoc_coords(assoc_crds)
390
+ end
391
+
392
+ GPhys.new(grid,data)
393
+ end
394
+
395
+ def write_grid(file, grid_or_gphys)
396
+ newaxes = Array.new
397
+ (0...(grid_or_gphys.rank)).each{|i|
398
+ ax = grid_or_gphys.axis(i)
399
+ dimname = ax.pos.name
400
+ length = ax.pos.length
401
+ isfx = 0
402
+ altdimnames = Hash.new
403
+ newax = ax.collect{ |va|
404
+ if va.length == length
405
+ dimnames = [dimname]
406
+ else
407
+ if (nm=altdimnames[va.length])
408
+ dimnames = [nm]
409
+ else
410
+ dimnames = [ (altdimnames[va.length] = dimname+isfx.to_s) ]
411
+ isfx += 1
412
+ end
413
+ end
414
+ if !(already=file.var(va.name))
415
+ newva = VArrayNetCDF.write(file, va, nil, dimnames )
416
+ else
417
+ #< var with the same name exists --> check it >
418
+ if va.shape_current != already.shape_current
419
+ raise "#{va.name} exisits but the shape is different"
420
+ #elsif va[0].val != already[0].val #(not allowed in the def mode)
421
+ # raise "#{va.name} exisits but the first element doesn't agree"
422
+ else
423
+ newva = VArrayNetCDF.new(already)
424
+ end
425
+ end
426
+ newva
427
+ }
428
+ newaxes.push( newax )
429
+ }
430
+ if acnms = grid_or_gphys.assoccoordnames
431
+ acnms.each{|nm|
432
+ acgp = grid_or_gphys.assoc_coord_gphys(nm)
433
+ VArrayNetCDF.write(file, acgp.data, nil, acgp.axnames)
434
+ }
435
+ end
436
+ Grid.new( *newaxes )
437
+ end
438
+
439
+ def def_var(file, name, ntype, dimensions, vary=nil)
440
+ VArrayNetCDF.def_var(file, name, ntype, dimensions, vary)
441
+ end
442
+
443
+ def write(file, gphys, name=nil)
444
+ write_grid(file, gphys)
445
+ NetCDF_Conventions.add_history(file, "#{File.basename($0)} wrote "+gphys.name)
446
+ data = gphys.data
447
+ if gphys.has_assoccoord?
448
+ if data.class != VArray
449
+ data = data.copy
450
+ end
451
+ data.put_att("coordinates",gphys.assoccoordnames.join(' '))
452
+ end
453
+ VArrayNetCDF.write(file, data, name, gphys.axnames)
454
+ nil
455
+ end
456
+
457
+ def each_along_dims_write(gphyses, files, *loopdims, &block)
458
+ files = [files] if !files.is_a?(Array)
459
+ files.each do |fl|
460
+ NetCDF_Conventions.add_history(fl, "#{File.basename($0)}")
461
+ end
462
+ IO_Common::each_along_dims_write(gphyses, files, loopdims, NetCDF_IO,
463
+ &block)
464
+ end
465
+
466
+ def var_names(files)
467
+ case files
468
+ when NetCDF
469
+ file = files
470
+ opened = true
471
+ when String
472
+ file = NetCDF.open(files)
473
+ opened = false
474
+ when NArray, Array, Regexp
475
+ files = NArray[ *files ] if files.is_a?(Array)
476
+ files = GPhys::NetCDF_IO.__to_na_of_netcdf( files )
477
+ files = GPhys::NetCDF_IO.__files_dim_matching( files, varname )
478
+ file = files[0]
479
+ files.length.times{|i|
480
+ files[i].close unless i==0
481
+ }
482
+ opened = false
483
+ else
484
+ raise TypeError, "argument files: not a NetCDF, String, NArray, Array, or Regexp"
485
+ end
486
+ var_names = file.var_names
487
+ file.close unless opened
488
+ return var_names
489
+ end
490
+ def var_names_except_coordinates(files)
491
+ case files
492
+ when NetCDF
493
+ file = files
494
+ opened = true
495
+ when String
496
+ file = NetCDF.open(files)
497
+ opened = false
498
+ when NArray, Array, Regexp
499
+ files = NArray[ *files ] if files.is_a?(Array)
500
+ files = GPhys::NetCDF_IO.__to_na_of_netcdf( files )
501
+ files = GPhys::NetCDF_IO.__files_dim_matching( files, varname )
502
+ file = files[0]
503
+ files.length.times{|i|
504
+ files[i].close unless i==0
505
+ }
506
+ opened = false
507
+ else
508
+ raise TypeError, "argument files: not a NetCDF, String, NArray, Array, or Regexp"
509
+ end
510
+ var_names = Array.new
511
+ file.var_names.each{|name|
512
+ f,var = __interpret_files( files, name )
513
+ if var.rank>1 || var.name!=var.dim_names[0]
514
+ var_names.push(name)
515
+ end
516
+ }
517
+ file.close unless opened
518
+ return var_names
519
+ end
520
+
521
+ ############################################################
522
+
523
+ def __files2varray( files, varname, dim=nil )
524
+ if files.is_a?(NetCDF)
525
+ # Single file. Returns a VArrayNetCDF. dim is ignored.
526
+ file = files
527
+ var = file.var( varname )
528
+ raise "variable '#{varname}' not found in #{file}" if !var
529
+ VArrayNetCDF.new( var )
530
+ elsif files.is_a?(NArray)
531
+ # Suppose that files is a NArray of NetCDF. Returns a VArrayCompsite.
532
+ if dim.is_a?(Integer) && dim>=0 && dim<files.rank
533
+ files = files[ *([0]*dim+[true]+[0]*(files.rank-dim-1)) ]
534
+ end
535
+ varys = NArray.object( *files.shape )
536
+ for i in 0...files.length
537
+ var = files[i].var( varname )
538
+ raise "variable '#{varname}' not found in #{files[i].path}" if !var
539
+ varys[i] = VArrayNetCDF.new( var )
540
+ end
541
+ if files.length != 1
542
+ VArrayComposite.new( varys )
543
+ else
544
+ varys[0]
545
+ end
546
+ else
547
+ raise TypeError, "not a NetCDF or NArray"
548
+ end
549
+ end
550
+
551
+ def __interpret_files( files, varname )
552
+ case files
553
+ when NetCDF
554
+ ncvar0 = files.var( varname )
555
+ when String
556
+ files = NetCDF.open(files)
557
+ ncvar0 = files.var( varname )
558
+ when NArray, Array, Regexp
559
+ files = NArray[ *files ] if files.is_a?(Array)
560
+ files = GPhys::NetCDF_IO.__to_na_of_netcdf( files )
561
+ files = GPhys::NetCDF_IO.__files_dim_matching( files, varname )
562
+ ncvar0 = files[0].var( varname )
563
+ else
564
+ raise TypeError, "argument files: not a NetCDF, String, NArray, Array, or Regexp"
565
+ end
566
+ [files, ncvar0]
567
+ end
568
+
569
+ def __files_dim_matching( files, varname )
570
+ # files: NArray of NetCDF
571
+
572
+ # < read the first file and check its rank >
573
+
574
+ file0 = files[0]
575
+ ncvar0 = file0.var(varname)
576
+ if files.rank > ncvar0.rank
577
+ raise ArgumentError, "rank of files > rank of data"
578
+ end
579
+ convention = NetCDF_Conventions.find( ncvar0.file )
580
+ axposnames = convention::coord_var_names(ncvar0)
581
+
582
+ #< find correspoding dimensions >
583
+
584
+ j2i = Array.new
585
+
586
+ for ifl in 0...files.rank
587
+ for jdt in 0...ncvar0.rank
588
+ axpos_last = nil
589
+ for kfl in 0...files.shape[ifl]
590
+ nvax = files[*([0]*ifl+[kfl]+[0]*(files.rank-ifl-1))].var(axposnames[jdt])
591
+ raise "No coordinate variable: #{axposname}' not found" if !nvax
592
+ axpos = VArrayNetCDF.new( nvax )
593
+ if kfl > 0
594
+ if axpos.length != axpos_last.length
595
+ # not equal ==> this is the dimension looking for
596
+ j2i[jdt] = ifl
597
+ break
598
+ else
599
+ axv0 = axpos.val[0]
600
+ axv_last0 = axpos_last.val[0]
601
+ if axv0 != axv_last0
602
+ # not equal ==> this is the dimension looking for
603
+ j2i[jdt] = ifl
604
+ break
605
+ end
606
+ end
607
+ end
608
+ axpos_last = axpos
609
+ end
610
+ break if j2i.include?(ifl)
611
+ end
612
+ if files.shape[ifl]>1 && !j2i.include?(ifl)
613
+ raise "No dimension correpodence found for #{ifl}th dim"
614
+ end
615
+ end
616
+
617
+ for d in files.rank...ncvar0.rank
618
+ j2i[ (j2i.index(nil) || files.rank) ] = d
619
+ files.newdim!(d)
620
+ end
621
+ files = files.transpose(*j2i)
622
+
623
+ files
624
+ end
625
+
626
+ def __to_na_of_netcdf( files )
627
+ case files
628
+ when NArray
629
+ case files[0]
630
+ when NetCDF
631
+ files.each{|f|
632
+ raise TypeError, "non-NetCDF obj included" if !f.is_a?(NetCDF)
633
+ }
634
+ when String
635
+ files.each{|f|
636
+ raise TypeError, "non-String obj included" if !f.is_a?(String)
637
+ }
638
+ for i in 0...files.length
639
+ files[i] = NetCDF.open(files[i])
640
+ end
641
+ end
642
+ when Regexp
643
+ pat = files
644
+ if /^(.*)\\?\/(.*)$/ =~ (pat.source)
645
+ d=$1
646
+ f=$2
647
+ dir = d.gsub(/\\/,'') + '/'
648
+ pat = Regexp.new(f)
649
+ else
650
+ dir = './'
651
+ end
652
+ match_data = Array.new
653
+ fnames = Array.new
654
+ first_time = true
655
+ Dir.open(dir).each{|fn|
656
+ if pat =~ fn
657
+ fnames.push(fn)
658
+ ary = Regexp.last_match.to_a
659
+ ary.shift # ==> ary == [$1,$2,...]
660
+ ary.each_with_index{|v,i|
661
+ match_data[i] = Array.new if !match_data[i]
662
+ match_data[i].push(v) if !match_data[i].include?(v)
663
+ }
664
+ if first_time
665
+ body = fn
666
+
667
+ first_time = false
668
+ end
669
+ end
670
+ }
671
+ if match_data.length == 0
672
+ raise ArgumentError, "found no files that matches #{files.source}"
673
+ end
674
+ match_data.each{|ary| ary.sort!}
675
+ shape = match_data.collect{|ary| ary.length}
676
+ files = NArray.object(*shape)
677
+ fnames.each{|fn|
678
+ pat =~ fn
679
+ ary = Regexp.last_match.to_a
680
+ ary.shift # ==> ary == [$1,$2,...]
681
+ index = Array.new
682
+ ary.each_with_index{|v,i|
683
+ index[i] = match_data[i].index(v)
684
+ }
685
+ files[*index] = NetCDF.open(dir+fn)
686
+ }
687
+ else
688
+ raise TypeError, "unsupported type #{pat.class}"
689
+ end
690
+ files
691
+ end
692
+
693
+ end
694
+ end
695
+ end
696
+
697
+ ######################################################
698
+ if $0 == __FILE__
699
+ include NumRu
700
+
701
+ file = NetCDF.open("../../../testdata/T.jan.nc")
702
+
703
+ temp = GPhys::NetCDF_IO.open(file,"T")
704
+ p temp.name, temp.shape_current
705
+ p temp.val.class
706
+ temp2 = temp[true,true,2]
707
+ p temp2.name, temp2.shape_current
708
+
709
+ temp_xmean = temp.average(0)
710
+ p temp.val
711
+
712
+ temp_edy = ( temp - temp_xmean )
713
+ p '###',temp_edy.name,temp_edy.val[0,true,true]
714
+ p 'deleted attributes:', temp.data.att_names - temp_edy.data.att_names
715
+ p '@@@',temp
716
+ p '///',temp.copy
717
+ p '+++',temp2
718
+
719
+ puts "\n** test write (tmp.nc) **"
720
+ file2 = NetCDF.create('tmp.nc')
721
+ p v = temp_edy.axis(0).pos[0..-2].copy.rename('lonlon')
722
+ temp_edy.axis(0).set_aux('test',v)
723
+ temp_edy.axis(0).set_aux('test2',(v/2).rename('lonlon2'))
724
+ temp_edy.axis(0).set_aux('test2',(v/2).rename('lonlon3')[0..-2])
725
+ GPhys::NetCDF_IO.write(file2,temp_edy)
726
+ file2.close
727
+ file3 = NetCDF.create('tmp2.nc')
728
+ GPhys::NetCDF_IO.write(file2,temp_xmean)
729
+ file3.close
730
+
731
+ p '** test composite **'
732
+
733
+ temp = GPhys::NetCDF_IO.open(file,"T")
734
+ GPhys::NetCDF_IO.write( f=NetCDF.create('tmp00.nc'), temp[0..5,0..9,true] )
735
+ f.close
736
+ GPhys::NetCDF_IO.write( f=NetCDF.create('tmp01.nc'), temp[0..5,10..15,true])
737
+ f.close
738
+ GPhys::NetCDF_IO.write( f=NetCDF.create('tmp10.nc'), temp[6..9,0..9,true])
739
+ f.close
740
+ GPhys::NetCDF_IO.write( f=NetCDF.create('tmp11.nc'), temp[6..9,10..15,true])
741
+ f.close
742
+ files = /tmp(\d)(\d).nc/
743
+ p gpcompo = GPhys::NetCDF_IO.open( files, 'T' )
744
+ p gpcompo.coord(0).val
745
+ p gpcompo[false,0].val
746
+
747
+
748
+ p '** test each_along_dims* **'
749
+
750
+ f=NetCDF.create('tmpE1.nc')
751
+ GPhys::NetCDF_IO.each_along_dims_write( temp, f, 1, 2 ){|sub|
752
+ [sub.mean(0)]
753
+ }
754
+ f.close
755
+ f=NetCDF.create('tmpE0.nc')
756
+ GPhys::NetCDF_IO.write( f, temp.mean(0) )
757
+ f.close
758
+
759
+ print `ncdump tmpE0.nc > tmpE0; ncdump tmpE1.nc > tmpE1 ; diff -u tmpE[01]`
760
+
761
+ f=NetCDF.create('tmpE2.nc')
762
+ GPhys::NetCDF_IO.each_along_dims_write([temp,temp_edy], f, "level"){|s1,s2|
763
+ [s1.mean(0),s2.mean(1).rename('T_edy')]
764
+ }
765
+ f.close
766
+
767
+ f=NetCDF.create('tmpE3.nc')
768
+ GPhys::NetCDF_IO.each_along_dims_write([temp,temp_xmean], f, "level"){|s1,s2|
769
+ [s1.mean(1),s2.rename('T_x_mean'),s2.mean(0).rename('T_xy_mean')]
770
+ }
771
+ f.close
772
+
773
+ print "\n\n** PACKED DATA TREATMENT **\n\n"
774
+
775
+ file = NetCDF.open("../../../testdata/T.jan.packed.withmiss.nc")
776
+ temp = GPhys::NetCDF_IO.open(file,"T")
777
+ temp.att_names.each{|nm| p nm,temp.get_att(nm) if /(scale|offs)/ =~ nm}
778
+ p( mls=temp.copy.att_names )
779
+ p( (temp*10).att_names - mls )
780
+ p( temp[0,false].copy.att_names - mls )
781
+
782
+ print "\n\n** copying with write_grid **\n\n"
783
+ f=NetCDF.create('tmpE4.nc')
784
+ grid = GPhys::NetCDF_IO.write_grid(f,temp)
785
+ p grid,grid.axis(0).pos.val
786
+ f.close
787
+
788
+ print "\n\n** axis conventions **\n\n"
789
+ x = temp.axis(0).copy.to_gphys
790
+ x.coord(0).set_att('topology','circular')
791
+ x.coord(0).set_att('modulo',[360.0])
792
+ p x
793
+ f=NetCDF.create('tmpE5.nc')
794
+ GPhys::NetCDF_IO.write_grid(f,x)
795
+ f.close
796
+ f=NetCDF.open('tmpE5.nc')
797
+ x=GPhys::NetCDF_IO.open(f,'lon')
798
+ p x.coord(0).axis_cyclic?
799
+ p x.coord(0).axis_modulo
800
+ end