<Image-selector Example Program>

Program image_selector_example
  Implicit None
  Real,Allocatable :: a(:,:)[:]
  Integer i,image,iset,j,m[*],m_per_image,n[*]
  If (This_Image()==1) Then
    !
    ! Read the problem size.
    !
    Read *,n,m
    !
    ! M vectors of length N.
    !
  End If
  !
  ! All images allocate the coarray that will hold the data.
  ! Get N from image 1 before allocation.
  ! If there are more data sets than images, the data sets
  ! are spread as evenly as possible: M_PER_IMAGE is the maximum
  ! number of data sets on any image.
  !
  Sync All
  If (This_Image()>1) Then
    n = n[1]
    m = m[1]
  End If
  m_per_image = (m-1)/Num_Images() + 1
  Allocate(a(n,m_per_image)[*])
  If (This_Image()==1) Then
    !
    ! Image 1 continues to read the data for all images.
    !
    image = 1
    iset = 1
    Do i=1,m
      Read *,a(:,iset)[image]
      If (image==Num_Images()) Then
        ! Filled up this slot on each image, reset to 1.
        image = 1
        iset = iset + 1
      Else
        image = image + 1
      End If
    End Do
  End If
  Sync All
  !
  ! All images process all of their data locally.
  ! Use ISET to keep track of the data set number, so that
  ! we don't try to process data sets beyond M.
  !
  iset = This_Image()
  Do i=1,m_per_image
    If (iset>m) Exit ! Nothing more to do on this image.
    ! We have the data: calculate the magnitude sum suffix.
    a(1,i) = Abs(a(1,i))
    Do j=2,n
      a(j,i) = a(j-1,i) + Abs(a(j,i))
    End Do
    iset = iset + Num_Images()
  End Do
  !
  ! Wait for everyone to finish.
  !
  Sync All
  If (This_Image()==1) Then
    !
    ! Image one will now report the results.
    !
    image = 1
    iset = 1
    Do i=1,m
      Print 1,i,(a(j,iset)[image],j=1,n)
1     Format(1X,'Data set ',I0,' magsumsuffix =',999F7.2)
      If (image==Num_Images()) Then
        ! Processed this slot on each image, reset to 1.
        image = 1
        iset = iset + 1
      Else
        image = image + 1
      End If
    End Do
  End If
End Program

<Example Input>

5 10
 -3.00 4.19 4.80 4.17 3.72
 2.80 -.31 2.09 -4.29 -4.29
 .59 4.07 3.68 -1.90 .53
 -1.29 2.47 -.61 2.06 .25
 -4.03 -1.37 -4.89 -2.53 3.22
 -3.46 -.16 -3.37 -2.10 -.03
 -2.93 3.49 4.03 2.14 -2.24
 4.98 1.15 3.56 1.50 .35
 -.58 1.54 -.42 -4.02 4.04
 -.36 4.51 4.17 .21 1.98

■ Execution Results

 Data set 1 magsumsuffix =   3.00   7.19  11.99  16.16  19.88
 Data set 2 magsumsuffix =   2.80   3.11   5.20   9.49  13.78
 Data set 3 magsumsuffix =   0.59   4.66   8.34  10.24  10.77
 Data set 4 magsumsuffix =   1.29   3.76   4.37   6.43   6.68
 Data set 5 magsumsuffix =   4.03   5.40  10.29  12.82  16.04
 Data set 6 magsumsuffix =   3.46   3.62   6.99   9.09   9.12
 Data set 7 magsumsuffix =   2.93   6.42  10.45  12.59  14.83
 Data set 8 magsumsuffix =   4.98   6.13   9.69  11.19  11.54
 Data set 9 magsumsuffix =   0.58   2.12   2.54   6.56  10.60
 Data set 10 magsumsuffix =   0.36   4.87   9.04   9.25  11.23