Class | ChemCalc |
In: |
chemdat/chemcalc.f90
|
Copyright (C) GFD Dennou Club, 2005, 2006. All rights reserved.
* Developer: SUGIYAMA Ko-ichiro * Version: $Id: chemcalc.f90,v 1.1.1.1 2006/04/25 03:43:58 deepconv Exp $ * Tag Name: $Name: $ * Change History:
化学関連の諸量を計算するためのモジュール. Antoine の飽和蒸気圧式を用いて以下を求める.
* 飽和蒸気圧 * 飽和蒸気圧の温度微分 * 潜熱
subroutine CheckSvapPress () ! !飽和蒸気圧のチェックサブルーチン. !蒸気圧の測定値と計算値の差を出力する. ! !モジュール読み込み use ChemData, only : ChemData_DataNum, & !データ点数 & ChemData_SVapPress, & !飽和蒸気圧 & ChemData_SVapPress_Temp !温度 !暗黙の型宣言禁止 implicit none !内部変数 integer :: SNum integer :: DNum real(8) :: SVapPressData(SpcNum, ChemData_DataNum) real(8) :: Temp(SpcNum, ChemData_DataNum) real(8) :: SVapPressCalc !データベースから情報を取得する do SNum = 1, SpcNum SvapPressData(SNum,:) = ChemData_SvapPress(SpcID(SNum),:) Temp(SNum,:) = ChemData_SvapPress_Temp(SpcID(SNum),:) end do do SNum = 1, SpcNum if (Phase(SNum) == 'Gas') cycle !気相の場合 write(*,*) "SpcName: ", SpcID(SNum) do DNum = 1, ChemData_DataNum if ( Temp(SNum,DNum) == 0.0d0) cycle SvapPressCalc = SvapPress( SpcID(SNum), Temp(SNum,DNum) ) write(*,*) "Temp: ", Temp(SNum,DNum) write(*,*) "SVapPress: ", SVapPressData(SNum,DNum), SVapPressCalc write(*,*) "DelSVapPress: ", abs(SVapPressData(SNum,DNum) - SVapPressCalc) end do SVapPressCalc = 0.0d0 !初期化 end do end subroutine
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
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 end subroutine
subroutine ChemCalc_Init (IMin, IMax, KMin, KMax, SNum, SID) ! !初期化ルーチンのラッパー. ! ChemCalcSpc_init と ChemCalcDim_init を実行 ! !モジュール呼び出し use ChemData, only: GasRUniv, &!気体定数 & ChemData_SpcID !化学種の 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(1) integer :: dim integer :: id(1) !初期化ルーチンを 2 つ呼び出すだけ call ChemCalcSpc_Init(SNum, SID) call ChemCalcDim_Init(IMin, IMax, KMin, KMax) !NH4SH の反応熱の初期化 ! NH4SH 1kg に対する反応熱にする. dim = 1 Name(1) = 'NH4SH-s' id = ChemData_SpcID(dim, Name) ReactHeatNH4SHPerMol = GasRUniv * 10834.0d0 ReactHeatNH4SHPerMass = GasRUniv * 10834.0d0 / MolWt( id(1) ) end subroutine