Calculate Dynamical Core.
力学コア部分を演算するモジュール。演算している方程式系、 および離散化の手法は以下の通り。
現在、力学コアの全てがこのモジュール内にある。本来ならば、 解く方程式や項の種類によってモジュール化がなされるべきである。
use type_mod, only: STRING, REKIND, DBKIND, INTKIND
private public :: dynamics_init, dynamics_leapfrog ! subroutines public :: dynamics_diagnostic, dynamics_end ! subroutines public :: dynamics_diffusion ! subroutines
以降のサブルーチンで用いる変数の allocate 、および 時間発展しない量の演算を行なう。 また、変数データ出力のための初期設定も行なう。
subroutine dynamics_init(x_Lon, y_Lat, z_Sigma, r_Sigma)
use type_mod, only: STRING, REKIND, DBKIND, INTKIND use grid_3d_mod, only: im, jm, km use grid_wavenumber_mod, only: nm use constants_mod, only: constants_init, R0, Omega, Cp, RAir, & & TempAve, VisOrder, EFoldTime use time_mod, only: DelTime use spml_mod, only: spml_init, xy_Lat, rn use io_gt4_out_mod,only: io_gt4_out_init, io_gt4_out_SetVars use dc_trace, only: DbgMessage, BeginSub, EndSub, DataDump use dc_string, only: toChar
real(DBKIND), intent(in) :: & & x_Lon(:) , & ! intent(in): 経度座標 & y_Lat(:) , & ! intent(in): 緯度座標 & z_Sigma(:) , & ! intent(in): σレベル(整数)座標 & r_Sigma(:) ! intent(in): σレベル(半整数)座標
時間発展する量の演算を行なう。 演算するデータの出力も行なう。
subroutine dynamics_leapfrog & & ( x_Lon , y_Lat , z_Sigma , r_Sigma , & & xyz_VelLon_b, xyz_VelLat_b, xyz_Vor_b, xyz_Div_b , & & xyz_Temp_b , xyz_QVap_b , xy_Ps_b , & & xyz_VelLon_n, xyz_VelLat_n, xyz_Vor_n, xyz_Div_n , & & xyz_Temp_n , xyz_QVap_n , xy_Ps_n , & & xyz_VelLon_a, xyz_VelLat_a, xyz_Vor_a, xyz_Div_a , & & xyz_Temp_a , xyz_QVap_a , xy_Ps_a )
use type_mod, only: STRING, REKIND, DBKIND, INTKIND use grid_3d_mod, only: im, jm, km use grid_wavenumber_mod, only: nm use constants_mod, only: R0, Cp, EpsVT use time_mod, only: DelTime, CurrentTime use spml_mod, only: w_xy, xy_w , xy_GradLon_w, xy_GradLat_w, & & w_Div_xy_xy, w_LaplaInv_w, & & wa_xya, xya_wa, wa_Div_xya_xya, wa_Lapla_wa use io_gt4_out_mod,only: io_gt4_out_Put use dc_trace, only: DbgMessage, BeginSub, EndSub, DataDump use dc_string, only: toChar
real(DBKIND), intent(in) :: & & x_Lon(:) , & ! intent(in): 経度座標 & y_Lat(:) , & ! intent(in): 緯度座標 & z_Sigma(:) , & ! intent(in): σレベル(整数)座標 & r_Sigma(:) , & ! intent(in): σレベル(半整数)座標 & xyz_VelLon_b(:,:,:) , & ! intent(in): 速度経度成分 (t-Δt) & xyz_VelLat_b(:,:,:) , & ! intent(in): 速度緯度成分 (t-Δt) & xyz_Vor_b(:,:,:) , & ! intent(in): 渦度 (t-Δt) & xyz_Div_b(:,:,:) , & ! intent(in): 発散 (t-Δt) & xyz_Temp_b(:,:,:) , & ! intent(in): 温度 (t-Δt) & xyz_QVap_b(:,:,:) , & ! intent(in): 比湿 (t-Δt) & xy_Ps_b(:,:) , & ! intent(in): 地表面気圧 (t-Δt) & xyz_VelLon_n(:,:,:) , & ! intent(in): 速度経度成分 (t) & xyz_VelLat_n(:,:,:) , & ! intent(in): 速度緯度成分 (t) & xyz_Vor_n(:,:,:) , & ! intent(in): 渦度 (t) & xyz_Div_n(:,:,:) , & ! intent(in): 発散 (t) & xyz_Temp_n(:,:,:) , & ! intent(in): 温度 (t) & xyz_QVap_n(:,:,:) , & ! intent(in): 比湿 (t) & xy_Ps_n(:,:) ! intent(in): 地表面気圧 (t)
real(DBKIND), intent(out) :: & & xyz_VelLon_a(:,:,:) , & ! intent(out): 速度経度成分 (t+Δt) & xyz_VelLat_a(:,:,:) , & ! intent(out): 速度緯度成分 (t+Δt) & xyz_Vor_a(:,:,:) , & ! intent(out): 渦度 (t+Δt) & xyz_Div_a(:,:,:) , & ! intent(out): 発散 (t+Δt) & xyz_Temp_a(:,:,:) , & ! intent(out): 温度 (t+Δt) & xyz_QVap_a(:,:,:) , & ! intent(out): 比湿 (t+Δt) & xy_Ps_a(:,:) ! intent(out): 地表面気圧 (t+Δt)
t-Δt の値から水平拡散項を求め、それを t+Δt の値に加える。
subroutine dynamics_diffusion( & & xyz_Vor_b , xyz_Div_b , xyz_Temp_b , xyz_QVap_b , & & xyz_Vor_a , xyz_Div_a , xyz_Temp_a , xyz_QVap_a )
use type_mod, only: STRING, REKIND, DBKIND, INTKIND use time_mod, only: DelTime, CurrentTime use grid_3d_mod, only: km use grid_wavenumber_mod, only: nm use spml_mod, only: wa_xya, xya_wa, l_nm use io_gt4_out_mod,only: io_gt4_out_Put use dc_trace, only: DbgMessage, BeginSub, EndSub, DataDump
real(DBKIND), intent(in) :: & & xyz_Vor_b(:,:,:) , & ! 渦度 (t-Δt) & xyz_Div_b(:,:,:) , & ! 発散 (t-Δt) & xyz_Temp_b(:,:,:) , & ! 温度 (t-Δt) & xyz_QVap_b(:,:,:) ! 比湿 (t-Δt)
real(DBKIND), intent(inout) :: & & xyz_Vor_a(:,:,:) , & ! 渦度 (t+Δt) & xyz_Div_a(:,:,:) , & ! 発散 (t+Δt) & xyz_Temp_a(:,:,:) , & ! 温度 (t+Δt) & xyz_QVap_a(:,:,:) ! 比湿 (t+Δt)
診断的に得られる量の演算を行なう。 現在は渦度発散から速度成分 (経度方向、緯度方向) の演算を行なうのみである。
subroutine dynamics_diagnostic & & ( x_Lon , y_Lat , z_Sigma , r_Sigma , & & xyz_VelLon_a, xyz_VelLat_a, xyz_Vor_a, xyz_Div_a , & & xyz_Temp_a , xyz_QVap_a , xy_Ps_a )
use type_mod, only: STRING, REKIND, DBKIND, INTKIND use grid_3d_mod, only: im, jm, km use grid_wavenumber_mod, only: nm use constants_mod, only: R0, Grav use spml_mod, only: wa_xya, xya_GradLon_wa, xya_GradLat_wa, & & wa_LaplaInv_wa, IntLonLat_xy use io_gt4_out_mod,only: io_gt4_out_Put use dc_trace, only: DbgMessage, BeginSub, EndSub, DataDump use dc_string, only: toChar
real(DBKIND), intent(in) :: & & x_Lon(:) , & ! intent(in): 経度座標 & y_Lat(:) , & ! intent(in): 緯度座標 & z_Sigma(:) , & ! intent(in): σレベル(整数)座標 & r_Sigma(:) , & ! intent(in): σレベル(半整数)座標 & xyz_Vor_a(:,:,:) , & ! intent(in): 渦度 (t+Δt) & xyz_Div_a(:,:,:) , & ! intent(in): 発散 (t+Δt) & xyz_Temp_a(:,:,:) , & ! intent(in): 温度 (t+Δt) & xyz_QVap_a(:,:,:) , & ! intent(in): 比湿 (t+Δt) & xy_Ps_a(:,:) ! intent(in): 地表面気圧 (t+Δt)
real(DBKIND), intent(out) :: & & xyz_VelLon_a(:,:,:) , & ! intent(out): 速度経度成分 (t+Δt) & xyz_VelLat_a(:,:,:) ! intent(out): 速度緯度成分 (t+Δt)
dynamics_init で allocate した変数を deallocate し、 演算した値も全て破棄する。
subroutine dynamics_end
use type_mod, only: STRING, REKIND, DBKIND, INTKIND use dc_trace, only: BeginSub, EndSub, DbgMessage