The main documentation of the Output_Base_Structure Procedure contains additional explanation of this code listing.
subroutine Output_Base_Structure (Structure, Unit, Type, Indent) ! Input variables. type(Base_Structure_type), intent(in) :: Structure ! Output Variable. type(integer), intent(in), optional :: Unit ! Output unit. type(character,*), optional :: Type ! Structure type. type(integer), optional :: Indent ! Indentation. ! Internal variables. type(integer) :: A_Unit ! Actual output unit. type(character,80) :: A_Type ! Actual structure type. type(integer) :: A_Indent ! Actual indentation. type(integer) :: PE, i ! PE loop counter. type(character,80) :: Blanks ! A line of blanks. type(character,80) :: Output_Buffer ! Output buffer. !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Verify requirements. VERIFY(Valid_State(Structure),5) ! Structure is valid. ! Set unit number. if (PRESENT(Unit)) then A_Unit = Unit else A_Unit = 6 end if ! Set indentation. if (PRESENT(Indent)) then A_Indent = Indent else A_Indent = 0 end if Blanks = ' ' ! Only output on the IO PE. if (this_is_IO_PE) then ! Set structure type. if (PRESENT(Type)) then A_Type = Type else A_Type = 'Base' end if ! Output Identification Info. write (A_Unit,100) Blanks(1:A_Indent), TRIM(A_Type), & ' Structure Information:' write (A_Unit,101) Blanks(1:A_Indent+2), 'Locus = ', & TRIM(Structure%Locus) write (A_Unit,102) Blanks(1:A_Indent+2), 'Initialized = ', & Initialized(Structure) write (A_Unit,103) Blanks(1:A_Indent+2), 'Length_Total =', & Structure%Length_Total if (NPEs <= 4) then write (A_Unit,103) Blanks(1:A_Indent+2), 'Length_Vector =', & (Structure%Length_Vector(PE), PE = 1, MIN(NPEs, 4)) else write (A_Unit,103) Blanks(1:A_Indent+2), 'Length_Vector =', & (Structure%Length_Vector(PE), PE = 1, 4), ',' do PE = 5, NPEs, 4 if (PE + 4 <= NPEs) then write (A_Unit,104) Blanks(1:A_Indent+23), & (Structure%Length_Vector(i), & i = PE, MIN(PE+3, NPEs)), ',' else write (A_Unit,104) Blanks(1:A_Indent+23), & (Structure%Length_Vector(i), & i = PE, MIN(PE+3, NPEs)) end if end do end if end if ! PE-dependent output. write (Output_Buffer,105) Blanks(1:A_Indent+2), 'PE:', this_PE, & ', Length_PE =', Structure%Length_PE, & ', Range_PE = (', Structure%Range_PE, ')' call Parallel_Write (Output_Buffer, A_Unit) ! Format statements. With these formats, this should work up to ! (10^6 - 1) PEs and (10^12 - 1) items / PE. 100 format (/, 3a, /) 101 format (3a) 102 format (2a, l2) 103 format (2a, i12, :, 3(',', i12, :), a) 104 format (a, i12, :, 3(',', i12, :), a) 105 format (2a, i5, a, i12, a, i12, ',', i12, a) ! Verify guarantees - none. return end subroutine Output_Base_Structure