Files
SAPFOR/projects/dvm_svn/fdvm/trunk/examples/task2j.fdv
2025-03-25 21:09:33 +03:00

131 lines
4.2 KiB
Plaintext

PROGRAM TASK2J
PARAMETER (L=8, ITMAX=20)
REAL A(L,L), EPS,EPS1, MAXEPS, B(L,L),A1(L,L),B1(L,L)
INTEGER LP(2),HP(2)
CDVM$ PROCESSORS P(NUMBER_OF_PROCESSORS())
CDVM$ TASK MB( 2 )
CDVM$ ALIGN B1( I, J ) WITH A1( I, J )
CDVM$ ALIGN B ( I, J ) WITH A ( I, J )
CDVM$ DISTRIBUTE :: A, A1
PRINT *, '********** TEST_TASK2J ***********'
CALL DPT(LP,HP,2)
CDVM$ MAP MB( 1 ) ONTO P( LP( 1) : HP(1))
CDVM$ REDISTRIBUTE A ( *, BLOCK ) ONTO MB( 1 )
CDVM$ MAP MB( 2 ) ONTO P( LP(2) : HP(2) )
CDVM$ REDISTRIBUTE A1( *, BLOCK ) ONTO MB( 2 )
MAXEPS = 0.5E - 7
CDVM$ TASK_REGION MB
CDVM$ ON MB( 1 )
CDVM$ PARALLEL (J,I) ON A(I, J)
C nest of two parallel loops, iteration (i,j) will be executed on
C processor, which is owner of element A(i,j)
DO 1 J = 1, L
DO 1 I = 1, L
A(I, J) = 0.
IF(I.EQ.1 .OR. J.EQ.1 .OR. I.EQ.L .OR. J.EQ.L) THEN
B(I, J) = 0.
ELSE
B(I, J) = ( 1. + I + J )
ENDIF
1 CONTINUE
DO 2 IT = 1, ITMAX
EPS = 0.
CDVM$ PARALLEL (J, I) ON A(I, J), REDUCTION ( MAX( EPS ))
C variable EPS is used for calculation of maximum value
DO 21 J = 2, L-1
DO 21 I = 2, L-1
EPS = MAX ( EPS, ABS( B( I, J) - A( I, J)))
A(I, J) = B(I, J)
21 CONTINUE
CDVM$ PARALLEL (J, I) ON B(I, J), SHADOW_RENEW (A)
C Copying shadow elements of array A from
C neighbouring processors before loop execution
DO 22 J = 2, L-1
DO 22 I = 2, L-1
B(I, J) = (A( I-1, J ) + A( I, J-1 ) + A( I+1, J)+
* A( I, J+1 )) / 4
22 CONTINUE
IF ( EPS . LT . MAXEPS ) GO TO 3
2 CONTINUE
3 OPEN (1, FILE='JACOBI1.DAT',FORM='FORMATTED',STATUS='UNKNOWN')
WRITE (1,200) IT, EPS
200 FORMAT(' IT = ',I4, ' EPS = ', E14.7)
CLOSE (1)
CDVM$ END ON
CDVM$ ON MB( 2 )
CDVM$ PARALLEL (J,I) ON A1(I, J)
C nest of two parallel loops, iteration (i,j) will be executed on
C processor, which is owner of element A1(i,j)
DO 19 J = 1, L
DO 19 I = 1, L
A1(I, J) = 0.
IF(I.EQ.1 .OR. J.EQ.1 .OR. I.EQ.L .OR. J.EQ.L) THEN
B1(I, J) = 0.
ELSE
B1(I, J) = ( 1. + I + J )
ENDIF
19 CONTINUE
DO 29 IT = 1, ITMAX
EPS1 = 0.
CDVM$ PARALLEL (J, I) ON A1(I, J), REDUCTION ( MAX( EPS1 ))
C variable EPS1 is used for calculation of maximum value
DO 219 J = 2, L-1
DO 219 I = 2, L-1
EPS1 = MAX ( EPS1, ABS( B1( I, J) - A1( I, J)))
A1(I, J) = B1(I, J)
219 CONTINUE
CDVM$ PARALLEL (J, I) ON B1(I, J), SHADOW_RENEW (A1)
C Copying shadow elements of array A1 from
C neighbouring processors before loop execution
DO 229 J = 2, L-1
DO 229 I = 2, L-1
B1(I, J) = (A1( I-1, J ) + A1( I, J-1 ) + A1(I+1, J)+
* A1( I, J+1 )) / 4
229 CONTINUE
IF ( EPS1 . LT . MAXEPS ) GO TO 39
29 CONTINUE
39 OPEN (2, FILE='JACOBI2.DAT',FORM='FORMATTED',STATUS='UNKNOWN')
WRITE (2,200) IT, EPS1
CLOSE (2)
CDVM$ END ON
CDVM$ END TASK_REGION
PRINT *, ' B'
PRINT *, B
PRINT *, ' '
PRINT *, ' B1'
PRINT *, B1
END
SUBROUTINE DPT(LP,HP,NT)
C distributing processors for NT tasks (NT = 2)
INTEGER LP(2), HP(2)
NUMBER_OF_PROCESSORS() = 1
CDVM$ DEBUG 1 (D = 0)
NP = NUMBER_OF_PROCESSORS()
NTP = NP/NT
IF(NP.EQ.1) THEN
LP(1) = 1
HP(1) = 1
LP(2) = 1
HP(2) = 1
ELSE
LP(1) = 1
HP(1) = NTP
LP(2) = NTP+1
HP(2) = NP
END IF
CDVM$ ENDDEBUG 1
END