37
38
39
40
41
42
43
44
45
46
47
48
49
51 USE intbufdef_mod
54
55
56
57 USE spmd_comm_world_mod, ONLY : spmd_comm_world
58#include "implicit_f.inc"
59
60
61
62#include "spmd.inc"
63
64
65
66#include "com01_c.inc"
67#include "com04_c.inc"
68#include "task_c.inc"
69#include "param_c.inc"
70#include "impl1_c.inc"
71
72
73
74 integer, intent(in) :: NBINTC
75 integer, dimension(NINTER), intent(in) :: INTLIST
76 integer, dimension(NPARI,NINTER), intent(in) :: IPARI
77 integer,dimension(NINTER+1,NSPMD+1), intent(in) :: ISENDTO,IRCVFROM
78 TYPE(sorting_comm_type), DIMENSION(NINTER), INTENT(inout) :: SORT_COMM
79
80 LOGICAL, INTENT(inout) :: NEED_COMM_INT25_SOLID_EROSION
81 INTEGER, INTENT(inout) :: COMM_INT25_SOLID_EROSION
82
83
84
85
86#ifdef MPI
87
88 INTEGER :: KEY,CODE,I,P
89 INTEGER :: NIN,KK,NTY
90 INTEGER :: COLOR_INACTI,COLOR_INT25_SOLID_EROSION
91 INTEGER :: INACTI,IFQ,ITIED
92 INTEGER :: IDEL,IDELKEEP,ITY,SOLID_EROSION
93
94
95
98
103 need_comm_int25_solid_erosion = .false.
104
105
106 DO kk=1,nbintc
107 nin = intlist(kk)
108 nty =ipari(7,nin)
109
110
111 IF(nty==7) THEN
113 i=0
115 ALLOCATE(sort_comm(nin)%PROC_LIST(nspmd))
118
119 DO p=1,nspmd
120 IF(ircvfrom(nin,p)/=0.or.isendto(nin,p)/=0) THEN
121 i=i+1
123 ENDIF
124 ENDDO
125 sort_comm(nin)%PROC_LIST(1:nspmd) =
comm_tri7vox(nin)%PROC_LIST(1:nspmd)
127 sort_comm(nin)%PROC_NUMBER = i
131
134 ENDDO
135
136 IF(ircvfrom(nin,ispmd+1)==0.and.isendto(nin,ispmd+1)==0) THEN
138 key = 0
139 ELSE
141 key = 1
142 ENDIF
143
148 ENDIF
150 ENDIF
151
152 inacti = ipari(22,nin)
153 ifq = ipari(31,nin)
154 itied = ipari(85,nin)
155 IF(impl_s==0.OR.neig==0) THEN
156 IF( inacti==5.OR.inacti==6.OR.ifq>0.OR.itied/=0)THEN
160 ENDIF
161 ENDIF
162
163 ENDIF
164
165
166
167 solid_erosion = ipari(100,nin)
168 idel = ipari(17,nin)
169 idelkeep = ipari(61,nin)
170 IF(nty==25.AND.ipari(100,nin)>0.AND.idelkeep/=1) THEN
171
172
173 IF(isendto(nin,ispmd+1)>0.OR.ircvfrom(nin,ispmd+1)>0) THEN
174 need_comm_int25_solid_erosion = .true.
175 ENDIF
176
177 ENDIF
178 ENDDO
179
180
181
182
184 color_inacti = 0
185 key = 0
186 ELSE
187 color_inacti = 1
188 key = 1
189 ENDIF
190
192
193
194
195
196 IF(.NOT.need_comm_int25_solid_erosion) THEN
197 color_int25_solid_erosion = 0
198 key = 0
199 ELSE
200 color_int25_solid_erosion = 1
201 key = 1
202 ENDIF
203
204 CALL mpi_comm_split(spmd_comm_world,color_int25_solid_erosion,key,comm_int25_solid_erosion,code)
205
206
207#endif
208 RETURN
subroutine mpi_comm_split(comm, color, key, comm2, ierr)
subroutine mpi_comm_rank(comm, rank, ierr)
type(comm_tri7vox_type), dimension(:), allocatable comm_tri7vox
integer nb_inter_7_inacti
integer, dimension(:), allocatable list_inter_7_inacti