74
75
76
88 USE matparam_def_mod
89 USE format_mod , ONLY : fmw_a_i
90 use element_mod , only : nixs,nixq,nixc,nixp,nixt,nixr,nixtg
91
92
93
94#include "implicit_f.inc"
95
96
97
98#include "assert.inc"
99#include "com01_c.inc"
100#include "com04_c.inc"
101#include "scr12_c.inc"
102#include "param_c.inc"
103#include "units_c.inc"
104#include "scr15_c.inc"
105#include "scr05_c.inc"
106#include "scr17_c.inc"
107#include "scr23_c.inc"
108#include "sms_c.inc"
109#include "r2r_c.inc"
110#include "kincod_c.inc"
111#include "sphcom.inc"
112
113
114
115 INTEGER IXS(NIXS,*), IXQ(NIXQ,*), IXC(NIXC,*), IXT(NIXT,*),
116 . IXP(NIXP,*), IXR(NIXR,*), IXTG(NIXTG,*),
117 . CEP(*), ITRI1(*), ITRI2(*), INDEX1(*),INDEX2(*),
118 . NUM(*), NELEM,IDDLEVEL, NELEMINT,
119 . KXX(NIXX,NUMELX),IXX(*), ADSKY(0:*),IGEO(NPROPGI,NUMGEO),
120 . ISOLNOD(*), IWCONT(5,*), IWCIN2(2,*), DSDOF(*),
121 . ISOLOFF(*), ISHEOFF(*), ITRIOFF(*), IKINE(*),
122 . ITRUOFF(*), IPOUOFF(*), IRESOFF(*), IELEM21(*),
123 . IPM(NPROPMI,NUMMAT),IXS10(6,*),KXIG3D(NIXIG3D,NUMELIG3D),
124 . IQUAOFF(*),
125 . IXIG3D(*),NSNT, NMNT,TABMP_L,
126 . FVMAIN(NVOLU)
127 INTEGER :: ITAB(*)
128 INTEGER, DIMENSION(LIPART1,*), INTENT(IN) :: IPART
129 INTEGER, DIMENSION(*), INTENT(IN) :: IPARTC,IPARTG,IPARTS
130 TYPE (CLUSTER_) ,DIMENSION(*) :: CLUSTERS
131 my_real geo(npropg,numgeo), pm(npropm,nummat), x(3,*), cost_r2r,bufmat(*)
132 REAL WD(*)
133 INTEGER TAILLE
134 INTEGER, DIMENSION(NUMMAT_OLD) ::
135 INTEGER, DIMENSION(7,TAILLE_OLD) :: TAB_UMP_OLD
136 INTEGER, DIMENSION(NUMMAT) :: POIN_UMP
137 INTEGER, DIMENSION(7,TAILLE) :: TAB_UMP
138 my_real,
DIMENSION(TAILLE_OLD) :: cputime_mp_old
139 INTEGER, DIMENSION(2,NPART), INTENT(IN) :: POIN_PART_SHELL,POIN_PART_TRI
140 INTEGER, DIMENSION(2,NPART,7), INTENT(IN) :: POIN_PART_SOL
141 TYPE(MID_PID_TYPE), DIMENSION(NUMMAT), INTENT(IN) :: MID_PID_SHELL,MID_PID_TRI
142 TYPE(MID_PID_TYPE), DIMENSION(NUMMAT,7), INTENT(IN) :: MID_PID_SOL
143 TYPE (SURF_) , DIMENSION(NSURF) :: IGRSURF
144 TYPE(MONVOL_STRUCT_), DIMENSION(NVOLU), INTENT(IN) ::
145 INTEGER,INTENT(IN) :: EBCS_TAG_CELL_SPMD(+NUMELTG+NUMELS)
146 INTEGER, DIMENSION(NNPBY,*), INTENT(in) :: NPBY
147 INTEGER, DIMENSION(*), INTENT(in) :: LPBY
148 TYPE(INTER_CAND_), INTENT(in) :: INTER_CAND
149 TYPE(MATPARAM_STRUCT_) ,DIMENSION(NUMMAT), INTENT(IN) :: MAT_PARAM
150
151
152
153 INTEGER NCRITMAX
154 parameter(ncritmax = 20)
155 INTEGER NSEG, I, J, UTIL, K, NUSE, ELEMD_OLD,
156 . LCNE,IO_ERR1,ISH1,ISH2,II, NNC, IT,
157 . NEDGES, ELK, OFF,CC1, CC2, NUMG1, NUMG2,
158 . INED,L,M,N,NEWEDGE,NEDGES_OLD,
159 . LENWORK,NOD1, NOD2, MODE, NELEM0, MM,
160 . WORK(70000), NUML, IERROR,
161 . ELEMD, IMMNUL, NEDDEL, ITYPINT, IWARN1,
162 . MAXI, MAXJ, MAX, I1, I2, I3, N1, N2, NUMG3, NUMG4,
163 . NELX,ADDX,MID,PID,JALE,MLN,NSHIFT,NNODE, NN,
164 . OPTIONS(40),NCOND,NFLAG,IWFLG,NODC,ICUR,IERR1,NEC,
165 . INWDCOUNT,ICCAND,ICNOD_SMS,ISOLBAR, ICKIN, NK, NKI,
166 . ICELEM, ICINTS, ICINTM, ICINT2, ICDDL, ICFSI, ICDEL, ICSOL,
167 . ICR2R,NUMEL_R2R, CEPCLUSTER,
168 . NCONNX, CURR, PREV, NEXT, I1OLD, I2OLD, INC, IDB_METIS,
169 . NELIG3D,NCOND2,LSMS,
170 . OFFC,OFFTG,K0,ITYP,
171 . NN_L,IS,IAD,ITY,,JALE_FROM_MAT, JALE_FROM_PROP
172 INTEGER, DIMENSION(:),ALLOCATABLE :: XADJ, ADJNCY,IWD,IWD2,
173 . IENDT,ITRI,INDEX,DOMCLUSTER,ELEMCLUST,
174 . XADJ_OLD, ADJNCY_OLD, COLORS, ROOTS,
175 . POINTER_NEIGH,CONNECT_WEIGHT,TAGELEM,CNE,
176 . IWD_COPY
177 INTEGER, DIMENSION(:), ALLOCATABLE :: IWKIN
178 INTEGER TAILLE_LOCAL,PREV_NEIGH,C_NEIGH,,
179 . ELEMNODES(MAX_NB_NODES_PER_ELT),OFFELEM(10),WGHT
180 INTEGER, DIMENSION(:,:), ALLOCATABLE :: CONNECTIVITY
181 INTEGER, DIMENSION(:), ALLOCATABLE :: NB_NODES_MINI
182 REAL, DIMENSION(:),ALLOCATABLE :: ,WD_COPY
183 CHARACTER FILNAM*109, KEYA*80, CHLEVEL*1
184 REAL FAC, UBVEC(15), SCAL
185 DOUBLE PRECISION
186 . AVERAGE(NCRITMAX), DEVIATION(NCRITMAX), DMIN(NCRITMAX), DMAX(NCRITMAX),
187 . W(NSPMD), WIS(NSPMD),WIM(NSPMD),WI2(NSPMD), WDDL(NSPMD),
188 . WFSI(NSPMD), WCAND(NSPMD), WSOL(NSPMD), WKIN(NSPMD),
189 . WDEL(NSPMD), WR2R(NSPMD), WNOD_SMS(NSPMD)
190 DOUBLE PRECISION :: WS, WD_MAX,WD_MAX0
191
192
193 INTEGER METIS_PartGraphKway, METIS_PartGraphRecursive,
194 . METIS_SetDefaultOptions,Wrap_METIS_PartGraphKway,
195 . WRAP_METIS_PARTGRAPHRECURSIVE
196 INTEGER NNO,,NTG,NNI,NTGT,NTGI
197 INTEGER NELMIN
198 INTEGER NFVMBAG,NB_FVMBAG_TRIM,DD_FVMBAG_TRY
199 INTEGER FVM_ELEM(NVOLU),AVG,MAX_TRY
200 INTEGER WD_MAX_FACTOR
201 INTEGER NB_ELEM_ALE,MAIN_TARGET
202 CHARACTER (LEN=255) :: STR
203 LOGICAL :: FVM_DOMDEC,DD_UNBALANCED
204 LOGICAL, DIMENSION(:), ALLOCATABLE :: TAGGED_ELEM
205 INTEGER, DIMENSION(:), ALLOCATABLE :: ISORT,INDEX_SORT
206
207 INTEGER (kind=8) :: NEDGES_8
208 INTEGER :: CLUSTER_TYP,OFFSET_CLUSTER
209 my_real,
DIMENSION(:,:),
ALLOCATABLE :: coords
210 my_real,
DIMENSION(:),
ALLOCATABLE :: min_dist
213 INTEGER :: CEP_MIN
214 INTEGER :: C1,C2
215 INTEGER :: OFFSET
216
217
218
219 INTEGER :: number_of_added_edges
220 INTEGER :: refused_cep0, refused_numg,refused_numg0
221 INTEGER :: switch_tried, switch_done
222
223 integer, pointer :: null_int(:)
224 real, pointer :: null_real(:)
225 integer :: int_bidon
226 real :: real_bidon
227
228 INTEGER :: IJK
229 INTEGER :: NSN
230 INTEGER :: NUMBER_OF_ELEMENT_RBODY,NUMEL
231 INTEGER, DIMENSION(:), ALLOCATABLE :: LIST_ELEMENT_RBODY
232 LOGICAL :: BOOL_RBODY
233
234
235
236 EXTERNAL metis_partgraphkway, metis_partgraphrecursive,
239
240
241
242 ALLOCATE(iwkin(numnod))
243 number_of_added_edges = 0
244 refused_numg = 0
245 refused_numg0 = 0
246
247 refused_cep0 = 0
248 switch_tried = 0
249 switch_done = 0
250
251 nec=0
252 nfvmbag = 0
253 fvmain(1:nvolu) = -1
254 fvm_elem(1:nvolu) = 0
255 fvm_domdec = .false.
256 wd_max = 0.0d0
257 wd_max0= 0.0d0
258 nnode = nspmd
259
260
261
262
263 DO i=1,numnod+1
264 adsky(i) = 0
265 END DO
266
267 DO 110 k=2,9
268 DO 110 i=1,numels
269 n = ixs(k,i) + 1
270 adsky(n) = adsky(n) + 1
271 110 CONTINUE
272
273
274 IF(numels10>0) THEN
275 DO j=1,numels10
276 DO k=1,6
277 n = ixs10(k,j) + 1
278 adsky(n) = adsky(n) + 1
279 ENDDO
280 ENDDO
281 ENDIF
282
283 DO 120 k=2,5
284 DO 120 i=1,numelq
285 n = ixq(k,i) + 1
286 adsky(n) = adsky(n) + 1
287 120 CONTINUE
288
289 DO 130 k=2,5
290 DO 130 i=1,numelc
291 n = ixc(k,i) + 1
292 adsky(n) = adsky(n) + 1
293 130 CONTINUE
294
295 DO 140 k=2,3
296 DO 140 i=1,numelt
297 n = ixt(k,i) + 1
298 adsky(n) = adsky(n) + 1
299 140 CONTINUE
300
301 DO 150 k=2,3
302 DO 150 i=1,numelp
303 n = ixp(k,i) + 1
304 adsky(n) = adsky(n) + 1
305 150 CONTINUE
306
307
308 DO k=2,3
309 DO i=1,numelr
310 n = ixr(k,i) + 1
311 adsky(n) = adsky(n) + 1
312 ENDDO
313 ENDDO
314 DO i=1,numelr
315 n = ixr(4,i) + 1
316 IF(nint(geo(12,ixr(1,i)))==12) THEN
317 adsky(n) = adsky(n) + 1
318 ENDIF
319 ENDDO
320
321 DO 170 k=2,4
322 DO 170 i=1,numeltg
323 n = ixtg(k,i) + 1
324 adsky(n) = adsky(n) + 1
325 170 CONTINUE
326
327
328
329 DO i=1,numelx
330 nelx=kxx(3,i)
331 DO k=1,nelx
332 addx = kxx(4,i)+k-1
333 n=ixx(addx)+1
334 adsky(n)= adsky(n)+1
335 ENDDO
336 ENDDO
337
338
339 DO i=1,numelig3d
340 nelig3d=kxig3d(3,i)
341 DO k=1,nelig3d
342 addx = kxig3d(4,i)+k-1
343 n=ixig3d(addx)+1
344 adsky(n)= adsky(n)+1
345 ENDDO
346 ENDDO
347
348 adsky(1) = 1
349 DO i=2,numnod+1
350 adsky(i) = adsky(i) + adsky(i-1)
351 END DO
352
353 lcne = adsky(numnod+1)
354 ALLOCATE(cne(lcne),stat=ierr1)
355
356 IF(ierr1/=0)THEN
357 CALL ancmsg(msgid=268,anmode=aninfo,msgtype=msgerror,
358 . c1='DOMDEC')
359 END IF
360
361
362
363
364
365 DO i = 1, nelem
366 wd(i) = 0.
367 ENDDO
368 elemd = 0
369 filnam=rootnam(1:rootlen)//'_0001.rad'
370 OPEN(unit=71,file=filnam(1:rootlen+9),
371 . access='SEQUENTIAL',status='OLD',iostat=io_err1)
372
373 IF (io_err1/=0) THEN
374 filnam=rootnam(1:rootlen)//'D01'
375 OPEN(unit=71,file=filnam(1:rootlen+3),
376 . access='SEQUENTIAL',status='OLD',iostat=io_err1)
377 ENDIF
378
379 IF (io_err1==0) THEN
380 OPEN(unit=72,form='FORMATTED',status='SCRATCH')
381 elemd = 0
382 10 READ(71,'(A)',END=20) keya
383 11 CONTINUE
384 IF(keya(1:12)=='/DEL/SHELL/1') THEN
385 30 READ(71,'(A)',END=20) keya
386 IF(keya(1:1)=='#')GOTO 30
387 IF(keya(1:1)=='$')GOTO 30
388 IF(keya(1:1)=='/')GOTO 11
389
390 rewind(72)
391 WRITE(72,'(A)')keya
392 rewind(72)
393 READ(72,*,END=20)ISH1,ish2
394 DO i = 1, numelc
395 IF(ixc(nixc,i)>=ish1.AND.ixc(nixc,i)<=ish2) THEN
396 DO j = ish1, ish2
397 IF(ixc(nixc,i)==j) THEN
398 wd(i+numels+numelq) = 0.0001
399 elemd = elemd + 1
400 GOTO 35
401 ENDIF
402 ENDDO
403 ENDIF
404 35 CONTINUE
405 ENDDO
406 GOTO 30
407 ELSEIF(keya(1:12)=='/DEL/BRICK/1') THEN
408 60 READ(71,'(A)',END=20) keya
409 IF(keya(1:1)=='#')GOTO 60
410 IF(keya(1:1)=='$')GOTO 60
411 IF(keya(1:1)=='/')GOTO 11
412
413 rewind(72)
414 WRITE(72,'(A)')keya
415 rewind(72)
416 READ(72,*,END=20)ISH1,ish2
417 DO i = 1, numels
418 IF(ixs(nixs,i)>=ish1.AND.ixs(nixs,i)<=ish2) THEN
419 DO j = ish1, ish2
420 IF(ixs(nixs,i)==j) THEN
421 wd(i) = 0.0001
422 elemd = elemd + 1
423 GOTO 65
424 ENDIF
425 ENDDO
426 ENDIF
427 65 CONTINUE
428 ENDDO
429 GOTO 60
430
431 ELSEIF(keya(1:12)=='/DEL/SH_3N/1') THEN
432 90 READ(71,'(A)',END=20) keya
433 IF(keya(1:1)=='#')GOTO 90
434 IF(keya(1:1)=='$')GOTO 90
435 IF(keya(1:1)=='/')GOTO 11
436
437 rewind(72)
438 WRITE(72,'(A)')keya
439 rewind(72)
440 READ(72,*,END=20)ISH1,ish2
441 DO i = 1, numeltg
442 IF(ixtg(nixtg,i)>=ish1
443 . .AND.ixtg(nixtg,i)<=ish2) THEN
444 DO j = ish1, ish2
445 IF(ixtg(nixtg,i)==j) THEN
446 wd(i+numels+numelq+numelc+numelt
447 . +numelp+numelr) = 0.0001
448 elemd = elemd + 1
449 GOTO 95
450 ENDIF
451 ENDDO
452 ENDIF
453 95 CONTINUE
454 ENDDO
455 GOTO 90
456 ENDIF
457 GOTO 10
458 20 CONTINUE
459 CLOSE(71)
460 CLOSE(72)
461
462 IF(iddlevel==0) THEN
463 WRITE(iout,*)' '
464 WRITE(iout,'(A)')
465 . ' SPMD IS CHECKING FOR ELEMENT DELETION IN : ',' '//filnam
466 ENDIF
467
468 ELSE
469
470 IF(iddlevel==0) THEN
471 WRITE(iout,*)' '
472 WRITE(iout,'(A)')
473 . ' SPMD IS NOT ABLE TO CHECK FOR ELEMENT DELETION IN'//
474 . ' RADIOSS ENGINE INPUT FILE'
475 ENDIF
476 ENDIF
477
478
479
480
481 elemd_old = elemd
482 isolbar=0
483 DO ii = 1, numels
484 IF((isoloff(ii)==1.OR.isoloff(ii)==3).AND.
485 * wd(ii)/=0.0001)THEN
486 wd(ii) = 0.0001
487 elemd = elemd + 1
488 END IF
489
490 mid = abs(ixs(1,ii))
491 pid = abs(ixs(10,ii))
492 jale_from_mat = nint(pm(72,mid))
493 jale_from_prop = igeo(62,pid)
494 jale =
max(jale_from_mat, jale_from_prop)
495 mln = nint(pm(19,mid))
496 IF(jale==0.AND.(mln==28.OR.mln==68))THEN
497 isolbar=isolbar+1
498 ENDIF
499 END DO
500
501 DO ii = 1, numelq
502 IF((iquaoff(ii)==1.OR.iquaoff(ii)==3).AND.
503 * wd(ii+numels)/=0.0001)THEN
504 wd(ii+numels) = 0.0001
505 elemd = elemd + 1
506 END IF
507 END DO
508
509 DO ii = 1, numelc
510 IF((isheoff(ii)==1.OR.isheoff(ii)==3).AND.
511 * wd(ii+numels+numelq)/=0.0001)THEN
512 wd(ii+numels+numelq) = 0.0001
513 elemd = elemd + 1
514 END IF
515 END DO
516
517 DO ii = 1, numelt
518 IF((itruoff(ii)==3 ).AND.
519 * wd(ii+numels+numelq+numelc)/=0.0001 )THEN
520 wd(ii+numels+numelq+numelc) = 0.0001
521 elemd = elemd + 1
522 END IF
523 END DO
524
525 DO ii = 1, numelp
526 IF((ipouoff(ii)==3 ).AND.
527 * wd(ii+numels+numelq+numelc+numelt)/=0.0001 )THEN
528 wd(ii+numels+numelq+numelc+numelt) = 0.0001
529 elemd = elemd + 1
530 END IF
531 END DO
532
533 DO ii = 1, numelr
534 IF((iresoff(ii)==3 ).AND.
535 * wd(ii+numels+numelq+numelc+numelt+numelp)/=0.0001 )THEN
536 wd(ii+numels+numelq+numelc+numelt+numelp) = 0.0001
537 elemd = elemd + 1
538 END IF
539 END DO
540
541 DO ii = 1, numeltg
542 IF(itrioff(ii)==1.AND.wd(ii+numels+numelq+numelc+numelt
543 . +numelp+numelr)/=0.0001)THEN
544 wd(ii+numels+numelq+numelc+numelt
545 . +numelp+numelr) = 0.0001
546 elemd = elemd + 1
547 END IF
548 END DO
549
550
551
552 IF (nelem > 0) THEN
553 IF(float(nelem-elemd)/float(nelem)>zep95) elemd = 0
554 END IF
555 IF(iddlevel==0.AND.elemd>elemd_old) THEN
556 WRITE(iout,*)' '
557 WRITE(iout,'(A)')
558 . ' DOMAIN DECOMPOSITION OPTIMIZED FOR ELEMENT DEACTIVATION'//
559 . ' IN /RBODY OPTIONS'
560 ENDIF
561
562
563 IF (iddlevel==1) THEN
564 WRITE(iout,'(A)')' '
565 WRITE(iout,'(A)')
566 . ' --------------------------------------'
567 WRITE(iout,'(A)')
568 . ' NEW DOMAIN DECOMPOSITION FOR OPTIMIZATION'
569 WRITE(iout,'(A)')
570 . ' --------------------------------------'
571 ENDIF
572 WRITE(istdo,'(A)')' .. DOMAIN DECOMPOSITION'
573 WRITE(iout,'(A)')' '
574 IF(dectyp==3)THEN
575 WRITE(iout,'(A)')
576 . ' DOMAIN DECOMPOSITION USING MULTILEVEL KWAY'
577 ELSEIF(dectyp==4)THEN
578 WRITE(iout,'(A)')
579 . ' DOMAIN DECOMPOSITION USING MULTILEVEL RSB'
580 ELSEIF(dectyp==5)THEN
581 WRITE(iout,'(A)')
582 . ' DOMAIN DECOMPOSITION USING MULTILEVEL KWAY FOR IMPLICIT AND AMS'
583 ELSEIF(dectyp==4)THEN
584 WRITE(iout,'(A)')
585 . ' DOMAIN DECOMPOSITION USING MULTILEVEL RSB FOR IMPLICIT'
586 END IF
587 WRITE(iout,'(A)')
588 . ' ------------------------------------------'
589 IF (ipari0==1) THEN
590 WRITE(iout,'(A)')
591 . ' DOMAIN DECOMPOSITION OPTIMIZED FOR PARALLEL ARITHMETIC ON'
592 ELSE
593 WRITE(iout,'(A)')
594 . ' DOMAIN DECOMPOSITION OPTIMIZED FOR PARALLEL ARITHMETIC OFF'
595 ENDIF
596
597 IF(iddlevel == 1 .AND. ddnod_sms /= 0)THEN
598 WRITE(iout,'(A)')
599 . ' ADDITIONAL OPTIMIZATION OF DOMAIN DECOMPOSITION FOR AMS (DOMDEC=7)'
600 END IF
601
602
603
604
605 ALLOCATE(tagelem(nelem))
606 DO i = 1,nelem
607 tagelem(i)=0
608 END DO
609 DO i=1,numels
610 tagelem(i)=1
611 DO k=1,8
612 n = ixs(k+1,i)
613 IF(n /= 0) THEN
614 cne(adsky(n)) = i
615 adsky(n) = adsky(n) + 1
616 END IF
617 ENDDO
618 ENDDO
619
620 IF(numels10>0) THEN
621 DO j=1,numels10
622 tagelem(abs(-(numels8+j)))=2
623 DO k=1,6
624 n = ixs10(k,j)
625 IF(n /= 0) THEN
626 cne(adsky(n)) = -(numels8+j)
627 adsky(n) = adsky(n) + 1
628 ENDIF
629 ENDDO
630 ENDDO
631 ENDIF
632
633
634
635 offelem(1)=numels
636 off = numels
637
638 DO i = 1, numelq
639 tagelem(i+off)=3
640 DO k=1,4
641 n = ixq(k+1,i)
642 cne(adsky(n)) = i+off
643 adsky(n) = adsky(n) + 1
644 ENDDO
645 ENDDO
646
647 offelem(2)=numelq
648 off = off + numelq
649
650 DO i = 1, numelc
651 tagelem(i+off)=4
652 DO k=1,4
653 n = ixc(k+1,i)
654 cne(adsky(n)) = i+off
655 adsky(n) = adsky(n) + 1
656 ENDDO
657 ENDDO
658
659
660 offelem(3)=numelc
661 off = off + numelc
662
663 DO i = 1, numelt
664 tagelem(i+off)=5
665 DO k=1,2
666 n = ixt(k+1,i)
667 cne(adsky(n)) = i+off
668 adsky(n) = adsky(n) + 1
669 ENDDO
670 ENDDO
671
672 offelem(4)= numelt
673 off = off + numelt
674
675 DO i = 1, numelp
676 tagelem(i+off)=6
677 DO k=1,2
678 n = ixp(k+1,i)
679 cne(adsky(n)) = i+off
680 adsky(n) = adsky(n) + 1
681 ENDDO
682 ENDDO
683
684 offelem(5) = numelp
685 off = off + numelp
686
687 DO i = 1, numelr
688 tagelem(i+off)=7
689 DO k=1,2
690 n = ixr(k+1,i)
691 cne(adsky(n)) = i+off
692 adsky(n) = adsky(n) + 1
693 ENDDO
694 IF(nint(geo(12,ixr(1,i)))==12) THEN
695 n = ixr(4,i)
696 cne(adsky(n)) = i+off
697 adsky(n) = adsky(n) + 1
698 ENDIF
699 ENDDO
700
701 offelem(6)=numelr
702 off = off + numelr
703
704 DO i = 1, numeltg
705 tagelem(i+off)=8
706 DO k=1,3
707 n = ixtg(k+1,i)
708 cne(adsky(n)) = i+off
709 adsky(n) = adsky(n) + 1
710 ENDDO
711 ENDDO
712
713 offelem(7)=numeltg
714 off = off + numeltg
715
716
717 offelem(8) = 0
718
719 DO i=1, numelx
720 tagelem(i+off)=10
721 nelx=kxx(3,i)
722 DO k=1,nelx
723 addx = kxx(4,i)+k-1
724 n=ixx(addx)
725 cne(adsky(n)) = i+off
726 adsky(n) = adsky(n) + 1
727 ENDDO
728 ENDDO
729
730 offelem(9)=numelx
731 off = off + numelx
732
733 DO i=1, numelig3d
734 tagelem(i+off)=11
735 nelig3d=kxig3d(3,i)
736 DO k=1,nelig3d
737 addx = kxig3d(4,i)+k-1
738 n=ixig3d(addx)
739 cne(adsky(n)) = i+off
740 adsky(n) = adsky(n) + 1
741 ENDDO
742 ENDDO
743
744 offelem(10)=numelig3d
745 off = off + numelig3d
746
747
748 DO i=numnod+1,2,-1
749 adsky(i) = adsky(i-1)
750 END DO
751
752 adsky(1) = 1
753
754
755 icelem=1
756 icints=0
757 icintm=0
758 icint2=0
759 iccand=0
760 icnod_sms=0
761 icddl=0
762 icfsi=0
763 icsol=0
764 icdel=0
765 icr2r=0
766 ickin=0
767 ncond=1
768
769 DO i = 1, nelemint
770 itypint=abs(inter_cand%IXINT(6,i))
771 IF(itypint == 2)THEN
772 icint2 = icint2+1
773 ELSEIF(itypint == 7 .OR. itypint == 11)THEN
774 icints = icints+1
775 icintm = icintm+1
776 iccand = iccand+1
777 ELSEIF(itypint == 24 .OR. itypint == 25)THEN
778 icints = icints+1
779 icintm = icintm+1
780 iccand = iccand+1
781 END IF
782 END DO
783
784 IF(ddnod_sms/=0)THEN
785 ncond=ncond+1
786 icnod_sms=ncond
787 ELSE
788 icnod_sms=0
789 END IF
790
791 IF(nelem > 0) THEN
792 IF((icints+icintm>100) .AND.
793 + (nelem < icints+icintm .OR.
794 + float(nelem-icints-icintm)/float(nelem)<=zep95)) THEN
795 ncond=ncond+1
796 icints=ncond
797 ncond=ncond+1
798 icintm=ncond
799 ELSE
800 IF(nsnt+nmnt>100) THEN
801 ncond=ncond+1
802 icints=ncond
803 ncond=ncond+1
804 icintm=ncond
805 ELSE
806 icints=0
807 icintm=0
808 ENDIF
809 END IF
810 IF((icint2>100) .AND.
811 + (nelem < icint2 .OR.
812 + float(nelem-icint2)/float(nelem)<=zep98)) THEN
813 ncond=ncond+1
814 icint2=ncond
815 ELSE
816 icint2=0
817 END IF
818
819 IF((iccand>100) .AND.
820 + (nelem < iccand .OR.
821 + float(nelem-iccand)/float(nelem)<=zep95)) THEN
822 ncond=ncond+1
823 iccand=ncond
824 ELSE
825 iccand=0
826 END IF
827 ELSE
828 icints = 0
829 icintm = 0
830 icint2 = 0
831 iccand = 0
832 ENDIF
833
834 nk=0
835
836 IF(elemd == 0) THEN
837 DO i = 1, numnod
838
839
840
841
842
843 nki=iwl(ikine(i))+irb(ikine(i))+irb2(ikine(i))
844 + +irbm(ikine(i))+irlk(ikine(i))+ijo(ikine(i))
845 + +ikrbe2(ikine(i))+ikrbe3(ikine(i))
846 iwkin(i)=nki
848 END DO
849
850 IF(float(numnod-nk)/float(numnod)>zep95) nk = 0
851 IF(nk > 20000) THEN
852 ncond = ncond+1
853 ickin = ncond
854 END IF
855 END IF
856
857 IF(dectyp==5.OR.dectyp==6)THEN
858
859 ncond = ncond+1
860 icddl=1
861 icelem=ncond
862 IF(elemd>0) THEN
863 ncond = ncond+1
864 icdel = ncond
865 END IF
866
867 ELSE
868 IF(ilag==1.AND.(iale==1.OR.ieuler==1))THEN
869
870 ncond = ncond+1
871 nb_elem_ale = 0
872 DO i = 1, numels
873 mid = abs(ixs(1,i))
874 pid = abs(ixs(10,i))
875 jale_from_mat = nint(pm(72,mid))
876 jale_from_prop = igeo(62,pid)
877 jale =
max(jale_from_mat, jale_from_prop)
878 IF(jale==0.AND.mln/=18)THEN
879
880 ELSE
881 nb_elem_ale = nb_elem_ale + 1
882 END IF
883 ENDDO
884
885 IF (nelem - nb_elem_ale < 128 * nspmd) THEN
886
887 icfsi = 1
888 icelem = ncond
889 WRITE(iout,'(A)')
890 . ' DOMAIN DECOMPOSITION OPTIMIZED FOR ALE (1)'
891 ELSEIF( nb_elem_ale*2 > nelem ) THEN
892
893 icfsi = 1
894 icelem = 2
895 IF(icddl/=0) icddl = icddl + 1
896 IF(icints/=0) icints = icints + 1
897 IF(icintm/=0) icintm = icintm + 1
898 IF(icint2/=0) icint2 = icint2 + 1
899 IF(ickin/=0) ickin = ickin + 1
900 IF(icnod_sms/=0) icnod_sms = icnod_sms +1
901 IF(icdel/=0) icdel = icdel + 1
902 IF(iccand/=0) iccand = iccand + 1
903 WRITE(iout,'(A)')
904 . ' DOMAIN DECOMPOSITION OPTIMIZED FOR ALE (2)'
905 ELSEIF ( nb_elem_ale*4 > nelem) THEN
906
907 icfsi = 2
908 icelem = 1
909 IF(icddl/=0) icddl = icddl + 1
910 IF(icints/=0) icints = icints + 1
911 IF(icintm/=0) icintm = icintm + 1
912 IF(icint2/=0) icint2 = icint2 + 1
913 IF(ickin/=0) ickin = ickin + 1
914 IF(icnod_sms/=0) icnod_sms = icnod_sms +1
915 IF(icdel/=0) icdel = icdel + 1
916 IF(iccand/=0) iccand = iccand + 1
917 WRITE(iout,'(A)')
918 . ' DOMAIN DECOMPOSITION OPTIMIZED FOR FSI (3)'
919 ELSE
920 icfsi = ncond
921 END IF
922 END IF
923 IF(isolbar > 10000 .AND. icfsi == 0 .AND. numelc > numels)THEN
924
925
926 WRITE(iout,'(A)')
927 . ' DOMAIN DECOMPOSITION OPTIMIZED FOR BARRIER '
928
929 ncond = ncond+1
930 icsol=ncond
931 END IF
932 IF(elemd>0) THEN
933 ncond = ncond+1
934 icdel = ncond
935 END IF
936 END IF
937 IF(nsubdom>0)THEN
938 numel_r2r = 0
939 DO i = 1, numels
940 IF (
tag_elsf(i) /= 0) numel_r2r = numel_r2r+1
941 END DO
942 DO i = 1, numelc
943 IF (
tag_elcf(i) /= 0) numel_r2r = numel_r2r+1
944 END DO
945 IF (numel_r2r>=nspmd) THEN
946 WRITE(iout,'(A)')
947 . ' DOMAIN DECOMPOSITION OPTIMIZED FOR MULTIDOMAINS '
948 ncond = ncond+1
949 icr2r=ncond
950 ENDIF
951 END IF
952
953 ALLOCATE(rwd(nelem*ncond),stat=ierr1)
954
955 DO i = 1, ncond*nelem
956 rwd(i) = 0
957 ENDDO
958
959 CALL initwg(wd,pm,geo,ixs,ixq,
960 . ixc,ixt,ixp,ixr,ixtg,
961 . kxx,igeo,isolnod,iarch,
962 . numels,numelq,numelc,numelt,numelp,
963 . numelr,numeltg,numelx,ipm,
964 . bufmat,nummat,numgeo,taille,poin_ump,
965 . tab_ump,poin_ump_old,tab_ump_old,cputime_mp_old,
966 . tabmp_l,ipart,ipartc,ipartg,
967 . iparts,npart,poin_part_shell,poin_part_tri,poin_part_sol,
968 . mid_pid_shell,mid_pid_tri,mid_pid_sol,iddlevel,
969 . mat_param)
970
971 IF(nsubdom>0)THEN
972 cost_r2r = zero
973 DO i=1,nelem
974 scal = one
975 IF (i<=numels) THEN
976 mid = abs(ixs(1,i))
977 pid = abs(ixs(10,i))
978 jale_from_mat = nint(pm(72,mid))
979 jale_from_prop = igeo(62,pid)
980 jale =
max(jale_from_mat, jale_from_prop)
981 mln = nint(pm(19,mid))
982 IF (jale/=0) scal = 2.5
983 IF (mln==51) scal = 4.5
984 ENDIF
985 cost_r2r = cost_r2r + wd(i)
986 END DO
987 ENDIF
988
989 DO i=1,numels
990 nnc=0
991 IF ((icr2r /= 0)) THEN
993 rwd(ncond*(i-1)+icr2r) = 1
994 ENDIF
995 ENDIF
996 IF(icsol /= 0) rwd(ncond*(i-1)+icsol) = 1
997 IF(isolnod(i)==4.OR.isolnod(i)==10)THEN
998 DO k=1,8
999 n = ixs(k+1,i)
1000 IF(n/=0)THEN
1001 fac=one/(adsky(n+1)-adsky(n))
1002 nnc = nnc+adsky(n+1)-adsky(n)
1003 IF(icddl/=0)rwd(ncond*(i-1)+icddl)=rwd(ncond*(i-1)+icddl)
1004 + +dsdof(n)*fac
1005 IF(icints/=0)
1006 + rwd(ncond*(i-1)+icints)=rwd(ncond*(i-1)+icints)
1007 + +iwcont(1,n)*fac
1008 IF(icintm/=0)
1009 + rwd(ncond*(i-1)+icintm) = rwd(ncond*(i-1)+icintm)
1010 + + iwcont(2,n)*fac
1011 IF(icint2/=0)
1012 + rwd(ncond*(i-1)+icint2)=rwd(ncond*(i-1)+icint2)
1013 + +(iwcin2(1,n)+iwcin2(2,n))*fac
1014 IF(ickin/=0)rwd(ncond*(i-1)+ickin)=rwd(ncond*(i-1)+ickin)
1015 + +iwkin(n)*fac
1016 IF(icnod_sms/=0)rwd(ncond*(i-1)+icnod_sms)=rwd(ncond*(i-1)+icnod_sms)
1017 + +
min(dsdof(n),1)*fac
1018 END IF
1019 END DO
1020 IF(isolnod(i)==10)THEN
1021 ii = i-numels8
1022 DO k=1,6
1023 n = ixs10(k,ii)
1024 IF(n/=0)THEN
1025
1026 fac=one/
max(adsky(n+1)-adsky(n),1)
1027 nnc = nnc+adsky(n+1)-adsky(n)
1028 IF(icddl/=0)rwd(ncond*(i-1)+icddl)=rwd(ncond*(i-1)+icddl)
1029 + +dsdof(n)*fac
1030 IF(icints/=0)
1031 + rwd(ncond*(i-1)+icints)=rwd(ncond*(i-1)+icints)
1032 + +iwcont(1,n)*fac
1033 IF(icintm/=0)
1034 + rwd(ncond*(i-1)+icintm) = rwd(ncond*(i-1)+icintm)
1035 + + iwcont(2,n)*fac
1036 IF(icint2/=0)
1037 + rwd(ncond*(i-1)+icint2)=rwd(ncond*(i-1)+icint2)
1038 + +(iwcin2(1,n)+iwcin2(2,n))*fac
1039 IF(ickin/=0)rwd(ncond*(i-1)+ickin)=rwd(ncond*(i-1)+ickin)
1040 + +iwkin(n)*fac
1041 IF(icnod_sms/=0)rwd(ncond*(i-1)+icnod_sms)=rwd(ncond*(i-1)+icnod_sms)
1042 + +
min(dsdof(n),1)*fac
1043 ENDIF
1044 ENDDO
1045
1046 ELSE
1047
1048 ENDIF
1049 ELSE
1050 DO k=1,8
1051 n = ixs(k+1,i)
1052 IF(n/=0)THEN
1053
1054 fac=one/
max(adsky(n+1)-adsky(n),1)
1055 nnc = nnc+adsky(n+1)-adsky(n)
1056 IF(icddl/=0)rwd(ncond*(i-1)+icddl)=rwd(ncond*(i-1)+icddl)
1057 + +dsdof(n)*fac
1058 IF(icints/=0)
1059 + rwd(ncond*(i-1)+icints)=rwd(ncond*(i-1)+icints)
1060 + +iwcont(1,n)*fac
1061 IF(icintm/=0)
1062 + rwd(ncond*(i-1)+icintm) = rwd(ncond*(i-1)+icintm)
1063 + + iwcont(2,n)*fac
1064 IF(icint2/=0)
1065 + rwd(ncond*(i-1)+icint2)=rwd(ncond*(i-1)+icint2)
1066 + +(iwcin2(1,n)+iwcin2(2,n))*fac
1067 IF(ickin/=0)rwd(ncond*(i-1)+ickin)=rwd(ncond*(i-1)+ickin)
1068 + +iwkin(n)*fac
1069 IF(icnod_sms/=0)rwd(ncond*(i-1)+icnod_sms)=rwd(ncond*(i-1)+icnod_sms)
1070 + +
min(dsdof(n),1)*fac
1071 END IF
1072 ENDDO
1073
1074 ENDIF
1075 ENDDO
1076
1077
1078
1079 off = numels
1080
1081
1082 off = off + numelq
1083
1084 DO i = 1, numelc
1085 nnc=0
1086 IF (icr2r /= 0) THEN
1088 rwd(ncond*(i+off-1)+icr2r) = 1
1089 ENDIF
1090 ENDIF
1091 DO k=1,4
1092 n = ixc(k+1,i)
1093 IF(n/=0)THEN
1094 fac=one/(adsky(n+1)-adsky(n))
1095 nnc = nnc+adsky(n+1)-adsky(n)
1096 IF(icddl/=0)rwd(ncond*(i+off-1)+icddl) =
1097 + rwd(ncond*(i+off-1)+icddl) + dsdof(n)*fac
1098 IF(icints/=0)
1099 + rwd(ncond*(i+off-1)+icints) = rwd(ncond*(i+off-1)+icints)
1100 + + iwcont(1,n)*fac
1101 IF(icintm/=0)
1102 + rwd(ncond*(i+off-1)+icintm) = rwd(ncond*(i+off-1)+icintm)
1103 + + iwcont(2,n)*fac
1104 IF(icint2/=0)
1105 + rwd(ncond*(i+off-1)+icint2) = rwd(ncond*(i+off-1)+icint2)
1106 + + (iwcin2(1,n)+iwcin2(2,n))*fac
1107 IF(ickin/=0)rwd(ncond*(i+off-1)+ickin)=
1108 + rwd(ncond*(i+off-1)+ickin) + iwkin(n)*fac
1109 IF(icnod_sms/=0)rwd(ncond*(i+off-1)+icnod_sms)=rwd(ncond*(i+off-1)+icnod_sms)
1110 + +
min(dsdof(n),1)*fac
1111 END IF
1112 ENDDO
1113
1114 ENDDO
1115
1116 off = off + numelc
1117
1118 DO i = 1, numelt
1119 nnc=0
1120 DO k=1,2
1121 n = ixt(k+1,i)
1122 IF(n/=0)THEN
1123 fac=one/(adsky(n+1)-adsky(n))
1124 nnc = nnc+adsky(n+1)-adsky(n)
1125 IF(icddl/=0)rwd(ncond*(i+off-1)+icddl) =
1126 + rwd(ncond*(i+off-1)+icddl) + dsdof(n)*fac
1127 IF(icints/=0)
1128 + rwd(ncond*(i+off-1)+icints) = rwd(ncond*(i+off-1)+icints)
1129 + + iwcont(1,n)*fac
1130 IF(icintm/=0)
1131 + rwd(ncond*(i+off-1)+icintm) = rwd(ncond*(i+off-1)+icintm)
1132 + + iwcont(2,n)*fac
1133 IF(icint2/=0)
1134 + rwd(ncond*(i+off-1)+icint2) = rwd(ncond*(i+off-1)+icint2)
1135 + + (iwcin2(1,n)+iwcin2(2,n))*fac
1136 IF(ickin/=0)rwd(ncond*(i+off-1)+ickin)=
1137 + rwd(ncond*(i+off-1)+ickin) + iwkin(n)*fac
1138 IF(icnod_sms/=0)rwd(ncond*(i+off-1)+icnod_sms)=rwd(ncond*(i+off-1)+icnod_sms)
1139 + +
min(dsdof(n),1)*fac
1140 END IF
1141 ENDDO
1142
1143 ENDDO
1144
1145 off = off + numelt
1146
1147 DO i = 1, numelp
1148 nnc=0
1149 DO k=1,2
1150 n = ixp(k+1,i)
1151 IF(n/=0)THEN
1152 fac=one/(adsky(n+1)-adsky(n))
1153 nnc = nnc+adsky(n+1)-adsky(n)
1154 IF(icddl/=0)rwd(ncond*(i+off-1)+icddl) =
1155 + rwd(ncond*(i+off-1)+icddl) + dsdof(n)*fac
1156 IF(icints/=0)
1157 + rwd(ncond*(i+off-1)+icints) = rwd(ncond*(i+off-1)+icints)
1158 + + iwcont(1,n)*fac
1159 IF(icintm/=0)
1160 + rwd(ncond*(i+off-1)+icintm) = rwd(ncond*(i+off-1)+icintm)
1161 + + iwcont(2,n)*fac
1162 IF(icint2/=0)
1163 + rwd(ncond*(i+off-1)+icint2) = rwd(ncond*(i+off-1)+icint2)
1164 + + (iwcin2(1,n)+iwcin2(2,n))*fac
1165 IF(ickin/=0)rwd(ncond*(i+off-1)+ickin)=
1166 + rwd(ncond*(i+off-1)+ickin) + iwkin(n)*fac
1167 IF(icnod_sms/=0)rwd(ncond*(i+off-1)+icnod_sms)=rwd(ncond*(i+off-1)+icnod_sms)
1168 +
1169 END IF
1170 ENDDO
1171
1172 ENDDO
1173
1174 off = off + numelp
1175
1176 DO i = 1, numelr
1177 nnc=0
1178 DO k=1,2
1179 n = ixr(k+1,i)
1180 IF(n/=0)THEN
1181 fac=one/(adsky(n+1)-adsky(n))
1182 nnc = nnc+adsky(n+1)-adsky(n)
1183 IF(icddl/=0)rwd(ncond*(i+off-1)+icddl) =
1184 + rwd(ncond*(i+off-1)+icddl) + dsdof(n)*fac
1185 IF(icints/=0)
1186 + rwd(ncond*(i+off-1)+icints) = rwd(ncond*(i+off-1)+icints)
1187 + + iwcont(1,n)*fac
1188 IF(icintm/=0)
1189 + rwd(ncond*(i+off-1)+icintm) = rwd(ncond*(i+off-1)+icintm)
1190 + + iwcont(2,n)*fac
1191 IF(icint2/=0)
1192 + rwd(ncond*(i+off-1)+icint2) = rwd(ncond*(i+off-1)+icint2)
1193 + + (iwcin2(1,n)+iwcin2(2,n))*fac
1194 IF(ickin/=0)rwd(ncond*(i+off
1195 + rwd(ncond*(i+off-1)+ickin) + iwkin(n)*fac
1196 IF(icnod_sms/=0)rwd(ncond*(i+off-1)+icnod_sms)=rwd(ncond*(i+off-1)+icnod_sms)
1197 + +
min(dsdof(n),1)*fac
1198 END IF
1199 ENDDO
1200 IF(nint(geo(12,ixr(1,i)))==12) THEN
1201 n = ixr(4,i)
1202 IF(n/=0)THEN
1203 fac=one/(adsky(n+1)-adsky(n))
1204 nnc = nnc+adsky(n+1)-adsky(n)
1205 IF(icddl/=0)rwd(ncond*(i+off-1)+icddl) =
1206 + rwd(ncond*(i+off-1)+icddl) + dsdof(n)*fac
1207 IF(icints/=0)
1208 + rwd(ncond*(i+off-1)+icints) = rwd(ncond*(i+off-1)+icints)
1209 + + iwcont(1,n)*fac
1210 IF(icintm/=0)
1211 + rwd(ncond*(i+off-1)+icintm) = rwd(ncond*(i+off-1)+icintm)
1212 + + iwcont(2,n)*fac
1213 IF(icint2/=0)
1214 + rwd(ncond*(i+off-1)+icint2) = rwd(ncond*(i+off-1)+icint2)
1215 + + (iwcin2(1,n)+iwcin2(2,n))*fac
1216 IF(ickin/=0)rwd(ncond*(i+off-1)+ickin)=
1217 + rwd(ncond*(i+off-1)+ickin) + iwkin(n)*fac
1218 IF(icnod_sms/=0)rwd(ncond*(i+off-1)+icnod_sms)=rwd(ncond*(i+off-1)+icnod_sms)
1219 + +
min(dsdof(n),1)*fac
1220 END IF
1221 ENDIF
1222
1223 ENDDO
1224
1225 off = off + numelr
1226
1227 DO i = 1, numeltg
1228 nnc=0
1229 DO k=1,3
1230 n = ixtg(k+1,i)
1231 IF(n/=0)THEN
1232 fac=one/(adsky(n+1)-adsky(n))
1233 nnc = nnc+adsky(n+1)-adsky(n)
1234 IF(icddl/=0)rwd(ncond*(i+off-1)+icddl) =
1235 + rwd(ncond*(i+off-1)+icddl) + dsdof(n)*fac
1236 IF(icints/=0)
1237 + rwd(ncond*(i+off-1)+icints) = rwd(ncond*(i+off-1)+icints)
1238 + + iwcont(1,n)*fac
1239 IF(icintm/=0)
1240 + rwd(ncond*(i+off-1)+icintm) = rwd(ncond*(i+off-1)+icintm)
1241 + + iwcont(2,n)*fac
1242 IF(icint2/=0)
1243 + rwd(ncond*(i+off-1)+icint2) = rwd(ncond*(i+off-1)+icint2)
1244 + + (iwcin2(1,n)+iwcin2(2,n))*fac
1245 IF(ickin/=0)rwd(ncond*(i+off-1)+ickin)=
1246 + rwd(ncond*(i+off-1)+ickin) + iwkin(n)*fac
1247 IF(icnod_sms/=0)rwd(ncond*(i+off-1)+icnod_sms)=rwd(ncond*(i+off-1)+icnod_sms)
1248 + +
min(dsdof(n),1)*fac
1249 END IF
1250 ENDDO
1251
1252
1253 ENDDO
1254
1255 off = off + numeltg
1256
1257 DO i=1, numelx
1258 nelx=kxx(3,i)
1259 nnc=0
1260 DO k=1,nelx
1261 addx = kxx(4,i)+k-1
1262 n=ixx(addx)
1263 IF(n/=0)THEN
1264 fac=one/(adsky(n+1)-adsky(n))
1265 nnc = nnc+adsky(n+1)-adsky(n)
1266 IF(icddl/=0)rwd(ncond*(i+off-1)+icddl) =
1267 + rwd(ncond*(i+off-1)+icddl) + dsdof(n)*fac
1268 IF(icints/=0)
1269 + rwd(ncond*(i+off-1)+icints) = rwd
1270 + + iwcont(1,n)*fac
1271 IF(icintm/=0)
1272 + rwd(ncond*(i+off-1)+icintm) = rwd(ncond*(i+off-1)+icintm)
1273 + + iwcont(2,n)*fac
1274 IF(icint2/=0)
1275 + rwd(ncond*(i+off-1)+icint2) = rwd(ncond*(i+off-1)+icint2)
1276 + + (iwcin2(1,n)+iwcin2(2,n))*fac
1277 IF(ickin/=0)rwd(ncond*(i+off-1)+ickin)=
1278 + rwd(ncond*(i+off-1)+ickin) + iwkin(n)*fac
1279 IF(icnod_sms/=0)rwd(ncond*(i+off-1)+icnod_sms)=rwd(ncond*(i+off-1)+icnod_sms)
1280 + +
min(dsdof(n),1)*fac
1281 END IF
1282 ENDDO
1283
1284 ENDDO
1285
1286 off = off + numelx
1287
1288
1289
1290 ALLOCATE(iwd(nelem*ncond),stat=ierr1)
1291
1292 DO i = 1, ncond*nelem
1293 iwd(i) = 0
1294 ENDDO
1295 DO i = 1, nelem
1296
1297 IF(icints/=0)
1298 . iwd(ncond*(i-1)+icints) = nint(rwd(ncond*(i-1)+icints))
1299 IF(icintm/=0)
1300 . iwd(ncond*(i-1)+icintm) = nint(rwd(ncond*(i-1)+icintm))
1301 IF(iccand/=0)
1302 . iwd(ncond*(i-1)+iccand) = nint(rwd(ncond*(i-1)+iccand))
1303 IF(icint2/=0)
1304 . iwd(ncond*(i-1)+icint2) = nint(rwd(ncond*(i-1)+icint2))
1305 IF(icddl/=0)
1306 . iwd(ncond*(i-1)+icddl)= nint(rwd(ncond*(i-1)+icddl))
1307 IF(icsol/=0)
1308 . iwd(ncond*(i-1)+icsol)= nint(rwd(ncond*(i-1)+icsol))
1309 IF(ickin/=0)
1310 . iwd(ncond*(i-1)+ickin)= nint(rwd(ncond*(i-1)+ickin))
1311 IF(icr2r/=0)
1312 . iwd(ncond*(i-1)+icr2r)= nint(rwd(ncond*(i-1)+icr2r))
1313
1314
1315 IF(icnod_sms/=0)
1316 . iwd(ncond*(i-1)+icnod_sms) = nint(rwd(ncond*(i-1)+icnod_sms))
1317 END DO
1318
1319 DEALLOCATE(rwd)
1320
1321
1322
1323 nedges = 0
1324 DO n = 1, numnod
1325 DO cc1 = adsky(n), adsky(n+1)-1
1326 numg1 = cne(cc1)
1327 IF(numg1 > 0) THEN
1328 DO cc2 = cc1+1, adsky(n+1)-1
1329 numg2 = cne(cc2)
1330 IF(numg2 > 0 .AND. numg1 /= numg2) THEN
1331 nedges = nedges + 1
1332 END IF
1333 ENDDO
1334 END IF
1335 ENDDO
1336 ENDDO
1337
1338 IF (iddlevel==1) nedges = nedges+nelemint
1339
1340
1341
1342 IF(nelem < 100 000 000) THEN
1344 ELSE
1345
1346
1348 edge_filtering = 1
1349 ENDIF
1350
1351
1352
1353
1356 ALLOCATE(
iddconnect%IENTRYDOM(2,nelem),stat=ierr1)
1357
1359
1360 nedges_old = nedges
1361
1362 IF(edge_filtering == 1 .AND. (numels > nelem / 3 .OR. icfsi > 0 )) THEN
1363 WRITE(iout,'(A)') "** INFO: SIMPLIFIED DOMAIN DECOMPOSITION"
1364
1365
1366
1367
1369 ALLOCATE(nb_nodes_mini(nelem))
1371 nb_nodes_mini(1:nelem) = 3
1372 DO i = 1 , nelem
1373 CALL find_nodes(i ,connectivity(1,i),tagelem,ixs,ixs10,
1374 1 ixq ,ixc ,ixt ,ixp,ixr,
1375 2 ixtg ,kxx ,ixx,kxig3d,
1376 3 ixig3d,geo ,offelem,nb_nodes_mini(i))
1378 ENDDO
1379
1380 ALLOCATE(connect_weight(nelem))
1381 ALLOCATE(pointer_neigh(nelem))
1382 DO i =1,nelem
1383 connect_weight(i)=0
1384 pointer_neigh(i)=0
1385 ENDDO
1386 nelmin = 0
1387 DO i = 1 , nelem
1388 nelmin = nb_nodes_mini(i)
1390 prev_neigh = 0
1391 c_neigh = 0
1392 j = 0
1394 IF ( elemnodes(k)/=0 ) THEN
1395 DO l=adsky(elemnodes(k)), adsky(elemnodes(k)+1)-1
1396 IF( cne(l) > 0 .AND. cne(l) > i) THEN
1397 connect_weight(cne(l)) =
1398 . connect_weight(cne(l)) + 1
1399 IF( connect_weight(cne(l)) == 1 ) THEN
1400 pointer_neigh(cne(l))=prev_neigh
1401 c_neigh = c_neigh + 1
1402 prev_neigh = cne(l)
1403 ENDIF
1404 ENDIF
1405 ENDDO
1406 j=j+1
1407 ENDIF
1408 ENDDO
1409
1410
1411 IF(nelmin == 0) nelmin = 3
1412 IF (c_neigh > 0 ) THEN
1413 DO j=1,c_neigh
1414 IF(i /= prev_neigh) THEN
1415 IF(
consider_edge(connectivity,nb_nodes_mini,nelem,i,prev_neigh))
THEN
1418 ENDIF
1419 ENDIF
1420 point_delete=prev_neigh
1421 prev_neigh = pointer_neigh(prev_neigh)
1422 pointer_neigh(point_delete) = 0
1423 connect_weight(point_delete) = 0
1424 ENDDO
1425 ENDIF
1426 ENDDO
1427 DEALLOCATE(connect_weight)
1428 DEALLOCATE(pointer_neigh)
1429 DEALLOCATE(nb_nodes_mini)
1430 DEALLOCATE(connectivity)
1431
1432 ELSE
1433
1434
1435
1436 DO n = 1, numnod
1437 DO cc1 = adsky(n), adsky(n+1)-1
1438 numg1 = cne(cc1)
1439 IF(numg1 > 0) THEN
1440 DO cc2 = cc1+1, adsky(n+1)-1
1441 numg2 = cne(cc2)
1442 IF(numg2 > 0 .AND. numg1 /= numg2) THEN
1445 END IF
1446 ENDDO
1447 END IF
1448 ENDDO
1449 ENDDO
1450 ENDIF
1451
1452 nedges = 0
1453 nedges_8 = 0
1454 DO i=1,nelem
1456 nedges = nedges + taille_local
1457 nedges_8 = nedges_8 + taille_local
1458 ENDDO
1459 nedges = nedges/2
1460
1461
1462
1463 IF (iddlevel==1) THEN
1464
1465
1466
1467 iwarn1 = 0
1468 DO i = 1, nelem
1469 IF(ielem21(i)==1)THEN
1470 IF(wd(i)>0.01)THEN
1471 iwarn1 = 1
1472 END IF
1473 END IF
1474 END DO
1475 IF(iwarn1/=0)THEN
1476 WRITE(iout,*)' '
1477 WRITE(iout,'(A)')
1478 . ' ONE OR MORE ELEMENT OF MAIN SIDE OF INTERF. TYPE21',
1479 . ' NEEDS TO BE DEACTIVATED'
1480 END IF
1481
1482
1483
1484
1485 wd_max = 0
1486 IF(nvolu > 0 .AND. iddlevel == 1 .AND. icfsi == 0) THEN
1488 . wd_max,fvm_elem,fvm_domdec,itab,igrsurf,t_monvol)
1489 ENDIF
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501 DO i = 1, nelem
1502 cep(i) = 0
1503 ENDDO
1504
1505 DO i = 1, nelemint
1506 n=inter_cand%IXINT(5,i)
1507 IF (n<=numnod) THEN
1508 numg1=abs(cne(adsky(n)))
1509 numg2=numg1
1510 itypint=abs(inter_cand%IXINT(6,i))
1511 IF(itypint==2) THEN
1512 IF(adsky(n+1)-adsky(n)>0)THEN
1513 n=inter_cand%IXINT(1,i)
1514 n1=inter_cand%IXINT(2,i)
1515 n2=inter_cand%IXINT(3,i)
1516 DO i1 = adsky(n), adsky(n+1)-1
1517 numg2=abs(cne(i1))
1518 DO i2 = adsky(n1), adsky(n1+1)-1
1519 numg3=abs(cne(i2))
1520 IF(numg3==numg2) THEN
1521 DO i3 = adsky(n2), adsky(n2+1)-1
1522 numg4=abs(cne(i3))
1523 IF(numg4==numg2) GOTO 100
1524 ENDDO
1525 ENDIF
1526 ENDDO
1527 ENDDO
1528 100 CONTINUE
1529 IF(numg1 /= numg2) THEN
1532 cep(numg1) = 1
1533 cep(numg2) = 1
1534 ENDIF
1535 ENDIF
1536 ENDIF
1537 ENDIF
1538 ENDDO
1539
1540
1541 IF(iccand > 0) THEN
1542 DO n = 1,numnod
1543 IF( iwcont(4,n) > 0) THEN
1544 DO i1 = adsky(n), adsky(n+1)-1
1545 numg2=abs(cne(i1))
1546 iwd(ncond*(numg2-1)+iccand)=iwd(ncond*(numg2-1)+iccand)+iwcont(4,n)
1547 ENDDO
1548 ENDIF
1549 ENDDO
1550 ENDIF
1551
1552
1553
1554 ALLOCATE(isort(nelemint))
1555 ALLOCATE(index_sort(2*nelemint))
1556
1557
1558 DO i=1,nelemint
1559 isort(i)=(-inter_cand%IXINT(6,i)) + 100
1560 index_sort(i)=i
1561 itypint=abs(inter_cand%IXINT(6,i))
1562 ENDDO
1563 CALL my_orders(0,work,isort,index_sort,nelemint,1)
1564
1565
1566
1567
1568 DO ii = 1, nelemint
1569 i = index_sort(ii)
1570 n=inter_cand%IXINT(5,i)
1571 IF (n<=numnod) THEN
1572 numg1=-1
1573
1574 cep_min = huge(cep_min)
1575 DO i1 = adsky(n), adsky(n+1)-1
1576 numg3=abs(cne(i1))
1577 IF(cep_min > cep(numg3)) THEN
1578 numg1 = numg3
1579 cep_min = cep(numg1)
1580 ENDIF
1581 IF(cep_min == 0) EXIT
1582 END DO
1583
1584 numg2=-1
1585 itypint=abs(inter_cand%IXINT(6,i))
1586 IF(itypint==7) THEN
1587 IF(adsky(n+1)-adsky(n)>0)THEN
1588 n=inter_cand%IXINT(1,i)
1589 n1=inter_cand%IXINT(2,i)
1590 n2=inter_cand%IXINT(3,i)
1591 IF (n<=numnod) THEN
1592 DO i1 = adsky(n), adsky(n+1)-1
1593 numg2=abs(cne(i1))
1594 IF(numg2 == numg1) THEN
1595 GOTO 107
1596
1597 ELSE
1598 DO i2 = adsky(n1), adsky(n1+1)-1
1599 numg3=abs(cne(i2))
1600 IF(numg3 == numg1) GOTO 107
1601 IF(numg3==numg2) THEN
1602 DO i3 = adsky(n2), adsky(n2+1)-1
1603 numg4=abs(cne(i3))
1604 IF(numg4 == numg1) GOTO 107
1605 IF(numg4==numg2) GOTO 107
1606 ENDDO
1607 ENDIF
1608 ENDDO
1609 END IF
1610 ENDDO
1611 ENDIF
1612 107 CONTINUE
1613
1614 IF(numg1 /= numg2 .AND. (numg1 >0 ) .AND. (numg2 > 0)) THEN
1615 IF(cep(numg1)==0.OR.cep(numg2)==0) THEN
1616 number_of_added_edges = number_of_added_edges + 1
1617
1618 IF(cep(numg1) < 100 .AND. cep(numg2) < 100) THEN
1621 cep(numg1) = cep(numg1) + 1
1622 cep(numg2) = cep(numg2) + 1
1623 END IF
1624 ELSE
1625 refused_cep0 = refused_cep0 + 1
1626 ENDIF
1627 ELSE
1628 if(numg1 == numg2) refused_numg = refused_numg + 1
1629 if(numg1<=0 .OR. numg2<=0) refused_numg0 = refused_numg0 + 1
1630
1631 ENDIF
1632 IF(iccand > 0 .AND. numg2 > 0) THEN
1633
1634
1635 IF(inter_cand%IXINT(6,i)<0)THEN
1636
1637 iwd(ncond*(numg2-1)+iccand)=iwd(ncond*(numg2-1)+iccand)+5
1638 ELSE
1639 iwd(ncond*(numg2-1)+iccand)=iwd(ncond*(numg2-1)+iccand)+1
1640 ENDIF
1641 END IF
1642
1643 ENDIF
1644 ELSEIF(itypint==11) THEN
1645 IF(adsky(n+1)-adsky(n)>0)THEN
1646 n1=inter_cand%IXINT(3,i)
1647 n2=inter_cand%IXINT(4,i)
1648 DO i1 = adsky(n1), adsky(n1+1)-1
1649 numg2=abs(cne(i1))
1650 IF(numg2 /= numg1) THEN
1651 DO i2 = adsky(n2), adsky(n2+1)-1
1652 numg3=abs(cne(i2))
1653 IF(numg3==numg2) GOTO 111
1654 ENDDO
1655 END IF
1656 ENDDO
1657 111 CONTINUE
1658 IF(numg1 /= numg2 .AND.(numg1>0 .AND. numg2 > 0)) THEN
1659 IF(cep(numg1)==0.OR.cep(numg2)==0) THEN
1660
1661 number_of_added_edges = number_of_added_edges + 1
1662 IF(cep(numg1) < 100 .AND. cep(numg2) < 100) THEN
1665 cep(numg1) = cep(numg1) + 1
1666 cep(numg2) = cep(numg2) + 1
1667 END IF
1668 ELSE
1669 refused_cep0 = refused_cep0 + 1
1670 ENDIF
1671 ELSE
1672 if(numg1 == numg2) refused_numg = refused_numg + 1
1673 if(numg1<=0 .OR. numg2<=0) refused_numg0 = refused_numg0 + 1
1674 ENDIF
1675 IF(iccand > 0 .AND. numg2 > 0) THEN
1676
1677 IF(inter_cand%IXINT(6,i)<0)THEN
1678 iwd(ncond*(numg2-1)+iccand)=iwd(ncond*(numg2-1)+iccand)+1
1679 ELSE
1680 iwd(ncond*(numg2-1)+iccand)=iwd(ncond*(numg2-1)+iccand)+1
1681 ENDIF
1682 END IF
1683
1684 ENDIF
1685 ELSEIF(itypint==24.OR.itypint==25)THEN
1686 IF(adsky(n+1)-adsky(n)>0)THEN
1687 n=inter_cand%IXINT(1,i)
1688 n1=inter_cand%IXINT(2,i)
1689 n2=inter_cand%IXINT(3,i)
1690 DO i1 = adsky(n), adsky(n+1)-1
1691 numg2=abs(cne(i1))
1692 IF(numg2 == numg1) GOTO 124
1693 IF(numg2 /= numg1) THEN
1694 DO i2 = adsky(n1), adsky(n1+1)-1
1695 numg3=abs(cne(i2))
1696 IF(numg3 == numg1) GOTO 124
1697 IF(numg3==numg2) THEN
1698 DO i3 = adsky(n2), adsky(n2+1)-1
1699 numg4=abs(cne(i3))
1700 IF(numg4 == numg1) GOTO 124
1701 IF(numg4==numg2) GOTO 124
1702 ENDDO
1703 ENDIF
1704 ENDDO
1705 END IF
1706 ENDDO
1707 124 CONTINUE
1708 IF(numg1 /= numg2 .AND. (numg1>0 .AND. numg2 > 0)) THEN
1709 IF(cep(numg1)==0.OR.cep(numg2)==0) THEN
1710 number_of_added_edges = number_of_added_edges + 1
1711 IF(cep(numg1) < 100 .AND. cep(numg2) < 100) THEN
1714 cep(numg1) = cep(numg1) + 1
1715 cep(numg2) = cep(numg2) + 1
1716 ENDIF
1717 ELSE
1718 refused_cep0 = refused_cep0 + 1
1719 ENDIF
1720 ELSE
1721 if(numg1 == numg2) refused_numg = refused_numg + 1
1722 if(numg1<=0 .OR. numg2<=0) refused_numg0 = refused_numg0 + 1
1723 ENDIF
1724 IF(iccand > 0 .AND. numg2 > 0) THEN
1725 IF(inter_cand%IXINT(6,i)<0)THEN
1726 iwd(ncond*(numg2-1)+iccand)=iwd(ncond*(numg2-1)+iccand)+5
1727 ELSE
1728 iwd(ncond*(numg2-1)+iccand)=iwd(ncond*(numg2-1)+iccand)+1
1729 END IF
1730 END IF
1731
1732 ENDIF
1733 ENDIF
1734 ENDIF
1735 ENDDO
1736
1737
1738
1739
1740 ALLOCATE(colors(nelem+1),stat=ierr1)
1741 ALLOCATE(roots(nelem),stat=ierr1)
1742 CALL plist_bfs(nelem,nconnx,colors,roots)
1743
1744
1745 ALLOCATE(min_dist(nconnx))
1746 ALLOCATE(coords(3,nconnx))
1747 DO i = 1,nconnx
1748
1749 CALL find_nodes(roots(i) ,elemnodes,tagelem,ixs,ixs10,
1750 1 ixq ,ixc ,ixt ,ixp,ixr,
1751 2 ixtg ,kxx ,ixx,kxig3d,
1752 3 ixig3d,geo ,offelem,nelmin)
1753
1754 IF(elemnodes(1) /= 0) THEN
1755 coords(1:3,i) = x(1:3,elemnodes(1))
1756 ELSE
1757 coords(1:3,i) = zero
1758 ENDIF
1759 ENDDO
1760
1761 DO i = 1, nconnx
1762 numg1 = roots(i)
1763 min_dist(1:nconnx) = huge(1.0)
1764 DO j = 1, nconnx
1765 numg2 = roots(j)
1766 IF(numg1 /= numg2) THEN
1767 min_dist(j) = (coords(1,i)-coords(1,j))**2
1768 . + (coords(2,i)-coords(2,j))**2
1769 . + (coords(3,i)-coords(3,j))**2
1770
1771 ENDIF
1772 ENDDO
1773 dist = minval(min_dist(1:nconnx))
1774 k = 0
1775 DO j = 1, nconnx
1776 numg2 = roots(j)
1777 IF(numg1 /= numg2 .AND. min_dist(j) < 2.0*dist) THEN
1778
1779
1782 k = k + 1
1783 ENDIF
1784 ENDDO
1785 ENDDO
1786 DEALLOCATE(min_dist)
1787 DEALLOCATE(coords)
1788 DEALLOCATE(index_sort,isort)
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799 nedges = 0
1800 nedges_8 = 0
1801 DO i=1,nelem
1803 nedges = nedges + taille_local
1804 nedges_8 = nedges_8 + taille_local
1805 ENDDO
1806 nedges = nedges/2
1807 nedges_8 = nedges_8 / 2
1808 ENDIF
1809
1810 IF(ALLOCATED(tagelem)) DEALLOCATE(tagelem)
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822 bool_rbody=.false.
1823
1824 IF(iddlevel/=0) THEN
1825 numel = numels+numelq+numelc+numelt+numelp+numelr
1826 . + numeltg+numelx+numsph+numelig3d
1827
1828
1829 k = 0
1830 DO n = 1, nrbykin
1831 nsn = npby(2,n) ! number of secondary nodes
1832
1833 IF(nsn<40) THEN
1834 m = npby(1,n)
1835
1836
1837 number_of_element_rbody = 0
1838
1839
1840 DO j=1,nsn
1841 i = lpby(j+k)
1842 DO ijk = adsky(i),adsky(i+1)-1
1843 number_of_element_rbody = number_of_element_rbody + 1
1844 ENDDO
1845 ENDDO
1846
1847
1848 DO ijk = adsky(m),adsky(m+1)-1
1849 number_of_element_rbody = number_of_element_rbody + 1
1850 ENDDO
1851
1852 ALLOCATE( list_element_rbody(number_of_element_rbody) )
1853
1854
1855 number_of_element_rbody = 0
1856
1857
1858 DO j=1,nsn
1859 i = lpby(j+k)
1860 DO ijk = adsky(i),adsky(i+1)-1
1861 cc2 = ijk
1862 numg2 = abs(cne(cc2))
1863 number_of_element_rbody = number_of_element_rbody + 1
1864 list_element_rbody( number_of_element_rbody ) = numg2
1865 bool_rbody=.true.
1866 ENDDO
1867 ENDDO
1868
1869
1870 DO ijk = adsky(m),adsky(m+1)-1
1871 cc2 = ijk
1872 numg2 = abs(cne(cc2))
1873 number_of_element_rbody = number_of_element_rbody + 1
1874 list_element_rbody( number_of_element_rbody ) = numg2
1875 ENDDO
1876
1877
1878 IF(number_of_element_rbody>0)
1880 DEALLOCATE( list_element_rbody )
1881
1882 ENDIF
1883 k = k + nsn
1884 ENDDO
1885
1886
1887 ENDIF
1888
1889
1890 IF (nedges>0 .AND. nspmd > 1) THEN
1891! metis structures 1/2
1892 ALLOCATE(xadj(nelem+1),stat=ierr1)
1893
1894 xadj(1:nelem+1)=0
1895
1896 DEALLOCATE(cne)
1897
1898 nedges = 0
1899 DO i=1,nelem
1901 nedges = nedges + taille_local
1902 ENDDO
1903 nedges = nedges/2
1904
1905 ALLOCATE(adjncy(2*nedges),stat=ierr1)
1906
1907 xadj(1) = 1
1908 DO i=1,nelem
1910 xadj(i+1) = xadj(i) + taille_local
1911 IF(taille_local>0) THEN
1913 ENDIF
1914 ENDDO
1915
1918
1919
1920 IF(ALLOCATED(colors)) DEALLOCATE(colors)
1921 IF(ALLOCATED(roots)) DEALLOCATE(roots)
1922 ALLOCATE(colors(nelem+1),stat=ierr1)
1923 ALLOCATE(roots(nelem),stat=ierr1)
1924 CALL dd_bfs(xadj,adjncy,nelem,nedges,nconnx,colors,roots)
1925 IF(nconnx > 1) THEN
1926 WRITE(iout,'(A,I8)')
1927 . ' NUMBER OF DISCONNECTED COMPONENTS FIXED FOR DOMAIN DECOMP:'
1928 . ,nconnx
1929
1930 ALLOCATE(xadj_old(nelem+1),stat=ierr1)
1931 ALLOCATE(adjncy_old(2*nedges),stat=ierr1)
1932 xadj_old(1:nelem+1)=xadj(1:nelem+1)
1933 adjncy_old(1:2*nedges)=adjncy(1:2*nedges)
1934 newedge = nedges+nconnx-1
1935 DEALLOCATE(adjncy)
1936 ALLOCATE(adjncy(2*newedge),stat=ierr1)
1937
1938 inc=0
1939 DO i = 1, nconnx
1940 curr=roots(i)
1941 i1=xadj(curr)
1942 i1old=xadj_old(curr)
1943 i2old=xadj_old(curr+1)-1
1944 IF(i>1)THEN
1945
1946 prev=roots(i-1)
1947 IF(i1old <= 2*nedges) THEN
1948 DO WHILE ((i1old <= i2old) .AND.
1949 + (adjncy_old(i1old) < prev))
1950 adjncy(i1) = adjncy_old(i1old)
1951 i1 = i1+1
1952 i1old=i1old+1
1953 IF(i1old > 2*nedges) EXIT
1954 END DO
1955 ENDIF
1956 adjncy(i1) = prev
1957 i1=i1+1
1958 inc=inc+1
1959 END IF
1960 IF(i<nconnx)THEN
1961
1962 next=roots(i+1)
1963 IF(i1old <= 2*nedges) THEN
1964 DO WHILE ((i1old <= i2old) .AND.
1965 + (adjncy_old(i1old) < next))
1966 adjncy(i1) = adjncy_old(i1old)
1967 i1 = i1+1
1968 i1old=i1old+1
1969 IF(i1old > 2*nedges) EXIT
1970 END DO
1971 ENDIF
1972 adjncy(i1) = next
1973 i1=i1+1
1974 inc=inc+1
1975 ELSE
1976 next = nelem+1
1977 END IF
1978
1979 DO WHILE (i1old <= i2old)
1980 adjncy(i1) = adjncy_old(i1old)
1981 i1 = i1+1
1982 i1old=i1old+1
1983 END DO
1984
1985 n=curr+1
1986 DO WHILE (n /= next)
1987 xadj(n)=xadj(n)+inc
1988 i1=xadj(n)
1989 i1old=xadj_old(n)
1990 i2old=xadj_old(n+1)-1
1991 DO WHILE (i1old <= i2old)
1992 adjncy(i1) = adjncy_old(i1old)
1993 i1 = i1+1
1994 i1old=i1old+1
1995 END DO
1996 n = n+1
1997 END DO
1998
1999 xadj(next)=xadj(next)+inc
2000 END DO
2001
2002 nedges=newedge
2003 DEALLOCATE(xadj_old,adjncy_old)
2004
2005 CALL dd_bfs(xadj,adjncy,nelem,nedges,nconnx,colors,roots)
2006 IF(nconnx > 1) THEN
2007 WRITE(iout,'(A,I8)')
2008 . '** INFO: REMAINING DISCONNECTED COMPONENTS:',nconnx
2009 END IF
2010 END IF
2011 DEALLOCATE(colors,roots)
2012
2013 WRITE(iout,*)' '
2014 WRITE(iout,fmt=fmw_a_i)
2015 . ' ELEMENT NUMBER = ',nelem
2016 WRITE(iout,fmt=fmw_a_i)' edges found = ',NEDGES
2017 WRITE(IOUT,*)' '
2018
2019 IWFLG=2
2020 NFLAG=1
2021
2022 OPTIONS(1)=0
2023
2024 IERROR = METIS_SetDefaultOptions(options)
2025
2026
2027
2028
2029
2030 OPTIONS(18)=1
2031! OPTIONS(8) = 3 ! METIS NCUTS options
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055 IF(ICFSI==0)THEN
2056 DO I = 1, NELEM
2057
2058 IWD(NCOND*(I-1)+ICELEM) = NINT(WD(I)*100)
2059
2060 END DO
2061 ELSE
2062 DO I = 1, NELEM
2063 IF(I<=NUMELS)THEN
2064 MID = ABS(IXS(1,I))
2065 PID = ABS(IXS(10,I))
2066 JALE_FROM_MAT = NINT(PM(72,MID)) !old way to enable ALE/EULER framework (backward compatibility)
2067 JALE_FROM_PROP = IGEO(62,PID) !new way to enable ALE/EULER framework
2068 JALE = MAX(JALE_FROM_MAT, JALE_FROM_PROP) !if inconsistent, error message was displayed in PART reader MLN = NINT(PM(19,MID))
2069 MLN = NINT(PM(19,MID))
2070.AND. IF(JALE==0MLN/=18)THEN
2071 IWD(NCOND*(I-1)+ICELEM) = NINT(WD(I)*100)
2072 IWD(NCOND*(I-1)+ICFSI) = 0
2073 ELSE
2074 IWD(NCOND*(I-1)+ICELEM) = 0
2075 IWD(NCOND*(I-1)+ICFSI) = NINT(WD(I)*100)
2076 END IF
2077 ELSE
2078
2079 IWD(NCOND*(I-1)+ICELEM) = NINT(WD(I)*100)
2080 END IF
2081
2082 END DO
2083 END IF
2084 IF(ICDEL>0)THEN
2085 DO I = 1, NELEM
2086
2087 IF(WD(I)==0.0001)THEN
2088 IWD(NCOND*(I-1)+ICDEL) = 1
2089 ELSE
2090 IWD(NCOND*(I-1)+ICDEL) = 0
2091 END IF
2092
2093 END DO
2094 END IF
2095
2096
2097
2098 IF(NCLUSTER > 0) THEN
2099 DO I = 1, NCLUSTER
2100 CLUSTER_TYP = CLUSTERS(I)%TYPE
2101 OFFSET_CLUSTER = 0
2102.OR. IF(CLUSTER_TYP==2CLUSTER_TYP==3) OFFSET_CLUSTER = NUMELS+NUMELQ+NUMELC+NUMELT+NUMELP
2103 DO J = 2, CLUSTERS(I)%NEL
2104 DO K =1, NCOND
2105 IWD((CLUSTERS(I)%ELEM(1)-1) * NCOND+K +OFFSET_CLUSTER) =
2106 . IWD((CLUSTERS(I)%ELEM(1)-1) * NCOND+K +OFFSET_CLUSTER) +
2107 . IWD((CLUSTERS(I)%ELEM(J)-1) * NCOND+K +OFFSET_CLUSTER)
2108 IWD((CLUSTERS(I)%ELEM(J)-1) * NCOND+K +OFFSET_CLUSTER) = 0
2109 ENDDO
2110 END DO
2111 END DO
2112 ENDIF
2113
2114
2115
2116
2117
2118 DO I = 1, NCOND
2119 1024 CONTINUE
2120 WS = ZERO
2121 DO J = 1, NELEM
2122 WS = WS + IWD(NCOND*(J-1)+I)
2123 END DO
2124 IF(WS>2*EP9)THEN
2125 WRITE(IOUT,'(a,i4)')
2126 . ' weight precision decreased to enable criterion',I
2127 DO J = 1, NELEM
2128 IWD(NCOND*(J-1)+I) = IWD(NCOND*(J-1)+I)/10
2129 END DO
2130 GO TO 1024
2131 END IF
2132 END DO
2133
2134
2135 UBVEC(1:15) = 0
2136 UBVEC(ICELEM) = 1.02
2137 IF(ICINTS/=0) UBVEC(ICINTS) = 1.05
2138 IF(ICINTM/=0) UBVEC(ICINTM) = 1.05
2139 IF(ICINT2/=0) UBVEC(ICINT2) = 1.05
2140 IF(ICDDL/=0) UBVEC(ICDDL) = 1.02
2141 IF(ICSOL/=0) UBVEC(ICSOL) = 1.05
2142 IF(ICFSI/=0) UBVEC(ICFSI) = 1.02
2143 IF(ICDEL/=0) UBVEC(ICDEL) = 1.10
2144 IF(ICCAND/=0) UBVEC(ICCAND) = 1.10
2145 IF(ICKIN/=0) UBVEC(ICKIN) = 1.10
2146 IF(ICR2R/=0) UBVEC(ICR2R) = 1.30
2147 IF(ICNOD_SMS/=0) UBVEC(ICNOD_SMS) = 1.05
2148
2149
2150
2151 1999 CONTINUE
2152.OR. IF(DECTYP==3DECTYP==5)THEN
2153
2154
2155 IERR1 = Wrap_METIS_PartGraphKway(
2156 1 NELEM,NCOND,XADJ,ADJNCY,
2157 2 IWD,NNODE,
2158 3 UBVEC,OPTIONS,NEC,CEP)
2159 IDB_METIS = 0
2160
2161 IF(IDB_METIS == 1) THEN
2162
2163 it=0
2164 WRITE(CHLEVEL,'(i1)')IDDLEVEL
2165
2166 OPEN(99,file="input.graph"//CHLEVEL,FORM='formatted',RECL=8192)
2167 write(99,*) nelem,nedges,"010",ncond
2168 do i = 1, nelem
2169 write(99,*)iwd(NCOND*(I-1)+1:NCOND*(I-1)+ncond),
2170 + adjncy(xadj(i):xadj(i+1)-1)
2171 it = it + xadj(i+1)-xadj(i)
2172 end do
2173 print *,'writing graph with check:',it,'/',nedges*2
2174 CLOSE(99)
2175 END IF
2176.OR. ELSEIF(DECTYP==4DECTYP==6)THEN
2177
2178 IERR1 = Wrap_METIS_PartGraphRecursive(
2179 1 NELEM,NCOND,XADJ,ADJNCY,
2180 2 IWD,NNODE,
2181 3 UBVEC,OPTIONS,NEC,CEP)
2182 END IF
2183 CALL STAT_DOMDEC(
2184 1 WIS ,WI2 ,WFSI ,WDEL ,WDDL ,
2185 2 WCAND ,WSOL ,WR2R ,WKIN ,IWD ,
2186 3 NCOND ,ICELEM ,ICINTS ,ICINT2 ,ICCAND ,
2187 4 ICDDL ,ICSOL ,ICFSI ,ICDEL ,ICR2R ,
2188 5 ICKIN ,AVERAGE ,DEVIATION ,DMAX ,DMIN ,
2189 6 CEP ,NELEM ,W ,ICINTM ,WIM ,
2190 7 NCRITMAX ,WNOD_SMS,ICNOD_SMS)
2191
2192
2193.AND. IF(ICFSI > 0 ICFSI < ICELEM) THEN
2194! the order in DMIN,DMAX is independent of the order of constraints
2195 MAIN_TARGET = 7
2196 ELSE
2197 MAIN_TARGET = 1
2198 ENDIF
2199
2200
2201
2202.OR..AND..OR. IF( ( MAIN_TARGET == 7 IDDLEVEL==1) (DECTYP==3 DECTYP==5) )THEN
2203 IF(DMIN(MAIN_TARGET) < AVERAGE(MAIN_TARGET)*0.90 )THEN
2204 WRITE(IOUT,'(a)')
2205 . '** info: decomposition unbalancing detected'
2206 WRITE(IOUT,'(a,i5,a,2x,i8,2x,i8,2x,i8)')
2207 . ' domains:
',NSPMD,' min/
max/average:
',
2208 . NINT(DMIN(MAIN_TARGET)),NINT(DMAX(MAIN_TARGET)),NINT(AVERAGE(MAIN_TARGET))
2209
2210 WRITE(IOUT,'(a)')' revert to RECURSIVE bissection'
2211
2212 DECTYP=DECTYP+1
2213
2214 IF(FVM_DOMDEC) THEN
2215 UBVEC(ICELEM) = 1.01
2216 IF(ICINTS/=0) UBVEC(ICINTS) = 1.02
2217 IF(ICINTM/=0) UBVEC(ICINTM) = 1.02
2218 IF(ICINT2/=0) UBVEC(ICINT2) = 1.02
2219 IF(ICDDL/=0) UBVEC(ICDDL) = 1.05
2220 IF(ICSOL/=0) UBVEC(ICSOL) = 1.05
2221 IF(ICFSI/=0) UBVEC(ICFSI) = 1.05
2222 IF(ICDEL/=0) UBVEC(ICDEL) = 1.05
2223 IF(ICCAND/=0) UBVEC(ICCAND) = 1.05
2224 IF(ICKIN/=0) UBVEC(ICKIN) = 1.05
2225 IF(ICR2R/=0) UBVEC(ICR2R) = 1.30
2226 IF(ICNOD_SMS/=0) UBVEC(ICNOD_SMS) = 1.0
2227 ELSE
2228 UBVEC(ICELEM) = 1.001
2229 IF(ICINTS/=0) UBVEC(ICINTS) = 1.02
2230 IF(ICINTM/=0) UBVEC(ICINTM) = 1.02
2231 IF(ICINT2/=0) UBVEC(ICINT2) = 1.02
2232 IF(ICDDL/=0) UBVEC(ICDDL) = 1.01
2233 IF(ICSOL/=0) UBVEC(ICSOL) = 1.03
2234 IF(ICFSI/=0) UBVEC(ICFSI) = 1.01
2235 IF(ICDEL/=0) UBVEC(ICDEL) = 1.03
2236 IF(ICCAND/=0) UBVEC(ICCAND) = 1.03
2237 IF(ICKIN/=0) UBVEC(ICKIN) = 1.03
2238 IF(ICR2R/=0) UBVEC(ICR2R) = 1.30
2239 IF(ICNOD_SMS/=0) UBVEC(ICNOD_SMS) = 1.0
2240 ENDIF
2241 GOTO 1999
2242 END IF
2243 END IF
2244
2245
2246
2247 MAX_TRY = 3
2248 WD_MAX_FACTOR = 2
2249 ALLOCATE(IWD_COPY(NCOND*NELEM))
2250 ALLOCATE(WD_COPY(NELEM))
2251.OR..AND..AND. IF((DECTYP==4 DECTYP==6) IDDLEVEL==1 NELEM>10*NSPMD )THEN
2252
2253 IF(ICDEL /= 0 ) THEN
2254.AND. IF(ELEMD > 9*NELEM/10 DMIN(MAIN_TARGET) < AVERAGE(MAIN_TARGET)*0.80 ) THEN
2255 ! If the model is mainly deleted elements
2256 ! Then we equilibrate first on deleted elements
2257 DO I= 1, NELEM
2258 WGHT=IWD(NCOND*(I-1)+1)
2259 IWD(NCOND*(I-1)+1) = IWD(NCOND*(I-1)+ICDEL)
2260 IWD(NCOND*(I-1)+ICDEL)=WGHT
2261 ENDDO
2262 ENDIF
2263 ENDIF
2264
2265 NCOND2=NCOND
2266 DD_FVMBAG_TRY = 0
2267 WD_MAX0 = WD_MAX
2268 WD_COPY(1:NELEM) = WD(1:NELEM)
2269 IWD_COPY(1:NCOND * NELEM) = IWD(1:NCOND*NELEM)
2270
2271 DD_UNBALANCED = (DMIN(MAIN_TARGET) < AVERAGE(MAIN_TARGET)*0.80)
2272 IF(FVM_DOMDEC) THEN
2273.OR. DD_UNBALANCED = DD_UNBALANCED (DMAX(MAIN_TARGET) > AVERAGE(MAIN_TARGET)*1.1)
2274 WD_MAX0 = 0.0
2275 DO N = 1, NVOLU
2276 IF(FVM_ELEM(N) /= 0) THEN
2277 WD_MAX0= MAX(WD_MAX0,DBLE(WD(FVM_ELEM(N))))
2278 ENDIF
2279 ENDDO
2280 WD_MAX0 = MIN(WD_MAX,WD_MAX0)
2281 WD_MAX = WD_MAX0
2282 ENDIF
2283
2284.AND. DO WHILE(DD_UNBALANCED NCOND2 > 1 )
2285
2286 WRITE(IOUT,'(a)')
2287 . '** info: decomposition unbalancing detected'
2288 WRITE(IOUT,'(a,i5,a,2x,i8,2x,i8,2x,i8)')
2289 . ' domains:
',NSPMD,' min/
max/average:
',
2290 . NINT(DMIN(MAIN_TARGET)),NINT(DMAX(MAIN_TARGET)),NINT(AVERAGE(MAIN_TARGET))
2291
2292 !==========================================
2293 ! REVIEW WEIGHTS OF FVMBAGS
2294 !
2295 ! Try to trim the weight of FVMBAG
2296 ! if the domain decomposition fails
2297 NB_FVMBAG_TRIM = 0
2298.AND. IF(FVM_DOMDEC DD_FVMBAG_TRY <= MAX_TRY) THEN
2299 WD_MAX = WD_MAX / (0.1D0 * WD_MAX_FACTOR)
2300 DO N = 1, NVOLU
2301 IF(FVM_ELEM(N) /= 0) THEN
2302 IF(WD(FVM_ELEM(N)) > WD_MAX) THEN
2303 WD(FVM_ELEM(N)) = WD_MAX
2304 IWD(NCOND*(FVM_ELEM(N)-1)+ICELEM) = NINT(WD_MAX*100)
2305 NB_FVMBAG_TRIM = NB_FVMBAG_TRIM + 1
2306 ENDIF
2307 ENDIF
2308 ENDDO
2309 ENDIF
2310 IF(NB_FVMBAG_TRIM > 0) THEN
2311 ! Try to reduce the weight of the FVMBAG vertex
2312 ! before reducing the number of constraints
2313 DD_FVMBAG_TRY = DD_FVMBAG_TRY + 1
2314 ELSE
2315 ! Reducing the number of constraints
2316 ! Resetting weights
2317 NCOND2= NCOND2 - 1
2318 DD_FVMBAG_TRY = 0
2319 MAX_TRY = MAX_TRY + 1
2320 WD_MAX = WD_MAX0
2321 WD(1:NELEM) = WD_COPY(1:NELEM)
2322 IWD(1:NCOND*NELEM) = IWD_COPY(1:NCOND*NELEM)
2323 ENDIF
2324 !==============================================
2325
2326
2327
2328 WRITE(IOUT,'(a,i5)') 'retry kway with ncond =',NCOND2
2329
2330 ALLOCATE(IWD2(NCOND2*NELEM))
2331 DO I= 1, NELEM
2332 DO J = 1, NCOND2
2333 IWD2( NCOND2*(I-1) +J ) = IWD ( NCOND*(I-1) + J)
2334 ENDDO
2335 ENDDO
2336
2337 IERR1 = WRAP_METIS_PartGraphKway(
2338 1 NELEM,NCOND2,XADJ,ADJNCY,
2339 2 IWD2,NNODE,
2340 3 UBVEC,OPTIONS,NEC,CEP)
2341 CALL STAT_DOMDEC(
2342 1 WIS ,WI2 ,WFSI ,WDEL ,WDDL ,
2343 2 WCAND ,WSOL ,WR2R ,WKIN ,IWD ,
2344 3 NCOND ,ICELEM ,ICINTS ,ICINT2 ,ICCAND ,
2345 4 ICDDL ,ICSOL ,ICFSI ,ICDEL ,ICR2R ,
2346 5 ICKIN ,AVERAGE ,DEVIATION ,DMAX ,DMIN ,
2347 6 CEP ,NELEM ,W ,ICINTM ,WIM ,
2348 7 NCRITMAX ,WNOD_SMS,ICNOD_SMS)
2349
2350! CHECK Quality of Domain Decomp on elements
2351 DD_UNBALANCED = (DMIN(MAIN_TARGET) < AVERAGE(MAIN_TARGET)*0.80)
2352 IF(FVM_DOMDEC) THEN
2353.OR. DD_UNBALANCED = DD_UNBALANCED (DMAX(MAIN_TARGET) > AVERAGE(MAIN_TARGET)*1.1)
2354 ENDIF
2355
2356
2357 IF(DD_UNBALANCED)THEN
2358
2359 WRITE(IOUT,'(a)')
2360 . '** info: decomposition unbalancing detected'
2361 WRITE(IOUT,'(a,i5,a,2x,i8,2x,i8,2x,i8)')
2362 . ' domains:
',NSPMD,' min/
max/average:
',
2363 . NINT(DMIN(MAIN_TARGET)),NINT(DMAX(MAIN_TARGET)),NINT(AVERAGE(MAIN_TARGET))
2364
2365
2366
2367 IERR1 = WRAP_METIS_PartGraphRecursive(
2368 1 NELEM,NCOND2,XADJ,ADJNCY,
2369 2 IWD2,NNODE,
2370 3 UBVEC,OPTIONS,NEC,CEP)
2371 CALL STAT_DOMDEC(
2372 1 WIS ,WI2 ,WFSI ,WDEL ,WDDL ,
2373 2 WCAND ,WSOL ,WR2R ,WKIN ,IWD ,
2374 3 NCOND ,ICELEM ,ICINTS ,ICINT2 ,ICCAND ,
2375 4 ICDDL ,ICSOL ,ICFSI ,ICDEL ,ICR2R ,
2376 5 ICKIN ,AVERAGE ,DEVIATION ,DMAX ,DMIN ,
2377 6 CEP ,NELEM ,W ,ICINTM ,WIM ,
2378 7 NCRITMAX ,WNOD_SMS,ICNOD_SMS)
2379
2380 ENDIF
2381 DEALLOCATE(IWD2)
2382
2383 DD_UNBALANCED = (DMIN(MAIN_TARGET) < AVERAGE(MAIN_TARGET)*0.80)
2384 IF(FVM_DOMDEC) THEN
2385.OR. DD_UNBALANCED = DD_UNBALANCED (DMAX(MAIN_TARGET) > AVERAGE(MAIN_TARGET)*1.1)
2386 ENDIF
2387
2388.AND. ENDDO ! ( DMIN(MAIN_TARGET) < AVERAGE(MAIN_TARGET)*0.80 NCOND2 > 1 )
2389 ENDIF
2390 DEALLOCATE(IWD_COPY)
2391 DEALLOCATE(WD_COPY)
2392
2393
2394
2395 ! stick the list of rigid body element on a given processor
2396.AND. IF(IDDLEVEL/=0BOOL_RBODY) CALL C_ENFORCE_CONSTRAINTS_RBODY(CEP,NSPMD,NRBYKIN)
2397
2398 ! make sure that lists of elements in C_PREVENT_DECOMPOSITION are on the same domain
2399 CALL C_ENFORCE_CONSTRAINTS(CEP)
2400
2401
2402 IF (NCLUSTER > 0) THEN
2403 DO I = 1, NCLUSTER
2404 CLUSTER_TYP = CLUSTERS(I)%TYPE
2405 OFFSET_CLUSTER = 0
2406.OR. IF(CLUSTER_TYP==2CLUSTER_TYP==3) OFFSET_CLUSTER = NUMELS+NUMELQ+NUMELC+NUMELT+NUMELP
2407 CEPCLUSTER=CEP( CLUSTERS(I)%ELEM(1)+OFFSET_CLUSTER )
2408 DO J = 2,CLUSTERS(I)%NEL
2409 CEP( CLUSTERS(I)%ELEM(J)+OFFSET_CLUSTER ) = CEPCLUSTER
2410 END DO
2411 END DO ! I = 1, NCLUSTER
2412 END IF ! NCLUSTER > 0
2413
2414
2415
2416
2417.AND..AND. IF(NVOLU > 0 IDDLEVEL==1 FVM_DOMDEC) THEN
2418
2419 OFFC = NUMELS+NUMELQ
2420 OFFTG =NUMELS+NUMELQ+ NUMELC+NUMELT+NUMELP+NUMELR
2421 NN_L = 0
2422 CEPCLUSTER = 1
2423 NFVMBAG = 0
2424 DO N = 1, NVOLU
2425 ITYP = T_MONVOL(N)%TYPE
2426 NN = T_MONVOL(N)%NNS
2427! find location of the first element
2428! i.e. the element with all the weight
2429.OR. IF(ITYP == 6 ITYP == 8) NFVMBAG = NFVMBAG + 1
2430
2431.AND..OR. IF(NN > 0 (ITYP == 6 ITYP == 8)) THEN
2432 CEPCLUSTER = CEP(FVM_ELEM(N))
2433 FVMAIN(NFVMBAG) = CEPCLUSTER
2434 ENDIF
2435 ENDDO
2436 ENDIF
2437
2438
2439 DEALLOCATE(XADJ,ADJNCY)
2440! IF(ASSOCIATED(ADJWGT2)) DEALLOCATE(ADJWGT2)
2441
2442 DO I = 1, NELEM
2443 CEP(I) = CEP(I)-1
2444 END DO
2445
2446 !---------------------!
2447 !2D - EBCS : send boundary cells in domain 1
2448 DO I=1,NUMELQ
2449 IF(EBCS_TAG_CELL_SPMD(I)==1)THEN
2450 CEP(NUMELS+I)=0
2451 ENDIF
2452 ENDDO
2453 DO I=1,NUMELTG
2454 IF(EBCS_TAG_CELL_SPMD(NUMELQ+I)==1)THEN
2455 CEP(NUMELS+NUMELQ+NUMELC+NUMELT+NUMELP+NUMELR+I)=0
2456 ENDIF
2457 ENDDO
2458 !3D - EBCS : send boundary cells in domain 1
2459 DO I=1,NUMELS
2460 IF(EBCS_TAG_CELL_SPMD(NUMELQ+NUMELTG+I)==1)THEN
2461 CEP(I)=0
2462 ENDIF
2463 ENDDO
2464 !---------------------!
2465
2466.OR. IF(DECTYP==5DECTYP==6)THEN
2467 IF(DDNOD_SMS==0)THEN
2468 WRITE(IOUT,1000)
2469 ELSE
2470 WRITE(IOUT,1100)
2471 END IF
2472 ELSEIF(ICFSI==0) THEN
2473.AND. IF(ICSOL==0ICDEL==0)THEN
2474 WRITE(IOUT,2000)
2475.AND. ELSEIF(ICSOL/=0ICDEL==0)THEN
2476 WRITE(IOUT,3000)
2477.AND. ELSEIF(ICSOL/=0ICDEL/=0)THEN
2478 WRITE(IOUT,4000)
2479.AND. ELSEIF(ICSOL==0ICDEL/=0)THEN
2480 WRITE(IOUT,5000)
2481 END IF
2482 ELSEIF(ICFSI/=0)THEN
2483 IF(ICDEL==0)THEN
2484 WRITE(IOUT,6000)
2485 ELSE
2486 WRITE(IOUT,7000)
2487 END IF
2488 END IF
2489 DO I = 1, NSPMD
2490.OR. IF(DECTYP==5DECTYP==6)THEN
2491 IF(DDNOD_SMS==0)THEN
2492 WRITE(IOUT,'(i4,8f15.0)')
2493 . I,W(I),WIS(I),WIM(I),WCAND(I),WI2(I),WDDL(I)
2494 ELSE
2495 WRITE(IOUT,'(i4,8f15.0)')
2496 . I,W(I),WIS(I),WIM(I),WCAND(I),WI2(I),WDDL(I),WNOD_SMS(I)
2497 END IF
2498 ELSEIF(ICFSI==0)THEN
2499.AND. IF(ICSOL==0ICDEL==0)THEN
2500 WRITE(IOUT,'(i4,8f15.0)')
2501 . I,W(I),WIS(I),WIM(I),WCAND(I),WI2(I),WKIN(I)
2502.AND. ELSEIF(ICSOL/=0ICDEL==0)THEN
2503 WRITE(IOUT,'(i4,8f15.0)')
2504 . I,W(I),WIS(I),WIM(I),WCAND(I),WI2(I),WSOL(I),WKIN(I)
2505.AND. ELSEIF(ICSOL/=0ICDEL/=0)THEN
2506 WRITE(IOUT,'(i4,8f15.0)')
2507 . I,W(I),WIS(I),WIM(I),WCAND(I),WI2(I),WSOL(I),WDEL(I),WKIN(I)
2508.AND. ELSEIF(ICSOL==0ICDEL/=0)THEN
2509 WRITE(IOUT,'(i4,8f15.0)')
2510 . I,W(I),WIS(I),WIM(I),WCAND(I),WI2(I),WDEL(I),WKIN(I)
2511 ENDIF
2512.AND. ELSEIF(ICFSI/=0ICDEL==0)THEN
2513 WRITE(IOUT,'(i4,8f15.0)')
2514 . I,W(I),WIS(I),WIM(I),WCAND(I),WI2(I),WFSI(I)
2515.AND. ELSEIF(ICFSI/=0ICDEL/=0)THEN
2516 WRITE(IOUT,'(i4,8f15.0)')
2517 . I,W(I),WIS(I),WIM(I),WCAND(I),WI2(I),WFSI(I),WDEL(I)
2518 ENDIF
2519 ENDDO
2520 WRITE(IOUT,*)' '
2521 DEALLOCATE(IWD)
2522 WRITE(IOUT,*)'statistics on decomposition weights'
2523 WRITE(iout,*)'-----------------------------------'
2524 WRITE(iout,8000)
2525 WRITE(iout,'(A,I8,2X,I8,2X,I8,4X,I8)')
2526 . ' ELEMENTS ',
2527 . nint(dmin(1)),nint(dmax(1)),
2528 . nint(average(1)),nint(deviation(1))
2529 IF(icints/=0) WRITE(iout,'(A,I8,2X,I8,2X,I8,4X,I8)')
2530 . ' SECO. NODES',
2531 . nint(dmin(2)),nint(dmax(2)),
2532 . nint(average(2)),nint(deviation(2))
2533 IF(icintm/=0) WRITE(iout,'(A,I8,2X,I8,2X,I8,4X,I8)')
2534 . ' MAIN NODES',
2535 . nint(dmin(11)),nint(dmax(11)),
2536 . nint(average(11)),nint(deviation(11))
2537 IF(iccand/=0) WRITE(iout,'(A,I8,2X,I8,2X,I8,4X,I8)')
2538 . ' CONT. CAND.',
2539 . nint(dmin(4)),nint(dmax(4)),
2540 . nint(average(4)),nint(deviation(4))
2541 IF(icint2/=0) WRITE(iout'(A,I8,2X,I8,2X,I8,4X,I8)')
2542 . ' INT. TYPE2 ',
2543 . nint(dmin(3)),nint(dmax(3)),
2544 . nint(average(3)),nint(deviation(3))
2545 IF(icsol/=0) WRITE(iout,'(A,I8,2X,I8,2X,I8,4X,I8)')
2546 . ' SOLID BAR. ',
2547 . nint(dmin(6)),nint(dmax(6)),
2548 . nint(average(6)),nint(deviation(6))
2549 IF(icdel/=0) WRITE(iout,'(A,I8,2X,I8,2X,I8,4X,I8)')
2550 . ' ELT. DEL. ',
2551 . nint(dmin(8)),nint(dmax(8)),
2552 . nint(average(8)),nint(deviation(8))
2553 IF(ickin/=0) WRITE(iout,'(A,I8,2X,I8,2X,I8,4X,I8)')
2554 . ' KIN. COND. ',
2555 . nint
2556 . nint(average(10)),nint(deviation(10))
2557 IF(icddl/=0)THEN
2558 IF(isms==0)THEN
2559 WRITE(iout,'(A,I8,2X,I8,2X,I8,4X,I8)')
2560 . ' DOF (IMPL) ',
2561 . nint(dmin(5)),nint(dmax(5)),
2562 . nint(average(5)),nint(deviation(5))
2563 ELSE
2564 WRITE(iout,'(A,I8,2X,I8,2X,I8,4X,I8)')
2565 . ' AMS MATRIX ',
2566 . nint(dmin(5)),nint(dmax(5)),
2567 . nint(average(5)),nint(deviation(5))
2568 END IF
2569 END IF
2570 IF(icfsi/=0) WRITE(iout,'(A,I8,2X,I8,2X,I8,4X,I8)')
2571 . ' ALE ELTS. ',
2572 . nint(dmin(7)),nint(dmax(7)),
2573 . nint(average(7)),nint(deviation(7))
2574 IF(icr2r/=0) WRITE(iout,'(A,I8,2X,I8,2X,I8,4X,I8)')
2575 . ' R2R ',
2576 . nint(dmin(9)),nint(dmax(9)),
2577 . nint(average(9)),nint(deviation(9))
2578 IF(icnod_sms/=0) WRITE(iout,'(A,I8,2X,I8,2X,I8,4X,I8)')
2579 . ' AMS NODES ',
2580 . nint(dmin(12)),nint(dmax(12)),
2581 . nint(average(12)),nint(deviation(12))
2582 ELSE
2583
2584 DEALLOCATE(cne)
2587 DO i = 1, nelem
2588 cep(i) = 0
2589 ENDDO
2590 ENDIF
2591 DEALLOCATE(iwkin)
2592
2593 1000 FORMAT('#PROC ELEMENT W. SECND NOD W. MAST NOD W. CONT ELT W.',
2594 . ' INT2 W. DOF W.')
2595 1100 FORMAT('#PROC ELEMENT W. SECND NOD W. MAST NOD W. CONT ELT W.',
2596 . ' INT2 W. DOF W. AMS CONT ELT W')
2597 2000 FORMAT('#PROC ELEMENT W. SECND NOD W. MAST NOD W. CONT ELT W.',
2598 . ' INT2 W. KIN COND W.')
2599 3000 FORMAT('#PROC ELEMENT W. SECND NOD W. MAST NOD W. CONT ELT W.',
2600 . ' INT2 W. SOL W. KIN COND W.')
2601 4000 FORMAT('#PROC ELEMENT W. SECND NOD W. MAST NOD W. CONT ELT W.',
2602 . ' INT2 W. SOL W. ELT DEL W.',
2603 . ' KIN COND W.')
2604 5000 FORMAT('#PROC ELEMENT W. SECND NOD W. MAST NOD W. CONT ELT W.',
2605 . ' INT2 W. ELT DEL W. KIN COND W.')
2606 6000 FORMAT('#PROC ELT LAG W. SECND NOD W. MAST NOD W. CONT ELT W.',
2607 . ' INT2 W. ELT ALE W.')
2608 7000 FORMAT('#PROC ELT LAG W. SECND NOD W. MAST NOD W. CONT ELT W.',
2609 . ' INT2 W. ELT ALE W. ELT DEL W.')
2610 8000 FORMAT(' METRIC MINIMUM MAXIMUM AVERAGE',
2611 . ' STANDARD DEVIATION')
2612
2613 RETURN
void c_prevent_decomposition_rbody(int *rbodysize, int *elements)
subroutine iddconnectplus(n, p, numel)
int wrap_metis_partgraphkway(int *NELEM, int *NCOND, int *XADJ, int *ADJNCY, int *IWD, int *NNODE, float *UBVEC, int *OPTIONS, int *NEC, int *CEP)
int wrap_metis_partgraphrecursive(int *NELEM, int *NCOND, int *XADJ, int *ADJNCY, int *IWD, int *NNODE, float *UBVEC, int *OPTIONS, int *NEC, int *CEP)
subroutine dd_bfs(xadj, adjncy, nelem, nedges, nconnx, colors, roots)
subroutine find_nodes(elemn0, elemnodes, tagelem, ixs, ixs10, ixq, ixc, ixt, ixp, ixr, ixtg, kxx, ixx, kxig3d, ixig3d, geo, offelem, nelmin)
subroutine fvbag_vertex(ixc, ixtg, nelem, wd, wd_max, fvm_elem, fvm_domdec, itab, igrsurf, t_monvol)
subroutine initwg(wd, pm, geo, ixs, ixq, ixc, ixt, ixp, ixr, ixtg, kxx, igeo, isolnod, idarch, numels, numelq, numelc, numelt, numelp, numelr, numeltg, numelx, ipm, bufmat, nummat, numgeo, taille, poin_ump, tab_ump, poin_ump_old, tab_ump_old, cputime_mp_old, tabmp_l, ipart, ipartc, ipartg, iparts, npart, poin_part_shell, poin_part_tri, poin_part_sol, mid_pid_shell, mid_pid_tri, mid_pid_sol, iddlevel, mat_param)
void my_orders(int *mode, int *iwork, int *data, int *index, int *n, int *irecl)
logical function consider_edge(connectivity, nb_nodes_mini, nelem, e1, e2)
subroutine sort_descending(array)
integer, parameter max_nb_nodes_per_elt
type(my_connectdom) iddconnect
integer, dimension(:), allocatable tag_elcf
integer, dimension(:), allocatable tag_elsf
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)