Class dycore_dynamics_mod
In: src/run/dycore_dynamics.f90

Methods

Included Modules

type_mod dycore_type_mod dycore_grid_mod dynamics_mod spml_mod dc_trace

Public Instance methods

Dims :type(DYCORE_DIMS), intent(in)
: end begin
 Input

 次元データ全種
Vars_a :type(DYCORE_VARS), intent(inout)
: In/Out
 格子点データ全種(t+Δt)

渦度発散から、風速 (経度成分、緯度成分) を得る。

[Source]

  subroutine dycore_dynamics_diagnostic( Dims, Vars_a )
  !==== Dependency

                                                                 !=end
    implicit none
                                                                 !=begin
    !==== Input
    !
    type(DYCORE_DIMS), intent(in)   :: Dims   ! 次元データ全種
    !
    !==== In/Out
    !
    type(DYCORE_VARS), intent(inout):: Vars_a ! 格子点データ全種(t+Δt)
                                                                 !=end
    !----- 作業用内部変数 -----
    character(STRING),  parameter:: subname = "dycore_dynamics_diagnostic"

  continue

    !-----------------------------------------------------------------
    !   初期化確認
    !-----------------------------------------------------------------
    call BeginSub(subname)
    if (.not. dycore_dynamics_initialized) then
       call EndSub( subname, 'Call dycore_dynamics_init before call %c',         c1=trim(subname) )
       return
    endif

    call dynamics_diagnostic           ( Dims%x_Lon%a_Dim(:)    ,    Dims%y_Lat%a_Dim(:)    ,    Dims%z_Sigma%a_Dim(:)  ,    Dims%r_Sigma%a_Dim(:),   Vars_a%xyz_VelLon(:,:,:) ,    Vars_a%xyz_VelLat(:,:,:) ,    Vars_a%xyz_Vor(:,:,:)  ,    Vars_a%xyz_Div(:,:,:)  ,    Vars_a%xyz_Temp(:,:,:) ,    Vars_a%xyz_QVap(:,:,:) ,    Vars_a%xy_Ps(:,:)      )   ! intent(in) : 地表面気圧   (t+Δt)

    call EndSub(subname)
  end subroutine dycore_dynamics_diagnostic
Vars_b :type(DYCORE_VARS), intent(in)
: end begin
 Input

 格子点データ全種(t-Δt)
Vars_a :type(DYCORE_VARS), intent(inout)
: In/Out
 格子点データ全種(t+Δt)

水平拡散項の計算。

[Source]

  subroutine dycore_dynamics_diffusion( Vars_b, Vars_a )
  !==== Dependency

                                                                 !=end
    implicit none
                                                                 !=begin
    !==== Input
    !
    type(DYCORE_VARS), intent(in)   :: Vars_b ! 格子点データ全種(t-Δt)
    !
    !==== In/Out
    !
    type(DYCORE_VARS), intent(inout):: Vars_a ! 格子点データ全種(t+Δt)
                                                                 !=end
    !----- 作業用内部変数 -----
    character(STRING),  parameter:: subname = "dycore_dynamics_diffusion"

  continue

    !-----------------------------------------------------------------
    !   初期化確認
    !-----------------------------------------------------------------
    call BeginSub(subname)
    if (.not. dycore_dynamics_initialized) then
       call EndSub( subname, 'Call dycore_dynamics_init before call %c',         c1=trim(subname) )
       return
    endif

    call dynamics_diffusion(    Vars_b%xyz_Vor    ,  Vars_b%xyz_Div    ,  Vars_b%xyz_Temp   ,  Vars_b%xyz_QVap   ,  Vars_a%xyz_Vor    ,  Vars_a%xyz_Div    ,  Vars_a%xyz_Temp   ,  Vars_a%xyz_QVap   )   ! intent(inout) : 比湿         (t+Δt)

    call EndSub(subname)
  end subroutine dycore_dynamics_diffusion

((< dynamics_mod >)) の終了処理を行なう。

[Source]

  subroutine dycore_dynamics_end
  !==== Dependency

                                                                 !=end
    implicit none

    !-----------------------------------------------------------------
    !   変数定義
    !-----------------------------------------------------------------
    !----- 作業用内部変数 -----
    character(STRING),  parameter:: subname = "dycore_dynamics_end"

  continue

    !-----------------------------------------------------------------
    !   初期化確認
    !-----------------------------------------------------------------
    call BeginSub(subname)
    if ( .not. dycore_dynamics_initialized) then
       call EndSub( subname, 'dycore_dynamics_init was not called',        c1=trim(subname) )
       return
    else
       dycore_dynamics_initialized = .false.
    endif

    call dynamics_end

    call EndSub(subname)
  end subroutine dycore_dynamics_end
Dims :type(DYCORE_DIMS), intent(in)
: end begin
 Input

 次元データ全種
Vars_a :type(DYCORE_VARS), intent(out)
: Output
 格子点データ全種(t+Δt)

((< dynamics_mod >)) を初期化し、Vars_a 変数を allocate する。

[Source]

  subroutine dycore_dynamics_init( Dims, Vars_a )
  !==== Dependency

                                                                 !=end
    implicit none
                                                                 !=begin
    !==== Input
    !
    type(DYCORE_DIMS), intent(in) :: Dims   ! 次元データ全種
    !
    !==== Output
    !
    type(DYCORE_VARS), intent(out):: Vars_a ! 格子点データ全種(t+Δt)
                                                                 !=end

    !----- 作業用内部変数 -----
    character(STRING),  parameter:: subname = "dycore_dynamics_init"

  continue

    !----------------------------------------------------------------
    !   初期化確認
    !----------------------------------------------------------------
    call BeginSub(subname)
    if (dycore_dynamics_initialized) then
       call EndSub( subname, '%c is already called.', c1=trim(subname) )
       return
    else
       dycore_dynamics_initialized = .true.
    endif

    !----------------------------------------------------------------
    !   Version identifier
    !----------------------------------------------------------------
    call DbgMessage('%c :: %c', c1=trim(version), c2=trim(tagname))

    !-------------------------------------------------------------------
    !  SPMODEL 3次元モジュール初期化サブルーチン wa_initial
    !-------------------------------------------------------------------
    call spml_init

    !----------------------------------------------------------------
    !   Vars_a の各変数の allocate および初期化
    !----------------------------------------------------------------
    allocate( Vars_a%xyz_VelLon(im,jm,km) )
    allocate( Vars_a%xyz_VelLat(im,jm,km) )
    allocate( Vars_a%xyz_Vor(im,jm,km)  )
    allocate( Vars_a%xyz_Div(im,jm,km)  )
    allocate( Vars_a%xyz_Temp(im,jm,km) )
    allocate( Vars_a%xyz_QVap(im,jm,km) )
    allocate( Vars_a%xy_Ps(im,jm)       )

    Vars_a%xyz_VelLon = 0.0d0
    Vars_a%xyz_VelLat = 0.0d0
    Vars_a%xyz_Vor    = 0.0d0
    Vars_a%xyz_Div    = 0.0d0
    Vars_a%xyz_Temp   = 0.0d0
    Vars_a%xyz_QVap   = 0.0d0
    Vars_a%xy_Ps      = 0.0d0

    !----------------------------------------------------------------
    !   dynamics_init へ次元変数の引渡し
    !----------------------------------------------------------------
    call dynamics_init                ( Dims%x_Lon%a_Dim(:)   ,    Dims%y_Lat%a_Dim(:)   ,    Dims%z_Sigma%a_Dim(:) ,    Dims%r_Sigma%a_Dim(:) ) ! intent(in): σレベル(半整数)座標

    call EndSub(subname)
  end subroutine dycore_dynamics_init
Dims :type(DYCORE_DIMS), intent(in)
: end begin
 Input

 次元データ全種
Vars_b :type(DYCORE_VARS), intent(in)
: 格子点データ全種
Vars_n :type(DYCORE_VARS), intent(in)
: 格子点データ全種
Vars_a :type(DYCORE_VARS), intent(inout)
: Output
 格子点データ全種(t+Δt)

予報変数を計算し、Vars_a に返す。

[Source]

  subroutine dycore_dynamics_prediction( Dims, Vars_b, Vars_n, Vars_a )
  !==== Dependency

                                                                 !=end
    implicit none
                                                                 !=begin
    !==== Input
    !
    type(DYCORE_DIMS), intent(in)   :: Dims   ! 次元データ全種
    type(DYCORE_VARS), intent(in)   :: Vars_b ! 格子点データ全種
    type(DYCORE_VARS), intent(in)   :: Vars_n ! 格子点データ全種
    !
    !==== Output
    !
    type(DYCORE_VARS), intent(inout):: Vars_a ! 格子点データ全種(t+Δt)
                                                                 !=end
    !----- 作業用内部変数 -----
    character(STRING),  parameter:: subname = "dycore_dynamics_prediction"

  continue

    !----------------------------------------------------------------
    !   初期化確認
    !----------------------------------------------------------------
    call BeginSub(subname)
    if (.not. dycore_dynamics_initialized) then
       call EndSub( subname, 'Call dycore_dynamics_init before call %c',         c1=trim(subname) )
       return
    endif

    call dynamics_leapfrog             ( Dims%x_Lon%a_Dim(:)    ,    Dims%y_Lat%a_Dim(:)    ,    Dims%z_Sigma%a_Dim(:)  ,    Dims%r_Sigma%a_Dim(:),   Vars_b%xyz_VelLon(:,:,:) ,    Vars_b%xyz_VelLat(:,:,:) ,    Vars_b%xyz_Vor(:,:,:)    ,    Vars_b%xyz_Div(:,:,:)    ,    Vars_b%xyz_Temp(:,:,:)   ,    Vars_b%xyz_QVap(:,:,:)   ,    Vars_b%xy_Ps(:,:)        ,    Vars_n%xyz_VelLon(:,:,:) ,    Vars_n%xyz_VelLat(:,:,:) ,    Vars_n%xyz_Vor(:,:,:)    ,    Vars_n%xyz_Div(:,:,:)    ,    Vars_n%xyz_Temp(:,:,:)   ,    Vars_n%xyz_QVap(:,:,:)   ,    Vars_n%xy_Ps(:,:)        ,    Vars_a%xyz_VelLon(:,:,:) ,    Vars_a%xyz_VelLat(:,:,:) ,    Vars_a%xyz_Vor(:,:,:)    ,    Vars_a%xyz_Div(:,:,:)    ,    Vars_a%xyz_Temp(:,:,:)   ,    Vars_a%xyz_QVap(:,:,:)   ,    Vars_a%xy_Ps(:,:)      )     ! intent(out): 地表面気圧   (t+Δt)

    call EndSub(subname)
  end subroutine dycore_dynamics_prediction

[Validate]