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,886 @@
|
|
1
|
+
=begin
|
2
|
+
=extension of class NumRu::GPhys -- Fast Fourier transformation and its applications
|
3
|
+
|
4
|
+
This manual documents the methods of NumRu::GPhys defined in gphys_fft.rb
|
5
|
+
|
6
|
+
=class methods
|
7
|
+
---GPhys::fft_ignore_missing( ignore=true, replace_val=nil )
|
8
|
+
Set a flag (class variable) to ignore missing values.
|
9
|
+
This is for data that do not have missing
|
10
|
+
but is treated as potentially having missing (often
|
11
|
+
by having the valid_* attributes of NetCDF.)
|
12
|
+
If replace_val is specified, data missing with replaced
|
13
|
+
with that value.
|
14
|
+
|
15
|
+
|
16
|
+
=methods
|
17
|
+
---fft(backward=false, *dims)
|
18
|
+
Fast Fourier Transformation (FFT) by using
|
19
|
+
(((<FFTW|URL:http://www.fftw.org>))) ver 3 or ver 2.
|
20
|
+
A FFTW ver.2 interface is included in NArray, while
|
21
|
+
to use FFTW ver.3, you have to install separately.
|
22
|
+
Dimension specification by the argument dims is available
|
23
|
+
only with ver.3. By default, FFT is applied to all dimensions.
|
24
|
+
|
25
|
+
The transformation is complex. If the input data is not complex,
|
26
|
+
it will be coerced to complex before transformation.
|
27
|
+
|
28
|
+
When the FT is forward, the result is normalized
|
29
|
+
(i.e., divided by the data number), unlike the default behavior of
|
30
|
+
FFTW.
|
31
|
+
|
32
|
+
Each coordinate is assumed to be equally spaced without checking.
|
33
|
+
The new coordinate variables will be set equal to wavenumbers,
|
34
|
+
derived as 2*PI/(length of the axis)*[0,1,2,..], where the length
|
35
|
+
of the axis is derived as (coord.val.max - coord.val.min)*(n+1)/n.
|
36
|
+
|
37
|
+
REMARK
|
38
|
+
* If the units of the original coordinate is degree (or its
|
39
|
+
equivalent ones such as degrees_east), the wavenumber was
|
40
|
+
made in integers by converting the coordinate based on
|
41
|
+
radian.
|
42
|
+
|
43
|
+
ARGUMENTS
|
44
|
+
* backward (true of false) : when true, backward FT is done;
|
45
|
+
otherwise forward FT is done.
|
46
|
+
* dims (integers) : dimensions to apply FFT
|
47
|
+
|
48
|
+
RETURN VALUE
|
49
|
+
* a GPhys
|
50
|
+
|
51
|
+
EXAMPLE
|
52
|
+
gphy.fft # forward, for all dimensions
|
53
|
+
gphy.fft(true) # backward, for all dimensions
|
54
|
+
gphy.fft(nil, 0,1) # forward, for the first and second dimensions.
|
55
|
+
gphy.fft(true, -1) # backward, for the last dimension.
|
56
|
+
|
57
|
+
|
58
|
+
---detrend(dim1[,dim2[,...]])
|
59
|
+
Remove means and linear trends along dimension(s) specified.
|
60
|
+
Algorithm: 1st order polynomial fitting.
|
61
|
+
|
62
|
+
ARGUMENTS
|
63
|
+
* dim? (Integer of String): the dimension along which you want to remove
|
64
|
+
trends.
|
65
|
+
|
66
|
+
RETURN VALUE
|
67
|
+
* a GPhys
|
68
|
+
|
69
|
+
EXAMPLE
|
70
|
+
* See ((<detrend>)).
|
71
|
+
|
72
|
+
---cos_taper(dim1[,dim2[,...]])
|
73
|
+
Cosine tapering along dimension(s) specified.
|
74
|
+
|
75
|
+
Algorithm: to multiply with the half cosine curves at the both
|
76
|
+
1/10 ends of the data.
|
77
|
+
|
78
|
+
cos taper shape:
|
79
|
+
_____________
|
80
|
+
_/ \_
|
81
|
+
-> <- -> <-
|
82
|
+
T/10 T/10
|
83
|
+
half-cosine half-cosine
|
84
|
+
shaped shaped
|
85
|
+
|
86
|
+
The spectra of tapered data should be multiplied by 1/0.875,
|
87
|
+
which is stored as GPhys::COS_TAPER_SP_FACTOR (==1/0.875).
|
88
|
+
|
89
|
+
ARGUMENTS
|
90
|
+
* dim? (Integer of String): the dimension along which you want to remove
|
91
|
+
trends.
|
92
|
+
|
93
|
+
RETURN VALUE
|
94
|
+
* a GPhys
|
95
|
+
|
96
|
+
EXAMPLE
|
97
|
+
dim = 0 # for the 1st dimension
|
98
|
+
fc = gphys.detrend(dim).cos_taper(dim).fft(nil,dim)
|
99
|
+
sp = fc.abs**2 * GPhys::COS_TAPER_SP_FACTOR
|
100
|
+
|
101
|
+
---spect_zero_centering(dim)
|
102
|
+
Shifts the wavenumber axis to cover from -K/2 to K/2 instead of
|
103
|
+
from 0 to K-1, where the wavenumber is symbolically treated as integer,
|
104
|
+
which is actually not the case, though. Since the first (-K/2) and
|
105
|
+
the last (K/2) elements are duplicated, both are divided by 2.
|
106
|
+
Therefore, this method is to be used for spectra (squared quantity)
|
107
|
+
rather than the raw Fourier coefficients. (That is why the method name
|
108
|
+
is prefixed by "spect_").
|
109
|
+
|
110
|
+
The method is applied for a single dimension (specified by the argument
|
111
|
+
dim). If you need to apply for multiple dimensions, use it for multiple
|
112
|
+
times.
|
113
|
+
|
114
|
+
ARGUMENTS
|
115
|
+
* dim (integer): the dimension you want to shift spectra elements.
|
116
|
+
Count starts from zero.
|
117
|
+
|
118
|
+
RETURN VALUE
|
119
|
+
* a GPhys
|
120
|
+
|
121
|
+
EXAMPLE
|
122
|
+
* To get a spectra of a variable var along the 1st and 2nd dimensions:
|
123
|
+
|
124
|
+
fc = var.fft(nil, 0,1) # --> Fourier coef
|
125
|
+
sp = ( fc.abs**2 ).spect_zero_centering(0).spect_zero_centering(1)
|
126
|
+
|
127
|
+
Note that spect_zero_centering is applied after taking |fc|^2.
|
128
|
+
|
129
|
+
* Same but if you want to have the 2nd dimension one-sided:
|
130
|
+
|
131
|
+
fc = var.fft(nil, 0,1)
|
132
|
+
sp = ( fc.abs**2 ).spect_zero_centering(0).spect_one_sided(1)
|
133
|
+
|
134
|
+
* Similar to the first example but for cross spectra:
|
135
|
+
|
136
|
+
fc1 = var1.fft(nil, 0,1)
|
137
|
+
fc2 = var2.fft(nil, 0,1)
|
138
|
+
xsp = (fc1 * fc2.conj).spect_zero_centering(0).spect_zero_centering(1)
|
139
|
+
|
140
|
+
---spect_one_sided(dim)
|
141
|
+
Similar to ((<spect_zero_centering>)) but to make one-sided spectra.
|
142
|
+
Namely, to convert from 0..K-1 to 0..K/2. To be applied for spectra;
|
143
|
+
wavenumber 2..K/2-1 are multiplied by 2.
|
144
|
+
|
145
|
+
ARGUMENTS
|
146
|
+
* dim (integer): the dimension you want to shift spectra elements.
|
147
|
+
Count starts from zero.
|
148
|
+
|
149
|
+
RETURN VALUE
|
150
|
+
* a GPhys
|
151
|
+
|
152
|
+
EXAMPLE
|
153
|
+
* See the 2nd example of ((<spect_zero_centering>)).
|
154
|
+
|
155
|
+
---rawspect2powerspect(*dims)
|
156
|
+
Converts raw spectra obtained by gphys.fft.abs**2 into
|
157
|
+
power spectra by dividing by wavenumber increments
|
158
|
+
along the dimensions specified by dims.
|
159
|
+
|
160
|
+
ARGUMENTS
|
161
|
+
* dims (integers): the dimensions corresponding to wavenumbers.
|
162
|
+
|
163
|
+
RETURN VALUE
|
164
|
+
* a GPhys
|
165
|
+
|
166
|
+
EXAMPLE
|
167
|
+
* Suppose a 2 (or more) dimensional data gphys.
|
168
|
+
|
169
|
+
fc = gphys.fft(nil, 0, 1)
|
170
|
+
sp = fc.abs**2
|
171
|
+
ps = sp.rawspect2powerspect(0,1)
|
172
|
+
|
173
|
+
Here, sp is the raw spectrum of gphys, and ps is the power spectrum.
|
174
|
+
The Parseval relation for them are as follows:
|
175
|
+
|
176
|
+
(gphys**2).mean == sp.sum
|
177
|
+
== pw.sum*dk*dl (== \int pw dk dl, mathematically),
|
178
|
+
|
179
|
+
where, dk = (pw.coord(0)[1] - pw.coord(0)[0]), and
|
180
|
+
dl = (pw.coord(1)[1] - pw.coord(1)[0]).
|
181
|
+
|
182
|
+
---phase_velocity_filter(xdim, tdim, cmin=nil, cmax=nil, xconv=nil, tconv=nil, remove_xtmean=false)
|
183
|
+
|
184
|
+
Filtering by phase velocity (between cmin and cmax)
|
185
|
+
|
186
|
+
REMARKS
|
187
|
+
* If the number of the grid points along x or t is an even number,
|
188
|
+
the maximum wavenumber or frequency is treated as positive
|
189
|
+
and negative, respectively, which results in an asymmetry of
|
190
|
+
the treatment of positive and negative phase speeds.
|
191
|
+
(That should be ok. -- In case its effect is significant,
|
192
|
+
to do the filtering itself is not meaningful.)
|
193
|
+
|
194
|
+
ARGUMENTS
|
195
|
+
* xdim (Integer or String): spacial dimension
|
196
|
+
* tdim (Integer or String): time dimension
|
197
|
+
* cmin (Float or nil): minimum phase velocity. nil means no specification.
|
198
|
+
(at least cmin or cmax must be given by Float)
|
199
|
+
* cmax (Float or nil): maximum phase velocity. nil means no specification.
|
200
|
+
(at least cmin or cmax must be given by Float)
|
201
|
+
* xconv (nil or UNumeric) : (optional) if given, xconv is multiplied
|
202
|
+
with the x axis before computing the phase velocity
|
203
|
+
(kconv=1/xconv is used to scale wavenumbers)
|
204
|
+
* tconv (nil or UNumeric) : (optional) if given, tconv is multiplied
|
205
|
+
with the t axis before computing the phase velocity
|
206
|
+
(fconv=1/tconv is used to scale frequency)
|
207
|
+
* remove_xtmean (false or true) : if false (default),
|
208
|
+
components with k=0 and f=0 are counted as c=0 (stationary),
|
209
|
+
(unlike ((<phase_velocity_binning>))), so they are included if
|
210
|
+
cmin*cmax <= 0; if true, k=0 & f=0 components are always removed.
|
211
|
+
|
212
|
+
RETURN VALUE
|
213
|
+
* a GPhys
|
214
|
+
|
215
|
+
EXAMPLE
|
216
|
+
* For a 4D data with [x,y,z,t] dimensions, filtering by the phase
|
217
|
+
velocity in the y dimension greater than 10.0 (in the unit
|
218
|
+
of y/t) can be made by
|
219
|
+
|
220
|
+
cmin = 10.0; cmax = nil
|
221
|
+
gpfilt = gp.phase_velocity_filter(1, 3, cmin, cmax)
|
222
|
+
|
223
|
+
* For a global data (on the Earth's surface) with
|
224
|
+
[lon, lat, z, time] axes, where the units of lon is
|
225
|
+
"degrees" (or "degrees_east" or "radian")
|
226
|
+
and the units of time is "hours", to filter disturbances
|
227
|
+
whose zonal phase speed MEASURED AT THE EQUATOR is less or
|
228
|
+
equal to 30 m/s can be made by
|
229
|
+
|
230
|
+
cmin = -30.0; cmax = 30.0
|
231
|
+
xconv = UNumeric[6.37e6, "m"] # Earth's radius (i.e., m/radian)
|
232
|
+
# This is a special case since "radian" is exceptionally omitted.
|
233
|
+
# See the private method __predefined_coord_units_conversion.
|
234
|
+
tconv = UNumeric[3.6e3, "s/hours"]
|
235
|
+
gpfilt = gp.phase_velocity_filter(1, 3, cmin, cmax, xconv, tconv)
|
236
|
+
|
237
|
+
|
238
|
+
---phase_velocity_binning_iso_norml(kdim, fdim, cmin, cmax, cint, kconv=nil, fconv=nil)
|
239
|
+
|
240
|
+
Same as ((<phase_velocity_binning>)) but exclusively for
|
241
|
+
equal phase velocity spacing. Also, a normalization is
|
242
|
+
additionally made, to scale spectra in terms of integration
|
243
|
+
along phase velocity axis --- The result of
|
244
|
+
((<phase_velocity_binning>)) called inside
|
245
|
+
this method is divided by cint along with corresponding
|
246
|
+
units conversion. Therefore, if this method is applied
|
247
|
+
to spectra, a normalization is made such that an integration
|
248
|
+
(not summation) along the phase velocity gives the variance
|
249
|
+
(or covariance etc.) -- This normalization is suitable to
|
250
|
+
quadratic quantities (such as spectra) but is not suitable to
|
251
|
+
raw Fourier coefficients.
|
252
|
+
|
253
|
+
ARGUMENTS
|
254
|
+
* kdim (Integer or String): see ((<phase_velocity_binning>))
|
255
|
+
* fdim (Integer or String): see ((<phase_velocity_binning>))
|
256
|
+
* cmin (Float) : minimum phase velocity
|
257
|
+
* cmin (Float) : maximum phase velocity
|
258
|
+
* cint (Float) : inter val with which the range [cmin and cmax]
|
259
|
+
is divided.
|
260
|
+
* kconv (nil or UNumeric) : see ((<phase_velocity_binning>))
|
261
|
+
* fconv (nil or UNumeric) : see ((<phase_velocity_binning>))
|
262
|
+
|
263
|
+
RETURN VALUE
|
264
|
+
* a GPhys
|
265
|
+
|
266
|
+
---phase_velocity_binning(kdim, fdim, cbins, kconv=nil, fconv=nil)
|
267
|
+
|
268
|
+
Bin a 2D spectrum in space and time based on phase velocity.
|
269
|
+
The operand (self) must be Fourier coefficients or spectra,
|
270
|
+
whose grid has not been altered since the call of the method
|
271
|
+
fft (i.e., those that have not applied with zero centering
|
272
|
+
etc, since it is done in this method).
|
273
|
+
|
274
|
+
Binning by this method is based on summation, leaving
|
275
|
+
the units unchanged.
|
276
|
+
|
277
|
+
REMARKS
|
278
|
+
* Components whose phase velocities are exactly equal to one
|
279
|
+
of the boundaries are divided into the two bins half by half
|
280
|
+
* components with k=0 and f=0 are excluded -- the spatio-temporal
|
281
|
+
mean do not reflect in the result
|
282
|
+
|
283
|
+
ARGUMENTS
|
284
|
+
* kdim (Integer or String): wavenumber dimension (from spacial dimension)
|
285
|
+
* fdim (Integer or String): frequency dimension (from time dimension)
|
286
|
+
* cbins : an Array of bin bounds or a Hash of max, min, int
|
287
|
+
e.g., [-10,-1,-0.1,0.1,11,10], {"min"=>-30,"max"=>30,"int"=>5}
|
288
|
+
* kconv (nil or UNumeric) : (optional) if given, kconv is multiplied
|
289
|
+
with the wavenumber axis before computing the phase velocity
|
290
|
+
* fconv (nil or UNumeric) : (optional) if given, fconv is multiplied
|
291
|
+
with the frequency axis before computing the phase velocity
|
292
|
+
|
293
|
+
RETURN VALUE
|
294
|
+
* a GPhys
|
295
|
+
|
296
|
+
EXAMPLES
|
297
|
+
* Example A
|
298
|
+
fu = u.fft(nil, 0, 2)
|
299
|
+
cfu = fu.phase_velocity_binning(0, 2, {"min"=>-1,"max"=>1,"int"=>0.1})
|
300
|
+
|
301
|
+
* Example B
|
302
|
+
fu = u.fft(nil, 0, 2)
|
303
|
+
pw = fu.abs**2rawspect2powerspect(0,2) # power spectrum
|
304
|
+
cbins = [-100.0, -10.0, -1.0, 1.0, 10.0, 100.0] # logarithmic spacing
|
305
|
+
cpw = pw.phase_velocity_binning(0, 2, cbins)
|
306
|
+
|
307
|
+
* Example C
|
308
|
+
fu = u.fft(nil, 0, 3)
|
309
|
+
fv = v.fft(nil, 0, 3)
|
310
|
+
kconv = UNumeric[1/6.37e6, "m-1"]
|
311
|
+
fconv = UNumeric[1/3.6e3, "hours/s"]
|
312
|
+
fuv = (fu * fv.conj) # cross spectra
|
313
|
+
cfuv = fuv.phase_velocity_binning(0, 3, {"min"=>-50,"max"=>50,"int"=>5},
|
314
|
+
kconv, fconv)
|
315
|
+
|
316
|
+
=end
|
317
|
+
|
318
|
+
begin
|
319
|
+
require "numru/fftw3"
|
320
|
+
rescue LoadError
|
321
|
+
end
|
322
|
+
require "numru/gphys/gphys"
|
323
|
+
|
324
|
+
module NumRu
|
325
|
+
class GPhys
|
326
|
+
@@fft_forward = -1
|
327
|
+
@@fft_backward = 1
|
328
|
+
@@fft_ignore_missing = false
|
329
|
+
@@fft_missing_replace_val = nil
|
330
|
+
|
331
|
+
def self.fft_ignore_missing( ignore=true, replace_val=nil )
|
332
|
+
@@fft_ignore_missing = ignore
|
333
|
+
@@fft_missing_replace_val = replace_val
|
334
|
+
end
|
335
|
+
|
336
|
+
|
337
|
+
COS_TAPER_SP_FACTOR = 1.0 / 0.875 # Spectral factor for the cosine taper.
|
338
|
+
# Specta should be multiplied by this.
|
339
|
+
def cos_taper(*dims)
|
340
|
+
if dims.length < 1
|
341
|
+
raise ArgumentError,'You have to specify one or more dimensions'
|
342
|
+
end
|
343
|
+
dims.sort!.uniq!
|
344
|
+
val = self.data.val
|
345
|
+
dims.each{|dim|
|
346
|
+
dim = dim_index(dim) if dim.is_a?(String)
|
347
|
+
dim += rank if dim < 0
|
348
|
+
raise ArgumentError,"dim #{dim} does not exist" if dim<0 || dim>rank
|
349
|
+
nx = shape[dim]
|
350
|
+
wgt = NArray.float(nx).fill!(1)
|
351
|
+
x = 10.0 / nx * (NArray.float(nx).indgen!+0.5)
|
352
|
+
wskl = x.lt(1).where
|
353
|
+
wskr = x.gt(9).where
|
354
|
+
wgt[wskl] = 0.5*( 1.0 - NMath::cos(Math::PI*x[wskl]) )
|
355
|
+
wgt[wskr] = 0.5*( 1.0 - NMath::cos(Math::PI*x[wskr]) )
|
356
|
+
wgt.reshape!( *([1]*dim + [nx] + [1]*(rank-dim-1)) )
|
357
|
+
val = val*wgt
|
358
|
+
}
|
359
|
+
to_ret = self.copy
|
360
|
+
to_ret.data.val = val
|
361
|
+
to_ret
|
362
|
+
end
|
363
|
+
|
364
|
+
def detrend(*dims)
|
365
|
+
if dims.length < 1
|
366
|
+
raise ArgumentError,'You have to specify one or more dimensions'
|
367
|
+
end
|
368
|
+
dims.sort!.uniq!
|
369
|
+
val = self.data.val
|
370
|
+
dims.each{|dim|
|
371
|
+
dim = dim_index(dim) if dim.is_a?(String)
|
372
|
+
dim += rank if dim < 0
|
373
|
+
raise ArgumentError,"dim #{dim} does not exist" if dim<0 || dim>rank
|
374
|
+
if val.is_a?(NArray)
|
375
|
+
x = self.coord(dim).val
|
376
|
+
x.reshape!( *([1]*dim + [x.length] + [1]*(rank-dim-1)) )
|
377
|
+
vmean = val.mean(dim)
|
378
|
+
vxmean = (val*x).mean(dim)
|
379
|
+
xmean = x.mean(dim)
|
380
|
+
x2mean = (x*x).mean(dim)
|
381
|
+
denom = x2mean-xmean**2
|
382
|
+
if denom != 0
|
383
|
+
a = (vxmean - vmean*xmean)/denom
|
384
|
+
b = (vmean*x2mean - vxmean*xmean)/denom
|
385
|
+
else
|
386
|
+
a = 0
|
387
|
+
b = vmean
|
388
|
+
end
|
389
|
+
elsif val.is_a?(NArrayMiss)
|
390
|
+
x = self.coord(dim).val
|
391
|
+
x.reshape!( *([1]*dim + [x.length] + [1]*(rank-dim-1)) )
|
392
|
+
x = NArrayMiss.to_nam( NArray.new(x.typecode, *val.shape) + x,
|
393
|
+
val.get_mask )
|
394
|
+
vmean = val.mean(dim)
|
395
|
+
vxmean = (val*x).mean(dim)
|
396
|
+
xmean = x.mean(dim)
|
397
|
+
x2mean = (x*x).mean(dim)
|
398
|
+
denom = x2mean-xmean**2
|
399
|
+
meq0 = denom.eq(0).to_na(0) # ==0 and not masked
|
400
|
+
mne0 = denom.ne(0).to_na(0) # !=0 and not masked
|
401
|
+
denom.set_mask(mne0) # only nonzero part will be used to divide:
|
402
|
+
a = (vxmean - vmean*xmean)/denom
|
403
|
+
b = (vmean*x2mean - vxmean*xmean)/denom
|
404
|
+
a[meq0] = 0
|
405
|
+
b[meq0] = vmean[meq0]
|
406
|
+
end
|
407
|
+
a.newdim!(dim) if !a.is_a?(Numeric)
|
408
|
+
b.newdim!(dim) if !b.is_a?(Numeric)
|
409
|
+
val = val - a*x-b
|
410
|
+
}
|
411
|
+
to_ret = self.copy
|
412
|
+
to_ret.data.val = val
|
413
|
+
to_ret
|
414
|
+
end
|
415
|
+
|
416
|
+
def fft(backward=false, *dims)
|
417
|
+
fftw3 = false
|
418
|
+
if defined?(FFTW3)
|
419
|
+
fftw3 = true
|
420
|
+
elsif !defined?(FFTW)
|
421
|
+
raise "Both FFTW3 and FFTW are not installed."
|
422
|
+
end
|
423
|
+
if backward==true
|
424
|
+
dir = @@fft_backward
|
425
|
+
elsif !backward
|
426
|
+
dir = @@fft_forward
|
427
|
+
else
|
428
|
+
raise ArgumentError,"1st arg must be true or false (or, equivalenty, nil)"
|
429
|
+
end
|
430
|
+
|
431
|
+
# <FFT>
|
432
|
+
|
433
|
+
gfc = self.copy # make a deep clone
|
434
|
+
if fftw3
|
435
|
+
val = gfc.data.val
|
436
|
+
if @@fft_ignore_missing and val.is_a?(NArrayMiss)
|
437
|
+
if @@fft_missing_replace_val
|
438
|
+
val = val.to_na(@@fft_missing_replace_val)
|
439
|
+
else
|
440
|
+
val = val.to_na
|
441
|
+
end
|
442
|
+
end
|
443
|
+
fcoef = FFTW3.fft( val, dir, *dims )
|
444
|
+
else
|
445
|
+
# --> always FFT for all dimensions
|
446
|
+
if dims.length == 0
|
447
|
+
raise ArgumentError,
|
448
|
+
"dimension specification is available only if FFTW3 is installed"
|
449
|
+
end
|
450
|
+
val = gfc.data.val
|
451
|
+
if @@fft_ignore_missing and val.is_a?(NArrayMiss)
|
452
|
+
if @@fft_missing_replace_val
|
453
|
+
val = val.to_na(@@fft_missing_replace_val)
|
454
|
+
else
|
455
|
+
val = val.to_na
|
456
|
+
end
|
457
|
+
end
|
458
|
+
fcoef = FFTW.fftw( val, dir )
|
459
|
+
end
|
460
|
+
if dir == @@fft_forward
|
461
|
+
if dims.length == 0
|
462
|
+
fcoef = fcoef / fcoef.length # normalized if forward FT
|
463
|
+
else
|
464
|
+
sh = fcoef.shape
|
465
|
+
len = 1
|
466
|
+
dims.each{|d|
|
467
|
+
raise ArgumentError, "dimension out of range" if sh[d] == nil
|
468
|
+
len *= sh[d]
|
469
|
+
}
|
470
|
+
fcoef = fcoef / len
|
471
|
+
end
|
472
|
+
end
|
473
|
+
gfc.data.replace_val( fcoef )
|
474
|
+
|
475
|
+
# <coordinate variables>
|
476
|
+
for i in 0...gfc.rank
|
477
|
+
if dims.length == 0 || dims.include?(i) || dims.include?(i+rank)
|
478
|
+
__predefined_coord_units_conversion(gfc.coord(i))
|
479
|
+
cv = gfc.coord(i).val
|
480
|
+
n = cv.length
|
481
|
+
clen = (cv.max - cv.min) * n / (n-1)
|
482
|
+
wn = (2*Math::PI/clen) * NArray.new(cv.typecode,cv.length).indgen!
|
483
|
+
if (!backward)
|
484
|
+
gfc.coord(i).set_att('origin_in_real_space',cv[0..0])
|
485
|
+
else
|
486
|
+
if ( org = gfc.coord(i).get_att('origin_in_real_space') )
|
487
|
+
wn += org[0]
|
488
|
+
###gfc.coord(i).del_att('origin_in_real_space')
|
489
|
+
end
|
490
|
+
end
|
491
|
+
gfc.coord(i).replace_val(wn)
|
492
|
+
gfc.coord(i).units = gfc.coord(i).units**(-1)
|
493
|
+
__coord_name_conversion(gfc.coord(i), backward)
|
494
|
+
end
|
495
|
+
end
|
496
|
+
|
497
|
+
# <fini>
|
498
|
+
gfc
|
499
|
+
end
|
500
|
+
|
501
|
+
def __predefined_coord_units_conversion(coord)
|
502
|
+
case coord.units
|
503
|
+
when Units["degree"]
|
504
|
+
val = coord.val
|
505
|
+
coord.replace_val( val * (Math::PI/180) )
|
506
|
+
coord.units = "radian"
|
507
|
+
end
|
508
|
+
end
|
509
|
+
private :__predefined_coord_units_conversion
|
510
|
+
|
511
|
+
def __coord_name_conversion(coord, backward)
|
512
|
+
|
513
|
+
if !backward #--> forward
|
514
|
+
|
515
|
+
( ln = coord.get_att('long_name') ) &&
|
516
|
+
coord.set_att('long_name','wavenumber - '+ln)
|
517
|
+
|
518
|
+
case coord.name
|
519
|
+
when 'x'
|
520
|
+
coord.name = 'k'
|
521
|
+
when 'y'
|
522
|
+
coord.name = 'l'
|
523
|
+
when 'z'
|
524
|
+
coord.name = 'm'
|
525
|
+
# when 'lon','longitude'
|
526
|
+
# coord.name = 's'
|
527
|
+
when 't','time'
|
528
|
+
if coord.units === Units['s-1'] # compatible_with?
|
529
|
+
coord.name = 'omega'
|
530
|
+
coord.set_att('long_name', 'angular frequency')
|
531
|
+
end
|
532
|
+
end
|
533
|
+
|
534
|
+
else #--> backward
|
535
|
+
|
536
|
+
if ( ln = coord.get_att('long_name') )
|
537
|
+
case ln
|
538
|
+
when /^wavenumber -/
|
539
|
+
coord.set_att( 'long_name', ln.sub(/^wavenumber - */,'') )
|
540
|
+
when /angular frequency/
|
541
|
+
coord.set_att( 'long_name', 'time' )
|
542
|
+
end
|
543
|
+
end
|
544
|
+
|
545
|
+
case coord.name
|
546
|
+
when 'k'
|
547
|
+
coord.name = 'x'
|
548
|
+
when 'l'
|
549
|
+
coord.name = 'y'
|
550
|
+
when 'm'
|
551
|
+
coord.name = 'z'
|
552
|
+
when 'omega'
|
553
|
+
coord.name = 'time'
|
554
|
+
end
|
555
|
+
end
|
556
|
+
end
|
557
|
+
private :__coord_name_conversion
|
558
|
+
|
559
|
+
def spect_zero_centering(dim)
|
560
|
+
dim = dim + self.rank if dim<0
|
561
|
+
len = self.shape[dim]
|
562
|
+
b = self[ *( [true]*dim + [[(len+1)/2..len-1,0..len/2],false] ) ].copy
|
563
|
+
s1 = [true]*dim + [0, false]
|
564
|
+
s2 = [true]*dim + [-1, false]
|
565
|
+
if (len % 2) == 0 #--> even number
|
566
|
+
b[*s1] = b[*s1]/2 # the ends are duplicated --> halved
|
567
|
+
b[*s2] = b[*s1]
|
568
|
+
end
|
569
|
+
b.coord(dim)[0..len/2-1] = -b.coord(dim)[len/2+1..-1].val[-1..0]
|
570
|
+
b
|
571
|
+
end
|
572
|
+
|
573
|
+
def spect_one_sided(dim)
|
574
|
+
dim = dim + self.rank if dim<0
|
575
|
+
len = self.shape[dim]
|
576
|
+
b = self[ *([true]*dim + [0..len/2,false]) ] * 2
|
577
|
+
b[*([true]*dim + [0,false])] = b[*([true]*dim + [0,false])] / 2
|
578
|
+
if (self.shape[dim] % 2) == 0 # --> even number
|
579
|
+
b[*([true]*dim + [-1,false])] = b[*([true]*dim + [-1,false])] / 2
|
580
|
+
end
|
581
|
+
b
|
582
|
+
end
|
583
|
+
|
584
|
+
def rawspect2powerspect(*dims)
|
585
|
+
# developpers memo: Needs Units conversion.
|
586
|
+
factor = nil
|
587
|
+
dims.each{|dim|
|
588
|
+
ax = self.coord(dim)
|
589
|
+
dwn = UNumeric.new( ((ax[-1].val - ax[0].val)/(ax.length - 1)).abs,
|
590
|
+
ax.units )
|
591
|
+
if !factor
|
592
|
+
factor = dwn**(-1)
|
593
|
+
else
|
594
|
+
factor = factor / dwn
|
595
|
+
end
|
596
|
+
}
|
597
|
+
self * factor
|
598
|
+
end
|
599
|
+
|
600
|
+
def phase_velocity_filter(xdim, tdim, cmin=nil, cmax=nil, xconv=nil, tconv=nil, remove_xtmean=false)
|
601
|
+
raise(ArgumentError,"need at least cmin or cmax") if !(cmin || cmax)
|
602
|
+
|
603
|
+
|
604
|
+
xdim = dim_index(xdim) if xdim.is_a?(String)
|
605
|
+
xdim += rank if xdim < 0
|
606
|
+
tdim = dim_index(tdim) if tdim.is_a?(String)
|
607
|
+
tdim += rank if tdim < 0
|
608
|
+
fc = self.fft(nil,xdim,tdim)
|
609
|
+
|
610
|
+
kdim = xdim
|
611
|
+
fdim = tdim
|
612
|
+
kconv = ( xconv ? 1.0/xconv : nil )
|
613
|
+
fconv = ( tconv ? 1.0/tconv : nil )
|
614
|
+
cp, = fc.phase_velocity(kdim,fdim,kconv,fconv,!remove_xtmean,true)
|
615
|
+
|
616
|
+
fcv = fc.val
|
617
|
+
nk = fc.shape[kdim]
|
618
|
+
nf = fc.shape[fdim]
|
619
|
+
sel = [true]*fc.rank
|
620
|
+
for jf in 0...nf
|
621
|
+
for jk in 0...nk
|
622
|
+
c = cp[jk,jf]
|
623
|
+
if ( cmin && c<cmin or cmax && c>cmax)
|
624
|
+
sel[kdim]=jk
|
625
|
+
sel[fdim]=jf
|
626
|
+
fcv[*sel] = 0.0
|
627
|
+
end
|
628
|
+
end
|
629
|
+
end
|
630
|
+
fc.replace_val(fcv)
|
631
|
+
gp = fc.fft(true,xdim,tdim)
|
632
|
+
gp = gp.real if (self.typecode <= NArray::FLOAT)
|
633
|
+
GPhys.new(self.grid_copy, gp.data)
|
634
|
+
#^ use the original grid, since units may have changed
|
635
|
+
end
|
636
|
+
|
637
|
+
def phase_velocity_binning_iso_norml(kdim, fdim, cmin, cmax, cint,
|
638
|
+
kconv=nil, fconv=nil)
|
639
|
+
cbins = {"min"=>cmin,"max"=>cmax,"int"=>cint}
|
640
|
+
pwc = phase_velocity_binning(kdim, fdim, cbins, kconv, fconv)
|
641
|
+
fact = UNumeric[int, pwc.coord(0).units]
|
642
|
+
pwc/fact
|
643
|
+
end
|
644
|
+
|
645
|
+
def phase_velocity_binning(kdim, fdim, cbins, kconv=nil, fconv=nil)
|
646
|
+
|
647
|
+
# < process arguments >
|
648
|
+
|
649
|
+
case cbins
|
650
|
+
when Hash
|
651
|
+
min = cbins["min"] ||raise(ArgumentError,"a Hash cbins must have 'min'")
|
652
|
+
max = cbins["max"] ||raise(ArgumentError,"a Hash cbins must have 'max'")
|
653
|
+
int = cbins["int"] ||raise(ArgumentError,"a Hash cbins must have 'int'")
|
654
|
+
cbins = Array.new
|
655
|
+
eps = int.abs*1e-6 # epsilon to deal with float steps
|
656
|
+
(min.to_f..(max.to_f+eps)).step(int){|c| cbins.push(c)}
|
657
|
+
cbins = NArray.to_na(cbins)
|
658
|
+
when Array
|
659
|
+
cbins = NArray.to_na(cbins)
|
660
|
+
when NArray
|
661
|
+
else
|
662
|
+
raise ArgumentError, "cbins must be a Hash or Array or NArray"
|
663
|
+
end
|
664
|
+
|
665
|
+
kdim = dim_index(kdim) if kdim.is_a?(String)
|
666
|
+
kdim += rank if kdim < 0
|
667
|
+
fdim = dim_index(fdim) if fdim.is_a?(String)
|
668
|
+
fdim += rank if fdim < 0
|
669
|
+
|
670
|
+
# < sort along wavenumber/freuqency axis >
|
671
|
+
|
672
|
+
pw = self.spect_zero_centering(kdim).spect_one_sided(fdim)
|
673
|
+
|
674
|
+
# < process axes >
|
675
|
+
|
676
|
+
cp, cunits = pw.phase_velocity(kdim,fdim,kconv,fconv,false)
|
677
|
+
|
678
|
+
vcbins = VArray.new(cbins, {"units"=>cunits.to_s,
|
679
|
+
"long_name"=>"phase velocity bounds"}, "cbounds")
|
680
|
+
vccent = VArray.new( (cbins[0..-2] + cbins[1..-1])/2,
|
681
|
+
{"units"=>cunits.to_s, "long_name"=>"phase velocity"}, "c")
|
682
|
+
axc = Axis.new(true).set_cell(vccent, vcbins).set_pos_to_center
|
683
|
+
axes = [axc] # the first dimension will be "c"
|
684
|
+
gr = pw.grid
|
685
|
+
(0...pw.rank).each do |d|
|
686
|
+
if d!=kdim && d!=fdim
|
687
|
+
axes.push(gr.axis(d))
|
688
|
+
end
|
689
|
+
end
|
690
|
+
newgrid = Grid.new(*axes)
|
691
|
+
|
692
|
+
nk = pw.shape[kdim]
|
693
|
+
nf = pw.shape[fdim]
|
694
|
+
cp.reshape!(nk*nf)
|
695
|
+
|
696
|
+
# < reorder input data >
|
697
|
+
|
698
|
+
dimorder = (0...pw.rank).collect{|i| i}
|
699
|
+
dimorder.delete(fdim)
|
700
|
+
dimorder.unshift(fdim)
|
701
|
+
dimorder.delete(kdim)
|
702
|
+
dimorder.unshift(kdim) # --> [kdim, fdim, the other dims...]
|
703
|
+
sh = pw.shape
|
704
|
+
reshape = [nk*nf]
|
705
|
+
(0...rank).each{|i| reshape.push(sh[i]) if i!=fdim && i!=kdim}
|
706
|
+
pwv = pw.val.transpose(*dimorder).reshape(*reshape)
|
707
|
+
# --> [ combined k&fdim, the other dims...]
|
708
|
+
|
709
|
+
# < binning >
|
710
|
+
|
711
|
+
shc = newgrid.shape
|
712
|
+
pwc = NArray.new(pwv.typecode, *shc) # will have no missing data
|
713
|
+
nc = axc.length
|
714
|
+
for jc in 0...nc
|
715
|
+
w = (cp.gt(cbins[jc]) & cp.lt(cbins[jc+1])).where
|
716
|
+
pwc[jc,false] += pwv[w,false].sum(0) if w.length>0
|
717
|
+
w = (cp.eq(cbins[jc])).where
|
718
|
+
pwc[jc,false] += pwv[w,false].sum(0)/2 if w.length>0 # half from bdry
|
719
|
+
w = (cp.eq(cbins[jc+1])).where
|
720
|
+
pwc[jc,false] += pwv[w,false].sum(0)/2 if w.length>0 # half from bdry
|
721
|
+
end
|
722
|
+
|
723
|
+
vpwc = VArray.new(pwc,pw.data,pw.name)
|
724
|
+
gpwc = GPhys.new(newgrid,vpwc)
|
725
|
+
|
726
|
+
gpwc
|
727
|
+
end
|
728
|
+
|
729
|
+
def phase_velocity(kdim,fdim,kconv,fconv,kf0_is_c0=true,no_kfreorder=false)
|
730
|
+
kax = self.axis(kdim)
|
731
|
+
fax = self.axis(fdim)
|
732
|
+
kax.pos = kax.pos*kconv if kconv
|
733
|
+
fax.pos = fax.pos*fconv if fconv
|
734
|
+
cunits = fax.pos.units / kax.pos.units
|
735
|
+
|
736
|
+
f = fax.pos.val
|
737
|
+
k = kax.pos.val
|
738
|
+
nk = k.length
|
739
|
+
nf = f.length
|
740
|
+
if no_kfreorder
|
741
|
+
k[nk/2+1..-1] = -k[nk/2+1..-1][-1..0]+k[nk/2]
|
742
|
+
f[nf/2+1..-1] = -f[nf/2+1..-1][-1..0]+f[nf/2]
|
743
|
+
end
|
744
|
+
f = -f
|
745
|
+
cp = f.newdim(0) / k.newdim(1) #cp[kdim,fdim]
|
746
|
+
jf0 = f.eq(0).where[0] # where f==0
|
747
|
+
jk0 = k.eq(0).where[0] # where k==0
|
748
|
+
if kf0_is_c0
|
749
|
+
cp[jk0,jf0] = 0.0 # treat k=f=0 as stationary (c=0)
|
750
|
+
else
|
751
|
+
cp[jk0,jf0] = 1.0/0.0 # not to count k=f=0 component at all (c=infty)
|
752
|
+
end
|
753
|
+
|
754
|
+
[cp, cunits]
|
755
|
+
end
|
756
|
+
|
757
|
+
end
|
758
|
+
end
|
759
|
+
|
760
|
+
######################################################
|
761
|
+
## < test >
|
762
|
+
if $0 == __FILE__
|
763
|
+
require "numru/ggraph"
|
764
|
+
|
765
|
+
include NumRu
|
766
|
+
include NMath
|
767
|
+
|
768
|
+
# < make a GPhys from scratch >
|
769
|
+
vx = VArray.new( NArray.float(11).indgen! * (3*Math::PI/11) ).rename("x")
|
770
|
+
vx.units = 'km'
|
771
|
+
vy = VArray.new( NArray.float(8).indgen! * (3*Math::PI/8) ).rename("y")
|
772
|
+
vy.units = 'km'
|
773
|
+
xax = Axis.new().set_pos(vx)
|
774
|
+
#yax = Axis.new(true).set_cell_guess_bounds(vy).set_pos_to_center
|
775
|
+
yax = Axis.new().set_pos(vy)
|
776
|
+
grid = Grid.new(xax, yax)
|
777
|
+
a = NArray.float(vx.length, vy.length)
|
778
|
+
a[] = sin(vx.val.newdim(1)) * cos(vy.val.newdim(0))
|
779
|
+
v = VArray.new( a )
|
780
|
+
v.units = 'm/s'
|
781
|
+
gpz = GPhys.new(grid,v)
|
782
|
+
|
783
|
+
print "Original:\n"
|
784
|
+
p gpz.val
|
785
|
+
fc = gpz.fft
|
786
|
+
print "2D FFT & abs:\n"
|
787
|
+
p fc.val.abs, fc.units.to_s, fc.coord(0).units.to_s
|
788
|
+
print "Check the invertivility: ",
|
789
|
+
(fc.fft(true) - gpz).abs.max, ' / ', gpz.abs.max, "\n"
|
790
|
+
sp = fc.abs**2
|
791
|
+
print "Check parsevals relation: ",
|
792
|
+
sp.sum, ' / ', (gpz**2).mean, "\n"
|
793
|
+
|
794
|
+
spex = sp.spect_zero_centering(0)
|
795
|
+
spex2 = spex.spect_one_sided(1)
|
796
|
+
print " sidedness changed --> ",spex.sum,", ",spex2.sum,"\n"
|
797
|
+
|
798
|
+
if defined?(FFTW3)
|
799
|
+
fc = gpz.fft(nil, 0)
|
800
|
+
print "1D FFT & abs:\n"
|
801
|
+
p fc.val.abs
|
802
|
+
print "Check the invertivility: ",
|
803
|
+
(fc.fft(true, 0) - gpz).abs.max, ' / ', gpz.abs.max, "\n"
|
804
|
+
sp = fc.abs**2
|
805
|
+
print "Check parsevals relation: ",
|
806
|
+
sp.sum(0).mean, ' / ', (gpz**2).mean, "\n"
|
807
|
+
end
|
808
|
+
|
809
|
+
print "\n** Check detrend **\n"
|
810
|
+
print "when NArray...\n"
|
811
|
+
EPS = 5e-14
|
812
|
+
a.indgen!
|
813
|
+
v = VArray.new( a )
|
814
|
+
gp = GPhys.new(grid,v)
|
815
|
+
gpdt = gp.detrend(0)
|
816
|
+
if gpdt.val.max <EPS; print "test succeeded\n";else; raise "test failed";end
|
817
|
+
gpdt = gp.detrend(1)
|
818
|
+
if gpdt.val.max <EPS; print "test succeeded\n";else; raise "test failed";end
|
819
|
+
print " -- NArrayMiss\n"
|
820
|
+
mask = a.le(47)
|
821
|
+
am = NArrayMiss.to_nam(a, mask)
|
822
|
+
v = VArray.new( am )
|
823
|
+
gp = GPhys.new(grid,v)
|
824
|
+
gpdt = gp.detrend(0)
|
825
|
+
#if gpdt.val.max <EPS; print "test succeeded\n";else; raise "test failed";end
|
826
|
+
p "The following should be basically zero:",gpdt.val
|
827
|
+
gpdt = gp.detrend(1)
|
828
|
+
#if gpdt.val.max <EPS; print "test succeeded\n";else; raise "test failed";end
|
829
|
+
p "The following should be basically zero:",gpdt.val
|
830
|
+
|
831
|
+
print "\n** Check cos_taper **\n"
|
832
|
+
a = NArray.float(30,10).fill!(1)
|
833
|
+
v = VArray.new( a )
|
834
|
+
xax2 = Axis.new().set_pos(VArray.new(NArray.float(30).indgen!).rename("x"))
|
835
|
+
yax2 = Axis.new().set_pos(VArray.new(NArray.float(10).indgen!).rename("y"))
|
836
|
+
gp = GPhys.new( Grid.new(xax2, yax2), v )
|
837
|
+
gpct = gp.cos_taper(0)
|
838
|
+
gpct = gp.cos_taper(0,1)
|
839
|
+
p gpct.val
|
840
|
+
p GPhys::COS_TAPER_SP_FACTOR, 1/GPhys::COS_TAPER_SP_FACTOR
|
841
|
+
|
842
|
+
print "\n** Check phase velocity binning **\n"
|
843
|
+
|
844
|
+
vd = VArray.new( NArray.to_na([0.0,1.0]),{"units"=>"m","long_name"=>"dummy"},"d")
|
845
|
+
dax = Axis.new().set_pos(vd)
|
846
|
+
vy.units = 'hour'
|
847
|
+
vy.name = 't'
|
848
|
+
|
849
|
+
xx = vx.val.newdim(1)
|
850
|
+
yy = vy.val.newdim(0)
|
851
|
+
a = sin(xx) * cos(yy) + 0.5*sin(xx*1.2+yy*0.6)
|
852
|
+
#a = 0.5*sin(xx*1.2+yy*0.7)
|
853
|
+
#a = sin(xx) * cos(yy) + 0.2*sin(xx+yy)
|
854
|
+
|
855
|
+
b = NArray.float(a.shape[0], 2, a.shape[1])
|
856
|
+
b[true,0,true] = a + 1
|
857
|
+
b[true,1,true] = a
|
858
|
+
v = VArray.new( b, {"units"=>"K", "long_name"=>"vv"}, "v" )
|
859
|
+
grid = Grid.new(xax, dax, yax)
|
860
|
+
gp = GPhys.new(grid, v)
|
861
|
+
|
862
|
+
fc = gp.fft(nil, 0, 2)
|
863
|
+
sp = fc.abs**2
|
864
|
+
fconv = UNumeric[1/3.6e3,"hour/s"]
|
865
|
+
kconv = UNumeric[1e-3,"km/m"]
|
866
|
+
csp = fc.phase_velocity_binning(0, 2, {"min"=>-2,"max"=>2,"int"=>0.25},
|
867
|
+
kconv, fconv)
|
868
|
+
p csp
|
869
|
+
#cspn = sp.phase_velocity_binning_iso_norml(0, 2, -2, 2, 0.25, kconv, fconv)
|
870
|
+
|
871
|
+
DCL.gropn(1)
|
872
|
+
DCL.sldiv('y',2,2)
|
873
|
+
GGraph::tone gp[true,0,true],true,"color_bar"=>true
|
874
|
+
GGraph::line csp[true,0].real,true, "max"=>0.6,"min"=>-0.6
|
875
|
+
GGraph::line csp[true,0].imag,false, "type"=>2
|
876
|
+
#GGraph::line cspn[true,0]
|
877
|
+
|
878
|
+
gpf = gp.phase_velocity_filter(0, 2, -2.0, 0.0, 1/kconv, 1/fconv)
|
879
|
+
GGraph::tone gpf[true,0,true],true,"color_bar"=>true
|
880
|
+
gpf = gp.phase_velocity_filter(0, 2, -0.3, -0.01, 1/kconv, 1/fconv)
|
881
|
+
GGraph::tone gpf[true,0,true],true,"color_bar"=>true
|
882
|
+
|
883
|
+
|
884
|
+
DCL.grcls
|
885
|
+
end
|
886
|
+
|