PROGRAM PARALLEL_JACOBI
        INTEGER CAP_LEFT, CAP_RIGHT
        PARAMETER (CAP_LEFT=-1, CAP_RIGHT=-2)
        REAL T(0:1001), TNEW(1000), TOL
        INTEGER N, CAP_LT, CAP_HT
        EXTERNAL CAP_RMAX
        REAL CAP_RMAX
        INTEGER CAP_PROCNUM, CAP_NPROC
        COMMON /CAP_TOOLS/CAP_PROCNUM, CAP_NPROC

        
CALL CAP_INIT
        TOL=1.0E-5
        IF (CAP_PROCNUM.EQ.1)PRINT*, 'Enter N'
        IF (CAP_PROCNUM.EQ.1)READ*, N
        CALL CAP_RECEIVE(N, 1, 1, CAP_LEFT)
        CALL CAP_SEND(N, 1, 1, CAP_RIGHT)
        
CALL CAP_SETUPPART(1, N, CAP_LT, CAP_HT)
        DO I = MAX(1, CAP_LT), MIN(N, CAP_HT), 1
          T(I) = 0.0
        ENDDO
        IF (1.GE.CAP_LT.AND.1.LE.CAP_HT) T(1) = 1
        IF (N.GE.CAP_LT.AND.N.LE.CAP_HT) T(N) = 100
  40    CONTINUE
        CALL CAP_EXCHANGE(T(CAP_HT+1), T(CAP_LT), 1, 2, CAP_RIGHT)
        CALL CAP_EXCHANGE(T(CAP_LT-1), T(CAP_HT), 1, 2, CAP_LEFT)
       
DO I = MAX(2, CAP_LT), MIN(N-1, CAP_HT), 1
          TNEW(I) = (T(I-1)+T(I+1))/2.0
        ENDDO
        DIFMAX = 0.0
        DO I = MAX(1, CAP_LT), MIN(N, CAP_HT), 1
          DIFF = ABS(TNEW(I)-T(I))
          DIFMAX = MAX(DIFF,DIFMAX)
          T(I) = TNEW(I)
        ENDDO
         CALL CAP_COMMUTATIVE(DIFMAX, 2, CAP_RMAX)
        IF (DIFMAX.GT.TOL) GOTO 40
        DO 50 I = 1, N, 1
          IF (CAP_PROCNUM.EQ.1)WRITE(UNIT=*,FMT=*) TNEW(I)
  50    CONTINUE
        CALL CAP_FINISH()
        END