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,723 @@
1
+ require "numru/gphys/axis"
2
+ require "numru/gphys/assoccoords"
3
+
4
+ =begin
5
+ =class NumRU::Grid
6
+
7
+ A class to handle discretized grids of physical quantities.
8
+
9
+ ==Class Methods
10
+ ---Grid.new( *axes )
11
+ Constructor.
12
+
13
+ RETURN VALUE
14
+ * a Grid
15
+
16
+ ==Instance Methods
17
+ ---axnames
18
+ Returns the names of the axes
19
+
20
+ RETURN VALUE
21
+ * an Array of String
22
+
23
+ ---lost_axes
24
+ Returns info on axes eliminated during operations.
25
+
26
+ Useful for annotation in plots, for example (See the code of GGraph
27
+ for an application).
28
+
29
+ RETURN VALUE
30
+ * an Array of String
31
+
32
+ ---axis(dim_or_dimname)
33
+ Returns an Axis
34
+
35
+ ARGUMENTS
36
+ * dim_or_dimname (String or Integer) to specify an axis.
37
+
38
+ RETURN VALUE
39
+ * an Axis
40
+
41
+ ---dim_index(dimname)
42
+ Returns the integer id (count from zero) of the dimension
43
+
44
+ ARGUMENT
45
+ * dimname (String or Integer) : this method is trivial if is is an integer
46
+
47
+ RETURN VALUE
48
+ * an Integer
49
+
50
+ ---coord_dim_indices(coordname)
51
+ Coordinate name --> dimension indices.
52
+
53
+ ARGUMENT
54
+ * coordname (String) : Name of a coordinate
55
+
56
+ RETURN VALUE
57
+ * Array of Integer or nil --
58
+ If the coordinate is present it is an Array
59
+ containing dimension indices (If the coordinate is 1D,
60
+ the lengthof the array is 1.)
61
+
62
+ ---set_axis(dim_or_dimname,ax)
63
+
64
+ Sets an axis.
65
+
66
+ ARGUMENTS
67
+ * dim_or_dimname (String or Integer) to specify an axis.
68
+ * ax (Axis) the axis
69
+
70
+ RETURN VALUE
71
+ * self
72
+
73
+ ---set_lost_axes( lost )
74
+
75
+ Sets info on axes eliminated.
76
+
77
+ RETURN VALUE
78
+ * self
79
+
80
+ ---add_lost_axes( lost )
81
+
82
+ Adds info on axes eliminated to existing ones.
83
+
84
+ RETURN VALUE
85
+ * self
86
+
87
+ ---delete_axes( at, deleted_by=nil )
88
+
89
+ Delete an axis.
90
+
91
+ ARGUMENTS
92
+ * at (String or Integer) to specify an axis.
93
+ * deleted_by (String or nil) if non-nil, it is written in
94
+ the internal lost-axis info. Best if you put the name of the
95
+ method, in which this method is called.
96
+
97
+ RETURN VALUE
98
+ * a Grid
99
+
100
+ ---copy
101
+ Makes a deep clone onto memory.
102
+
103
+ RETURN VALUE
104
+ * a Grid
105
+
106
+ ---merge(other)
107
+ merge two grids by basically using copies of self's axes but
108
+ using the other's if the length in self is 1 and
109
+ the length in the other is longer
110
+
111
+ ARGUMENTS
112
+ * other (Grid)
113
+
114
+ RETURN VALUE
115
+ * a Grid
116
+
117
+ ---shape
118
+ Returns the shape of self.
119
+
120
+ RETURN VALUE
121
+ * an Array of Integer
122
+
123
+ ---[] (*slicer)
124
+ Returns a subset.
125
+
126
+ ARGUMENTS
127
+ * Same as those for NArray#[], NetCDFVar#[], etc.
128
+
129
+ RETURN VALUE
130
+ * a Grid
131
+
132
+ ---cut(*args)
133
+ Similar to ((<[]>)), but the subset is specified by physical coordinate.
134
+
135
+ ARGUMENTS
136
+ * pattern 1: similar to those for ((<[]>)), where the first
137
+ argument specifies a subset for the first dimension.
138
+ * pattern 2: by a Hash, in which keys are axis names.
139
+
140
+ EXAMPLES
141
+ * Pattern 1
142
+ gphys.cut(135.5,0..20.5,false)
143
+ * Pattern 2
144
+ gphys.cut({'lon'=>135.5,'lat'=>0..20})
145
+
146
+ RETURN VALUE
147
+ * an Array : [a Grid, slicer], where slicer is an array
148
+ to be used to make a subset of an corresponding varray
149
+ (to be used in GPhys#cut).
150
+
151
+ ---cut_rank_conserving(*args)
152
+ Similar to ((<cut>)), but the rank is conserved by not eliminating
153
+ any dimension (whose length could be one).
154
+
155
+ ---cut_assoccoord(hasharg)
156
+ Cut with respect to the asscoated coordinates. Similar to cut,
157
+ when the argeuemnt is a Hash, but hash keys are the names of the
158
+ asscoated coordinates.
159
+
160
+ #---exclude(dim_or_dimname)
161
+ # Returns a Grid in which an axis is eliminated from self.
162
+ #
163
+ # ARGUMENTS
164
+ # * dim_or_dimname (String or Integer) to specify an axis.
165
+ #
166
+ # RETURN VALUE
167
+ # * a Grid
168
+ #
169
+ ---change_axis(dim, axis)
170
+ Replaces an axis. (Returns a new object)
171
+
172
+ ARGUMENTS
173
+ * dim_or_dimname (String or Integer) to specify an axis.
174
+ * axis (Axis)
175
+
176
+ RETURN VALUE
177
+ * a Grid
178
+ #
179
+ #---change_axis!(dim_or_dimname, axis)
180
+ # Replaces an axis. (overwrites self)
181
+ #
182
+ # ARGUMENTS
183
+ # * dim_or_dimname (String or Integer) to specify an axis.
184
+ # * axis (Axis)
185
+ #
186
+ # RETURN VALUE
187
+ # * self
188
+ #
189
+ #---insert_axis(dim_or_dimname, axis)
190
+ # Inserts an axis. (Returns a new object)
191
+ #
192
+ # ARGUMENTS
193
+ # * dim_or_dimname (String or Integer) to specify an axis.
194
+ # * axis (Axis)
195
+ #
196
+ # RETURN VALUE
197
+ # * a Grid
198
+ #
199
+ #---insert_axis!(dim_or_dimname, axis)
200
+ # Inserts an axis. (overwrites self)
201
+ #
202
+ # ARGUMENTS
203
+ # * dim_or_dimname (String or Integer) to specify an axis.
204
+ # * axis (Axis)
205
+ #
206
+ # RETURN VALUE
207
+ # * self
208
+
209
+ ---transpose( *dims )
210
+ Transpose.
211
+
212
+ ARGUMENTS
213
+ * dims (integers) : for example, [1,0] to transpose a 2D object.
214
+ For 3D objects, [1,0,2], [2,1,0], etc.etc.
215
+
216
+ RETURN VALUE
217
+ * a Grid
218
+
219
+ =end
220
+
221
+ module NumRu
222
+
223
+ class Grid
224
+
225
+ def initialize( *axes )
226
+ @axes = Array.new
227
+ axes.each{|ag|
228
+ if ag.is_a?(Axis)
229
+ @axes.push(ag)
230
+ else
231
+ raise ArgumentError, "each argument must be an Axis"
232
+ end
233
+ }
234
+ @lost_axes = Array.new # Array of String
235
+ @rank = @axes.length
236
+ @axnames = Array.new
237
+ __check_and_set_axnames
238
+ @assoc_coords = nil
239
+ end
240
+
241
+ # * assoc_crds : an Array of GPhys
242
+ #
243
+ def set_assoc_coords(assoc_crds)
244
+ @assoc_coords = AssocCoords.new(assoc_crds, @axnames)
245
+ @assoc_coords.axlens.each do |nm,l|
246
+ if l && l != (l0 = shape[dim_index(nm)])
247
+ raise ArgumentError, "Length mismatch in coord #{nm} (#{l0}) and assoc_crds (#{l}). You may need to regrid (use GPhys#regrid method) associated coordinate(s) in advance."
248
+ end
249
+ end
250
+ self
251
+ end
252
+
253
+ # * assoc_coords : an AssocCoords
254
+ #
255
+ def assoc_coords=(assoc_coords)
256
+ @assoc_coords = assoc_coords
257
+ end
258
+
259
+ def assoc_coords
260
+ @assoc_coords
261
+ end
262
+
263
+ def inspect
264
+ "<#{rank}D grid #{@axes.collect{|ax| ax.inspect}.join("\n\t")}#{@assoc_coords ? "\n"+@assoc_coords.inspect.gsub(/^/,"\t") : ''}>"
265
+ end
266
+
267
+ def __check_and_set_axnames
268
+ @axnames.clear
269
+ @axes.each{|ax|
270
+ nm=ax.name
271
+ if @axnames.include?(nm)
272
+ raise "Two or more axes share a name: #{nm}"
273
+ end
274
+ @axnames.push(nm)
275
+ }
276
+ end
277
+ private :__check_and_set_axnames
278
+
279
+ attr_reader :rank
280
+
281
+ def axnames
282
+ @axnames.dup
283
+ end
284
+ def lost_axes
285
+ @lost_axes.dup
286
+ end
287
+
288
+ def coordnames
289
+ ret = axnames
290
+ ret.concat(@assoc_coords.coordnames) if @assoc_coords
291
+ ret
292
+ end
293
+
294
+ def has_axis?(name)
295
+ @axnames.include?(name)
296
+ end
297
+
298
+ def has_assoccoord?(*arg)
299
+ if arg.length == 0
300
+ !@assoc_coords.nil? # if a grid has assoc coords
301
+ else
302
+ name = arg[0]
303
+ if @assoc_coords
304
+ @assoc_coords.has_coord?(name)
305
+ else
306
+ false
307
+ end
308
+ end
309
+ end
310
+
311
+ def has_coord?(name)
312
+ has_axis?(name) || has_assoccoord?(name)
313
+ end
314
+
315
+ def assoccoordnames
316
+ @assoc_coords && @assoc_coords.coordnames
317
+ end
318
+
319
+ # def axis(i)
320
+ # @axes[i]
321
+ # end
322
+
323
+ def axis(dim_or_dimname)
324
+ ax_dim(dim_or_dimname)[0]
325
+ end
326
+
327
+ alias get_axis axis
328
+
329
+ def coord(i)
330
+ if @assoc_coords && i.is_a?(String) && @assoc_coords.has_coord?(i)
331
+ @assoc_coords.coord(i)
332
+ else
333
+ axis(i).pos
334
+ end
335
+ end
336
+
337
+ def assoc_coord_gphys(name)
338
+ @assoc_coords && @assoc_coords.coord_gphys(name)
339
+ end
340
+
341
+ def dim_index(dimname)
342
+ ax_dim(dimname)[1]
343
+ end
344
+
345
+ def coord_dim_indices(coordname)
346
+ dim = @axnames.index(coordname)
347
+ if dim
348
+ [dim]
349
+ elsif @assoc_coords && @assoc_coords.has_coord?(coordname)
350
+ axnms = @assoc_coords.coord_gphys(coordname).axnames
351
+ axnms.collect{|nm| @axnames.index(nm)}
352
+ else
353
+ nil
354
+ end
355
+ end
356
+
357
+ def set_axis(dim_or_dimname,ax)
358
+ @axes[ i = dim_index(dim_or_dimname) ] = ax
359
+ @axnames[ i ] = ax.name
360
+ self
361
+ end
362
+
363
+ def set_lost_axes( lost )
364
+ @lost_axes = lost # Array of String
365
+ self
366
+ end
367
+ def add_lost_axes( lost )
368
+ @lost_axes = @lost_axes + lost # Array of String
369
+ self
370
+ end
371
+
372
+ def delete_axes( at, deleted_by=nil )
373
+ case at
374
+ when String
375
+ at = [dim_index(at)]
376
+ when Numeric
377
+ at = [at]
378
+ when Array
379
+ at = at.collect{|x|
380
+ case x
381
+ when String
382
+ dim_index(x)
383
+ when Integer
384
+ x
385
+ else
386
+ raise ArgumentError,"'at' must consist of Integer and/or String"
387
+ end
388
+ }
389
+ else
390
+ raise TypeError, "1st arg not an Array"
391
+ end
392
+
393
+ at.collect!{|pos|
394
+ if pos < 0
395
+ pos + a.length
396
+ else
397
+ pos
398
+ end
399
+ }
400
+ at.sort!
401
+ newaxes = @axes.dup
402
+ at.reverse.each{|pos|
403
+ del = newaxes.delete_at(pos)
404
+ if !del
405
+ raise ArgumentError, "dimension #{pos} does not exist in a #{rank}D Grid"
406
+ end
407
+ }
408
+
409
+ newgrid = self.class.new( *newaxes )
410
+ newgrid.set_lost_axes( @lost_axes.dup )
411
+ if @assoc_coords
412
+ newgrid.assoc_coords=@assoc_coords.subset_having_axnames(newgrid.axnames)
413
+ end
414
+
415
+ if !deleted_by
416
+ msg = '(deleted) '
417
+ else
418
+ raise TypeError, "2nd arg not a String" if !deleted_by.is_a?(String)
419
+ msg = '('+deleted_by+') '
420
+ end
421
+ lost = at.collect{|pos|
422
+ mn = sprintf("%g", ( UNumeric===(a=@axes[pos].pos.min) ? a.val : a) )
423
+ mx = sprintf("%g", ( UNumeric===(a=@axes[pos].pos.max) ? a.val : a) )
424
+ msg +
425
+ "#{@axes[pos].name}:#{mn}..#{mx}"
426
+ }
427
+
428
+ newgrid.add_lost_axes( lost )
429
+ newgrid
430
+ end
431
+
432
+ def copy
433
+ # deep clone onto memory
434
+ out = self.class.new( *@axes.collect{|ax| ax.copy} )
435
+ out.set_lost_axes( @lost_axes.dup )
436
+ out.assoc_coords = @assoc_coords.copy if @assoc_coords
437
+ out
438
+ end
439
+
440
+ def merge(other)
441
+ # merge two grids by basically using copies of self's axes but
442
+ # using the other's if the length in self is 1 and
443
+ # the length in the other is longer
444
+ if self.rank != other.rank
445
+ raise "ranks do not agree (self:#{self.rank} vs other:#{other.rank})"
446
+ end
447
+ axes = Array.new
448
+ for i in 0...self.rank
449
+ if @axes[i].length == 1 and other.axis(i).length > 1
450
+ axes[i] = other.axis(i)
451
+ else
452
+ axes[i] = @axes[i]
453
+ end
454
+ end
455
+ out = self.class.new( *axes )
456
+ out.set_lost_axes( (@lost_axes.dup + other.lost_axes).uniq )
457
+ if (oac = other.assoc_coords) || (sac = self.assoc_coords)
458
+ sac ? ac=sac.merge(oac) : ac=oac.merge(sac)
459
+ out.assoc_coords = ac
460
+ end
461
+ out
462
+ end
463
+
464
+ def shape
465
+ @axes.collect{|ax| ax.length}
466
+ end
467
+ alias shape_current shape
468
+
469
+ def [] (*slicer)
470
+ if slicer.length == 0
471
+ # make a clone
472
+ axes = Array.new
473
+ (0...rank).each{ |i| axes.push( @axes[i][0..-1] ) }
474
+ grid = self.class.new( *axes )
475
+ else
476
+ slicer = __rubber_expansion(slicer)
477
+ if slicer.length != rank
478
+ raise ArgumentError,"# of the args does not agree with the rank"
479
+ end
480
+ axes = Array.new
481
+ lost = self.lost_axes #Array.new
482
+ for i in 0...rank
483
+ ax = @axes[i][slicer[i]]
484
+ if ax.is_a?(Axis) # else its rank became zero (lost)
485
+ axes.push( ax )
486
+ else
487
+ lost.push( ax )
488
+ end
489
+ end
490
+ grid = self.class.new( *axes )
491
+ grid.set_lost_axes( lost ) if lost.length != 0
492
+ grid
493
+ end
494
+ if @assoc_coords
495
+ grid.assoc_coords = @assoc_coords[*slicer]
496
+ end
497
+ grid
498
+ end
499
+
500
+ def __rubber_expansion( args )
501
+ if (id = args.index(false)) # substitution into id
502
+ # false is incuded
503
+ alen = args.length
504
+ if args.rindex(false) != id
505
+ raise ArguemntError,"only one rubber dimension is permitted"
506
+ elsif alen > rank+1
507
+ raise ArgumentError, "too many args"
508
+ end
509
+ ar = ( id!=0 ? args[0..id-1] : [] )
510
+ args = ar + [true]*(rank-alen+1) + args[id+1..-1]
511
+ end
512
+ args
513
+ end
514
+ private :__rubber_expansion
515
+
516
+ def cut_assoccoord(hasharg)
517
+ ac, acsl = @assoc_coords.cut(hasharg)
518
+ sl = @axnames.collect{|nm| acsl[nm] || true}
519
+ [ self[*sl], sl ]
520
+ end
521
+
522
+ def cut(*args)
523
+ _cut_(false, *args)
524
+ end
525
+ def cut_rank_conserving(*args)
526
+ _cut_(true, *args)
527
+ end
528
+
529
+ # cut along the regular coorinates.
530
+ # assume that the coordinates are monotonic (without checking).
531
+ def _cut_(conserve_rank, *args)
532
+
533
+ hasharg = ( args.length==1 && args[0].is_a?(Hash) )
534
+
535
+ if hasharg
536
+ # specification by axis names
537
+ spec = args[0]
538
+ if (spec.keys - axnames).length > 0
539
+ raise ArgumentError,"One or more of the hash keys "+
540
+ "(#{spec.keys.inspect}) are not found in the axis names "+
541
+ "(#{axnames.inspect})."
542
+ end
543
+ args = axnames.collect{|ax| spec[ax] || true}
544
+ end
545
+
546
+ args = __rubber_expansion(args)
547
+
548
+ if rank != args.length
549
+ raise ArgumentError, "# of dims doesn't agree with the rank(#{rank})"
550
+ end
551
+
552
+ slicer = Array.new
553
+
554
+ for dim in 0...rank
555
+ ax = @axes[dim]
556
+ if conserve_rank
557
+ dummy, slicer[dim] = ax.cut_rank_conserving(args[dim])
558
+ else
559
+ dummy, slicer[dim] = ax.cut(args[dim])
560
+ end
561
+ end
562
+
563
+ [ self[*slicer], slicer ]
564
+ end
565
+ private :_cut_
566
+
567
+ # def exclude(dim_or_dimname)
568
+ # dim = dim_index(dim_or_dimname)
569
+ # axes = @axes.dup
570
+ # axes.delete_at(dim)
571
+ # self.class.new( *axes )
572
+ # end
573
+
574
+ def change_axis(dim, axis)
575
+ axes = @axes.dup
576
+ lost = @lost_axes.dup
577
+ if axis.is_a?(Axis)
578
+ axes[dim] = axis
579
+ else
580
+ lost.push(axis) if axis.is_a?(String)
581
+ axes.delete_at(dim)
582
+ end
583
+ grid = self.class.new( *axes ).add_lost_axes( lost )
584
+ if @assoc_coords
585
+ grid.assoc_coords=@assoc_coords.subset_having_axnames(grid.axnames)
586
+ end
587
+ grid
588
+ end
589
+
590
+ # def change_axis!(dim_or_dimname, axis)
591
+ # if axis.is_a?(Axis)
592
+ # @axes[ dim_index(dim_or_dimname) ] = axis
593
+ # else
594
+ # @lost_axes.push(axis) if axis.is_a?(String)
595
+ # @axes.delete_at( dim_index(dim_or_dimname) )
596
+ # end
597
+ # @rank = @axes.length
598
+ # __check_and_set_axnames
599
+ # self
600
+ # end
601
+
602
+ # def insert_axis(dim_or_dimname, axis)
603
+ # dim = dim_index(dim_or_dimname)
604
+ # axes = @axes.dup
605
+ # if axis.is_a?(Axis)
606
+ # axes[dim+1,0] = axis # axes.insert(dim, axis) if ruby 1.7
607
+ # else
608
+ # # do nothing
609
+ # end
610
+ # self.class.new( *axes )
611
+ # end
612
+
613
+ # def insert_axis!(dim_or_dimname, axis)
614
+ # dim = dim_index(dim_or_dimname)
615
+ # if axis == nil
616
+ # # do nothing
617
+ # else
618
+ # @axes[dim+1,0] = axis # @axes.insert(dim, axis) if ruby 1.7
619
+ # @rank = @axes.length
620
+ # __check_and_set_axnames
621
+ # end
622
+ # self
623
+ # end
624
+
625
+ def transpose( *dims )
626
+ if dims.sort != NArray.int(rank).indgen!.to_a
627
+ raise ArgumentError,
628
+ "Args must a permutation of 0..rank-1 (eg, if 3D 2,1,0; 1,0,2;etc)"
629
+ end
630
+ axes = Array.new
631
+ for i in 0...rank
632
+ axes[i] = @axes[dims[i]]
633
+ end
634
+ grid = self.class.new(*axes)
635
+ grid.set_lost_axes( lost_axes )
636
+ grid.assoc_coords = @assoc_coords.dup if @assoc_coords
637
+ grid
638
+ end
639
+
640
+ # Define operations along each axis --- The following defines
641
+ # instance methods such as "average" and "integrate":
642
+
643
+ Axis.defined_operations.each do |method|
644
+ eval <<-EOS, nil, __FILE__, __LINE__+1
645
+ def #{method}(vary, dim_or_dimname, *extra_args)
646
+ ax, dim = self.ax_dim(dim_or_dimname)
647
+ va, new_ax = ax.#{method}(vary, dim, *extra_args)
648
+ if va.is_a?(Numeric) || va.is_a?(UNumeric)
649
+ va
650
+ else
651
+ [va, self.change_axis(dim, new_ax)]
652
+ end
653
+ end
654
+ EOS
655
+ end
656
+
657
+ ######### < protected methods > ###########
658
+
659
+ protected
660
+
661
+ def ax_dim(dim_or_dimname)
662
+ if dim_or_dimname.is_a?(Integer)
663
+ dim = dim_or_dimname
664
+ if dim < -rank || dim >= rank
665
+ raise ArgumentError,"rank=#{rank}: #{dim}th grid does not exist"
666
+ end
667
+ dim += rank if dim < 0
668
+ else
669
+ dim = @axnames.index(dim_or_dimname)
670
+ if !dim
671
+ raise ArgumentError, "Axis #{dim_or_dimname} is not contained"
672
+ end
673
+ end
674
+ [@axes[dim], dim]
675
+ end
676
+
677
+
678
+ end
679
+
680
+ end
681
+
682
+ ######################################################
683
+ ## < test >
684
+ if $0 == __FILE__
685
+ include NumRu
686
+ vx = VArray.new( NArray.float(10).indgen! + 0.5 ).rename("x")
687
+ vy = VArray.new( NArray.float(6).indgen! ).rename("y")
688
+ xax = Axis.new().set_pos(vx)
689
+ yax = Axis.new(true).set_cell_guess_bounds(vy).set_pos_to_center
690
+ grid = Grid.new(xax, yax)
691
+
692
+ z = VArray.new( NArray.float(vx.length, vy.length).indgen! )
693
+ p z.val
694
+ p "average along x-axis:", grid.average(z,0)[0].val,
695
+ grid.average(z,"x")[0].val
696
+ p "average along y-axis:", grid.average(z,1)[0].val,
697
+ grid.average(z,"y")[0].val
698
+ p "grid set by an operation:", (g = grid.average(z,1)[1]).rank, g.shape
699
+
700
+ p grid.shape, grid.axis(0).pos.val, grid.axis(1).pos.val
701
+ subgrid = grid[1..3,1..2]
702
+ p subgrid.shape, subgrid.axis(0).pos.val, subgrid.axis(1).pos.val
703
+ p grid[3,2].lost_axes
704
+
705
+ p grid
706
+
707
+ gr,slice = grid.cut(1.0..4.0, 3.2)
708
+ p "%%",gr.copy,slice,gr.lost_axes
709
+ gr,slice = grid.cut_rank_conserving(-10,false)
710
+ p "%%",gr.copy,slice,gr.lost_axes
711
+
712
+ p grid[0,0]
713
+
714
+ p Grid.new(xax).average(vx,0) # --> scalar
715
+
716
+ p "+++++"
717
+ p grid.delete_axes(0).lost_axes
718
+ p grid.delete_axes([0,1]).lost_axes
719
+ p grid.delete_axes([0,1], 'mean').lost_axes
720
+
721
+ p grid, grid.transpose(1,0)
722
+ end
723
+