Next:
Array Sorting Functions Up: Library Procedures Previous: Array Combining Scatter

## Array Prefix and Suffix Functions

When comments below apply to both prefix and suffix forms of the routines, we will refer to them as YYYFIX functions.

The arguments MASK and SEGMENT must be of type logical. SEGMENT must have the same shape as ARRAY. MASK must be conformable with ARRAY. EXCLUSIVE is a logical scalar. DIM is a scalar integer between one and the rank of ARRAY.

Result Value. The result has the same shape as ARRAY, and, with the exception of COUNT_YYYFIX, the same type and kind type parameter as ARRAY. (The result of COUNT_YYYFIX is default integer.)

In every case, every element of the result is determined by the values of certain selected elements of ARRAY in a way that is specific to the particular function and is described in its specification. The optional arguments affect the selection of elements of ARRAY for each element of the result; the selected elements of ARRAY are said to contribute to the result element. This section describes fully which elements of ARRAY contribute to a given element of the result.

If no elements of ARRAY are selected for a given element of the result, that result element is set to a default value that is specific to the particular function and is described in its specification.

For any given element of the result, let be the corresponding element of ARRAY. Every element of ARRAY contributes to unless disqualified by one of the following rules.

These general rules lead to the following important cases:
*

(i): If ARRAY has rank one, element of the result of XXX_PREFIX(ARRAY) is determined by the first elements of ARRAY; element of the result of XXX_SUFFIX(ARRAY) is determined by the last elements of ARRAY.

(ii): If ARRAY has rank greater than one, then each element of the result of XXX_PREFIX(ARRAY) has a value determined by the corresponding element of the ARRAY and all elements of ARRAY that precede in array element order. For XXX_SUFFIX, is determined by the elements of ARRAY that correspond to or follow in array element order.

(iii): Each element of the result of XXX_PREFIX(ARRAY,MASK=MASK) is determined by selected elements of ARRAY, namely the corresponding element of the ARRAY and all elements of ARRAY that precede in array element order, but an element of ARRAY may contribute to the result only if the corresponding element of MASK is true. If this restriction results in selecting no array elements to contribute to some element of the result, then that element of the result is set to the default value for the given function.

(iv): Each element of the result of XXX_PREFIX(ARRAY,DIM=DIM) is determined by selected elements of ARRAY, namely the corresponding element of the ARRAY and all elements of ARRAY that precede along dimension DIM; for example, in SUM_PREFIX(A(1:N,1:N), DIM=2), result element could be computed as SUM(A(,)). More generally, in SUM_PREFIX(ARRAY, DIM), result element could be computed as SUM(ARRAY( )) . (Note the colon before i_DIM in that last expression.)

(v): If ARRAY has rank one, then element of the result of XXX_PREFIX(ARRAY, EXCLUSIVE=.TRUE.) is determined by the first elements of ARRAY.

(vi): The options may be used in any combination.

• []Advice to users. A new segment begins at every transition from false to true or true to false; thus a segment is indicated by a maximal contiguous subsequence of like logical values:

(/T,T,T,F,T,F,F,F,T,F,F,T/) -- - - -- - - - seven segments (End of advice to users.)

• []Rationale. One existing library delimits the segments by indicating the start of each segment. Another delimits the segments by indicating the stop of each segment. Each method has its advantages. There is also the question of whether this convention should change when performing a suffix rather than a prefix. HPF adopts the symmetric representation above. The main advantages of this representation are:

1. [(A)] It is symmetrical, in that the same segment specifier may be meaningfully used for prefix and suffix without changing its interpretation (start versus stop).

2. [(B)] The start-bit or stop-bit representation is easily converted to this form by using PARITY_PREFIX or PARITY_SUFFIX. These might be standard idioms for a compiler to recognize: SUM_PREFIX(FOO,SEGMENT=PARITY_PREFIX(START_BITS)) SUM_PREFIX(FOO,SEGMENT=PARITY_SUFFIX(STOP_BITS)) SUM_SUFFIX(FOO,SEGMENT=PARITY_SUFFIX(START_BITS)) SUM_SUFFIX(FOO,SEGMENT=PARITY_PREFIX(STOP_BITS))

(End of rationale.)

Examples. The examples below illustrate all possible combinations of optional arguments for SUM_PREFIX. The default value for SUM_YYYFIX is zero.
*

(i): SUM_PREFIX((/1,3,5,7/)) is ,1,4,9,16,, plus 1filll -1;1,4,9,16,; plus 1filll -1:1,4,9,16,: plus 1filll -1.1,4,9,16,. plus 1filll -11,4,9,16, plus 1filll-1.

(ii): If B is the array , 1, 2, 3 4, 5, 6 7, 8, 9 ,, plus 1filll -1; 1, 2, 3 4, 5, 6 7, 8, 9 ,; plus 1filll -1: 1, 2, 3 4, 5, 6 7, 8, 9 ,: plus 1filll -1.plus 1filll 1, 2, 3 4, 5, 6 7, 8, 9 ,.-50 1, 2, 3 4, 5, 6 7, 8, 9 , plus 1filll-1, SUM_PREFIX(B) is the array , 1, 14, 30 5, 19, 36 12, 27, 45 ,, plus 1filll -1; 1, 14, 30 5, 19, 36 12, 27, 45 ,; plus 1filll -1: 1, 14, 30 5, 19, 36 12, 27, 45 ,: plus 1filll -1.plus 1filll 1, 14, 30 5, 19, 36 12, 27, 45 ,.-50 1, 14, 30 5, 19, 36 12, 27, 45 , plus 1filll-1.

(iii): If A is the array ,3, 5, -2, -1, 7, 4, 8,, plus 1filll -1;3, 5, -2, -1, 7, 4, 8,; plus 1filll -1:3, 5, -2, -1, 7, 4, 8,: plus 1filll -1.3, 5, -2, -1, 7, 4, 8,. plus 1filll -13, 5, -2, -1, 7, 4, 8, plus 1filll-1, then SUM_PREFIX(A, MASK = A .LT. 6) is ,3, 8, 6, 5, 5, 9, 9,, plus 1filll -1;3, 8, 6, 5, 5, 9, 9,; plus 1filll -1:3, 8, 6, 5, 5, 9, 9,: plus 1filll -1.3, 8, 6, 5, 5, 9, 9,. plus 1filll -13, 8, 6, 5, 5, 9, 9, plus 1filll-1.

(iv): If B is the array , 1, 2, 3 4, 5, 6 7, 8, 9 ,, plus 1filll -1; 1, 2, 3 4, 5, 6 7, 8, 9 ,; plus 1filll -1: 1, 2, 3 4, 5, 6 7, 8, 9 ,: plus 1filll -1.plus 1filll 1, 2, 3 4, 5, 6 7, 8, 9 ,.-50 1, 2, 3 4, 5, 6 7, 8, 9 , plus 1filll-1, then SUM_PREFIX(B, DIM=1) is the array , 1, 2, 3 5, 7, 9 12, 15, 18 ,, plus 1filll -1; 1, 2, 3 5, 7, 9 12, 15, 18 ,; plus 1filll -1: 1, 2, 3 5, 7, 9 12, 15, 18 ,: plus 1filll -1.plus 1filll 1, 2, 3 5, 7, 9 12, 15, 18 ,.-50 1, 2, 3 5, 7, 9 12, 15, 18 , plus 1filll-1 and SUM_PREFIX(B, DIM=2) is the array , 1, 3, 6 4, 9, 15 7, 15, 24 ,, plus 1filll -1; 1, 3, 6 4, 9, 15 7, 15, 24 ,; plus 1filll -1: 1, 3, 6 4, 9, 15 7, 15, 24 ,: plus 1filll -1.plus 1filll 1, 3, 6 4, 9, 15 7, 15, 24 ,.-50 1, 3, 6 4, 9, 15 7, 15, 24 , plus 1filll-1.

(v): SUM_PREFIX((/1,3,5,7/), EXCLUSIVE=.TRUE.) is ,0,1,4,9,, plus 1filll -1;0,1,4,9,; plus 1filll -1:0,1,4,9,: plus 1filll -1.0,1,4,9,. plus 1filll -10,1,4,9, plus 1filll-1.

(vi): If B is the array , 1, 2, 3, 4, 5 6, 7, 8, 9, 10 11, 12, 13, 14, 15 ,, plus 1filll -1; 1, 2, 3, 4, 5 6, 7, 8, 9, 10 11, 12, 13, 14, 15 ,; plus 1filll -1: 1, 2, 3, 4, 5 6, 7, 8, 9, 10 11, 12, 13, 14, 15 ,: plus 1filll -1.plus 1filll 1, 2, 3, 4, 5 6, 7, 8, 9, 10 11, 12, 13, 14, 15 ,.-50 1, 2, 3, 4, 5 6, 7, 8, 9, 10 11, 12, 13, 14, 15 , plus 1filll-1, M is the array , T, T, T, T, T F, F, T, T, T T, F, T, F, F ,, plus 1filll -1; T, T, T, T, T F, F, T, T, T T, F, T, F, F ,; plus 1filll -1: T, T, T, T, T F, F, T, T, T T, F, T, F, F ,: plus 1filll -1.plus 1filll T, T, T, T, T F, F, T, T, T T, F, T, F, F ,.-50 T, T, T, T, T F, F, T, T, T T, F, T, F, F , plus 1filll-1, and S is the array , T, T, F, F, F F, T, T, F, F T, T, T, T, T ,, plus 1filll -1; T, T, F, F, F F, T, T, F, F T, T, T, T, T ,; plus 1filll -1: T, T, F, F, F F, T, T, F, F T, T, T, T, T ,: plus 1filll -1.plus 1filll T, T, F, F, F F, T, T, F, F T, T, T, T, T ,.-50 T, T, F, F, F F, T, T, F, F T, T, T, T, T , plus 1filll-1, then:
SUM_PREFIX(B, DIM=2, MASK=M, SEGMENT=S, EXCLUSIVE=.TRUE.) is , 0, 1, 0, 3, 7 0, 0, 0, 0, 9 0, 11, 11, 24, 24 ,, plus 1filll -1; 0, 1, 0, 3, 7 0, 0, 0, 0, 9 0, 11, 11, 24, 24 ,; plus 1filll -1: 0, 1, 0, 3, 7 0, 0, 0, 0, 9 0, 11, 11, 24, 24 ,: plus 1filll -1.plus 1filll 0, 1, 0, 3, 7 0, 0, 0, 0, 9 0, 11, 11, 24, 24 ,.-50 0, 1, 0, 3, 7 0, 0, 0, 0, 9 0, 11, 11, 24, 24 , plus 1filll-1.

SUM_PREFIX(B, DIM=2, MASK=M, SEGMENT=S, EXCLUSIVE=.FALSE.) is , 1, 3, 3, 7, 12 0, 0, 8, 9, 19 11, 11, 24, 24, 24 ,, plus 1filll -1; 1, 3, 3, 7, 12 0, 0, 8, 9, 19 11, 11, 24, 24, 24 ,; plus 1filll -1: 1, 3, 3, 7, 12 0, 0, 8, 9, 19 11, 11, 24, 24, 24 ,: plus 1filll -1.plus 1filll 1, 3, 3, 7, 12 0, 0, 8, 9, 19 11, 11, 24, 24, 24 ,.-50 1, 3, 3, 7, 12 0, 0, 8, 9, 19 11, 11, 24, 24, 24 , plus 1filll-1.

SUM_PREFIX(B, DIM=2, MASK=M, EXCLUSIVE=.TRUE.) is , 0, 1, 3, 6, 10 0, 0, 0, 8, 17 0, 11, 11, 24, 24 ,, plus 1filll -1; 0, 1, 3, 6, 10 0, 0, 0, 8, 17 0, 11, 11, 24, 24 ,; plus 1filll -1: 0, 1, 3, 6, 10 0, 0, 0, 8, 17 0, 11, 11, 24, 24 ,: plus 1filll -1.plus 1filll 0, 1, 3, 6, 10 0, 0, 0, 8, 17 0, 11, 11, 24, 24 ,.-50 0, 1, 3, 6, 10 0, 0, 0, 8, 17 0, 11, 11, 24, 24 , plus 1filll-1.

SUM_PREFIX(B, DIM=2, MASK=M, EXCLUSIVE=.FALSE.) is , 1, 3, 6, 10, 15 0, 0, 8, 17, 27 11, 11, 24, 24, 24 ,, plus 1filll -1; 1, 3, 6, 10, 15 0, 0, 8, 17, 27 11, 11, 24, 24, 24 ,; plus 1filll -1: 1, 3, 6, 10, 15 0, 0, 8, 17, 27 11, 11, 24, 24, 24 ,: plus 1filll -1.plus 1filll 1, 3, 6, 10, 15 0, 0, 8, 17, 27 11, 11, 24, 24, 24 ,.-50 1, 3, 6, 10, 15 0, 0, 8, 17, 27 11, 11, 24, 24, 24 , plus 1filll-1.

SUM_PREFIX(B, DIM=2, SEGMENT=S, EXCLUSIVE=.TRUE.) is , 0, 1, 0, 3, 7 0, 0, 7, 0, 9 0, 11, 23, 36, 50 ,, plus 1filll -1; 0, 1, 0, 3, 7 0, 0, 7, 0, 9 0, 11, 23, 36, 50 ,; plus 1filll -1: 0, 1, 0, 3, 7 0, 0, 7, 0, 9 0, 11, 23, 36, 50 ,: plus 1filll -1.plus 1filll 0, 1, 0, 3, 7 0, 0, 7, 0, 9 0, 11, 23, 36, 50 ,.-50 0, 1, 0, 3, 7 0, 0, 7, 0, 9 0, 11, 23, 36, 50 , plus 1filll-1.

SUM_PREFIX(B, DIM=2, SEGMENT=S, EXCLUSIVE=.FALSE.) is , 1, 3, 3, 7, 12 6, 7, 15, 9, 19 11, 23, 36, 50, 65 ,, plus 1filll -1; 1, 3, 3, 7, 12 6, 7, 15, 9, 19 11, 23, 36, 50, 65 ,; plus 1filll -1: 1, 3, 3, 7, 12 6, 7, 15, 9, 19 11, 23, 36, 50, 65 ,: plus 1filll -1.plus 1filll 1, 3, 3, 7, 12 6, 7, 15, 9, 19 11, 23, 36, 50, 65 ,.-50 1, 3, 3, 7, 12 6, 7, 15, 9, 19 11, 23, 36, 50, 65 , plus 1filll-1.

SUM_PREFIX(B, DIM=2, EXCLUSIVE=.TRUE.) is , 0, 1, 3, 6, 10 0, 6, 13, 21, 30 0, 11, 23, 36, 50 ,, plus 1filll -1; 0, 1, 3, 6, 10 0, 6, 13, 21, 30 0, 11, 23, 36, 50 ,; plus 1filll -1: 0, 1, 3, 6, 10 0, 6, 13, 21, 30 0, 11, 23, 36, 50 ,: plus 1filll -1.plus 1filll 0, 1, 3, 6, 10 0, 6, 13, 21, 30 0, 11, 23, 36, 50 ,.-50 0, 1, 3, 6, 10 0, 6, 13, 21, 30 0, 11, 23, 36, 50 , plus 1filll-1.

SUM_PREFIX(B, DIM=2, EXCLUSIVE=.FALSE.) is , 1, 3, 6, 10, 15 6, 13, 21, 30, 40 11, 23, 36, 50, 65 ,, plus 1filll -1; 1, 3, 6, 10, 15 6, 13, 21, 30, 40 11, 23, 36, 50, 65 ,; plus 1filll -1: 1, 3, 6, 10, 15 6, 13, 21, 30, 40 11, 23, 36, 50, 65 ,: plus 1filll -1.plus 1filll 1, 3, 6, 10, 15 6, 13, 21, 30, 40 11, 23, 36, 50, 65 ,.-50 1, 3, 6, 10, 15 6, 13, 21, 30, 40 11, 23, 36, 50, 65 , plus 1filll-1.

SUM_PREFIX(B, MASK=M, SEGMENT=S, EXCLUSIVE=.TRUE.) is , 0, 11, 0, 0, 0 0, 13, 0, 4, 5 0, 13, 8, 0, 0 ,, plus 1filll -1; 0, 11, 0, 0, 0 0, 13, 0, 4, 5 0, 13, 8, 0, 0 ,; plus 1filll -1: 0, 11, 0, 0, 0 0, 13, 0, 4, 5 0, 13, 8, 0, 0 ,: plus 1filll -1.plus 1filll 0, 11, 0, 0, 0 0, 13, 0, 4, 5 0, 13, 8, 0, 0 ,.-50 0, 11, 0, 0, 0 0, 13, 0, 4, 5 0, 13, 8, 0, 0 , plus 1filll-1.

SUM_PREFIX(B, MASK=M, SEGMENT=S, EXCLUSIVE=.FALSE.) is , 1, 13, 3, 4, 5 0, 13, 8, 13, 15 11, 13, 21, 0, 0 ,, plus 1filll -1; 1, 13, 3, 4, 5 0, 13, 8, 13, 15 11, 13, 21, 0, 0 ,; plus 1filll -1: 1, 13, 3, 4, 5 0, 13, 8, 13, 15 11, 13, 21, 0, 0 ,: plus 1filll -1.plus 1filll 1, 13, 3, 4, 5 0, 13, 8, 13, 15 11, 13, 21, 0, 0 ,.-50 1, 13, 3, 4, 5 0, 13, 8, 13, 15 11, 13, 21, 0, 0 , plus 1filll-1.

SUM_PREFIX(B, MASK=M, EXCLUSIVE=.TRUE.) is , 0, 12, 14, 38, 51 1, 14, 17, 42, 56 1, 14, 25, 51, 66 ,, plus 1filll -1; 0, 12, 14, 38, 51 1, 14, 17, 42, 56 1, 14, 25, 51, 66 ,; plus 1filll -1: 0, 12, 14, 38, 51 1, 14, 17, 42, 56 1, 14, 25, 51, 66 ,: plus 1filll -1.plus 1filll 0, 12, 14, 38, 51 1, 14, 17, 42, 56 1, 14, 25, 51, 66 ,.-50 0, 12, 14, 38, 51 1, 14, 17, 42, 56 1, 14, 25, 51, 66 , plus 1filll-1.

SUM_PREFIX(B, MASK=M, EXCLUSIVE=.FALSE.) is , 1, 14, 17, 42, 56 1, 14, 25, 51, 66 12, 14, 38, 51, 66 ,, plus 1filll -1; 1, 14, 17, 42, 56 1, 14, 25, 51, 66 12, 14, 38, 51, 66 ,; plus 1filll -1: 1, 14, 17, 42, 56 1, 14, 25, 51, 66 12, 14, 38, 51, 66 ,: plus 1filll -1.plus 1filll 1, 14, 17, 42, 56 1, 14, 25, 51, 66 12, 14, 38, 51, 66 ,.-50 1, 14, 17, 42, 56 1, 14, 25, 51, 66 12, 14, 38, 51, 66 , plus 1filll-1.

SUM_PREFIX(B, SEGMENT=S, EXCLUSIVE=.TRUE.) is , 0, 11, 0, 0, 0 0, 13, 0, 4, 5 0, 20, 8, 0, 0 ,, plus 1filll -1; 0, 11, 0, 0, 0 0, 13, 0, 4, 5 0, 20, 8, 0, 0 ,; plus 1filll -1: 0, 11, 0, 0, 0 0, 13, 0, 4, 5 0, 20, 8, 0, 0 ,: plus 1filll -1.plus 1filll 0, 11, 0, 0, 0 0, 13, 0, 4, 5 0, 20, 8, 0, 0 ,.-50 0, 11, 0, 0, 0 0, 13, 0, 4, 5 0, 20, 8, 0, 0 , plus 1filll-1.

SUM_PREFIX(B, SEGMENT=S, EXCLUSIVE=.FALSE.) is , 1, 13, 3, 4, 5 6, 20, 8, 13, 15 11, 32, 21, 14, 15 ,, plus 1filll -1; 1, 13, 3, 4, 5 6, 20, 8, 13, 15 11, 32, 21, 14, 15 ,; plus 1filll -1: 1, 13, 3, 4, 5 6, 20, 8, 13, 15 11, 32, 21, 14, 15 ,: plus 1filll -1.plus 1filll 1, 13, 3, 4, 5 6, 20, 8, 13, 15 11, 32, 21, 14, 15 ,.-50 1, 13, 3, 4, 5 6, 20, 8, 13, 15 11, 32, 21, 14, 15 , plus 1filll-1.

SUM_PREFIX(B, EXCLUSIVE=.TRUE.) is , 0, 18, 39, 63, 90 1, 20, 42, 67, 95 7, 27, 50, 76, 105 ,, plus 1filll -1; 0, 18, 39, 63, 90 1, 20, 42, 67, 95 7, 27, 50, 76, 105 ,; plus 1filll -1: 0, 18, 39, 63, 90 1, 20, 42, 67, 95 7, 27, 50, 76, 105 ,: plus 1filll -1.plus 1filll 0, 18, 39, 63, 90 1, 20, 42, 67, 95 7, 27, 50, 76, 105 ,.-50 0, 18, 39, 63, 90 1, 20, 42, 67, 95 7, 27, 50, 76, 105 , plus 1filll-1.

SUM_PREFIX(B, EXCLUSIVE=.FALSE.) is , 1, 20, 42, 67, 95 7, 27, 50, 76, 105 18, 39, 63, 90, 120 ,, plus 1filll -1; 1, 20, 42, 67, 95 7, 27, 50, 76, 105 18, 39, 63, 90, 120 ,; plus 1filll -1: 1, 20, 42, 67, 95 7, 27, 50, 76, 105 18, 39, 63, 90, 120 ,: plus 1filll -1.plus 1filll 1, 20, 42, 67, 95 7, 27, 50, 76, 105 18, 39, 63, 90, 120 ,.-50 1, 20, 42, 67, 95 7, 27, 50, 76, 105 18, 39, 63, 90, 120 , plus 1filll-1.

Next:
Array Sorting Functions Up: Library Procedures Previous: Array Combining Scatter

paula@erc.msstate.edu
Thu Dec 8 16:17:11 CST 1994