55
56
57
61 USE spmd_mod
62
63
64
65#include "implicit_f.inc"
66
67
68
69#include "spmd.inc"
70
71
72
73#include "com01_c.inc"
74#include "com04_c.inc"
75#include "task_c.inc"
76#include "timeri_c.inc"
77#include "sms_c.inc"
78#include "i25edge_c.inc"
79#include "assert.inc"
80
81
82
83 INTEGER NIN, NSN, IFQ, , IGAP,INTTH,NSNR,INTFRIC,
84 . ITIED, IVIS2,
85 . NSNFIOLD(*), NSV(*), WEIGHT(*),
86 . ISENDTO(NINTER+1,*), IRCVFROM(NINTER+1,*),
87 . IAD_ELEM(2,*), FR_ELEM(*), ITAB(*), KINET(*),
88 . IELES(*),NUM_IMP, NODNX_SMS(*),IRTLM(*),ITYP,
89 . NBINFLG(*),ILEV,I24_ICONT_I(*),IPARTFRICS(*),IF_ADH(*),
90 . IPARTFRIC_E(*)
91 INTEGER :: NEDGE, LNDEDGE, LEDGE(LNDEDGE,NEDGE)
92 INTEGER :: ADMSR(4,*),IRECT(4,*)
93 INTEGER, INTENT(IN) :: EBINFLG(*)
94 INTEGER, INTENT(IN) :: NEDGE_LOCAL
95 INTEGER, INTENT(IN) :: MVOISIN(4,*)
96 INTEGER, INTENT(IN) :: IEDGE
97 INTEGER, INTENT(IN) :: ICODT(*)
98 INTEGER, INTENT(IN) :: ISKEW(*)
99 INTEGER, INTENT(IN) :: ISTIF_MSDT, IFSUB_CAREA
100
101
102
104 . x(3,*), v(3,*), ms(*), bminmal(*), stifn(*), gap_s(*),
105 . areas(*),temp(*),gap_s_l(*),i24_time_s(*),i24_frfi(6,*),
106 . i24_pene_old(5,*),i24_stif_old(2,*),stfm(*),
107 . gape(*),
108 . gap_e_l(*),
109 . stfe(*)
110 real*4 edg_bisector(3,4,*),vtx_bisector(3,2,*),e2s_nod_normal(3,*)
111 my_real ,
INTENT(IN) :: stifmsdt_s(nsn), stifmsdt_edg(nedge)
112 my_real ,
INTENT(IN) :: intarean(numnod)
113
114
115
116
117#ifdef MPI
118 INTEGER MSGTYP,INFO,I,NOD, DT_CST, LOC_PROC,P,IDEB,
119 . SIZ,J, L, BUFSIZ, LEN, NB, IERROR1, IAD,
120 . STATUS(MPI_STATUS_SIZE),IERROR,REQ_SB(NSPMD),
121 . REQ_RB(NSPMD),KK,NBIRECV,IRINDEXI(NSPMD),
122 . REQ_RD(NSPMD),REQ_SD(NSPMD),REQ_SD2(NSPMD),
123 . REQ_RC(NSPMD),REQ_SC(NSPMD),
124 . INDEXI,ISINDEXI(NSPMD),INDEX(NUMNOD),
125 . NBOX2(2,NSPMD),NBOX(2,NSPMD),
126 . NBX,NBY,NBZ,IX,IY,IZ,
127 . MSGOFF, MSGOFF2, MSGOFF3, MSGOFF4, MSGOFF5,MSGOFF6,
128 . MSGOFF7,
129 . RSIZ, ISIZ, L2, REQ_SD3(NSPMD),REQ_RD2(NSPMD),
130 . REQ_SD4(NSPMD),REQ_RD4(NSPMD),
131 . REQ_SD5(NSPMD),REQ_RD5(NSPMD),
132 . LEN2, RSHIFT, ISHIFT, ND, JDEB, Q, NBB,
133 . NB_EDGE, IDEB_EDGE,
134 . ISIZ_EDGE
135
138 INTEGER :: N1,N2 ,NN1,NN2
139 INTEGER :: IX1,IX2,IY1,IY2,IZ1,IZ2
140 INTEGER :: IE,JE,I1,I2
141
144
145 DATA msgoff/6000/
146 DATA msgoff2/6001/
147 DATA msgoff3/6002/
148 DATA msgoff4/6003/
149 DATA msgoff5/6004/
150 DATA msgoff6/6006/
151 DATA msgoff7/6007/
152
154 . bminma(6,nspmd),
155 . xmaxb,ymaxb,zmaxb,xminb,yminb,zminb
156
157 TYPE(real_pointer), DIMENSION(NSPMD) :: RBUF
158 TYPE(int_pointer) , DIMENSION(NSPMD) :: IBUF
159 TYPE(int_pointer) , DIMENSION(NSPMD) :: IBUF_EDGE
160 TYPE(real_pointer), DIMENSION(NSPMD) :: RBUF_EDGE
161
162 INTEGER, DIMENSION(:), ALLOCATABLE :: ITAGNSNFI
163 INTEGER, DIMENSION(:), ALLOCATABLE :: INDEX_EDGE
164
165 INTEGER :: NBIRECV_NODE,NBIRECV_EDGE
166 INTEGER :: IAM,JAM,IM,M1,M2
167
168
169
170
171
172
173
174
175
176 loc_proc = ispmd + 1
180
181
182
183 IF(inacti==5.OR.inacti==6.OR.inacti==7.OR.ifq>0
184 . .OR.num_imp>0.OR.itied/=0.OR.ityp==23.OR.ityp==24
185 . .OR.ityp==25) THEN
186 DO p = 1, nspmd
187 nsnfiold(p) =
nsnfi(nin)%P(p)
188 IF(iedge > 0) THEN
190 ENDIF
191 END DO
192 END IF
193
194
195
197 DO p = 1, nspmd
199 IF(iedge /= 0)
nsnfie(nin)%P(p) = 0
200 ENDDO
201
202 IF(ircvfrom(nin,loc_proc)==0.AND.
203 . isendto(nin,loc_proc)==0) RETURN
204
205 bminma(1,loc_proc) = bminmal(1)
206 bminma(2,loc_proc) = bminmal(2)
207 bminma(3,loc_proc) = bminmal(3)
208 bminma(4,loc_proc) = bminmal(4)
209 bminma(5,loc_proc) = bminmal(5)
210 bminma(6,loc_proc) = bminmal(6)
211
212
213
214 IF(ircvfrom(nin,loc_proc)/=0) THEN
215 DO p = 1, nspmd
216 IF(isendto(nin,p)/=0) THEN
217 IF(p/=loc_proc) THEN
218 msgtyp = msgoff
219 CALL spmd_isend(
222 . it_spmd(p),msgtyp,req_sc(p))
223 msgtyp = msgoff2
224 CALL spmd_isend(
225 . bminma(1,loc_proc),6 ,it_spmd(p),msgtyp,req_sb(p))
226 ENDIF
227 ENDIF
228 ENDDO
229 ENDIF
230
231
232
233 IF(isendto(nin,loc_proc)/=0) THEN
234 nbirecv=0
235 DO p = 1, nspmd
236 IF(ircvfrom(nin,p)/=0) THEN
237 IF(loc_proc/=p) THEN
238 nbirecv=nbirecv+1
239 irindexi(nbirecv)=p
240 msgtyp = msgoff
241 CALL spmd_irecv(
244 . it_spmd(p),msgtyp,req_rc(nbirecv))
245 msgtyp = msgoff2
246 CALL spmd_irecv(
247 . bminma(1,p) ,6 ,it_spmd(p),msgtyp
248 . req_rb(nbirecv))
249 ENDIF
250 ENDIF
251 ENDDO
252 ENDIF
253
254
255
256
257
258 rsiz = 8
259 isiz = 6
260
261 IF(.true.) THEN
262 isiz = isiz + 2
263 ENDIF
264
265
266
267 IF(igap==1 .OR. igap==2)THEN
268 rsiz = rsiz + 1
269
270 ELSEIF(igap==3)THEN
271 rsiz = rsiz + 2
272 ENDIF
273
274
275 IF(intth > 0 ) THEN
276 rsiz = rsiz + 2
277 isiz = isiz + 1
278 ENDIF
279
280
281 IF(ityp==25.AND.ivis2==-1 ) THEN
282 IF(intth==0) rsiz = rsiz + 1
283 isiz = isiz + 2
284 ENDIF
285
286
287 IF(intfric > 0 ) THEN
288 isiz = isiz + 1
289 ENDIF
290
291
292 IF(istif_msdt > 0) rsiz = rsiz + 1
293
294 IF(ifsub_carea > 0) rsiz = rsiz + 1
295
296
297 IF(idtmins == 2)THEN
298 isiz = isiz + 2
299
300 ELSEIF(idtmins_int/=0)THEN
301 isiz = isiz + 1
302 END IF
303
304
305 IF(ityp==24)THEN
306 rsiz = rsiz + 8
307 isiz = isiz + 3
308
309 IF (ilev==2) isiz = isiz + 1
310
311 ENDIF
312
313
314 IF(ityp==25)THEN
315 rsiz = rsiz + 3
316 isiz = isiz + 6
317
318 IF (ilev==2) isiz = isiz + 1
319 ENDIF
320 ideb = 1
321 req_sd4(1:nspmd) = mpi_request_null
322 req_sd5(1:nspmd) = mpi_request_null
323 req_rd(1:nspmd) = mpi_request_null
324 req_rd2(1:nspmd) = mpi_request_null
325 req_rd4(1:nspmd) = mpi_request_null
326 req_rd5(1:nspmd) = mpi_request_null
327
328
329
330 jdeb = 0
331 IF(ityp==25)THEN
332 ALLOCATE(itagnsnfi(numnod),stat=ierror)
333 itagnsnfi(1:numnod) = 0
334 ALLOCATE(index_edge(nedge),stat=ierror)
335 index_edge(1:nedge) = 0
336 END IF
337
338 IF(isendto(nin,loc_proc)/=0) THEN
339 DO kk = 1, nbirecv
340 CALL spmd_waitany(nbirecv,req_rb,indexi)
341 p=irindexi(indexi)
342 CALL spmd_wait(req_rc(indexi))
343
344 DO j = iad_elem(1,p), iad_elem(1,p+1)-1
345 nod = fr_elem(j)
346
347 weight(nod) = weight(nod)*(-1)
348 ENDDO
349
350 l = ideb
351 nbox(2,p) = 0
352 nb = 0
353 xmaxb = bminma(1,p)
354 ymaxb = bminma(2,p)
355 zmaxb = bminma(3,p)
356 xminb = bminma(4,p)
357 yminb = bminma(5,p)
358 zminb = bminma(6,p)
359
360 DO i=1,nsn
361 nod = nsv(i)
362 IF(weight(nod)==1)THEN
363 IF(stifn(i)>zero)THEN
364 IF(ityp==25.AND.irtlm(4*(i-1)+4)==p)THEN
365 nb = nb + 1
366 index(nb) = i
367 ELSEIF(itied/=0.AND.ityp==7.AND.
candf_si(nin)%P(i)/=0)
THEN
368 nb = nb + 1
369 index(nb) = i
370 ELSE
371 IF(x(1,nod) < xminb) cycle
372 IF(x(1,nod) > xmaxb) cycle
373 IF(x(2,nod) < yminb) cycle
374 IF(x(2,nod) > ymaxb) cycle
375 IF(x(3,nod) < zminb) cycle
376 IF(x(3,nod) > zmaxb) cycle
377 ix=int(nbx*(x(1,nod)-xminb)/(xmaxb-xminb))
378 IF(ix >= 0 .AND. ix <= nbx) THEN
379 iy=int(nby*(x(2,nod)-yminb)/(ymaxb-yminb))
380 IF(iy >= 0 .AND. iy <= nby) THEN
381 iz=int(nbz*(x(3,nod)-zminb)/(zmaxb-zminb))
382 IF(iz >= 0 .AND. iz <= nbz) THEN
384 nb = nb + 1
385 index(nb) = i
386 ENDIF
387 ENDIF
388 ENDIF
389 ENDIF
390 ENDIF
391 ENDIF
392 ENDIF
393 ENDDO
394 nbox(1,p) = nb
395 DO j = iad_elem(1,p), iad_elem(1,p+1)-1
396 nod = fr_elem(j)
397
398 weight(nod) = weight(nod)*(-1)
399 ENDDO
400
401
402 dx=xmaxb-xminb
403 dy=ymaxb-yminb
404 dz=zmaxb-zminb
405 nb_edge = 0
406
407
408 IF(iedge /= 0) THEN
409 DO i=1,nedge_local
410 assert(ledge(9,i) == 1)
411 n1=ledge(5,i)
412 n2=ledge(6,i)
413 assert(n1 > 0)
414 assert(n2 > 0)
415 assert(n1 <= numnod)
416 assert(n2 <= numnod)
417
418 IF(ledge(1,i) > 0) THEN
419
420 stf = stfm(ledge(1,i))
421 ELSEIF (ledge(3,i) > 0) THEN
422
423 stf = one
424 IF(mvoisin(ledge(4,i),ledge(3,i)) == 0) stf = 0
425 ELSE
426
427
428 stf = one
429 ENDIF
430 debug_e2e(ledge(8,i) == d_es,p-1)
431 debug_e2e(ledge(8,i) == d_es,stf)
432 debug_e2e(ledge(8,i) == d_es,ledge(7,i))
433
434
435 IF( stf > zero .AND. ledge(7,i) >= 0) THEN
436
437
438 xmins =
min(x(1,n1),x(1,n2))
439 ymins =
min(x(2,n1),x(2,n2))
440 zmins =
min(x(3,n1),x(3,n2))
441 xmaxs =
max(x(1,n1),x(1,n2))
442 ymaxs =
max(x(2,n1),x(2,n2))
443 zmaxs =
max(x(3,n1),x(3,n2))
444
445 debug_e2e(ledge(8,i) == d_es, xmins)
446 debug_e2e(ledge(8,i) == d_es, ymins)
447 debug_e2e(ledge(8,i) == d_es, zmins)
448 debug_e2e(ledge(8,i) == d_es, xmaxs)
449 debug_e2e(ledge(8,i) == d_es, ymaxs)
450 debug_e2e(ledge(8,i) == d_es, zmaxs)
451
452 ix1=int(nbx*(xmins-xminb)/dx)
453 ix2=int(nbx*(xmaxs-xminb)/dx)
454
455 IF(ix2>=0.AND.ix1<=nbx)THEN
456 iy1=int(nby*(ymins-yminb)/dy)
457 iy2=int(nby*(ymaxs-yminb)/dy)
458
459 IF(iy2>=0.AND.iy1<=nby)THEN
460 iz1=int(nbz*(zmins-zminb)/dz)
461 iz2=int(nbz*(zmaxs-zminb)/dz)
462
463 IF(iz2>=0.AND.iz1<=nbz)THEN
470 DO ix=ix1,ix2
471 DO iy=iy1,iy2
472 DO iz=iz1,iz2
474 nb_edge = nb_edge + 1
475 index_edge(nb_edge) = i
476 debug_e2e(ledge(8,i)==d_es,nb_edge)
477 GOTO 111
478 END IF
479 END DO
480 END DO
481 END DO
482 ENDIF
483 ENDIF
484 ENDIF
485 111 CONTINUE
486 ENDIF
487 ENDDO
488 ENDIF
489
490 nbox(2,p) = nb_edge
491
492 IF(ityp==25)THEN
493 jdeb = 0
494 DO q=1,p-1
495 jdeb = jdeb +
nsnsi(nin)%P(q)
496 END DO
497 nbb =
nsnsi(nin)%P(p)
498 DO j = 1, nbb
499 nd =
nsvsi(nin)%P(jdeb+j)
500 nod= nsv(nd)
501 itagnsnfi(nod)=j
502 END DO
503 END IF
504
505
506
507 msgtyp = msgoff3
508 CALL spmd_isend(nbox(1,p),2,it_spmd(p),msgtyp,req_sd(p))
509
510
511
512 IF( nb_edge > 0) THEN
513 ALLOCATE(ibuf_edge(p)%P(e_ibuf_size*nb_edge))
514 ALLOCATE(rbuf_edge(p)%P(e_rbuf_size*nb_edge))
515
516 l = 0
517 DO j=1,nb_edge
518 i = index_edge(j)
519 assert(i > 0)
520 assert(i <= nedge)
521 ibuf_edge(p)%p(e_global_id + l) = ledge(8,i)
522 ibuf_edge(p)%p(e_left_seg + l) = ledge(1,i)
523 ibuf_edge(p)%p(e_left_id + l) = ledge(2,i)
524 ibuf_edge(p)%p(e_right_seg + l) = ledge(3,i)
525 ibuf_edge(p)%p(e_right_id + l) = ledge(4,i)
526 ibuf_edge(p)%p(e_node1_id + l) = ledge(5,i)
527 ibuf_edge(p)%p(e_node2_id + l) = ledge(6,i)
528 ibuf_edge(p)%p(e_type + l) = ledge(7,i)
529
530 ibuf_edge(p)%p(e_node1_globid + l) = itab((ledge(5,i)))
531 ibuf_edge(p)%p(e_node2_globid + l) = itab((ledge(6,i)))
532 ibuf_edge(p)%p(e_local_id + l) = i
533 IF(ilev == 2) THEN
534 ibuf_edge(p)%p(e_ebinflg + l) = ebinflg(i)
535 ELSE
536 ibuf_edge(p)%p(e_ebinflg + l) = 0
537 ENDIF
538 iam= ledge(1,i)
539 jam= ledge(2,i)
540 m1 = ledge(5,i)
541 m2 = ledge(6,i)
542 im = ledge(10,i)
543 ibuf_edge(p)%p(e_im + l) = im
544 IF(idtmins /= 0) THEN
545 IF(idtmins/=2 .AND. idtmins_int == 0) THEN
546 ELSEIF(idtmins==2) THEN
547 ibuf_edge(p)%p(e_nodnx1 + l) = nodnx_sms(m1)
548 ibuf_edge(p)%p(e_nodams1 + l) = m1
549 ibuf_edge(p)%p(e_nodnx2 + l) = nodnx_sms(m2)
550 ibuf_edge(p)%p(e_nodams2 + l) = m2
551 ELSE
552 ibuf_edge(p)%p(e_nodnx1 + l) = 0
553 ibuf_edge(p)%p(e_nodams1 + l) = m1
554 ibuf_edge(p)%p(e_nodnx2 + l) = 0
555 ibuf_edge(p)%p(e_nodams2 + l) = m2
556 ENDIF
557 assert(nodnx_sms(m1) >=0)
558 assert(nodnx_sms(m2) >=0)
559 debug_e2e(nodnx_sms(m1) < 0,nodnx_sms(m1))
560 debug_e2e(nodnx_sms(m2) < 0,nodnx_sms(m2))
561 ENDIF
562 IF(intfric > 0) THEN
563 ibuf_edge(p)%p(e_ipartfric_e + l) = ipartfric_e(i)
564 ELSE
565 ibuf_edge(p)%p(e_ipartfric_e + l) = 0
566 ENDIF
567 l = l + e_ibuf_size
568 ENDDO
569
570 l = 0
571 DO j=1,nb_edge
572 i = index_edge(j)
573 rbuf_edge(p)%p(e_x1+ l) = x(1,(ledge(5,i)))
574 rbuf_edge(p)%p(e_y1+ l) = x(2,(ledge(5,i)))
575 rbuf_edge(p)%p(e_z1+ l) = x(3,(ledge(5,i)))
576 rbuf_edge(p)%p(e_x2+ l) = x(1,(ledge(6,i)))
577 rbuf_edge(p)%p(e_y2+ l) = x(2,(ledge(6,i)))
578 rbuf_edge(p)%p(e_z2+ l) = x(3,(ledge(6,i)))
579 rbuf_edge(p)%p(e_vx1+ l) = v(1,(ledge(5,i)))
580 rbuf_edge(p)%p(e_vy1+ l) = v(2,(ledge(5,i)))
581 rbuf_edge(p)%p(e_vz1+ l) = v(3,(ledge(5,i)))
582 rbuf_edge(p)%p(e_vx2+ l) = v(1,(ledge(6,i)))
583 rbuf_edge(p)%p(e_vy2+ l) = v(2,(ledge(6,i)))
584 rbuf_edge(p)%p(e_vz2+ l) = v(3,(ledge(6,i)))
585 rbuf_edge(p)%p(e_ms1+ l) = ms((ledge(5,i)))
586 rbuf_edge(p)%p(e_ms2+ l) = ms((ledge(6,i)))
587 rbuf_edge(p)%p(e_gap+ l) = gape(i)
588 IF(igap == 3) THEN
589 rbuf_edge(p)%p(e_gapl+ l) = gap_e_l(i)
590 ELSE
591 rbuf_edge(p)%p(e_gapl+ l) = 0
592 ENDIF
593 assert(not(isnan( rbuf_edge(p)%p(e_gapl+ l))))
594
595
596 rbuf_edge(p)%p(e_stife+ l) = stfe(i)
597 assert(not(isnan(stfe(i))))
598
599
600 l2 = e_edg_bis + l
601
602 ie = abs(ledge(1,i))
603 je = ledge(2,i)
604 iam = ledge(1,i)
605 jam = ledge(2,i)
606 m1 = ledge(5,i)
607 m2 = ledge(6,i)
608 im = ledge(10,i)
609 i1 = ledge(11,i)
610 i2 = ledge(12,i)
611 nn1 = admsr(je,ie)
612 nn2 = admsr(mod(je,4)+1,ie)
613
614
615 rbuf_edge(p)%p(l2:l2+2) = edg_bisector(1:3,je,ie)
616
617 l2 = e_vtx_bis + l
618 rbuf_edge(p)%p(l2:l2+2) = vtx_bisector(1:3,1,i1)
619
620 l2 = l2 + 3
621 rbuf_edge(p)%p(l2:l2+2) = vtx_bisector(1:3,2,i1)
622
623 l2 = l2 + 3
624 rbuf_edge(p)%p(l2:l2+2) = vtx_bisector(1:3,1,i2)
625
626 l2 = l2 + 3
627 rbuf_edge(p)%p(l2:l2+2) = vtx_bisector(1:3,2,i2)
628
629 l2 = l2 + 3
630 rbuf_edge(p)%p(l2:l2+2) = e2s_nod_normal(1:3,nn1)
631
632 l2 = l2 + 3
633 rbuf_edge(p)%p(l2:l2+2) = e2s_nod_normal(1:3,nn2)
634
635 IF(istif_msdt > 0) rbuf_edge(p)%p(e_stife_msdt_fi+ l) = stifmsdt_edg(i)
636
637 l = l + e_rbuf_size
638 ENDDO
639
640
641
642
643
644
645 ENDIF
646
647 IF (nb > 0) THEN
648 ALLOCATE(rbuf(p)%P(rsiz*nb),stat=ierror)
649 ALLOCATE(ibuf(p)%P(isiz*nb),stat=ierror)
650 l = 0
651 l2= 0
652
653#include "vectorize.inc"
654 DO j = 1, nb
655 i = index(j)
656 nod = nsv(i)
657 rbuf(p)%p(l+1) = x(1,nod)
658 rbuf(p)%p(l+2) = x(2,nod)
659 rbuf(p)%p(l+3) = x(3,nod)
660 rbuf(p)%p(l+4) = v(1,nod)
661 rbuf(p)%p(l+5) = v(2,nod)
662 rbuf(p)%p(l+6) = v(3,nod)
663 rbuf(p)%p(l+7) = ms(nod)
664 rbuf(p)%p(l+8) = stifn(i)
665 ibuf(p)%p(l2+1) = i
666 ibuf(p)%p(l2+2) = itab(nod)
667 ibuf(p)%p(l2+3) = kinet(nod)
668!
save specifics
irem and xrem indexes
for int24 sorting
669 ibuf(p)%p(l2+4) = 0
670 ibuf(p)%p(l2+5) = 0
671 ibuf(p)%p(l2+6) = 0
672 l = l + rsiz
673 l2 = l2 + isiz
674 END DO
675
676
677 rshift = 9
678
679 ishift = 7
680
681
682 IF(.true. )THEN
683 l = 0
684#include "vectorize.inc"
685 DO j = 1, nb
686 i = index(j)
687 nod = nsv(i)
688 ibuf(p)%p(l+ishift+0)= icodt(nod)
689 ibuf(p)%p(l+ishift+1)= iskew(nod)
690 l = l + isiz
691 ENDDO
692 ishift = ishift + 2
693 ENDIF
694
695
696
697
698
699
700
701 IF(igap==1 .OR. igap==2)THEN
702 l = 0
704#include "vectorize.inc"
705 DO j = 1, nb
706 i = index(j)
707 rbuf(p)%p(l+rshift)= gap_s(i)
708 l = l + rsiz
709 ENDDO
710 rshift = rshift + 1
711
712
713 ELSEIF(igap==3)THEN
714 l = 0
716#include "vectorize.inc"
717 DO j = 1, nb
718 i = index(j)
719 rbuf(p)%p(l+rshift) = gap_s(i)
720 rbuf(p)%p(l+rshift+1)= gap_s_l(i)
721 l = l + rsiz
722 END DO
723 rshift = rshift + 2
724 ENDIF
725
726
727 IF(intth>0)THEN
728 l = 0
729 l2 = 0
730#include "vectorize.inc"
731 DO j = 1, nb
732 i = index(j)
733 nod = nsv(i)
734 rbuf(p)%p(l+rshift) = temp(nod)
735 rbuf(p)%p(l+rshift+1) = areas(i)
736 ibuf(p)%p(l2+ishift) = ieles(i)
737 l = l + rsiz
738 l2 = l2 + isiz
739 END DO
740 rshift = rshift + 2
741 ishift = ishift + 1
742 ENDIF
743
744
745 IF(ityp==25.AND.ivis2==-1)THEN
746 l = 0
747 l2 = 0
748#include "vectorize.inc"
749 DO j = 1, nb
750 i = index(j)
751 nod = nsv(i)
752 IF(intth==0) rbuf(p)%p(l+rshift) = areas(i)
753 ibuf(p)%p(l2+ishift) = if_adh(i)
754 ibuf(p)%p(l2+ishift+1)=itagnsnfi(nod)
755 IF(intth==0) l = l + rsiz
756 l2 = l2 + isiz
757 END DO
758 IF(intth==0) rshift = rshift + 1
759 ishift = ishift + 2
760 ENDIF
761
762
763 IF(intfric>0)THEN
764 l2 = 0
765#include "vectorize.inc"
766 DO j = 1, nb
767 i = index(j)
768 ibuf(p)%p(l2+ishift) = ipartfrics(i)
769 l2 = l2 + isiz
770 END DO
771 ishift = ishift + 1
772 ENDIF
773
774 IF(istif_msdt > 0) THEN
775 l = 0
776#include "vectorize.inc"
777 DO j = 1, nb
778 i = index(j)
779 rbuf(p)%p(l+rshift) =stifmsdt_s(i)
780 l = l + rsiz
781 END DO
782 rshift = rshift + 1
783 ENDIF
784
785
786 IF(ifsub_carea > 0) THEN
787 l = 0
788#include "vectorize.inc"
789 DO j = 1, nb
790 i = index(j)
791 nod = nsv(i)
792 rbuf(p)%p(l+rshift) =intarean(nod)
793 l = l + rsiz
794 END DO
795 rshift = rshift + 1
796 ENDIF
797
798
799 IF(idtmins==2)THEN
800 l2 = 0
801#include "vectorize.inc"
802 DO j = 1, nb
803 i = index(j)
804 nod = nsv(i)
805 ibuf(p)%p(l2+ishift) = nodnx_sms(nod)
806 ibuf(p)%p(l2+ishift+1)= nod
807 l2 = l2 + isiz
808 END DO
809 ishift = ishift + 2
810
811
812 ELSEIF(idtmins_int/=0)THEN
813 l2 = 0
814#include "vectorize.inc"
815 DO j = 1, nb
816 i = index(j)
817 nod = nsv(i)
818 ibuf(p)%p(l2+ishift)= nod
819 l2 = l2 + isiz
820 END DO
821 ishift = ishift + 1
822 ENDIF
823
824
825 IF(ityp==24)THEN
826
827 l = 0
829#include "vectorize.inc"
830 DO j = 1, nb
831 i = index(j)
832 rbuf(p)%p(l+rshift) =i24_time_s(i)
833 rbuf(p)%p(l+rshift+1) =i24_frfi(1,i)
834 rbuf(p)%p(l+rshift+2) =i24_frfi(2,i)
835 rbuf(p)%p(l+rshift+3) =i24_frfi(3,i)
836 rbuf(p)%p(l+rshift+4) =i24_pene_old(1,i)
837 rbuf(p)%p(l+rshift+5) =i24_stif_old(1,i)
838 rbuf(p)%p(l+rshift+6) =i24_pene_old(3,i)
839 rbuf(p)%p(l+rshift+7) =i24_pene_old(5,i)
840 l = l + rsiz
841 END DO
842 rshift = rshift + 8
843
844 l2 = 0
846#include "vectorize.inc"
847 DO j = 1, nb
848 i = index(j)
849
850 ibuf(p)%p(l2+ishift) =irtlm(2*(i-1)+1)
851 ibuf(p)%p(l2+ishift+1)=irtlm(2*(i-1)+2)
852 ibuf(p)%p(l2+ishift+2)=i24_icont_i(i)
853 l2 = l2 + isiz
854 END DO
855 ishift = ishift + 3
856
857
858 IF (ilev==2) THEN
859 l2 = 0
860#include "vectorize.inc"
861 DO j = 1, nb
862 i = index(j)
863 ibuf(p)%p(l2+ishift)=nbinflg(i)
864 l2 = l2 + isiz
865 END DO
866 END IF
867 ishift = ishift + 1
868
869 END IF
870
871
872 IF(ityp==25)THEN
873 l = 0
875#include "vectorize.inc"
876 DO j = 1, nb
877 i = index(j)
878 rbuf(p)%p(l+rshift) =i24_time_s(2*(i-1)+1)
879 rbuf(p)%p(l+rshift+1) =i24_time_s(2*(i-1)+2)
880 rbuf(p)%p(l+rshift+2) =i24_pene_old(5,i)
881 l = l + rsiz
882 END DO
883 rshift = rshift + 3
884
885 l2 = 0
887
888#include "vectorize.inc"
889 DO j = 1, nb
890 i = index(j)
891 nod = nsv(i)
892
893 ibuf(p)%p(l2+ishift) =irtlm(4*(i-1)+1)
894 ibuf(p)%p(l2+ishift+1)=irtlm(4*(i-1)+2)
895
896
897 ibuf(p)%p(l2+ishift+2)=irtlm(4*(i-1)+3)
898 ibuf(p)%p(l2+ishift+3)=irtlm(4*(i-1)+4)
899 ibuf(p)%p(l2+ishift+4)=i24_icont_i(i)
900 ibuf(p)%p(l2+ishift+5)=itagnsnfi(nod)
901 l2 = l2 + isiz
902 END DO
903 ishift = ishift + 6
904
905
906 IF (ilev==2) THEN
907 l2 = 0
908#include "vectorize.inc"
909 DO j = 1, nb
910 i = index(j)
911 ibuf(p)%p(l2+ishift)=nbinflg(i)
912 l2 = l2 + isiz
913 END DO
914 END IF
915 ishift = ishift + 1
916
917 END IF
918
919
920 l2 = 0
921#include "vectorize.inc"
922 DO j = 1, nb
923 i = index(j)
924 nod = nsv(i)
925
929 l2 = l2 + isiz
930 END DO
931 ENDIF
932
933 IF( nb > 0 ) THEN
934
935 msgtyp = msgoff4
936 CALL spmd_isend(
937 1 rbuf(p)%P(1),nb*rsiz,it_spmd(p),msgtyp,
938 2 req_sd2(p))
939
940 msgtyp = msgoff5
941 CALL spmd_isend(
942 1 ibuf(p)%P(1),nb*isiz,it_spmd(p),msgtyp,
943 2 req_sd3(p))
944 ENDIF
945 IF(nb_edge > 0) THEN
946
947 msgtyp = msgoff6
948 CALL spmd_isend(
949 1 ibuf_edge(p)%P(1),e_ibuf_size*nb_edge ,it_spmd(p),msgtyp,
950 2 req_sd4(p))
951
952 msgtyp = msgoff7
953 CALL spmd_isend(
954 1 rbuf_edge(p)%P(1),e_rbuf_size*nb_edge ,it_spmd(p),msgtyp,
955 2 req_sd5(p))
956 ENDIF
957
958
959
960 IF(ityp==25)THEN
961
962 nbb =
nsnsi(nin)%P(p)
963 DO j = 1, nbb
964 nd =
nsvsi(nin)%P(jdeb+j)
965 nod= nsv(nd)
966 itagnsnfi(nod)=0
967 END DO
968 END IF
969 ENDDO
970 ENDIF
971
972 IF(ityp==25) THEN
973 DEALLOCATE(itagnsnfi)
974 DEALLOCATE(index_edge)
975 ENDIF
976
977
978
980 IF(ircvfrom(nin,loc_proc)/=0) THEN
981 nsnr = 0
982 l=0
983 DO p = 1, nspmd
985 IF(iedge /= 0)
nsnfie(nin)%P(p) = 0
986 IF(isendto(nin,p)/=0) THEN
987 IF(loc_proc/=p) THEN
988 msgtyp = msgoff3
989 CALL spmd_recv(nbox2(1,p),2,it_spmd(p),msgtyp)
990 nsnfi(nin)%P(p) = nbox2(1,p)
991
992 IF(iedge /= 0) THEN
995 nsnfie(nin)%P(p) = nbox2(2,p)
996 ELSE
997
998
999 ENDIF
1000
1001 IF(
nsnfi(nin)%P(p)> 0 .OR. nbox2(2,p) > 0)
THEN
1002 l=l+1
1003 isindexi(l)=p
1004 nsnr = nsnr +
nsnfi(nin)%P(p)
1005 ENDIF
1006 ENDIF
1007 ENDIF
1008 ENDDO
1009 nbirecv=l
1010
1011
1012
1013
1015 ALLOCATE(xrem(rsiz,nsnr),stat=ierror)
1016 IF(ierror/=0) THEN
1017 CALL ancmsg(msgid=20,anmode=aninfo)
1019 ENDIF
1020 ALLOCATE(
irem(isiz,nsnr),stat=ierror)
1021 IF(ierror/=0) THEN
1022 CALL ancmsg(msgid=20,anmode=aninfo)
1024 ENDIF
1025 IF(iedge /= 0) THEN
1027 IF(ierror/=0) THEN
1028 CALL ancmsg(msgid=20,anmode=aninfo)
1030 ENDIF
1031 ALLOCATE(xrem_edge(e_rbuf_size,
nedge_remote),stat=ierror)
1032 IF(ierror/=0) THEN
1033 CALL ancmsg(msgid=20,anmode=aninfo)
1035 ENDIF
1036 ENDIF
1037 ideb = 1
1038 ideb_edge = 1
1039 nbirecv_edge = 0
1040 nbirecv_node = 0
1041 DO l = 1, nbirecv
1042 p = isindexi(l)
1043 IF(
nsnfi(nin)%P(p) > 0 )
THEN
1044 len =
nsnfi(nin)%P(p)*rsiz
1045 msgtyp = msgoff4
1046 nbirecv_node = nbirecv_node + 1
1047 CALL spmd_irecv(
1048 1 xrem(1,ideb),len,it_spmd(p),
1049 2 msgtyp,req_rd(nbirecv_node))
1050
1051 len2 =
nsnfi(nin)%P(p)*isiz
1052 msgtyp = msgoff5
1053 CALL spmd_irecv(
1054 1
irem(1,ideb),len2,it_spmd(p),
1055 2 msgtyp,req_rd2(nbirecv_node))
1056 ideb = ideb +
nsnfi(nin)%P(p)
1057 ENDIF
1058
1059 IF(iedge /= 0) THEN
1060 IF(
edge_fi(nin)%P(p) > 0 )
THEN
1061 msgtyp = msgoff6
1062 len2 =
edge_fi(nin)%P(p)*e_ibuf_size
1063 nbirecv_edge = nbirecv_edge + 1
1064
1065 CALL spmd_irecv(
1066 1
irem_edge(1,ideb_edge),len2,it_spmd(p),
1067 2 msgtyp,req_rd4(nbirecv_edge))
1068
1069 msgtyp = msgoff7
1070 len2 =
edge_fi(nin)%P(p)*e_rbuf_size
1071 CALL spmd_irecv(
1072 1 xrem_edge(1,ideb_edge),len2,it_spmd(p),
1073 2 msgtyp,req_rd5(nbirecv_edge))
1074 ideb_edge = ideb_edge +
edge_fi(nin)%P(p)
1075 ENDIF
1076 ENDIF
1077 ENDDO
1078
1079
1080
1081 CALL spmd_waitall(nbirecv_node,req_rd )
1082 CALL spmd_waitall(nbirecv_node,req_rd2)
1083 CALL spmd_waitall(nbirecv_edge,req_rd4)
1084 CALL spmd_waitall(nbirecv_edge,req_rd5)
1085
1086
1087 IF(isiz > 5 .AND. nsnr > 0) THEN
1091 ENDIF
1092 ENDIF
1093 ENDIF
1094
1095 IF(ircvfrom(nin,loc_proc)/=0) THEN
1096 DO p = 1, nspmd
1097 IF(isendto(nin,p)/=0) THEN
1098 IF(p/=loc_proc) THEN
1099 CALL spmd_wait(req_sb(p))
1100 CALL spmd_wait(req_sc(p))
1101 ENDIF
1102 ENDIF
1103 ENDDO
1104 ENDIF
1105
1106 IF(isendto(nin,loc_proc)/=0) THEN
1107 DO p = 1, nspmd
1108 IF(ircvfrom(nin,p)/=0) THEN
1109 IF(p/=loc_proc) THEN
1110 CALL spmd_wait(req_sd(p))
1111 IF(nbox(1,p) > 0) THEN
1112 CALL spmd_wait(req_sd2(p))
1113 DEALLOCATE(rbuf(p)%p)
1114 CALL spmd_wait(req_sd3(p))
1115 DEALLOCATE(ibuf(p)%p)
1116 ENDIF
1117 IF(nbox(2,p) > 0) THEN
1118 CALL spmd_wait(req_sd4(p))
1119 DEALLOCATE(ibuf_edge(p)%p)
1120 CALL spmd_wait(req_sd5(p))
1121 DEALLOCATE(rbuf_edge(p)%p)
1122 END IF
1123 ENDIF
1124 ENDIF
1125 ENDDO
1126 ENDIF
1127
1128#endif
1129 RETURN
for(i8=*sizetab-1;i8 >=0;i8--)
integer, dimension(:,:,:,:), allocatable crvoxel25
integer, parameter lrvoxel25
integer, dimension(:,:), allocatable irem_edge
integer, dimension(:), allocatable nsnfieold
type(int_pointer), dimension(:), allocatable edge_fi
type(int_pointer), dimension(:), allocatable candf_si
type(int_pointer), dimension(:), allocatable nsvsi
type(int_pointer), dimension(:), allocatable nsnfie
type(int_pointer), dimension(:), allocatable nsnsi
type(int_pointer), dimension(:), allocatable nsnfi
integer, dimension(:,:), allocatable irem
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)