SUBROUTINE OPERATE (ARG, N, ICODE) IMPLICIT NONE REAL, DIMENSION(:, :) :: ARG REAL, DIMENSION(:, :), ALLOCATABLE :: TEMP INTEGER :: N, ICODE, I IF (N < 0 .OR. UBOUND(ARG, 1) <= 0 .OR. UBOUND(ARG, 2) <= 0 .OR. & UBOUND(ARG, 1) /= UBOUND(ARG, 2)) THEN ICODE = 1 RETURN END IF ALLOCATE(TEMP(UBOUND(ARG, 1), UBOUND(ARG, 2)), STAT=ICODE) IF (ICODE /= 0) RETURN IF (N == 0) THEN ARG = 0.0 DO I = 1, UBOUND(ARG, 1) ARG(I,I) = 1.0 END DO ELSE TEMP = ARG DO I = 1, N-1 ARG = MATMUL(ARG,TEMP) END DO END IF END SUBROUTINE OPERATE