Class physics_radiation_short_mod
In: physics/physics_radiation_short.f90

Methods

Included Modules

type_mod grid_3d_mod constants_mod dc_trace

Public Instance methods

Subroutine :
xyr_RadSFlux(im,jm,km+1) :real(DBKIND), intent(inout)
: (inout) 短波フラックス
xyr_TauQvap(im,jm,km+1) :real(DBKIND), intent(in)
: (in) 地表アルベド
xyr_TauDryAir(im,jm,km+1) :real(DBKIND), intent(in)
: (in) 地表アルベド
xy_InAngle(im,jm) :real(DBKIND), intent(in)
: (in) 地表アルベド
xy_SurfAlbedo(im,jm) :real(DBKIND), intent(in)
: (in) 地表アルベド

(in) 地表アルベド

[Source]

    subroutine physics_radiation_short( xyr_RadSFlux         , xyr_TauQvap          , xyr_TauDryAir        , xy_InAngle           , xy_SurfAlbedo          ) ! (in) 地表アルベド

    !==== Dependency
    use type_mod,    only: REKIND, DBKIND, INTKIND, TOKEN, STRING
    use grid_3d_mod, only: im, jm, km
    use constants_mod, only: PI  
    use dc_trace,    only: SetDebug, BeginSub, EndSub, DbgMessage, DataDump

    implicit none

    !==== Output
    !
    real(DBKIND), intent(inout) :: xyr_RadSFlux(im,jm,km+1) ! (inout) 短波フラックス

    !==== Input
    !
    real(DBKIND), intent(in) :: xyr_TauQvap(im,jm,km+1)   , xyr_TauDryAir(im,jm,km+1) , xy_InAngle(im,jm)         , xy_SurfAlbedo(im,jm)          ! (in) 地表アルベド

    !----- 作業用内部変数 -----
    character(STRING),  parameter:: subname = "physics_radiation_short"

    ! do ループ用作業変数 (東西 i*、南北 j*、鉛直 k*、波数 l*用)
    integer(INTKIND)    :: i, j, k
    integer(INTKIND)    :: bn
    real(DBKIND)        :: BandWeightSum

    integer(INTKIND), parameter :: BandNumber = 1     ! 長波バンド数
    real(DBKIND) :: AbsorpCoeffQvap(BandNumber)    , AbsorpCoeffDryAir(BandNumber)  , BandWeight(BandNumber)         , SECSCT                                     !  散乱のsecζ
    Data AbsorpCoeffQvap / 0.002  /
    Data AbsorpCoeffDryAir / 0.0  /
    Data BandWeight  / 1.0   /
    Data SECSCT / 1.66 /
    
    continue

    !----------------------------------------------------------------
    !   開始処理
    !----------------------------------------------------------------
    call BeginSub(subname)

    !----------------------------------------------------------------
    !   日射計算
    !----------------------------------------------------------------

    ! ---- 1. バンドウェイトの設定 ----

    BandWeightSum = 0.0d0

    do bn = 1, BandNumber
       BandWeightSum =  BandWeightSum +  BandWeight(bn)
    end do

    do bn = 1, BandNumber
       BandWeight(bn) = BandWeight(bn) / BandWeightSum
    end do


    ! ----------------------------------------------------------
    xyr_RadSFlux(:,:,1:km) = 0.0d0

    do bn = 1, BandNumber
       do k = 1, km+1    
          ! ----  2. 各レベルでの下向き透過 ----
          
          if (k .NE. km+1) then 
             
             xyr_RadSFlux(:,:,k) = xyr_RadSFlux(:,:,k) +  BandWeight(bn) * xyr_RadSFlux(:,:,km+1) * EXP( - xy_InAngle(:,:) * ( AbsorpCoeffQvap(bn) * xyr_TauQvap(:,:,k) + AbsorpCoeffDryAir(bn) * xyr_TauDryAir(:,:,k) ) )
          end if
          
          ! ----  3. 各レベルでの上向き透過 ----
          xyr_RadSFlux(:,:,k) = xyr_RadSFlux(:,:,k) -  BandWeight(bn) * xyr_RadSFlux(:,:,km+1) * EXP( - xy_InAngle(:,:) * ( AbsorpCoeffQvap(bn) * xyr_TauQvap(:,:,1) + AbsorpCoeffDryAir(bn) * xyr_TauDryAir(:,:,1) ) ) * xy_SurfAlbedo(:,:) * EXP( - SECSCT * ( AbsorpCoeffQvap(bn) * ( xyr_TauQvap(:,:,1) - xyr_TauQvap(:,:,k) ) + AbsorpCoeffDryAir(bn) * ( xyr_TauDryAir(:,:,1) - xyr_TauDryAir(:,:,k) ) ) ) 
       end do
    end do
    ! ----------------------------------------------------------

    ! ----  4. 吸収なしのとき ----

    if ( BandNumber .EQ. 0 ) then 

       do k = 1, km+1
          xyr_RadSFlux(:,:,k) = (1.0d0 - xy_SurfAlbedo(:,:) ) * xyr_RadSFlux(:,:,km+1) 
       end do

    end if


    !----------------------------------------------------------------
    !   終了処理
    !----------------------------------------------------------------
    call EndSub(subname)

  end subroutine physics_radiation_short

[Validate]