yaeos__models_ar Module

Module that defines the basics of a residual Helmholtz energy.

All the residual properties that are calculated in this library are based on residual Helmholtz Equations of State. Following the book by Michelsen and Mollerup.

In this library up to second derivatives of residual Helmholtz energy are used. Because they’re the fundamentals for phase equilibria calculation.

Note

Later on, third derivative with respect to volume will be included since it’s importance on calculation of critical points.

Properties

Available properties:

  • pressure(n, V, T)
  • fugacity(n, V, T)
  • fugacity(n, P, T, root=[vapor, liquid, stable])
  • volume

Calculate thermodynamic properties using Helmholtz energy as a basis. All the routines in this module work with the logic:

call foo(x, V, T, [dfoodv, dfoodT, ...])

Where the user can call the routine of the desired property. And include as optional values the desired derivatives of said properties.



Interfaces

public interface size

  • public pure function size_ar_model(eos)

    Get the size of the model.

    Arguments

    Type IntentOptional Attributes Name
    class(ArModel), intent(in) :: eos

    Return Value integer


Abstract Interfaces

abstract interface

  • public subroutine abs_residual_helmholtz(self, n, v, t, Ar, ArV, ArT, ArTV, ArV2, ArT2, Arn, ArVn, ArTn, Arn2)

    Residual Helmholtz model generic interface.

    This interface represents how an Ar model should be implemented. By our standard, a Resiudal Helmholtz model takes as input:

    • The mixture’s number of moles vector.
    • Volume, by default in liters.
    • Temperature, by default in Kelvin.

    All the output arguments are optional. While this keeps a long signature for the implementation, this is done this way to take advantage of any inner optimizations to calculate derivatives inside the procedure.

    Once the model is implemented, the signature can be short like model%residual_helmholtz(n, v, t, ArT2=dArdT2)

    Arguments

    Type IntentOptional Attributes Name
    class(ArModel), intent(in) :: self

    ArModel

    real(kind=pr), intent(in) :: n(:)

    Moles vector

    real(kind=pr), intent(in) :: v

    Volume [L]

    real(kind=pr), intent(in) :: t

    Temperature [K]

    real(kind=pr), intent(out), optional :: Ar

    Residual Helmoltz energy

    real(kind=pr), intent(out), optional :: ArV

    real(kind=pr), intent(out), optional :: ArT

    real(kind=pr), intent(out), optional :: ArTV

    real(kind=pr), intent(out), optional :: ArV2

    real(kind=pr), intent(out), optional :: ArT2

    real(kind=pr), intent(out), optional :: Arn(size(n))

    real(kind=pr), intent(out), optional :: ArVn(size(n))

    real(kind=pr), intent(out), optional :: ArTn(size(n))

    real(kind=pr), intent(out), optional :: Arn2(size(n),size(n))

abstract interface

  • public function abs_volume_initializer(self, n, p, t)

    Function that provides an initializer value for the liquid-root of newton solver of volume. In the case the model will use the volume_michelsen routine this value should provide the co-volume of the model.

    Arguments

    Type IntentOptional Attributes Name
    class(ArModel), intent(in) :: self

    Ar Model

    real(kind=pr), intent(in) :: n(:)

    Moles vector

    real(kind=pr), intent(in) :: p

    Pressure [bar]

    real(kind=pr), intent(in) :: t

    Temperature [K]

    Return Value real(kind=pr)

    Initial volume [L]


Derived Types

type, public, abstract, extends(BaseModel) ::  ArModel

Abstract residual Helmholtz model.

Read more…

Components

Type Visibility Attributes Name Initial
type(Substances), public :: components

Substances contained in the module

character(len=:), public, allocatable :: name

Name of the model

Type-Bound Procedures

procedure, public :: Cp_residual_vt
procedure, public :: Cv_residual_vt
procedure, public :: enthalpy_residual_vt
procedure, public :: entropy_residual_vt
procedure(abs_volume_initializer), public, deferred :: get_v0
procedure, public :: gibbs_residual_vt => gibbs_residual_VT
procedure, public :: lnphi_pt => fugacity_pt
procedure, public :: lnphi_vt => fugacity_vt
procedure, public :: pressure
procedure(abs_residual_helmholtz), public, deferred :: residual_helmholtz
procedure, public :: volume

Functions

public pure function size_ar_model(eos)

Get the size of the model.

Arguments

Type IntentOptional Attributes Name
class(ArModel), intent(in) :: eos

Return Value integer


Subroutines

public subroutine Cp_residual_vt(eos, n, V, T, Cp)

Calculate residual heat capacity pressure constant given v and t.

Arguments

Type IntentOptional Attributes Name
class(ArModel), intent(in) :: eos

Model

real(kind=pr), intent(in) :: n(:)

Moles number vector

real(kind=pr), intent(in) :: V

Volume [L]

real(kind=pr), intent(in) :: T

Temperature [K]

real(kind=pr), intent(out) :: Cp

heat capacity p constant [bar L / K]

public subroutine Cv_residual_vt(eos, n, V, T, Cv)

Calculate residual heat capacity volume constant given v and t.

Arguments

Type IntentOptional Attributes Name
class(ArModel), intent(in) :: eos

Model

real(kind=pr), intent(in) :: n(:)

Moles number vector

real(kind=pr), intent(in) :: V

Volume [L]

real(kind=pr), intent(in) :: T

Temperature [K]

real(kind=pr), intent(out) :: Cv

heat capacity v constant [bar L / K]

public subroutine enthalpy_residual_vt(eos, n, v, t, Hr, HrT, HrV, Hrn)

Calculate residual enthalpy given volume and temperature.

Arguments

Type IntentOptional Attributes Name
class(ArModel), intent(in) :: eos

Model

real(kind=pr), intent(in) :: n(:)

Moles number vector

real(kind=pr), intent(in) :: v

Volume [L]

real(kind=pr), intent(in) :: t

Temperature [K]

real(kind=pr), intent(out) :: Hr

Residual enthalpy [bar L]

real(kind=pr), intent(out), optional :: HrT

real(kind=pr), intent(out), optional :: HrV

real(kind=pr), intent(out), optional :: Hrn(size(n))

public subroutine entropy_residual_vt(eos, n, V, T, Sr, SrT, SrV, Srn)

Calculate residual entropy given volume and temperature.

Arguments

Type IntentOptional Attributes Name
class(ArModel), intent(in) :: eos

Model

real(kind=pr), intent(in) :: n(:)

Moles number vector

real(kind=pr), intent(in) :: V

Volume [L]

real(kind=pr), intent(in) :: T

Temperature [K]

real(kind=pr), intent(out) :: Sr

Entropy [bar L / K]

real(kind=pr), intent(out), optional :: SrT

real(kind=pr), intent(out), optional :: SrV

real(kind=pr), intent(out), optional :: Srn(size(n))

public subroutine fugacity_pt(eos, n, P, T, V, root_type, lnPhi, dlnPhidP, dlnPhidT, dlnPhidn, dPdV, dPdT, dPdn)

Calculate logarithm of fugacity, given pressure and temperature.

Read more…

Arguments

Type IntentOptional Attributes Name
class(ArModel), intent(in) :: eos

Model

real(kind=pr), intent(in) :: n(:)

Mixture mole numbers

real(kind=pr), intent(in) :: P

Pressure [bar]

real(kind=pr), intent(in) :: T

Temperature [K]

real(kind=pr), intent(out), optional :: V

Volume [L]

character(len=*), intent(in) :: root_type

Type of root desired [“liquid”, “vapor”, “stable”]

real(kind=pr), intent(out), optional :: lnPhi(size(n))

vector

real(kind=pr), intent(out), optional :: dlnPhidP(size(n))

ln(phi) Presssure derivative

real(kind=pr), intent(out), optional :: dlnPhidT(size(n))

ln(phi) Temp derivative

real(kind=pr), intent(out), optional :: dlnPhidn(size(n),size(n))

ln(phi) compositional derivative

real(kind=pr), intent(out), optional :: dPdV

real(kind=pr), intent(out), optional :: dPdT

real(kind=pr), intent(out), optional :: dPdn(size(n))

public subroutine fugacity_vt(eos, n, V, T, P, lnPhi, dlnPhidP, dlnPhidT, dlnPhidn, dPdV, dPdT, dPdn)

Calculate fugacity coefficent given volume and temperature.

Read more…

Arguments

Type IntentOptional Attributes Name
class(ArModel) :: eos

Model

real(kind=pr), intent(in) :: n(:)

Mixture mole numbers

real(kind=pr), intent(in) :: V

Volume [L]

real(kind=pr), intent(in) :: T

Temperature [K]

real(kind=pr), intent(out), optional :: P

Pressure [bar]

real(kind=pr), intent(out), optional :: lnPhi(size(n))

vector

real(kind=pr), intent(out), optional :: dlnPhidP(size(n))

Presssure derivative

real(kind=pr), intent(out), optional :: dlnPhidT(size(n))

Temp derivative

real(kind=pr), intent(out), optional :: dlnPhidn(size(n),size(n))

compositional derivative

real(kind=pr), intent(out), optional :: dPdV

real(kind=pr), intent(out), optional :: dPdT

real(kind=pr), intent(out), optional :: dPdn(:)

public subroutine gibbs_residual_VT(eos, n, V, T, Gr, GrT, GrV, Grn)

Calculate residual Gibbs energy given volume and temperature.

Arguments

Type IntentOptional Attributes Name
class(ArModel), intent(in) :: eos

Model

real(kind=pr), intent(in) :: n(:)

Moles number vector

real(kind=pr), intent(in) :: V

Volume [L]

real(kind=pr), intent(in) :: T

Temperature [K]

real(kind=pr), intent(out) :: Gr

Gibbs energy [bar L]

real(kind=pr), intent(out), optional :: GrT

real(kind=pr), intent(out), optional :: GrV

real(kind=pr), intent(out), optional :: Grn(size(n))

public subroutine pressure(eos, n, v, t, p, dPdV, dPdT, dPdn)

Pressure calculation.

Read more…

Arguments

Type IntentOptional Attributes Name
class(ArModel), intent(in) :: eos

Model

real(kind=pr), intent(in) :: n(:)

Moles number vector

real(kind=pr), intent(in) :: v

Volume [L]

real(kind=pr), intent(in) :: t

Temperature [K]

real(kind=pr), intent(out) :: p

Pressure [bar]

real(kind=pr), intent(out), optional :: dPdV

real(kind=pr), intent(out), optional :: dPdT

real(kind=pr), intent(out), optional :: dPdn(:)

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

Solves volume roots using newton method. Given pressure and temperature.

Read more…

Arguments

Type IntentOptional Attributes Name
class(ArModel), intent(in) :: eos
real(kind=pr), intent(in) :: n(:)

Moles number vector

real(kind=pr), intent(in) :: P

Pressure [bar]

real(kind=pr), intent(in) :: T

Temperature [K]

real(kind=pr), intent(out) :: V

Volume [L]

character(len=*), intent(in) :: root_type

Desired root-type to solve. Options are: ["liquid", "vapor", "stable"]