54#include "implicit_f.inc"
64 INTEGER,
INTENT(IN) :: SCEP
65 INTEGER,
DIMENSION(SCEP),
INTENT(IN) :: CEP
66 TYPE(
surf_),
DIMENSION(NSURF),
INTENT(INOUT) :: IGRSURF
67 TYPE(
surf_),
DIMENSION(NSURF,NSPMD),
INTENT(INOUT) ::
85! -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
89 INTEGER :: NV,IS,,J,K,SHIFT
90 INTEGER :: ITY,II,PROC,K1
92INTEGER,
DIMENSION(NSPMD) :: JJ
93 INTEGER :: NJ,NJ1,NJ2,NJ3
96 LOGICAL,
DIMENSION(NSURF) :: ALREADY_DONE
97 LOGICAL,
DIMENSION(:),
ALLOCATABLE :: I_NEED_IT
101 INTEGER :: INDEX_PROC,NUMBER_PROC
102 INTEGER :: SIZE_MERGED_LIST,SIZE_PROC_LIST,SIZE_UNION_PROC_LIST
103 INTEGER,
DIMENSION(:),
ALLOCATABLE :: MERGED_LIST
104 INTEGER,
DIMENSION(NSPMD) :: UNION_PROC_LIST,PROC_LIST,NUMBER_APPEARANCE
106 INTEGER,
DIMENSION(0:7) :: OFFSET
116 offtg = numels+numelq+ numelc+numelt+numelp+numelr
123 already_done(1:nsurf) = .false.
127 igrsurf_proc(1:nsurf,1:nspmd)%NSEG = 0
130 is = t_monvol(nv)%EXT_SURFID
131 nn = igrsurf(is)%NSEG
133 igrsurf_proc(is,1:nspmd)%NSEG = 0
134 already_done(is) = .true.
136 ity = igrsurf(is)%ELTYP(j)
137 ii = igrsurf(is)%ELEM(j)
140 proc = cep(offc+ii) + 1
142 proc = cep(offtg+ii) + 1
145 jj(proc) = jj(proc) + 1
151 IF(.NOT.
ALLOCATED(igrsurf_proc(is,proc)%ELTYP).AND.jj(proc)>0)
THEN
152 igrsurf_proc(is,proc)%NSEG = jj(proc)
153 ALLOCATE( igrsurf_proc(is,proc)%ELTYP( jj(proc) ) )
154 ALLOCATE( igrsurf_proc(is,proc)%ELEM( jj(proc) ) )
155 ALLOCATE( igrsurf_proc(is,proc)%LOCAL_SEG( jj(proc) ) )
160 njet = t_monvol(nv)%NJET
162 nj1 = t_monvol(nv)%IBAGJET(5, nj)
163 nj2 = t_monvol(nv)%IBAGJET(6, nj)
164 nj3 = t_monvol(nv)%IBAGJET(7, nj)
170 IF (t_monvol(nv)%NB_FILL_TRI > 0)
THEN
171 DO j = 1, t_monvol(nv)%NB_FILL_TRI
173 node_id = t_monvol(nv)%FILL_TRI(3 * (j - 1) + 1)
174 IF (node_id > 0)
THEN
176 i_am_here = i_am_here + 1
178 node_id = t_monvol(nv)%FILL_TRI(3 * (j - 1) + 2)
179 IF (node_id > 0)
THEN
181 i_am_here = i_am_here + 1
183 node_id = t_monvol(nv)%FILL_TRI(3 * (j - 1) + 3)
184 IF (node_id > 0)
THEN
186 i_am_here = i_am_here + 1
188 IF( i_am_here==3 )
THEN
189 t_monvol(nv)%NUMBER_TRI_PER_PROC(proc) =
190 . t_monvol(nv)%NUMBER_TRI_PER_PROC(proc) + 1
204 is = t_monvol(nv)%EXT_SURFID
205 nn = igrsurf(is)%NSEG
208 ity = igrsurf(is)%ELTYP(j)
209 ii = igrsurf(is)%ELEM(j)
212 proc = cep(offc+ii) + 1
214 proc = cep(offtg+ii) + 1
217 jj(proc) = jj(proc) + 1
218 igrsurf_proc(is,proc)%ELTYP(jj(proc)) = ity
219 igrsurf_proc(is,proc)%ELEM(jj(proc)) = ii
220 igrsurf_proc(is,proc)%LOCAL_SEG( jj(proc) ) = j
226 ALLOCATE( i_need_it(numnod) )
227 ALLOCATE( proc_list_per_node(numnod) )
228 i_need_it(1:numnod) = .false.
230 IF(.NOT.already_done(is))
THEN
231 nn = igrsurf(is)%NSEG
232 ALLOCATE( igrsurf(is)%PROC(nn) )
233 igrsurf(is)%PROC(1:nn) = 0
234 igrsurf_proc(is,1:nspmd)%NSEG = 0
238 ity = igrsurf(is)%ELTYP(j)
239 ii = igrsurf(is)%ELEM(j)
245 IF(n2d/=0) up_bound = 2
249 node_id = igrsurf(is)%NODES(j,k)
251 IF(.NOT.i_need_it(node_id))
THEN
252 i_need_it(node_id) = .true.
255 proc_list_per_node(node_id)%SIZE_INT_ARRAY_1D = number_proc
257 proc_list_per_node(node_id)%INT_ARRAY_1D(1:number_proc) = proc_list(1:number_proc)
273 !
if there are several processor in
the merged list, need to find
the processor with
the highest occurrence
275 IF(.NOT.already_done(is))
THEN
276 igrsurf_proc(is,1:nspmd)%NSEG = 0
277 nn = igrsurf(is)%NSEG
281 ity = igrsurf(is)%ELTYP(j)
282 ii = igrsurf(is)%ELEM(j)
290 proc = cep(offs+ii) + 1
292 proc = cep(offc+ii) + 1
294 proc = cep(offtg+ii) + 1
297 IF(igrsurf(is)%NODES(j,3)==igrsurf(is)%NODES(j
298 IF(n2d/=0) up_bound = 2
301 ! compute
the size of merged list
303 node_id = igrsurf(is)%NODES(j,k)
305 size_merged_list = size_merged_list + proc_list_per_node(node_id)%SIZE_INT_ARRAY_1D
309 ALLOCATE( merged_list(size_merged_list) )
310 merged_list(1:size_merged_list) = -1
311 node_id = igrsurf(is)%NODES(j,1)
312 size_union_proc_list = 0
316 merged_list(1:proc_list_per_node(node_id)%SIZE_INT_ARRAY_1D) =
317 . proc_list_per_node(node_id)%INT_ARRAY_1D
318 shift = proc_list_per_node(node_id)%SIZE_INT_ARRAY_1D
320 proc_list(1:proc_list_per_node(node_id)%SIZE_INT_ARRAY_1D) =
321 . proc_list_per_node(node_id)%INT_ARRAY_1D(1:proc_list_per_node(node_id)%SIZE_INT_ARRAY_1D)
322 size_proc_list = proc_list_per_node
323 size_union_proc_list = 0
327 node_id = igrsurf(is)%NODES(j,k
329 merged_list(shift+1:shift+proc_list_per_node(node_id)%SIZE_INT_ARRAY_1D) =
330 . proc_list_per_node(node_id)%INT_ARRAY_1D(1:proc_list_per_node(node_id)%SIZE_INT_ARRAY_1D
331 shift = shift + proc_list_per_node(node_id)%SIZE_INT_ARRAY_1D
333 CALL union_2_sorted_sets(proc_list, size_proc_list,
334 . proc_list_per_node(node_id)%INT_ARRAY_1D, proc_list_per_node(node_id)%SIZE_INT_ARRAY_1D
335 . union_proc_list, size_union_proc_list )
336 proc_list(1:size_union_proc_list) = union_proc_list(1:size_union_proc_list)
337 size_proc_list = size_union_proc_list
344 number_appearance(1:nspmd) = 0
345 IF(size_union_proc_list>0)
THEN
346 CALL count_member_list( union_proc_list, size_union_proc_list,
347 . merged_list, size_merged_list,
349 proc = union_proc_list(index_proc)
352 IF( number_appearance(index_proc)/=up_bound
THEN
354 node_id = igrsurf(is)%NODES(j,k)
363 proc_list_per_node(node_id)%INT_ARRAY_1D(1:number_proc) = proc_list(1:number_proc)
370 DEALLOCATE( merged_list )
375 igrsurf_proc(is,proc)%NSEG = igrsurf_proc(is,proc)%NSEG + 1
376 igrsurf(is)%PROC(j) = proc
385 IF(.NOT.already_done(is))
THEN
388 ALLOCATE( igrsurf_proc(is,j)%ELTYP( igrsurf_proc(is,j)%NSEG ) )
389 ALLOCATE( igrsurf_proc(is,j)%ELEM( igrsurf_proc(is,j)%NSEG ) )
390 ALLOCATE( igrsurf_proc(is,j)%LOCAL_SEG( igrsurf_proc(is,j)%NSEG ) )
392 nn = igrsurf(is)%NSEG
394 proc = igrsurf(is)%PROC(j)
396 jj(proc) = jj(proc) + 1
397 ity = igrsurf(is)%ELTYP(j)
398 igrsurf_proc(is,proc)%ELTYP
399 elem_id = igrsurf(is)%ELEM
400 igrsurf_proc(is,proc)%ELEM( jj(proc) ) = elem_id
401 igrsurf_proc(is,proc)%LOCAL_SEG( jj(proc
407 DEALLOCATE( i_need_it )
408 DEALLOCATE( proc_list_per_node )