Class initialdata_sounding
In: ../src/env/initialdata_sounding.f90

サウンディングファイルから初期場を決めるためのサブルーチン サウンディングファイルはテキストファイルで書かれている. 将来的には netCDF に変更する予定.

Methods

Included Modules

dc_types dc_iounit dc_message mpi_wrapper namelist_util gridset axesset constants

Public Instance methods

Subroutine :
z_Temp(kmin:kmax) :real(DP), intent(out)
: 温度
z_Press(kmin:kmax) :real(DP), intent(out)
: 圧力

[Source]

  subroutine  initialdata_sounding_basic( z_Temp, z_Press )
    !
    !
    
    implicit none

    real(DP), intent(out):: z_Press(kmin:kmax)           !圧力
    real(DP), intent(out):: z_Temp(kmin:kmax)            !温度
    real(DP)             :: r_Press(kmin:kmax)           !圧力
    real(DP)             :: r_Temp(kmin:kmax)            !温度

    real(DP)             :: z_DTempDZ(kmin:kmax)
    real(DP)             :: DTempDZ

    integer              :: i, k, k1, k2
    logical              :: flag

    ! 初期化
    !
    z_Temp  = 0.0d0
    r_Temp  = 0.0d0
    z_Press = 0.0d0
    r_Press = 0.0d0

    flag = .false. 

    ! データ読み込み
    !    
    do k = kmin, kmax
      do i = 1, NumRec
        if ( r_Z(k) == r_tmpAlt(i) ) then 
          r_Temp(k) = r_tmpTemp(i)
          r_Press(k) = r_tmpPress(i)
        end if
      end do
    end do

    ! データ読み込み  
    ! うまく半格子に合う場合もあるので, その場合はデータを優先. 
    !    
    do k = kmin, kmax
      do i = 1, NumRec
        if ( z_Z(k) == r_tmpAlt(i) ) then 
          flag = .true. 
          z_Temp(k) = r_tmpTemp(i)
          z_Press(k) = r_tmpPress(i)
        end if
      end do
    end do
    
    ! r => z の変換
    ! 
    if (.NOT. flag) then 
      do k = kmin+1, kmax
        z_Temp(k)  = ( r_Temp(k-1)  + r_Temp(k)  ) / 2.0d0
        z_Press(k) = ( r_Press(k-1) + r_Press(k) ) / 2.0d0
      end do
    end if

    ! 確認
    !
!    do k = kmin, kmax
!      write(*,*) z_z(k), z_Temp(k), z_Press(k)
!   end do

   
!!!
!!! 圏界面が存在する場合には, そこでの温度勾配を緩やかにする.
!!!

    ! 現在の温度分布の勾配を取る
    !
    do k = 1, kmax
      z_DTempDZ(k) = (z_Temp(k) - z_Temp(k-1)) / dz
    end do
    
    ! 対流圏界面より上の扱い. 指定された高度の温度減率を使い続ける. 
    !
    k1 = minloc( z_Z, 1, z_Z > AltTr ) 

    ! 温度減率
    !
    DTempDZ = z_DTempDZ(k1-1)
    k2 = DelAlt / dz 

    do k = k1, kmax

      ! 温度源率をゼロに近づける. 
      !
      DTempDZ = min( -1.0d-14, DTempDZ - DTempDZ / k2 * ( k - k1 ) )

      !基本場の温度を決める
      z_Temp(k) = z_Temp(k-1) + DTempDZ * dz
      
      !圧力を静水圧平衡から計算
      z_Press(k) = z_Press(k-1) * ( ( z_Temp(k-1) / z_Temp(k) ) ** (Grav / ( DTempDZ * GasRDry ) ) )

    end do

  end subroutine Initialdata_sounding_basic
Subroutine :

設定ファイルから出力ファイルに記載する情報を読み込む

This procedure input/output NAMELIST#initialdata_sounding_nml .

[Source]

  subroutine initialdata_sounding_init
    !
    !設定ファイルから出力ファイルに記載する情報を読み込む
    !
    
    !暗黙の型宣言禁止
    implicit none
    
    !内部変数
    integer             :: AltCol = 0
    integer             :: TempCol = 0
    integer             :: PressCol = 0
    integer             :: VelXCol = 0
    integer             :: VelYCol = 0
    integer             :: unit     !設定ファイル用装置番号  
    integer             :: io
    character(30)       :: SoundingFile    
    
    integer, parameter  :: maxch=12
    character(len=100)  :: buf, eachcol(maxch)
    integer             :: num, MaxCol
    
    !設定ファイルから読み込む出力ファイル情報
    !
    NAMELIST /initialdata_sounding_nml/ SoundingFile, AltCol, TempCol, PressCol, VelXCol, VelYCol, AltTr, DelAlt
    
    !設定ファイルから出力ファイルに記載する情報を読み込む
    !
    call FileOpen(unit, file=namelist_filename, mode='r')
    read(unit, NML=initialdata_sounding_nml)
    close(unit)

!    write(*,*) SoundingFile, AltCol, TempCol, PressCol

    ! 初期化
    !
    io = 0
    NumRec = 0
    MaxCol = max( AltCol, max( TempCol, PressCol ) )
!    write(*,*) "MaxCol", MaxCol
    r_tmpAlt  = 0.0d0
     r_tmpTemp = 0.0d0
     r_tmpPress = 0.0d0
     
    r_tmpVelX = 0.0d0
     r_tmpVelY = 0.0d0

    ! ファイルのオープン
    !
    open (17, file=SoundingFile, status='old')
    
    ! ファイル呼び出し
    !
    do while ( io == 0 ) 
      ! 1 行分読み出し
      !
      read (17, '(a)', IOSTAT=io) buf
      
      ! 行をカンマ区切りで分割
      !
      call devidecsv( buf, eachcol, maxch, num )
      
      ! 確認
      !
!      write(*,*) num
!      do i=1, num
!        write(*,*) i, eachcol(i)(1:len_trim(eachcol(i)))
!      end do

      ! num の値が小さいものはヘッダとみなす. 
      !
      if (num >= MaxCol) then 
        ! 行数の計算
        !
        NumRec = NumRec + 1        

        ! 値の代入
        !
        if (AltCol > 0)   read( eachcol(AltCol)(1:len_trim(eachcol(AltCol))), *)    r_tmpAlt(NumRec) 
        if (TempCol > 0)  read( eachcol(TempCol)(1:len_trim(eachcol(TempCol))), *)   r_tmpTemp(NumRec)   
        if (PressCol > 0) read( eachcol(PressCol)(1:len_trim(eachcol(PressCol))), *) r_tmpPress(NumRec) 
        if (VelXCol > 0)  read( eachcol(VelXCol)(1:len_trim(eachcol(VelXCol))), *)   r_tmpVelX(NumRec)   
        if (VelYCol > 0)  read( eachcol(VelYCol)(1:len_trim(eachcol(VelYCol))), *)   r_tmpVelY(NumRec) 

      end if

    end do

    ! 確認
    !
!    write(*,*) z_tmpAlt(1:NumRec)

    ! ファイルのクローズ
    !
    close (17)    

  end subroutine initialdata_sounding_init
Subroutine :
pyz_VelX(imin:imax,jmin:jmax,kmin:kmax) :real(DP), intent(out)
xqz_VelY(imin:imax,jmin:jmax,kmin:kmax) :real(DP), intent(out)

[Source]

  subroutine initialdata_sounding_wind(pyz_VelX, xqz_VelY)

    implicit none

    real(DP), intent(out) :: pyz_VelX(imin:imax,jmin:jmax,kmin:kmax)
    real(DP), intent(out) :: xqz_VelY(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)              :: pyr_VelX(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)              :: xqr_VelY(imin:imax,jmin:jmax,kmin:kmax)
    integer               :: i, k
    logical               :: flag
    
    !初期化
    pyz_VelX = 0.0d0
    pyr_VelX = 0.0d0
    xqz_VelY = 0.0d0
    xqr_VelY = 0.0d0

    flag = .false. 

    ! データ読み込み  
    !        
    do k = kmin, kmax
      do i = 1, NumRec
        if ( r_Z(k) == r_tmpAlt(i) ) then 
          pyr_VelX(:,:,k) = r_tmpVelX(i)
          xqr_VelY(:,:,k) = r_tmpVelY(i)
        end if
      end do
    end do

    ! データ読み込み  
    ! うまく半格子に合う場合もあるので, その場合はデータを優先. 
    !        
    do k = kmin, kmax
      do i = 1, NumRec
        if ( z_Z(k) == r_tmpAlt(i) ) then 
          flag = .true. 
          pyz_VelX(:,:,k) = r_tmpVelX(i)
          xqz_VelY(:,:,k) = r_tmpVelY(i)
        end if
      end do
    end do

    ! r => z の変換
    ! 
    if (.NOT. flag) then 
      do k = kmin+1, kmax
        pyz_VelX(:,:,k) = ( pyr_VelX(:,:,k-1) + pyr_VelX(:,:,k) ) * 5.0d-1
        xqz_VelY(:,:,k) = ( xqr_VelY(:,:,k-1) + xqr_VelY(:,:,k) ) * 5.0d-1
      end do
    end if

    ! 確認
    !
!    do k = kmin, kmax
!      write(*,*) z_z(k), pyz_VelX(1,1,k), xqz_VelY(1,1,k)
!    end do
    
  end subroutine initialdata_sounding_wind