The main documentation of the Initialize_Solver Procedure contains additional explanation of this code listing.
subroutine Initialize_Solver (Solver, Package, status)
! Use associations.
use Caesar_Flags_Module, only: initialized_flag
! Input variables.
type(character,*), intent(in) :: Package ! Solver package to call.
! Output variables.
type(Solver_type), intent(out) :: Solver ! Solver to be initialized.
type(Status_type), intent(out), optional :: status ! Exit status.
! Internal variables.
type(Status_type), dimension(1) :: allocate_status ! Allocation Status.
type(Status_type) :: consolidated_status ! Consolidated Status.
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Verify requirements.
VERIFY(.not.Valid_State(Solver),5) ! Solver is not valid.
! Allocations and initializations.
call Initialize (allocate_status)
call Initialize (consolidated_status)
! Set up internals.
if (Package(1:4) == 'LAMG') then
Solver%Package = 'LAMG'
else
! No Package match found.
VERIFY(.false., 0)
end if
! Default Solver settings.
Solver%Epsilon = 1.d-10
Solver%Stopping_Test = '||r||/||b|| < Eps'
Solver%Maximum_Iterations = 1000
! Default LAMG settings.
if (Solver%Package == 'LAMG') then
Solver%LAMG_levout = 2 ! Package output: 0=silent, 4=verbose.
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.
Solver%Initialized = initialized_flag
! Verify guarantees.
VERIFY(Valid_State(Solver),5) ! Solver is now valid.
return
end subroutine Initialize_Solver