33
34
35
36
37
38
39
40
41
42
43
44
46
47
48
49#include "implicit_f.inc"
50
51
52
53#include "spmd.inc"
54
55
56
57#include "com01_c.inc"
58#include "com04_c.inc"
59#include "param_c.inc"
60#include "task_c.inc"
61
62
63
64 INTEGER, INTENT(in) :: NB_INTER_SORTED
65 INTEGER, DIMENSION(NB_INTER_SORTED), INTENT(in) :: LIST_INTER_SORTED
66 INTEGER, INTENT(in) :: MODE
67 INTEGER, DIMENSION(NINTER+1,NSPMD+1), INTENT(in) :: ISENDTO,IRECVFROM
68 INTEGER, DIMENSION(NPARI,NINTER), INTENT(in) :: IPARI
69 TYPE(sorting_comm_type), DIMENSION(NINTER), INTENT(inout) ::
70 INTEGER, INTENT(inout) :: NB_REQUEST_COARSE_CELL
71 INTEGER, DIMENSION(NB_INTER_SORTED), INTENT(inout) :: ARRAY_REQUEST_COARSE_CELL
72 INTEGER, DIMENSION(NB_INTER_SORTED), INTENT(inout) :: LIST_INTER_COARSE_CELL
73
74
75
76#ifdef MPI
77 INTEGER :: KK,NIN,I,
78 INTEGER :: P,P_LOC,LOCAL_RANK
79 INTEGER :: MY_SIZE,OLD_POINTER
80 INTEGER :: ADRESS,SHIFT_
81
82 INTEGER IERROR1,STATUS(MPI_STATUS_SIZE),IERROR
83 INTEGER :: SIZE_CELL_LIST,TOTAL_RCV_SIZE,TOTAL_SEND_SIZE
84 INTEGER :: LOC_PROC,ID_PROC
85 INTEGER :: COUNT_COMM_SIZE_CELL,ID_COMM
86 INTEGER :: ITIED
87
88 loc_proc = ispmd + 1
89
90
91 IF(mode==1) THEN
92 nb_request_coarse_cell = 0
93 DO kk=1,nb_inter_sorted
94 nin = list_inter_sorted(kk)
95 array_request_coarse_cell(kk) = mpi_request_null
96 IF(sort_comm(nin)%PROC_NUMBER>nspmd/2) THEN
97 IF(irecvfrom(nin,loc_proc)==0.AND.isendto(nin,loc_proc)==0) cycle
98
99 IF(.NOT.ALLOCATED(sort_comm(nin)%SEND_SIZE_COARSE_CELL)) THEN
100 my_size = sort_comm(nin)%PROC_NUMBER
101 ALLOCATE(sort_comm(nin)%SEND_SIZE_COARSE_CELL(my_size))
102 ENDIF
103
104 IF(.NOT.ALLOCATED(sort_comm(nin)%RCV_SIZE_COARSE_CELL)) THEN
105 my_size = sort_comm(nin)%PROC_NUMBER
106 ALLOCATE(sort_comm(nin)%RCV_SIZE_COARSE_CELL(my_size))
107 ENDIF
108
109 IF(.NOT.ALLOCATED(sort_comm(nin)%SEND_DISPLS_COARSE_CELL)) THEN
110 my_size = sort_comm(nin)%PROC_NUMBER
111 ALLOCATE(sort_comm(nin)%SEND_DISPLS_COARSE_CELL(my_size))
112 ENDIF
113
114 IF(.NOT.ALLOCATED(sort_comm(nin)%RCV_DISPLS_COARSE_CELL)) THEN
115 my_size = sort_comm(nin)%PROC_NUMBER
116 ALLOCATE(sort_comm(nin)%RCV_DISPLS_COARSE_CELL(my_size))
117 ENDIF
118
119
120
121 total_rcv_size = 0
122 DO i=1,sort_comm(nin)%PROC_NUMBER
123 id_proc = sort_comm(nin)%PROC_LIST(i)
124 sort_comm(nin)%SEND_SIZE_COARSE_CELL(i) = 0
125 IF(isendto(nin,loc_proc)>0.AND.irecvfrom(nin,id_proc)>0) THEN
127 ENDIF
128 sort_comm(nin)%SEND_DISPLS_COARSE_CELL(i) = 0
129
130 sort_comm(nin)%RCV_SIZE_COARSE_CELL(i) = 0
131 IF(irecvfrom(nin,loc_proc)>0.AND.isendto(nin,id_proc)>0) THEN
133 ENDIF
134 sort_comm(nin)%RCV_DISPLS_COARSE_CELL(i) = total_rcv_size
135 IF(irecvfrom(nin,loc_proc)>0.AND.isendto(nin,id_proc)>0) THEN
137 ENDIF
138 ENDDO
139
140 IF(.NOT.ALLOCATED(sort_comm(nin)%GLOBAL_COARSE_CELL ) )THEN
141 ALLOCATE(sort_comm(nin)%GLOBAL_COARSE_CELL(total_rcv_size))
142 ENDIF
143 sort_comm(nin)%SIZE_GLOBAL_COARSE_CELL = total_rcv_size
144
146
147 nb_request_coarse_cell = nb_request_coarse_cell + 1
148 list_inter_coarse_cell(nb_request_coarse_cell) = nin
149
151 . sort_comm(nin)%GLOBAL_COARSE_CELL,sort_comm(nin)%SEND_SIZE_COARSE_CELL,total_send_size,
152 . sort_comm(nin)%SEND_DISPLS_COARSE_CELL,
153 . total_rcv_size,sort_comm(nin)%RCV_SIZE_COARSE_CELL,
154 . sort_comm(nin)%RCV_DISPLS_COARSE_CELL,array_request_coarse_cell(nb_request_coarse_cell),
155 . sort_comm(nin)%COMM,sort_comm(nin)%PROC_NUMBER)
156 ENDIF
157 ENDDO
158 ENDIF
159
160
161
162 IF(mode==2) THEN
163 DO kk=1,nb_request_coarse_cell
164 CALL mpi_wait(array_request_coarse_cell(kk),status,ierror)
165 nin = list_inter_coarse_cell(kk)
166 itied = ipari(85,nin)
168
169 DEALLOCATE( sort_comm(nin)%GLOBAL_COARSE_CELL )
170 DEALLOCATE( sort_comm(nin)%COARSE_GRID )
171 ENDDO
172 nb_request_coarse_cell = 0
173 ENDIF
174
175
176#endif
subroutine check_coarse_grid(nin, main_coarse_grid, sort_comm, itied)
subroutine mpi_wait(ireq, status, ierr)
integer, parameter nb_box_coarse_grid
subroutine spmd_ialltoallv_int(sendbuf, recvbuf, send_size, total_send_size, sdispls, total_rcv_size, rcv_size, rdispls, request, comm, nb_proc)