...
REAL, DIMENSION :: a(-3:4, 7)
REAL, DIMENSION :: b(8, 2:8)
NTEGER :: c
IREAL, DIMENSION :: d(8, 1:8)
...
where:
REAL, DIMENSION(-3:4, 7) :: ra, rb
INTEGER, DIMENSION (3) :: ia = (/ 1, 2, 3 /), &
ib = (/ (i, i = 1, 3) /)
LOGICAL, DIMENSION (SIZE(loga)) :: logb
REAL, DIMENSION (:, :), ALLOCATABLE :: a, b
REAL, DIMENSION (:, :, :) :: a, b
REAL a(20), b(20), c(20)
...
DO 10 i = 1, 20
a(i) = 0.0
10 CONTINUE
...
DO 20 i = 1, 20
a(i) = a(i) / 3.1 + b(i) * SQRT(c(i))
20 CONTINUE
REAL, DIMENSION (20) :: a, b, c
...
a = 0.0
...
a = a / 3.1 + b * SQRT(c)
REAL a(5, 5), b(5, 5), c(5, 5)
...
DO 20 i = 1, 5
DO 10 j = 1, 5
c(j, i) = a(j, i) * b(j, i)
10 CONTINUE
20 CONTINUE
REAL, DIMENSION (5, 5) :: a, b, c
...
c = a * b
REAL, DIMENSION (10, 10, 10) :: a
amax = MAXVAL(a, MASK = (a < 1000))
Find average value > 3000 in an array:
av = SUM(a, MASK = (a > 3000)) / &
COUNT(MASK=(a> 3000))
! To find square root of all elements of array, a
a = SQRT(a)
! To find the string length excluding trailing blanks
! for all elements of a character array, ch
length = LEN_TRIM(ch)
REAL DIMENSION (5, 5) :: ra, rb
...
WHERE (rb > 0.0) ra = ra / rb
REAL DIMENSION (5, 5) :: ra, rb
...
WHERE (rb > 0.0)
ra = ra / rb
ELSEWHERE
ra = 0.0
END WHERE
a (2, 3, 1) ! single array element
REAL, DIMENSION (5, 5) :: ra
REAL, DIMENSION (5, 5) :: ra
(/ 3, 2, 12, 2, 1 /)
...
REAL, DIMENSION :: ra(6), rb(3)
INTEGER, DIMENSION (3) :: iv
iv = (/ 1, 3, 5 /) ! rank 1 integer expression
ra = (/ 1.2, 3.4, 3.0, 11.2, 1.0, 3.7 /)
rb = ra(iv) ! iv is the vector subscript
! = (/ ra(1), ra(3), ra(5) /)
! = (/ 1.2, 3.0, 1.0 /)
...
iv = (/ 1, 3, 5 /)
ra(iv) = (/ 1.2, 3.4, 5.6 /)
! = ra( (/ 1, 3, 5 /) ) = (/ 1.2, 3.4, 5.6 /)
iv = (/ 1, 3, 1 /)
ra(iv) = (/ 1.2, 3.4, 5.6 /) ! not permitted
! = ra((/ 1, 3, 1 /)) = (/ 1.2, 3.4, 5.6 /)
iv = (/ 1, 3, 5 /)
ra(iv) = (/ 1.2, 3.4, 5.6 /) ! permitted
REAL, DIMENSION (5, 5) :: ra, rb, rc
INTEGER :: id
...
ra = rb + rc * id ! Shape(/ 5, 5 /)
ra(3:5, 3:4) = rb(1::2, 3:5:2) + rc(1:3, 1:2)
! Shape(/ 3, 2 /)
ra(:, 1) = rb(:, 1) + rb(:, 2) + rb(:, 3)
! Shape(/ 5 /)
DO i=2,n
x(i) = x(i) + x(i-1) (1)
END DO
is not the same as:
x(2:n) = x(2:n) + x(1:n-1) (2)
x(i) = x(i) + x(i-1) + x(i-2) + ... + x(1)
x(2:n) = (/ (SUM(1:i), i = 2, n) /)
REAL, DIMENSION (1:8) :: ra
REAL, DIMENSION (-3:4) :: rb
INTEGER, DIMENSION (1) :: locmax1, locmax2
REAL :: max1, max2
ra = (/ 1.2, 3.4, 5.4, 11.2, 1.0, 3.7, 1.0, 1.0/)
rb = ra
! To find the location of max value
locmax1 = MAXLOC(ra) ! = (/ 4 /)
locmax2 = MAXLOC(rb) ! = (/ 4 /)
! To find maximum value from the location
max1 = ra(locmax1(1))
! OK, because ra defined with 1 as lower bound
max2 = rb(LBOUND(rb) + locmax2(1) - 1)
! general form required when lower bound xb9 1
INTEGER, PARAMETER :: n = 10
REAL, DIMENSION (n, n) :: a
REAL, DIMENSION (n) :: b, x
...
DO i = 1, n
x(i) = b(i) / a(i, i)
b(i+1:n) = b(i+1:n) - a(i+1:n, i) * x(i)
! zero-sized when i = n
END DO
REAL, DIMENSION (6) :: a, b
a = (/ array-constructor-value-list /)
RESHAPE(SOURCE, SHAPE [,PAD] [,ORDER])
REAL, DIMENSION (3, 2) :: ra
ra = RESHAPE( (/ ((i + j, i = 1, 3), j = 1, 2) /), &
SHAPE = (/ 3, 2 /) )
2 3
3 4 Shape(/ 3, 2 /)
4 5
...
REAL, DIMENSION (:, :), ALLOCATABLE :: ra
...
READ (*, *) nsize1, nsize2
ALLOCATE (ra(nsize1, nsize2))
...
IF (ALLOCATED(ra)) DEALLOCATE (ra)
...
SUBROUTINE sub(n, a)
INTEGER :: n
REAL, DIMENSION(n, n) :: a
REAL, DIMENSION (n, n) :: work1
REAL, DIMENSION (SIZE(a, 1)) :: work2
...
END SUBROUTINE sub
MODULE auto_mod
INTEGER :: n
CONTAINS
SUBROUTINE sub
REAL, DIMENSION(n) :: w
WRITE (*, *) 'Bounds and size of a: ', &
LBOUND(w), UBOUND(w), SIZE(w)
END SUBROUTINE sub
END MODULE auto_mod
PROGRAM auto_arrays
! automatic arrays using modules instead of
! procedure dummy arguments
USE auto_mod
IMPLICIT NONE
n = 10
CALL sub
END PROGRAM auto_arrays
PROGRAM array
REAL, ALLOCATABLE, DIMENSION (:, :) :: a
...
READ (*, *) n1
ALLOCATE (a(n1, n1))
CALL sub(a, n1, res)
DEALLOCATE(a)
...
END
SUBROUTINE sub(a, n1, res)
REAL, DIMENSION (n1, n1) :: a
REAL, DIMENSION(n1, n1) :: work
...
res = a(...)
...
END SUBROUTINE sub
... ! calling program unit
INTERFACE
SUBROUTINE sub (ra, rb, rc)
REAL, DIMENSION (:, :) :: ra, rb
REAL, DIMENSION (0:, 2:) :: rc
END SUBROUTINE sub
END INTERFACE
REAL, DIMENSION (0:9,10) :: ra ! Shape (/ 10, 10 /)
...
CALL sub(ra, ra(0:4, 2:6), ra(0:4, 2:6))
...
SUBROUTINE sub(ra, rb, rc) ! External
REAL, DIMENSION (:, :) :: ra ! Shape (/10, 10/)
REAL, DIMENSION (:, :) :: rb ! Shape (/ 5, 5 /)
! = REAL, DIMENSION (1:5, 1:5) :: rb
REAL, DIMENSION (0:, 2:) :: rc ! Shape (/ 5, 5 /)
! = REAL, DIMENSION (0:4, 2:6) :: rc
...
END SUBROUTINE sub
PROGRAM array
REAL, ALLOCATABLE, DIMENSION(:, :) :: a
INTERFACE
...
READ (*, *) n1
ALLOCATE ( a(n1, n1) ) ! allocatable
CALL sub(a, res)
DEALLOCATE(a)
...
END
SUBROUTINE sub(a, res)
REAL, DIMENSION (:, :) :: a ! assumed shape
REAL, DIMENSION (SIZE(a, 1),SIZE(a, 2)) :: work
! automatic
...
res = a(...)
...
END SUBROUTINE sub
85 76 90 60
score(1:3,1:4) = 71 45 50 80
66 45 21 55
MAXVAL (score) ! = 90
MAXVAL (score, DIM = 2)
! = (/ 90, 80, 66 /)
MAXLOC (MAXVAL (score, DIM = 2))
! = MAXLOC((/ 90, 80, 66 /)) = (/ 1 /)
average = SUM (score) / SIZE (score) ! = 62
! average is an INTEGER variable
above = score > average
! above(3, 4) is a LOGICAL array
! T T T F
! above = T F F T
! T F F F
n_gt_average = COUNT (above) ! = 6
! n_gt_average is an INTEGER variable
...
INTEGER, ALLOCATABLE, DIMENSION (:) :: &
score_gt_average
...
ALLOCATE (score_gt_average(n_gt_average))
scores_gt_average = PACK (score, above)
! = (/ 85, 71, 66, 76, 90, 80 /)
ANY (ALL (above, DIM = 2)) ! = .FALSE.
ANY (ALL (above, DIM = 1)) ! = .TRUE.
PROGRAM conjugate_gradients
IMPLICIT NONE
INTEGER :: iters, its, n
LOGICAL :: converged
REAL :: tol, up, alpha, beta
REAL, ALLOCATABLE :: a(:,:), b(:), x(:), r(:), &
u(:), p(:), xnew(:)
READ (*,*) n, tol, its
ALLOCATE ( a(n,n), b(n), x(n), r(n), u(n), &
p(n), xnew(n) )
OPEN (10, FILE='data')
READ (10,*) a
READ (10,*) b
x = 1.0
r = b - MATMUL(a,x)
p = r
iters = 0
DO
iters = iters + 1
u = MATMUL(a, p)
up = DOT_PRODUCT(r, r)
alpha = up / DOT_PRODUCT(p, u)
xnew = x + p * alpha
r = r - u * alpha
beta = DOT_PRODUCT(r, r) / up
p = r + p * beta
converged = ( MAXVAL(ABS(xnew-x)) / &
MAXVAL(ABS(x)) < tol )
x = xnew
IF (converged .OR. iters == its) EXIT
END DO
WRITE (*,*) iters
WRITE (*,*) x
END PROGRAM conjugate_gradients