46 TYPE (ZMUMPS_STRUC) :: id
47 INTEGER(8) :: NB_INT,NB_CMPLX,NB_CHAR
50 &(idrhs, idinfo, idn, idnrhs, idlrhs)
51 COMPLEX(kind=8),
DIMENSION(:),
POINTER :: idRHS
52 INTEGER,
intent(in) :: idN, idNRHS, idLRHS
53 INTEGER,
intent(inout) :: idINFO(:)
58 include
'mumps_headers.h'
59 include
'mumps_tags.h'
63 INTEGER :: STATUS(MPI_STATUS_SIZE)
65 INTEGER,
PARAMETER :: MASTER = 0
70 TYPE (ZMUMPS_STRUC),
TARGET :: id
76 LOGICAL PROK, 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
85 INTEGER(8) :: LA, LA_PASSED
87 INTEGER(8) :: LWCB8_MIN, LWCB8, LWCB8_SOL_C
89 INTEGER ZMUMPS_LBUF, ZMUMPS_LBUF_INT
90 INTEGER(8) :: ZMUMPS_LBUF_8
91 INTEGER :: LBUFR, LBUFR_BYTES
92 INTEGER :: MSG_MAX_BYTES_SOLVE, MSG_MAX_BYTES_GTHRSOL
93 INTEGER(8) :: MSG_MAX_BYTES_SOLVE8
95 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: BUFR
97 INTEGER IBEG_ROOT_DEF, IEND_ROOT_DEF,
98 & IBEG_GLOB_DEF, IEND_GLOB_DEF,
101 INTEGER NITREF, NOITER, SOLVET, KASE
103 LOGICAL INTERLEAVE_PAR, DO_PERMUTE_RHS
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
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(kind=8),
DIMENSION(:),
POINTER :: RHS_SPARSE_COPY
123 LOGICAL IRHS_SPARSE_COPY_ALLOCATED, IRHS_PTR_COPY_ALLOCATED,
124 & RHS_SPARSE_COPY_ALLOCATED
126 INTEGER,
DIMENSION(:),
ALLOCATABLE :: MAP_RHS_loc
127 INTEGER,
DIMENSION(:),
POINTER :: IRHS_loc_PTR
129 COMPLEX(kind=8),
DIMENSION(:),
POINTER :: idRHS_loc
130 INTEGER(8) :: DIFF_SOL_loc_RHS_loc
131 INTEGER(8) :: RHS_loc_size, RHS_loc_shift
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(kind=8),
DIMENSION(:),
POINTER :: PTR_RHS
139 INTEGER :: SIZE_IPTR_WORKING, SIZE_WORKING
163 parameter( one = (1.0d0,0.0d0) )
164 parameter( zero = (0.0d0,0.0d0) )
165 DOUBLE PRECISION RZERO,
166 parameter( rzero = 0.0d0, rone = 1.0d0 )
173 COMPLEX(kind=8),
DIMENSION(:),
POINTER :: RHS_IR
174 COMPLEX(kind=8),
DIMENSION(:),
POINTER :: WORK_WCB
175 COMPLEX(kind=8),
DIMENSION(:),
POINTER :: PTR_RHS_ROOT
180 COMPLEX(kind=8),
ALLOCATABLE :: SAVERHS(:), C_RW1(:),
185 COMPLEX(kind=8),
ALLOCATABLE :: CWORK(:)
186 INTEGER,
ALLOCATABLE :: MAP_RHS(:)
187 DOUBLE PRECISION,
ALLOCATABLE :: R_Y(:), D(:)
188 DOUBLE PRECISION,
ALLOCATABLE :: R_W(:)
192 DOUBLE PRECISION,
ALLOCATABLE,
DIMENSION(:) :: R_LOCWK54
193 COMPLEX(kind=8),
ALLOCATABLE,
DIMENSION(:) :: C_LOCWK54
194 INTEGER :: NBENT_RHSCOMP, NB_FS_RHSCOMP_F,
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(:)
207 DOUBLE PRECISION,
DIMENSION(:),
POINTER :: CNTL
208 INTEGER,
DIMENSION (:),
POINTER :: KEEP,ICNTL,
209 INTEGER(8),
DIMENSION (:),
POINTER :: KEEP8
210 INTEGER,
DIMENSION (:),
POINTER :: IS
211 DOUBLE PRECISION,
DIMENSION(:),
POINTER:: RINFOG
245 DOUBLE PRECISION,
dimension(:),
pointer :: SCALING
246 DOUBLE PRECISION,
dimension(:),
pointer :: SCALING_LOC
247 end type scaling_data_t
248 type (scaling_data_t) :: scaling_data_sol, scaling_data_dr
250 DOUBLE PRECISION,
DIMENSION(:),
POINTER :: PT_SCALING
251 DOUBLE PRECISION,
TARGET :: Dummy_SCAL(1)
258 INTEGER,
DIMENSION(:),
ALLOCATABLE,
TARGET :: RHS_BOUNDS
260 INTEGER,
DIMENSION(:),
POINTER :: PTR_RHS_BOUNDS
261 LOGICAL :: DO_NBSPARSE, NBSPARSE_LOC
262 LOGICAL :: PRINT_MAXAVG
263 DOUBLE PRECISION ARRET
264 COMPLEX(kind=8) C_DUMMY(1)
265 DOUBLE PRECISION R_DUMMY(1)
266 INTEGER IDUMMY(1), JDUMMY(1), KDUMMY(1), LDUMMY(1), MDUMMY(1)
267 INTEGER,
TARGET :: IDUMMY_TARGET(1)
268 COMPLEX(kind=8),
TARGET :: CDUMMY_TARGET(1)
271 INTEGER NBRHS, NBRHS_EFF, BEG_RHS, NB_RHSSKIPPED,
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
281 INTEGER IFLAG_IR, IRStep
283 LOGICAL WORKSPACE_MINIMAL_PREFERRED, WK_USER_PROVIDED
285 INTEGER(8) NB_BYTES_MAX
286 INTEGER(8) NB_BYTES_EXTRA
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
292 INTEGER soln_drive_class, glob_comm_ini, perm_scal_ini, soln_dist,
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
303 INTEGER MAT_ALLOC_LOC, MAT_ALLOC
304 INTEGER MUMPS_PROCNODE
305 EXTERNAL mumps_procnode
306 INTEGER(8) :: FILE_SIZE,STRUC_SIZE
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)
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.
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.
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)
360 IF (.not.prokg) mpg=0
361 IF ( prok )
WRITE(mp,100)
362 IF ( prokg )
WRITE(mpg,100)
366 k34_8 = int(keep(34), 8)
367 k35_8 = int(keep(35), 8)
368 k16_8 = int(keep(16), 8)
376 work_wcb_allocated = .false.
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
389 nb_fs_rhscomp_tot = keep(89)
392 nb_fs_rhscomp_f = nb_fs_rhscomp_tot
396 IF (keep(350).LE.0) keep(350)=1
397 IF (keep(350).GT.2) keep(350)=1
398 keep350_save = keep(350)
402 i_am_slave = ( id%MYID .ne. master .OR.
403 & ( id%MYID .eq. master .AND.
404 & keep(46) .eq. 1 ) )
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)
419 IF (id%MYID .EQ. master)
THEN
422 id%KEEP(111) = id%ICNTL(25)
425 IF (id%ICNTL(20) .EQ. 1) id%KEEP(235) = -1
426 IF (id%ICNTL(20) .EQ. 2) id%KEEP(235) = 0 !off
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
436 icntl21 = id%ICNTL(21)
437 IF (icntl21 .ne.0.and.icntl21.ne.1) icntl21=0
438 IF ( id%ICNTL(30) .NE.0 )
THEN
445 IF (id%KEEP(248) .eq.0.and. id%KEEP(237).ne.0)
THEN
450 IF ((id%KEEP(221).EQ.2 ).AND.(id%KEEP(248).NE.0) )
THEN
454 IF ((id%KEEP(221).EQ.2 ).AND.(id%KEEP(235).NE.0) )
THEN
459 IF ( (id%KEEP(248).EQ.0).AND.(id%KEEP(111).EQ.0) )
THEN
463 IF (keep(248) .EQ. -1)
THEN
469 IF(id%KEEP(111).NE.0) id%KEEP(235)=0
471 IF (id%KEEP(235).EQ.-1)
THEN
472 IF (id%KEEP(237).NE.0)
THEN
478 ELSE IF (id%KEEP(235).NE.0)
THEN
482 IF ((keep(111).NE.0))
THEN
493 IF (keep(248).EQ.0.AND.keep(111).EQ.0)
THEN
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
507 IF (keep(242).EQ.-9)
THEN
510 IF (id%KEEP(237).NE.0)
THEN
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
526 IF ( (id%KEEP(221).EQ.1 ).AND.(id%KEEP(235).NE.0) )
THEN
530 IF (keep(242).EQ.0) keep(243)=0
531 IF ((keep(237).EQ.0).OR.(keep(242).EQ.0))
THEN
536 IF (id%KEEP(237).EQ.1)
THEN
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
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
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
563 mtype = id%ICNTL( 9 )
564 IF (mtype.NE.1) mtype=0
565 IF ((mtype.EQ.0).AND.keep(50).NE.0) mtype =1
567 IF (id%KEEP(237).NE.0) mtype = 1
574 IF (keep(486) .EQ. 2)
THEN
582 CALL mpi_bcast( id%KEEP(401), 1, mpi_integer, master, id%COMM,
584 CALL mpi_bcast(mtype,1,mpi_integer,master,
586 CALL mpi_bcast( id%KEEP(111), 1, mpi_integer, master, id%COMM,
588 CALL mpi_bcast( id%KEEP(221), 1, mpi_integer, master, id%COMM,
590 CALL mpi_bcast( id%KEEP(235), 1, mpi_integer, master, id%COMM,
592 CALL mpi_bcast( id%KEEP(237), 1, mpi_integer, master, id%COMM,
594 CALL mpi_bcast( id%KEEP(242), 2, mpi_integer, master, id%COMM,
596 CALL mpi_bcast( id%KEEP(248), 1, mpi_integer, master, id%COMM,
598 CALL mpi_bcast( id%KEEP(350), 1, mpi_integer, master, id%COMM,
600 CALL mpi_bcast( id%KEEP(485), 1, mpi_integer, master, id%COMM,
602 CALL mpi_bcast( id%KEEP(495), 3, mpi_integer, master, id%COMM,
604 CALL mpi_bcast( icntl21, 1, mpi_integer, master, id%COMM
607 CALL mpi_bcast( id%NRHS,1, mpi_integer, master, id%COMM,ierr)
639 id%DKEEP(128:134)=0.0d0
640 id%DKEEP(140:153)=0.0d0
646 IF ( id%MYID .EQ. master )
THEN
647 IF ((keep(23).NE.0).AND.keep(50).NE.0)
THEN
651 IF (prokg)
WRITE(mpg,
'(A)')
652 &
' Internal Error 1 in solution driver '
664 IF (keep(201) .EQ. -1)
THEN
667 &
' ERROR: Solve impossible because factors not kept'
672 ELSE IF (keep(221).EQ.0 .AND. keep(251) .EQ. 2
673 & .AND. keep(252).EQ.0)
THEN
676 &
' ERROR: Solve impossible because factors not kept'
683 IF (keep(252).NE.0 .AND. id%NRHS .NE. id%KEEP(253))
THEN
691 &
' ERROR: id%NRHS not allowed to change when',
695 id%INFO(2)=id%KEEP(253)
699 IF (keep(252).NE.0 .AND. mtype.NE.1)
THEN
705 & .NE.
' ERROR: Transpose system (ICNTL(9)0) not ',
706 &
' compatible with forward performed during',
707 &
' factorization (ICNTL(32)=1)'
711 IF (keep(248) .NE. 0.AND.keep(252).NE.0)
THEN
716 IF (keep(237).NE.0)
THEN
720 &
' ERROR: A-1 functionality incompatible with',
721 &
' forward performed during factorization',
728 &
' ERROR: sparse or dist. RHS incompatible with forward',
729 &
' elimination during factorization (ICNTL(32)=1)'
734 IF (keep(237) .NE. 0 .AND. icntl21.NE.0)
THEN
737 &
' ERROR: A-1 functionality is incompatible',
738 &
' with distributed solution.'
744 IF (keep(237) .NE. 0 .AND. keep(60) .NE.0)
THEN
747 &
' ERROR: A-1 functionality is incompatible',
754 IF (keep(237) .NE. 0 .AND. keep(111) .NE.0)
THEN
757 &
' ERROR: A-1 functionality is incompatible',
758 &
' with null space.'
764 IF (id%NRHS .LE. 0)
THEN
767 IF ((id%KEEP(111).NE.0).AND.(id%INFOG(28).EQ.0))
THEN
770 &
'ICNTL(25) NE 0 but INFOG(28)=0',
771 &
' the matrix is not deficient'
778 IF ( (id%KEEP(237).EQ.0) )
THEN
779 IF ((id%KEEP(248) == 0 .AND.keep(221).NE.2)
780 & .OR. icntl21==0)
THEN
785 & (id%RHS,id%INFO,id%N,id%NRHS,id%LRHS)
786 IF (id%INFO(1) .LT. 0)
GOTO 333
791 IF (id%NRHS .NE. id%N)
THEN
797 IF (id%KEEP(248) == 1)
THEN
802 IF (( id%NZ_RHS .LE.0 ).AND.(keep(237).NE.0))
THEN
808 IF (( id%NZ_RHS .LE.0 ).AND.(keep(221).EQ.1))
THEN
815 IF ( id%NZ_RHS .GT. 0 )
THEN
816 IF ( .not.
associated(id%RHS_SPARSE) )
THEN
822 IF (id%NZ_RHS .GT. 0)
THEN
823 IF ( .not.
associated(id%IRHS_SPARSE) )
THEN
829 IF ( .not.
associated(id%IRHS_PTR) )
THEN
835 IF (
size(id%IRHS_PTR) < id%NRHS + 1)
THEN
840 IF (id%IRHS_PTR(id%NRHS + 1).ne.id%NZ_RHS+1)
THEN
842 id%INFO(2)=id%IRHS_PTR(id%NRHS+1)
846 IF (dble(id%N)*dble(id%NRHS).LT.dble(id%NZ_RHS))
THEN
850 &
" WARNING: many dupplicate entries in ",
851 &
" sparse RHS provided by the user ",
852 &
" id%NZ_RHS,id%N,id%NRHS =",
853 & id%NZ_RHS,id%N,id%NRHS
856 IF (id%IRHS_PTR(1).ne.1)
THEN
858 id%INFO(2)=id%IRHS_PTR(1)
861 IF (
size(id%IRHS_SPARSE) < id%NZ_RHS)
THEN
866 IF (
size(id%RHS_SPARSE) < id%NZ_RHS)
THEN
878 IF (info(1) .LT. 0)
GOTO 333
885 IF ( i_am_slave )
THEN
888 IF ( id%LSOL_loc < id%KEEP(89) )
THEN
890 id%INFO(2)= id%LSOL_loc
893 IF (id%KEEP(89) .NE. 0)
THEN
894 IF ( .not.
associated(id%ISOL_loc) )
THEN
899 IF ( .not.
associated(id%SOL_loc) )
THEN
904 IF (
size(id%ISOL_loc) < id%KEEP(89) )
THEN
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
925 IF (
size(id%SOL_loc) <
926 & (id%NRHS-1)*id%LSOL_loc+id%KEEP(89))
THEN
935 IF (id%MYID .NE. master)
THEN
936 IF (id%KEEP(248) == 1)
THEN
940 IF (
associated( id%RHS ) )
THEN
945 IF (
associated( id%RHS_SPARSE ) )
THEN
950 IF (
associated( id%IRHS_SPARSE ) )
THEN
955 IF (
associated( id%IRHS_PTR ) )
THEN
962 IF (i_am_slave .AND. id%KEEP(248).EQ.-1)
THEN
970 IF (id%INFO(1) .LT. 0)
GOTO 333
979 IF (
associated(id%IRHS_loc))
THEN
980 IF (
size(id%IRHS_loc) .NE. 0)
THEN
981 irhs_loc_ptr=>id%IRHS_loc
984 irhs_loc_ptr=>idummy_target
987 irhs_loc_ptr=>idummy_target
989 IF (
associated(id%RHS_loc))
THEN
990 IF (
size(id%RHS_loc) .NE. 0)
THEN
991 idrhs_loc=>id%RHS_loc
993 idrhs_loc=>cdummy_target
996 idrhs_loc=>cdummy_target
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
1009 CALL mumps_size_c(idrhs_loc(1),id%SOL_loc(1),
1010 & diff_sol_loc_rhs_loc)
1015 IF (diff_sol_loc_rhs_loc .EQ. 0_8 .AND.
1016 & id%LSOL_loc .GT. id%LRHS_loc)
THEN
1023 id%INFO(2)=id%LRHS_loc
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
1033 IF (id%MYID.EQ.master)
THEN
1037 IF (id%INFO(1) .LT. 0)
GOTO 333
1044 & id%COMM, id%MYID )
1045 IF ( id%INFO(1) .LT. 0 )
GO TO 90
1053 IF ((id%KEEP(248).EQ.1).AND.(id%KEEP(237).EQ.0))
THEN
1055 CALL mpi_bcast(id%NZ_RHS,1,mpi_integer,master,
1058 IF (id%NZ_RHS.EQ.0)
THEN
1061 IF ((icntl21.EQ.1).AND.(i_am_slave))
THEN
1068 liw_passed=
max(1,keep(32))
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
1080 & , .false., idummy(1), 1
1084 id%SOL_loc((j-1)*id%LSOL_loc + i) =zero
1089 IF (icntl21.NE.1)
THEN
1093 IF (id%MYID.EQ.master)
THEN
1096 id%RHS(int(j-1,8)*int(id%LRHS,8) + int(i,8)) =zero
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)
1113 IF (keep(252).GT.0)
THEN
1114 WRITE (mpg, 153) keep(252)
1126 interleave_par =.false.
1127 do_permute_rhs =.false.
1129 IF ((id%KEEP(235).NE.0).or.(id%KEEP(237).NE.0))
THEN
1131 IF (id%KEEP(237).NE.0.AND.
1136 WRITE(lp,
'(A,I4,I4)')
1137 & ' internal error 2 in solution driver(a-1)
',
1138 & id%KEEP(237), id%KEEP(248)
1145 CALL MUMPS_REALLOC(id%Step2node, id%KEEP(28), id%INFO, LP,
1147 & STRING='id%Step2node (solve)
', MEMCNT=NBT, ERRCODE=-13)
1148 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
1149 & id%COMM, id%MYID )
1150.LT.
IF ( INFO(1)0 ) RETURN
1156 ! Step2node was reallocated and needs be recomputed
1158.LE.
IF (id%STEP(I)0) CYCLE ! nonprincipal variables
1159 id%Step2node(id%STEP(I)) = I
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
1176.NE..OR..NE.
IF((KEEP(235)0)(KEEP(237)0)) THEN
1177.NOT.
IF(associated(id%IPTR_WORKING)) THEN
1178 CALL ZMUMPS_BUILD_MAPPING_INFO(id)
1185 & CALL ZMUMPS_SOL_ES_INIT(id%OOC_SIZE_OF_BLOCK, id%KEEP(201))
1186 DO_NULL_PIV = .TRUE.
1187 NBCOL_INBLOC = -9998
1188 NZ_THIS_BLOCK= -9998
1191.EQ.
IF (id%MYIDMASTER) THEN ! Compute NRHS_NONEMPTY
1194.AND.
IF ( KEEP(111)==0 KEEP(248)==1
1201.LT.
IF (id%IRHS_PTR(I)id%IRHS_PTR(I+1))
1202 & NRHS_NONEMPTY = NRHS_NONEMPTY+1 !ith col in non empty
1204.LE.
IF (NRHS_NONEMPTY0) THEN
1207 & WRITE(LP,*) " Internal Error 3 in solution driver ",
1208 & " NRHS_NONEMPTY= ",
1213 NRHS_NONEMPTY = id%NRHS
1221.ne.
IF ( KEEP( 38 ) 0 ) THEN
1222 MASTER_ROOT = MUMPS_PROCNODE(
1223 & id%PROCNODE_STEPS(id%STEP( KEEP(38))),
1225.eq.
IF (id%MYID_NODES MASTER_ROOT) THEN
1226 SIZE_ROOT = id%root%TOT_ROOT_SIZE
1227.EQ..AND..NE.
ELSE IF ((id%MYIDMASTER)KEEP(60)0) THEN
1229 SIZE_ROOT=id%KEEP(116)
1231.ne.
ELSE IF (KEEP( 20 ) 0 ) THEN
1232 MASTER_ROOT = MUMPS_PROCNODE(
1233 & id%PROCNODE_STEPS(id%STEP(KEEP(20))),
1235.eq.
IF (id%MYID_NODES MASTER_ROOT) THEN
1237 & id%PTLUST_S(id%STEP(KEEP(20)))+KEEP(IXSZ) + 3)
1238.EQ..AND..NE.
ELSE IF ((id%MYIDMASTER)KEEP(60)0) THEN
1240 SIZE_ROOT=id%KEEP(116)
1243 MASTER_ROOT = -44444
1251.eq.
IF (id%MYID MASTER) THEN
1252 KEEP(84) = ICNTL(27)
1254.EQ.
IF(ICNTL(27)0) KEEP(84)=1
1255.NE.
IF (KEEP(252)0) THEN
1256! Fwd in facto: all rhs (KEEP(253) need be processed in one pass
1259.EQ..OR..GT.
IF (KEEP(201) 0 KEEP(84) 0) THEN
1260 NBRHS = abs(KEEP(84))
1264.GT.
IF (NBRHS NRHS_NONEMPTY ) NBRHS = NRHS_NONEMPTY
1269 CALL VTBEGIN(glob_comm_ini,IERR)
1272 CALL MPI_BCAST(NRHS_NONEMPTY,1,MPI_INTEGER,MASTER,
1274 CALL MPI_BCAST(NBRHS,1,MPI_INTEGER,MASTER,
1277.GT.
IF (KEEP(201)0) THEN
1281 WORKSPACE_MINIMAL_PREFERRED = .FALSE.
1282.eq.
IF (id%MYID MASTER) THEN
1283 KEEP(107) = max(0,KEEP(107))
1284.EQ..AND.
IF ((KEEP(107)0)
1285.EQ..AND..NE.
& (KEEP(204)0)(KEEP(211)1) ) THEN
1288 ! -Emmergency buffer only and
1290 ! -NO_O_DIRECT (because of synchronous choice)
1292 ! "Basic system-based version"
1293 ! We can force to allocate S to a minimal
1295 WORKSPACE_MINIMAL_PREFERRED=.TRUE.
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,
1306 & MASTER, id%COMM, IERR )
1309 IF ( I_AM_SLAVE ) THEN
1338.NE..OR..NE.
IF ( KEEP( 38 ) 0 KEEP( 20 ) 0 ) THEN
1339.eq.
IF ( MASTER_ROOT id%MYID_NODES ) THEN
1341.NOT.
& associated(id%root%RHS_CNTR_MASTER_ROOT)
1343 NB_K133 = NB_K133 + 1
1347 LWCB8_MIN = int(NB_K133,8)*int(KEEP(133),8)*int(NBRHS,8)
1355.NE.
WK_USER_PROVIDED = (id%LWK_USER0)
1356.EQ.
IF (id%LWK_USER0) THEN
1358.GT.
ELSE IF (id%LWK_USER0) THEN
1359 ITMP8= int(id%LWK_USER,8)
1361 ITMP8 = -int(id%LWK_USER,8)* 1000000_8
1368.EQ.
IF (KEEP(201)0) THEN ! incore
1370.NE.
IF (ITMP8KEEP8(24)) THEN
1373 INFO(2) = id%LWK_USER
1374 GOTO 99 ! jump to propinfo
1375 ! (S is used in between and not allocated)
1376 ! NO COMM must occur then before next propinfo
1377 ! it happens in Mila's code but only with
1386 IF (wk_user_provided)
THEN
1388 IF (maxs.LT. keep8(20))
THEN
1391 itmp8 = keep8(20)+1_8-maxs
1394 IF (info(1) .GE. 0 ) id%S => id%WK_USER(1:keep8(24))
1395 ELSE IF (
associated(id%S))
THEN
1402 IF (keep(201).EQ.0)
THEN
1403 WRITE(*,*)
' Working array S not allocated ',
1404 &
' on entry to solve phase (in core) '
1415 IF ( keep(209).EQ.-1 .AND. workspace_minimal_preferred)
1418 maxs = keep8(20) + 1_8
1419 ELSE IF ( keep(209) .GE.0 )
THEN
1421 maxs =
max(int(keep(209),8), keep8(20) + 1_8)
1427 maxs =
max(maxs, id%KEEP8(20)+1_8)
1428 ALLOCATE (id%S(maxs), stat = allocok)
1430 IF ( allocok .GT. 0 )
THEN
1432 WRITE(lp,*) id%MYID,
': problem allocation of S ',
1440 nb_bytes = nb_bytes + keep8(23) * k35_8
1441 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
1450 IF(keep(201).EQ.0)
THEN
1455 IF(maxs.GT.keep8(31)+keep8(20)*int(keep(107)+1,8))
THEN
1462 la=keep8(31)+keep8(20)*int(keep(107)+1,8)
1469 IF ( maxs-la .GT. lwcb8_min )
THEN
1471 work_wcb => id%S(la+1_8:la+lwcb8)
1472 work_wcb_allocated=.false.
1475 ALLOCATE(work_wcb(lwcb8), stat = allocok)
1476 IF (allocok < 0 )
THEN
1480 work_wcb_allocated=.true.
1481 nb_bytes = nb_bytes + lwcb8*k35_8
1482 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
1489 IF (info(1) < 0)
GOTO 90
1491 IF ( i_am_slave )
THEN
1492 IF (keep(201).GT.0)
THEN
1497 is_init_ooc_done = .true.
1503 IF (info(1) < 0)
GOTO 90
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 ZMUMPS_SOL_DRIVER"
1511 IF (.NOT. (
associated(id%BLRARRAY_ENCODING)))
THEN
1512 WRITE(*,*)
"Internal error 19 in ZMUMPS_SOL_DRIVER"
1518 is_lr_mod_to_struc_done = .true.
1521 IF (id%MYID.EQ.master)
THEN
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)
1531 IF (keep(221).NE.0)
THEN
1532 WRITE (mpg, 152) keep(221)
1534 IF (keep(252).GT.0)
THEN
1535 WRITE (mpg, 153) keep(252)
1543 lscal = (((keep(52) .GT. 0) .AND. (keep(52) .LE. 8)) .OR. (
1544 & keep(52) .EQ. -1) .OR. keep(52) .EQ. -2)
1548 IF ((icntl11 .LT. 0).OR.(icntl11 .GE. 3))
THEN
1550 IF (prokg)
WRITE(mpg,
'(A)')
1551 &
' WARNING: ICNTL(11) out of range'
1554 IF (icntl11.NE.0 .OR. icntl10.NE.0)
THEN
1558 IF (keep(111).NE.0)
THEN
1565 IF (prokg)
WRITE(mpg,
'(A,A)')
1566 &
' WARNING: Incompatible features: null space basis ',
1567 &
' and Iter. Ref and/or Err. Anal.'
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.
'
1574.NE.
ELSE IF ( KEEP(252) 0 ) THEN
1575 IF (PROKG) WRITE(MPG,'(a,a
')
1576 & ' warning: incompatible features: fwd in facto
',
1577 & ' and iter. ref and/or err. anal.
'
1579.NE.
ELSE IF (KEEP(221)0) THEN
1582 IF (PROKG) WRITE(MPG,'(a,a)
')
1583 & ' warning: incompatible features: reduced rhs
',
1584 & ' and iter. ref and/or err. anal.
'
1586.GT..OR..GT.
ELSE IF (NBRHS 1 ICNTL(21) 0) THEN
1590 IF (PROKG) WRITE(MPG,'(a,a)
')
1591 & ' warning: incompatible features: nrhs>1 or distrib sol
',
1592 & ' and iter. ref and/or err. anal.
'
1594.EQ.
ELSE IF ( KEEP(248) -1 ) THEN
1597 IF (PROKG) WRITE(MPG,'(a,a)
')
1598 & ' warning: incompatible features: distrib rhs
',
1599 & ' and iter. ref and/or err. anal.
'
1602.NOT.
IF (POSTPros) THEN
1608.NE..AND..EQ.
IF ((ICNTL(10) 0) (ICNTL10 0)) THEN
1609 IF (PROKG) WRITE(MPG,'(a)
')
1610 & ' warning: icntl(10) treated as
if set to 0
'
1612.NE.
IF ((ICNTL(11) 0)
1613.AND..EQ.
& (ICNTL11 0)) THEN
1614 IF (PROKG) WRITE(MPG,'(a)
')
1615 & ' warning: icntl(11) treated as
if set to 0
'
1619 CALL MPI_BCAST(POSTPros,1,MPI_LOGICAL,MASTER,
1625 IF ( POSTPros ) THEN
1628.EQ.
IF ( KEEP(54) 0 ) THEN
1630.eq.
IF ( id%MYID MASTER ) THEN
1631.eq.
IF (KEEP(55)0) THEN
1633.NOT..OR.
IF (associated(id%A)
1634.NOT..OR.
& (associated(id%IRN))
1635.NOT.
& ( associated(id%JCN))) THEN
1636 IF (PROKG) WRITE(MPG,'(a)
')
1637 & ' warning: original centralized assembled
',
1638 & ' matrix is not
allocated '
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 '
1654 IF ( i_am_slave .AND. (id%KEEP8(29) .GT. 0_8) )
THEN
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 '
1666 ENDIF ! end test allocation matrix (keep(54))
1668 CALL MPI_REDUCE( MAT_ALLOC_LOC, MAT_ALLOC, 1,
1670 & MPI_MIN, MASTER, id%COMM, IERR)
1671.eq.
IF ( id%MYID MASTER ) THEN
1672.EQ.
IF (MAT_ALLOC0) THEN
1677.NE..AND..EQ.
IF ((ICNTL(10) 0) (ICNTL10 0)) THEN
1678 IF (PROKG) WRITE(MPG,'(a)
')
1679 & ' warning: icntl(10) treated as
if set to 0
'
1681.EQ..OR..EQ.
IF ((ICNTL(11) 1)(ICNTL(11) 2)
1682.AND..EQ.
& (ICNTL11 0)) THEN
1683 IF (PROKG) WRITE(MPG,'(a)
')
1684 & ' warning: icntl(11) treated as
if set to 0
'
1688 ALLOCATE(SAVERHS(id%N*NBRHS),stat = allocok)
1689.GT.
IF ( allocok 0 ) THEN
1691 WRITE(LP,*) id%MYID,
1692 & ':problem in solve: error allocating saverhs
'
1695 INFO(2) = id%N*NBRHS
1697 NB_BYTES = NB_BYTES + int(size(SAVERHS),8)*K35_8
1698 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
1703.NE..AND..NE.
IF (KEEP(237)0 KEEP(111)0) THEN
1707 IF (PROKG) WRITE(MPG,'(a)
')
1708 & ' warning: keep(237) treated as
if set to 0 (null space)
'
1713 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
1715.LT.
IF (INFO(1) 0 ) GOTO 90
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,
1743.NE.
DO_PERMUTE_RHS = (KEEP(242)0)
1745.GT..AND..NE.
IF ( (id%NSLAVES1) (KEEP(243)0)
1750.NE..or..GT.
IF ((KEEP(237)0)(KEEP(111)0)) THEN
1751 INTERLEAVE_PAR= .TRUE.
1754 write(MPG,*) ' warning incompatible options
',
1755 & ' interleave rhs reset to false
'
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) ! for request id, pointer to next + safety
1767.GT.
IF ( MSG_MAX_BYTES_SOLVE8
1768 & int(huge(I4),8)) THEN
1770 INFO(2) = ( huge(I4) -
1771 & ( 16 + 4 + KEEP(133) ) ) /
1772 & ( KEEP(133) * KEEP(35) )
1774.LT.
IF (INFO(1) 0 ) GOTO 111
1775 MSG_MAX_BYTES_SOLVE = int(MSG_MAX_BYTES_SOLVE8)
1782.EQ.
IF (KEEP(237)0) THEN
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.EQ.
ELSE IF (ICNTL210) THEN
1798 MSG_MAX_BYTES_GTHRSOL = ( 3 * KEEP(34) + KEEP(35) )
1803 MSG_MAX_BYTES_GTHRSOL = 0
1806 LBUFR_BYTES = max(MSG_MAX_BYTES_SOLVE, MSG_MAX_BYTES_GTHRSOL)
1807 TSIZE = int(min(100_8*int(MSG_MAX_BYTES_GTHRSOL,8),
1809 LBUFR_BYTES = max(LBUFR_BYTES,TSIZE)
1810 LBUFR = ( LBUFR_BYTES + KEEP(34) - 1 ) / KEEP(34)
1811 ALLOCATE (BUFR(LBUFR),stat=allocok)
1812.GT.
IF ( allocok 0 ) THEN
1814 WRITE(LP,*) id%MYID,
1815 & ' problem in solve: error allocating bufr
'
1821 NB_BYTES = NB_BYTES + int(size(BUFR),8)*K34_8
1822 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
1823.AND..GT.
IF ( I_AM_SLAVE id%NSLAVES 1 ) THEN
1827 ZMUMPS_LBUF_INT = ( 20 + id%NSLAVES * id%NSLAVES * 4 )
1829 CALL ZMUMPS_BUF_ALLOC_SMALL_BUF( ZMUMPS_LBUF_INT, IERR )
1830.NE.
IF ( IERR 0 ) THEN
1832 INFO(2) = ZMUMPS_LBUF_INT
1834 WRITE(LP,*) id%MYID,
1835 & ':error allocating small send buffer:ierr=
',IERR
1850 & (int(MSG_MAX_BYTES_SOLVE,8)+2_8*int(KEEP(34),8))*
1853 ZMUMPS_LBUF_8 = min(ZMUMPS_LBUF_8, 100000000_8)
1856 ZMUMPS_LBUF_8 = max(ZMUMPS_LBUF_8,
1857 & int((MSG_MAX_BYTES_SOLVE+2*KEEP(34)),8) *
1858 & int(min(id%NSLAVES,3),8) )
1859 ZMUMPS_LBUF_8 = ZMUMPS_LBUF_8 + 2_8*int(KEEP(34),8)
1863 ZMUMPS_LBUF_8 = min(ZMUMPS_LBUF_8,
1865 & - 10_8*int(KEEP(34),8)
1867 ZMUMPS_LBUF = int(ZMUMPS_LBUF_8, kind(ZMUMPS_LBUF))
1868 CALL ZMUMPS_BUF_ALLOC_CB( ZMUMPS_LBUF, IERR )
1869.NE.
IF ( IERR 0 ) THEN
1871 INFO(2) = ZMUMPS_LBUF/KEEP(34) + 1
1873 WRITE(LP,*) id%MYID,
1874 & ':error allocating send buffer:ierr=
', IERR
1883 IF ( POSTPros ) THEN
1887.NE.
IF ( id%MYID MASTER ) THEN
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.GT.
IF ( IERR 0 ) THEN
1896 WRITE(LP,*) 'error
while allocating rhs on a slave
'
1907.NE..OR..NE.
DO_NBSPARSE = ( ( (KEEP(237)0)(KEEP(235)0) )
1909.NE.
& ( KEEP(497)0 )
1911 IF ( I_AM_SLAVE ) THEN
1912 IF(DO_NBSPARSE) THEN
1914 LPTR_RHS_BOUNDS = 2*KEEP(28)
1915 ALLOCATE(RHS_BOUNDS(LPTR_RHS_BOUNDS), STAT=IERR)
1918 INFO(2)=LPTR_RHS_BOUNDS
1920 WRITE(LP,*) 'error
while allocating rhs_bounds on
',
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
1931 PTR_RHS_BOUNDS => IDUMMY_TARGET
1935 IF ( I_AM_SLAVE ) THEN
1936.EQ..AND..EQ.
IF ((KEEP(221)2 KEEP(252)0)) THEN
1939.NOT.
IF (associated(id%RHSCOMP)) THEN
1946.NOT..OR.
IF (associated(id%POSINRHSCOMP_ROW) ) !
1947.NOT.
! & (id%POSINRHSCOMP_COL_ALLOC))
1953.not.
IF (id%POSINRHSCOMP_COL_ALLOC) THEN
1957 id%POSINRHSCOMP_COL => id%POSINRHSCOMP_ROW
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)
1971 ALLOCATE (id%POSINRHSCOMP_ROW(id%N), stat = allocok)
1972.GT.
IF ( allocok 0 ) THEN
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.
1988.EQ..OR..NE.
IF ((KEEP(50)0)KEEP(237)0) THEN
1989 ALLOCATE (id%POSINRHSCOMP_COL(id%N), stat = allocok)
1990.GT.
IF ( allocok 0 ) THEN
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)
2001 id%POSINRHSCOMP_COL => id%POSINRHSCOMP_ROW
2002 id%POSINRHSCOMP_COL_ALLOC = .FALSE.
2004.NE.
IF (KEEP(221)2) THEN
2007 IF (associated(id%RHSCOMP)) THEN
2008 NB_BYTES = NB_BYTES - id%KEEP8(25)*K35_8
2009 DEALLOCATE(id%RHSCOMP)
2019 LIWK_SOLVE = 2 * KEEP(28) + id%NA(1)+1
2020 LIWK_PTRACB= KEEP(28)
2023.EQ.
IF (KEEP(201)1) THEN
2024 LIWK_SOLVE = LIWK_SOLVE + KEEP(228) + 1
2027 LIWK_SOLVE = LIWK_SOLVE + 1
2029 ALLOCATE ( IWK_SOLVE(LIWK_SOLVE),
2030 & PTRACB(LIWK_PTRACB), stat = allocok )
2031.GT.
IF (allocok 0 ) THEN
2033 INFO(2)=LIWK_SOLVE + LIWK_PTRACB*KEEP(10)
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)
2043 LIWCB = 20*NB_K133*2 + KEEP(133)
2044 ALLOCATE ( IWCB( LIWCB), stat = allocok )
2045.GT.
IF (allocok 0 ) THEN
2050 NB_BYTES = NB_BYTES + int(LIWCB,8)*K34_8
2051 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2062 ALLOCATE(SRW3(KEEP(133)), stat = allocok )
2063.GT.
IF ( allocok 0 ) THEN
2068 NB_BYTES = NB_BYTES + int(size(SRW3),8)*K35_8
2069 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2082 IF (allocated(UNS_PERM_INV)) DEALLOCATE(UNS_PERM_INV)
2083 UNS_PERM_INV_NEEDED_INMAINLOOP = .FALSE.
2084.eq..AND..GT..AND.
IF ( ( id%MYID MASTER(KEEP(23)0)
2085.NE..AND..NE.
& (MTYPE 1)(KEEP(248)0)
2089.OR..NE..AND..NE.
& ( KEEP(237)0 KEEP(23)0 )
2107 UNS_PERM_INV_NEEDED_INMAINLOOP = .TRUE.
2109 UNS_PERM_INV_NEEDED_BEFMAINLOOP = .FALSE.
2110.GT..AND.
IF ( KEEP(23) 0
2111.NE..AND..EQ.
& MTYPE 1 KEEP(248)-1 ) THEN
2116 UNS_PERM_INV_NEEDED_BEFMAINLOOP = .TRUE.
2118.OR.
IF ( UNS_PERM_INV_NEEDED_INMAINLOOP
2119 & UNS_PERM_INV_NEEDED_BEFMAINLOOP ) THEN
2120 ALLOCATE(UNS_PERM_INV(id%N),stat=allocok)
2121.GT.
if (allocok 0 ) THEN
2126 NB_BYTES = NB_BYTES + int(id%N,8)*K34_8
2127 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2128.EQ.
IF (id%MYIDMASTER) THEN
2131 UNS_PERM_INV(id%UNS_PERM(I))=I
2136 ALLOCATE(UNS_PERM_INV(1), stat=allocok)
2137.GT.
if (allocok 0 ) THEN
2142 NB_BYTES = NB_BYTES + 1_8*K34_8
2143 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2148 CALL VTEND(glob_comm_ini,IERR)
2154 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2156.LT.
IF (INFO(1) 0 ) GOTO 90
2159.NE..AND.
IF ( KEEP(23)0
2160.NE..OR.
& ( KEEP(237)0
2161.NE..AND..EQ.
& ( MTYPE1 KEEP(248)-1 ) ) ) THEN
2163 CALL MPI_BCAST( UNS_PERM_INV,id%N,MPI_INTEGER,MASTER,
2170.AND..EQ.
IF (I_AM_SLAVE KEEP(248)-1) THEN
2172 ALLOCATE(MAP_RHS_loc(max(id%Nloc_RHS,1)), stat=allocok)
2173.GT.
IF (allocok 0) THEN
2175 id%INFO(2)=max(id%Nloc_RHS,1)
2178 NB_BYTES = NB_BYTES + max(int(id%Nloc_RHS,8),1_8)*K34_8
2183 BUILD_RHSMAPINFO = .TRUE.
2185 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2187.LT.
IF ( INFO(1) 0 ) GOTO 90
2192.AND..GT..AND..EQ.
IF ( I_AM_SLAVE KEEP(23)0 KEEP(248)-1
2193.AND..NE.
& MTYPE1 ) THEN
2194.GT.
IF (id%Nloc_RHS 0) THEN
2195 ALLOCATE(IRHS_loc_PTR(id%Nloc_RHS),stat=allocok)
2196.GT.
IF (allocok0) THEN
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.GE..AND..LE.
IF (id%IRHS_loc(I)1 id%IRHS_loc(I)id%N)
2207 IRHS_loc_PTR(I)=UNS_PERM_INV(id%IRHS_loc(I))
2210 IRHS_loc_PTR(I)=id%IRHS_loc(I)
2217.AND.
IF (UNS_PERM_INV_NEEDED_BEFMAINLOOP
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)) ! to posibly pass it as an argument
2222 NB_BYTES = NB_BYTES + K34_8
2224.AND..EQ.
IF (LSCAL id%KEEP(248)-1) THEN
2227 IF (MTYPE == 1) THEN
2229 scaling_data_dr%SCALING=>id%ROWSCA
2232 scaling_data_dr%SCALING=>id%COLSCA
2234 CALL ZMUMPS_SET_SCALING_LOC( scaling_data_dr, id%N,
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) )
2245 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2247.LT.
IF ( INFO(1) 0 ) GOTO 90
2252 IF ( ICNTL21==1 ) THEN
2257.NE.
IF (id%MYIDMASTER) THEN
2258 IF (MTYPE == 1) THEN
2259 ALLOCATE(id%COLSCA(id%N),stat=allocok)
2261 ALLOCATE(id%ROWSCA(id%N),stat=allocok)
2263 IF (allocok > 0) THEN
2265 WRITE(LP,*) 'error allocating temporary scaling array
'
2271 NB_BYTES = NB_BYTES + int(id%N,8)*K16_8
2272 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2273.NE.
ENDIF ! MYID MASTER
2274 37 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2276.LT.
IF (INFO(1) 0 ) GOTO 90
2277 IF (I_AM_SLAVE) THEN
2278 ALLOCATE(scaling_data_sol%SCALING_LOC(id%KEEP(89)),
2280 IF (allocok > 0) THEN
2282 WRITE(LP,*) 'error allocating local scaling array
'
2288 NB_BYTES = NB_BYTES + int(id%KEEP(89),8)*K16_8
2289 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2292 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2294.LT.
IF (INFO(1) 0 ) THEN
2297 IF (MTYPE == 1) THEN
2298 CALL MPI_BCAST(id%COLSCA(1),id%N,
2299 & MPI_DOUBLE_PRECISION,MASTER,
2301 scaling_data_sol%SCALING=>id%COLSCA
2303 CALL MPI_BCAST(id%ROWSCA(1),id%N,
2304 & MPI_DOUBLE_PRECISION,MASTER,
2306 scaling_data_sol%SCALING=>id%ROWSCA
2309 IF ( I_AM_SLAVE ) THEN
2313 LIW_PASSED=max(1,LIW)
2317.GT.
IF (KEEP(89) 0) THEN
2318 CALL ZMUMPS_DISTSOL_INDICES( MTYPE, id%ISOL_loc(1),
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
2325.EQ.
& , (KEEP(248)-1), IRHS_loc_PTR(1), id%Nloc_RHS
2328.NE..AND.
IF (id%MYIDMASTER LSCAL) THEN
2333 IF (MTYPE == 1) THEN
2334 DEALLOCATE(id%COLSCA)
2337 DEALLOCATE(id%ROWSCA)
2340 NB_BYTES = NB_BYTES - int(id%N,8)*K16_8
2343.NE..AND.
IF (KEEP(23) 0 MTYPE==1) THEN
2346.NE.
IF (id%MYIDMASTER) THEN
2347 ALLOCATE(id%UNS_PERM(id%N),stat=allocok)
2348 IF (allocok > 0) THEN
2358 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2360.LT.
IF (INFO(1) 0 ) GOTO 90
2363.NE..AND.
IF (KEEP(23) 0 MTYPE==1) THEN
2364 CALL MPI_BCAST(id%UNS_PERM(1),id%N,MPI_INTEGER,MASTER,
2366 IF (I_AM_SLAVE) THEN
2368 id%ISOL_loc(I) = id%UNS_PERM(id%ISOL_loc(I))
2371.NE.
IF (id%MYIDMASTER) THEN
2372 DEALLOCATE(id%UNS_PERM)
2373 NULLIFY(id%UNS_PERM)
2384.EQ..OR.
IF ( ( KEEP(221) 1 )
2385.EQ.
& ( KEEP(221) 2 )
2389.EQ.
IF (KEEP(46)1) THEN
2390 MASTER_ROOT_IN_COMM=MASTER_ROOT
2392 MASTER_ROOT_IN_COMM =MASTER_ROOT+1
2394.EQ.
IF ( id%MYID MASTER ) THEN
2399.EQ.
IF (id%NRHS1) THEN
2400 LD_REDRHS = id%KEEP(116)
2402 LD_REDRHS = id%LREDRHS
2405.NE.
IF (MASTERMASTER_ROOT_IN_COMM) THEN
2410.EQ.
IF ( id%MYID MASTER ) THEN
2413 CALL MPI_SEND(LD_REDRHS,1,MPI_INTEGER,
2414 & MASTER_ROOT_IN_COMM, 0, id%COMM,IERR)
2415.EQ.
ELSEIF ( id%MYIDMASTER_ROOT_IN_COMM) THEN
2417 CALL MPI_RECV(LD_REDRHS,1,MPI_INTEGER,
2418 & MASTER, 0, id%COMM,STATUS,IERR)
2424 IF ( KEEP(248)==1 ) THEN ! Sparse RHS (A-1 or general sparse)
2425! JBEG_RHS - current starting column within A-1 or sparse rhs
2426! set in the loop below and used to obtain the
2427! global index of the column of the sparse RHS
2428! Also used to get index in global permutation.
2429! It also allows to skip empty columns;
2430 JEND_RHS = 0 ! last column in current blockin A-1
2433 IF (DO_PERMUTE_RHS) THEN
2435 ALLOCATE(PERM_RHS(id%NRHS),stat=allocok)
2436 IF (allocok > 0) THEN
2441 NB_BYTES = NB_BYTES + int(id%NRHS,8)*K34_8
2442 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2443.EQ.
IF (id%MYIDMASTER) THEN
2450.EQ.
IF (KEEP(237)0) THEN
2455 CALL ZMUMPS_PERMUTE_RHS_GS(
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,
2464 GOTO 109 ! propagate error
2473 STRAT_PERMAM1 = KEEP(242)
2474 CALL ZMUMPS_PERMUTE_RHS_AM1
2475 & (STRAT_PERMAM1, id%SYM_PERM(1),
2476 & id%IRHS_PTR(1), id%NRHS+1,
2477 & PERM_RHS, id%NRHS,
2494.NOT.
IF ( allocated(PERM_RHS)) THEN
2495 ALLOCATE(PERM_RHS(1),stat=allocok)
2496 IF (allocok > 0) THEN
2501 NB_BYTES = NB_BYTES + int(size(PERM_RHS),8)*K34_8
2502 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2505109 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2507.LT.
IF (INFO(1) 0 ) GOTO 90
2510.EQ.
IF (id%NSLAVES 1) THEN
2514.AND..NE.
IF (DO_PERMUTE_RHS KEEP(111)0 ) THEN
2518 WRITE(*,*) id%MYID, ':internal error 1 :
',
2519 & ' permute rhs during null space computation
',
2520 & ' not available yet
'
2522 ENDIF ! End Permute_RHS
2524.AND..NE.
IF (DO_PERMUTE_RHS KEEP(111)0 ) THEN
2525 WRITE(*,*) id%MYID, ':internal error 2 :
',
2526 & ' permute rhs during null space computation
',
2527 & ' not available yet
'
2531 ENDIF ! End DO_PERMUTE_RHS
2532.AND..NE.
IF (INTERLEAVE_PAR (KEEP(111)0)) THEN
2533 WRITE(*,*) id%MYID, ':internal error 3 :
',
2534 & ' interleave rhs during null space computation
',
2535 & ' not available yet
'
2538.AND..EQ.
IF (INTERLEAVE_PARKEEP(111)0) THEN
2541.EQ.
IF (id%MYIDMASTER) THEN
2544 SIZE_WORKING = id%IPTR_WORKING(id%NPROCS+1)-1
2545 SIZE_IPTR_WORKING = id%NPROCS+1
2546 CALL ZMUMPS_INTERLEAVE_RHS_AM1(
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,
2555.NE.
& KEEP(495)0, KEEP(496), PROKG, MPG
2558 ENDIF ! End A-1 and INTERLEAVE_PAR
2560 ENDIF ! End Parallel Case
2563.AND..EQ.
IF (DO_PERMUTE_RHS(KEEP(111)0)) THEN
2567 CALL MPI_BCAST(PERM_RHS(1),
2570 & MASTER, id%COMM,IERR)
2573.GT.
IF (KEEP(401) 0) THEN
2578.GT.
IF ( KEEP(400) 0 ) THEN
2583!$ NOMP=omp_get_max_threads()
2584.NE.
IF (KEEP(400)NOMP) THEN
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
2595.GT.
IF (KEEP(400) 0) THEN
2596 CALL ZMUMPS_SOL_L0OMP_LI(KEEP(400))
2611.LE.
DO WHILE (BEG_RHSNRHS_NONEMPTY)
2625 NBRHS_EFF = min(NRHS_NONEMPTY-BEG_RHS+1, NBRHS)
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)
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)
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)
2659.NE.
& ( id%MYID MASTER )
2665.AND..EQ..AND.
& ( I_AM_SLAVE id%MYID MASTER
2666.NE..AND.
& ICNTL21 0
2667.ne..OR..EQ.
& ( KEEP(248)0 KEEP(221)2
2668.OR..NE.
& KEEP(111)0 )
2676.EQ..AND..NE.
& ( id%MYID MASTER (KEEP(237)0) )
2682.eq.
! (id%MYID MASTER)
2683 IF ( associated(id%RHS) ) THEN
2685 LD_RHS = max(id%LRHS, id%N)
2690 IBEG = int(BEG_RHS-1,8) * int(LD_RHS,8) + 1_8
2700.EQ..AND.
IF ( (id%MYIDMASTER)
2701 & KEEP(248)==1 ) THEN
2704 JBEG_RHS = JEND_RHS + 1
2705.OR.
IF (DO_PERMUTE_RHSINTERLEAVE_PAR) THEN
2706.EQ.
DO WHILE ( id%IRHS_PTR(PERM_RHS(JBEG_RHS))
2707 & id%IRHS_PTR(PERM_RHS(JBEG_RHS)+1) )
2709.EQ..AND..EQ..AND.
IF ((KEEP(237)0)(ICNTL210)
2710.NE.
& (KEEP(221)1) ) THEN
2715 id%RHS(int(PERM_RHS(JBEG_RHS) -1,8)*int(LD_RHS,8)+
2719 JBEG_RHS = JBEG_RHS +1
2722.EQ.
DO WHILE( id%IRHS_PTR(JBEG_RHS)
2723 & id%IRHS_PTR(JBEG_RHS+1) )
2724.EQ..AND..EQ..AND.
IF ((KEEP(237)0)(ICNTL210)
2725.NE.
& (KEEP(221)1) ) THEN
2730 id%RHS(int(JBEG_RHS -1,8)*int(LD_RHS,8) +
2734.EQ.
IF (KEEP(221)1) THEN
2736 DO I = 1, id%SIZE_SCHUR
2737 id%REDRHS(int(JBEG_RHS-1,8)*int(LD_REDRHS,8) +
2741 JBEG_RHS = JBEG_RHS +1
2743.OR.
ENDIF ! End DO_PERMUTE_RHSINTERLEAVE_PAR
2750 NB_RHSSKIPPED = JBEG_RHS - (JEND_RHS + 1)
2751.EQ..AND..EQ.
IF ((KEEP(248)1)(KEEP(237)0)
2752.AND..EQ.
& (ICNTL210))
2754 ! case of general sparse rhs with centralized solution,
2755 !set IBEG to shifted columns
2756 ! (after empty columns have been skipped)
2757 IBEG = int(JBEG_RHS-1,8) * int(LD_RHS,8) + 1_8
2759.EQ..AND.
ENDIF ! of if (id%MYIDMASTER) KEEP(248)==1
2760 CALL MPI_BCAST( JBEG_RHS, 1, MPI_INTEGER,
2761 & MASTER, id%COMM, IERR )
2765.EQ..AND..NE.
IF (id%MYIDMASTER KEEP(221)0) THEN
2768 IBEG_REDRHS= int(JBEG_RHS-1,8)*int(LD_REDRHS,8) + 1_8
2770 IBEG_REDRHS=-142424_8 ! Should not be used
2778 CALL VTBEGIN(perm_scal_ini,IERR)
2780.eq.
IF (id%MYID MASTER) THEN
2782 IF (KEEP(248)==1) THEN
2808 STOP_AT_NEXT_EMPTY_COL = .FALSE.
2809 DO I=JBEG_RHS, id%NRHS
2810 NBCOL_INBLOC = NBCOL_INBLOC +1
2811.OR.
IF (DO_PERMUTE_RHSINTERLEAVE_PAR) THEN
2816 COLSIZE = id%IRHS_PTR(PERM_RHS(I)+1)
2817 & - id%IRHS_PTR(PERM_RHS(I))
2819 COLSIZE = id%IRHS_PTR(I+1) - id%IRHS_PTR(I)
2821.NOT..AND..GT..AND.
IF ((STOP_AT_NEXT_EMPTY_COL)(COLSIZE0)
2822.EQ.
& (KEEP(237)0)) THEN
2825 STOP_AT_NEXT_EMPTY_COL =.TRUE.
2830 NZ_THIS_BLOCK = NZ_THIS_BLOCK + COLSIZE
2831 ELSE IF (STOP_AT_NEXT_EMPTY_COL) THEN
2834 NBCOL_INBLOC = NBCOL_INBLOC -1
2838.EQ.
IF (NBCOLNBRHS_EFF) EXIT
2840.EQ.
IF (NZ_THIS_BLOCK0) THEN
2841 WRITE(*,*) " Internal Error 16 in sol driver NZ_THIS_BLOCK=",
2846.NE..AND..NE.
IF (NBCOLNBRHS_EFF (KEEP(237)0)
2847.AND..NE.
& KEEP(221)1) THEN
2855 WRITE(6,*) ' internal error 8 in solution driver
',
2861.NE.
IF (NZ_THIS_BLOCK 0) THEN
2866 ALLOCATE(IRHS_PTR_COPY(NBCOL_INBLOC+1),stat=allocok)
2867.GT.
if (allocok 0 ) then
2869 INFO(2)=NBCOL_INBLOC+1
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)
2876 JEND_RHS =JBEG_RHS + NBCOL_INBLOC - 1
2880.OR.
IF (DO_PERMUTE_RHSINTERLEAVE_PAR) THEN
2883 DO I=JBEG_RHS, JBEG_RHS + NBCOL_INBLOC -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
2893 DO I=JBEG_RHS, JBEG_RHS + NBCOL_INBLOC -1
2895 IRHS_PTR_COPY(J) = IPOS
2896 COLSIZE = id%IRHS_PTR(I+1)
2898 IPOS = IPOS + COLSIZE
2900.OR.
ENDIF ! End DO_PERMUTE_RHSINTERLEAVE_PAR
2901 IRHS_PTR_COPY(NBCOL_INBLOC+1)= IPOS
2902.NE.
IF ( IPOS-1 NZ_THIS_BLOCK ) THEN
2903 WRITE(*,*) "Error in compressed copy of IRHS_PTR"
2911.NE..and..NE.
IF (KEEP(23) 0 MTYPE 1) THEN
2913 ALLOCATE(IRHS_SPARSE_COPY(NZ_THIS_BLOCK)
2915.GT.
if (allocok 0 ) then
2917 INFO(2)=NZ_THIS_BLOCK
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.OR..OR.
ELSE IF (DO_PERMUTE_RHSINTERLEAVE_PAR
2924.NE.
& (KEEP(237)0)) THEN
2931 ALLOCATE(IRHS_SPARSE_COPY(NZ_THIS_BLOCK),
2933.GT.
IF (allocok 0 ) THEN
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)
2944 IF (IRHS_SPARSE_COPY_ALLOCATED) THEN
2945.OR.
IF ( DO_PERMUTE_RHSINTERLEAVE_PAR ) THEN
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
2956 IRHS_SPARSE_COPY = id%IRHS_SPARSE(
2957 & id%IRHS_PTR(JBEG_RHS):
2958 & id%IRHS_PTR(JBEG_RHS)+NZ_THIS_BLOCK-1)
2964 & id%IRHS_SPARSE(id%IRHS_PTR(JBEG_RHS):
2965 & id%IRHS_PTR(JBEG_RHS)+NZ_THIS_BLOCK-1)
2967.OR..OR..OR.
IF (LSCALDO_PERMUTE_RHSINTERLEAVE_PAR
2968.NE.
& (KEEP(237)0)) THEN
2975 ALLOCATE(RHS_SPARSE_COPY(NZ_THIS_BLOCK),
2977.GT.
IF (allocok 0 ) THEN
2979 INFO(2)=NZ_THIS_BLOCK
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)
2986 IF ( KEEP(248)==1 ) THEN
2989 & => id%RHS_SPARSE(id%IRHS_PTR(JBEG_RHS):
2990 & id%IRHS_PTR(JBEG_RHS)+NZ_THIS_BLOCK-1)
2994 & => id%RHS_SPARSE(id%IRHS_PTR(BEG_RHS):
2995 & id%IRHS_PTR(BEG_RHS)+NZ_THIS_BLOCK-1)
2998.OR..OR.
IF (DO_PERMUTE_RHSINTERLEAVE_PAR
2999.NE.
& (id%KEEP(237)0)) THEN
3000.NE.
IF (id%KEEP(237)0) THEN
3003 RHS_SPARSE_COPY = ONE
3004.NOT.
ELSE IF ( LSCAL) THEN
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.EQ.
IF (COLSIZE 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
3021.NE.
IF (KEEP(23) 0) THEN
3024.NE.
IF (MTYPE 1) THEN
3039 DO I=1, NBCOL_INBLOC
3042 COLSIZE = IRHS_PTR_COPY(I+1) - IRHS_PTR_COPY(I)
3044 JPERM = UNS_PERM_INV(IRHS_SPARSE_COPY(IPOS+K-1))
3045 IRHS_SPARSE_COPY(IPOS+K-1) = JPERM
3047 IPOS = IPOS + COLSIZE
3050.NE.
ENDIF ! KEEP(23)0
3051.NE.
ENDIF ! NZ_THIS_BLOCK 0
3053 ENDIF ! ============ KEEP(248)==1
3055.eq.
ENDIF ! (id%MYID MASTER)
3059 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
3061.LT.
IF (INFO(1) 0 ) GOTO 90
3065 IF (KEEP(248)==1) THEN
3066 CALL MPI_BCAST( NBCOL_INBLOC,1, MPI_INTEGER,
3067 & MASTER, id%COMM,IERR)
3069 NBCOL_INBLOC = NBRHS_EFF
3071 JEND_RHS =JBEG_RHS + NBCOL_INBLOC - 1
3072.eq..AND..EQ.
IF ((KEEP(111)0)(KEEP(252)0)
3073.AND..NE..AND..EQ.
& (KEEP(221)2 )(KEEP(248)1) ) THEN
3077 CALL MPI_BCAST( NZ_THIS_BLOCK,1, MPI_INTEGER,
3078 & MASTER, id%COMM,IERR)
3079.NE..and..NE.
IF (id%MYIDMASTER NZ_THIS_BLOCK0) THEN
3080 ALLOCATE(IRHS_SPARSE_COPY(NZ_THIS_BLOCK),
3082.GT.
if (allocok 0 ) then
3084 INFO(2)=NZ_THIS_BLOCK
3087 IRHS_SPARSE_COPY_ALLOCATED=.TRUE.
3093 ALLOCATE(RHS_SPARSE_COPY(NZ_THIS_BLOCK),
3095.GT.
if (allocok 0 ) then
3097 INFO(2)=NZ_THIS_BLOCK
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)
3104 ALLOCATE(IRHS_PTR_COPY(NBCOL_INBLOC+1),stat=allocok)
3105.GT.
if (allocok 0 ) then
3107 INFO(2)=NBCOL_INBLOC+1
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)
3117 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
3119.LT.
IF (INFO(1) 0 ) GOTO 90
3121 IF (NZ_THIS_BLOCK > 0) THEN
3122 CALL MPI_BCAST(IRHS_SPARSE_COPY(1),
3125 & MASTER, id%COMM,IERR)
3126 CALL MPI_BCAST(IRHS_PTR_COPY(1),
3129 & MASTER, id%COMM,IERR)
3131 WRITE (*,*)'not ok
for alloc ptr on slaves
'
3141 IF ( I_AM_SLAVE ) THEN
3171.EQ..AND..EQ.
IF ( KEEP(221)2 KEEP(252)0
3172.AND..NE..OR..EQ.
& (KEEP(248)1 (id%NRHS1))
3185 BUILD_POSINRHSCOMP = .FALSE.
3190 IF (BUILD_POSINRHSCOMP) THEN
3195 BUILD_POSINRHSCOMP = .FALSE.
3196! POSINRHSCOMP does not change between blocks
3199.NE..OR..NE..OR.
IF ( (KEEP(111)0) (KEEP(237)0)
3200.NE.
& (KEEP(252)0) ) THEN
3202.NE.
IF (KEEP(111)0) THEN
3215.NE.
ELSE IF (KEEP(252)0) THEN
3217 MTYPE_LOC = 1 ! (no transpose)
3222 BUILD_POSINRHSCOMP = .TRUE.
3226 LIW_PASSED=max(1,LIW)
3227.EQ.
IF (KEEP(237)0) THEN
3228 CALL ZMUMPS_BUILD_POSINRHSCOMP(
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,
3237 & NBENT_RHSCOMP, NB_FS_RHSCOMP_TOT )
3238 NB_FS_RHSCOMP_F = NB_FS_RHSCOMP_TOT
3240 CALL ZMUMPS_BUILD_POSINRHSCOMP_AM1(
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,
3249 & IRHS_PTR_COPY(1), NBCOL_INBLOC, IRHS_SPARSE_COPY(1),
3250 & NZ_THIS_BLOCK,PERM_RHS, size(PERM_RHS) , JBEG_RHS,
3252 & NB_FS_RHSCOMP_F, NB_FS_RHSCOMP_TOT,
3253 & UNS_PERM_INV, size(UNS_PERM_INV) ! size 1 if not used
3256 ENDIF ! BUILD_POSINRHSCOMP=.TRUE.
3257.AND..EQ.
IF (BUILD_RHSMAPINFO KEEP(248)-1) THEN
3262 CALL MUMPS_SOL_RHSMAPINFO( id%N, id%Nloc_RHS, id%KEEP(89),
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.
3270 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
3272.LT.
IF (INFO(1) 0 ) GOTO 90
3273 IF (I_AM_SLAVE) THEN
3274.EQ.
IF (KEEP(221)1) THEN
3280.not.
IF ( associated(id%RHSCOMP)) THEN
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.GT.
IF ( allocok 0 ) THEN
3293 CALL MUMPS_SET_IERROR(id%KEEP8(25),INFO(2))
3297 NB_BYTES = NB_BYTES + id%KEEP8(25)*K35_8
3298 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
3301.NE..AND.
IF ((KEEP(221)1)
3302.NE..OR..NE.
& ((KEEP(221)2)(KEEP(252)0))
3308 LD_RHSCOMP = max(NBENT_RHSCOMP, LD_RHSCOMP)
3310 IF (associated(id%RHSCOMP)) THEN
3311.LT.
IF ( (id%KEEP8(25)int(LD_RHSCOMP,8)*int(NBRHS,8))
3312.OR..NE..OR..NE.
& (KEEP(235)0)(KEEP(237)0) ) THEN
3313 ! deallocate and reallocate if:
3314 ! _larger array needed
3316 ! _exploit sparsity/A-1: since size of RHSCOMP
3317 ! is expected to vary much in these cases
3318 ! this should improve locality
3319 NB_BYTES = NB_BYTES - id%KEEP8(25)*K35_8
3320 DEALLOCATE(id%RHSCOMP)
3325.not.
IF ( 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.GT.
IF ( allocok 0 ) THEN
3331 CALL MUMPS_SET_IERROR(id%KEEP8(25),INFO(2))
3334 NB_BYTES = NB_BYTES + id%KEEP8(25)*K35_8
3335 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
3338.EQ.
IF (KEEP(221)2) THEN
3341 ! Not correct: LD_RHSCOMP = LENRHSCOMP/id%NRHS_NONEMPTY
3342 LD_RHSCOMP = int(id%KEEP8(25)/int(id%NRHS,8))
3347.EQ.
IF ( KEEP(221)0 ) THEN
3353 IBEG_RHSCOMP= int(JBEG_RHS-1,8)*int(LD_RHSCOMP,8) + 1_8
3358 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
3360.LT.
IF (INFO(1) 0 ) GOTO 90
3367.eq.
IF (id%MYID MASTER) THEN
3369.NE.
IF (KEEP(23) 0) THEN
3372.NE.
IF (MTYPE 1) THEN
3382 IF (KEEP(248)==0) THEN
3386 ALLOCATE( C_RW2( id%N ),stat =allocok )
3387.GT.
IF ( allocok 0 ) THEN
3391 WRITE(LP,*) id%MYID,
3392 & ':error allocating c_rw2 in zmumps_solve_drive
'
3398 KDEC = IBEG+int(K-1,8)*int(LD_RHS,8)
3400 C_RW2(I)=id%RHS(I-1+KDEC)
3403 JPERM = id%UNS_PERM(I)
3404 id%RHS(I-1+KDEC) = C_RW2(JPERM)
3413 IF ( KEEP(248) == 0 ) THEN
3415 KDEC = IBEG+int(K-1,8)*int(LD_RHS,8)
3417 SAVERHS(I+(K-1)*id%N) = id%RHS(KDEC+I-1)
3420 ELSE IF (KEEP(248)==1) THEN
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)
3435 IF (KEEP(248)==0) THEN
3437.EQ.
IF (MTYPE 1) THEN
3440 KDEC = int(K-1,8) * int(LD_RHS,8) + int(IBEG-1,8)
3442 id%RHS(KDEC+I) = id%RHS(KDEC+I) *
3449 KDEC = int(K-1,8) * int(LD_RHS,8) + int(IBEG-1,8)
3451 id%RHS(KDEC+I) = id%RHS(KDEC+I) *
3456 ELSE IF (KEEP(248)==1) THEN
3460 KDEC=int(id%IRHS_PTR(JBEG_RHS),8)
3462.AND.
IF ((KEEP(248)==1)
3463.OR..OR.
& (DO_PERMUTE_RHSINTERLEAVE_PAR
3464.NE.
& (id%KEEP(237)0))
3471 DO I=JBEG_RHS, JBEG_RHS + NBCOL_INBLOC -1
3472.OR.
IF (DO_PERMUTE_RHSINTERLEAVE_PAR) THEN
3477 COLSIZE = IRHS_PTR_COPY(J+1) - IRHS_PTR_COPY(J)
3479.EQ.
IF (COLSIZE 0) CYCLE
3480.NE.
IF (id%KEEP(237)0) THEN
3481.OR.
IF (DO_PERMUTE_RHSINTERLEAVE_PAR) THEN
3486 RHS_SPARSE_COPY(IPOS) = id%ROWSCA(IPERM) *
3489 RHS_SPARSE_COPY(IPOS) = id%ROWSCA(I) * ONE
3505 II = IRHS_SPARSE_COPY(
3506 & IRHS_PTR_COPY(I-JBEG_RHS+1)
3510.EQ.
IF (MTYPE1) THEN
3511 RHS_SPARSE_COPY(IPOS+K-1) =
3512 & id%RHS_SPARSE(id%IRHS_PTR(IPERM)+K-1)*
3515 RHS_SPARSE_COPY(IPOS+K-1) =
3516 & id%RHS_SPARSE(id%IRHS_PTR(IPERM)+K-1)*
3521 IPOS = IPOS + COLSIZE
3524 ! general sparse RHS
3525 ! without permutation
3526.eq.
IF (MTYPE 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)*
3533 DO IZ=1,NZ_THIS_BLOCK
3534 I=IRHS_SPARSE_COPY(IZ)
3535 RHS_SPARSE_COPY(IZ)=id%RHS_SPARSE(KDEC+IZ-1)*
3540 ENDIF ! KEEP(248)==1
3542.EQ.
ENDIF ! id%MYIDMASTER
3544 CALL VTEND(perm_scal_ini,IERR)
3550.EQ..AND..EQ.
IF ((KEEP(248)1)(KEEP(237)0)) THEN
3551 ! case of general sparse: in case of empty columns
3552 ! modifed version of
3553 ! NBRHS_EFF need be broadcasted since it is used
3554 ! to update BEG_RHS at the end of the DO WHILE
3555 CALL MPI_BCAST( NBRHS_EFF,1, MPI_INTEGER,
3556 & MASTER, id%COMM,IERR)
3557 CALL MPI_BCAST(NB_RHSSKIPPED,1,MPI_INTEGER,MASTER,
3571 CALL VTBEGIN(soln_dist,IERR)
3573 TIMESCATTER1=MPI_WTIME()
3574.eq..AND..EQ.
IF ((KEEP(111)0)(KEEP(252)0)
3575.AND..NE.
& (KEEP(221)2 )) THEN
3580 IF (KEEP(248) == 0) THEN
3584.NOT.
IF ( I_AM_SLAVE ) THEN
3586 CALL ZMUMPS_SCATTER_RHS(id%NSLAVES,id%N, id%MYID,
3588 & MTYPE, id%RHS(IBEG), LD_RHS, NBRHS_EFF,
3592 & JDUMMY, id%KEEP(1), id%KEEP8(1), id%PROCNODE_STEPS(1),
3595 & id%ICNTL(1),id%INFO(1))
3597.eq.
IF (id%MYID MASTER) THEN
3600 NCOL_RHS_loc = NBRHS_EFF
3603 PTR_RHS => CDUMMY_TARGET
3608 LIW_PASSED = max( LIW, 1 )
3609 CALL ZMUMPS_SCATTER_RHS(id%NSLAVES,id%N, id%MYID,
3611 & MTYPE, PTR_RHS(IBEG_loc),LD_RHS_loc,NCOL_RHS_loc,
3613 & id%RHSCOMP(IBEG_RHSCOMP), LD_RHSCOMP, NBRHS_EFF,
3614 & id%POSINRHSCOMP_ROW(1), NB_FS_RHSCOMP_F,
3616 & id%PTLUST_S(1), id%KEEP(1), id%KEEP8(1),
3617 & id%PROCNODE_STEPS(1),
3618 & IS(1), LIW_PASSED,
3620 & id%ICNTL(1),id%INFO(1))
3622.LT.
IF (INFO(1)0) GOTO 90
3623.EQ.
ELSE IF (KEEP(248) -1) THEN
3624 IF (I_AM_SLAVE) THEN
3625.NE.
IF (id%Nloc_RHS 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
3633 CALL ZMUMPS_SCATTER_DIST_RHS(id%NSLAVES, id%N,
3634 & id%MYID_NODES, id%COMM_NODES,
3635 & NBRHS_EFF, id%Nloc_RHS, id%LRHS_loc,
3638 & idRHS_loc(RHS_loc_shift),
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))
3645 NB_BYTES_MAX = max(NB_BYTES_MAX,
3646 & NB_BYTES_MAX+NB_BYTES_LOC)
3648 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
3650.LT.
IF (INFO(1)0) GOTO 90
3655 IF (NZ_THIS_BLOCK > 0) THEN
3656 CALL MPI_BCAST(RHS_SPARSE_COPY(1),
3658 & MPI_DOUBLE_COMPLEX,
3659 & MASTER, id%COMM, IERR)
3664.NE.
IF (KEEP(237)0) THEN
3665 IF ( I_AM_SLAVE ) THEN
3671 K=1 ! Column index in RHSCOMP
3672 id%RHSCOMP(1_8:int(NBRHS_EFF,8)*int(LD_RHSCOMP,8))
3675 DO I = 1, NBCOL_INBLOC
3676 COLSIZE = IRHS_PTR_COPY(I+1) - IRHS_PTR_COPY(I)
3677.GT.
IF (COLSIZE0) THEN
3678 ! Find global column index J and set
3679 ! column K of RHSCOMP to ej (here IBEG is one)
3680 J = I - 1 + JBEG_RHS
3681.OR.
IF (DO_PERMUTE_RHSINTERLEAVE_PAR) THEN
3684 IPOSRHSCOMP = id%POSINRHSCOMP_ROW(J)
3687.GT.
IF (IPOSRHSCOMP0) THEN
3698 id%RHSCOMP(int(K-1,8)*int(LD_RHSCOMP,8)+
3699 & int(IPOSRHSCOMP,8)) =
3700 & RHS_SPARSE_COPY(IPOS)
3701 ENDIF ! End of J on my proc
3703 IPOS = IPOS + COLSIZE ! go to next column
3706.NE.
IF (KNBRHS_EFF+1) THEN
3707 WRITE(6,*) 'internal error 9 in solution driver
',
3720.EQ..AND..GT.
IF ((KEEP(221)1)(NB_RHSSKIPPED0)
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
3729 IF (I_AM_SLAVE) THEN
3730 DO K = 1, NBCOL_INBLOC
3731! it is equal to NBRHS_EFF in this case
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)
3745.LE.
IF ( (IPOSRHSCOMPNB_FS_RHSCOMP_TOT)
3746.AND..GT.
& (IPOSRHSCOMP0) ) THEN
3748 id%RHSCOMP(KDEC+IPOSRHSCOMP)=
3749 & id%RHSCOMP(KDEC+IPOSRHSCOMP) +
3750 & RHS_SPARSE_COPY(IZ)
3756 ENDIF ! ==== KEEP(248)==1 =====
3758 ELSE IF (I_AM_SLAVE) THEN
3759 ! I_AM_SLAVE AND (null space or Fwd in facto)
3760.NE.
IF (KEEP(111)0) THEN
3780.GT.
IF (KEEP(111)0) THEN
3781 IBEG_GLOB_DEF = KEEP(111)
3782 IEND_GLOB_DEF = KEEP(111)
3784 IBEG_GLOB_DEF = BEG_RHS
3785 IEND_GLOB_DEF = BEG_RHS+NBRHS_EFF-1
3787.GT..AND.
IF ( id%KEEP(112) 0 DO_NULL_PIV) THEN
3788.GT.
IF (IBEG_GLOB_DEF id%KEEP(112)) THEN
3790 DO_NULL_PIV = .FALSE.
3792.LT.
IF (IBEG_GLOB_DEF id%KEEP(112)
3793.AND..GT.
& IEND_GLOB_DEF id%KEEP(112)
3794.AND.
& DO_NULL_PIV ) THEN
3801 DO_NULL_PIV = .FALSE.
3804.NE.
IF (id%KEEP(235)0) THEN
3811 NZ_THIS_BLOCK=IEND_GLOB_DEF-IBEG_GLOB_DEF+1
3812 ALLOCATE(IRHS_PTR_COPY(NZ_THIS_BLOCK+1),stat=allocok)
3813.GT.
IF (allocok 0 ) THEN
3815 INFO(2)=NZ_THIS_BLOCK
3818 IRHS_PTR_COPY_ALLOCATED = .TRUE.
3819 ALLOCATE(IRHS_SPARSE_COPY(NZ_THIS_BLOCK),stat=allocok)
3820.GT.
IF (allocok 0 ) THEN
3822 INFO(2)=NZ_THIS_BLOCK
3825 IRHS_SPARSE_COPY_ALLOCATED=.TRUE.
3826 NB_BYTES = NB_BYTES +
3827 & int(NZ_THIS_BLOCK,8)*(K34_8+K34_8)
3829 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
3830.eq.
IF (id%MYIDMASTER) THEN
3831 ! compute IRHS_PTR and IRHS_SPARSE_COPY
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)
3838 IRHS_PTR_COPY(NZ_THIS_BLOCK+1) = NZ_THIS_BLOCK+1
3843 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
3845.LT.
IF (INFO(1) 0 ) GOTO 90
3847 CALL MPI_BCAST(IRHS_SPARSE_COPY(1),
3850 & MASTER, id%COMM,IERR)
3851 CALL MPI_BCAST(IRHS_PTR_COPY(1),
3854 & MASTER, id%COMM,IERR)
3860 KDEC = int(K-1,8) * int(LD_RHSCOMP,8)
3861 id%RHSCOMP(KDEC+1_8:KDEC+int(LD_RHSCOMP,8))=ZERO
3872 DO I=max(IBEG_GLOB_DEF,KEEP(220)),
3873 & min(IEND_GLOB_DEF,KEEP(220)+KEEP(109)-1)
3876 JJ= id%POSINRHSCOMP_ROW(id%PIVNUL_LIST(I-KEEP(220)+1))
3878.EQ.
IF (KEEP(50)0) THEN
3879 ! unsymmetric : always set to fixation
3880 id%RHSCOMP( IBEG_RHSCOMP+
3881 & int(I-IBEG_GLOB_DEF,8)*int(LD_RHSCOMP,8) +
3883 & cmplx(id%DKEEP(2),kind=kind(id%RHSCOMP))
3885 ! Symmetric: always set to one
3886 id%RHSCOMP( IBEG_RHSCOMP+
3887 & int(I-IBEG_GLOB_DEF,8)*int(LD_RHSCOMP,8)+
3893.NE..AND.
IF ( KEEP(17)0
3894.EQ.
& id%MYID_NODESMASTER_ROOT) THEN
3901 IBEG_ROOT_DEF = max(IBEG_GLOB_DEF,KEEP(112)+1)
3902 IEND_ROOT_DEF = min(IEND_GLOB_DEF,KEEP(112)+KEEP(17))
3905 IROOT_DEF_RHS_COL1 = IBEG_ROOT_DEF-IBEG_GLOB_DEF + 1
3908 IBEG_ROOT_DEF = IBEG_ROOT_DEF-KEEP(112)
3909 IEND_ROOT_DEF = IEND_ROOT_DEF-KEEP(112)
3914 IBEG_ROOT_DEF = -90999
3915 IEND_ROOT_DEF = -95999
3916 IROOT_DEF_RHS_COL1= 1
3918 ELSE ! End of null space (test on KEEP(111))
3924 ENDIF ! End of null space (test on KEEP(111))
3926 TIMESCATTER2=MPI_WTIME()-TIMESCATTER1+TIMESCATTER2
3932 IF ( I_AM_SLAVE ) THEN
3934.EQ.
IF ( id%MYID_NODES MASTER_ROOT ) THEN
3936 IF ( associated(id%root%RHS_CNTR_MASTER_ROOT) ) THEN
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)
3943 LPTR_RHS_ROOT = int(size(id%root%RHS_CNTR_MASTER_ROOT),8)
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
3954 IPT_RHS_ROOT = LWCB8 ! Will be passed, but not accessed
3955 PTR_RHS_ROOT => WORK_WCB(IPT_RHS_ROOT:LWCB8)
3956 LWCB8_SOL_C = LWCB8_SOL_C - LPTR_RHS_ROOT
3959.EQ.
IF (KEEP(221) 2 ) THEN
3964.EQ..AND.
IF ( ( id%MYID MASTER_ROOT_IN_COMM )
3965.EQ.
& ( id%MYID MASTER ) ) THEN
3969 KDEC = IBEG_REDRHS+int(K-1,8)*int(LD_REDRHS,8)-1_8
3971 PTR_RHS_ROOT(II+I) = id%REDRHS(KDEC+I)
3977.EQ.
IF ( id%MYID MASTER) THEN
3980.EQ.
IF (LD_REDRHSSIZE_ROOT) THEN
3983 CALL MPI_SEND(id%REDRHS(KDEC),
3984 & SIZE_ROOT*NBRHS_EFF,
3985 & MPI_DOUBLE_COMPLEX,
3986 & MASTER_ROOT_IN_COMM, 0, id%COMM,IERR)
3990 KDEC = IBEG_REDRHS+int(K-1,8)*int(LD_REDRHS,8)
3991 CALL MPI_SEND(id%REDRHS(KDEC),SIZE_ROOT,
3992 & MPI_DOUBLE_COMPLEX,
3993 & MASTER_ROOT_IN_COMM, 0, id%COMM,IERR)
3996.EQ.
ELSE IF ( id%MYID MASTER_ROOT_IN_COMM ) THEN
3999.EQ.
IF (LD_REDRHSSIZE_ROOT) THEN
4001 CALL MPI_RECV(PTR_RHS_ROOT(II),
4002 & SIZE_ROOT*NBRHS_EFF,
4003 & MPI_DOUBLE_COMPLEX,
4004 & MASTER, 0, id%COMM,STATUS,IERR)
4007 CALL MPI_RECV(PTR_RHS_ROOT(II),SIZE_ROOT,
4008 & MPI_DOUBLE_COMPLEX,
4009 & MASTER, 0, id%COMM,STATUS,IERR)
4018 IF ( I_AM_SLAVE ) THEN
4019 LIW_PASSED = max( LIW, 1 )
4020 LA_PASSED = max( LA, 1_8 )
4022.EQ..and..EQ.
IF ((id%KEEP(235)0)(id%KEEP(237)0) ) THEN
4027.AND..GT.
NBSPARSE_LOC = (DO_NBSPARSENBRHS_EFF1)
4028 PRUNED_SIZE_LOADED = 0_8 ! From ZMUMPS_SOL_ES module
4029 CALL ZMUMPS_SOL_C(id%root, id%N, id%S(1), LA_PASSED, IS(1),
4030 & LIW_PASSED, WORK_WCB(1), LWCB8_SOL_C, IWCB, LIWCB, NBRHS_EFF,
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), id%NSLAVES, INFO(1),KEEP(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
4054.AND..GT.
NBSPARSE_LOC = (DO_NBSPARSENBRHS_EFF1)
4055 CALL ZMUMPS_SOL_C(id%root, id%N, id%S(1), LA_PASSED,IS(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 ! end of exploit sparsity (pruning nodes of the tree)
4083 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
4085 TIMEC2=MPI_WTIME()-TIMEC1+TIMEC2
4088.eq.
IF (INFO(1)-2) then
4092 & ' warning : -11 error code obtained in solve
'
4094.eq.
IF (INFO(1)-3) then
4098 & ' warning : -14 error code obtained in solve
'
4102.LT.
IF (INFO(1)0) GO TO 90
4108.EQ.
IF ( KEEP(221) 1 ) THEN ! === Begin OF REDUCED RHS ======
4115.EQ..AND.
IF ( ( id%MYID MASTER_ROOT_IN_COMM )
4116.EQ.
& ( id%MYID MASTER ) ) THEN
4120 KDEC = IBEG_REDRHS+int(K-1,8)*int(LD_REDRHS,8) - 1_8
4122 id%REDRHS(KDEC+I) = PTR_RHS_ROOT(II+I)
4128.EQ.
IF ( id%MYID MASTER ) THEN
4130.EQ.
IF (LD_REDRHSSIZE_ROOT) THEN
4133 CALL MPI_RECV(id%REDRHS(KDEC),
4134 & SIZE_ROOT*NBRHS_EFF,
4135 & MPI_DOUBLE_COMPLEX,
4136 & MASTER_ROOT_IN_COMM, 0, id%COMM,
4141 KDEC = IBEG_REDRHS+int(K-1,8)*int(LD_REDRHS,8)
4142 CALL MPI_RECV(id%REDRHS(KDEC),SIZE_ROOT,
4143 & MPI_DOUBLE_COMPLEX,
4144 & MASTER_ROOT_IN_COMM, 0, id%COMM,
4148.EQ.
ELSE IF ( id%MYID MASTER_ROOT_IN_COMM ) THEN
4151.EQ.
IF (LD_REDRHSSIZE_ROOT) THEN
4153 CALL MPI_SEND(PTR_RHS_ROOT(II),
4154 & SIZE_ROOT*NBRHS_EFF,
4155 & MPI_DOUBLE_COMPLEX,
4156 & MASTER, 0, id%COMM,IERR)
4159 CALL MPI_SEND(PTR_RHS_ROOT(II),SIZE_ROOT,
4160 & MPI_DOUBLE_COMPLEX,
4161 & MASTER, 0, id%COMM,IERR)
4168 ENDIF ! ====== END OF REDUCED RHS (Fwd only performed) ======
4172.NE.
IF ( KEEP(221) 1 ) THEN ! BACKWARD was PERFORMED
4174 IF (ICNTL21 == 0) THEN ! CENTRALIZED SOLUTION
4189.EQ.
IF (KEEP(237)0) THEN
4191 LCWORK = max(max(KEEP(247),KEEP(246)),1)
4192 ALLOCATE( CWORK(LCWORK), stat=allocok )
4193 IF (allocok > 0) THEN
4195 INFO(2)=max(max(KEEP(247),KEEP(246)),1)
4198.EQ..AND..NE.
IF ( (id%MYIDMASTER) (KEEP(237)0)
4199.AND..NE.
& (id%NSLAVES1)) THEN
4202 ALLOCATE (MAP_RHS(id%N), stat = allocok)
4203.GT.
IF ( allocok 0 ) THEN
4205 WRITE(LP,*) ' problem allocation of map_rhs at solve'
4210 nb_bytes = nb_bytes + int(id%N,8) * k34_8
4218 IF (info(1).LT.0)
GO TO 90
4219 IF ((id%MYID.NE.master).OR. .NOT.lscal)
THEN
4220 pt_scaling => dummy_scal
4222 IF (mtype.EQ.1)
THEN
4223 pt_scaling => id%COLSCA
4225 pt_scaling => id%ROWSCA
4228 liw_passed =
max( liw, 1 )
4230 IF ( .NOT.i_am_slave )
THEN
4234 IF (keep(237).EQ.0)
THEN
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,
4244 & lscal, pt_scaling(1),
size(pt_scaling),
4245 & c_dummy, 1 , 1, idummy, 1,
4246 & perm_rhs,
size(perm_rhs)
4251 & id%MYID, id%COMM, nbrhs_eff,
4253 & id%KEEP(1), bufr(1), lbufr, lbufr_bytes,
4254 & lscal, pt_scaling(1),
size(pt_scaling)
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),
4266 IF (keep(237).EQ.0)
THEN
4267 IF (id%MYID.EQ.master)
THEN
4269 ncol_rhs_loc = id%NRHS
4271 jbeg_rhs_loc = jbeg_rhs
4273 ptr_rhs => cdummy_target
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,
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)
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)
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
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)
4310 DO j = jbeg_rhs, jbeg_rhs+nbcol_inbloc-1
4311 IF (do_permute_rhs.OR.interleave_par)
THEN
4316 colsize = id%IRHS_PTR(pj+1) -
4318 IF (colsize.EQ.0) cycle
4322 IF (id%NSLAVES.NE.1)
THEN
4324 map_rhs(id%IRHS_SPARSE(
4325 & id%IRHS_PTR(pj) + ii - 1)) = ii
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)
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)
4342 IF (id%NSLAVES.NE.1)
THEN
4343 nb_bytes = nb_bytes - int(
size(map_rhs),8) * k34_8
4344 DEALLOCATE ( map_rhs )
4355 IF ( i_am_slave )
THEN
4356 liw_passed =
max( liw, 1 )
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) )
4374 timecopyscale2=
mpi_wtime()-timecopyscale1+timecopyscale2
4387 IF ( icntl10 > 0 .AND. nbrhs_eff > 1 )
THEN
4394 write(6,*) ' internal error 15 in sol_driver
'
4416.AND..NE.
IF ( PROKG ICNTL10 0 ) WRITE( MPG, 270 )
4418 NITREF = abs(ICNTL10)
4419 ALLOCATE(R_Y(id%N), stat = allocok)
4420.GT.
IF ( allocok 0 ) THEN
4425 NB_BYTES = NB_BYTES + int(id%N,8)*K16_8
4426 ALLOCATE(C_Y(id%N), stat = allocok)
4427.GT.
IF ( allocok 0 ) THEN
4432 NB_BYTES = NB_BYTES + int(id%N,8)*K35_8
4433.EQ.
IF ( id%MYID MASTER ) THEN
4434 ALLOCATE( IW1( 2 * id%N ),stat = allocok )
4435.GT.
IF ( allocok 0 ) THEN
4440 NB_BYTES = NB_BYTES + int(2*id%N,8)*K34_8
4441 ALLOCATE( C_W(id%N), stat = allocok )
4442.GT.
IF ( allocok 0 ) THEN
4447 NB_BYTES = NB_BYTES + int(id%N,8)*K35_8
4448 ALLOCATE( R_W(2*id%N), stat = allocok )
4449.GT.
IF ( allocok 0 ) THEN
4454 NB_BYTES = NB_BYTES + int(2*id%N,8)*K16_8
4455.AND..GT.
IF ( PROKG ICNTL10 0 )
4456 & WRITE( MPG, 240) 'maximum number of steps =
', NITREF
4459 ALLOCATE(C_LOCWK54(id%N),stat = allocok)
4460.GT.
IF ( allocok 0 ) THEN
4465 NB_BYTES = NB_BYTES + int(id%N,8)*K35_8
4466 ALLOCATE(R_LOCWK54(id%N),stat = allocok)
4467.GT.
IF ( allocok 0 ) THEN
4472 NB_BYTES = NB_BYTES + int(id%N,8)*K16_8
4476 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
4477 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
4479.LT.
IF ( INFO(1) 0 ) GOTO 90
4485 CALL MUMPS_SECDEB(TIMEIT)
4499.GT..OR..GT.
IF ((ICNTL110)(ICNTL100)) THEN
4501.eq.
IF ( KEEP(54) 0 ) THEN
4505.eq.
IF ( id%MYID MASTER ) THEN
4511.NE.
IF (KEEP(55)0) THEN
4513 CALL ZMUMPS_SOL_X_ELT(MTYPE, id%N,
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) )
4520.eq.
IF ( MTYPE 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) )
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) )
4537.and.
IF ( I_AM_SLAVE
4538.NE.
& id%KEEP8(29) 0_8 ) THEN
4539.eq.
IF ( MTYPE 1 ) THEN
4540 CALL ZMUMPS_SOL_X(id%A_loc(1),
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) )
4546 CALL ZMUMPS_SOL_X(id%A_loc(1),
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) )
4558.eq.
IF ( id%MYID MASTER ) THEN
4559 CALL MPI_REDUCE( R_LOCWK54, R_W( id%N + 1 ),
4560 & id%N, MPI_DOUBLE_PRECISION,
4561 & MPI_SUM,MASTER,id%COMM, IERR)
4563 CALL MPI_REDUCE( R_LOCWK54, R_DUMMY,
4564 & id%N, MPI_DOUBLE_PRECISION,
4565 & MPI_SUM,MASTER,id%COMM, IERR)
4570.eq.
IF ( id%MYID MASTER ) THEN
4572 RINFOG(4) = dble(ZERO)
4574 RINFOG(4) = max(R_W( id%N +I), RINFOG(4))
4587.eq..AND..GT.
IF (( id%MYID MASTER )(ICNTL100)) THEN
4590.LT.
IF (ARRET 0.0D0) THEN
4591 ARRET = sqrt(epsilon(0.0D0))
4596 DO 22 IRStep = 1, NITREF +1
4602.eq..AND..GT.
IF (( id%MYID MASTER )(IRStep1)) THEN
4605 id%RHS(IBEG+I-1) = id%RHS(IBEG+I-1) + C_Y(I)
4611.eq.
IF ( KEEP(54) 0 ) THEN
4612.eq.
IF ( id%MYID MASTER ) THEN
4613.NE.
IF (KEEP(55)0) THEN
4615 CALL ZMUMPS_ELTYD( MTYPE, id%N,
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))
4621.eq.
IF ( MTYPE 1 ) THEN
4622 CALL ZMUMPS_SOL_Y(id%A(1), id%KEEP8(28),
4624 & id%JCN(1), SAVERHS,
4625 & id%RHS(IBEG), C_Y, R_W, KEEP(1),KEEP8(1))
4627 CALL ZMUMPS_SOL_Y(id%A(1), id%KEEP8(28),
4629 & id%IRN(1), SAVERHS,
4630 & id%RHS(IBEG), C_Y, R_W, KEEP(1),KEEP8(1))
4638 CALL MPI_BCAST( RHS_IR(IBEG), id%N,
4639 & MPI_DOUBLE_COMPLEX, MASTER,
4645.and.
IF ( I_AM_SLAVE
4646.NE.
& id%KEEP8(29) 0_8 ) THEN
4647 CALL ZMUMPS_LOC_MV8( id%N, id%KEEP8(29),
4648 & id%IRN_loc(1), id%JCN_loc(1), id%A_loc(1),
4649 & RHS_IR(IBEG), C_LOCWK54, KEEP(50), MTYPE )
4653.eq.
IF ( id%MYID MASTER ) THEN
4654 CALL MPI_REDUCE( C_LOCWK54, C_Y,
4655 & id%N, MPI_DOUBLE_COMPLEX,
4656 & MPI_SUM,MASTER,id%COMM, IERR)
4661 CALL MPI_REDUCE( C_LOCWK54, C_DUMMY,
4662 & id%N, MPI_DOUBLE_COMPLEX,
4663 & MPI_SUM,MASTER,id%COMM, IERR)
4676.and..NE.
IF ( I_AM_SLAVE id%KEEP8(29) 0_8 ) THEN
4677 CALL ZMUMPS_LOC_OMEGA1( id%N, id%KEEP8(29),
4678 & id%IRN_loc(1), id%JCN_loc(1), id%A_loc(1),
4679 & RHS_IR(IBEG), R_LOCWK54, KEEP(50), MTYPE )
4683.eq.
IF ( id%MYID MASTER ) THEN
4684 CALL MPI_REDUCE( R_LOCWK54, R_W,
4685 & id%N, MPI_DOUBLE_PRECISION,
4686 & MPI_SUM,MASTER,id%COMM, IERR)
4688 CALL MPI_REDUCE( R_LOCWK54, R_DUMMY,
4689 & id%N, MPI_DOUBLE_PRECISION,
4690 & MPI_SUM, MASTER, id%COMM, IERR)
4696.eq.
IF ( id%MYID MASTER ) THEN
4698.GT..OR..GT.
IF ((ICNTL110)(ICNTL100)) THEN
4706.GT..OR..LT..AND.
IF (((ICNTL110)((ICNTL100)
4707.EQ..OR..EQ.
& ((IRStep1)(IRStepNITREF+1)))
4708.OR..EQ..AND..EQ.
& ((ICNTL100)(IRStep1)))
4709.OR..GT.
& (ICNTL100)) THEN
4713.LT.
IF (ICNTL100) CALL MUMPS_SECDEB(TIMEEA1)
4714 CALL ZMUMPS_SOL_OMEGA(id%N,SAVERHS,
4715 & id%RHS(IBEG), C_Y, R_W, C_W, IW1, IFLAG_IR,
4716 & RINFOG(7), NOITER, TESTConv,
4717 & MP, ARRET, KEEP(361) )
4718.LT.
IF (ICNTL100) THEN
4719 CALL MUMPS_SECFIN(TIMEEA1)
4720 id%DKEEP(120)=id%DKEEP(120)+TIMEEA1
4723.GT..AND.
IF ((ICNTL110)(
4724.LT..AND..EQ..OR..EQ.
& (ICNTL100(IRStep1IRStepNITREF+1))
4725.OR..GE..AND..EQ.
& ((ICNTL100)(IRStep1))
4730 CALL MUMPS_SECDEB(TIMEEA)
4731.EQ.
IF (ICNTL100) THEN
4733.GT.
IF ( MPG 0 ) WRITE( MPG, 170 )
4734.EQ.
ELSEIF (IRStep1) THEN
4736.GT.
IF ( MPG 0 ) WRITE( MPG, 55 )
4737.LT..AND..EQ.
ELSEIF ((ICNTL100)(IRStepNITREF+1)) THEN
4740.GT.
IF ( MPG 0 ) THEN
4744 & 'number of steps of iterative refinement requested =
',
4749 CALL ZMUMPS_SOL_Q(MTYPE,INFO(1),id%N,
4751 & SAVERHS,R_W(id%N+1),C_Y,GIVSOL,
4752 & RINFOG(4),RINFOG(5),RINFOG(6),MPG,ICNTL(1),
4754.GT.
IF ( MPG 0 ) THEN
4757 & 'rinfog(7):componentwise scaled residual(w1)=
',
4760 & '------(8):---------------------------- (w2)=
',
4763 CALL MUMPS_SECFIN(TIMEEA)
4764 id%DKEEP(120)=id%DKEEP(120)+TIMEEA
4769.EQ.
IF (IRStepNITREF +1) THEN
4776.GT..AND..EQ.
IF ((ICNTL100)(IFLAG_IR0))
4777 & id%INFO(1) = id%INFO(1) + 8
4779.GT.
IF (ICNTL100) THEN
4787.GT.
IF (IFLAG_IR0) THEN
4795.EQ.
IF (IFLAG_IR2) NOITER = NOITER - 1
4800.LT.
ELSEIF (ICNTL100) THEN
4814 CALL MPI_BCAST( KASE, 1, MPI_INTEGER, MASTER,
4817.LE.
IF (KASE0) GOTO 666
4819 WRITE(*,*) "Internal error 17 in ZMUMPS_SOL_DRIVER"
4825 CALL ZMUMPS_PP_SOLVE()
4826.LT.
IF (INFO(1) 0) GOTO 90
4839 CALL MUMPS_SECFIN(TIMEIT)
4840.EQ.
IF ( id%MYID MASTER ) THEN
4841.GT.
IF ( NITREF 0 ) THEN
4842 id%INFOG(15) = NOITER
4848.EQ.
IF (ICNTL100) THEN
4851 id%DKEEP(120)=TIMEIT
4854 id%DKEEP(114)=TIMEIT - id%DKEEP(120)
4858.GT.
IF (ICNTL100) THEN
4862 & 'number of steps of iterative refinements performed =
',
4871.GT..AND..GT.
IF ((ICNTL11 0)(ICNTL100)) THEN
4876 CALL MUMPS_SECDEB(TIMEEA)
4878.eq.
IF (id%MYID MASTER ) THEN
4882.EQ.
IF (IFLAG_IR2) KASE = 2
4887 CALL MPI_BCAST( KASE, 1, MPI_INTEGER, MASTER,
4895.eq.
IF ( KEEP(54) 0 ) THEN
4899.EQ.
IF (id%MYID MASTER) THEN
4900.EQ.
IF (KEEP(55)0) THEN
4901 CALL ZMUMPS_QD2( MTYPE, id%N, id%KEEP8(28), id%A(1),
4902 & id%IRN(1), id%JCN(1),
4903 & id%RHS(IBEG), SAVERHS, R_Y, C_Y, KEEP(1),KEEP8(1))
4905 CALL ZMUMPS_ELTQD2( MTYPE, id%N,
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))
4916 CALL MPI_BCAST( RHS_IR(IBEG), id%N,
4917 & MPI_DOUBLE_COMPLEX, MASTER,
4922.and.
IF ( I_AM_SLAVE
4923.NE.
& id%KEEP8(29) 0_8 ) THEN
4924 CALL ZMUMPS_LOC_MV8( id%N, id%KEEP8(29),
4925 & id%IRN_loc(1), id%JCN_loc(1), id%A_loc(1),
4926 & RHS_IR(IBEG), C_LOCWK54, KEEP(50), MTYPE )
4930.eq.
IF ( id%MYID MASTER ) THEN
4931 CALL MPI_REDUCE( C_LOCWK54, C_Y,
4932 & id%N, MPI_DOUBLE_COMPLEX,
4933 & MPI_SUM,MASTER,id%COMM, IERR)
4936 CALL MPI_REDUCE( C_LOCWK54, C_DUMMY,
4937 & id%N, MPI_DOUBLE_COMPLEX,
4938 & MPI_SUM,MASTER,id%COMM, IERR)
4942.EQ.
IF (id%MYID MASTER) THEN
4946.EQ.
IF (IFLAG_IR2) THEN
4948 CALL ZMUMPS_SOL_OMEGA(id%N,SAVERHS,
4949 & id%RHS(IBEG), C_Y, R_W, C_W, IW1, IFLAG_IR,
4950 & RINFOG(7), 0, TESTConv,
4951 & MP, ARRET, KEEP(361) )
4952.EQ.
ENDIF ! (IFLAG_IR2)
4955 CALL ZMUMPS_SOL_Q(MTYPE,INFO(1),id%N,
4957 & SAVERHS,R_W(id%N+1),C_Y,GIVSOL,
4958 & RINFOG(4),RINFOG(5),RINFOG(6),MPG,ICNTL(1),
4961 CALL MUMPS_SECFIN(TIMEEA)
4962 id%DKEEP(120)=id%DKEEP(120)+TIMEEA
4963 ENDIF ! ICNTL11>0 and ICNTL10>0
4967 CALL MUMPS_SECDEB(TIMELCOND)
4968.EQ.
IF (ICNTL11 1) THEN
4969.eq.
IF ( id%MYID MASTER ) THEN
4971 ALLOCATE( D(id%N),stat =allocok )
4972.GT.
IF ( allocok 0 ) THEN
4977 NB_BYTES = NB_BYTES + int(id%N,8)*K16_8
4984.EQ.
IF ( id%MYID MASTER ) THEN
4985 CALL ZMUMPS_SOL_LCOND(id%N, SAVERHS,
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))
4993 CALL MPI_BCAST( KASE, 1, MPI_INTEGER, MASTER,
4998.LE.
IF (KASE0) GOTO 224
4999 CALL ZMUMPS_PP_SOLVE()
5000.LT.
IF (INFO(1) 0) GOTO 90
5010 CALL MUMPS_SECFIN(TIMELCOND)
5011 id%DKEEP(121)=id%DKEEP(121)+TIMELCOND
5012.EQ..AND..GT.
IF ((id%MYID MASTER)(ICNTL110)) THEN
5013.GT.
IF (ICNTL100) THEN
5015.GT.
IF ( MPG 0 ) THEN
5017 & 'rinfog(7):componentwise scaled residual(w1)=
',
5020 & '------(8):---------------------------- (w2)=
',
5024.EQ.
IF (ICNTL111) THEN
5028 & '------(9):upper bound error ...............=
',
5031 & '-----(10):condition number(1) ............=
',
5034 & '-----(11):condition number(2) ............=
',
5038.GT.
END IF ! MASTER && ICNTL110
5039.AND..GT.
IF ( PROKG abs(ICNTL10) 0 ) WRITE( MPG, 131 )
5045 IF (id%MYID == MASTER) THEN
5046 NB_BYTES = NB_BYTES - int(size(C_W),8)*K35_8
5048 NB_BYTES = NB_BYTES - int(size(R_W),8)*K16_8
5049 & - int(size(IW1),8)*K34_8
5052.EQ.
IF (ICNTL11 1) THEN
5054 NB_BYTES = NB_BYTES - int(size(D ),8)*K16_8
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
5064 DEALLOCATE(R_LOCWK54)
5065 DEALLOCATE(C_LOCWK54)
5081.EQ..AND.
IF ( id%MYID MASTER ICNTL21==0
5082.AND..NE..AND..EQ.
& KEEP(23) 0KEEP(237)0) THEN
5086.NE..AND..EQ.
IF ((KEEP(221)1 MTYPE 1)
5087.OR..NE..OR..NE.
& KEEP(111) 0 KEEP(252)0 ) THEN
5095 ALLOCATE( C_RW1( id%N ),stat =allocok )
5096! temporary not in NB_BYTES
5097.GT.
IF ( allocok 0 ) THEN
5100 WRITE(*,*) 'could not
allocate ', id%N, 'integers.
'
5104.EQ.
IF (KEEP(242)0) THEN
5105 KDEC = (K-1)*LD_RHS+IBEG-1
5111 KDEC = int(PERM_RHS(K-1+JBEG_RHS)-1,8)*int(LD_RHS,8)
5114 C_RW1(I) = id%RHS(KDEC+I)
5117 JPERM = id%UNS_PERM(I)
5118 id%RHS( KDEC+JPERM ) = C_RW1( I )
5121 DEALLOCATE( C_RW1 ) !temporary not in NB_BYTES
5127.EQ..and..and..NE..AND.
IF (id%MYIDMASTER ICNTL21==0KEEP(221)1
5128.EQ.
& (KEEP(237)0) ) THEN
5130.GE..AND..GE..AND..GT.
IF ( INFO(1) 0 ICNTL(4)3 ICNTL(3)0)
5133.eq.
IF (ICNTL(4) 4 ) K = id%N
5134 J = min0(10,NBRHS_EFF)
5135.eq.
IF (ICNTL(4) 4 ) J = NBRHS_EFF
5137 WRITE(ICNTL(3),110) BEG_RHS+II-1
5139 & (id%RHS(IBEG+(II-1)*LD_RHS+I-1),I=1,K)
5145.EQ..AND..EQ.
IF ((KEEP(248)1)(KEEP(237)0)) THEN
5146 ! case of general sparse: in case of empty columns
5147 ! NBRHS_EFF might has been updated and broadcasted
5148 ! and holds the effective size of a contiguous block of
5150 BEG_RHS = BEG_RHS + NBRHS_EFF ! nb of nonempty columns
5152 BEG_RHS = BEG_RHS + NBRHS
5158.GT.
IF (KEEP(400) 0) THEN
5159 CALL ZMUMPS_SOL_L0OMP_LD(KEEP(400))
5166.EQ.
IF ( (id%MYIDMASTER)
5167.AND..NE.
& ( KEEP(248)0 ) ! sparse RHS on input
5168.AND..EQ.
& ( KEEP(237)0 ) ! No A-1
5169.AND..EQ.
& ( ICNTL210 ) ! Centralized solution
5170.AND..NE.
& ( KEEP(221) 1 ) ! Not Reduced RHS step of Schur
5171.AND..LT.
& ( JEND_RHS id%NRHS )
5174 JBEG_NEW = JEND_RHS + 1
5175.OR.
IF (DO_PERMUTE_RHSINTERLEAVE_PAR) THEN
5176.LE.
DO WHILE ( JBEG_NEW id%NRHS)
5178 id%RHS(int(PERM_RHS(JBEG_NEW) -1,8)*int(LD_RHS,8)+I)
5181 JBEG_NEW = JBEG_NEW +1
5184.LE.
DO WHILE ( JBEG_NEW id%NRHS)
5186 id%RHS(int(JBEG_NEW -1,8)*int(LD_RHS,8) + I) = ZERO
5188 JBEG_NEW = JBEG_NEW +1
5190.OR.
ENDIF ! End DO_PERMUTE_RHSINTERLEAVE_PAR
5196.AND..NE..AND.
IF ( I_AM_SLAVE (ICNTL210)
5197.LT..AND..NE.
& ( JEND_RHS id%NRHS ) KEEP(221)1 ) THEN
5198 JBEG_NEW = JEND_RHS + 1
5199.OR.
IF (DO_PERMUTE_RHSINTERLEAVE_PAR) THEN
5200.LE.
DO WHILE ( JBEG_NEW id%NRHS)
5202 id%SOL_loc(int(PERM_RHS(JBEG_NEW) -1,8)*
5203 & int(id%LSOL_loc,8)+int(I,8)) = ZERO
5205 JBEG_NEW = JBEG_NEW +1
5209.LE.
DO WHILE ( JBEG_NEW id%NRHS)
5211 id%SOL_loc((JBEG_NEW -1)*id%LSOL_loc + I) = ZERO
5213 JBEG_NEW = JBEG_NEW +1
5222.EQ..AND.
IF ((KEEP(221)1)
5223.LT.
& ( JEND_RHS id%NRHS ) ) THEN
5224.EQ.
IF (id%MYID MASTER) THEN
5225 JBEG_NEW = JEND_RHS + 1
5226.LE.
DO WHILE ( JBEG_NEW id%NRHS)
5227 DO I=1, id%SIZE_SCHUR
5228 id%REDRHS(int(JBEG_NEW -1,8)*int(LD_REDRHS,8) +
5231 JBEG_NEW = JBEG_NEW +1
5234 IF (I_AM_SLAVE) THEN
5235 JBEG_NEW = JEND_RHS + 1
5236.LE.
DO WHILE ( JBEG_NEW id%NRHS)
5237 DO I=1,NBENT_RHSCOMP
5238 id%RHSCOMP(int(JBEG_NEW -1,8)*int(LD_RHSCOMP,8) +
5241 JBEG_NEW = JBEG_NEW +1
5248 id%INFO(26) = int(NB_BYTES_MAX / 1000000_8)
5256 CALL MUMPS_MEM_CENTRALIZE( id%MYID, id%COMM,
5257 & id%INFO(26), id%INFOG(30), IRANK )
5259 IF (PRINT_MAXAVG) THEN
5260 WRITE( MPG,'(a,i10)
')
5261 & ' ** rank of processor needing largest memory in solve :
',
5263 WRITE( MPG,'(a,i10)
')
5264 & ' ** space in mbytes
used by this processor
for solve :
',
5266.eq.
IF ( KEEP(46) 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
5271 WRITE( MPG,'(a,i10)
')
5272 & ' ** avg. space in mbytes per working proc during solve :
',
5273 & id%INFOG(31) / id%NSLAVES
5276 WRITE( MPG,'(a,i10)
')
5277 & ' ** space in mbytes
used for solve :
',
5285 CALL MUMPS_SECFIN(TIME3)
5287 id%DKEEP(113)=TIMEC2
5288 id%DKEEP(115)=TIMESCATTER2
5289 id%DKEEP(116)=TIMEGATHER2
5290 id%DKEEP(122)=TIMECOPYSCALE2
5292 CALL MPI_REDUCE( id%DKEEP(115), id%DKEEP(160),1,
5293 &MPI_DOUBLE_PRECISION, MPI_MAX, MASTER, id%COMM, IERR )
5294 CALL MPI_REDUCE( id%DKEEP(116), id%DKEEP(161),1,
5295 &MPI_DOUBLE_PRECISION, MPI_MAX, MASTER, id%COMM, IERR )
5296 CALL MPI_REDUCE( id%DKEEP(117), id%DKEEP(162),1,
5297 &MPI_DOUBLE_PRECISION, MPI_MAX, MASTER, id%COMM, IERR )
5298 CALL MPI_REDUCE( id%DKEEP(118), id%DKEEP(163),1,
5299 &MPI_DOUBLE_PRECISION, MPI_MAX, MASTER, id%COMM, IERR )
5300 CALL MPI_REDUCE( id%DKEEP(119), id%DKEEP(164),1,
5301 &MPI_DOUBLE_PRECISION, MPI_MAX, MASTER, id%COMM, IERR )
5302 CALL MPI_REDUCE( id%DKEEP(122), id%DKEEP(165),1,
5303 &MPI_DOUBLE_PRECISION, MPI_MAX, MASTER, id%COMM, IERR )
5307 WRITE ( MPG, *) "Leaving solve with ..."
5308 WRITE( MPG, 434 ) id%DKEEP(160) ! max id%DKEEP(115)
5309 WRITE( MPG, 432 ) id%DKEEP(113) ! ok without reduction
5310 WRITE( MPG, 435 ) id%DKEEP(162) ! max id%DKEEP(117)
5311.NE..OR..NE.
IF ((KEEP(38)0)(KEEP(20)0))
5312 & WRITE( MPG, 437 ) id%DKEEP(164) ! id%DKEEP(119)
5313 WRITE( MPG, 436 ) id%DKEEP(163) ! id%DKEEP(118)
5314 WRITE( MPG, 433 ) id%DKEEP(161) ! max(DKEEP(116)) -- Gather
5315 WRITE( MPG, 431 ) id%DKEEP(165) ! max(DKEEP(122)) -- Dist. sol.
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.NE..OR..NE.
IF ((KEEP(38)0)(KEEP(20)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)
5330.LT.
IF (INFO(1) 0 ) THEN
5332.EQ.
IF (KEEP(485) 1) THEN
5333 KEEP(350) = KEEP350_SAVE
5334 IF (IS_LR_MOD_TO_STRUC_DONE) THEN
5335 CALL ZMUMPS_BLR_MOD_TO_STRUC(id%BLRARRAY_ENCODING)
5336 CALL MUMPS_FDM_MOD_TO_STRUC('f
',id%FDM_F_ENCODING,
5340.GT.
IF (KEEP(201)0)THEN
5341 IF (IS_INIT_OOC_DONE) THEN
5342 CALL ZMUMPS_OOC_END_SOLVE(IERR)
5343.LT..AND..GE.
IF (IERR0 INFO(1) 0) INFO(1) = IERR
5345 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
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)
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)
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)
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)
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.
5388.AND..AND..EQ.
IF (I_AM_SLAVELSCALKEEP(248)-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)
5394 IF (allocated(PERM_RHS)) THEN
5395 NB_BYTES = NB_BYTES - int(size(PERM_RHS),8)*K34_8
5396 DEALLOCATE(PERM_RHS)
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)
5403 IF (allocated(BUFR)) THEN
5404 NB_BYTES = NB_BYTES - int(size(BUFR),8)*K34_8
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)
5413 IF (allocated(IWK_SOLVE)) THEN
5414 NB_BYTES = NB_BYTES - int(size(IWK_SOLVE),8)*K34_8
5415 DEALLOCATE( IWK_SOLVE )
5417 IF (allocated(PTRACB)) THEN
5418 NB_BYTES = NB_BYTES - int(size(PTRACB),8)*K34_8*
5420 DEALLOCATE( PTRACB )
5422 IF (allocated(IWCB)) THEN
5423 NB_BYTES = NB_BYTES - int(size(IWCB),8)*K34_8
5431.GT.
IF (id%NSLAVES 1) THEN
5432 CALL ZMUMPS_BUF_DEALL_CB( IERR )
5433 CALL ZMUMPS_BUF_DEALL_SMALL_BUF( IERR )
5437.eq.
IF ( id%MYID MASTER ) THEN
5442 IF (allocated(SAVERHS)) THEN
5443 NB_BYTES = NB_BYTES - int(size(SAVERHS),8)*K35_8
5444 DEALLOCATE( SAVERHS)
5453 IF (associated(RHS_IR)) THEN
5454 NB_BYTES = NB_BYTES - int(size(RHS_IR),8)*K35_8
5459 IF (I_AM_SLAVE) THEN
5461 IF (allocated(SRW3)) THEN
5462 NB_BYTES = NB_BYTES - int(size(SRW3),8)*K35_8
5465.AND.
IF (LSCAL ICNTL21==1) THEN
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)
5473 IF (WK_USER_PROVIDED) THEN
5480.AND..GT.
ELSE IF (associated(id%S)KEEP(201)0) THEN
5482 NB_BYTES = NB_BYTES - KEEP8(23)*K35_8
5487.NE.
IF (KEEP(221)1) THEN
5491 IF (associated(id%RHSCOMP)) THEN
5492 NB_BYTES = NB_BYTES - id%KEEP8(25)*K35_8
5493 DEALLOCATE(id%RHSCOMP)
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)
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.
5511 IF ( WORK_WCB_ALLOCATED ) THEN
5512 NB_BYTES = NB_BYTES - int(size(WORK_WCB),8)*K35_8
5513 DEALLOCATE( WORK_WCB )
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/
5542 151 FORMAT (' --- (25) =
',I12)
5543 152 FORMAT (' --- (26) =
',I12)
5544 153 FORMAT (' --- (32) =
',I12)
5545 160 FORMAT (' rhs
'/(1X,1P,5D14.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 131 FORMAT (/' END ITERATIVE REFINEMENT
')
5551 141 FORMAT(1X, A52,I4)
5553 SUBROUTINE ZMUMPS_CHECK_DISTRHS(
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(kind=8), INTENT( IN ), POINTER :: idRHS_loc (:)
5581 INTEGER, POINTER :: idIRHS_loc (:)
5582 COMPLEX(kind=8), POINTER :: idRHS_loc (:)
5584 INTEGER, INTENT( INOUT ) :: INFO(80)
5589 INTEGER(8) :: REQSIZE8
5595.LE.
IF (idNloc_RHS 0) RETURN
5598.LT.
IF ( idLRHS_loc idNloc_RHS) THEN
5604.GT.
IF (idNloc_RHS 0) THEN
5606.NOT.
IF ( associated(idIRHS_loc)) THEN
5610.LT.
ELSE IF (size(idIRHS_loc) idNloc_RHS) THEN
5616.NOT.
IF ( associated(idRHS_loc)) THEN
5622 REQSIZE8 = int(idLRHS_loc,8)*int(NRHS,8)
5623 & + int(-idLRHS_loc+idNloc_RHS,8)
5624#if defined(MUMPS_F2003)
5625.LT.
IF (size(idRHS_loc,kind=8) REQSIZE8) THEN
5627.LE..AND.
IF ( REQSIZE8 int(huge(idNloc_RHS),8)
5628.LT.
& size(idRHS_loc) int(REQSIZE8) ) THEN
5639 END SUBROUTINE ZMUMPS_CHECK_DISTRHS
5640 SUBROUTINE ZMUMPS_PP_SOLVE()
5654.NE..AND..NE.
IF (KASE 1 KASE 2) THEN
5655 WRITE(*,*) "Internal error 1 in ZMUMPS_PP_SOLVE"
5658.eq.
IF ( id%MYID MASTER ) THEN
5666.EQ.
IF ( MTYPE 1 ) THEN
5675.EQ.
IF ( SOLVET2 ) SOLVET = 0
5677.EQ.
IF ( SOLVET 1 ) THEN
5680 C_Y( K ) = C_Y( K ) * id%ROWSCA( K )
5685 C_Y( K ) = C_Y( K ) * id%COLSCA( K )
5689.EQ.
END IF ! MYIDMASTER
5693 CALL MPI_BCAST( SOLVET, 1, MPI_INTEGER, MASTER,
5698.NOT.
IF ( I_AM_SLAVE ) THEN
5700 CALL ZMUMPS_SCATTER_RHS(id%NSLAVES,id%N, id%MYID,
5702 & SOLVET, C_Y(1), id%N, 1,
5706 & JDUMMY, id%KEEP(1), id%KEEP8(1), id%PROCNODE_STEPS(1),
5709 & id%ICNTL(1),id%INFO(1))
5711.EQ.
IF (SOLVETMTYPE) THEN
5714 PTR_POSINRHSCOMP_FWD => id%POSINRHSCOMP_ROW
5718 PTR_POSINRHSCOMP_FWD => id%POSINRHSCOMP_COL
5720 LIW_PASSED = max( LIW, 1 )
5721 CALL ZMUMPS_SCATTER_RHS(id%NSLAVES,id%N, id%MYID,
5723 & SOLVET, C_Y(1), id%N, 1,
5725 & id%RHSCOMP(IBEG_RHSCOMP), LD_RHSCOMP, 1,
5726 & PTR_POSINRHSCOMP_FWD(1), NB_FS_RHSCOMP_F,
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))
5734.LT.
IF (INFO(1)0) GOTO 89
5738 IF ( I_AM_SLAVE ) THEN
5739 LIW_PASSED = max( LIW, 1 )
5740 LA_PASSED = max( LA, 1_8 )
5741.EQ.
IF (SOLVETMTYPE) THEN
5742 PTR_POSINRHSCOMP_FWD => id%POSINRHSCOMP_ROW
5743 PTR_POSINRHSCOMP_BWD => id%POSINRHSCOMP_COL
5745 PTR_POSINRHSCOMP_FWD => id%POSINRHSCOMP_COL
5746 PTR_POSINRHSCOMP_BWD => id%POSINRHSCOMP_ROW
5749 NBSPARSE_LOC = .FALSE.
5750 CALL ZMUMPS_SOL_C(id%root, id%N, id%S(1), LA_PASSED, id%IS(1),
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),
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
5774.eq.
IF (INFO(1)-2) INFO(1)=-12
5775.eq.
IF (INFO(1)-3) INFO(1)=-15
5777.GE.
IF (INFO(1) 0) THEN
5784 ALLOCATE( CWORK(max(max(KEEP(247),KEEP(246)),1)),
5786 IF (allocok > 0) THEN
5788 INFO(2)=max(max(KEEP(247),KEEP(246)),1)
5794 89 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
5798.LT.
IF (INFO(1)0) RETURN
5807.NE..OR..NOT.
IF ((id%MYIDMASTER) LSCAL) THEN
5808 PT_SCALING => Dummy_SCAL
5810.EQ.
IF (SOLVET1) THEN
5811 PT_SCALING => id%COLSCA
5813 PT_SCALING => id%ROWSCA
5816 LIW_PASSED = max( LIW, 1 )
5819.NOT.
IF ( I_AM_SLAVE ) THEN
5823 CALL ZMUMPS_GATHER_SOLUTION(id%NSLAVES,id%N,
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),
5828 & id%STEP(1), BUFR(1), LBUFR, LBUFR_BYTES,
5829 & CWORK(1), size(CWORK),
5830 & LSCAL, PT_SCALING(1), size(PT_SCALING),
5831! RHSCOMP not on non-working master
5832 & C_DUMMY, 1 , 1, IDUMMY, 1,
5833! for sparse permuted RHS on host
5834 & PERM_RHS, size(PERM_RHS)
5837 CALL ZMUMPS_GATHER_SOLUTION(id%NSLAVES,id%N,
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)) ! for sparse permuted RHS on host
5851 END SUBROUTINE ZMUMPS_PP_SOLVE