#!/usr/bin/env ruby # ---------------------------------------------- # local load path #$local_path = '/work11/ape/yukiko/lib' #$local_path = '/home/yukiko/eva01/work11/ape/yukiko/lib' $local_path = '/home/yukiko/work/ape/yukiko/lib' $: << $local_path # ---------------------------------------------- # 必要なライブラリ, モジュールの読み込み load "#{$local_path}/lib-ape-view.rb" # -------------------------------------------------------------------- class Ape def plot_spct_bunsan(gphys) # attribute の long_name を消す (タイトル描画位置の都合) if gphys.data.get_att("long_name") gphys = gphys.set_att("long_name","") end GGraph.tone( gphys, true , $tone_hash ) # GGraph.contour( gphys, false, $cont_hash ) unless $cont_flag == false # 分散曲線 $x_size = gphys.grid_copy.axis(0).pos.val h_array = NArray.to_na([ 12, 25, 50, 100, 200 ]) # h_array = NArray.to_na([ 8, 12, 25, 50, 90 ]) omega = 2*3.1415/24/60/60 beta = 2*(omega)/(4e+7) * ( 60*60*24*(6370e+3) ) # (2*Omega/a)*cos(0) name_ary = ["h = 12 ", "h = 25 ","h = 50 ","h =100", "h =200 "] # name_ary = ["h = 8", "h = 12","h = 25","h = 50", "h = 90 "] if $gropn == 2 # line_index_ary = [4,24,104,64,724] line_index_ary = [1,1,1,1,1] line_type_ary = [1,1,1,1,1] else line_index_ary = [1,21,101,61,721] # line_index_ary = [1,1,1,1,1] line_type_ary = [1,1,1,1,1] end for i in (0..4) h = h_array[i] if gphys.name =~ /asym/ $sym_num = 2 else $sym_num = 1 end DCL.sgpset('LCLIP', true) bunsan_calc(h) knum = gphys.grid_copy.axis(0).pos.val if $iryu.class == Float puts $iryu $kelvin = $kelvin + knum*($iryu)*60*60*24/(4e+7) $rossby = $rossby + knum*($iryu)*60*60*24/(4e+7) $grav1 = $grav1 + knum*($iryu)*60*60*24/(4e+7) $grav2 = $grav2 + knum*($iryu)*60*60*24/(4e+7) $mixed = $mixed + knum*($iryu)*60*60*24/(4e+7) end if gphys.name =~ /asym/ GGraph.line( $grav2, false, "index" => line_index_ary[i] ) GGraph.line( $mixed, false, "index" => line_index_ary[i] ) else GGraph.line( $grav1, false, "index" => line_index_ary[i] ) GGraph.line( $rossby, false, "index" => line_index_ary[i] ) GGraph.line( $kelvin, false, "index" => line_index_ary[i] ) end end GGraph.line( $grav1*0.0, false, "index" => line_index_ary[0] ) # $iryusen = $grav1*0.0 + knum*($iryu)*60*60*24/(4e+7) ## $iryusen = $iryusen * ($iryusen < 0) # GGraph.line( $iryusen, false, "index" => 12, "type"=>3 ) # __line_index(name_ary,line_index_ary) DCL.sgpset('LCLIP', false) unless $gropn == 2 __show_line_index(name_ary,line_index_ary, line_type_ary) end # タイトル DCL::uzinit tani = "(#{gphys.data.get_att("units")})" DCL::uxsttl("t", tani , -1.0 ) DCL::uxmttl("t", gphys.data.get_att("ape_name").gsub("_", " "), -1.0 ) $file_label = "#{@file}@#{gphys.name}" if $file_label == "filename" DCL::uzinit DCL.uxpttl("t", 0, $file_label, 1.0) # トーンバー unless gphys.axnames.size == 1 # DCL::Util::color_bar($cbar_conf) unless $tone_flag == false GGraph.color_bar($colorbar_hash) unless $tone_flag == false end end # ラインインデックスの種類を表示 def __show_line_index(str_ary,line_index_ary, line_type_ary, x=0.15, y=0.1) charsize = 0.8 * DCL.uzpget('rsizec1') len = 0.04 # 線の長さ dvx = 0.03 dvy = charsize*1.6 raise TypeError,"Array expected" if ! str_ary.is_a?(Array) vxmin,vxmax,vymin,vymax = DCL.sgqvpt vx = 0.10 vy = 0.18 - charsize/2 str_ary.size.times{|num| DCL::sgplzv([vx, vx + len],[vy, vy], line_type_ary[num], line_index_ary[num]+1) DCL::sgtxzv(vx + len + 0.01 ,vy,str_ary[num], charsize, 0, -1, 13 ) vy -= dvy if num == 1 # if num == 2 # if num == 3 vx = 0.29 vy = 0.18 - charsize/2 elsif num == 3 # elsif num == 5 # elsif num == 7 vx = 0.48 vy = 0.18 - charsize/2 elsif num == 5 vx = 0.67 vy = 0.18 - charsize/2 end } nil end def bunsan_calc(h=200) omega = 2*3.1415/24/60/60 beta = 2*(omega)/(4e+7) * ( 60*60*24*(6370e+3) ) # (2*Omega/a)*cos(0) c_g = ((h*9.8)**0.5)*60*60*24/(4e+7) # 軸 knum = VArray.new($x_size).rename("knum").put_att("units","1") knum = Axis.new().set_pos(knum) grid = Grid.new(knum) ## 虚数を含む軸に変換 x_size = NArray.complex($x_size.size).fill!(1.0) * $x_size # モード num = $sym_num ## 3 次方程式解法: カルダノの公式 ## x^3 + 3px + q ## t^2 + qt - p =0, t = -q/2 +- (q**2/4 + p)**0.5 p = - ( (c_g*x_size)**2 + c_g*beta*(2*num+1)) / 3 q = - c_g**2*beta*x_size t1 = -q/2 + (q**2/4 + p**3)**0.5 t2 = -q/2 - (q**2/4 + p**3)**0.5 t1 = t1**(1.0/3) t2 = t2**(1.0/3) # 重力波 $grav1 = (t1 + t2).real $grav1 = VArray.new($grav1).rename("grav1"). put_att("units","1").put_att("ape_name","gravity") $grav1 = GPhys.new( grid, $grav1) # 反対重力波 (図示しない) $grav2 = (t1 * Complex.polar(1, Math::PI*2/3) + t2 * Complex.polar(1, Math::PI*4/3)).real $grav2 = VArray.new($grav2).rename("grav2"). put_att("units","1").put_att("ape_name","gravity") $grav2 = GPhys.new( grid, $grav2) # ロスビー波 $rossby = (t2 * Complex.polar(1, Math::PI*2/3) + t1 * Complex.polar(1, Math::PI*4/3) ).real $rossby2 = $rossby $rossby = ($rossby > 0) * $rossby $rossby = VArray.new($rossby).rename("rossby"). put_att("units","1").put_att("ape_name","rossby") $rossby = GPhys.new( grid, $rossby) $rossby2 = VArray.new($rossby2).rename("rossby"). put_att("units","1").put_att("ape_name","rossby") $rossby2 = GPhys.new( grid, $rossby2) # ケルビン波 $kelvin = (c_g*x_size).real $kelvin = ($kelvin > 0) * $kelvin $kelvin = VArray.new($kelvin).rename("kelvin"). put_att("units","1").put_att("ape_name","kelvin") $kelvin = GPhys.new( grid, $kelvin) # 混合ロスビー $mixed = c_g*x_size/2 + ((c_g*x_size/2)**2 + c_g*beta )**0.5 $mixed = VArray.new($mixed).rename("mixed"). put_att("units","1").put_att("ape_name","mixed") $mixed = GPhys.new( grid, $mixed) end end