ArModel Derived Type

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

Abstract residual Helmholtz model.

This derived type defines the basics needed for the calculation of residual properties. The basics of a residual Helmholtz model is a routine that calculates all the needed derivatives of residual_helmholtz and a volume initializer function, that is used to initialize a Newton solver of volume when specifying pressure.


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

  • private subroutine Cp_residual_vt(eos, n, V, T, Cp)

    Calculate residual heat capacity pressure constant given V and T.

    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) :: Cp

    heat capacity P constant [bar L / K]

procedure, public :: Cv_residual_vt

  • private subroutine Cv_residual_vt(eos, n, V, T, Cv)

    Calculate residual heat capacity volume constant given V and T.

    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) :: Cv

    heat capacity V constant [bar L / K]

procedure, public :: Psat_pure

  • private function Psat_pure(eos, ncomp, T)

    Calculation of saturation pressure of a pure component using the secant method.

    Arguments

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

    Model that will be used

    integer, intent(in) :: ncomp

    Number of component in the mixture from which the saturation pressure will be calculated

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

    Temperature [K]

    Return Value real(kind=pr)

procedure, public :: enthalpy_residual_vt

  • private subroutine enthalpy_residual_vt(eos, n, V, T, Hr, HrV, HrT, Hrn)

    Calculate residual enthalpy given volume and temperature.

    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), optional :: Hr

    Residual enthalpy [bar L]

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

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

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

procedure, public :: entropy_residual_vt

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

    Calculate residual entropy given volume and temperature.

    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), optional :: Sr

    Entropy [bar L / K]

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

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

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

procedure(abs_volume_initializer), public, deferred :: get_v0

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

    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]

procedure, public :: gibbs_residual_vt

  • private subroutine gibbs_residual_vt(eos, n, V, T, Gr, GrV, GrT, Grn)

    Calculate residual Gibbs energy given volume and temperature.

    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), optional :: Gr

    Gibbs energy [bar L]

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

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

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

procedure, public :: internal_energy_residual_vt

  • private subroutine internal_energy_residual_vt(eos, n, V, T, Ur, UrV, UrT, Urn)

    Calculate residual internal energy given volume and temperature.

    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), optional :: Ur

    Internal energy [bar L]

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

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

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

procedure, public :: lnfug_vt

  • private subroutine lnfug_vt(eos, n, V, T, P, lnf, dlnfdV, dlnfdT, dlnfdn, dPdV, dPdT, dPdn)

    Calculate natural logarithm of fugacity 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 :: lnf(size(n))

    vector

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

    Volume derivative

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

    Temp derivative

    real(kind=pr), intent(out), optional :: dlnfdn(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(:)

procedure, public :: lnphi_pt

  • private subroutine lnphi_pt(eos, n, P, T, V, root_type, lnPhi, dlnPhidP, dlnPhidT, dlnPhidn, dPdV, dPdT, dPdn)

    Calculate natural 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) Temperature 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))

procedure, public :: lnphi_vt

  • private subroutine lnphi_vt(eos, n, V, T, P, lnPhi, dlnPhidP, dlnPhidT, dlnPhidn, dPdV, dPdT, dPdn)

    Calculate natural logarithm of fugacity coefficent.

    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(:)

procedure, public :: pressure

  • private subroutine pressure(eos, n, V, T, P, dPdV, dPdT, dPdn)

    Calculate pressure.

    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(:)

procedure(abs_residual_helmholtz), public, deferred :: residual_helmholtz

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

    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))

procedure, public :: volume

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

    Volume solver routine for residual Helmholtz models.

    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) :: 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"]