volume Subroutine

public subroutine volume(eos, n, P, T, V, root_type)

Uses

  • proc~~volume~2~~UsesGraph proc~volume~2 CubicEoS%volume module~yaeos__constants yaeos__constants proc~volume~2->module~yaeos__constants module~yaeos__math_linalg yaeos__math_linalg proc~volume~2->module~yaeos__math_linalg module~yaeos__models_solvers yaeos__models_solvers proc~volume~2->module~yaeos__models_solvers iso_fortran_env iso_fortran_env module~yaeos__constants->iso_fortran_env module~yaeos__math_linalg->module~yaeos__constants module~yaeos__models_solvers->module~yaeos__constants module~yaeos__models_ar yaeos__models_ar module~yaeos__models_solvers->module~yaeos__models_ar module~yaeos__models_ar->module~yaeos__constants module~yaeos__models_base yaeos__models_base module~yaeos__models_ar->module~yaeos__models_base module~yaeos__substance yaeos__substance module~yaeos__models_base->module~yaeos__substance module~yaeos__substance->module~yaeos__constants

Cubic EoS volume solver

Volume solver optimized for Cubic Equations of State.

@warn This routine intends to use the analyitical solution of the cubic equation, but due to errors in the solutions it is not used. And the general volume solver by Michelsen is used instead. @endwarn

Description

Cubic equations can be analytically solved. Using an anallytical solution provides the best possible solution in terms of speed and precision. This subroutine uses the modified cardano method proposed by Rosendo.

Examples

 use yaeos, only: CubicEoS, PengRobinson
 type(CubicEoS) :: eos

 eos = PengRobinson(tc, pc, w)
 ! Possible roots to solve
 call eos%volume(n, P, T, V, "liquid")
 call eos%volume(n, P, T, V, "vapor")
 call eos%volume(n, P, T, V, "stable")

References

  • [1] “Thermodynamic Models: Fundamental and Computational Aspects”, Michael L. Michelsen, Jørgen M. Mollerup. Tie-Line Publications, Denmark (2004) doi

  • [2] “A Note on the Analytical Solution of Cubic Equations of State in Process Simulation”, Rosendo Monroy-Loperena doi

Type Bound

CubicEoS

Arguments

Type IntentOptional Attributes Name
class(CubicEoS), intent(in) :: eos
real(kind=pr), intent(in) :: n(:)
real(kind=pr), intent(in) :: P
real(kind=pr), intent(in) :: T
real(kind=pr), intent(out) :: V
character(len=*), intent(in) :: root_type

Calls

proc~~volume~2~~CallsGraph proc~volume~2 CubicEoS%volume Bmix Bmix proc~volume~2->Bmix D1mix D1mix proc~volume~2->D1mix Dmix Dmix proc~volume~2->Dmix alpha alpha proc~volume~2->alpha proc~genericcubic_ar CubicEoS%GenericCubic_Ar proc~volume~2->proc~genericcubic_ar proc~volume_michelsen volume_michelsen proc~volume~2->proc~volume_michelsen proc~genericcubic_ar->Bmix proc~genericcubic_ar->D1mix proc~genericcubic_ar->Dmix proc~genericcubic_ar->alpha get_v0 get_v0 proc~volume_michelsen->get_v0 interface~optval optval proc~volume_michelsen->interface~optval proc~solve_point~3 solve_point proc~volume_michelsen->proc~solve_point~3 proc~optval_character optval_character interface~optval->proc~optval_character proc~optval_integer optval_integer interface~optval->proc~optval_integer proc~optval_real optval_real interface~optval->proc~optval_real proc~solve_point~3->get_v0 residual_helmholtz residual_helmholtz proc~solve_point~3->residual_helmholtz

Called by

proc~~volume~2~~CalledByGraph proc~volume~2 CubicEoS%volume proc~volume Gerg2008%volume proc~volume->proc~volume~2

Variables

Type Visibility Attributes Name Initial
real(kind=pr), public :: AT_Liq
real(kind=pr), public :: AT_Vap
real(kind=pr), public :: Ar
real(kind=pr), public :: Bmix
real(kind=pr), public :: D
real(kind=pr), public :: D1
real(kind=pr), public :: D2
real(kind=pr), public :: Tr(size(n))
real(kind=pr), public :: V_liq
real(kind=pr), public :: V_vap
real(kind=pr), public :: a(size(n))
real(kind=pr), public :: cp(4)
complex(kind=pr), public :: cr(3)
real(kind=pr), public :: dBi(size(n))
real(kind=pr), public :: dBij(size(n),size(n))
real(kind=pr), public :: dD1i(size(n))
real(kind=pr), public :: dD1ij(size(n),size(n))
real(kind=pr), public :: dDdT
real(kind=pr), public :: dDdT2
real(kind=pr), public :: dDi(size(n))
real(kind=pr), public :: dDidT(size(n))
real(kind=pr), public :: dDij(size(n),size(n))
real(kind=pr), public :: dadt(size(n))
real(kind=pr), public :: dadt2(size(n))
integer, public :: flag
real(kind=pr), public :: rr(3)
real(kind=pr), public :: totn
real(kind=pr), public :: z(size(n))