1 SUBROUTINE de_mpi(np, fcn, funcval)
7 REAL(rprec) :: funcval(np)
11 INTEGER :: status(MPI_STATUS_size)
12 INTEGER :: i, j, iflag
13 INTEGER :: numsent, sender, ierr
14 INTEGER :: anstype, column
15 REAL(rprec),
DIMENSION(n_free) :: x
16 REAL(rprec),
DIMENSION(nopt) :: fvec
22 CALL mpi_barrier(mpi_comm_world, ierr)
28 IF (myid .eq. master)
THEN
35 DO j = 1,min(numprocs-1,np)
37 CALL mpi_send(x, n_free, mpi_real8, j,
38 1 j, mpi_comm_world, ierr)
39 IF (ierr .ne. 0) stop
'MPI_SEND error(1) in de_mpi'
48 CALL mpi_recv(fvec, nopt, mpi_real8,
49 1 mpi_any_source, mpi_any_tag,
50 2 mpi_comm_world, status, ierr)
51 IF (ierr .ne. 0) stop
'MPI_RECV error(1) in de_mpi'
52 sender = status(mpi_source)
53 anstype = status(mpi_tag)
54 IF (anstype .gt. np) stop
'ANSTYPE > NP IN de_mpi'
56 funcval(anstype) = sum(fvec(:nopt)**2)
65 IF (numsent .lt. np)
THEN
67 x(:) = ui_xc(numsent,:)
69 CALL mpi_send(x, n_free, mpi_real8,
70 1 sender, numsent, mpi_comm_world, ierr)
71 IF (ierr .ne. 0) stop
'MPI_SEND error(2) in de_mpi'
75 CALL mpi_send(mpi_bottom, 0, mpi_real8,
76 1 sender, 0, mpi_comm_world, ierr)
77 IF (ierr .ne. 0) stop
'MPI_end error(3) in de_mpi'
84 ELSE IF (myid .le. np)
THEN
91 90
CALL mpi_recv(x, n_free, mpi_real8, master,
92 1 mpi_any_tag, mpi_comm_world, status, ierr)
93 IF (ierr .ne. 0) stop
'MPI_RECV error(2) in de_mpi'
95 column = status(mpi_tag)
96 IF (column .eq. 0)
THEN
103 CALL fcn(nopt, n_free, x, fvec, iflag, nfev)
104 IF (iflag.ne.0)
GOTO 300
109 CALL mpi_send(fvec, nopt, mpi_real8, master,
110 1 column, mpi_comm_world, ierr)
111 IF (ierr .ne. 0) stop
'MPI_SEND error(4) in de_mpi'
120 CALL mpi_bcast(funcval, np, mpi_real8, master,
121 1 mpi_comm_world, ierr)
122 IF (ierr .ne. 0)
GOTO 100
127 print *,
' MPI_BCAST error in de_mpi: IERR=', ierr
132 print *,
' IFLAG = ', iflag,
' in de_mpi CALL to fcn'
135 END SUBROUTINE de_mpi