Class planck_func
In: radiation/planck_func.f90

プランク関数の計算

Calculate Planck function

Note that Japanese and English are described in parallel.

Procedures List

!$ ! 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)

NAMELIST

!$ ! NAMELIST#radiation_DennouAGCM_nml

Methods

Included Modules

dc_types gauss_quad

Public Instance methods

Function :
Res :real(DP)
WN :real(DP), intent(in )
Temp :real(DP), intent(in )

[Source]

  function DPFDT( WN, Temp ) result( Res )

    ! USE statements
    !

    ! 宣言文 ; Declaration statements
    !
    real(DP), intent(in ) :: WN
    real(DP), intent(in ) :: Temp
    real(DP)              :: Res


    ! 作業変数
    ! Work variables
    !
    real(DP) :: aaa_Temp(1,1,1)
    real(DP) :: aaa_Res (1,1,1)


    aaa_Temp(1,1,1) = Temp

    aaa_Res = aaa_DPFDT( 1, 1, 1, 1, 1, 1, WN, aaa_Temp )

    Res = aaa_Res(1,1,1)


  end function DPFDT
Subroutine :
is :integer , intent(in )
ie :integer , intent(in )
js :integer , intent(in )
je :integer , intent(in )
WN1 :real(DP), intent(in )
WN2 :real(DP), intent(in )
Num :integer , intent(in )
aa_Temp(is:ie, js:je) :real(DP), intent(in )
aa_DPFDTInted(is:ie, js:je) :real(DP), intent(out)

[Source]

  subroutine Integ_DPFDT_GQ_Array2D( is, ie, js, je, WN1, WN2, Num, aa_Temp, aa_DPFDTInted )

    ! USE statements
    !

    integer , intent(in ) :: is
    integer , intent(in ) :: ie
    integer , intent(in ) :: js
    integer , intent(in ) :: je
    real(DP), intent(in ) :: WN1
    real(DP), intent(in ) :: WN2
    integer , intent(in ) :: Num
    real(DP), intent(in ) :: aa_Temp      (is:ie, js:je)
    real(DP), intent(out) :: aa_DPFDTInted(is:ie, js:je)


    !
    ! local variables
    !
    real(DP) :: aaa_Temp      (is:ie, js:je, 1:1)
    real(DP) :: aaa_DPFDTInted(is:ie, js:je, 1:1)


    aaa_Temp(:,:,1) = aa_Temp

    call Integ_DPFDT_GQ_Array3D( is, ie, js, je, 1, 1, WN1, WN2, Num, aaa_Temp, aaa_DPFDTInted )

    aa_DPFDTInted = aaa_DPFDTInted(:,:,1)


  end subroutine Integ_DPFDT_GQ_Array2D
Subroutine :
is :integer , intent(in )
ie :integer , intent(in )
js :integer , intent(in )
je :integer , intent(in )
ks :integer , intent(in )
ke :integer , intent(in )
WN1 :real(DP), intent(in )
WN2 :real(DP), intent(in )
Num :integer , intent(in )
aaa_Temp(is:ie, js:je, ks:ke) :real(DP), intent(in )
aaa_DPFDTInted(is:ie, js:je, ks:ke) :real(DP), intent(out)

[Source]

  subroutine Integ_DPFDT_GQ_Array3D( is, ie, js, je, ks, ke, WN1, WN2, Num, aaa_Temp, aaa_DPFDTInted )

    ! USE statements
    !

    ! ガウス重み, 分点の計算
    ! Calculate Gauss node and Gaussian weight
    !
    use gauss_quad, only : GauLeg

    integer , intent(in ) :: is
    integer , intent(in ) :: ie
    integer , intent(in ) :: js
    integer , intent(in ) :: je
    integer , intent(in ) :: ks
    integer , intent(in ) :: ke
    real(DP), intent(in ) :: WN1
    real(DP), intent(in ) :: WN2
    integer , intent(in ) :: Num
    real(DP), intent(in ) :: aaa_Temp      (is:ie, js:je, ks:ke)
    real(DP), intent(out) :: aaa_DPFDTInted(is:ie, js:je, ks:ke)


    !
    ! local variables
    !
    real(DP):: GP( Num )
    real(DP):: GW( Num )
    integer :: l


    call GauLeg( WN1, WN2, Num, GP, GW )

    aaa_DPFDTInted = 0.0_DP

    do l = 1, num
      aaa_DPFDTInted = aaa_DPFDTInted + aaa_DPFDT( is, ie, js, je, ks, ke, GP(l), aaa_Temp ) * GW(l)
    end do


  end subroutine Integ_DPFDT_GQ_Array3D
Subroutine :
wn1 :real(DP), intent(in )
wn2 :real(DP), intent(in )
num :integer , intent(in )
is :integer , intent(in )
ie :integer , intent(in )
js :integer , intent(in )
je :integer , intent(in )
temp(is:ie, js:je) :real(DP), intent(in )
pfinted(is:ie, js:je) :real(DP), intent(out)

[Source]

  subroutine Integ_PF_GQ_Array2D( wn1, wn2, num, is, ie, js, je, temp, pfinted )


    real(DP), intent(in ) :: wn1,wn2
    integer , intent(in ) :: num
    integer , intent(in ) :: is
    integer , intent(in ) :: ie
    integer , intent(in ) :: js
    integer , intent(in ) :: je
    real(DP), intent(in ) :: temp   (is:ie, js:je)
    real(DP), intent(out) :: pfinted(is:ie, js:je)


    !
    ! local variables
    !
    real(DP) :: temp3d   (is:ie, js:je, 1:1)
    real(DP) :: pfinted3d(is:ie, js:je, 1:1)


    temp3d(:,:,1) = temp(:,:)
    call Integ_PF_GQ_Array3D( wn1, wn2, num, is, ie, js, je, 1, 1, temp3d, pfinted3d )
    pfinted(:,:) = pfinted3d(:,:,1)


  end subroutine Integ_PF_GQ_Array2D
Subroutine :
wn1 :real(DP), intent(in )
wn2 :real(DP), intent(in )
num :integer , intent(in )
is :integer , intent(in )
ie :integer , intent(in )
js :integer , intent(in )
je :integer , intent(in )
ks :integer , intent(in )
ke :integer , intent(in )
aaa_temp(is:ie, js:je, ks:ke) :real(DP), intent(in )
aaa_pfinted(is:ie, js:je, ks:ke) :real(DP), intent(out)

[Source]

  subroutine Integ_PF_GQ_Array3D( wn1, wn2, num, is, ie, js, je, ks, ke, aaa_temp, aaa_pfinted )

    ! ガウス重み, 分点の計算
    ! Calculate Gauss node and Gaussian weight
    !
    use gauss_quad, only : GauLeg

    real(DP), intent(in ) :: wn1,wn2
    integer , intent(in ) :: num
    integer , intent(in ) :: is, ie
    integer , intent(in ) :: js, je
    integer , intent(in ) :: ks, ke
    real(DP), intent(in ) :: aaa_temp   (is:ie, js:je, ks:ke)
    real(DP), intent(out) :: aaa_pfinted(is:ie, js:je, ks:ke)


    !
    ! local variables
    !
    real(DP):: x( num ), w( num )
    integer :: l


    call GauLeg( wn1, wn2, num, x, w )

    aaa_pfinted(:,:,:) = 0.0d0

    do l = 1, num
      aaa_pfinted(:,:,:) = aaa_pfinted(:,:,:) + aaa_PF( is, ie, js, je, ks, ke, x(l), aaa_Temp ) * w( l )
    end do


  end subroutine Integ_PF_GQ_Array3D
Function :
Res :real(DP)
WN :real(DP), intent(in)
Temp :real(DP), intent(in)

温度, 比湿, 気圧から, 放射フラックスを計算します.

Calculate radiation flux from temperature, specific humidity, and air pressure.

[Source]

  function PF( WN, Temp ) result( Res )
    !
    ! 温度, 比湿, 気圧から, 放射フラックスを計算します. 
    !
    ! Calculate radiation flux from temperature, specific humidity, and 
    ! air pressure. 
    !

    ! モジュール引用 ; USE statements
    !

    ! 宣言文 ; Declaration statements
    !
    real(DP), intent(in) :: WN
    real(DP), intent(in) :: Temp
    real(DP)             :: Res

    ! 作業変数
    ! Work variables
    !
    real(DP) :: aaa_Temp(1,1,1)
    real(DP) :: aaa_Res (1,1,1)

    ! 実行文 ; Executable statement
    !

    aaa_Temp(1,1,1) = Temp
    aaa_Res = aaa_PF( 1, 1, 1, 1, 1, 1, WN, aaa_Temp )

    Res = aaa_Res(1,1,1)


  end function PF
Function :
aaa_Res(is:ie, js:je, ks:ke) :real(DP)
is :integer , intent(in)
ie :integer , intent(in)
js :integer , intent(in)
je :integer , intent(in)
ks :integer , intent(in)
ke :integer , intent(in)
WN :real(DP), intent(in)
aaa_Temp(is:ie, js:je, ks:ke) :real(DP), intent(in)

温度, 比湿, 気圧から, 放射フラックスを計算します.

Calculate radiation flux from temperature, specific humidity, and air pressure.

[Source]

  function aaa_PF( is, ie, js, je, ks, ke, WN, aaa_Temp ) result( aaa_Res )
    !
    ! 温度, 比湿, 気圧から, 放射フラックスを計算します. 
    !
    ! Calculate radiation flux from temperature, specific humidity, and 
    ! air pressure. 
    !

    ! モジュール引用 ; USE statements
    !

    ! 宣言文 ; Declaration statements
    !
    integer , intent(in) :: is
    integer , intent(in) :: ie
    integer , intent(in) :: js
    integer , intent(in) :: je
    integer , intent(in) :: ks
    integer , intent(in) :: ke
    real(DP), intent(in) :: WN
    real(DP), intent(in) :: aaa_Temp(is:ie, js:je, ks:ke)
    real(DP)             :: aaa_Res (is:ie, js:je, ks:ke)

    ! 作業変数
    ! Work variables
    !

    ! 実行文 ; Executable statement
    !

    aaa_Res = 2.0d0 * Planc * SOL * SOL * WN * WN * WN / ( exp( Planc * SOL * ( WN+1.0d-10 ) / ( Boltz * aaa_Temp ) ) - 1.0d0 )


  end function aaa_PF
planck_func_inited
Variable :
planck_func_inited = .false. :logical, save, public
: 初期設定フラグ. Initialization flag

Private Instance methods

Boltz
Constant :
Boltz = 1.380658d-23 :real(DP), parameter
Planc
Constant :
Planc = 6.6260755d-34 :real(DP), parameter
SOL
Constant :
SOL = 2.99792458d8 :real(DP), parameter
Function :
aaa_Res(is:ie, js:je, ks:ke) :real(DP)
is :integer , intent(in )
ie :integer , intent(in )
js :integer , intent(in )
je :integer , intent(in )
ks :integer , intent(in )
ke :integer , intent(in )
WN :real(DP), intent(in )
aaa_Temp(is:ie, js:je, ks:ke) :real(DP), intent(in )

[Source]

  function aaa_DPFDT( is, ie, js, je, ks, ke, WN, aaa_Temp ) result( aaa_Res )

    ! USE statements
    !

    integer , intent(in ) :: is
    integer , intent(in ) :: ie
    integer , intent(in ) :: js
    integer , intent(in ) :: je
    integer , intent(in ) :: ks
    integer , intent(in ) :: ke
    real(DP), intent(in ) :: WN
    real(DP), intent(in ) :: aaa_Temp(is:ie, js:je, ks:ke)
    real(DP)              :: aaa_Res (is:ie, js:je, ks:ke)


    real(DP) :: aaa_ExpTerm(is:ie, js:je, ks:ke)
    real(DP) :: aaa_PF     (is:ie, js:je, ks:ke)


    aaa_ExpTerm = exp( Planc * SOL * ( WN + 1.0d-10 ) / ( Boltz * aaa_Temp ) )

    aaa_PF = 2.0d0 * Planc * SOL * SOL * WN * WN * WN / ( aaa_ExpTerm - 1.0d0 )

    aaa_Res = 1.0d0 / ( 2.0d0 * SOL * WN * WN * Boltz ) * ( aaa_PF / aaa_Temp )**2 * aaa_ExpTerm


  end function aaa_DPFDT
module_name
Constant :
module_name = ‘planck_func :character(*), parameter
: モジュールの名称. Module name
version
Constant :
version = ’$Name: dcpam5-20110407 $’ // ’$Id: planck_func.f90,v 1.3 2011-03-28 03:17:04 yot Exp $’ :character(*), parameter
: モジュールのバージョン Module version