Class | radiation_CA81 |
In: |
radiation/radiation_CA81.f90
|
Note that Japanese and English are described in parallel.
短波放射モデル.
This is a model of short wave radiation.
Cho, M.-D., and A. Arking, An efficient method for computing the absorption of solar radiation by water vapor, J. Atmos. Sci., 38, 798-807, 1981.
!$ ! RadiationFluxDennouAGCM : | 放射フラックスの計算 |
!$ ! RadiationDTempDt : | 放射フラックスによる温度変化の計算 |
!$ ! RadiationFluxOutput : | 放射フラックスの出力 |
!$ ! RadiationFinalize : | 終了処理 (モジュール内部の変数の割り付け解除) |
!$ ! ———— : | ———— |
!$ ! RadiationFluxDennouAGCM : | Calculate radiation flux |
!$ ! RadiationDTempDt : | Calculate temperature tendency with radiation flux |
!$ ! RadiationFluxOutput : | Output radiation fluxes |
!$ ! RadiationFinalize : | Termination (deallocate variables in this module) |
Subroutine : | |||
xy_SurfAlbedo(0:imax-1, 1:jmax) : | real(DP), intent(in ) | ||
xy_InAngle(0:imax-1, 1:jmax) : | real(DP), intent(in )
| ||
xyz_QVap(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in ) | ||
xyr_Press(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(in ) | ||
xyz_Press(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in ) | ||
xyr_RadSFlux(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(out) |
subroutine RadiationCA81Flux( xy_SurfAlbedo, xy_InAngle, xyz_QVap, xyr_Press, xyz_Press, xyr_RadSFlux ) ! USE statements ! ! ! Grid points settings ! use gridset, only: imax, jmax, kmax ! ! Number of vertical level ! ! Physical constants settings ! use constants, only: Grav, PI ! $ \pi $ . ! Circular constant real(DP), intent(in ):: xy_SurfAlbedo (0:imax-1, 1:jmax) real(DP), intent(in ):: xy_InAngle (0:imax-1, 1:jmax) ! sec (入射角). ! sec (angle of incidence) real(DP), intent(in ):: xyz_QVap (0:imax-1, 1:jmax, 1:kmax) real(DP), intent(in ):: xyr_Press (0:imax-1, 1:jmax, 0:kmax) real(DP), intent(in ):: xyz_Press (0:imax-1, 1:jmax, 1:kmax) real(DP), intent(out):: xyr_RadSFlux (0:imax-1, 1:jmax, 0:kmax) ! ! Work variables ! real(DP):: RefPress real(DP):: xyz_H2ODelAbsAmt(0:imax-1, 1:jmax, 1:kmax) real(DP):: xyr_H2OColDen (0:imax-1, 1:jmax, 0:kmax) real(DP):: xyr_H2OAbsAmt (0:imax-1, 1:jmax, 0:kmax) real(DP):: xyra_TransH2O (0:imax-1, 1:jmax, 0:kmax, 1:nlogkmax) real(DP):: xy_MagFac (0:imax-1, 1:jmax) real(DP):: xy_cosSZA (0:imax-1, 1:jmax) !!$ logical :: flag_dry_atmosphere integer :: i integer :: j integer :: k integer :: m if ( .not. radiation_ca81_inited ) then call RadiationCA81Init end if !!$ ! Check for dry atmosphere !!$ ! !!$ if ( all( xyz_QVap <= 0.0d0 ) ) then !!$ flag_dry_atmosphere = .true. !!$ write( 6, * ) 'Dry atmosphere' !!$ else !!$ flag_dry_atmosphere = .false. !!$ end if !!$ ! 大気アルベドの考慮 !!$ ! Taking atmospheric albedo into consideration !!$ ! !!$ xy_IncomRadSFlux = xy_IncomRadSFlux * ( 1.0d0 - ShortAtmosAlbedo ) !!$ if ( flag_dry_atmosphere ) then !!$ do k = 0, kmax !!$ xyr_RadSFlux(:,:,k) = - xy_IncomRadSFlux(:,:) + ... !!$ end do !!$ return !!$ end if RefPress = 300.0d2 do k = 1, kmax xyz_H2ODelAbsAmt(:,:,k) = ( xyz_Press(:,:,k) / RefPress )**H2OScaleIndex * xyz_QVap(:,:,k) * ( xyr_Press(:,:,k-1) - xyr_Press(:,:,k) ) / Grav end do xyr_H2OColDen(:,:,:) = 0.0d0 do k = kmax-1, 0, -1 xyr_H2OColDen(:,:,k) = xyr_H2OColDen(:,:,k+1) + xyz_H2ODelAbsAmt(:,:,k+1) end do do j = 1, jmax do i = 0, imax-1 if ( xy_InAngle(i,j) > 0.0d0 ) then xy_MagFac(i,j) = xy_InAngle(i,j) xy_cosSZA(i,j) = 1.0d0 / xy_InAngle(i,j) else xy_MagFac(i,j) = 0.0d0 xy_cosSZA(i,j) = 0.0d0 end if end do end do ! Calculation of flux ! xyr_RadSFlux(:,:,:) = 0.0d0 ! Downward flux ! do k = 0, kmax xyr_H2OAbsAmt(:,:,k) = xyr_H2OColDen(:,:,k) * xy_MagFac(:,:) end do do m = 1, nlogkmax xyra_TransH2O(:,:,:,m) = exp( - a_kdfk(m) * xyr_H2OAbsAmt ) end do do m = 1, nlogkmax do k = 0, kmax xyr_RadSFlux(:,:,k) = xyr_RadSFlux(:,:,k) - xyra_TransH2O(:,:,k,m) * a_kdfh(m) * kdfdlogk * xy_cosSZA(:,:) end do end do ! Upward flux ! do k = 0, kmax xyr_H2OAbsAmt(:,:,k) = xyr_H2OColDen(:,:,0) * xy_MagFac(:,:) + ( xyr_H2OColDen(:,:,0) - xyr_H2OColDen(:,:,k) ) * DiffFactor end do do m = 1, nlogkmax xyra_TransH2O(:,:,:,m) = exp( - a_kdfk(m) * xyr_H2OAbsAmt ) end do do m = 1, nlogkmax do k = 0, kmax xyr_RadSFlux(:,:,k) = xyr_RadSFlux(:,:,k) + xyra_TransH2O(:,:,k,m) * a_kdfh(m) * kdfdlogk * xy_cosSZA(:,:) * xy_SurfAlbedo(:,:) end do end do !!$ write( 6, * ) '***************************' !!$ write( 6, * ) '***************************' !!$ write( 6, * ) '***************************' !!$ write( 6, * ) 'Short wave radiation out of H2O band is not added in radiation_CA81 module.' !!$ write( 6, * ) '***************************' !!$ write( 6, * ) '***************************' !!$ write( 6, * ) '***************************' !!$ ! Add flux over wavenumber range except for H2O band, that is treated by !!$ ! Cho and Arking (1981) scheme. !!$ ! !!$ do k = 0, kmax !!$ xyr_RadSFlux(:,:,k) = xyr_RadSFlux(:,:,k) & !!$ & - ( solarconstCA81 - totalfluxoverH2Oband ) * xy_cosSZA(:,:) !!$ end do ! 大気アルベドの考慮 ! Taking atmospheric albedo into consideration ! xyr_RadSFlux = xyr_RadSFlux * ( 1.0d0 - ShortAtmosAlbedo ) end subroutine RadiationCA81Flux
Subroutine : | |
xyz_QVap(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in ) |
xyr_Press(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(in ) |
xyz_Press(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in ) |
ikdfbin : | integer , intent(in ) |
xyz_H2ODelOptDep(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(out) |
KDFWeight : | real(DP), intent(out) |
subroutine RadiationCA81H2ODelOptDep( xyz_QVap, xyr_Press, xyz_Press, ikdfbin, xyz_H2ODelOptDep, KDFWeight ) ! USE statements ! ! ! Grid points settings ! use gridset, only: imax, jmax, kmax ! ! Number of vertical level ! ! Physical constants settings ! use constants, only: Grav, PI ! $ \pi $ . ! Circular constant real(DP), intent(in ):: xyz_QVap (0:imax-1, 1:jmax, 1:kmax) real(DP), intent(in ):: xyr_Press (0:imax-1, 1:jmax, 0:kmax) real(DP), intent(in ):: xyz_Press (0:imax-1, 1:jmax, 1:kmax) integer , intent(in ):: ikdfbin real(DP), intent(out):: xyz_H2ODelOptDep(0:imax-1, 1:jmax, 1:kmax) real(DP), intent(out):: KDFWeight ! ! Work variables ! real(DP):: RefPress real(DP):: xyz_H2ODelAbsAmt(0:imax-1, 1:jmax, 1:kmax) !!$ logical :: flag_dry_atmosphere integer :: k integer :: m if ( .not. radiation_ca81_inited ) then call RadiationCA81Init end if !!$ ! Check for dry atmosphere !!$ ! !!$ if ( all( xyz_QVap <= 0.0d0 ) ) then !!$ flag_dry_atmosphere = .true. !!$ write( 6, * ) 'Dry atmosphere' !!$ else !!$ flag_dry_atmosphere = .false. !!$ end if RefPress = 300.0d2 do k = 1, kmax xyz_H2ODelAbsAmt(:,:,k) = ( xyz_Press(:,:,k) / RefPress )**H2OScaleIndex * xyz_QVap(:,:,k) * ( xyr_Press(:,:,k-1) - xyr_Press(:,:,k) ) / Grav end do m = ikdfbin xyz_H2ODelOptDep = xyz_H2ODelAbsAmt * a_kdfk( m ) KDFWeight = a_kdfh(m) * kdfdlogk end subroutine RadiationCA81H2ODelOptDep
Subroutine : | |
nbin : | integer, intent(out) |
subroutine RadiationCA81NumKDFBin( nbin ) integer, intent(out) :: nbin if ( .not. radiation_ca81_inited ) then call RadiationCA81Init end if nbin = nlogkmax end subroutine RadiationCA81NumKDFBin
Variable : | |||
FlagSimpleMagFac : | logical , save
|
Subroutine : |
This procedure input/output NAMELIST#radiation_CA81_nml .
subroutine RadiationCA81Init ! NAMELIST ファイル入力に関するユーティリティ ! Utilities for NAMELIST file input ! use namelist_util, only: namelist_filename, NmlutilMsg ! ファイル入出力補助 ! File I/O support ! use dc_iounit, only: FileOpen ! メッセージ出力 ! Message output ! use dc_message, only: MessageNotify !!$ ! ヒストリデータ出力 !!$ ! History data output !!$ ! !!$ use gtool_historyauto, only: HistoryAutoAddVariable integer:: unit_nml ! NAMELIST ファイルオープン用装置番号. ! Unit number for NAMELIST file open integer:: iostat_nml ! NAMELIST 読み込み時の IOSTAT. ! IOSTAT of NAMELIST read ! NAMELIST 変数群 ! NAMELIST group name ! namelist /radiation_CA81_nml/ DiffFactor, ShortAtmosAlbedo ! ! デフォルト値については初期化手続 "radiation_LH74#RadiationLH74Init" ! のソースコードを参照のこと. ! ! Refer to source codes in the initialization procedure ! "radiation_LH74#RadiationLH74Init" for the default values. ! ! デフォルト値の設定 ! Default values settings ! DiffFactor = 1.66d0 ShortAtmosAlbedo = 0.2d0 ! NAMELIST の読み込み ! NAMELIST is input ! if ( trim(namelist_filename) /= '' ) then call FileOpen( unit_nml, namelist_filename, mode = 'r' ) ! (in) rewind( unit_nml ) read( unit_nml, nml = radiation_CA81_nml, iostat = iostat_nml ) ! (out) close( unit_nml ) call NmlutilMsg( iostat_nml, module_name ) ! (in) end if H2OScaleIndex = 0.8d0 ! Unit is changed of k from g-1 cm2 to kg-1 m2. ! !!$ a_kdflogk = a_kdflogk + log( 1.0d3 * 1.0d-4 ) a_kdflogk = a_kdflogk + log10( 1.0d3 * 1.0d-4 ) ! Unit is changed from mW cm-2 to W m-2. ! a_kdfh = a_kdfh * 1.0d-3 * 1.0d4 ! Calculation of k of table of k-distribution fnction ! !!$ a_kdfk = exp( a_kdflogk ) a_kdfk = 10.0d0**a_kdflogk !!$ ! Unit is changed from mW cm-2 to W m-2. !!$ ! !!$ aa_kdfhi = aa_kdfhi * 1.0d0-3 * 1.0d4 ! 印字 ; Print ! call MessageNotify( 'M', module_name, '----- Initialization Messages -----' ) call MessageNotify( 'M', module_name, 'DiffFactor = %f', d = (/ DiffFactor /) ) call MessageNotify( 'M', module_name, 'ShortAtmosAlbedo = %f', d = (/ ShortAtmosAlbedo /) ) call MessageNotify( 'M', module_name, '-- version = %c', c1 = trim(version) ) radiation_ca81_inited = .true. end subroutine RadiationCA81Init
Variable : | |||||
a_kdfk(1:nlogkmax) : | real(DP), save
|
Constant : | |||
module_name = ‘radiation_CA81‘ : | character(*), parameter
|
Constant : | |||
version = ’$Name: dcpam5-20101015 $’ // ’$Id: radiation_CA81.f90,v 1.1 2010-01-11 01:28:10 yot Exp $’ : | character(*), parameter
|