Class initialdata_disturb
In: env/initialdata_disturb.f90

擾乱のデフォルト値を与えるためのルーチン.

Methods

Included Modules

dc_types dc_message axesset gridset basicset composition constants eccm dc_iounit

Public Instance methods

ID_FlaginitdataExner
Variable :
ID_FlaginitdataExner = 0 :integer, save, public
ID_FlaginitdataPTemp
Variable :
ID_FlaginitdataPTemp = 0 :integer, save, public
ID_FlaginitdataQMix
Variable :
ID_FlaginitdataQMix = 0 :integer, save, public
ID_FlaginitdataQMix_dryregion
Constant :
ID_FlaginitdataQMix_dryregion = 5 :integer, parameter, public
ID_FlaginitdataQMix_moist
Constant :
ID_FlaginitdataQMix_moist = 6 :integer, parameter, public
ID_Flaginitdata_GaussXY
Constant :
ID_Flaginitdata_GaussXY = 1 :integer, parameter, public
ID_Flaginitdata_GaussXYZ
Constant :
ID_Flaginitdata_GaussXYZ = 3 :integer, parameter, public
ID_Flaginitdata_GaussXZ
Constant :
ID_Flaginitdata_GaussXZ = 2 :integer, parameter, public
ID_Flaginitdata_random
Constant :
ID_Flaginitdata_random = 4 :integer, parameter, public
Subroutine :
xyzf_QMix(imin:imax, jmin:jmax, kmin:kmax, 1:ncmax) :real(DP), intent(out)

[Source]

  subroutine initialdata_disturb_dryregion(xyzf_QMix)
    
    implicit none
    
    real(DP), intent(out) :: xyzf_QMix(imin:imax, jmin:jmax, kmin:kmax, 1:ncmax)
    integer         :: i, j, k, s
    
    ! XposMin:XposMax,ZposMin:ZposMax で囲まれた領域の初期の湿度をゼロにするために
    ! 基本場と逆符号の水蒸気擾乱を与える
    do s = 1, ncmax
      do k = kmin,kmax  
        do j = jmin, jmax
          do i = imin,imax
            if (z_Z(k) >= ZposMin .AND. z_Z(k) < ZposMax .AND. y_Y(j) >= YposMin .AND. y_Y(j) < YposMax .AND. x_X(i) >= XposMin .AND. x_X(i) < XposMax) then
              xyzf_QMix(i,j,k,s) = - xyzf_QMixBZ(i,j,k,s)
            end if
          end do
        end do
      end do
    end do
    
  end subroutine initialdata_disturb_dryregion
Subroutine :
xyz_Var(imin:imax, jmin:jmax, kmin:kmax) :real(DP), intent(out)

[Source]

  subroutine initialdata_disturb_gaussXY(xyz_Var)
    
    implicit none
    
    real(DP), intent(out) :: xyz_Var(imin:imax, jmin:jmax, kmin:kmax)
    integer         :: i, j, k
    
    do k = kmin, kmax
      do j = jmin, jmax
        do i = imin, imax
          xyz_Var(i,j,k) = DelMax * dexp( - ( (x_X(i) - Xc) / Xr )**2.0d0 * 5.0d-1 - ( (y_Y(j) - Yc) / Yr )**2.0d0 * 5.0d-1 )
        end do
      end do
    end do

!    where ( xyz_Var < DelMax * 1.0d-2) 
!      xyz_Var = 0.0d0
!    end where
    
  end subroutine initialdata_disturb_gaussXY
Subroutine :
xyz_Var(imin:imax, jmin:jmax, kmin:kmax) :real(DP), intent(out)

[Source]

  subroutine initialdata_disturb_gaussXYZ(xyz_Var)
    
    implicit none
    
    real(DP), intent(out) :: xyz_Var(imin:imax, jmin:jmax, kmin:kmax)
    integer         :: i, j, k
    
    do k = kmin, kmax
      do j = jmin, jmax
        do i = imin, imax
          xyz_Var(i,j,k) = DelMax * dexp( - ( (x_X(i) - Xc) / Xr )**2.0d0 * 5.0d-1 - ( (y_Y(j) - Yc) / Yr )**2.0d0 * 5.0d-1 - ( (z_Z(k) - Zc) / Zr )**2.0d0 * 5.0d-1 ) 
        end do
      end do
    end do
    
!    where ( xyz_Var < DelMax * 1.0d-2) 
!      xyz_Var = 0.0d0
!    end where

  end subroutine initialdata_disturb_gaussXYZ
Subroutine :
xyz_Var(imin:imax, jmin:jmax, kmin:kmax) :real(DP), intent(out)

[Source]

  subroutine initialdata_disturb_gaussXZ(xyz_Var)

    implicit none
    
    real(DP), intent(out) :: xyz_Var(imin:imax, jmin:jmax, kmin:kmax)
    integer         :: i, j, k

    do k = kmin, kmax
      do j = jmin, jmax
        do i = imin, imax
          xyz_Var(i,j,k) = DelMax * dexp( - ( (x_X(i) - Xc) / Xr )**2.0d0 * 5.0d-1 - ( (z_Z(k) - Zc) / Zr )**2.0d0 * 5.0d-1 ) 
        end do
      end do
    end do

!    where ( xyz_Var < DelMax * 1.0d-2) 
!      xyz_Var = 0.0d0
!    end where
    
  end subroutine initialdata_disturb_gaussXZ
Subroutine :
xyzf_QMix(imin:imax, jmin:jmax, kmin:kmax, 1:ncmax) :real(DP), intent(out)

[Source]

  subroutine initialdata_disturb_moist(xyzf_QMix)
    
    implicit none
    
    real(DP), intent(out) :: xyzf_QMix(imin:imax, jmin:jmax, kmin:kmax, 1:ncmax)
    real(DP)        :: za_MolFr(kmin:kmax, 1:ncmax)
    integer         :: i, j, k, s
  
    ! 湿度ゼロなら何もしない
    if ( Humidity == 0.0d0 ) return

    ! 水平一様なので, i=0 だけ計算. 
    i = 1
    j = 1
    call eccm_molfr( SpcWetMolFr(1:ncmax), Humidity, xyz_TempBZ(i,j,:), xyz_PressBZ(i,j,:), za_MolFr )
    
    !気相のモル比を混合比に変換
    do s = 1, ncmax
      do k = 1, nz
        do j = 1, ny
          do i = 1, nx
            xyzf_QMix(i,j,k,s) = za_MolFr(k,s) * MolWtWet(s) / MolWtDry - xyzf_QMixBZ(i,j,k,s)
          end do
        end do
      end do
    end do
    
  end subroutine initialdata_disturb_moist
Subroutine :
cfgfile :character(STRING), intent(in)

nml の読み込み

This procedure input/output NAMELIST#initialdata_disturb .

[Source]

  subroutine initialdata_disturb_nml(cfgfile)
    ! nml の読み込み
    !
    use dc_iounit,     only : FileOpen    

    implicit none

    character(STRING), intent(in) :: cfgfile    
    integer                       :: unit     !装置番号
    character(STRING)  :: FlaginitdataPTemp = ""
    character(STRING)  :: FlaginitdataExner = ""
    character(STRING)  :: FlaginitdataQMix = ""

    NAMELIST /initialdata_disturb/ FlaginitdataPTemp, FlaginitdataExner, FlaginitdataQMix, DelMax, XrRate, XcRate, YrRate, YcRate, ZrRate, ZcRate, Zpos, XposMin, YposMin, ZposMin, XposMax, YposMax, ZposMax, Humidity
    
    call FileOpen(unit, file=cfgfile, mode='r')
    read(unit, NML=initialdata_disturb)
    close(unit)

    if (FlaginitdataPTemp == "GaussXY") then 
      ID_FlaginitdataPTemp = ID_Flaginitdata_GaussXY
    elseif (FlaginitdataPTemp == "GaussXZ") then 
      ID_FlaginitdataPTemp = ID_Flaginitdata_GaussXZ
    elseif (FlaginitdataPTemp == "GaussXYZ") then 
      ID_FlaginitdataPTemp = ID_Flaginitdata_GaussXYZ
    elseif (FlaginitdataPTemp == "random") then 
      ID_FlaginitdataPTemp = ID_Flaginitdata_random
    end if

    if (FlaginitdataExner == "GaussXY") then 
      ID_FlaginitdataExner = ID_Flaginitdata_GaussXY
    elseif (FlaginitdataExner == "GaussXZ") then 
      ID_FlaginitdataExner = ID_Flaginitdata_GaussXZ
    elseif (FlaginitdataExner == "GaussXYZ") then 
      ID_FlaginitdataExner = ID_Flaginitdata_GaussXYZ
    elseif (FlaginitdataExner == "random") then 
      ID_FlaginitdataExner = ID_Flaginitdata_random
    end if

    if (FlaginitdataQMix == "GaussXY") then 
      ID_FlaginitdataQMix = ID_Flaginitdata_GaussXY
    elseif (FlaginitdataQMix == "GaussXZ") then 
      ID_FlaginitdataQMix = ID_Flaginitdata_GaussXZ
    elseif (FlaginitdataQMix == "GaussXYZ") then 
      ID_FlaginitdataQMix = ID_Flaginitdata_GaussXZ
    elseif (FlaginitdataQMix == "dryregion") then 
      ID_FlaginitdataQMix = ID_FlaginitdataQMix_dryregion
    elseif (FlaginitdataQMix == "moist") then 
      ID_FlaginitdataQMix = ID_FlaginitdataQMix_moist
    end if
    
    ! 位置の決定
    !  XMax には MPI を含めた全領域が入っている
    Xc = (XMax - XMin) * XcRate 
    Yc = (YMax - YMin) * YcRate 
    Zc = (ZMax - ZMin) * ZcRate 
    Xr = (XMax - XMin) * XrRate 
    Yr = (YMax - YMin) * YrRate 
    Zr = (ZMax - ZMin) * ZrRate 
!    Xr = minval( x_X, 1, x_X > (XMax - XMin) * XrRate )
!    Yr = minval( y_Y, 1, y_Y > (YMax - YMin) * YrRate )
!    Zr = minval( z_Z, 1, z_Z > (ZMax - ZMin) * ZrRate )
!    Xc = minval( x_X, 1, x_X > (XMax - XMin) * XcRate )
!    Yc = minval( y_Y, 1, y_Y > (YMax - YMin) * YcRate )
!    Zc = minval( z_Z, 1, z_Z > (ZMax - ZMin) * ZcRate )

!    call MessageNotify( "M", "initialdata_disturb", "Xr = %f", d=(/Xr/) )
!    call MessageNotify( "M", "initialdata_disturb", "Xc = %f", d=(/Xc/) )
!    call MessageNotify( "M", "initialdata_disturb", "Yr = %f", d=(/Yr/) )
!    call MessageNotify( "M", "initialdata_disturb", "Yc = %f", d=(/Yc/) )
!    call MessageNotify( "M", "initialdata_disturb", "Zr = %f", d=(/Zr/) )
!    call MessageNotify( "M", "initialdata_disturb", "Zc = %f", d=(/Zc/) )
    
  end subroutine initialdata_disturb_nml
Subroutine :
xyz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP), intent(out)

[Source]

  subroutine initialdata_disturb_random( xyz_Var )
    
    implicit none
    
    real(DP), intent(out) :: xyz_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)              :: Random           !ファイルから取得した乱数
    real(DP)              :: Random1(imin:imax, jmin:jmax)
    integer :: i, j, k, kpos

    !  0.0--1.0 の擬似乱数発生
    do j = jmin, jmax
      do i = imin, imax
        call random_number(random)
        Random1(i,j) = random
      end do
    end do

    ! 指定された高度の配列添字を用意
    do k = kmin, kmax
      if ( z_Z(k) >= Zpos ) then 
        kpos = k
        exit
      end if
    end do

    ! 擾乱が全体としてはゼロとなるように調整. 平均からの差にする. 
    do j = 1, ny
      do i = 1, nx
        xyz_Var(i, j, kpos) = DelMax * (Random1(i,j) - sum( Random1(1:nx,1:ny) ) / real((nx * ny),8))
      end do
    end do
    
  end subroutine initialdata_disturb_random