gphys 1.1.1a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,1207 @@
1
+ =begin
2
+ =class NumRu::GPhys
3
+
4
+ ==Class Methods
5
+
6
+ ---GPhys.new(grid, data)
7
+ Constructor.
8
+
9
+ ARGUMENTS
10
+ * grid (a Grid) : the grid
11
+ * data (a VArray) : the data. (('grid')) and (('data')) must have
12
+ the same shape.
13
+
14
+ RETURN VALUE
15
+ * a GPhys
16
+
17
+ NOTE
18
+ * the arguments are NOT duplicated to construct a GPhys.
19
+
20
+ ---GPhys.each_along_dims(gphyses, *loopdims){...} # a block is expected
21
+
22
+ Iterator to process GPhys objects too big to read on memory at once.
23
+
24
+ Makes a loop (loops) by dividing the GPhys object(s) (((|gphyses|)))
25
+ with the dimension(s) specified by ((|loopdims|)).
26
+ If the return value of the block is an Array, it is assumed to consist
27
+ of GPhys objects, and the return value of this method is an Array
28
+ in which the whole of the results are reconstructed as if no
29
+ iteration is made, which is the same behavior as
30
+ ((|GPhys::IO.each_along_dims_write|)). If the return value of
31
+ the block is not an Array, this methods returns nil.
32
+
33
+ WARNING: Unlike ((|GPhys::IO.each_along_dims_write|)),
34
+ the results of this method is NOT written in file(s),
35
+ so be careful about memory usage if you put an Array of GPhys as the
36
+ return value of the block. You will probably need to have the size
37
+ of them smaller than input data.
38
+
39
+ ARGUMENTS
40
+ * gphyses (GPhys or Array of GPhys): GPhys object(s) to be processed.
41
+ All of them must have dimensions specified with ((|loopdims|)),
42
+ and their lengths must not vary among files. Other dimensions
43
+ are arbitrary, so, for example, ((|gphyses|)) could be
44
+ [a(lon,lat,time), b(lat,time)] as long as loopdims==["time"].
45
+ * loopdims (Array of String or Integer) : name (when String) or
46
+ count starting from zero (when Integer)
47
+ * expected block : Number of arguments == number of GPhys objects in
48
+ ((|gphyses|)).
49
+
50
+ RETURN VALUE
51
+ * If the return value of the block is an Array,
52
+ GPhys objects in which the whole results are written in
53
+ (the Array must consist of GPhys objects).
54
+ If the return value of the block is NOT an Array,
55
+ nil is returned.
56
+
57
+ ERRORS
58
+
59
+ The following raise exceptions (in addition to errors in arguments).
60
+
61
+ * Dimensions specified by ((|loopdims|)) are not shared among
62
+ GPhys objects in ((|gphyses|)).
63
+ * Return value of the block is an Array, but it does not consist of
64
+ GPhys objects.
65
+ * (Only when the return value of the block is an Array):
66
+ Dimension(s) used for looping (((|loopdims|))) is(are) eliminated
67
+ from the returned GPhys objects.
68
+
69
+ USAGE
70
+
71
+ See the manual of ((|GPhys::IO.each_along_dims_write|)).
72
+
73
+ ==Instance Methods
74
+ ---data
75
+ Returns the data object
76
+
77
+ RETURN VALUE
78
+ * a VArray
79
+
80
+ NOTE
81
+ * the data object is NOT duplicated.
82
+
83
+ ---grid_copy
84
+ Returns a copy (deep clone) of the grid object.
85
+
86
+ RETURN VALUE
87
+ * a Grid
88
+
89
+ NOTE
90
+ * There is a PROTECTED method (('grid')), which returns
91
+ the grid object without duplicating.
92
+
93
+ ---copy
94
+ Make a deep clone onto memory
95
+
96
+ RETURN VALUE
97
+ * a GPhys
98
+
99
+ ---name
100
+ Returns the name of the GPhys object, which is equal to the
101
+ name of the data object in the GPhys object.
102
+
103
+ RETURN VALUE
104
+ * a String
105
+
106
+ ---name=(nm)
107
+
108
+ Set the name of the GPhys object.
109
+
110
+ ARGUMENTS
111
+ * nm (String)
112
+
113
+ RETURN VALUE
114
+ * nm (the argument)
115
+
116
+ ---rename(nm)
117
+
118
+ Same as ((<name=>)), but (('self')) is returned.
119
+
120
+ ARGUMENTS
121
+ * nm (String)
122
+
123
+ RETURN VALUE
124
+ * self
125
+
126
+ ---val
127
+ Returns data values
128
+
129
+ RETURN VALUE
130
+ * a NArray or NArrayMiss. It is always a copy and to write in it
131
+ will not affect self.
132
+
133
+ ---val=(v)
134
+ Writes in data values.
135
+
136
+ ARGUMENTS
137
+ * v (NArray, NArrayMiss, or Numeric) : data to be written in.
138
+
139
+ RETURN VALUE
140
+ * v (the argument)
141
+
142
+ NOTE
143
+ * the contents of (('v')) are copied in, unlike ((<replace_val>))
144
+
145
+ ---replace_val(v)
146
+ Replace the data values.
147
+
148
+ ARGUMENTS
149
+ * v (NArray or NArrayMiss) : data to be written in.
150
+
151
+ RETURN VALUE
152
+ * self
153
+
154
+ NOTE
155
+ * This method is similar to ((<val=>)), but
156
+ the whole numeric data object is replaced with (('v')).
157
+ It is not very meaningful if the data is in a file:
158
+ the file is not modified, but you just get an GPhys object on memory.
159
+
160
+ ---att_names
161
+ Returns attribute names of the data object.
162
+
163
+ RETURN VALUE
164
+ * Array of String
165
+
166
+ ---get_att(name)
167
+ Get the value of the attribute named (('name')).
168
+
169
+ ARGUMENTS
170
+ * name (String)
171
+
172
+ RETURN VALUE
173
+ * String, NArray, or nil
174
+
175
+ ---set_att(name, val)
176
+ ---put_att(name, val)
177
+
178
+ Set an attribute of the data object
179
+
180
+ ARGUMENTS
181
+ * name (String)
182
+ * val (String, NArray, or nil)
183
+
184
+ RETURN VALUE
185
+ * self
186
+
187
+ ---del_att(name)
188
+ Delete an attribute of the data object.
189
+
190
+ ARGUMENTS
191
+ * name (String)
192
+
193
+ RETURN VALUE
194
+ * self
195
+
196
+ ---ntype
197
+ Returns the numeric type of the data object.
198
+
199
+ RETURN VALUE
200
+ * String such as "float", and "sfloat"
201
+
202
+ NOTE
203
+ * See also ((<typecode>)).
204
+
205
+ ---typecode
206
+ Returns the numeric type of the data object.
207
+
208
+ RETURN VALUE
209
+ * NArray constants such as NArray::FLOAT and NArray::SFLOAT.
210
+
211
+ NOTE
212
+ * See also ((<ntype>)).
213
+
214
+ ---units
215
+ Returns the units of the data object
216
+
217
+ RETURN VALUE
218
+ * a Units
219
+
220
+ ---units=(units)
221
+ Changes the units of the data object
222
+
223
+ ARGUMENTS
224
+ * units (Units or String)
225
+
226
+ RETURN VALUE
227
+ * units (the argument)
228
+
229
+ ---convert_units(to)
230
+ Convert the units of the data object
231
+
232
+ ARGUMENTS
233
+ * to (a Units)
234
+
235
+ RETURN VALUE
236
+ * a GPhys
237
+
238
+ ---long_name
239
+ Returns the "long_name" attribute the data object
240
+
241
+ RETURN VALUE
242
+ * a String
243
+ ---long_name=(to)
244
+
245
+ Changes/sets the "long_name" attribute the data object
246
+
247
+ ARGUMENTS
248
+ * to (a String)
249
+
250
+ RETURN VALUE
251
+ * to (the argument)
252
+
253
+ ---[]
254
+ Returns a subset.
255
+
256
+ ARGUMENTS
257
+ * Same as those for NArray#[], NetCDFVar#[], etc.
258
+
259
+ RETURN VALUE
260
+ * a GPhys
261
+
262
+ ---[]=
263
+ Sets values of a subset
264
+
265
+ RETURN VALUE
266
+ * the data object on the rhs
267
+
268
+ ---cut
269
+ Similar to ((<[]>)), but the subset is specified by physical coordinate.
270
+
271
+ ARGUMENTS
272
+ * pattern 1: similar to those for ((<[]>)), where the first
273
+ argument specifies a subset for the first dimension.
274
+ * pattern 2: by a Hash, in which keys are axis names.
275
+
276
+ EXAMPLES
277
+ * Pattern 1
278
+ gphys.cut(135.5,0..20.5,false)
279
+ * Pattern 2
280
+ gphys.cut({'lon'=>135.5,'lat'=>0..20})
281
+
282
+ RETURN VALUE
283
+ * a GPhys
284
+
285
+ ---cut_rank_conserving
286
+ Similar to ((<cut>)), but the rank is conserved by not eliminating
287
+ any dimension (whose length could be one).
288
+
289
+ ---axnames
290
+ Returns the names of the axes
291
+
292
+ RETURN VALUE
293
+ * an Array of String
294
+
295
+ ---rank
296
+ Returns the rank
297
+
298
+ RETURN VALUE
299
+ * an Integer
300
+
301
+ ---axis(dim)
302
+ Returns the Axis object of a dimension.
303
+
304
+ ARGEMENTS
305
+ * dim (Integer or String)
306
+
307
+ RETURN VALUE
308
+ * an Axis
309
+
310
+ ---coord(dim)
311
+ ---coordinate(dim)
312
+
313
+ Returns the coordinate variable
314
+
315
+ ARGUMENTS
316
+ * dim (Integer or String)
317
+
318
+ RETURN VALUE
319
+ * a VArray
320
+
321
+ NOTE
322
+ * (('coord(dim)')) is equivalent to (('axis(dim).pos'))
323
+
324
+ ---lost_axes
325
+ Returns info on axes eliminated during operations.
326
+
327
+ Useful for annotation in plots, for example (See the code of GGraph
328
+ for an application).
329
+
330
+ RETURN VALUE
331
+ * an Array of String
332
+
333
+ ---dim_index( dimname )
334
+ Returns the integer id (count from zero) of the dimension
335
+
336
+ ARGUMENT
337
+ * dimname (String or Integer) : this method is trivial if is is an integer
338
+
339
+ RETURN VALUE
340
+ * an Integer
341
+
342
+ ---integrate(dim)
343
+ Integration along a dimension.
344
+
345
+ RETURN VALUE
346
+ * a GPhys
347
+
348
+ NOTE
349
+ * Algorithm implementation is done in Axis class.
350
+
351
+ ---average(dim)
352
+ Averaging along a dimension.
353
+
354
+ RETURN VALUE
355
+ * a GPhys
356
+
357
+ NOTE
358
+ * Algorithm implementation is done in Axis class.
359
+
360
+
361
+ ---eddy(*dim)
362
+ Deviation from mean
363
+
364
+ ARGUMENT
365
+ * a list of dimensions (including none) [Integer or String] along which
366
+ the mean is taken.
367
+
368
+ RETURN VALUE
369
+ * a GPhys
370
+
371
+ NOTE
372
+ * Simply defined as
373
+
374
+ def eddy(*dim)
375
+ self - self.mean(*dim)
376
+ end
377
+
378
+ ---first1D
379
+ Returns a 1D subset selecting the first elements of 2nd, 3rd, ..
380
+ dimensions, i.e., self[true, 0, 0, ...]. (For graphics)
381
+
382
+ ARGUMENTS
383
+ * (none)
384
+
385
+ RETURN VALUE
386
+ * a GPhys
387
+
388
+ ---first2D
389
+ Returns a 2D subset selecting the first elements of 3rd, 4th, ..
390
+ dimensions, i.e., self[true, true, 0, 0, ...]. (For graphics)
391
+
392
+ ARGUMENTS
393
+ * (none)
394
+
395
+ RETURN VALUE
396
+ * a GPhys
397
+
398
+ ---first3D
399
+ Returns a 3D subset selecting the first elements of 4th, 5th, ..
400
+ dimensions, i.e., self[true, true, true, 0, ...]. (For graphics)
401
+
402
+ ARGUMENTS
403
+ * (none)
404
+
405
+ RETURN VALUE
406
+ * a GPhys
407
+
408
+ ---coerce(other)
409
+ ((|You know what it is.|))
410
+
411
+ ---shape_coerce(other)
412
+ Like ((<coerce>)), but just changes shape without changing numeric type.
413
+
414
+ ---transpose(*dims)
415
+ Transpose.
416
+
417
+ ARGUMENTS
418
+ * dims (integers) : for example, [1,0] to transpose a 2D object.
419
+ For 3D objects, [1,0,2], [2,1,0], etc.etc.
420
+
421
+ RETURN VALUE
422
+ * a GPhys
423
+
424
+ ---shape_current
425
+ Returns the current shape of the GPhys object.
426
+
427
+ RETURN VALUE
428
+ * an Array of Integer
429
+
430
+ ---shape
431
+ Aliased to ((<shape_current>))
432
+
433
+ ---cyclic_ext(dim_or_dimname, modulo)
434
+ Extend a dimension cyclically.
435
+
436
+ The extension is done only when adding one grid point makes a full circle.
437
+ Thus, data at coordinate values [0,90,180,270] with modulo 360 are extended
438
+ (to at [0,90,180,270,360]), but data at [0,90,180] are not extended with
439
+ the same modulo: in this case, self is returned.
440
+
441
+ ARGUMENTS
442
+ * dim_or_dimname (String or Integer)
443
+ * modulo (Numeric)
444
+
445
+ RETURN VALUE
446
+ * a GPhys (possibly self)
447
+
448
+
449
+ === Math functions (instance methods)
450
+
451
+ ====sqrt, exp, log, log10, log2, sin, cos, tan, sinh, cosh, tanh, asin, acos, atan, asinh, acosh, atanh, csc, sec, cot, csch, sech, coth, acsc, asec, acot, acsch, asech, acoth
452
+
453
+ === Binary operators
454
+
455
+ ====-, +, *, /, %, **, .add!, .sub!, .mul!, .div!, mod!, >, >=, <, <=, &, |, ^, .eq, .ne, .gt, .ge, .lt, .le, .and, .or, .xor, .not
456
+
457
+ === Unary operators
458
+
459
+ ====~ - +
460
+
461
+ === Mean etc (instance methods)
462
+
463
+ ====mean, sum, stddev, min, max, median
464
+
465
+ === Other instance methods
466
+
467
+ These methods returns a NArray (not a GPhys).
468
+
469
+ ====all?, any?, none?, where, where2, floor, ceil, round, to_f, to_i, to_a
470
+
471
+
472
+
473
+ =end
474
+
475
+ require "numru/gphys/grid"
476
+ require "numru/misc/md_iterators"
477
+ require "numru/gphys/narray_ext"
478
+
479
+ module NumRu
480
+ class GPhys
481
+
482
+ include NumRu::Misc::MD_Iterators
483
+
484
+ def initialize(grid, data)
485
+ raise ArgumentError,"1st arg not a Grid" if ! grid.is_a?(Grid)
486
+ raise ArgumentError,"2nd arg not a VArray" if ! data.is_a?(VArray)
487
+ if ( grid.shape_current != data.shape_current )
488
+ raise ArgumentError, "Shapes of grid and data do not agree. " +
489
+ "#{grid.shape_current.inspect} vs #{data.shape_current.inspect}"
490
+ end
491
+ @grid = grid
492
+ @data = data
493
+ end
494
+
495
+ attr_reader :grid, :data
496
+ protected :grid
497
+
498
+ def grid_copy
499
+ # deep clone of the grid
500
+ @grid.copy
501
+ end
502
+
503
+ def copy
504
+ # deep clone onto memory
505
+ GPhys.new( @grid.copy, @data.copy )
506
+ end
507
+
508
+ def inspect
509
+ "<GPhys grid=#{@grid.inspect}\n data=#{@data.inspect}>"
510
+ end
511
+
512
+ def name
513
+ data.name
514
+ end
515
+ def name=(nm)
516
+ data.name=nm
517
+ end
518
+ def rename(nm)
519
+ data.name=nm
520
+ self
521
+ end
522
+
523
+ def val
524
+ @data.val
525
+ end
526
+ def val=(v)
527
+ @data.val= v
528
+ end
529
+ def replace_val(v)
530
+ raise(ArgumentError,"Shape miss-match") if @grid.shape != v.shape
531
+ @data.replace_val(v)
532
+ self
533
+ end
534
+
535
+ def att_names
536
+ @data.att_names
537
+ end
538
+ def get_att(name)
539
+ @data.get_att(name)
540
+ end
541
+ def set_att(name, val)
542
+ @data.set_att(name, val)
543
+ self
544
+ end
545
+ def del_att(name)
546
+ @data.del_att(name)
547
+ self
548
+ end
549
+ alias put_att set_att
550
+
551
+ def ntype
552
+ @data.ntype
553
+ end
554
+
555
+ def units
556
+ @data.units
557
+ end
558
+ def units=(units)
559
+ @data.units= units
560
+ end
561
+
562
+ def convert_units(to)
563
+ # ==NOTE:
564
+ # * VArray#convert_units does not copy data if to == @data.units
565
+ # * @grid is shared with self (no duplication)
566
+ # Thus, use GPhys#copy to separate all sub-objects (deep clone).
567
+ data = @data.convert_units(to)
568
+ GPhys.new(@grid, data)
569
+ end
570
+
571
+ def long_name
572
+ @data.long_name
573
+ end
574
+ def long_name=(long_name)
575
+ @data.long_name= long_name
576
+ end
577
+
578
+ def [](*slicer)
579
+ if slicer.length==1 && slicer[0].is_a?(Hash) &&
580
+ slicer[0].keys[0].is_a?(String)
581
+ slicer = __process_hash_slicer(slicer[0])
582
+ else
583
+ slicer = __rubber_expansion( slicer )
584
+ end
585
+ GPhys.new( @grid[*slicer], @data[*slicer] )
586
+ end
587
+
588
+ def []=(*args)
589
+ val = args.pop
590
+ slicer = args
591
+ if slicer.length==1 && slicer[0].is_a?(Hash) &&
592
+ slicer[0].keys[0].is_a?(String)
593
+ slicer = __process_hash_slicer(slicer[0])
594
+ else
595
+ slicer = __rubber_expansion( slicer )
596
+ end
597
+ val = val.data if val.respond_to?(:grid) #.is_a?(GPhys)
598
+ @data[*slicer] = val
599
+ end
600
+
601
+ def __process_hash_slicer(hash)
602
+ raise ArgumentError, "Expect a Hash" if !hash.is_a?(Hash)
603
+ if (hash.keys - axnames).length > 0
604
+ raise ArgumentError,"One or more of the hash keys "+
605
+ "(#{hash.keys.inspect}) are not found in the axis names "+
606
+ "(#{axnames.inspect})."
607
+ end
608
+ axnames.collect{|nm| hash[nm] || true} # slicer for []/[]=
609
+ end
610
+ private :__process_hash_slicer
611
+
612
+ def cut( *args )
613
+ if has_assoccoord? && args.length==1 && ((spec=args[0]).is_a?(Hash)) &&
614
+ ( acnms = (spec.keys & assoccoordnames ) ).length > 0
615
+ acspec = Hash.new
616
+ acnms.each{|nm| acspec[nm] = spec.delete(nm)}
617
+ grid, sl = @grid.cut_assoccoord(acspec)
618
+ gphys = GPhys.new( grid, self.data[*sl] )
619
+ else
620
+ gphys = self
621
+ end
622
+ newgrid, slicer = gphys.grid.cut( *args )
623
+ GPhys.new( newgrid, gphys.data[ *slicer ] )
624
+ end
625
+
626
+ def cut_rank_conserving( *args )
627
+ newgrid, slicer = @grid.cut_rank_conserving( *args )
628
+ GPhys.new( newgrid, @data[ *slicer ] )
629
+ end
630
+
631
+ Axis.defined_operations.each do |method|
632
+ eval <<-EOS, nil, __FILE__, __LINE__+1
633
+ def #{method}(dim_or_dimname, *extra_args)
634
+ vary, grid = @grid.#{method}(@data, dim_or_dimname, *extra_args)
635
+ if grid
636
+ GPhys.new( grid, vary )
637
+ else
638
+ vary # scalar
639
+ end
640
+ end
641
+ EOS
642
+ end
643
+
644
+ def axnames
645
+ @grid.axnames
646
+ end
647
+ def rank
648
+ @grid.rank
649
+ end
650
+ def axis(i)
651
+ @grid.axis(i)
652
+ end
653
+ def coord(i)
654
+ @grid.coord(i)
655
+ end
656
+ def assoc_coord_gphys(name)
657
+ @grid.assoc_coord_gphys(name)
658
+ end
659
+ alias coordinate coord
660
+ def lost_axes
661
+ @grid.lost_axes
662
+ end
663
+ def set_lost_axes( lost )
664
+ @grid.set_lost_axes( lost )
665
+ self
666
+ end
667
+ def add_lost_axes( lost )
668
+ @grid.add_lost_axes( lost )
669
+ self
670
+ end
671
+ def dim_index( dimname )
672
+ @grid.dim_index( dimname )
673
+ end
674
+ def coordnames
675
+ @grid.coordnames
676
+ end
677
+ def has_axis?(name)
678
+ @grid.has_axis?(name)
679
+ end
680
+ def has_assoccoord?(*arg)
681
+ @grid.has_assoccoord?(*arg)
682
+ end
683
+ def has_coord?(name)
684
+ @grid.has_coord?(name)
685
+ end
686
+ def assoccoordnames
687
+ @grid.assoccoordnames
688
+ end
689
+ def set_assoc_coords(assoc_crds)
690
+ @grid.set_assoc_coords(assoc_crds)
691
+ end
692
+ def assoc_coords=(assoc_coords)
693
+ @grid.assoc_coords=assoc_coords
694
+ end
695
+ def assoc_coords
696
+ @grid.assoc_coords
697
+ end
698
+
699
+ ## Basic numerical operations that are not defined on the VArray level
700
+
701
+ def eddy(*dim)
702
+ self - self.mean(*dim)
703
+ end
704
+
705
+ ## For graphics -->
706
+ def first3D
707
+ raise "rank less than 3" if rank < 3
708
+ self[true,true,*([0]*(rank-3))]
709
+ end
710
+ def first2D
711
+ raise "rank less than 2" if rank < 2
712
+ self[true,true,*([0]*(rank-2))]
713
+ end
714
+ def first1D
715
+ raise "rank less than 1" if rank < 1
716
+ self[true,*([0]*(rank-1))]
717
+ end
718
+ ## <-- For graphics
719
+
720
+ def coerce(other)
721
+ case other
722
+ when Numeric
723
+ ##na_other = self.data.val.fill(other) # Not efficient!
724
+ va_other, = self.data.coerce(other)
725
+ c_other = GPhys.new( @grid[ *([0..0]*self.rank) ],
726
+ va_other.reshape!( *([1]*self.rank) ) )
727
+ c_other.put_att('units',nil) # should be treated as such, not 1
728
+ when Array, NArray
729
+ va_other, = self.data.coerce(other)
730
+ c_other = GPhys.new( @grid, va_other )
731
+ c_other.put_att('units',nil) # should be treated as such, not 1
732
+ when VArray
733
+ c_other = GPhys.new( @grid, other )
734
+ else
735
+ raise "Cannot coerse #{other.class}"
736
+ end
737
+ [c_other, self]
738
+ end
739
+
740
+ def shape_coerce(other)
741
+ #
742
+ # for binary operations
743
+ #
744
+ if self.rank == other.rank
745
+ # nothing to do
746
+ [other, self]
747
+ else
748
+ if self.rank < other.rank
749
+ shorter = self
750
+ longer = other
751
+ i_am_the_shorter = true
752
+ else
753
+ shorter = other
754
+ longer = self
755
+ i_am_the_shorter = false
756
+ end
757
+ reshape_args =
758
+ __shape_matching( shorter.shape_current, longer.shape_current,
759
+ shorter.axnames, longer.axnames )
760
+ shorter = shorter.data.copy.reshape!(*reshape_args)
761
+ ##def shorter.data; self; end # singular method!
762
+ if i_am_the_shorter
763
+ [longer, shorter]
764
+ else
765
+ [shorter, longer]
766
+ end
767
+ end
768
+ end
769
+
770
+ def transpose(*dims)
771
+ grid = @grid.transpose(*dims)
772
+ data = @data.transpose(*dims)
773
+ GPhys.new( grid, data )
774
+ end
775
+
776
+ for f in VArray::Math_funcs
777
+ eval <<-EOS, nil, __FILE__, __LINE__+1
778
+ #def GPhys.#{f}(gphys)
779
+ # raise ArgumentError, "Not a GPhys" if !gphys.is_a?(GPhys)
780
+ # GPhys.new( gphys.grid, VArray.#{f}(gphys.data) )
781
+ #end
782
+ def #{f}(*arg)
783
+ GPhys.new( self.grid, self.data.#{f}(*arg) )
784
+ end
785
+ EOS
786
+ end
787
+ for f in VArray::Binary_operators
788
+ eval <<-EOS, nil, __FILE__, __LINE__+1
789
+ def #{f.delete(".")}(other)
790
+ if other.respond_to?(:grid) #.is_a?(GPhys)
791
+ other, myself = self.shape_coerce(other)
792
+ if myself.respond_to?(:grid) #.is_a?(GPhys)
793
+ if other.respond_to?(:grid) #.is_a?(GPhys)
794
+ vary = myself.data#{f} other.data
795
+ newgrid = myself.grid.merge(other.grid)
796
+ else
797
+ vary = myself.data#{f} other
798
+ newgrid = myself.grid_copy
799
+ end
800
+ GPhys.new( newgrid, vary )
801
+ else
802
+ if other.respond_to?(:grid) #.is_a?(GPhys)
803
+ vary = myself#{f} other.data
804
+ else
805
+ vary = myself#{f} other
806
+ end
807
+ GPhys.new( other.grid.copy, vary )
808
+ end
809
+ else
810
+ vary = self.data#{f} other
811
+ GPhys.new( @grid.copy, vary )
812
+ end
813
+ end
814
+ EOS
815
+ end
816
+ for f in VArray::Binary_operatorsL
817
+ eval <<-EOS, nil, __FILE__, __LINE__+1
818
+ def #{f.delete(".")}(other)
819
+ # returns NArray
820
+ self.data#{f}(other.respond_to?(:grid) ? other.data : other)
821
+ end
822
+ EOS
823
+ end
824
+ for f in VArray::Unary_operators
825
+ eval <<-EOS, nil, __FILE__, __LINE__+1
826
+ def #{f}
827
+ vary = #{f.delete("@")} self.data
828
+ GPhys.new( @grid.copy, vary )
829
+ end
830
+ EOS
831
+ end
832
+ for f in VArray::NArray_type1_methods
833
+ eval <<-EOS, nil, __FILE__, __LINE__+1
834
+ def #{f}(*args)
835
+ GPhys.new( self.grid.copy, self.data.#{f}(*args) )
836
+ end
837
+ EOS
838
+ end
839
+ for f in VArray::NArray_type2_methods
840
+ eval <<-EOS, nil, __FILE__, __LINE__+1
841
+ def #{f}(*args)
842
+ self.data.#{f}(*args)
843
+ end
844
+ EOS
845
+ end
846
+ for f in VArray::NArray_type3_methods
847
+ eval <<-EOS, nil, __FILE__, __LINE__+1
848
+ def #{f}(*args)
849
+ args = args.collect{|i| @grid.dim_index(i)}
850
+ result = self.data.#{f}(*args)
851
+ if Numeric===result || UNumeric===result
852
+ result
853
+ else
854
+ GPhys.new( self.grid.delete_axes(args, "#{f}"), result )
855
+ end
856
+ end
857
+ EOS
858
+ end
859
+
860
+ def shape_current
861
+ @data.shape_current
862
+ end
863
+ alias shape shape_current
864
+
865
+ def cyclic_ext(dim_or_dimname, modulo)
866
+ # Cyclic extention to push the first element after the last element
867
+ # if appropriate.
868
+
869
+ # <<developper's memo by horinout, 2005/01>>
870
+ # in future modulo should be read based on conventions if nil
871
+
872
+ vx = coord(dim_or_dimname)
873
+ return self if vx.length <= 1
874
+
875
+ vvx = vx.val
876
+ width = (vvx[-1] - vvx[0]).abs
877
+ dx = width / (vx.length-1)
878
+ eps = 1e-4
879
+ modulo = modulo.abs
880
+ extendible = ( ((width+dx) - modulo).abs < eps*modulo )
881
+
882
+ if extendible
883
+ dim = @grid.dim_index(dim_or_dimname)
884
+ newgp = self.copy[false, [0...vx.length, 0], *([true]*(rank-1-dim))]
885
+ vx = newgp.coord(dim).copy
886
+ vx[-1] = vx[-1].val + modulo
887
+ newgp.axis(dim).set_pos(vx)
888
+ return newgp
889
+ else
890
+ return self
891
+ end
892
+ end
893
+
894
+ def self.each_along_dims(gphyses, loopdims)
895
+ if !gphyses.is_a?(Array)
896
+ gphyses = [gphyses] # put in an Array (if a single GPhys)
897
+ end
898
+ gp = gphyses[0]
899
+
900
+ if !loopdims.is_a?(Array)
901
+ loopdims = [loopdims] # put in an Array (if a single Integer/String)
902
+ end
903
+ if loopdims.length == 0
904
+ #raise ArgumentError, "No loop dimension is specified "+
905
+ # " -- In that case, you don't need this iterator."
906
+
907
+ return yield(*gphyses) # trivial case supported just for generality
908
+ end
909
+
910
+ #if loopdims.min<0 || loopdims.max>=gp.rank
911
+ # raise ArguemntError,"Invalid dims #{loopdims.inspect} for #{gp.rank}D array"
912
+ #end
913
+
914
+ loopdimids = Array.new
915
+ loopdimnames = Array.new
916
+ loopdims.each{|d|
917
+ case d
918
+ when Integer
919
+ if d < 0
920
+ d += gp.rank
921
+ end
922
+ loopdimids.push( d )
923
+ loopdimnames.push( gp.axis(d).name )
924
+ when String
925
+ loopdimids.push( gp.dim_index(d) )
926
+ loopdimnames.push( d )
927
+ else
928
+ raise ArgumentError,"loopdims must consist of Integer and/or String"
929
+ end
930
+ }
931
+
932
+ sh = Array.new
933
+ len = 1
934
+ loopdimids.each{|i|
935
+ sh.push(gp.shape[i])
936
+ len *= gp.shape[i]
937
+ }
938
+
939
+ gphyses.each do |g|
940
+ for i in 1...gphyses.length
941
+ loopdimnames.each_with_index do |nm,i|
942
+ if !g.axnames.include?( nm )
943
+ raise ArgumentError,"#{i+1}-th GPhys do not have dim '#{nm}'"
944
+ end
945
+ if g.coord(nm).length != sh[i]
946
+ raise ArgumentError,"loop dimensions must have the same lengths(#{nm}; #{sh[i]} vs #{g.coord(nm).length})"
947
+ end
948
+ end
949
+ end
950
+ end
951
+
952
+ to_return = nil
953
+
954
+ cs = [1]
955
+ (1...sh.length).each{|i| cs[i] = sh[i-1]*cs[i-1]}
956
+ idx_hash = Hash.new
957
+ for i in 0...len do
958
+ loopdimnames.each_with_index{|d,j|
959
+ idx_hash[d] = ((i/cs[j])%sh[j])..((i/cs[j])%sh[j]) # rank preserved
960
+ }
961
+ subs = gphyses.collect{|g| g[idx_hash] }
962
+ results = yield(*subs)
963
+ if results.is_a?(Array) # then it must consist of GPhys objects
964
+ if i == 0
965
+ to_return = results_whole = Array.new
966
+ for j in 0...results.length
967
+ rs = results[j]
968
+ grid = rs.grid_copy
969
+ loopdimnames.each{|nm|
970
+ # replaces with original axes (full length)
971
+ if !grid.axnames.include?( nm )
972
+ raise "Dimension '#{nm}' has been eliminated. "+
973
+ "You must keep all loop dimensions."
974
+ end
975
+ grid.set_axis(nm,gphyses[0].axis(nm))
976
+ }
977
+ if ( (vtst=rs.data[0..0,false].val).respond_to?(:set_mask) )
978
+ # DEVELOPPER'S NOTE (2006/08/15 horinout).
979
+ # Here, [0..0,false] is to take the minimum subset,
980
+ # and respond_to?(:set_mask) is used to check whether
981
+ # the data array is compatible to NArrayMiss
982
+ vary = VArray.new(NArrayMiss.new(vtst.typecode, *grid.shape),
983
+ rs.data)
984
+ else
985
+ vary = VArray.new(NArray.new(vtst.typecode, *grid.shape), rs.data)
986
+ end
987
+ results_whole.push( GPhys.new( grid, vary ) )
988
+ end
989
+ end
990
+ for j in 0...results.length
991
+ rs = results[j]
992
+ results_whole[j][idx_hash] = rs.data
993
+ end
994
+ else
995
+ to_return = nil
996
+ end
997
+ end
998
+ return to_return
999
+
1000
+ end
1001
+
1002
+ def marshal_dump
1003
+ [@data.copy, @grid.copy]
1004
+ end
1005
+
1006
+ def marshal_load(ary)
1007
+ @data = ary[0]
1008
+ @grid = ary[1]
1009
+ end
1010
+
1011
+ ############## < private methods > ##############
1012
+
1013
+ private
1014
+ def __rubber_expansion( args )
1015
+ if (id = args.index(false)) # substitution into id
1016
+ # false is incuded
1017
+ alen = args.length
1018
+ if args.rindex(false) != id
1019
+ raise ArguemntError,"only one rubber dimension is permitted"
1020
+ elsif alen > rank+1
1021
+ raise ArgumentError, "too many args"
1022
+ end
1023
+ ar = ( id!=0 ? args[0..id-1] : [] )
1024
+ args = ar + [true]*(rank-alen+1) + args[id+1..-1]
1025
+ end
1026
+ args
1027
+ end
1028
+
1029
+ def __shape_matching( shs, shl, axnms, axnml )
1030
+ # shs : shape of the shorter
1031
+ # shl : shape of the longer
1032
+ # axnms : axis names of the shorter
1033
+ # axnml : axis names of the longer
1034
+ #
1035
+ # Return value is reshape_args, which is to be used
1036
+ # as shorter.reshape( *reshape_args )
1037
+
1038
+ # < matching from the first element >
1039
+ shlc = shl.dup
1040
+ table = Array.new
1041
+ last_idx=-1
1042
+ shs.each do |len|
1043
+ i = shlc.index(len)
1044
+ if !i
1045
+ raise "cannot match shapes #{shs.inspect} and #{shl.inspect}"
1046
+ end
1047
+ idx = i+last_idx+1
1048
+ table.push(idx)
1049
+ (i+1).times{ shlc.shift }
1050
+ last_idx = idx
1051
+ end
1052
+
1053
+ # < matching from the last element >
1054
+ shlc = shl.dup
1055
+ rtable = Array.new
1056
+ shs.reverse_each do |len|
1057
+ i = shlc.rindex(len)
1058
+ if !i
1059
+ raise "cannot match shapes #{shs.inspect} and #{shl.inspect}"
1060
+ end
1061
+ idx = i
1062
+ rtable.push(idx)
1063
+ (shlc.length-idx).times{ shlc.pop }
1064
+ end
1065
+ rtable.reverse!
1066
+
1067
+ if table != rtable
1068
+ # < matching ambiguous => try to match by name >
1069
+
1070
+ real_table = table.dup # just to start with.
1071
+ # rtable will be merged in the following
1072
+
1073
+ shs.each_index do |i|
1074
+ #print axnms[i]," ",axnml[ table[i] ]," ",axnml[ rtable[i] ],"\n"
1075
+ if axnms[i] == axnml[ rtable[i] ]
1076
+ real_table[i] = rtable[i]
1077
+ elsif axnms[i] != axnml[ table[i] ]
1078
+ raise "Both matchings by orders and by names failed for the #{i}-th axis #{axnms[i]}."
1079
+ end
1080
+ end
1081
+
1082
+ table = real_table
1083
+
1084
+ end
1085
+
1086
+ # < derive the argument for the reshape method >
1087
+
1088
+ reshape_args = Array.new
1089
+ shl.length.times{ reshape_args.push(1) }
1090
+ for i in 0...table.length
1091
+ reshape_args[ table[i] ] = shs[i]
1092
+ end
1093
+
1094
+ reshape_args
1095
+ end
1096
+
1097
+ end
1098
+ end
1099
+
1100
+
1101
+ ######################################################
1102
+ ## < test >
1103
+ if $0 == __FILE__
1104
+ include NumRu
1105
+ vx = VArray.new( NArray.float(10).indgen! + 0.5 ).rename("x")
1106
+ vy = VArray.new( NArray.float(6).indgen! ).rename("y")
1107
+ xax = Axis.new().set_pos(vx)
1108
+ yax = Axis.new(true).set_cell_guess_bounds(vy).set_pos_to_center
1109
+ grid = Grid.new(xax, yax)
1110
+
1111
+ z = VArray.new( NArray.float(vx.length, vy.length).indgen! )
1112
+ p z.val
1113
+ w = VArray.new( NArray.float(vx.length, vy.length).indgen!/10 ) # .random!
1114
+
1115
+ gpz = GPhys.new(grid,z)
1116
+ gg = gpz[true,[0,2,1]]
1117
+ p '###',gg.val
1118
+ p gg[true,1].val
1119
+ p gg['y'=>1].val
1120
+ gg['y'=>1] = 999
1121
+ p gg.val
1122
+ p gg.coord(0).val, gg.coord(1).val
1123
+ p gg.cut([1.2,3.8],1.1).val
1124
+
1125
+ gpw = GPhys.new(grid,w)
1126
+ p '@@@',gpw.average(1).val
1127
+ p ( (gpz + gpw).val )
1128
+
1129
+ vz = VArray.new( NArray.float(6).indgen! ).rename("z")
1130
+ zax = Axis.new().set_pos(vz)
1131
+
1132
+ grid3 = Grid.new(xax,yax,zax)
1133
+ gridz = Grid.new(zax)
1134
+ z3 = VArray.new( NArray.float(vx.length, vy.length, vz.length).indgen! )
1135
+ q = VArray.new( NArray.float(vz.length).indgen!*100 )
1136
+ gpz3 = GPhys.new(grid3,z3)
1137
+ gpq = GPhys.new(gridz,q)
1138
+ p ( (gpz3 + gpq).val )
1139
+ p ( (gpz + gpq).val )
1140
+ p ( (gpz3 + gpz).val )
1141
+
1142
+ print "#######\n"
1143
+ p gpz.val, gpz[2..5,2..3].val
1144
+ gpz[2..5,2..3]=999
1145
+ p gpz.val
1146
+ p gpz
1147
+ p gpz.sort.val
1148
+
1149
+ print "*****\n"
1150
+ gpz.each_subary_at_dims(1){|sub|
1151
+ p sub.val
1152
+ }
1153
+ print "===\n"
1154
+ gpz_m0=gpz.mean(0)
1155
+ p gpz.val, gpz_m0.val, gpz_m0.lost_axes
1156
+ p gpz.mean, gpz.max
1157
+ p gpz.mean("x").val
1158
+
1159
+ print "transpose\n"
1160
+ p gpz3.axnames, gpz3.val,
1161
+ gpz3.transpose(2,0,1).axnames, gpz3.transpose(2,0,1).val
1162
+
1163
+ print "manual cyclic extention\n"
1164
+ p(sp=gpz3.shape)
1165
+ gpz3_cext = gpz3[ [0...sp[0],0], false ]
1166
+ p gpz3_cext.coord(0).val, gpz3_cext.val
1167
+
1168
+ print "cyclic extention if appropriate\n"
1169
+ gpz3_cext = gpz3.cyclic_ext(0,10.0)
1170
+ p gpz3_cext.coord(0).val, gpz3_cext.val
1171
+
1172
+ print "axis to gphys\n"
1173
+ ax = gpz3.axis(1)
1174
+ p ax.to_gphys
1175
+ p ax.to_gphys( ax.cell_bounds[0..-2].copy )
1176
+
1177
+ print "convert units\n"
1178
+ gpz3.units = 'm'
1179
+ p gpz3.units
1180
+ gpz3k = gpz3.convert_units('km')
1181
+ p gpz3k.units, gpz3.val, gpz3k.val
1182
+
1183
+ print "each_along_dims\n"
1184
+ p gpz3.mean(0,1).val
1185
+ x = GPhys.each_along_dims(gpz3,-1) do |sub|
1186
+ p sub.mean # non-Array return obj of the block --> nil returned
1187
+ end
1188
+ p x # must be nil
1189
+ gpz3mn, = GPhys.each_along_dims(gpz3,-1) do |sub|
1190
+ [ sub.mean(0) ] # return obj of block is Array -> concat sub GPhys objs
1191
+ end
1192
+ p gpz3mn.val, gpz3mn.mean(0).val
1193
+
1194
+ # trivial case (with no loop)
1195
+ gpz3mn, = GPhys.each_along_dims(gpz3, []) do |sub|
1196
+ [ sub.mean(0) ]
1197
+ end
1198
+ p( (gpz3mn - gpz3.mean(0)).abs.max )
1199
+
1200
+ # test marshaling
1201
+ p gpz
1202
+ mar = Marshal.dump(gpz)
1203
+ p mar.class, mar.length
1204
+ g = Marshal.load(mar)
1205
+ p g
1206
+
1207
+ end