Class Radiation_Sounding
In: ../src/physics/radiation_sounding.f90

簡単放射: サウンディングファイルから加熱率を与える

Methods

Included Modules

dc_types dc_iounit dc_message gtool_historyauto mpi_wrapper gridSet axesset constants basicset DExnerDt namelist_util

Public Instance methods

Subroutine :

サウンディングファイルから加熱率を読み込む

This procedure input/output NAMELIST#radiation_sounding_nml .

[Source]

  subroutine radiation_sounding_init
    !
    ! サウンディングファイルから加熱率を読み込む
    !
    
    !暗黙の型宣言禁止
    implicit none
    
    !内部変数
    integer             :: AltCol = 0       !「高度」の列番号 (サウンディングファイル内)
    integer             :: SWaveCol = 0     !「短波放射による加熱率」の列番号 (サウンディングファイル内)
    integer             :: LWaveCol = 0     !「長波放射による加熱率」の列番号 (サウンディングファイル内)
    integer             :: unit             !設定ファイル用装置番号  
    integer             :: k
    integer             :: io
    character(30)       :: SoundingFile     ! サウンディングファイル
    
    integer, parameter  :: maxch=12
    character(len=200)  :: buf, eachcol(maxch)
    integer             :: i, num, MaxCol

    real(DP)            :: r_tmpQradSW(10000)
    real(DP)            :: r_tmpQradLW(10000)
    real(DP)            :: r_tmpAlt(10000)
    real(DP)            :: r_tmpQrad(10000)
    integer             :: NumRec = 0

    real(DP), allocatable :: xyr_PTempRadSndg(:,:,:)   

    logical             :: flag

   
    !設定ファイルから読み込む出力ファイル情報
    !
    NAMELIST /radiation_sounding_nml/ SoundingFile, AltCol, SWaveCol, LWaveCol, FlagDExnerDtRad
              
    !設定ファイルから出力ファイルに記載する情報を読み込む
    !
    call FileOpen(unit, file=namelist_filename, mode='r')
    read(unit, NML=radiation_sounding_nml)
    close(unit)
      
    ! 初期化
    !
    io = 0
    NumRec = 0
    MaxCol = max( AltCol, max( SWaveCol, LWaveCol ) )
!    write(*,*) "MaxCol", MaxCol
    r_tmpAlt  = 0.0d0
     r_tmpQrad = 0.0d0
     r_tmpQradSW = 0.0d0
     r_tmpQradLW = 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 (SWaveCol > 0) read( eachcol(SWaveCol)(1:len_trim(eachcol(SWaveCol))), *) r_tmpQradSW(NumRec) 
        if (LWaveCol > 0) read( eachcol(LWaveCol)(1:len_trim(eachcol(LWaveCol))), *) r_tmpQradLW(NumRec) 

        r_tmpQrad(NumRec) = r_tmpQradSW(NumRec) + r_tmpQradLW(NumRec)

      end if

!      write(*,*) r_tmpAlt(NumRec), r_tmpQradSW(NumRec), r_tmpQradLW(NumRec), r_tmpQrad(NumRec) 

    end do

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

    !初期化
    !
    allocate( xyz_PTempRadSndg(imin:imax, jmin:jmax, kmin:kmax) )
    allocate( xyr_PTempRadSndg(imin:imax, jmin:jmax, kmin:kmax) )
    allocate( xyz_ExnerRadSndg(imin:imax, jmin:jmax, kmin:kmax) )

    xyz_PTempRadSndg = 0.0d0
    xyr_PTempRadSndg = 0.0d0
    xyz_ExnerRadSndg = 0.0d0

    flag = .false.
    
    do k = kmin, kmax
      do i = 1, NumRec
        if ( r_Z(k) == r_tmpAlt(i) ) then           
          xyr_PTempRadSndg(:,:,k) = r_tmpQrad(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. 
!          write(*,*) r_tmpAlt(i), r_tmpQrad(i), '(', r_tmpQradSW(i), '+', r_tmpQradLW(i), ')'
          xyz_PTempRadSndg(:,:,k) = r_tmpQrad(i)
        end if
      end do
    end do

    if (.NOT. flag) then 
      do k = kmin+1, kmax
        xyz_PTempRadSndg(:,:,k) = ( xyr_PTempRadSndg(:,:,k-1) + xyr_PTempRadSndg(:,:,k) ) * 5.0d-1
      end do
    end if


    ! 単位換算
    !
    xyz_PTempRadSndg = xyz_PTempRadSndg / DayTime / xyz_ExnerBZ


    if ( FlagDExnerDtRad ) then    
      xyz_ExnerRadSndg = xyz_DExnerDt_xyz(xyz_PTempRadSndg)
    else
      xyz_ExnerRadSndg = 0.0d0
    end if


    ! ヒストリデータ定義
    ! 
    call HistoryAutoAddVariable( varname='PTempRad', dims=(/'x','y','z','t'/), longname='Radiation term of potential temperature', units='K.s-1', xtype='float')

    call HistoryAutoAddVariable( varname='ExnerRad', dims=(/'x','y','z','t'/), longname='Radiation term of Exner function', units='K.s-1', xtype='float')

  end subroutine radiation_sounding_init
xyz_ExnerRadSndg
Variable :
xyz_ExnerRadSndg(:,:,:) :real(DP), save, allocatable, public
: 放射加熱項
xyz_PTempRadSndg
Variable :
xyz_PTempRadSndg(:,:,:) :real(DP), save, allocatable, public
: 放射加熱項