Class Turbulence_constKm
In: ../src/physics/turbulence_constkm.f90

簡単乱流過程: 乱流拡散係数一定

Methods

Included Modules

dc_types dc_iounit dc_message gtool_historyauto mpi_wrapper timeset gridset basicset constants composition axesset xyz_deriv_module namelist_util DExnerDt

Public Instance methods

Subroutine :
pyz_VelXBl(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)
: 水平速度
xqz_VelYBl(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)
: 水平速度
xyr_VelZBl(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)
: 鉛直速度
xyz_PTempBl(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)
: 温位
xyz_ExnerBl(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)
: 無次元圧力
xyzf_QMixBl(imin:imax,jmin:jmax,kmin:kmax, ncmax) :real(DP),intent(in)
: 凝縮成分の混合比
xyz_KmBl(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)
: 乱流拡散係数
xyz_KhBl(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)
: 乱流拡散係数
xyz_CDensBl(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)
pyz_DVelXDt(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(inout)
: スカラー量の水平乱流拡散
xqz_DVelYDt(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(inout)
: スカラー量の水平乱流拡散
xyr_DVelZDt(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(inout)
: スカラー量の水平乱流拡散
xyz_DPTempDt(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(inout)
xyz_DExnerDt(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(inout)
xyzf_DQMixDt(imin:imax,jmin:jmax,kmin:kmax, ncmax) :real(DP),intent(inout)
xyz_DKmDt(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(inout)
xyz_DCDensDt(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(inout)
xyz_KmAl(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(out)
: 乱流拡散係数
xyz_KhAl(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(out)
: 乱流拡散係数

[Source]

  subroutine turbulence_constKm_forcing( pyz_VelXBl, xqz_VelYBl,   xyr_VelZBl, xyz_PTempBl, xyz_ExnerBl, xyzf_QMixBl, xyz_KmBl,    xyz_KhBl,    xyz_CDensBl, pyz_DVelXDt, xqz_DVelYDt,  xyr_DVelZDt, xyz_DPTempDt,xyz_DExnerDt, xyzf_DQMixDt, xyz_DKmDt,   xyz_DCDensDt, xyz_KmAl, xyz_KhAl )

    implicit none

    real(DP),intent(in) :: pyz_VelXBl(imin:imax,jmin:jmax,kmin:kmax)
                                                    !水平速度
    real(DP),intent(in) :: xqz_VelYBl(imin:imax,jmin:jmax,kmin:kmax)
                                                    !水平速度
    real(DP),intent(in) :: xyr_VelZBl(imin:imax,jmin:jmax,kmin:kmax)
                                                    !鉛直速度
    real(DP),intent(in) :: xyz_PTempBl(imin:imax,jmin:jmax,kmin:kmax)
                                                    !温位
    real(DP),intent(in) :: xyz_ExnerBl(imin:imax,jmin:jmax,kmin:kmax)
                                                    !無次元圧力
    real(DP),intent(in) :: xyzf_QMixBl(imin:imax,jmin:jmax,kmin:kmax, ncmax)
                                                    !凝縮成分の混合比
    real(DP),intent(in) :: xyz_KmBl(imin:imax,jmin:jmax,kmin:kmax)
                                                    !乱流拡散係数
    real(DP),intent(in) :: xyz_KhBl(imin:imax,jmin:jmax,kmin:kmax)
                                                    !乱流拡散係数
    real(DP),intent(in) :: xyz_CDensBl(imin:imax,jmin:jmax,kmin:kmax)

    real(DP),intent(inout):: pyz_DVelXDt(imin:imax,jmin:jmax,kmin:kmax)
                                                    !スカラー量の水平乱流拡散
    real(DP),intent(inout):: xqz_DVelYDt(imin:imax,jmin:jmax,kmin:kmax)
                                                    !スカラー量の水平乱流拡散
    real(DP),intent(inout):: xyr_DVelZDt(imin:imax,jmin:jmax,kmin:kmax)
                                                    !スカラー量の水平乱流拡散
    real(DP),intent(inout):: xyz_DPTempDt(imin:imax,jmin:jmax,kmin:kmax)

    real(DP),intent(inout):: xyz_DExnerDt(imin:imax,jmin:jmax,kmin:kmax)

    real(DP),intent(inout):: xyzf_DQMixDt(imin:imax,jmin:jmax,kmin:kmax, ncmax)

    real(DP),intent(inout):: xyz_DKmDt(imin:imax,jmin:jmax,kmin:kmax)

    real(DP),intent(inout) :: xyz_DCDensDt(imin:imax,jmin:jmax,kmin:kmax)
    
    real(DP),intent(out):: xyz_KmAl(imin:imax,jmin:jmax,kmin:kmax)
                                                    !乱流拡散係数
    real(DP),intent(out):: xyz_KhAl(imin:imax,jmin:jmax,kmin:kmax)
                                                    !乱流拡散係数
    real(DP)            :: xyz_DispPI(imin:imax,jmin:jmax,kmin:kmax)
                                                    !乱流エネルギーの消散
    real(DP)            :: xyz_DispHeat(imin:imax,jmin:jmax,kmin:kmax)
                                                    !乱流エネルギーの消散
    real(DP)            :: xyz_Turb(imin:imax,jmin:jmax,kmin:kmax)
                                                    !
    real(DP)            :: xyzf_Turb(imin:imax,jmin:jmax,kmin:kmax, ncmax)
                                                    !スカラー量の水平乱流拡散
    real(DP)            :: pyz_Turb(imin:imax,jmin:jmax,kmin:kmax)

    real(DP)            :: xqz_Turb(imin:imax,jmin:jmax,kmin:kmax)

    real(DP)            :: xyr_Turb(imin:imax,jmin:jmax,kmin:kmax)

    real(DP)            :: pyz_DVelXDt0(imin:imax,jmin:jmax,kmin:kmax)
                                                    !スカラー量の水平乱流拡散
    real(DP)            :: xqz_DVelYDt0(imin:imax,jmin:jmax,kmin:kmax)
                                                    !スカラー量の水平乱流拡散
    real(DP)            :: xyr_DVelZDt0(imin:imax,jmin:jmax,kmin:kmax)
                                                    !スカラー量の水平乱流拡散
    real(DP)            :: xyz_DPTempDt0(imin:imax,jmin:jmax,kmin:kmax)

    real(DP)            :: xyz_DExnerDt0(imin:imax,jmin:jmax,kmin:kmax)

    real(DP)            :: xyzf_DQMixDt0(imin:imax,jmin:jmax,kmin:kmax, ncmax)

    real(DP)            :: xyz_DKmDt0(imin:imax,jmin:jmax,kmin:kmax)

    real(DP)            :: xyz_DCDensDt0(imin:imax,jmin:jmax,kmin:kmax)

    real(DP)            :: xyz_PTempBlAll(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: xyzf_QMixBlAll(imin:imax,jmin:jmax,kmin:kmax, ncmax)
    integer             :: f


    !----------------------------------
    ! 初期化
    !
!    xyz_PTempBlAll = xyz_PTempBl + xyz_PTempBZ
    xyz_PTempBlAll = xyz_PTempBl                    ! 擾乱に対してのみ拡散する. <= いいのか?
    xyzf_QMixBlAll  = xyzf_QMixBl + xyzf_QMixBZ 
    pyz_DVelXDt0 = pyz_DVelXDt
    xqz_DVelYDt0 = xqz_DVelYDt
    xyr_DVelZDt0 = xyr_DVelZDt
    xyz_DPTempDt0 = xyz_DPTempDt
    xyz_DExnerDt0 = xyz_DExnerDt
    xyzf_DQMixDt0 = xyzf_DQMixDt
    xyz_DKmDt0    = xyz_DKmDt
    xyz_DCDensDt0 = xyz_DCDensDt
    
    !----------------------------------
    ! 拡散係数の時間発展は解かない
    !
    xyz_KmAl = ConstKm
    xyz_KhAl = ConstKh
    
    !--------------------------------
    ! 雲密度の tendency
    !
    xyz_Turb = xyz_dx_pyz( pyz_avr_xyz( xyz_KhBl ) * pyz_dx_xyz( xyz_CDensBl ) ) + xyz_dy_xqz( xqz_avr_xyz( xyz_KhBl ) * xqz_dy_xyz( xyz_CDensBl ) ) + xyz_dz_xyr( xyr_avr_xyz( xyz_DensBZ * xyz_KhBl ) * xyr_dz_xyz( xyz_CDensBl ) ) / xyz_DensBZ

    xyz_DCDensDt = xyz_DCDensDt0 + xyz_Turb

    ! output
    !
    call HistoryAutoPut(TimeN, 'CDensTurb', xyz_Turb(1:nx,1:ny,1:nz))    

    !--------------------------------
    ! 温位の tendency
    !
    xyz_Turb = xyz_dx_pyz( pyz_avr_xyz( xyz_KhBl ) * pyz_dx_xyz( xyz_PTempBlAll ) ) + xyz_dy_xqz( xqz_avr_xyz( xyz_KhBl ) * xqz_dy_xyz( xyz_PTempBlAll ) ) + xyz_dz_xyr( xyr_avr_xyz( xyz_DensBZ * xyz_KhBl ) * xyr_dz_xyz( xyz_PTempBlAll ) ) / xyz_DensBZ

    if ( FlagDispHeat ) then 
      xyz_DispHeat = (xyz_KmBl ** 3.0d0) / (xyz_ExnerBZ * CpDry * (Cm ** 2.0d0) * (MixLen ** 4.0d0))
    else 
      xyz_DispHeat = 0.0d0
    end if

    xyz_DPTempDt = xyz_DPTempDt0 + xyz_Turb + xyz_DispHeat

    call HistoryAutoPut(TimeN, 'PTempDisp', xyz_DispHeat(1:nx, 1:ny, 1:nz))
    call HistoryAutoPut(TimeN, 'PTempTurb', xyz_Turb(1:nx, 1:ny, 1:nz))

    !--------------------------------
    ! 混合比の tendency
    !
    do f = 1, ncmax    
      xyzf_Turb(:,:,:,f) = xyz_dx_pyz( pyz_avr_xyz( xyz_KhBl ) * pyz_dx_xyz( xyzf_QMixBlAll(:,:,:,f) ) ) + xyz_dy_xqz( xqz_avr_xyz( xyz_KhBl ) * xqz_dy_xyz( xyzf_QMixBlAll(:,:,:,f) ) ) + xyz_dz_xyr( xyr_avr_xyz( xyz_DensBZ * xyz_KhBl ) * xyr_dz_xyz( xyzf_QMixBlAll(:,:,:,f) ) ) / xyz_DensBZ
      
      call HistoryAutoPut(TimeN, trim(SpcWetSymbol(f))//'_Turb', xyzf_Turb(1:nx,1:ny,1:nz,f))
    end do

    xyzf_DQMixDt = xyzf_DQMixDt0 + xyzf_Turb
    
    !--------------------------------
    ! 各速度成分の tendency
    !
    pyz_Turb = 2.0d0 * pyz_dx_xyz( xyz_KmBl * xyz_dx_pyz( pyz_VelXBl ) ) + pyz_dy_pqz( pqz_avr_xyz( xyz_KmBl ) * pqz_dx_xqz( xqz_VelYBl ) + pqz_avr_xyz( xyz_KmBl ) * pqz_dy_pyz( pyz_VelXBl ) ) + pyz_dz_pyr( pyr_avr_xyz( xyz_DensBZ * xyz_KmBl ) * pyr_dx_xyr( xyr_VelZBl ) + pyr_avr_xyz( xyz_DensBZ * xyz_KmBl ) * pyr_dz_pyz( pyz_VelXBl ) ) / xyz_DensBZ                      
!      & - 2.0d0 * pyz_dx_xyz( ( xyz_KmBl ** 2.0d0 ) )              &
!      &   / ( 3.0d0 * ( Cm ** 2.0d0 ) * ( MixLen ** 2.0d0 ) )

    pyz_DVelXDt = pyz_DVelXDt0 + pyz_Turb

    call HistoryAutoPut(TimeN, 'VelXTurb', pyz_Turb(1:nx, 1:ny, 1:nz))

    xqz_Turb = 2.0d0 * xqz_dy_xyz( xyz_KmBl * xyz_dy_xqz( xqz_VelYBl ) ) + xqz_dx_pqz( pqz_avr_xyz( xyz_KmBl ) * pqz_dy_pyz( pyz_VelXBl ) + pqz_avr_xyz( xyz_KmBl ) * pqz_dx_xqz( xqz_VelYBl ) ) + xqz_dz_xqr( xqr_avr_xyz( xyz_DensBZ * xyz_KmBl ) * xqr_dy_xyr( xyr_VelZBl ) + xqr_avr_xyz( xyz_DensBZ * xyz_KmBl ) * xqr_dz_xqz( xqz_VelYBl ) ) / xyz_DensBZ                                          
!      & - 2.0d0 * xqz_dy_xyz( ( xyz_KmBl ** 2.0d0 ) )             &
!      &   / ( 3.0d0 * ( Cm ** 2.0d0 ) * ( MixLen ** 2.0d0 ) )
    
    xqz_DVelYDt = xqz_DVelYDt0 + xqz_Turb

    call HistoryAutoPut(TimeN, 'VelYTurb', xqz_Turb(1:nx, 1:ny, 1:nz))

    xyr_Turb = + 2.0d0 * xyr_dz_xyz( xyz_DensBZ * xyz_KmBl * xyz_dz_xyr( xyr_VelZBl ) ) / xyr_avr_xyz( xyz_DensBZ ) + xyr_dx_pyr( pyr_avr_xyz( xyz_KmBl ) * pyr_dz_pyz( pyz_VelXBl ) + pyr_avr_xyz( xyz_KmBl ) * pyr_dx_xyr( xyr_VelZBl ) ) + xyr_dy_xqr( xqr_avr_xyz( xyz_KmBl ) * xqr_dz_xqz( xqz_VelYBl ) + xqr_avr_xyz( xyz_KmBl ) * xqr_dy_xyr( xyr_VelZBl ) )                                                          
!      & - 2.0d0 * xyr_dz_xyz( xyz_DensBZ * ( xyz_KmBl ** 2.0d0 ) )  &
!      &   / ( 3.0d0 * ( Cm ** 2.0d0 ) * ( MixLen ** 2.0d0 ) )       &
!      &   / xyr_avr_xyz( xyz_DensBZ ) 

    xyr_DVelZDt = xyr_DVelZDt0 + xyr_Turb

    call HistoryAutoPut(TimeN, 'VelZTurb', xyr_Turb(1:nx, 1:ny, 1:nz))

    !--------------------
    ! Exner function
    !
    if ( FlagDExnerDtTurb ) then
      xyz_DispPI = xyz_DExnerDt_xyz( xyz_DispHeat )
    else 
      xyz_DispPi = 0.0d0
    end if
    xyz_DExnerDt = xyz_DExnerDt0 + xyz_DispPI

    call HistoryAutoPut(TimeN, 'ExnerDisp', xyz_DispPI(1:nx, 1:ny, 1:nz))

  end subroutine Turbulence_constKm_forcing
Subroutine :

Turbulence モジュールの初期化ルーチン

This procedure input/output NAMELIST#turbulence_constKm_nml .

[Source]

  subroutine turbulence_constKm_init
    !
    ! Turbulence モジュールの初期化ルーチン
    ! 

    ! 暗黙の型宣言禁止
    implicit none

    real(DP):: MinDelX
    real(DP):: MinDelY
    real(DP):: MinDelZ
    integer :: l
    integer :: unit

    ! NAMELIST から情報を取得
    NAMELIST /turbulence_constKm_nml/ Cm, ConstKm, ConstKh, FlagDExnerDtTurb, FlagDispHeat

    call FileOpen(unit, file=namelist_filename, mode='r')
    read(unit, NML=turbulence_constKm_nml)
    close(unit)

    ! 混合距離
    ! 2 次元計算の場合には DelY に依存しないようにするために if 文を利用.
    ! 
    MinDelX = minval(x_dx)
    MinDelY = minval(y_dy)
    MinDelZ = minval(z_dz)

    if ( FlagCalc3D ) then 
      MixLen = ( MinDelZ * MinDelX * MinDelY ) ** (1.0 / 3.0)
    else
      MixLen = sqrt(MinDelX * MinDelZ) 
    end if
    
    ! Output
    !
    if (myrank == 0) then 
      call MessageNotify( "M", module_name, "Cm = %f", d=(/Cm/))
      call MessageNotify( "M", module_name, "MixLen= %f", d=(/MixLen/))
      call MessageNotify( "M", module_name, "ConstKm= %f", d=(/ConstKm/))
      call MessageNotify( "M", module_name, "ConstKh= %f", d=(/ConstKh/))
      call MessageNotify( "M", module_name, "FlagDispHeat= %b", l=(/ FlagDispHeat /))
      call MessageNotify( "M", module_name, "FlagDExnerDtTurb= %b", l=(/ FlagDExnerDtTurb /))
    end if

    call HistoryAutoAddVariable( varname='VelXTurb', dims=(/'x','y','z','t'/), longname='Turbulence term of velocity (x)', units='m.s-2', xtype='float')

    call HistoryAutoAddVariable( varname='VelYTurb', dims=(/'x','y','z','t'/), longname='Turbulence term of velocity (y)', units='m.s-2', xtype='float')

    call HistoryAutoAddVariable( varname='VelZTurb', dims=(/'x','y','z','t'/), longname='Turbulence term of velocity (z)', units='m.s-2', xtype='float')

    call HistoryAutoAddVariable( varname='PTempTurb', dims=(/'x','y','z','t'/), longname='Turbulence term of potential temperature', units='K.s-1', xtype='float')

    call HistoryAutoAddVariable( varname='PTempDisp', dims=(/'x','y','z','t'/), longname='Dissipation term of potential temperature', units='K.s-1', xtype='float')

    call HistoryAutoAddVariable( varname='ExnerDisp', dims=(/'x','y','z','t'/), longname='Dissipation term of exner function', units='s-1', xtype='float')

    call HistoryAutoAddVariable( varname='CDensTurb', dims=(/'x','y','z','t'/), longname='Turbulence term of cloud density', units='kg.m-3.s-1', xtype='float')

    do l = 1, ncmax
      call HistoryAutoAddVariable( varname=trim(SpcWetSymbol(l))//'_Turb', dims=(/'x','y','z','t'/), longname='Turbulence term of ' //trim(SpcWetSymbol(l))//' mixing ratio', units='kg.kg-1.s-1', xtype='float')
    end do

  end subroutine turbulence_constKm_init