Class ChemCalc
In: chemdat/chemcalc.f90

化学関連の諸量を計算するためのモジュール. AMP と Antoine の飽和蒸気圧式を用いて以下を求める. デフォルトでは AMP 式を使うようにしてある.

 * 飽和蒸気圧
 * 飽和蒸気圧の温度微分
 * 潜熱

Methods

Included Modules

ChemData

Public Instance methods

Subroutine :
IMin :integer,intent(in)
: X 方向の配列の下限
IMax :integer,intent(in)
: X 方向の配列の上限
KMin :integer,intent(in)
: Z 方向の配列の下限
KMax :integer,intent(in)
: Z 方向の配列の上限

初期化ルーチン(その 2)

 配列サイズの確定を行う. 配列関数を利用する場合には,
 このサブルーチンで初期化する必要がある.
 先に ChemCalcSpc_init を実行しておく必要がある.

[Source]

  subroutine ChemCalcDim_Init(IMin, IMax, KMin, KMax)
    !
    !初期化ルーチン(その 2)
    !  配列サイズの確定を行う. 配列関数を利用する場合には, 
    !  このサブルーチンで初期化する必要がある. 
    !  先に ChemCalcSpc_init を実行しておく必要がある. 
    !

    !暗黙の型宣言禁止
    implicit none

    !入出力変数
    integer,intent(in) :: IMin  !X 方向の配列の下限
    integer,intent(in) :: IMax  !X 方向の配列の上限
    integer,intent(in) :: KMin  !Z 方向の配列の下限
    integer,intent(in) :: KMax  !Z 方向の配列の上限
    
    !-----------------------------------------------------------
    ! 初期化
    !-----------------------------------------------------------
    XMin = IMin
        XMax = IMax
    ZMin = KMin
        ZMax = KMax
    
  end subroutine ChemCalcDim_Init
Subroutine :
SNum :integer,intent(in)
: 化学種の個数
SID(SNum) :integer,intent(in)
: 系に存在する化学種の数

初期化ルーチン(その 1).

 利用する化学種の確定と, それぞれの物性値を決定する.
 配列計算をしない場合には, この初期化をすれば十分である.

[Source]

  subroutine ChemCalcSpc_Init(SNum, SID)
    !
    !初期化ルーチン(その 1). 
    !  利用する化学種の確定と, それぞれの物性値を決定する.
    !  配列計算をしない場合には, この初期化をすれば十分である. 
    !

    !モジュール呼び出し
    use ChemData, only: ChemData_Phase    !相

    !暗黙の型宣言禁止
    implicit none

    !入出力変数
    integer,intent(in) :: SNum            !化学種の個数
    integer,intent(in) :: SID(SNum)       !系に存在する化学種の数
    
    !内部変数
    integer            :: s

    !-----------------------------------------------------------
    ! 初期化
    !-----------------------------------------------------------
    SpcNum  = SNum
!    write(*,*) "ChemCalc: SpcNum ", SpcNum
    
    !配列割り当て
    if (allocated(SpcID)) deallocate( SpcID, Phase)
    allocate( SpcID(SpcNum),  Phase(SpcNum) )

    !-----------------------------------------------------------    
    ! データベースから必要なデータだけ取り出す
    !-----------------------------------------------------------
    !系に存在する化学種. 入力された値を取り込む
    SpcID = SID
    
    !相
    do s = 1, SpcNum
      Phase(s) = ChemData_Phase(SpcID(s)) 
    end do
    
    !Antoine の飽和蒸気圧式の係数
    a_antA = ChemData_SvapPress_AntoineA
    a_antB = ChemData_SvapPress_AntoineB
    a_antC = ChemData_SvapPress_AntoineC
    a_antU = ChemData_SvapPress_AntoineUnit

    !AMP 式の飽和蒸気圧式の係数
    a_ampA = ChemData_SvapPress_AMPA
    a_ampB = ChemData_SvapPress_AMPB
    a_ampC = ChemData_SvapPress_AMPC
    a_ampD = ChemData_SvapPress_AMPD
    a_ampE = ChemData_SvapPress_AMPE

    !分子量
    a_MolWt = ChemData_MolWt
    
  end subroutine ChemCalcSpc_Init
Subroutine :
IMin :integer,intent(in)
: X 方向の配列の下限
IMax :integer,intent(in)
: X 方向の配列の上限
KMin :integer,intent(in)
: Z 方向の配列の下限
KMax :integer,intent(in)
: Z 方向の配列の上限
SNum :integer,intent(in)
: 化学種の個数
SID(SNum) :integer,intent(in)
: 系に存在する化学種の数

初期化ルーチンのラッパー.

 ChemCalcSpc_init と ChemCalcDim_init を実行

[Source]

  subroutine ChemCalc_Init(IMin, IMax, KMin, KMax, SNum, SID)
    !
    !初期化ルーチンのラッパー. 
    !  ChemCalcSpc_init と ChemCalcDim_init を実行
    !

    !モジュール呼び出し
    use ChemData, only: GasRUniv, ChemData_OneSpcID  !化学種の ID 検索
      
    !暗黙の型宣言禁止
    implicit none

    !入出力変数
    integer,intent(in) :: IMin      !X 方向の配列の下限
    integer,intent(in) :: IMax      !X 方向の配列の上限
    integer,intent(in) :: KMin      !Z 方向の配列の下限
    integer,intent(in) :: KMax      !Z 方向の配列の上限
    integer,intent(in) :: SNum      !化学種の個数
    integer,intent(in) :: SID(SNum) !系に存在する化学種の数
    character(20)      :: Name
    integer            :: id

    !初期化ルーチンを 2 つ呼び出すだけ
    call ChemCalcSpc_Init(SNum, SID)
    call ChemCalcDim_Init(IMin, IMax, KMin, KMax)

    !NH4SH の反応熱の初期化
    !  NH4SH 1kg に対する反応熱にする.
    Name = 'NH4SH-s'
    id   = ChemData_OneSpcID( Name )  
    
    ReactHeatNH4SHPerMol  = GasRUniv * 10834.0d0
    ReactHeatNH4SH = GasRUniv * 10834.0d0 / MolWt( id )
    write(*,*)     ReactHeatNH4SH, MolWt( id )

  end subroutine ChemCalc_Init
Function :
CpPerMolRef :real(8)
: 標準状態での単位モル当たりの比熱
ID :integer, intent(in)
: 化学種の ID

引数で与えられた化学種に対して, 標準状態での単位モル当たりの定圧比熱を計算

[Source]

  function CpPerMolRef(ID)
    !
    !引数で与えられた化学種に対して, 標準状態での単位モル当たりの定圧比熱を計算
    !

    !モジュール呼び出し
    use ChemData, only: ChemData_CpPerMolRef !標準状態での単位モル当たりの比熱

    !暗黙の型宣言禁止
    implicit none
    
    !入出力変数  
    real(8)             :: CpPerMolRef  !標準状態での単位モル当たりの比熱
    integer, intent(in) :: ID           !化学種の ID

    
    !データベースから情報取得
    CpPerMolRef = ChemData_CpPerMolRef(ID)

  end function CpPerMolRef
Function :
CpRef :real(8)
: 標準状態での単位質量当たりの比熱
ID :integer, intent(in)
: 化学種の ID

引数で与えられた化学種に対して, 標準状態での単位質量当たりの定圧比熱を計算

[Source]

  function CpRef(ID)
    !
    !引数で与えられた化学種に対して, 標準状態での単位質量当たりの定圧比熱を計算
    !

    !モジュール呼び出し
    use ChemData, only: ChemData_CpRef !標準状態での単位質量当たりの比熱

    !暗黙の型宣言禁止
    implicit none
    
    !入出力変数  
    real(8)             :: CpRef        !標準状態での単位質量当たりの比熱
    integer, intent(in) :: ID           !化学種の ID

    
    !データベースから情報取得
    CpRef = ChemData_CpRef(ID)

  end function CpRef
Function :
CvRef :real(8)
: 標準状態での単位質量当たりの比熱
ID :integer, intent(in)
: 化学種の ID

引数で与えられた化学種に対して, 標準状態での単位質量当たりの定圧比熱を計算

[Source]

  function CvRef(ID)
    !
    !引数で与えられた化学種に対して, 標準状態での単位質量当たりの定圧比熱を計算
    !

    !モジュール呼び出し
    use ChemData, only: ChemData_CvRef !標準状態での単位質量当たりの比熱

    !暗黙の型宣言禁止
    implicit none
    
    !入出力変数  
    real(8)             :: CvRef       !標準状態での単位質量当たりの比熱
    integer, intent(in) :: ID           !化学種の ID

    
    !データベースから情報取得
    CvRef = ChemData_CvRef(ID)

  end function CvRef
Function :
GasR :real(8)
: 分子量
ID :integer, intent(in)
: 化学種の ID

引数で与えられた化学種に対して, 気体定数を計算

[Source]

  function GasR(ID)
    !
    !引数で与えられた化学種に対して, 気体定数を計算
    !

    !モジュール呼び出し
    use ChemData, only: ChemData_GasR    !気体定数 [J/K kg]

    !暗黙の型宣言禁止
    implicit none
    
    !入出力変数  
    real(8)             :: GasR          !分子量
    integer, intent(in) :: ID      !化学種の ID
    
    
    !データベースから情報取得
    GasR = ChemData_GasR(ID)

  end function GasR
Function :
LatentHeatPerMol :real(8)
: 潜熱
ID :integer, intent(in)
: 化学種名
Temp :real(8), intent(in)
: 温度

引数で与えられた化学種と温度に対して, 潜熱を計算

[Source]

  function LatentHeatPerMol(ID, Temp)
    !
    !引数で与えられた化学種と温度に対して, 潜熱を計算
    !

    !暗黙の型宣言禁止
    implicit none

    !入出力変数
    real(8)             :: LatentHeatPerMol   !潜熱
    real(8), intent(in) :: Temp            !温度
    integer, intent(in) :: ID                 !化学種名
    
    !内部変数
    real(8)             :: DLogSvapPressDTemp
    real(8), parameter  :: GasRUniv = 8.314d0  !普遍気体定数
    

    !飽和蒸気圧の温度微分
    DLogSvapPressDTemp = - a_ampA(ID) / (Temp ** 2.0d0) + a_ampC(ID) / Temp + a_ampD(ID) + a_ampE(ID) * 2.0d0 * Temp
        
    !潜熱の計算
    LatentHeatPerMol = DLogSvapPressDTemp * GasRUniv * (Temp ** 2.0d0) 

  end function LatentHeatPerMol
Function :
MolWt :real(8)
: 分子量
ID :integer, intent(in)
: 化学種の ID

引数で与えられた化学種に対して, 分子量を計算

[Source]

  function MolWt(ID)
    !
    !引数で与えられた化学種に対して, 分子量を計算
    !

    !モジュール呼び出し
    use ChemData, only: ChemData_MolWt   !分子量

    !暗黙の型宣言禁止
    implicit none
    
    !入出力変数  
    real(8)             :: MolWt         !分子量
    integer, intent(in) :: ID      !化学種の ID

    
    !データベースから情報取得
    MolWt = ChemData_MolWt(ID)

  end function MolWt
Phase()
Variable :
Phase(:) :character(3), allocatable
:
ReactHeatNH4SH()
Variable :
ReactHeatNH4SH :real(8)
: NH4SH 生成反応熱 [J/K kg]
ReactHeatNH4SHPerMol()
Variable :
ReactHeatNH4SHPerMol :real(8)
: NH4SH 生成反応熱 [J/K mol]
Function :
SvapPress :real(8)
: 飽和蒸気圧
ID :integer, intent(in)
: 化学種の ID
Temp :real(8), intent(in)
: 温度 [K]

引数で与えられた化学種と温度に対して, 飽和蒸気圧を計算. AMP 式を利用

[Source]

  function SvapPress(ID, Temp)
    !
    !引数で与えられた化学種と温度に対して, 飽和蒸気圧を計算. AMP 式を利用
    !

    !暗黙の型宣言禁止
    implicit none
    
    !入出力変数  
    real(8)             :: SvapPress   !飽和蒸気圧
    real(8), intent(in) :: Temp        !温度 [K]
    integer, intent(in) :: ID          !化学種の ID

    !内部変数
    real(8)             :: LogSvapPress
    
    !飽和蒸気圧の対数を計算
    !対数が大きくなりすぎないようにする. 
    ! Fujitsu Fortran Compiler では 700 より大きい数の exp を取ると警告が出る.
    LogSvapPress = min( ( a_ampA(ID) / Temp + a_ampB(ID) + a_ampC(ID) * dlog( Temp ) + a_ampD(ID) * Temp + a_ampE(ID) * ( temp ** 2 ) + dlog(1.0d-1) ), 7.0d2 )

    !飽和蒸気圧を計算
    SvapPress =  dexp( LogSvapPress )
    
  end function SvapPress
Function :
xz_DSvapPressDTemp(XMin:XMax, ZMin:ZMax) :real(8)
: 飽和蒸気圧の温度微分 [Pa/K]
ID :integer, intent(in)
: 化学種名
xz_Temp(XMin:XMax, ZMin:ZMax) :real(8), intent(in)
: 温度 [K]

引数で与えられた化学種と温度に対して, 飽和蒸気圧の温度微分を計算

[Source]

  function xz_DSvapPressDTemp(ID, xz_Temp)
    !
    !引数で与えられた化学種と温度に対して, 飽和蒸気圧の温度微分を計算
    !
    
    !暗黙の型宣言禁止
    implicit none
  
    !入出力変数    
    real(8)             :: xz_DSvapPressDTemp(XMin:XMax, ZMin:ZMax)
                                                         !飽和蒸気圧の温度微分 [Pa/K]
    real(8), intent(in) :: xz_Temp(XMin:XMax, ZMin:ZMax) !温度 [K]
    integer, intent(in) :: ID                            !化学種名

    !内部変数
    real(8)             :: xz_LogSvapPress(XMin:XMax, ZMin:ZMax)
    real(8)             :: xz_DLogSvapPressDTemp(XMin:XMax, ZMin:ZMax)
    

    !飽和蒸気圧の対数を計算
    !対数が大きくなりすぎないようにする. 
    ! Fujitsu Fortran Compiler では 700 より大きい数の exp を取ると警告が出る.
    xz_LogSvapPress = min( ( a_ampA(ID) / xz_Temp + a_ampB(ID) + a_ampC(ID) * dlog( xz_Temp ) + a_ampD(ID) * xz_Temp + a_ampE(ID) * ( xz_temp ** 2 ) + dlog(1.0d-1) ), 7.0d2 )

    !飽和蒸気圧の温度微分
    xz_DLogSvapPressDTemp = - a_ampA(ID) / (xz_Temp ** 2.0d0) + a_ampC(ID) / xz_Temp + a_ampD(ID) + a_ampE(ID) * 2.0d0 * xz_Temp
    
    !飽和蒸気圧の温度微分
    xz_DSvapPressDTemp = xz_DLogSvapPressDTemp * dexp( xz_LogSvapPress ) 
    
  end function xz_DSvapPressDTemp
Function :
xz_LatentHeat(XMin:XMax, ZMin:ZMax) :real(8)
: 潜熱
ID :integer, intent(in)
: 化学種名
xz_Temp(XMin:XMax, ZMin:ZMax) :real(8), intent(in)
: 温度

引数で与えられた化学種と温度に対して, 潜熱を計算

[Source]

  function xz_LatentHeat(ID, xz_Temp)
    !
    !引数で与えられた化学種と温度に対して, 潜熱を計算
    !

    !暗黙の型宣言禁止
    implicit none

    !入出力変数
    real(8)             :: xz_LatentHeat(XMin:XMax, ZMin:ZMax)
                                                         !潜熱
    real(8), intent(in) :: xz_Temp(XMin:XMax, ZMin:ZMax) !温度
    integer, intent(in) :: ID                            !化学種名
    
    !内部変数
    real(8)             :: xz_DLogSvapPressDTemp(XMin:XMax, ZMin:ZMax)
    real(8), parameter  :: GasRUniv = 8.314d0  !普遍気体定数
    

    !飽和蒸気圧の温度微分
    xz_DLogSvapPressDTemp = - a_ampA(ID) / (xz_Temp ** 2.0d0) + a_ampC(ID) / xz_Temp + a_ampD(ID) + a_ampE(ID) * 2.0d0 * xz_Temp
        
    !潜熱の計算
    xz_LatentHeat = xz_DLogSvapPressDTemp * GasRUniv * (xz_Temp ** 2.0d0) / a_MolWt(ID)

  end function xz_LatentHeat
Function :
xz_SvapPress(XMin:XMax, ZMin:ZMax) :real(8)
: 飽和蒸気圧
ID :integer, intent(in)
: 化学種の ID
xz_Temp(XMin:XMax, ZMin:ZMax) :real(8), intent(in)
: 温度 [K]

引数で与えられた化学種と温度に対して, 飽和蒸気圧を計算. AMP 式を利用

[Source]

  function xz_SvapPress(ID, xz_Temp)
    !
    !引数で与えられた化学種と温度に対して, 飽和蒸気圧を計算. AMP 式を利用
    !

    !暗黙の型宣言禁止
    implicit none
    
    !入出力変数  
    real(8)             :: xz_SvapPress(XMin:XMax, ZMin:ZMax)
                                                         !飽和蒸気圧
    real(8), intent(in) :: xz_Temp(XMin:XMax, ZMin:ZMax) !温度 [K]
    integer, intent(in) :: ID                            !化学種の ID

    !内部変数
    real(8)             :: xz_LogSvapPress(XMin:XMax, ZMin:ZMax)
    
    !飽和蒸気圧の対数を計算
    !対数が大きくなりすぎないようにする. 
    ! Fujitsu Fortran Compiler では 700 より大きい数の exp を取ると警告が出る.
    xz_LogSvapPress = min( ( a_ampA(ID) / xz_Temp + a_ampB(ID) + a_ampC(ID) * dlog( xz_Temp ) + a_ampD(ID) * xz_Temp + a_ampE(ID) * ( xz_temp ** 2 ) + dlog(1.0d-1) ), 7.0d2 )

    !飽和蒸気圧を計算
    xz_SvapPress =  dexp( xz_LogSvapPress )
    
  end function xz_SvapPress

[Validate]