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) :: SORT_COMM
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 :: MY_SIZE
79
80 INTEGER STATUS(MPI_STATUS_SIZE),IERROR
81 INTEGER :: TOTAL_RCV_SIZE,TOTAL_SEND_SIZE
82 INTEGER :: LOC_PROC,ID_PROC
83 INTEGER :: ITIED
84
85 loc_proc = ispmd + 1
86
87
88 IF(mode==1) THEN
89 nb_request_coarse_cell = 0
90 DO kk=1,nb_inter_sorted
91 nin = list_inter_sorted(kk)
92 array_request_coarse_cell(kk) = mpi_request_null
93 IF(sort_comm(nin)%PROC_NUMBER>nspmd/2) THEN
94 IF(irecvfrom(nin,loc_proc)==0.AND.isendto(nin,loc_proc)==0) cycle
95
96 IF(.NOT.ALLOCATED(sort_comm(nin)%SEND_SIZE_COARSE_CELL)) THEN
97 my_size = sort_comm(nin)%PROC_NUMBER
98 ALLOCATE(sort_comm(nin)%SEND_SIZE_COARSE_CELL(my_size))
99 ENDIF
100
101 IF(.NOT.ALLOCATED(sort_comm(nin)%RCV_SIZE_COARSE_CELL)) THEN
102 my_size = sort_comm(nin)%PROC_NUMBER
103 ALLOCATE(sort_comm(nin)%RCV_SIZE_COARSE_CELL(my_size))
104 ENDIF
105
106 IF(.NOT.ALLOCATED(sort_comm(nin)%SEND_DISPLS_COARSE_CELL)) THEN
107 my_size = sort_comm(nin)%PROC_NUMBER
108 ALLOCATE(sort_comm(nin)%SEND_DISPLS_COARSE_CELL(my_size))
109 ENDIF
110
111 IF(.NOT.ALLOCATED(sort_comm(nin)%RCV_DISPLS_COARSE_CELL)) THEN
112 my_size = sort_comm(nin)%PROC_NUMBER
113 ALLOCATE(sort_comm(nin)%RCV_DISPLS_COARSE_CELL(my_size))
114 ENDIF
115
116
117
118 total_rcv_size = 0
119 DO i=1,sort_comm(nin)%PROC_NUMBER
120 id_proc = sort_comm(nin)%PROC_LIST(i)
121 sort_comm(nin)%SEND_SIZE_COARSE_CELL(i) = 0
122 IF(isendto(nin,loc_proc)>0.AND.irecvfrom(nin,id_proc)>0) THEN
124 ENDIF
125 sort_comm(nin)%SEND_DISPLS_COARSE_CELL(i) = 0
126
127 sort_comm(nin)%RCV_SIZE_COARSE_CELL(i) = 0
128 IF(irecvfrom(nin,loc_proc)>0.AND.isendto(nin,id_proc)>0) THEN
130 ENDIF
131 sort_comm(nin)%RCV_DISPLS_COARSE_CELL(i) = total_rcv_size
132 IF(irecvfrom(nin,loc_proc)>0.AND.isendto(nin,id_proc)>0) THEN
134 ENDIF
135 ENDDO
136
137 IF(.NOT.ALLOCATED(sort_comm(nin)%GLOBAL_COARSE_CELL ) )THEN
138 ALLOCATE(sort_comm(nin)%GLOBAL_COARSE_CELL(total_rcv_size))
139 ENDIF
140 sort_comm(nin)%SIZE_GLOBAL_COARSE_CELL = total_rcv_size
141
143
144 nb_request_coarse_cell = nb_request_coarse_cell + 1
145 list_inter_coarse_cell(nb_request_coarse_cell) = nin
146
148 . sort_comm(nin)%GLOBAL_COARSE_CELL,sort_comm(nin)%SEND_SIZE_COARSE_CELL,total_send_size,
149 . sort_comm(nin)%SEND_DISPLS_COARSE_CELL,
150 . total_rcv_size,sort_comm(nin)%RCV_SIZE_COARSE_CELL,
151 . sort_comm(nin)%RCV_DISPLS_COARSE_CELL,array_request_coarse_cell(nb_request_coarse_cell),
152 . sort_comm(nin)%COMM,sort_comm(nin)%PROC_NUMBER)
153 ENDIF
154 ENDDO
155 ENDIF
156
157
158
159 IF(mode==2) THEN
160 DO kk=1,nb_request_coarse_cell
161 CALL mpi_wait(array_request_coarse_cell(kk),status,ierror)
162 nin = list_inter_coarse_cell(kk)
163 itied = ipari(85,nin)
165
166 DEALLOCATE( sort_comm(nin)%GLOBAL_COARSE_CELL )
167 DEALLOCATE( sort_comm(nin)%COARSE_GRID )
168 ENDDO
169 nb_request_coarse_cell = 0
170 ENDIF
171
172
173#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)