# # 湿潤静的エネルギーをだす # ########################################################################## require "numru/gphys" # Gphys を使う include NumRu #-- 軸を読み込む/たぶんGphysオブジェクトを維持 #z = gphys.coord(2).val #-- 定数 Grav = 9.8 CpDry = 1039.6423436145739742642 T_0 = 273.16 #[K], 水の融点 #--領域サイズ #----大文字変数は定数(ruby) #-- 幅設定 DelX = 500 DelZ =250 DelTime = 150 NT = (21600/150).to_i # どれだけ時間ステップか(NetCDFの軸を生成するために) NX = 256 NZ = 120 #-- NArray.を用意 zTemp = NArray.sfloat(NX) #x_fNl = NArray.sfloat(NX) #x_fAl = NArray.sfloat(NX) #-- NArray オブジェクト #-- indgen(0,500)<- 0 から始めて 500 ずつ値を入れる x_a = VArray.new(NArray.sfloat(NX).indgen(0,500), {"long_name"=>"x-coodinate", "units"=>"m"}, # ハッシュ(ruby) "x") #---- GPhys の軸のオブジェクトに格上げ x = Axis.new.set_pos(x_a) z_a = VArray.new(NArray.sfloat(NZ).indgen(0,250), {"long_name"=>"z-coodinate", "units"=>"m"}, # ハッシュ(ruby) "z") #---- GPhys の軸のオブジェクトに格上げ z = Axis.new.set_pos(z_a) #-- 時間のオブジェクト t_a = VArray.new(NArray.sfloat(NT+1).indgen(0,150), {"long_name"=>"Time", "units"=>"sec"}, # ハッシュ(ruby) "t" ) #---- 軸のオブジェクトに格上げ t = Axis.new.set_pos(t_a) #-- 物理場オブジェクト h_a = VArray.new(NArray.sfloat(NX,NZ,NT+1), {"long_name"=>"moist static energy", "units"=>"(1)"}, "h") #---- 軸のオブジェクトに格上げ h_gphys = GPhys.new(Grid.new(x,z,t), h_a) #-- netCDF づくり ncFile = NetCDF.create("MSE.nc") GPhys::NetCDF_IO.write_grid(ncFile, Grid.new(x,z,t)) ###--- 必要な netCDF ファイルを open する ---### gphysPTemp = GPhys::IO.open('./thermal_PTempAll.nc','PTempAll') gphysExner = GPhys::IO.open('./thermal_ExnerAll.nc','ExnerAll') gphysH2Og = GPhys::IO.open('./thermal_H2O-gAll.nc','H2O-gAll') #-- 軸を読み込む/たぶんGphysオブジェクトを維持 tarray = gphysPTemp.coord(3).val zarray = gphysPTemp.coord(2).val ### y gphysPTemp = gphysPTemp.mean( 'y' ) gphysExner = gphysExner.mean( 'y' ) gphysH2Og = gphysH2Og.mean( 'y' ) for t in tarray #t=0 p t ### 時間でカット tPTemp = gphysPTemp.cut( 't'=>t ) tExner = gphysExner.cut( 't'=>t ) tH2Og = gphysH2Og.cut( 't'=>t ) for z in zarray ### zでカット zPTemp = tPTemp.cut( 'z'=>z ) zExner = tExner.cut( 'z'=>z ) zH2Og = tH2Og.cut( 'z'=>z ) zPTemp.units = '1' ### exp を計算するために NArray オブジェクトにする zPTemp = zPTemp.val zExner = zExner.val zH2Og = zH2Og.val #-- 温度を出す zTemp = zPTemp*zExner #-- 湿潤静止エネルギーh(T,q,z) = c_p T + L q + g z (L: 潜熱, q: 水蒸気混合比) #-- 潜熱の計算 # [J/Kg]水の蒸発の潜熱. CReSSマニュアルからとってみた, Tは温度 # 簡易版 2.5x10^6, deepconv の値をつかってみてもいい latent = 2.50078e6*(T_0/zTemp)**(0.167+(3.67*10e-4)*zTemp) # latent = 2.5e6 h = (CpDry*zTemp) \ + (latent * zH2Og) \ + (Grav * z) k = ((z-125)/DelZ).to_i n = (t/DelTime).to_i h_gphys[0..NX-1,k,n] = h[0..NX-1] end end h_gphys.data.rename!("h") h_gphys.data.set_att('long_name', "moist static energy") h_gphys.units = 'J/Kg' GPhys::NetCDF_IO.write(ncFile, h_gphys.rename('h')) # netCDFファイルにライト #rename で名前を変える ncFile.close