46 TYPE (DMUMPS_STRUC) :: id
47 INTEGER(8) :: NB_INT,NB_CMPLX,NB_CHAR
50 &(idrhs, idinfo, idn, idnrhs, idlrhs)
51 DOUBLE PRECISION,
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 (DMUMPS_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 DMUMPS_LBUF, DMUMPS_LBUF_INT
90 INTEGER(8) :: DMUMPS_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
120INTEGERDIMENSION(:)POINTER
121INTEGERDIMENSION(:)POINTER
122DOUBLE PRECISION,
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 DOUBLE PRECISION,
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 DOUBLE PRECISION,
DIMENSION(:)POINTER
139INTEGER :: SIZE_IPTR_WORKING, SIZE_WORKING
162 DOUBLE PRECISION ZERO
163 parameter( one = 1.0d0 )
164 parameter( zero = 0.0d0 )
165 DOUBLE PRECISION RZERO, RONE
166 parameter( rzero = 0.0d0, rone = 1.0d0 )
173 DOUBLE PRECISION,
DIMENSION(:),
POINTER :: RHS_IR
174 DOUBLE PRECISION,
DIMENSION(:),
POINTER :: WORK_WCB
175 DOUBLE PRECISION,
DIMENSION(:),
POINTER :: PTR_RHS_ROOT
176 INTEGER(8) :: LPTR_RHS_ROOT
180 DOUBLE PRECISION,
ALLOCATABLE :: SAVERHS(:), C_RW1(:),
185 DOUBLE PRECISION,
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 DOUBLE PRECISION,
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 :: (:), IWK_SOLVE(:), IWCB(:)
201 INTEGER :: LIWK_PTRACB
202 INTEGER(8),
ALLOCATABLE :: (:)
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 DOUBLE PRECISION C_DUMMY(1)
265 DOUBLE PRECISION R_DUMMY(1)
266 INTEGER (1), JDUMMY(1), KDUMMY(1), LDUMMY(1), MDUMMY(1)
267 INTEGER,
TARGET :: IDUMMY_TARGET(1)
268 DOUBLE PRECISION,
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
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)=
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
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
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 ! dist rhs and dist solution
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.
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
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
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 DMUMPS_SOL_DRIVER"
1511 IF (.NOT. (
associated(id%BLRARRAY_ENCODING)))
THEN
1512 WRITE(*,*)
"Internal error 19 in DMUMPS_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
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 dmumps_lbuf_int = ( 20 + id%NSLAVES * id%NSLAVES * 4 )
1830 IF ( ierr .NE. 0 )
THEN
1832 info(2) = dmumps_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 dmumps_lbuf_8 =
min(dmumps_lbuf_8, 100000000_8)
1856 dmumps_lbuf_8 =
max(dmumps_lbuf_8,
1857 & int((msg_max_bytes_solve+2*keep(34)),8) *
1859 dmumps_lbuf_8 = dmumps_lbuf_8 + 2_8*int(keep(34),8)
1863 dmumps_lbuf_8 =
min(dmumps_lbuf_8,
1865 & - 10_8*int(keep(34),8)
1867 dmumps_lbuf = int(dmumps_lbuf_8, kind(dmumps_lbuf))
1869 IF ( ierr .NE. 0 )
THEN
1871 info(2) = dmumps_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) )
1947! & .NOT.(id%POSINRHSCOMP_COL_ALLOC))
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
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.
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
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 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
2427! global index of
the column of
the sparse rhs
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
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,
2473 strat_permam1 = keep(242)
2475 & (strat_permam1, id%SYM_PERM(1),
2476 & id%IRHS_PTR(1), id%NRHS+1,
2477 & perm_rhs, id%NRHS,
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
'
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 DMUMPS_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 DMUMPS_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 DMUMPS_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 DMUMPS_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 dmumps_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 DMUMPS_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 DMUMPS_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 DMUMPS_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_PRECISION,
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) +
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_PRECISION,
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_PRECISION,
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_PRECISION,
4004 & MASTER, 0, id%COMM,STATUS,IERR)
4007 CALL MPI_RECV(PTR_RHS_ROOT(II),SIZE_ROOT,
4008 & MPI_DOUBLE_PRECISION,
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 DMUMPS_SOL_ES module
4029 CALL DMUMPS_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 DMUMPS_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_PRECISION,
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_PRECISION,
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_PRECISION,
4156 & MASTER, 0, id%COMM,IERR)
4159 CALL MPI_SEND(PTR_RHS_ROOT(II),SIZE_ROOT,
4160 & MPI_DOUBLE_PRECISION,
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
4211 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
4215 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
4218.LT.
IF (INFO(1)0) GO TO 90
4219.NE..OR..NOT.
IF ((id%MYIDMASTER) LSCAL) THEN
4220 PT_SCALING => Dummy_SCAL
4222.EQ.
IF (MTYPE1) THEN
4223 PT_SCALING => id%COLSCA
4225 PT_SCALING => id%ROWSCA
4228 LIW_PASSED = max( LIW, 1 )
4229 TIMEGATHER1=MPI_WTIME()
4230.NOT.
IF ( I_AM_SLAVE ) THEN
4234.EQ.
IF (KEEP(237)0) THEN
4237 CALL DMUMPS_GATHER_SOLUTION(id%NSLAVES,id%N,
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) ! for sparse permuted RHS
4250 CALL DMUMPS_GATHER_SOLUTION_AM1(id%NSLAVES,id%N,
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.EQ.
IF (KEEP(237)0) THEN
4267.EQ.
IF (id%MYIDMASTER) THEN
4269 NCOL_RHS_loc = id%NRHS
4271 JBEG_RHS_loc = JBEG_RHS
4273 PTR_RHS => CDUMMY_TARGET
4278 CALL DMUMPS_GATHER_SOLUTION(id%NSLAVES,id%N,
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) ! For sparse permuted RHS
4290 ELSE ! only gather target entries of A-1
4291 CALL DMUMPS_GATHER_SOLUTION_AM1(id%NSLAVES,id%N,
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.EQ.
IF (KEEP(237)0) DEALLOCATE( CWORK )
4307.EQ..AND..NE.
IF ( (id%MYIDMASTER) (KEEP(237)0)
4310 DO J = JBEG_RHS, JBEG_RHS+NBCOL_INBLOC-1
4311.OR.
IF (DO_PERMUTE_RHSINTERLEAVE_PAR) THEN
4316 COLSIZE = id%IRHS_PTR(PJ+1) -
4318.EQ.
IF (COLSIZE0) CYCLE
4322.NE.
IF (id%NSLAVES1) 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.NE.
IF (id%NSLAVES1) THEN
4343 NB_BYTES = NB_BYTES - int(size(MAP_RHS),8) * K34_8
4344 DEALLOCATE ( MAP_RHS )
4346 ENDIF ! end A-1 on master
4349.NE..AND..NE.
ELSE ! (KEEP(221)1) (ICNTL210))
4353 TIMECOPYSCALE1=MPI_WTIME()
4355 IF ( I_AM_SLAVE ) THEN
4356 LIW_PASSED = max( LIW, 1 )
4360.GT.
IF ( KEEP(89) 0 ) THEN
4361 CALL DMUMPS_DISTRIBUTED_SOLUTION(id%NSLAVES,
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) ) ! For permuted sparse RHS
4374 TIMECOPYSCALE2=MPI_WTIME()-TIMECOPYSCALE1+TIMECOPYSCALE2
4378.NE.
ENDIF ! ==== END of BACKWARD was PERFORMED (KEEP(221)1)
4387.AND.
IF ( ICNTL10 > 0 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 DMUMPS_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 DMUMPS_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 DMUMPS_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 DMUMPS_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 DMUMPS_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 DMUMPS_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_PRECISION, MASTER,
4645.and.
IF ( I_AM_SLAVE
4646.NE.
& id%KEEP8(29) 0_8 ) THEN
4647 CALL DMUMPS_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_PRECISION,
4656 & MPI_SUM,MASTER,id%COMM, IERR)
4661 CALL MPI_REDUCE( C_LOCWK54, C_DUMMY,
4662 & id%N, MPI_DOUBLE_PRECISION,
4663 & MPI_SUM,MASTER,id%COMM, IERR)
4676.and..NE.
IF ( I_AM_SLAVE id%KEEP8(29) 0_8 ) THEN
4677 CALL DMUMPS_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 DMUMPS_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 DMUMPS_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 DMUMPS_SOL_DRIVER"
4825 CALL DMUMPS_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 DMUMPS_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 DMUMPS_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_PRECISION, MASTER,
4922.and.
IF ( I_AM_SLAVE
4923.NE.
& id%KEEP8(29) 0_8 ) THEN
4924 CALL DMUMPS_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_PRECISION,
4933 & MPI_SUM,MASTER,id%COMM, IERR)
4936 CALL MPI_REDUCE( C_LOCWK54, C_DUMMY,
4937 & id%N, MPI_DOUBLE_PRECISION,
4938 & MPI_SUM,MASTER,id%COMM, IERR)
4942.EQ.
IF (id%MYID MASTER) THEN
4946.EQ.
IF (IFLAG_IR2) THEN
4948 CALL DMUMPS_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 DMUMPS_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 DMUMPS_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 DMUMPS_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 DMUMPS_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 DMUMPS_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 DMUMPS_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 DMUMPS_BUF_DEALL_CB( IERR )
5433 CALL DMUMPS_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 DMUMPS_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 DOUBLE PRECISION, INTENT( IN ), POINTER :: idRHS_loc (:)
5581 INTEGER, POINTER :: idIRHS_loc (:)
5582 DOUBLE PRECISION, 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 DMUMPS_CHECK_DISTRHS
5640 SUBROUTINE DMUMPS_PP_SOLVE()
5654.NE..AND..NE.
IF (KASE 1 KASE 2) THEN
5655 WRITE(*,*) "Internal error 1 in DMUMPS_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 DMUMPS_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 DMUMPS_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 DMUMPS_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 DMUMPS_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 DMUMPS_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 DMUMPS_PP_SOLVE