The main documentation of the Initialize_Monomial Procedure contains additional explanation of this code listing.
subroutine Initialize_Monomial (Monomial, Coefficient, Exponent, Phi_k_MV, &
Locus, Mesh, Name, Derivative, Delta_t, &
Phi_n_MV, Variable, Equation, NEquations, &
status)
! Use associations.
use Caesar_Flags_Module, only: initialized_flag
use Caesar_Numbers_Module, only: one
! Input variables.
type(real), intent(in) :: Exponent ! Monomial degree.
type(real,1) :: Coefficient ! Monomial coefficient.
type(character,*), intent(in) :: Locus ! Evaluation locus.
type(Multi_Mesh_type), target :: Mesh ! Monomial Mesh.
! Previous iterate value of the independent variable.
type(Mathematic_Vector_type), intent(inout) :: Phi_k_MV
! Past time step value of the independent variable.
type(Mathematic_Vector_type), intent(inout), optional :: Phi_n_MV
type(character,*), intent(in), optional :: Name ! Monomial name.
type(logical), intent(in), optional :: Derivative ! Time derivative toggle.
type(real), intent(in), optional :: Delta_t ! Time step size.
type(integer), intent(in), optional :: Variable ! Variable number.
type(integer), intent(in), optional :: Equation ! Equation number.
type(integer), intent(in), optional :: NEquations ! Number of equations.
! Output variables.
type(Monomial_type), intent(out) :: Monomial ! Monomial to be initialized.
type(Status_type), intent(out), optional :: status ! Exit status.
! Internal variables.
type(Status_type), dimension(3) :: allocate_status ! Allocation Status.
type(Status_type) :: consolidated_status ! Consolidated Status.
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Verify requirements.
VERIFY(.not.Valid_State(Monomial),5) ! Monomial is not valid.
VERIFY(Valid_State(Coefficient),5) ! Coefficient is valid.
VERIFY(Valid_State(Exponent),5) ! Exponent is valid.
! Set up pointers.
Monomial%Mesh => Mesh
select case (Locus)
case ("Cells")
Monomial%Structure => Cell_Structure(Mesh)
case ("Nodes")
Monomial%Structure => Node_Structure(Mesh)
case ("Faces")
Monomial%Structure => Face_Structure(Mesh)
end select
! Set time derivative toggle.
if (PRESENT(Derivative)) then
Monomial%Derivative = Derivative
else
Monomial%Derivative = .false.
end if
! Three more requirements: Coefficient, Phi_k_MV and Phi_n_MV are the
! right size.
VERIFY(SIZE(Coefficient)==Length_PE(Monomial%Structure),5)
VERIFY(Length_PE(Phi_k_MV)==Length_PE(Monomial%Structure),5)
if (PRESENT(Phi_n_MV)) then
VERIFY(Length_PE(Phi_n_MV)==Length_PE(Monomial%Structure),5)
end if
! Allocations and initializations.
call Initialize (allocate_status)
call Initialize (consolidated_status)
call Initialize (Monomial%Exponent, allocate_status(1))
call Initialize (Monomial%Coefficient, Length_PE(Monomial%Structure), &
allocate_status(2))
call Initialize (Monomial%Phi_k, Length_PE(Monomial%Structure), &
allocate_status(3))
if (Monomial%Derivative) then
call Initialize (Monomial%Phi_n, Length_PE(Monomial%Structure), &
allocate_status(3))
end if
! Set up internals.
if (PRESENT(Name)) Monomial%Name = Name
Monomial%Coefficient = Coefficient
Monomial%Exponent = Exponent
Monomial%Locus = Locus
Monomial%Phi_k = Phi_k_MV
if (Monomial%Derivative) then
if (PRESENT(Phi_n_MV)) then
Monomial%Phi_n = Phi_n_MV
else
Monomial%Phi_n = Phi_k_MV
end if
end if
if (PRESENT(Delta_t)) then
Monomial%Delta_t = Delta_t
else
Monomial%Delta_t = one
end if
if (PRESENT(Equation)) then
Monomial%Equation = Equation
else
Monomial%Equation = 1
end if
if (PRESENT(Variable)) then
Monomial%Variable = Variable
else
! If not specified, use the variable for this equation.
Monomial%Variable = Monomial%Equation
end if
if (PRESENT(NEquations)) then
Monomial%NEquations = NEquations
else
Monomial%NEquations = 1
end if
! Process status variables.
consolidated_status = allocate_status
if (PRESENT(status)) then
WARN_IF(Error(consolidated_status), 5)
status = consolidated_status
else
VERIFY(Normal(consolidated_status), 5)
end if
call Finalize (consolidated_status)
call Finalize (allocate_status)
! Set initialization flag.
Monomial%Initialized = initialized_flag
! Verify guarantees.
VERIFY(Valid_State(Monomial),5) ! Monomial is now valid.
return
end subroutine Initialize_Monomial