CVODEIntegrator Derived Type

type, public, extends(Integrator) :: CVODEIntegrator


Components

Type Visibility Attributes Name Initial
logical, public :: userDefined = .false.

True only if user explicitly sets it to true

logical, public :: communicationNeeded

True if this Integrator requires MPI communication during evolution

type(CommunicationData), public :: commData

Communication data object for this Integrator

logical, public :: nonTrivialUpdate

True if this integrator should perform non-trivial updates of terms

logical, public :: nonTrivialModelDataUpdate

True if this integrator should perform non-trivial updates of model data

type(c_ptr), private :: sunctx

Sundials context

type(SUNLinearSolver), private, pointer :: sunls

Sundials linear solver pointer

type(N_Vector), private, pointer :: sunVecY

Solution and RHS sundials vector objects

type(N_Vector), private, pointer :: sunVecYDot

Solution and RHS sundials vector objects

type(c_ptr), private :: cvode

CVODE solver context

type(SUNMatrix), private, pointer :: sunmat

Sundials matrix (will be nulled)

real(kind=c_double), private, pointer, dimension(:) :: rhsVec

Pointers used for accessing the underlying N_Vectors

real(kind=c_double), private, pointer, dimension(:) :: yVec

Pointers used for accessing the underlying N_Vectors

type(VariableContainer), private, allocatable :: bufferRHS

ReMKiT1D variable containers corresponding to the RHS and solutions - enable derivation and communication calls

type(VariableContainer), private, allocatable :: bufferY

ReMKiT1D variable containers corresponding to the RHS and solutions - enable derivation and communication calls

real(kind=rk), private, allocatable, dimension(:) :: copyBufferVals

Buffer for moving data between the C pointers and the ReMKiT1D variable containers

type(StringArray), private, allocatable, dimension(:) :: evolvedVars

List of variables evolved by this solver

type(MPI_Comm), private :: mpiComm

MPI communicator object needed by some CVODE routines

integer(kind=ik), private :: numProcs

Number of processes needed for initialising the number of variables/equations in CVODE

type(CVODEOptions), private :: options
character(len=:), private, allocatable :: integratorName

Integrator named used in printing


Finalization Procedures

final :: finalizeCVODEIntegrator


Type-Bound Procedures

procedure, public :: isDefined => isDefinedObject

  • interface

    private pure module function isDefinedObject(this) result(defined)

    Getter for userDefined

    Arguments

    Type IntentOptional Attributes Name
    class(Object), intent(in) :: this

    Return Value logical

procedure, public :: makeDefined => makeDefinedObject

  • interface

    private pure module subroutine makeDefinedObject(this)

    Set userDefined to .true.

    Arguments

    Type IntentOptional Attributes Name
    class(Object), intent(inout) :: this

procedure, public :: makeUndefined => makeUndefinedObject

  • interface

    private pure module subroutine makeUndefinedObject(this)

    Set userDefined to .false.

    Arguments

    Type IntentOptional Attributes Name
    class(Object), intent(inout) :: this

procedure, public :: setTimestep

  • interface

    private pure module subroutine setTimestep(this, timestep)

    Setter for dt

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(inout) :: this
    real(kind=rk), intent(in) :: timestep

procedure, public :: getTimestep

  • interface

    private pure module function getTimestep(this) result(timestep)

    Getter for dt

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(in) :: this

    Return Value real(kind=rk)

procedure, public :: setTermGroups

  • interface

    private pure module subroutine setTermGroups(this, groups)

    Setter for termGroups

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(inout) :: this
    type(IntArray), intent(in), dimension(:) :: groups

procedure, public :: getTermGroups

  • interface

    private pure module function getTermGroups(this) result(groups)

    Getter for termGroups

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(in) :: this

    Return Value type(IntArray), allocatable, dimension(:)

procedure, public :: setModelIndices

  • interface

    private pure module subroutine setModelIndices(this, indices)

    Setter for modelIndices

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(inout) :: this
    integer(kind=ik), intent(in), dimension(:) :: indices

procedure, public :: getModelIndices

  • interface

    private pure module function getModelIndices(this) result(indices)

    Getter for modelIndices

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(in) :: this

    Return Value integer(kind=ik), allocatable, dimension(:)

procedure, public :: setTimeEvolving

  • interface

    private pure module subroutine setTimeEvolving(this, evo)

    Setter for evolvesTimeVar

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(inout) :: this
    logical, intent(in) :: evo

procedure, public :: isTimeEvolving

  • interface

    private pure module function isTimeEvolving(this) result(evo)

    Check if this Integrator is allowed to evolve a time variable if present

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(in) :: this

    Return Value logical

procedure, public :: setTimestepController

  • interface

    private pure module subroutine setTimestepController(this, controller)

    Setter for dtController

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(inout) :: this
    class(TimestepController), intent(in) :: controller

procedure, public :: hasTimestepController

  • interface

    private pure module function hasTimestepController(this) result(hasController)

    Check if this Integrator has an allocated timestep controller

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(in) :: this

    Return Value logical

procedure, public :: getTimestepFromController

  • interface

    private module function getTimestepFromController(this, inputVars) result(timestep)

    Get the individual timestep size if Integrator has a timestep controller

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(inout) :: this
    class(VariableContainer), intent(in) :: inputVars

    Return Value real(kind=rk)

procedure, public :: isCommunicationNeeded

  • interface

    private pure module function isCommunicationNeeded(this) result(commNeeded)

    Check whether this Integrator requires MPI communication

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(in) :: this

    Return Value logical

procedure, public :: setCommunicationNeeded

  • interface

    private pure module subroutine setCommunicationNeeded(this, commNeeded)

    Setter for communicationNeeded

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(inout) :: this
    logical, intent(in) :: commNeeded

procedure, public :: getCommunicationData

  • interface

    private pure module function getCommunicationData(this) result(commData)

    Getter for commData

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(in) :: this

    Return Value type(CommunicationData), allocatable

procedure, public :: setCommunicationData

  • interface

    private pure module subroutine setCommunicationData(this, commData)

    Setter for commData

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(inout) :: this
    type(CommunicationData), intent(in) :: commData

procedure, public :: getUpdateRules

  • interface

    private pure module function getUpdateRules(this) result(updateRules)

    Getter for updateOnInternalIteration

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(in) :: this

    Return Value type(LogicalArray), dimension(:), allocatable

procedure, public :: setUpdateRules

  • interface

    private pure module subroutine setUpdateRules(this, updateRules)

    Setter for updateOnInternalIteration

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(inout) :: this
    type(LogicalArray), intent(in), dimension(:) :: updateRules

procedure, public :: getModelDataUpdateRules

  • interface

    private pure module function getModelDataUpdateRules(this) result(updateRules)

    Getter for updateModelDataOnInternalIteration

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(in) :: this

    Return Value logical, dimension(:), allocatable

procedure, public :: setModelDataUpdateRules

  • interface

    private pure module subroutine setModelDataUpdateRules(this, updateRules)

    Setter for updateModelDataOnInternalIteration

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(inout) :: this
    logical, intent(in), dimension(:) :: updateRules

procedure, public :: hasNonTrivialUpdate

  • interface

    private pure module function hasNonTrivialUpdate(this) result(nonTrivialUpdate)

    Getter for nonTrivialUpdate

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(in) :: this

    Return Value logical

procedure, public :: setNonTrivialUpdate

  • interface

    private pure module subroutine setNonTrivialUpdate(this, nonTrivialUpdate)

    Setter for nonTrivialUpdate

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(inout) :: this
    logical, intent(in) :: nonTrivialUpdate

procedure, public :: hasNonTrivialModelDataUpdate

  • interface

    private pure module function hasNonTrivialModelDataUpdate(this) result(nonTrivialUpdate)

    Getter for nonTrivialModelDataUpdate

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(in) :: this

    Return Value logical

procedure, public :: setNonTrivialModelDataUpdate

  • interface

    private pure module subroutine setNonTrivialModelDataUpdate(this, nonTrivialUpdate)

    Setter for nonTrivialModelDataUpdate

    Arguments

    Type IntentOptional Attributes Name
    class(Integrator), intent(inout) :: this
    logical, intent(in) :: nonTrivialUpdate

procedure, public :: affect => integrateCVODE

  • interface

    private module subroutine integrateCVODE(this, manipulatedModeller, outputVars, inputVars)

    Implementation of abstract manipulate routine for the case of Runge-Kutta integrator

    Arguments

    Type IntentOptional Attributes Name
    class(CVODEIntegrator), intent(inout) :: this
    class(ModellerSurrogate), intent(inout) :: manipulatedModeller

    Modeller to be used in callbacks during integration

    class(VariableContainer), intent(inout) :: outputVars

    VariableContainer object to store the integration output

    class(VariableContainer), intent(in) :: inputVars

    VariableContainer object housing input data for the integration routine

procedure, public :: init => initCVODEIntegrator

  • interface

    private module subroutine initCVODEIntegrator(this, mpiCont, options, modelList, termGroups, evolvesTimeVar, dtController, initialTimestep, integratorName)

    Arguments

    Type IntentOptional Attributes Name
    class(CVODEIntegrator), intent(inout) :: this
    type(MPIController), intent(in) :: mpiCont

    MPI Controller used to initialise the sundials context

    type(CVODEOptions), intent(in) :: options

    Options object containing CVODE options

    integer(kind=ik), intent(in), optional, dimension(:) :: modelList

    List of models this integrator will be responsible for

    type(IntArray), intent(in), optional, dimension(:) :: termGroups

    Term groups this integrator is responsible for - should conform with modelList

    logical, intent(in), optional :: evolvesTimeVar

    Set to true if this integrator is allowed to change the "time" varible (if present in passed variable container)

    class(TimestepController), intent(in), optional :: dtController

    User-supplied timestep controller object

    real(kind=rk), intent(in), optional :: initialTimestep

    Default timestep

    character(len=*), intent(in), optional :: integratorName

    Name of integrator used in printing