ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ
112
END +IF
IF (IAM.EQ.NPROCS-1) THEN
right = MPI_PROC_NULL
ELSE
right = IAM+1
END IF
tag = 100
itcnt = 0
converged = .FALSE.
С цикл по итерациям
DO k = 1,itmax
diffnorm = 0.0
itcnt = itcnt + 1
С вычисление новых значений функции по 5-точечной схеме
DO j = 1, m
DO i = 1, n
B(i,j)=0.25*(A(i-1,j)+A(i+1,j)+A(i,j-1)+A(i,j+1))
diffnorm = diffnorm + (B(i,j)-A(i,j))**2
END DO
END DO
С переприсваивание внутренних точек области
DO j = 1, m
DO i = 1, n
A(i,j) = B(i,j)
END DO
END DO
С пересылка граничных значений в соседние процессоры
CALL MPI_SENDRECV(B(1,1), n, MPI_DOUBLE_PRECISION, left,
$ tag, A(1,0), n, MPI_DOUBLE_PRECISION, left, tag,
$ MPI_COMM_WORLD,status, ierr)
CALL MPI_SENDRECV(B(1,m), n, MPI_DOUBLE_PRECISION, right,
$ tag, A(1,m+1), n, MPI_DOUBLE_PRECISION, right, tag,
$ MPI_COMM_WORLD, status, ierr)
С вычисление невязки и проверка условия достижения сходимости
CALL MPI_Allreduce( diffnorm, gdiffnorm, 1,
$ MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD, ierr )
gdiffnorm = sqrt( gdiffnorm)
converged = gdiffnorm.LT.eps
if(converged) goto 777
END DO
777 continue
time = MPI_Wtime() - time
IF(IAM.EQ.0) then
WRITE(*,*) ' At iteration ', itcnt, 'а diff is ', gdiffnorm
WRITE(*,*) ' Time calculation: ', time
END IF
CALL MPI_Finalize(ierr)
stop
end
1...,104,105,106,107,108,109,110,111,112,113 115,116,117,118,119,120,121,122,123,124,...180