17
20
21
22
23
24
25
26
27
28
29
38
39 IMPLICIT NONE
40
41
42
43 INTERFACE
46 TYPE (CMUMPS_STRUC) :: id
47 INTEGER(8) :: NB_INT,NB_CMPLX,NB_CHAR
50 &(idrhs, idinfo, idn, idnrhs, idlrhs)
51 COMPLEX, DIMENSION(:), POINTER :: idRHS
52 INTEGER, intent(in) :: idN, idNRHS, idLRHS
53 INTEGER, intent(inout) :: idINFO(:)
55 END INTERFACE
56
57 include 'mpif.h'
58 include 'mumps_headers.h'
59 include 'mumps_tags.h'
60#if defined(V_T)
61 include 'VT.inc'
62#endif
63 INTEGER :: STATUS(MPI_STATUS_SIZE)
64 INTEGER :: IERR
65 INTEGER, PARAMETER :: MASTER = 0
66c
67
68
69
70 TYPE (CMUMPS_STRUC), TARGET :: id
71
72
73
74
75 INTEGER MP,LP, MPG
76 LOGICAL , PROKG, LPOK
77 INTEGER MTYPE, ICNTL21
78 LOGICAL LSCAL, POSTPros, GIVSOL
79 INTEGER ICNTL10, ICNTL11
80 INTEGER I,IPERM,K,JPERM, J, II, IZ2
81 INTEGER IZ, NZ_THIS_BLOCK, PJ
82
83 INTEGER LIW
84
85 INTEGER(8) :: LA, LA_PASSED
86 INTEGER LIW_PASSED
87 INTEGER(8) :: LWCB8_MIN, LWCB8, LWCB8_SOL_C
88
89 INTEGER CMUMPS_LBUF, CMUMPS_LBUF_INT
90 INTEGER(8) :: CMUMPS_LBUF_8
91 INTEGER :: LBUFR, LBUFR_BYTES
92 INTEGER :: MSG_MAX_BYTES_SOLVE, MSG_MAX_BYTES_GTHRSOL
93 INTEGER(8) :: MSG_MAX_BYTES_SOLVE8
94
95 INTEGER, ALLOCATABLE, DIMENSION(:) :: BUFR
96
97 INTEGER IBEG_ROOT_DEF, IEND_ROOT_DEF,
98 & IBEG_GLOB_DEF, IEND_GLOB_DEF,
99 & IROOT_DEF_RHS_COL1
100
101 INTEGER NITREF, NOITER, SOLVET, KASE
102
103 LOGICAL INTERLEAVE_PAR,
104
105 LOGICAL FROM_PP
106
107
108 DOUBLE PRECISION TIMEIT, TIMEEA, TIMEEA1, TIMELCOND
109 DOUBLE PRECISION TIME3
110 DOUBLE PRECISION TIMEC1,TIMEC2
111 DOUBLE PRECISION TIMEGATHER1,TIMEGATHER2
112 DOUBLE PRECISION TIMESCATTER1,TIMESCATTER2
113 DOUBLE PRECISION TIMECOPYSCALE1,TIMECOPYSCALE2
114
115
116
117 INTEGER :: NRHS_NONEMPTY
118 INTEGER :: STRAT_PERMAM1
119 LOGICAL :: DO_NULL_PIV
120 INTEGER, DIMENSION(:), POINTER :: IRHS_PTR_COPY
121 INTEGER, DIMENSION(:), POINTER :: IRHS_SPARSE_COPY
122 COMPLEX, DIMENSION(:), POINTER :: RHS_SPARSE_COPY
123 LOGICAL IRHS_SPARSE_COPY_ALLOCATED, IRHS_PTR_COPY_ALLOCATED,
124 & RHS_SPARSE_COPY_ALLOCATED
125
126 INTEGER, DIMENSION(:), ALLOCATABLE :: MAP_RHS_loc
127 INTEGER, DIMENSION(:), POINTER :: IRHS_loc_PTR
128 LOGICAL :: IRHS_loc_PTR_allocated
129 COMPLEX, DIMENSION(:), POINTER :: idRHS_loc
130 INTEGER(8) :: DIFF_SOL_loc_RHS_loc
131 INTEGER(8) :: RHS_loc_size, RHS_loc_shift
132 INTEGER(8) :: NBT
133 INTEGER :: NBCOL, COLSIZE, JBEG_RHS, JEND_RHS, JBEG_NEW,
134 & NBCOL_INBLOC, IPOS, IPOSRHSCOMP
135 INTEGER, DIMENSION(:), ALLOCATABLE :: PERM_RHS
136 INTEGER, DIMENSION(:), POINTER :: PTR_POSINRHSCOMP_FWD,
137 & PTR_POSINRHSCOMP_BWD
138 COMPLEX, DIMENSION(:), POINTER :: PTR_RHS
139 INTEGER :: SIZE_IPTR_WORKING, SIZE_WORKING
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160 INTEGER :: NOMP
161 COMPLEX ONE
162 COMPLEX ZERO
163 parameter( one = (1.0e0,0.0e0) )
164 parameter( zero = (0.0e0,0.0e0) )
165 REAL RZERO, RONE
166 parameter( rzero = 0.0e0, rone = 1.0e0 )
167
168
169
170
171
172
173 COMPLEX, DIMENSION(:), POINTER :: RHS_IR
174 COMPLEX, DIMENSION(:), POINTER :: WORK_WCB
175 COMPLEX, DIMENSION(:), POINTER :: PTR_RHS_ROOT
176 INTEGER(8) :: LPTR_RHS_ROOT
177
178
179
180 COMPLEX, ALLOCATABLE :: SAVERHS(:), C_RW1(:),
181 & C_RW2(:),
182 & SRW3(:), C_Y(:),
183 & C_W(:)
184 INTEGER :: LCWORK
185 COMPLEX, ALLOCATABLE :: CWORK(:)
186 INTEGER, ALLOCATABLE :: MAP_RHS(:)
187 REAL, ALLOCATABLE :: R_Y(:), D(:)
188 REAL, ALLOCATABLE :: R_W(:)
189
190
191
192 REAL, ALLOCATABLE, DIMENSION(:) :: R_LOCWK54
193 COMPLEX, ALLOCATABLE, DIMENSION(:) :: C_LOCWK54
194 INTEGER :: NBENT_RHSCOMP, NB_FS_RHSCOMP_F,
195 & NB_FS_RHSCOMP_TOT
196 INTEGER, DIMENSION(:), ALLOCATABLE :: UNS_PERM_INV
197 LOGICAL :: UNS_PERM_INV_NEEDED_INMAINLOOP,
198 & UNS_PERM_INV_NEEDED_BEFMAINLOOP
199 INTEGER LIWK_SOLVE, LIWCB
200 INTEGER, ALLOCATABLE :: IW1(:), IWK_SOLVE(:), IWCB(:)
201 INTEGER :: LIWK_PTRACB
202 INTEGER(8), ALLOCATABLE :: PTRACB(:)
203
204
205
206 INTEGER(8) :: MAXS
207 REAL, DIMENSION(:), POINTER :: CNTL
208 INTEGER, DIMENSION (:), POINTER :: KEEP,ICNTL,INFO
209 INTEGER(8), DIMENSION (:), POINTER :: KEEP8
210 INTEGER, DIMENSION (:), POINTER :: IS
211 REAL, DIMENSION(:),POINTER:: RINFOG
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243 type scaling_data_t
244 sequence
245 REAL, dimension(:), pointer :: SCALING
246 REAL, dimension(:), pointer :: SCALING_LOC
247 end type scaling_data_t
248 type (scaling_data_t) :: scaling_data_sol, scaling_data_dr
249
250 REAL, DIMENSION(:), POINTER :: PT_SCALING
251 REAL, TARGET :: Dummy_SCAL(1)
252
253
254
255
256
257
258 INTEGER, DIMENSION(:), ALLOCATABLE, TARGET :: RHS_BOUNDS
259 INTEGER :: LPTR_RHS_BOUNDS
260 INTEGER, DIMENSION(:), POINTER :: PTR_RHS_BOUNDS
261 LOGICAL :: DO_NBSPARSE, NBSPARSE_LOC
262 LOGICAL :: PRINT_MAXAVG
263 REAL ARRET
264 COMPLEX C_DUMMY(1)
265 REAL R_DUMMY(1)
266 INTEGER IDUMMY(1), JDUMMY(1), KDUMMY(1), LDUMMY(1), MDUMMY(1)
267 INTEGER, TARGET :: IDUMMY_TARGET(1)
268 COMPLEX, TARGET :: CDUMMY_TARGET(1)
269 INTEGER JJ
270 INTEGER allocok
271 INTEGER NBRHS, NBRHS_EFF, BEG_RHS, NB_RHSSKIPPED,
272 & LD_RHS,
273 & MASTER_ROOT, MASTER_ROOT_IN_COMM
274 INTEGER SIZE_ROOT, LD_REDRHS
275 INTEGER(8) :: IPT_RHS_ROOT
276 INTEGER(8) :: IBEG, IBEG_RHSCOMP, KDEC, IBEG_loc, IBEG_REDRHS
277 INTEGER LD_RHSCOMP, NCOL_RHS_loc
278 INTEGER LD_RHS_loc, JBEG_RHS_loc
279 INTEGER NB_K133, IRANK, TSIZE
280 INTEGER KMAX_246_247
281 INTEGER IFLAG_IR, IRStep
282 LOGICAL TESTConv
283 LOGICAL WORKSPACE_MINIMAL_PREFERRED, WK_USER_PROVIDED
284 INTEGER(8) NB_BYTES
285 INTEGER(8) NB_BYTES_MAX
286 INTEGER(8)
287 INTEGER(8) NB_BYTES_LOC
288 INTEGER(8) NB_INT, NB_CMPLX, NB_CHAR, K34_8, K35_8
289 INTEGER(8) K16_8, ITMP8, NB_BYTES_ON_ENTRY
290#if (V_T)
291
292 INTEGER soln_drive_class, glob_comm_ini, perm_scal_ini, soln_dist,
293 & soln_assem, perm_scal_post
294#endif
295 LOGICAL I_AM_SLAVE, BUILD_POSINRHSCOMP
296 LOGICAL :: BUILD_RHSMAPINFO
297 LOGICAL WORK_WCB_ALLOCATED, IS_INIT_OOC_DONE
298 LOGICAL :: IS_LR_MOD_TO_STRUC_DONE
299 INTEGER :: KEEP350_SAVE
300 LOGICAL STOP_AT_NEXT_EMPTY_COL
301 INTEGER MTYPE_LOC
302 INTEGER(4) :: I4
303 INTEGER MAT_ALLOC_LOC, MAT_ALLOC
304 INTEGER MUMPS_PROCNODE
306 INTEGER(8) :: FILE_SIZE,STRUC_SIZE
307
308
309
310#if defined(V_T)
311 CALL vtclassdef( 'Soln driver',soln_drive_class,ierr)
312 CALL vtfuncdef( 'glob_comm_ini',soln_drive_class,
313 & glob_comm_ini,ierr)
314 CALL vtfuncdef( 'perm_scal_ini',soln_drive_class,
315 & perm_scal_ini,ierr)
316 CALL vtfuncdef( 'soln_dist',soln_drive_class,soln_dist,ierr)
317 CALL vtfuncdef( 'soln_assem',soln_drive_class,soln_assem,ierr)
318 CALL vtfuncdef( 'perm_scal_post',soln_drive_class,
319 & perm_scal_post,ierr)
320#endif
321
322
323
324 irhs_ptr_copy => idummy_target
325 irhs_ptr_copy_allocated = .false.
326 irhs_sparse_copy => idummy_target
327 irhs_sparse_copy_allocated=.false.
328 rhs_sparse_copy => cdummy_target
329 rhs_sparse_copy_allocated=.false.
330 NULLIFY(rhs_ir)
331 NULLIFY(work_wcb)
332 NULLIFY(scaling_data_dr%SCALING)
333 NULLIFY(scaling_data_dr%SCALING_LOC)
334 NULLIFY(scaling_data_sol%SCALING)
335 NULLIFY(scaling_data_sol%SCALING_LOC)
336 irhs_loc_ptr_allocated = .false.
337 is_init_ooc_done = .false.
338 is_lr_mod_to_struc_done = .false.
339 wk_user_provided = .false.
340 work_wcb_allocated = .false.
347
348
349
351 lp = icntl( 1 )
352 mp = icntl( 2 )
353 mpg = icntl( 3 )
354 lpok = ((lp.GT.0).AND.(
id%ICNTL(4).GE.1))
355 prok = ((mp.GT.0).AND.(
id%ICNTL(4).GE.2))
356 prokg = ( mpg .GT. 0 .and.
id%MYID .eq. master )
357 prokg = (prokg.AND.(
id%ICNTL(4).GE.2))
358 print_maxavg = .NOT.(
id%NSLAVES.EQ.1 .AND. keep(46).EQ.1)
359 IF (.not.prok) mp =0
360 IF (.not.prokg) mpg=0
361 IF ( prok ) WRITE(mp,100)
362 IF ( prokg ) WRITE(mpg,100)
363 nb_bytes = 0_8
364 nb_bytes_max = 0_8
365 nb_bytes_extra = 0_8
366 k34_8 = int(keep(34), 8)
367 k35_8 = int(keep(35), 8)
368 k16_8 = int(keep(16), 8)
369 nbent_rhscomp = 0
370
371
372 nb_rhsskipped = 0
373
374
375 lscal = .false.
376 work_wcb_allocated = .false.
377 icntl21 = -99998
378 ibeg_rhscomp =-152525_8
379 build_posinrhscomp = .true.
380 ibeg_glob_def = -9888
381 iend_glob_def = -9888
382 ibeg_root_def = -9777
383 iend_root_def = -9777
384 iroot_def_rhs_col1 = -9666
385
386
387
388 ld_rhscomp = 1
389 nb_fs_rhscomp_tot = keep(89)
390
391
392 nb_fs_rhscomp_f = nb_fs_rhscomp_tot
393
394
395
396 IF (keep(350).LE.0) keep(350)=1
397 IF (keep(350).GT.2) keep(350)=1
398 keep350_save = keep(350)
399
400
401
402 i_am_slave = (
id%MYID .ne. master .OR.
403 & (
id%MYID .eq. master .AND.
404 & keep(46) .eq. 1 ) )
405
406
408 nb_bytes = nb_bytes + nb_int * k34_8 + nb_cmplx * k35_8 + nb_char
409 nb_bytes_on_entry = nb_bytes
411 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
412
413
414
415
416
417
418
419 IF (
id%MYID .EQ. master)
THEN
420
422 id%KEEP(111) =
id%ICNTL(25)
423
424
425 IF (
id%ICNTL(20) .EQ. 1)
id%KEEP(235) = -1
426 IF (
id%ICNTL(20) .EQ. 2)
id%KEEP(235) = 0
427 IF (
id%ICNTL(20) .EQ. 3)
id%KEEP(235) = 1
428 IF (
id%ICNTL(20).EQ.1 .or.
id%ICNTL(20).EQ.2 .or.
429 &
id%ICNTL(20).EQ.3)
THEN
431 ELSE IF (
id%ICNTL(20).EQ.10 .OR.
id%ICNTL(20).EQ.11)
THEN
433 ELSE
435 ENDIF
436 icntl21 =
id%ICNTL(21)
437 IF (icntl21 .ne.0.and.icntl21.ne.1) icntl21=0
438 IF (
id%ICNTL(30) .NE.0 )
THEN
439
441 ELSE
442
444 ENDIF
445 IF (
id%KEEP(248) .eq.0.and.
id%KEEP(237).ne.0)
THEN
446
447
449 ENDIF
450 IF ((
id%KEEP(221).EQ.2 ).AND.(
id%KEEP(248).NE.0) )
THEN
451
453 ENDIF
454 IF ((
id%KEEP(221).EQ.2 ).AND.(
id%KEEP(235).NE.0) )
THEN
455
456
458 ENDIF
459 IF ( (
id%KEEP(248).EQ.0).AND.(
id%KEEP(111).EQ.0) )
THEN
460
462 ENDIF
463 IF (keep(248) .EQ. -1) THEN
464
466 ENDIF
467
468
469 IF(
id%KEEP(111).NE.0)
id%KEEP(235)=0
470
471 IF (
id%KEEP(235).EQ.-1)
THEN
472 IF (
id%KEEP(237).NE.0)
THEN
473
475 ELSE
477 ENDIF
478 ELSE IF (
id%KEEP(235).NE.0)
THEN
480 ENDIF
481
482 IF ((keep(111).NE.0)) THEN
483
484
485
486
487
488
489
490
491 keep(242) = 0
492 ENDIF
493 IF (keep(248).EQ.0.AND.keep(111).EQ.0) THEN
494
495
496
497
498 keep(242) = 0
499 ENDIF
500 IF ((keep(242).NE.0).AND.keep(237).EQ.0) THEN
501 IF ((keep(242).NE.-9).AND.keep(242).NE.1.AND.
502 & keep(242).NE.-1) THEN
503
504 keep(242) = 0
505 ENDIF
506 ENDIF
507 IF (keep(242).EQ.-9) THEN
508
509
510 IF (
id%KEEP(237).NE.0)
THEN
511 keep(242) = 1
512 ELSE ! dense or general sparse or distributed rhs
513 keep(242) = 0
514 IF (keep(248) .EQ. 1) THEN
515 IF (
id%KEEP(235) .EQ. 1)
THEN
516 IF (
id%NRHS .GT. 1)
THEN
517 IF (keep(497).EQ.-1 .OR. keep(497).GE.1) THEN
518 keep(242)=1
519 ENDIF
520 ENDIF
521 ENDIF
522 ENDIF
523 ENDIF
524
525 ENDIF
526 IF ( (
id%KEEP(221).EQ.1 ).AND.(
id%KEEP(235).NE.0) )
THEN
527
529 ENDIF
530 IF (keep(242).EQ.0) keep(243)=0
531 IF ((keep(237).EQ.0).OR.(keep(242).EQ.0)) THEN
532
533
534 keep(243) = 0
535 ENDIF
536 IF (
id%KEEP(237).EQ.1)
THEN
537
538
539 IF (
id%NSLAVES.EQ.1)
THEN
540 IF (
id%KEEP(243).EQ.-1)
id%KEEP(243)=0
541 IF (
id%KEEP(495).EQ.-1)
id%KEEP(495)=1
542 IF (
id%KEEP(497).EQ.-1)
id%KEEP(497)=1
543 ELSE
544 IF (
id%KEEP(243).EQ.-1)
id%KEEP(243)=1
545 IF (
id%KEEP(495).EQ.-1)
id%KEEP(495)=1
546 IF (
id%KEEP(497).EQ.-1)
id%KEEP(497)=1
547 ENDIF
548 ELSE
551 IF (keep(248) .EQ. 1) THEN
552 IF (
id%KEEP(235) .EQ. 1)
THEN
553 IF (
id%NRHS .GT. 1)
THEN
554 IF (
id%KEEP(497).EQ.-1)
id%KEEP(497)=1
555 ENDIF
556 ENDIF
557 ELSE
558
559
561 ENDIF
562 ENDIF
563 mtype =
id%ICNTL( 9 )
564 IF (mtype.NE.1) mtype=0
565 IF ((mtype.EQ.0).AND.keep(50).NE.0) mtype =1
566
567 IF (
id%KEEP(237).NE.0) mtype = 1
568
569
570
571
572
573
574 IF (keep(486) .EQ. 2) THEN
575 keep(485) = 1
576 ELSE
577 keep(485) = 0
578 ENDIF
579 ENDIF
580
581
582 CALL mpi_bcast(
id%KEEP(401), 1, mpi_integer, master,
id%COMM,
583 & ierr )
584 CALL mpi_bcast(mtype,1,mpi_integer,master,
586 CALL mpi_bcast(
id%KEEP(111), 1, mpi_integer, master,
id%COMM,
587 & ierr )
588 CALL mpi_bcast(
id%KEEP(221), 1, mpi_integer, master,
id%COMM,
589 & ierr )
590 CALL mpi_bcast(
id%KEEP(235), 1, mpi_integer, master,
id%COMM,
591 & ierr )
592 CALL mpi_bcast(
id%KEEP(237), 1, mpi_integer, master,
id%COMM,
593 & ierr )
594 CALL mpi_bcast(
id%KEEP(242), 2, mpi_integer, master,
id%COMM,
595 & ierr )
596 CALL mpi_bcast(
id%KEEP(248), 1, mpi_integer, master,
id%COMM,
597 & ierr )
598 CALL mpi_bcast(
id%KEEP(350), 1, mpi_integer, master,
id%COMM,
599 & ierr )
600 CALL mpi_bcast(
id%KEEP(485), 1, mpi_integer, master,
id%COMM,
601 & ierr )
602 CALL mpi_bcast(
id%KEEP(495), 3, mpi_integer, master,
id%COMM,
603 & ierr )
604 CALL mpi_bcast( icntl21, 1, mpi_integer, master,
id%COMM, ierr )
605
606
607 CALL mpi_bcast(
id%NRHS,1, mpi_integer, master,
id%COMM,ierr)
608
609
610 timec2=0.0d0
611 timecopyscale2=0.0d0
612 timegather2=0.0d0
613 timescatter2=0.0d0
616
617
618
619
626
627
628
629
630
639 id%DKEEP(128:134)=0.0e0
640 id%DKEEP(140:153)=0.0e0
641
643
644
645
646 IF (
id%MYID .EQ. master )
THEN
647 IF ((keep(23).NE.0).AND.keep(50).NE.0) THEN
648
649
650
651 IF (prokg) WRITE(mpg,'(A)')
652 & ' Internal Error 1 in solution driver '
655 ENDIF
656
657
658
659
660
661
662
663
664 IF (keep(201) .EQ. -1) THEN
665 IF (prokg) THEN
666 WRITE(mpg,'(A)')
667 & ' ERROR: Solve impossible because factors not kept'
668 ENDIF
671 GOTO 333
672 ELSE IF (keep(221).EQ.0 .AND. keep(251) .EQ. 2
673 & .AND. keep(252).EQ.0) THEN
674 IF (prokg) THEN
675 WRITE(mpg,'(A)')
676 & ' ERROR: Solve impossible because factors not kept'
677 ENDIF
680 GOTO 333
681 ENDIF
682
683 IF (keep(252).NE.0 .AND.
id%NRHS .NE.
id%KEEP(253))
THEN
684
685
686
687
688
689 IF (prokg) THEN
690 WRITE(mpg,'(A)')
691 & ' ERROR: id%NRHS not allowed to change when',
692 & ' ICNTL(32)=1'
693 ENDIF
695 id%INFO(2)=
id%KEEP(253)
696 GOTO 333
697 ENDIF
698
699 IF (keep(252).NE.0 .AND. mtype.NE.1) THEN
700
701 info(1) = -43
702 info(2) = 9
703 IF (prokg) THEN
704 WRITE(mpg,'(A)')
705 & .NE.' ERROR: Transpose system (ICNTL(9)0) not ',
706 & ' compatible with forward performed during',
707 & ' factorization (ICNTL(32)=1)'
708 ENDIF
709 GOTO 333
710 ENDIF
711 IF (keep(248) .NE. 0.AND.keep(252).NE.0) THEN
712
713
714
715 info(1) = -43
716 IF (keep(237).NE.0) THEN
717 info(2) = 30
718 IF (prokg) THEN
719 WRITE(mpg,'(A)')
720 & ' ERROR: A-1 functionality incompatible with',
721 & ' forward performed during factorization',
722 & ' (ICNTL(32)=1)'
723 ENDIF
724 ELSE
725 info(2) = 20
726 IF (prokg) THEN
727 WRITE(mpg,'(A)')
728 & ' ERROR: sparse or dist. RHS incompatible with forward',
729 & ' elimination during factorization (ICNTL(32)=1)'
730 ENDIF
731 ENDIF
732 GOTO 333
733 ENDIF
734 IF (keep(237) .NE. 0 .AND. icntl21.NE.0) THEN
735 IF (prokg) THEN
736 WRITE(mpg,'(A)')
737 & ' ERROR: A-1 functionality is incompatible',
738 & ' with distributed solution.'
739 ENDIF
740 info(1)=-48
741 info(2)=21
742 GOTO 333
743 ENDIF
744 IF (keep(237) .NE. 0 .AND. keep(60) .NE.0) THEN
745 IF (prokg) THEN
746 WRITE(mpg,'(A)')
747 & ' ERROR: A-1 functionality is incompatible',
748 & ' with Schur.'
749 ENDIF
750 info(1)=-48
751 info(2)=19
752 GOTO 333
753 ENDIF
754 IF (keep(237) .NE. 0 .AND. keep(111) .NE.0) THEN
755 IF (prokg) THEN
756 WRITE(mpg,'(A)')
757 & ' ERROR: A-1 functionality is incompatible',
758 & ' with null space.'
759 ENDIF
760 info(1)=-48
761 info(2)=25
762 GOTO 333
763 ENDIF
764 IF (
id%NRHS .LE. 0)
THEN
767 IF ((
id%KEEP(111).NE.0).AND.(
id%INFOG(28).EQ.0))
THEN
768 IF (prokg) THEN
769 WRITE(mpg,'(A)')
770 & 'ICNTL(25) NE 0 but INFOG(28)=0',
771 & ' the matrix is not deficient'
772 ENDIF
773 ENDIF
774 GOTO 333
775 ENDIF
776
777
778 IF ( (
id%KEEP(237).EQ.0) )
THEN
779 IF ((
id%KEEP(248) == 0 .AND.keep(221).NE.2)
780 & .OR. icntl21==0) THEN
781
782
783
786 IF (
id%INFO(1) .LT. 0)
GOTO 333
787 ENDIF
788 ELSE
789
790
791 IF (
id%NRHS .NE.
id%N)
THEN
794 GOTO 333
795 ENDIF
796 ENDIF
797 IF (
id%KEEP(248) == 1)
THEN
798
799
800
801
802 IF ((
id%NZ_RHS .LE.0 ).AND.(keep(237).NE.0))
THEN
803
806 GOTO 333
807 ENDIF
808 IF ((
id%NZ_RHS .LE.0 ).AND.(keep(221).EQ.1))
THEN
809
810
813 GOTO 333
814 ENDIF
815 IF (
id%NZ_RHS .GT. 0 )
THEN
816 IF ( .not.
associated(
id%RHS_SPARSE) )
THEN
819 GOTO 333
820 ENDIF
821 ENDIF
822 IF (
id%NZ_RHS .GT. 0)
THEN
823 IF ( .not.
associated(
id%IRHS_SPARSE) )
THEN
826 GOTO 333
827 ENDIF
828 ENDIF
829 IF ( .not.
associated(
id%IRHS_PTR) )
THEN
832 GOTO 333
833 ENDIF
834
835 IF (
size(
id%IRHS_PTR) <
id%NRHS + 1)
THEN
838 GOTO 333
839 END IF
840 IF (
id%IRHS_PTR(
id%NRHS + 1).ne.
id%NZ_RHS+1)
THEN
842 id%INFO(2)=
id%IRHS_PTR(
id%NRHS+1)
843 GOTO 333
844 END IF
845
846 IF (dble(
id%N)*dble(
id%NRHS).LT.dble(
id%NZ_RHS))
THEN
847
848 IF (prokg) THEN
849 write(mpg,*)
850 & " WARNING: many dupplicate entries in ",
851 & " sparse RHS provided by the user ",
852 & " id%NZ_RHS,id%N,id%NRHS =",
854 ENDIF
855 END IF
856 IF (
id%IRHS_PTR(1).ne.1)
THEN
858 id%INFO(2)=
id%IRHS_PTR(1)
859 GOTO 333
860 END IF
861 IF (
size(
id%IRHS_SPARSE) <
id%NZ_RHS)
THEN
864 GOTO 333
865 END IF
866 IF (
size(
id%RHS_SPARSE) <
id%NZ_RHS)
THEN
869 GOTO 333
870 END IF
871 ENDIF
872
873
874
877 & mpg,info(1))
878 IF (info(1) .LT. 0) GOTO 333
879
880 END IF
881
882
883
884 IF (icntl21==1) THEN
885 IF ( i_am_slave ) THEN
886
887
888 IF (
id%LSOL_loc <
id%KEEP(89) )
THEN
890 id%INFO(2)=
id%LSOL_loc
891 GOTO 333
892 ENDIF
893 IF (
id%KEEP(89) .NE. 0)
THEN
894 IF ( .not.
associated(
id%ISOL_loc) )
THEN
897 GOTO 333
898 ENDIF
899 IF ( .not.
associated(
id%SOL_loc) )
THEN
902 GOTO 333
903 ENDIF
904 IF (
size(
id%ISOL_loc) <
id%KEEP(89) )
THEN
907 GOTO 333
908 END IF
909# if defined(MUMPS_F2003)
910 IF (
size(
id%SOL_loc,kind=8) <
911 & int(
id%NRHS-1,8)*int(
id%LSOL_loc,8)+
912 & int(
id%KEEP(89),8))
THEN
915 GOTO 333
916 END IF
917# else
918
919
920
921
922
923
924
925 IF (
size(
id%SOL_loc) <
926 & (
id%NRHS-1)*
id%LSOL_loc+
id%KEEP(89))
THEN
929 GOTO 333
930 END IF
931# endif
932 ENDIF
933 ENDIF
934 ENDIF
935 IF (
id%MYID .NE. master)
THEN
936 IF (
id%KEEP(248) == 1)
THEN
937
938
939
940 IF (
associated(
id%RHS ) )
THEN
943 GOTO 333
944 END IF
945 IF (
associated(
id%RHS_SPARSE ) )
THEN
948 GOTO 333
949 END IF
950 IF (
associated(
id%IRHS_SPARSE ) )
THEN
953 GOTO 333
954 END IF
955 IF (
associated(
id%IRHS_PTR ) )
THEN
958 GOTO 333
959 END IF
960 END IF
961 ENDIF
962 IF (i_am_slave .AND.
id%KEEP(248).EQ.-1)
THEN
970 IF (
id%INFO(1) .LT. 0)
GOTO 333
971 ENDIF
972
973
974
975
976
977
978
979 IF (
associated(
id%IRHS_loc))
THEN
980 IF (
size(
id%IRHS_loc) .NE. 0)
THEN
981 irhs_loc_ptr=>
id%IRHS_loc
982 ELSE
983
984 irhs_loc_ptr=>idummy_target
985 ENDIF
986 ELSE
987 irhs_loc_ptr=>idummy_target
988 ENDIF
989 IF (
associated(
id%RHS_loc))
THEN
990 IF (
size(
id%RHS_loc) .NE. 0)
THEN
991 idrhs_loc=>
id%RHS_loc
992 ELSE
993 idrhs_loc=>cdummy_target
994 ENDIF
995 ELSE
996 idrhs_loc=>cdummy_target
997 ENDIF
998 IF (i_am_slave .AND. icntl21.EQ.1 .AND.
999 & keep(248) .EQ. -1) THEN
1000 IF (
associated(
id%RHS_loc) .AND.
1001 &
associated(
id%SOL_loc))
THEN
1002 IF (
id%KEEP(89).GT.0)
THEN
1003
1004
1005
1006
1007
1008
1009 CALL mumps_size_c(idrhs_loc(1),
id%SOL_loc(1),
1010 & diff_sol_loc_rhs_loc)
1011
1012
1013
1014
1015 IF (diff_sol_loc_rhs_loc .EQ. 0_8 .AND.
1016 &
id%LSOL_loc .GT.
id%LRHS_loc)
THEN
1017
1018
1019
1020
1021
1023 id%INFO(2)=
id%LRHS_loc
1024 IF (lpok) THEN
1025 WRITE(lp,'(A,I9,A,I9)')
1026 &" ** Error RHS_loc and SOL_loc pointers match but LRHS_loc="
1027 &,
id%LRHS_loc,
" and LSOL_loc=",
id%LSOL_loc
1028 ENDIF
1029 ENDIF
1030 ENDIF
1031 ENDIF
1032 ENDIF
1033 IF (
id%MYID.EQ.master)
THEN
1034
1036 END IF
1037 IF (
id%INFO(1) .LT. 0)
GOTO 333
1038
1039
1040
1041 333 CONTINUE
1044 &
id%COMM,
id%MYID )
1045 IF (
id%INFO(1) .LT. 0 )
GO TO 90
1046
1047
1048
1049
1050
1051
1052
1053 IF ((
id%KEEP(248).EQ.1).AND.(
id%KEEP(237).EQ.0))
THEN
1054
1057
1058 IF (
id%NZ_RHS.EQ.0)
THEN
1059
1060
1061 IF ((icntl21.EQ.1).AND.(i_am_slave)) THEN
1062
1063
1064
1065
1066
1067
1068 liw_passed=
max(1,keep(32))
1069
1070
1071
1072 IF (keep(89) .GT. 0) THEN
1075 &
id%KEEP(1),
id%KEEP8(1),
1076 &
id%IS(1), liw_passed,
id%MYID_NODES,
1077 &
id%N,
id%STEP(1),
id%PROCNODE_STEPS(1),
1078 &
id%NSLAVES, scaling_data_sol, lscal
1079
1080 & , .false., idummy(1), 1
1081 & )
1083 DO i=1, keep(89)
1084 id%SOL_loc((j-1)*
id%LSOL_loc + i) =zero
1085 ENDDO
1086 ENDDO
1087 ENDIF
1088 ENDIF
1089 IF (icntl21.NE.1) THEN
1090
1091
1092
1093 IF (
id%MYID.EQ.master)
THEN
1096 id%RHS(int(j-1,8)*int(
id%LRHS,8) + int(i,8)) =zero
1097 ENDDO
1098 ENDDO
1099 ENDIF
1100 ENDIF
1101
1102
1103 IF ( prokg ) THEN
1104
1105 WRITE( mpg, 150 )
1106
1107
1108 &
id%NRHS, icntl(27), icntl(9), icntl(10), icntl(11),
1109 & icntl(20), icntl(21), icntl(30), keep(486)
1110 IF (keep(221).NE.0) THEN
1111 WRITE (mpg, 152) keep(221)
1112 ENDIF
1113 IF (keep(252).GT.0) THEN
1114 WRITE (mpg, 153) keep(252)
1115 ENDIF
1116 ENDIF
1117
1118
1119 GOTO 90
1120
1121
1122
1123 ENDIF
1124
1125 ENDIF
1126 interleave_par =.false.
1127 do_permute_rhs =.false.
1128
1129 IF ((
id%KEEP(235).NE.0).or.(
id%KEEP(237).NE.0))
THEN
1130
1131 IF (
id%KEEP(237).NE.0.AND.
1132 &
id%KEEP(248).EQ.0)
THEN
1133
1134
1135 IF (lpok) THEN
1136 WRITE(lp,'(A,I4,I4)')
1137 & ' Internal Error 2 in solution driver (A-1) ',
1138 &
id%KEEP(237),
id%KEEP(248)
1139 ENDIF
1141 ENDIF
1142
1143 nbt = 0
1144
1146 & force=.true.,
1147 & string='id%Step2node (Solve)', memcnt=nbt, errcode=-13)
1149 &
id%COMM,
id%MYID )
1150 IF ( info(1).LT.0 ) RETURN
1151
1152
1153
1154
1155 IF (nbt.NE.0) THEN
1156
1158 IF (
id%STEP(i).LE.0) cycle
1159 id%Step2node(
id%STEP(i)) = i
1160 ENDDO
1161
1162
1163
1164
1165 ENDIF
1166 nb_bytes = nb_bytes + nbt*k34_8
1167 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
1168 nb_bytes_extra = nb_bytes_extra + nbt * k34_8
1169
1170
1171
1172
1173
1174
1175
1176 IF((keep(235).NE.0).OR.(keep(237).NE.0)) THEN
1177 IF(.NOT.
associated(
id%IPTR_WORKING))
THEN
1179 END IF
1180 END IF
1181 ENDIF
1182
1183
1184 IF ( i_am_slave )
1186 do_null_piv = .true.
1187 nbcol_inbloc = -9998
1188 nz_this_block= -9998
1189 jbeg_rhs = -9998
1190
1191 IF (
id%MYID.EQ.master)
THEN
1192
1193
1194 IF ( keep(111)==0 .AND. keep(248)==1
1195 & ) THEN
1196
1197
1198
1199 nrhs_nonempty = 0
1201 IF (
id%IRHS_PTR(i).LT.
id%IRHS_PTR(i+1))
1202 & nrhs_nonempty = nrhs_nonempty+1
1203 ENDDO
1204 IF (nrhs_nonempty.LE.0) THEN
1205
1206 IF (lpok)
1207 & WRITE(lp,*) " Internal Error 3 in solution driver ",
1208 & " NRHS_NONEMPTY= ",
1209 & nrhs_nonempty
1211 ENDIF
1212 ELSE
1213 nrhs_nonempty =
id%NRHS
1214 ENDIF
1215 ENDIF
1216
1217
1218
1219
1220 size_root = -33333
1221 IF ( keep( 38 ) .ne. 0 ) THEN
1223 &
id%PROCNODE_STEPS(
id%STEP( keep(38))),
1224 & keep(199) )
1225 IF (
id%MYID_NODES .eq. master_root)
THEN
1226 size_root =
id%root%TOT_ROOT_SIZE
1227 ELSE IF ((
id%MYID.EQ.master).AND.keep(60).NE.0)
THEN
1228
1229 size_root=
id%KEEP(116)
1230 ENDIF
1231 ELSE IF (keep( 20 ) .ne. 0 ) THEN
1233 &
id%PROCNODE_STEPS(
id%STEP(keep(20))),
1234 & keep(199) )
1235 IF (
id%MYID_NODES .eq. master_root)
THEN
1237 &
id%PTLUST_S(
id%STEP(keep(20)))+keep(ixsz) + 3)
1238 ELSE IF ((
id%MYID.EQ.master).AND.keep(60).NE.0)
THEN
1239
1240 size_root=
id%KEEP(116)
1241 ENDIF
1242 ELSE
1243 master_root = -44444
1244 END IF
1245
1246
1247
1248
1249
1250
1251 IF (
id%MYID .eq. master)
THEN
1252 keep(84) = icntl(27)
1253
1254 IF(icntl(27).EQ.0) keep(84)=1
1255 IF (keep(252).NE.0) THEN
1256
1257 nbrhs = keep(253)
1258 ELSE
1259 IF (keep(201) .EQ. 0 .OR. keep(84) .GT. 0) THEN
1260 nbrhs = abs(keep(84))
1261 ELSE
1262 nbrhs = -2*keep(84)
1263 END IF
1264 IF (nbrhs .GT. nrhs_nonempty ) nbrhs = nrhs_nonempty
1265
1266 ENDIF
1267 ENDIF
1268#if defined(V_T)
1269 CALL vtbegin(glob_comm_ini,ierr)
1270#endif
1271
1272 CALL mpi_bcast(nrhs_nonempty,1,mpi_integer,master,
1274 CALL mpi_bcast(nbrhs,1,mpi_integer,master,
1276
1277 IF (keep(201).GT.0) THEN
1278
1279
1280
1281 workspace_minimal_preferred = .false.
1282 IF (
id%MYID .eq. master)
THEN
1283 keep(107) =
max(0,keep(107))
1284 IF ((keep(107).EQ.0).AND.
1285 & (keep(204).EQ.0).AND.(keep(211).NE.1) ) THEN
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295 workspace_minimal_preferred=.true.
1296 ENDIF
1297 ENDIF
1298 CALL mpi_bcast( keep(107), 1, mpi_integer,
1299 & master,
id%COMM, ierr )
1300 CALL mpi_bcast( keep(204), 1, mpi_integer,
1301 & master,
id%COMM, ierr )
1302 CALL mpi_bcast( keep(208), 2, mpi_integer,
1303 & master,
id%COMM, ierr )
1304 CALL mpi_bcast( workspace_minimal_preferred, 1,
1305 & mpi_logical,
1306 & master,
id%COMM, ierr )
1307
1308 ENDIF
1309 IF ( i_am_slave ) THEN
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331 nb_k133 = 3
1332
1333
1334
1335
1336
1337
1338 IF ( keep( 38 ) .NE. 0 .OR. keep( 20 ) .NE. 0 ) THEN
1339 IF ( master_root .eq.
id%MYID_NODES )
THEN
1340 IF (
1341 & .NOT.
associated(
id%root%RHS_CNTR_MASTER_ROOT)
1342 & ) THEN
1343 nb_k133 = nb_k133 + 1
1344 ENDIF
1345 END IF
1346 ENDIF
1347 lwcb8_min = int(nb_k133,8)*int(keep(133),8)*int(nbrhs,8)
1348
1349
1350
1351
1352
1353
1354
1355 wk_user_provided = (
id%LWK_USER.NE.0)
1356 IF (
id%LWK_USER.EQ.0)
THEN
1357 itmp8 = 0_8
1358 ELSE IF (
id%LWK_USER.GT.0)
THEN
1359 itmp8= int(
id%LWK_USER,8)
1360 ELSE
1361 itmp8 = -int(
id%LWK_USER,8)* 1000000_8
1362 ENDIF
1363
1364
1365
1366
1367
1368 IF (keep(201).EQ.0) THEN
1369
1370 IF (itmp8.NE.keep8(24)) THEN
1371
1372 info(1) = -41
1373 info(2) =
id%LWK_USER
1374 GOTO 99
1375
1376
1377
1378
1379 ENDIF
1380 ELSE
1381 keep8(24)=itmp8
1382 ENDIF
1383
1384
1385 maxs = 0_8
1386 IF (wk_user_provided) THEN
1387 maxs = keep8(24)
1388 IF (maxs.LT. keep8(20)) THEN
1389 info(1)= -11
1390
1391 itmp8 = keep8(20)+1_8-maxs
1393 ENDIF
1394 IF (info(1) .GE. 0 )
id%S =>
id%WK_USER(1:keep8(24))
1395 ELSE IF (
associated(
id%S))
THEN
1396
1397
1398
1399 maxs = keep8(23)
1400 ELSE
1401
1402 IF (keep(201).EQ.0) THEN
1403 WRITE(*,*) ' Working array S not allocated ',
1404 & ' on entry to solve phase (in core) '
1406 ELSE
1407
1408
1409
1410
1411
1412
1413
1414
1415 IF ( keep(209).EQ.-1 .AND. workspace_minimal_preferred)
1416 & THEN
1417
1418 maxs = keep8(20) + 1_8
1419 ELSE IF ( keep(209) .GE.0 ) THEN
1420
1421 maxs =
max(int(keep(209),8), keep8(20) + 1_8)
1422 ELSE
1424
1425 ENDIF
1426
1427 maxs =
max(maxs,
id%KEEP8(20)+1_8)
1428 ALLOCATE (
id%S(maxs), stat = allocok)
1429 keep8(23)=maxs
1430 IF ( allocok .GT. 0 ) THEN
1431 IF (lpok) THEN
1432 WRITE(lp,*)
id%MYID,
': problem allocation of S ',
1433 & 'at solve'
1434 ENDIF
1435 info(1) = -13
1438 keep8(23)=0_8
1439 ENDIF
1440 nb_bytes = nb_bytes + keep8(23) * k35_8
1441 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
1442
1443 ENDIF
1444
1445 ENDIF
1446
1447
1448
1449
1450 IF(keep(201).EQ.0)THEN
1451 la = keep8(31)
1452 ELSE
1453
1454 la = maxs
1455 IF(maxs.GT.keep8(31)+keep8(20)*int(keep(107)+1,8))THEN
1456
1457
1458
1459
1460
1461
1462 la=keep8(31)+keep8(20)*int(keep(107)+1,8)
1463 ENDIF
1464 ENDIF
1465
1466
1467
1468
1469 IF ( maxs-la .GT. lwcb8_min ) THEN
1470 lwcb8 = maxs - la
1471 work_wcb =>
id%S(la+1_8:la+lwcb8)
1472 work_wcb_allocated=.false.
1473 ELSE
1474 lwcb8 = lwcb8_min
1475 ALLOCATE(work_wcb(lwcb8), stat = allocok)
1476 IF (allocok < 0 ) THEN
1477 info(1)=-13
1479 ENDIF
1480 work_wcb_allocated=.true.
1481 nb_bytes = nb_bytes + lwcb8*k35_8
1482 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
1483 ENDIF
1484 ENDIF
1485
1486 99 CONTINUE
1489 IF (info(1) < 0) GOTO 90
1490
1491 IF ( i_am_slave ) THEN
1492 IF (keep(201).GT.0) THEN
1494
1495
1497 is_init_ooc_done = .true.
1498 ENDIF
1499 ENDIF
1500
1503 IF (info(1) < 0) GOTO 90
1504
1505 IF (i_am_slave) THEN
1506 IF (keep(485).EQ.1) THEN
1507 IF (.NOT. (
associated(
id%FDM_F_ENCODING)))
THEN
1508 WRITE(*,*) "Internal error 18 in CMUMPS_SOL_DRIVER"
1510 ENDIF
1511 IF (.NOT. (
associated(
id%BLRARRAY_ENCODING)))
THEN
1512 WRITE(*,*) "Internal error 19 in CMUMPS_SOL_DRIVER"
1514 ENDIF
1515
1518 is_lr_mod_to_struc_done = .true.
1519 ENDIF
1520 ENDIF
1521 IF (
id%MYID.EQ.master)
THEN
1522 IF ( prokg ) THEN
1523 WRITE( mpg, 150 )
1524
1525
1526 &
id%NRHS, nbrhs, icntl(9), icntl(10), icntl(11),
1527 & icntl(20), icntl(21), icntl(30), keep(486)
1528 IF (keep(111).NE.0) THEN
1529 WRITE (mpg, 151) keep(111)
1530 ENDIF
1531 IF (keep(221).NE.0) THEN
1532 WRITE (mpg, 152) keep(221)
1533 ENDIF
1534 IF (keep(252).GT.0) THEN
1535 WRITE (mpg, 153) keep(252)
1536 ENDIF
1537 ENDIF
1538
1539
1540
1541
1542
1543 lscal = (((keep(52) .GT. 0) .AND. (keep(52) .LE. 8)) .OR. (
1544 & keep(52) .EQ. -1) .OR. keep(52) .EQ. -2)
1545 icntl10 = icntl(10)
1546 icntl11 = icntl(11)
1547
1548 IF ((icntl11 .LT. 0).OR.(icntl11 .GE. 3)) THEN
1549 icntl11 = 0
1550 IF (prokg) WRITE(mpg,'(A)')
1551 & ' WARNING: ICNTL(11) out of range'
1552 ENDIF
1553 postpros = .false.
1554 IF (icntl11.NE.0 .OR. icntl10.NE.0) THEN
1555 postpros = .true.
1556
1557
1558 IF (keep(111).NE.0) THEN
1559
1560
1561
1562
1563
1564
1565 IF (prokg) WRITE(mpg,'(A,A)')
1566 & ' WARNING: Incompatible features: null space basis ',
1567 & ' and Iter. Ref and/or Err. Anal.'
1568 postpros = .false.
1569 ELSE IF ( keep(237) .NE.0 ) THEN
1570 IF (prokg) WRITE(mpg,'(A,A)')
1571 & ' WARNING: Incompatible features: AM1',
1572 & ' and Iter. Ref and/or Err. Anal.'
1573 postpros = .false.
1574 ELSE IF ( keep(252) .NE.0 ) THEN
1575 IF (prokg) WRITE(mpg,'(A,A)')
1576 & ' WARNING: Incompatible features: Fwd in facto ',
1577 & ' and Iter. Ref and/or Err. Anal.'
1578 postpros = .false.
1579 ELSE IF (keep(221).NE.0) THEN
1580
1581
1582 IF (prokg) WRITE(mpg,'(A,A)')
1583 & ' WARNING: Incompatible features: reduced RHS ',
1584 & ' and Iter. Ref and/or Err. Anal.'
1585 postpros = .false.
1586 ELSE IF (nbrhs.GT. 1 .OR. icntl(21) .GT. 0) THEN
1587
1588
1589
1590 IF (prokg) WRITE(mpg,'(A,A)')
1591 & ' WARNING: Incompatible features: nrhs>1 or distrib sol',
1592 & ' and Iter. Ref and/or Err. Anal.'
1593 postpros = .false.
1594 ELSE IF ( keep(248) .EQ. -1 ) THEN
1595
1596
1597 IF (prokg) WRITE(mpg,'(A,A)')
1598 & ' WARNING: Incompatible features: distrib rhs',
1599 & ' and Iter. Ref and/or Err. Anal.'
1600 postpros = .false.
1601 ENDIF
1602 IF (.NOT.postpros) THEN
1603 icntl11 = 0
1604 icntl10 = 0
1605 ENDIF
1606 ENDIF
1607
1608 IF ((icntl(10) .NE. 0) .AND. (icntl10 .EQ. 0)) THEN
1609 IF (prokg) WRITE(mpg,'(A)')
1610 & ' WARNING: ICNTL(10) treated as if set to 0 '
1611 ENDIF
1612 IF ((icntl(11) .NE. 0)
1613 & .AND.(icntl11 .EQ. 0)) THEN
1614 IF (prokg) WRITE(mpg,'(A)')
1615 & ' WARNING: ICNTL(11) treated as if set to 0 '
1616 ENDIF
1617
1618 END IF
1619 CALL mpi_bcast(postpros,1,mpi_logical,master,
1621
1622
1623
1624 mat_alloc_loc = 0
1625 IF ( postpros ) THEN
1626 mat_alloc_loc = 1
1627
1628 IF ( keep(54) .EQ. 0 ) THEN
1629
1630 IF (
id%MYID .eq. master )
THEN
1631 IF (keep(55).eq.0) THEN
1632
1633 IF (.NOT.
associated(
id%A) .OR.
1634 & (.NOT.
associated(
id%IRN)) .OR.
1635 & ( .NOT.
associated(
id%JCN)))
THEN
1636 IF (prokg) WRITE(mpg,'(A)')
1637 & ' WARNING: original centralized assembled',
1638 & ' matrix is not allocated '
1639 mat_alloc_loc = 0
1640 ENDIF
1641 ELSE
1642
1643 IF (.NOT.
associated(
id%A_ELT).OR.
1644 & .NOT.
associated(
id%ELTPTR).OR.
1645 & .NOT.
associated(
id%ELTVAR))
THEN
1646 IF (prokg) WRITE(mpg,'(A)')
1647 & ' WARNING: original elemental matrix is not allocated '
1648 mat_alloc_loc = 0
1649 ENDIF
1650 ENDIF
1651 ENDIF
1652 ELSE
1653
1654 IF ( i_am_slave .AND. (
id%KEEP8(29) .GT. 0_8) )
THEN
1655
1656
1657 IF ((.NOT.
associated(
id%A_loc)) .OR.
1658 & (.NOT.
associated(
id%IRN_loc)) .OR.
1659 & (.NOT.
associated(
id%JCN_loc)))
THEN
1660 IF (prokg) WRITE(mpg,'(A)')
1661 & ' WARNING: original distributed assembled',
1662 & ' matrix is not allocated '
1663 mat_alloc_loc = 0
1664 ENDIF
1665 ENDIF
1666 ENDIF
1667 ENDIF
1668 CALL mpi_reduce( mat_alloc_loc, mat_alloc, 1,
1669 & mpi_integer,
1670 & mpi_min, master,
id%COMM, ierr)
1671 IF (
id%MYID .eq. master )
THEN
1672 IF (mat_alloc.EQ.0) THEN
1673 postpros = .false.
1674 icntl11 = 0
1675 icntl10 = 0
1676
1677 IF ((icntl(10) .NE. 0) .AND. (icntl10 .EQ. 0)) THEN
1678 IF (prokg) WRITE(mpg,'(A)')
1679 & ' WARNING: ICNTL(10) treated as if set to 0 '
1680 ENDIF
1681 IF ((icntl(11) .EQ. 1).OR.(icntl(11) .EQ. 2)
1682 & .AND.(icntl11 .EQ. 0)) THEN
1683 IF (prokg) WRITE(mpg,'(A)')
1684 & ' WARNING: ICNTL(11) treated as if set to 0 '
1685 ENDIF
1686 ENDIF
1687 IF (postpros) THEN
1688 ALLOCATE(saverhs(
id%N*nbrhs),stat = allocok)
1689 IF ( allocok .GT. 0 ) THEN
1690 IF (lpok) THEN
1691 WRITE(lp,*)
id%MYID,
1692 & ':Problem in solve: error allocating SAVERHS'
1693 ENDIF
1694 info(1) = -13
1695 info(2) =
id%N*nbrhs
1696 END IF
1697 nb_bytes = nb_bytes + int(size(saverhs),8)*k35_8
1698 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
1699 ENDIF
1700
1701
1702
1703 IF (keep(237).NE.0 .AND.keep(111).NE.0) THEN
1704
1705
1706
1707 IF (prokg) WRITE(mpg,'(A)')
1708 & ' WARNING: KEEP(237) treated as if set to 0 (null space)'
1709 keep(237)=0
1710 ENDIF
1711
1712 END IF
1715 IF (info(1) .LT.0 ) GOTO 90
1716
1717
1718
1719
1720
1721 CALL mpi_bcast(icntl10,1,mpi_integer,master,
1723 CALL mpi_bcast(icntl11,1,mpi_integer,master,
1725 CALL mpi_bcast(icntl21,1,mpi_integer,master,
1727 CALL mpi_bcast(postpros,1,mpi_logical,master,
1729 CALL mpi_bcast(lscal,1,mpi_logical,master,
1731 CALL mpi_bcast(keep(237),1,mpi_integer,master,
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743 do_permute_rhs = (keep(242).NE.0)
1744
1745 IF ( (
id%NSLAVES.GT.1) .AND. (keep(243).NE.0)
1746 & ) THEN
1747
1748
1749
1750 IF ((keep(237).NE.0).or.(keep(111).GT.0)) THEN
1751 interleave_par= .true.
1752 ELSE
1753 IF (prokg) THEN
1754 write(mpg,*) ' Warning incompatible options ',
1755 & ' interleave RHS reset to false '
1756 ENDIF
1757 ENDIF
1758 ENDIF
1759
1760
1761
1762
1763 msg_max_bytes_solve8 = int(( 4 + keep(133) ) * keep(34),8) +
1764 & int(keep(133)*keep(35),8) * int(nbrhs,8)
1765 & + int(16*keep(34),8)
1766
1767 IF ( msg_max_bytes_solve8 .GT.
1768 & int(huge(i4),8)) THEN
1769 info(1) = -18
1770 info(2) = ( huge(i4) -
1771 & ( 16 + 4 + keep(133) ) ) /
1772 & ( keep(133) * keep(35) )
1773 ENDIF
1774 IF (info(1) .LT.0 ) GOTO 111
1775 msg_max_bytes_solve = int(msg_max_bytes_solve8)
1776
1777
1778
1779
1780
1781
1782 IF (keep(237).EQ.0) THEN
1783
1784
1785
1786
1787
1788
1789
1790 kmax_246_247 =
max(keep(246),keep(247))
1791 msg_max_bytes_gthrsol = ( 2 + kmax_246_247 ) * keep(34) +
1792 & kmax_246_247 * nbrhs * keep(35)
1793 ELSE IF (icntl21.EQ.0) THEN
1794
1795
1796
1797
1798 msg_max_bytes_gthrsol = ( 3 * keep(34) + keep(35) )
1799 ELSE
1800
1801
1802
1803 msg_max_bytes_gthrsol = 0
1804 ENDIF
1805
1806 lbufr_bytes =
max(msg_max_bytes_solve, msg_max_bytes_gthrsol)
1807 tsize = int(
min(100_8*int(msg_max_bytes_gthrsol,8),
1808 & 10000000_8))
1809 lbufr_bytes =
max(lbufr_bytes,tsize)
1810 lbufr = ( lbufr_bytes + keep(34) - 1 ) / keep(3
1811 ALLOCATE (bufr(lbufr),stat=allocok)
1812 IF ( allocok .GT. 0 ) THEN
1813 IF (lpok) THEN
1814 WRITE(lp,*)
id%MYID,
1815 & ' Problem in solve: error allocating BUFR'
1816 ENDIF
1817 info(1) = -13
1818 info(2) = lbufr
1819 GOTO 111
1820 ENDIF
1821 nb_bytes = nb_bytes + int(size(bufr),8)*k34_8
1822 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
1823 IF ( i_am_slave .AND.
id%NSLAVES .GT. 1 )
THEN
1824
1825
1826
1827 cmumps_lbuf_int = ( 20 +
id%NSLAVES *
id%NSLAVES * 4 )
1828 & * keep(34)
1830 IF ( ierr .NE. 0 ) THEN
1831 info(1) = -13
1832 info(2) = cmumps_lbuf_int
1833 IF ( lpok) THEN
1834 WRITE(lp,*)
id%MYID,
1835 & ':Error allocating small Send buffer:IERR=',ierr
1836 END IF
1837 GOTO 111
1838 END IF
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849 cmumps_lbuf_8 =
1850 & (int(msg_max_bytes_solve,8)+2_8*int(keep(34),8))*
1852
1853 cmumps_lbuf_8 =
min(cmumps_lbuf_8, 100000000_8)
1854
1855
1856 cmumps_lbuf_8 =
max(cmumps_lbuf_8,
1857 & int((msg_max_bytes_solve+2*keep(34)),8) *
1858 & int(
min(
id%NSLAVES,3),8) )
1859 cmumps_lbuf_8 = cmumps_lbuf_8 + 2_8*int(keep(34),8)
1860
1861
1862
1863 cmumps_lbuf_8 =
min(cmumps_lbuf_8,
1864 & int(huge(i4),8)
1865 & - 10_8*int(keep(34),8)
1866 & )
1867 cmumps_lbuf = int(cmumps_lbuf_8, kind(cmumps_lbuf))
1869 IF ( ierr .NE. 0 ) THEN
1870 info(1) = -13
1871 info(2) = cmumps_lbuf/keep(34) + 1
1872 IF ( lpok) THEN
1873 WRITE(lp,*)
id%MYID,
1874 & ':Error allocating Send buffer:IERR=', ierr
1875 END IF
1876 GOTO 111
1877 END IF
1878
1879
1880
1881 ENDIF
1882
1883 IF ( postpros ) THEN
1884
1885
1886
1887 IF (
id%MYID .NE. master )
THEN
1888
1889 ALLOCATE(rhs_ir(
id%N),stat=ierr)
1890 nb_bytes = nb_bytes + int(size(rhs_ir),8)*k35_8
1891 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
1892 IF ( ierr .GT. 0 ) THEN
1893 info(1)=-13
1895 IF (lpok) THEN
1896 WRITE(lp,*) 'ERROR while allocating RHS on a slave'
1897 ENDIF
1898 GOTO 111
1899 END IF
1900 ELSE
1902 ENDIF
1903 ENDIF
1904
1905
1906
1907 do_nbsparse = ( ( (keep(237).NE.0).OR.(keep(235).NE.0) )
1908 & .AND.
1909 & ( keep(497).NE.0 )
1910 & )
1911 IF ( i_am_slave ) THEN
1912 IF(do_nbsparse) THEN
1913
1914 lptr_rhs_bounds = 2*keep(28)
1915 ALLOCATE(rhs_bounds(lptr_rhs_bounds), stat=ierr)
1916 IF (ierr.GT.0) THEN
1917 info(1)=-13
1918 info(2)=lptr_rhs_bounds
1919 IF (lpok) THEN
1920 WRITE(lp,*) 'ERROR while allocating RHS_BOUNDS on',
1921 & ' a slave'
1922 ENDIF
1923 GOTO 111
1924 END IF
1925 nb_bytes = nb_bytes +
1926 & int(size(rhs_bounds),8)*k34_8
1927 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
1928 ptr_rhs_bounds => rhs_bounds
1929 ELSE
1930 lptr_rhs_bounds = 1
1931 ptr_rhs_bounds => idummy_target
1932 ENDIF
1933 ENDIF
1934
1935 IF ( i_am_slave ) THEN
1936 IF ((keep(221).EQ.2 .AND. keep(252).EQ.0)) THEN
1937
1938
1939 IF (.NOT.
associated(
id%RHSCOMP))
THEN
1940 info(1) = -35
1941 info(2) = 1
1942 GOTO 111
1943 ENDIF
1944
1945
1946 IF (.NOT.
associated(
id%POSINRHSCOMP_ROW) )
1947
1948 & THEN
1949 info(1) = -35
1950 info(2) = 2
1951 GOTO 111
1952 ENDIF
1953 IF (.not.
id%POSINRHSCOMP_COL_ALLOC)
THEN
1954
1955
1956
1957 id%POSINRHSCOMP_COL =>
id%POSINRHSCOMP_ROW
1958 ENDIF
1959 ELSE
1960
1961
1962
1963
1964
1965
1966 IF (
associated(
id%POSINRHSCOMP_ROW))
THEN
1967 nb_bytes = nb_bytes -
1968 & int(
size(
id%POSINRHSCOMP_ROW),8)*k34_8
1969 DEALLOCATE(
id%POSINRHSCOMP_ROW)
1970 ENDIF
1971 ALLOCATE (
id%POSINRHSCOMP_ROW(
id%N), stat = allocok)
1972 IF ( allocok .GT. 0 ) THEN
1973 info(1)=-13
1975 GOTO 111
1976 END IF
1977 nb_bytes = nb_bytes +
1978 & int(
size(
id%POSINRHSCOMP_ROW),8)*k34_8
1979 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
1980 IF (
id%POSINRHSCOMP_COL_ALLOC)
THEN
1981 nb_bytes = nb_bytes -
1982 & int(
size(
id%POSINRHSCOMP_COL),8)*k34_8
1983 DEALLOCATE(
id%POSINRHSCOMP_COL)
1984 NULLIFY(
id%POSINRHSCOMP_COL)
1985 id%POSINRHSCOMP_COL_ALLOC = .false.
1986 ENDIF
1987
1988 IF ((keep(50).EQ.0).OR.keep(237).NE.0) THEN
1989 ALLOCATE (
id%POSINRHSCOMP_COL(
id%N), stat = allocok)
1990 IF ( allocok .GT. 0 ) THEN
1991 info(1)=-13
1993 GOTO 111
1994 END IF
1995 id%POSINRHSCOMP_COL_ALLOC = .true.
1996 nb_bytes = nb_bytes +
1997 & int(
size(
id%POSINRHSCOMP_COL),8)*k34_8
1998 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
1999 ELSE
2000
2001 id%POSINRHSCOMP_COL =>
id%POSINRHSCOMP_ROW
2002 id%POSINRHSCOMP_COL_ALLOC = .false.
2003 ENDIF
2004 IF (keep(221).NE.2) THEN
2005
2006
2007 IF (
associated(
id%RHSCOMP))
THEN
2008 nb_bytes = nb_bytes -
id%KEEP8(25)*k35_8
2009 DEALLOCATE(
id%RHSCOMP)
2012 ENDIF
2013 ENDIF
2014 ENDIF
2015
2016
2017
2018
2019 liwk_solve = 2 * keep(28) +
id%NA(1)+1
2020 liwk_ptracb= keep(28)
2021
2022
2023 IF (keep(201).EQ.1) THEN
2024 liwk_solve = liwk_solve + keep(228) + 1
2025 ELSE
2026
2027 liwk_solve = liwk_solve + 1
2028 ENDIF
2029 ALLOCATE ( iwk_solve(liwk_solve),
2030 & ptracb(liwk_ptracb), stat = allocok )
2031 IF (allocok .GT. 0 ) THEN
2032 info(1)=-13
2033 info(2)=liwk_solve + liwk_ptracb*keep(10)
2034 GOTO 111
2035 END IF
2036 nb_bytes = nb_bytes + int(liwk_solve,8)*k34_8 +
2037 & int(liwk_ptracb,8)*k34_8 *int(keep(10),8)
2038 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2039
2040
2041
2042
2043 liwcb = 20*nb_k133*2 + keep(133)
2044 ALLOCATE ( iwcb( liwcb), stat = allocok )
2045 IF (allocok .GT. 0 ) THEN
2046 info(1)=-13
2047 info(2)=liwcb
2048 GOTO 111
2049 END IF
2050 nb_bytes = nb_bytes + int(liwcb,8)*k34_8
2051 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2052
2053
2054
2055
2056
2057
2058 liw = keep(32)
2059
2060
2061
2062 ALLOCATE(srw3(keep(133)), stat = allocok )
2063 IF ( allocok .GT. 0 ) THEN
2064 info(1)=-13
2065 info(2)=keep(133)
2066 GOTO 111
2067 END IF
2068 nb_bytes = nb_bytes + int(size(srw3),8)*k35_8
2069 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2070
2071
2072
2073 ELSE
2074
2075
2076
2077
2078 liw=0
2079 END IF
2080
2081
2082 IF (allocated(uns_perm_inv)) DEALLOCATE(uns_perm_inv)
2083 uns_perm_inv_needed_inmainloop = .false.
2084 IF ( (
id%MYID .eq. master.AND.(keep(23).GT.0) .AND.
2085 & (mtype .NE. 1).AND.(keep(248).NE.0)
2086 & )
2087
2088
2089 & .OR. ( keep(237).NE.0 .AND. keep(23).NE.0 )
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106 & ) THEN
2107 uns_perm_inv_needed_inmainloop = .true.
2108 ENDIF
2109 uns_perm_inv_needed_befmainloop = .false.
2110 IF ( keep(23) .GT.0 .AND.
2111 & mtype .NE. 1 .AND. keep(248).EQ.-1 ) THEN
2112
2113
2114
2115
2116 uns_perm_inv_needed_befmainloop = .true.
2117 ENDIF
2118 IF ( uns_perm_inv_needed_inmainloop .OR.
2119 & uns_perm_inv_needed_befmainloop ) THEN
2120 ALLOCATE(uns_perm_inv(
id%N),stat=allocok)
2121 if (allocok .GT.0 ) THEN
2122 info(1)=-13
2124 GOTO 111
2125 endif
2126 nb_bytes = nb_bytes + int(
id%N,8)*k34_8
2127 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2128 IF (
id%MYID.EQ.master)
THEN
2129
2131 uns_perm_inv(
id%UNS_PERM(i))=i
2132 ENDDO
2133 ENDIF
2134
2135 ELSE
2136 ALLOCATE(uns_perm_inv(1), stat=allocok)
2137 if (allocok .GT.0 ) THEN
2138 info(1)=-13
2139 info(2)=1
2140 GOTO 111
2141 endif
2142 nb_bytes = nb_bytes + 1_8*k34_8
2143 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2144 ENDIF
2145
2146 111 CONTINUE
2147#if defined(V_T)
2148 CALL vtend(glob_comm_ini,ierr)
2149#endif
2150
2151
2152
2153
2156 IF (info(1) .LT.0 ) GOTO 90
2157
2158
2159 IF ( keep(23).NE.0 .AND.
2160 & ( keep(237).NE.0 .OR.
2161 & ( mtype.NE.1 .AND. keep(248).EQ.-1 ) ) ) THEN
2162
2163 CALL mpi_bcast( uns_perm_inv,
id%N,mpi_integer,master,
2165 ENDIF
2166
2167
2168
2169
2170 IF (i_am_slave .AND. keep(248).EQ.-1) THEN
2171
2172 ALLOCATE(map_rhs_loc(
max(
id%Nloc_RHS,1)), stat=allocok)
2173 IF (allocok .GT. 0) THEN
2176 GOTO 20
2177 ENDIF
2178 nb_bytes = nb_bytes +
max(int(
id%Nloc_RHS,8),1_8)*k34_8
2179 ENDIF
2180
2181
2182
2183 build_rhsmapinfo = .true.
2184 20 CONTINUE
2187 IF ( info(1) .LT.0 ) GOTO 90
2188
2189
2190
2191
2192 IF ( i_am_slave .AND. keep(23).GT.0 .AND. keep(248).EQ.-1
2193 & .AND. mtype.NE.1 ) THEN
2194 IF (
id%Nloc_RHS .GT. 0)
THEN
2195 ALLOCATE(irhs_loc_ptr(
id%Nloc_RHS),stat=allocok)
2196 IF (allocok.GT.0) THEN
2197 info(1)=-13
2199 GOTO 25
2200 ENDIF
2201 irhs_loc_ptr_allocated = .true.
2202 nb_bytes = nb_bytes +
max(int(
id%Nloc_RHS,8),1_8)*k34_8
2203 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2205 IF (
id%IRHS_loc(i).GE.1 .AND.
id%IRHS_loc(i).LE.
id%N)
2206 & THEN
2207 irhs_loc_ptr(i)=uns_perm_inv(
id%IRHS_loc(i))
2208 ELSE
2209
2210 irhs_loc_ptr(i)=
id%IRHS_loc(i)
2211 ENDIF
2212 ENDDO
2213 ENDIF
2214 ENDIF
2215
2216
2217 IF (uns_perm_inv_needed_befmainloop .AND.
2218 & .NOT. uns_perm_inv_needed_inmainloop) THEN
2219 nb_bytes = nb_bytes - int(size(uns_perm_inv),8)*k34_8
2220 DEALLOCATE(uns_perm_inv)
2221 ALLOCATE(uns_perm_inv(1))
2222 nb_bytes = nb_bytes + k34_8
2223 ENDIF
2224 IF (lscal .AND.
id%KEEP(248).EQ.-1)
THEN
2225
2226
2227 IF (mtype == 1) THEN
2228
2229 scaling_data_dr%SCALING=>
id%ROWSCA
2230 ELSE
2231
2232 scaling_data_dr%SCALING=>
id%COLSCA
2233 ENDIF
2235 & irhs_loc_ptr(1),
id%Nloc_RHS,
2236 &
id%COMM,
id%MYID, i_am_slave, master,
2237 & nb_bytes, nb_bytes_max, k16_8, lp, lpok,
2238 & icntl(1), info(1) )
2239 ENDIF
2240
2241
2242
2243
2244 25 CONTINUE
2247 IF ( info(1) .LT.0 ) GOTO 90
2248
2249
2250
2251
2252 IF ( icntl21==1 ) THEN
2253 IF (lscal) THEN
2254
2255
2256
2257 IF (
id%MYID.NE.master)
THEN
2258 IF (mtype == 1) THEN
2259 ALLOCATE(
id%COLSCA(
id%N),stat=allocok)
2260 ELSE
2261 ALLOCATE(
id%ROWSCA(
id%N),stat=allocok)
2262 ENDIF
2263 IF (allocok > 0) THEN
2264 IF (lpok) THEN
2265 WRITE(lp,*) 'Error allocating temporary scaling array'
2266 ENDIF
2267 info(1)=-13
2269 GOTO 37
2270 ENDIF
2271 nb_bytes = nb_bytes + int(
id%N,8)*k16_8
2272 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2273 ENDIF
2276 IF (info(1) .LT.0 ) GOTO 90
2277 IF (i_am_slave) THEN
2278 ALLOCATE(scaling_data_sol%SCALING_LOC(
id%KEEP(89)),
2279 & stat=allocok)
2280 IF (allocok > 0) THEN
2281 IF (lpok) THEN
2282 WRITE(lp,*) 'Error allocating local scaling array'
2283 ENDIF
2284 info(1)=-13
2286 GOTO 38
2287 ENDIF
2288 nb_bytes = nb_bytes + int(
id%KEEP(89),8)*k16_8
2289 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2290 ENDIF
2291 38 CONTINUE
2294 IF (info(1) .LT.0 ) THEN
2295 GOTO 90
2296 ENDIF
2297 IF (mtype == 1) THEN
2299 & mpi_real,master,
2301 scaling_data_sol%SCALING=>
id%COLSCA
2302 ELSE
2304 & mpi_real,master,
2306 scaling_data_sol%SCALING=>
id%ROWSCA
2307 ENDIF
2308 ENDIF
2309 IF ( i_am_slave ) THEN
2310
2311
2312
2313 liw_passed=
max(1,liw)
2314
2315
2316
2317 IF (keep(89) .GT. 0) THEN
2320 &
id%KEEP(1),
id%KEEP8(1),
2321 &
id%IS(1), liw_passed,
id%MYID_NODES,
2322 &
id%N,
id%STEP(1),
id%PROCNODE_STEPS(1),
2323 &
id%NSLAVES, scaling_data_sol, lscal
2324
2325 & , (keep(248).EQ.-1), irhs_loc_ptr(1),
id%Nloc_RHS
2326 & )
2327 ENDIF
2328 IF (
id%MYID.NE.master .AND. lscal)
THEN
2329
2330
2331
2332
2333 IF (mtype == 1) THEN
2334 DEALLOCATE(
id%COLSCA)
2336 ELSE
2337 DEALLOCATE(
id%ROWSCA)
2339 ENDIF
2340 nb_bytes = nb_bytes - int(
id%N,8)*k16_8
2341 ENDIF
2342 ENDIF
2343 IF (keep(23) .NE. 0 .AND. mtype==1) THEN
2344
2345
2346 IF (
id%MYID.NE.master)
THEN
2347 ALLOCATE(
id%UNS_PERM(
id%N),stat=allocok)
2348 IF (allocok > 0) THEN
2349 info(1)=-13
2351 GOTO 40
2352 ENDIF
2353 ENDIF
2354 ENDIF
2355
2356
2357 40 CONTINUE
2360 IF (info(1) .LT.0 ) GOTO 90
2361
2362
2363 IF (keep(23) .NE. 0 .AND. mtype==1) THEN
2366 IF (i_am_slave) THEN
2367 DO i=1, keep(89)
2368 id%ISOL_loc(i) =
id%UNS_PERM(
id%ISOL_loc(i))
2369 ENDDO
2370 ENDIF
2371 IF (
id%MYID.NE.master)
THEN
2372 DEALLOCATE(
id%UNS_PERM)
2373 NULLIFY(
id%UNS_PERM)
2374 ENDIF
2375 ENDIF
2376 ENDIF
2377
2378
2379
2380
2381
2382
2383
2384 IF ( ( keep(221) .EQ. 1 ) .OR.
2385 & ( keep(221) .EQ. 2 )
2386 & ) THEN
2387
2388
2389 IF (keep(46).EQ.1) THEN
2390 master_root_in_comm=master_root
2391 ELSE
2392 master_root_in_comm =master_root+1
2393 ENDIF
2394 IF (
id%MYID .EQ. master )
THEN
2395
2396
2397
2398
2399 IF (
id%NRHS.EQ.1)
THEN
2400 ld_redrhs =
id%KEEP(116)
2401 ELSE
2402 ld_redrhs =
id%LREDRHS
2403 ENDIF
2404 ENDIF
2405 IF (master.NE.master_root_in_comm) THEN
2406
2407
2408
2409
2410 IF (
id%MYID .EQ. master )
THEN
2411
2412
2413 CALL mpi_send(ld_redrhs,1,mpi_integer,
2414 & master_root_in_comm, 0,
id%COMM,ierr)
2415 ELSEIF (
id%MYID.EQ.master_root_in_comm)
THEN
2416
2417 CALL mpi_recv(ld_redrhs,1,mpi_integer,
2418 & master, 0,
id%COMM,status,ierr)
2419 ENDIF
2420
2421 ENDIF
2422 ENDIF
2423
2424 IF ( keep(248)==1 ) THEN
2425
2426
2427
2428
2429
2430 jend_rhs = 0
2431
2432
2433 IF (do_permute_rhs) THEN
2434
2435 ALLOCATE(perm_rhs(
id%NRHS),stat=allocok)
2436 IF (allocok > 0) THEN
2437 info(1) = -13
2439 GOTO 109
2440 ENDIF
2441 nb_bytes = nb_bytes + int(
id%NRHS,8)*k34_8
2442 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2443 IF (
id%MYID.EQ.master)
THEN
2444
2445
2446
2447
2448
2449
2450 IF (keep(237).EQ.0) THEN
2451
2452
2453
2454
2456 & lp, lpok, prokg, mpg, keep(242),
2457 &
id%SYM_PERM(1),
id%N,
id%NRHS,
2458 &
id%IRHS_PTR(1),
id%NRHS+1,
2459 &
id%IRHS_SPARSE(1),
id%NZ_RHS,
2460 & perm_rhs, ierr)
2461 IF (ierr.LT.0) THEN
2462 info(1) = -9999
2463 info(2) = ierr
2464 GOTO 109
2465 ENDIF
2466 ELSE
2467
2468
2469
2470
2471
2472
2473 strat_permam1 = keep(242)
2475 & (strat_permam1,
id%SYM_PERM(1),
2476 &
id%IRHS_PTR(1),
id%NRHS+1,
2477 & perm_rhs,
id%NRHS,
2478 & ierr
2479 & )
2480 ENDIF
2481 ENDIF
2482 ENDIF
2483 ENDIF
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494 IF (.NOT. allocated(perm_rhs)) THEN
2495 ALLOCATE(perm_rhs(1),stat=allocok)
2496 IF (allocok > 0) THEN
2497 info(1) = -13
2498 info(2) = 1
2499 GOTO 109
2500 ENDIF
2501 nb_bytes = nb_bytes + int(size(perm_rhs),8)*k34_8
2502 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2503 ENDIF
2504
2507 IF (info(1) .LT.0 ) GOTO 90
2508
2509
2510 IF (
id%NSLAVES .EQ. 1)
THEN
2511
2512
2513
2514 IF (do_permute_rhs .AND. keep(111).NE.0 ) THEN
2515
2516
2517
2518 WRITE(*,*)
id%MYID,
':INTERNAL ERROR 1 : ',
2519 & ' PERMUTE RHS during null space computation ',
2520 & ' not available yet '
2522 ENDIF
2523 ELSE
2524 IF (do_permute_rhs .AND. keep(111).NE.0 ) THEN
2525 WRITE(*,*)
id%MYID,
':INTERNAL ERROR 2 : ',
2526 & ' PERMUTE RHS during null space computation ',
2527 & ' not available yet '
2529
2530
2531 ENDIF
2532 IF (interleave_par.AND. (keep(111).NE.0)) THEN
2533 WRITE(*,*)
id%MYID,
':INTERNAL ERROR 3 : ',
2534 & ' INTERLEAVE RHS during null space computation ',
2535 & ' not available yet '
2537 ENDIF
2538 IF (interleave_par.AND.keep(111).EQ.0) THEN
2539
2540
2541 IF (
id%MYID.EQ.master)
THEN
2542
2543
2544 size_working =
id%IPTR_WORKING(
id%NPROCS+1)-1
2545 size_iptr_working =
id%NPROCS+1
2547 & perm_rhs,
id%NRHS,
2548 &
id%IPTR_WORKING(1), size_iptr_working,
2549 &
id%WORKING(1), size_working,
2551 &
id%STEP(1),
id%SYM_PERM(1),
id%N, nbrhs,
2552 &
id%PROCNODE_STEPS(1), keep(28),
id%NSLAVES,
2553 & keep(199),
2554 & keep(493).NE.0,
2555 & keep(495).NE.0, keep(496), prokg, mpg
2556 & )
2557 ENDIF
2558 ENDIF ! End A-1 and interleave_par
2559
2560 ENDIF
2561
2562
2563 IF (do_permute_rhs.AND.(keep(111).EQ.0)) THEN
2564
2565
2566
2569 & mpi_integer,
2570 & master,
id%COMM,ierr)
2571 ENDIF
2572
2573 IF (keep(401) .GT. 0) THEN
2574
2575
2576
2577
2578 IF ( keep(400) .GT. 0 ) THEN
2579
2580
2581
2582 nomp = 1
2583
2584 IF (keep(400).NE.nomp) THEN
2585
2587 id%INFO(2) = keep(400)
2588 IF (lpok) WRITE(lp,'(A,A,I5,A,I5)')
2589 &" FAILURE DETECTED IN SOLVE: #threads for KEEP(401)",
2590 &" changed from",keep(400)," at analysis to", nomp
2591 ENDIF
2592 ENDIF
2593
2594 ENDIF
2595 IF (keep(400) .GT. 0) THEN
2597 ENDIF
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610 beg_rhs=1
2611 DO WHILE (beg_rhs.LE.nrhs_nonempty)
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625 nbrhs_eff =
min(nrhs_nonempty-beg_rhs+1, nbrhs)
2626
2627
2628
2629 IF (irhs_sparse_copy_allocated) THEN
2630 nb_bytes = nb_bytes -
2631 & int(size(irhs_sparse_copy),8)*k34_8
2632 DEALLOCATE(irhs_sparse_copy)
2633 irhs_sparse_copy_allocated=.false.
2634 NULLIFY(irhs_sparse_copy)
2635 ENDIF
2636 IF (irhs_ptr_copy_allocated) THEN
2637 nb_bytes = nb_bytes -
2638 & int(size(irhs_ptr_copy),8)*k34_8
2639 DEALLOCATE(irhs_ptr_copy)
2640 irhs_ptr_copy_allocated=.false.
2641 NULLIFY(irhs_ptr_copy)
2642 ENDIF
2643 IF (rhs_sparse_copy_allocated) THEN
2644 nb_bytes = nb_bytes -
2645 & int(size(rhs_sparse_copy),8)*k35_8
2646 DEALLOCATE(rhs_sparse_copy)
2647 rhs_sparse_copy_allocated=.false.
2648 NULLIFY(rhs_sparse_copy)
2649 ENDIF
2650
2651
2652
2653
2654
2655
2656
2657 IF (
2658
2659 & (
id%MYID .NE. master )
2660
2661 & .or.
2662
2663
2664
2665 & ( i_am_slave .AND.
id%MYID .EQ. master .AND.
2666 & icntl21 .NE.0 .AND.
2667 & ( keep(248).ne.0 .OR. keep(221).EQ.2
2668 & .OR. keep(111).NE.0 )
2669 & )
2670 & .or.
2671
2672
2673
2674
2675
2676 & (
id%MYID .EQ. master .AND. (keep(237).NE.0) )
2677
2678 & ) THEN
2680 ibeg = 1
2681 ELSE
2682
2683 IF (
associated(
id%RHS) )
THEN
2684
2686 ELSE
2687
2689 ENDIF
2690 ibeg = int(beg_rhs-1,8) * int(ld_rhs,8) + 1_8
2691 ENDIF
2692
2693
2694
2695
2696 jbeg_rhs = beg_rhs
2697
2698
2699
2700 IF ( (
id%MYID.EQ.master) .AND.
2701 & keep(248)==1 ) THEN
2702
2703
2704 jbeg_rhs = jend_rhs + 1
2705 IF (do_permute_rhs.OR.interleave_par) THEN
2706 DO WHILE (
id%IRHS_PTR(perm_rhs(jbeg_rhs)) .EQ.
2707 &
id%IRHS_PTR(perm_rhs(jbeg_rhs)+1) )
2708
2709 IF ((keep(237).EQ.0).AND.(icntl21.EQ.0).AND.
2710 & (keep(221).NE.1) ) THEN
2711
2712
2713
2715 id%RHS(int(perm_rhs(jbeg_rhs) -1,8)*int(ld_rhs,8)+
2716 & int(i,8)) = zero
2717 ENDDO
2718 ENDIF
2719 jbeg_rhs = jbeg_rhs +1
2720 ENDDO
2721 ELSE
2722 DO WHILE(
id%IRHS_PTR(jbeg_rhs) .EQ.
2723 &
id%IRHS_PTR(jbeg_rhs+1) )
2724 IF ((keep(237).EQ.0).AND.(icntl21.EQ.0).AND.
2725 & (keep(221).NE.1) ) THEN
2726
2727
2728
2730 id%RHS(int(jbeg_rhs -1,8)*int(ld_rhs,8) +
2731 & int(i,8)) = zero
2732 ENDDO
2733 ENDIF
2734 IF (keep(221).EQ.1) THEN
2735
2736 DO i = 1,
id%SIZE_SCHUR
2737 id%REDRHS(int(jbeg_rhs-1,8)*int(ld_redrhs,8) +
2738 & int(i,8)) = zero
2739 ENDDO
2740 ENDIF
2741 jbeg_rhs = jbeg_rhs +1
2742 ENDDO
2743 ENDIF
2744
2745
2746
2747
2748
2749
2750 nb_rhsskipped = jbeg_rhs - (jend_rhs + 1)
2751 IF ((keep(248).EQ.1).AND.(keep(237).EQ.0)
2752 & .AND. (icntl21.EQ.0))
2753 & THEN
2754
2755
2756
2757 ibeg = int(jbeg_rhs-1,8) * int(ld_rhs,8) + 1_8
2758 ENDIF
2759 ENDIF
2760 CALL mpi_bcast( jbeg_rhs, 1, mpi_integer,
2761 & master,
id%COMM, ierr )
2762
2763
2764
2765 IF (
id%MYID.EQ.master .AND. keep(221).NE.0)
THEN
2766
2767
2768 ibeg_redrhs= int(jbeg_rhs-1,8)*int(ld_redrhs,8) + 1_8
2769 ELSE
2770 ibeg_redrhs=-142424_8
2771 ENDIF
2772
2773
2774
2775
2776
2777#if defined(V_T)
2778 CALL vtbegin(perm_scal_ini,ierr)
2779#endif
2780 IF (
id%MYID .eq. master)
THEN
2781
2782 IF (keep(248)==1) THEN
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799 nbcol = 0
2800 nbcol_inbloc = 0
2801 nz_this_block = 0
2802
2803
2804
2805
2806
2807
2808 stop_at_next_empty_col = .false.
2809 DO i=jbeg_rhs,
id%NRHS
2810 nbcol_inbloc = nbcol_inbloc +1
2811 IF (do_permute_rhs.OR.interleave_par) THEN
2812
2813
2814
2815
2816 colsize =
id%IRHS_PTR(perm_rhs(i)+1)
2817 & -
id%IRHS_PTR(perm_rhs(i))
2818 ELSE
2819 colsize =
id%IRHS_PTR(i+1) -
id%IRHS_PTR(i)
2820 ENDIF
2821 IF ((.NOT.stop_at_next_empty_col).AND.(colsize.GT.0).AND.
2822 & (keep(237).EQ.0)) THEN
2823
2824
2825 stop_at_next_empty_col =.true.
2826 ENDIF
2827 IF (colsize.GT.0
2828 & ) THEN
2829 nbcol = nbcol+1
2830 nz_this_block = nz_this_block + colsize
2831 ELSE IF (stop_at_next_empty_col) THEN
2832
2833
2834 nbcol_inbloc = nbcol_inbloc -1
2835 nbrhs_eff = nbcol
2836 EXIT
2837 ENDIF
2838 IF (nbcol.EQ.nbrhs_eff) EXIT
2839 ENDDO
2840 IF (nz_this_block.EQ.0) THEN
2841 WRITE(*,*) " Internal Error 16 in sol driver NZ_THIS_BLOCK=",
2842 & nz_this_block
2844 ENDIF
2845
2846 IF (nbcol.NE.nbrhs_eff.AND. (keep(237).NE.0)
2847 & .AND.keep(221).NE.1) THEN
2848
2849
2850
2851
2852
2853
2854
2855 WRITE(6,*) ' Internal Error 8 in solution driver ',
2856 & nbcol, nbrhs_eff
2858 ENDIF
2859
2860
2861 IF (nz_this_block .NE. 0) THEN
2862
2863
2864
2865
2866 ALLOCATE(irhs_ptr_copy(nbcol_inbloc+1),stat=allocok)
2867 if (allocok .GT.0 ) then
2868 info(1)=-13
2869 info(2)=nbcol_inbloc+1
2870 GOTO 30
2871 endif
2872 irhs_ptr_copy_allocated = .true.
2873 nb_bytes = nb_bytes + int(nbcol_inbloc+1,8)*k34_8
2874 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2875
2876 jend_rhs =jbeg_rhs + nbcol_inbloc - 1
2877
2878
2879
2880 IF (do_permute_rhs.OR.interleave_par) THEN
2881 ipos = 1
2882 j = 0
2883 DO i=jbeg_rhs, jbeg_rhs + nbcol_inbloc -1
2884 j = j+1
2885 irhs_ptr_copy(j) = ipos
2886 colsize =
id%IRHS_PTR(perm_rhs(i)+1)
2887 & -
id%IRHS_PTR(perm_rhs(i))
2888 ipos = ipos + colsize
2889 ENDDO
2890 ELSE
2891 ipos = 1
2892 j = 0
2893 DO i=jbeg_rhs, jbeg_rhs + nbcol_inbloc -1
2894 j = j+1
2895 irhs_ptr_copy(j) = ipos
2896 colsize =
id%IRHS_PTR(i+1)
2898 ipos = ipos + colsize
2899 ENDDO
2900 ENDIF
2901 irhs_ptr_copy(nbcol_inbloc+1)= ipos
2902 IF ( ipos-1 .NE. nz_this_block ) THEN
2903 WRITE(*,*) "Error in compressed copy of IRHS_PTR"
2904 ierr = 99
2906 ENDIF
2907
2908
2909
2910
2911 IF (keep(23) .NE. 0 .and. mtype .NE. 1) THEN
2912
2913 ALLOCATE(irhs_sparse_copy(nz_this_block)
2914 & ,stat=allocok)
2915 if (allocok .GT.0 ) then
2916 info(1)=-13
2917 info(2)=nz_this_block
2918 GOTO 30
2919 endif
2920 irhs_sparse_copy_allocated=.true.
2921 nb_bytes = nb_bytes + int(nz_this_block,8)*k34_8
2922 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2923 ELSE IF (do_permute_rhs.OR.interleave_par.OR.
2924 & (keep(237).NE.0)) THEN
2925
2926
2927
2928
2929
2930
2931 ALLOCATE(irhs_sparse_copy(nz_this_block),
2932 & stat=allocok)
2933 IF (allocok .GT.0 ) THEN
2934 ierr = 99
2935 GOTO 30
2936 ENDIF
2937 irhs_sparse_copy_allocated=.true.
2938 nb_bytes = nb_bytes + int(nz_this_block,8)*k34_8
2939 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2940
2941 ENDIF
2942
2943
2944 IF (irhs_sparse_copy_allocated) THEN
2945 IF ( do_permute_rhs.OR.interleave_par ) THEN
2946 ipos = 1
2947 DO i=jbeg_rhs, jbeg_rhs + nbcol_inbloc -1
2948 colsize =
id%IRHS_PTR(perm_rhs(i)+1)
2949 & -
id%IRHS_PTR(perm_rhs(i))
2950 irhs_sparse_copy(ipos:ipos+colsize-1) =
2951 &
id%IRHS_SPARSE(
id%IRHS_PTR(perm_rhs(i)):
2952 &
id%IRHS_PTR(perm_rhs(i)+1) -1)
2953 ipos = ipos + colsize
2954 ENDDO
2955 ELSE
2956 irhs_sparse_copy =
id%IRHS_SPARSE(
2957 &
id%IRHS_PTR(jbeg_rhs):
2958 &
id%IRHS_PTR(jbeg_rhs)+nz_this_block-1)
2959 ENDIF
2960 ELSE
2961 irhs_sparse_copy
2962
2963 & =>
2964 &
id%IRHS_SPARSE(
id%IRHS_PTR(jbeg_rhs):
2965 &
id%IRHS_PTR(jbeg_rhs)+nz_this_block-1)
2966 ENDIF
2967 IF (lscal.OR.do_permute_rhs.OR.interleave_par.OR.
2968 & (keep(237).NE.0)) THEN
2969
2970
2971
2972
2973
2974
2975 ALLOCATE(rhs_sparse_copy(nz_this_block),
2976 & stat=allocok)
2977 IF (allocok .GT.0 ) THEN
2978 info(1)=-13
2979 info(2)=nz_this_block
2980 GOTO 30
2981 ENDIF
2982 rhs_sparse_copy_allocated = .true.
2983 nb_bytes = nb_bytes + int(nz_this_block,8)*k35_8
2984 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2985 ELSE
2986 IF ( keep(248)==1 ) THEN
2987 rhs_sparse_copy
2988
2989 & =>
id%RHS_SPARSE(
id%IRHS_PTR(jbeg_rhs):
2990 &
id%IRHS_PTR(jbeg_rhs)+nz_this_block-1)
2991 ELSE
2992 rhs_sparse_copy
2993
2994 & =>
id%RHS_SPARSE(
id%IRHS_PTR(beg_rhs):
2995 &
id%IRHS_PTR(beg_rhs)+nz_this_block-1)
2996 ENDIF
2997 ENDIF
2998 IF (do_permute_rhs.OR.interleave_par.OR.
2999 & (
id%KEEP(237).NE.0))
THEN
3000 IF (
id%KEEP(237).NE.0)
THEN
3001
3002
3003 rhs_sparse_copy = one
3004 ELSE IF (.NOT. lscal) THEN
3005
3006
3007
3008 ipos = 1
3009 DO i=jbeg_rhs, jbeg_rhs + nbcol_inbloc -1
3010 colsize =
id%IRHS_PTR(perm_rhs(i)+1)
3011 & -
id%IRHS_PTR(perm_rhs(i))
3012 IF (colsize .EQ. 0) cycle
3013 rhs_sparse_copy(ipos:ipos+colsize-1) =
3014 &
id%RHS_SPARSE(
id%IRHS_PTR(perm_rhs(i)):
3015 &
id%IRHS_PTR(perm_rhs(i)+1) -1)
3016 ipos = ipos + colsize
3017 ENDDO
3018 ENDIF
3019 ENDIF
3020
3021 IF (keep(23) .NE. 0) THEN
3022
3023
3024 IF (mtype .NE. 1) THEN
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038 ipos = 1
3039 DO i=1, nbcol_inbloc
3040
3041
3042 colsize = irhs_ptr_copy(i+1) - irhs_ptr_copy(i)
3043 DO k = 1, colsize
3044 jperm = uns_perm_inv(irhs_sparse_copy(ipos+k-1))
3045 irhs_sparse_copy(ipos+k-1) = jperm
3046 ENDDO
3047 ipos = ipos + colsize
3048 ENDDO
3049 ENDIF
3050 ENDIF
3051 ENDIF
3052
3053 ENDIF ! ============ keep(248)==1
3054
3055 ENDIF
3056
3057
3058 30 CONTINUE
3061 IF (info(1) .LT.0 ) GOTO 90
3062
3063
3064
3065 IF (keep(248)==1) THEN
3066 CALL mpi_bcast( nbcol_inbloc,1, mpi_integer,
3067 & master,
id%COMM,ierr)
3068 ELSE
3069 nbcol_inbloc = nbrhs_eff
3070 ENDIF
3071 jend_rhs =jbeg_rhs + nbcol_inbloc - 1
3072 IF ((keep(111).eq.0).AND.(keep(252).EQ.0)
3073 & .AND.(keep(221).NE.2 ).AND.(keep(248).EQ.1) ) THEN
3074
3075
3076
3077 CALL mpi_bcast( nz_this_block,1, mpi_integer,
3078 & master,
id%COMM,ierr)
3079 IF (
id%MYID.NE.master .and. nz_this_block.NE.0)
THEN
3080 ALLOCATE(irhs_sparse_copy(nz_this_block),
3081 & stat=allocok)
3082 if (allocok .GT.0 ) then
3083 info(1)=-13
3084 info(2)=nz_this_block
3085 GOTO 45
3086 endif
3087 irhs_sparse_copy_allocated=.true.
3088
3089
3090
3091
3092
3093 ALLOCATE(rhs_sparse_copy(nz_this_block),
3094 & stat=allocok)
3095 if (allocok .GT.0 ) then
3096 info(1)=-13
3097 info(2)=nz_this_block
3098 GOTO 45
3099 endif
3100 rhs_sparse_copy_allocated=.true.
3101 nb_bytes = nb_bytes + int(nz_this_block,8)*(k34_8+k35_8)
3102 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
3103
3104 ALLOCATE(irhs_ptr_copy(nbcol_inbloc+1),stat=allocok)
3105 if (allocok .GT.0 ) then
3106 info(1)=-13
3107 info(2)=nbcol_inbloc+1
3108 GOTO 45
3109 endif
3110 irhs_ptr_copy_allocated = .true.
3111 nb_bytes = nb_bytes + int(nbcol_inbloc+1,8)*k34_8
3112 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
3113 ENDIF
3114
3115
3116 45 CONTINUE
3119 IF (info(1) .LT.0 ) GOTO 90
3120
3121 IF (nz_this_block > 0) THEN
3123 & nz_this_block,
3124 & mpi_integer,
3125 & master,
id%COMM,ierr)
3127 & nbcol_inbloc+1,
3128 & mpi_integer,
3129 & master,
id%COMM,ierr)
3130 IF (ierr.GT.0) THEN
3131 WRITE (*,*)'NOT OK FOR ALLOC PTR ON SLAVES'
3133 ENDIF
3134 ENDIF
3135 ENDIF
3136
3137
3138
3139
3140
3141 IF ( i_am_slave ) THEN
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171 IF ( keep(221).EQ.2 .AND. keep(252).EQ.0
3172 & .AND. (keep(248).NE.1 .OR. (
id%NRHS.EQ.1))
3173 & ) THEN
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185 build_posinrhscomp = .false.
3186 ENDIF
3187
3188
3189
3190 IF (build_posinrhscomp) THEN
3191
3192
3193
3194
3195 build_posinrhscomp = .false.
3196
3197 mtype_loc = mtype
3198
3199 IF ( (keep(111).NE.0) .OR. (keep(237).NE.0) .OR.
3200 & (keep(252).NE.0) ) THEN
3201
3202 IF (keep(111).NE.0) THEN
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214 mtype_loc = 1
3215 ELSE IF (keep(252).NE.0) THEN
3216
3217 mtype_loc = 1
3218
3219 ELSE
3220
3221 mtype_loc = mtype
3222 build_posinrhscomp = .true.
3223 ENDIF
3224 ENDIF
3225
3226 liw_passed=
max(1,liw)
3227 IF (keep(237).EQ.0) THEN
3230 &
id%MYID_NODES,
id%PTLUST_S(1),
3231 &
id%KEEP(1),
id%KEEP8(1),
3232 &
id%PROCNODE_STEPS(1),
id%IS(1), liw_passed,
3234 &
id%POSINRHSCOMP_ROW(1),
id%POSINRHSCOMP_COL(1),
3235 &
id%POSINRHSCOMP_COL_ALLOC,
3236 & mtype_loc,
3237 & nbent_rhscomp, nb_fs_rhscomp_tot )
3238 nb_fs_rhscomp_f = nb_fs_rhscomp_tot
3239 ELSE
3242 &
id%MYID_NODES,
id%PTLUST_S(1),
id%DAD_STEPS(1),
3243 &
id%KEEP(1),
id%KEEP8(1),
3244 &
id%PROCNODE_STEPS(1),
id%IS(1), liw,
3246 &
id%POSINRHSCOMP_ROW(1),
id%POSINRHSCOMP_COL(1),
3247 &
id%POSINRHSCOMP_COL_ALLOC,
3248 & mtype_loc,
3249 & irhs_ptr_copy(1), nbcol_inbloc, irhs_sparse_copy(1),
3250 & nz_this_block,perm_rhs, size(perm_rhs) , jbeg_rhs,
3251 & nbent_rhscomp,
3252 & nb_fs_rhscomp_f, nb_fs_rhscomp_tot,
3253 & uns_perm_inv, size(uns_perm_inv)
3254 & )
3255 ENDIF
3256 ENDIF
3257 IF (build_rhsmapinfo .AND. keep(248).EQ.-1) THEN
3258
3259
3260
3261
3263 & irhs_loc_ptr(1), map_rhs_loc,
id%POSINRHSCOMP_ROW(1),
3264 &
id%NSLAVES,
id%MYID_NODES,
3265 &
id%COMM_NODES,
id%ICNTL(1),
id%INFO(1) )
3266 build_rhsmapinfo = .false.
3267
3268 ENDIF
3269 ENDIF
3272 IF (info(1) .LT.0 ) GOTO 90
3273 IF (i_am_slave) THEN
3274 IF (keep(221).EQ.1) THEN
3275
3276
3277
3278
3279
3280 IF (.not.
associated(
id%RHSCOMP))
THEN
3281
3282
3283
3284
3285
3286
3287
3288 ld_rhscomp =
max(nbent_rhscomp,1)
3289 id%KEEP8(25) = int(ld_rhscomp,8)*int(
id%NRHS,8)
3290 ALLOCATE (
id%RHSCOMP(
id%KEEP8(25)), stat = allocok)
3291 IF ( allocok .GT. 0 ) THEN
3292 info(1)=-13
3295 GOTO 41
3296 END IF
3297 nb_bytes = nb_bytes +
id%KEEP8(25)*k35_8
3298 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
3299 ENDIF
3300 ENDIF
3301 IF ((keep(221).NE.1).AND.
3302 & ((keep(221).NE.2).OR.(keep(252).NE.0))
3303 & ) THEN
3304
3305
3306
3307
3308 ld_rhscomp =
max(nbent_rhscomp, ld_rhscomp)
3309
3310 IF (
associated(
id%RHSCOMP))
THEN
3311 IF ( (
id%KEEP8(25).LT.int(ld_rhscomp,8)*int(nbrhs,8))
3312 & .OR. (keep(235).NE.0).OR.(keep(237).NE.0) ) THEN
3313
3314
3315
3316
3317
3318
3319 nb_bytes = nb_bytes -
id%KEEP8(25)*k35_8
3320 DEALLOCATE(
id%RHSCOMP)
3323 ENDIF
3324 ENDIF
3325 IF (.not.
associated(
id%RHSCOMP))
THEN
3326 ld_rhscomp =
max(nbent_rhscomp, 1)
3327 id%KEEP8(25) = int(ld_rhscomp,8)*int(nbrhs,8)
3328 ALLOCATE (
id%RHSCOMP(
id%KEEP8(25)), stat = allocok )
3329 IF ( allocok .GT. 0 ) THEN
3330 info(1)=-13
3332 GOTO 41
3333 END IF
3334 nb_bytes = nb_bytes +
id%KEEP8(25)*k35_8
3335 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
3336 ENDIF
3337 ENDIF
3338 IF (keep(221).EQ.2) THEN
3339
3340
3341
3342 ld_rhscomp = int(
id%KEEP8(25)/int(
id%NRHS,8))
3343 ENDIF
3344
3345
3346
3347 IF ( keep(221).EQ.0 ) THEN
3348
3349 ibeg_rhscomp= 1_8
3350 ELSE
3351
3352
3353 ibeg_rhscomp= int(jbeg_rhs-1,8)*int(ld_rhscomp,8) + 1_8
3354 ENDIF
3355 ENDIF
3356
3357 41 CONTINUE
3360 IF (info(1) .LT.0 ) GOTO 90
3361
3362
3363
3364
3365
3366
3367 IF (
id%MYID .eq. master)
THEN
3368
3369 IF (keep(23) .NE. 0) THEN
3370
3371
3372 IF (mtype .NE. 1) THEN
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382 IF (keep(248)==0) THEN
3383
3384
3385
3386 ALLOCATE( c_rw2(
id%N ),stat =allocok )
3387 IF ( allocok .GT. 0 ) THEN
3388 info(1)=-13
3390 IF (lpok) THEN
3391 WRITE(lp,*)
id%MYID,
3392 & ':Error allocating C_RW2 in CMUMPS_SOLVE_DRIVE'
3393 END IF
3394 GOTO 30
3395 END IF
3396
3397 DO k = 1, nbrhs_eff
3398 kdec = ibeg+int(k-1,8)*int(ld_rhs,8)
3400 c_rw2(i)=
id%RHS(i-1+kdec)
3401 END DO
3403 jperm =
id%UNS_PERM(i)
3404 id%RHS(i-1+kdec) = c_rw2(jperm)
3405 END DO
3406 END DO
3407 DEALLOCATE(c_rw2)
3408 ENDIF
3409 ENDIF
3410 ENDIF
3411
3412 IF (postpros) THEN
3413 IF ( keep(248) == 0 ) THEN
3414 DO k = 1, nbrhs_eff
3415 kdec = ibeg+int(k-1,8)*int(ld_rhs,8)
3417 saverhs(i+(k-1)*
id%N) =
id%RHS(kdec+i-1)
3418 END DO
3419 ENDDO
3420 ELSE IF (keep(248)==1) THEN
3421 saverhs(:) = zero
3422 DO k = 1, nbrhs
3423 DO j =
id%IRHS_PTR(k),
id%IRHS_PTR(k+1)-1
3424 i =
id%IRHS_SPARSE(j)
3425 saverhs(i+(k-1)*
id%N) =
id%RHS_SPARSE(j)
3426 ENDDO
3427 ENDDO
3428 ENDIF
3429 ENDIF
3430
3431
3432
3433 IF (lscal) THEN
3434
3435 IF (keep(248)==0) THEN
3436
3437 IF (mtype .EQ. 1) THEN
3438
3439 DO k =1, nbrhs_eff
3440 kdec = int(k-1,8) * int(ld_rhs,8) + int(ibeg-1,8)
3442 id%RHS(kdec+i) =
id%RHS(kdec+i) *
3444 ENDDO
3445 ENDDO
3446 ELSE
3447
3448 DO k =1, nbrhs_eff
3449 kdec = int(k-1,8) * int(ld_rhs,8) + int(ibeg-1,8)
3451 id%RHS(kdec+i) =
id%RHS(kdec+i) *
3453 ENDDO
3454 ENDDO
3455 ENDIF
3456 ELSE IF (keep(248)==1) THEN
3457
3458
3459
3460 kdec=int(
id%IRHS_PTR(jbeg_rhs),8)
3461
3462 IF ((keep(248)==1) .AND.
3463 & (do_permute_rhs.OR.interleave_par.OR.
3464 & (
id%KEEP(237).NE.0))
3465 & ) THEN
3466
3467
3468
3469 ipos = 1
3470 j = 0
3471 DO i=jbeg_rhs, jbeg_rhs + nbcol_inbloc -1
3472 IF (do_permute_rhs.OR.interleave_par) THEN
3473 iperm = perm_rhs(i)
3474 ENDIF
3475 j = j+1
3476
3477 colsize = irhs_ptr_copy(j+1) - irhs_ptr_copy(j)
3478
3479 IF (colsize .EQ. 0) cycle
3480 IF (
id%KEEP(237).NE.0)
THEN
3481 IF (do_permute_rhs.OR.interleave_par) THEN
3482
3483
3484
3485
3486 rhs_sparse_copy(ipos) =
id%ROWSCA(iperm) *
3487 & one
3488 ELSE
3489 rhs_sparse_copy(ipos) =
id%ROWSCA(i) * one
3490 ENDIF
3491 ELSE
3492
3493 DO k = 1, colsize
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505 ii = irhs_sparse_copy(
3506 & irhs_ptr_copy(i-jbeg_rhs+1)
3507 & +k-1)
3508
3509
3510 IF (mtype.EQ.1) THEN
3511 rhs_sparse_copy(ipos+k-1) =
3512 &
id%RHS_SPARSE(
id%IRHS_PTR(iperm)+k-1)*
3514 ELSE
3515 rhs_sparse_copy(ipos+k-1) =
3516 &
id%RHS_SPARSE(
id%IRHS_PTR(iperm)+k-1)*
3518 ENDIF
3519 ENDDO
3520 ENDIF
3521 ipos = ipos + colsize
3522 ENDDO
3523 ELSE
3524
3525
3526 IF (mtype .eq. 1) THEN
3527 DO iz=1,nz_this_block
3528 i=irhs_sparse_copy(iz)
3529 rhs_sparse_copy(iz)=
id%RHS_SPARSE(kdec+iz-1)*
3531 ENDDO
3532 ELSE
3533 DO iz=1,nz_this_block
3534 i=irhs_sparse_copy(iz)
3535 rhs_sparse_copy(iz)=
id%RHS_SPARSE(kdec+iz-1)*
3537 ENDDO
3538 ENDIF
3539 ENDIF
3540 ENDIF
3541 ENDIF
3542 ENDIF
3543#if defined(V_T)
3544 CALL vtend(perm_scal_ini,ierr)
3545#endif
3546
3547
3548
3549
3550 IF ((keep(248).EQ.1).AND.(keep(237).EQ.0)) THEN
3551
3552
3553
3554
3555 CALL mpi_bcast( nbrhs_eff,1, mpi_integer,
3556 & master,
id%COMM,ierr)
3557 CALL mpi_bcast(nb_rhsskipped,1,mpi_integer,master,
3559 ENDIF
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570#if defined(V_T)
3571 CALL vtbegin(soln_dist,ierr)
3572#endif
3574 IF ((keep(111).eq.0).AND.(keep(252).EQ.0)
3575 & .AND.(keep(221).NE.2 )) THEN
3576
3577
3578
3579
3580 IF (keep(248) == 0) THEN
3581
3582
3583
3584 IF ( .NOT.i_am_slave ) THEN
3585
3588 & mtype,
id%RHS(ibeg), ld_rhs, nbrhs_eff,
3589 & nbrhs_eff,
3590 & c_dummy, 1, 1,
3591 & idummy, 0,
3592 & jdummy,
id%KEEP(1),
id%KEEP8(1),
id%PROCNODE_STEPS(1),
3593 & idummy, 1,
3595 &
id%ICNTL(1),
id%INFO(1))
3596 ELSE
3597 IF (
id%MYID .eq. master)
THEN
3599 ld_rhs_loc = ld_rhs
3600 ncol_rhs_loc = nbrhs_eff
3601 ibeg_loc = ibeg
3602 ELSE
3603 ptr_rhs => cdummy_target
3604 ld_rhs_loc = 1
3605 ncol_rhs_loc = 1
3606 ibeg_loc = 1_8
3607 ENDIF
3608 liw_passed =
max( liw, 1 )
3611 & mtype, ptr_rhs(ibeg_loc),ld_rhs_loc,ncol_rhs_loc,
3612 & nbrhs_eff,
3613 &
id%RHSCOMP(ibeg_rhscomp), ld_rhscomp, nbrhs_eff,
3614 &
id%POSINRHSCOMP_ROW(1), nb_fs_rhscomp_f,
3615
3616 &
id%PTLUST_S(1),
id%KEEP(1),
id%KEEP8(1),
3617 &
id%PROCNODE_STEPS(1),
3618 & is
3620 &
id%ICNTL(1),
id%INFO(1))
3621 ENDIF
3622 IF (info(1).LT.0) GOTO 90
3623 ELSE IF (keep(248) .EQ. -1) THEN
3624 IF (i_am_slave) THEN
3625 IF (
id%Nloc_RHS .NE. 0)
THEN
3626 rhs_loc_size=int(
id%LRHS_loc,8)*int(nbrhs_eff-1,8)+
3627 & int(
id%Nloc_RHS,8)
3628 rhs_loc_shift=1_8+int(beg_rhs-1,8)*
id%LRHS_loc
3629 ELSE
3630 rhs_loc_size=1_8
3631 rhs_loc_shift=1_8
3632 ENDIF
3634 &
id%MYID_NODES,
id%COMM_NODES,
3635 & nbrhs_eff,
id%Nloc_RHS,
id%LRHS_loc,
3636 & map_rhs_loc,
3637 & irhs_loc_ptr(1),
3638 & idrhs_loc(rhs_loc_shift),
3639 & rhs_loc_size,
3640 &
id%RHSCOMP(ibeg_rhscomp), ld_rhscomp,
3641 &
id%POSINRHSCOMP_ROW(1), nb_fs_rhscomp_f,
3642 & lscal, scaling_data_dr,
3643 & lp, lpok, keep(1), nb_bytes_loc, info(1))
3644
3645 nb_bytes_max =
max(nb_bytes_max,
3646 & nb_bytes_max+nb_bytes_loc)
3647 ENDIF
3650 IF (info(1).LT.0) GOTO 90
3651 ELSE
3652
3653
3654
3655 IF (nz_this_block > 0) THEN
3657 & nz_this_block,
3658 & mpi_complex,
3659 & master,
id%COMM, ierr)
3660 ENDIF
3661
3662
3663
3664 IF (keep(237).NE.0) THEN
3665 IF ( i_am_slave ) THEN
3666
3667
3668
3669
3670
3671 k=1
3672 id%RHSCOMP(1_8:int(nbrhs_eff,8)*int(ld_rhscomp,8))
3673 & = zero
3674 ipos = 1
3675 DO i = 1, nbcol_inbloc
3676 colsize = irhs_ptr_copy(i+1) - irhs_ptr_copy(i)
3677 IF (colsize.GT.0) THEN
3678
3679
3680 j = i - 1 + jbeg_rhs
3681 IF (do_permute_rhs.OR.interleave_par) THEN
3682 j = perm_rhs(j)
3683 ENDIF
3684 iposrhscomp
3685
3686
3687 IF (iposrhscomp.GT.0) THEN
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698 id%RHSCOMP(int(k-1,8)*int(ld_rhscomp,8)+
3699 & int(iposrhscomp,8)) =
3700 & rhs_sparse_copy(ipos)
3701 ENDIF
3702 k = k + 1
3703 ipos = ipos + colsize
3704 ENDIF
3705 ENDDO
3706 IF (k.NE.nbrhs_eff+1) THEN
3707 WRITE(6,*) 'Internal Error 9 in solution driver ',
3708 & k,nbrhs_eff
3710 ENDIF
3711 ENDIF
3712
3713
3714
3715 ELSE
3716
3717
3718
3719
3720 IF ((keep(221).EQ.1).AND.(nb_rhsskipped.GT.0)
3721 & .AND.i_am_slave) THEN
3722 DO k = jbeg_rhs-nb_rhsskipped, jbeg_rhs-1
3723 DO i = 1, ld_rhscomp
3724 id%RHSCOMP(int(k-1,8)*int(ld_rhscomp,8)
3725 & + int(i,8)) = zero
3726 ENDDO
3727 ENDDO
3728 ENDIF
3729 IF (i_am_slave) THEN
3730 DO k = 1, nbcol_inbloc
3731
3732 kdec = int(k-1,8) * int(ld_rhscomp,8) +
3733 & ibeg_rhscomp - 1_8
3734 id%RHSCOMP(kdec+1_8:kdec+nbent_rhscomp) = zero
3735 DO iz=irhs_ptr_copy(k), irhs_ptr_copy(k+1)-1
3736 i=irhs_sparse_copy(iz)
3737 iposrhscomp =
id%POSINRHSCOMP_ROW(i)
3738
3739
3740
3741
3742
3743
3744
3745 IF ( (iposrhscomp.LE.nb_fs_rhscomp_tot)
3746 & .AND.(iposrhscomp.GT.0) ) THEN
3747
3748 id%RHSCOMP(kdec+iposrhscomp)=
3749 &
id%RHSCOMP(kdec+iposrhscomp) +
3750 & rhs_sparse_copy(iz)
3751 ENDIF
3752 ENDDO
3753 ENDDO
3754 END IF
3755 ENDIF
3756 ENDIF
3757
3758 ELSE IF (i_am_slave) THEN
3759
3760 IF (keep(111).NE.0) THEN
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780 IF (keep(111).GT.0) THEN
3781 ibeg_glob_def = keep(111)
3782 iend_glob_def = keep(111)
3783 ELSE
3784 ibeg_glob_def = beg_rhs
3785 iend_glob_def = beg_rhs+nbrhs_eff-1
3786 ENDIF
3787 IF (
id%KEEP(112) .GT. 0 .AND. do_null_piv)
THEN
3788 IF (ibeg_glob_def .GT.
id%KEEP(112))
THEN
3790 do_null_piv = .false.
3791 ENDIF
3792 IF (ibeg_glob_def .LT.
id%KEEP(112)
3793 & .AND. iend_glob_def .GT.
id%KEEP(112)
3794 & .AND. do_null_piv ) THEN
3795
3796
3797
3798
3799
3800
3801 do_null_piv = .false.
3802 ENDIF
3803 ENDIF
3804 IF (
id%KEEP(235).NE.0)
THEN
3805
3806
3807
3808
3809
3810
3811 nz_this_block=iend_glob_def-ibeg_glob_def+1
3812 ALLOCATE(irhs_ptr_copy(nz_this_block+1),stat=allocok)
3813 IF (allocok .GT.0 ) THEN
3814 info(1)=-13
3815 info(2)=nz_this_block
3816 GOTO 50
3817 ENDIF
3818 irhs_ptr_copy_allocated = .true.
3819 ALLOCATE(irhs_sparse_copy(nz_this_block),stat=allocok)
3820 IF (allocok .GT.0 ) THEN
3821 info(1)=-13
3822 info(2)=nz_this_block
3823 GOTO 50
3824 ENDIF
3825 irhs_sparse_copy_allocated=.true.
3826 nb_bytes = nb_bytes +
3827 & int(nz_this_block,8)*(k34_8+k34_8)
3828 & + k34_8
3829 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
3830 IF (
id%MYID.eq.master)
THEN
3831
3832 ii = 1
3833 DO i = ibeg_glob_def, iend_glob_def
3834 irhs_ptr_copy(i-ibeg_glob_def+1) = i
3835 irhs_sparse_copy(ii) =
id%PIVNUL_LIST(i)
3836 ii = ii +1
3837 ENDDO
3838 irhs_ptr_copy(nz_this_block+1) = nz_this_block+1
3839 ENDIF
3840
3841
3842 50 CONTINUE
3845 IF (info(1) .LT.0 ) GOTO 90
3846
3848 & nz_this_block,
3849 & mpi_integer,
3850 & master,
id%COMM,ierr)
3852 & nz_this_block+1,
3853 & mpi_integer,
3854 & master,
id%COMM,ierr)
3855
3856 ENDIF
3857
3858
3859 DO k=1, nbrhs_eff
3860 kdec = int(k-1,8) * int(ld_rhscomp,8)
3861 id%RHSCOMP(kdec+1_8:kdec+int(ld_rhscomp,8))=zero
3862 END DO
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872 DO i=
max(ibeg_glob_def,keep(220)),
3873 &
min(iend_glob_def,keep(220)+keep(109)-1)
3874
3875
3876 jj=
id%POSINRHSCOMP_ROW(
id%PIVNUL_LIST(i-keep(220)+1))
3877 IF (jj.GT.0) THEN
3878 IF (keep(50).EQ.0) THEN
3879
3880 id%RHSCOMP( ibeg_rhscomp+
3881 & int(i-ibeg_glob_def,8)*int(ld_rhscomp,8) +
3882 & int(jj-1,8) ) =
3883 &
cmplx(
id%DKEEP(2),kind=kind(
id%RHSCOMP))
3884 ELSE
3885
3886 id%RHSCOMP( ibeg_rhscomp+
3887 & int(i-ibeg_glob_def,8)*int(ld_rhscomp,8)+
3888 & int(jj-1,8) )=
3889 & one
3890 ENDIF
3891 ENDIF
3892 ENDDO
3893 IF ( keep(17).NE.0 .AND.
3894 &
id%MYID_NODES.EQ.master_root)
THEN
3895
3896
3897
3898
3899
3900
3901 ibeg_root_def =
max(ibeg_glob_def,keep(112)+1)
3902 iend_root_def =
min(iend_glob_def,keep(112)+keep(17))
3903
3904
3905 iroot_def_rhs_col1 = ibeg_root_def-ibeg_glob_def + 1
3906
3907
3908 ibeg_root_def = ibeg_root_def-keep(112)
3909 iend_root_def = iend_root_def-keep(112)
3910
3911
3912
3913 ELSE
3914 ibeg_root_def = -90999
3915 iend_root_def = -95999
3916 iroot_def_rhs_col1= 1
3917 ENDIF
3918 ELSE
3919
3920
3921
3922
3923
3924 ENDIF
3925 ENDIF
3926 timescatter2=
mpi_wtime()-timescatter1+timescatter2
3927
3928
3929
3930
3931
3932 IF ( i_am_slave ) THEN
3933 lwcb8_sol_c = lwcb8
3934 IF (
id%MYID_NODES .EQ. master_root )
THEN
3935
3936 IF (
associated(
id%root%RHS_CNTR_MASTER_ROOT) )
THEN
3937
3938
3939 ptr_rhs_root =>
id%root%RHS_CNTR_MASTER_ROOT
3940# if defined(MUMPS_F2003)
3941 lptr_rhs_root =
size(
id%root%RHS_CNTR_MASTER_ROOT,kind=8)
3942# else
3943 lptr_rhs_root = int(
size(
id%root%RHS_CNTR_MASTER_ROOT),8)
3944# endif
3945 ELSE
3946
3947 lptr_rhs_root = int(nbrhs_eff,8) * int(size_root,8)
3948 ipt_rhs_root = lwcb8 - lptr_rhs_root + 1_8
3949 ptr_rhs_root => work_wcb(ipt_rhs_root:lwcb8)
3950 lwcb8_sol_c = lwcb8_sol_c - lptr_rhs_root
3951 ENDIF
3952 ELSE
3953 lptr_rhs_root = 1_8
3954 ipt_rhs_root = lwcb8
3955 ptr_rhs_root => work_wcb(ipt_rhs_root:lwcb8)
3956 lwcb8_sol_c = lwcb8_sol_c - lptr_rhs_root
3957 ENDIF
3958 ENDIF
3959 IF (keep(221) .EQ. 2 ) THEN
3960
3961
3962
3963
3964 IF ( (
id%MYID .EQ. master_root_in_comm ) .AND.
3965 & (
id%MYID .EQ. master ) )
THEN
3966
3967 ii = 0
3968 DO k=1, nbrhs_eff
3969 kdec = ibeg_redrhs+int(k-1,8)*int(ld_redrhs,8)-1_8
3970 DO i = 1, size_root
3971 ptr_rhs_root(ii+i) =
id%REDRHS(kdec+i)
3972 ENDDO
3973 ii = ii+size_root
3974 ENDDO
3975 ELSE
3976
3977 IF (
id%MYID .EQ. master)
THEN
3978
3979
3980 IF (ld_redrhs.EQ.size_root) THEN
3981
3982 kdec = ibeg_redrhs
3984 & size_root*nbrhs_eff,
3985 & mpi_complex,
3986 & master_root_in_comm, 0,
id%COMM,ierr)
3987 ELSE
3988
3989 DO k=1, nbrhs_eff
3990 kdec = ibeg_redrhs+int(k-1,8)*int(ld_redrhs,8)
3992 & mpi_complex,
3993 & master_root_in_comm, 0,
id%COMM,ierr)
3994 ENDDO
3995 ENDIF
3996 ELSE IF (
id%MYID .EQ. master_root_in_comm )
THEN
3997
3998 ii = 1
3999 IF (ld_redrhs.EQ.size_root) THEN
4000
4002 & size_root*nbrhs_eff,
4003 & mpi_complex,
4004 & master, 0,
id%COMM,status,ierr)
4005 ELSE
4006 DO k=1, nbrhs_eff
4007 CALL mpi_recv(ptr_rhs_root(ii),size_root,
4008 & mpi_complex,
4009 & master, 0,
id%COMM,status,ierr)
4010 ii = ii + size_root
4011 ENDDO
4012 ENDIF
4013 ENDIF
4014
4015 ENDIF
4016 ENDIF
4018 IF ( i_am_slave ) THEN
4019 liw_passed =
max( liw, 1 )
4020 la_passed =
max( la, 1_8 )
4021
4022 IF ((
id%KEEP(235).EQ.0).and.(
id%KEEP(237).EQ.0) )
THEN
4023
4024
4025
4026 from_pp = .false.
4027 nbsparse_loc = (do_nbsparse.AND.nbrhs_eff.GT.1)
4030 & liw_passed, work_wcb(1), lwcb8_sol_c, iwcb, liwcb
4031 &
id%NA(1),
id%LNA,
id%NE_STEPS(1), srw3, mtype, icntl(1), from_pp,
4032 &
id%STEP(1),
id%FRERE_STEPS(1),
id%DAD_STEPS(1),
id%FILS(1),
4033 &
id%PTLUST_S(1),
id%PTRFAC(1), iwk_solve, liwk_solve, ptracb,
4034 & liwk_ptracb,
id%PROCNODE_STEPS(1)
4035 & keep8(1),
id%DKEEP(1),
id%COMM_NODES,
id%MYID,
id%MYID_NODES,
4036 & bufr(1), lbufr, lbufr_bytes,
id%ISTEP_TO_INIV2(1),
4037 &
id%TAB_POS_IN_PERE(1,1), ibeg_root_def, iend_root_def,
4038 & iroot_def_rhs_col1, ptr_rhs_root(1), lptr_rhs_root, size_root,
4039 & master_root,
id%RHSCOMP(ibeg_rhscomp), ld_rhscomp,
4040 &
id%POSINRHSCOMP_ROW(1),
id%POSINRHSCOMP_COL(1)
4041 & , 1, 1, 1, 1, idummy, 1, jdummy, kdummy, 1, ldummy, 1, mdummy
4042 & , 1, 1, nbsparse_loc, ptr_rhs_bounds(1), lptr_rhs_bounds
4043 & ,
id%IPOOL_B_L0_OMP(1),
id%LPOOL_B_L0_OMP,
id%IPOOL_A_L0_OMP(1),
4044 &
id%LPOOL_A_L0_OMP,
id%L_VIRT_L0_OMP,
id%VIRT_L0_OMP(1),
4045 &
id%L_PHYS_L0_OMP,
id%PHYS_L0_OMP(1),
id%PERM_L0_OMP(1),
4046 &
id%PTR_LEAFS_L0_OMP(1),
id%L0_OMP_MAPPING(1),
id%LL0_OMP_MAPPING,
4047 &
id%L0_OMP_FACTORS(1),
id%LL0_OMP_FACTORS
4048 & )
4049 ELSE
4050
4051
4052
4053 from_pp = .false.
4054 nbsparse_loc = (do_nbsparse.AND.nbrhs_eff.GT.1)
4056 & liw_passed,work_wcb(1),lwcb8_sol_c,iwcb,liwcb,nbrhs_eff,
id%NA(1),
4057 &
id%LNA,
id%NE_STEPS(1),srw3,mtype,icntl(1),from_pp,
id%STEP(1),
4058 &
id%FRERE_STEPS(1),
id%DAD_STEPS(1),
id%FILS(1),
id%PTLUST_S(1),
4059 &
id%PTRFAC(1), iwk_solve, liwk_solve, ptracb, liwk_ptracb,
4060 &
id%PROCNODE_STEPS(1),
id%NSLAVES,info(1),keep(1), keep8(1),
4061 &
id%DKEEP(1),
id%COMM_NODES,
id%MYID,
id%MYID_NODES,bufr(1),lbufr,
4062 & lbufr_bytes,
id%ISTEP_TO_INIV2(1),
id%TAB_POS_IN_PERE(1,1),
4063 & ibeg_root_def,iend_root_def,iroot_def_rhs_col1,ptr_rhs_root(1),
4064 & lptr_rhs_root, size_root, master_root,
id%RHSCOMP(ibeg_rhscomp),
4065 & ld_rhscomp,
id%POSINRHSCOMP_ROW(1),
id%POSINRHSCOMP_COL(1),
4066 & nz_this_block, nbcol_inbloc,
id%NRHS, jbeg_rhs,
id%Step2node(1),
4067 &
id%KEEP(28),irhs_sparse_copy(1),irhs_ptr_copy(1),
size(perm_rhs),
4068 & perm_rhs, size(uns_perm_inv), uns_perm_inv, nb_fs_rhscomp_f,
4069 & nb_fs_rhscomp_tot,nbsparse_loc,ptr_rhs_bounds(1),lptr_rhs_bounds
4070 & ,
id%IPOOL_B_L0_OMP(1),
id%LPOOL_B_L0_OMP,
id%IPOOL_A_L0_OMP(1),
4071 &
id%LPOOL_A_L0_OMP,
id%L_VIRT_L0_OMP,
id%VIRT_L0_OMP(1),
4072 &
id%L_PHYS_L0_OMP,
id%PHYS_L0_OMP(1),
id%PERM_L0_OMP(1),
4073 &
id%PTR_LEAFS_L0_OMP(1),
id%L0_OMP_MAPPING(1),
id%LL0_OMP_MAPPING,
4074 &
id%L0_OMP_FACTORS(1),
id%LL0_OMP_FACTORS )
4075 ENDIF
4076 END IF
4077
4078
4079
4080
4081
4082
4086
4087
4088 IF (info(1).eq.-2) then
4089 info(1)=-11
4090 IF (lpok)
4091 & write(lp,*)
4092 & ' WARNING : -11 error code obtained in solve'
4093 END IF
4094 IF (info(1).eq.-3) then
4095 info(1)=-14
4096 IF (lpok)
4097 & write(lp,*)
4098 & ' WARNING : -14 error code obtained in solve'
4099 END IF
4100
4101
4102 IF (info(1).LT.0) GO TO 90
4103
4104
4105
4106
4107
4108 IF ( keep(221) .EQ. 1 ) THEN
4109
4110
4111
4112
4113
4114
4115 IF ( (
id%MYID .EQ. master_root_in_comm ) .AND.
4116 & (
id%MYID .EQ. master ) )
THEN
4117
4118 ii = 0
4119 DO k=1, nbrhs_eff
4120 kdec = ibeg_redrhs+int(k-1,8)*int(ld_redrhs,8) - 1_8
4121 DO i = 1, size_root
4122 id%REDRHS(kdec+i) = ptr_rhs_root(ii+i)
4123 ENDDO
4124 ii = ii+size_root
4125 ENDDO
4126 ELSE
4127
4128 IF (
id%MYID .EQ. master )
THEN
4129
4130 IF (ld_redrhs.EQ.size_root) THEN
4131
4132 kdec = ibeg_redrhs
4134 & size_root*nbrhs_eff,
4135 & mpi_complex,
4136 & master_root_in_comm, 0,
id%COMM,
4137 & status,ierr)
4138 ELSE
4139
4140 DO k=1, nbrhs_eff
4141 kdec = ibeg_redrhs+int(k-1,8)*int(ld_redrhs,8)
4143 & mpi_complex,
4144 & master_root_in_comm, 0,
id%COMM,
4145 & status,ierr)
4146 ENDDO
4147 ENDIF
4148 ELSE IF (
id%MYID .EQ. master_root_in_comm )
THEN
4149
4150 ii = 1
4151 IF (ld_redrhs.EQ.size_root) THEN
4152
4154 & size_root*nbrhs_eff,
4155 & mpi_complex,
4156 & master, 0,
id%COMM,ierr)
4157 ELSE
4158 DO k=1, nbrhs_eff
4159 CALL mpi_send(ptr_rhs_root(ii),size_root,
4160 & mpi_complex,
4161 & master, 0,
id%COMM,ierr)
4162 ii = ii + size_root
4163 ENDDO
4164 ENDIF
4165 ENDIF
4166
4167 ENDIF
4168 ENDIF
4169
4170
4171
4172 IF ( keep(221) .NE. 1 ) THEN
4173
4174 IF (icntl21 == 0) THEN
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189 IF (keep(237).EQ.0) THEN
4190
4191 lcwork =
max(
max(keep(247),keep(246)),1)
4192ALLOCATE
4193 IF (allocok > 0) THEN
4194 info(1)=-13
4195 info(2)=
max(
max(keep(247),keep(246)),1)
4196 ENDIF
4197 ENDIF
4198 IF ( (
id%MYID.EQ.master).AND. (keep(237).NE.0)
4199 & .AND. (
id%NSLAVES.NE.1))
THEN
4200
4201
4202 ALLOCATE (map_rhs(
id%N), stat = allocok)
4203 IF ( allocok .GT. 0 ) THEN
4204 IF (lpok) THEN
4205 WRITE(lp,*) ' Problem allocation of MAP_RHS at solve'
4206 ENDIF
4207 info(1) = -13
4209 ELSE
4210 nb_bytes = nb_bytes + int(
id%N,8) * k34_8
4211 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
4212 ENDIF
4213 ENDIF
4214
4217
4218 IF (info(1).LT.0) GO TO 90
4219 IF ((
id%MYID.NE.master).OR. .NOT.lscal)
THEN
4220 pt_scaling => dummy_scal
4221 ELSE
4222 IF (mtype.EQ.1) THEN
4223 pt_scaling =>
id%COLSCA
4224 ELSE
4225 pt_scaling =>
id%ROWSCA
4226 ENDIF
4227 ENDIF
4228 liw_passed =
max( liw, 1 )
4230 IF ( .NOT.i_am_slave ) THEN
4231
4232
4233
4234 IF (keep(237).EQ.0) THEN
4235
4236
4238 &
id%MYID,
id%COMM, nbrhs_eff,
4239 & mtype,
id%RHS(1), ld_rhs,
id%NRHS, jbeg_rhs,
4240 & jdummy,
id%KEEP(1),
id%KEEP8(1),
4241 &
id%PROCNODE_STEPS(1), idummy, 1,
4242 &
id%STEP(1), bufr(1), lbufr, lbufr_bytes,
4243 & cwork(1), lcwork,
4244 & lscal, pt_scaling(1), size(pt_scaling),
4245 & c_dummy, 1 , 1, idummy, 1,
4246 & perm_rhs, size(perm_rhs)
4247 & )
4248 ELSE
4249
4251 &
id%MYID,
id%COMM, nbrhs_eff,
4252 & c_dummy, 1, 1,
4253 &
id%KEEP(1), bufr(1), lbufr, lbufr_bytes,
4254 & lscal, pt_scaling(1), size(pt_scaling)
4255
4256 & ,irhs_ptr_copy(1), size(irhs_ptr_copy),
4257 & irhs_sparse_copy(1), size(irhs_sparse_copy),
4258 & rhs_sparse_copy(1), size(rhs_sparse_copy),
4259 & uns_perm_inv, size(uns_perm_inv),
4260 & idummy, 1, 0
4261 & )
4262 ENDIF
4263 ELSE
4264
4265
4266 IF (keep(237).EQ.0) THEN
4267 IF (
id%MYID.EQ.master)
THEN
4269 ncol_rhs_loc =
id%NRHS
4270 ld_rhs_loc = ld_rhs
4271 jbeg_rhs_loc = jbeg_rhs
4272 ELSE
4273 ptr_rhs => cdummy_target
4274 ncol_rhs_loc = 1
4275 ld_rhs_loc = 1
4276 jbeg_rhs_loc = 1
4277 ENDIF
4279 &
id%MYID,
id%COMM, nbrhs_eff, mtype,
4280 & ptr_rhs(1), ld_rhs_loc, ncol_rhs_loc, jbeg_rhs_loc,
4281 &
id%PTLUST_S(1),
id%KEEP(1),
id%KEEP8(1),
4282 &
id%PROCNODE_STEPS(1), is(1), liw_passed,
4283 &
id%STEP(1), bufr(1), lbufr, lbufr_bytes,
4284 & cwork(1), lcwork,
4285 & lscal, pt_scaling(1), size(pt_scaling),
4286 &
id%RHSCOMP(ibeg_rhscomp), ld_rhscomp, nbrhs_eff,
4287 &
id%POSINRHSCOMP_COL(1),
id%N,
4288 & perm_rhs, size(perm_rhs)
4289 & )
4290 ELSE
4292 &
id%MYID,
id%COMM, nbrhs_eff,
4293 &
id%RHSCOMP(ibeg_rhscomp), ld_rhscomp, nbrhs_eff,
4294 &
id%KEEP(1), bufr(1), lbufr, lbufr_bytes,
4295 & lscal, pt_scaling(1), size(pt_scaling)
4296
4297 & , irhs_ptr_copy(1), size(irhs_ptr_copy),
4298 & irhs_sparse_copy(1), size(irhs_sparse_copy),
4299 & rhs_sparse_copy(1), size(rhs_sparse_copy),
4300 & uns_perm_inv, size(uns_perm_inv),
4301 &
id%POSINRHSCOMP_COL(1),
id%N, nb_fs_rhscomp_tot
4302 & )
4303 ENDIF
4304 ENDIF
4305 timegather2=
mpi_wtime()-timegather1+timegather2
4306 IF (keep(237).EQ.0) DEALLOCATE( cwork )
4307 IF ( (
id%MYID.EQ.master).AND. (keep(237).NE.0)
4308 & ) THEN
4309
4310 DO j = jbeg_rhs, jbeg_rhs+nbcol_inbloc-1
4311 IF (do_permute_rhs.OR.interleave_par) THEN
4312 pj = perm_rhs(j)
4313 ELSE
4314 pj =j
4315 ENDIF
4316 colsize =
id%IRHS_PTR(pj+1) -
4318 IF (colsize.EQ.0) cycle
4319 jj = j-jbeg_rhs+1
4320
4321
4322 IF (
id%NSLAVES.NE.1)
THEN
4323 DO ii=1, colsize
4324 map_rhs(
id%IRHS_SPARSE(
4325 &
id%IRHS_PTR(pj) + ii - 1)) = ii
4326 ENDDO
4327 DO iz2 = irhs_ptr_copy(jj),irhs_ptr_copy(jj+1)-1
4328 ii = irhs_sparse_copy(iz2)
4329 id%RHS_SPARSE(
id%IRHS_PTR(pj)+map_rhs(ii)-1)=
4330 & rhs_sparse_copy(iz2)
4331 ENDDO
4332 ELSE
4333
4334
4335 DO iz=
id%IRHS_PTR(pj),
id%IRHS_PTR(pj+1)-1
4336 iz2 = irhs_ptr_copy(jj) +
4337 & iz -
id%IRHS_PTR(pj)
4338 id%RHS_SPARSE(iz) = rhs_sparse_copy(iz2)
4339 ENDDO
4340 ENDIF
4341 ENDDO
4342 IF (
id%NSLAVES.NE.1)
THEN
4343 nb_bytes = nb_bytes - int(size(map_rhs),8) * k34_8
4344 DEALLOCATE ( map_rhs )
4345 ENDIF
4346 ENDIF
4347
4348
4349 ELSE
4350
4351
4352
4354
4355 IF ( i_am_slave ) THEN
4356 liw_passed =
max( liw, 1 )
4357
4358
4359
4360 IF ( keep(89) .GT. 0 ) THEN
4362 &
id%N,
id%MYID_NODES,
4363 & mtype,
id%RHSCOMP(ibeg_rhscomp), ld_rhscomp,
4364 & nbrhs_eff,
id%POSINRHSCOMP_COL(1),
4365 &
id%ISOL_loc(1),
id%SOL_loc(1),
id%NRHS,
4366 & jbeg_rhs-nb_rhsskipped,
id%LSOL_loc,
4367 &
id%PTLUST_S(1),
id%PROCNODE_STEPS(1),
4368 &
id%KEEP(1),
id%KEEP8(1),
4369 & is(1), liw_passed,
4370 &
id%STEP(1), scaling_data_sol, lscal, nb_rhsskipped,
4371 & perm_rhs, size(perm_rhs) )
4372 ENDIF
4373 ENDIF
4374 timecopyscale2=
mpi_wtime()-timecopyscale1+timecopyscale2
4375 ENDIF
4376
4377
4378 ENDIF
4379
4380
4381
4382
4383
4384
4385
4386
4387 IF ( icntl10 > 0 .AND. nbrhs_eff > 1 ) THEN
4388
4389
4390
4391
4392
4393
4394 write(6,*) ' Internal ERROR 15 in sol_driver '
4395
4396
4397
4398
4399
4400 END IF
4401 IF (postpros) THEN
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416 IF ( prokg .AND. icntl10 .NE. 0 ) WRITE( mpg, 270 )
4417
4418 nitref = abs(icntl10)
4419 ALLOCATE(r_y(
id%N), stat = allocok)
4420 IF ( allocok .GT. 0 ) THEN
4421 info(1)=-13
4423 GOTO 777
4424 ENDIF
4425 nb_bytes = nb_bytes + int(
id%N,8)*k16_8
4426 ALLOCATE(c_y(
id%N), stat = allocok)
4427 IF ( allocok .GT. 0 ) THEN
4428 info(1)=-13
4430 GOTO 777
4431 ENDIF
4432 nb_bytes = nb_bytes + int(
id%N,8)*k35_8
4433 IF (
id%MYID .EQ. master )
THEN
4434 ALLOCATE( iw1( 2 *
id%N ),stat = allocok )
4435 IF ( allocok .GT. 0 ) THEN
4436 info(1)=-13
4438 GOTO 777
4439 ENDIF
4440 nb_bytes = nb_bytes + int(2*
id%N,8)*k34_8
4441 ALLOCATE( c_w(
id%N), stat = allocok )
4442 IF ( allocok .GT. 0 ) THEN
4443 info(1)=-13
4445 GOTO 777
4446 ENDIF
4447 nb_bytes = nb_bytes + int(
id%N,8)*k35_8
4448 ALLOCATE( r_w(2*
id%N), stat = allocok )
4449 IF ( allocok .GT. 0 ) THEN
4450 info(1)=-13
4452 GOTO 777
4453 ENDIF
4454 nb_bytes = nb_bytes + int(2*
id%N,8)*k16_8
4455 IF ( prokg .AND. icntl10 .GT. 0 )
4456 & WRITE( mpg, 240) 'MAXIMUM NUMBER OF STEPS =', nitref
4457
4458 END IF
4459 ALLOCATE(c_locwk54(
id%N),stat = allocok)
4460 IF ( allocok .GT. 0 ) THEN
4461 info(1)=-13
4463 GOTO 777
4464 ENDIF
4465 nb_bytes = nb_bytes + int(
id%N,8)*k35_8
4466 ALLOCATE(r_locwk54(
id%N),stat = allocok)
4467 IF ( allocok .GT. 0 ) THEN
4468 info(1)=-13
4470 GOTO 777
4471 ENDIF
4472 nb_bytes = nb_bytes + int(
id%N,8)*k16_8
4473 kase = 0
4474
4475 777 CONTINUE
4476 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
4479 IF ( info(1) .LT. 0 ) GOTO 90
4480
4481
4482 timeea = 0.0e0
4483
4484 timeea1 = 0.0e0
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499 IF ((icntl11.GT.0).OR.(icntl10.GT.0)) THEN
4500
4501 IF ( keep(54) .eq. 0 ) THEN
4502
4503
4504
4505 IF (
id%MYID .eq. master )
THEN
4506
4507
4508
4509
4510
4511 IF (keep(55).NE.0) THEN
4512
4514 &
id%NELT,
id%ELTPTR(1),
4515 &
id%LELTVAR,
id%ELTVAR(1),
4516 &
id%KEEP8(30),
id%A_ELT(1),
4517 & r_w(
id%N+1), keep(1),keep8(1) )
4518 ELSE
4519
4520 IF ( mtype .eq. 1 ) THEN
4522 & (
id%A(1),
id%KEEP8(28),
id%N,
id%IRN(1),
id%JCN(1),
4523 & r_w(
id%N+1), keep(1),keep8(1),
4524 & 0,
id%SYM_PERM(1) )
4525 ELSE
4527 & (
id%A(1),
id%KEEP8(28),
id%N,
id%JCN(1),
id%IRN(1),
4528 & r_w(
id%N+1), keep(1),keep8(1),
4529 & 0,
id%SYM_PERM(1) )
4530 END IF
4531 ENDIF
4532 ENDIF
4533 ELSE
4534
4535
4536
4537 IF ( i_am_slave .and.
4538 &
id%KEEP8(29) .NE. 0_8 )
THEN
4539 IF ( mtype .eq. 1 ) THEN
4541 &
id%KEEP8(29),
id%N,
4542 &
id%IRN_loc(1),
id%JCN_loc(1),
4543 & r_locwk54,
id%KEEP(1),
id%KEEP8(1),
4544 & 0,
id%SYM_PERM(1) )
4545 ELSE
4547 &
id%KEEP8(29),
id%N,
4548 &
id%JCN_loc(1),
id%IRN_loc(1),
4549 & r_locwk54,
id%KEEP(1),
id%KEEP8(1),
4550 & 0,
id%SYM_PERM(1) )
4551 END IF
4552 ELSE
4553 r_locwk54 = rzero
4554 END IF
4555
4556
4557
4558 IF (
id%MYID .eq. master )
THEN
4561 & mpi_sum,master,
id%COMM, ierr)
4562 ELSE
4565 & mpi_sum,master,
id%COMM, ierr)
4566 END IF
4567
4568 END IF
4569
4570 IF (
id%MYID .eq. master )
THEN
4571
4572 rinfog(4) = real(zero)
4574 rinfog(4) =
max(r_w(
id%N +i), rinfog(4))
4575 ENDDO
4576 ENDIF
4577
4578 ENDIF
4579
4580
4581
4582
4583 noiter = 0
4584 iflag_ir = 0
4585 testconv = .false.
4586
4587 IF ((
id%MYID .eq. master ).AND.(icntl10.GT.0))
THEN
4588 testconv = .true.
4590 IF (
arret .LT. 0.0e0)
THEN
4591 arret = sqrt(epsilon(0.0e0))
4592 END IF
4593 ENDIF
4594
4595
4596 DO 22 irstep = 1, nitref +1
4597
4598
4599
4600
4601
4602 IF ((
id%MYID .eq. master ).AND.(irstep.GT.1))
THEN
4603 noiter = noiter + 1
4605 id%RHS(ibeg+i-1) =
id%RHS(ibeg+i-1) + c_y(i)
4606 ENDDO
4607 ENDIF
4608
4609
4610
4611 IF ( keep(54) .eq. 0 ) THEN
4612 IF (
id%MYID .eq. master )
THEN
4613 IF (keep(55).NE.0) THEN
4614
4616 &
id%NELT,
id%ELTPTR(1),
id%LELTVAR,
4617 &
id%ELTVAR(1),
id%KEEP8(30),
id%A_ELT(1),
4618 & saverhs,
id%RHS(ibeg),
4619 & c_y, r_w, keep(50))
4620 ELSE
4621 IF ( mtype .eq. 1 ) THEN
4624 &
id%JCN(1), saverhs,
4625 &
id%RHS(ibeg), c_y, r_w, keep(1),keep8(1))
4626 ELSE
4629 &
id%IRN(1), saverhs,
4630 &
id%RHS(ibeg), c_y, r_w, keep(1),keep8(1))
4631 ENDIF
4632 ENDIF
4633 ENDIF
4634 ELSE
4635
4636
4637
4639 & mpi_complex, master,
4641
4642
4643
4644
4645 IF ( i_am_slave .and.
4646 &
id%KEEP8(29) .NE. 0_8 )
THEN
4648 &
id%IRN_loc(1),
id%JCN_loc(1),
id%A_loc(1),
4649 & rhs_ir(ibeg), c_locwk54, keep(50), mtype )
4650 ELSE
4651 c_locwk54 = zero
4652 END IF
4653 IF (
id%MYID .eq. master )
THEN
4655 &
id%N, mpi_complex,
4656 & mpi_sum,master,
id%COMM, ierr)
4657
4658 c_y = saverhs - c_y
4659
4660 ELSE
4662 &
id%N, mpi_complex,
4663 & mpi_sum,master,
id%COMM, ierr)
4664 END IF
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676 IF ( i_am_slave .and.
id%KEEP8(29) .NE. 0_8 )
THEN
4678 &
id%IRN_loc(1),
id%JCN_loc(1),
id%A_loc(1),
4679 & rhs_ir(ibeg), r_locwk54, keep(50), mtype )
4680 ELSE
4681 r_locwk54 = rzero
4682 END IF
4683 IF (
id%MYID .eq. master )
THEN
4686 & mpi_sum,master,
id%COMM, ierr)
4687 ELSE
4690 & mpi_sum, master,
id%COMM, ierr)
4691 ENDIF
4692 ENDIF
4693
4694
4695
4696 IF (
id%MYID .eq. master )
THEN
4697
4698 IF ((icntl11.GT.0).OR.(icntl10.GT.0)) THEN
4699
4700
4701
4702
4703
4704
4705
4706 IF (((icntl11.GT.0).OR.((icntl10.LT.0).AND.
4707 & ((irstep.EQ.1).OR.(irstep.EQ.nitref+1)))
4708 & .OR.((icntl10.EQ.0).AND.(irstep.EQ.1)))
4709 & .OR.(icntl10.GT.0)) THEN
4710
4711
4712
4715 &
id%RHS(ibeg), c_y, r_w, c_w, iw1, iflag_ir,
4716 & rinfog(7), noiter, testconv,
4717 & mp,
arret, keep(361) )
4718 IF (icntl10.LT.0) THEN
4720 id%DKEEP(120)=
id%DKEEP(120)+real(timeea1)
4721 ENDIF
4722 ENDIF
4723 IF ((icntl11.GT.0).AND.(
4724 & (icntl10.LT.0.AND.(irstep.EQ.1.OR.irstep.EQ.nitref+1))
4725 & .OR.((icntl10.GE.0).AND.(irstep.EQ.1))
4726 & )) THEN
4727
4728
4729
4731 IF (icntl10.EQ.0) THEN
4732
4733 IF ( mpg .GT. 0 ) WRITE( mpg, 170 )
4734 ELSEIF (irstep.EQ.1) THEN
4735
4736 IF ( mpg .GT. 0 ) WRITE( mpg, 55 )
4737 ELSEIF ((icntl10.LT.0).AND.(irstep.EQ.nitref+1)) THEN
4738
4739
4740 IF ( mpg .GT. 0 ) THEN
4741 WRITE( mpg, 81 )
4742 WRITE( mpg, * )
4743 WRITE( mpg, 141 )
4744 & 'NUMBER OF STEPS OF ITERATIVE REFINEMENT REQUESTED =',
4745 & noiter
4746 ENDIF
4747 ENDIF
4748 givsol = .true.
4751 & saverhs,r_w(
id%N+1),c_y,givsol,
4752 & rinfog(4),rinfog(5),rinfog(6),mpg,icntl(1),
4753 & keep(1),keep8(1))
4754 IF ( mpg .GT. 0 ) THEN
4755
4756 WRITE( mpg, 115 )
4757 & 'RINFOG(7):COMPONENTWISE SCALED RESIDUAL(W1)=',
4758 & rinfog(7)
4759 WRITE( mpg, 115 )
4760 & '------(8):---------------------------- (W2)=',
4761 & rinfog(8)
4762 END IF
4764 id%DKEEP(120)=
id%DKEEP(120)+real(timeea)
4765
4766 END IF
4767 END IF
4768
4769 IF (irstep.EQ.nitref +1) THEN
4770
4771
4772 kase = 0
4773
4774
4775
4776 IF ((icntl10.GT.0).AND.(iflag_ir.EQ.0))
4777 &
id%INFO(1) =
id%INFO(1) + 8
4778 ELSE
4779 IF (icntl10.GT.0) THEN
4780
4781
4782
4783
4784
4785
4786
4787 IF (iflag_ir.GT.0) THEN
4788
4789
4790
4791 kase = 0
4792
4793
4794
4795 IF (iflag_ir.EQ.2) noiter = noiter - 1
4796 ELSE
4797
4798 kase = 2
4799 ENDIF
4800 ELSEIF (icntl10.LT.0) THEN
4801
4802 kase = 2
4803 ELSE
4804
4805
4806 kase = 0
4807 END IF
4808 ENDIF
4809
4810 ENDIF
4811
4812
4813
4814 CALL mpi_bcast( kase, 1, mpi_integer, master,
4816
4817 IF (kase.LE.0) GOTO 666
4818 IF (kase.LT.0) THEN
4819 WRITE(*,*) "Internal error 17 in CMUMPS_SOL_DRIVER"
4820 ENDIF
4821
4822
4823
4824
4826 IF (info(1) .LT. 0) GOTO 90
4827
4828
4829
4830
4831
4832 22 CONTINUE
4833 666 CONTINUE
4834
4835
4836
4837
4838
4840 IF (
id%MYID .EQ. master )
THEN
4841 IF ( nitref .GT. 0 ) THEN
4842 id%INFOG(15) = noiter
4843 END IF
4844
4845
4846
4847
4848 IF (icntl10.EQ.0) THEN
4849
4850
4851 id%DKEEP(120)=real(timeit)
4852 ELSE
4853
4854 id%DKEEP(114)=real(timeit)-
id%DKEEP(120)
4855 ENDIF
4856 END IF
4857 IF ( prokg ) THEN
4858 IF (icntl10.GT.0) THEN
4859 WRITE( mpg, 81 )
4860 WRITE( mpg, * )
4861 WRITE( mpg, 141 )
4862 & 'NUMBER OF STEPS OF ITERATIVE REFINEMENTS PERFORMED =',
4863 & noiter
4864 ENDIF
4865 ENDIF
4866
4867
4868
4869
4870
4871 IF ((icntl11 .GT. 0).AND.(icntl10.GT.0)) THEN
4872
4873
4874
4875
4877 kase = 0
4878 IF (
id%MYID .eq. master )
THEN
4879
4880
4881
4882 IF (iflag_ir.EQ.2) kase = 2
4883 ENDIF
4884
4885
4886
4887 CALL mpi_bcast( kase, 1, mpi_integer, master,
4889 IF (kase.EQ.2) THEN
4890
4891
4892
4893
4894
4895 IF ( keep(54) .eq. 0 ) THEN
4896
4897
4898
4899 IF (
id%MYID .EQ. master)
THEN
4900 IF (keep(55).EQ.0) THEN
4902 &
id%IRN(1),
id%JCN(1),
4903 &
id%RHS(ibeg), saverhs, r_y, c_y, keep(1),keep8(1))
4904 ELSE
4906 &
id%NELT,
id%ELTPTR(1),
4907 &
id%LELTVAR,
id%ELTVAR(1),
4908 &
id%KEEP8(30),
id%A_ELT(1),
4909 &
id%RHS(ibeg), saverhs, r_y, c_y, keep(1),keep8(1))
4910 ENDIF
4911 ENDIF
4912 ELSE
4913
4914
4915
4917 & mpi_complex, master,
4919
4920
4921
4922 IF ( i_am_slave .and.
4923 &
id%KEEP8(29) .NE. 0_8 )
THEN
4925 &
id%IRN_loc(1),
id%JCN_loc(1),
id%A_loc(1),
4926 & rhs_ir(ibeg), c_locwk54, keep(50), mtype )
4927 ELSE
4928 c_locwk54 = zero
4929 END IF
4930 IF (
id%MYID .eq. master )
THEN
4932 &
id%N, mpi_complex,
4933 & mpi_sum,master,
id%COMM, ierr)
4934 c_y = saverhs - c_y
4935 ELSE
4937 &
id%N, mpi_complex,
4938 & mpi_sum,master,
id%COMM, ierr)
4939 END IF
4940 ENDIF
4941 ENDIF
4942 IF (
id%MYID .EQ. master)
THEN
4943
4944
4945
4946 IF (iflag_ir.EQ.2) THEN
4947 testconv = .false.
4949 &
id%RHS(ibeg), c_y, r_w, c_w, iw1, iflag_ir,
4950 & rinfog(7), 0, testconv,
4951 & mp,
arret, keep(361) )
4952 ENDIF
4953
4954 givsol = .true.
4957 & saverhs,r_w(
id%N+1),c_y,givsol,
4958 & rinfog(4),rinfog(5),rinfog(6),mpg,icntl(1),
4959 & keep(1),keep8(1))
4960 ENDIF
4962 id%DKEEP(120)=
id%DKEEP(120)+real(timeea)
4963 ENDIF
4964
4965
4966
4968 IF (icntl11 .EQ. 1) THEN
4969 IF (
id%MYID .eq. master )
THEN
4970
4971 ALLOCATE( d(
id%N),stat =allocok )
4972 IF ( allocok .GT. 0 ) THEN
4973 info(1)=-13
4975 GOTO 777
4976 ENDIF
4977 nb_bytes = nb_bytes + int(
id%N,8)*k16_8
4979 d( i ) = rone
4980 END DO
4981 ENDIF
4982 kase = 0
4983 222 CONTINUE
4984 IF (
id%MYID .EQ. master )
THEN
4986 &
id%RHS(ibeg), c_y, d, r_w, c_w, iw1, kase,
4987 & rinfog(7), rinfog(9), rinfog(10),
4988 & mp, keep(1),keep8(1))
4989 ENDIF
4990
4991
4992
4993 CALL mpi_bcast( kase, 1, mpi_integer, master,
4995
4996
4997
4998 IF (kase.LE.0) GOTO 224
5000 IF (info(1) .LT. 0) GOTO 90
5001
5002
5003
5004
5005
5006 GO TO 222
5007
5008 ENDIF
5009 224 CONTINUE
5011 id%DKEEP(121)=
id%DKEEP(121)+real(timelcond)
5012 IF ((
id%MYID .EQ. master).AND.(icntl11.GT.0))
THEN
5013 IF (icntl10.GT.0) THEN
5014
5015 IF ( mpg .GT. 0 ) THEN
5016 WRITE( mpg, 115 )
5017 & 'RINFOG(7):COMPONENTWISE SCALED RESIDUAL(W1)=',
5018 & rinfog(7)
5019 WRITE( mpg, 115 )
5020 & '------(8):---------------------------- (W2)=',
5021 & rinfog(8)
5022 ENDIF
5023 END IF
5024 IF (icntl11.EQ.1) THEN
5025
5026 IF (mpg.GT.0) THEN
5027 WRITE( mpg, 115 )
5028 & '------(9):Upper bound ERROR ...............=',
5029 & rinfog(9)
5030 WRITE( mpg, 115 )
5031 & '-----(10):CONDITION NUMBER (1) ............=',
5032 & rinfog(10)
5033 WRITE( mpg, 115 )
5034 & '-----(11):CONDITION NUMBER (2) ............=',
5035 & rinfog(11)
5036 END IF
5037 END IF
5038 END IF
5039 IF ( prokg .AND. abs(icntl10) .GT.0 ) WRITE( mpg, 131 )
5040
5041
5042
5043
5044
5045 IF (
id%MYID == master)
THEN
5046 nb_bytes = nb_bytes - int(size(c_w),8)*k35_8
5047 DEALLOCATE(c_w)
5048 nb_bytes = nb_bytes - int(size(r_w),8)*k16_8
5049 & - int(size(iw1),8)*k34_8
5050 DEALLOCATE(r_w)
5051 DEALLOCATE(iw1)
5052 IF (icntl11 .EQ. 1) THEN
5053
5054 nb_bytes = nb_bytes - int(size(d ),8)*k16_8
5055 DEALLOCATE(d)
5056 ENDIF
5057 ENDIF
5058 nb_bytes = nb_bytes -
5059 & (int(size(r_y),8)+int(size(r_locwk54),8))*k16_8
5060 nb_bytes = nb_bytes -
5061 & (int(size(c_y),8)+int(size(c_locwk54),8))*k35_8
5062 DEALLOCATE(r_y)
5063 DEALLOCATE(c_y)
5064 DEALLOCATE(r_locwk54)
5065 DEALLOCATE(c_locwk54)
5066
5067 END IF
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081 IF (
id%MYID .EQ. master .AND. icntl21==0
5082 & .AND. keep(23) .NE. 0.AND.keep(237).EQ.0) THEN
5083
5084
5085
5086 IF ((keep(221).NE.1 .AND. mtype .EQ. 1)
5087 & .OR. keep(111) .NE.0 .OR. keep(252).NE.0 ) THEN
5088
5089
5090
5091
5092
5093
5094
5095 ALLOCATE( c_rw1(
id%N ),stat =allocok )
5096
5097 IF ( allocok .GT. 0 ) THEN
5098 info(1)=-13
5100 WRITE(*,*)
'could not allocate ',
id%N,
'integers.'
5102 END IF
5103 DO k = 1, nbrhs_eff
5104 IF (keep(242).EQ.0) THEN
5105 kdec = (k-1)*ld_rhs+ibeg-1
5106 ELSE
5107
5108
5109
5110
5111 kdec = int(perm_rhs(k-1+jbeg_rhs)-1,8)*int(ld_rhs,8)
5112 ENDIF
5114 c_rw1(i) =
id%RHS(kdec+i)
5115 ENDDO
5117 jperm =
id%UNS_PERM(i)
5118 id%RHS( kdec+jperm ) = c_rw1( i )
5119 ENDDO
5120 ENDDO
5121 DEALLOCATE( c_rw1 )
5122 END IF
5123 END IF
5124
5125
5126
5127 IF (
id%MYID.EQ.master .and.icntl21==0.and.keep(221).NE.1.AND.
5128 & (keep(237).EQ.0) ) THEN
5129
5130 IF ( info(1) .GE. 0 .AND. icntl(4).GE.3 .AND. icntl(3).GT.0)
5131 & THEN
5133 IF (icntl(4) .eq. 4 ) k =
id%N
5134 j = min0(10,nbrhs_eff)
5135 IF (icntl(4) .eq. 4 ) j = nbrhs_eff
5136 DO ii=1, j
5137 WRITE(icntl(3),110) beg_rhs+ii-1
5138 WRITE(icntl(3),160)
5139 & (
id%RHS(ibeg+(ii-1)*ld_rhs+i-1),i=1,k)
5140 ENDDO
5141 END IF
5142 END IF
5143
5144
5145 IF ((keep(248).EQ.1).AND.(keep(237).EQ.0)) THEN
5146
5147
5148
5149
5150 beg_rhs = beg_rhs + nbrhs_eff
5151 ELSE
5152 beg_rhs = beg_rhs + nbrhs
5153 ENDIF
5154
5155 ENDDO
5156
5157
5158 IF (keep(400) .GT. 0) THEN
5160 ENDIF
5161
5162
5163
5164
5165
5166 IF ( (
id%MYID.EQ.master)
5167 & .AND. ( keep(248).NE.0 )
5168 & .AND. ( keep(237).EQ.0 )
5169 & .AND. ( icntl21.EQ.0 )
5170 & .AND. ( keep(221) .NE.1 )
5171 & .AND. ( jend_rhs .LT.
id%NRHS )
5172 & )
5173 & THEN
5174 jbeg_new = jend_rhs + 1
5175 IF (do_permute_rhs.OR.interleave_par) THEN
5176 DO WHILE ( jbeg_new.LE.
id%NRHS)
5178 id%RHS(int(perm_rhs(jbeg_new) -1,8)*int(ld_rhs,8)+i)
5179 & = zero
5180 ENDDO
5181 jbeg_new = jbeg_new +1
5182 ENDDO
5183 ELSE
5184 DO WHILE ( jbeg_new.LE.
id%NRHS)
5186 id%RHS(int(jbeg_new -1,8)*int(ld_rhs,8) + i) = zero
5187 ENDDO
5188 jbeg_new = jbeg_new +1
5189 ENDDO
5190 ENDIF
5191 ENDIF
5192
5193
5194
5195
5196 IF ( i_am_slave .AND. (icntl21.NE.0) .AND.
5197 & ( jend_rhs .LT.
id%NRHS ) .AND. keep(221).NE.1 )
THEN
5198 jbeg_new = jend_rhs + 1
5199 IF (do_permute_rhs.OR.interleave_par) THEN
5200 DO WHILE ( jbeg_new.LE.
id%NRHS)
5201 DO i=1, keep(89)
5202 id%SOL_loc(int(perm_rhs(jbeg_new) -1,8)*
5203 & int(
id%LSOL_loc,8)+int(i,8)) = zero
5204 ENDDO
5205 jbeg_new = jbeg_new +1
5206 ENDDO
5207 ELSE
5208
5209 DO WHILE ( jbeg_new.LE.
id%NRHS)
5210 DO i=1, keep(89)
5211 id%SOL_loc((jbeg_new -1)*
id%LSOL_loc + i) = zero
5212 ENDDO
5213 jbeg_new = jbeg_new +1
5214 ENDDO
5215 ENDIF
5216 ENDIF
5217
5218
5219
5220
5221
5222 IF ((keep(221).EQ.1) .AND.
5223 & ( jend_rhs .LT.
id%NRHS ) )
THEN
5224 IF (
id%MYID .EQ. master)
THEN
5225 jbeg_new = jend_rhs + 1
5226 DO WHILE ( jbeg_new.LE.
id%NRHS)
5227 DO i=1,
id%SIZE_SCHUR
5228 id%REDRHS(int(jbeg_new -1,8)*int(ld_redrhs,8) +
5229 & int(i,8)) = zero
5230 ENDDO
5231 jbeg_new = jbeg_new +1
5232 ENDDO
5233 ENDIF
5234 IF (i_am_slave) THEN
5235 jbeg_new = jend_rhs + 1
5236 DO WHILE ( jbeg_new.LE.
id%NRHS)
5237 DO i=1,nbent_rhscomp
5238 id%RHSCOMP(int(jbeg_new -1,8)*int(ld_rhscomp,8) +
5239 & int(i,8)) = zero
5240 ENDDO
5241 jbeg_new = jbeg_new +1
5242 ENDDO
5243 ENDIF
5244 ENDIF
5245
5246
5247
5248 id%INFO(26) = int(nb_bytes_max / 1000000_8)
5249
5250
5251
5252
5253
5254
5255
5257 &
id%INFO(26),
id%INFOG(30), irank )
5258 IF ( prokg ) THEN
5259 IF (print_maxavg) THEN
5260 WRITE( mpg,'(A,I10) ')
5261 & ' ** Rank of processor needing largest memory in solve :',
5262 & irank
5263 WRITE( mpg,'(A,I10) ')
5264 & ' ** Space in MBYTES used by this processor for solve :',
5266 IF ( keep(46) .eq. 0 ) THEN
5267 WRITE( mpg,'(A,I10) ')
5268 & ' ** Avg. Space in MBYTES per working proc during solve :',
5269 & (
id%INFOG(31)-
id%INFO(26) ) /
id%NSLAVES
5270 ELSE
5271 WRITE( mpg,'(A,I10) ')
5272 & ' ** Avg. Space in MBYTES per working proc during solve :',
5273 &
id%INFOG(31) /
id%NSLAVES
5274 END IF
5275 ELSE
5276 WRITE( mpg,'(A,I10) ')
5277 & ' ** Space in MBYTES used for solve :',
5279 ENDIF
5280 END IF
5281
5282
5283
5284
5286 id%DKEEP(112)=real(time3)
5287 id%DKEEP(113)=real(timec2)
5288 id%DKEEP(115)=real(timescatter2)
5289 id%DKEEP(116)=real(timegather2)
5290 id%DKEEP(122)=real(timecopyscale2)
5291
5293 &mpi_real, mpi_max, master,
id%COMM, ierr )
5295 &mpi_real, mpi_max, master,
id%COMM, ierr )
5297 &mpi_real, mpi_max, master,
id%COMM, ierr )
5299 &mpi_real, mpi_max, master,
id%COMM, ierr )
5301 &mpi_real, mpi_max, master,
id%COMM, ierr )
5303 &mpi_real, mpi_max, master,
id%COMM, ierr )
5304
5305 IF (prokg) THEN
5306 WRITE ( mpg, *)
5307 WRITE ( mpg, *) "Leaving solve with ..."
5308 WRITE( mpg, 434 )
id%DKEEP(160)
5309 WRITE( mpg, 432 )
id%DKEEP(113)
5310 WRITE( mpg, 435 )
id%DKEEP(162)
5311 IF ((keep(38).NE.0).OR.(keep(20).NE.0))
5312 &
WRITE( mpg, 437 )
id%DKEEP(164)
5313 WRITE( mpg, 436 )
id%DKEEP(163)
5314 WRITE( mpg, 433 )
id%DKEEP(161)
5315 WRITE( mpg, 431 )
id%DKEEP(165)
5316 ENDIF
5317 IF ( prok ) THEN
5318 WRITE ( mp, *)
5319 WRITE ( mp, *) "Local statistics"
5320 WRITE( mp, 434 )
id%DKEEP(115)
5321 WRITE( mp, 432 )
id%DKEEP(113)
5322 WRITE( mp, 435 )
id%DKEEP(117)
5323 IF ((keep(38).NE.0).OR.(keep(20).NE.0))
5324 &
WRITE( mp, 437 )
id%DKEEP(119)
5325 WRITE( mp, 436 )
id%DKEEP(118)
5326 WRITE( mp, 433 )
id%DKEEP(116)
5327 WRITE( mp, 431 )
id%DKEEP(122)
5328 END IF
5329 90 CONTINUE
5330 IF (info(1) .LT.0 ) THEN
5331 ENDIF
5332 IF (keep(485) .EQ. 1) THEN
5333 keep(350) = keep350_save
5334 IF (is_lr_mod_to_struc_done) THEN
5338 ENDIF
5339 ENDIF
5340 IF (keep(201).GT.0)THEN
5341 IF (is_init_ooc_done) THEN
5343 IF (ierr.LT.0 .AND. info(1) .GE. 0) info(1) = ierr
5344 ENDIF
5347 ENDIF
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357 IF (irhs_sparse_copy_allocated) THEN
5358 nb_bytes = nb_bytes -
5359 & int(size(irhs_sparse_copy),8)*k34_8
5360 DEALLOCATE(irhs_sparse_copy)
5361 irhs_sparse_copy_allocated=.false.
5362 NULLIFY(irhs_sparse_copy)
5363 ENDIF
5364 IF (irhs_ptr_copy_allocated) THEN
5365 nb_bytes = nb_bytes -
5366 & int(size(irhs_ptr_copy),8)*k34_8
5367 DEALLOCATE(irhs_ptr_copy)
5368 irhs_ptr_copy_allocated=.false.
5369 NULLIFY(irhs_ptr_copy)
5370 ENDIF
5371 IF (rhs_sparse_copy_allocated) THEN
5372 nb_bytes = nb_bytes -
5373 & int(size(rhs_sparse_copy),8)*k35_8
5374 DEALLOCATE(rhs_sparse_copy)
5375 rhs_sparse_copy_allocated=.false.
5376 NULLIFY(rhs_sparse_copy)
5377 ENDIF
5378 IF (allocated(map_rhs_loc)) THEN
5379 nb_bytes = nb_bytes - int(size(map_rhs_loc),8)*k34_8
5380 DEALLOCATE(map_rhs_loc)
5381 ENDIF
5382 IF (irhs_loc_ptr_allocated ) THEN
5383 nb_bytes = nb_bytes - int(size(irhs_loc_ptr),8)*k34_8
5384 DEALLOCATE(irhs_loc_ptr)
5385 NULLIFY(irhs_loc_ptr)
5386 irhs_loc_ptr_allocated = .false.
5387 ENDIF
5388 IF (i_am_slave.AND.lscal.AND.keep(248).EQ.-1) THEN
5389 nb_bytes = nb_bytes -
5390 & int(size(scaling_data_dr%SCALING_LOC),8)*k16_8
5391 DEALLOCATE(scaling_data_dr%SCALING_LOC)
5392 NULLIFY (scaling_data_dr%SCALING_LOC)
5393 ENDIF
5394 IF (allocated(perm_rhs)) THEN
5395 nb_bytes = nb_bytes - int(size(perm_rhs),8)*k34_8
5396 DEALLOCATE(perm_rhs)
5397 ENDIF
5398
5399 IF (allocated(uns_perm_inv)) THEN
5400 nb_bytes = nb_bytes - int(size(uns_perm_inv),8)*k34_8
5401 DEALLOCATE(uns_perm_inv)
5402 ENDIF
5403 IF (allocated(bufr)) THEN
5404 nb_bytes = nb_bytes - int(size(bufr),8)*k34_8
5405 DEALLOCATE(bufr)
5406 ENDIF
5407 IF ( i_am_slave ) THEN
5408 IF (allocated(rhs_bounds)) THEN
5409 nb_bytes = nb_bytes -
5410 & int(size(rhs_bounds),8)*k34_8
5411 DEALLOCATE(rhs_bounds)
5412 ENDIF
5413 IF (allocated(iwk_solve)) THEN
5414 nb_bytes = nb_bytes - int(size(iwk_solve),8)*k34_8
5415 DEALLOCATE( iwk_solve )
5416 ENDIF
5417 IF (allocated(ptracb)) THEN
5418 nb_bytes = nb_bytes - int(size(ptracb),8)*k34_8*
5419 & int(keep(10),8)
5420 DEALLOCATE( ptracb )
5421 ENDIF
5422 IF (allocated(iwcb)) THEN
5423 nb_bytes = nb_bytes - int(size(iwcb),8)*k34_8
5424 DEALLOCATE( iwcb )
5425 ENDIF
5426
5427
5428
5429
5430
5431 IF (
id%NSLAVES .GT. 1)
THEN
5434 ENDIF
5435 END IF
5436
5437 IF (
id%MYID .eq. master )
THEN
5438
5439
5440
5441
5442 IF (allocated(saverhs)) THEN
5443 nb_bytes = nb_bytes - int(size(saverhs),8)*k35_8
5444 DEALLOCATE( saverhs)
5445 ENDIF
5446
5447 NULLIFY(rhs_ir)
5448 ELSE
5449
5450
5451
5452
5453 IF (associated(rhs_ir)) THEN
5454 nb_bytes = nb_bytes - int(size(rhs_ir),8)*k35_8
5455 DEALLOCATE(rhs_ir)
5456 NULLIFY(rhs_ir)
5457 END IF
5458 END IF
5459 IF (i_am_slave) THEN
5460
5461 IF (allocated(srw3)) THEN
5462 nb_bytes = nb_bytes - int(size(srw3),8)*k35_8
5463 DEALLOCATE(srw3)
5464 ENDIF
5465 IF (lscal .AND. icntl21==1) THEN
5466
5467 nb_bytes = nb_bytes -
5468 & int(size(scaling_data_sol%SCALING_LOC),8)*k16_8
5469 DEALLOCATE(scaling_data_sol%SCALING_LOC)
5470 NULLIFY(scaling_data_sol%SCALING_LOC)
5471 ENDIF
5472
5473 IF (wk_user_provided) THEN
5474
5475
5476
5477
5478
5480 ELSE IF (
associated(
id%S).AND.keep(201).GT.0)
THEN
5481
5482 nb_bytes = nb_bytes - keep8(23)*k35_8
5486 ENDIF
5487 IF (keep(221).NE.1) THEN
5488
5489
5490
5491 IF (
associated(
id%RHSCOMP))
THEN
5492 nb_bytes = nb_bytes -
id%KEEP8(25)*k35_8
5493 DEALLOCATE(
id%RHSCOMP)
5496 ENDIF
5497 IF (
associated(
id%POSINRHSCOMP_ROW))
THEN
5498 nb_bytes = nb_bytes -
5499 & int(
size(
id%POSINRHSCOMP_ROW),8)*k34_8
5500 DEALLOCATE(
id%POSINRHSCOMP_ROW)
5501 NULLIFY(
id%POSINRHSCOMP_ROW)
5502 ENDIF
5503 IF (
id%POSINRHSCOMP_COL_ALLOC)
THEN
5504 nb_bytes = nb_bytes -
5505 & int(
size(
id%POSINRHSCOMP_COL),8)*k34_8
5506 DEALLOCATE(
id%POSINRHSCOMP_COL)
5507 NULLIFY(
id%POSINRHSCOMP_COL)
5508 id%POSINRHSCOMP_COL_ALLOC = .false.
5509 ENDIF
5510 ENDIF
5511 IF ( work_wcb_allocated ) THEN
5512 nb_bytes = nb_bytes - int(size(work_wcb),8)*k35_8
5513 DEALLOCATE( work_wcb )
5514 ENDIF
5515
5516
5517 NULLIFY( work_wcb )
5518 ENDIF
5519 RETURN
5520 55 FORMAT (//' ERROR ANALYSIS BEFORE ITERATIVE REFINEMENT')
5521 100 FORMAT(//' ****** SOLVE & CHECK STEP ********'/)
5522 110 FORMAT (//' Vector solution for column ',i12)
5523 115 FORMAT(1x, a44,1p,d9.2)
5524 434 FORMAT(' Time to build/scatter RHS =',f15.6)
5525 432 FORMAT(' Time in solution step (fwd/bwd) =',f15.6)
5526 435 FORMAT(' .. Time in forward (fwd) step = ',f15.6)
5527 437 FORMAT(' .. Time in ScaLAPACK root = ',f15.6)
5528 436 FORMAT(' .. Time in backward (bwd) step = ',f15.6)
5529 433 FORMAT(' Time to gather solution(cent.sol)=',f15.6)
5530 431 FORMAT(' Time to copy/scale dist. solution=',f15.6)
5531 150 FORMAT(' GLOBAL STATISTICS PRIOR SOLVE PHASE ...........'/
5532 & ' Number of right-hand-sides =',i12/
5533 & ' Blocking factor for multiple rhs =',i12/
5534 & ' ICNTL (9) =',i12/
5535 & ' --- (10) =',i12/
5536 & ' --- (11) =',i12/
5537 & ' --- (20) =',i12/
5538 & ' --- (21) =',i12/
5539 & ' --- (30) =',i12/
5540 & ' --- (35) =',i12
5541 & )
5542 151 FORMAT (' --- (25) =',i12)
5543 152 FORMAT (' --- (26) =',i12)
5544 153 FORMAT (' --- (32) =',i12)
5545 160 FORMAT (' RHS'/(1x,1p,5e14.6))
5546 170 FORMAT (/' ERROR ANALYSIS' )
5547 240 FORMAT (1x, a42,i4)
5548 270 FORMAT (//' BEGIN ITERATIVE REFINEMENT' )
5549 81 FORMAT (/' STATISTICS AFTER ITERATIVE REFINEMENT '
5550 FORMAT' END ITERATIVE REFINEMENT ')
5551 141 FORMAT(1x, a52,i4)
5552 CONTAINS
5554 & idNloc_RHS,
5555 & idLRHS_loc,
5556 & NRHS,
5557 & idIRHS_loc,
5558 & idRHS_loc,
5559 & INFO)
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574 INTEGER, INTENT( IN ) :: idNloc_RHS
5575 INTEGER, INTENT( IN ) :: idLRHS_loc
5576 INTEGER, INTENT( IN ) :: NRHS
5577#if defined(MUMPS_F2003)
5578 INTEGER, INTENT( IN ), POINTER :: idIRHS_loc (:)
5579 COMPLEX, INTENT( IN ), POINTER :: idRHS_loc (:)
5580#else
5581 INTEGER, POINTER :: idIRHS_loc (:)
5582 COMPLEX, POINTER :: idRHS_loc (:)
5583#endif
5584 INTEGER, INTENT( INOUT ) :: INFO(80)
5585
5586
5587
5588
5589 INTEGER(8) :: REQSIZE8
5590
5591
5592
5593
5594
5595 IF (idnloc_rhs .LE. 0) RETURN
5596
5597 IF (nrhs.NE.1) THEN
5598 IF ( idlrhs_loc .LT. idnloc_rhs) THEN
5599 info(1)=-55
5600 info(2)=idlrhs_loc
5601 RETURN
5602 ENDIF
5603 ENDIF
5604 IF (idnloc_rhs .GT. 0) THEN
5605
5606 IF (.NOT. associated(idirhs_loc)) THEN
5609 RETURN
5610 ELSE IF (size(idirhs_loc) .LT. idnloc_rhs) THEN
5611 info(1)=-22
5612 info(2)= 17
5613 RETURN
5614 ENDIF
5615
5616 IF (.NOT. associated(idrhs_loc)) THEN
5619 RETURN
5620 ELSE
5621
5622 reqsize8 = int(idlrhs_loc,8)*int(nrhs,8)
5623 & + int(-idlrhs_loc+idnloc_rhs,8)
5624#if defined(MUMPS_F2003)
5625 IF (size(idrhs_loc,kind=8) .LT. reqsize8) THEN
5626#else
5627 IF ( reqsize8 .LE. int(huge(idnloc_rhs),8) .AND.
5628 & size(idrhs_loc) .LT. int(reqsize8) ) THEN
5629
5630
5631#endif
5632 info(1)=-22
5633 info(2)=18
5634 RETURN
5635 ENDIF
5636 ENDIF
5637 ENDIF
5638 RETURN
5641 IMPLICIT NONE
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654 IF (kase .NE. 1 .AND. kase .NE. 2) THEN
5655 WRITE(*,*) "Internal error 1 in CMUMPS_PP_SOLVE"
5657 ENDIF
5658 IF (
id%MYID .eq. master )
THEN
5659
5660
5661
5662
5663
5664
5665
5666 IF ( mtype .EQ. 1 ) THEN
5667 solvet = kase - 1
5668 ELSE
5669 solvet = kase
5670 END IF
5671
5672
5673
5674
5675 IF ( solvet.EQ.2 ) solvet = 0
5676 IF ( lscal ) THEN
5677 IF ( solvet .EQ. 1 ) THEN
5678
5680 c_y( k ) = c_y( k ) *
id%ROWSCA( k )
5681 END DO
5682 ELSE
5683
5685 c_y( k ) = c_y( k ) *
id%COLSCA( k )
5686 END DO
5687 END IF
5688 END IF
5689 END IF
5690
5691
5692
5693 CALL mpi_bcast( solvet, 1, mpi_integer, master,
5695
5696
5697
5698 IF ( .NOT.i_am_slave ) THEN
5699
5702 & solvet, c_y(1),
id%N, 1,
5703 & 1,
5704 & c_dummy, 1, 1,
5705 & idummy, 0,
5706 & jdummy,
id%KEEP(1),
id%KEEP8(1),
id%PROCNODE_STEPS(1),
5707 & idummy, 1,
5709 &
id%ICNTL(1),
id%INFO(1))
5710 ELSE
5711 IF (solvet.EQ.mtype) THEN
5712
5713
5714 ptr_posinrhscomp_fwd =>
id%POSINRHSCOMP_ROW
5715 ELSE
5716
5717
5718 ptr_posinrhscomp_fwd =>
id%POSINRHSCOMP_COL
5719 ENDIF
5720 liw_passed =
max( liw, 1 )
5723 & solvet, c_y(1),
id%N, 1,
5724 & 1,
5725 &
id%RHSCOMP(ibeg_rhscomp), ld_rhscomp, 1,
5726 & ptr_posinrhscomp_fwd(1), nb_fs_rhscomp_f,
5727
5728 &
id%PTLUST_S(1),
id%KEEP(1),
id%KEEP8(1),
5729 &
id%PROCNODE_STEPS(1),
5730 & is(1), liw_passed,
5732 &
id%ICNTL(1),
id%INFO(1))
5733 ENDIF
5734 IF (info(1).LT.0) GOTO 89
5735
5736
5737
5738 IF ( i_am_slave ) THEN
5739 liw_passed =
max( liw, 1 )
5740 la_passed =
max( la, 1_8 )
5741 IF (solvet.EQ.mtype) THEN
5742 ptr_posinrhscomp_fwd =>
id%POSINRHSCOMP_ROW
5743 ptr_posinrhscomp_bwd =>
id%POSINRHSCOMP_COL
5744 ELSE
5745 ptr_posinrhscomp_fwd =>
id%POSINRHSCOMP_COL
5746 ptr_posinrhscomp_bwd =>
id%POSINRHSCOMP_ROW
5747 ENDIF
5748 from_pp=.true.
5749 nbsparse_loc = .false.
5751 & liw_passed,work_wcb(1),lwcb8_sol_c,iwcb,liwcb,nbrhs_eff,
id%NA(1),
5752 &
id%LNA,
id%NE_STEPS(1),srw3,solvet,icntl(1),from_pp,
id%STEP(1),
5753 &
id%FRERE_STEPS(1),
id%DAD_STEPS(1),
id%FILS(1),
id%PTLUST_S(1),
5754 &
id%PTRFAC(1), iwk_solve(1), liwk_solve, ptracb, liwk_ptracb,
5755 &
id%PROCNODE_STEPS(1),
id%NSLAVES, info(1), keep(1), keep8(1),
5756 &
id%DKEEP(1),
id%COMM_NODES,
id%MYID,
id%MYID_NODES, bufr(1), lbufr,
5757 & lbufr_bytes,
id%ISTEP_TO_INIV2(1),
id%TAB_POS_IN_PERE(1,1),
5758
5759 & ibeg_root_def,iend_root_def,iroot_def_rhs_col1, ptr_rhs_root(1),
5760 & lptr_rhs_root, size_root, master_root,
id%RHSCOMP(ibeg_rhscomp),
5761 & ld_rhscomp,ptr_posinrhscomp_fwd(1),ptr_posinrhscomp_bwd(1),
5762 & 1,1,1,1, idummy, 1, jdummy, kdummy, 1, ldummy, 1, mdummy, 1,1,
5763 & nbsparse_loc, ptr_rhs_bounds(1), lptr_rhs_bounds
5764 & ,
id%IPOOL_B_L0_OMP(1),
id%LPOOL_B_L0_OMP,
id%IPOOL_A_L0_OMP(1),
5765 &
id%LPOOL_A_L0_OMP,
id%L_VIRT_L0_OMP,
id%VIRT_L0_OMP(1),
5766 &
id%L_PHYS_L0_OMP,
id%PHYS_L0_OMP(1),
id%PERM_L0_OMP(1),
5767 &
id%PTR_LEAFS_L0_OMP(1),
id%L0_OMP_MAPPING(1),
id%LL0_OMP_MAPPING,
5768 &
id%L0_OMP_FACTORS(1),
id%LL0_OMP_FACTORS
5769 & )
5770 END IF
5771
5772
5773
5774 IF (info(1).eq.-2) info(1)=-12
5775 IF (info(1).eq.-3) info(1)=-15
5776
5777 IF (info(1) .GE. 0) THEN
5778
5779
5780
5781
5782
5783
5784 ALLOCATE( cwork(
max(
max(keep(247),keep(246)),1)),
5785 & stat=allocok)
5786 IF (allocok > 0) THEN
5787 info(1)=-13
5788 info(2)=
max(
max(keep(247),keep(246)),1)
5789 ENDIF
5790 ENDIF
5791
5792
5793
5796
5797
5798 IF (info(1).LT.0) RETURN
5799
5800
5801
5802
5803
5804
5805
5806
5807 IF ((
id%MYID.NE.master).OR. .NOT.lscal)
THEN
5808 pt_scaling => dummy_scal
5809 ELSE
5810 IF (solvet.EQ.1) THEN
5811 pt_scaling =>
id%COLSCA
5812 ELSE
5813 pt_scaling =>
id%ROWSCA
5814 ENDIF
5815 ENDIF
5816 liw_passed =
max( liw, 1 )
5817
5818
5819 IF ( .NOT. i_am_slave ) THEN
5820
5821
5822
5824 &
id%MYID,
id%COMM, nbrhs_eff,
5825 & solvet, c_y,
id%N, nbrhs_eff, 1,
5826 & jdummy,
id%KEEP(1),
id%KEEP8(1),
id%PROCNODE_STEPS(1),
5827 & idummy, 1,
5828 &
id%STEP(1), bufr(1), lbufr, lbufr_bytes,
5829 & cwork(1), size(cwork),
5830 & lscal, pt_scaling(1), size(pt_scaling),
5831
5832 & c_dummy, 1 , 1, idummy, 1,
5833
5834 & perm_rhs, size(perm_rhs)
5835 & )
5836 ELSE
5838 &
id%MYID,
id%COMM, nbrhs_eff,
5839 & solvet, c_y,
id%N, nbrhs_eff, 1,
5840 &
id%PTLUST_S(1),
id%KEEP(1),
id%KEEP8(1),
5841 &
id%PROCNODE_STEPS(1),
5842 & is(1), liw_passed,
5843 &
id%STEP(1), bufr(1), lbufr, lbufr_bytes,
5844 & cwork(1), size(cwork),
5845 & lscal, pt_scaling(1), size(pt_scaling),
5846 &
id%RHSCOMP(ibeg_rhscomp), ld_rhscomp, nbrhs_eff,
5847 & ptr_posinrhscomp_bwd(1),
id%N,
5848 & perm_rhs, size(perm_rhs))
5849 ENDIF
5850 DEALLOCATE( cwork )
subroutine cmumps_check_redrhs(id)
subroutine cmumps_set_k221(id)
subroutine cmumps_check_dense_rhs(idrhs, idinfo, idn, idnrhs, idlrhs)
subroutine cmumps_permute_rhs_gs(lp, lpok, prokg, mpg, perm_strat, sym_perm, n, nrhs, irhs_ptr, size_irhs_ptr, irhs_sparse, nzrhs, perm_rhs, ierr)
subroutine cmumps_interleave_rhs_am1(perm_rhs, size_perm, iptr_working, size_iptr_working, working, size_working, irhs_ptr, step, sym_perm, n, nbrhs, procnode, nsteps, slavef, keep199, behaviour_l0, reorder, n_select, prokg, mpg)
subroutine cmumps_permute_rhs_am1(perm_strat, sym_perm, irhs_ptr, nhrs, perm_rhs, sizeperm, ierr)
subroutine cmumps_get_ns_options_solve(icntl, keep, nrhs, mpg, info)
subroutine cmumps_eltyd(mtype, n, nelt, eltptr, leltvar, eltvar, na_elt8, a_elt, saverhs, x, y, w, k50)
subroutine cmumps_sol_x(a, nz8, n, irn, icn, z, keep, keep8, eff_size_schur, sym_perm)
subroutine cmumps_sol_lcond(n, rhs, x, y, d, r_w, c_w, iw, kase, omega, erx, cond, lp, keep, keep8)
subroutine cmumps_build_mapping_info(id)
subroutine cmumps_sol_y(a, nz8, n, irn, icn, rhs, x, r, w, keep, keep8)
subroutine cmumps_sol_q(mtype, iflag, n, lhs, wrhs, w, res, givnorm, anorm, xnorm, sclnrm, mprint, icntl, keep, keep8)
subroutine cmumps_eltqd2(mtype, n, nelt, eltptr, leltvar, eltvar, na_elt8, a_elt, lhs, wrhs, w, rhs, keep, keep8)
subroutine cmumps_sol_x_elt(mtype, n, nelt, eltptr, leltvar, eltvar, na_elt8, a_elt, w, keep, keep8)
subroutine cmumps_qd2(mtype, n, nz8, aspk, irn, icn, lhs, wrhs, w, rhs, keep, keep8)
subroutine cmumps_set_scaling_loc(scaling_data, n, iloc, liloc, comm, myid, i_am_slave, master, nb_bytes, nb_bytes_max, k16_8, lp, lpok, icntl, info)
subroutine cmumps_sol_omega(n, rhs, x, y, r_w, c_w, iw, iflag, omega, noiter, testconv, lp, arret, grain)
subroutine cmumps_gather_solution_am1(nslaves, n, myid, comm, nrhs, rhscomp, lrhscomp, nrhscomp_col, keep, buffer, size_buf, size_buf_bytes, lscal, scaling, lscaling, irhs_ptr_copy, lirhs_ptr_copy, irhs_sparse_copy, lirhs_sparse_copy, rhs_sparse_copy, lrhs_sparse_copy, uns_perm_inv, luns_perm_inv, posinrhscomp, lpos_row, nb_fs_in_rhscomp)
subroutine cmumps_build_posinrhscomp_am1(nslaves, n, myid_nodes, ptrist, dad, keep, keep8, procnode_steps, iw, liw, step, posinrhscomp_row, posinrhscomp_col, posinrhscomp_col_alloc, mtype, irhs_ptr, nbcol_inbloc, irhs_sparse, nz_rhs, perm_rhs, size_perm_rhs, jbeg_rhs, nbent_rhscomp, nb_fs_in_rhscomp_fwd, nb_fs_in_rhscomp_tot, uns_perm_inv, size_uns_perm_inv)
subroutine cmumps_distsol_indices(mtype, isol_loc, ptrist, keep, keep8, iw, liw_passed, myid_nodes, n, step, procnode, nslaves, scaling_data, lscal, irhs_loc_meaningful, irhs_loc, nloc_rhs)
subroutine cmumps_build_posinrhscomp(nslaves, n, myid_nodes, ptrist, keep, keep8, procnode_steps, iw, liw, step, posinrhscomp_row, posinrhscomp_col, posinrhscomp_col_alloc, mtype, nbent_rhscomp, nb_fs_in_rhscomp)
subroutine cmumps_distributed_solution(slavef, n, myid_nodes, mtype, rhscomp, lrhscomp, nbrhs_eff, posinrhscomp, isol_loc, sol_loc, nrhs, beg_rhs, lsol_loc, ptrist, procnode_steps, keep, keep8, iw, liw, step, scaling_data, lscal, nb_rhsskipped, perm_rhs, size_perm_rhs)
subroutine cmumps_scatter_dist_rhs(nslaves, n, myid_nodes, comm_nodes, nrhs_col, nrhs_loc, lrhs_loc, map_rhs_loc, irhs_loc, rhs_loc, rhs_loc_size, rhscomp, ld_rhscomp, posinrhscomp_fwd, nb_fs_in_rhscomp, lscal, scaling_data_dr, lp, lpok, keep, nb_bytes_loc, info)
subroutine cmumps_check_distrhs(idnloc_rhs, idlrhs_loc, nrhs, idirhs_loc, idrhs_loc, info)
subroutine cmumps_pp_solve()
subroutine cmumps_loc_mv8(n, nz_loc8, irn_loc, jcn_loc, a_loc, x, y_loc, ldlt, mtype)
subroutine cmumps_loc_omega1(n, nz_loc8, irn_loc, jcn_loc, a_loc, x, y_loc, ldlt, mtype)
subroutine mpi_recv(buf, cnt, datatype, source, tag, comm, status, ierr)
subroutine mpi_reduce(sendbuf, recvbuf, cnt, datatype, op, root, comm, ierr)
double precision function mpi_wtime()
subroutine mpi_send(buf, cnt, datatype, dest, tag, comm, ierr)
subroutine, public cmumps_buf_deall_small_buf(ierr)
subroutine, public cmumps_buf_deall_cb(ierr)
subroutine, public cmumps_buf_alloc_cb(size, ierr)
subroutine, public cmumps_buf_alloc_small_buf(size, ierr)
subroutine, public cmumps_blr_struc_to_mod(id_blrarray_encoding)
subroutine, public cmumps_blr_mod_to_struc(id_blrarray_encoding)
subroutine, public cmumps_ooc_init_solve(id)
subroutine, public cmumps_ooc_end_solve(ierr)
subroutine cmumps_init_fact_area_size_s(la)
subroutine cmumps_compute_memory_save(id, total_file_size, total_struc_size)
integer(8), public pruned_size_loaded
subroutine, public cmumps_sol_es_init(size_of_block_arg, keep201)
subroutine cmumps_sol_l0omp_li(k400)
subroutine cmumps_sol_l0omp_ld(k400)
subroutine, public mumps_fdm_mod_to_struc(what, id_fdm_encoding, info)
subroutine, public mumps_fdm_struc_to_mod(what, id_fdm_encoding)
subroutine mumps_sol_rhsmapinfo(n, nloc_rhs, info23, irhs_loc, map_rhs_loc, posinrhscomp_fwd, nslaves, myid_nodes, comm_nodes, icntl, info)
void file_size(int *filesize)