61 2 MS ,NIN ,ITASK ,MWAG ,WEIGHT ,
62 3 ISENDTO ,IRCVFROM,RETRI ,IAD_ELEM,FR_ELEM ,
63 4 ITAB ,KINET ,TEMP ,NRTM_T ,RENUM ,
64 5 NSNFIOLD,ESHIFT ,NUM_IMP ,IND_IMP ,NODNX_SMS,
65 6 INTBUF_TAB,H3D_DATA,IXS,MULTI_FVM,GLOB_THERM)
76 use check_sorting_criteria_mod ,
only : check_sorting_criteria
81#include "implicit_f.inc"
93#include "timeri_c.inc"
95 COMMON /i7mainc/bminma,curv_max_max,result,nsnr,nsnrold,i_memg,nmn_g
96 INTEGER RESULT,NSNR,NSNROLD,I_MEMG,NMN_G
98 . BMINMA(12),CURV_MAX_MAX
102 TYPE(timer_) :: TIMERS
103 INTEGER NIN ,ITASK, RETRI, NRTM_T,ESHIFT,
104 . NUM_IMP ,IND_IMP(*),
106 . IPARI(NPARI,NINTER), (*),
107 . ISENDTO(NINTER+1,*),IRCVFROM(NINTER+1,*),
108 . weight(*), iad_elem(2,*) ,fr_elem(*),
109 . renum(*), nsnfiold(nspmd), nodnx_sms(*), ixs(nixs, *)
112 . x(*), v(*), ms(*),temp(*)
114 TYPE(intbuf_struct_) INTBUF_TAB
115 TYPE(H3D_DATABASE) :: H3D_DATA
116 TYPE(MULTI_FVM_STRUCT),
INTENT(INOUT) :: MULTI_FVM
117 TYPE(glob_therm_),
INTENT(IN) :: GLOB_THERM
123 . i, ip0, ip1, ip2, ip21, i_sk_old, i_stok1,
124 . add1, nb_n_b, noint, inacti, multimp, igap, ifq, itied
126 . ILD, NCONT, NCONTACT, INACTII, INACIMP, ,
127 . i_mem,cand_n_old,idum1(1),nmn_l, ivis2
129 . gap,maxbox,minbox,tzinf,dgaploadp,
130 . xmaxl, ymaxl, zmaxl, xminl, yminl, zminl, gapmin, gapmax,
131 . c_maxl,drad,mx,my,mz,dx,dy,dz,sx,sy,sz,sx2,sy2,sz2,
132 . curv_max(nrtm_t),rdum1(1)
135 INTEGER :: NRTM,NSN,NMN,NTY
136 logical :: need_computation
140 call check_sorting_criteria( need_computation,nin,npari,nspmd,
141 . itask,ipari(1,nin),tt,intbuf_tab )
142 if( .not.need_computation )
return
157 inacti =ipari(22,nin)
158 multimp =ipari(23,nin)
164 ncontact=multimp*ncont
167 IF(nty==7 .AND. inacti==7)type18=.true.
169 IF(inacti==5.OR.inacti==6.OR.inacti==7.OR.ifq>0.OR.
170 . num_imp>0.OR.itied
THEN
171 nsnrold = ipari(24,nin)
176 gap =intbuf_tab%VARIABLES(gap_index)
177 gapmin=intbuf_tab%VARIABLES(gapmin_index)
178 gapmax=intbuf_tab%VARIABLES(gapmax_index
180 IF(ipari(7,nin)==7) drad =intbuf_tab%VARIABLES(drad_index
181 dgaploadp= intbuf_tab%VARIABLES(bgapemx_index)
191 maxbox = intbuf_tab%VARIABLES(maxbox_index)
192 minbox = intbuf_tab%VARIABLES(minbox_index)
193 tzinf = intbuf_tab%VARIABLES(tzinf_index)
217 IF(inacti==5.OR.inacti==6.OR.inacti==7.OR.ifq>0.OR.
218 . num_imp>0.OR.itied/=0)
THEN
222 . (inacti/=5.AND.inacti/=6.AND.ifq<=0))
THEN
228 ip1 = ip0 + nsn + nsnrold + 3
230 i_sk_old = intbuf_tab%I_STOK(1)
232 1 nsn+nsnrold ,i_sk_old ,intbuf_tab%CAND_N,intbuf_tab%CAND_E,
233 2 intbuf_tab%CAND_P,intbuf_tab%FTSAVX,intbuf_tab%FTSAVY,intbuf_tab%FTSAVZ,
234 3 mwag(ip0) ,intbuf_tab%IFPEN ,inacti ,ifq ,
235 4 num_imp ,ind_imp ,intbuf_tab%STFNS ,nin ,
236 5 nsn ,itied,intbuf_tab%CAND_F )
238 IF(i_sk_old==0)inacti=-abs(inacti)
239 intbuf_tab%I_STOK(1)=i_sk_old
240 IF(inactii/=7.AND.inacimp>0)
THEN
245 ipari(22,nin) = inacti
251 intbuf_tab%I_STOK(1)=0
259 1 x ,intbuf_tab%NSV ,intbuf_tab%MSR,nsn ,nmn ,
261 3 xmaxl ,ymaxl ,zmaxl ,c_maxl,curv_max,
262 4 ipari(39,nin),intbuf_tab%IRECTM(1+4*eshift) ,nrtm_t,sx,sy,
263 5 sz ,sx2 ,sy2 ,sz2 ,nmn_l )
266 1 x ,intbuf_tab%NSV ,intbuf_tab%MSR,nsn ,nmn ,
267 2 itask ,intbuf_tab%XSAV,xminl ,yminl ,zminl ,
268 3 xmaxl ,ymaxl ,zmaxl ,c_maxl,curv_max,
269 4 ipari(39,nin),intbuf_tab%IRECTM(1+4*eshift) ,nrtm_t,sx,sy,
270 5 sz ,sx2 ,sy2 ,sz2 ,nmn_l )
273 bminma(1) =
max(bminma(1),xmaxl)
274 bminma(2) =
max(bminma(2),ymaxl)
275 bminma(3) =
max(bminma(3),zmaxl)
276 bminma(4) =
min(bminma(4),xminl)
277 bminma(5) =
min(bminma(5),yminl)
278 bminma(6) =
min(bminma(6),zminl)
279 curv_max_max =
max(curv_max_max,c_maxl)
280 bminma(7) = bminma(7)+sx
281 bminma(8) = bminma(8)+sy
282 bminma(9) = bminma(9)+sz
283 bminma(10)= bminma(10)+sx2
284 bminma(11)= bminma(11)+sy2
285 bminma(12)= bminma(12)+sz2
286 nmn_g = nmn_g + nmn_l
287#include "lockoff.inc"
295 IF(abs(bminma(6)-bminma(3))>2*ep30.OR.
296 + abs(bminma(5)-bminma(2))>2*ep30.OR.
297 + abs(bminma(4)-bminma(1))>2*ep30)
THEN
298 CALL ancmsg(msgid=87,anmode=aninfo,
299 . i1=noint,c1=
'(I7BUCE)')
304 bminma(2)=bminma(2)+tzinf+curv_max_max
305 bminma(3)=bminma(3)+tzinf+curv_max_max
306 bminma(4)=bminma(4)-tzinf-curv_max_max
307 bminma(5)=bminma(5)-tzinf-curv_max_max
308 bminma(6)=bminma(6)-tzinf-curv_max_max
312 mx=bminma(7)/
max(nmn_g,1)
313 my=bminma(8)/
max(nmn_g,1)
314 mz=bminma(9)/
max(nmn_g,1)
319 dx=sqrt(
max(bminma(10)/
max(nmn_g,1)-mx**2,zero))
320 dy=sqrt(
max(bminma(11)/
max(nmn_g,1)-my**2,zero))
321 dz=sqrt(
max(bminma(12)/
max(nmn_g,1)-mz**2,zero
325 bminma(7) =
min(mx+2*dx,bminma(1))
326 bminma(8) =
min(my+2*dy,bminma(2))
327 bminma(9) =
min(mz+2*dz,bminma(3))
328 bminma(10) =
max(mx-2*dx,bminma(4))
329 bminma(11) =
max(my-2*dy,bminma(5))
330 bminma(12) =
max(mz-2*dz,bminma(6))
332 IF(abs(bminma(10)-bminma(7))<em10)
THEN
336 IF(abs(bminma(11)-bminma(8))<em10)
THEN
340 IF(abs(bminma(12)-bminma(9))<em10)
THEN
346 CALL ancmsg(msgid=36,anmode=aninfo,
364 1 x ,bminma ,ipari(21,nin),nrtm_t,intbuf_tab%STFM(1+eshift),
365 2 tzinf ,curv_max,gapmin ,gapmax,intbuf_tab%GAP_M(1+eshift),
366 3 intbuf_tab%IRECTM(1+4*eshift),gap ,intbuf_tab%VARIABLES(bgapsmx_index),drad,
370 IF (imonm > 0 .AND. itask == 0)
CALL stoptime(timers,26)
376 IF (multi_fvm%IS_USED .AND. nty == 7 .AND. inacti == 7)
THEN
378 IF (imonm > 0 .AND. itask == 0)
CALL startime(timers,25)
380 1 intbuf_tab%NSV,nsn ,x ,v ,ms ,
381 2 bminma ,weight ,intbuf_tab%STFNS,nin ,isendto,
382 3 ircvfrom ,iad_elem,fr_elem ,nsnr ,ipari(21,nin),
383 4 intbuf_tab%GAP_S,itab ,kinet ,ifq ,inacti ,
384 5 nsnfiold,ipari(47,nin),intbuf_tab%IELEC,intbuf_tab%AREAS,temp ,
385 6 num_imp ,nodnx_sms,intbuf_tab%GAP_SL,nty ,idum1 ,
386 7 rdum1 ,rdum1,rdum1,rdum1,idum1 ,idum1 ,idum1, ixs, multi_fvm,
387 8 ipari(72,nin),intbuf_tab%IPARTFRICS)
388 IF (imonm > 0 .AND. itask == 0)
CALL stoptime(timers,25)
392 IF (imonm > 0 .AND. itask == 0)
CALL startime(timers,25)
395 1 intbuf_tab%NSV,nsn ,x ,v ,ms ,
396 2 bminma ,weight ,intbuf_tab%STFNS,nin ,isendto,
397 3 ircvfrom ,iad_elem,fr_elem
398 4 intbuf_tab%GAP_S,itab ,kinet ,ifq ,inacti ,
399 5 nsnfiold,ipari(47,nin),intbuf_tab%IELEC,intbuf_tab%AREAS,temp ,
400 6 num_imp ,nodnx_sms,intbuf_tab%GAP_SL,nty ,idum1 ,
401 7 rdum1 ,rdum1,rdum1,rdum1,idum1 ,idum1 ,idum1 ,
402 8 ipari(72,nin),intbuf_tab%IPARTFRICS ,itied, ivis2, intbuf_tab%IF_ADH)
403 IF (imonm > 0 .AND. itask == 0)
CALL stoptime(timers,25)
410 IF(inacti==5.OR.inacti==6.OR.inacti==7.OR.
411 + ifq>0.OR.num_imp>0.OR.itied/=0)
THEN
413 1 intbuf_tab%CAND_N,renum ,intbuf_tab%I_STOK(1), nin,nsn,
419 cand_n_old = intbuf_tab%I_STOK(1)
445 IF(ipari(63,nin) ==2 ) intbuf_tab%METRIC%ALGO = algo_voxel
449 IF(itask == 0) intbuf_tab%METRIC%TIC =
mpi_wtime()
453 intbuf_tab%METRIC%TIC = nint(100.0 * t1)
456 IF (imonm > 0 .AND. itask == 0)
CALL startime(timers,30)
458 IF(intbuf_tab%METRIC%ALGO == algo_voxel .OR. intbuf_tab%METRIC%ALGO == try_algo_voxel)
THEN
460 1 x ,intbuf_tab%IRECTM(1+4*eshift),intbuf_tab%NSV ,inacti ,intbuf_tab%CAND_P,
461 2 nmn_g ,nrtm_t ,nsn ,intbuf_tab%CAND_E,intbuf_tab%CAND_N,
462 3 gap ,noint ,intbuf_tab%I_STOK(1) ,ncontact ,bminma ,
463 4 tzinf ,maxbox ,minbox ,mwag ,curv_max ,
464 6 nb_n_b ,eshift ,ild ,ifq ,intbuf_tab%IFPEN,
465 8 intbuf_tab%STFNS,nin ,intbuf_tab%STFM(1+eshift),ipari(21,nin),intbuf_tab%GAP_S,
466 a nsnr ,ncont ,renum ,nsnrold ,intbuf_tab%GAP_M
467 b gapmin ,gapmax ,curv_max_max ,num_imp ,intbuf_tab%GAP_SL,
468 c intbuf_tab%GAP_ML(1+eshift),intth ,itask , intbuf_tab%VARIABLES(bgapsmx_index),i_mem ,
469 d intbuf_tab%KREMNODE(1+2*eshift),intbuf_tab%REMNODE,itab , ipari(63,nin),drad ,
471 f nrtm ,glob_therm%INTHEAT,glob_therm%IDT_THERM,glob_therm%NODADT_THERM
474 1 x ,intbuf_tab%IRECTM(1+4*eshift),intbuf_tab%NSV ,inacti ,intbuf_tab%CAND_P,
475 2 nmn_g ,nrtm_t ,nsn ,intbuf_tab%CAND_E,intbuf_tab%CAND_N,
476 3 gap ,noint ,intbuf_tab%I_STOK(1) ,ncontact ,bminma ,
477 4 tzinf ,maxbox ,minbox ,mwag ,curv_max ,
478 6 nb_n_b ,eshift ,ild ,ifq ,intbuf_tab%IFPEN,
479 8 intbuf_tab%STFNS,nin ,intbuf_tab%STFM(1+eshift),ipari(21,nin),intbuf_tab%GAP_S
480 a nsnr ,ncont ,renum ,nsnrold ,intbuf_tab%GAP_M(1+eshift),
481 b gapmin ,gapmax ,curv_max_max ,num_imp ,intbuf_tab%GAP_SL,
482 c intbuf_tab%GAP_ML(1+eshift),intth ,itask , intbuf_tab%VARIABLES(bgapsmx_index),i_mem ,
483 d intbuf_tab%KREMNODE(1+2*eshift),intbuf_tab%REMNODE,itab , ipari(63,nin),drad ,
484 e itied ,intbuf_tab%CAND_F,dgaploadp,glob_therm%INTHEAT, glob_therm%IDT_THERM, glob_therm%NODADT_THERM)
491#include "lockoff.inc"
498 IF(itask == 0 ) intbuf_tab%METRIC%TOC =
mpi_wtime()
502 intbuf_tab%METRIC%TOC = nint(100.0 * t1)
508 IF(i_memg == 3 .OR. i_memg == 1) intbuf_tab%METRIC%ALGO = algo_voxel
513 multimp = ipari(23,nin) + 4
518 intbuf_tab%I_STOK(1) = cand_n_old
519 multimp=ipari(23,nin)
520 ncontact=multimp*ncont
525 IF (imonm > 0 .AND. itask == 0)
CALL stoptime(timers,30)
527 IF( intbuf_tab%METRIC%ALGO == try_algo_voxel)
THEN
528 intbuf_tab%METRIC%ALGO = try_algo_bucket
529 intbuf_tab%METRIC%TOLD = intbuf_tab%METRIC%TOC - intbuf_tab%METRIC%TIC
530 ELSEIF ( intbuf_tab%METRIC%ALGO == try_algo_bucket)
THEN
531 IF( 1.2d0 * (intbuf_tab%METRIC%TOC-intbuf_tab%METRIC%TIC) < intbuf_tab%METRIC%TOLD)
THEN
532 intbuf_tab%METRIC%ALGO = algo_bucket
533 WRITE(iout,*)
"INFO: DOMAIN",ispmd,
534 .
"USES SORT2 FOR CONTACT INTERFACE",noint
536 intbuf_tab%METRIC%ALGO = algo_voxel
544 intbuf_tab%VARIABLES(maxbox_index) =
min(maxbox,intbuf_tab%VARIABLES(maxbox_index))
545 intbuf_tab%VARIABLES(minbox_index) =
min(minbox,intbuf_tab%VARIABLES(minbox_index))
546 intbuf_tab%VARIABLES(tzinf_index) =
min(tzinf,intbuf_tab%VARIABLES(tzinf_index))
547 intbuf_tab%VARIABLES(distance_index) = intbuf_tab%VARIABLES(tzinf_index)-gap
548 result = result + ild
549#include "lockoff.inc"
557 intbuf_tab%I_STOK(1) = i_sk_old
562 maxbox = intbuf_tab%VARIABLES(maxbox_index)
563 minbox = intbuf_tab%VARIABLES(minbox_index)
564 tzinf = intbuf_tab%VARIABLES(tzinf_index)
571 IF (imonm > 0)
CALL startime(timers,26)
572 intbuf_tab%VARIABLES(distance_index) = -intbuf_tab%VARIABLES(distance_index)
575 1 result ,nsn ,intbuf_tab%CAND_N,intbuf_tab%I_STOK(1),nin,
576 2 ipari(21,nin),nsnr ,multimp ,nty ,ipari(47,nin),
577 3 idum1 ,nsnfiold, ipari , h3d_data ,ipari(72,nin),
578 4 multi_fvm,glob_therm%NODADT_THERM)
582 .
CALL imp_rnumcd(intbuf_tab%CAND_N,nin,nsn,num_imp,ind_imp )
584 IF (imonm > 0)
CALL stoptime(timers,26)