40 1 NSV ,NSN ,X ,V ,MS ,
41 2 BMINMAL ,WEIGHT ,STIFN ,NIN ,ISENDTO ,
42 3 IRCVFROM ,IAD_ELEM ,FR_ELEM ,NSNR ,IGAP ,
43 4 GAP_S ,ITAB ,KINET ,IFQ ,INACTI ,
44 5 NSNFIOLD ,INTTH ,IELES ,AREAS ,TEMP ,
45 6 NUM_IMP ,NODNX_SMS ,GAP_S_L ,ITYP ,IRTLM ,
46 7 I24_TIME_S,I24_FRFI ,I24_PENE_OLD,I24_STIF_OLD ,
47 8 NBINFLG ,ILEV ,I24_ICONT_I,INTFRIC,IPARTFRICS ,
48 9 ITIED ,IVIS2 , IF_ADH ,LEDGE , NEDGE ,
49 A LNDEDGE , STFM , NEDGE_LOCAL,GAPE , GAP_E_L ,
50 B STFE ,EDG_BISECTOR,VTX_BISECTOR,ADMSR,IRECT ,
51 D EBINFLG ,MVOISIN ,IEDGE , ICODT ,ISKEW ,
52 E IPARTFRIC_E,E2S_NOD_NORMAL,ISTIF_MSDT,STIFMSDT_S ,
54 F IFSUB_CAREA ,INTAREAN)
65#include "implicit_f.inc"
76#include "timeri_c.inc"
78#include "i25edge_c.inc"
83 INTEGER NIN, NSN, IFQ, INACTI, IGAP,INTTH,NSNR,INTFRIC,
85 . NSNFIOLD(*), NSV(*), WEIGHT(*),
86 . ISENDTO(NINTER+1,*), IRCVFROM(NINTER+1,*),
87 . IAD_ELEM(2,*), (*), (*), KINET(*),
88 . IELES(*),NUM_IMP, NODNX_SMS(*),IRTLM(*),ITYP,
89 . NBINFLG(*),ILEV,I24_ICONT_I(*),IPARTFRICS(*),IF_ADH(*),
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) :: (4,*)
96 INTEGER,
INTENT(IN) :: IEDGE
97 INTEGER,
INTENT(IN) :: ICODT(*)
98 INTEGER,
INTENT(IN) :: ISKEW(*)
99 INTEGER,
INTENT(IN) :: ISTIF_MSDT, IFSUB_CAREA
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(*),
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)
118 INTEGER MSGTYP, I, NOD, LOC_PROC, P, IDEB,
120 . IERROR,REQ_SB(NSPMD),
121 . REQ_RB(),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,
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,
135 my_real:: xmins,ymins,zmins
136 my_real:: xmaxs,ymaxs,zmaxs
137 INTEGER :: N1,N2 ,NN1,NN2
138 INTEGER :: IX1,IX2,IY1,IY2,IZ1,IZ2
139 INTEGER :: IE,JE,I1,I2
154 . xmaxb,ymaxb,zmaxb,xminb,yminb,zminb
156 TYPE(real_pointer),
DIMENSION(NSPMD) :: RBUF
157 TYPE(int_pointer) ,
DIMENSION(NSPMD) :: IBUF
158 TYPE(int_pointer) ,
DIMENSION(NSPMD) :: IBUF_EDGE
159 TYPE(real_pointer),
DIMENSION(NSPMD) :: RBUF_EDGE
161 INTEGER,
DIMENSION(:),
ALLOCATABLE :: ITAGNSNFI
162 INTEGER,
DIMENSION(:),
ALLOCATABLE :: INDEX_EDGE
164 INTEGER :: NBIRECV_NODE,NBIRECV_EDGE
165 INTEGER :: IAM,JAM,IM,M1,M2
182 IF(inacti==5.OR.inacti==6.OR.inacti==7.OR.ifq>0
183 . .OR.num_imp>0.OR.itied/=0.OR.ityp==23.OR.ityp==24
186 nsnfiold(p) =
nsnfi(nin)%P(p)
198 IF(iedge /= 0)
nsnfie(nin)%P(p) = 0
201 IF(ircvfrom(nin,loc_proc)==0.AND.
202 . isendto(nin,loc_proc)==0)
RETURN
204 bminma(1,loc_proc) = bminmal(1)
205 bminma(2,loc_proc) = bminmal(2)
206 bminma(3,loc_proc) = bminmal(3)
207 bminma(4,loc_proc) = bminmal(4)
208 bminma(5,loc_proc) = bminmal(5)
209 bminma(6,loc_proc) = bminmal(6)
213 IF(ircvfrom(nin,loc_proc)/=0)
THEN
215 IF(isendto(nin,p)/=0)
THEN
221 . it_spmd(p),msgtyp,req_sc(p))
224 . bminma(1,loc_proc),6 ,it_spmd(p),msgtyp,req_sb(p))
232 IF(isendto(nin,loc_proc)/=0)
THEN
235 IF(ircvfrom(nin,p)/=0)
THEN
243 . it_spmd(p),msgtyp,req_rc(nbirecv))
246 . bminma(1,p) ,6 ,it_spmd(p),msgtyp,
266 IF(igap==1 .OR. igap==2)
THEN
280 IF(ityp==25.AND.ivis2==-1 )
THEN
281 IF(intth==0) rsiz = rsiz + 1
286 IF(intfric > 0 )
THEN
291 IF(istif_msdt > 0) rsiz = rsiz + 1
293 IF(ifsub_carea > 0) rsiz = rsiz + 1
299 ELSEIF(idtmins_int/=0)
THEN
308 IF (ilev==2) isiz = isiz + 1
317 IF (ilev==2) isiz = isiz + 1
320 req_sd4(1:nspmd) = mpi_request_null
321 req_sd5(1:nspmd) = mpi_request_null
322 req_rd(1:nspmd) = mpi_request_null
323 req_rd2(1:nspmd) = mpi_request_null
324 req_rd4(1:nspmd) = mpi_request_null
325 req_rd5(1:nspmd) = mpi_request_null
331 ALLOCATE(itagnsnfi(numnod),stat=ierror)
332 itagnsnfi(1:numnod) = 0
333 ALLOCATE(index_edge(nedge),stat=ierror
334 index_edge(1:nedge) = 0
337 IF(isendto(nin,loc_proc)/=0)
THEN
339 CALL spmd_waitany(nbirecv,req_rb,indexi)
341 CALL spmd_wait(req_rc(indexi))
343 DO j = iad_elem(1,p), iad_elem(1,p+1)-1
346 weight(nod) = weight(nod)*(-1)
361 IF(weight(nod)==1)
THEN
362 IF(stifn(i)>zero)
THEN
363 IF(ityp==25.AND.irtlm(4*(i-1)+4)==p)
THEN
366 ELSEIF(itied/=0.AND.ityp==7.AND.
candf_si(nin)%P(i)/=0)
THEN
370 IF(x(1,nod) < xminb) cycle
371 IF(x(1,nod) > xmaxb) cycle
372 IF(x(2,nod) < yminb) cycle
373 IF(x(2,nod) > ymaxb) cycle
374 IF(x(3,nod) < zminb) cycle
375 IF(x(3,nod) > zmaxb) cycle
376 ix=int(nbx*(x(1,nod)-xminb)/(xmaxb-xminb))
377 IF(ix >= 0 .AND. ix <= nbx)
THEN
378 iy=int(nby*(x(2,nod)-yminb)/(ymaxb-yminb))
379 IF(iy >= 0 .AND. iy <= nby)
THEN
380 iz=int(nbz*(x(3,nod)-zminb)/(zmaxb-zminb))
381 IF(iz >= 0 .AND. iz <= nbz)
THEN
394 DO j = iad_elem(1,p), iad_elem(1,p+1)-1
397 weight(nod) = weight(nod)*(-1)
409 assert(ledge(9,i) == 1)
417 IF(ledge(1,i) > 0)
THEN
419 stf = stfm(ledge(1,i))
420 ELSEIF (ledge(3,i) > 0)
THEN
423 IF(mvoisin(ledge(4,i),ledge(3,i)) == 0) stf = 0
429 debug_e2e(ledge(8,i) == d_es,p-1)
430 debug_e2e(ledge(8,i) == d_es,stf)
431 debug_e2e(ledge(8,i) == d_es,ledge(7,i))
434 IF( stf > zero .AND. ledge(7,i) >= 0)
THEN
437 xmins =
min(x(1,n1),x(1,n2))
438 ymins =
min(x(2,n1),x(2,n2))
439 zmins =
min(x(3,n1),x(3,n2))
440 xmaxs =
max(x(1,n1),x(1,n2))
441 ymaxs =
max(x(2,n1),x(2,n2))
444 debug_e2e(ledge(8,i) == d_es, xmins)
445 debug_e2e(ledge(8,i) == d_es, ymins)
446 debug_e2e(ledge(8,i) == d_es, zmins)
447 debug_e2e(ledge(8,i) == d_es, xmaxs)
448 debug_e2e(ledge(8,i) == d_es, ymaxs)
449 debug_e2e(ledge(8,i) == d_es, zmaxs)
451 ix1=int(nbx*(xmins-xminb)/dx)
452 ix2=int(nbx*(xmaxs-xminb)/dx)
454 IF(ix2>=0.AND.ix1<=nbx)
THEN
455 iy1=int(nby*(ymins-yminb)/dy
456 iy2=int(nby*(ymaxs-yminb)/dy)
458 IF(iy2>=0.AND.iy1<=nby)
THEN
459 iz1=int(nbz*(zmins-zminb)/dz)
460 iz2=int(nbz*(zmaxs-zminb)/dz)
462 IF(iz2>=0.AND.iz1<=nbz)
THEN
473 nb_edge = nb_edge + 1
474 index_edge(nb_edge) = i
494 jdeb = jdeb +
nsnsi(nin)%P(q)
496 nbb =
nsnsi(nin)%P(p)
498 nd =
nsvsi(nin)%P(jdeb+j)
507 CALL spmd_isend(nbox(1,p),2,it_spmd(p),msgtyp,req_sd(p))
511 IF( nb_edge > 0)
THEN
512 ALLOCATE(ibuf_edge(p)%P(e_ibuf_size*nb_edge))
513 ALLOCATE(rbuf_edge(p)%P(e_rbuf_size*nb_edge))
520 ibuf_edge(p)%p(e_global_id + l) = ledge(8,i)
521 ibuf_edge(p)%p(e_left_seg + l) = ledge(1,i)
522 ibuf_edge(p)%p(e_left_id + l) = ledge(2,i)
523 ibuf_edge(p)%p(e_right_seg + l) = ledge(3,i)
524 ibuf_edge(p)%p(e_right_id + l) = ledge(4,i)
525 ibuf_edge(p)%p(e_node1_id + l) = ledge(5,i)
526 ibuf_edge(p)%p(e_node2_id + l) = ledge(6,i)
527 ibuf_edge(p)%p(e_type + l) = ledge(7,i)
529 ibuf_edge(p)%p(e_node1_globid + l) = itab((ledge(5,i)))
530 ibuf_edge(p)%p(e_node2_globid + l) = itab((ledge(6,i)))
531 ibuf_edge(p)%p(e_local_id + l) = i
533 ibuf_edge(p)%p(e_ebinflg + l) = ebinflg(i)
535 ibuf_edge(p)%p(e_ebinflg + l) = 0
542 ibuf_edge(p)%p(e_im + l) = im
543 IF(idtmins /= 0)
THEN
544 IF(idtmins/=2 .AND. idtmins_int == 0)
THEN
545 ELSEIF(idtmins==2)
THEN
546 ibuf_edge(p)%p(e_nodnx1 + l) = nodnx_sms(m1)
548 ibuf_edge(p)%p(e_nodnx2 + l) = nodnx_sms(m2)
549 ibuf_edge(p)%p(e_nodams2 + l) = m2
551 ibuf_edge(p)%p(e_nodnx1 + l) = 0
552 ibuf_edge(p)%p(e_nodams1 + l) = m1
553 ibuf_edge(p)%p(e_nodnx2 + l) = 0
554 ibuf_edge(p)%p(e_nodams2 + l) = m2
556 assert(nodnx_sms(m1) >=0)
557 assert(nodnx_sms(m2) >=0)
558 debug_e2e(nodnx_sms(m1) < 0,nodnx_sms(m1))
559 debug_e2e(nodnx_sms(m2) < 0,nodnx_sms(m2))
562 ibuf_edge(p)%p(e_ipartfric_e + l) = ipartfric_e(i)
564 ibuf_edge(p)%p(e_ipartfric_e + l) = 0
572 rbuf_edge(p)%p(e_x1+ l) = x(1,(ledge(5,i)))
573 rbuf_edge(p)%p(e_y1+ l) = x(2,(ledge(5,i)))
574 rbuf_edge(p)%p(e_z1+ l) = x(3,(ledge(5,i)))
575 rbuf_edge(p)%p(e_x2+ l) = x(1,(ledge(6,i)))
576 rbuf_edge(p)%p(e_y2+ l) = x(2,(ledge(6,i)))
577 rbuf_edge(p)%p(e_z2+ l) = x(3,(ledge(6,i)))
578 rbuf_edge(p)%p(e_vx1+ l) = v(1,(ledge(5,i)))
579 rbuf_edge(p)%p(e_vy1+ l) = v(2,(ledge(5,i)))
580 rbuf_edge(p)%p(e_vz1+ l) = v(3,(ledge(5,i)))
581 rbuf_edge(p)%p(e_vx2+ l) = v(1,(ledge(6,i)))
582 rbuf_edge(p)%p(e_vy2+ l) = v(2,(ledge(6,i)))
583 rbuf_edge(p)%p(e_vz2+ l) = v(3,(ledge(6,i)))
584 rbuf_edge(p)%p(e_ms1+ l) = ms((ledge(5,i)))
585 rbuf_edge(p)%p(e_ms2+ l) = ms((ledge(6,i)))
586 rbuf_edge(p)%p(e_gap+ l) = gape(i)
588 rbuf_edge(p)%p(e_gapl+ l) = gap_e_l
590 rbuf_edge(p)%p(e_gapl+ l) = 0
592 assert(not(isnan( rbuf_edge(p)%p(e_gapl+ l))))
595 rbuf_edge(p)%p(e_stife+ l) = stfe(i)
596 assert(not(isnan(stfe(i))))
611 nn2 = admsr(mod(je,4)+1,ie)
617 rbuf_edge(p)%p(l2:l2+2) = vtx_bisector(1:3,1,i1)
620 rbuf_edge(p)%p(l2:l2+2) = vtx_bisector(1:3,2,i1)
623 rbuf_edge(p)%p(l2:l2+2) = vtx_bisector(1:3,1,i2)
626 rbuf_edge(p)%p(l2:l2+2) = vtx_bisector(1:3,2,i2)
629 rbuf_edge(p)%p(l2:l2+2) = e2s_nod_normal(1:3,nn1)
632 rbuf_edge(p)%p(l2:l2+2) = e2s_nod_normal(1:3,nn2)
647 ALLOCATE(rbuf(p)%P(rsiz*nb),stat=ierror)
648 ALLOCATE(ibuf(p)%P(isiz*nb),stat=ierror)
652#include "vectorize.inc"
656 rbuf(p)%p(l+1) = x(1,nod)
657 rbuf(p)%p(l+2) = x(2,nod)
658 rbuf(p)%p(l+3) = x(3,nod)
659 rbuf(p)%p(l+4) = v(1,nod)
660 rbuf(p)%p(l+5) = v(2,nod)
661 rbuf(p)%p(l+6) = v(3,nod)
662 rbuf(p)%p(l+7) = ms(nod)
663 rbuf(p)%p(l+8) = stifn(i)
665 ibuf(p)%p(l2+2) = itab(nod)
666 ibuf(p)%p(l2+3) = kinet(nod)
683#include "vectorize.inc"
687 ibuf(p)%p(l+ishift+0)= icodt(nod)
688 ibuf(p)%p(l+ishift+1)= iskew(nod)
700 IF(igap==1 .OR. igap==2.OR. igap==5)
THEN
703#include "vectorize.inc"
706 rbuf(p)%p(l+rshift)= gap_s(i)
715#include "vectorize.inc"
718 rbuf(p)%p(l+rshift) = gap_s(i)
719 rbuf(p)%p(l+rshift+1)= gap_s_l(i)
729#include "vectorize.inc"
733 rbuf(p)%p(l+rshift) = temp(nod)
734 rbuf(p)%p(l+rshift+1) = areas(i)
735 ibuf(p)%p(l2+ishift) = ieles(i)
744 IF(ityp==25.AND.ivis2==-1)
THEN
747#include "vectorize.inc"
751 IF(intth==0) rbuf(p)%p(l+rshift) = areas(i)
752 ibuf(p)%p(l2+ishift) = if_adh(i)
753 ibuf(p)%p(l2+ishift+1)=itagnsnfi(nod)
754 IF(intth==0) l = l + rsiz
757 IF(intth==0) rshift = rshift + 1
764#include "vectorize.inc"
767 ibuf(p)%p(l2+ishift) = ipartfrics(i)
773 IF(istif_msdt > 0)
THEN
775#include "vectorize.inc"
778 rbuf(p)%p(l+rshift) =stifmsdt_s(i)
785 IF(ifsub_carea > 0)
THEN
787#include "vectorize.inc"
791 rbuf(p)%p(l+rshift) =intarean(nod)
800#include "vectorize.inc"
804 ibuf(p)%p(l2+ishift) = nodnx_sms(nod)
805 ibuf(p)%p(l2+ishift+1)= nod
811 ELSEIF(idtmins_int/=0)
THEN
813#include "vectorize.inc"
817 ibuf(p)%p(l2+ishift)= nod
827#include "vectorize.inc"
830 rbuf(p)%p(l+rshift) =i24_time_s(2*(i-1)+1)
831 rbuf(p)%p(l+rshift+1) =i24_time_s(2*(i-1)+2)
832 rbuf(p)%p(l+rshift+2) =i24_pene_old(5,i)
840#include "vectorize.inc"
845 ibuf(p)%p(l2+ishift) =irtlm(4*(i-1)+1)
846 ibuf(p)%p(l2+ishift+1)=irtlm(4*(i-1)+2)
849 ibuf(p)%p(l2+ishift+2)=irtlm(4*(i-1)+3)
850 ibuf(p)%p(l2+ishift+3)=irtlm(4*(i-1)+4)
851 ibuf(p)%p(l2+ishift+4)=i24_icont_i(i)
852 ibuf(p)%p(l2+ishift+5)=itagnsnfi(nod)
860#include "vectorize.inc"
863 ibuf(p)%p(l2+ishift)=nbinflg(i)
873#include "vectorize.inc"
889 1 rbuf(p)%P(1),nb*rsiz,it_spmd(p),msgtyp,
894 1 ibuf(p)%P(1),nb*isiz,it_spmd(p),msgtyp,
901 1 ibuf_edge(p)%P(1),e_ibuf_size*nb_edge ,it_spmd(p),msgtyp,
906 1 rbuf_edge(p)%P(1),e_rbuf_size*nb_edge ,it_spmd(p),msgtyp,
914 nbb =
nsnsi(nin)%P(p)
916 nd =
nsvsi(nin)%P(jdeb+j)
925 DEALLOCATE(itagnsnfi)
926 DEALLOCATE(index_edge)
932 IF(ircvfrom(nin,loc_proc)/=0)
THEN
937 IF(iedge /= 0)
nsnfie(nin)%P(p) = 0
938 IF(isendto(nin,p)/=0)
THEN
941 CALL spmd_recv(nbox2(1,p),2,it_spmd(p),msgtyp)
942 nsnfi(nin)%P(p) = nbox2(1,p)
947 nsnfie(nin)%P(p) = nbox2(2,p)
953 IF(
nsnfi(nin)%P(p)> 0 .OR. nbox2(2,p) > 0)
THEN
956 nsnr = nsnr +
nsnfi(nin)%P(p)
967 ALLOCATE(xrem(rsiz,nsnr),stat=ierror)
969 CALL ancmsg(msgid=20,anmode=aninfo)
972 ALLOCATE(
irem(isiz,nsnr),stat=ierror)
974 CALL ancmsg(msgid=20,anmode=aninfo)
980 CALL ancmsg(msgid=20,anmode=aninfo)
983 ALLOCATE(xrem_edge(e_rbuf_size,
nedge_remote),stat=ierror)
985 CALL ancmsg(msgid=20,anmode=aninfo)
995 IF(
nsnfi(nin)%P(p) > 0 )
THEN
996 len =
nsnfi(nin)%P(p)*rsiz
998 nbirecv_node = nbirecv_node + 1
1000 1 xrem(1,ideb),len,it_spmd(p),
1001 2 msgtyp,req_rd(nbirecv_node))
1003 len2 =
nsnfi(nin)%P(p)*isiz
1006 1
irem(1,ideb),len2,it_spmd(p),
1007 2 msgtyp,req_rd2(nbirecv_node))
1008 ideb = ideb +
nsnfi(nin)%P(p)
1012 IF(
edge_fi(nin)%P(p) > 0 )
THEN
1014 len2 =
edge_fi(nin)%P(p)*e_ibuf_size
1015 nbirecv_edge = nbirecv_edge + 1
1018 1
irem_edge(1,ideb_edge),len2,it_spmd(p),
1019 2 msgtyp,req_rd4(nbirecv_edge))
1022 len2 =
edge_fi(nin)%P(p)*e_rbuf_size
1024 1 xrem_edge(1,ideb_edge),len2,it_spmd(p),
1025 2 msgtyp,req_rd5(nbirecv_edge))
1026 ideb_edge = ideb_edge +
edge_fi(nin)%P(p)
1033 CALL spmd_waitall(nbirecv_node,req_rd )
1034 CALL spmd_waitall(nbirecv_node,req_rd2)
1035 CALL spmd_waitall(nbirecv_edge,req_rd4)
1036 CALL spmd_waitall(nbirecv_edge,req_rd5)
1039 IF(isiz > 5 .AND. nsnr > 0)
THEN
1047 IF(ircvfrom(nin,loc_proc)/=0)
THEN
1049 IF(isendto(nin,p)/=0)
THEN
1050 IF(p/=loc_proc)
THEN
1051 CALL spmd_wait(req_sb(p))
1052 CALL spmd_wait(req_sc(p))
1058 IF(isendto(nin,loc_proc)/=0)
THEN
1060 IF(ircvfrom(nin,p)/=0)
THEN
1061 IF(p/=loc_proc)
THEN
1062 CALL spmd_wait(req_sd(p))
1063 IF(nbox(1,p) > 0)
THEN
1064 CALL spmd_wait(req_sd2(p))
1065 DEALLOCATE(rbuf(p)%p)
1066 CALL spmd_wait(req_sd3(p))
1067 DEALLOCATE(ibuf(p)%p)
1069 IF(nbox(2,p) > 0)
THEN
1070 CALL spmd_wait(req_sd4(p))
1071 DEALLOCATE(ibuf_edge(p)%p)
1072 CALL spmd_wait(req_sd5(p))
1073 DEALLOCATE(rbuf_edge(p)%p)