gphys 1.1.1a
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +1777 -0
- data/LICENSE.txt +34 -0
- data/README +33 -0
- data/Rakefile +57 -0
- data/TODO_ep_flux +6 -0
- data/bin/gdir_client +27 -0
- data/bin/gdir_server +129 -0
- data/bin/gpaop +146 -0
- data/bin/gpcat +148 -0
- data/bin/gpcut +102 -0
- data/bin/gpedit +228 -0
- data/bin/gplist +68 -0
- data/bin/gpmath +120 -0
- data/bin/gpmaxmin +128 -0
- data/bin/gpprint +60 -0
- data/bin/gpvect +706 -0
- data/bin/gpview +704 -0
- data/bin/grads2nc_with_gphys +61 -0
- data/doc/attribute.html +19 -0
- data/doc/attributenetcdf.html +15 -0
- data/doc/axis.html +376 -0
- data/doc/coordmapping.html +111 -0
- data/doc/coordtransform.html +36 -0
- data/doc/derivative/gphys-derivative.html +80 -0
- data/doc/derivative/index.html +21 -0
- data/doc/derivative/index.rd +14 -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/math-doc/document.pdf +0 -0
- data/doc/derivative/math-doc/document.tex +158 -0
- data/doc/derivative/numru-derivative.html +129 -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/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/ep_flux/math-doc/document.pdf +0 -0
- data/doc/ep_flux/math-doc/document.tex +2018 -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 +1615 -0
- data/doc/gpcat.html +44 -0
- data/doc/gpcut.html +41 -0
- data/doc/gphys.html +532 -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 +120 -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 +51 -0
- data/doc/gpmaxmin.html +31 -0
- data/doc/gpprint.html +34 -0
- data/doc/gpview.html +270 -0
- data/doc/grads2nc_with_gphys.html +21 -0
- data/doc/grads_gridded.html +307 -0
- data/doc/grib.html +144 -0
- data/doc/grid.html +212 -0
- data/doc/index.html +133 -0
- data/doc/index.rd +127 -0
- data/doc/netcdf_convention.html +136 -0
- data/doc/unumeric.html +176 -0
- data/doc/update +64 -0
- data/doc/varray.html +299 -0
- data/doc/varraycomposite.html +67 -0
- data/ext_coord.c +209 -0
- data/ext_init.c +7 -0
- data/extconf.rb +42 -0
- data/install.rb +130 -0
- data/interpo.c +497 -0
- data/lib/numru/dcl_mouse.rb +71 -0
- data/lib/numru/dclext_datetime_ax.rb +220 -0
- data/lib/numru/derivative.rb +348 -0
- data/lib/numru/ganalysis/covariance.rb +154 -0
- data/lib/numru/ganalysis/eof.rb +298 -0
- data/lib/numru/ganalysis/histogram.rb +252 -0
- data/lib/numru/ganalysis/met.rb +317 -0
- data/lib/numru/ganalysis/planet.rb +182 -0
- data/lib/numru/ganalysis.rb +7 -0
- data/lib/numru/gdir.rb +1038 -0
- data/lib/numru/gdir_connect_ftp-like.rb +149 -0
- data/lib/numru/ggraph.rb +5838 -0
- data/lib/numru/ggraph_on_merdional_section.rb +178 -0
- data/lib/numru/gphys/assoccoords.rb +359 -0
- data/lib/numru/gphys/attribute.rb +129 -0
- data/lib/numru/gphys/attributenetcdf.rb +80 -0
- data/lib/numru/gphys/axis.rb +963 -0
- data/lib/numru/gphys/coordmapping.rb +286 -0
- data/lib/numru/gphys/coordtransform.rb +209 -0
- data/lib/numru/gphys/derivative.rb +314 -0
- data/lib/numru/gphys/ep_flux.rb +868 -0
- data/lib/numru/gphys/gpcommon.rb +52 -0
- data/lib/numru/gphys/gphys.rb +1207 -0
- data/lib/numru/gphys/gphys_fft.rb +886 -0
- data/lib/numru/gphys/gphys_grads_io.rb +212 -0
- data/lib/numru/gphys/gphys_grib_io.rb +214 -0
- data/lib/numru/gphys/gphys_gtool3_io.rb +162 -0
- data/lib/numru/gphys/gphys_hdfeos5_io.rb +672 -0
- data/lib/numru/gphys/gphys_io.rb +452 -0
- data/lib/numru/gphys/gphys_io_common.rb +126 -0
- data/lib/numru/gphys/gphys_netcdf_io.rb +800 -0
- data/lib/numru/gphys/gphys_nusdas_io.rb +132 -0
- data/lib/numru/gphys/grads_gridded.rb +1638 -0
- data/lib/numru/gphys/grib.rb +2049 -0
- data/lib/numru/gphys/grib_params.rb +1465 -0
- data/lib/numru/gphys/grid.rb +723 -0
- data/lib/numru/gphys/gtool3.rb +771 -0
- data/lib/numru/gphys/interpolate.rb +854 -0
- data/lib/numru/gphys/narray_ext.rb +34 -0
- data/lib/numru/gphys/netcdf_convention.rb +406 -0
- data/lib/numru/gphys/subsetmapping.rb +332 -0
- data/lib/numru/gphys/unumeric.rb +522 -0
- data/lib/numru/gphys/varray.rb +1109 -0
- data/lib/numru/gphys/varraycomposite.rb +415 -0
- data/lib/numru/gphys/varraygrads.rb +225 -0
- data/lib/numru/gphys/varraygrib.rb +177 -0
- data/lib/numru/gphys/varraygtool3.rb +226 -0
- data/lib/numru/gphys/varrayhdfeos5.rb +451 -0
- data/lib/numru/gphys/varraynetcdf.rb +350 -0
- data/lib/numru/gphys/varraynusdas.rb +59 -0
- data/lib/numru/gphys.rb +9 -0
- data/lib/numru/htdir.rb +170 -0
- data/multibitIO.c +567 -0
- data/sample/cira86_to_nc.rb +122 -0
- data/sample/druby_cli1.rb +21 -0
- data/sample/druby_cli2.rb +34 -0
- data/sample/druby_serv1.rb +30 -0
- data/sample/druby_serv2.rb +64 -0
- data/sample/ep_flux/demo_NCEP_1.rb +48 -0
- data/sample/ep_flux/demo_NCEP_2.rb +57 -0
- data/sample/ep_flux/demo_NCEP_3.rb +81 -0
- data/sample/ggraph_latlon_labelling_dr002690.rb +159 -0
- data/sample/ggraph_mapfit-axes_dr002687.rb +131 -0
- data/sample/map_projection.rb +121 -0
- data/sample/ncep_theta_coord.rb +79 -0
- data/test/eof_slp.rb +28 -0
- data/test/mltbit.dat +0 -0
- data/test/test_ep_flux.rb +533 -0
- data/test/test_multibitIO.rb +19 -0
- data/testdata/T.jan.ctl +12 -0
- data/testdata/T.jan.dat +0 -0
- data/testdata/T.jan.grib +0 -0
- data/testdata/T.jan.nc +0 -0
- data/testdata/T.jan.packed.withmiss.nc +0 -0
- data/testdata/UV.jan.nc +0 -0
- data/testdata/assoc_crds.nc +0 -0
- data/testdata/cira86.dat +1332 -0
- metadata +621 -0
@@ -0,0 +1,868 @@
|
|
1
|
+
require 'narray'
|
2
|
+
require 'numru/gphys/derivative'
|
3
|
+
|
4
|
+
|
5
|
+
############################################################
|
6
|
+
|
7
|
+
=begin
|
8
|
+
=module NumRu::GPhys::EP_Flux in ep_flux.
|
9
|
+
|
10
|
+
==Testprogram
|
11
|
+
Test script path is 'test/test_ep_flux.rb' in expand dir of gphys.tar.gz.
|
12
|
+
|
13
|
+
==Index
|
14
|
+
* ((<module NumRu::GPhys::EP_Flux>))
|
15
|
+
* ((<Functions:>))
|
16
|
+
* ((<ep_full_sphere>))
|
17
|
+
* calculate EP Flux with full set equations on spherical coordinate.
|
18
|
+
* ((<div_sphere>))
|
19
|
+
* calculate divergence on spherical coordinate, Not only for EP Flux!
|
20
|
+
* ((<strm_rmean>))
|
21
|
+
* calculate residual mass stream function in spherical coordinate
|
22
|
+
(it might be good precision, but enough test has not done yet.)
|
23
|
+
* ((<scale_height>))
|
24
|
+
* get the scale height.
|
25
|
+
* ((<scale_height=>))
|
26
|
+
* set the scale height.
|
27
|
+
* ((<radius>))
|
28
|
+
* get the radus of planet.
|
29
|
+
* ((<radius=>))
|
30
|
+
* set the radus of planet.
|
31
|
+
* ((<rot_period>))
|
32
|
+
* get the rotation period of planet.
|
33
|
+
* ((<rot_period=>))
|
34
|
+
* set the rotation period of planet.
|
35
|
+
* ((<g_forces>))
|
36
|
+
* get the gravitational acceleration in surface.
|
37
|
+
* ((<g_forces=>))
|
38
|
+
* set the gravitational acceleration in surface.
|
39
|
+
* ((<p00>))
|
40
|
+
* get the reference surface pressure.
|
41
|
+
* ((<p00=>))
|
42
|
+
* set the reference surface pressure.
|
43
|
+
* ((<cp>))
|
44
|
+
* get the the specific heat at constant pressure of the atmosphere.
|
45
|
+
* ((<cp=>))
|
46
|
+
* set the the specific heat at constant pressure of the atmosphere.
|
47
|
+
* ((<gas_const>))
|
48
|
+
* get the specific heat at constant pressure of the atmosphere.
|
49
|
+
* ((<gas_const=>))
|
50
|
+
* set the specific heat at constant pressure of the atmosphere.
|
51
|
+
* ((<get_constants>))
|
52
|
+
* get the module variables
|
53
|
+
* ((<set_constants>))
|
54
|
+
* set the module variables
|
55
|
+
* ((<make_gphys>))
|
56
|
+
* convert ((<Axis>)) to ((<GPhys>)).
|
57
|
+
* ((<to_w_if_omega>))
|
58
|
+
* convert to velocity if ((<gp>)) is pressure velocity.
|
59
|
+
* ((<to_z_if_pressure>))
|
60
|
+
* convert to altitude if ((<gp>)) is pressure.
|
61
|
+
* ((<to_p_if_altitude>))
|
62
|
+
* convert to pressure if ((<gp>)) is altitude.
|
63
|
+
* ((<to_theta_if_temperature>))
|
64
|
+
* convert to potential temperature of temperature if ((<flag>)) is true.
|
65
|
+
* ((<to_rad_if_deg>))
|
66
|
+
* convert to radian if ((<gp>)) is degrees.
|
67
|
+
* ((<eddy_products>))
|
68
|
+
* calculate eddy flux respect to ((<dimname>)).
|
69
|
+
* ((<remove_0_at_poles>))
|
70
|
+
* set value if the cos(phi) is 0 at poles (phi is latitude).
|
71
|
+
* ((<preparate_for_vector_on_merdional_section>))
|
72
|
+
* preparate for ((<GGraph::vector_on_merdional_section>))
|
73
|
+
in vector_on_merdional_section.rb
|
74
|
+
* ((<Constants:>))
|
75
|
+
* ((<Deriv_methods>))
|
76
|
+
* derivative method names.
|
77
|
+
|
78
|
+
=module NumRu::GPhys::EP_Flux
|
79
|
+
|
80
|
+
Module functions of EP_Flux Operater for GPhys.
|
81
|
+
|
82
|
+
==Functions:
|
83
|
+
|
84
|
+
---ep_full_sphere(gp_u, gp_v, gp_w_or_omega, gp_temp_or_theta, flag_temp_or_theta, xyzdims=[0,1,2])
|
85
|
+
|
86
|
+
Calculate Eliassen-Palm Flux(EP-Flux) from full set equations on the
|
87
|
+
spherical coordinate. this method calculates EP-Flux from 4 GPhys objects,
|
88
|
+
zonal-wind velocity(U), merdional-wind velocity(V), vertical-wind velocity(W)
|
89
|
+
or pressure velocity(Omega), and temperature(T) or potential(Theta)
|
90
|
+
temperature. check the equations on documents.
|
91
|
+
|
92
|
+
Furthermore, Residual mean merdional circulation (0, v*, w*) can be calculated.
|
93
|
+
|
94
|
+
ARGUMENTS
|
95
|
+
* gp_u (GPhys): a GPhys which data is U.
|
96
|
+
* gp_v (GPhys): a GPhys which data is V.
|
97
|
+
* gp_w_or_omega (GPhys): a GPhys which data is W or Omega. if you give
|
98
|
+
gp_omega, convert to W in this method and calculate EP-Flux.
|
99
|
+
* gp_temp_or_theta (GPhys): a GPhys which data is T or Theta.
|
100
|
+
* xyzdims (Array): an Array which represents location of upper gphyses's
|
101
|
+
coordinate. if coordinate configuration is
|
102
|
+
(longitude, latitude, z), then xyzdims = [0, 1, 2].
|
103
|
+
else if coordinate configuration is
|
104
|
+
(z, latitude, longitude), then xyzdims = [2, 1, 0].
|
105
|
+
|
106
|
+
RETURN VALUE
|
107
|
+
* epflx_y (GPhys): EP-Flux y-component. it is on the merdional hoge.
|
108
|
+
* epflx_z (GPhys): EP-Flux z-component.
|
109
|
+
* v_rmean (GPhys): residual zonal mean V.
|
110
|
+
* w_rmean (GPhys): residual zonal mean W.
|
111
|
+
* gp_lat (GPhys): latitude (its units is radian)
|
112
|
+
* gp_z (GPhys): from vertical axis (z)
|
113
|
+
* u_mean (GPhys): zonal-mean U.
|
114
|
+
* theta_mean (GPhys): zonal-mean Theta.
|
115
|
+
* uv_dash (GPhys): zonal mean of zonal-eddy products U and V.
|
116
|
+
* vt_dash (GPhys): zonal mean of zonal-eddy products V and Theta.
|
117
|
+
* uw_dash (GPhys): zonal mean of zonal-eddy products U and W.
|
118
|
+
* dtheta_dz (GPhys): zonal mean Theta derivate with z.
|
119
|
+
|
120
|
+
---div_sphere(gp_y, gp_z)
|
121
|
+
|
122
|
+
Calculate divergence on the spherical coordinate. it is exclusive to in
|
123
|
+
merdional cross section.
|
124
|
+
|
125
|
+
ARGUMENTS
|
126
|
+
* gp_y (GPhys): a GPhys which is merdional component you want to calculate
|
127
|
+
divergence.
|
128
|
+
* gp_z (GPhys): a GPhys which is vertical component you want to calculate
|
129
|
+
divergence.
|
130
|
+
|
131
|
+
RETURN VALUE
|
132
|
+
* gp_div (GPhys): a GPhys which is divergence on the spherical coordinate.
|
133
|
+
|
134
|
+
---set_deriv_method( method_name )
|
135
|
+
|
136
|
+
Set derivative method. methods are defined in ((<GPhys::derivative>)).
|
137
|
+
Now ((<cderiv>)) and ((<threepoint_O2nd_deriv>)) supported
|
138
|
+
|
139
|
+
ARGUMENTS
|
140
|
+
* method_name (String): derivative method name.
|
141
|
+
|
142
|
+
RETURN VALUE
|
143
|
+
* nil
|
144
|
+
|
145
|
+
---deriv( *args )
|
146
|
+
|
147
|
+
Call derivative method defined in ((<GPhys::Derivative>)) refer to
|
148
|
+
((<@@deriv_method>)).
|
149
|
+
|
150
|
+
ARGUMENTS
|
151
|
+
*args : Option for derivative method. Pleaase see ((<GPhys::Derivative>)).
|
152
|
+
|
153
|
+
RETURN VALUE
|
154
|
+
* nil
|
155
|
+
|
156
|
+
---scale_height
|
157
|
+
|
158
|
+
return a value of the scale height on the log-pressure coordinate.
|
159
|
+
default value is "7000 m".
|
160
|
+
|
161
|
+
RETURN VALUE
|
162
|
+
* scale height (UNumeric)
|
163
|
+
|
164
|
+
---scale_height=(h)
|
165
|
+
|
166
|
+
set a value of the scale height on the log-pressure coordinate.
|
167
|
+
|
168
|
+
RETURN VALUE
|
169
|
+
* nil
|
170
|
+
|
171
|
+
---radius
|
172
|
+
|
173
|
+
return a value of the radius of the planet. default value is "6.37E6 m".
|
174
|
+
|
175
|
+
RETURN VALUE
|
176
|
+
* radius (UNumeric)
|
177
|
+
|
178
|
+
---radius=(a)
|
179
|
+
|
180
|
+
set a value of the radius of the planet.
|
181
|
+
|
182
|
+
RETURN VALUE
|
183
|
+
* nil
|
184
|
+
|
185
|
+
---rot_period
|
186
|
+
|
187
|
+
return a value of the rotation period of the planet.
|
188
|
+
default value is "8.64E4 s".
|
189
|
+
|
190
|
+
RETURN VALUE
|
191
|
+
* rotation period (UNumeric)
|
192
|
+
|
193
|
+
---rot_period=(rp)
|
194
|
+
|
195
|
+
set a value of the rotation period of the planet.
|
196
|
+
|
197
|
+
RETURN VALUE
|
198
|
+
* nil
|
199
|
+
|
200
|
+
---g_forces
|
201
|
+
|
202
|
+
return a value of the gravitational acceleration on the surface.
|
203
|
+
default value is "9.81 m/s2".
|
204
|
+
|
205
|
+
RETURN VALUE
|
206
|
+
* rotation period (UNumeric)
|
207
|
+
|
208
|
+
---g_forces=(g)
|
209
|
+
|
210
|
+
set a value of the gravitational acceleration on the surface.
|
211
|
+
|
212
|
+
RETURN VALUE
|
213
|
+
* nil
|
214
|
+
|
215
|
+
---p00
|
216
|
+
|
217
|
+
return a value of the reference surface pressure.
|
218
|
+
default value is "1.0E5 Pa".
|
219
|
+
|
220
|
+
RETURN VALUE
|
221
|
+
* reference surface pressure (UNumeric)
|
222
|
+
|
223
|
+
---p00=(p00)
|
224
|
+
|
225
|
+
set a value of the reference surface pressure.
|
226
|
+
|
227
|
+
RETURN VALUE
|
228
|
+
* nil
|
229
|
+
|
230
|
+
---cp
|
231
|
+
|
232
|
+
return a value of the specific heat at constant pressure of the atmosphere.
|
233
|
+
default value is "1004.0[J.K-1.kg-1]"
|
234
|
+
|
235
|
+
RETURN VALUE
|
236
|
+
* reference surface pressure (UNumeric)
|
237
|
+
|
238
|
+
---cp=(cp)
|
239
|
+
|
240
|
+
set a value of the specific heat at constant pressure of the atmosphere.
|
241
|
+
|
242
|
+
RETURN VALUE
|
243
|
+
* nil
|
244
|
+
|
245
|
+
---gas_const
|
246
|
+
|
247
|
+
return a value of the gas constant divided by molecular mass.
|
248
|
+
default value is "287.0[J.K-1.kg-1]".
|
249
|
+
|
250
|
+
RETURN VALUE
|
251
|
+
* reference surface pressure (UNumeric)
|
252
|
+
|
253
|
+
---gas_const=(r)
|
254
|
+
|
255
|
+
set a value of the gas constant divided by molecular mass.
|
256
|
+
|
257
|
+
RETURN VALUE
|
258
|
+
* nil
|
259
|
+
|
260
|
+
---get_constants
|
261
|
+
|
262
|
+
return values of the scale height, radius, rotation period,
|
263
|
+
gravitational acceleration, reference surface pressure, specific heat,
|
264
|
+
gas constant.
|
265
|
+
|
266
|
+
RETURN VALUE
|
267
|
+
* scale height (UNumeric)
|
268
|
+
* radius (UNumeric)
|
269
|
+
* rotation period (UNumeric)
|
270
|
+
* gravitational acceleration (UNumeric)
|
271
|
+
* reference surface pressure (UNumeric)
|
272
|
+
* specific heat at constant pressure of the atmosphere (UNumeric)
|
273
|
+
* gas constant divided by molecular mass (UNumeric)
|
274
|
+
|
275
|
+
---set_constants(scale_height, radius, rot_period, g_forces, p00, cp, gas_const)
|
276
|
+
|
277
|
+
set values of the scale height, radius, rotation period, and gravitational
|
278
|
+
acceleration.
|
279
|
+
|
280
|
+
ARGUMENTS
|
281
|
+
* scale height (UNumeric)
|
282
|
+
* radius (UNumeric)
|
283
|
+
* rotation period (UNumeric)
|
284
|
+
* gravitational acceleration (UNumeric)
|
285
|
+
* reference surface pressure (UNumeric)
|
286
|
+
* specific heat at constant pressure of the atmosphere (UNumeric)
|
287
|
+
* gas constant divided by molecular mass (UNumeric)
|
288
|
+
|
289
|
+
RETURN VALUE
|
290
|
+
* nil
|
291
|
+
|
292
|
+
---make_gphys(*ax_ary)
|
293
|
+
|
294
|
+
make GPhys objects from Axis or VArray. data components is VArray of
|
295
|
+
((<Axis.pos>)).
|
296
|
+
|
297
|
+
ARGUMENTS
|
298
|
+
* ax_ary (Array): an Array each objects are ((<Axis>)) or ((<VArray>)).
|
299
|
+
|
300
|
+
RETURN VALUE
|
301
|
+
* gp_ary (Array): an Array each objects are ((<GPhys>)).
|
302
|
+
|
303
|
+
---to_w_if_omega(gp, z)
|
304
|
+
|
305
|
+
convert to velocity(W) if ((<gp>)) is pressure velocity(Omega).
|
306
|
+
decide from units ((<gp.data.units>)). if it compatible with "m/s" then
|
307
|
+
deem it ((<W>)), else if "Pa/s" then deem it ((<Omega>)).
|
308
|
+
|
309
|
+
ARGUMENTS
|
310
|
+
* gp(GPhys): a GPhys which data represents velocity or pressure velocity.
|
311
|
+
* z(GPhys): a GPhys which data represents z-coordinate.
|
312
|
+
|
313
|
+
RETURN VALUE
|
314
|
+
* gp_w(GPhys): a GPhys which data represents velocity or pressure velocity
|
315
|
+
|
316
|
+
---to_z_if_pressure(gp)
|
317
|
+
|
318
|
+
convert to altitude(z) if ((<gp>)) is pressure coordinate (p).
|
319
|
+
decide from units ((<gp.data.units>)). if it compatible with "Pa" then
|
320
|
+
deem it (p).
|
321
|
+
|
322
|
+
ARGUMENTS
|
323
|
+
* gp(GPhys): a GPhys which data represents z or pressure coordinate.
|
324
|
+
|
325
|
+
RETURN VALUE
|
326
|
+
* gp_z(GPhys): a GPhys which data represents z-coordinate.
|
327
|
+
|
328
|
+
---to_p_if_altitude(gp)
|
329
|
+
|
330
|
+
convert to pressure(p) if ((<gp>)) is altitude(z).
|
331
|
+
decide from units ((<gp.data.units>)). if it compatible with "m" then
|
332
|
+
deem it (z).
|
333
|
+
|
334
|
+
ARGUMENTS
|
335
|
+
* gp(GPhys): a GPhys which data represents z or pressure coordinate.
|
336
|
+
|
337
|
+
RETURN VALUE
|
338
|
+
* gp_p(GPhys): a GPhys which data represents p-coordinate.
|
339
|
+
|
340
|
+
|
341
|
+
---to_theta_if_temperature(gp_t, z, flag_temp_or_theta=true)
|
342
|
+
|
343
|
+
convert ((<gp>)) to potential temperature(\theta) if
|
344
|
+
((<flag_temp_or_theta>)) is true.
|
345
|
+
|
346
|
+
ARGUMENTS
|
347
|
+
* gp_t(GPhys): a GPhys which data represents potential temperature or
|
348
|
+
temperature.
|
349
|
+
* z(GPhys) : a GPhys which data represents z-coordinate.
|
350
|
+
* flag_temp_or_theta(True or False): a flagment if ((<gp_t>)) convert to.
|
351
|
+
|
352
|
+
RETURN VALUE
|
353
|
+
* gp_theta(GPhys): a GPhys which data represents potential temperature.
|
354
|
+
|
355
|
+
---to_rad_if_deg(gp)
|
356
|
+
|
357
|
+
|
358
|
+
convert to radian if ((<gp.data.units>)) is degrees.
|
359
|
+
|
360
|
+
ARGUMENTS
|
361
|
+
* gp(GPhys): a GPhys which represents angle (radian or degree).
|
362
|
+
|
363
|
+
RETURN VALUE
|
364
|
+
* gp_rad(GPhys): a GPhys which units is radian.
|
365
|
+
|
366
|
+
---eddy_products(gp_u, gp_v, gp_w, gp_t, dimname)
|
367
|
+
|
368
|
+
calculate eddy products along "dimname" dimension. now in this documents,
|
369
|
+
' means eddy from zonal mean, and () means zonal mean.
|
370
|
+
|
371
|
+
ARGUMENTS
|
372
|
+
* gp_u(GPhys): a GPhys which data represents zonal-wind velocity(m/s).
|
373
|
+
* gp_v(GPhys): a GPhys which data represents merdional-wind velocity(m/s).
|
374
|
+
* gp_w(GPhys): a GPhys which data represents vertical-wind velocity(m/s).
|
375
|
+
* gp_t(GPhys): a GPhys which data represents temperature(K).
|
376
|
+
|
377
|
+
RETURN VALUE
|
378
|
+
* uv_dash(GPhys): a GPhys which represents (gp_u'*gp_v').
|
379
|
+
* vt_dash(GPhys): a GPhys which represents (gp_v'*gp_t').
|
380
|
+
* uw_dash(GPhys): a GPhys which represents (gp_u'*gp_w').
|
381
|
+
|
382
|
+
---remove_0_at_poles(cos_gp)
|
383
|
+
|
384
|
+
set value if the cos(latitude) is nearly equal to 0 (|x|< 1e-6) at poles.
|
385
|
+
at North pole, new value is ((<(a_cos_lat.val[0] + a_cos_lat.val[1])/2>))
|
386
|
+
and at South pole ((<(a_cos_lat.val[-1] + a_cos_lat.val[-2])/2>))
|
387
|
+
|
388
|
+
ARGUMENTS
|
389
|
+
* cos_gp(GPhys): a GPhys which represents latitude.
|
390
|
+
|
391
|
+
RETURN VALUE
|
392
|
+
* new_cos_gp(GPhys): a GPhys which value at poles displaceed.
|
393
|
+
|
394
|
+
---preparate_for_vector_on_merdional_section(xax, yax)
|
395
|
+
|
396
|
+
preparate for ((<GGraph::vector_on_merdional_section>)) in
|
397
|
+
vector_on_merdional_section.
|
398
|
+
|
399
|
+
(1) check ((<yax>)) if it is proportional to p
|
400
|
+
(2) get axis ( a*phi, z )
|
401
|
+
|
402
|
+
ARGUMENTS
|
403
|
+
* xax(VArray): a VArray which represents x axis.
|
404
|
+
* yax(VArray): a VArray which represents y axis.
|
405
|
+
|
406
|
+
RETURN VALUE
|
407
|
+
* va_aphi(VArray): a VArray which represents x-coordinate(radius * phi).
|
408
|
+
* va_z(VArray): a VArray which represents z-coordinate.
|
409
|
+
* was_proportional_to_p(True or False): flag original axis proportional to
|
410
|
+
pressure or z.
|
411
|
+
|
412
|
+
---strm_rmean(v_rmean, yzdims=[0,1])
|
413
|
+
|
414
|
+
Calculate mass stream function for residual zonal mean circulation.
|
415
|
+
|
416
|
+
ARGUMENTS
|
417
|
+
* v_rmean (GPhys): a GPhys which is residual zonal mean V.
|
418
|
+
* yzdims (Array): an Array which represents axis.
|
419
|
+
|
420
|
+
RETURN VALUE
|
421
|
+
* gp_strm (GPhys): a GPhys which is mass stream function on merdional section.
|
422
|
+
|
423
|
+
==Constants:
|
424
|
+
|
425
|
+
---Deriv_methods
|
426
|
+
|
427
|
+
derivative method name [ 'cderiv', 'threepoint_O2nd_deriv' ]
|
428
|
+
|
429
|
+
=end
|
430
|
+
############################################################
|
431
|
+
|
432
|
+
module NumRu
|
433
|
+
class GPhys
|
434
|
+
module EP_Flux
|
435
|
+
|
436
|
+
include Misc::EMath
|
437
|
+
extend Misc::EMath
|
438
|
+
|
439
|
+
#<<< module constants >>>
|
440
|
+
# C_p = 1004.0 # specific heat at constant pressure of the earth's atmosphere [J.K-1.kg-1]
|
441
|
+
# R = 287.0 # gas constant per unit mass for dry air of the earth [J.K-1.kg-1]
|
442
|
+
Deriv_methods = [ 'cderiv', 'threepoint_O2nd_deriv' ] # list of derivatave method
|
443
|
+
|
444
|
+
#<<< module variable >>>
|
445
|
+
@@scale_height = UNumeric.new(7000, "m") # log-pressure scale height
|
446
|
+
@@radius = UNumeric.new(6.37E6,"m") # radius of the planet
|
447
|
+
@@rot_period = UNumeric.new(8.64E4,"s") # rotation period of the planet
|
448
|
+
@@g_forces = UNumeric.new(9.81,"m.s-2")
|
449
|
+
# gravitational acceleration in the surface
|
450
|
+
@@p00 = UNumeric.new(1.0E5,"Pa") # reference surface pressure
|
451
|
+
@@cp = UNumeric.new(1004.0, "J.K-1.kg-1")
|
452
|
+
# specific heat at constant pressure
|
453
|
+
@@gas_const = UNumeric.new(287.0, "J.K-1.kg-1")
|
454
|
+
# gas constant per molecular mass
|
455
|
+
@@deriv_method = Proc.new{|*args|
|
456
|
+
GPhys::Derivative::threepoint_O2nd_deriv(*args)
|
457
|
+
} # deriv_method. default method is three*
|
458
|
+
|
459
|
+
module_function
|
460
|
+
|
461
|
+
#<<< access to constants method >>> -------------------------------------
|
462
|
+
def scale_height
|
463
|
+
@@scale_height
|
464
|
+
end
|
465
|
+
def scale_height=(h)
|
466
|
+
@@scale_height = h
|
467
|
+
return nil
|
468
|
+
end
|
469
|
+
def radius
|
470
|
+
@@radius
|
471
|
+
end
|
472
|
+
def radius=(a)
|
473
|
+
@@radius = a
|
474
|
+
return nil
|
475
|
+
end
|
476
|
+
def rot_period
|
477
|
+
@@rot_period
|
478
|
+
end
|
479
|
+
def g_forces=(g)
|
480
|
+
@@g_forces = g
|
481
|
+
return nil
|
482
|
+
end
|
483
|
+
def g_forces
|
484
|
+
@@g_forces
|
485
|
+
end
|
486
|
+
def rot_period=(rp)
|
487
|
+
@@rot_period = rp
|
488
|
+
return nil
|
489
|
+
end
|
490
|
+
def p00
|
491
|
+
@@p00
|
492
|
+
end
|
493
|
+
def p00=(p00)
|
494
|
+
@@p00 = p00
|
495
|
+
return nil
|
496
|
+
end
|
497
|
+
def cp
|
498
|
+
@@cp
|
499
|
+
end
|
500
|
+
def cp=(cp)
|
501
|
+
@@cp = cp
|
502
|
+
return nil
|
503
|
+
end
|
504
|
+
def gas_const
|
505
|
+
@@gas_const
|
506
|
+
end
|
507
|
+
def gas_const=(r)
|
508
|
+
@@gas_const = r
|
509
|
+
return nil
|
510
|
+
end
|
511
|
+
def set_constants(scale_height, radius, rot_period, g_forces, p00, cp, gas_const)
|
512
|
+
@@scale_height = scale_height
|
513
|
+
@@radius = radius
|
514
|
+
@@rot_period = rot_period
|
515
|
+
@@g_forces = g_forces
|
516
|
+
@@p00 = p00
|
517
|
+
@@cp = cp
|
518
|
+
@@gas_const = gas_const
|
519
|
+
return nil
|
520
|
+
end
|
521
|
+
def get_constants
|
522
|
+
return @@scale_height, @@radius, @@rot_period, @@g_forces,
|
523
|
+
@@p00, @@cp, @@gas_const
|
524
|
+
end
|
525
|
+
|
526
|
+
#<<< derivation method >>> ---------------------------------------------
|
527
|
+
|
528
|
+
def set_deriv_method( method_name )
|
529
|
+
if Deriv_methods.include?( method_name )
|
530
|
+
@@deriv_method = eval <<-EOS
|
531
|
+
Proc.new{|*args|
|
532
|
+
GPhys::Derivative::#{method_name}(*args)
|
533
|
+
}
|
534
|
+
EOS
|
535
|
+
else
|
536
|
+
raise ArgumentError, "Unsupported method: #{method_name}. " +
|
537
|
+
"(Supported are #{Deriv_methods.inspect}.)"
|
538
|
+
end
|
539
|
+
nil
|
540
|
+
end
|
541
|
+
|
542
|
+
def deriv(*args)
|
543
|
+
@@deriv_method.call(*args)
|
544
|
+
end
|
545
|
+
|
546
|
+
#<<< calculation method >>> ---------------------------------------------
|
547
|
+
def ep_full_sphere(gp_u, gp_v, gp_w, gp_t,
|
548
|
+
flag_temp_or_theta=true, xyzdims=[0,1,2]) ## get axis and name
|
549
|
+
raise ArgumentError,"xyzdims's size (#{xyzdims.size}) must be 3." if xyzdims.size != 3
|
550
|
+
ax_lon = gp_u.axis(xyzdims[0]) # Axis of longitude
|
551
|
+
ax_lat = gp_u.axis(xyzdims[1]) # Axis of latitude
|
552
|
+
ax_z = gp_u.axis(xyzdims[2]) # Axis of vertical
|
553
|
+
lon_nm, lat_nm, z_nm = ax_lon.pos.name, ax_lat.pos.name, ax_z.pos.name
|
554
|
+
gp_lon, gp_lat, gp_z = make_gphys(ax_lon, ax_lat, ax_z)
|
555
|
+
|
556
|
+
## convert axes
|
557
|
+
gp_z = to_z_if_pressure(gp_z) # P => z=-H*log(P/P00) (units-based)
|
558
|
+
gp_lon = to_rad_if_deg(gp_lon) # deg => rad (unit convesion)
|
559
|
+
gp_lat = to_rad_if_deg(gp_lat) # deg => rad (unit convesion)
|
560
|
+
gp_w = to_w_if_omega(gp_w, gp_z) # dP/dt => dz/dt (units-based)
|
561
|
+
gp_t = to_theta_if_temperature(gp_t, gp_z, flag_temp_or_theta)
|
562
|
+
# temperature => potential temperature (if flag is true)
|
563
|
+
|
564
|
+
## replace grid (without duplicating data)
|
565
|
+
grid = gp_u.grid_copy
|
566
|
+
old_grid = gp_u.grid_copy # saved to use in outputs
|
567
|
+
grid.axis(lon_nm).pos = gp_lon.data # in radian
|
568
|
+
grid.axis(lat_nm).pos = gp_lat.data # in radian
|
569
|
+
grid.axis(z_nm).pos = gp_z.data # log-p height
|
570
|
+
gp_u = GPhys.new(grid, gp_u.data)
|
571
|
+
gp_v = GPhys.new(grid, gp_v.data)
|
572
|
+
gp_w = GPhys.new(grid, gp_w.data)
|
573
|
+
gp_t = GPhys.new(grid, gp_t.data)
|
574
|
+
## get each term
|
575
|
+
# needed in F_y and F_z
|
576
|
+
uv_dash, vt_dash, uw_dash = eddy_products(gp_u, gp_v, gp_w, gp_t, lon_nm)
|
577
|
+
theta_mean = gp_t.mean(lon_nm)
|
578
|
+
dtheta_dz = deriv(theta_mean, z_nm)
|
579
|
+
cos_lat = cos(gp_lat)
|
580
|
+
a_cos_lat = @@radius * cos_lat
|
581
|
+
a_cos_lat.data.rename!('a_cos_lat')
|
582
|
+
a_cos_lat.data.set_att('long_name', 'radius * cos_lat')
|
583
|
+
remove_0_at_poles(a_cos_lat)
|
584
|
+
# needed in F_y only
|
585
|
+
u_mean = gp_u.mean(lon_nm)
|
586
|
+
du_dz = deriv(u_mean, z_nm)
|
587
|
+
# needed in F_z only
|
588
|
+
f_cor = 2 * (2 * PI / @@rot_period) * sin(gp_lat)
|
589
|
+
f_cor.data.rename!('f_cor')
|
590
|
+
f_cor.data.set_att('long_name', 'Coriolis parameter')
|
591
|
+
ducos_dphi = deriv( u_mean * cos_lat, lat_nm)
|
592
|
+
avort = (-ducos_dphi/a_cos_lat) + f_cor # -- absolute vorticity
|
593
|
+
avort.data.units = "s-1"
|
594
|
+
avort.data.rename!('avort')
|
595
|
+
avort.data.set_att('long_name', 'zonal mean absolute vorticity')
|
596
|
+
|
597
|
+
## F_y, F_z
|
598
|
+
sigma = exp(-gp_z/@@scale_height)
|
599
|
+
epflx_y = ( - uv_dash + du_dz*vt_dash/dtheta_dz ) * cos_lat * sigma
|
600
|
+
epflx_z = ( - uw_dash + avort*vt_dash/dtheta_dz ) * cos_lat * sigma
|
601
|
+
epflx_y.data.name = "epflx_y"; epflx_z.data.name = "epflx_z"
|
602
|
+
epflx_y.data.set_att("long_name", "EP flux y component")
|
603
|
+
epflx_z.data.set_att("long_name", "EP flux z component")
|
604
|
+
|
605
|
+
## v_rmean, w_rmean
|
606
|
+
z_nm = gp_z.data.name # change z_nm from pressure to z
|
607
|
+
v_mean = gp_v.mean(lon_nm); w_mean = gp_w.mean(lon_nm)
|
608
|
+
v_rmean = ( v_mean - deriv( (vt_dash/dtheta_dz*sigma), z_nm )/sigma )
|
609
|
+
w_rmean = ( w_mean + deriv( (vt_dash/dtheta_dz*cos_lat), lat_nm )/a_cos_lat )
|
610
|
+
v_rmean.data.name = "v_rmean"; w_rmean.data.name = "w_rmean"
|
611
|
+
v_rmean.data.set_att("long_name", "residual zonal mean V")
|
612
|
+
w_rmean.data.set_att("long_name", "residual zonal mean W")
|
613
|
+
|
614
|
+
## convert with past grid
|
615
|
+
gp_ary = [] # grid convertes gphyss into
|
616
|
+
grid_xmean = old_grid.delete_axes(lon_nm)
|
617
|
+
[epflx_y, epflx_z, v_rmean, w_rmean, gp_lat, gp_z, u_mean, theta_mean,
|
618
|
+
uv_dash, vt_dash, uw_dash, dtheta_dz].each {|gp|
|
619
|
+
if grid_xmean.shape.size != gp.shape.size
|
620
|
+
gp_ary << gp
|
621
|
+
else
|
622
|
+
gp_ary << GPhys.new(grid_xmean, gp.data) #back to the original grid
|
623
|
+
end
|
624
|
+
}
|
625
|
+
return gp_ary
|
626
|
+
end
|
627
|
+
|
628
|
+
def div_sphere(gp_fy, gp_fz, yzdims=[0,1])
|
629
|
+
raise ArgumentError,"yzdims's size (#{yzdims.size}) must be 2." if yzdims.size != 2
|
630
|
+
## get axis and name
|
631
|
+
ax_lat = gp_fy.axis(yzdims[0]) # Axis of latitude
|
632
|
+
ax_z = gp_fy.axis(yzdims[1]) # Axis of vertical
|
633
|
+
lat_nm, z_nm = ax_lat.pos.name, ax_z.pos.name
|
634
|
+
gp_lat, gp_z = make_gphys(ax_lat, ax_z)
|
635
|
+
## convert
|
636
|
+
gp_z = to_z_if_pressure(gp_z) # P => z=-H*log(P/P00) (units-based)
|
637
|
+
gp_lat = to_rad_if_deg(gp_lat) # deg => rad (unit convesion)
|
638
|
+
|
639
|
+
## replace grid (without duplicating data)
|
640
|
+
grid = gp_fy.grid_copy
|
641
|
+
cp_grid = gp_fy.grid_copy # saved to use in outputs
|
642
|
+
grid.axis(lat_nm).pos = gp_lat.data
|
643
|
+
grid.axis(z_nm).pos = gp_z.data
|
644
|
+
gp_fy = GPhys.new(grid, gp_fy.data)
|
645
|
+
gp_fz = GPhys.new(grid, gp_fz.data)
|
646
|
+
|
647
|
+
## d_F_phi_dz
|
648
|
+
a_cos_lat = @@radius * cos(gp_lat)
|
649
|
+
remove_0_at_poles(a_cos_lat)
|
650
|
+
d_gp_fy_d_phi = deriv(gp_fy * cos(gp_lat), lat_nm)
|
651
|
+
## d_F_z_dz
|
652
|
+
d_gp_fz_d_z = deriv(gp_fz, z_nm)
|
653
|
+
f_div = ( d_gp_fy_d_phi / a_cos_lat ) + d_gp_fz_d_z
|
654
|
+
|
655
|
+
f_div.data.name = "epflx_div"
|
656
|
+
f_div.data.set_att("long_name", "EP Flux divergence")
|
657
|
+
## convert with past grid
|
658
|
+
return GPhys.new(cp_grid, f_div.data)
|
659
|
+
end
|
660
|
+
|
661
|
+
def make_gphys(*ax_ary)
|
662
|
+
# it will be lost when new grid.rb released : to use delete_ax
|
663
|
+
gp_ary = []
|
664
|
+
ax_ary.each{|ax|
|
665
|
+
if ax.is_a?(Axis)
|
666
|
+
ax_data = ax.pos
|
667
|
+
ax_grid = Grid.new(ax)
|
668
|
+
elsif ax.is_a?(VArray)
|
669
|
+
ax_data = ax
|
670
|
+
ax_grid = Grid.new(Axis.new().set_pos(ax))
|
671
|
+
end
|
672
|
+
gp = GPhys.new(ax_grid, ax_data)
|
673
|
+
gp_ary << gp
|
674
|
+
}
|
675
|
+
return gp_ary
|
676
|
+
end
|
677
|
+
|
678
|
+
def to_w_if_omega(gp, z) # it is only for z coordinate!!!
|
679
|
+
gp_units = gp.data.units
|
680
|
+
if gp_units =~ Units.new("Pa/s")
|
681
|
+
pr = @@p00*exp(-z/@@scale_height)
|
682
|
+
gp_un = gp_units
|
683
|
+
pr = pr.convert_units(gp_un*Units.new('s'))
|
684
|
+
gp = gp*(-@@scale_height/pr)
|
685
|
+
gp.data.rename!("wwnd")
|
686
|
+
gp.data.set_att('long_name', "log-P vertical wind")
|
687
|
+
elsif gp_units =~ Units.new("m/s")
|
688
|
+
gp = gp.convert_units(Units.new('m/s'))
|
689
|
+
else
|
690
|
+
raise ArgumentError,"units of gp.data (#{gp.data.units})
|
691
|
+
must be dimention of pressure/time
|
692
|
+
or length/time."
|
693
|
+
end
|
694
|
+
return gp
|
695
|
+
end
|
696
|
+
|
697
|
+
def to_theta_if_temperature(gp_t, z, flag_temp_or_theta=true)
|
698
|
+
# it is only for z coordinate!!!
|
699
|
+
if flag_temp_or_theta
|
700
|
+
gp_un = gp_t.data.units
|
701
|
+
gp_t = gp_t.convert_units(Units.new("K"))
|
702
|
+
gp_t = gp_t*exp((@@gas_const/@@cp)*z/@@scale_height)
|
703
|
+
gp_t.data.set_att('long_name', "Potential Temperature")
|
704
|
+
end
|
705
|
+
return gp_t
|
706
|
+
end
|
707
|
+
|
708
|
+
def to_z_if_pressure(gp_z)
|
709
|
+
# number in units is not considerd operater as log.
|
710
|
+
if ( gp_z.data.units =~ Units.new('Pa') )
|
711
|
+
p00 = @@p00.convert(gp_z.units)
|
712
|
+
gp_z = -@@scale_height*log(gp_z.to_type(NArray::DFLOAT)/p00)
|
713
|
+
# it will be change if GPhys is modified for scalor production
|
714
|
+
gp_z.data.set_att('long_name', "z").rename!("z")
|
715
|
+
elsif ( gp_z.data.units =~ Units.new('m') )
|
716
|
+
gp_z = gp_z.convert_units(Units.new("m"))
|
717
|
+
else
|
718
|
+
raise ArgumentError,"units of gp_z (#{gp_z.data.units})
|
719
|
+
must be dimention of pressure or length."
|
720
|
+
end
|
721
|
+
return gp_z
|
722
|
+
end
|
723
|
+
|
724
|
+
def to_p_if_altitude(gp_z)
|
725
|
+
# number in units is not considerd operater as log.
|
726
|
+
if ( gp_z.data.units =~ Units.new('m') )
|
727
|
+
h = @@scale_height.convert(gp_z.units)
|
728
|
+
gp_z = @@p00*exp(-gp_z/h)
|
729
|
+
gp_z.data.set_att('long_name', "p").rename!("p")
|
730
|
+
elsif ( gp_z.data.units =~ Units.new('Pa') )
|
731
|
+
gp_z = gp_z.convert_units(Units.new("Pa"))
|
732
|
+
else
|
733
|
+
raise ArgumentError,"units of gp_z (#{gp_z.data.units})
|
734
|
+
must be dimention of pressure or length."
|
735
|
+
end
|
736
|
+
return gp_z
|
737
|
+
end
|
738
|
+
|
739
|
+
def to_rad_if_deg(gp)
|
740
|
+
if gp.data.units =~ Units.new("degrees")
|
741
|
+
gp = gp.convert_units(Units.new('rad'))
|
742
|
+
gp.units = Units[""]
|
743
|
+
gp
|
744
|
+
elsif gp.data.units =~ Units.new('rad')
|
745
|
+
gp.data = gp.data.copy
|
746
|
+
gp.data.units = Units[""]
|
747
|
+
gp
|
748
|
+
else
|
749
|
+
raise ArgumentError,"units of gp #{gp.data.units} must be equal to deg or radian."
|
750
|
+
end
|
751
|
+
return gp
|
752
|
+
end
|
753
|
+
|
754
|
+
def eddy_products(gp_u, gp_v, gp_w, gp_t, dimname)
|
755
|
+
# get zonal_eddy
|
756
|
+
u_dash = gp_u - gp_u.mean(dimname)
|
757
|
+
v_dash = gp_v - gp_v.mean(dimname)
|
758
|
+
w_dash = gp_w - gp_w.mean(dimname)
|
759
|
+
t_dash = gp_t - gp_t.mean(dimname)
|
760
|
+
|
761
|
+
# get eddy_product
|
762
|
+
uv_dash = u_dash*v_dash # u'v'
|
763
|
+
vt_dash = v_dash*t_dash # v't'
|
764
|
+
uw_dash = u_dash*w_dash # u'w'
|
765
|
+
|
766
|
+
# set attribute
|
767
|
+
uv_dash.data.set_att("long_name", "U'V'")
|
768
|
+
vt_dash.data.set_att("long_name", "V'T'")
|
769
|
+
uw_dash.data.set_att("long_name", "U'W'")
|
770
|
+
uv_dash.data.rename!("uv_dash")
|
771
|
+
vt_dash.data.rename!("vt_dash")
|
772
|
+
uw_dash.data.rename!("uw_dash")
|
773
|
+
|
774
|
+
return uv_dash.mean(dimname), vt_dash.mean(dimname), uw_dash.mean(dimname)
|
775
|
+
end
|
776
|
+
|
777
|
+
def remove_0_at_poles(a_cos_lat)
|
778
|
+
eps = 1e-6
|
779
|
+
if ( (a_cos_lat.val[0]/@@radius).abs.val < eps )
|
780
|
+
a_cos_lat[0] = (a_cos_lat.val[0] + a_cos_lat.val[1])/2
|
781
|
+
end
|
782
|
+
if ( (a_cos_lat.val[-1]/@@radius).abs.val < eps )
|
783
|
+
a_cos_lat[-1] = (a_cos_lat.val[-1] + a_cos_lat.val[-2])/2
|
784
|
+
end
|
785
|
+
if a_cos_lat.min.val <= 0
|
786
|
+
raise "Illegal cos(phi) data. phi must between -pi/2 and +pi/2 " +
|
787
|
+
"and aligned in increasing or decreasing order."
|
788
|
+
end
|
789
|
+
nil
|
790
|
+
end
|
791
|
+
|
792
|
+
def preparate_for_vector_on_merdional_section(xax, zax)
|
793
|
+
gp_x, gp_z = make_gphys(xax, zax) # make gphys from axis
|
794
|
+
gp_phi = to_rad_if_deg(gp_x) # deg => rad (unit convesion)
|
795
|
+
gp_aphi = @@radius * gp_phi # radius * phi
|
796
|
+
# check zax units, if proportional to z or p
|
797
|
+
if ( gp_z.data.units =~ Units.new('Pa') )
|
798
|
+
was_proportional_to_p = true
|
799
|
+
elsif ( gp_z.data.units =~ Units.new('m') )
|
800
|
+
was_proportional_to_p = false
|
801
|
+
else
|
802
|
+
raise ArgumentError,'unit of zax #{gp_z.data.units} must be
|
803
|
+
compatible to length or pressure.'
|
804
|
+
end
|
805
|
+
gp_z = to_z_if_pressure(gp_z) # convert to z if gp_z is pressure
|
806
|
+
gp_z[0] = +1E-6 if gp_z.data.val[0] == -0.0
|
807
|
+
return gp_aphi.data, gp_z.data, was_proportional_to_p
|
808
|
+
end
|
809
|
+
|
810
|
+
def strm_rmean(gp_v, yzdims=[0,1])
|
811
|
+
|
812
|
+
raise ArgumentError,"yzdims's size (#{yzdims.size}) must be 2." if yzdims.size != 2
|
813
|
+
## get axis and name
|
814
|
+
lat_dim, z_dim = yzdims # Index of dims
|
815
|
+
ax_lat = gp_v.axis(lat_dim) # Axis of latitude
|
816
|
+
ax_z = gp_v.axis(z_dim) # Axis of vertical
|
817
|
+
lat_nm, z_nm = ax_lat.pos.name, ax_z.pos.name
|
818
|
+
gp_lat, gp_z = make_gphys(ax_lat, ax_z)
|
819
|
+
## convert
|
820
|
+
gp_lat = to_rad_if_deg(gp_lat) # deg. to rad.
|
821
|
+
gp_p = to_p_if_altitude(gp_z) # z => p=p00exp(-z/H) (units-based) and "Pa"
|
822
|
+
|
823
|
+
## copy grid
|
824
|
+
grid = gp_v.grid_copy
|
825
|
+
|
826
|
+
## calculate stream function
|
827
|
+
na_v = gp_v.data.val # for integration box
|
828
|
+
int_v = gp_v.data.val.dup.fill!(0.0) # for integration box
|
829
|
+
pres = gp_p.data.val.dup
|
830
|
+
if pres[0] < pres[-1]
|
831
|
+
int_v[*([true]*z_dim+[0, false])] = 0.5*(na_v[*([true] + [0, false])])*pres[0]
|
832
|
+
1.upto( pres.size-1 ) do |idx|
|
833
|
+
dp = (pres[idx] - pres[idx-1])
|
834
|
+
int_v[*([true]*z_dim+[idx, false])] = \
|
835
|
+
0.5 * (na_v[*([true] + [idx-1, false])] + na_v[*([true] + [idx, false])]) * dp \
|
836
|
+
+ int_v[*([true] + [idx-1, false])]
|
837
|
+
end
|
838
|
+
else
|
839
|
+
int_v[*([true]*z_dim+[-1, false])] = 0.5*(na_v[*([true] + [-1, false])])*pres[-1]
|
840
|
+
( pres.size-2 ).downto(0) do |idx|
|
841
|
+
dp = (pres[idx] - pres[idx+1])
|
842
|
+
int_v[*([true]*z_dim+[idx, false])] = \
|
843
|
+
0.5 * (na_v[*([true] + [idx+1, false])] + na_v[*([true] + [idx, false])]) * dp \
|
844
|
+
+ int_v[*([true] + [idx+1, false])]
|
845
|
+
end
|
846
|
+
end
|
847
|
+
int_v = VArray.new( int_v, gp_v.data, gp_v.data.name )
|
848
|
+
int_v.units = Units.new("Pa.m.s-1")
|
849
|
+
gp_int_v = GPhys.new(grid, int_v)
|
850
|
+
strm_rmean = gp_int_v * cos(gp_lat) * 2 * PI * @@radius / @@g_forces
|
851
|
+
|
852
|
+
## change attribute
|
853
|
+
strm_rmean.name = "strm_rmean"
|
854
|
+
strm_rmean.set_att("long_name", "Residual mean mass stream function")
|
855
|
+
|
856
|
+
## convert with past grid
|
857
|
+
return strm_rmean
|
858
|
+
end
|
859
|
+
|
860
|
+
end
|
861
|
+
end
|
862
|
+
end
|
863
|
+
|
864
|
+
#########################################################
|
865
|
+
|
866
|
+
if __FILE__ == $0
|
867
|
+
print "Test script path is 'test/test_ep_flux.rb' in expand gphys dir.\n"
|
868
|
+
end
|