D.2.12 Parallel_Write Procedure

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

  subroutine Parallel_Write_0 (String, Unit, PE)
   
    ! Input variables.
   
    type(character,*), intent(in) :: String      ! Output string.
    type(integer), intent(in), optional :: Unit  ! Output unit number.
    type(integer), intent(in), optional :: PE    ! Output PE number.
   
    ! Internal variables.
   
    type(character,LEN(String),1) :: IO_String  ! Assembled output string.
    type(integer) :: IO_Unit                    ! Actual output unit number.
    type(integer) :: i                          ! Loop counter.
   
    !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   
    ! Verify requirements - none.
   
    ! Initialize (on all PEs) and assemble the IO PE variable.
   
    call Initialize (IO_String, NPEs)
    call Assemble (IO_String, String)

    ! Only output on the IO PE.

    if (this_is_IO_PE) then

      ! Set unit number.
     
      if (PRESENT(Unit)) then
        IO_Unit = Unit
      else
        IO_Unit = 6
      end if
     
      ! Output for a single PE.
     
      if (PRESENT(PE)) then
        write (IO_Unit,100) TRIM(IO_String(PE))
     
      ! Output for all the PEs.
     
      else
        do i = 1, NPEs
          write (IO_Unit,100) TRIM(IO_String(i))
        end do
      end if

      ! Format statement.

100   format (a)

    end if

    ! Finalize variable.

    call Finalize (IO_String)

    ! Verify guarantees - none.
  
    return
  end subroutine Parallel_Write_0

  subroutine Parallel_Write_1 (String, Unit, PE)
   
    ! Input variables.
   
    type(character,*,1,np), intent(in) :: String ! Output string.
    type(integer), intent(in), optional :: Unit  ! Output unit number.
    type(integer), intent(in), optional :: PE    ! Output PE number.
   
    ! Internal variables.
   
    type(character,LEN(String),1) :: IO_String ! Assembled output string.
    type(integer) :: IO_Unit                   ! Actual output unit number.
    type(integer) :: i                         ! Loop counter.
    type(integer,1) :: Length_Vector         ! Vector of lengths for each PE.
    type(integer) :: Length_PE                 ! Lengths on each PE.
   
    !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    ! Verify requirements - none.
 
    ! Initialize (on all PEs) and assemble the IO PE variables.

    Length_PE = SIZE(String)
    call Initialize (Length_Vector, NPEs)
    call Assemble (Length_Vector, Length_PE)
    call Initialize (IO_String, SUM(Length_Vector))
    call Assemble (IO_String, String)

    ! Only output on the IO PE.

    if (this_is_IO_PE) then

      ! Set unit number.

      if (PRESENT(Unit)) then
        IO_Unit = Unit
      else
        IO_Unit = 6
      end if
     
      ! Output for a single PE.
     
      if (PRESENT(PE)) then
        do i = SUM(Length_Vector(1:PE-1)) + 1, SUM(Length_Vector(1:PE))
          write (IO_Unit,100) TRIM(IO_String(i))
        end do

      ! Output for all the PEs.
     
      else
        do i = 1, SUM(Length_Vector)
          write (IO_Unit,100) TRIM(IO_String(i))
        end do
      end if

      ! Format statement.

100   format (a)

    end if

    ! Finalize variables.

    call Finalize (Length_Vector)
    call Finalize (IO_String)

    ! Verify guarantees - none.
  
    return
  end subroutine Parallel_Write_1



Michael L. Hall