The main documentation of the Initialize_Base_Structure Procedure contains additional explanation of this code listing.
subroutine Initialize_Base_Structure (Structure, Length_Vector, Locus, & status) ! Use associations. use Caesar_Flags_Module, only: initialized_flag ! Input variables. type(integer,1) :: Length_Vector ! Length for each PE. type(character,*), intent(in), optional :: Locus ! Distributed location. ! Output variables. ! Base_Structure to be initialized. type(Base_Structure_type), intent(out) :: Structure type(Status_type), intent(out), optional :: status ! Exit status. ! Internal variables. type(Status_type) :: allocate_status ! Allocation Status. !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Verify requirements. VERIFY(SIZE(Length_Vector)==NPEs,5) ! Length_Vector is the right size. VERIFY(Valid_State(Length_Vector),5) ! Length_Vector is valid. ! Allocations and initializations. call Initialize (allocate_status) call Initialize (Structure%Length_Vector, NPEs, allocate_status) if (PRESENT(status)) then WARN_IF(Error(allocate_status), 5) status = allocate_status else VERIFY(Normal(allocate_status), 5) end if call Finalize (allocate_status) ! Set up internals. if (PRESENT(Locus)) Structure%Locus = Locus Structure%Length_Vector = Length_Vector Structure%Length_Total = SUM(Length_Vector) Structure%Length_PE = Length_Vector(this_PE) Structure%Last_PE = SUM(Length_Vector(1:this_PE)) Structure%First_PE = Structure%Last_PE - Structure%Length_PE + 1 Structure%Range_PE = (/ Structure%First_PE, Structure%Last_PE /) ! Set initialization flag. Structure%Initialized = initialized_flag ! Verify guarantees. VERIFY(Valid_State(Structure),5) ! Structure is now valid. return end subroutine Initialize_Base_Structure