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