| Class | ChemCalc |
| In: |
chemdat/chemcalc.f90
|
化学関連の諸量を計算するためのモジュール. AMP と Antoine の飽和蒸気圧式を用いて以下を求める. デフォルトでは AMP 式を使うようにしてある.
* 飽和蒸気圧 * 飽和蒸気圧の温度微分 * 潜熱
| Subroutine : | |||
| IMin : | integer,intent(in)
| ||
| IMax : | integer,intent(in)
| ||
| KMin : | integer,intent(in)
| ||
| KMax : | integer,intent(in)
|
初期化ルーチン(その 2)
配列サイズの確定を行う. 配列関数を利用する場合には, このサブルーチンで初期化する必要がある. 先に ChemCalcSpc_init を実行しておく必要がある.
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).
利用する化学種の確定と, それぞれの物性値を決定する. 配列計算をしない場合には, この初期化をすれば十分である.
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)
| ||
| IMax : | integer,intent(in)
| ||
| KMin : | integer,intent(in)
| ||
| KMax : | integer,intent(in)
| ||
| SNum : | integer,intent(in)
| ||
| SID(SNum) : | integer,intent(in)
|
初期化ルーチンのラッパー.
ChemCalcSpc_init と ChemCalcDim_init を実行
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)
|
引数で与えられた化学種に対して, 標準状態での単位モル当たりの定圧比熱を計算
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)
|
引数で与えられた化学種に対して, 標準状態での単位質量当たりの定圧比熱を計算
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)
|
引数で与えられた化学種に対して, 標準状態での単位質量当たりの定圧比熱を計算
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)
|
引数で与えられた化学種に対して, 気体定数を計算
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)
|
引数で与えられた化学種と温度に対して, 潜熱を計算
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)
|
引数で与えられた化学種に対して, 分子量を計算
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
| Function : | |||
| SvapPress : | real(8)
| ||
| ID : | integer, intent(in)
| ||
| Temp : | real(8), intent(in)
|
引数で与えられた化学種と温度に対して, 飽和蒸気圧を計算. AMP 式を利用
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)
| ||
| ID : | integer, intent(in)
| ||
| xz_Temp(XMin:XMax, ZMin:ZMax) : | real(8), intent(in)
|
引数で与えられた化学種と温度に対して, 飽和蒸気圧の温度微分を計算
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)
|
引数で与えられた化学種と温度に対して, 潜熱を計算
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)
| ||
| xz_Temp(XMin:XMax, ZMin:ZMax) : | real(8), intent(in)
|
引数で与えられた化学種と温度に対して, 飽和蒸気圧を計算. AMP 式を利用
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