HP Fortran Programmer's Reference (September 2007)

Program units and procedures
Modules
Chapter 7196
x = 0.0
RETURN
END IF
! perform back substitution to obtain the solution
CALL back_substitution (m, x)
END SUBROUTINE solve_linear_equations
SUBROUTINE factor (m, error)
! Factor m in place into a lower and upper triangular
! matrix using partial pivoting
! Set error to true if a pivot element is zero; Perform
! forward substitution with the lower triangle on the
! right-hand side m(:,n+1)
REAL (adequate), DIMENSION (:, :), INTENT (INOUT) :: m
LOGICAL, INTENT (OUT) :: error
INTEGER, DIMENSION (1) :: max_loc
REAL (adequate), DIMENSION (SIZE (m, DIM=2)) :: temp_row
INTEGER :: n, k
INTRINSIC MAXLOC, SIZE, SPREAD, ABS
n = SIZE (m, DIM=1)
triang_loop: DO k = 1, n
max_loc = MAXLOC (ABS (m (k:n, k)))
temp_row (k:n+1) = m (k, k:n+1)
m (k, k:n+1) = m (k-1+max_loc(1), k:n+1)
m (k-1+max_loc(1), k:n+1) = temp_row (k:n+1)
IF (m (k, k) == 0) THEN
error = .TRUE.
EXIT triang_loop
ELSE
m (k, k:n+1) = m (k, k:n+1) / m (k, k)
m (k+1:n, k+1:n+1) = m (k+1:n, k+1:n+1) - &
SPREAD (m (k, k+1:n+1), 1, n-k) * &
SPREAD (m (k+1:n, k), 2, n-k+1)
END IF
END DO triang_loop
END SUBROUTINE factor
SUBROUTINE back_substitution (m, x)
! Perform back substitution on the upper triangle to compute
! the solution
REAL (adequate), DIMENSION (:, :), INTENT (IN) :: m
REAL (adequate), DIMENSION (:), INTENT (OUT) :: x
INTEGER :: n, k
INTRINSIC SIZE, SUM
n = SIZE (m, DIM=1)
DO k = n, 1, -1
x (k) = m (k, n+1) - SUM (m (k, k+1:n) * x (k+1:n))