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 ::
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 ,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
128 LOGICAL :: IRHS_loc_PTR_allocated
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, RONE
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
176 INTEGER(8) :: LPTR_RHS_ROOT
180 COMPLEX(kind=8),
ALLOCATABLE :: SAVERHS(:), (:),
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,INFO
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
259 INTEGER :: LPTR_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,
293 & soln_assem, perm_scal_post
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
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, ierr )
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
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 =",
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
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)
1125 ENDIF ! (
id%KEEP(248).EQ.1).AND.(
id%KEEP(237).EQ.0)
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.
1132 &
id%KEEP(248).EQ.0)
THEN
1136 WRITE(lp,
'(A,I4,I4)')
1137 &
' Internal Error 2 in solution driver (A-1) ',
1138 &
id%KEEP(237),
id%KEEP(248)
1147 & string=
'id%Step2node (Solve)', memcnt=nbt, errcode=-13)
1149 &
id%COMM,
id%MYID )
1150 IF ( info(1).LT.0 )
RETURN
1158 IF (
id%STEP(i).LE.0) cycle
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 IF((keep(235).NE.0).OR.(keep(237).NE.0))
THEN
1177 IF(.NOT.
associated(
id%IPTR_WORKING))
THEN
1186 do_null_piv = .true.
1187 nbcol_inbloc = -9998
1188 nz_this_block= -9998
1191 IF (
id%MYID.EQ.master)
THEN
1194 IF ( keep(111)==0 .AND. keep(248)==1
1201 IF (
id%IRHS_PTR(i).LT.
id%IRHS_PTR(i+1))
1202 & nrhs_nonempty = nrhs_nonempty+1
1204 IF (nrhs_nonempty.LE.0)
THEN
1207 &
WRITE(lp,*)
" Internal Error 3 in solution driver ",
1208 &
" NRHS_NONEMPTY= ",
1213 nrhs_nonempty =
id%NRHS
1221 IF ( keep( 38 ) .ne. 0 )
THEN
1222 master_root = mumps_procnode(
1223 &
id%PROCNODE_STEPS(
id%STEP( keep(38))),
1225 IF (
id%MYID_NODES .eq. master_root)
THEN
1226 size_root =
id%root%TOT_ROOT_SIZE
1227 ELSE IF ((
id%MYID.EQ.master).AND.keep(60).NE.0)
THEN
1229 size_root=
id%KEEP(116)
1231 ELSE IF (keep( 20 ) .ne. 0 )
THEN
1232 master_root = mumps_procnode(
1233 &
id%PROCNODE_STEPS(
id%STEP(keep(20))),
1235 IF (
id%MYID_NODES .eq. master_root)
THEN
1237 &
id%PTLUST_S(
id%STEP(keep(20)))+keep(ixsz) + 3)
1238 ELSE IF ((
id%MYID.EQ.master).AND.keep(60).NE.0)
THEN
1240 size_root=
id%KEEP(116)
1243 master_root = -44444
1251 IF (
id%MYID .eq. master)
THEN
1252 keep(84) = icntl(27)
1254 IF(icntl(27).EQ.0) keep(84)=1
1255 IF (keep(252).NE.0)
THEN
1259 IF (keep(201) .EQ. 0 .OR. keep(84) .GT. 0)
THEN
1260 nbrhs = abs(keep(84))
1264 IF (nbrhs .GT. 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 IF (keep(201).GT.0)
THEN
1281 workspace_minimal_preferred = .false.
1282 IF (
id%MYID .eq. master)
THEN
1283 keep(107) =
max(0,keep(107))
1284 IF ((keep(107).EQ.0).AND.
1285 & (keep(204).EQ.0).AND.(keep(211).NE.1) )
THEN
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 IF ( keep( 38 ) .NE. 0 .OR. keep( 20 ) .NE. 0 )
THEN
1339 IF ( master_root .eq.
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 wk_user_provided = (
id%LWK_USER.NE.0)
1356 IF (
id%LWK_USER.EQ.0)
THEN
1358 ELSE IF (
id%LWK_USER.GT.0)
THEN
1359 itmp8= int(
id%LWK_USER,8)
1361 itmp8 = -int(
id%LWK_USER,8)* 1000000_8
1368 IF (keep(201).EQ.0)
THEN
1370 IF (itmp8.NE.keep8(24))
THEN
1373 info(2) =
id%LWK_USER
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 ELSE IF ( keep(252) .NE.0 )
THEN
1575 IF (prokg)
WRITE(mpg,
'(A,A)')
1576 &
' WARNING: Incompatible features: Fwd in facto ',
1577 &
' and Iter. Ref and/or Err. Anal.'
1579 ELSE IF (keep(221).NE.0)
THEN
1582 IF (prokg)
WRITE(mpg,
'(A,A)')
1583 &
' WARNING: Incompatible features: reduced RHS ',
1584 &
' and Iter. Ref and/or Err. Anal.'
1586 ELSE IF (nbrhs.GT. 1 .OR. icntl(21) .GT. 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 ELSE IF ( keep(248) .EQ. -1 )
THEN
1597 IF (prokg)
WRITE(mpg,
'(A,A)')
1598 &
' WARNING: Incompatible features: distrib rhs',
1599 &
' and Iter. Ref and/or Err. Anal.'
1602 IF (.NOT.postpros)
THEN
1608 IF ((icntl(10) .NE. 0) .AND. (icntl10 .EQ. 0))
THEN
1609 IF (prokg)
WRITE(mpg,
'(A)')
1610 &
' WARNING: ICNTL(10) treated as if set to 0 '
1612 IF ((icntl(11) .NE. 0)
1613 & .AND.(icntl11 .EQ. 0))
THEN
1614 IF (prokg)
WRITE(mpg,
'(A)')
1615 &
' WARNING: ICNTL(11) treated as if set to 0 '
1619 CALL mpi_bcast(postpros,1,mpi_logical,master,
1625 IF ( postpros )
THEN
1628 IF ( keep(54) .EQ. 0 )
THEN
1630 IF (
id%MYID .eq. master )
THEN
1631 IF (keep(55).eq.0)
THEN
1633 IF (.NOT.
associated(
id%A) .OR.
1634 & (.NOT.
associated(
id%IRN)) .OR.
1635 & ( .NOT.
associated(
id%JCN)))
THEN
1636 IF (prokg)
WRITE(mpg,
'(A)')
1637 &
' WARNING: original centralized assembled',
1638 &
' matrix is not allocated '
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 '
1668 CALL mpi_reduce( mat_alloc_loc, mat_alloc, 1,
1670 & mpi_min, master,
id%COMM, ierr)
1671 IF (
id%MYID .eq. master )
THEN
1672 IF (mat_alloc.EQ.0)
THEN
1677 IF ((icntl(10) .NE. 0) .AND. (icntl10 .EQ. 0))
THEN
1678 IF (prokg)
WRITE(mpg,
'(A)')
1679 &
' WARNING: ICNTL(10) treated as if set to 0 '
1681 IF ((icntl(11) .EQ. 1).OR.(icntl(11) .EQ. 2)
1682 & .AND.(icntl11 .EQ. 0))
THEN
1683 IF (prokg)
WRITE(mpg,
'(A)')
1684 &
' WARNING: ICNTL(11) treated as if set to 0 '
1688 ALLOCATE(saverhs(
id%N*nbrhs),stat = allocok)
1689 IF ( allocok .GT. 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 IF (keep(237).NE.0 .AND.keep(111).NE.0)
THEN
1707 IF (prokg)
WRITE(mpg,
'(A)')
1708 &
' WARNING: KEEP(237) treated as if set to 0 (null space)'
1715 IF (info(1) .LT.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 do_permute_rhs = (keep(242).NE.0)
1745 IF ( (
id%NSLAVES.GT.1) .AND. (keep(243).NE.0)
1750 IF ((keep(237).NE.0).or.(keep(111).GT.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)
1767 IF ( msg_max_bytes_solve8 .GT.
1768 & int(huge(i4),8))
THEN
1770 info(2) = ( huge(i4) -
1771 & ( 16 + 4 + keep(133) ) ) /
1772 & ( keep(133) * keep(35) )
1774 IF (info(1) .LT.0 )
GOTO 111
1775 msg_max_bytes_solve = int(msg_max_bytes_solve8)
1782 IF (keep(237).EQ.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 ELSE IF (icntl21.EQ.0)
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 IF ( allocok .GT. 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 IF ( i_am_slave .AND.
id%NSLAVES .GT. 1 )
THEN
1827 zmumps_lbuf_int = ( 20 +
id%NSLAVES *
id%NSLAVES * 4 )
1830 IF ( ierr .NE. 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))
1869 IF ( ierr .NE. 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 IF (
id%MYID .NE. 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 IF ( ierr .GT. 0 )
THEN
1896 WRITE(lp,*)
'ERROR while allocating RHS on a slave'
1907 do_nbsparse = ( ( (keep(237).NE.0).OR.(keep(235).NE.0) )
1909 & ( keep(497).NE.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 IF ((keep(221).EQ.2 .AND. keep(252).EQ.0))
THEN
1939 IF (.NOT.
associated(
id%RHSCOMP))
THEN
1946 IF (.NOT.
associated(
id%POSINRHSCOMP_ROW) )
1953 IF (.not.
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 IF ( allocok .GT. 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 IF ((keep(50).EQ.0).OR.keep(237).NE.0)
THEN
1989 ALLOCATE (
id%POSINRHSCOMP_COL(
id%N), stat = allocok)
1990 IF ( allocok .GT. 0 )
THEN
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 IF (keep(221).NE.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 IF (keep(201).EQ.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 IF (allocok .GT. 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 IF (allocok .GT. 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 IF ( allocok .GT. 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 IF ( (
id%MYID .eq. master.AND.(keep(23).GT.0) .AND.
2085 & (mtype .NE. 1).AND.(keep(248).NE.0)
2089 & .OR. ( keep(237).NE.0 .AND. keep(23).NE.0 )
2107 uns_perm_inv_needed_inmainloop = .true.
2109 uns_perm_inv_needed_befmainloop = .false.
2110 IF ( keep(23) .GT.0 .AND.
2111 & mtype .NE. 1 .AND. keep(248).EQ.-1 )
THEN
2116 uns_perm_inv_needed_befmainloop = .true.
2118 IF ( uns_perm_inv_needed_inmainloop .OR.
2119 & uns_perm_inv_needed_befmainloop )
THEN
2120 ALLOCATE(uns_perm_inv(
id%N),stat=allocok)
2121 if (allocok .GT.0 )
THEN
2126 nb_bytes = nb_bytes + int(
id%N,8)*k34_8
2127 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2128 IF (
id%MYID.EQ.master)
THEN
2131 uns_perm_inv(
id%UNS_PERM(i))=i
2136 ALLOCATE(uns_perm_inv(1), stat=allocok)
2137 if (allocok .GT.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)
2156 IF (info(1) .LT.0 )
GOTO 90
2159 IF ( keep(23).NE.0 .AND.
2160 & ( keep(237).NE.0 .OR.
2161 & ( mtype.NE.1 .AND. keep(248).EQ.-1 ) ) )
THEN
2163 CALL mpi_bcast( uns_perm_inv,
id%N,mpi_integer,master,
2170 IF (i_am_slave .AND. keep(248).EQ.-1)
THEN
2172 ALLOCATE(map_rhs_loc(
max(
id%Nloc_RHS,1)), stat=allocok)
2173 IF (allocok .GT. 0)
THEN
2178 nb_bytes = nb_bytes +
max(int(
id%Nloc_RHS,8),1_8)*k34_8
2183 build_rhsmapinfo = .true.
2187 IF ( info(1) .LT.0 )
GOTO 90
2192 IF ( i_am_slave .AND. keep(23).GT.0 .AND. keep(248).EQ.-1
2193 & .AND. mtype.NE.1 )
THEN
2194 IF (
id%Nloc_RHS .GT. 0)
THEN
2195 ALLOCATE(irhs_loc_ptr(
id%Nloc_RHS),stat=allocok)
2196 IF (allocok.GT.0)
THEN
2201 irhs_loc_ptr_allocated = .true.
2202 nb_bytes = nb_bytes +
max(int(
id%Nloc_RHS,8),1_8)*k34_8
2203 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2205 IF (
id%IRHS_loc(i).GE.1 .AND.
id%IRHS_loc(i).LE.
id%N)
2207 irhs_loc_ptr(i)=uns_perm_inv(
id%IRHS_loc(i))
2210 irhs_loc_ptr(i)=
id%IRHS_loc(i)
2217 IF (uns_perm_inv_needed_befmainloop .AND.
2218 & .NOT. uns_perm_inv_needed_inmainloop)
THEN
2219 nb_bytes = nb_bytes - int(
size(uns_perm_inv),8)*k34_8
2220 DEALLOCATE(uns_perm_inv)
2221 ALLOCATE(uns_perm_inv(1))
2222 nb_bytes = nb_bytes + k34_8
2224 IF (lscal .AND.
id%KEEP(248).EQ.-1)
THEN
2227 IF (mtype == 1)
THEN
2229 scaling_data_dr%SCALING=>
id%ROWSCA
2232 scaling_data_dr%SCALING=>
id%COLSCA
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) )
2247 IF ( info(1) .LT.0 )
GOTO 90
2252 IF ( icntl21==1 )
THEN
2257 IF (
id%MYID.NE.master)
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)
2276 IF (info(1) .LT.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)
2294 IF (info(1) .LT.0 )
THEN
2297 IF (mtype == 1)
THEN
2299 & mpi_double_precision,master,
2301 scaling_data_sol%SCALING=>
id%COLSCA
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 IF (keep(89) .GT. 0)
THEN
2320 &
id%KEEP(1),
id%KEEP8(1),
2321 &
id%IS(1), liw_passed,
id%MYID_NODES,
2322 &
id%N,
id%STEP(1),
id%PROCNODE_STEPS(1),
2323 &
id%NSLAVES, scaling_data_sol, lscal
2325 & , (keep(248).EQ.-1), irhs_loc_ptr(1),
id%Nloc_RHS
2328 IF (
id%MYID.NE.master .AND. 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 IF (keep(23) .NE. 0 .AND. mtype==1)
THEN
2346 IF (
id%MYID.NE.master)
THEN
2347 ALLOCATE(
id%UNS_PERM(
id%N),stat=allocok)
2348 IF (allocok > 0)
THEN
2360 IF (info(1) .LT.0 )
GOTO 90
2363 IF (keep(23) .NE. 0 .AND. mtype==1)
THEN
2366 IF (i_am_slave)
THEN
2368 id%ISOL_loc(i) =
id%UNS_PERM(
id%ISOL_loc(i))
2371 IF (
id%MYID.NE.master)
THEN
2372 DEALLOCATE(
id%UNS_PERM)
2373 NULLIFY(
id%UNS_PERM)
2384 IF ( ( keep(221) .EQ. 1 ) .OR.
2385 & ( keep(221) .EQ. 2 )
2389 IF (keep(46).EQ.1)
THEN
2390 master_root_in_comm=master_root
2392 master_root_in_comm =master_root+1
2394 IF (
id%MYID .EQ. master )
THEN
2399 IF (
id%NRHS.EQ.1)
THEN
2400 ld_redrhs =
id%KEEP(116)
2402 ld_redrhs =
id%LREDRHS
2405 IF (master.NE.master_root_in_comm)
THEN
2410 IF (
id%MYID .EQ. master )
THEN
2413 CALL mpi_send(ld_redrhs,1,mpi_integer,
2414 & master_root_in_comm, 0,
id%COMM,ierr)
2415 ELSEIF (
id%MYID.EQ.master_root_in_comm)
THEN
2417 CALL mpi_recv(ld_redrhs,1,mpi_integer,
2418 & master, 0,
id%COMM,status,ierr)
2424 IF ( keep(248)==1 )
THEN
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 IF (
id%MYID.EQ.master)
THEN
2450 IF (keep(237).EQ.0)
THEN
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,
2473 strat_permam1 = keep
2475 & (strat_permam1,
id%SYM_PERM(1),
2476 &
id%IRHS_PTR(1),
id%NRHS+1,
2477 & perm_rhs,
id%NRHS,
2494 IF (.NOT.
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)
2507 IF (info(1) .LT.0 )
GOTO 90
2510 IF (
id%NSLAVES .EQ. 1)
THEN
2514 IF (do_permute_rhs .AND. keep(111).NE.0 )
THEN
2518 WRITE(*,*)
id%MYID,
':INTERNAL ERROR 1 : ',
2519 &
' PERMUTE RHS during null space computation ',
2520 &
' not available yet '
2524 IF (do_permute_rhs .AND. keep(111).NE.0 )
THEN
2525 WRITE(*,*)
id%MYID,
':INTERNAL ERROR 2 : ',
2526 &
' PERMUTE RHS during null space computation ',
2527 &
' not available yet '
2532 IF (interleave_par.AND. (keep(111).NE.0))
THEN
2533 WRITE(*,*)
id%MYID,
':INTERNAL ERROR 3 : ',
2534 &
' INTERLEAVE RHS during null space computation ',
2535 &
' not available yet '
2538 IF (interleave_par.AND.keep(111).EQ.0)
THEN
2541 IF (
id%MYID.EQ.master)
THEN
2544 size_working =
id%IPTR_WORKING(
id%NPROCS+1)-1
2545 size_iptr_working =
id%NPROCS+1
2547 & perm_rhs,
id%NRHS,
2548 &
id%IPTR_WORKING(1), size_iptr_working,
2549 &
id%WORKING(1), size_working,
2551 &
id%STEP(1),
id%SYM_PERM(1),
id%N, nbrhs,
2552 &
id%PROCNODE_STEPS(1), keep(28),
id%NSLAVES,
2555 & keep(495).NE.0, keep(496), prokg, mpg
2563 IF (do_permute_rhs.AND.(keep(111).EQ.0))
THEN
2570 & master,
id%COMM,ierr)
2573 IF (keep(401) .GT. 0)
THEN
2578 IF ( keep(400) .GT. 0 )
THEN
2584 IF (keep(400).NE.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 IF (keep(400) .GT. 0)
THEN
2611 DO WHILE (beg_rhs.LE.nrhs_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 & (
id%MYID .NE. master )
2665 & ( i_am_slave .AND.
id%MYID .EQ. master .AND.
2666 & icntl21 .NE.0 .AND.
2667 & ( keep(248).ne.0 .OR. keep(221).EQ.2
2668 & .OR. keep(111).NE.0 )
2676 & (
id%MYID .EQ. master .AND. (keep(237).NE.0) )
2683 IF (
associated(
id%RHS) )
THEN
2690 ibeg = int(beg_rhs-1,8) * int(ld_rhs,8) + 1_8
2700 IF ( (
id%MYID.EQ.master) .AND.
2701 & keep(248)==1 )
THEN
2704 jbeg_rhs = jend_rhs + 1
2705 IF (do_permute_rhs.OR.interleave_par)
THEN
2706 DO WHILE (
id%IRHS_PTR(perm_rhs(jbeg_rhs)) .EQ.
2707 &
id%IRHS_PTR(perm_rhs(jbeg_rhs)+1) )
2709 IF ((keep(237).EQ.0).AND.(icntl21.EQ.0).AND.
2710 & (keep(221).NE.1) )
THEN
2715 id%RHS(int(perm_rhs(jbeg_rhs) -1,8)*int(ld_rhs,8)+
2719 jbeg_rhs = jbeg_rhs +1
2722 DO WHILE(
id%IRHS_PTR(jbeg_rhs) .EQ.
2723 &
id%IRHS_PTR(jbeg_rhs+1) )
2724 IF ((keep(237).EQ.0).AND.(icntl21.EQ.0).AND.
2725 & (keep(221).NE.1) )
THEN
2730 id%RHS(int(jbeg_rhs -1,8)*int(ld_rhs,8) +
2734 IF (keep(221).EQ.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
2750 nb_rhsskipped = jbeg_rhs - (jend_rhs + 1)
2751 IF ((keep(248).EQ.1).AND.(keep(237).EQ.0)
2752 & .AND. (icntl21.EQ.0))
2757 ibeg = int(jbeg_rhs-1,8) * int(ld_rhs,8) + 1_8
2760 CALL mpi_bcast( jbeg_rhs, 1, mpi_integer,
2761 & master,
id%COMM, ierr )
2765 IF (
id%MYID.EQ.master .AND. keep(221).NE.0)
THEN
2768 ibeg_redrhs= int(jbeg_rhs-1,8)*int(ld_redrhs,8) + 1_8
2770 ibeg_redrhs=-142424_8
2778 CALL vtbegin(perm_scal_ini,ierr)
2780 IF (
id%MYID .eq. 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 IF (do_permute_rhs.OR.interleave_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 IF ((.NOT.stop_at_next_empty_col).AND.(colsize.GT.0).AND.
2822 & (keep(237).EQ.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 IF (nbcol.EQ.nbrhs_eff)
EXIT
2840 IF (nz_this_block.EQ.0)
THEN
2841 WRITE(*,*)
" Internal Error 16 in sol driver NZ_THIS_BLOCK=",
2846 IF (nbcol.NE.nbrhs_eff.AND. (keep(237).NE.0)
2847 & .AND.keep(221).NE.1)
THEN
2855 WRITE(6,*)
' Internal Error 8 in solution driver ',
2861 IF (nz_this_block .NE. 0)
THEN
2866 ALLOCATE(irhs_ptr_copy(nbcol_inbloc+1),stat=allocok)
2867 if (allocok .GT.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 IF (do_permute_rhs.OR.interleave_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
2901 irhs_ptr_copy(nbcol_inbloc+1)= ipos
2902 IF ( ipos-1 .NE. nz_this_block )
THEN
2903 WRITE(*,*)
"Error in compressed copy of IRHS_PTR"
2911 IF (keep(23) .NE. 0 .and. mtype .NE. 1)
THEN
2913 ALLOCATE(irhs_sparse_copy(nz_this_block)
2915 if (allocok .GT.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 ELSE IF (do_permute_rhs.OR.interleave_par.OR.
2924 & (keep(237).NE.0))
THEN
2931 ALLOCATE(irhs_sparse_copy(nz_this_block),
2933 IF (allocok .GT.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 IF ( do_permute_rhs.OR.interleave_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 IF (lscal.OR.do_permute_rhs.OR.interleave_par.OR.
2968 & (keep(237).NE.0))
THEN
2975 ALLOCATE(rhs_sparse_copy(nz_this_block),
2977 IF (allocok .GT.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 IF (do_permute_rhs.OR.interleave_par.OR.
2999 & (
id%KEEP(237).NE.0))
THEN
3000 IF (
id%KEEP(237).NE.0)
THEN
3003 rhs_sparse_copy = one
3004 ELSE IF (.NOT. 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 IF (colsize .EQ. 0) cycle
3013 rhs_sparse_copy(ipos:ipos+colsize-1) =
3014 &
id%RHS_SPARSE(
id%IRHS_PTR(perm_rhs(i)):
3015 &
id%IRHS_PTR(perm_rhs(i)+1) -1)
3016 ipos = ipos + colsize
3021 IF (keep(23) .NE. 0)
THEN
3024 IF (mtype .NE. 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
3061 IF (info(1) .LT.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 IF ((keep(111).eq.0).AND.(keep(252).EQ.0)
3073 & .AND.(keep(221).NE.2 ).AND.(keep(248).EQ.1) )
THEN
3077 CALL mpi_bcast( nz_this_block,1, mpi_integer,
3078 & master,
id%COMM,ierr)
3079 IF (
id%MYID.NE.master .and. nz_this_block.NE.0)
THEN
3080 ALLOCATE(irhs_sparse_copy(nz_this_block),
3082 if (allocok .GT.0 )
then
3084 info(2)=nz_this_block
3087 irhs_sparse_copy_allocated=.true.
3093 ALLOCATE(rhs_sparse_copy(nz_this_block),
3095 if (allocok .GT.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 if (allocok .GT.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)
3119 IF (info(1) .LT.0 )
GOTO 90
3121 IF (nz_this_block > 0)
THEN
3125 & master,
id%COMM,ierr)
3129 & master,
id%COMM,ierr)
3131 WRITE (*,*)
'NOT OK FOR ALLOC PTR ON SLAVES'
3141 IF ( i_am_slave )
THEN
3171 IF ( keep(221).EQ.2 .AND. keep(252).EQ.0
3172 & .AND. (keep(248).NE.1 .OR. (
id%NRHS.EQ.1))
3185 build_posinrhscomp = .false.
3190 IF (build_posinrhscomp)
THEN
3195 build_posinrhscomp = .false.
3199 IF ( (keep(111).NE.0) .OR. (keep(237).NE.0) .OR.
3200 & (keep(252).NE.0) )
THEN
3202 IF (keep(111).NE.0)
THEN
3215 ELSE IF (keep(252).NE.0)
THEN
3222 build_posinrhscomp = .true.
3226 liw_passed=
max(1,liw)
3227 IF (keep(237).EQ.0)
THEN
3230 &
id%MYID_NODES,
id%PTLUST_S(1),
3231 &
id%KEEP(1),
id%KEEP8(1),
3232 &
id%PROCNODE_STEPS(1),
id%IS(1), liw_passed,
3234 &
id%POSINRHSCOMP_ROW(1),
id%POSINRHSCOMP_COL(1),
3235 &
id%POSINRHSCOMP_COL_ALLOC,
3237 & nbent_rhscomp, nb_fs_rhscomp_tot )
3238 nb_fs_rhscomp_f = nb_fs_rhscomp_tot
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)
3257 IF (build_rhsmapinfo .AND. keep(248).EQ.-1)
THEN
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.
3272 IF (info(1) .LT.0 )
GOTO 90
3273 IF (i_am_slave)
THEN
3274 IF (keep(221).EQ.1)
THEN
3280 IF (.not.
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 IF ( allocok .GT. 0 )
THEN
3297 nb_bytes = nb_bytes +
id%KEEP8(25)*k35_8
3298 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
3301 IF ((keep(221).NE.1).AND.
3302 & ((keep(221).NE.2).OR.(keep(252).NE.0))
3308 ld_rhscomp =
max(nbent_rhscomp, ld_rhscomp)
3310 IF (
associated(
id%RHSCOMP))
THEN
3311 IF ( (
id%KEEP8(25).LT.int(ld_rhscomp,8)*int(nbrhs,8))
3312 & .OR. (keep(235).NE.0).OR.(keep(237).NE.0) )
THEN
3314 ! _larger array needed
3319 nb_bytes = nb_bytes -
id%KEEP8(25)*k35_8
3320 DEALLOCATE(
id%RHSCOMP)
3325 IF (.not.
associated(
id%RHSCOMP))
THEN
3326 ld_rhscomp =
max(nbent_rhscomp, 1)
3327 id%KEEP8(25) = int(ld_rhscomp,8)*int(nbrhs,8)
3328 ALLOCATE (
id%RHSCOMP(
id%KEEP8(25)), stat = allocok )
3329 IF ( allocok .GT. 0 )
THEN
3334 nb_bytes = nb_bytes +
id%KEEP8(25)*k35_8
3335 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
3338 IF (keep(221).EQ.2)
THEN
3342 ld_rhscomp = int(
id%KEEP8(25)/int(
id%NRHS,8))
3347 IF ( keep(221).EQ.0 )
THEN
3353 ibeg_rhscomp= int(jbeg_rhs-1,8)*int(ld_rhscomp,8) + 1_8
3360 IF (info(1) .LT.0 )
GOTO 90
3367 IF (
id%MYID .eq. master)
THEN
3369 IF (keep(23) .NE. 0)
THEN
3372 IF (mtype .NE. 1)
THEN
3382 IF (keep(248)==0)
THEN
3386 ALLOCATE( c_rw2(
id%N ),stat =allocok )
3387 IF ( allocok .GT. 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 IF (mtype .EQ. 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 IF ((keep(248)==1) .AND.
3463 & (do_permute_rhs.OR.interleave_par.OR.
3464 & (
id%KEEP(237).NE.0))
3471 DO i=jbeg_rhs, jbeg_rhs + nbcol_inbloc -1
3472 IF (do_permute_rhs.OR.interleave_par)
THEN
3477 colsize = irhs_ptr_copy(j+1) - irhs_ptr_copy(j)
3479 IF (colsize .EQ. 0) cycle
3480 IF (
id%KEEP(237).NE.0)
THEN
3481 IF (do_permute_rhs.OR.interleave_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 IF (mtype.EQ.1)
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
3526 IF (mtype .eq. 1)
THEN
3527 DO iz=1,nz_this_block
3528 i=irhs_sparse_copy(iz)
3529 rhs_sparse_copy(iz)=
id%RHS_SPARSE(kdec+iz-1)*
3533 DO iz=1,nz_this_block
3534 i=irhs_sparse_copy(iz)
3535 rhs_sparse_copy(iz)=
id%RHS_SPARSE(kdec+iz-1)*
3544 CALL vtend(perm_scal_ini,ierr)
3550 IF ((keep(248).EQ.1).AND.(keep(237).EQ.0))
THEN
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)
3574 IF ((keep(111).eq.0).AND.(keep(252).EQ.0)
3575 & .AND.(keep(221).NE.2 ))
THEN
3580 IF (keep(248) == 0)
THEN
3584 IF ( .NOT.i_am_slave )
THEN
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 IF (
id%MYID .eq. master)
THEN
3600 ncol_rhs_loc = nbrhs_eff
3603 ptr_rhs => cdummy_target
3608 liw_passed =
max( liw, 1 )
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 IF (info(1).LT.0)
GOTO 90
3623 ELSE IF (keep(248) .EQ. -1)
THEN
3624 IF (i_am_slave)
THEN
3625 IF (
id%Nloc_RHS .NE. 0)
THEN
3626 rhs_loc_size=int(
id%LRHS_loc,8)*int(nbrhs_eff-1,8)+
3627 & int(
id%Nloc_RHS,8)
3628 rhs_loc_shift=1_8+int(beg_rhs-1,8)*
id%LRHS_loc
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)
3650 IF (info(1).LT.0)
GOTO 90
3655 IF (nz_this_block > 0)
THEN
3658 & mpi_double_complex,
3659 & master,
id%COMM, ierr)
3664 IF (keep(237).NE.0)
THEN
3665 IF ( i_am_slave )
THEN
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 IF (colsize.GT.0)
THEN
3680 j = i - 1 + jbeg_rhs
3681 IF (do_permute_rhs.OR.interleave_par)
THEN
3684 iposrhscomp =
id%POSINRHSCOMP_ROW(j)
3687 IF (iposrhscomp.GT.0)
THEN
3698 id%RHSCOMP(int(k-1,8)*int(ld_rhscomp,8)+
3699 & int(iposrhscomp,8)) =
3700 & rhs_sparse_copy(ipos)
3703 ipos = ipos + colsize
3706 IF (k.NE.nbrhs_eff+1)
THEN
3707 WRITE(6,*)
'Internal Error 9 in solution driver ',
3720 IF ((keep(221).EQ.1).AND.(nb_rhsskipped.GT.0)
3721 & .AND.i_am_slave)
THEN
3722 DO k = jbeg_rhs-nb_rhsskipped, jbeg_rhs-1
3723 DO i = 1, ld_rhscomp
3724 id%RHSCOMP(int(k-1,8)*int(ld_rhscomp,8)
3725 & + int(i,8)) = zero
3729 IF (i_am_slave)
THEN
3730 DO k = 1, nbcol_inbloc
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 IF ( (iposrhscomp.LE.nb_fs_rhscomp_tot)
3746 & .AND.(iposrhscomp.GT.0) )
THEN
3748 id%RHSCOMP(kdec+iposrhscomp)=
3749 &
id%RHSCOMP(kdec+iposrhscomp) +
3750 & rhs_sparse_copy(iz)
3758 ELSE IF (i_am_slave)
THEN
3760 IF (keep(111).NE.0)
THEN
3780 IF (keep(111).GT.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 IF (
id%KEEP(112) .GT. 0 .AND. do_null_piv)
THEN
3788 IF (ibeg_glob_def .GT.
id%KEEP(112))
THEN
3790 do_null_piv = .false.
3792 IF (ibeg_glob_def .LT.
id%KEEP(112)
3793 & .AND. iend_glob_def .GT.
id%KEEP(112)
3794 & .AND. do_null_piv )
THEN
3801 do_null_piv = .false.
3804 IF (
id%KEEP(235).NE.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 IF (allocok .GT.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 IF (allocok .GT.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 IF (
id%MYID.eq.master)
THEN
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
3845 IF (info(1) .LT.0 )
GOTO 90
3850 & master,
id%COMM,ierr)
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 IF (keep(50).EQ.0)
THEN
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))
3886 id%RHSCOMP( ibeg_rhscomp+
3887 & int(i-ibeg_glob_def,8)*int(ld_rhscomp,8)+
3893 IF ( keep(17).NE.0 .AND.
3894 &
id%MYID_NODES.EQ.master_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
3926 timescatter2=
mpi_wtime()-timescatter1+timescatter2
3932 IF ( i_am_slave )
THEN
3934 IF (
id%MYID_NODES .EQ. 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
3955 ptr_rhs_root => work_wcb(ipt_rhs_root:lwcb8)
3956 lwcb8_sol_c = lwcb8_sol_c - lptr_rhs_root
3959 IF (keep(221) .EQ. 2 )
THEN
3964 IF ( (
id%MYID .EQ. master_root_in_comm ) .AND.
3965 & (
id%MYID .EQ. 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 IF (
id%MYID .EQ. master)
THEN
3980 IF (ld_redrhs.EQ.size_root)
THEN
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)
3992 & mpi_double_complex,
3993 & master_root_in_comm, 0,
id%COMM,ierr)
3996 ELSE IF (
id%MYID .EQ. master_root_in_comm )
THEN
3999 IF (ld_redrhs.EQ.size_root)
THEN
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 IF ((
id%KEEP(235).EQ.0).and.(
id%KEEP(237).EQ.0) )
THEN
4027 nbsparse_loc = (do_nbsparse.AND.nbrhs_eff.GT.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 nbsparse_loc = (do_nbsparse.AND.nbrhs_eff.GT.1)
4056 & liw_passed,work_wcb(1),lwcb8_sol_c,iwcb,liwcb,nbrhs_eff,
id%NA(1),
4057 &
id%LNA,
id%NE_STEPS(1),srw3,mtype,icntl(1),from_pp,
id%STEP(1),
4058 &
id%FRERE_STEPS(1),
id%DAD_STEPS(1),
id%FILS(1),
id%PTLUST_S(1),
4059 &
id%PTRFAC(1), iwk_solve, liwk_solve, ptracb, liwk_ptracb,
4060 &
id%PROCNODE_STEPS(1),
id%NSLAVES,info(1),keep(1), keep8(1),
4061 &
id%DKEEP(1),
id%COMM_NODES,
id%MYID,
id%MYID_NODES,bufr(1),lbufr,
4062 & lbufr_bytes,
id%ISTEP_TO_INIV2(1),
id%TAB_POS_IN_PERE(1,1),
4063 & ibeg_root_def,iend_root_def,iroot_def_rhs_col1,ptr_rhs_root(1),
4064 & lptr_rhs_root, size_root, master_root,
id%RHSCOMP(ibeg_rhscomp),
4065 & ld_rhscomp,
id%POSINRHSCOMP_ROW(1),
id%POSINRHSCOMP_COL(1),
4066 & nz_this_block, nbcol_inbloc,
id%NRHS, jbeg_rhs,
id%Step2node(1),
4067 &
id%KEEP(28),irhs_sparse_copy(1),irhs_ptr_copy(1),
size(perm_rhs),
4068 & perm_rhs,
size(uns_perm_inv), uns_perm_inv, nb_fs_rhscomp_f,
4069 & nb_fs_rhscomp_tot,nbsparse_loc,ptr_rhs_bounds(1),lptr_rhs_bounds
4070 & ,
id%IPOOL_B_L0_OMP(1),
id%LPOOL_B_L0_OMP,
id%IPOOL_A_L0_OMP(1),
4071 &
id%LPOOL_A_L0_OMP,
id%L_VIRT_L0_OMP,
id%VIRT_L0_OMP(1),
4072 &
id%L_PHYS_L0_OMP,
id%PHYS_L0_OMP(1),
id%PERM_L0_OMP(1),
4073 &
id%PTR_LEAFS_L0_OMP(1),
id%L0_OMP_MAPPING(1),
id%LL0_OMP_MAPPING,
4074 &
id%L0_OMP_FACTORS(1),
id%LL0_OMP_FACTORS )
4088 IF (info(1).eq.-2)
then
4092 &
' WARNING : -11 error code obtained in solve'
4094 IF (info(1).eq.-3)
then
4098 &
' WARNING : -14 error code obtained in solve'
4102 IF (info(1).LT.0)
GO TO 90
4108 IF ( keep(221) .EQ. 1 )
THEN
4115 IF ( (
id%MYID .EQ. master_root_in_comm ) .AND.
4116 & (
id%MYID .EQ. 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 IF (
id%MYID .EQ. master )
THEN
4130 IF (ld_redrhs.EQ.size_root)
THEN
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)
4143 & mpi_double_complex,
4144 & master_root_in_comm, 0,
id%COMM,
4148 ELSE IF (
id%MYID .EQ. master_root_in_comm )
THEN
4151 IF (ld_redrhs.EQ.size_root)
THEN
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)
4172 IF ( keep(221) .NE. 1 )
THEN
4174 IF (icntl21 == 0)
THEN
4189 IF (keep(237).EQ.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 IF ( (
id%MYID.EQ.master).AND. (keep(237).NE.0)
4199 & .AND. (
id%NSLAVES.NE.1))
THEN
4202 ALLOCATE (map_rhs(
id%N), stat = allocok)
4203 IF ( allocok .GT. 0 )
THEN
4205 WRITE(lp,*)
' Problem allocation of MAP_RHS at solve'
4210 nb_bytes = nb_bytes + int(
id%N,8) * k34_8
4211 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
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 IF ( prokg .AND. icntl10 .NE. 0 )
WRITE( mpg, 270 )
4418 nitref = abs(icntl10)
4419 ALLOCATE(r_y(
id%N), stat = allocok)
4420 IF ( allocok .GT. 0 )
THEN
4425 nb_bytes = nb_bytes + int(
id%N,8)*k16_8
4426 ALLOCATE(c_y(
id%N), stat = allocok)
4427 IF ( allocok .GT. 0 )
THEN
4432 nb_bytes = nb_bytes + int(
id%N,8)*k35_8
4433 IF (
id%MYID .EQ. master )
THEN
4434 ALLOCATE( iw1( 2 *
id%N ),stat = allocok )
4435 IF ( allocok .GT. 0 )
THEN
4440 nb_bytes = nb_bytes + int(2*
id%N,8)*k34_8
4441 ALLOCATE( c_w(
id%N), stat = allocok )
4442 IF ( allocok .GT. 0 )
THEN
4447 nb_bytes = nb_bytes + int(
id%N,8)*k35_8
4448 ALLOCATE( r_w(2*
id%N), stat = allocok )
4449 IF ( allocok .GT. 0 )
THEN
4454 nb_bytes = nb_bytes + int(2*
id%N,8)*k16_8
4455 IF ( prokg .AND. icntl10 .GT. 0 )
4456 &
WRITE( mpg, 240)
'MAXIMUM NUMBER OF STEPS =', nitref
4459 ALLOCATE(c_locwk54(
id%N),stat = allocok)
4460 IF ( allocok .GT. 0 )
THEN
4465 nb_bytes = nb_bytes + int(
id%N,8)*k35_8
4466 ALLOCATE(r_locwk54(
id%N),stat = allocok)
4467 IF ( allocok .GT. 0 )
THEN
4472 nb_bytes = nb_bytes + int(
id%N,8)*k16_8
4476 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
4479 IF ( info(1) .LT. 0 )
GOTO 90
4499 IF ((icntl11.GT.0).OR.(icntl10.GT.0))
THEN
4501 IF ( keep(54) .eq. 0 )
THEN
4505 IF (
id%MYID .eq. master )
THEN
4511 IF (keep(55).NE.0)
THEN
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 IF ( mtype .eq. 1 )
THEN
4522 & (
id%A(1),
id%KEEP8(28),
id%N,
id%IRN(1),
id%JCN(1),
4523 & r_w(
id%N+1), keep(1),keep8(1),
4524 & 0,
id%SYM_PERM(1) )
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 IF ( i_am_slave .and.
4538 &
id%KEEP8(29) .NE. 0_8 )
THEN
4539 IF ( mtype .eq. 1 )
THEN
4541 &
id%KEEP8(29),
id%N,
4542 &
id%IRN_loc(1),
id%JCN_loc(1),
4543 & r_locwk54,
id%KEEP(1),
id%KEEP8(1),
4544 & 0,
id%SYM_PERM(1) )
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 IF (
id%MYID .eq. master )
THEN
4560 &
id%N, mpi_double_precision,
4561 & mpi_sum,master,
id%COMM, ierr)
4564 &
id%N, mpi_double_precision,
4565 & mpi_sum,master,
id%COMM, ierr)
4570 IF (
id%MYID .eq. master )
THEN
4572 rinfog(4) = dble(zero)
4574 rinfog(4) =
max(r_w(
id%N +i), rinfog(4))
4587 IF ((
id%MYID .eq. master ).AND.(icntl10.GT.0))
THEN
4590 IF (arret .LT. 0.0d0)
THEN
4591 arret = sqrt(epsilon(0.0d0))
4596 DO 22 irstep = 1, nitref +1
4602 IF ((
id%MYID .eq. master ).AND.(irstep.GT.1))
THEN
4605 id%RHS(ibeg+i-1) =
id%RHS(ibeg+i-1) + c_y(i)
4611 IF ( keep(54) .eq. 0 )
THEN
4612 IF (
id%MYID .eq. master )
THEN
4613 IF (keep(55).NE.0)
THEN
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 IF ( mtype .eq. 1 )
THEN
4624 &
id%JCN(1), saverhs,
4625 &
id%RHS(ibeg), c_y, r_w, keep(1),keep8(1))
4629 &
id%IRN(1), saverhs,
4630 &
id%RHS(ibeg), c_y, r_w, keep(1),keep8(1))
4639 & mpi_double_complex, master,
4645 IF ( i_am_slave .and.
4646 &
id%KEEP8(29) .NE. 0_8 )
THEN
4648 &
id%IRN_loc(1),
id%JCN_loc(1),
id%A_loc(1),
4649 & rhs_ir(ibeg), c_locwk54, keep(50), mtype )
4653 IF (
id%MYID .eq. master )
THEN
4655 &
id%N, mpi_double_complex,
4656 & mpi_sum,master,
id%COMM, ierr)
4662 &
id%N, mpi_double_complex,
4663 & mpi_sum,master,
id%COMM, ierr)
4676 IF ( i_am_slave .and.
id%KEEP8(29) .NE. 0_8 )
THEN
4678 &
id%IRN_loc(1),
id%JCN_loc(1),
id%A_loc(1),
4679 & rhs_ir(ibeg), r_locwk54, keep(50), mtype )
4683 IF (
id%MYID .eq. master )
THEN
4685 &
id%N, mpi_double_precision,
4686 & mpi_sum,master,
id%COMM, ierr)
4689 &
id%N, mpi_double_precision,
4690 & mpi_sum, master,
id%COMM, ierr)
4696 IF (
id%MYID .eq. master )
THEN
4698 IF ((icntl11.GT.0).OR.(icntl10.GT.0))
THEN
4706 IF (((icntl11.GT.0).OR.((icntl10.LT.0).AND.
4707 & ((irstep.EQ.1).OR.(irstep.EQ.nitref+1)))
4708 & .OR.((icntl10.EQ.0).AND.(irstep.EQ.1)))
4709 & .OR.(icntl10.GT.0))
THEN
4715 &
id%RHS(ibeg), c_y, r_w, c_w, iw1, iflag_ir,
4716 & rinfog(7), noiter, testconv,
4717 & mp, arret, keep(361) )
4718 IF (icntl10.LT.0)
THEN
4720 id%DKEEP(120)=
id%DKEEP(120)+timeea1
4723 IF ((icntl11.GT.0).AND.(
4724 & (icntl10.LT.0.AND.(irstep.EQ.1.OR.irstep.EQ.nitref+1))
4725 & .OR.((icntl10.GE.0).AND.(irstep.EQ.1))
4731 IF (icntl10.EQ.0)
THEN
4733 IF ( mpg .GT. 0 )
WRITE( mpg, 170 )
4734 ELSEIF (irstep.EQ.1)
THEN
4736 IF ( mpg .GT. 0 )
WRITE( mpg, 55 )
4737 ELSEIF ((icntl10.LT.0).AND.(irstep.EQ.nitref+1))
THEN
4740 IF ( mpg .GT. 0 )
THEN
4744 &
'NUMBER OF STEPS OF ITERATIVE REFINEMENT REQUESTED =',
4751 & saverhs,r_w(
id%N+1),c_y,givsol,
4752 & rinfog(4),rinfog(5),rinfog(6),mpg,icntl(1),
4754 IF ( mpg .GT. 0 )
THEN
4757 &
'RINFOG(7):COMPONENTWISE SCALED RESIDUAL(W1)=',
4760 &
'------(8):---------------------------- (W2)=',
4764 id%DKEEP(120)=
id%DKEEP(120)+timeea
4769 IF (irstep.EQ.nitref +1)
THEN
4776 IF ((icntl10.GT.0).AND.(iflag_ir.EQ.0))
4777 &
id%INFO(1) =
id%INFO(1) + 8
4779 IF (icntl10.GT.0)
THEN
4787 IF (iflag_ir.GT.0)
THEN
4795 IF (iflag_ir.EQ.2) noiter = noiter - 1
4800 ELSEIF (icntl10.LT.0)
THEN
4814 CALL mpi_bcast( kase, 1, mpi_integer, master,
4817 IF (kase.LE.0)
GOTO 666
4819 WRITE(*,*)
"Internal error 17 in ZMUMPS_SOL_DRIVER"
4826 IF (info(1) .LT. 0)
GOTO 90
4840 IF (
id%MYID .EQ. master )
THEN
4841 IF ( nitref .GT. 0 )
THEN
4842 id%INFOG(15) = noiter
4848 IF (icntl10.EQ.0)
THEN
4851 id%DKEEP(120)=timeit
4854 id%DKEEP(114)=timeit -
id%DKEEP(120)
4858 IF (icntl10.GT.0)
THEN
4862 &
'NUMBER OF STEPS OF ITERATIVE REFINEMENTS PERFORMED =',
4871 IF ((icntl11 .GT. 0).AND.(icntl10.GT.0))
THEN
4878 IF (
id%MYID .eq. master )
THEN
4882 IF (iflag_ir.EQ.2) kase = 2
4887 CALL mpi_bcast( kase, 1, mpi_integer, master,
4895 IF ( keep(54) .eq. 0 )
THEN
4899 IF (
id%MYID .EQ. master)
THEN
4900 IF (keep(55).EQ.0)
THEN
4902 &
id%IRN(1),
id%JCN(1),
4903 &
id%RHS(ibeg), saverhs, r_y, c_y, keep(1),keep8(1))
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))
4917 & mpi_double_complex, master,
4922 IF ( i_am_slave .and.
4923 &
id%KEEP8(29) .NE. 0_8 )
THEN
4925 &
id%IRN_loc(1),
id%JCN_loc(1),
id%A_loc(1),
4926 & rhs_ir(ibeg), c_locwk54, keep(50), mtype )
4930 IF (
id%MYID .eq. master )
THEN
4932 &
id%N, mpi_double_complex,
4933 & mpi_sum,master,
id%COMM, ierr)
4937 &
id%N, mpi_double_complex,
4938 & mpi_sum,master,
id%COMM, ierr)
4942 IF (
id%MYID .EQ. master)
THEN
4946 IF (iflag_ir.EQ.2)
THEN
4949 &
id%RHS(ibeg), c_y, r_w, c_w, iw1, iflag_ir,
4950 & rinfog(7), 0, testconv,
4951 & mp, arret, keep(361) )
4957 & saverhs,r_w(
id%N+1),c_y,givsol,
4958 & rinfog(4),rinfog(5),rinfog(6),mpg,icntl(1),
4962 id%DKEEP(120)=
id%DKEEP(120)+timeea
4968 IF (icntl11 .EQ. 1)
THEN
4969 IF (
id%MYID .eq. master )
THEN
4971 ALLOCATE( d(
id%N),stat =allocok )
4972 IF ( allocok .GT. 0 )
THEN
4977 nb_bytes = nb_bytes + int(
id%N,8)*k16_8
4984 IF (
id%MYID .EQ. master )
THEN
4986 &
id%RHS(ibeg), c_y, d, r_w, c_w, iw1, kase,
4987 & rinfog(7), rinfog(9), rinfog(10),
4988 & mp, keep(1),keep8(1))
4993 CALL mpi_bcast( kase, 1, mpi_integer, master,
4998 IF (kase.LE.0)
GOTO 224
5000 IF (info(1) .LT. 0)
GOTO 90
5011 id%DKEEP(121)=
id%DKEEP(121)+timelcond
5012 IF ((
id%MYID .EQ. master).AND.(icntl11.GT.0))
THEN
5013 IF (icntl10.GT.0)
THEN
5015 IF ( mpg .GT. 0 )
THEN
5017 &
'RINFOG(7):COMPONENTWISE SCALED RESIDUAL(W1)=',
5020 &
'------(8):---------------------------- (W2)=',
5024 IF (icntl11.EQ.1)
THEN
5028 &
'------(9):Upper bound ERROR ...............=',
5031 &
'-----(10):CONDITION NUMBER (1) ............=',
5034 &
'-----(11):CONDITION NUMBER (2) ............=',
5039 IF ( prokg .AND. abs(icntl10) .GT.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 IF (icntl11 .EQ. 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 IF (
id%MYID .EQ. master .AND. icntl21==0
5082 & .AND. keep(23) .NE. 0.AND.keep(237).EQ.0)
THEN
5086 IF ((keep(221).NE.1 .AND. mtype .EQ. 1)
5087 & .OR. keep(111) .NE.0 .OR. keep(252).NE.0 )
THEN
5095 ALLOCATE( c_rw1(
id%N ),stat =allocok )
5097 IF ( allocok .GT. 0 )
THEN
5100 WRITE(*,*)
'could not allocate ',
id%N,
'integers.'
5104 IF (keep(242).EQ.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 )
5127 IF (
id%MYID.EQ.master .and.icntl21==0.and.keep(221).NE.1.AND.
5128 & (keep(237).EQ.0) )
THEN
5130 IF ( info(1) .GE. 0 .AND. icntl(4).GE.3 .AND. icntl(3).GT.0)
5133 IF (icntl(4) .eq. 4 ) k =
id%N
5134 j = min0(10,nbrhs_eff)
5135 IF (icntl(4) .eq. 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 IF ((keep(248).EQ.1).AND.(keep(237).EQ.0))
THEN
5147 ! nbrhs_eff might has been updated and broadcasted
5150 beg_rhs = beg_rhs + nbrhs_eff
5152 beg_rhs = beg_rhs + nbrhs
5158 IF (keep(400) .GT. 0)
THEN
5166 IF ( (
id%MYID.EQ.master)
5167 & .AND. ( keep(248).NE.0 )
5168 & .AND. ( keep(237).EQ.0 )
5169 & .AND. ( icntl21.EQ.0 )
5170 & .AND. ( keep(221) .NE.1 )
5171 & .AND. ( jend_rhs .LT.
id%NRHS )
5174 jbeg_new = jend_rhs + 1
5175 IF (do_permute_rhs.OR.interleave_par)
THEN
5176 DO WHILE ( jbeg_new.LE.
id%NRHS)
5178 id%RHS(int(perm_rhs(jbeg_new) -1,8)*int(ld_rhs,8)+i)
5181 jbeg_new = jbeg_new +1
5184 DO WHILE ( jbeg_new.LE.
id%NRHS)
5186 id%RHS(int(jbeg_new -1,8)*int(ld_rhs,8) + i) = zero
5188 jbeg_new = jbeg_new +1
5196 IF ( i_am_slave .AND. (icntl21.NE.0) .AND.
5197 & ( jend_rhs .LT.
id%NRHS ) .AND. keep(221).NE.1 )
THEN
5198 jbeg_new = jend_rhs + 1
5199 IF (do_permute_rhs.OR.interleave_par)
THEN
5200 DO WHILE ( jbeg_new.LE.
id%NRHS)
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 DO WHILE ( jbeg_new.LE.
id%NRHS)
5211 id%SOL_loc((jbeg_new -1)*
id%LSOL_loc + i) = zero
5213 jbeg_new = jbeg_new +1
5222 IF ((keep(221).EQ.1) .AND.
5223 & ( jend_rhs .LT.
id%NRHS ) )
THEN
5224 IF (
id%MYID .EQ. master)
THEN
5225 jbeg_new = jend_rhs + 1
5226 DO WHILE ( jbeg_new.LE.
id%NRHS)
5227 DO i=1,
id%SIZE_SCHUR
5228 id%REDRHS(int(jbeg_new -1,8)*int(ld_redrhs,8) +
5231 jbeg_new = jbeg_new +1
5234 IF (i_am_slave)
THEN
5235 jbeg_new = jend_rhs + 1
5236 DO WHILE ( jbeg_new.LE.
id%NRHS)
5237 DO i=1,nbent_rhscomp
5238 id%RHSCOMP(int(jbeg_new -1,8)*int(ld_rhscomp,8) +
5241 jbeg_new = jbeg_new +1
5248 id%INFO(26) = int(nb_bytes_max / 1000000_8)
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 IF ( keep(46) .eq. 0 )
THEN
5267 WRITE( mpg,
'(A,I10) ')
5268 &
' ** Avg. Space in MBYTES per working proc during solve :',
5269 & (
id%INFOG(31)-
id%INFO(26) ) /
id%NSLAVES
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 :',
5287 id%DKEEP(113)=timec2
5288 id%DKEEP(115)=timescatter2
5289 id%DKEEP(116)=timegather2
5290 id%DKEEP(122)=timecopyscale2
5293 &mpi_double_precision, mpi_max, master,
id%COMM, ierr )
5295 &mpi_double_precision, mpi_max, master,
id%COMM, ierr )
5297 &mpi_double_precision, mpi_max, master,
id%COMM, ierr )
5299 &mpi_double_precision, mpi_max, master,
id%COMM, ierr )
5301 &mpi_double_precision, mpi_max, master,
id%COMM, ierr )
5303 &mpi_double_precision, mpi_max, master,
id%COMM, ierr )
5307 WRITE ( mpg, *)
"Leaving solve with ..."
5308 WRITE( mpg, 434 )
id%DKEEP(160)
5309 WRITE( mpg, 432 )
id%DKEEP(113)
5310 WRITE( mpg, 435 )
id%DKEEP(162)
5311 IF ((keep(38).NE.0).OR.(keep(20).NE.0))
5312 &
WRITE( mpg, 437 )
id%DKEEP(164)
5313 WRITE( mpg, 436 )
id%DKEEP(163)
5314 WRITE( mpg, 433 )
id%DKEEP(161)
5315 WRITE( mpg, 431 )
id%DKEEP(165)
5319 WRITE ( mp, *)
"Local statistics"
5320 WRITE( mp, 434 )
id%DKEEP(115)
5321 WRITE( mp, 432 )
id%DKEEP(113)
5322 WRITE( mp, 435 )
id%DKEEP(117)
5323 IF ((keep(38).NE.0).OR.(keep(20).NE.0))
5324 &
WRITE( mp, 437 )
id%DKEEP(119)
5325 WRITE( mp, 436 )
id%DKEEP(118)
5326 WRITE( mp, 433 )
id%DKEEP(116)
5327 WRITE( mp, 431 )
id%DKEEP(122)
5330 IF (info(1) .LT.0 )
THEN
5332 IF (keep(485) .EQ. 1)
THEN
5333 keep(350) = keep350_save
5334 IF (is_lr_mod_to_struc_done)
THEN
5340 IF (keep(201).GT.0)
THEN
5341 IF (is_init_ooc_done)
THEN
5343 IF (ierr.LT.0 .AND. info(1) .GE. 0) info(1) = ierr
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 IF (i_am_slave.AND.lscal.AND.keep(248).EQ.-1)
THEN
5389 nb_bytes = nb_bytes -
5390 & int(
size(scaling_data_dr%SCALING_LOC),8)*k16_8
5391 DEALLOCATE(scaling_data_dr%SCALING_LOC)
5392 NULLIFY (scaling_data_dr%SCALING_LOC)
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 IF (
id%NSLAVES .GT. 1)
THEN
5437 IF (
id%MYID .eq. 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 IF (lscal .AND. 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 ELSE IF (
associated(
id%S).AND.keep(201).GT.0)
THEN
5482 nb_bytes = nb_bytes - keep8(23)*k35_8
5487 IF (keep(221).NE.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)
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 IF (idnloc_rhs .LE. 0)
RETURN
5598 IF ( idlrhs_loc .LT. idnloc_rhs)
THEN
5604 IF (idnloc_rhs .GT. 0)
THEN
5606 IF (.NOT.
associated(idirhs_loc))
THEN
5610 ELSE IF (
size(idirhs_loc) .LT. idnloc_rhs)
THEN
5616 IF (.NOT.
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 IF (
size(idrhs_loc,kind=8) .LT. reqsize8)
THEN
5627 IF ( reqsize8 .LE. int(huge(idnloc_rhs),8) .AND.
5628 &
size(idrhs_loc) .LT. int(reqsize8) )
THEN
5654 IF (kase .NE. 1 .AND. kase .NE. 2)
THEN
5655 WRITE(*,*)
"Internal error 1 in ZMUMPS_PP_SOLVE"
5658 IF (
id%MYID .eq. master )
THEN
5666 IF ( mtype .EQ. 1 )
THEN
5675 IF ( solvet.EQ.2 ) solvet = 0
5677 IF ( solvet .EQ. 1 )
THEN
5680 c_y( k ) = c_y( k ) *
id%ROWSCA( k )
5685 c_y( k ) = c_y( k ) *
id%COLSCA( k )
5693 CALL mpi_bcast( solvet, 1, mpi_integer, master,
5698 IF ( .NOT.i_am_slave )
THEN
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 IF (solvet.EQ.mtype)
THEN
5714 ptr_posinrhscomp_fwd =>
id%POSINRHSCOMP_ROW
5718 ptr_posinrhscomp_fwd =>
id%POSINRHSCOMP_COL
5720 liw_passed =
max( liw, 1 )
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 IF (info(1).LT.0)
GOTO 89
5738 IF ( i_am_slave )
THEN
5739 liw_passed =
max( liw, 1 )
5740 la_passed =
max( la, 1_8 )
5741 IF (solvet.EQ.mtype)
THEN
5742 ptr_posinrhscomp_fwd =>
id%POSINRHSCOMP_ROW
5743 ptr_posinrhscomp_bwd =>
id%POSINRHSCOMP_COL
5745 ptr_posinrhscomp_fwd =>
id%POSINRHSCOMP_COL
5746 ptr_posinrhscomp_bwd =>
id%POSINRHSCOMP_ROW
5749 nbsparse_loc = .false.
5751 & liw_passed,work_wcb(1),lwcb8_sol_c,iwcb,liwcb,nbrhs_eff,
id%NA(1),
5752 &
id%LNA,
id%NE_STEPS(1),srw3,solvet,icntl(1),from_pp,
id%STEP(1),
5753 &
id%FRERE_STEPS(1),
id%DAD_STEPS(1),
id%FILS(1),
id%PTLUST_S(1),
5754 &
id%PTRFAC(1), iwk_solve(1), liwk_solve, ptracb, liwk_ptracb,
5755 &
id%PROCNODE_STEPS(1),
id%NSLAVES, info(1), keep(1), keep8(1),
5756 &
id%DKEEP(1),
id%COMM_NODES,
id%MYID,
id%MYID_NODES, bufr(1), lbufr,
5757 & lbufr_bytes,
id%ISTEP_TO_INIV2(1),
id%TAB_POS_IN_PERE(1,1),
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 IF (info(1).eq.-2) info(1)=-12
5775 IF (info(1).eq.-3) info(1)=-15
5777 IF (info(1) .GE. 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)
5798 IF (info(1).LT.0)
RETURN
5807 IF ((
id%MYID.NE.master).OR. .NOT.lscal)
THEN
5808 pt_scaling => dummy_scal
5810 IF (solvet.EQ.1)
THEN
5811 pt_scaling =>
id%COLSCA
5813 pt_scaling =>
id%ROWSCA
5816 liw_passed =
max( liw, 1 )
5819 IF ( .NOT. i_am_slave )
THEN
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),
5832 & c_dummy, 1 , 1, idummy, 1,
5834 & perm_rhs,
size(perm_rhs)
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))