Class | Radiation_Sounding |
In: |
../src/physics/radiation_sounding.f90
|
簡単放射: サウンディングファイルから加熱率を与える
Subroutine : |
サウンディングファイルから加熱率を読み込む
This procedure input/output NAMELIST#radiation_sounding_nml .
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