gphys 1.1.1a

Sign up to get free protection for your applications and to get access to all the features.
Files changed (428) hide show
  1. data/ChangeLog +1777 -0
  2. data/LICENSE.txt +34 -0
  3. data/README +33 -0
  4. data/Rakefile +57 -0
  5. data/TODO_ep_flux +6 -0
  6. data/bin/gdir_client +27 -0
  7. data/bin/gdir_server +129 -0
  8. data/bin/gpaop +146 -0
  9. data/bin/gpcat +148 -0
  10. data/bin/gpcut +102 -0
  11. data/bin/gpedit +228 -0
  12. data/bin/gplist +68 -0
  13. data/bin/gpmath +120 -0
  14. data/bin/gpmaxmin +128 -0
  15. data/bin/gpprint +60 -0
  16. data/bin/gpvect +706 -0
  17. data/bin/gpview +704 -0
  18. data/bin/grads2nc_with_gphys +61 -0
  19. data/doc/attribute.html +19 -0
  20. data/doc/attributenetcdf.html +15 -0
  21. data/doc/axis.html +376 -0
  22. data/doc/coordmapping.html +111 -0
  23. data/doc/coordtransform.html +36 -0
  24. data/doc/derivative/gphys-derivative.html +80 -0
  25. data/doc/derivative/index.html +21 -0
  26. data/doc/derivative/index.rd +14 -0
  27. data/doc/derivative/math-doc/document/document.css +30 -0
  28. data/doc/derivative/math-doc/document/document.html +57 -0
  29. data/doc/derivative/math-doc/document/images.aux +1 -0
  30. data/doc/derivative/math-doc/document/images.log +385 -0
  31. data/doc/derivative/math-doc/document/images.pl +186 -0
  32. data/doc/derivative/math-doc/document/images.tex +364 -0
  33. data/doc/derivative/math-doc/document/img1.png +0 -0
  34. data/doc/derivative/math-doc/document/img10.png +0 -0
  35. data/doc/derivative/math-doc/document/img11.png +0 -0
  36. data/doc/derivative/math-doc/document/img12.png +0 -0
  37. data/doc/derivative/math-doc/document/img13.png +0 -0
  38. data/doc/derivative/math-doc/document/img14.png +0 -0
  39. data/doc/derivative/math-doc/document/img15.png +0 -0
  40. data/doc/derivative/math-doc/document/img16.png +0 -0
  41. data/doc/derivative/math-doc/document/img17.png +0 -0
  42. data/doc/derivative/math-doc/document/img18.png +0 -0
  43. data/doc/derivative/math-doc/document/img19.png +0 -0
  44. data/doc/derivative/math-doc/document/img2.png +0 -0
  45. data/doc/derivative/math-doc/document/img20.png +0 -0
  46. data/doc/derivative/math-doc/document/img21.png +0 -0
  47. data/doc/derivative/math-doc/document/img22.png +0 -0
  48. data/doc/derivative/math-doc/document/img23.png +0 -0
  49. data/doc/derivative/math-doc/document/img24.png +0 -0
  50. data/doc/derivative/math-doc/document/img25.png +0 -0
  51. data/doc/derivative/math-doc/document/img26.png +0 -0
  52. data/doc/derivative/math-doc/document/img27.png +0 -0
  53. data/doc/derivative/math-doc/document/img28.png +0 -0
  54. data/doc/derivative/math-doc/document/img29.png +0 -0
  55. data/doc/derivative/math-doc/document/img3.png +0 -0
  56. data/doc/derivative/math-doc/document/img30.png +0 -0
  57. data/doc/derivative/math-doc/document/img4.png +0 -0
  58. data/doc/derivative/math-doc/document/img5.png +0 -0
  59. data/doc/derivative/math-doc/document/img6.png +0 -0
  60. data/doc/derivative/math-doc/document/img7.png +0 -0
  61. data/doc/derivative/math-doc/document/img8.png +0 -0
  62. data/doc/derivative/math-doc/document/img9.png +0 -0
  63. data/doc/derivative/math-doc/document/index.html +57 -0
  64. data/doc/derivative/math-doc/document/labels.pl +13 -0
  65. data/doc/derivative/math-doc/document/next.png +0 -0
  66. data/doc/derivative/math-doc/document/next_g.png +0 -0
  67. data/doc/derivative/math-doc/document/node1.html +238 -0
  68. data/doc/derivative/math-doc/document/node2.html +75 -0
  69. data/doc/derivative/math-doc/document/prev.png +0 -0
  70. data/doc/derivative/math-doc/document/prev_g.png +0 -0
  71. data/doc/derivative/math-doc/document/up.png +0 -0
  72. data/doc/derivative/math-doc/document/up_g.png +0 -0
  73. data/doc/derivative/math-doc/document.pdf +0 -0
  74. data/doc/derivative/math-doc/document.tex +158 -0
  75. data/doc/derivative/numru-derivative.html +129 -0
  76. data/doc/ep_flux/ep_flux.html +469 -0
  77. data/doc/ep_flux/ggraph_on_merdional_section.html +71 -0
  78. data/doc/ep_flux/index.html +31 -0
  79. data/doc/ep_flux/index.rd +24 -0
  80. data/doc/ep_flux/math-doc/document/WARNINGS +1 -0
  81. data/doc/ep_flux/math-doc/document/contents.png +0 -0
  82. data/doc/ep_flux/math-doc/document/crossref.png +0 -0
  83. data/doc/ep_flux/math-doc/document/document.css +30 -0
  84. data/doc/ep_flux/math-doc/document/document.html +101 -0
  85. data/doc/ep_flux/math-doc/document/images.aux +1 -0
  86. data/doc/ep_flux/math-doc/document/images.log +1375 -0
  87. data/doc/ep_flux/math-doc/document/images.pl +1328 -0
  88. data/doc/ep_flux/math-doc/document/images.tex +1471 -0
  89. data/doc/ep_flux/math-doc/document/img1.png +0 -0
  90. data/doc/ep_flux/math-doc/document/img10.png +0 -0
  91. data/doc/ep_flux/math-doc/document/img100.png +0 -0
  92. data/doc/ep_flux/math-doc/document/img101.png +0 -0
  93. data/doc/ep_flux/math-doc/document/img102.png +0 -0
  94. data/doc/ep_flux/math-doc/document/img103.png +0 -0
  95. data/doc/ep_flux/math-doc/document/img104.png +0 -0
  96. data/doc/ep_flux/math-doc/document/img105.png +0 -0
  97. data/doc/ep_flux/math-doc/document/img106.png +0 -0
  98. data/doc/ep_flux/math-doc/document/img107.png +0 -0
  99. data/doc/ep_flux/math-doc/document/img108.png +0 -0
  100. data/doc/ep_flux/math-doc/document/img109.png +0 -0
  101. data/doc/ep_flux/math-doc/document/img11.png +0 -0
  102. data/doc/ep_flux/math-doc/document/img110.png +0 -0
  103. data/doc/ep_flux/math-doc/document/img111.png +0 -0
  104. data/doc/ep_flux/math-doc/document/img112.png +0 -0
  105. data/doc/ep_flux/math-doc/document/img113.png +0 -0
  106. data/doc/ep_flux/math-doc/document/img114.png +0 -0
  107. data/doc/ep_flux/math-doc/document/img115.png +0 -0
  108. data/doc/ep_flux/math-doc/document/img116.png +0 -0
  109. data/doc/ep_flux/math-doc/document/img117.png +0 -0
  110. data/doc/ep_flux/math-doc/document/img118.png +0 -0
  111. data/doc/ep_flux/math-doc/document/img119.png +0 -0
  112. data/doc/ep_flux/math-doc/document/img12.png +0 -0
  113. data/doc/ep_flux/math-doc/document/img120.png +0 -0
  114. data/doc/ep_flux/math-doc/document/img121.png +0 -0
  115. data/doc/ep_flux/math-doc/document/img122.png +0 -0
  116. data/doc/ep_flux/math-doc/document/img123.png +0 -0
  117. data/doc/ep_flux/math-doc/document/img124.png +0 -0
  118. data/doc/ep_flux/math-doc/document/img125.png +0 -0
  119. data/doc/ep_flux/math-doc/document/img126.png +0 -0
  120. data/doc/ep_flux/math-doc/document/img127.png +0 -0
  121. data/doc/ep_flux/math-doc/document/img128.png +0 -0
  122. data/doc/ep_flux/math-doc/document/img129.png +0 -0
  123. data/doc/ep_flux/math-doc/document/img13.png +0 -0
  124. data/doc/ep_flux/math-doc/document/img130.png +0 -0
  125. data/doc/ep_flux/math-doc/document/img131.png +0 -0
  126. data/doc/ep_flux/math-doc/document/img132.png +0 -0
  127. data/doc/ep_flux/math-doc/document/img133.png +0 -0
  128. data/doc/ep_flux/math-doc/document/img134.png +0 -0
  129. data/doc/ep_flux/math-doc/document/img135.png +0 -0
  130. data/doc/ep_flux/math-doc/document/img136.png +0 -0
  131. data/doc/ep_flux/math-doc/document/img137.png +0 -0
  132. data/doc/ep_flux/math-doc/document/img138.png +0 -0
  133. data/doc/ep_flux/math-doc/document/img139.png +0 -0
  134. data/doc/ep_flux/math-doc/document/img14.png +0 -0
  135. data/doc/ep_flux/math-doc/document/img140.png +0 -0
  136. data/doc/ep_flux/math-doc/document/img141.png +0 -0
  137. data/doc/ep_flux/math-doc/document/img142.png +0 -0
  138. data/doc/ep_flux/math-doc/document/img143.png +0 -0
  139. data/doc/ep_flux/math-doc/document/img144.png +0 -0
  140. data/doc/ep_flux/math-doc/document/img145.png +0 -0
  141. data/doc/ep_flux/math-doc/document/img146.png +0 -0
  142. data/doc/ep_flux/math-doc/document/img147.png +0 -0
  143. data/doc/ep_flux/math-doc/document/img148.png +0 -0
  144. data/doc/ep_flux/math-doc/document/img149.png +0 -0
  145. data/doc/ep_flux/math-doc/document/img15.png +0 -0
  146. data/doc/ep_flux/math-doc/document/img150.png +0 -0
  147. data/doc/ep_flux/math-doc/document/img151.png +0 -0
  148. data/doc/ep_flux/math-doc/document/img152.png +0 -0
  149. data/doc/ep_flux/math-doc/document/img153.png +0 -0
  150. data/doc/ep_flux/math-doc/document/img154.png +0 -0
  151. data/doc/ep_flux/math-doc/document/img155.png +0 -0
  152. data/doc/ep_flux/math-doc/document/img156.png +0 -0
  153. data/doc/ep_flux/math-doc/document/img157.png +0 -0
  154. data/doc/ep_flux/math-doc/document/img158.png +0 -0
  155. data/doc/ep_flux/math-doc/document/img159.png +0 -0
  156. data/doc/ep_flux/math-doc/document/img16.png +0 -0
  157. data/doc/ep_flux/math-doc/document/img160.png +0 -0
  158. data/doc/ep_flux/math-doc/document/img161.png +0 -0
  159. data/doc/ep_flux/math-doc/document/img162.png +0 -0
  160. data/doc/ep_flux/math-doc/document/img163.png +0 -0
  161. data/doc/ep_flux/math-doc/document/img164.png +0 -0
  162. data/doc/ep_flux/math-doc/document/img165.png +0 -0
  163. data/doc/ep_flux/math-doc/document/img166.png +0 -0
  164. data/doc/ep_flux/math-doc/document/img167.png +0 -0
  165. data/doc/ep_flux/math-doc/document/img168.png +0 -0
  166. data/doc/ep_flux/math-doc/document/img169.png +0 -0
  167. data/doc/ep_flux/math-doc/document/img17.png +0 -0
  168. data/doc/ep_flux/math-doc/document/img170.png +0 -0
  169. data/doc/ep_flux/math-doc/document/img171.png +0 -0
  170. data/doc/ep_flux/math-doc/document/img172.png +0 -0
  171. data/doc/ep_flux/math-doc/document/img173.png +0 -0
  172. data/doc/ep_flux/math-doc/document/img174.png +0 -0
  173. data/doc/ep_flux/math-doc/document/img175.png +0 -0
  174. data/doc/ep_flux/math-doc/document/img176.png +0 -0
  175. data/doc/ep_flux/math-doc/document/img177.png +0 -0
  176. data/doc/ep_flux/math-doc/document/img178.png +0 -0
  177. data/doc/ep_flux/math-doc/document/img179.png +0 -0
  178. data/doc/ep_flux/math-doc/document/img18.png +0 -0
  179. data/doc/ep_flux/math-doc/document/img180.png +0 -0
  180. data/doc/ep_flux/math-doc/document/img181.png +0 -0
  181. data/doc/ep_flux/math-doc/document/img182.png +0 -0
  182. data/doc/ep_flux/math-doc/document/img183.png +0 -0
  183. data/doc/ep_flux/math-doc/document/img184.png +0 -0
  184. data/doc/ep_flux/math-doc/document/img185.png +0 -0
  185. data/doc/ep_flux/math-doc/document/img186.png +0 -0
  186. data/doc/ep_flux/math-doc/document/img187.png +0 -0
  187. data/doc/ep_flux/math-doc/document/img188.png +0 -0
  188. data/doc/ep_flux/math-doc/document/img189.png +0 -0
  189. data/doc/ep_flux/math-doc/document/img19.png +0 -0
  190. data/doc/ep_flux/math-doc/document/img190.png +0 -0
  191. data/doc/ep_flux/math-doc/document/img191.png +0 -0
  192. data/doc/ep_flux/math-doc/document/img192.png +0 -0
  193. data/doc/ep_flux/math-doc/document/img193.png +0 -0
  194. data/doc/ep_flux/math-doc/document/img194.png +0 -0
  195. data/doc/ep_flux/math-doc/document/img195.png +0 -0
  196. data/doc/ep_flux/math-doc/document/img196.png +0 -0
  197. data/doc/ep_flux/math-doc/document/img197.png +0 -0
  198. data/doc/ep_flux/math-doc/document/img198.png +0 -0
  199. data/doc/ep_flux/math-doc/document/img199.png +0 -0
  200. data/doc/ep_flux/math-doc/document/img2.png +0 -0
  201. data/doc/ep_flux/math-doc/document/img20.png +0 -0
  202. data/doc/ep_flux/math-doc/document/img200.png +0 -0
  203. data/doc/ep_flux/math-doc/document/img21.png +0 -0
  204. data/doc/ep_flux/math-doc/document/img22.png +0 -0
  205. data/doc/ep_flux/math-doc/document/img23.png +0 -0
  206. data/doc/ep_flux/math-doc/document/img24.png +0 -0
  207. data/doc/ep_flux/math-doc/document/img25.png +0 -0
  208. data/doc/ep_flux/math-doc/document/img26.png +0 -0
  209. data/doc/ep_flux/math-doc/document/img27.png +0 -0
  210. data/doc/ep_flux/math-doc/document/img28.png +0 -0
  211. data/doc/ep_flux/math-doc/document/img29.png +0 -0
  212. data/doc/ep_flux/math-doc/document/img3.png +0 -0
  213. data/doc/ep_flux/math-doc/document/img30.png +0 -0
  214. data/doc/ep_flux/math-doc/document/img31.png +0 -0
  215. data/doc/ep_flux/math-doc/document/img32.png +0 -0
  216. data/doc/ep_flux/math-doc/document/img33.png +0 -0
  217. data/doc/ep_flux/math-doc/document/img34.png +0 -0
  218. data/doc/ep_flux/math-doc/document/img35.png +0 -0
  219. data/doc/ep_flux/math-doc/document/img36.png +0 -0
  220. data/doc/ep_flux/math-doc/document/img37.png +0 -0
  221. data/doc/ep_flux/math-doc/document/img38.png +0 -0
  222. data/doc/ep_flux/math-doc/document/img39.png +0 -0
  223. data/doc/ep_flux/math-doc/document/img4.png +0 -0
  224. data/doc/ep_flux/math-doc/document/img40.png +0 -0
  225. data/doc/ep_flux/math-doc/document/img41.png +0 -0
  226. data/doc/ep_flux/math-doc/document/img42.png +0 -0
  227. data/doc/ep_flux/math-doc/document/img43.png +0 -0
  228. data/doc/ep_flux/math-doc/document/img44.png +0 -0
  229. data/doc/ep_flux/math-doc/document/img45.png +0 -0
  230. data/doc/ep_flux/math-doc/document/img46.png +0 -0
  231. data/doc/ep_flux/math-doc/document/img47.png +0 -0
  232. data/doc/ep_flux/math-doc/document/img48.png +0 -0
  233. data/doc/ep_flux/math-doc/document/img49.png +0 -0
  234. data/doc/ep_flux/math-doc/document/img5.png +0 -0
  235. data/doc/ep_flux/math-doc/document/img50.png +0 -0
  236. data/doc/ep_flux/math-doc/document/img51.png +0 -0
  237. data/doc/ep_flux/math-doc/document/img52.png +0 -0
  238. data/doc/ep_flux/math-doc/document/img53.png +0 -0
  239. data/doc/ep_flux/math-doc/document/img54.png +0 -0
  240. data/doc/ep_flux/math-doc/document/img55.png +0 -0
  241. data/doc/ep_flux/math-doc/document/img56.png +0 -0
  242. data/doc/ep_flux/math-doc/document/img57.png +0 -0
  243. data/doc/ep_flux/math-doc/document/img58.png +0 -0
  244. data/doc/ep_flux/math-doc/document/img59.png +0 -0
  245. data/doc/ep_flux/math-doc/document/img6.png +0 -0
  246. data/doc/ep_flux/math-doc/document/img60.png +0 -0
  247. data/doc/ep_flux/math-doc/document/img61.png +0 -0
  248. data/doc/ep_flux/math-doc/document/img62.png +0 -0
  249. data/doc/ep_flux/math-doc/document/img63.png +0 -0
  250. data/doc/ep_flux/math-doc/document/img64.png +0 -0
  251. data/doc/ep_flux/math-doc/document/img65.png +0 -0
  252. data/doc/ep_flux/math-doc/document/img66.png +0 -0
  253. data/doc/ep_flux/math-doc/document/img67.png +0 -0
  254. data/doc/ep_flux/math-doc/document/img68.png +0 -0
  255. data/doc/ep_flux/math-doc/document/img69.png +0 -0
  256. data/doc/ep_flux/math-doc/document/img7.png +0 -0
  257. data/doc/ep_flux/math-doc/document/img70.png +0 -0
  258. data/doc/ep_flux/math-doc/document/img71.png +0 -0
  259. data/doc/ep_flux/math-doc/document/img72.png +0 -0
  260. data/doc/ep_flux/math-doc/document/img73.png +0 -0
  261. data/doc/ep_flux/math-doc/document/img74.png +0 -0
  262. data/doc/ep_flux/math-doc/document/img75.png +0 -0
  263. data/doc/ep_flux/math-doc/document/img76.png +0 -0
  264. data/doc/ep_flux/math-doc/document/img77.png +0 -0
  265. data/doc/ep_flux/math-doc/document/img78.png +0 -0
  266. data/doc/ep_flux/math-doc/document/img79.png +0 -0
  267. data/doc/ep_flux/math-doc/document/img8.png +0 -0
  268. data/doc/ep_flux/math-doc/document/img80.png +0 -0
  269. data/doc/ep_flux/math-doc/document/img81.png +0 -0
  270. data/doc/ep_flux/math-doc/document/img82.png +0 -0
  271. data/doc/ep_flux/math-doc/document/img83.png +0 -0
  272. data/doc/ep_flux/math-doc/document/img84.png +0 -0
  273. data/doc/ep_flux/math-doc/document/img85.png +0 -0
  274. data/doc/ep_flux/math-doc/document/img86.png +0 -0
  275. data/doc/ep_flux/math-doc/document/img87.png +0 -0
  276. data/doc/ep_flux/math-doc/document/img88.png +0 -0
  277. data/doc/ep_flux/math-doc/document/img89.png +0 -0
  278. data/doc/ep_flux/math-doc/document/img9.png +0 -0
  279. data/doc/ep_flux/math-doc/document/img90.png +0 -0
  280. data/doc/ep_flux/math-doc/document/img91.png +0 -0
  281. data/doc/ep_flux/math-doc/document/img92.png +0 -0
  282. data/doc/ep_flux/math-doc/document/img93.png +0 -0
  283. data/doc/ep_flux/math-doc/document/img94.png +0 -0
  284. data/doc/ep_flux/math-doc/document/img95.png +0 -0
  285. data/doc/ep_flux/math-doc/document/img96.png +0 -0
  286. data/doc/ep_flux/math-doc/document/img97.png +0 -0
  287. data/doc/ep_flux/math-doc/document/img98.png +0 -0
  288. data/doc/ep_flux/math-doc/document/img99.png +0 -0
  289. data/doc/ep_flux/math-doc/document/index.html +101 -0
  290. data/doc/ep_flux/math-doc/document/internals.pl +258 -0
  291. data/doc/ep_flux/math-doc/document/labels.pl +265 -0
  292. data/doc/ep_flux/math-doc/document/next.png +0 -0
  293. data/doc/ep_flux/math-doc/document/next_g.png +0 -0
  294. data/doc/ep_flux/math-doc/document/node1.html +104 -0
  295. data/doc/ep_flux/math-doc/document/node10.html +164 -0
  296. data/doc/ep_flux/math-doc/document/node11.html +86 -0
  297. data/doc/ep_flux/math-doc/document/node12.html +166 -0
  298. data/doc/ep_flux/math-doc/document/node13.html +897 -0
  299. data/doc/ep_flux/math-doc/document/node14.html +1065 -0
  300. data/doc/ep_flux/math-doc/document/node15.html +72 -0
  301. data/doc/ep_flux/math-doc/document/node16.html +81 -0
  302. data/doc/ep_flux/math-doc/document/node2.html +82 -0
  303. data/doc/ep_flux/math-doc/document/node3.html +91 -0
  304. data/doc/ep_flux/math-doc/document/node4.html +149 -0
  305. data/doc/ep_flux/math-doc/document/node5.html +330 -0
  306. data/doc/ep_flux/math-doc/document/node6.html +99 -0
  307. data/doc/ep_flux/math-doc/document/node7.html +98 -0
  308. data/doc/ep_flux/math-doc/document/node8.html +83 -0
  309. data/doc/ep_flux/math-doc/document/node9.html +140 -0
  310. data/doc/ep_flux/math-doc/document/prev.png +0 -0
  311. data/doc/ep_flux/math-doc/document/prev_g.png +0 -0
  312. data/doc/ep_flux/math-doc/document/up.png +0 -0
  313. data/doc/ep_flux/math-doc/document/up_g.png +0 -0
  314. data/doc/ep_flux/math-doc/document.pdf +0 -0
  315. data/doc/ep_flux/math-doc/document.tex +2018 -0
  316. data/doc/gdir.html +412 -0
  317. data/doc/gdir_client.html +16 -0
  318. data/doc/gdir_connect_ftp-like.html +61 -0
  319. data/doc/gdir_server.html +45 -0
  320. data/doc/ggraph.html +1615 -0
  321. data/doc/gpcat.html +44 -0
  322. data/doc/gpcut.html +41 -0
  323. data/doc/gphys.html +532 -0
  324. data/doc/gphys_fft.html +324 -0
  325. data/doc/gphys_grads_io.html +69 -0
  326. data/doc/gphys_grib_io.html +82 -0
  327. data/doc/gphys_io.html +120 -0
  328. data/doc/gphys_io_common.html +18 -0
  329. data/doc/gphys_netcdf_io.html +283 -0
  330. data/doc/gplist.html +24 -0
  331. data/doc/gpmath.html +51 -0
  332. data/doc/gpmaxmin.html +31 -0
  333. data/doc/gpprint.html +34 -0
  334. data/doc/gpview.html +270 -0
  335. data/doc/grads2nc_with_gphys.html +21 -0
  336. data/doc/grads_gridded.html +307 -0
  337. data/doc/grib.html +144 -0
  338. data/doc/grid.html +212 -0
  339. data/doc/index.html +133 -0
  340. data/doc/index.rd +127 -0
  341. data/doc/netcdf_convention.html +136 -0
  342. data/doc/unumeric.html +176 -0
  343. data/doc/update +64 -0
  344. data/doc/varray.html +299 -0
  345. data/doc/varraycomposite.html +67 -0
  346. data/ext_coord.c +209 -0
  347. data/ext_init.c +7 -0
  348. data/extconf.rb +42 -0
  349. data/install.rb +130 -0
  350. data/interpo.c +497 -0
  351. data/lib/numru/dcl_mouse.rb +71 -0
  352. data/lib/numru/dclext_datetime_ax.rb +220 -0
  353. data/lib/numru/derivative.rb +348 -0
  354. data/lib/numru/ganalysis/covariance.rb +154 -0
  355. data/lib/numru/ganalysis/eof.rb +298 -0
  356. data/lib/numru/ganalysis/histogram.rb +252 -0
  357. data/lib/numru/ganalysis/met.rb +317 -0
  358. data/lib/numru/ganalysis/planet.rb +182 -0
  359. data/lib/numru/ganalysis.rb +7 -0
  360. data/lib/numru/gdir.rb +1038 -0
  361. data/lib/numru/gdir_connect_ftp-like.rb +149 -0
  362. data/lib/numru/ggraph.rb +5838 -0
  363. data/lib/numru/ggraph_on_merdional_section.rb +178 -0
  364. data/lib/numru/gphys/assoccoords.rb +359 -0
  365. data/lib/numru/gphys/attribute.rb +129 -0
  366. data/lib/numru/gphys/attributenetcdf.rb +80 -0
  367. data/lib/numru/gphys/axis.rb +963 -0
  368. data/lib/numru/gphys/coordmapping.rb +286 -0
  369. data/lib/numru/gphys/coordtransform.rb +209 -0
  370. data/lib/numru/gphys/derivative.rb +314 -0
  371. data/lib/numru/gphys/ep_flux.rb +868 -0
  372. data/lib/numru/gphys/gpcommon.rb +52 -0
  373. data/lib/numru/gphys/gphys.rb +1207 -0
  374. data/lib/numru/gphys/gphys_fft.rb +886 -0
  375. data/lib/numru/gphys/gphys_grads_io.rb +212 -0
  376. data/lib/numru/gphys/gphys_grib_io.rb +214 -0
  377. data/lib/numru/gphys/gphys_gtool3_io.rb +162 -0
  378. data/lib/numru/gphys/gphys_hdfeos5_io.rb +672 -0
  379. data/lib/numru/gphys/gphys_io.rb +452 -0
  380. data/lib/numru/gphys/gphys_io_common.rb +126 -0
  381. data/lib/numru/gphys/gphys_netcdf_io.rb +800 -0
  382. data/lib/numru/gphys/gphys_nusdas_io.rb +132 -0
  383. data/lib/numru/gphys/grads_gridded.rb +1638 -0
  384. data/lib/numru/gphys/grib.rb +2049 -0
  385. data/lib/numru/gphys/grib_params.rb +1465 -0
  386. data/lib/numru/gphys/grid.rb +723 -0
  387. data/lib/numru/gphys/gtool3.rb +771 -0
  388. data/lib/numru/gphys/interpolate.rb +854 -0
  389. data/lib/numru/gphys/narray_ext.rb +34 -0
  390. data/lib/numru/gphys/netcdf_convention.rb +406 -0
  391. data/lib/numru/gphys/subsetmapping.rb +332 -0
  392. data/lib/numru/gphys/unumeric.rb +522 -0
  393. data/lib/numru/gphys/varray.rb +1109 -0
  394. data/lib/numru/gphys/varraycomposite.rb +415 -0
  395. data/lib/numru/gphys/varraygrads.rb +225 -0
  396. data/lib/numru/gphys/varraygrib.rb +177 -0
  397. data/lib/numru/gphys/varraygtool3.rb +226 -0
  398. data/lib/numru/gphys/varrayhdfeos5.rb +451 -0
  399. data/lib/numru/gphys/varraynetcdf.rb +350 -0
  400. data/lib/numru/gphys/varraynusdas.rb +59 -0
  401. data/lib/numru/gphys.rb +9 -0
  402. data/lib/numru/htdir.rb +170 -0
  403. data/multibitIO.c +567 -0
  404. data/sample/cira86_to_nc.rb +122 -0
  405. data/sample/druby_cli1.rb +21 -0
  406. data/sample/druby_cli2.rb +34 -0
  407. data/sample/druby_serv1.rb +30 -0
  408. data/sample/druby_serv2.rb +64 -0
  409. data/sample/ep_flux/demo_NCEP_1.rb +48 -0
  410. data/sample/ep_flux/demo_NCEP_2.rb +57 -0
  411. data/sample/ep_flux/demo_NCEP_3.rb +81 -0
  412. data/sample/ggraph_latlon_labelling_dr002690.rb +159 -0
  413. data/sample/ggraph_mapfit-axes_dr002687.rb +131 -0
  414. data/sample/map_projection.rb +121 -0
  415. data/sample/ncep_theta_coord.rb +79 -0
  416. data/test/eof_slp.rb +28 -0
  417. data/test/mltbit.dat +0 -0
  418. data/test/test_ep_flux.rb +533 -0
  419. data/test/test_multibitIO.rb +19 -0
  420. data/testdata/T.jan.ctl +12 -0
  421. data/testdata/T.jan.dat +0 -0
  422. data/testdata/T.jan.grib +0 -0
  423. data/testdata/T.jan.nc +0 -0
  424. data/testdata/T.jan.packed.withmiss.nc +0 -0
  425. data/testdata/UV.jan.nc +0 -0
  426. data/testdata/assoc_crds.nc +0 -0
  427. data/testdata/cira86.dat +1332 -0
  428. metadata +621 -0
@@ -0,0 +1,452 @@
1
+ require "numru/gphys/gphys_netcdf_io"
2
+ require "numru/gphys/gphys_grads_io"
3
+ require "numru/gphys/gphys_grib_io"
4
+ require "numru/gphys/gphys_nusdas_io"
5
+ require "numru/gphys/gphys_gtool3_io"
6
+ begin
7
+ require "numru/gphys/gphys_hdfeos5_io"
8
+ rescue LoadError
9
+ end
10
+
11
+
12
+ =begin
13
+ =module NumRu::GPhys::IO
14
+
15
+ A module to handle file IO regarding GPhys.
16
+
17
+ Many of the functionality of this module is implemented in the modules
18
+ for specific file types such as NumRu::GPhys::NetCDF_IO, to which this
19
+ module directs operations.
20
+
21
+ For example, (('GPhys::IO.open(file, name)')) simply calls
22
+ (('GPhys::*_IO.open(file, name)')), where '(('*'))' is
23
+ (('NetCDF')), (('GrADS')), or (('grib')).
24
+
25
+ ==Module functions
26
+
27
+ ---open(files, varname)
28
+ ---write(file, gphys, name=nil)
29
+ ---write_grid(file, grid_or_gphys)
30
+ ---each_along_dims_write(gphyses, files, *loopdims){...} # a block is expected
31
+ ---var_names(file)
32
+ ---var_names_except_coordinates(file)
33
+ See the manual of (('NumRu::GPhys::NetCDF_IO')) for the methods listed above.
34
+
35
+ ---file2type(file)
36
+ Figures out the file type supported in this module.
37
+
38
+ ARGUMENTS
39
+ * file (String, Regexp, NetCDF, Grib, or GrADS_Gridded) :
40
+ What to return is of course obvious if it is
41
+ NetCDF, Grib, or GrADS_Gridded. If it is a String,
42
+ it is assumed to be a path of a file, and the file type
43
+ is determined by its suffix when 'nc', 'ctl', or 'grib';
44
+ In other cases, the type is figured out by reading in
45
+ a few bytes from the beginning. If Regexp, currently,
46
+ a NetCDF is assumed, since only NetCDF_IO.open supports
47
+ Regexp.
48
+
49
+ RETURN VALUE
50
+ * GPhys::IO::NETCDF, GPhys::IO::GRIB, or GPhys::IO::GRADS,
51
+ which are string constants.
52
+
53
+ ---file2specific_module(file)
54
+ Same as ((<file2type>)), but returns GPhys::NetCDF_IO,
55
+ GPhys::GrADS_IO, or GPhys::Grib_IO.
56
+
57
+ ---file2file_class(file)
58
+ Same as ((<file2type>)), but returns NetCDF,
59
+ GrADS_Gridded, or Grib.
60
+
61
+ ---parse_gturl(gturl)
62
+ Parses GTOOL4-type URLs to specify path, variable name,
63
+ and optionally subsets, whose format is
64
+ (('path@varname[,dimname=pos1[:pos2[:thinning_intv]][,dimname=...]]'))
65
+
66
+ ARGUMENTS
67
+ * gturl (String) GTOOL4 URL, whose format is
68
+ (('path@varname[,dimname=pos1[:pos2[:thinning_intv]][,dimname=...]]'))
69
+
70
+ RETURN VALUES
71
+ * An Array consisting of [file, var, slice, cut_slice, thinning], where
72
+ * file (String) : path
73
+ * var (String) : variable name
74
+ * slice (Array) : subset specifier by the grid numbers
75
+ to be used as (('GPhys#[slice]')).
76
+ * cut_slice (Array) : subset specifier in physical coordinate
77
+ to be used as (('GPhys#cut[cut_slice]')).
78
+ * thinning (Array) : additional subset specifier for thinning
79
+ with uniform intervals if needed to be used (('GPhys#[thinning]'))
80
+ after appling (('GPhys#cut')).
81
+
82
+ ---open_gturl(gturl)
83
+ a GPhys constructor from a Gtool4-type URL.
84
+ See ((<parse_gturl>)) for its format.
85
+
86
+ RETURN VALUE
87
+ * a GPhys
88
+
89
+ ---str2gphys(str)
90
+ Open a GPhys from a slash("/")-separated String
91
+ such as "U.nc/U" and "U.nc".
92
+ * Aimed to help quick jobs with interactive sessions
93
+ -- This method do not handle a GPhys across multiple files.
94
+ * if the variable path is ommited such as "U.nc",
95
+ try to find the variable in it -- read the file and if
96
+ only one variable is found, assume that is the
97
+ variable specified; otherwise, an exception is raised.
98
+ * URL is accepted, but it's only thru NetCDF assuming OPeNDAP.
99
+
100
+ ARGUMENTS
101
+ * a String (file_path[/variable_path])
102
+ e.g. "U.nc/U", "U.nc", "http://.../U.nc/U"
103
+
104
+ RETURN VALUE
105
+ * a GPhys
106
+
107
+ ==Module constants
108
+
109
+ ---GTURLfmt
110
+ The format of Gtool4URL.
111
+
112
+ =end
113
+
114
+ module NumRu
115
+ class GPhys
116
+ module IO
117
+ module_function
118
+
119
+ ## // module functions to be defined in specific IO modules -->
120
+ def open(file, varname)
121
+ file2specific_module(file)::open(file, varname)
122
+ end
123
+
124
+ def write(file, gphys, name=nil)
125
+ file2specific_module(file)::write(file, gphys, name)
126
+ end
127
+
128
+ def write_grid(file, grid_or_gphys)
129
+ # usually not needed (internally called by write)
130
+ file2specific_module(file)::write_grid(file, grid_or_gphys)
131
+ end
132
+
133
+ def each_along_dims_write(gphyses, files, *loopdims, &block)
134
+
135
+ files = [files] if !files.is_a?(Array)
136
+ files.each do |fl|
137
+ if fl.is_a?(NetCDF)
138
+ NetCDF_Conventions.add_history(fl, "#{File.basename($0)}")
139
+ end
140
+ end
141
+
142
+ IO_Common::each_along_dims_write(gphyses, files, loopdims,
143
+ file2specific_module(files), &block)
144
+ end
145
+ ## <-- module functions to be defined in specific IO modules //
146
+
147
+ ## // file type selctor -->
148
+ NETCDF = "NETCDF"
149
+ GRADS = "GRADS"
150
+ GRIB = "GRIB"
151
+ NUSDAS = "NUSDAS"
152
+ He5 = "He5"
153
+ GTOOL3 = "GTOOL3"
154
+ @@iomdl = {NETCDF => GPhys::NetCDF_IO,
155
+ GRADS => GPhys::GrADS_IO,
156
+ GRIB => GPhys::Grib_IO,
157
+ NUSDAS => GPhys::NuSDaS_IO,
158
+ GTOOL3 => GPhys::Gtool3_IO}
159
+ @@file_class = {NETCDF => NetCDF,
160
+ GRADS => GrADS_Gridded,
161
+ GRIB => Grib,
162
+ NUSDAS => NuSDaS,
163
+ GTOOL3 => Gtool3}
164
+ @@nc_pattern = [/\.nc$/]
165
+ @@grad_pattern = [/\.ctl$/]
166
+ @@grib_pattern = [/\.grib$/, /\.grb$/]
167
+ @@nus_pattern = [/\.nus$/]
168
+
169
+ @@has_he5 = defined?(HE5)
170
+ if @@has_he5
171
+ @@iomdl[He5] = GPhys::HE5_IO
172
+ @@file_class [He5] = HE5
173
+ @@he5_pattern = [/\.he5$/]
174
+ end
175
+
176
+ def file2type(file)
177
+ case file
178
+ when Array, NArray
179
+ return file2type(file[0]) # inspect the first element (ignoring the rest)
180
+ when NetCDF
181
+ return NETCDF
182
+ when GrADS_Gridded
183
+ return GRADS
184
+ when Grib
185
+ return GRIB
186
+ when NuSDaS
187
+ return NUSDAS
188
+ when Gtool3
189
+ return GTOOL3
190
+ when Regexp
191
+ return NETCDF # So far, only NetCDF_IO supports Regexp.
192
+ when *@@nc_pattern
193
+ return NETCDF
194
+ when *@@grad_pattern
195
+ return GRADS
196
+ when *@@grib_pattern
197
+ return GRIB
198
+ when *@@nus_pattern
199
+ return NUSDAS
200
+ when String
201
+ return NETCDF if /^http:\/\// =~ file # assume a DODS URL
202
+ return nil unless File.exist?(file)
203
+ return NETCDF if NetCDF_IO.is_a_NetCDF?(file)
204
+ return GRADS if GrADS_IO.is_a_GrADS?(file)
205
+ return GRIB if Grib_IO.is_a_Grib?(file)
206
+ return NUSDAS if NuSDaS_IO.is_a_NuSDaS?(file)
207
+ return GTOOL3 if Gtool3_IO.is_a_Gtool3?(file)
208
+ end
209
+ if @@has_he5
210
+ case file
211
+ when HE5, HE5Sw
212
+ return He5
213
+ when *@@he5_pattern
214
+ return He5
215
+ when String
216
+ return He5 if HE5_IO.is_a_HE5?(file)
217
+ end
218
+ end
219
+ return nil
220
+ end
221
+
222
+ def file2specific_module(file)
223
+ @@iomdl[ file2type(file) ]
224
+ end
225
+
226
+ def file2file_class(file)
227
+ @@file_class[ file2type(file) ]
228
+ end
229
+
230
+ types = ['nc','grad','grib','nus','he5']
231
+ types.each{|c|
232
+ eval <<-EOS
233
+ def add_#{c}_pattern(*regexps)
234
+ regexps.each{ |regexp|
235
+ raise TypeError,"Regexp expected" unless Regexp===regexp
236
+ @@#{c}_pattern.push(regexp)
237
+ }
238
+ nil
239
+ end
240
+ EOS
241
+ }
242
+
243
+ types.each{|c|
244
+ eval <<-EOS
245
+ def set_#{c}_pattern(*regexps)
246
+ regexps.each{ |regexp|
247
+ raise TypeError,"Regexp expected" unless Regexp===regexp
248
+ }
249
+ @@#{c}_pattern = regexps
250
+ nil
251
+ end
252
+ EOS
253
+ }
254
+ ## <-- file type selctor //
255
+
256
+ def var_names(file)
257
+ file2specific_module(file).var_names(file)
258
+ end
259
+ def var_names_except_coordinates(file)
260
+ file2specific_module(file).var_names_except_coordinates(file)
261
+ end
262
+
263
+ GTURLfmt = "path@varname[,dimname=pos1[:pos2[:thinning_intv]][,dimname=...]]"
264
+
265
+ def parse_gturl(gturl)
266
+ if /(.*)@(.*)/ =~ gturl
267
+ file = $1
268
+ var = $2
269
+ else
270
+ raise "invalid URL: '@' between path & variable is not found\n\n" +
271
+ "URL format: " + GTURLfmt
272
+ end
273
+ if /,/ =~ var
274
+ slice = Hash.new
275
+ cut_slice = Hash.new
276
+ thinning = Hash.new
277
+ var_descr = var.split(/,/)
278
+ var = var_descr.shift
279
+ var_descr.each do |s|
280
+ if /(.*)=(.*)/ =~ s
281
+ dimname = $1
282
+ subset = $2
283
+ case subset
284
+ when /\^(.*):(.*):(.*)/
285
+ slice[dimname] = ($1.to_i)..($2.to_i)
286
+ thinning[dimname] = {(0..-1) => $3.to_i}
287
+ when /\^(.*):(.*)/
288
+ slice[dimname] = ($1.to_i)..($2.to_i)
289
+ when /\^(.*)/
290
+ slice[dimname] = $1.to_i
291
+ when /(.*):(.*):(.*)/
292
+ cut_slice[dimname] = ($1.to_f)..($2.to_f)
293
+ thinning[dimname] = {(0..-1) => $3.to_i}
294
+ when /(.*):(.*)/
295
+ cut_slice[dimname] = ($1.to_f)..($2.to_f)
296
+ else
297
+ cut_slice[dimname] = subset.to_f
298
+ end
299
+ else
300
+ raise "invalid URL: variable subset specification error\n\n" +
301
+ "URL format: " + GTURLfmt
302
+ end
303
+ end
304
+ slice = nil if slice.length == 0
305
+ cut_slice = nil if cut_slice.length == 0
306
+ thinning = nil if thinning.length == 0
307
+ else
308
+ slice = nil
309
+ cut_slice = nil
310
+ thinning = nil
311
+ end
312
+ [file, var, slice, cut_slice, thinning]
313
+ end # def parse_gturl
314
+
315
+ def open_gturl(gturl)
316
+ file, var, slice, cut_slice, thinning = GPhys::IO.parse_gturl(gturl)
317
+ gp = GPhys::IO.open(file,var)
318
+ gp = gp[slice] if slice
319
+ gp = gp.cut(cut_slice) if cut_slice
320
+ gp = gp[thinning] if thinning
321
+ gp
322
+ end # def open_gturl
323
+
324
+ def str2gphys(str)
325
+
326
+ case str
327
+ when /^https?:\/\//
328
+ file_tester = Proc.new{|fname| NetCDF.open(fname) rescue false}
329
+ when
330
+ file_tester = Proc.new{|fname| File.exists?(fname)}
331
+ end
332
+ fname = str; vname = nil # initial value
333
+ while fname
334
+ if file_tester.call(fname)
335
+ break
336
+ else
337
+ if /(.*)\/([^\/]+)/ =~ fname
338
+ fname = $1
339
+ if vname.nil?
340
+ vname = $2
341
+ else
342
+ vname = $2 + "/" + vname
343
+ end
344
+ else
345
+ raise "Not found: #{str}"
346
+ end
347
+ end
348
+ end
349
+ if vname.nil?
350
+ vns = var_names_except_coordinates(fname)
351
+ if vns.length==1
352
+ vname=vns.first
353
+ else
354
+ raise "#{str} has multiple variables #{vns.inspect}. Specify one."
355
+ end
356
+ end
357
+ open(fname,vname)
358
+ end
359
+
360
+ end # module IO
361
+ end # class GPhys
362
+ end # module NumRu
363
+
364
+ ######################################################
365
+ if $0 == __FILE__
366
+ include NumRu
367
+
368
+ puts "\n** test str2gphys **\n"
369
+ p GPhys::IO.str2gphys("../../../testdata/T.jan.nc/T")
370
+ p GPhys::IO.str2gphys("../../../testdata/T.jan.nc")
371
+ exit
372
+
373
+ puts "\n** test NETCDF **\n"
374
+
375
+ file = "../../../testdata/T.jan.nc"
376
+ temp = GPhys::IO.open(file,"T")
377
+ p temp.name, temp.shape_current
378
+ p temp.val.class
379
+ temp2 = temp[true,true,2]
380
+ p temp2.name, temp2.shape_current
381
+
382
+ temp_xmean = temp.average(0)
383
+ p temp.val
384
+
385
+ temp_edy = ( temp - temp_xmean )
386
+ p '###',temp_edy.name,temp_edy.val[0,true,true]
387
+ p 'deleted attributes:', temp.data.att_names - temp_edy.data.att_names
388
+ p '@@@',temp
389
+ p '///',temp.copy
390
+ p '+++',temp2
391
+
392
+ puts "\n** test write (tmp.nc) **"
393
+ file2 = NetCDF.create('tmp.nc')
394
+ p v = temp_edy.axis(0).pos[0..-2].copy.rename('lonlon')
395
+ temp_edy.axis(0).set_aux('test',v)
396
+ temp_edy.axis(0).set_aux('test2',(v/2).rename('lonlon2'))
397
+ temp_edy.axis(0).set_aux('test2',(v/2).rename('lonlon3')[0..-2])
398
+ GPhys::IO.write(file2,temp_edy)
399
+ file2.close
400
+ file3 = NetCDF.create('tmp2.nc')
401
+ GPhys::IO.write(file2,temp_xmean)
402
+ file3.close
403
+
404
+ p '** test each_along_dims* **'
405
+
406
+ f=NetCDF.create('tmpE1.nc')
407
+ GPhys::IO.each_along_dims_write( temp, f, 1, 2 ){|sub|
408
+ [sub.mean(0)]
409
+ }
410
+ f.close
411
+ f=NetCDF.create('tmpE2.nc')
412
+ GPhys::IO.each_along_dims_write([temp,temp_edy], f, "level"){|s1,s2|
413
+ [s1.mean(0),s2.mean(1).rename('T_edy')]
414
+ }
415
+ f.close
416
+ f=NetCDF.create('tmpE0.nc')
417
+ GPhys::IO.write( f, temp.mean(0) )
418
+ f.close
419
+
420
+ print `ncdump tmpE0.nc > tmpE0; ncdump tmpE1.nc > tmpE1 ; diff -u tmpE[01]`
421
+
422
+ puts "\n** test GRADS (and write into NETCDF) **\n"
423
+
424
+ file = "../../../testdata/T.jan.ctl"
425
+ temp = GPhys::IO.open(file,"T")
426
+ p temp.name, temp.shape_current
427
+ temp2 = temp[true,true,2,0]
428
+ p temp2.name, temp2.shape_current
429
+
430
+ temp_xmean = temp.average(0)
431
+ p temp.val
432
+
433
+ temp_edy = ( temp - temp_xmean )
434
+ p '$$$',temp_edy.name,temp_edy.val[0,true,true,0]
435
+ p '@@@',temp
436
+ p '///',temp.copy
437
+ p '+++',temp2
438
+
439
+ puts "\n** test write (tmp.nc) **"
440
+ require "numru/gphys/gphys_netcdf_io"
441
+ file2 = NetCDF.create('tmp.nc')
442
+ p v = temp_edy.axis(0).pos[0..-2].copy.rename('lonlon')
443
+ temp_edy.axis(0).set_aux('test',v)
444
+ temp_edy.axis(0).set_aux('test2',(v/2).rename('lonlon2'))
445
+ temp_edy.axis(0).set_aux('test2',(v/2).rename('lonlon3')[0..-2])
446
+ GPhys::IO.write(file2,temp_edy)
447
+ file2.close
448
+ file3 = NetCDF.create('tmp2.nc')
449
+ GPhys::IO.write(file2,temp_xmean)
450
+ file3.close
451
+
452
+ end
@@ -0,0 +1,126 @@
1
+ =begin
2
+ =module NumRu::GPhys::IO_Common
3
+
4
+ THIS MODULE IS ONLY FOR INTERNAL USAGE.
5
+ (Does not work stand alone.)
6
+
7
+ Functions independent of specific file formart.
8
+ To be used by IO, NetCDF_IO, GrADS_IO etc.
9
+
10
+ A test program is included in gphys_netcdf.rb
11
+
12
+ =end
13
+
14
+ module NumRu
15
+ class GPhys
16
+ module IO_Common
17
+
18
+ module_function
19
+
20
+ def each_along_dims_write(gphyses, files, loopdims, io_module)
21
+ if !gphyses.is_a?(Array)
22
+ gphyses = [gphyses] # put in an Array (if a single GPhys)
23
+ end
24
+ gp = gphyses[0]
25
+
26
+ if !files.is_a?(Array)
27
+ files = [files] # put in an Array (if a single File)
28
+ end
29
+
30
+ if !loopdims.is_a?(Array)
31
+ loopdims = [loopdims] # put in an Array (if a single Integer/String)
32
+ end
33
+ if loopdims.length == 0
34
+ raise ArgumentError, "No loop dimension is specified "+
35
+ " -- In that case, you don't need this iterator."
36
+ end
37
+
38
+ #if loopdims.min<0 || loopdims.max>=gp.rank
39
+ # raise ArguemntError,"Invalid dims #{loopdims.inspect} for #{gp.rank}D array"
40
+ #end
41
+
42
+ loopdimids = Array.new
43
+ loopdimnames = Array.new
44
+ loopdims.each{|d|
45
+ case d
46
+ when Integer
47
+ if d < 0
48
+ d += gp.rank
49
+ end
50
+ loopdimids.push( d )
51
+ loopdimnames.push( gp.axis(d).name )
52
+ when String
53
+ loopdimids.push( gp.dim_index(d) )
54
+ loopdimnames.push( d )
55
+ else
56
+ raise ArgumentError,"loopdims must consist of Integer and/or String"
57
+ end
58
+ }
59
+
60
+ sh = Array.new
61
+ len = 1
62
+ loopdimids.each{|i|
63
+ sh.push(gp.shape[i])
64
+ len *= gp.shape[i]
65
+ }
66
+
67
+ gphyses.each do |g|
68
+ for i in 1...gphyses.length
69
+ loopdimnames.each_with_index do |nm,i|
70
+ if !g.axnames.include?( nm )
71
+ raise ArgumentError,"#{i+1}-th GPhys do not have dim '#{nm}'"
72
+ end
73
+ if g.coord(nm).length != sh[i]
74
+ raise ArgumentError,"loop dimensions must have the same lengths(#{nm}; #{sh[i]} vs #{g.coord(nm).length})"
75
+ end
76
+ end
77
+ end
78
+ end
79
+
80
+ cs = [1]
81
+ (1...sh.length).each{|i| cs[i] = sh[i-1]*cs[i-1]}
82
+ idx_hash = Hash.new
83
+ for i in 0...len do
84
+ loopdimnames.each_with_index{|d,j|
85
+ idx_hash[d] = ((i/cs[j])%sh[j])..((i/cs[j])%sh[j]) # rank preserved
86
+ }
87
+ subs = gphyses.collect{|g| g[idx_hash] }
88
+ results = yield(*subs)
89
+ if !results.is_a?(Array)
90
+ raise "The return value of the block must be an Array of GPhys"
91
+ end
92
+ if i == 0
93
+ fl = files.shift
94
+ results_whole = Array.new
95
+ for j in 0...results.length
96
+ rs = results[j]
97
+ grid = rs.grid_copy
98
+ loopdimnames.each{|nm|
99
+ # replaces with original axes (full length)
100
+ if !grid.axnames.include?( nm )
101
+ raise "Dimension '#{nm}' has been eliminated. "+
102
+ "You must keep all loop dimensions."
103
+ end
104
+ grid.set_axis(nm,gphyses[0].axis(nm))
105
+ }
106
+ grid_new = io_module.write_grid(fl, grid)
107
+ results_whole.push(
108
+ GPhys.new( grid_new,
109
+ io_module.def_var(fl, rs.name, rs.data.ntype,
110
+ grid_new.axnames, rs.data)
111
+ )
112
+ )
113
+ fl = files.shift if files.length >= 1
114
+ end
115
+ end
116
+ for j in 0...results.length
117
+ rs = results[j]
118
+ results_whole[j][idx_hash] = rs.data
119
+ end
120
+ end
121
+ return results_whole
122
+
123
+ end
124
+ end # module IO_Common
125
+ end # class GPhys
126
+ end # module NumRu