45
46
47
49
50
51
52 USE spmd_comm_world_mod, ONLY : spmd_comm_world
53#include "implicit_f.inc"
54
55
56
57#include "units_c.inc"
58
59
60
61#include "spmd.inc"
62
63
64
65 INTEGER, INTENT(IN) :: NCYCLE
66 INTEGER, INTENT(IN) :: ISPMD
67 INTEGER, INTENT(IN) :: NSPMD
68 INTEGER, INTENT(IN) :: NUMNOD
69 INTEGER, INTENT(IN) :: NUMNODG
70 INTEGER, INTENT(IN) :: NUMNODM
71 INTEGER, INTENT(IN) :: ITAB(NUMNOD)
72 INTEGER, INTENT(IN) :: WEIGHT(NUMNOD)
73 INTEGER, INTENT(IN) :: NODGLOB(NUMNOD)
74 my_real,
INTENT(IN) :: a(3,numnod)
75
76
77
78#ifdef MPI
79 INTEGER STATUS(MPI_STATUS_SIZE),IERROR
80#endif
81
82 INTEGER :: MSGOFF,MSGOFF0,MSGTYP
83 INTEGER :: I,K,N,NODE_GLOBAL_ID
84 INTEGER, DIMENSION(:), ALLOCATABLE :: NODES_TO_SEND
85 DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: AGLOB,NODES_TO_RECV
86 INTEGER :: CHECKSUM
87 DATA msgoff0/176/
88 DATA msgoff/177/
89
90
91
92
93 IF(ispmd == 0) THEN
94 ALLOCATE(nodes_to_recv(4,numnodg))
95 ENDIF
96
97 ALLOCATE(nodes_to_send(
max(numnod,numnodm)))
98 ALLOCATE(aglob(4,
max(numnodm,numnod)))
99
100 IF (ispmd/=0) THEN
101#ifdef MPI
102 n = 0
103 DO i = 1, numnod
104 IF (weight(i)==1) THEN
105 n = n+1
106 nodes_to_send(n) = nodglob(i)
107 aglob(1,n) = itab(i)
108 aglob(2,n) = a(1,i)
109 aglob(3,n) = a(2,i)
110 aglob(4,n) = a(3,i)
111 END IF
112 END DO
113 msgtyp=msgoff0
114 CALL mpi_send(nodes_to_send,n,mpi_integer,
115 . 0,msgtyp,
116 . spmd_comm_world,ierror)
117 msgtyp=msgoff
118 CALL mpi_send(aglob,4*n,mpi_double_precision,
119 . 0,msgtyp,
120 . spmd_comm_world,ierror)
121#endif
122 ELSE
123
124 DO i=1,numnod
125 IF (weight(i)==1) THEN
126 node_global_id = nodglob(i)
127 nodes_to_recv(1,node_global_id) = itab(i)
128 nodes_to_recv(2,node_global_id) = a(1,i)
129 nodes_to_recv(3,node_global_id) = a(2,i)
130 nodes_to_recv(4,node_global_id) = a(3,i)
131 ENDIF
132 ENDDO
133#ifdef MPI
134 DO k=2,nspmd
135 msgtyp=msgoff0
136 CALL mpi_recv(nodes_to_send,numnodm,mpi_integer,
137 . k-1,msgtyp,
138 . spmd_comm_world,status,ierror)
140 msgtyp=msgoff
141 CALL mpi_recv(aglob,4*n,mpi_double_precision,
142 . k-1,msgtyp,
143 . spmd_comm_world,status,ierror)
144 DO i=1,n
145 node_global_id = nodes_to_send(i)
146 nodes_to_recv(1,node_global_id) = aglob(1,i)
147 nodes_to_recv(2,node_global_id) = aglob(2,i)
148 nodes_to_recv(3,node_global_id) = aglob(3,i)
149 nodes_to_recv(4,node_global_id) = aglob(4,i)
150 ENDDO
151
152 END DO
153#endif
155 WRITE(iout,*) ncycle,
"CHECKSUM:",
checksum
156
157 ENDIF
158 IF(ALLOCATED(nodes_to_send)) DEALLOCATE(nodes_to_send)
159 IF(ALLOCATED(aglob)) DEALLOCATE(aglob)
160 IF(ALLOCATED(nodes_to_recv)) DEALLOCATE(nodes_to_recv)
161 RETURN
subroutine mpi_recv(buf, cnt, datatype, source, tag, comm, status, ierr)
subroutine mpi_get_count(status, datatype, cnt, ierr)
subroutine mpi_send(buf, cnt, datatype, dest, tag, comm, ierr)
integer function double_array_checksum(a, siz1, siz2)