gphys 1.5.0 → 1.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +7 -0
  2. data/ChangeLog +7414 -0
  3. data/LICENSE.txt +1 -1
  4. data/Rakefile +0 -2
  5. data/doc/derivative/math-doc/document/images.log +385 -0
  6. data/doc/ep_flux/math-doc/document/images.log +1375 -0
  7. data/doc/ganalysis/doc/NumRu.html +203 -0
  8. data/doc/ganalysis/doc/NumRu/GAnalysis.html +931 -0
  9. data/doc/ganalysis/doc/NumRu/GAnalysis/BetaPlane.html +574 -0
  10. data/doc/ganalysis/doc/NumRu/GAnalysis/Fitting.html +576 -0
  11. data/doc/ganalysis/doc/NumRu/GAnalysis/LogP.html +425 -0
  12. data/doc/ganalysis/doc/NumRu/GAnalysis/Met.html +2021 -0
  13. data/doc/ganalysis/doc/NumRu/GAnalysis/MetZ.html +524 -0
  14. data/doc/ganalysis/doc/NumRu/GAnalysis/Planet.html +1047 -0
  15. data/doc/ganalysis/doc/NumRu/GAnalysis/QG.html +794 -0
  16. data/doc/ganalysis/doc/NumRu/GAnalysis/QG/Uninitialized.html +215 -0
  17. data/doc/ganalysis/doc/NumRu/GAnalysis/QG_common.html +603 -0
  18. data/doc/ganalysis/doc/NumRu/GAnalysis/QG_sphere.html +760 -0
  19. data/doc/ganalysis/doc/NumRu/GAnalysis/QG_sphere_common.html +251 -0
  20. data/doc/ganalysis/doc/NumRu/GAnalysis/QG_sphere_div.html +424 -0
  21. data/doc/ganalysis/doc/NumRu/GAnalysis/SigmaCoord.html +321 -0
  22. data/doc/ganalysis/doc/NumRu/GGraph.html +334 -0
  23. data/doc/ganalysis/doc/NumRu/GPhys.html +579 -0
  24. data/doc/ganalysis/doc/Object.html +210 -0
  25. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/beta_plane_rb.html +60 -0
  26. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/covariance_rb.html +56 -0
  27. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/eof_rb.html +64 -0
  28. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/fitting_rb.html +54 -0
  29. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/histogram_rb.html +58 -0
  30. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/log_p_rb.html +60 -0
  31. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/met_rb.html +60 -0
  32. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/met_z_rb.html +58 -0
  33. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/planet_rb.html +58 -0
  34. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/qg_rb.html +64 -0
  35. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/sigma_coord_rb.html +56 -0
  36. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis_rb.html +98 -0
  37. data/doc/ganalysis/doc/created.rid +13 -0
  38. data/doc/ganalysis/doc/images/brick.png +0 -0
  39. data/doc/ganalysis/doc/images/brick_link.png +0 -0
  40. data/doc/ganalysis/doc/images/bug.png +0 -0
  41. data/doc/ganalysis/doc/images/bullet_black.png +0 -0
  42. data/doc/ganalysis/doc/images/bullet_toggle_minus.png +0 -0
  43. data/doc/ganalysis/doc/images/bullet_toggle_plus.png +0 -0
  44. data/doc/ganalysis/doc/images/date.png +0 -0
  45. data/doc/ganalysis/doc/images/find.png +0 -0
  46. data/doc/ganalysis/doc/images/loadingAnimation.gif +0 -0
  47. data/doc/ganalysis/doc/images/macFFBgHack.png +0 -0
  48. data/doc/ganalysis/doc/images/package.png +0 -0
  49. data/doc/ganalysis/doc/images/page_green.png +0 -0
  50. data/doc/ganalysis/doc/images/page_white_text.png +0 -0
  51. data/doc/ganalysis/doc/images/page_white_width.png +0 -0
  52. data/doc/ganalysis/doc/images/plugin.png +0 -0
  53. data/doc/ganalysis/doc/images/ruby.png +0 -0
  54. data/doc/ganalysis/doc/images/tag_green.png +0 -0
  55. data/doc/ganalysis/doc/images/wrench.png +0 -0
  56. data/doc/ganalysis/doc/images/wrench_orange.png +0 -0
  57. data/doc/ganalysis/doc/images/zoom.png +0 -0
  58. data/doc/ganalysis/doc/index.html +383 -0
  59. data/doc/ganalysis/doc/js/darkfish.js +118 -0
  60. data/doc/ganalysis/doc/js/jquery.js +32 -0
  61. data/doc/ganalysis/doc/js/quicksearch.js +114 -0
  62. data/doc/ganalysis/doc/js/thickbox-compressed.js +10 -0
  63. data/doc/ganalysis/doc/rdoc.css +763 -0
  64. data/ext/numru/gphys/ext_init.c +1 -0
  65. data/ext/numru/gphys/quad_mesh_sample.c +478 -0
  66. data/gphys.gemspec +2 -2
  67. data/lib/numru/dclext.rb +394 -14
  68. data/lib/numru/derivative.rb +6 -0
  69. data/lib/numru/ganalysis/qg.rb +6 -4
  70. data/lib/numru/ggraph.rb +41 -8
  71. data/lib/numru/gphys/gphys.rb +62 -14
  72. data/lib/numru/gphys/gphys_io.rb +4 -4
  73. data/lib/numru/gphys/version.rb +2 -2
  74. metadata +84 -79
  75. data/.gitignore +0 -14
  76. data/TODO_ep_flux +0 -6
  77. data/gphys-bigmem.gemspec +0 -44
  78. data/install.rb +0 -130
  79. data/sample/cira86_to_nc.rb +0 -122
  80. data/sample/druby_cli1.rb +0 -23
  81. data/sample/druby_cli2.rb +0 -28
  82. data/sample/druby_serv1.rb +0 -30
  83. data/sample/druby_serv2.rb +0 -51
  84. data/sample/ep_flux/demo_NCEP_1.rb +0 -48
  85. data/sample/ep_flux/demo_NCEP_2.rb +0 -57
  86. data/sample/ep_flux/demo_NCEP_3.rb +0 -81
  87. data/sample/ggraph_latlon_labelling_dr002690.rb +0 -159
  88. data/sample/ggraph_mapfit-axes_dr002687.rb +0 -131
  89. data/sample/map_projection.rb +0 -121
  90. data/sample/ncep_theta_coord.rb +0 -79
  91. data/test_old/eof_slp.rb +0 -28
  92. data/test_old/mltbit.dat +0 -0
  93. data/test_old/test_ep_flux.rb +0 -533
  94. data/test_old/test_multibitIO.rb +0 -19
@@ -1,121 +0,0 @@
1
- =begin
2
- =map_projection.rb
3
- ==USAGE
4
- % ruby map_projection.rb [wsn]
5
- where wsn is 1,2,3,or 4.
6
- PNG files will be dumped if wsn==4.
7
- =end
8
-
9
- require 'numru/ggraph'
10
- include NumRu
11
-
12
- wsn = ( ARGV[0] ? ARGV[0].to_i : 1 )
13
-
14
- path = '../testdata/T.jan.nc'
15
- var = 'T'
16
- gp = GPhys::IO.open(path,var)
17
-
18
- DCL.swpset('ldump',true) if wsn == 4
19
- DCL.gropn(wsn)
20
- DCL.sldiv('t',3,2)
21
- DCL.uzfact(1.1)
22
- DCL.sgpset('lcntl',false)
23
-
24
- # < defalut: itr==1 >
25
- GGraph.set_fig('viewport'=>[0.2,0.8,0.21,0.81])
26
- GGraph.tone( gp )
27
- DCL.grfrm
28
-
29
- # < map projection >
30
-
31
- GGraph.set_map('vpt_boundary'=>true, 'coast_world'=>true)
32
-
33
- itr=11
34
- GGraph.set_fig('itr'=>itr)
35
- [ [180.0,0.0,0.0], [180.0,0.0,180.0] ].each do |axis|
36
- GGraph.next_fig('map_axis'=>axis)
37
- GGraph.tone( gp.cut('lat'=>-70.0..-20.0) )
38
- DCL::sgtxzr(0.5, 0.15, DCL::sgtrnl(itr).strip+" map_axis=#{axis.inspect}",
39
- 0.03, 0, 0, 3)
40
-
41
- GGraph.next_fig('map_axis'=>axis, 'map_window'=>[-180.0,180.0,-70.0,-20.0])
42
- GGraph.tone( gp.cut('lat'=>-70.0..-20.0) )
43
- DCL::sgtxzr(0.5, 0.15, DCL::sgtrnl(itr).strip+" map_axis=#{axis.inspect}",
44
- 0.03, 0, 0, 3)
45
- end
46
-
47
- [ [180.0,0.0,90.0], [180.0,0.0,60.0] ].each do |axis|
48
- GGraph.next_fig('map_axis'=>axis)
49
- GGraph.tone( gp.cut('lat'=>-70.0..-20.0) )
50
- DCL::sgtxzr(0.5, 0.15, DCL::sgtrnl(itr).strip+" map_axis=#{axis.inspect}",
51
- 0.03, 0, 0, 3)
52
- end
53
-
54
- GGraph.set_map('vpt_boundary'=>false)
55
-
56
- [10,11,12,13,14,15].each do |itr|
57
- GGraph.next_fig('itr'=>itr)
58
- GGraph.tone( gp )
59
- DCL::sgtxzr(0.5, 0.15, DCL::sgtrnl(itr), 0.03, 0, 0, 3)
60
- end
61
-
62
- [20,21,22,23,30,31,32,33].each do |itr|
63
- GGraph.next_fig('itr'=>itr)
64
- if itr==31 # polar stereo
65
- GGraph.next_map('vpt_boundary'=>3)
66
- DCL::sgpset('lclip', true)
67
- else
68
- DCL::sgpset('lclip', false)
69
- end
70
- GGraph.tone( gp )
71
- DCL::sgtxzr(0.5, 0.15, DCL::sgtrnl(itr), 0.03, 0, 0, 3)
72
-
73
- axis = [135,60,0]
74
- GGraph.next_fig('itr'=>itr,'map_axis'=>axis,'map_radius'=>60.0)
75
- GGraph.next_map('vpt_boundary'=>3) if itr==31 # polar stereo
76
- GGraph.tone( gp.cut('lat'=>0..90) )
77
- DCL::sgtxzr(0.5, 0.15, DCL::sgtrnl(itr).strip+" map_axis=#{axis.inspect}",
78
- 0.03, 0, 0, 3)
79
- end
80
-
81
- # < cylindrical and mercator; effects of 'map_fit' >
82
-
83
- gpjpn = gp.cut(110..160,10..70,false)
84
-
85
- itr = 10
86
- GGraph.next_fig('itr'=>itr)
87
- GGraph.tone( gpjpn )
88
- DCL::sgtxzr(0.5, 0.15, DCL::sgtrnl(itr).strip+' defaut', 0.03, 0, 0, 3)
89
-
90
- itr = 10
91
- GGraph.next_fig('itr'=>itr, 'map_fit'=>false )
92
- GGraph.tone( gpjpn )
93
- DCL::sgtxzr(0.5, 0.15, DCL::sgtrnl(itr).strip+" 'map_fit'=>false", 0.03, 0, 0, 3)
94
-
95
- itr=11
96
- GGraph.next_fig('itr'=>itr)
97
- GGraph.tone( gpjpn )
98
- DCL::sgtxzr(0.5, 0.15, DCL::sgtrnl(itr).strip+' defaut', 0.03, 0, 0, 3)
99
-
100
- GGraph.next_fig('itr'=>itr, 'map_fit'=>true)
101
- GGraph.tone( gpjpn)
102
- DCL::sgtxzr(0.5, 0.15, DCL::sgtrnl(itr).strip+" 'map_fit'=>true", 0.03, 0, 0, 3)
103
-
104
- itr = 10
105
- GGraph.next_fig('itr'=>itr)
106
- GGraph.tone( gpjpn, true, 'map_axes'=>true, 'title'=>'itr=10 & map_axes=true' )
107
- GGraph.contour( gpjpn, false, 'map_axes'=>true, 'title'=>'itr=10 & map_axes=true' )
108
-
109
- gpjpn2 = gp.cut(110..180,10..70,false)
110
-
111
- itr = 10
112
- GGraph.next_fig('itr'=>itr)
113
- GGraph.contour( gpjpn2, true, 'map_axes'=>true, 'title'=>'itr=10 & map_axes=true' )
114
-
115
- #itr = 10
116
- #GGraph.next_fig('itr'=>itr)
117
- #GGraph.vector( gpjpn, gpjpn, true, 'map'=>true, 'title'=>'itr=10 & map_axes=true', 'unit_vect'=>true )
118
-
119
-
120
- DCL.grcls
121
-
@@ -1,79 +0,0 @@
1
- # = Sample program to use GPhys#interpolation by using NCEP reanalysis data
2
- #
3
- # USAGE
4
- #
5
- # % ruby ncep_theta_coord.rb [data_directory [varname [year [day_of_yr_from0]]]]
6
- #
7
- # COMMAND-LINE OPTIONS
8
- #
9
- # * data_directory : directory where the NCEP data situated -- by default
10
- # an existing OPeNDAP directory is specified -- so it should work,
11
- # though it may be slow for network data transfer.
12
- # * others : you can guess -- see the source code.
13
- #
14
- # DESCRIPTION
15
- #
16
- # Here are two samples: one is a simple interpolation along a coordinate
17
- # and the other is a coordinate transformation from pressure to potential
18
- # temperature (isentropic coordinate).
19
-
20
- require "numru/ggraph"
21
- include NumRu
22
-
23
-
24
- dir = ARGV[0] || "http://db-dods.rish.kyoto-u.ac.jp/cgi-bin/nph-dods/ncep/ncep.reanalysis.dailyavgs/pressure"
25
-
26
- vname = ARGV[1] || "uwnd" # name of the variable to be interpolated
27
-
28
- year = ARGV[2] || 2008
29
- iday = ( ARGV[3] || 0 ).to_i # day of the year
30
-
31
-
32
- xsel = 0
33
- temp = GPhys::IO.open(dir+"/air.#{year}.nc","air")[xsel,false,2..-1,iday]
34
- gp = GPhys::IO.open(dir+"/#{vname}.#{year}.nc",vname)[xsel,false,2..-1,iday]
35
-
36
- prs = temp.axis("level").to_gphys
37
- p00 = UNumeric[1000.0, "millibar"]
38
- kappa = 2.0 / 7.0
39
- pfact = (prs/p00)**(-kappa)
40
-
41
- theta = temp * pfact
42
- theta.name = "theta"
43
- theta.long_name = "potential theta"
44
-
45
- gp.set_assoc_coords([theta])
46
-
47
- tht_crd = VArray.new( NArray[300.0,350.0, 400.0, 500.0, 700.0, 800.0] ).rename("theta")
48
- gp_ontht = gp.interpolate("level"=>tht_crd)
49
-
50
- p_crd = VArray.new( NArray[25.0, 15.0] ).rename("level")
51
- p_crd.units = "hPa"
52
- gp_onp = gp.interpolate(p_crd) # 1D: same as interpolate("level"=>p_crd)
53
-
54
- DCL.swpset('iwidth',800)
55
- DCL.swpset('iheight',800)
56
-
57
- DCL.gropn(1)
58
- DCL.sgpset('isub', 96) # control character of subscription: '_' --> '`'
59
- DCL.glpset('lmiss',true)
60
- DCL.sldiv('y',2,2)
61
-
62
- GGraph::set_fig "itr"=>2
63
-
64
- GGraph::tone_and_contour theta[false],true,"int"=>50
65
- GGraph::color_bar
66
-
67
- GGraph::tone_and_contour gp[false],true
68
- GGraph::color_bar
69
-
70
- GGraph::set_fig "itr"=>1
71
-
72
- GGraph::tone_and_contour gp_onp[false],true,"keep"=>true
73
- GGraph::color_bar
74
-
75
- GGraph::tone_and_contour gp_ontht[false],true,"keep"=>true
76
- GGraph::color_bar
77
-
78
-
79
- DCL.grcls
data/test_old/eof_slp.rb DELETED
@@ -1,28 +0,0 @@
1
- require "numru/gphys"
2
- require "numru/ganalysis"
3
- require "numru/ggraph"
4
- include NumRu
5
-
6
- slp = GPhys::IO.open("slp.mon.mean.nc","slp") # ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.derived/surface/slp.mon.mean.nc
7
- slp = slp.cut("lat"=>30..90) # 北緯30度以北のデータを使用する
8
- slp = slp[{0..-1,4},{0..-1,2},true] # 経度, 緯度について4, 2点おきに読む
9
- # 計算時間を速めるため(∴不要)
10
- nt = slp.shape[2]
11
- mon = NArray.sint(12,nt/12).indgen #=> [ [0,1,..,11], [12,13,..,23], .. ]
12
- mon = mon[[0,1,11],true] # [0,1,11]: Jan,Feb,Dec (use [0] to include only Jan)
13
- mon = mon.reshape!(mon.total) # to 1D (list of months to use)
14
- slp = slp[true,true,mon] # 12,1,2月のデータを切取り
15
-
16
- vec,val = slp.eof("time","norder"=>2) # EOF第2モードまで計算する
17
-
18
- DCL::gropn(4)
19
- GGraph.set_fig("itr"=>32)
20
- eof = vec[true,true,0]
21
- if eof.cut("lat"=>90).mean > 0
22
- eof = -eof # 北極における値がが負になるようにする
23
- end
24
- GGraph.tone(eof, true, "min"=>-7.0, "max"=>7.0)
25
- GGraph.contour(eof,false, "min"=>-7.0, "max"=>7.0)
26
- GGraph.map("coast_world"=>true)
27
-
28
- DCL::grcls
data/test_old/mltbit.dat DELETED
Binary file
@@ -1,533 +0,0 @@
1
- =begin
2
- =test.rb for module NumRu::GPhys::EP_Flux in ep_flux.rb
3
-
4
- ==todo
5
- * add draw code.
6
- =end
7
-
8
- require 'narray'
9
- require 'numru/gphys'
10
- require 'numru/gphys/ep_flux'
11
- require 'getopts' # to use option
12
-
13
- include NumRu
14
- include NMath
15
-
16
- ########################################################
17
- ######## Define Test Methods ########
18
-
19
- ## -----------------------------------------------------
20
- # preparation GPhys objects for test
21
-
22
- def gen_gphys__W_and_Temp_in_z_coordinate(na_u,na_v,na_w,na_t,
23
- na_lon,na_lat,na_z)
24
- ## make GPhys
25
- grid = make_grid_in_z(na_lon, na_lat, na_z)
26
- gp_u = GPhys.new(grid, make_va_u( na_u ))
27
- gp_v = GPhys.new(grid, make_va_v( na_v ))
28
- gp_w = GPhys.new(grid, make_va_w( na_w ))
29
- gp_t = GPhys.new(grid, make_va_t( na_t ))
30
- return gp_u, gp_v, gp_w, gp_t
31
- end
32
-
33
- def gen_gphys__W_and_Temp_in_p_coordinate(na_u,na_v,na_w,na_t,
34
- na_lon,na_lat,na_p)
35
- ## make GPhys
36
- grid = make_grid_in_p(na_lon, na_lat, na_p)
37
- gp_u = GPhys.new(grid, make_va_u( na_u ))
38
- gp_v = GPhys.new(grid, make_va_v( na_v ))
39
- gp_w = GPhys.new(grid, make_va_w( na_w ))
40
- gp_t = GPhys.new(grid, make_va_t( na_t ))
41
- return gp_u, gp_v, gp_w, gp_t
42
- end
43
-
44
- def gen_gphys__Omega_and_Theta_in_z_coordinate(na_u,na_v,na_omega,na_theta,
45
- na_lon,na_lat,na_z)
46
- ## make GPhys
47
- grid = make_grid_in_z(na_lon, na_lat, na_z)
48
- gp_u = GPhys.new(grid, make_va_u( na_u ))
49
- gp_v = GPhys.new(grid, make_va_v( na_v ))
50
- gp_omega = GPhys.new(grid, make_va_omega( na_omega ))
51
- gp_theta = GPhys.new(grid, make_va_theta( na_theta ))
52
- return gp_u, gp_v, gp_omega, gp_theta
53
- end
54
-
55
-
56
- def make_grid_in_z(na_lon, na_lat, na_z)
57
- va_lon = VArray.new( na_lon,
58
- {"long_name"=>"longitude","units"=>"degrees"},
59
- "lon" )
60
- va_lat = VArray.new( na_lat,
61
- {"long_name"=>"latitude","units"=>"degrees"},
62
- "lat" )
63
- va_z = VArray.new( na_z,
64
- {"long_name"=>"altitude","units"=>"m"},
65
- "alt" )
66
- lon = Axis.new.set_pos(va_lon)
67
- lat = Axis.new.set_pos(va_lat)
68
- z = Axis.new.set_pos(va_z)
69
- return Grid.new(lon, lat, z)
70
- end
71
-
72
- def make_grid_in_p(na_lon, na_lat, na_p)
73
- va_lon = VArray.new( na_lon,
74
- {"long_name"=>"longitude","units"=>"degrees"},
75
- "lon" )
76
- va_lat = VArray.new( na_lat,
77
- {"long_name"=>"latitude","units"=>"degrees"},
78
- "lat" )
79
- va_p = VArray.new( na_p,
80
- {"long_name"=>"pressure","units"=>"mb"},
81
- "p" )
82
- lon = Axis.new.set_pos(va_lon)
83
- lat = Axis.new.set_pos(va_lat)
84
- pres = Axis.new.set_pos(va_p)
85
- return Grid.new(lon, lat, pres)
86
- end
87
-
88
- def make_va_u( na_u )
89
- VArray.new( na_u, {"long_name"=>"U","units"=>"m/s"}, "u" )
90
- end
91
- def make_va_v( na_v )
92
- VArray.new( na_v, {"long_name"=>"V","units"=>"m/s"}, "v" )
93
- end
94
- def make_va_w( na_w )
95
- VArray.new( na_w, {"long_name"=>"W","units"=>"m/s"}, "w" )
96
- end
97
- def make_va_omega( na_omega )
98
- VArray.new( na_omega,
99
- {"long_name"=>"Omega","units"=>"mb/s"}, "Omega" )
100
- end
101
- def make_va_t( na_t )
102
- VArray.new( na_t, {"long_name"=>"T","units"=>"K"}, "t" )
103
- end
104
- def make_va_theta( na_theta )
105
- VArray.new( na_theta,
106
- {"long_name"=>"Theta","units"=>"K"}, "theta" )
107
- end
108
-
109
- def gen_na_lon(nlon)
110
- NArray.float(nlon).indgen! / (nlon) * 360.0 # [0, ..., (360 - 1/nlon)]
111
- end
112
- def gen_na_lat(nlat)
113
- NArray.float(nlat).indgen! / (nlat - 1) * 180.0 - 90.0 # [90, .., -90]
114
- end
115
- def gen_na_z1(nz)
116
- NArray.sfloat(nz).indgen!/(nz-1)
117
- end
118
- def gen_na_z2(nz)
119
- 1000 * 10 ** (-NArray.float(nz).indgen!/(nz-1)) # [1000, .., 100]
120
- end
121
-
122
- ## -----------------------------------------------------
123
- # output method for error check
124
-
125
- def print_error_ratio_max_and_mean(numerical_na, analytical_na)
126
- error_ratio = ((numerical_na - analytical_na).abs / ( analytical_na.abs ).max)
127
- print " error_ratio max,mean (for each alt):\n"
128
- for k in 0...error_ratio.shape[1]
129
- printf("%4s%10.5e%4s%10.5e%s", "", error_ratio[true,k,false].max(0),
130
- "", error_ratio[true,k,false].mean(0), "\n")
131
- end
132
- end
133
-
134
-
135
- ## -----------------------------------------------------
136
- # output method for attribute check
137
-
138
- def show_attr(gp)
139
- case gp.data.rank
140
- when 1
141
- fm = "%-15s%-20s%-10s%s"
142
- printf(fm, " <attr_name>", "<data>", "<axis>", "\n")
143
- printf(fm, " name", gp.data.name, gp.axis(0).pos.name, "\n")
144
- gp.data.att_names.each{|nm|
145
- printf(fm, " "+nm, gp.data.get_att(nm).to_s,
146
- gp.axis(0).pos.get_att(nm).to_s, "\n")
147
- }
148
- when 2
149
- fm = "%-15s%-20s%-10s%-10s%s"
150
- printf(fm, " <attr_name>", "<data>", "<axis_y>", "<axis_z>", "\n")
151
- printf(fm, " name", gp.data.name,
152
- gp.axis(0).pos.name,
153
- gp.axis(1).pos.name,"\n")
154
- gp.data.att_names.each{|nm|
155
- printf(fm, " "+nm, gp.data.get_att(nm).to_s,
156
- gp.axis(0).pos.get_att(nm).to_s,
157
- gp.axis(1).pos.get_att(nm).to_s, "\n")
158
- }
159
- when 3
160
- fm = "%-15s%-20s%-10s%-10s%-10s%s"
161
- printf(fm, " <attr_name>","<data>","<axis_x>","<axis_y>","<axis_z>", "\n")
162
- printf(fm, " name", gp.data.name,
163
- gp.axis(0).pos.name,
164
- gp.axis(1).pos.name,
165
- gp.axis(2).pos.name,"\n")
166
- gp.data.att_names.each{|nm|
167
- printf(fm, " "+nm, gp.data.get_att(nm).to_s,
168
- gp.axis(0).pos.get_att(nm).to_s,
169
- gp.axis(1).pos.get_att(nm).to_s,
170
- gp.axis(2).pos.get_att(nm).to_s, "\n")
171
- }
172
- end
173
- end
174
-
175
- ########################################################
176
- ######## Main Routine ########
177
-
178
-
179
- #############
180
- ## check netCDF output flag
181
-
182
- unless getopts('n')
183
- print "#{$0}:illegal options. \n"
184
- exit 1
185
- end
186
- if $OPT_n
187
- nc_output_flag = true # output test variable as NetCDF.
188
- else
189
- nc_output_flag = false # not output NetCDF.
190
- end
191
-
192
-
193
- p "##############################################################"
194
- p "#### << Section 1 -- test accesor method >> ####"
195
-
196
- # get DEFAULT constants
197
- default_h = GPhys::EP_Flux::scale_height
198
- default_radius = GPhys::EP_Flux::radius
199
- default_rot = GPhys::EP_Flux::rot_period
200
- default_g = GPhys::EP_Flux::g_forces
201
- default_p00 = GPhys::EP_Flux::p00
202
- default_cp = GPhys::EP_Flux::cp
203
- default_gas_const = GPhys::EP_Flux::gas_const
204
-
205
- # set module constants
206
- GPhys::EP_Flux::scale_height = UNumeric.new(1, "m")
207
- GPhys::EP_Flux::radius = UNumeric.new(1, "")
208
- GPhys::EP_Flux::rot_period = UNumeric.new(10, "rad/s")
209
- GPhys::EP_Flux::g_forces = UNumeric.new(1, "m.s-2")
210
- GPhys::EP_Flux::p00 = UNumeric.new(1, "Pa")
211
- GPhys::EP_Flux::cp = UNumeric.new(1, "")
212
- GPhys::EP_Flux::gas_const = UNumeric.new(1, "")
213
-
214
- # get GIVEN constants
215
- h = GPhys::EP_Flux::scale_height
216
- radius = GPhys::EP_Flux::radius
217
- rot = GPhys::EP_Flux::rot_period
218
- g = GPhys::EP_Flux::g_forces
219
- p00 = GPhys::EP_Flux::p00
220
- cp = GPhys::EP_Flux::cp
221
- gas_const = GPhys::EP_Flux::gas_const
222
-
223
- # compare default and given values.
224
- fm = "%-15s%15s%17s%s" # format of output
225
-
226
- p "*********** compare default and given values ***********"
227
- printf(fm, " <name>", "<default value>", "<given value>","\n")
228
- printf(fm, " scale_height", default_h.to_s, h.to_s, "\n")
229
- printf(fm, " radius", default_radius.to_s, radius.to_s, "\n")
230
- printf(fm, " rot_period", default_rot.to_s, rot.to_s, "\n")
231
- printf(fm, " g_forces", default_g.to_s, g.to_s, "\n")
232
- printf(fm, " p00", default_p00.to_s, p00.to_s, "\n")
233
- printf(fm, " cp", default_cp.to_s, cp.to_s, "\n")
234
- printf(fm, " gas_const", default_gas_const.to_s, gas_const.to_s, "\n")
235
-
236
- # test ((<set_constants>)) and ((<get_constants>))
237
- GPhys::EP_Flux::set_constants(default_h, default_radius, default_rot,
238
- default_g, default_p00, default_cp,
239
- default_gas_const)
240
- # clean up after tests (backto default values)
241
- h, radius, rot, g, p00, cp, gas_const = GPhys::EP_Flux::get_constants
242
- p "*** test ((<set_constants>)) and ((<get_constants>)) ***"
243
- printf(fm, " <name>", "<set_constants>", "<get_constants>", "\n")
244
- printf(fm, " scale_height", default_h.to_s, h.to_s, "\n")
245
- printf(fm, " radius", default_radius.to_s, radius.to_s, "\n")
246
- printf(fm, " rot_period", default_rot.to_s, rot.to_s, "\n")
247
- printf(fm, " g_forces", default_g.to_s, g.to_s, "\n")
248
- printf(fm, " p00", default_p00.to_s, p00.to_s, "\n")
249
- printf(fm, " cp", default_cp.to_s, cp.to_s, "\n")
250
- printf(fm, " gas_const", default_gas_const.to_s, gas_const.to_s, "\n")
251
-
252
-
253
- p "##############################################################"
254
- p "#### << Section 2 -- test deriv method >> ####"
255
-
256
- # preparate for testdata
257
- n = 21
258
- x = exp(-NArray.sfloat(n).indgen!/(n-1)) # un-uniform grid
259
- f = NArray.sfloat(n).indgen!
260
- ax = Axis.new.set_pos( VArray.new( x ,
261
- {"long_name"=>"longitude", "units"=>"rad"},
262
- "lon" ))
263
- data = VArray.new( f,
264
- {"long_name"=>"temperature", "units"=>"K"},
265
- "t" )
266
- gp = GPhys.new(Grid.new(ax), data)
267
-
268
- # threepoint_O2nd_deriv
269
- dgp_dx = GPhys::EP_Flux::deriv(gp, 0)
270
- dgp_dx2 = GPhys::Derivative::threepoint_O2nd_deriv(gp, 0)
271
- show_attr(dgp_dx)
272
- err = ( dgp_dx.data.val - dgp_dx2.data.val )
273
- p err.abs.max
274
-
275
- # cderiv
276
- GPhys::EP_Flux::set_deriv_method('cderiv')
277
- dgp_dx = GPhys::EP_Flux::deriv(gp, 0)
278
- dgp_dx2 = GPhys::Derivative::cderiv(gp, 0)
279
- show_attr(dgp_dx)
280
- err = ( dgp_dx.data.val - dgp_dx2.data.val )
281
- p err.abs.max
282
-
283
- GPhys::EP_Flux::set_deriv_method('cderiv') # backto default method
284
-
285
- p "##############################################################"
286
- p "#### << Section 3 -- test calculate method >> ####"
287
-
288
- ############
289
- ## setup for making testdata
290
-
291
- ### constants
292
- GPhys::EP_Flux::scale_height = UNumeric.new(1, "m")
293
- GPhys::EP_Flux::radius = UNumeric.new(1, "m")
294
- h, radius, rot, g, = GPhys::EP_Flux::get_constants
295
- h = h.val; radius = radius.val; rot = rot.val
296
- p00_Pa = GPhys::EP_Flux::p00.val
297
- p00 = GPhys::EP_Flux::p00.convert( Units.new("mb") ).val
298
- kappa = (GPhys::EP_Flux::gas_const / GPhys::EP_Flux::cp).val
299
-
300
- ### make NArray of axis
301
- nlon = 100; nlat = 50; nz = 10
302
- na_lon = gen_na_lon(nlon)
303
- na_lat = gen_na_lat(nlat)
304
- na_z = gen_na_z1(nz)
305
- na_p = gen_na_z2(nz)
306
- na_lambda = PI/180.0*na_lon # convert deg => rad
307
- na_phi = PI/180.0*na_lat # convert deg => rad
308
- ### make NArray of data
309
- # make axis term
310
- to_3D = NArray.sfloat(nlon, nlat, nz).fill!(1.0)
311
-
312
- sin_lambda = sin(na_lambda).reshape(nlon, 1, 1)
313
- cos_phi = cos(na_phi).reshape(1, nlat, 1)
314
- sin_phi = sin(na_phi).reshape(1, nlat, 1)
315
- tan_phi = sin_phi/cos_phi
316
- z = na_z.reshape(1, 1, nz)
317
- p = na_p.reshape(1, 1, nz)
318
- eddy = ( sin_lambda * cos_phi * to_3D) # common eddy term
319
-
320
- # make each data na in z
321
- na_u = 1.0 * eddy + 10 + z
322
- na_v = 2.0 * eddy + 20
323
- na_w = 3.0 * eddy + 30
324
- na_t = 4.0 * eddy + 40
325
- na_omega = ( 3.0 * eddy + 30 ) * -p00/h * exp(-z/h)
326
- na_theta = ( 4.0 * eddy + 40 ) * exp(kappa*z/h)
327
-
328
- # make each data na in p
329
- na_u_p = 1.0 * eddy + 10 + p
330
- na_v_p = na_v
331
- na_w_p = na_w
332
- na_t_p = na_t
333
-
334
-
335
- p "--------------------------------------------------------------"
336
- p "==== pattern 1: W, T in z-coordinate ===="
337
- p "--------------------------------------------------------------"
338
-
339
- # generate test GPhys objects.
340
- gp_u, gp_v, gp_w, gp_t = \
341
- gen_gphys__W_and_Temp_in_z_coordinate(na_u, na_v, na_w, na_t,
342
- na_lon, na_lat, na_z)
343
-
344
- # calculate EP Flux, etc.
345
- ( epflx_y, epflx_z, v_rmean, w_rmean, gp_lat, gp_z,
346
- u_mean, theta_mean,
347
- uv_dash, vt_dash, uw_dash, dtheta_dz) = \
348
- GPhys::EP_Flux::ep_full_sphere(gp_u,gp_v,gp_w,gp_t,true)
349
-
350
- # calculate EP Flux divergence
351
- epflx_div = GPhys::EP_Flux::div_sphere(epflx_y, epflx_z)
352
-
353
- # calculate Residual merdional mean circulation
354
- strm_rmean = GPhys::EP_Flux::strm_rmean(v_rmean)
355
-
356
- # analytical functions. (these are not smart code.)
357
- f = 2*2*PI/rot*sin_phi
358
- sig_cos3 = exp( -z/h )*cos_phi**3
359
- avort = ( f + (10 + z)/radius*tan_phi )
360
- epflx_y_ana = (sig_cos3 * ( h/(10.0*kappa) - 1 )).reshape(nlat,nz)
361
- epflx_z_ana = (sig_cos3 * ( avort* h/(10.0*kappa) - 1.5 )).reshape(nlat,nz)
362
- u_mean_ana = 10 + na_z.reshape(1,nz)
363
- theta_mean_ana = 40 * exp(kappa*na_z.reshape(1,nz)/h)
364
- uv_dash_ana = cos(na_phi.reshape(nlat, 1))**2
365
- vt_dash_ana = 4* cos(na_phi.reshape(nlat, 1))**2 * exp(kappa*na_z.reshape(1,nz)/h)
366
- uw_dash_ana = 1.5 * cos(na_phi.reshape(nlat, 1))**2
367
- dtheta_dz_ana = 40 * kappa/h * exp(kappa*na_z.reshape(1,nz)/h)
368
- epflx_div_ana = ( exp( -z/h )*(-4)*(cos_phi**2)*sin_phi/radius * ( h/(10.0*kappa) - 1 )).reshape(nlat,nz) \
369
- - epflx_z_ana/h + (( exp( -z/h )*( cos_phi**2 *sin_phi) ) / radius * h/(10.0*kappa)).reshape(nlat,nz)
370
- v_rmean_ana = 20 + cos(na_phi.reshape(nlat, 1))**2/10/kappa
371
- w_rmean_ana = 30 + 3*h*cos(na_phi.reshape(nlat, 1))*sin(na_phi.reshape(nlat, 1))/10/radius/kappa
372
- na_zp = p00_Pa*exp(-z/h).reshape(1, nz)
373
- strm_rmean_ana = v_rmean_ana * 2 * PI * radius * cos(na_phi.reshape(nlat, 1)) * (na_zp - na_zp[-1])/g.val + v_rmean_ana[-1] * PI * radius * cos(na_phi.reshape(nlat, 1)) * na_zp[-1]/g.val
374
-
375
-
376
- ### check_precision_and_attribute
377
- ["epflx_y", "epflx_z", "v_rmean", "w_rmean", "u_mean", "theta_mean",
378
- "uv_dash", "vt_dash", "uw_dash", "dtheta_dz", "epflx_div", "strm_rmean"].each { |gp_nm|
379
- gp = eval(gp_nm) # ex. "epflx_y" => epflx_y
380
- gp_ana = eval(gp_nm+"_ana") # ex. "epflx_y" => epflx_y_na
381
- title = gp.data.get_att("long_name").to_s
382
- p "***************** #{title} *****************"
383
- show_attr(gp)
384
- print_error_ratio_max_and_mean(gp.data.val, gp_ana)
385
- }
386
-
387
- p "--------------------------------------------------------------"
388
- p "==== pattern 2: Omega, Theta in z-coordinate ===="
389
- p "--------------------------------------------------------------"
390
-
391
- gp_u, gp_v, gp_omega, gp_theta = \
392
- gen_gphys__Omega_and_Theta_in_z_coordinate(na_u, na_v, na_omega, na_theta,
393
- na_lon, na_lat, na_z)
394
- ( epflx_y, epflx_z, v_rmean, w_rmean, gp_lat, gp_z,
395
- u_mean, theta_mean,
396
- uv_dash, vt_dash, uw_dash, dtheta_dz) = \
397
- GPhys::EP_Flux::ep_full_sphere(gp_u,gp_v,gp_omega,gp_theta,false)
398
-
399
- epflx_div = GPhys::EP_Flux::div_sphere(epflx_y, epflx_z)
400
-
401
- # calculate Residual merdional mean circulation
402
- strm_rmean = GPhys::EP_Flux::strm_rmean(v_rmean)
403
-
404
- ## analytical functions
405
- f = 2*2*PI/rot*sin_phi
406
- sig_cos3 = exp( -z/h )*cos_phi**3
407
- avort = ( f + (10 + z)/radius*tan_phi )
408
- epflx_y_ana = (sig_cos3 * ( h/(10.0*kappa) - 1 )).reshape(nlat,nz)
409
- epflx_z_ana = (sig_cos3 * ( avort* h/(10.0*kappa) - 1.5 )).reshape(nlat,nz)
410
- u_mean_ana = 10 + na_z.reshape(1,nz)
411
- theta_mean_ana = 40 * exp(kappa*na_z.reshape(1,nz)/h)
412
- uv_dash_ana = cos(na_phi.reshape(nlat, 1))**2
413
- vt_dash_ana = 4* cos(na_phi.reshape(nlat, 1))**2 * exp(kappa*na_z.reshape(1,nz)/h)
414
- uw_dash_ana = 1.5 * cos(na_phi.reshape(nlat, 1))**2
415
- dtheta_dz_ana = 40 * kappa/h * exp(kappa*na_z.reshape(1,nz)/h)
416
- epflx_div_ana = ( exp( -z/h )*-4*cos_phi**2*sin_phi/radius * ( h/(10.0*kappa) - 1 )).reshape(nlat,nz) \
417
- - epflx_z_ana/h + \
418
- (( exp( -z/h )*(cos_phi**2 * sin_phi) ) /radius * h/(10.0*kappa)).reshape(nlat,nz)
419
- v_rmean_ana = 20 + cos(na_phi.reshape(nlat, 1))**2/10/kappa
420
- w_rmean_ana = 30 + 3*h*cos(na_phi.reshape(nlat, 1))*sin(na_phi.reshape(nlat, 1))/10/radius/kappa
421
- na_zp = p00_Pa*exp(-z/h).reshape(1, nz)
422
- #strm_rmean_ana = v_rmean_ana * 2 * PI * radius * cos(na_phi.reshape(nlat, 1)) * na_zp/g.val
423
- strm_rmean_ana = v_rmean_ana * 2 * PI * radius * cos(na_phi.reshape(nlat, 1)) * (na_zp - na_zp[-1])/g.val + v_rmean_ana[-1] * PI * radius * cos(na_phi.reshape(nlat, 1)) * na_zp[-1]/g.val
424
-
425
- ### check_precision_and_attribute
426
- ["epflx_y", "epflx_z", "v_rmean", "w_rmean", "u_mean", "theta_mean",
427
- "uv_dash", "vt_dash", "uw_dash", "dtheta_dz", "epflx_div", "strm_rmean"].each { |gp_nm|
428
- gp = eval(gp_nm) # ex. "epflx_y" => epflx_y
429
- gp_ana = eval(gp_nm+"_ana") # ex. "epflx_y" => epflx_y_na
430
- title = gp.data.get_att("long_name").to_s
431
- p "***************** #{title} *****************"
432
- show_attr(gp)
433
- print_error_ratio_max_and_mean(gp.data.val, gp_ana)
434
- }
435
-
436
- p "--------------------------------------------------------------"
437
- p "==== pattern 3: W, T in p-coordinate ===="
438
- p "--------------------------------------------------------------"
439
-
440
- gp_u, gp_v, gp_w, gp_t = \
441
- gen_gphys__W_and_Temp_in_p_coordinate(na_u_p, na_v_p, na_w_p, na_t_p,
442
- na_lon, na_lat, na_p)
443
- ( epflx_y, epflx_z, v_rmean, w_rmean, gp_lat, gp_z,
444
- u_mean, theta_mean,
445
- uv_dash, vt_dash, uw_dash, dtheta_dz) = \
446
- GPhys::EP_Flux::ep_full_sphere(gp_u,gp_v,gp_w,gp_t,true)
447
-
448
- epflx_div = GPhys::EP_Flux::div_sphere(epflx_y, epflx_z)
449
- # calculate Residual merdional mean circulation
450
- strm_rmean = GPhys::EP_Flux::strm_rmean(v_rmean)
451
-
452
- ## analytical functions
453
- f = 2*2*PI/rot*sin_phi
454
- avort = ( f + (10 + p)/radius*tan_phi )
455
- epflx_y_ana = (( p/p00 * cos_phi**3 ) * ( -p/(10.0*kappa) - 1 )).reshape(nlat,nz)
456
- epflx_z_ana = (( p/p00 * cos_phi**3 ) * ( avort * h/(10.0*kappa) - 1.5 )).reshape(nlat,nz)
457
- u_mean_ana = 10 + na_p.reshape(1,nz)
458
- theta_mean_ana = ( 40 * (p00/na_p.reshape(1,nz))**kappa )
459
- uv_dash_ana = cos(na_phi.reshape(nlat, 1))**2
460
- vt_dash_ana = ( 4* cos(na_phi.reshape(nlat, 1))**2 * (p00/na_p.reshape(1,nz))**kappa ).reshape(nlat,nz)
461
- uw_dash_ana = 1.5 * cos(na_phi.reshape(nlat, 1))**2
462
- dtheta_dz_ana = theta_mean_ana / h * kappa
463
- epflx_div_ana = ( p/p00*-4*cos_phi**2*sin_phi/radius * ( -p/(10.0*kappa) - 1 )).reshape(nlat,nz) - epflx_z_ana/h + \
464
- ((-p**2/p00/h*cos_phi**2 ) * ( sin_phi/radius ) * h/(10.0*kappa)).reshape(nlat,nz)
465
- v_rmean_ana = 20 + cos(na_phi.reshape(nlat, 1))**2/10/kappa
466
- w_rmean_ana = 30 + 3*h*cos(na_phi.reshape(nlat, 1))*sin(na_phi.reshape(nlat, 1))/10/radius/kappa
467
- strm_rmean_ana = v_rmean_ana * 2 * PI * radius * cos(na_phi.reshape(nlat, 1)) * (na_p.reshape(1, nz) - na_p[-1])*100/g.val + v_rmean_ana[-1] * PI * radius * cos(na_phi.reshape(nlat, 1)) * na_p[-1]*100/g.val
468
-
469
- ### check_precision_and_attribute
470
- ["epflx_y", "epflx_z", "v_rmean", "w_rmean", "u_mean", "theta_mean",
471
- "uv_dash", "vt_dash", "uw_dash", "dtheta_dz", "epflx_div", "strm_rmean"].each { |gp_nm|
472
- gp = eval(gp_nm) # ex. "epflx_y" => epflx_y
473
- gp_ana = eval(gp_nm+"_ana") # ex. "epflx_y" => epflx_y_na
474
- title = gp.data.get_att("long_name").to_s
475
- p "***************** #{title} *****************"
476
- show_attr(gp)
477
- print_error_ratio_max_and_mean(gp.data.val, gp_ana)
478
- }
479
-
480
-
481
- p "--------------------------------------------------------------"
482
- p "==== pattern 4: check div_sphere with easy data ===="
483
- p "--------------------------------------------------------------"
484
-
485
- ## make axis
486
- nlat = 50; nz = 10
487
- na_lat = NArray.float(nlat).indgen! / (nlat - 1) * 180.0 - 90.0 # [-90, .., 90]
488
- p ( na_z = 1000 * (NArray.float(nz).indgen!/(nz-1)) ) # [1000, .., 100]
489
- va_lat = VArray.new( na_lat,
490
- {"long_name"=>"latitude","units"=>"degrees"},
491
- "lat" )
492
- va_z = VArray.new( na_z,
493
- {"long_name"=>"alt","units"=>"m"},
494
- "z" )
495
- lat = Axis.new.set_pos(va_lat)
496
- z = Axis.new.set_pos(va_z)
497
- grid = Grid.new(lat, z)
498
-
499
- ## make data
500
- na_phi = PI/180.0*na_lat
501
- na_z1 = na_z.dup.fill(1.0)
502
- na_f_phi = 1.0 * cos(na_phi.reshape(nlat, 1)) * (na_z1).reshape(1, nz)
503
- na_f_z = 3.0 * na_z.newdim(0) * cos(na_phi).reshape(nlat, 1)
504
-
505
- va_f_phi = VArray.new( na_f_phi,
506
- {"long_name"=>"epflx_y","units"=>"m2.s-2"},
507
- "epy" )
508
- va_f_z = VArray.new( na_f_z,
509
- {"long_name"=>"epflx_z","units"=>"m2.s-2"},
510
- "epz" )
511
-
512
- gp_f_phi = GPhys.new(grid, va_f_phi)
513
- gp_f_z = GPhys.new(grid, va_f_z)
514
-
515
- kappa = (GPhys::EP_Flux::gas_const / GPhys::EP_Flux::cp).val
516
- p00 = GPhys::EP_Flux::p00
517
- scale_height = GPhys::EP_Flux::scale_height
518
- rot_period = GPhys::EP_Flux::rot_period
519
- radius = GPhys::EP_Flux::radius
520
-
521
-
522
- na_z = na_z.reshape(1, nz)
523
- na_phi = na_phi.reshape(nlat, 1)
524
- p "*** epflx_div ***"
525
- epflx_div = GPhys::EP_Flux::div_sphere(gp_f_phi, gp_f_z)
526
- epflx_div_ana = -2*sin(na_phi) + 3 * cos(na_phi)
527
-
528
- ### check divergence
529
- title = epflx_div.data.get_att("long_name").to_s
530
- p "***************** #{title} *****************"
531
- show_attr(epflx_div)
532
- print_error_ratio_max_and_mean(epflx_div.data.val, epflx_div_ana)
533
-