62
63
64
65
66 USE timer_mod
68 USE intbufdef_mod
70 use check_sorting_criteria_mod , only : check_sorting_criteria
71 use glob_therm_mod
72
73
74
75#include "implicit_f.inc"
76#include "comlock.inc"
77
78
79
80#include "com01_c.inc"
81#include "com04_c.inc"
82#include "com08_c.inc"
83#include "param_c.inc"
84#include "task_c.inc"
85#include "timeri_c.inc"
86
87 COMMON /i20mainc/bminma,bminmae,curv_max_max,
88 . result,nsnr,nsnrold,nlinsr,i_memg
89 INTEGER ,NSNR,NSNROLD,NLINSR,I_MEMG
91 . bminma(6),bminmae(6),curv_max_max
92
93
94
95 TYPE(TIMER_) :: TIMERS
96 INTEGER NIN ,ITASK, RETRI,NRTM_T,ESHIFT,
97 . NUM_IMP ,IND_IMP(*),
98 . ITAB(*), KINET(*),
99 . IPARI(NPARI,NINTER),MWAG(*),
100 . ISENDTO(NINTER+1,*),(+1,*),
101 . WEIGHT(*), IAD_ELEM(2,*) ,FR_ELEM(*),
102 . RENUM(NUMNOD), NSNFIOLD(NSPMD), NODNX_SMS(*)
103
105 . x(*), v(*), ms(*),temp(*),diag_sms(*)
106
107 TYPE(INTBUF_STRUCT_) INTBUF_TAB
108 TYPE(H3D_DATABASE) :: H3D_DATA
109 type (glob_therm_) ,INTENT(IN) :: GLOB_THERM
110
111
112
113 INTEGER ISYM,I, IP0, IP1, IP2, IP21, K11_T, I_SK_OLD, I_STOK1,IEDGE,
114 . ADD1, NB_N_B, NOINT, INACTI, MULTIMP, IGAP, IFQ, ITIED
115 INTEGER
116 . ILD, NCONT, NCONTACT,NCONTE,NCONTACTE,
117 . INACTII,INACIMP,NSNF,NSNL,NLN,CAND_N_OLD,
118 . I_MEM
119
121 . gap,maxbox,minbox,tzinf,
122 . xmaxl, ymaxl, zmaxl, xminl, yminl, zminl, gapmin, gapmax,
123 . xmaxel, ymaxel, zmaxel, xminel, yminel, zminel, c_maxl,
124 . curv_max(nrtm_t),gap_shift,rbid
125
126 INTEGER :: NRTM,NSN,NMN,NTY
127 INTEGER :: NSNE,NMNE
128 INTEGER :: NLINSA,NLINMA,NLINM,NLINS
129 logical :: need_computation
130
131
132
133
134 call check_sorting_criteria( need_computation,nin,npari,nspmd,
135 . itask,ipari(1,nin),tt,intbuf_tab )
136 if( .not.need_computation ) return
137
138
139 i_mem = 0
140 i_memg = 0
141
142 nrtm =ipari(4,nin)
143 nsn =ipari(5,nin)
144 nmn =ipari(6,nin)
145 nty =ipari(7,nin)
146 noint =ipari(15,nin)
147 nln =ipari(35,nin)
148
149 isym = ipari(43,nin)
150 nlins =ipari(51,nin)
151 nlinm =ipari(52,nin)
152 nlinsa =ipari(53,nin)
153 nlinma =ipari(54,nin)
154 nsne =ipari(55,nin)
155 nmne =ipari(56,nin)
156 igap =ipari(21,nin)
157 iedge =ipari(58,nin)
158 ncont =ipari(18,nin)
159 nconte = ncont
160
161 inacti =ipari(22,nin)
162 multimp=ipari(23,nin)
163 ifq=ipari(31,nin)
164
165 ncontact=multimp*ncont
166 ncontacte=multimp*nconte
167
168
169 itied = 0
170
171 IF(inacti==5.OR.inacti==6.OR.inacti==7.OR.ifq>0.OR.
172 . num_imp>0)THEN
173 nsnrold = ipari(24,nin)
174 ELSE
175 nsnrold = 0
176 ENDIF
177
178 gap =intbuf_tab%VARIABLES(2)
179
180 gapmin=intbuf_tab%VARIABLES(13)
181 gapmax=intbuf_tab%VARIABLES(16)
182
183
184
185 retri=1
186
187
188 maxbox = intbuf_tab%VARIABLES(9)
189 minbox = intbuf_tab%VARIABLES(12)
190 tzinf = intbuf_tab%VARIABLES(8)
191 bminma(1)=-ep30
192 bminma(2)=-ep30
193 bminma(3)=-ep30
194 bminma(4)=ep30
195 bminma(5)=ep30
196 bminma(6)=ep30
197 curv_max_max = zero
198 bminmae(1)=-ep30
199 bminmae(2)=-ep30
200 bminmae(3)=-ep30
201 bminmae(4)=ep30
202 bminmae(5)=ep30
203 bminmae(6)=ep30
204
205
206
207
208
209
210
212
213 IF(inacti==5.OR.inacti==6.OR.ifq>0.OR.num_imp>0.OR.
214 . num_imp>0)THEN
215 IF(itask==0)THEN
216 inactii=inacti
217 IF (num_imp>0.AND.
218 . (inacti/=5.AND.inacti/=6.AND.ifq<=0)) THEN
219 inacimp = 0
220 ELSE
221 inacimp = 1
222 ENDIF
223 ip0 = 1
224
225 ip1 = ip0 + nsn + nsnrold + 3
226 i_sk_old = intbuf_tab%I_STOK(1)
228 1 nsn+nsnrold ,i_sk_old ,intbuf_tab%CAND_N ,intbuf_tab%CAND_E ,
229 2 intbuf_tab%CAND_P,intbuf_tab%CAND_FX,intbuf_tab%CAND_FY,intbuf_tab%CAND_FZ,
230 3 mwag(ip0) ,intbuf_tab%IFPEN ,inacti ,ifq ,
231 4 num_imp ,ind_imp ,intbuf_tab%STFA ,nin ,
232 5 nsn ,itied ,rbid)
233
234
235 intbuf_tab%I_STOK(1)=i_sk_old
236 IF(inacimp>0)THEN
237 IF (nspmd>1) THEN
239 . ircvfrom,inactii)
240 ELSE
241 ipari(22,nin) = inacti
242 ENDIF
243 ENDIF
244 ENDIF
245 ELSE
246 i_sk_old=0
247 intbuf_tab%I_STOK(1)=zero
248 ENDIF
249
250
251
252
253
255 1 itask ,intbuf_tab%XA,nty ,nsn ,
256 2 nmn ,nsne ,nmne ,nln ,
257 3 intbuf_tab%NSV,intbuf_tab%MSR,intbuf_tab%XSAV,
258 4 intbuf_tab%NSVL,intbuf_tab%MSRL,intbuf_tab%CRITX,
259 5 xminl ,yminl ,zminl ,xmaxl ,
260 6 ymaxl ,zmaxl ,c_maxl ,curv_max ,
261 7 ipari(39,nin),intbuf_tab%IRECTM(1+4*eshift) ,nrtm_t,xminel ,
262 8 yminel ,zminel ,xmaxel , ymaxel ,
263 9 zmaxel )
264#include "lockon.inc"
265 bminma(1) =
max(bminma(1),xmaxl)
266 bminma(2) =
max(bminma(2),ymaxl)
267 bminma(3) =
max(bminma(3),zmaxl)
268 bminma(4) =
min(bminma(4),xminl)
269 bminma(5) =
min(bminma(5),yminl)
270 bminma(6) =
min(bminma(6),zminl)
271 curv_max_max =
max(curv_max_max,c_maxl)
272#include "lockoff.inc"
273
274
275
276
277 result = 0
278
280 inacti = ipari(22,nin)
281 IF(itask==0)THEN
282 IF(abs(bminma(6)-bminma(3))>2*ep30.OR.
283 + abs(bminma(5)-bminma(2))>2*ep30.OR.
284 + abs(bminma(4)-bminma(1))>2*ep30)THEN
285 CALL ancmsg(msgid=87,anmode=aninfo,
286 . i1=noint,c1='(I20BUCE)')
288 END IF
289
290 bminma(1)=bminma(1)+tzinf+curv_max_max
291 bminma(2)=bminma(2)+tzinf+curv_max_max
292 bminma(3)=bminma(3)+tzinf+curv_max_max
293 bminma(4)=bminma(4)-tzinf-curv_max_max
294 bminma(5)=bminma(5)-tzinf-curv_max_max
295 bminma(6)=bminma(6)-tzinf-curv_max_max
296
297 nsnr = 0
298 IF(nspmd>1) THEN
299
300
301
302 IF(imonm > 0)
CALL startime(timers,25)
304 1 intbuf_tab%NSV,nsn ,intbuf_tab%XA,intbuf_tab%VA,ms ,
305 2 bminma ,weight ,intbuf_tab%STFA,nin ,isendto,
306 3 ircvfrom ,iad_elem,fr_elem ,nsnr ,igap ,
307 4 intbuf_tab%GAP_S,itab ,kinet ,ifq ,ipari(22,nin) ,
308 5 nsnfiold,ipari(47,nin),intbuf_tab%IELEC,intbuf_tab%AREAS,temp ,
309 6 num_imp ,intbuf_tab%NLG,intbuf_tab%PENIS,intbuf_tab%PENIA ,
310 + diag_sms ,
311 7 nodnx_sms ,intbuf_tab%NBINFLG,intbuf_tab%AVX_ANCR(1),intbuf_tab%AVX_ANCR(1+3*nln) )
312 IF(imonm > 0)
CALL stoptime(timers,25)
313
314
315
316
317 IF(inacti==5.OR.inacti==6.OR.inacti==7.OR.ifq>0
318 . .OR.num_imp>0)THEN
319
320 CALL spmd_rnumcd20(intbuf_tab%CAND_N,renum ,intbuf_tab%I_STOK(1),
321 1 nin, nsn ,nsnfiold,nsnrold )
322 END IF
323 END IF
324 END IF
325
326 cand_n_old = intbuf_tab%I_STOK(1)
327 40 Continue
328
329 ild = 0
330 nb_n_b = 1
331
332
333
335
336
337 IF (imonm > 0)
CALL startime(timers,30)
338 IF(nrtm_t/=0)THEN
340 1 intbuf_tab%XA,intbuf_tab%IRECTM(1+4*eshift),intbuf_tab%NSV,ipari(22,nin),
341 1 intbuf_tab%CAND_P,
342 2 nmn ,nrtm_t ,nsn ,intbuf_tab%CAND_E,intbuf_tab%CAND_N,
343 3 gap ,noint ,intbuf_tab%I_STOK(1) ,tzinf ,maxbox ,
344 4 minbox,mwag ,curv_max ,ncontact ,bminma ,
345 5 nb_n_b,eshift ,ild ,ifq ,intbuf_tab%IFPEN,
346 6 intbuf_tab%STFA,nin ,intbuf_tab%STFM(1+eshift) ,igap ,intbuf_tab%GAP_S,
347 7 nsnr ,ncont ,renum ,nsnrold ,intbuf_tab%GAP_M(1+eshift),
348 8 gapmin,gapmax ,num_imp ,nln ,intbuf_tab%NLG,
349 9 intbuf_tab%GAP_SH,intbuf_tab%NBINFLG,intbuf_tab%MBINFLG,isym ,i_mem ,
350 . glob_therm%INTHEAT, glob_therm%IDT_THERM, glob_therm%NODADT_THERM)
351
352 ENDIF
353
354
355 IF (i_mem == 2 )THEN
356#include "lockon.inc"
357 i_memg = i_mem
358#include "lockoff.inc"
359 ENDIF
360
362
363 IF(i_memg /=0)THEN
364
365
366
367 multimp = ipari(23,nin) + 4
369
370 i_mem = 0
371 i_memg = 0
372 intbuf_tab%I_STOK(1)=cand_n_old
373 multimp=ipari(23,nin)
374 ncontact=multimp*ncont
375 ncontacte=multimp*nconte
376 GOTO 40
377 ENDIF
378
379
380 IF (imonm > 0)
CALL stoptime(timers,30)
381
382#include "lockon.inc"
383 intbuf_tab%VARIABLES(9) =
min(maxbox,intbuf_tab%VARIABLES(9))
384 intbuf_tab%VARIABLES(12) =
min(minbox,intbuf_tab%VARIABLES(12))
385 intbuf_tab%VARIABLES(8) =
min(tzinf,intbuf_tab%VARIABLES(8))
386 intbuf_tab%VARIABLES(5) = intbuf_tab%VARIABLES(8)-gap
387 result = result + ild
388#include "lockoff.inc"
389
390
392 IF (result/=0) THEN
394 IF (itask==0) THEN
395 intbuf_tab%I_STOK(1) = i_sk_old
396 result = 0
397 ENDIF
399 ild = 0
400 maxbox = intbuf_tab%VARIABLES(9)
401 minbox = intbuf_tab%VARIABLES(12)
402 tzinf = intbuf_tab%VARIABLES(8)
403 GOTO 50
404 ENDIF
405
406 IF(nspmd>1)THEN
407
408
409 IF (imonm > 0)
CALL startime(timers,26)
410 intbuf_tab%VARIABLES(5) = -intbuf_tab%VARIABLES(5)
411
413 1 result ,nsn ,intbuf_tab%CAND_N,intbuf_tab%I_STOK(1),nin,
414 2 igap ,nsnr,multimp ,nty ,ipari(47,nin),
415 3 ipari(22,nin),h3d_data )
416 ipari(24,nin) = nsnr
417
418 IF (num_imp>0)
419 .
CALL imp_rnumcd(intbuf_tab%CAND_N,nin,nsn,num_imp,ind_imp )
420
421 IF (imonm > 0)
CALL stoptime(timers,26)
422
423
424 ENDIF
425
426
427
428
429
430 i_sk_old=0
431 IF(nlinma /= 0.OR.nspmd>1)THEN
432 intbuf_tab%I_STOK_E(1) = 0
433
434
435
436#include "lockon.inc"
437 bminmae(1) =
max(bminmae(1),xmaxel)
438 bminmae(2) =
max(bminmae(2),ymaxel)
439 bminmae(3) =
max(bminmae(3),zmaxel)
440 bminmae(4) =
min(bminmae(4),xminel)
441 bminmae(5) =
min(bminmae(5),yminel)
442 bminmae(6) =
min(bminmae(6),zminel)
443#include "lockoff.inc"
444 result = 0
445
447 IF(itask==0)THEN
448 IF(abs(bminmae(6)-bminmae(3))>2*ep30.OR.
449 + abs(bminmae(5)-bminmae(2))>2*ep30.OR.
450 + abs(bminmae(4)-bminmae(1))>2*ep30)THEN
451#include "lockon.inc"
452 CALL ancmsg(msgid=87,anmode=aninfo,
453 . i1=noint,c1='(I20BUCE)')
454#include "lockoff.inc"
456 END IF
457 bminmae(1)=bminmae(1)+tzinf
458 bminmae(2)=bminmae(2)+tzinf
459 bminmae(3)=bminmae(3)+tzinf
460 bminmae(4)=bminmae(4)-tzinf
461 bminmae(5)=bminmae(5)-tzinf
462 bminmae(6)=bminmae(6)-tzinf
463
464
465
466 nlinsr = 0
467 IF(nspmd>1) THEN
468 IF(imonm >0)
CALL startime(timers,25)
470 1 intbuf_tab%IXLINS,nlinsa ,intbuf_tab%XA,intbuf_tab%VA,ms ,
471 2 bminmae ,weight ,intbuf_tab%STFS,nin ,isendto,
472 3 ircvfrom ,iad_elem,fr_elem ,nlinsr ,ipari(22,nin),
473 4 intbuf_tab%GAP_SE,intbuf_tab%PENISE,itab ,igap ,tzinf ,
474 5 intbuf_tab%NLG,intbuf_tab%PENIA,diag_sms,nodnx_sms)
475 IF(imonm >0)
CALL stoptime(timers,25)
476 END IF
477 END IF
478
479 cand_n_old = intbuf_tab%I_STOK_E(1)
480 140 CONTINUE
481 nrtm_t = nlinma/nthread
482 eshift = itask*nrtm_t
483 IF(itask==nthread-1)nrtm_t=nlinma-(nthread-1)*(nlinma/nthread)
484 ild = 0
485
486
487
489 gap_shift=zero
490 IF(igap/=0)THEN
491 gap_shift= gap
492 gap = gap + gap_shift
493
494 ENDIF
495 IF(nrtm_t/=0)THEN
497 1 intbuf_tab%XA,intbuf_tab%IXLINS,intbuf_tab%IXLINM(1+2*itask*nrtm_t),intbuf_tab%NLG,
498 2 nlinsa ,nmne ,nrtm_t ,intbuf_tab%LCAND_N,intbuf_tab%LCAND_S,
499 3 gap ,noint ,intbuf_tab%I_STOK_E(1),bminmae ,tzinf ,
500 4 maxbox ,minbox ,nb_n_b , eshift ,ild ,
501 6 ncontacte,intbuf_tab%ADCCM20(1+itask*nrtm_t) ,intbuf_tab%CHAIN20,nin ,itab ,
502 7 nlinsr ,ncont ,intbuf_tab%GAP_SE,intbuf_tab%STFS,intbuf_tab%PENISE ,
503 8 igap ,intbuf_tab%STF(1+itask*nrtm_t),ipari(42,nin) , i_mem )
504 ENDIF
505
506
507 IF (i_mem == 1 .OR. i_mem == 2)THEN
508#include "lockon.inc"
509 i_memg = i_mem
510#include "lockoff.inc"
511 ENDIF
512
513
515
516 IF(i_memg /=0)THEN
517
518
519
520 multimp = ipari(23,nin) + 4
522
523 i_memg = 0
524 i_mem = 0
525 intbuf_tab%I_STOK_E(1)=cand_n_old
526 multimp=ipari(23,nin)
527 ncontact=multimp*ncont
528 ncontacte=multimp*nconte
529 GOTO 140
530 ENDIF
531
532#include "lockon.inc"
533 intbuf_tab%VARIABLES(9) =
min(maxbox,intbuf_tab%VARIABLES(9))
534 intbuf_tab%VARIABLES(12) =
min(minbox,intbuf_tab%VARIABLES(12))
535 intbuf_tab%VARIABLES(8) =
min(tzinf,intbuf_tab%VARIABLES(8))
536 intbuf_tab%VARIABLES(5) = intbuf_tab%VARIABLES(8)-gap
537 result = result + ild
538#include "lockoff.inc"
539
540
542 IF (result/=0) THEN
544 IF (itask==0) THEN
545 intbuf_tab%I_STOK_E(1) = i_sk_old
546 result = 0
547 ENDIF
549 ild = 0
550 maxbox = intbuf_tab%VARIABLES(9)
551 minbox = intbuf_tab%VARIABLES(12)
552 tzinf = intbuf_tab%VARIABLES(8)
553 GOTO 150
554 ENDIF
555 IF (nspmd>1) THEN
556
557
558
559 IF (imonm > 0)
CALL startime(timers,26)
560
561 IF(intbuf_tab%VARIABLES(5)>=zero) intbuf_tab%VARIABLES(5)= -intbuf_tab%VARIABLES(5)
563 1 result ,nlinsa,intbuf_tab%LCAND_S,intbuf_tab%I_STOK_E(1),nin,
564 2 ipari(22,nin),nlinsr,multimp ,igap )
565 ipari(57,nin) = nlinsr
566
567 IF (imonm > 0)
CALL stoptime(timers,26)
568
569
570 ENDIF
571 ENDIF
572
573 RETURN
subroutine i20buc_edge(xa, ixlins, ixlinm, nlg, nlinsa, nmne, nlinma, cand_m, cand_s, gap, noint, ii_stoke, bminma, tzinf, maxbox, minbox, nb_n_b, eshift, ild, ncontact, addcm, chaine, nin, itab, nlinsr, ncont, gap_s, stifs, penis, igap, stifm, iauto, i_mem)
subroutine i20buce(xa, irect, nsv, inacti, cand_p, nmn, nrtm, nsn, cand_e, cand_n, gap, noint, ii_stok, tzinf, maxbox, minbox, mwag, curv_max, ncontact, bminma, nb_n_b, eshift, ild, ifq, ifpen, stfa, nin, stf, igap, gap_s, nsnr, ncont, renum, nsnrold, gap_m, gapmin, gapmax, num_imp, nln, nlg, gap_sh, nbinflg, mbinflg, isym, i_mem, intheat, idt_therm, nodadt_therm)
subroutine i20xsave(itask, xa, nty, nsn, nmn, nsne, nmne, nln, nsv, msr, xsav, nsve, msre, xsave, xmin, ymin, zmin, xmax, ymax, zmax, c_max, curv_max, icurv, irect, nrtm_t, xmine, ymine, zmine, xmaxe, ymaxe, zmaxe)
subroutine i7trc(nsn, i_stok, cand_n, cand_e, cand_p, cand_fx, cand_fy, cand_fz, cand_a, ifpen, inacti, ifq, num_imp, ind_imp, stfns, nin, nsnl, itied, cand_f)
subroutine imp_rnumcd(cand_n, nin, nsn, num_imp, index)
subroutine spmd_get_inacti7(inacti, ipari22, nin, isendto, ircvfrom, inactii)
subroutine spmd_tri20gate(result, nrts, cand_s, i_stok, nin, inacti, nrtsr, multimp, igap)
subroutine spmd_tri20gat(result, nsn, cand_n, i_stok, nin, igap, nsnr, multimp, ity, intth, inacti, h3d_data)
subroutine spmd_tri20box(nsv, nsn, xa, va, ms, bminmal, weight, stfa, nin, isendto, ircvfrom, iad_elem, fr_elem, nsnr, igap, gap_s, itab, kinet, ifq, inacti, nsnfiold, intth, ielec, areas, temp, num_imp, nlg, penis, penia, diag_sms, nodnx_sms, nbinflg, dxanc, dvanc)
subroutine spmd_tri20boxe(ixlins, nrts, xa, va, ms, bminmal, weight, stifs, nin, isendto, ircvfrom, iad_elem, fr_elem, nrtsr, inacti, gap_s, penis, itab, igap, tzinf, nlg, penia, diag_sms, nodnx_sms)
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)
subroutine startime(event, itask)
subroutine stoptime(event, itask)
subroutine upgrade_multimp(ni, multimp_parameter, intbuf_tab)