tags:

views:

52

answers:

1

Is there a nice way to write a Fortran ASSOCIATE statement to turn this

FORALL (i = 2:n-2)
    v(:,i) = v(:,i) + MATMUL(A, &
             c(2)*u(:,i-2) + c(1)*u(:,i-1) + c(0)*u(:,i) + c(1)*u(:,i+1) + c(2)*u(:,i+2))
END FORALL

into something like the following

ASSOCIATE ( U => ..., V => ...)
    FORALL (i = 2:n-2)
        V(i) = V(i) + MATMUL(A, &
               c(2)*U(i-2) + c(1)*U(i-1) + c(0)*U(i) + c(1)*U(i+1) + c(2)*U(i+2))
    END FORALL
END ASSOCIATE

I'm staring at Adams et al's The Fortran 2003 Handbook section 8.2, but I can't see how to write the associate-name => selector construct to allow for indexed access into the associate-name.

Obviously what I'm going for is overkill for a couple of lines. I've got a bunch of 'em that I'd like to condense.

A: 

Unless I'm misreading things, I don't think this is possible. The specification says (section 8.1.4.3):

Within a SELECT TYPE or ASSOCIATE construct, each associating entity has the same rank as its associated selector.

and as far as I can see, you want a rank 1 associating entity (V) and will need a rank 2 associated selector (to hold v).

Andrew Walker
Thanks for the answer Andrew. Short of playing preprocessor games, is there any standard idiom to accomplish what I'm after?
Rhys Ulerich
@Rhys: I think that the idiom would be to use pointers to array sections, but I don't think that that is going to make your code more comprehensible or neater or shorter, which seem to be your objectives.
High Performance Mark
@Mark: I completely agree with pointers to array sections not making it any nicer. Thanks fellas.
Rhys Ulerich