The main documentation of the Generate_Multiple_Base_Structure Procedure contains additional explanation of this code listing.
subroutine Generate_Multiple_Base_Struct (Structure_Multiple, N, & Structure_source, Locus, status) ! Input variables. type(Base_Structure_type), intent(in) :: Structure_source type(integer), intent(in) :: N type(character,*), intent(in), optional :: Locus ! Distributed location. ! Output variables. ! Base_Structure to be initialized. type(Base_Structure_type), intent(out) :: Structure_Multiple type(Status_type), intent(out), optional :: status ! Exit status. ! Internal variables. type(Status_type), dimension(2) :: allocate_status ! Allocation Status. type(Status_type) :: consolidated_status ! Consolidated Status. type(integer,1) :: Length_Vector ! Length for each PE. !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Verify requirements. VERIFY(Valid_State(Structure_source),5) ! Structure_source is valid. ! Allocations and initializations. call Initialize (allocate_status) call Initialize (consolidated_status) call Initialize (Length_Vector, NPEs, allocate_status(1)) ! Multiply the length vector. Length_Vector = N * Structure_source%Length_Vector ! Initialize Structure_Multiple to be a multiple of Structure_source. call Initialize (Structure_Multiple, Length_Vector, & status=allocate_status(2)) ! Set Locus. if (PRESENT(Locus)) then Structure_Multiple%Locus = Locus else Structure_Multiple%Locus = Structure_source%Locus 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) ! Finalize variable. call Finalize (Length_Vector) ! Verify guarantees. VERIFY(Valid_State(Structure_Multiple),5) ! Base_Structure is now valid. return end subroutine Generate_Multiple_Base_Struct