I'm with John on this one!
I have always felt inferior by not fully taking on all the syntax improvements of Fortran 90/95. So I decided to see what all this was about and am now completely confused. Here is my test program.
real*8 vector1(10),matrix(10,3),matrix2(3,10), vector2(3)
n=10
do i=1,3
vector2(i) = i
enddo
do j=1,10
do i=1,3
matrix(j,i) = i+j**2
matrix2(i,j) = matrix(j,i)
enddo
enddo
1000 format(3f12.3)
print 1000,vector2,((matrix(j,i),i=1,3),j=1,10)
! try the syntax both ways for both vector and matrix
! try changing do loop upper bound to 10 and it crashes on the line
! following the do loop - something is carried over!
do i=1,9
print *,i,dot_product( vector2, matrix(i,:) )
print *,i,dot_product( matrix(i,:), vector2 )
print *,i,dot_product( matrix2(:,i), vector2 )
print *,i,dot_product( vector2, matrix2(:,i) )
enddo
print *,'===================='
print *,( dot_product( vector2, matrix(i,:) ), i=1,1 )
print *,'===================='
vector1 = (/ ( dot_product( vector2, matrix(i,:) ), i=1,N ) /)
print *,'vector1',vector1
print *,'===================='
print *,( dot_product( vector2, matrix(i,:) ), i=1,2 )
print *,'===================='
vector1 = (/ ( dot_product( vector2, matrix(i,:) ), i=1,N ) /)
print *,'vector1',vector1
print *,'===================='
print *,( dot_product( vector2, matrix(i,:) ), i=1,3 )
print *,'===================='
vector1 = (/ ( dot_product( vector2, matrix(i,:) ), i=1,N ) /)
print *,'vector1',vector1
print *,'===================='
print *,( dot_product( vector2, matrix(i,:) ), i=1,4 )
print *,'===================='
vector1 = (/ ( dot_product( vector2, matrix(i,:) ), i=1,N ) /)
print *,'vector1',vector1
end