H.1.1 Initialize_Monomial Procedure

The main documentation of the Initialize_Monomial Procedure contains additional explanation of this code listing.

  subroutine Initialize_Monomial (Monomial, Coefficient, Exponent, Phi_MV, &
                                  Locus, Mesh, Name, status)

    ! Use associations.

    use Caesar_Flags_Module, only: initialized_flag

    ! 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.
    ! Old value of the independent variable.
    type(Mathematic_Vector_type), intent(inout) :: Phi_MV
    type(character,*), intent(in), optional :: Name  ! Monomial name.

    ! 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

    ! Two more requirements: Coefficient and Phi_MV are the right size.

    VERIFY(SIZE(Coefficient)==Length_PE(Monomial%Structure),5) 
    VERIFY(Length_PE(Phi_MV)==Length_PE(Monomial%Structure),5) 

    ! 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, Length_PE(Monomial%Structure), &
                     allocate_status(3))

    ! Set up internals.

    if (PRESENT(Name)) Monomial%Name = Name
    Monomial%Coefficient = Coefficient
    Monomial%Exponent    = Exponent
    Monomial%Locus       = Locus
    Monomial%Phi         = Phi_MV

    ! 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



Michael L. Hall