46 TYPE (CMUMPS_STRUC) :: id
47 INTEGER(8) :: NB_INT,NB_CMPLX,NB_CHAR
50 &(idrhs, idinfo, idn, idnrhs, idlrhs)
51 COMPLEX,
DIMENSION(:),
POINTER :: idRHS
52 INTEGER,
intent(in) :: idN, idNRHS, idLRHS
53 INTEGER,
intent(inout) :: idINFO(:)
58 include
'mumps_headers.h'
59 include
'mumps_tags.h'
63 INTEGER :: STATUS(MPI_STATUS_SIZE)
65 INTEGER,
PARAMETER :: MASTER = 0
70 TYPE (CMUMPS_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 CMUMPS_LBUF, CMUMPS_LBUF_INT
90 INTEGER(8) :: CMUMPS_LBUF_8
91 INTEGER :: LBUFR, LBUFR_BYTES
92 INTEGER :: , 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 , NOITER, SOLVET, KASE
103 LOGICAL INTERLEAVE_PAR, DO_PERMUTE_RHS
108 DOUBLE PRECISION TIMEIT
109DOUBLE PRECISION TIME3
110 DOUBLE PRECISION TIMEC1,TIMEC2
111 DOUBLE PRECISION TIMEGATHER1,TIMEGATHER2
112 DOUBLE PRECISION TIMESCATTER1,TIMESCATTER2
113 DOUBLE PRECISION TIMECOPYSCALE1,TIMECOPYSCALE2
117 INTEGER :: NRHS_NONEMPTY
118 INTEGER :: STRAT_PERMAM1
119 LOGICAL :: DO_NULL_PIV
120 INTEGER,
DIMENSION(:),
POINTER :: IRHS_PTR_COPY
121 INTEGER,
DIMENSION(:),
POINTER :: IRHS_SPARSE_COPY
122 COMPLEX,
DIMENSION(:),
POINTER :: RHS_SPARSE_COPY
123 LOGICAL IRHS_SPARSE_COPY_ALLOCATED, IRHS_PTR_COPY_ALLOCATED,
124 & RHS_SPARSE_COPY_ALLOCATED
126 INTEGER,
DIMENSION(:),
ALLOCATABLE :: MAP_RHS_loc
127 INTEGER,
DIMENSION(:),
POINTER :: IRHS_loc_PTR
128 LOGICAL :: IRHS_loc_PTR_allocated
129 COMPLEX,
DIMENSION(:),
POINTER :: idRHS_loc
130 INTEGER(8) :: DIFF_SOL_loc_RHS_loc
131 INTEGER(8) :: RHS_loc_size, RHS_loc_shift
133 INTEGER :: NBCOL, COLSIZE, JBEG_RHS, JEND_RHS, JBEG_NEW,
134 & NBCOL_INBLOC, IPOS, IPOSRHSCOMP
135 INTEGER,
DIMENSION(:),
ALLOCATABLE :: PERM_RHS
136 INTEGER,
DIMENSION(:),
POINTER :: PTR_POSINRHSCOMP_FWD,
137 & PTR_POSINRHSCOMP_BWD
138 COMPLEX,
DIMENSION(:),
POINTER :: PTR_RHS
139 INTEGER :: SIZE_IPTR_WORKING, SIZE_WORKING
163 parameter( one = (1.0e0,0.0e0) )
164 parameter( zero = (0.0e0,0.0e0) )
166 parameter( rzero = 0.0e0, rone = 1.0e0 )
173 COMPLEX,
DIMENSION(:),
POINTER :: RHS_IR
174 COMPLEX,
DIMENSION(:),
POINTER :: WORK_WCB
175 COMPLEX,
DIMENSION(:),
POINTER :: PTR_RHS_ROOT
176 INTEGER(8) :: LPTR_RHS_ROOT
180 COMPLEX,
ALLOCATABLE :: SAVERHS(:), C_RW1(:),
185 COMPLEX,
ALLOCATABLE :: (:)
186 INTEGER,
ALLOCATABLE :: MAP_RHS(:)
187 REAL,
ALLOCATABLE :: (:), D(:)
188 REAL,
ALLOCATABLE :: R_W(:)
192 REAL,
ALLOCATABLE,
DIMENSION(:) :: R_LOCWK54
193 COMPLEX,
ALLOCATABLE,
DIMENSION(:) :: C_LOCWK54
194 INTEGER :: NBENT_RHSCOMP, NB_FS_RHSCOMP_F,
196 INTEGER,
DIMENSION(:),
ALLOCATABLE :: UNS_PERM_INV
197 LOGICAL :: UNS_PERM_INV_NEEDED_INMAINLOOP,
198 & UNS_PERM_INV_NEEDED_BEFMAINLOOP
199 INTEGER LIWK_SOLVE, LIWCB
200 INTEGER,
ALLOCATABLE :: IW1(:), IWK_SOLVE(:), IWCB(:)
201 INTEGER :: LIWK_PTRACB
202 INTEGER(8),
ALLOCATABLE :: PTRACB(:)
207 REAL,
DIMENSION(:),
POINTER :: CNTL
208 INTEGER,
DIMENSION (:),
POINTER :: KEEP,ICNTL,
209 INTEGER(8),
DIMENSION (:),
POINTER :: KEEP8
210 INTEGER,
DIMENSION (:),
POINTER :: IS
211 REAL,
DIMENSION(:),
POINTER:: RINFOG
245 REAL,
dimension(:),
pointer :: SCALING
246 REAL,
dimension(:),
pointer :: SCALING_LOC
247 end type scaling_data_t
248 type (scaling_data_t) :: scaling_data_sol, scaling_data_dr
250 REAL,
DIMENSION(:),
POINTER :: PT_SCALING
251 REAL,
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
266 INTEGER IDUMMY(1), JDUMMY(1), KDUMMY(1), LDUMMY(1), MDUMMY(1)
267 INTEGER,
TARGET :: IDUMMY_TARGET(1)
268 COMPLEX,
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, , 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.GT..AND..GE.
LPOK = ((LP0)(id%ICNTL(4)1))
355.GT..AND..GE.
PROK = ((MP0)(id%ICNTL(4)2))
356.GT..and..eq.
PROKG = ( MPG 0 id%MYID MASTER )
357.AND..GE.
PROKG = (PROKG(id%ICNTL(4)2))
358.NOT..EQ..AND..EQ.
PRINT_MAXAVG = (id%NSLAVES1 KEEP(46)1)
360.not.
IF (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.
377 ICNTL21 = -99998 ! will be bcasted later to slaves
378 IBEG_RHSCOMP =-152525_8 ! Should not be used
379 BUILD_POSINRHSCOMP = .TRUE.
380 IBEG_GLOB_DEF = -9888 ! unitialized state
381 IEND_GLOB_DEF = -9888 ! unitialized state
382 IBEG_ROOT_DEF = -9777 ! unitialized state
383 IEND_ROOT_DEF = -9777 ! unitialized state
384 IROOT_DEF_RHS_COL1 = -9666 ! unitialized state
389 NB_FS_RHSCOMP_TOT = KEEP(89)
390! number of FS var of the pruned tree
392 NB_FS_RHSCOMP_F = NB_FS_RHSCOMP_TOT
396.LE.
IF (KEEP(350)0) KEEP(350)=1
397.GT.
IF (KEEP(350)2) KEEP(350)=1
398 KEEP350_SAVE = KEEP(350)
402.ne..OR.
I_AM_SLAVE = ( id%MYID MASTER
403.eq..AND.
& ( id%MYID MASTER
407 CALL CMUMPS_SIZE_IN_STRUCT (id, NB_INT, NB_CMPLX, NB_CHAR)
408 NB_BYTES = NB_BYTES + NB_INT * K34_8 + NB_CMPLX * K35_8 + NB_CHAR
409 NB_BYTES_ON_ENTRY = NB_BYTES !used to check alloc/dealloc count ok
410 CALL CMUMPS_COMPUTE_MEMORY_SAVE(id,FILE_SIZE,STRUC_SIZE)
411 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
419.EQ.
IF (id%MYID MASTER) THEN
421 CALL CMUMPS_SET_K221(id)
422 id%KEEP(111) = id%ICNTL(25)
425.EQ.
IF (id%ICNTL(20) 1) id%KEEP(235) = -1 !automatic
426.EQ.
IF (id%ICNTL(20) 2) id%KEEP(235) = 0 !off
427.EQ.
IF (id%ICNTL(20) 3) id%KEEP(235) = 1 !on
428.EQ..or..EQ..or.
IF (id%ICNTL(20)1 id%ICNTL(20)2
429.EQ.
& id%ICNTL(20)3) THEN
430 id%KEEP(248) = 1 !sparse RHS
431.EQ..OR..EQ.
ELSE IF (id%ICNTL(20)10 id%ICNTL(20)11) THEN
432 id%KEEP(248) = -1 ! dist. RHS
434 id%KEEP(248) = 0 !dense RHS
436 ICNTL21 = id%ICNTL(21)
437.ne..and..ne.
IF (ICNTL21 0ICNTL211) ICNTL21=0
438.NE.
IF ( id%ICNTL(30) 0 ) THEN
445.eq..and..ne.
IF (id%KEEP(248) 0 id%KEEP(237)0) THEN
450.EQ..AND..NE.
IF ((id%KEEP(221)2 )(id%KEEP(248)0) ) THEN
454.EQ..AND..NE.
IF ((id%KEEP(221)2 )(id%KEEP(235)0) ) THEN
459.EQ..AND..EQ.
IF ( (id%KEEP(248)0)(id%KEEP(111)0) ) THEN
463.EQ.
IF (KEEP(248) -1) THEN
469.NE.
IF(id%KEEP(111)0) id%KEEP(235)=0
471.EQ.
IF (id%KEEP(235)-1) THEN
472.NE.
IF (id%KEEP(237)0) THEN
478.NE.
ELSE IF (id%KEEP(235)0) THEN
482.NE.
IF ((KEEP(111)0)) THEN
493.EQ..AND..EQ.
IF (KEEP(248)0KEEP(111)0) THEN
500.NE..AND..EQ.
IF ((KEEP(242)0)KEEP(237)0) THEN
501.NE..AND..NE..AND.
IF ((KEEP(242)-9)KEEP(242)1
502.NE.
& KEEP(242)-1) THEN
507.EQ.
IF (KEEP(242)-9) THEN
510.NE.
IF (id%KEEP(237)0) THEN
511 KEEP(242) = 1 ! postorder for A-1
512 ELSE ! dense or general sparse or distributed RHS
513 KEEP(242) = 0 ! no permutation in most general case
514.EQ.
IF (KEEP(248) 1) THEN ! sparse RHS
515.EQ.
IF (id%KEEP(235) 1) THEN ! Tree pruning
516.GT.
IF (id%NRHS 1) THEN
517.EQ..OR..GE.
IF (KEEP(497)-1 KEEP(497)1) THEN
526.EQ..AND..NE.
IF ( (id%KEEP(221)1 )(id%KEEP(235)0) ) THEN
530.EQ.
IF (KEEP(242)0) KEEP(243)=0 ! interleave off
531.EQ..OR..EQ.
IF ((KEEP(237)0)(KEEP(242)0)) THEN
536.EQ.
IF (id%KEEP(237)1) THEN ! A-1 entries
539.EQ.
IF (id%NSLAVES1) THEN
540.EQ.
IF (id%KEEP(243)-1) id%KEEP(243)=0
541.EQ.
IF (id%KEEP(495)-1) id%KEEP(495)=1
542.EQ.
IF (id%KEEP(497)-1) id%KEEP(497)=1
544.EQ.
IF (id%KEEP(243)-1) id%KEEP(243)=1
545.EQ.
IF (id%KEEP(495)-1) id%KEEP(495)=1
546.EQ.
IF (id%KEEP(497)-1) id%KEEP(497)=1
548 ELSE ! dense or general sparse or distributed RHS
551.EQ.
IF (KEEP(248) 1) THEN ! sparse RHS
552.EQ.
IF (id%KEEP(235) 1) THEN ! Tree pruning
553.GT.
IF (id%NRHS 1) THEN
554.EQ.
IF (id%KEEP(497)-1) id%KEEP(497)=1
563 MTYPE = id%ICNTL( 9 )
564.NE.
IF (MTYPE1) MTYPE=0 ! see interface
565.EQ..AND..NE.
IF ((MTYPE0)KEEP(50)0) MTYPE =1
566! suppress option Atx=b for A-1
567.NE.
IF (id%KEEP(237)0) MTYPE = 1
574.EQ.
IF (KEEP(486) 2) THEN
575 KEEP(485) = 1 ! BLR solve
577 KEEP(485) = 0 ! FR solve
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.0E0
640 id%DKEEP(140:153)=0.0E0
642 CALL MUMPS_SECDEB(TIME3)
646.EQ.
IF ( id%MYID MASTER ) THEN
647.NE..AND..NE.
IF ((KEEP(23)0)KEEP(50)0) THEN
651 IF (PROKG) WRITE(MPG,'(a)
')
652 & ' internal error 1 in solution driver
'
664.EQ.
IF (KEEP(201) -1) THEN
667 & ' error: solve impossible because factors not kept
'
672.EQ..AND..EQ.
ELSE IF (KEEP(221)0 KEEP(251) 2
673.AND..EQ.
& KEEP(252)0) THEN
676 & ' error: solve impossible because factors not kept
'
683.NE..AND..NE.
IF (KEEP(252)0 id%NRHS id%KEEP(253)) THEN
691 & ' error: id%NRHS not allowed to change when
',
695 id%INFO(2)=id%KEEP(253)
699.NE..AND..NE.
IF (KEEP(252)0 MTYPE1) THEN
705 & ' error: transpose system(icntl(9).NE.0) not
',
706 & ' compatible with forward performed during
',
707 & ' factorization(icntl(32)=1)
'
711.NE..AND..NE.
IF (KEEP(248) 0KEEP(252)0) THEN
716.NE.
IF (KEEP(237)0) THEN
717 INFO(2) = 30 ! ICNTL(30)
720 & ' error: a-1 functionality incompatible with
',
721 & ' forward performed during factorization
',
725 INFO(2) = 20 ! ICNTL(20)
728 & ' error: sparse or dist. rhs incompatible with forward
',
729 & ' elimination during factorization(icntl(32)=1)
'
734.NE..AND..NE.
IF (KEEP(237) 0 ICNTL210) THEN
737 & ' error: a-1 functionality is incompatible
',
738 & ' with distributed solution.
'
744.NE..AND..NE.
IF (KEEP(237) 0 KEEP(60) 0) THEN
747 & ' error: a-1 functionality is incompatible
',
754.NE..AND..NE.
IF (KEEP(237) 0 KEEP(111) 0) THEN
757 & ' error: a-1 functionality is incompatible
',
758 & ' with null space.
'
764.LE.
IF (id%NRHS 0) THEN
767.NE..AND..EQ.
IF ((id%KEEP(111)0)(id%INFOG(28)0)) THEN
770 & 'icntl(25) ne 0 but infog(28)=0
',
771 & ' the matrix is not deficient
'
778.EQ.
IF ( (id%KEEP(237)0) ) THEN
779.AND..NE.
IF ((id%KEEP(248) == 0 KEEP(221)2)
780.OR.
& ICNTL21==0) THEN
784 CALL CMUMPS_CHECK_DENSE_RHS
785 & (id%RHS,id%INFO,id%N,id%NRHS,id%LRHS)
786.LT.
IF (id%INFO(1) 0) GOTO 333
791.NE.
IF (id%NRHS id%N) THEN
797 IF (id%KEEP(248) == 1) THEN
802.LE..AND..NE.
IF (( id%NZ_RHS 0 )(KEEP(237)0)) THEN
808.LE..AND..EQ.
IF (( id%NZ_RHS 0 )(KEEP(221)1)) THEN
815.GT.
IF ( id%NZ_RHS 0 ) THEN
816.not.
IF ( associated(id%RHS_SPARSE) )THEN
822.GT.
IF (id%NZ_RHS 0) THEN
823.not.
IF ( associated(id%IRHS_SPARSE) )THEN
829.not.
IF ( associated(id%IRHS_PTR) )THEN
835 IF (size(id%IRHS_PTR) < id%NRHS + 1) THEN
840.ne.
IF (id%IRHS_PTR(id%NRHS + 1)id%NZ_RHS+1) THEN
842 id%INFO(2)=id%IRHS_PTR(id%NRHS+1)
846.LT.
IF (dble(id%N)*dble(id%NRHS)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.ne.
IF (id%IRHS_PTR(1)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
875 CALL CMUMPS_GET_NS_OPTIONS_SOLVE(ICNTL(1),KEEP(1),
878.LT.
IF (INFO(1) 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.NE.
IF (id%KEEP(89) 0) THEN
894.not.
IF ( associated(id%ISOL_loc) )THEN
899.not.
IF ( 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.NE.
IF (id%MYID 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.AND..EQ.
IF (I_AM_SLAVE id%KEEP(248)-1) THEN
963 CALL CMUMPS_CHECK_DISTRHS(
970.LT.
IF (id%INFO(1) 0) GOTO 333
979 IF (associated(id%IRHS_loc)) THEN
980.NE.
IF (size(id%IRHS_loc) 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.NE.
IF (size(id%RHS_loc) 0) THEN
991 idRHS_loc=>id%RHS_loc
993 idRHS_loc=>CDUMMY_TARGET
996 idRHS_loc=>CDUMMY_TARGET
998.AND..EQ..AND.
IF (I_AM_SLAVE ICNTL211
999.EQ.
& KEEP(248) -1) THEN ! Dist RHS and dist solution
1000.AND.
IF (associated(id%RHS_loc)
1001 & associated(id%SOL_loc)) THEN
1002.GT.
IF (id%KEEP(89)0) THEN
1009 CALL MUMPS_SIZE_C(idRHS_loc(1),id%SOL_loc(1),
1010 & DIFF_SOL_loc_RHS_loc)
1015.EQ..AND.
IF (DIFF_SOL_loc_RHS_loc 0_8
1016.GT.
& id%LSOL_loc 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.EQ.
IF (id%MYIDMASTER) THEN
1035 CALL CMUMPS_CHECK_REDRHS(id)
1036.EQ.
END IF ! MYIDMASTER
1037.LT.
IF (id%INFO(1) 0) GOTO 333
1042 CALL MUMPS_PROPINFO( id%ICNTL(1),
1044 & id%COMM, id%MYID )
1045.LT.
IF ( id%INFO(1) 0 ) GO TO 90
1053.EQ..AND..EQ.
IF ((id%KEEP(248)1)(id%KEEP(237)0)) THEN
1055 CALL MPI_BCAST(id%NZ_RHS,1,MPI_INTEGER,MASTER,
1058.EQ.
IF (id%NZ_RHS0) THEN
1061.EQ..AND.
IF ((ICNTL211)(I_AM_SLAVE)) THEN
1068 LIW_PASSED=max(1,KEEP(32))
1072.GT.
IF (KEEP(89) 0) THEN
1073 CALL CMUMPS_DISTSOL_INDICES( MTYPE, id%ISOL_loc(1),
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.NE.
IF (ICNTL211) THEN ! centralized solution
1093.EQ.
IF (id%MYIDMASTER) 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.NE.
IF (KEEP(221)0) THEN
1111 WRITE (MPG, 152) KEEP(221)
1113.GT.
IF (KEEP(252)0) THEN ! Fwd during facto
1114 WRITE (MPG, 153) KEEP(252)
1119 GOTO 90 ! end of solve deallocate what is needed
1123.EQ.
ENDIF ! test NZ_RHS0
1125.EQ..AND..EQ.
ENDIF ! (id%KEEP(248)1)(id%KEEP(237)0)
1126 INTERLEAVE_PAR =.FALSE.
1127 DO_PERMUTE_RHS =.FALSE.
1129.NE..or..NE.
IF ((id%KEEP(235)0)(id%KEEP(237)0)) THEN
1131.NE..AND.
IF (id%KEEP(237)0
1132.EQ.
& id%KEEP(248)0) THEN
1136 WRITE(LP,'(a,i4,i4)
')
1137 & ' internal error 2 in solution driver(a-1)
',
1138 & id%KEEP(237), id%KEEP(248)
1145 CALL MUMPS_REALLOC(id%Step2node, id%KEEP(28), id%INFO, LP,
1147 & STRING='id%Step2node (solve)
', MEMCNT=NBT, ERRCODE=-13)
1148 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
1149 & id%COMM, id%MYID )
1150.LT.
IF ( INFO(1)0 ) RETURN
1156 ! Step2node was reallocated and needs be recomputed
1158.LE.
IF (id%STEP(I)0) CYCLE ! nonprincipal variables
1159 id%Step2node(id%STEP(I)) = I
1166 NB_BYTES = NB_BYTES + NBT*K34_8
1167 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
1168 NB_BYTES_EXTRA = NB_BYTES_EXTRA + NBT * K34_8
1176.NE..OR..NE.
IF((KEEP(235)0)(KEEP(237)0)) THEN
1177.NOT.
IF(associated(id%IPTR_WORKING)) THEN
1178 CALL CMUMPS_BUILD_MAPPING_INFO(id)
1185 & CALL CMUMPS_SOL_ES_INIT(id%OOC_SIZE_OF_BLOCK, id%KEEP(201))
1186 DO_NULL_PIV = .TRUE.
1187 NBCOL_INBLOC = -9998
1188 NZ_THIS_BLOCK= -9998
1191.EQ.
IF (id%MYIDMASTER) THEN ! Compute NRHS_NONEMPTY
1194.AND.
IF ( KEEP(111)==0 KEEP(248)==1
1201.LT.
IF (id%IRHS_PTR(I)id%IRHS_PTR(I+1))
1202 & NRHS_NONEMPTY = NRHS_NONEMPTY+1 !ith col in non empty
1204.LE.
IF (NRHS_NONEMPTY0) THEN
1207 & WRITE(LP,*) " Internal Error 3 in solution driver ",
1208 & " NRHS_NONEMPTY= ",
1213 NRHS_NONEMPTY = id%NRHS
1221.ne.
IF ( KEEP( 38 ) 0 ) THEN
1222 MASTER_ROOT = MUMPS_PROCNODE(
1223 & id%PROCNODE_STEPS(id%STEP( KEEP(38))),
1225.eq.
IF (id%MYID_NODES MASTER_ROOT) THEN
1226 SIZE_ROOT = id%root%TOT_ROOT_SIZE
1227.EQ..AND..NE.
ELSE IF ((id%MYIDMASTER)KEEP(60)0) THEN
1229 SIZE_ROOT=id%KEEP(116)
1231.ne.
ELSE IF (KEEP( 20 ) 0 ) THEN
1232 MASTER_ROOT = MUMPS_PROCNODE(
1233 & id%PROCNODE_STEPS(id%STEP(KEEP(20))),
1235.eq.
IF (id%MYID_NODES MASTER_ROOT) THEN
1237 & id%PTLUST_S(id%STEP(KEEP(20)))+KEEP(IXSZ) + 3)
1238.EQ..AND..NE.
ELSE IF ((id%MYIDMASTER)KEEP(60)0) THEN
1240 SIZE_ROOT=id%KEEP(116)
1243 MASTER_ROOT = -44444
1251.eq.
IF (id%MYID MASTER) THEN
1252 KEEP(84) = ICNTL(27)
1254.EQ.
IF(ICNTL(27)0) KEEP(84)=1
1255.NE.
IF (KEEP(252)0) THEN
1256! Fwd in facto: all rhs (KEEP(253) need be processed in one pass
1259.EQ..OR..GT.
IF (KEEP(201) 0 KEEP(84) 0) THEN
1260 NBRHS = abs(KEEP(84))
1264.GT.
IF (NBRHS NRHS_NONEMPTY ) NBRHS = NRHS_NONEMPTY
1269 CALL VTBEGIN(glob_comm_ini,IERR)
1272 CALL MPI_BCAST(NRHS_NONEMPTY,1,MPI_INTEGER,MASTER,
1274 CALL MPI_BCAST(NBRHS,1,MPI_INTEGER,MASTER,
1277.GT.
IF (KEEP(201)0) THEN
1281 WORKSPACE_MINIMAL_PREFERRED = .FALSE.
1282.eq.
IF (id%MYID MASTER) THEN
1283 KEEP(107) = max(0,KEEP(107))
1284.EQ..AND.
IF ((KEEP(107)0)
1285.EQ..AND..NE.
& (KEEP(204)0)(KEEP(211)1) ) THEN
1288 ! -Emmergency buffer only and
1290 ! -NO_O_DIRECT (because of synchronous choice)
1292 ! "Basic system-based version"
1293 ! We can force to allocate S to a minimal
1295 WORKSPACE_MINIMAL_PREFERRED=.TRUE.
1298 CALL MPI_BCAST( KEEP(107), 1, MPI_INTEGER,
1299 & MASTER, id%COMM, IERR )
1300 CALL MPI_BCAST( KEEP(204), 1, MPI_INTEGER,
1301 & MASTER, id%COMM, IERR )
1302 CALL MPI_BCAST( KEEP(208), 2, MPI_INTEGER,
1303 & MASTER, id%COMM, IERR )
1304 CALL MPI_BCAST( WORKSPACE_MINIMAL_PREFERRED, 1,
1306 & MASTER, id%COMM, IERR )
1309 IF ( I_AM_SLAVE ) THEN
1338.NE..OR..NE.
IF ( KEEP( 38 ) 0 KEEP( 20 ) 0 ) THEN
1339.eq.
IF ( MASTER_ROOT id%MYID_NODES ) THEN
1341.NOT.
& associated(id%root%RHS_CNTR_MASTER_ROOT)
1343 NB_K133 = NB_K133 + 1
1347 LWCB8_MIN = int(NB_K133,8)*int(KEEP(133),8)*int(NBRHS,8)
1355.NE.
WK_USER_PROVIDED = (id%LWK_USER0)
1356.EQ.
IF (id%LWK_USER0) THEN
1358.GT.
ELSE IF (id%LWK_USER0) THEN
1359 ITMP8= int(id%LWK_USER,8)
1361 ITMP8 = -int(id%LWK_USER,8)* 1000000_8
1368.EQ.
IF (KEEP(201)0) THEN ! incore
1370.NE.
IF (ITMP8KEEP8(24)) THEN
1373 INFO(2) = id%LWK_USER
1374 GOTO 99 ! jump to propinfo
1375 ! (S is used in between and not allocated)
1376 ! NO COMM must occur then before next propinfo
1377 ! it happens in Mila's code but only with
1386 IF (wk_user_provided)
THEN
1388 IF (maxs.LT. keep8(20))
THEN
1391 itmp8 = keep8(20)+1_8-maxs
1394 IF (info(1) .GE. 0 ) id%S => id%WK_USER(1:keep8(24))
1395 ELSE IF (
associated(id%S))
THEN
1402 IF (keep(201).EQ.0)
THEN
1403 WRITE(*,*)
' Working array S not allocated ',
1404 &
' on entry to solve phase (in core) '
1415 IF ( keep(209).EQ.-1 .AND. workspace_minimal_preferred)
1418 maxs = keep8(20) + 1_8
1419 ELSE IF ( keep(209) .GE.0 )
THEN
1421 maxs =
max(int(keep(209),8), keep8(20) + 1_8)
1427 maxs =
max(maxs, id%KEEP8(20)+1_8)
1428 ALLOCATE (id%S(maxs), stat = allocok)
1430 IF ( allocok .GT. 0 )
THEN
1432 WRITE(lp,*) id%MYID,': problem allocation of s
',
1436 CALL MUMPS_SET_IERROR(MAXS, INFO(2))
1440 NB_BYTES = NB_BYTES + KEEP8(23) * K35_8
1441 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
1450.EQ.
IF(KEEP(201)0)THEN
1455.GT.
IF(MAXSKEEP8(31)+KEEP8(20)*int(KEEP(107)+1,8))THEN
1462 LA=KEEP8(31)+KEEP8(20)*int(KEEP(107)+1,8)
1469.GT.
IF ( MAXS-LA 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
1478 CALL MUMPS_SET_IERROR(LWCB8,INFO(2))
1480 WORK_WCB_ALLOCATED=.TRUE.
1481 NB_BYTES = NB_BYTES + LWCB8*K35_8
1482 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
1487 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
1489 IF (INFO(1) < 0) GOTO 90
1491 IF ( I_AM_SLAVE ) THEN
1492.GT.
IF (KEEP(201)0) THEN
1493 CALL CMUMPS_INIT_FACT_AREA_SIZE_S(LA)
1496 CALL CMUMPS_OOC_INIT_SOLVE(id)
1497 IS_INIT_OOC_DONE = .TRUE.
1498.GT.
ENDIF ! KEEP(201)0
1501 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
1503 IF (INFO(1) < 0) GOTO 90
1505 IF (I_AM_SLAVE) THEN
1506.EQ.
IF (KEEP(485)1) THEN
1507.NOT.
IF ( (associated(id%FDM_F_ENCODING))) THEN
1508 WRITE(*,*) "Internal error 18 in CMUMPS_SOL_DRIVER"
1511.NOT.
IF ( (associated(id%BLRARRAY_ENCODING))) THEN
1512 WRITE(*,*) "Internal error 19 in CMUMPS_SOL_DRIVER"
1516 CALL MUMPS_FDM_STRUC_TO_MOD('f
',id%FDM_F_ENCODING)
1517 CALL CMUMPS_BLR_STRUC_TO_MOD(id%BLRARRAY_ENCODING)
1518 IS_LR_MOD_TO_STRUC_DONE = .TRUE.
1521.EQ.
IF (id%MYIDMASTER) THEN
1526 & id%NRHS, NBRHS, ICNTL(9), ICNTL(10), ICNTL(11),
1527 & ICNTL(20), ICNTL(21), ICNTL(30), KEEP(486)
1528.NE.
IF (KEEP(111)0) THEN
1529 WRITE (MPG, 151) KEEP(111)
1531.NE.
IF (KEEP(221)0) THEN
1532 WRITE (MPG, 152) KEEP(221)
1534.GT.
IF (KEEP(252)0) THEN ! Fwd during facto
1535 WRITE (MPG, 153) KEEP(252)
1543.GT..AND..LE..OR.
LSCAL = (((KEEP(52) 0) (KEEP(52) 8)) (
1544.EQ..OR..EQ.
& KEEP(52) -1) KEEP(52) -2)
1548.LT..OR..GE.
IF ((ICNTL11 0)(ICNTL11 3)) THEN
1550 IF (PROKG) WRITE(MPG,'(a)
')
1551 & ' warning: icntl(11) out of range
'
1554.NE..OR..NE.
IF (ICNTL110 ICNTL100) THEN
1558.NE.
IF (KEEP(111)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.NE.
ELSE IF ( KEEP(237) 0 ) THEN
1570 IF (PROKG) WRITE(MPG,'(a,a)
')
1571 & ' warning: incompatible features: am1
',
1572 & ' and iter. ref and/or err. anal
'
1574.NE.
ELSE IF ( KEEP(252) 0 ) THEN
1575 IF (PROKG) WRITE(MPG,'(a,a)
')
1576 & ' warning: incompatible features: fwd in facto
',
1577 & ' and iter. ref and/or err. anal.
'
1579.NE.
ELSE IF (KEEP(221)0) THEN
1582 IF (PROKG) WRITE(MPG,'(a,a)
')
1583 & ' warning: incompatible features: reduced rhs
',
1584 & ' and iter. ref and/or err. anal.
'
1586.GT..OR..GT.
ELSE IF (NBRHS 1 ICNTL(21) 0) THEN
1590 IF (PROKG) WRITE(MPG,'(a,a)')
1591 &
' WARNING: Incompatible features: nrhs>1 or distrib sol',
1592 &
' and Iter. Ref and/or Err. Anal.'
1594 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.
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)
'
1713 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
1715.LT.
IF (INFO(1) 0 ) GOTO 90
1721 CALL MPI_BCAST(ICNTL10,1,MPI_INTEGER,MASTER,
1723 CALL MPI_BCAST(ICNTL11,1,MPI_INTEGER,MASTER,
1725 CALL MPI_BCAST(ICNTL21,1,MPI_INTEGER,MASTER,
1727 CALL MPI_BCAST(POSTPros,1,MPI_LOGICAL,MASTER,
1729 CALL MPI_BCAST(LSCAL,1,MPI_LOGICAL,MASTER,
1731 CALL MPI_BCAST(KEEP(237),1,MPI_INTEGER,MASTER,
1743.NE.
DO_PERMUTE_RHS = (KEEP(242)0)
1745.GT..AND..NE.
IF ( (id%NSLAVES1) (KEEP(243)0)
1750.NE..or..GT.
IF ((KEEP(237)0)(KEEP(111)0)) THEN
1751 INTERLEAVE_PAR= .TRUE.
1754 write(MPG,*) ' warning incompatible options
',
1755 & ' interleave rhs reset to false
'
1763 MSG_MAX_BYTES_SOLVE8 = int(( 4 + KEEP(133) ) * KEEP(34),8) +
1764 & int(KEEP(133)*KEEP(35),8) * int(NBRHS,8)
1765 & + int(16*KEEP(34),8) ! for request id, pointer to next + safety
1767.GT.
IF ( MSG_MAX_BYTES_SOLVE8
1768 & int(huge(I4),8)) THEN
1770 INFO(2) = ( huge(I4) -
1771 & ( 16 + 4 + KEEP(133) ) ) /
1772 & ( KEEP(133) * KEEP(35) )
1774.LT.
IF (INFO(1) 0 ) GOTO 111
1775 MSG_MAX_BYTES_SOLVE = int(MSG_MAX_BYTES_SOLVE8)
1782.EQ.
IF (KEEP(237)0) THEN
1790 KMAX_246_247 = max(KEEP(246),KEEP(247))
1791 MSG_MAX_BYTES_GTHRSOL = ( 2 + KMAX_246_247 ) * KEEP(34) +
1792 & KMAX_246_247 * NBRHS * KEEP(35)
1793.EQ.
ELSE IF (ICNTL210) THEN
1798 MSG_MAX_BYTES_GTHRSOL = ( 3 * KEEP(34) + KEEP(35) )
1803 MSG_MAX_BYTES_GTHRSOL = 0
1806 LBUFR_BYTES = max(MSG_MAX_BYTES_SOLVE, MSG_MAX_BYTES_GTHRSOL)
1807 TSIZE = int(min(100_8*int(MSG_MAX_BYTES_GTHRSOL,8),
1809 LBUFR_BYTES = max(LBUFR_BYTES,TSIZE)
1810 LBUFR = ( LBUFR_BYTES + KEEP(34) - 1 ) / KEEP(34)
1811 ALLOCATE (BUFR(LBUFR),stat=allocok)
1812.GT.
IF ( allocok 0 ) THEN
1814 WRITE(LP,*) id%MYID,
1815 & ' problem in solve: error allocating bufr
'
1821 NB_BYTES = NB_BYTES + int(size(BUFR),8)*K34_8
1822 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
1823.AND..GT.
IF ( I_AM_SLAVE id%NSLAVES 1 ) THEN
1827 CMUMPS_LBUF_INT = ( 20 + id%NSLAVES * id%NSLAVES * 4 )
1829 CALL CMUMPS_BUF_ALLOC_SMALL_BUF( CMUMPS_LBUF_INT, IERR )
1830.NE.
IF ( IERR 0 ) THEN
1832 INFO(2) = CMUMPS_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 CMUMPS_LBUF_8 = min(CMUMPS_LBUF_8, 100000000_8)
1856 CMUMPS_LBUF_8 = max(CMUMPS_LBUF_8,
1857 & int((MSG_MAX_BYTES_SOLVE+2*KEEP(34)),8) *
1858 & int(min(id%NSLAVES,3),8) )
1859 CMUMPS_LBUF_8 = CMUMPS_LBUF_8 + 2_8*int(KEEP(34),8)
1863 CMUMPS_LBUF_8 = min(CMUMPS_LBUF_8,
1865 & - 10_8*int(KEEP(34),8)
1867 CMUMPS_LBUF = int(CMUMPS_LBUF_8, kind(CMUMPS_LBUF))
1868 CALL CMUMPS_BUF_ALLOC_CB( CMUMPS_LBUF, IERR )
1869.NE.
IF ( IERR 0 ) THEN
1871 INFO(2) = CMUMPS_LBUF/KEEP(34) + 1
1873 WRITE(LP,*) id%MYID,
1874 & ':error allocating send buffer:ierr=
', IERR
1883 IF ( POSTPros ) THEN
1887.NE.
IF ( id%MYID MASTER ) THEN
1889 ALLOCATE(RHS_IR(id%N),stat=IERR)
1890 NB_BYTES = NB_BYTES + int(size(RHS_IR),8)*K35_8
1891 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
1892.GT.
IF ( IERR 0 ) THEN
1896 WRITE(LP,*) 'error
while allocating rhs on a slave
'
1907.NE..OR..NE.
DO_NBSPARSE = ( ( (KEEP(237)0)(KEEP(235)0) )
1909.NE.
& ( KEEP(497)0 )
1911 IF ( I_AM_SLAVE ) THEN
1912 IF(DO_NBSPARSE) THEN
1914 LPTR_RHS_BOUNDS = 2*KEEP(28)
1915 ALLOCATE(RHS_BOUNDS(LPTR_RHS_BOUNDS), STAT=IERR)
1918 INFO(2)=LPTR_RHS_BOUNDS
1920 WRITE(LP,*) 'error
while allocating rhs_bounds on
',
1925 NB_BYTES = NB_BYTES +
1926 & int(size(RHS_BOUNDS),8)*K34_8
1927 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
1928 PTR_RHS_BOUNDS => RHS_BOUNDS
1931 PTR_RHS_BOUNDS => IDUMMY_TARGET
1935 IF ( I_AM_SLAVE ) THEN
1936.EQ..AND..EQ.
IF ((KEEP(221)2 KEEP(252)0)) THEN
1939.NOT.
IF (associated(id%RHSCOMP)) THEN
1946.NOT..OR.
IF (associated(id%POSINRHSCOMP_ROW) ) !
1947.NOT.
! & (id%POSINRHSCOMP_COL_ALLOC))
1953.not.
IF (id%POSINRHSCOMP_COL_ALLOC) THEN
1957 id%POSINRHSCOMP_COL => id%POSINRHSCOMP_ROW
1966 IF (associated(id%POSINRHSCOMP_ROW)) THEN
1967 NB_BYTES = NB_BYTES -
1968 & int(size(id%POSINRHSCOMP_ROW),8)*K34_8
1969 DEALLOCATE(id%POSINRHSCOMP_ROW)
1971 ALLOCATE (id%POSINRHSCOMP_ROW(id%N), stat = allocok)
1972.GT.
IF ( allocok 0 ) THEN
1977 NB_BYTES = NB_BYTES +
1978 & int(size(id%POSINRHSCOMP_ROW),8)*K34_8
1979 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
1980 IF (id%POSINRHSCOMP_COL_ALLOC) THEN
1981 NB_BYTES = NB_BYTES -
1982 & int(size(id%POSINRHSCOMP_COL),8)*K34_8
1983 DEALLOCATE(id%POSINRHSCOMP_COL)
1984 NULLIFY(id%POSINRHSCOMP_COL)
1985 id%POSINRHSCOMP_COL_ALLOC = .FALSE.
1988.EQ..OR..NE.
IF ((KEEP(50)0)KEEP(237)0) THEN
1989 ALLOCATE (id%POSINRHSCOMP_COL(id%N), stat = allocok)
1990.GT.
IF ( allocok 0 ) THEN
1995 id%POSINRHSCOMP_COL_ALLOC = .TRUE.
1996 NB_BYTES = NB_BYTES +
1997 & int(size(id%POSINRHSCOMP_COL),8)*K34_8
1998 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2001 id%POSINRHSCOMP_COL => id%POSINRHSCOMP_ROW
2002 id%POSINRHSCOMP_COL_ALLOC = .FALSE.
2004.NE.
IF (KEEP(221)2) THEN
2007 IF (associated(id%RHSCOMP)) THEN
2008 NB_BYTES = NB_BYTES - id%KEEP8(25)*K35_8
2009 DEALLOCATE(id%RHSCOMP)
2019 LIWK_SOLVE = 2 * KEEP(28) + id%NA(1)+1
2020 LIWK_PTRACB= KEEP(28)
2023.EQ.
IF (KEEP(201)1) THEN
2024 LIWK_SOLVE = LIWK_SOLVE + KEEP(228) + 1
2027 LIWK_SOLVE = LIWK_SOLVE + 1
2029 ALLOCATE ( IWK_SOLVE(LIWK_SOLVE),
2030 & PTRACB(LIWK_PTRACB), stat = allocok )
2031.GT.
IF (allocok 0 ) THEN
2033 INFO(2)=LIWK_SOLVE + LIWK_PTRACB*KEEP(10)
2036 NB_BYTES = NB_BYTES + int(LIWK_SOLVE,8)*K34_8 +
2037 & int(LIWK_PTRACB,8)*K34_8 *int(KEEP(10),8)
2038 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2043 LIWCB = 20*NB_K133*2 + KEEP(133)
2044 ALLOCATE ( IWCB( LIWCB), stat = allocok )
2045.GT.
IF (allocok 0 ) THEN
2050 NB_BYTES = NB_BYTES + int(LIWCB,8)*K34_8
2051 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2062 ALLOCATE(SRW3(KEEP(133)), stat = allocok )
2063.GT.
IF ( allocok 0 ) THEN
2068 NB_BYTES = NB_BYTES + int(size(SRW3),8)*K35_8
2069 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2082 IF (allocated(UNS_PERM_INV)) DEALLOCATE(UNS_PERM_INV)
2083 UNS_PERM_INV_NEEDED_INMAINLOOP = .FALSE.
2084.eq..AND..GT..AND.
IF ( ( id%MYID MASTER(KEEP(23)0)
2085.NE..AND..NE.
& (MTYPE 1)(KEEP(248)0)
2089.OR..NE..AND..NE.
& ( KEEP(237)0 KEEP(23)0 )
2107 UNS_PERM_INV_NEEDED_INMAINLOOP = .TRUE.
2109 UNS_PERM_INV_NEEDED_BEFMAINLOOP = .FALSE.
2110.GT..AND.
IF ( KEEP(23) 0
2111.NE..AND..EQ.
& MTYPE 1 KEEP(248)-1 ) THEN
2116 UNS_PERM_INV_NEEDED_BEFMAINLOOP = .TRUE.
2118.OR.
IF ( UNS_PERM_INV_NEEDED_INMAINLOOP
2119 & UNS_PERM_INV_NEEDED_BEFMAINLOOP ) THEN
2120 ALLOCATE(UNS_PERM_INV(id%N),stat=allocok)
2121.GT.
if (allocok 0 ) THEN
2126 NB_BYTES = NB_BYTES + int(id%N,8)*K34_8
2127 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2128.EQ.
IF (id%MYIDMASTER) THEN
2131 UNS_PERM_INV(id%UNS_PERM(I))=I
2136 ALLOCATE(UNS_PERM_INV(1), stat=allocok)
2137.GT.
if (allocok 0 ) THEN
2142 NB_BYTES = NB_BYTES + 1_8*K34_8
2143 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2148 CALL VTEND(glob_comm_ini,IERR)
2154 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2156.LT.
IF (INFO(1) 0 ) GOTO 90
2159.NE..AND.
IF ( KEEP(23)0
2160.NE..OR.
& ( KEEP(237)0
2161.NE..AND..EQ.
& ( MTYPE1 KEEP(248)-1 ) ) ) THEN
2163 CALL MPI_BCAST( UNS_PERM_INV,id%N,MPI_INTEGER,MASTER,
2170.AND..EQ.
IF (I_AM_SLAVE KEEP(248)-1) THEN
2172 ALLOCATE(MAP_RHS_loc(max(id%Nloc_RHS,1)), stat=allocok)
2173.GT.
IF (allocok 0) THEN
2175 id%INFO(2)=max(id%Nloc_RHS,1)
2178 NB_BYTES = NB_BYTES + max(int(id%Nloc_RHS,8),1_8)*K34_8
2183 BUILD_RHSMAPINFO = .TRUE.
2185 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2187.LT.
IF ( INFO(1) 0 ) GOTO 90
2192.AND..GT..AND..EQ.
IF ( I_AM_SLAVE KEEP(23)0 KEEP(248)-1
2193.AND..NE.
& MTYPE1 ) THEN
2194.GT.
IF (id%Nloc_RHS 0) THEN
2195 ALLOCATE(IRHS_loc_PTR(id%Nloc_RHS),stat=allocok)
2196.GT.
IF (allocok0) THEN
2201 IRHS_loc_PTR_ALLOCATED = .TRUE.
2202 NB_BYTES = NB_BYTES + max(int(id%Nloc_RHS,8),1_8)*K34_8
2203 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2205.GE..AND..LE.
IF (id%IRHS_loc(I)1 id%IRHS_loc(I)id%N)
2207 IRHS_loc_PTR(I)=UNS_PERM_INV(id%IRHS_loc(I))
2210 IRHS_loc_PTR(I)=id%IRHS_loc(I)
2217.AND.
IF (UNS_PERM_INV_NEEDED_BEFMAINLOOP
2218.NOT.
& UNS_PERM_INV_NEEDED_INMAINLOOP) THEN
2219 NB_BYTES = NB_BYTES - int(size(UNS_PERM_INV),8)*K34_8
2220 DEALLOCATE(UNS_PERM_INV)
2221 ALLOCATE(UNS_PERM_INV(1)) ! to posibly pass it as an argument
2222 NB_BYTES = NB_BYTES + K34_8
2224.AND..EQ.
IF (LSCAL id%KEEP(248)-1) THEN
2227 IF (MTYPE == 1) THEN
2229 scaling_data_dr%SCALING=>id%ROWSCA
2232 scaling_data_dr%SCALING=>id%COLSCA
2234 CALL CMUMPS_SET_SCALING_LOC( scaling_data_dr, id%N,
2235 & IRHS_loc_PTR(1), id%Nloc_RHS,
2236 & id%COMM, id%MYID, I_AM_SLAVE, MASTER,
2237 & NB_BYTES, NB_BYTES_MAX, K16_8, LP, LPOK,
2238 & ICNTL(1), INFO(1) )
2245 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2247.LT.
IF ( INFO(1) 0 ) GOTO 90
2252 IF ( ICNTL21==1 ) THEN
2257.NE.
IF (id%MYIDMASTER) THEN
2258 IF (MTYPE == 1) THEN
2259 ALLOCATE(id%COLSCA(id%N),stat=allocok)
2261 ALLOCATE(id%ROWSCA(id%N),stat=allocok)
2263 IF (allocok > 0) THEN
2265 WRITE(LP,*) 'error allocating temporary scaling array
'
2271 NB_BYTES = NB_BYTES + int(id%N,8)*K16_8
2272 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2273.NE.
ENDIF ! MYID MASTER
2274 37 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2276.LT.
IF (INFO(1) 0 ) GOTO 90
2277 IF (I_AM_SLAVE) THEN
2278 ALLOCATE(scaling_data_sol%SCALING_LOC(id%KEEP(89)),
2280 IF (allocok > 0) THEN
2282 WRITE(LP,*) 'error allocating local scaling array
'
2288 NB_BYTES = NB_BYTES + int(id%KEEP(89),8)*K16_8
2289 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2292 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2294.LT.
IF (INFO(1) 0 ) THEN
2297 IF (MTYPE == 1) THEN
2298 CALL MPI_BCAST(id%COLSCA(1),id%N,
2301 scaling_data_sol%SCALING=>id%COLSCA
2303 CALL MPI_BCAST(id%ROWSCA(1),id%N,
2306 scaling_data_sol%SCALING=>id%ROWSCA
2309 IF ( I_AM_SLAVE ) THEN
2313 LIW_PASSED=max(1,LIW)
2317.GT.
IF (KEEP(89) 0) THEN
2318 CALL CMUMPS_DISTSOL_INDICES( MTYPE, id%ISOL_loc(1),
2320 & id%KEEP(1),id%KEEP8(1),
2321 & id%IS(1), LIW_PASSED,id%MYID_NODES,
2322 & id%N, id%STEP(1), id%PROCNODE_STEPS(1),
2323 & id%NSLAVES, scaling_data_sol, LSCAL
2325.EQ.
& , (KEEP(248)-1), IRHS_loc_PTR(1), id%Nloc_RHS
2328.NE..AND.
IF (id%MYIDMASTER LSCAL) THEN
2333 IF (MTYPE == 1) THEN
2334 DEALLOCATE(id%COLSCA)
2337 DEALLOCATE(id%ROWSCA)
2340 NB_BYTES = NB_BYTES - int(id%N,8)*K16_8
2343.NE..AND.
IF (KEEP(23) 0 MTYPE==1) THEN
2346.NE.
IF (id%MYIDMASTER) THEN
2347 ALLOCATE(id%UNS_PERM(id%N),stat=allocok)
2348 IF (allocok > 0) THEN
2358 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2360.LT.
IF (INFO(1) 0 ) GOTO 90
2363.NE..AND.
IF (KEEP(23) 0 MTYPE==1) THEN
2364 CALL MPI_BCAST(id%UNS_PERM(1),id%N,MPI_INTEGER,MASTER,
2366 IF (I_AM_SLAVE) THEN
2368 id%ISOL_loc(I) = id%UNS_PERM(id%ISOL_loc(I))
2371.NE.
IF (id%MYIDMASTER) THEN
2372 DEALLOCATE(id%UNS_PERM)
2373 NULLIFY(id%UNS_PERM)
2384.EQ..OR.
IF ( ( KEEP(221) 1 )
2385.EQ.
& ( KEEP(221) 2 )
2389.EQ.
IF (KEEP(46)1) THEN
2390 MASTER_ROOT_IN_COMM=MASTER_ROOT
2392 MASTER_ROOT_IN_COMM =MASTER_ROOT+1
2394.EQ.
IF ( id%MYID MASTER ) THEN
2399.EQ.
IF (id%NRHS1) THEN
2400 LD_REDRHS = id%KEEP(116)
2402 LD_REDRHS = id%LREDRHS
2405.NE.
IF (MASTERMASTER_ROOT_IN_COMM) THEN
2410.EQ.
IF ( id%MYID MASTER ) THEN
2413 CALL MPI_SEND(LD_REDRHS,1,MPI_INTEGER,
2414 & MASTER_ROOT_IN_COMM, 0, id%COMM,IERR)
2415.EQ.
ELSEIF ( id%MYIDMASTER_ROOT_IN_COMM) THEN
2417 CALL MPI_RECV(LD_REDRHS,1,MPI_INTEGER,
2418 & MASTER, 0, id%COMM,STATUS,IERR)
2424 IF ( KEEP(248)==1 ) THEN ! Sparse RHS (A-1 or general sparse)
2425! JBEG_RHS - current starting column within A-1 or sparse rhs
2426! set in the loop below and used to obtain the
2427! global index of the column of the sparse RHS
2428! Also used to get index in global permutation.
2429! It also allows to skip empty columns;
2430 JEND_RHS = 0 ! last column in current blockin A-1
2433 IF (DO_PERMUTE_RHS) THEN
2435 ALLOCATE(PERM_RHS(id%NRHS),stat=allocok)
2436 IF (allocok > 0) THEN
2441 NB_BYTES = NB_BYTES + int(id%NRHS,8)*K34_8
2442 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2443.EQ.
IF (id%MYIDMASTER) THEN
2450.EQ.
IF (KEEP(237)0) THEN
2455 CALL CMUMPS_PERMUTE_RHS_GS(
2456 & LP, LPOK, PROKG, MPG, KEEP(242),
2457 & id%SYM_PERM(1), id%N, id%NRHS,
2458 & id%IRHS_PTR(1), id%NRHS+1,
2459 & id%IRHS_SPARSE(1), id%NZ_RHS,
2464 GOTO 109 ! propagate error
2473 STRAT_PERMAM1 = KEEP(242)
2474 CALL CMUMPS_PERMUTE_RHS_AM1
2475 & (STRAT_PERMAM1, id%SYM_PERM(1),
2476 & id%IRHS_PTR(1), id%NRHS+1,
2477 & PERM_RHS, id%NRHS,
2494.NOT.
IF ( allocated(PERM_RHS)) THEN
2495 ALLOCATE(PERM_RHS(1),stat=allocok)
2496 IF (allocok > 0) THEN
2501 NB_BYTES = NB_BYTES + int(size(PERM_RHS),8)*K34_8
2502 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
2505109 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
2507.LT.
IF (INFO(1) 0 ) GOTO 90
2510.EQ.
IF (id%NSLAVES 1) THEN
2514.AND..NE.
IF (DO_PERMUTE_RHS KEEP(111)0 ) THEN
2518 WRITE(*,*) id%MYID, ':internal error 1 :
',
2519 & ' permute rhs during null space computation
',
2520 & ' not available yet
'
2522 ENDIF ! End Permute_RHS
2524.AND..NE.
IF (DO_PERMUTE_RHS KEEP(111)0 ) THEN
2525 WRITE(*,*) id%MYID, ':internal error 2 :
',
2526 & ' permute rhs during null space computation
',
2527 & ' not available yet
'
2531 ENDIF ! End DO_PERMUTE_RHS
2532.AND..NE.
IF (INTERLEAVE_PAR (KEEP(111)0)) THEN
2533 WRITE(*,*) id%MYID, ':internal error 3 :
',
2534 & ' interleave rhs during null space computation
',
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 CMUMPS_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 CMUMPS_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 CMUMPS_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 CMUMPS_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 cmumps_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 CMUMPS_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 CMUMPS_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 CMUMPS_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),
3659 & MASTER, id%COMM, IERR)
3664.NE.
IF (KEEP(237)0) THEN
3665 IF ( I_AM_SLAVE ) THEN
3671 K=1 ! Column index in RHSCOMP
3672 id%RHSCOMP(1_8:int(NBRHS_EFF,8)*int(LD_RHSCOMP,8))
3675 DO I = 1, NBCOL_INBLOC
3676 COLSIZE = IRHS_PTR_COPY(I+1) - IRHS_PTR_COPY(I)
3677.GT.
IF (COLSIZE0) THEN
3678 ! Find global column index J and set
3679 ! column K of RHSCOMP to ej (here IBEG is one)
3680 J = I - 1 + JBEG_RHS
3681.OR.
IF (DO_PERMUTE_RHSINTERLEAVE_PAR) THEN
3684 IPOSRHSCOMP = id%POSINRHSCOMP_ROW(J)
3687.GT.
IF (IPOSRHSCOMP0) THEN
3698 id%RHSCOMP(int(K-1,8)*int(LD_RHSCOMP,8)+
3699 & int(IPOSRHSCOMP,8)) =
3700 & RHS_SPARSE_COPY(IPOS)
3701 ENDIF ! End of J on my proc
3703 IPOS = IPOS + COLSIZE ! go to next column
3706.NE.
IF (KNBRHS_EFF+1) THEN
3707 WRITE(6,*) 'internal error 9 in solution driver
',
3720.EQ..AND..GT.
IF ((KEEP(221)1)(NB_RHSSKIPPED0)
3721.AND.
& I_AM_SLAVE) THEN
3722 DO K = JBEG_RHS-NB_RHSSKIPPED, JBEG_RHS-1
3723 DO I = 1, LD_RHSCOMP
3724 id%RHSCOMP(int(K-1,8)*int(LD_RHSCOMP,8)
3725 & + int(I,8)) = ZERO
3729 IF (I_AM_SLAVE) THEN
3730 DO K = 1, NBCOL_INBLOC
3731! it is equal to NBRHS_EFF in this case
3732 KDEC = int(K-1,8) * int(LD_RHSCOMP,8) +
3733 & IBEG_RHSCOMP - 1_8
3734 id%RHSCOMP(KDEC+1_8:KDEC+NBENT_RHSCOMP) = ZERO
3735 DO IZ=IRHS_PTR_COPY(K), IRHS_PTR_COPY(K+1)-1
3736 I=IRHS_SPARSE_COPY(IZ)
3737 IPOSRHSCOMP = id%POSINRHSCOMP_ROW(I)
3745.LE.
IF ( (IPOSRHSCOMPNB_FS_RHSCOMP_TOT)
3746.AND..GT.
& (IPOSRHSCOMP0) ) THEN
3748 id%RHSCOMP(KDEC+IPOSRHSCOMP)=
3749 & id%RHSCOMP(KDEC+IPOSRHSCOMP) +
3750 & RHS_SPARSE_COPY(IZ)
3756 ENDIF ! ==== KEEP(248)==1 =====
3758 ELSE IF (I_AM_SLAVE) THEN
3759 ! I_AM_SLAVE AND (null space or Fwd in facto)
3760.NE.
IF (KEEP(111)0) THEN
3780.GT.
IF (KEEP(111)0) THEN
3781 IBEG_GLOB_DEF = KEEP(111)
3782 IEND_GLOB_DEF = KEEP(111)
3784 IBEG_GLOB_DEF = BEG_RHS
3785 IEND_GLOB_DEF = BEG_RHS+NBRHS_EFF-1
3787.GT..AND.
IF ( id%KEEP(112) 0 DO_NULL_PIV) THEN
3788.GT.
IF (IBEG_GLOB_DEF id%KEEP(112)) THEN
3790 DO_NULL_PIV = .FALSE.
3792.LT.
IF (IBEG_GLOB_DEF id%KEEP(112)
3793.AND..GT.
& IEND_GLOB_DEF id%KEEP(112)
3794.AND.
& DO_NULL_PIV ) THEN
3801 DO_NULL_PIV = .FALSE.
3804.NE.
IF (id%KEEP(235)0) THEN
3811 NZ_THIS_BLOCK=IEND_GLOB_DEF-IBEG_GLOB_DEF+1
3812 ALLOCATE(IRHS_PTR_COPY(NZ_THIS_BLOCK+1),stat=allocok)
3813.GT.
IF (allocok 0 ) THEN
3815 INFO(2)=NZ_THIS_BLOCK
3818 IRHS_PTR_COPY_ALLOCATED = .TRUE.
3819 ALLOCATE(IRHS_SPARSE_COPY(NZ_THIS_BLOCK),stat=allocok)
3820.GT.
IF (allocok 0 ) THEN
3822 INFO(2)=NZ_THIS_BLOCK
3825 IRHS_SPARSE_COPY_ALLOCATED=.TRUE.
3826 NB_BYTES = NB_BYTES +
3827 & int(NZ_THIS_BLOCK,8)*(K34_8+K34_8)
3829 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
3830.eq.
IF (id%MYIDMASTER) THEN
3831 ! compute IRHS_PTR and IRHS_SPARSE_COPY
3833 DO I = IBEG_GLOB_DEF, IEND_GLOB_DEF
3834 IRHS_PTR_COPY(I-IBEG_GLOB_DEF+1) = I
3835 IRHS_SPARSE_COPY(II) = id%PIVNUL_LIST(I)
3838 IRHS_PTR_COPY(NZ_THIS_BLOCK+1) = NZ_THIS_BLOCK+1
3843 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
3845.LT.
IF (INFO(1) 0 ) GOTO 90
3847 CALL MPI_BCAST(IRHS_SPARSE_COPY(1),
3850 & MASTER, id%COMM,IERR)
3851 CALL MPI_BCAST(IRHS_PTR_COPY(1),
3854 & MASTER, id%COMM,IERR)
3860 KDEC = int(K-1,8) * int(LD_RHSCOMP,8)
3861 id%RHSCOMP(KDEC+1_8:KDEC+int(LD_RHSCOMP,8))=ZERO
3872 DO I=max(IBEG_GLOB_DEF,KEEP(220)),
3873 & min(IEND_GLOB_DEF,KEEP(220)+KEEP(109)-1)
3876 JJ= id%POSINRHSCOMP_ROW(id%PIVNUL_LIST(I-KEEP(220)+1))
3878.EQ.
IF (KEEP(50)0) THEN
3879 ! unsymmetric : always set to fixation
3880 id%RHSCOMP( IBEG_RHSCOMP+
3881 & int(I-IBEG_GLOB_DEF,8)*int(LD_RHSCOMP,8) +
3883 & cmplx(id%DKEEP(2),kind=kind(id%RHSCOMP))
3885 ! Symmetric: always set to one
3886 id%RHSCOMP( IBEG_RHSCOMP+
3887 & int(I-IBEG_GLOB_DEF,8)*int(LD_RHSCOMP,8)+
3893.NE..AND.
IF ( KEEP(17)0
3894.EQ.
& id%MYID_NODESMASTER_ROOT) THEN
3901 IBEG_ROOT_DEF = max(IBEG_GLOB_DEF,KEEP(112)+1)
3902 IEND_ROOT_DEF = min(IEND_GLOB_DEF,KEEP(112)+KEEP(17))
3905 IROOT_DEF_RHS_COL1 = IBEG_ROOT_DEF-IBEG_GLOB_DEF + 1
3908 IBEG_ROOT_DEF = IBEG_ROOT_DEF-KEEP(112)
3909 IEND_ROOT_DEF = IEND_ROOT_DEF-KEEP(112)
3914 IBEG_ROOT_DEF = -90999
3915 IEND_ROOT_DEF = -95999
3916 IROOT_DEF_RHS_COL1= 1
3918 ELSE ! End of null space (test on KEEP(111))
3924 ENDIF ! End of null space (test on KEEP(111))
3926 TIMESCATTER2=MPI_WTIME()-TIMESCATTER1+TIMESCATTER2
3932 IF ( I_AM_SLAVE ) THEN
3934.EQ.
IF ( id%MYID_NODES MASTER_ROOT ) THEN
3936 IF ( associated(id%root%RHS_CNTR_MASTER_ROOT) ) THEN
3939 PTR_RHS_ROOT => id%root%RHS_CNTR_MASTER_ROOT
3940# if defined(MUMPS_F2003)
3941 LPTR_RHS_ROOT = size(id%root%RHS_CNTR_MASTER_ROOT,kind=8)
3943 LPTR_RHS_ROOT = int(size(id%root%RHS_CNTR_MASTER_ROOT),8)
3947 LPTR_RHS_ROOT = int(NBRHS_EFF,8) * int(SIZE_ROOT,8)
3948 IPT_RHS_ROOT = LWCB8 - LPTR_RHS_ROOT + 1_8
3949 PTR_RHS_ROOT => WORK_WCB(IPT_RHS_ROOT:LWCB8)
3950 LWCB8_SOL_C = LWCB8_SOL_C - LPTR_RHS_ROOT
3954 IPT_RHS_ROOT = LWCB8 ! Will be passed, but not accessed
3955 PTR_RHS_ROOT => WORK_WCB(IPT_RHS_ROOT:LWCB8)
3956 LWCB8_SOL_C = LWCB8_SOL_C - LPTR_RHS_ROOT
3959.EQ.
IF (KEEP(221) 2 ) THEN
3964.EQ..AND.
IF ( ( id%MYID MASTER_ROOT_IN_COMM )
3965.EQ.
& ( id%MYID MASTER ) ) THEN
3969 KDEC = IBEG_REDRHS+int(K-1,8)*int(LD_REDRHS,8)-1_8
3971 PTR_RHS_ROOT(II+I) = id%REDRHS(KDEC+I)
3977.EQ.
IF ( id%MYID MASTER) THEN
3980.EQ.
IF (LD_REDRHSSIZE_ROOT) THEN
3983 CALL MPI_SEND(id%REDRHS(KDEC),
3984 & SIZE_ROOT*NBRHS_EFF,
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,
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,
4004 & MASTER, 0, id%COMM,STATUS,IERR)
4007 CALL MPI_RECV(PTR_RHS_ROOT(II),SIZE_ROOT,
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 CMUMPS_SOL_ES module
4029 CALL CMUMPS_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 CMUMPS_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,
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,
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,
4156 & MASTER, 0, id%COMM,IERR)
4159 CALL MPI_SEND(PTR_RHS_ROOT(II),SIZE_ROOT,
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 CMUMPS_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 CMUMPS_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 CMUMPS_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 CMUMPS_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 CMUMPS_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 CMUMPS_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 CMUMPS_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 CMUMPS_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 ),
4561 & MPI_SUM,MASTER,id%COMM, IERR)
4563 CALL MPI_REDUCE( R_LOCWK54, R_DUMMY,
4565 & MPI_SUM,MASTER,id%COMM, IERR)
4570.eq.
IF ( id%MYID MASTER ) THEN
4572 RINFOG(4) = real(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.0E0) THEN
4591 ARRET = sqrt(epsilon(0.0E0))
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 CMUMPS_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 CMUMPS_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 CMUMPS_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_COMPLEX, MASTER,
4645.and.
IF ( I_AM_SLAVE
4646.NE.
& id%KEEP8(29) 0_8 ) THEN
4647 CALL CMUMPS_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_COMPLEX,
4656 & MPI_SUM,MASTER,id%COMM, IERR)
4661 CALL MPI_REDUCE( C_LOCWK54, C_DUMMY,
4662 & id%N, MPI_COMPLEX,
4663 & MPI_SUM,MASTER,id%COMM, IERR)
4676.and..NE.
IF ( I_AM_SLAVE id%KEEP8(29) 0_8 ) THEN
4677 CALL CMUMPS_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,
4686 & MPI_SUM,MASTER,id%COMM, IERR)
4688 CALL MPI_REDUCE( R_LOCWK54, R_DUMMY,
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 CMUMPS_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)+real(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 CMUMPS_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)+real(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 CMUMPS_SOL_DRIVER"
4825 CALL CMUMPS_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)=real(TIMEIT)
4854 id%DKEEP(114)=real(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 CMUMPS_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 CMUMPS_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_COMPLEX, MASTER,
4922.and.
IF ( I_AM_SLAVE
4923.NE.
& id%KEEP8(29) 0_8 ) THEN
4924 CALL CMUMPS_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_COMPLEX,
4933 & MPI_SUM,MASTER,id%COMM, IERR)
4936 CALL MPI_REDUCE( C_LOCWK54, C_DUMMY,
4937 & id%N, MPI_COMPLEX,
4938 & MPI_SUM,MASTER,id%COMM, IERR)
4942.EQ.
IF (id%MYID MASTER) THEN
4946.EQ.
IF (IFLAG_IR2) THEN
4948 CALL CMUMPS_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 CMUMPS_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)+real(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 CMUMPS_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 CMUMPS_PP_SOLVE()
5000.LT.
IF (INFO(1) 0) GOTO 90
5010 CALL MUMPS_SECFIN(TIMELCOND)
5011 id%DKEEP(121)=id%DKEEP(121)+real(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 IF (keep(242).EQ.0)
THEN
5105 kdec = (k-1)*ld_rhs+ibeg-1
5111 kdec = int(perm_rhs(k-1+jbeg_rhs)-1,8)*int(ld_rhs,8)
5114 c_rw1(i) = id%RHS(kdec+i)
5117 jperm = id%UNS_PERM(i)
5118 id%RHS( kdec+jperm ) = c_rw1( i )
5127 IF (id%MYID.EQ.master .and.icntl21==0.and.keep(221).NE.1.AND.
5128 & (keep(237).EQ.0) )
THEN
5130 IF ( info(1) .GE. 0 .AND. icntl(4).GE.3 .AND. icntl(3).GT.0)
5133 IF (icntl(4) .eq. 4 ) k = id%N
5134 j = min0(10,nbrhs_eff)
5135 IF (icntl(4) .eq. 4 ) j = nbrhs_eff
5137 WRITE(icntl(3),110) beg_rhs+ii-1
5139 & (id%RHS(ibeg+(ii-1)*ld_rhs+i-1),i=1,k)
5145 IF ((keep(248).EQ.1).AND.(keep(237).EQ.0))
THEN
5150 beg_rhs = beg_rhs + nbrhs_eff
5152 beg_rhs = beg_rhs + nbrhs
5158 IF (keep(400) .GT. 0)
THEN
5166 IF ( (id%MYID.EQ.master)
5168 & .AND. ( keep(237).EQ.0 )
5169 & .AND. ( icntl21.EQ.0 )
5170 & .AND. ( keep(221) .NE.1 )
5171 & .AND. ( jend_rhs .LT. id%NRHS )
5174 jbeg_new = jend_rhs + 1
5175 IF (do_permute_rhs.OR.interleave_par)
THEN
5176 DO WHILE ( jbeg_new.LE. id%NRHS)
5178 id%RHS(int(perm_rhs(jbeg_new) -1,8)*int(ld_rhs,8)+i)
5181 jbeg_new = jbeg_new +1
5184 DO WHILE ( jbeg_new.LE. id%NRHS)
5186 id%RHS(int(jbeg_new -1,8)*int(ld_rhs,8) + i) = zero
5188 jbeg_new = jbeg_new +1
5196 IF ( i_am_slave .AND. (icntl21.NE.0) .AND.
5197 & ( jend_rhs .LT. id%NRHS ) .AND. keep(221).NE.1 )
THEN
5198 jbeg_new = jend_rhs + 1
5199 IF (do_permute_rhs.OR.interleave_par)
THEN
5200 DO WHILE ( jbeg_new.LE. id%NRHS)
5202 id%SOL_loc(int(perm_rhs(jbeg_new) -1,8)*
5203 & int(id%LSOL_loc,8)+int(i,8)) = zero
5205 jbeg_new = jbeg_new +1
5209 DO WHILE ( jbeg_new.LE. id%NRHS)
5211 id%SOL_loc((jbeg_new -1)*id%LSOL_loc + i) = zero
5213 jbeg_new = jbeg_new +1
5222 IF ((keep(221).EQ.1) .AND.
5223 & ( jend_rhs .LT. id%NRHS ) )
THEN
5224 IF (id%MYID .EQ. master)
THEN
5225 jbeg_new = jend_rhs + 1
5226 DO WHILE ( jbeg_new.LE. id%NRHS)
5227 DO i=1, id%SIZE_SCHUR
5228 id%REDRHS(int(jbeg_new -1,8)*int(ld_redrhs,8) +
5231 jbeg_new = jbeg_new +1
5234 IF (i_am_slave)
THEN
5235 jbeg_new = jend_rhs + 1
5236 DO WHILE ( jbeg_new.LE. id%NRHS)
5237 DO i=1,nbent_rhscomp
5238 id%RHSCOMP(int(jbeg_new -1,8)*int(ld_rhscomp,8) +
5241 jbeg_new = jbeg_new +1
5248 id%INFO(26) = int(nb_bytes_max / 1000000_8)
5257 & id%INFO(26), id%INFOG(30), irank )
5259 IF (print_maxavg)
THEN
5260 WRITE( mpg,
'(A,I10) ')
5261 &
' ** Rank of processor needing largest memory in solve :',
5263 WRITE( mpg,
'(A,I10) ')
5264 &
' ** Space in MBYTES used by this processor for solve :',
5266 IF ( keep(46) .eq. 0 )
THEN
5267 WRITE( mpg,
'(A,I10) ')
5268 &
' ** Avg. Space in MBYTES per working proc during solve :',
5269 & ( id%INFOG(31)-id%INFO(26) ) / id%NSLAVES
5271 WRITE( mpg,
'(A,I10) ')
5272 &
' ** Avg. Space in MBYTES per working proc during solve :',
5273 & id%INFOG(31) / id%NSLAVES
5276 WRITE( mpg,
'(A,I10) ')
5277 &
' ** Space in MBYTES used for solve :',
5286 id%DKEEP(112)=real(time3)
5287 id%DKEEP(113)=real(timec2)
5288 id%DKEEP(115)=real(timescatter2)
5289 id%DKEEP(116)=real(timegather2)
5290 id%DKEEP(122)=real(timecopyscale2)
5292 CALL mpi_reduce( id%DKEEP(115), id%DKEEP(160),1,
5293 &mpi_real, mpi_max, master, id%COMM, ierr )
5294 CALL mpi_reduce( id%DKEEP(116), id%DKEEP(161),1,
5295 &mpi_real, mpi_max, master, id%COMM, ierr )
5296 CALL mpi_reduce( id%DKEEP(117), id%DKEEP(162),1,
5297 &mpi_real, mpi_max, master, id%COMM, ierr )
5298 CALL mpi_reduce( id%DKEEP(118), id%DKEEP(163),1,
5299 &mpi_real, mpi_max, master, id%COMM, ierr )
5300 CALL mpi_reduce( id%DKEEP(119), id%DKEEP(164),1,
5301 &mpi_real, mpi_max, master, id%COMM, ierr )
5302 CALL mpi_reduce( id%DKEEP(122), id%DKEEP(165),1,
5303 &mpi_real, mpi_max, master, id%COMM, ierr )
5307 WRITE ( mpg, *)
"Leaving solve with ..."
5308 WRITE( mpg, 434 ) id%DKEEP(160)
5309 WRITE( mpg, 432 ) id%DKEEP(113)
5310 WRITE( mpg, 435 ) id%DKEEP(162)
5311 IF ((keep(38).NE.0).OR.(keep(20).NE.0))
5312 &
WRITE( mpg, 437 ) id%DKEEP(164)
5313 WRITE( mpg, 436 ) id%DKEEP(163)
5314 WRITE( mpg, 433 ) id%DKEEP(161)
5315 WRITE( mpg, 431 ) id%DKEEP(165)
5319 WRITE ( mp, *)
"Local statistics"
5320 WRITE( mp, 434 ) id%DKEEP(115)
5321 WRITE( mp, 432 ) id%DKEEP(113)
5322 WRITE( mp, 435 ) id%DKEEP(117)
5323 IF ((keep(38).NE.0).OR.(keep(20).NE.0))
5324 &
WRITE( mp, 437 ) id%DKEEP(119)
5325 WRITE( mp, 436 ) id%DKEEP(118)
5326 WRITE( mp, 433 ) id%DKEEP(116)
5327 WRITE( mp, 431 ) id%DKEEP(122)
5330 IF (info(1) .LT.0 )
THEN
5332 IF (keep(485) .EQ. 1)
THEN
5333 keep(350) = keep350_save
5334 IF (is_lr_mod_to_struc_done)
THEN
5340 IF (keep(201).GT.0)
THEN
5341 IF (is_init_ooc_done)
THEN
5343 IF (ierr.LT.0 .AND. info(1) .GE. 0) info(1) = ierr
5357 IF (irhs_sparse_copy_allocated)
THEN
5358 nb_bytes = nb_bytes -
5359 & int(
size(irhs_sparse_copy),8)*k34_8
5360 DEALLOCATE(irhs_sparse_copy)
5361 irhs_sparse_copy_allocated=.false.
5362 NULLIFY(irhs_sparse_copy)
5364 IF (irhs_ptr_copy_allocated)
THEN
5365 nb_bytes = nb_bytes -
5366 & int(
size(irhs_ptr_copy),8)*k34_8
5367 DEALLOCATE(irhs_ptr_copy)
5368 irhs_ptr_copy_allocated=.false.
5369 NULLIFY(irhs_ptr_copy)
5371 IF (rhs_sparse_copy_allocated)
THEN
5372 nb_bytes = nb_bytes -
5373 & int(
size(rhs_sparse_copy),8)*k35_8
5374 DEALLOCATE(rhs_sparse_copy)
5375 rhs_sparse_copy_allocated=.false.
5376 NULLIFY(rhs_sparse_copy)
5378 IF (
allocated(map_rhs_loc))
THEN
5379 nb_bytes = nb_bytes - int(
size(map_rhs_loc),8)*k34_8
5380 DEALLOCATE(map_rhs_loc)
5382 IF (irhs_loc_ptr_allocated )
THEN
5383 nb_bytes = nb_bytes - int(
size(irhs_loc_ptr),8)*k34_8
5384 DEALLOCATE(irhs_loc_ptr)
5385 NULLIFY(irhs_loc_ptr)
5386 irhs_loc_ptr_allocated = .false.
5388 IF (i_am_slave.AND.lscal.AND.keep(248).EQ.-1)
THEN
5389 nb_bytes = nb_bytes -
5390 & int(
size(scaling_data_dr%SCALING_LOC),8)*k16_8
5391 DEALLOCATE(scaling_data_dr%SCALING_LOC)
5392 NULLIFY (scaling_data_dr%SCALING_LOC)
5394 IF (
allocated(perm_rhs))
THEN
5395 nb_bytes = nb_bytes - int(
size(perm_rhs),8)*k34_8
5396 DEALLOCATE(perm_rhs)
5399 IF (
allocated(uns_perm_inv))
THEN
5400 nb_bytes = nb_bytes - int(
size(uns_perm_inv),8)*k34_8
5401 DEALLOCATE(uns_perm_inv)
5403 IF (
allocated(bufr))
THEN
5404 nb_bytes = nb_bytes - int(
size(bufr),8)*k34_8
5407 IF ( i_am_slave )
THEN
5408 IF (
allocated(rhs_bounds))
THEN
5409 nb_bytes = nb_bytes -
5410 & int(
size(rhs_bounds),8)*k34_8
5411 DEALLOCATE(rhs_bounds)
5413 IF (
allocated(iwk_solve))
THEN
5414 nb_bytes = nb_bytes - int(
size(iwk_solve),8)*k34_8
5415 DEALLOCATE( iwk_solve )
5417 IF (
allocated(ptracb))
THEN
5418 nb_bytes = nb_bytes - int(
size(ptracb),8)*k34_8*
5420 DEALLOCATE( ptracb )
5422 IF (
allocated(iwcb))
THEN
5423 nb_bytes = nb_bytes - int(
size(iwcb),8)*k34_8
5431 IF (id%NSLAVES .GT. 1)
THEN
5437 IF ( id%MYID .eq. master )
THEN
5442 IF (
allocated(saverhs))
THEN
5443 nb_bytes = nb_bytes - int(
size(saverhs),8)*k35_8
5444 DEALLOCATE( saverhs)
5453 IF (
associated(rhs_ir))
THEN
5454 nb_bytes = nb_bytes - int(
size(rhs_ir),8)*k35_8
5459 IF (i_am_slave)
THEN
5461 IF (
allocated(srw3))
THEN
5462 nb_bytes = nb_bytes - int(
size(srw3),8)*k35_8
5465 IF (lscal .AND. icntl21==1)
THEN
5467 nb_bytes = nb_bytes -
5468 & int(
size(scaling_data_sol%SCALING_LOC),8)*k16_8
5469 DEALLOCATE(scaling_data_sol%SCALING_LOC)
5470 NULLIFY(scaling_data_sol%SCALING_LOC)
5473 IF (wk_user_provided)
THEN
5480 ELSE IF (
associated(id%S).AND.keep(201).GT.0)
THEN
5482 nb_bytes = nb_bytes - keep8(23)*k35_8
5487 IF (keep(221).NE.1)
THEN
5491 IF (
associated(id%RHSCOMP))
THEN
5492 nb_bytes = nb_bytes - id%KEEP8(25)*k35_8
5493 DEALLOCATE(id%RHSCOMP)
5497 IF (
associated(id%POSINRHSCOMP_ROW))
THEN
5498 nb_bytes = nb_bytes -
5499 & int(
size(id%POSINRHSCOMP_ROW),8)*k34_8
5500 DEALLOCATE(id%POSINRHSCOMP_ROW)
5501 NULLIFY(id%POSINRHSCOMP_ROW)
5503 IF (id%POSINRHSCOMP_COL_ALLOC)
THEN
5504 nb_bytes = nb_bytes -
5505 & int(
size(id%POSINRHSCOMP_COL),8)*k34_8
5506 DEALLOCATE(id%POSINRHSCOMP_COL)
5507 NULLIFY(id%POSINRHSCOMP_COL)
5508 id%POSINRHSCOMP_COL_ALLOC = .false.
5511 IF ( work_wcb_allocated )
THEN
5512 nb_bytes = nb_bytes - int(
size(work_wcb),8)*k35_8
5513 DEALLOCATE( work_wcb )
5520 55
FORMAT (//
' ERROR ANALYSIS BEFORE ITERATIVE REFINEMENT')
5521 100
FORMAT(//
' ****** SOLVE & CHECK STEP ********'/)
5522 110
FORMAT (//
' Vector solution for column ',i12)
5523 115
FORMAT(1x, a44,1p,d9.2)
5524 434
FORMAT(
' Time to build/scatter RHS =',f15.6)
5525 432
FORMAT(
' Time in solution step (fwd/bwd) =',f15.6)
5526 435
FORMAT(
' .. Time in forward (fwd) step = ',f15.6)
5527 437
FORMAT(
' .. Time in ScaLAPACK root = ',f15.6)
5528 436
FORMAT(
' .. Time in backward (bwd) step = ',f15.6)
5529 433
FORMAT(
' Time to gather solution(cent.sol)=',f15.6)
5530 431
FORMAT(
' Time to copy/scale dist. solution=',f15.6)
5531 150
FORMAT(
' GLOBAL STATISTICS PRIOR SOLVE PHASE ...........'/
5532 &
' Number of right-hand-sides =',i12/
5533 &
' Blocking factor for multiple rhs =',i12/
5534 &
' ICNTL (9) =',i12/
5535 &
' --- (10) =',i12/
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,5e14.6))
5546 170
FORMAT (/
' ERROR ANALYSIS' )
5547 240
FORMAT (1x, a42,i4)
5548 270
FORMAT (//
' BEGIN ITERATIVE REFINEMENT' )
5549 81
FORMAT (/
' STATISTICS AFTER ITERATIVE REFINEMENT ')
5550 131
FORMAT (/
' END ITERATIVE REFINEMENT ')
5551 141
FORMAT(1x, a52,i4)
5574 INTEGER,
INTENT( IN ) :: idNloc_RHS
5575 INTEGER,
INTENT( IN ) :: idLRHS_loc
5576 INTEGER,
INTENT( IN ) :: NRHS
5577#if defined(MUMPS_F2003)
5578 INTEGER,
INTENT( IN ),
POINTER :: idIRHS_loc (:)
5579 COMPLEX,
INTENT( IN ),
POINTER :: idRHS_loc (:)
5581 INTEGER,
POINTER :: idIRHS_loc (:)
5582 COMPLEX,
POINTER :: idRHS_loc (:)
5584 INTEGER,
INTENT( INOUT ) :: INFO(80)
5589 INTEGER(8) :: REQSIZE8
5595 IF (idnloc_rhs .LE. 0)
RETURN
5598 IF ( idlrhs_loc .LT. idnloc_rhs)
THEN
5604 IF (idnloc_rhs .GT. 0)
THEN
5606 IF (.NOT.
associated(idirhs_loc))
THEN
5610 ELSE IF (
size(idirhs_loc) .LT. idnloc_rhs)
THEN
5616 IF (.NOT.
associated(idrhs_loc))
THEN
5622 reqsize8 = int(idlrhs_loc,8)*int(nrhs,8)
5623 & + int(-idlrhs_loc+idnloc_rhs,8)
5624#if defined(MUMPS_F2003)
5625 IF (
size(idrhs_loc,kind=8) .LT. reqsize8)
THEN
5627 IF ( reqsize8 .LE. int(huge(idnloc_rhs),8) .AND.
5628 &
size(idrhs_loc) .LT. int(reqsize8) )
THEN
5654 IF (kase .NE. 1 .AND. kase .NE. 2)
THEN
5655 WRITE(*,*)
"Internal error 1 in CMUMPS_PP_SOLVE"
5658 IF ( id%MYID .eq. master )
THEN
5666 IF ( mtype .EQ. 1 )
THEN
5675 IF ( solvet.EQ.2 ) solvet = 0
5677 IF ( solvet .EQ. 1 )
THEN
5680 c_y( k ) = c_y( k ) * id%ROWSCA( k )
5685 c_y( k ) = c_y( k ) * id%COLSCA( k )
5693 CALL mpi_bcast( solvet, 1, mpi_integer, master,
5698 IF ( .NOT.i_am_slave )
THEN
5702 & solvet, c_y(1), id%N, 1,
5706 & jdummy, id%KEEP(1), id%KEEP8(1), id%PROCNODE_STEPS(1),
5709 & id%ICNTL(1),id%INFO(1))
5711 IF (solvet.EQ.mtype)
THEN
5714 ptr_posinrhscomp_fwd => id%POSINRHSCOMP_ROW
5718 ptr_posinrhscomp_fwd => id%POSINRHSCOMP_COL
5720 liw_passed =
max( liw, 1 )
5723 & solvet, c_y(1), id%N, 1,
5725 & id%RHSCOMP(ibeg_rhscomp), ld_rhscomp, 1,
5726 & ptr_posinrhscomp_fwd(1), nb_fs_rhscomp_f,
5728 & id%PTLUST_S(1), id%KEEP(1), id%KEEP8(1),
5729 & id%PROCNODE_STEPS(1),
5730 & is(1), liw_passed,
5732 & id%ICNTL(1),id%INFO(1))
5734 IF (info(1).LT.0)
GOTO 89
5738 IF ( i_am_slave )
THEN
5739 liw_passed =
max( liw, 1 )
5740 la_passed =
max( la, 1_8 )
5741 IF (solvet.EQ.mtype)
THEN
5742 ptr_posinrhscomp_fwd => id%POSINRHSCOMP_ROW
5743 ptr_posinrhscomp_bwd => id%POSINRHSCOMP_COL
5745 ptr_posinrhscomp_fwd => id%POSINRHSCOMP_COL
5746 ptr_posinrhscomp_bwd => id%POSINRHSCOMP_ROW
5749 nbsparse_loc = .false.
5750 CALL cmumps_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 IF (info(1).eq.-2) info(1)=-12
5775 IF (info(1).eq.-3) info(1)=-15
5777 IF (info(1) .GE. 0)
THEN
5784 ALLOCATE( cwork(
max(
max(keep(247),keep(246)),1)),
5786 IF (allocok > 0)
THEN
5788 info(2)=
max(
max(keep(247),keep(246)),1)
5798 IF (info(1).LT.0)
RETURN
5807 IF ((id%MYID.NE.master).OR. .NOT.lscal)
THEN
5808 pt_scaling => dummy_scal
5810 IF (solvet.EQ.1)
THEN
5811 pt_scaling => id%COLSCA
5813 pt_scaling => id%ROWSCA
5816 liw_passed =
max( liw, 1 )
5819 IF ( .NOT. i_am_slave )
THEN
5824 & id%MYID, id%COMM, nbrhs_eff,
5825 & solvet, c_y, id%N, nbrhs_eff, 1,
5826 & jdummy, id%KEEP(1),id%KEEP8(1), id%PROCNODE_STEPS(1),
5828 & id%STEP(1), bufr(1), lbufr, lbufr_bytes,
5829 & cwork(1),
size(cwork),
5830 & lscal, pt_scaling(1),
size(pt_scaling),
5832 & c_dummy, 1 , 1, idummy, 1,
5834 & perm_rhs,
size(perm_rhs)
5838 & id%MYID, id%COMM, nbrhs_eff,
5839 & solvet, c_y, id%N, nbrhs_eff, 1,
5840 & id%PTLUST_S(1), id%KEEP(1),id%KEEP8(1),
5841 & id%PROCNODE_STEPS(1),
5842 & is(1), liw_passed,
5843 & id%STEP(1), bufr(1), lbufr, lbufr_bytes,
5844 & cwork(1),
size(cwork),
5845 & lscal, pt_scaling(1),
size(pt_scaling),
5846 & id%RHSCOMP(ibeg_rhscomp), ld_rhscomp, nbrhs_eff,
5847 & ptr_posinrhscomp_bwd(1), id%N,
5848 & perm_rhs,
size(perm_rhs))
subroutine cmumps_sol_c(root, n, a, la, iw, liw, w, lwc, iwcb, liww, nrhs, na, lna, ne_steps, w2, mtype, icntl, from_pp, step, frere, dad, fils, ptrist, ptrfac, iw1, liw1, ptracb, liwk_ptracb, procnode_steps, slavef, info, keep, keep8, dkeep, comm_nodes, myid, myid_nodes, bufr, lbufr, lbufr_bytes, istep_to_iniv2, tab_pos_in_pere, ibeg_root_def, iend_root_def, iroot_def_rhs_col1, rhs_root, lrhs_root, size_root, master_root, rhscomp, lrhscomp, posinrhscomp_fwd, posinrhscomp_bwd, nz_rhs, nbcol_inbloc, nrhs_orig, jbeg_rhs, step2node, lstep2node, irhs_sparse, irhs_ptr, size_perm_rhs, perm_rhs, size_uns_perm_inv, uns_perm_inv, nb_fs_in_rhscomp_f, nb_fs_in_rhscomp_tot, do_nbsparse, rhs_bounds, lrhs_bounds, ipool_b_l0_omp, lpool_b_l0_omp, ipool_a_l0_omp, lpool_a_l0_omp, l_virt_l0_omp, virt_l0_omp, l_phys_l0_omp, phys_l0_omp, perm_l0_omp, ptr_leafs_l0_omp, l0_omp_mapping, ll0_omp_mapping, l0_omp_factors, ll0_omp_factors)