gphys 1.2.2.1 → 1.4.3
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.
- checksums.yaml +7 -0
- data/.gitignore +8 -17
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/ChangeLog +5762 -753
- data/LICENSE.txt +30 -18
- data/Rakefile +1 -0
- data/bin/console +14 -0
- data/bin/gpcat +43 -2
- data/bin/gpcut +16 -0
- data/bin/gpvect +167 -15
- data/bin/gpview +254 -51
- data/bin/setup +7 -0
- data/dim_op.c +1220 -0
- data/doc/attribute.html +19 -0
- data/doc/attributenetcdf.html +15 -0
- data/doc/axis.html +387 -0
- data/doc/coordmapping.html +111 -0
- data/doc/coordtransform.html +36 -0
- data/doc/dclext.html +821 -0
- data/doc/derivative/gphys-derivative.html +100 -0
- data/doc/derivative/index.html +21 -0
- data/doc/derivative/index.rd +14 -0
- data/doc/derivative/math-doc/document.pdf +0 -0
- data/doc/derivative/math-doc/document.tex +158 -0
- data/doc/derivative/math-doc/document/document.css +30 -0
- data/doc/derivative/math-doc/document/document.html +57 -0
- data/doc/derivative/math-doc/document/images.aux +1 -0
- data/doc/derivative/math-doc/document/images.log +385 -0
- data/doc/derivative/math-doc/document/images.pl +186 -0
- data/doc/derivative/math-doc/document/images.tex +364 -0
- data/doc/derivative/math-doc/document/img1.png +0 -0
- data/doc/derivative/math-doc/document/img10.png +0 -0
- data/doc/derivative/math-doc/document/img11.png +0 -0
- data/doc/derivative/math-doc/document/img12.png +0 -0
- data/doc/derivative/math-doc/document/img13.png +0 -0
- data/doc/derivative/math-doc/document/img14.png +0 -0
- data/doc/derivative/math-doc/document/img15.png +0 -0
- data/doc/derivative/math-doc/document/img16.png +0 -0
- data/doc/derivative/math-doc/document/img17.png +0 -0
- data/doc/derivative/math-doc/document/img18.png +0 -0
- data/doc/derivative/math-doc/document/img19.png +0 -0
- data/doc/derivative/math-doc/document/img2.png +0 -0
- data/doc/derivative/math-doc/document/img20.png +0 -0
- data/doc/derivative/math-doc/document/img21.png +0 -0
- data/doc/derivative/math-doc/document/img22.png +0 -0
- data/doc/derivative/math-doc/document/img23.png +0 -0
- data/doc/derivative/math-doc/document/img24.png +0 -0
- data/doc/derivative/math-doc/document/img25.png +0 -0
- data/doc/derivative/math-doc/document/img26.png +0 -0
- data/doc/derivative/math-doc/document/img27.png +0 -0
- data/doc/derivative/math-doc/document/img28.png +0 -0
- data/doc/derivative/math-doc/document/img29.png +0 -0
- data/doc/derivative/math-doc/document/img3.png +0 -0
- data/doc/derivative/math-doc/document/img30.png +0 -0
- data/doc/derivative/math-doc/document/img4.png +0 -0
- data/doc/derivative/math-doc/document/img5.png +0 -0
- data/doc/derivative/math-doc/document/img6.png +0 -0
- data/doc/derivative/math-doc/document/img7.png +0 -0
- data/doc/derivative/math-doc/document/img8.png +0 -0
- data/doc/derivative/math-doc/document/img9.png +0 -0
- data/doc/derivative/math-doc/document/index.html +57 -0
- data/doc/derivative/math-doc/document/labels.pl +13 -0
- data/doc/derivative/math-doc/document/next.png +0 -0
- data/doc/derivative/math-doc/document/next_g.png +0 -0
- data/doc/derivative/math-doc/document/node1.html +238 -0
- data/doc/derivative/math-doc/document/node2.html +75 -0
- data/doc/derivative/math-doc/document/prev.png +0 -0
- data/doc/derivative/math-doc/document/prev_g.png +0 -0
- data/doc/derivative/math-doc/document/up.png +0 -0
- data/doc/derivative/math-doc/document/up_g.png +0 -0
- data/doc/derivative/numru-derivative.html +158 -0
- data/doc/ep_flux/ep_flux.html +469 -0
- data/doc/ep_flux/ggraph_on_merdional_section.html +71 -0
- data/doc/ep_flux/index.html +31 -0
- data/doc/ep_flux/index.rd +24 -0
- data/doc/ep_flux/math-doc/document.pdf +0 -0
- data/doc/ep_flux/math-doc/document.tex +2018 -0
- data/doc/ep_flux/math-doc/document/WARNINGS +1 -0
- data/doc/ep_flux/math-doc/document/contents.png +0 -0
- data/doc/ep_flux/math-doc/document/crossref.png +0 -0
- data/doc/ep_flux/math-doc/document/document.css +30 -0
- data/doc/ep_flux/math-doc/document/document.html +101 -0
- data/doc/ep_flux/math-doc/document/images.aux +1 -0
- data/doc/ep_flux/math-doc/document/images.log +1375 -0
- data/doc/ep_flux/math-doc/document/images.pl +1328 -0
- data/doc/ep_flux/math-doc/document/images.tex +1471 -0
- data/doc/ep_flux/math-doc/document/img1.png +0 -0
- data/doc/ep_flux/math-doc/document/img10.png +0 -0
- data/doc/ep_flux/math-doc/document/img100.png +0 -0
- data/doc/ep_flux/math-doc/document/img101.png +0 -0
- data/doc/ep_flux/math-doc/document/img102.png +0 -0
- data/doc/ep_flux/math-doc/document/img103.png +0 -0
- data/doc/ep_flux/math-doc/document/img104.png +0 -0
- data/doc/ep_flux/math-doc/document/img105.png +0 -0
- data/doc/ep_flux/math-doc/document/img106.png +0 -0
- data/doc/ep_flux/math-doc/document/img107.png +0 -0
- data/doc/ep_flux/math-doc/document/img108.png +0 -0
- data/doc/ep_flux/math-doc/document/img109.png +0 -0
- data/doc/ep_flux/math-doc/document/img11.png +0 -0
- data/doc/ep_flux/math-doc/document/img110.png +0 -0
- data/doc/ep_flux/math-doc/document/img111.png +0 -0
- data/doc/ep_flux/math-doc/document/img112.png +0 -0
- data/doc/ep_flux/math-doc/document/img113.png +0 -0
- data/doc/ep_flux/math-doc/document/img114.png +0 -0
- data/doc/ep_flux/math-doc/document/img115.png +0 -0
- data/doc/ep_flux/math-doc/document/img116.png +0 -0
- data/doc/ep_flux/math-doc/document/img117.png +0 -0
- data/doc/ep_flux/math-doc/document/img118.png +0 -0
- data/doc/ep_flux/math-doc/document/img119.png +0 -0
- data/doc/ep_flux/math-doc/document/img12.png +0 -0
- data/doc/ep_flux/math-doc/document/img120.png +0 -0
- data/doc/ep_flux/math-doc/document/img121.png +0 -0
- data/doc/ep_flux/math-doc/document/img122.png +0 -0
- data/doc/ep_flux/math-doc/document/img123.png +0 -0
- data/doc/ep_flux/math-doc/document/img124.png +0 -0
- data/doc/ep_flux/math-doc/document/img125.png +0 -0
- data/doc/ep_flux/math-doc/document/img126.png +0 -0
- data/doc/ep_flux/math-doc/document/img127.png +0 -0
- data/doc/ep_flux/math-doc/document/img128.png +0 -0
- data/doc/ep_flux/math-doc/document/img129.png +0 -0
- data/doc/ep_flux/math-doc/document/img13.png +0 -0
- data/doc/ep_flux/math-doc/document/img130.png +0 -0
- data/doc/ep_flux/math-doc/document/img131.png +0 -0
- data/doc/ep_flux/math-doc/document/img132.png +0 -0
- data/doc/ep_flux/math-doc/document/img133.png +0 -0
- data/doc/ep_flux/math-doc/document/img134.png +0 -0
- data/doc/ep_flux/math-doc/document/img135.png +0 -0
- data/doc/ep_flux/math-doc/document/img136.png +0 -0
- data/doc/ep_flux/math-doc/document/img137.png +0 -0
- data/doc/ep_flux/math-doc/document/img138.png +0 -0
- data/doc/ep_flux/math-doc/document/img139.png +0 -0
- data/doc/ep_flux/math-doc/document/img14.png +0 -0
- data/doc/ep_flux/math-doc/document/img140.png +0 -0
- data/doc/ep_flux/math-doc/document/img141.png +0 -0
- data/doc/ep_flux/math-doc/document/img142.png +0 -0
- data/doc/ep_flux/math-doc/document/img143.png +0 -0
- data/doc/ep_flux/math-doc/document/img144.png +0 -0
- data/doc/ep_flux/math-doc/document/img145.png +0 -0
- data/doc/ep_flux/math-doc/document/img146.png +0 -0
- data/doc/ep_flux/math-doc/document/img147.png +0 -0
- data/doc/ep_flux/math-doc/document/img148.png +0 -0
- data/doc/ep_flux/math-doc/document/img149.png +0 -0
- data/doc/ep_flux/math-doc/document/img15.png +0 -0
- data/doc/ep_flux/math-doc/document/img150.png +0 -0
- data/doc/ep_flux/math-doc/document/img151.png +0 -0
- data/doc/ep_flux/math-doc/document/img152.png +0 -0
- data/doc/ep_flux/math-doc/document/img153.png +0 -0
- data/doc/ep_flux/math-doc/document/img154.png +0 -0
- data/doc/ep_flux/math-doc/document/img155.png +0 -0
- data/doc/ep_flux/math-doc/document/img156.png +0 -0
- data/doc/ep_flux/math-doc/document/img157.png +0 -0
- data/doc/ep_flux/math-doc/document/img158.png +0 -0
- data/doc/ep_flux/math-doc/document/img159.png +0 -0
- data/doc/ep_flux/math-doc/document/img16.png +0 -0
- data/doc/ep_flux/math-doc/document/img160.png +0 -0
- data/doc/ep_flux/math-doc/document/img161.png +0 -0
- data/doc/ep_flux/math-doc/document/img162.png +0 -0
- data/doc/ep_flux/math-doc/document/img163.png +0 -0
- data/doc/ep_flux/math-doc/document/img164.png +0 -0
- data/doc/ep_flux/math-doc/document/img165.png +0 -0
- data/doc/ep_flux/math-doc/document/img166.png +0 -0
- data/doc/ep_flux/math-doc/document/img167.png +0 -0
- data/doc/ep_flux/math-doc/document/img168.png +0 -0
- data/doc/ep_flux/math-doc/document/img169.png +0 -0
- data/doc/ep_flux/math-doc/document/img17.png +0 -0
- data/doc/ep_flux/math-doc/document/img170.png +0 -0
- data/doc/ep_flux/math-doc/document/img171.png +0 -0
- data/doc/ep_flux/math-doc/document/img172.png +0 -0
- data/doc/ep_flux/math-doc/document/img173.png +0 -0
- data/doc/ep_flux/math-doc/document/img174.png +0 -0
- data/doc/ep_flux/math-doc/document/img175.png +0 -0
- data/doc/ep_flux/math-doc/document/img176.png +0 -0
- data/doc/ep_flux/math-doc/document/img177.png +0 -0
- data/doc/ep_flux/math-doc/document/img178.png +0 -0
- data/doc/ep_flux/math-doc/document/img179.png +0 -0
- data/doc/ep_flux/math-doc/document/img18.png +0 -0
- data/doc/ep_flux/math-doc/document/img180.png +0 -0
- data/doc/ep_flux/math-doc/document/img181.png +0 -0
- data/doc/ep_flux/math-doc/document/img182.png +0 -0
- data/doc/ep_flux/math-doc/document/img183.png +0 -0
- data/doc/ep_flux/math-doc/document/img184.png +0 -0
- data/doc/ep_flux/math-doc/document/img185.png +0 -0
- data/doc/ep_flux/math-doc/document/img186.png +0 -0
- data/doc/ep_flux/math-doc/document/img187.png +0 -0
- data/doc/ep_flux/math-doc/document/img188.png +0 -0
- data/doc/ep_flux/math-doc/document/img189.png +0 -0
- data/doc/ep_flux/math-doc/document/img19.png +0 -0
- data/doc/ep_flux/math-doc/document/img190.png +0 -0
- data/doc/ep_flux/math-doc/document/img191.png +0 -0
- data/doc/ep_flux/math-doc/document/img192.png +0 -0
- data/doc/ep_flux/math-doc/document/img193.png +0 -0
- data/doc/ep_flux/math-doc/document/img194.png +0 -0
- data/doc/ep_flux/math-doc/document/img195.png +0 -0
- data/doc/ep_flux/math-doc/document/img196.png +0 -0
- data/doc/ep_flux/math-doc/document/img197.png +0 -0
- data/doc/ep_flux/math-doc/document/img198.png +0 -0
- data/doc/ep_flux/math-doc/document/img199.png +0 -0
- data/doc/ep_flux/math-doc/document/img2.png +0 -0
- data/doc/ep_flux/math-doc/document/img20.png +0 -0
- data/doc/ep_flux/math-doc/document/img200.png +0 -0
- data/doc/ep_flux/math-doc/document/img21.png +0 -0
- data/doc/ep_flux/math-doc/document/img22.png +0 -0
- data/doc/ep_flux/math-doc/document/img23.png +0 -0
- data/doc/ep_flux/math-doc/document/img24.png +0 -0
- data/doc/ep_flux/math-doc/document/img25.png +0 -0
- data/doc/ep_flux/math-doc/document/img26.png +0 -0
- data/doc/ep_flux/math-doc/document/img27.png +0 -0
- data/doc/ep_flux/math-doc/document/img28.png +0 -0
- data/doc/ep_flux/math-doc/document/img29.png +0 -0
- data/doc/ep_flux/math-doc/document/img3.png +0 -0
- data/doc/ep_flux/math-doc/document/img30.png +0 -0
- data/doc/ep_flux/math-doc/document/img31.png +0 -0
- data/doc/ep_flux/math-doc/document/img32.png +0 -0
- data/doc/ep_flux/math-doc/document/img33.png +0 -0
- data/doc/ep_flux/math-doc/document/img34.png +0 -0
- data/doc/ep_flux/math-doc/document/img35.png +0 -0
- data/doc/ep_flux/math-doc/document/img36.png +0 -0
- data/doc/ep_flux/math-doc/document/img37.png +0 -0
- data/doc/ep_flux/math-doc/document/img38.png +0 -0
- data/doc/ep_flux/math-doc/document/img39.png +0 -0
- data/doc/ep_flux/math-doc/document/img4.png +0 -0
- data/doc/ep_flux/math-doc/document/img40.png +0 -0
- data/doc/ep_flux/math-doc/document/img41.png +0 -0
- data/doc/ep_flux/math-doc/document/img42.png +0 -0
- data/doc/ep_flux/math-doc/document/img43.png +0 -0
- data/doc/ep_flux/math-doc/document/img44.png +0 -0
- data/doc/ep_flux/math-doc/document/img45.png +0 -0
- data/doc/ep_flux/math-doc/document/img46.png +0 -0
- data/doc/ep_flux/math-doc/document/img47.png +0 -0
- data/doc/ep_flux/math-doc/document/img48.png +0 -0
- data/doc/ep_flux/math-doc/document/img49.png +0 -0
- data/doc/ep_flux/math-doc/document/img5.png +0 -0
- data/doc/ep_flux/math-doc/document/img50.png +0 -0
- data/doc/ep_flux/math-doc/document/img51.png +0 -0
- data/doc/ep_flux/math-doc/document/img52.png +0 -0
- data/doc/ep_flux/math-doc/document/img53.png +0 -0
- data/doc/ep_flux/math-doc/document/img54.png +0 -0
- data/doc/ep_flux/math-doc/document/img55.png +0 -0
- data/doc/ep_flux/math-doc/document/img56.png +0 -0
- data/doc/ep_flux/math-doc/document/img57.png +0 -0
- data/doc/ep_flux/math-doc/document/img58.png +0 -0
- data/doc/ep_flux/math-doc/document/img59.png +0 -0
- data/doc/ep_flux/math-doc/document/img6.png +0 -0
- data/doc/ep_flux/math-doc/document/img60.png +0 -0
- data/doc/ep_flux/math-doc/document/img61.png +0 -0
- data/doc/ep_flux/math-doc/document/img62.png +0 -0
- data/doc/ep_flux/math-doc/document/img63.png +0 -0
- data/doc/ep_flux/math-doc/document/img64.png +0 -0
- data/doc/ep_flux/math-doc/document/img65.png +0 -0
- data/doc/ep_flux/math-doc/document/img66.png +0 -0
- data/doc/ep_flux/math-doc/document/img67.png +0 -0
- data/doc/ep_flux/math-doc/document/img68.png +0 -0
- data/doc/ep_flux/math-doc/document/img69.png +0 -0
- data/doc/ep_flux/math-doc/document/img7.png +0 -0
- data/doc/ep_flux/math-doc/document/img70.png +0 -0
- data/doc/ep_flux/math-doc/document/img71.png +0 -0
- data/doc/ep_flux/math-doc/document/img72.png +0 -0
- data/doc/ep_flux/math-doc/document/img73.png +0 -0
- data/doc/ep_flux/math-doc/document/img74.png +0 -0
- data/doc/ep_flux/math-doc/document/img75.png +0 -0
- data/doc/ep_flux/math-doc/document/img76.png +0 -0
- data/doc/ep_flux/math-doc/document/img77.png +0 -0
- data/doc/ep_flux/math-doc/document/img78.png +0 -0
- data/doc/ep_flux/math-doc/document/img79.png +0 -0
- data/doc/ep_flux/math-doc/document/img8.png +0 -0
- data/doc/ep_flux/math-doc/document/img80.png +0 -0
- data/doc/ep_flux/math-doc/document/img81.png +0 -0
- data/doc/ep_flux/math-doc/document/img82.png +0 -0
- data/doc/ep_flux/math-doc/document/img83.png +0 -0
- data/doc/ep_flux/math-doc/document/img84.png +0 -0
- data/doc/ep_flux/math-doc/document/img85.png +0 -0
- data/doc/ep_flux/math-doc/document/img86.png +0 -0
- data/doc/ep_flux/math-doc/document/img87.png +0 -0
- data/doc/ep_flux/math-doc/document/img88.png +0 -0
- data/doc/ep_flux/math-doc/document/img89.png +0 -0
- data/doc/ep_flux/math-doc/document/img9.png +0 -0
- data/doc/ep_flux/math-doc/document/img90.png +0 -0
- data/doc/ep_flux/math-doc/document/img91.png +0 -0
- data/doc/ep_flux/math-doc/document/img92.png +0 -0
- data/doc/ep_flux/math-doc/document/img93.png +0 -0
- data/doc/ep_flux/math-doc/document/img94.png +0 -0
- data/doc/ep_flux/math-doc/document/img95.png +0 -0
- data/doc/ep_flux/math-doc/document/img96.png +0 -0
- data/doc/ep_flux/math-doc/document/img97.png +0 -0
- data/doc/ep_flux/math-doc/document/img98.png +0 -0
- data/doc/ep_flux/math-doc/document/img99.png +0 -0
- data/doc/ep_flux/math-doc/document/index.html +101 -0
- data/doc/ep_flux/math-doc/document/internals.pl +258 -0
- data/doc/ep_flux/math-doc/document/labels.pl +265 -0
- data/doc/ep_flux/math-doc/document/next.png +0 -0
- data/doc/ep_flux/math-doc/document/next_g.png +0 -0
- data/doc/ep_flux/math-doc/document/node1.html +104 -0
- data/doc/ep_flux/math-doc/document/node10.html +164 -0
- data/doc/ep_flux/math-doc/document/node11.html +86 -0
- data/doc/ep_flux/math-doc/document/node12.html +166 -0
- data/doc/ep_flux/math-doc/document/node13.html +897 -0
- data/doc/ep_flux/math-doc/document/node14.html +1065 -0
- data/doc/ep_flux/math-doc/document/node15.html +72 -0
- data/doc/ep_flux/math-doc/document/node16.html +81 -0
- data/doc/ep_flux/math-doc/document/node2.html +82 -0
- data/doc/ep_flux/math-doc/document/node3.html +91 -0
- data/doc/ep_flux/math-doc/document/node4.html +149 -0
- data/doc/ep_flux/math-doc/document/node5.html +330 -0
- data/doc/ep_flux/math-doc/document/node6.html +99 -0
- data/doc/ep_flux/math-doc/document/node7.html +98 -0
- data/doc/ep_flux/math-doc/document/node8.html +83 -0
- data/doc/ep_flux/math-doc/document/node9.html +140 -0
- data/doc/ep_flux/math-doc/document/prev.png +0 -0
- data/doc/ep_flux/math-doc/document/prev_g.png +0 -0
- data/doc/ep_flux/math-doc/document/up.png +0 -0
- data/doc/ep_flux/math-doc/document/up_g.png +0 -0
- data/doc/gdir.html +412 -0
- data/doc/gdir_client.html +16 -0
- data/doc/gdir_connect_ftp-like.html +61 -0
- data/doc/gdir_server.html +45 -0
- data/doc/ggraph.html +1119 -0
- data/doc/gpcat.html +45 -0
- data/doc/gpcut.html +47 -0
- data/doc/gphys.html +624 -0
- data/doc/gphys_fft.html +324 -0
- data/doc/gphys_grads_io.html +69 -0
- data/doc/gphys_grib_io.html +82 -0
- data/doc/gphys_io.html +183 -0
- data/doc/gphys_io_common.html +18 -0
- data/doc/gphys_netcdf_io.html +283 -0
- data/doc/gplist.html +24 -0
- data/doc/gpmath.html +52 -0
- data/doc/gpmaxmin.html +32 -0
- data/doc/gpprint.html +35 -0
- data/doc/gpview.html +349 -0
- data/doc/grads2nc_with_gphys.html +21 -0
- data/doc/grads_gridded.html +307 -0
- data/doc/grib.html +149 -0
- data/doc/grid.html +224 -0
- data/doc/index.html +145 -0
- data/doc/index.rd +138 -0
- data/doc/netcdf_convention.html +136 -0
- data/doc/unumeric.html +176 -0
- data/doc/update +69 -0
- data/doc/update_rdoc +8 -0
- data/doc/varray.html +299 -0
- data/doc/varraycomposite.html +67 -0
- data/ext_init.c +1 -0
- data/extconf.rb +16 -6
- data/gphys.gemspec +33 -26
- data/interpo.c +1 -1
- data/lib/numru/dclext.rb +718 -546
- data/lib/numru/derivative.rb +2 -0
- data/lib/numru/ganalysis.rb +38 -0
- data/lib/numru/ganalysis/beta_plane.rb +103 -0
- data/lib/numru/ganalysis/eof.rb +3 -2
- data/lib/numru/ganalysis/fitting.rb +559 -0
- data/lib/numru/ganalysis/histogram.rb +36 -19
- data/lib/numru/ganalysis/log_p.rb +130 -0
- data/lib/numru/ganalysis/met.rb +396 -2
- data/lib/numru/ganalysis/met_z.rb +300 -0
- data/lib/numru/ganalysis/planet.rb +17 -7
- data/lib/numru/ganalysis/qg.rb +685 -0
- data/lib/numru/ganalysis/sigma_coord.rb +90 -0
- data/lib/numru/gdir.rb +2 -1
- data/lib/numru/ggraph.rb +204 -60
- data/lib/numru/ggraph_on_merdional_section.rb +1 -1
- data/lib/numru/gphys.rb +6 -0
- data/lib/numru/gphys/assoccoords.rb +18 -3
- data/lib/numru/gphys/axis.rb +209 -8
- data/lib/numru/gphys/derivative.rb +11 -0
- data/lib/numru/gphys/gphys.rb +539 -48
- data/lib/numru/gphys/gphys_dim_op.rb +331 -0
- data/lib/numru/gphys/gphys_fft.rb +48 -2
- data/lib/numru/gphys/gphys_io.rb +241 -13
- data/lib/numru/gphys/gphys_netcdf_io.rb +77 -39
- data/lib/numru/gphys/gphys_nusdas_io.rb +3 -0
- data/lib/numru/gphys/grib.rb +133 -54
- data/lib/numru/gphys/grib_params.rb +26 -3
- data/lib/numru/gphys/grid.rb +75 -34
- data/lib/numru/gphys/interpolate.rb +24 -10
- data/lib/numru/gphys/mdstorage.rb +160 -0
- data/lib/numru/gphys/netcdf_convention.rb +4 -2
- data/lib/numru/gphys/subsetmapping.rb +0 -1
- data/lib/numru/gphys/unumeric.rb +50 -5
- data/lib/numru/gphys/varray.rb +15 -30
- data/lib/numru/gphys/varraycomposite.rb +107 -24
- data/lib/numru/gphys/varraynetcdf.rb +9 -3
- data/lib/numru/gphys/version.rb +5 -0
- data/sample/druby_cli1.rb +2 -0
- data/sample/druby_cli2.rb +0 -6
- data/sample/druby_serv2.rb +0 -13
- data/spec/gphys_spec.rb +11 -0
- data/spec/spec_helper.rb +2 -0
- data/test/test_assoccoords.rb +102 -0
- data/test/test_axis.rb +61 -0
- data/test/test_fitting.rb +116 -0
- data/test/test_gphys.rb +20 -0
- data/test/test_met_z.rb +96 -0
- data/test/test_sigma_coord.rb +50 -0
- data/{test → test_old}/eof_slp.rb +0 -0
- data/{test → test_old}/mltbit.dat +0 -0
- data/{test → test_old}/test_ep_flux.rb +0 -0
- data/{test → test_old}/test_multibitIO.rb +0 -0
- metadata +530 -191
- data/README.md +0 -29
- data/lib/gphys.rb +0 -2
- data/lib/numru/dclext_datetime_ax.rb +0 -220
- data/lib/version.rb +0 -3
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
# = Operations along a dimension such as running mean
|
|
2
|
+
#
|
|
3
|
+
# (Plan: binning will be supported too)
|
|
4
|
+
|
|
5
|
+
require "numru/gphys/gphys"
|
|
6
|
+
require 'numru/gphys_ext' # extension library
|
|
7
|
+
|
|
8
|
+
module NumRu
|
|
9
|
+
class GPhys
|
|
10
|
+
BC_SIMPLE = 10 # enum in convol_filter.c
|
|
11
|
+
BC_CYCLIC = 11 # enum in convol_filter.c
|
|
12
|
+
BC_TRIM = 12 # enum in convol_filter.c
|
|
13
|
+
|
|
14
|
+
@@default_missval = 9.9692099683868690e+36 # NC_FILL_DOUBLE/FLOAT ~15*2^119
|
|
15
|
+
|
|
16
|
+
# Running mean along a dimension (with optional weight specification).
|
|
17
|
+
#
|
|
18
|
+
# ARGUMENTS
|
|
19
|
+
# * dim (Integer or String) : the dimension
|
|
20
|
+
# * len_or_wgt : If Integer, specifies the length; if 1D NArray,
|
|
21
|
+
# specifies the weight (e.g., NArray[1.0, 2.0, 1.0] for
|
|
22
|
+
# the 1-2-1 smooting)
|
|
23
|
+
# * bc (Integer; optional) : Speficy one of the folloing:
|
|
24
|
+
# * GPhys::BC_SIMPLE (default) : Averaging is trucated at the boundaries
|
|
25
|
+
# (the number of grid points used is reduced near the boundaries).
|
|
26
|
+
# The shape of the object is conserved.
|
|
27
|
+
# * GPhys::BC_CYCLIC : Cyclic boundary condition. Shape conserved.
|
|
28
|
+
# * GPhys::BC_TRIM : Grids near the boundaries are trimmed to
|
|
29
|
+
# secure the number of grid points to average.
|
|
30
|
+
# Shape not conserved; length along the dim is reduced by (len-1).
|
|
31
|
+
# * nminvalid (Integer; optional; defualt=1):
|
|
32
|
+
# This parameter is used only when the data have missing.
|
|
33
|
+
# Minimum number of grid points needed for averaging.
|
|
34
|
+
# Must be from 1 to len.
|
|
35
|
+
#
|
|
36
|
+
# RETURN VALUE
|
|
37
|
+
# * a GPhys
|
|
38
|
+
#
|
|
39
|
+
# REMARK AND LIMITATION
|
|
40
|
+
# * If the length of the running mean is even number, fewer
|
|
41
|
+
# grid points are used from the "left" side; e.g.,
|
|
42
|
+
# If len is 6, result[2] is a mean over self[0]..self[5].
|
|
43
|
+
# * Regardless the na_type of self, double is used for avaraging, so:
|
|
44
|
+
# * This method does not support complex numbers.
|
|
45
|
+
#
|
|
46
|
+
def running_mean(dim, len_or_wgt=nil, bc=BC_SIMPLE, nminvalid=1)
|
|
47
|
+
|
|
48
|
+
#< process arguments >
|
|
49
|
+
|
|
50
|
+
dim = dim_index(dim) # to handle String or negative specification
|
|
51
|
+
|
|
52
|
+
case len_or_wgt
|
|
53
|
+
when nil
|
|
54
|
+
raise ArgumentError, "You need to specify the length (Integer) or the weight (1D NArray) as the 2nd argument"
|
|
55
|
+
when Integer
|
|
56
|
+
# len_or_wgt is a length
|
|
57
|
+
len = len_or_wgt
|
|
58
|
+
wgt = NArray.float(len).fill!(1.0)
|
|
59
|
+
else
|
|
60
|
+
# len_or_wgt is a weight
|
|
61
|
+
wgt = len_or_wgt
|
|
62
|
+
if (!wgt.respond_to?(:rank) || wgt.rank != 1)
|
|
63
|
+
raise ArgumentError, "wgt: expect a 1D NArray(-like obj)"
|
|
64
|
+
end
|
|
65
|
+
len = wgt.length
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
#< calc running mean >
|
|
69
|
+
|
|
70
|
+
vi = self.val
|
|
71
|
+
if (vi.typecode > NArray::DFLOAT)
|
|
72
|
+
raise("This method supports only real or integer data")
|
|
73
|
+
end
|
|
74
|
+
if vi.is_a?(NArrayMiss)
|
|
75
|
+
vi, missval = nam2na_missval(vi)
|
|
76
|
+
vo = c_running_mean(vi,dim,wgt,bc,missval,nminvalid)
|
|
77
|
+
vo = NArrayMiss.to_nam(vo, vo.ne(missval) )
|
|
78
|
+
else
|
|
79
|
+
vo = c_running_mean(vi,dim,wgt,bc)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
#< grid >
|
|
83
|
+
|
|
84
|
+
if (bc == BC_TRIM)
|
|
85
|
+
fst = (len-1)/2 # if odd len/2, if even len/2-1
|
|
86
|
+
lst = -(len/2) - 1
|
|
87
|
+
grid = self.grid[ *([true]*dim + [fst..lst, false]) ]
|
|
88
|
+
else
|
|
89
|
+
grid = self.grid
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
#< result >
|
|
93
|
+
vvo = VArray.new( vo, self.data, self.name ) # Inherit name & attrs
|
|
94
|
+
GPhys.new( grid, vvo )
|
|
95
|
+
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Binning along a dimension (mean)
|
|
99
|
+
#
|
|
100
|
+
# The values are averaged every "len" grids; unlike running_mean
|
|
101
|
+
# the number of grids is reduced to 1/len.
|
|
102
|
+
# Currently, the only available boundary condition is BC_TRIM.
|
|
103
|
+
#
|
|
104
|
+
# ARGUMENTS
|
|
105
|
+
# * dim (Integer or String) : the dimension
|
|
106
|
+
# * len (Integer): length of the bin
|
|
107
|
+
# * nminvalid (Integer; optional; defualt=1): Effective only for data with
|
|
108
|
+
# missing. Minimum number of grid points needed for averaging (1 to len).
|
|
109
|
+
#
|
|
110
|
+
# RETURN VALUE
|
|
111
|
+
# * a GPhys
|
|
112
|
+
#
|
|
113
|
+
def bin_mean(dim, len, nminvalid=1)
|
|
114
|
+
dim = dim_index(dim) # to handle String or negative specification
|
|
115
|
+
GPhys.new( grid.binning(dim, len), data.bin_mean(dim, len, nminvalid) )
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Binning along a dimension (summation)
|
|
119
|
+
#
|
|
120
|
+
# Similar to bin_mean, but the values are simply summed without averaging
|
|
121
|
+
#
|
|
122
|
+
# ARGUMENTS
|
|
123
|
+
# * dim (Integer or String) : the dimension
|
|
124
|
+
# * len (Integer): length of the bin
|
|
125
|
+
# * nminvalid (Integer; optional; defualt=1): Effective only for data with
|
|
126
|
+
# missing. Minimum number of grid points needed for averaging (1 to len).
|
|
127
|
+
#
|
|
128
|
+
# RETURN VALUE
|
|
129
|
+
# * a GPhys
|
|
130
|
+
#
|
|
131
|
+
def bin_sum(dim, len, nminvalid=1)
|
|
132
|
+
dim = dim_index(dim) # to handle String or negative specification
|
|
133
|
+
GPhys.new( grid.binning(dim, len), data.bin_sum(dim, len, nminvalid) )
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
##### private #########
|
|
137
|
+
def nam2na_missval(nam)
|
|
138
|
+
missval = ( (a=get_att('_FillValue')) ? a[0] : nil ) ||
|
|
139
|
+
( (a=get_att('missing_value')) ? a[0] : nil ) ||
|
|
140
|
+
@@default_missval
|
|
141
|
+
[ nam.to_na(missval), missval ]
|
|
142
|
+
end
|
|
143
|
+
private :nam2na_missval
|
|
144
|
+
|
|
145
|
+
#def convolution(dim, g=nil, bc=BC_SIMPLE)
|
|
146
|
+
#end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
class VArray
|
|
150
|
+
@@default_missval = 9.9692099683868690e+36 # NC_FILL_DOUBLE/FLOAT ~15*2^119
|
|
151
|
+
|
|
152
|
+
def bin_mean(dim, len, nminvalid=1)
|
|
153
|
+
vi = self.val
|
|
154
|
+
if vi.is_a?(NArrayMiss)
|
|
155
|
+
vi, missval = nam2na_missval(vi)
|
|
156
|
+
vo = c_bin_mean(vi,dim,len,missval,nminvalid) # defined in dim_op.c
|
|
157
|
+
vo = NArrayMiss.to_nam(vo, vo.ne(missval) )
|
|
158
|
+
else
|
|
159
|
+
vo = c_bin_mean(vi,dim,len) # defined in dim_op.c
|
|
160
|
+
end
|
|
161
|
+
VArray.new( vo, self, self.name ) # Inherit name & attrs
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def bin_sum(dim, len, nminvalid=1)
|
|
165
|
+
vi = self.val
|
|
166
|
+
if vi.is_a?(NArrayMiss)
|
|
167
|
+
vi, missval = nam2na_missval(vi)
|
|
168
|
+
vo = c_bin_sum(vi,dim,len,missval,nminvalid) # defined in dim_op.c
|
|
169
|
+
vo = NArrayMiss.to_nam(vo, vo.ne(missval) )
|
|
170
|
+
else
|
|
171
|
+
vo = c_bin_sum(vi,dim,len) # defined in dim_op.c
|
|
172
|
+
end
|
|
173
|
+
VArray.new( vo, self, self.name ) # Inherit name & attrs
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
##### private #########
|
|
177
|
+
def nam2na_missval(nam)
|
|
178
|
+
missval = ( (a=get_att('_FillValue')) ? a[0] : nil ) ||
|
|
179
|
+
( (a=get_att('missing_value')) ? a[0] : nil ) ||
|
|
180
|
+
@@default_missval
|
|
181
|
+
[ nam.to_na(missval), missval ]
|
|
182
|
+
end
|
|
183
|
+
private :nam2na_missval
|
|
184
|
+
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
class Grid
|
|
188
|
+
def binning(dim, len)
|
|
189
|
+
dim = dim_index(dim) # to handle String or negative specification
|
|
190
|
+
|
|
191
|
+
#< axes >
|
|
192
|
+
axes = (0...rank).collect{|d| axis(d)}
|
|
193
|
+
axes[dim] = axes[dim].binning(len) # bin the dim-th axis
|
|
194
|
+
newgrid = Grid.new(*axes)
|
|
195
|
+
|
|
196
|
+
#< assoc coords are retained if it does not have the dim >
|
|
197
|
+
if assoc_coords
|
|
198
|
+
dimname = self.axis(dim).name
|
|
199
|
+
acs = Array.new
|
|
200
|
+
assoccoordnames.each do |nm|
|
|
201
|
+
ac = assoc_coord_gphys(nm)
|
|
202
|
+
acs.push(ac) if !ac.dimnames.include?(dimname)
|
|
203
|
+
end
|
|
204
|
+
newgrid.set_assoc_coords(acs) if acs.length > 0
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
#< return >
|
|
208
|
+
newgrid
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
class Axis
|
|
213
|
+
def binning(len)
|
|
214
|
+
if cell? && cell_center?
|
|
215
|
+
c = cell_center.bin_mean(0,len)
|
|
216
|
+
b = cell_bounds[ {0..-1=>len} ]
|
|
217
|
+
newax = Axis.new(true).set_cell(c,b)
|
|
218
|
+
newax = axcel.dup.set_pos_to_center
|
|
219
|
+
else
|
|
220
|
+
newax = Axis.new().set_pos( pos.bin_mean(0,len) )
|
|
221
|
+
end
|
|
222
|
+
newax
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
######################################################
|
|
228
|
+
## < test >
|
|
229
|
+
if $0 == __FILE__
|
|
230
|
+
require 'test/unit'
|
|
231
|
+
|
|
232
|
+
class TC_GPhys_grid_op < Test::Unit::TestCase
|
|
233
|
+
include NumRu
|
|
234
|
+
def setup
|
|
235
|
+
nx = 11
|
|
236
|
+
ny = 5
|
|
237
|
+
vx = VArray.new( NArray.float(nx).indgen! ).rename("x")
|
|
238
|
+
vy = VArray.new( NArray.float(ny).indgen! ).rename("y")
|
|
239
|
+
xax = Axis.new().set_pos(vx)
|
|
240
|
+
yax = Axis.new().set_pos(vy)
|
|
241
|
+
grid = Grid.new(xax, yax)
|
|
242
|
+
z = VArray.new( na = NArray.float(nx, ny).indgen! % 5, nil, "z" )
|
|
243
|
+
zu = VArray.new( NArray.float(nx, ny).fill(3.0), nil, "z" )
|
|
244
|
+
|
|
245
|
+
@gp = GPhys.new(grid,z)
|
|
246
|
+
@gpu = GPhys.new(grid,zu)
|
|
247
|
+
|
|
248
|
+
nam = NArrayMiss.to_nam(na)
|
|
249
|
+
nam.invalidation(1,1)
|
|
250
|
+
nam.invalidation(2,2)
|
|
251
|
+
(1..4).each{|i| nam.invalidation(i,3)}
|
|
252
|
+
zm = VArray.new( nam, nil, "zm" )
|
|
253
|
+
@gpm = GPhys.new(grid,zm)
|
|
254
|
+
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
def test_0_0_running_mean
|
|
258
|
+
puts "*** running_mean: basic ***"
|
|
259
|
+
p(v0 = @gp.val)
|
|
260
|
+
|
|
261
|
+
p(v = @gp.running_mean(0,3).val)
|
|
262
|
+
assert_in_delta(v[4,0], 2.33333, 1e-4)
|
|
263
|
+
|
|
264
|
+
p(v = @gp.running_mean(1,3,GPhys::BC_TRIM).val)
|
|
265
|
+
assert_in_delta(v[2,1], 2.33333, 1e-4)
|
|
266
|
+
|
|
267
|
+
p(v = @gpu.running_mean(0,3,GPhys::BC_TRIM).val)
|
|
268
|
+
assert_in_delta(v[0,0], 3.0, 1e-4)
|
|
269
|
+
assert_equal(v.shape[0], v0.shape[0]-2)
|
|
270
|
+
|
|
271
|
+
p(v = @gp[0..9,true].running_mean(0,5,GPhys::BC_CYCLIC).val)
|
|
272
|
+
assert_in_delta(v[0,0], 2.0, 1e-4)
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def test_0_1_running_mean
|
|
276
|
+
puts "*** running_mean: weight ***"
|
|
277
|
+
wgt = NArray[1.0, 2.0, 1.0]
|
|
278
|
+
p @gp.val
|
|
279
|
+
p(v = @gp.running_mean(0,wgt).val)
|
|
280
|
+
assert_in_delta(v[4,0], (3.0+4.0*2)/4, 1e-4)
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
def test_0_2_running_mean
|
|
284
|
+
puts "*** running_mean: with data missing ***"
|
|
285
|
+
p @gpm.val
|
|
286
|
+
p(v = @gpm.running_mean(0,3).val)
|
|
287
|
+
assert_in_delta(v[2,2], 1.5, 1e-4)
|
|
288
|
+
assert(v[2,3] > 1e30) # missing value
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
def test_1_0_bin_mean
|
|
292
|
+
puts "*** bin_mean ***"
|
|
293
|
+
p @gp.val
|
|
294
|
+
b = @gp.bin_mean(0,3)
|
|
295
|
+
v = b.val
|
|
296
|
+
p v, b.coord(0).val, b.coord(1).val
|
|
297
|
+
assert_in_delta(b.val[1,1], 5.0/3.0, 1e-4)
|
|
298
|
+
assert_in_delta(b.coord(0).val[1], 4.0, 1e-4)
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
def test_1_1_bin_mean
|
|
302
|
+
puts "*** bin_mean: with data missing ***"
|
|
303
|
+
p @gpm.val
|
|
304
|
+
b = @gpm.bin_mean(0,3,2)
|
|
305
|
+
v = b.val
|
|
306
|
+
p v, b.coord(0).val, b.coord(1).val
|
|
307
|
+
assert_in_delta(v[0,2], 2.5, 1e-4)
|
|
308
|
+
assert(v[0,3] > 1e30) # missing value
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
def test_2_0_bin_sum
|
|
312
|
+
puts "*** bin_sum ***"
|
|
313
|
+
p @gp.val
|
|
314
|
+
b = @gp.bin_sum(0,3)
|
|
315
|
+
v = b.val
|
|
316
|
+
p v, b.coord(0).val, b.coord(1).val
|
|
317
|
+
assert_in_delta(b.val[1,1], 5.0, 1e-4)
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
def test_2_1_bin_sum
|
|
321
|
+
puts "*** bin_sum: with data missing ***"
|
|
322
|
+
p @gpm.val
|
|
323
|
+
b = @gpm.bin_sum(0,3,2)
|
|
324
|
+
v = b.val
|
|
325
|
+
p v, b.coord(0).val, b.coord(1).val
|
|
326
|
+
assert_in_delta(v[0,2], 5.0, 1e-4)
|
|
327
|
+
assert(v[0,3] > 1e30) # missing value
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
end
|
|
331
|
+
end
|
|
@@ -439,6 +439,8 @@ module NumRu
|
|
|
439
439
|
else
|
|
440
440
|
val = val.to_na
|
|
441
441
|
end
|
|
442
|
+
elsif val.is_a?(NArrayMiss) && val.count_invalid == 0
|
|
443
|
+
val = val.to_na
|
|
442
444
|
end
|
|
443
445
|
fcoef = FFTW3.fft( val, dir, *dims )
|
|
444
446
|
else
|
|
@@ -454,6 +456,8 @@ module NumRu
|
|
|
454
456
|
else
|
|
455
457
|
val = val.to_na
|
|
456
458
|
end
|
|
459
|
+
elsif val.is_a?(NArrayMiss) && val.count_invalid == 0
|
|
460
|
+
val = val.to_na
|
|
457
461
|
end
|
|
458
462
|
fcoef = FFTW.fftw( val, dir )
|
|
459
463
|
end
|
|
@@ -498,6 +502,30 @@ module NumRu
|
|
|
498
502
|
gfc
|
|
499
503
|
end
|
|
500
504
|
|
|
505
|
+
def fft_deriv(dim)
|
|
506
|
+
tp = self.data.typecode
|
|
507
|
+
fc = self.fft(false,dim)
|
|
508
|
+
wn = fc.coord(dim)
|
|
509
|
+
k = wn.val.to_type(NArray::Complex)
|
|
510
|
+
n = k.length
|
|
511
|
+
n2a = (n-1)/2
|
|
512
|
+
n2b = [n/2 + 1, n-1].min # min to avoid error if n=2 (though meaningless)
|
|
513
|
+
kmx = k[-1]+k[1]
|
|
514
|
+
ik = NArray.complex(n)
|
|
515
|
+
ik[0..n2a] = k[0..n2a]*Complex::I
|
|
516
|
+
ik[n2b..-1] = (k[n2b..-1]-kmx) * Complex::I
|
|
517
|
+
dim.times{ik.newdim!(0)}
|
|
518
|
+
(self.rank-dim-1).times{ik.newdim!(-1)}
|
|
519
|
+
fc.replace_val(fc.val*ik)
|
|
520
|
+
deriv = fc.fft(true,dim)
|
|
521
|
+
deriv.units = deriv.units * wn.units
|
|
522
|
+
if tp >= NArray::SCOMPLEX
|
|
523
|
+
deriv
|
|
524
|
+
else
|
|
525
|
+
deriv.real
|
|
526
|
+
end
|
|
527
|
+
end
|
|
528
|
+
|
|
501
529
|
def __predefined_coord_units_conversion(coord)
|
|
502
530
|
case coord.units
|
|
503
531
|
when Units["degree"]
|
|
@@ -766,9 +794,9 @@ if $0 == __FILE__
|
|
|
766
794
|
include NMath
|
|
767
795
|
|
|
768
796
|
# < make a GPhys from scratch >
|
|
769
|
-
vx = VArray.new( NArray.float(11).indgen! * (
|
|
797
|
+
vx = VArray.new( NArray.float(11).indgen! * (2*Math::PI/11) ).rename("x")
|
|
770
798
|
vx.units = 'km'
|
|
771
|
-
vy = VArray.new( NArray.float(8).indgen! * (
|
|
799
|
+
vy = VArray.new( NArray.float(8).indgen! * (2*Math::PI/8) ).rename("y")
|
|
772
800
|
vy.units = 'km'
|
|
773
801
|
xax = Axis.new().set_pos(vx)
|
|
774
802
|
#yax = Axis.new(true).set_cell_guess_bounds(vy).set_pos_to_center
|
|
@@ -880,6 +908,24 @@ if $0 == __FILE__
|
|
|
880
908
|
gpf = gp.phase_velocity_filter(0, 2, -0.3, -0.01, 1/kconv, 1/fconv)
|
|
881
909
|
GGraph::tone gpf[true,0,true],true,"color_bar"=>true
|
|
882
910
|
|
|
911
|
+
###
|
|
912
|
+
grid = Grid.new(xax, yax)
|
|
913
|
+
a = NArray.float(vx.length, vy.length)
|
|
914
|
+
a[] = sin(2*vx.val.newdim(1)) * cos(vy.val.newdim(0))
|
|
915
|
+
v = VArray.new( a )
|
|
916
|
+
v.units = 'm/s'
|
|
917
|
+
gpz = GPhys.new(grid,v)
|
|
918
|
+
|
|
919
|
+
dim = 0
|
|
920
|
+
x = gpz.coord(dim)
|
|
921
|
+
gp_x = gpz.fft_deriv(dim)
|
|
922
|
+
p gp_x
|
|
923
|
+
dim = 1
|
|
924
|
+
gp_y = gpz.fft_deriv(dim)
|
|
925
|
+
p gp_y
|
|
926
|
+
GGraph::tone gpz,true,"color_bar"=>true
|
|
927
|
+
GGraph::tone gp_x,true,"color_bar"=>true
|
|
928
|
+
GGraph::tone gp_y,true,"color_bar"=>true
|
|
883
929
|
|
|
884
930
|
DCL.grcls
|
|
885
931
|
end
|
data/lib/numru/gphys/gphys_io.rb
CHANGED
|
@@ -7,6 +7,7 @@ begin
|
|
|
7
7
|
require "numru/gphys/gphys_hdfeos5_io"
|
|
8
8
|
rescue LoadError
|
|
9
9
|
end
|
|
10
|
+
require "numru/gphys/mdstorage" # for regexp2files
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
=begin
|
|
@@ -24,8 +25,66 @@ For example, (('GPhys::IO.open(file, name)')) simply calls
|
|
|
24
25
|
|
|
25
26
|
==Module functions
|
|
26
27
|
|
|
27
|
-
---open(
|
|
28
|
+
---open(file, varname)
|
|
29
|
+
Opens a GPhys in (({file})) having the name (({varname})).
|
|
30
|
+
|
|
31
|
+
ARGUMENTS
|
|
32
|
+
* file (String, NetCDF, GRIB,.. etc, or Array, NArray, Regexp) :
|
|
33
|
+
Specifies the file. Path if String; a File pointer if NetCDF etc..
|
|
34
|
+
The processing is forwarded to (('open_multi')), if this argument is
|
|
35
|
+
an Array, NArray, or Regexp.
|
|
36
|
+
* varname (String) : name of the variable
|
|
37
|
+
|
|
38
|
+
RETURN VALUE
|
|
39
|
+
* a GPhys
|
|
40
|
+
|
|
41
|
+
---open_multi(files, varname)
|
|
42
|
+
Opens a GPhys by combining a variable across multiple files.
|
|
43
|
+
It initializes GPhys objects over the files by calling (('open')) and
|
|
44
|
+
unites them into a single GPhys object by using (({GPhys.join})) or
|
|
45
|
+
(({GPhys.join_md})).
|
|
46
|
+
|
|
47
|
+
ARGUMENTS
|
|
48
|
+
* files (Array, NArray (NArray.object), or Regexp) : Specifies the files.
|
|
49
|
+
* when Array, it must consist of paths or file pointers
|
|
50
|
+
(that are accepted by (('open'))).
|
|
51
|
+
All coordinates of the variable in the files are scanned,
|
|
52
|
+
and a joined object is constructed properly.
|
|
53
|
+
Thus, you can simply put subsets of a 2D tiling in a simple
|
|
54
|
+
non-nested 1D Array. (({GPhys.join})) is used in this case.
|
|
55
|
+
* when NArray, it must consist of paths or file pointers
|
|
56
|
+
(that are accepted by (('open'))).
|
|
57
|
+
Each dimension with multiple elements must correspond
|
|
58
|
+
to a dimension along which joining is made.
|
|
59
|
+
For example, a 2D tiling can be specified as
|
|
60
|
+
files = NArray.to_na([['f00.nc','f10.nc'],['f01.nc','f11.nc']])
|
|
61
|
+
gp = GPhys::IO.open_multi( files, "f" )
|
|
62
|
+
(({GPhys.join_md})) is used in this case.
|
|
63
|
+
* When Regexp, similar to when NArray, but expresses the paths.
|
|
64
|
+
The dimensions to join is specified by "captures"
|
|
65
|
+
(parentheses). For example, the above 2D tiling can be specified as
|
|
66
|
+
files = /f(\d)(\d).nc/
|
|
67
|
+
gp = GPhys::IO.open_multi( files, "f" )
|
|
68
|
+
The regexp can contain a directory path (e.g., /dir\/sub\/f(\d)(d).nc/),
|
|
69
|
+
but the directory part must be unique (i.e., a simple string),
|
|
70
|
+
so only a single directly can be specified. All captures must
|
|
71
|
+
be in the part representing the file names (in the directory).
|
|
72
|
+
(({GPhys.join_md})) is used in this case.
|
|
73
|
+
* varname (String) : name of the variable
|
|
74
|
+
|
|
75
|
+
RETURN VALUE
|
|
76
|
+
* a GPhys
|
|
77
|
+
|
|
28
78
|
---write(file, gphys, name=nil)
|
|
79
|
+
Writes a GPhys object in a file
|
|
80
|
+
|
|
81
|
+
ARGUMENTS
|
|
82
|
+
* file (NetCDF, GRIB,.. etc) : the file. Writing must be permitted.
|
|
83
|
+
To close (finalize) it after writing is left to the user.
|
|
84
|
+
* gphys (GPhys) : the GPhys object to write
|
|
85
|
+
* name (String; optional) : if specified, this name is used in the file
|
|
86
|
+
rather than the name of gphys
|
|
87
|
+
|
|
29
88
|
---write_grid(file, grid_or_gphys)
|
|
30
89
|
---each_along_dims_write(gphyses, files, *loopdims){...} # a block is expected
|
|
31
90
|
---var_names(file)
|
|
@@ -36,15 +95,13 @@ For example, (('GPhys::IO.open(file, name)')) simply calls
|
|
|
36
95
|
Figures out the file type supported in this module.
|
|
37
96
|
|
|
38
97
|
ARGUMENTS
|
|
39
|
-
* file (String,
|
|
98
|
+
* file (String, NetCDF, Grib, or GrADS_Gridded) :
|
|
40
99
|
What to return is of course obvious if it is
|
|
41
100
|
NetCDF, Grib, or GrADS_Gridded. If it is a String,
|
|
42
101
|
it is assumed to be a path of a file, and the file type
|
|
43
102
|
is determined by its suffix when 'nc', 'ctl', or 'grib';
|
|
44
103
|
In other cases, the type is figured out by reading in
|
|
45
|
-
a few bytes from the beginning.
|
|
46
|
-
a NetCDF is assumed, since only NetCDF_IO.open supports
|
|
47
|
-
Regexp.
|
|
104
|
+
a few bytes from the beginning.
|
|
48
105
|
|
|
49
106
|
RETURN VALUE
|
|
50
107
|
* GPhys::IO::NETCDF, GPhys::IO::GRIB, or GPhys::IO::GRADS,
|
|
@@ -127,7 +184,49 @@ module NumRu
|
|
|
127
184
|
|
|
128
185
|
## // module functions to be defined in specific IO modules -->
|
|
129
186
|
def open(file, varname)
|
|
130
|
-
|
|
187
|
+
case file
|
|
188
|
+
when Array, NArray, Regexp
|
|
189
|
+
open_multi(file, varname)
|
|
190
|
+
else
|
|
191
|
+
file2specific_module(file)::open(file, varname)
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def open_multi(files, varname)
|
|
196
|
+
case files
|
|
197
|
+
when Array
|
|
198
|
+
GPhys.join( files.collect{|f| open(f,varname)} )
|
|
199
|
+
when NArray
|
|
200
|
+
GPhys.join_md( files.collect{|f| open(f,varname)} )
|
|
201
|
+
when Regexp
|
|
202
|
+
GPhys.join_md( regexp2files(files).collect{|f| open(f,varname)} )
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def regexp2files( pat )
|
|
207
|
+
if /^(.*)\\?\/(.*)$/ =~ (pat.source)
|
|
208
|
+
d=$1
|
|
209
|
+
f=$2
|
|
210
|
+
dir = d.gsub(/\\/,'') + '/'
|
|
211
|
+
pat = Regexp.new(f)
|
|
212
|
+
else
|
|
213
|
+
dir = './'
|
|
214
|
+
end
|
|
215
|
+
flstore = MDStorage.new(1)
|
|
216
|
+
lbs = Array.new
|
|
217
|
+
Dir.open(dir).each do |fn|
|
|
218
|
+
if pat =~ fn
|
|
219
|
+
raise(ArgumentError,"has no capture; need one or more") if $1.nil?
|
|
220
|
+
idx = Array.new
|
|
221
|
+
Regexp.last_match.captures.each_with_index{|lb,i|
|
|
222
|
+
flstore.add_dim if flstore.rank == i # rank smaller by 1 -> add
|
|
223
|
+
lbs[i] = Array.new if lbs[i].nil?
|
|
224
|
+
idx.push( lbs[i].index(lb) || lbs[i].push(lb) && lbs[i].length-1 )
|
|
225
|
+
}
|
|
226
|
+
flstore[*idx] = NetCDF.open(dir+fn)
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
flstore.to_na
|
|
131
230
|
end
|
|
132
231
|
|
|
133
232
|
def write(file, gphys, name=nil)
|
|
@@ -203,8 +302,6 @@ module NumRu
|
|
|
203
302
|
return NUSDAS
|
|
204
303
|
when Gtool3
|
|
205
304
|
return GTOOL3
|
|
206
|
-
when Regexp
|
|
207
|
-
return NETCDF # So far, only NetCDF_IO supports Regexp.
|
|
208
305
|
when *@@nc_pattern
|
|
209
306
|
return NETCDF
|
|
210
307
|
when *@@grad_pattern
|
|
@@ -215,7 +312,7 @@ module NumRu
|
|
|
215
312
|
return NUSDAS
|
|
216
313
|
when String
|
|
217
314
|
return NETCDF if /^http:\/\// =~ file # assume a DODS URL
|
|
218
|
-
|
|
315
|
+
raise ArgumentError, "File not found: #{file}" unless File.exist?(file)
|
|
219
316
|
return NETCDF if NetCDF_IO.is_a_NetCDF?(file)
|
|
220
317
|
return GRADS if GrADS_IO.is_a_GrADS?(file)
|
|
221
318
|
return GRIB if Grib_IO.is_a_Grib?(file)
|
|
@@ -232,6 +329,8 @@ module NumRu
|
|
|
232
329
|
return He5 if HE5_IO.is_a_HE5?(file)
|
|
233
330
|
end
|
|
234
331
|
end
|
|
332
|
+
raise "cannot specify the file type of \""+ file + \
|
|
333
|
+
"\"; maybe unsupported format."
|
|
235
334
|
return nil
|
|
236
335
|
end
|
|
237
336
|
|
|
@@ -289,6 +388,13 @@ module NumRu
|
|
|
289
388
|
raise "invalid URL: '[@|/]' between path & variable is not found\n\n" +
|
|
290
389
|
"URL format: " + GTURLfmt
|
|
291
390
|
end
|
|
391
|
+
if /[\*\?]/ =~ file ## match file names if wildcard expression included.
|
|
392
|
+
raise "\n Any files did not match the given expression: \""+file+\
|
|
393
|
+
"\" \n" if Dir[file].empty?
|
|
394
|
+
file = Dir[file].sort
|
|
395
|
+
elsif (!File.exist?(file))
|
|
396
|
+
raise "File specified by gturl \"#{gturl}\" was not found"
|
|
397
|
+
end
|
|
292
398
|
if /,/ =~ var
|
|
293
399
|
slice = Hash.new
|
|
294
400
|
cut_slice = Hash.new
|
|
@@ -328,18 +434,66 @@ module NumRu
|
|
|
328
434
|
cut_slice = nil
|
|
329
435
|
thinning = nil
|
|
330
436
|
end
|
|
437
|
+
if /[\*\?]/ =~ var ## match var names if wildcard expression included.
|
|
438
|
+
var_reg = var.gsub("*",".*").gsub("?",".") # convert to regular exp.
|
|
439
|
+
case file
|
|
440
|
+
when String
|
|
441
|
+
vars = GPhys::IO.var_names_except_coordinates(file)
|
|
442
|
+
when Array
|
|
443
|
+
vars_t = file.collect{|f| GPhys::IO.var_names_except_coordinates(f)}
|
|
444
|
+
vars = vars_t.flatten.uniq
|
|
445
|
+
end
|
|
446
|
+
vars_matched = vars.select{|v| v.match(/#{var_reg}/)}
|
|
447
|
+
if (vars_matched.empty?)
|
|
448
|
+
raise "\n Any variables in \"#{file}\" did not match the given
|
|
449
|
+
expression: \"#{var}\".\n Included variable(s): #{vars.join(", ")}."
|
|
450
|
+
end
|
|
451
|
+
# put the variable name by String if the number of matched variable is
|
|
452
|
+
# one, otherwise by Array of Strings.
|
|
453
|
+
var = vars_matched.length == 1 ? vars_matched[0] : vars_matched
|
|
454
|
+
end
|
|
331
455
|
[file, var, slice, cut_slice, thinning]
|
|
332
456
|
end # def parse_gturl
|
|
333
457
|
|
|
334
458
|
def open_gturl(gturl)
|
|
335
459
|
file, var, slice, cut_slice, thinning = GPhys::IO.parse_gturl(gturl)
|
|
336
|
-
|
|
460
|
+
if var.is_a?(Array)
|
|
461
|
+
raise "This method treats a gturl of a single GPhys object. " +
|
|
462
|
+
"Use open_multi_gturl to treat a gturl of multiple objects."
|
|
463
|
+
end
|
|
464
|
+
gp = GPhys::IO.open(file,var)
|
|
337
465
|
gp = gp[slice] if slice
|
|
338
466
|
gp = gp.cut(cut_slice) if cut_slice
|
|
339
467
|
gp = gp[thinning] if thinning
|
|
340
468
|
gp
|
|
341
469
|
end # def open_gturl
|
|
342
470
|
|
|
471
|
+
def open_multi_gturl(gturl)
|
|
472
|
+
files, vars, slice, cut_slice, thinning = GPhys::IO.parse_gturl(gturl)
|
|
473
|
+
vars = [vars] unless vars.is_a?(Array)
|
|
474
|
+
gp_array = Array.new
|
|
475
|
+
vars.each do |v|
|
|
476
|
+
begin
|
|
477
|
+
gps = [ GPhys::IO.open(files,v) ] # opened as a single GPhys
|
|
478
|
+
rescue ArgumentError
|
|
479
|
+
if files.is_a?(Array)
|
|
480
|
+
# gturl may designate multiple GPhys objects
|
|
481
|
+
gps = files.collect{|f| gp = GPhys::IO.open(f,v) }
|
|
482
|
+
else
|
|
483
|
+
raise $! # it must have been a real error
|
|
484
|
+
end
|
|
485
|
+
end
|
|
486
|
+
gp_array += gps
|
|
487
|
+
end
|
|
488
|
+
gp_array.map!{|gp|
|
|
489
|
+
gp = gp[slice] if slice
|
|
490
|
+
gp = gp.cut(cut_slice) if cut_slice
|
|
491
|
+
gp = gp[thinning] if thinning
|
|
492
|
+
gp
|
|
493
|
+
}
|
|
494
|
+
gp_array
|
|
495
|
+
end # def open_multi_gturl
|
|
496
|
+
|
|
343
497
|
def str2gphys(str)
|
|
344
498
|
|
|
345
499
|
case str
|
|
@@ -387,7 +541,6 @@ if $0 == __FILE__
|
|
|
387
541
|
puts "\n** test str2gphys **\n"
|
|
388
542
|
p GPhys::IO.str2gphys("../../../testdata/T.jan.nc/T")
|
|
389
543
|
p GPhys::IO.str2gphys("../../../testdata/T.jan.nc")
|
|
390
|
-
exit
|
|
391
544
|
|
|
392
545
|
puts "\n** test NETCDF **\n"
|
|
393
546
|
|
|
@@ -417,7 +570,7 @@ if $0 == __FILE__
|
|
|
417
570
|
GPhys::IO.write(file2,temp_edy)
|
|
418
571
|
file2.close
|
|
419
572
|
file3 = NetCDF.create('tmp2.nc')
|
|
420
|
-
GPhys::IO.write(
|
|
573
|
+
GPhys::IO.write(file3,temp_xmean)
|
|
421
574
|
file3.close
|
|
422
575
|
|
|
423
576
|
p '** test each_along_dims* **'
|
|
@@ -465,7 +618,82 @@ if $0 == __FILE__
|
|
|
465
618
|
GPhys::IO.write(file2,temp_edy)
|
|
466
619
|
file2.close
|
|
467
620
|
file3 = NetCDF.create('tmp2.nc')
|
|
468
|
-
GPhys::IO.write(
|
|
621
|
+
GPhys::IO.write(file3,temp_xmean)
|
|
469
622
|
file3.close
|
|
470
623
|
|
|
624
|
+
puts "\n** test open_multi (1) **"
|
|
625
|
+
# preparation...
|
|
626
|
+
gp = GPhys::IO.open("../../../testdata/T.jan.nc","T")
|
|
627
|
+
GPhys::IO.write(f=NetCDF.create('tmp_z0.nc'),gp[false,0..4]); f.close
|
|
628
|
+
GPhys::IO.write(f=NetCDF.create('tmp_z1.nc'),gp[false,5..-1]); f.close
|
|
629
|
+
|
|
630
|
+
# test...
|
|
631
|
+
gpm = GPhys::IO.open(['tmp_z1.nc','tmp_z0.nc'],"T")
|
|
632
|
+
gp.val == gpm.val ? puts("Test OK") : raise("Test failed")
|
|
633
|
+
|
|
634
|
+
gpm = GPhys::IO.open(/tmp_z(\d).nc/,"T")
|
|
635
|
+
gp.val == gpm.val ? puts("Test OK") : raise("Test failed")
|
|
636
|
+
|
|
637
|
+
puts "\n** test open_multi (2) **"
|
|
638
|
+
# preparation...
|
|
639
|
+
gp = GPhys::IO.open("../../../testdata/T.jan.nc","T")
|
|
640
|
+
GPhys::IO.write(f=NetCDF.create('tmp00.nc'), gp[0..20, 0..8, true]); f.close
|
|
641
|
+
GPhys::IO.write(f=NetCDF.create('tmp10.nc'), gp[21..-1,0..8, true]); f.close
|
|
642
|
+
GPhys::IO.write(f=NetCDF.create('tmp01.nc'), gp[0..20, 9..-1,true]); f.close
|
|
643
|
+
GPhys::IO.write(f=NetCDF.create('tmp11.nc'), gp[21..-1,9..-1,true]); f.close
|
|
644
|
+
|
|
645
|
+
# test...
|
|
646
|
+
files = NArray.to_na([['tmp00.nc','tmp10.nc'],['tmp01.nc','tmp11.nc']])
|
|
647
|
+
gpm = GPhys::IO.open(files,"T")
|
|
648
|
+
gp.val == gpm.val ? puts("Test OK") : raise("Test failed")
|
|
649
|
+
|
|
650
|
+
gpm = GPhys::IO.open(files.transpose(1,0),"T") # fine even if tranposed
|
|
651
|
+
gp.val == gpm.val ? puts("Test OK") : raise("Test failed")
|
|
652
|
+
|
|
653
|
+
files = /tmp(\d)(\d).nc/
|
|
654
|
+
gpm = GPhys::IO.open(files,"T")
|
|
655
|
+
gp.val == gpm.val ? puts("Test OK") : raise("Test failed")
|
|
656
|
+
|
|
657
|
+
# test open_gturl
|
|
658
|
+
|
|
659
|
+
puts "** test open_gturl **"
|
|
660
|
+
sh = GPhys::IO.open_gturl('tmp[01]?.nc@T,lon=20:40,level=1000,lat=0').shape
|
|
661
|
+
sh == [3] ? puts("Test OK") : raise("Test failed")
|
|
662
|
+
|
|
663
|
+
# test open_multi_gturl
|
|
664
|
+
|
|
665
|
+
puts "** test open_multi_gturl **"
|
|
666
|
+
|
|
667
|
+
f=NetCDF.open('tmp11.nc','a')
|
|
668
|
+
f.redef
|
|
669
|
+
GPhys::IO.write(f, gp[21..-1,9..-1,true].copy.rename("R") )
|
|
670
|
+
f.close
|
|
671
|
+
|
|
672
|
+
str = GPhys::IO.open_multi_gturl('tmp[01]?.nc@T').inspect + "\n"
|
|
673
|
+
str += GPhys::IO.open_multi_gturl('tmpE*.nc@T').inspect + "\n"
|
|
674
|
+
str += GPhys::IO.open_multi_gturl('tmp11.nc@*').inspect + "\n"
|
|
675
|
+
|
|
676
|
+
str2comp =<<EOS
|
|
677
|
+
[<NumRu::GPhys grid=<3D grid <axis pos=<NumRu::VArrayComposite shape=[36] #_of_tiles=[2]>>
|
|
678
|
+
<axis pos=<NumRu::VArrayComposite shape=[19] #_of_tiles=[2]>>
|
|
679
|
+
<axis pos=<'level' in 'tmp00.nc' sfloat[9]>>>
|
|
680
|
+
data=<NumRu::VArrayComposite shape=[36, 19, 9] #_of_tiles=[2, 2, 1]>>]
|
|
681
|
+
[<NumRu::GPhys grid=<2D grid <axis pos=<'lat' in 'tmpE0.nc' sfloat[19]>>
|
|
682
|
+
<axis pos=<'level' in 'tmpE0.nc' sfloat[9]>>>
|
|
683
|
+
data=<'T' in 'tmpE0.nc' sfloat[19, 9]>>, <NumRu::GPhys grid=<2D grid <axis pos=<'lat' in 'tmpE1.nc' sfloat[19]>>
|
|
684
|
+
<axis pos=<'level' in 'tmpE1.nc' sfloat[9]>>>
|
|
685
|
+
data=<'T' in 'tmpE1.nc' sfloat[19, 9]>>, <NumRu::GPhys grid=<2D grid <axis pos=<'lat' in 'tmpE2.nc' sfloat[19]>>
|
|
686
|
+
<axis pos=<'level' in 'tmpE2.nc' sfloat[9]>>>
|
|
687
|
+
data=<'T' in 'tmpE2.nc' sfloat[19, 9]>>]
|
|
688
|
+
[<NumRu::GPhys grid=<3D grid <axis pos=<'lon' in 'tmp11.nc' sfloat[15]>>
|
|
689
|
+
<axis pos=<'lat' in 'tmp11.nc' sfloat[10]>>
|
|
690
|
+
<axis pos=<'level' in 'tmp11.nc' sfloat[9]>>>
|
|
691
|
+
data=<'T' in 'tmp11.nc' sfloat[15, 10, 9]>>, <NumRu::GPhys grid=<3D grid <axis pos=<'lon' in 'tmp11.nc' sfloat[15]>>
|
|
692
|
+
<axis pos=<'lat' in 'tmp11.nc' sfloat[10]>>
|
|
693
|
+
<axis pos=<'level' in 'tmp11.nc' sfloat[9]>>>
|
|
694
|
+
data=<'R' in 'tmp11.nc' sfloat[15, 10, 9]>>]
|
|
695
|
+
EOS
|
|
696
|
+
|
|
697
|
+
str == str2comp ? puts("Test OK") : raise("Test failed")
|
|
698
|
+
|
|
471
699
|
end
|