46 TYPE (SMUMPS_STRUC) :: id
47 INTEGER(8) :: NB_INT,NB_CMPLX,NB_CHAR
50 &(idrhs, idinfo, idn, idnrhs, idlrhs)
51 REAL,
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 (SMUMPS_STRUC),
TARGET :: id
76 LOGICAL PROK, PROKG, LPOK
78 LOGICAL LSCAL, POSTPros, GIVSOL
79 INTEGER ICNTL10, ICNTL11
80 INTEGER I,IPERM,K,JPERM, J, II, IZ2
81 INTEGER , NZ_THIS_BLOCK, PJ
85 INTEGER(8) :: LA, LA_PASSED
87 INTEGER(8) :: LWCB8_MIN, LWCB8,
89 INTEGER SMUMPS_LBUF, SMUMPS_LBUF_INT
90 INTEGER(8) :: SMUMPS_LBUF_8
91 INTEGER :: LBUFR, LBUFR_BYTES
92 INTEGER :: MSG_MAX_BYTES_SOLVE, MSG_MAX_BYTES_GTHRSOL
95 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: BUFR
97 INTEGER IBEG_ROOT_DEF, IEND_ROOT_DEF,
98 & IBEG_GLOB_DEF, IEND_GLOB_DEF,
101 INTEGER NITREF, NOITER, SOLVET, KASE
103 LOGICAL INTERLEAVE_PAR, DO_PERMUTE_RHS
108 DOUBLE PRECISION TIMEIT, TIMEEA, TIMEEA1, TIMELCOND
109 DOUBLE PRECISION TIME3
110 DOUBLE PRECISION TIMEC1,TIMEC2
111 DOUBLE PRECISION TIMEGATHER1,TIMEGATHER2
112 DOUBLE PRECISION TIMESCATTER1,TIMESCATTER2
113 DOUBLE PRECISION TIMECOPYSCALE1,TIMECOPYSCALE2
117 INTEGER :: NRHS_NONEMPTY
118 INTEGER :: STRAT_PERMAM1
119 LOGICAL :: DO_NULL_PIV
120 INTEGER,
DIMENSION(:),
POINTER :: IRHS_PTR_COPY
121 INTEGER,
DIMENSION(:),
POINTER :: IRHS_SPARSE_COPY
122 REAL,
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 REAL,
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 REAL,
DIMENSION(:),
POINTER
139INTEGER :: SIZE_IPTR_WORKING, SIZE_WORKING
163 parameter( one = 1.0e0 )
164 parameter( zero = 0.0e0 )
166 parameter( rzero = 0.0e0, rone = 1.0e0 )
173 REAL,
DIMENSION(:),
POINTER :: RHS_IR
174 REAL,
DIMENSION(:),
POINTER :: WORK_WCB
175 REAL,
DIMENSION(:),
POINTER :: PTR_RHS_ROOT
176 INTEGER(8) :: LPTR_RHS_ROOT
180 REAL,
ALLOCATABLE :: SAVERHS(:), C_RW1(:),
185 REAL,
ALLOCATABLE :: CWORK(:)
186 INTEGER,
ALLOCATABLE :: MAP_RHS(:)
187 REAL,
ALLOCATABLE :: R_Y(:), D(:)
188 REAL,
ALLOCATABLE :: R_W(:)
192 REAL,
ALLOCATABLE,
DIMENSION(:) :: R_LOCWK54
193 REAL,
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,INFO
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 REAL,
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
276 INTEGER(8) :: IBEG, IBEG_RHSCOMP, KDEC, IBEG_loc, IBEG_REDRHS
277 INTEGER LD_RHSCOMP, NCOL_RHS_loc
278 INTEGER LD_RHS_loc, JBEG_RHS_loc
279 INTEGER NB_K133, IRANK, TSIZE
281 INTEGER IFLAG_IR, IRStep
283 LOGICAL WORKSPACE_MINIMAL_PREFERRED, WK_USER_PROVIDED
285 INTEGER(8) NB_BYTES_MAX
286 INTEGER(8) NB_BYTES_EXTRA
287 INTEGER(8) NB_BYTES_LOC
288 INTEGER(8) NB_INT, NB_CMPLX, NB_CHAR, K34_8, K35_8
289 INTEGER(8) K16_8, ITMP8, NB_BYTES_ON_ENTRY
292 INTEGER soln_drive_class, glob_comm_ini, perm_scal_ini, soln_dist,
293 & soln_assem, perm_scal_post
295 LOGICAL I_AM_SLAVE, BUILD_POSINRHSCOMP
296 LOGICAL :: BUILD_RHSMAPINFO
297 LOGICAL , 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,
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 SMUMPS_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 SMUMPS_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 SMUMPS_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 IF (keep(237) .NE. 0 .AND. keep(60) .NE.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 SMUMPS_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 SMUMPS_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 SMUMPS_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 SMUMPS_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 SMUMPS_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 SMUMPS_BUILD_MAPPING_INFO(id)
1185 & CALL SMUMPS_SOL_ES_INIT(id%OOC_SIZE_OF_BLOCK, id%KEEP(201))
1186 DO_NULL_PIV = .TRUE.
1187 NBCOL_INBLOC = -9998
1188 NZ_THIS_BLOCK= -9998
1191.EQ.
IF (id%MYIDMASTER) THEN ! Compute NRHS_NONEMPTY
1194.AND.
IF ( KEEP(111)==0 KEEP(248)==1
1201.LT.
IF (id%IRHS_PTR(I)id%IRHS_PTR(I+1))
1202 & NRHS_NONEMPTY = NRHS_NONEMPTY+1 !ith col in non empty
1204.LE.
IF (NRHS_NONEMPTY0) THEN
1207 & WRITE(LP,*) " Internal Error 3 in solution driver ",
1208 & " NRHS_NONEMPTY= ",
1213 NRHS_NONEMPTY = id%NRHS
1221.ne.
IF ( KEEP( 38 ) 0 ) THEN
1222 MASTER_ROOT = MUMPS_PROCNODE(
1223 & id%PROCNODE_STEPS(id%STEP( KEEP(38))),
1225.eq.
IF (id%MYID_NODES MASTER_ROOT) THEN
1226 SIZE_ROOT = id%root%TOT_ROOT_SIZE
1227.EQ..AND..NE.
ELSE IF ((id%MYIDMASTER)KEEP(60)0) THEN
1229 SIZE_ROOT=id%KEEP(116)
1231.ne.
ELSE IF (KEEP( 20 ) 0 ) THEN
1232 MASTER_ROOT = MUMPS_PROCNODE(
1233 & id%PROCNODE_STEPS(id%STEP(KEEP(20))),
1235.eq.
IF (id%MYID_NODES MASTER_ROOT) THEN
1237 & id%PTLUST_S(id%STEP(KEEP(20)))+KEEP(IXSZ) + 3)
1238.EQ..AND..NE.
ELSE IF ((id%MYIDMASTER)KEEP(60)0) THEN
1240 SIZE_ROOT=id%KEEP(116)
1243 MASTER_ROOT = -44444
1251.eq.
IF (id%MYID MASTER) THEN
1252 KEEP(84) = ICNTL(27)
1254.EQ.
IF(ICNTL(27)0) KEEP(84)=1
1255.NE.
IF (KEEP(252)0) THEN
1256! Fwd in facto: all rhs (KEEP(253) need be processed in one pass
1259.EQ..OR..GT.
IF (KEEP(201) 0 KEEP(84) 0) THEN
1260 NBRHS = abs(KEEP(84))
1264.GT.
IF (NBRHS NRHS_NONEMPTY ) NBRHS = NRHS_NONEMPTY
1269 CALL VTBEGIN(glob_comm_ini,IERR)
1272 CALL MPI_BCAST(NRHS_NONEMPTY,1,MPI_INTEGER,MASTER,
1274 CALL MPI_BCAST(NBRHS,1,MPI_INTEGER,MASTER,
1277.GT.
IF (KEEP(201)0) THEN
1281 WORKSPACE_MINIMAL_PREFERRED = .FALSE.
1282.eq.
IF (id%MYID MASTER) THEN
1283 KEEP(107) = max(0,KEEP(107))
1284.EQ..AND.
IF ((KEEP(107)0)
1285.EQ..AND..NE.
& (KEEP(204)0)(KEEP(211)1) ) THEN
1288 ! -Emmergency buffer only and
1290 ! -NO_O_DIRECT (because of synchronous choice)
1292 ! "Basic system-based version"
1293 ! We can force to allocate S to a minimal
1295 WORKSPACE_MINIMAL_PREFERRED=.TRUE.
1298 CALL MPI_BCAST( KEEP(107), 1, MPI_INTEGER,
1299 & MASTER, id%COMM, IERR )
1300 CALL MPI_BCAST( KEEP(204), 1, MPI_INTEGER,
1301 & MASTER, id%COMM, IERR )
1302 CALL MPI_BCAST( KEEP(208), 2, MPI_INTEGER,
1303 & MASTER, id%COMM, IERR )
1304 CALL MPI_BCAST( WORKSPACE_MINIMAL_PREFERRED, 1,
1306 & MASTER, id%COMM, IERR )
1309 IF ( I_AM_SLAVE ) THEN
1338.NE..OR..NE.
IF ( KEEP( 38 ) 0 KEEP( 20 ) 0 ) THEN
1339.eq.
IF ( MASTER_ROOT id%MYID_NODES ) THEN
1341.NOT.
& associated(id%root%RHS_CNTR_MASTER_ROOT)
1343 NB_K133 = NB_K133 + 1
1347 LWCB8_MIN = int(NB_K133,8)*int(KEEP(133),8)*int(NBRHS,8)
1355.NE.
WK_USER_PROVIDED = (id%LWK_USER0)
1356.EQ.
IF (id%LWK_USER0) THEN
1358.GT.
ELSE IF (id%LWK_USER0) THEN
1359 ITMP8= int(id%LWK_USER,8)
1361 ITMP8 = -int(id%LWK_USER,8)* 1000000_8
1368.EQ.
IF (KEEP(201)0) THEN ! incore
1370.NE.
IF (ITMP8KEEP8(24)) THEN
1373 INFO(2) = id%LWK_USER
1374 GOTO 99 ! jump to propinfo
1375 ! (S is used in between and not allocated)
1376 ! NO COMM must occur then before next propinfo
1377 ! it happens in Mila's code but only with
1386 IF (wk_user_provided)
THEN
1388 IF (maxs.LT. keep8(20))
THEN
1391 itmp8 = keep8(20)+1_8-maxs
1394 IF (info(1) .GE. 0 ) id%S => id%WK_USER(1:keep8(24))
1395 ELSE IF (
associated(id%S))
THEN
1402 IF (keep(201).EQ.0)
THEN
1403 WRITE(*,*)
' Working array S not allocated ',
1404 &
' on entry to solve phase (in core) '
1415 IF ( keep(209).EQ.-1 .AND. workspace_minimal_preferred)
1418 maxs = keep8(20) + 1_8
1419 ELSE IF ( keep(209) .GE.0 )
THEN
1421 maxs =
max(int(keep(209),8), keep8(20) + 1_8)
1427 maxs =
max(maxs, id%KEEP8(20)+1_8)
1428 ALLOCATE (id%S(maxs), stat = allocok)
1430 IF ( allocok .GT. 0 )
THEN
1432 WRITE(lp,*) id%MYID,
': problem allocation of S ',
1440 nb_bytes = nb_bytes + keep8(23) * k35_8
1441 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
1450 IF(keep(201).EQ.0)
THEN
1455 IF(maxs.GT.keep8(31)+keep8(20)*int(keep(107)+1,8))
THEN
1462 la=keep8(31)+keep8(20)*int(keep(107)+1,8)
1469 IF ( maxs-la .GT. lwcb8_min )
THEN
1471 work_wcb => id%S(la+1_8:la+lwcb8)
1472 work_wcb_allocated=.false.
1475 ALLOCATE(work_wcb(lwcb8), stat = allocok)
1476 IF (allocok < 0 )
THEN
1480 work_wcb_allocated=.true.
1481 nb_bytes = nb_bytes + lwcb8*k35_8
1482 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
1489 IF (info(1) < 0)
GOTO 90
1491 IF ( i_am_slave )
THEN
1492 IF (keep(201).GT.0)
THEN
1497 is_init_ooc_done = .true.
1503 IF (info(1) < 0)
GOTO 90
1505 IF (i_am_slave)
THEN
1506 IF (keep(485).EQ.1)
THEN
1507 IF (.NOT. (
associated(id%FDM_F_ENCODING)))
THEN
1508 WRITE(*,*)
"Internal error 18 in SMUMPS_SOL_DRIVER"
1511 IF (.NOT. (
associated(id%BLRARRAY_ENCODING)))
THEN
1512 WRITE(*,*)
"Internal error 19 in SMUMPS_SOL_DRIVER"
1518 is_lr_mod_to_struc_done = .true.
1521 IF (id%MYID.EQ.master)
THEN
1526 & id%NRHS, nbrhs, icntl(9), icntl(10), icntl(11),
1527 & icntl(20), icntl(21), icntl(30), keep(486)
1528 IF (keep(111).NE.0)
THEN
1529 WRITE (mpg, 151) keep(111)
1531 IF (keep(221).NE.0)
THEN
1532 WRITE (mpg, 152) keep(221)
1534 IF (keep(252).GT.0)
THEN
1535 WRITE (mpg, 153) keep(252)
1543 lscal = (((keep(52) .GT. 0) .AND. (keep(52) .LE. 8)) .OR. (
1544 & keep(52) .EQ. -1) .OR. keep(52) .EQ. -2)
1548 IF ((icntl11 .LT. 0).OR.(icntl11 .GE. 3))
THEN
1550 IF (prokg)
WRITE(mpg,
'(A)')
1551 &
' WARNING: ICNTL(11) out of range'
1554 IF (icntl11.NE.0 .OR. icntl10.NE.0)
THEN
1558 IF (keep(111).NE.0)
THEN
1565 IF (prokg)
WRITE(mpg,
'(A,A)')
1566 &
' WARNING: Incompatible features: null space basis ',
1567 &
' and Iter. Ref and/or Err. Anal.'
1569 ELSE IF ( keep(237) .NE.0 )
THEN
1570 IF (prokg)
WRITE(mpg,
'(A,A)')
1571 &
' WARNING: Incompatible features: AM1',
1572 &
' and Iter. Ref and/or Err. Anal.'
1574 ELSE IF ( keep(252) .NE.0 )
THEN
1575 IF (prokg)
WRITE(mpg,
'(A,A)')
1576 &
' WARNING: Incompatible features: Fwd in facto ',
1577 &
' and Iter. Ref and/or Err. Anal.'
1579 ELSE IF (keep(221).NE.0)
THEN
1582 IF (prokg)
WRITE(mpg,
'(A,A)')
1583 &
' WARNING: Incompatible features: reduced RHS ',
1584 &
' and Iter. Ref and/or Err. Anal.'
1586 ELSE IF (nbrhs.GT. 1 .OR. icntl(21) .GT. 0)
THEN
1590 IF (prokg)
WRITE(mpg,
'(A,A)')
1591 &
' WARNING: Incompatible features: nrhs>1 or distrib sol',
1592 &
' and Iter. Ref and/or Err. Anal.'
1594 ELSE IF ( keep(248) .EQ. -1 )
THEN
1597 IF (prokg)
WRITE(mpg,
'(A,A)')
1598 &
' WARNING: Incompatible features: distrib rhs',
1599 &
' and Iter. Ref and/or Err. Anal.'
1602 IF (.NOT.postpros)
THEN
1608 IF ((icntl(10) .NE. 0) .AND. (icntl10 .EQ. 0))
THEN
1609 IF (prokg)
WRITE(mpg,
'(A)')
1610 &
' WARNING: ICNTL(10) treated as if set to 0 '
1612 IF ((icntl(11) .NE. 0)
1613 & .AND.(icntl11 .EQ. 0))
THEN
1614 IF (prokg)
WRITE(mpg,
'(A)')
1615 &
' WARNING: ICNTL(11) treated as if set to 0 '
1619 CALL mpi_bcast(postpros,1,mpi_logical,master,
1625 IF ( postpros )
THEN
1628 IF ( keep(54) .EQ. 0 )
THEN
1630 IF ( id%MYID .eq. master )
THEN
1631 IF (keep(55).eq.0)
THEN
1633 IF (.NOT.
associated(id%A) .OR.
1634 & (.NOT.
associated(id%IRN)) .OR.
1635 & ( .NOT.
associated(id%JCN)))
THEN
1637 &
' WARNING: original centralized assembled',
1638 &
' matrix is not allocated '
1643 IF (.NOT.
associated(id%A_ELT).OR.
1644 & .NOT.
associated(id%ELTPTR).OR.
1645 & .NOT.
associated(id%ELTVAR))
THEN
1646 IF (prokg)
WRITE(mpg,
'(A)')
1647 &
' WARNING: original elemental matrix is not allocated '
1654 IF ( i_am_slave .AND. (id%KEEP8(29) .GT. 0_8) )
THEN
1657 IF ((.NOT.
associated(id%A_loc)) .OR.
1658 & (.NOT.
associated(id%IRN_loc)) .OR.
1659 & (.NOT.
associated(id%JCN_loc)))
THEN
1660 IF (prokg)
WRITE(mpg,
'(A)')
1661 &
' WARNING: original distributed assembled',
1662 &
' matrix is not allocated '
1668 CALL mpi_reduce( mat_alloc_loc, mat_alloc, 1,
1670 & mpi_min, master, id%COMM, ierr)
1671 IF ( id%MYID .eq. master )
THEN
1672 IF (mat_alloc.EQ.0)
THEN
1677 IF ((icntl(10) .NE. 0) .AND. (icntl10 .EQ. 0))
THEN
1678 IF (prokg)
WRITE(mpg,
'(A)')
1679 &
' WARNING: ICNTL(10) treated as if set to 0 '
1681 IF ((icntl(11) .EQ. 1).OR.(icntl(11) .EQ. 2)
1682 & .AND.(icntl11 .EQ. 0))
THEN
1683 IF (prokg)
WRITE(mpg,
'(A)')
1684 &
' WARNING: ICNTL(11) treated as if set to 0 '
1688 ALLOCATE(saverhs(id%N*nbrhs),stat = allocok)
1689 IF ( allocok .GT. 0 )
THEN
1691 WRITE(lp,*) id%MYID,
1692 &
':Problem in solve: error allocating SAVERHS'
1695 info(2) = id%N*nbrhs
1697 nb_bytes = nb_bytes + int(
size(saverhs),8)*k35_8
1698 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
1703 IF (keep(237).NE.0 .AND.keep(111).NE.0)
THEN
1707 IF (prokg)
WRITE(mpg,
'(A)')
1708 &
' WARNING: KEEP(237) treated as if set to 0 (null space)'
1715 IF (info(1) .LT.0 )
GOTO 90
1721 CALL mpi_bcast(icntl10,1,mpi_integer,master,
1723 CALL mpi_bcast(icntl11,1,mpi_integer,master,
1725 CALL mpi_bcast(icntl21,1,mpi_integer,master,
1727 CALL mpi_bcast(postpros,1,mpi_logical,master,
1729 CALL mpi_bcast(lscal,1,mpi_logical,master,
1731 CALL mpi_bcast(keep(237),1,mpi_integer,master,
1743 do_permute_rhs = (keep(242).NE.0)
1745 IF ( (id%NSLAVES.GT.1) .AND. (keep(243).NE.0)
1750 IF ((keep(237).NE.0).or.(keep(111).GT.0))
THEN
1751 interleave_par= .true.
1754 write(mpg,*)
' Warning incompatible options ',
1755 &
' interleave RHS reset to false '
1763 msg_max_bytes_solve8 = int(( 4 + keep(133) ) * keep(34),8) +
1764 & int(keep(133)*keep(35),8) * int(nbrhs,8)
1765 & + int(16*keep(34),8)
1767 IF ( msg_max_bytes_solve8 .GT.
1768 & int(huge(i4),8))
THEN
1770 info(2) = ( huge(i4) -
1771 & ( 16 + 4 + keep(133) ) ) /
1772 & ( keep(133) * keep(35) )
1774 IF (info(1) .LT.0 )
GOTO 111
1775 msg_max_bytes_solve = int(msg_max_bytes_solve8)
1782 IF (keep(237).EQ.0)
THEN
1790 kmax_246_247 =
max(keep(246),keep(247))
1791 msg_max_bytes_gthrsol = ( 2 + kmax_246_247 ) * keep(34) +
1792 & kmax_246_247 * nbrhs * keep(35)
1793 ELSE IF (icntl21.EQ.0)
THEN
1798 msg_max_bytes_gthrsol = ( 3 * keep(34) + keep(35) )
1803 msg_max_bytes_gthrsol = 0
1806 lbufr_bytes =
max(msg_max_bytes_solve, msg_max_bytes_gthrsol)
1807 tsize = int(
min(100_8*int(msg_max_bytes_gthrsol,8),
1809 lbufr_bytes =
max(lbufr_bytes,tsize)
1810 lbufr = ( lbufr_bytes + keep(34) - 1 ) / keep(34)
1811 ALLOCATE (bufr(lbufr),stat=allocok)
1812 IF ( allocok .GT. 0 )
THEN
1814 WRITE(lp,*) id%MYID,
1815 & ' problem in solve: error allocating bufr
'
1821 NB_BYTES = NB_BYTES + int(size(BUFR),8)*K34_8
1822 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
1823.AND..GT.
IF ( I_AM_SLAVE id%NSLAVES 1 ) THEN
1827 SMUMPS_LBUF_INT = ( 20 + id%NSLAVES * id%NSLAVES * 4 )
1829 CALL SMUMPS_BUF_ALLOC_SMALL_BUF( SMUMPS_LBUF_INT, IERR )
1830.NE.
IF ( IERR 0 ) THEN
1832 INFO(2) = SMUMPS_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 SMUMPS_LBUF_8 = min(SMUMPS_LBUF_8, 100000000_8)
1856 SMUMPS_LBUF_8 = max(SMUMPS_LBUF_8,
1857 & int((MSG_MAX_BYTES_SOLVE+2*KEEP(34)),8) *
1858 & int(min(id%NSLAVES,3),8) )
1859 SMUMPS_LBUF_8 = SMUMPS_LBUF_8 + 2_8*int(KEEP(34),8)
1863 SMUMPS_LBUF_8 = min(SMUMPS_LBUF_8,
1865 & - 10_8*int(KEEP(34),8)
1867 SMUMPS_LBUF = int(SMUMPS_LBUF_8, kind(SMUMPS_LBUF))
1868 CALL SMUMPS_BUF_ALLOC_CB( SMUMPS_LBUF, IERR )
1869.NE.
IF ( IERR 0 ) THEN
1871 INFO(2) = SMUMPS_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 SMUMPS_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 SMUMPS_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 SMUMPS_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 SMUMPS_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 '
2524 IF (do_permute_rhs .AND. keep(111).NE.0 )
THEN
2525 WRITE(*,*) id%MYID,
':INTERNAL ERROR 2 : ',
2526 &
' PERMUTE RHS during null space computation ',
2527 &
' not available yet '
2532 IF (interleave_par.AND. (keep(111).NE.0))
THEN
2533 WRITE(*,*) id%MYID,
':INTERNAL ERROR 3 : ',
2534 &
' INTERLEAVE RHS during null space computation ',
2535 &
' not available yet '
2538 IF (interleave_par.AND.keep(111).EQ.0)
THEN
2541 IF (id%MYID.EQ.master)
THEN
2544 size_working = id%IPTR_WORKING(id%NPROCS+1)-1
2545 size_iptr_working = id%NPROCS+1
2547 & perm_rhs, id%NRHS,
2548 & id%IPTR_WORKING(1), size_iptr_working,
2549 & id%WORKING(1), size_working,
2551 & id%STEP(1), id%SYM_PERM(1), id%N, nbrhs,
2552 & id%PROCNODE_STEPS(1), keep(28), id%NSLAVES,
2555 & keep(495).NE.0, keep(496), prokg, mpg
2563 IF (do_permute_rhs.AND.(keep(111).EQ.0))
THEN
2570 & master, id%COMM,ierr)
2573 IF (keep(401) .GT. 0)
THEN
2578 IF ( keep(400) .GT. 0 )
THEN
2584 IF (keep(400).NE.nomp)
THEN
2587 id%INFO(2) = keep(400)
2588 IF (lpok)
WRITE(lp,
'(A,A,I5,A,I5)')
2589 &
" FAILURE DETECTED IN SOLVE: #threads for KEEP(401)",
2590 &
" changed from",keep(400),
" at analysis to", nomp
2595 IF (keep(400) .GT. 0)
THEN
2611 DO WHILE (beg_rhs.LE.nrhs_nonempty)
2625 nbrhs_eff =
min(nrhs_nonempty-beg_rhs+1, nbrhs)
2629 IF (irhs_sparse_copy_allocated)
THEN
2630 nb_bytes = nb_bytes -
2631 & int(
size(irhs_sparse_copy),8)*k34_8
2632 DEALLOCATE(irhs_sparse_copy)
2633 irhs_sparse_copy_allocated=.false.
2634 NULLIFY(irhs_sparse_copy)
2636 IF (irhs_ptr_copy_allocated)
THEN
2637 nb_bytes = nb_bytes -
2638 & int(
size(irhs_ptr_copy),8)*k34_8
2639 DEALLOCATE(irhs_ptr_copy)
2640 irhs_ptr_copy_allocated=.false.
2641 NULLIFY(irhs_ptr_copy)
2643 IF (rhs_sparse_copy_allocated)
THEN
2644 nb_bytes = nb_bytes -
2645 & int(
size(rhs_sparse_copy),8)*k35_8
2646 DEALLOCATE(rhs_sparse_copy)
2647 rhs_sparse_copy_allocated=.false.
2648 NULLIFY(rhs_sparse_copy)
2659 & ( id%MYID .NE. master )
2665 & ( i_am_slave .AND. id%MYID .EQ. master .AND.
2666 & icntl21 .NE.0 .AND.
2667 & ( keep(248).ne.0 .OR. keep(221).EQ.2
2668 & .OR. keep(111).NE.0 )
2676 & ( id%MYID .EQ. master .AND. (keep(237).NE.0) )
2683 IF (
associated(id%RHS) )
THEN
2685 ld_rhs =
max(id%LRHS, id%N)
2690 ibeg = int(beg_rhs-1,8) * int(ld_rhs,8) + 1_8
2700 IF ( (id%MYID.EQ.master) .AND.
2701 & keep(248)==1 )
THEN
2704 jbeg_rhs = jend_rhs + 1
2705 IF (do_permute_rhs.OR.interleave_par)
THEN
2706 DO WHILE ( id%IRHS_PTR(perm_rhs(jbeg_rhs)) .EQ.
2707 & id%IRHS_PTR(perm_rhs(jbeg_rhs)+1) )
2709 IF ((keep(237).EQ.0).AND.(icntl21.EQ.0).AND.
2710 & (keep(221).NE.1) )
THEN
2715 id%RHS(int(perm_rhs(jbeg_rhs) -1,8)*int(ld_rhs,8)+
2719 jbeg_rhs = jbeg_rhs +1
2722 DO WHILE( id%IRHS_PTR(jbeg_rhs) .EQ.
2723 & id%IRHS_PTR(jbeg_rhs+1) )
2724 IF ((keep(237).EQ.0).AND.(icntl21.EQ.0).AND.
2725 & (keep(221).NE.1) )
THEN
2730 id%RHS(int(jbeg_rhs -1,8)*int(ld_rhs,8) +
2734 IF (keep(221).EQ.1)
THEN
2736 DO i = 1, id%SIZE_SCHUR
2737 id%REDRHS(int(jbeg_rhs-1,8)*int(ld_redrhs,8) +
2741 jbeg_rhs = jbeg_rhs +1
2750 nb_rhsskipped = jbeg_rhs - (jend_rhs + 1)
2751 IF ((keep(248).EQ.1).AND.(keep(237).EQ.0)
2752 & .AND. (icntl21.EQ.0))
2757 ibeg = int(jbeg_rhs-1,8) * int(ld_rhs,8) + 1_8
2760 CALL mpi_bcast( jbeg_rhs, 1, mpi_integer,
2761 & master, id%COMM, ierr )
2765 IF (id%MYID.EQ.master .AND. keep(221).NE.0)
THEN
2768 ibeg_redrhs= int(jbeg_rhs-1,8)*int(ld_redrhs,8) + 1_8
2770 ibeg_redrhs=-142424_8
2778 CALL vtbegin(perm_scal_ini,ierr)
2780 IF (id%MYID .eq. master)
THEN
2782 IF (keep(248)==1)
THEN
2808 stop_at_next_empty_col = .false.
2809 DO i=jbeg_rhs, id%NRHS
2810 nbcol_inbloc = nbcol_inbloc +1
2811 IF (do_permute_rhs.OR.interleave_par)
THEN
2816 colsize = id%IRHS_PTR(perm_rhs(i)+1)
2817 & - id%IRHS_PTR(perm_rhs(i))
2819 colsize = id%IRHS_PTR(i+1) - id%IRHS_PTR(i)
2821 IF ((.NOT.stop_at_next_empty_col).AND.(colsize.GT.0).AND.
2822 & (keep(237).EQ.0))
THEN
2825 stop_at_next_empty_col =.true.
2830 nz_this_block = nz_this_block + colsize
2831 ELSE IF (stop_at_next_empty_col)
THEN
2834 nbcol_inbloc = nbcol_inbloc -1
2838 IF (nbcol.EQ.nbrhs_eff)
EXIT
2840 IF (nz_this_block.EQ.0)
THEN
2841 WRITE(*,*)
" Internal Error 16 in sol driver NZ_THIS_BLOCK=",
2846 IF (nbcol.NE.nbrhs_eff.AND. (keep(237).NE.0)
2847 & .AND.keep(221).NE.1)
THEN
2855 WRITE(6,*)
' Internal Error 8 in solution driver ',
2861 IF (nz_this_block .NE. 0)
THEN
2866 ALLOCATE(irhs_ptr_copy(nbcol_inbloc+1),stat=allocok)
2867 if (allocok .GT.0 )
then
2869 info(2)=nbcol_inbloc+1
2872 irhs_ptr_copy_allocated = .true.
2873 nb_bytes = nb_bytes + int(nbcol_inbloc+1,8)*k34_8
2874 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2876 jend_rhs =jbeg_rhs + nbcol_inbloc - 1
2883 DO i=jbeg_rhs, jbeg_rhs + nbcol_inbloc -1
2885 irhs_ptr_copy(j) = ipos
2886 colsize = id%IRHS_PTR(perm_rhs(i)+1)
2887 & - id%IRHS_PTR(perm_rhs(i))
2888 ipos = ipos + colsize
2893 DO i=jbeg_rhs, jbeg_rhs + nbcol_inbloc -1
2895 irhs_ptr_copy(j) = ipos
2896 colsize = id%IRHS_PTR(i+1)
2898 ipos = ipos + colsize
2901 irhs_ptr_copy(nbcol_inbloc+1)= ipos
2902 IF ( ipos-1 .NE. nz_this_block )
THEN
2903 WRITE(*,*)
"Error in compressed copy of IRHS_PTR"
2911 IF (keep(23) .NE. 0 .and. mtype .NE. 1)
THEN
2913 ALLOCATE(irhs_sparse_copy(nz_this_block)
2915 if (allocok .GT.0 )
then
2917 info(2)=nz_this_block
2920 irhs_sparse_copy_allocated=.true.
2921 nb_bytes = nb_bytes + int(nz_this_block,8)*k34_8
2922 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2923 ELSE IF (do_permute_rhs.OR.interleave_par.OR.
2924 & (keep(237).NE.0))
THEN
2931 ALLOCATE(irhs_sparse_copy(nz_this_block),
2933 IF (allocok .GT.0 )
THEN
2937 irhs_sparse_copy_allocated=.true.
2938 nb_bytes = nb_bytes + int(nz_this_block,8)*k34_8
2939 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2944 IF (irhs_sparse_copy_allocated)
THEN
2945 IF ( do_permute_rhs.OR.interleave_par )
THEN
2947 DO i=jbeg_rhs, jbeg_rhs + nbcol_inbloc -1
2948 colsize = id%IRHS_PTR(perm_rhs(i)+1)
2949 & - id%IRHS_PTR(perm_rhs(i))
2950 irhs_sparse_copy(ipos:ipos+colsize-1) =
2951 & id%IRHS_SPARSE(id%IRHS_PTR(perm_rhs(i)):
2952 & id%IRHS_PTR(perm_rhs(i)+1) -1)
2953 ipos = ipos + colsize
2956 irhs_sparse_copy = id%IRHS_SPARSE(
2957 & id%IRHS_PTR(jbeg_rhs):
2958 & id%IRHS_PTR(jbeg_rhs)+nz_this_block-1)
2964 & id%IRHS_SPARSE(id%IRHS_PTR(jbeg_rhs):
2965 & id%IRHS_PTR(jbeg_rhs)+nz_this_block-1)
2967 IF (lscal.OR.do_permute_rhs.OR.interleave_par.OR.
2968 & (keep(237).NE.0))
THEN
2975 ALLOCATE(rhs_sparse_copy(nz_this_block),
2977 IF (allocok .GT.0 )
THEN
2979 info(2)=nz_this_block
2982 rhs_sparse_copy_allocated = .true.
2983 nb_bytes = nb_bytes + int(nz_this_block,8)*k35_8
2984 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
2986 IF ( keep(248)==1 )
THEN
2989 & => id%RHS_SPARSE(id%IRHS_PTR(jbeg_rhs):
2990 & id%IRHS_PTR(jbeg_rhs)+nz_this_block-1)
2994 & => id%RHS_SPARSE(id%IRHS_PTR(beg_rhs):
2995 & id%IRHS_PTR(beg_rhs)+nz_this_block-1)
2998 IF (do_permute_rhs.OR.interleave_par.OR.
2999 & (id%KEEP(237).NE.0))
THEN
3000 IF (id%KEEP(237).NE.0)
THEN
3003 rhs_sparse_copy = one
3004 ELSE IF (.NOT. lscal)
THEN
3009 DO i=jbeg_rhs, jbeg_rhs + nbcol_inbloc -1
3010 colsize = id%IRHS_PTR(perm_rhs(i)+1)
3011 & - id%IRHS_PTR(perm_rhs(i))
3012 IF (colsize .EQ. 0) cycle
3013 rhs_sparse_copy(ipos:ipos+colsize-1) =
3014 & id%RHS_SPARSE(id%IRHS_PTR(perm_rhs(i)):
3015 & id%IRHS_PTR(perm_rhs(i)+1) -1)
3016 ipos = ipos + colsize
3021 IF (keep(23) .NE. 0)
THEN
3024 IF (mtype .NE. 1)
THEN
3039 DO i=1, nbcol_inbloc
3042 colsize = irhs_ptr_copy(i+1) - irhs_ptr_copy(i)
3044 jperm = uns_perm_inv(irhs_sparse_copy(ipos+k-1))
3045 irhs_sparse_copy(ipos+k-1) = jperm
3047 ipos = ipos + colsize
3061 IF (info(1) .LT.0 )
GOTO 90
3065 IF (keep(248)==1)
THEN
3066 CALL mpi_bcast( nbcol_inbloc,1, mpi_integer,
3067 & master, id%COMM,ierr)
3069 nbcol_inbloc = nbrhs_eff
3071 jend_rhs =jbeg_rhs + nbcol_inbloc - 1
3072 IF ((keep(111).eq.0).AND.(keep(252).EQ.0)
3073 & .AND.(keep(221).NE.2 ).AND.(keep(248).EQ.1) )
THEN
3077 CALL mpi_bcast( nz_this_block,1, mpi_integer,
3078 & master, id%COMM,ierr)
3079 IF (id%MYID.NE.master .and. nz_this_block.NE.0)
THEN
3080 ALLOCATE(irhs_sparse_copy(nz_this_block),
3082 if (allocok .GT.0 )
then
3084 info(2)=nz_this_block
3087 irhs_sparse_copy_allocated=.true.
3093 ALLOCATE(rhs_sparse_copy(nz_this_block),
3095 if (allocok .GT.0 )
then
3097 info(2)=nz_this_block
3100 rhs_sparse_copy_allocated=.true.
3101 nb_bytes = nb_bytes + int(nz_this_block,8)*(k34_8+k35_8)
3102 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
3104 ALLOCATE(irhs_ptr_copy(nbcol_inbloc+1),stat=allocok)
3105 if (allocok .GT.0 )
then
3107 info(2)=nbcol_inbloc+1
3110 irhs_ptr_copy_allocated = .true.
3111 nb_bytes = nb_bytes + int(nbcol_inbloc+1,8)*k34_8
3112 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
3119 IF (info(1) .LT.0 )
GOTO 90
3121 IF (nz_this_block > 0)
THEN
3125 & master, id%COMM,ierr)
3129 & master, id%COMM,ierr)
3131 WRITE (*,*)
'NOT OK FOR ALLOC PTR ON SLAVES'
3141 IF ( i_am_slave )
THEN
3171 IF ( keep(221).EQ.2 .AND. keep(252).EQ.0
3172 & .AND. (keep(248).NE.1 .OR. (id%NRHS.EQ.1))
3185 build_posinrhscomp = .false.
3190 IF (build_posinrhscomp)
THEN
3195 build_posinrhscomp = .false.
3199 IF ( (keep(111).NE.0) .OR. (keep(237).NE.0) .OR.
3200 & (keep(252).NE.0) )
THEN
3202 IF (keep(111).NE.0)
THEN
3215 ELSE IF (keep(252).NE.0)
THEN
3222 build_posinrhscomp = .true.
3226 liw_passed=
max(1,liw)
3227 IF (keep(237).EQ.0)
THEN
3230 & id%MYID_NODES, id%PTLUST_S(1),
3231 & id%KEEP(1),id%KEEP8(1),
3232 & id%PROCNODE_STEPS(1), id%IS(1), liw_passed,
3234 & id%POSINRHSCOMP_ROW(1), id%POSINRHSCOMP_COL(1),
3235 & id%POSINRHSCOMP_COL_ALLOC,
3237 & nbent_rhscomp, nb_fs_rhscomp_tot )
3238 nb_fs_rhscomp_f = nb_fs_rhscomp_tot
3242 & id%MYID_NODES, id%PTLUST_S(1), id%DAD_STEPS(1),
3243 & id%KEEP(1),id%KEEP8(1),
3244 & id%PROCNODE_STEPS(1), id%IS(1), liw,
3246 & id%POSINRHSCOMP_ROW(1), id%POSINRHSCOMP_COL(1),
3247 & id%POSINRHSCOMP_COL_ALLOC,
3249 & irhs_ptr_copy(1), nbcol_inbloc, irhs_sparse_copy(1),
3250 & nz_this_block,perm_rhs,
size(perm_rhs) , jbeg_rhs,
3252 & nb_fs_rhscomp_f, nb_fs_rhscomp_tot,
3253 & uns_perm_inv,
size(uns_perm_inv)
3257 IF (build_rhsmapinfo .AND. keep(248).EQ.-1)
THEN
3263 & irhs_loc_ptr(1), map_rhs_loc, id%POSINRHSCOMP_ROW(1),
3264 & id%NSLAVES, id%MYID_NODES,
3265 & id%COMM_NODES, id%ICNTL(1), id%INFO(1) )
3266 build_rhsmapinfo = .false.
3272 IF (info(1) .LT.0 )
GOTO 90
3273 IF (i_am_slave)
THEN
3274 IF (keep(221).EQ.1)
THEN
3280 IF (.not.
associated(id%RHSCOMP))
THEN
3288 ld_rhscomp =
max(nbent_rhscomp,1)
3289 id%KEEP8(25) = int(ld_rhscomp,8)*int(id%NRHS,8)
3290 ALLOCATE (id%RHSCOMP(id%KEEP8(25)), stat = allocok)
3291 IF ( allocok .GT. 0 )
THEN
3297 nb_bytes = nb_bytes + id%KEEP8(25)*k35_8
3298 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
3301 IF ((keep(221).NE.1).AND.
3302 & ((keep(221).NE.2).OR.(keep(252).NE.0))
3308 ld_rhscomp =
max(nbent_rhscomp, ld_rhscomp)
3310 IF (
associated(id%RHSCOMP))
THEN
3311 IF ( (id%KEEP8(25).LT.int(ld_rhscomp,8)*int(nbrhs,8))
3312 & .OR. (keep(235).NE.0).OR.(keep(237).NE.0) )
THEN
3319 nb_bytes = nb_bytes - id%KEEP8(25)*k35_8
3320 DEALLOCATE(id%RHSCOMP)
3325 IF (.not.
associated(id%RHSCOMP))
THEN
3326 ld_rhscomp =
max(nbent_rhscomp, 1)
3327 id%KEEP8(25) = int(ld_rhscomp,8)*int(nbrhs,8)
3328 ALLOCATE (id%RHSCOMP(id%KEEP8(25)), stat = allocok )
3329 IF ( allocok .GT. 0 )
THEN
3334 nb_bytes = nb_bytes + id%KEEP8(25)*k35_8
3335 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
3338 IF (keep(221).EQ.2)
THEN
3342 ld_rhscomp = int(id%KEEP8(25)/int(id%NRHS,8))
3347 IF ( keep(221).EQ.0 )
THEN
3353 ibeg_rhscomp= int(jbeg_rhs-1,8)*int(ld_rhscomp,8) + 1_8
3360 IF (info(1) .LT.0 )
GOTO 90
3367 IF (id%MYID .eq. master)
THEN
3369 IF (keep(23) .NE. 0)
THEN
3372 IF (mtype .NE. 1)
THEN
3382 IF (keep(248)==0)
THEN
3386 ALLOCATE( c_rw2( id%N ),stat =allocok )
3387 IF ( allocok .GT. 0 )
THEN
3391 WRITE(lp,*) id%MYID,
3392 &
':Error allocating C_RW2 in SMUMPS_SOLVE_DRIVE'
3398 kdec = ibeg+int(k-1,8)*int(ld_rhs,8)
3400 c_rw2(i)=id%RHS(i-1+kdec)
3403 jperm = id%UNS_PERM(i)
3404 id%RHS(i-1+kdec) = c_rw2(jperm)
3413 IF ( keep(248) == 0 )
THEN
3415 kdec = ibeg+int(k-1,8)*int(ld_rhs,8)
3417 saverhs(i+(k-1)*id%N) = id%RHS(kdec+i-1)
3420 ELSE IF (keep(248)==1)
THEN
3423 DO j = id%IRHS_PTR(k), id%IRHS_PTR(k+1)-1
3424 i = id%IRHS_SPARSE(j)
3425 saverhs(i+(k-1)*id%N) = id%RHS_SPARSE(j)
3435 IF (keep(248)==0)
THEN
3437 IF (mtype .EQ. 1)
THEN
3440 kdec = int(k-1,8) * int(ld_rhs,8) + int(ibeg-1,8)
3442 id%RHS(kdec+i) = id%RHS(kdec+i) *
3449 kdec = int(k-1,8) * int(ld_rhs,8) + int(ibeg-1,8)
3451 id%RHS(kdec+i) = id%RHS(kdec+i) *
3456 ELSE IF (keep(248)==1)
THEN
3460 kdec=int(id%IRHS_PTR(jbeg_rhs),8)
3462 IF ((keep(248)==1) .AND.
3463 & (do_permute_rhs.OR.interleave_par.OR.
3464 & (id%KEEP(237).NE.0))
3471 DO i=jbeg_rhs, jbeg_rhs + nbcol_inbloc -1
3472 IF (do_permute_rhs.OR.interleave_par)
THEN
3477 colsize = irhs_ptr_copy(j+1) - irhs_ptr_copy(j)
3479 IF (colsize .EQ. 0) cycle
3480 IF (id%KEEP(237).NE.0)
THEN
3481 IF (do_permute_rhs.OR.interleave_par)
THEN
3486 rhs_sparse_copy(ipos) = id%ROWSCA(iperm) *
3489 rhs_sparse_copy(ipos) = id%ROWSCA(i) * one
3505 ii = irhs_sparse_copy(
3506 & irhs_ptr_copy(i-jbeg_rhs+1)
3510 IF (mtype.EQ.1)
THEN
3511 rhs_sparse_copy(ipos+k-1) =
3512 & id%RHS_SPARSE(id%IRHS_PTR(iperm)+k-1)*
3515 rhs_sparse_copy(ipos+k-1) =
3516 & id%RHS_SPARSE(id%IRHS_PTR(iperm)+k-1)*
3521 ipos = ipos + colsize
3526 IF (mtype .eq. 1)
THEN
3527 DO iz=1,nz_this_block
3528 i=irhs_sparse_copy(iz)
3529 rhs_sparse_copy(iz)=id%RHS_SPARSE(kdec+iz-1)*
3533 DO iz=1,nz_this_block
3534 i=irhs_sparse_copy(iz)
3535 rhs_sparse_copy(iz)=id%RHS_SPARSE(kdec+iz-1)*
3544 CALL vtend(perm_scal_ini,ierr)
3550 IF ((keep(248).EQ.1).AND.(keep(237).EQ.0))
THEN
3553 ! nbrhs_eff need be broadcasted since it is
used
3555 CALL mpi_bcast( nbrhs_eff,1, mpi_integer,
3556 & master, id%COMM,ierr
3557 CALL mpi_bcast(nb_rhsskipped,1,mpi_integer,master,
3571 CALL vtbegin(soln_dist,ierr)
3574 IF ((keep(111).eq.0).AND.(keep(252).EQ.0)
3575 & .AND.(keep(221).NE.2 ))
THEN
3580 IF (keep(248) == 0)
THEN
3584 IF ( .NOT.i_am_slave )
THEN
3588 & mtype, id%RHS(ibeg), ld_rhs, nbrhs_eff,
3592 & jdummy, id%KEEP(1), id%KEEP8(1), id%PROCNODE_STEPS(1),
3595 & id%ICNTL(1),id%INFO(1))
3597 IF (id%MYID .eq. master)
THEN
3600 ncol_rhs_loc = nbrhs_eff
3603 ptr_rhs => cdummy_target
3611 & mtype, ptr_rhs(ibeg_loc),ld_rhs_loc,ncol_rhs_loc,
3613 & id%RHSCOMP(ibeg_rhscomp), ld_rhscomp, nbrhs_eff,
3614 & id%POSINRHSCOMP_ROW(1), nb_fs_rhscomp_f,
3616 & id%PTLUST_S(1), id%KEEP(1), id%KEEP8(1),
3617 & id%PROCNODE_STEPS(1),
3618 & is(1), liw_passed,
3620 & id%ICNTL(1),id%INFO(1))
3622 IF (info(1).LT.0)
GOTO 90
3623 ELSE IF (keep(248) .EQ. -1)
THEN
3624 IF (i_am_slave)
THEN
3625 IF (id%Nloc_RHS .NE. 0)
THEN
3626 rhs_loc_size=int(id%LRHS_loc,8)*int(nbrhs_eff-1,8)+
3627 & int(id%Nloc_RHS,8)
3628 rhs_loc_shift=1_8+int(beg_rhs-1,8)*id%LRHS_loc
3634 & id%MYID_NODES, id%COMM_NODES,
3635 & nbrhs_eff, id%Nloc_RHS, id%LRHS_loc,
3638 & idrhs_loc(rhs_loc_shift),
3640 & id%RHSCOMP(ibeg_rhscomp), ld_rhscomp,
3641 & id%POSINRHSCOMP_ROW(1), nb_fs_rhscomp_f,
3642 & lscal, scaling_data_dr,
3643 & lp, lpok, keep(1), nb_bytes_loc, info(1))
3645 nb_bytes_max =
max(nb_bytes_max,
3646 & nb_bytes_max+nb_bytes_loc)
3650 IF (info(1).LT.0)
GOTO 90
3655 IF (nz_this_block > 0)
THEN
3659 & master, id%COMM, ierr)
3664 IF (keep(237).NE.0)
THEN
3665 IF ( i_am_slave )
THEN
3672 id%RHSCOMP(1_8:int(nbrhs_eff,8)*int(ld_rhscomp,8))
3675 DO i = 1, nbcol_inbloc
3676 colsize = irhs_ptr_copy(i+1) - irhs_ptr_copy(i)
3677 IF (colsize.GT.0)
THEN
3680 j = i - 1 + jbeg_rhs
3681 IF (do_permute_rhs.OR.interleave_par)
THEN
3684 iposrhscomp = id%POSINRHSCOMP_ROW(j)
3687 IF (iposrhscomp.GT.0)
THEN
3698 id%RHSCOMP(int(k-1,8)*int(ld_rhscomp,8)+
3699 & int(iposrhscomp,8)) =
3700 & rhs_sparse_copy(ipos)
3703 ipos = ipos + colsize
3706 IF (k.NE.nbrhs_eff+1)
THEN
3707 WRITE(6,*)
'Internal Error 9 in solution driver ',
3720 IF ((keep(221).EQ.1).AND.(nb_rhsskipped.GT.0)
3721 & .AND.i_am_slave)
THEN
3722 DO k = jbeg_rhs-nb_rhsskipped, jbeg_rhs-1
3723 DO i = 1, ld_rhscomp
3724 id%RHSCOMP(int(k-1,8)*int(ld_rhscomp,8)
3725 & + int(i,8)) = zero
3729 IF (i_am_slave)
THEN
3730 DO k = 1, nbcol_inbloc
3732 kdec = int(k-1,8) * int(ld_rhscomp,8) +
3733 & ibeg_rhscomp - 1_8
3734 id%RHSCOMP(kdec+1_8:kdec+nbent_rhscomp) = zero
3735 DO iz=irhs_ptr_copy(k), irhs_ptr_copy(k+1)-1
3736 i=irhs_sparse_copy(iz)
3737 iposrhscomp = id%POSINRHSCOMP_ROW(i)
3745 IF ( (iposrhscomp.LE.nb_fs_rhscomp_tot)
3746 & .AND.(iposrhscomp.GT.0) )
THEN
3748 id%RHSCOMP(kdec+iposrhscomp)=
3749 & id%RHSCOMP(kdec+iposrhscomp) +
3750 & rhs_sparse_copy(iz)
3758 ELSE IF (i_am_slave)
THEN
3760 IF (keep(111).NE.0)
THEN
3780 IF (keep(111).GT.0)
THEN
3781 ibeg_glob_def = keep(111)
3782 iend_glob_def = keep(111)
3784 ibeg_glob_def = beg_rhs
3785 iend_glob_def = beg_rhs+nbrhs_eff-1
3787 IF ( id%KEEP(112) .GT. 0 .AND. do_null_piv)
THEN
3788 IF (ibeg_glob_def .GT.id%KEEP(112))
THEN
3790 do_null_piv = .false.
3792 IF (ibeg_glob_def .LT.id%KEEP(112)
3793 & .AND. iend_glob_def .GT.id%KEEP(112)
3794 & .AND. do_null_piv )
THEN
3801 do_null_piv = .false.
3804 IF (id%KEEP(235).NE.0)
THEN
3811 nz_this_block=iend_glob_def-ibeg_glob_def+1
3812 ALLOCATE(irhs_ptr_copy(nz_this_block+1),stat=allocok)
3813 IF (allocok .GT.0 )
THEN
3815 info(2)=nz_this_block
3818 irhs_ptr_copy_allocated = .true.
3819 ALLOCATE(irhs_sparse_copy(nz_this_block),stat=allocok)
3820 IF (allocok .GT.0 )
THEN
3822 info(2)=nz_this_block
3825 irhs_sparse_copy_allocated=.true.
3826 nb_bytes = nb_bytes +
3827 & int(nz_this_block,8)*(k34_8+k34_8)
3829 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
3830 IF (id%MYID.eq.master)
THEN
3833 DO i = ibeg_glob_def, iend_glob_def
3834 irhs_ptr_copy(i-ibeg_glob_def+1) = i
3835 irhs_sparse_copy(ii) = id%PIVNUL_LIST(i)
3838 irhs_ptr_copy(nz_this_block+1) = nz_this_block+1
3845 IF (info(1) .LT.0 )
GOTO 90
3850 & master, id%COMM,ierr)
3854 & master, id%COMM,ierr)
3860 kdec = int(k-1,8) * int(ld_rhscomp,8)
3861 id%RHSCOMP(kdec+1_8:kdec+int(ld_rhscomp,8))=zero
3872 DO i=
max(ibeg_glob_def,keep(220)),
3873 &
min(iend_glob_def,keep(220)+keep(109)-1)
3876 jj= id%POSINRHSCOMP_ROW(id%PIVNUL_LIST(i-keep(220)+1))
3878 IF (keep(50).EQ.0)
THEN
3880 id%RHSCOMP( ibeg_rhscomp+
3881 & int(i-ibeg_glob_def,8)*int(ld_rhscomp,8) +
3886 id%RHSCOMP( ibeg_rhscomp+
3887 & int(i-ibeg_glob_def,8)*int(ld_rhscomp,8)+
3893 IF ( keep(17).NE.0 .AND.
3894 & id%MYID_NODES.EQ.master_root)
THEN
3901 ibeg_root_def =
max(ibeg_glob_def,keep(112)+1)
3902 iend_root_def =
min(iend_glob_def,keep(112)+keep(17))
3908 ibeg_root_def = ibeg_root_def-keep(112)
3909 iend_root_def = iend_root_def-keep(112)
3914 ibeg_root_def = -90999
3915 iend_root_def = -95999
3916 iroot_def_rhs_col1= 1
3926 timescatter2=
mpi_wtime()-timescatter1+timescatter2
3932 IF ( i_am_slave )
THEN
3934 IF ( id%MYID_NODES .EQ. master_root )
THEN
3936 IF (
associated(id%root%RHS_CNTR_MASTER_ROOT) )
THEN
3939 ptr_rhs_root => id%root%RHS_CNTR_MASTER_ROOT
3940# if defined(MUMPS_F2003)
3941 lptr_rhs_root =
size(id%root%RHS_CNTR_MASTER_ROOT,kind=8)
3943 lptr_rhs_root = int(
size(id%root%RHS_CNTR_MASTER_ROOT),8)
3947 lptr_rhs_root = int(nbrhs_eff,8) * int(size_root,8)
3948 ipt_rhs_root = lwcb8 - lptr_rhs_root + 1_8
3949 ptr_rhs_root => work_wcb(ipt_rhs_root:lwcb8)
3950 lwcb8_sol_c = lwcb8_sol_c - lptr_rhs_root
3954 ipt_rhs_root = lwcb8
3955 ptr_rhs_root => work_wcb(ipt_rhs_root:lwcb8)
3956 lwcb8_sol_c = lwcb8_sol_c - lptr_rhs_root
3959 IF (keep(221) .EQ. 2 )
THEN
3964 IF ( ( id%MYID .EQ. master_root_in_comm ) .AND.
3965 & ( id%MYID .EQ. master ) )
THEN
3969 kdec = ibeg_redrhs+int(k-1,8)*int(ld_redrhs,8)-1_8
3971 ptr_rhs_root(ii+i) = id%REDRHS(kdec+i)
3977 IF ( id%MYID .EQ. master)
THEN
3980 IF (ld_redrhs.EQ.size_root)
THEN
3984 & size_root*nbrhs_eff,
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 ELSE IF ( id%MYID .EQ. master_root_in_comm )
THEN
3999 IF (ld_redrhs.EQ.size_root)
THEN
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 IF ((id%KEEP(235).EQ.0).and.(id%KEEP(237).EQ.0) )
THEN
4027 nbsparse_loc = (do_nbsparse.AND.nbrhs_eff.GT.1)
4029 CALL smumps_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 nbsparse_loc = (do_nbsparse.AND.nbrhs_eff.GT.1)
4055 CALL smumps_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
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 )
4092 &
' WARNING : -11 error code obtained in solve'
4094 IF (info(1).eq.-3)
then
4098 &
' WARNING : -14 error code obtained in solve'
4102 IF (info(1).LT.0)
GO TO 90
4108 IF ( keep(221) .EQ. 1 )
THEN
4115 IF ( ( id%MYID .EQ. master_root_in_comm ) .AND.
4116 & ( id%MYID .EQ. master ) )
THEN
4120 kdec = ibeg_redrhs+int(k-1,8)*int(ld_redrhs,8) - 1_8
4122 id%REDRHS(kdec+i) = ptr_rhs_root(ii+i)
4128 IF ( id%MYID .EQ. master )
THEN
4130 IF (ld_redrhs.EQ.size_root)
THEN
4134 & size_root*nbrhs_eff,
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 ELSE IF ( id%MYID .EQ. master_root_in_comm )
THEN
4151 IF (ld_redrhs.EQ.size_root)
THEN
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)
4172 IF ( keep(221) .NE. 1 )
THEN
4174 IF (icntl21 == 0)
THEN
4189 IF (keep(237).EQ.0)
THEN
4191 lcwork =
max(
max(keep(247),keep(246)),1)
4192 ALLOCATE( cwork(lcwork), stat=allocok )
4193 IF (allocok > 0)
THEN
4195 info(2)=
max(
max(keep(247),keep(246)),1)
4198 IF ( (id%MYID.EQ.master).AND. (keep(237).NE.0)
4199 & .AND. (id%NSLAVES.NE.1))
THEN
4202 ALLOCATE (map_rhs(id%N), stat = allocok)
4203 IF ( allocok .GT. 0 )
THEN
4205 WRITE(lp,*)
' Problem allocation of MAP_RHS at solve'
4210 nb_bytes = nb_bytes + int(id%N,8) * k34_8
4211 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
4218 IF (info(1).LT.0)
GO TO 90
4219 IF ((id%MYID.NE.master).OR. .NOT.lscal)
THEN
4220 pt_scaling => dummy_scal
4222 IF (mtype.EQ.1)
THEN
4223 pt_scaling => id%COLSCA
4225 pt_scaling => id%ROWSCA
4228 liw_passed =
max( liw, 1 )
4230 IF ( .NOT.i_am_slave )
THEN
4234 IF (keep(237).EQ.0)
THEN
4238 & id%MYID, id%COMM, nbrhs_eff,
4239 & mtype, id%RHS(1), ld_rhs, id%NRHS, jbeg_rhs,
4240 & jdummy, id%KEEP(1), id%KEEP8(1),
4241 & id%PROCNODE_STEPS(1), idummy, 1,
4242 & id%STEP(1), bufr(1), lbufr, lbufr_bytes,
4244 & lscal, pt_scaling(1),
size(pt_scaling),
4245 & c_dummy, 1 , 1, idummy, 1,
4246 & perm_rhs,
size(perm_rhs)
4251 & id%MYID, id%COMM, nbrhs_eff,
4253 & id%KEEP(1), bufr(1), lbufr, lbufr_bytes,
4254 & lscal, pt_scaling(1),
size(pt_scaling)
4256 & ,irhs_ptr_copy(1),
size(irhs_ptr_copy),
4257 & irhs_sparse_copy(1),
size(irhs_sparse_copy),
4258 & rhs_sparse_copy(1),
size(rhs_sparse_copy),
4259 & uns_perm_inv,
size(uns_perm_inv),
4266 IF (keep(237).EQ.0)
THEN
4267 IF (id%MYID.EQ.master)
THEN
4269 ncol_rhs_loc = id%NRHS
4271 jbeg_rhs_loc = jbeg_rhs
4273 ptr_rhs => cdummy_target
4279 & id%MYID, id%COMM, nbrhs_eff, mtype,
4280 & ptr_rhs(1), ld_rhs_loc, ncol_rhs_loc, jbeg_rhs_loc,
4281 & id%PTLUST_S(1), id%KEEP(1), id%KEEP8(1),
4282 & id%PROCNODE_STEPS(1), is(1), liw_passed,
4283 & id%STEP(1), bufr(1), lbufr, lbufr_bytes,
4285 & lscal, pt_scaling(1),
size(pt_scaling),
4286 & id%RHSCOMP(ibeg_rhscomp), ld_rhscomp, nbrhs_eff,
4287 & id%POSINRHSCOMP_COL(1), id%N,
4288 & perm_rhs,
size(perm_rhs)
4292 & id%MYID, id%COMM, nbrhs_eff,
4293 & id%RHSCOMP(ibeg_rhscomp), ld_rhscomp, nbrhs_eff,
4294 & id%KEEP(1), bufr(1), lbufr, lbufr_bytes,
4295 & lscal, pt_scaling(1),
size(pt_scaling)
4297 & , irhs_ptr_copy(1),
size(irhs_ptr_copy),
4298 & irhs_sparse_copy(1),
size(irhs_sparse_copy),
4299 & rhs_sparse_copy(1),
size(rhs_sparse_copy),
4300 & uns_perm_inv,
size(uns_perm_inv),
4301 & id%POSINRHSCOMP_COL(1), id%N, nb_fs_rhscomp_tot
4305 timegather2=
mpi_wtime()-timegather1+timegather2
4306 IF (keep(237).EQ.0)
DEALLOCATE( cwork )
4307 IF ( (id%MYID.EQ.master).AND. (keep(237).NE.0)
4310 DO j = jbeg_rhs, jbeg_rhs+nbcol_inbloc-1
4311 IF (do_permute_rhs.OR.interleave_par)
THEN
4316 colsize = id%IRHS_PTR(pj+1) -
4318 IF (colsize.EQ.0) cycle
4322 IF (id%NSLAVES.NE.1)
THEN
4324 map_rhs(id%IRHS_SPARSE(
4325 & id%IRHS_PTR(pj) + ii - 1)) = ii
4327 DO iz2 = irhs_ptr_copy(jj),irhs_ptr_copy(jj+1)-1
4328 ii = irhs_sparse_copy(iz2)
4329 id%RHS_SPARSE(id%IRHS_PTR(pj)+map_rhs
4330 & rhs_sparse_copy(iz2)
4335 DO iz= id%IRHS_PTR(pj), id%IRHS_PTR(pj+1)-1
4336 iz2 = irhs_ptr_copy(jj) +
4337 & iz - id%IRHS_PTR(pj)
4338 id%RHS_SPARSE(iz) = rhs_sparse_copy(iz2)
4342 IF (id%NSLAVES.NE.1)
THEN
4343 nb_bytes = nb_bytes - int(
size(map_rhs),8) * k34_8
4344 DEALLOCATE ( map_rhs )
4355 IF ( i_am_slave )
THEN
4356 liw_passed =
max( liw, 1 )
4360 IF ( keep(89) .GT. 0 )
THEN
4362 & id%N,id%MYID_NODES,
4363 & mtype, id%RHSCOMP(ibeg_rhscomp), ld_rhscomp,
4364 & nbrhs_eff, id%POSINRHSCOMP_COL(1),
4365 & id%ISOL_loc(1), id%SOL_loc(1), id%NRHS,
4366 & jbeg_rhs-nb_rhsskipped, id%LSOL_loc,
4367 & id%PTLUST_S(1), id%PROCNODE_STEPS(1),
4368 & id%KEEP(1),id%KEEP8(1),
4369 & is(1), liw_passed,
4370 & id%STEP(1), scaling_data_sol, lscal, nb_rhsskipped,
4371 & perm_rhs,
size(perm_rhs) )
4374 timecopyscale2=
mpi_wtime()-timecopyscale1+timecopyscale2
4387 IF ( icntl10 > 0 .AND. nbrhs_eff > 1 )
THEN
4394 write(6,*)
' Internal ERROR 15 in sol_driver '
4416 IF ( prokg .AND. icntl10 .NE. 0 )
WRITE( mpg, 270 )
4418 nitref = abs(icntl10)
4419 ALLOCATE(r_y(id%N), stat = allocok)
4420 IF ( allocok .GT. 0 )
THEN
4425 nb_bytes = nb_bytes + int(id%N,8)*k16_8
4426 ALLOCATE(c_y(id%N), stat = allocok)
4427 IF ( allocok .GT. 0 )
THEN
4432 nb_bytes = nb_bytes + int(id%N,8)*k35_8
4433 IF ( id%MYID .EQ. master )
THEN
4434 ALLOCATE( iw1( 2 * id%N ),stat = allocok )
4435 IF ( allocok .GT. 0 )
THEN
4440 nb_bytes = nb_bytes + int(2*id%N,8)*k34_8
4441 ALLOCATE( c_w(id%N), stat = allocok )
4442 IF ( allocok .GT. 0 )
THEN
4447 nb_bytes = nb_bytes + int(id%N,8)*k35_8
4448 ALLOCATE( r_w(2*id%N), stat = allocok )
4449 IF ( allocok .GT. 0 )
THEN
4454 nb_bytes = nb_bytes + int(2*id%N,8)*k16_8
4455 IF ( prokg .AND. icntl10 .GT. 0 )
4456 &
WRITE( mpg, 240)
'MAXIMUM NUMBER OF STEPS =', nitref
4459 ALLOCATE(c_locwk54(id%N),stat = allocok)
4460 IF ( allocok .GT. 0 )
THEN
4465 nb_bytes = nb_bytes + int(id%N,8)*k35_8
4466 ALLOCATE(r_locwk54(id%N),stat = allocok)
4467 IF ( allocok .GT. 0 )
THEN
4472 nb_bytes = nb_bytes + int(id%N,8)*k16_8
4476 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
4479 IF ( info(1) .LT. 0 )
GOTO 90
4499 IF ((icntl11.GT.0).OR.(icntl10.GT.0))
THEN
4501 IF ( keep(54) .eq. 0 )
THEN
4505 IF ( id%MYID .eq. master )
THEN
4511 IF (keep(55).NE.0)
THEN
4514 & id%NELT, id%ELTPTR(1),
4515 & id%LELTVAR, id%ELTVAR(1),
4516 & id%KEEP8(30), id%A_ELT(1),
4517 & r_w(id%N+1), keep(1),keep8(1) )
4520 IF ( mtype .eq. 1 )
THEN
4522 & ( id%A(1), id%KEEP8(28), id%N, id%IRN(1), id%JCN(1),
4523 & r_w(id%N+1), keep(1),keep8(1),
4524 & 0, id%SYM_PERM(1) )
4527 & ( id%A(1), id%KEEP8(28), id%N, id%JCN(1), id%IRN(1),
4529 & 0, id%SYM_PERM(1) )
4537 IF ( i_am_slave .and.
4538 & id%KEEP8(29) .NE. 0_8 )
THEN
4539 IF ( mtype .eq. 1 )
THEN
4541 & id%KEEP8(29), id%N,
4542 & id%IRN_loc(1), id%JCN_loc(1),
4543 & r_locwk54, id%KEEP(1),id%KEEP8(1),
4544 & 0, id%SYM_PERM(1) )
4547 & id%KEEP8(29), id%N,
4548 & id%JCN_loc(1), id%IRN_loc(1),
4549 & r_locwk54, id%KEEP(1),id%KEEP8(1),
4550 & 0, id%SYM_PERM(1) )
4558 IF ( id%MYID .eq. master )
THEN
4561 & mpi_sum,master,id%COMM, ierr)
4565 & mpi_sum,master,id%COMM, ierr)
4570 IF ( id%MYID .eq. master )
THEN
4572 rinfog(4) = real(zero)
4574 rinfog(4) =
max(r_w( id%N +i), rinfog(4))
4587 IF (( id%MYID .eq. master ).AND.(icntl10.GT.0))
THEN
4590 IF (arret .LT. 0.0e0)
THEN
4591 arret = sqrt(epsilon(0.0e0
4596 DO 22 irstep = 1, nitref +1
4602 IF (( id%MYID .eq. master ).AND.(irstep.GT.1))
THEN
4605 id%RHS(ibeg+i-1) = id%RHS(ibeg+i-1) + c_y(i)
4611 IF ( keep(54) .eq. 0 )
THEN
4612 IF ( id%MYID .eq. master )
THEN
4613 IF (keep(55).NE.0)
THEN
4616 & id%NELT, id%ELTPTR(1), id%LELTVAR,
4617 & id%ELTVAR(1), id%KEEP8(30), id%A_ELT(1),
4618 & saverhs, id%RHS(ibeg),
4619 & c_y, r_w, keep(50))
4621 IF ( mtype .eq. 1 )
THEN
4624 & id%JCN(1), saverhs,
4625 & id%RHS(ibeg), c_y, r_w, keep(1),keep8(1))
4629 & id%IRN(1), saverhs,
4630 & id%RHS(ibeg), c_y, r_w, keep(1),keep8(1))
4645 IF ( i_am_slave .and.
4646 & id%KEEP8(29) .NE. 0_8 )
THEN
4648 & id%IRN_loc(1), id%JCN_loc(1), id%A_loc(1),
4649 & rhs_ir(ibeg), c_locwk54, keep(50), mtype )
4653 IF ( id%MYID .eq. master )
THEN
4656 & mpi_sum,master,id%COMM, ierr)
4663 & mpi_sum,master,id%COMM, ierr)
4676 IF ( i_am_slave .and. id%KEEP8(29) .NE. 0_8 )
THEN
4678 & id%IRN_loc(1), id%JCN_loc(1), id%A_loc(1),
4679 & rhs_ir(ibeg), r_locwk54, keep(50), mtype )
4683 IF ( id%MYID .eq. master )
THEN
4686 & mpi_sum,master,id%COMM, ierr)
4690 & mpi_sum, master, id%COMM, ierr)
4696 IF ( id%MYID .eq. master )
THEN
4698 IF ((icntl11.GT.0).OR.(icntl10.GT.0))
THEN
4706 IF (((icntl11.GT.0).OR.((icntl10.LT.0).AND.
4707 & ((irstep.EQ.1).OR.(irstep.EQ.nitref+1)))
4708 & .OR.((icntl10.EQ.0).AND.(irstep.EQ.1)))
4709 & .OR.(icntl10.GT.0))
THEN
4715 & id%RHS(ibeg), c_y, r_w, c_w, iw1, iflag_ir,
4716 & rinfog(7), noiter, testconv,
4717 & mp, arret, keep(361) )
4718 IF (icntl10.LT.0)
THEN
4720 id%DKEEP(120)=id%DKEEP(120)+real(timeea1)
4723 IF ((icntl11.GT.0).AND.(
4724 & (icntl10.LT.0.AND.(irstep.EQ.1.OR.irstep.EQ.nitref+1))
4725 & .OR.((icntl10.GE.0).AND.(irstep.EQ.1))
4731 IF (icntl10.EQ.0)
THEN
4733 IF ( mpg .GT. 0 )
WRITE( mpg, 170 )
4734 ELSEIF (irstep.EQ.1)
THEN
4736 IF ( mpg .GT. 0 )
WRITE( mpg, 55 )
4737 ELSEIF ((icntl10.LT.0).AND.(irstep.EQ.nitref+1))
THEN
4740 IF ( mpg .GT. 0 )
THEN
4744 &
'NUMBER OF STEPS OF ITERATIVE REFINEMENT REQUESTED =',
4751 & saverhs,r_w(id%N+1),c_y,givsol,
4752 & rinfog(4),rinfog(5),rinfog(6),mpg,icntl(1),
4754 IF ( mpg .GT. 0 )
THEN
4757 &
'RINFOG(7):COMPONENTWISE SCALED RESIDUAL(W1)=',
4760 &
'------(8):---------------------------- (W2)=',
4764 id%DKEEP(120)=id%DKEEP(120)+real(timeea)
4769 IF (irstep.EQ.nitref +1)
THEN
4776 IF ((icntl10.GT.0).AND.(iflag_ir.EQ.0))
4777 & id%INFO(1) = id%INFO(1) + 8
4779 IF (icntl10.GT.0)
THEN
4787 IF (iflag_ir.GT.0)
THEN
4795 IF (iflag_ir.EQ.2) noiter = noiter - 1
4800 ELSEIF (icntl10.LT.0)
THEN
4814 CALL mpi_bcast( kase, 1, mpi_integer, master,
4817 IF (kase.LE.0)
GOTO 666
4819 WRITE(*,*)
"Internal error 17 in SMUMPS_SOL_DRIVER"
4826 IF (info(1) .LT. 0)
GOTO 90
4840 IF ( id%MYID .EQ. master )
THEN
4841 IF ( nitref .GT. 0 )
THEN
4842 id%INFOG(15) = noiter
4848 IF (icntl10.EQ.0)
THEN
4851 id%DKEEP(120)=real(timeit)
4854 id%DKEEP(114)=real(timeit)-id%DKEEP(120)
4858 IF (icntl10.GT.0)
THEN
4862 &
'NUMBER OF STEPS OF ITERATIVE REFINEMENTS PERFORMED =',
4871 IF ((icntl11 .GT. 0).AND.(icntl10.GT.0))
THEN
4878 IF (id%MYID .eq. master )
THEN
4882 IF (iflag_ir.EQ.2) kase = 2
4887 CALL mpi_bcast( kase, 1, mpi_integer, master,
4895 IF ( keep(54) .eq. 0 )
THEN
4899 IF (id%MYID .EQ. master)
THEN
4900 IF (keep(55).EQ.0)
THEN
4901 CALL smumps_qd2( mtype, id%N, id%KEEP8(28), id%A(1),
4903 & id%RHS(ibeg), saverhs, r_y, c_y, keep(1),keep8(1))
4906 & id%NELT, id%ELTPTR(1),
4907 & id%LELTVAR, id%ELTVAR(1),
4908 & id%KEEP8(30), id%A_ELT(1),
4909 & id%RHS(ibeg), saverhs, r_y, c_y, keep(1),keep8(1))
4922 IF ( i_am_slave .and.
4923 & id%KEEP8(29) .NE. 0_8 )
THEN
4925 & id%IRN_loc(1), id%JCN_loc(1), id%A_loc(1),
4926 & rhs_ir(ibeg), c_locwk54, keep(50), mtype )
4930 IF ( id%MYID .eq. master )
THEN
4933 & mpi_sum,master,id%COMM, ierr)
4938 & mpi_sum,master,id%COMM, ierr)
4942 IF (id%MYID .EQ. master)
THEN
4946 IF (iflag_ir.EQ.2)
THEN
4949 & id%RHS(ibeg), c_y, r_w, c_w, iw1, iflag_ir,
4950 & rinfog(7), 0, testconv,
4951 & mp, arret, keep(361) )
4957 & saverhs,r_w(id%N+1),c_y,givsol,
4958 & rinfog(4),rinfog(5),rinfog(6),mpg,icntl(1),
4962 id%DKEEP(120)=id%DKEEP(120)+real(timeea)
4968 IF (icntl11 .EQ. 1)
THEN
4969 IF ( id%MYID .eq. master )
THEN
4972 IF ( allocok .GT. 0 )
THEN
4977 nb_bytes = nb_bytes + int(id%N,8)*k16_8
4984 IF ( id%MYID .EQ. master )
THEN
4986 & id%RHS(ibeg), c_y, d, r_w, c_w, iw1, kase,
4987 & rinfog(7), rinfog(9), rinfog(10),
4988 & mp, keep(1),keep8(1))
4993 CALL mpi_bcast( kase, 1, mpi_integer, master,
4998 IF (kase.LE.0)
GOTO 224
5000 IF (info(1) .LT. 0)
GOTO 90
5011 id%DKEEP(121)=id%DKEEP(121)+real(timelcond)
5012 IF ((id%MYID .EQ. master).AND.(icntl11.GT.0))
THEN
5013 IF (icntl10.GT.0)
THEN
5015 IF ( mpg .GT. 0 )
THEN
5017 &
'RINFOG(7):COMPONENTWISE SCALED RESIDUAL(W1)=',
5020 &
'------(8):---------------------------- (W2)=',
5024 IF (icntl11.EQ.1)
THEN
5028 &
'------(9):Upper bound ERROR ...............=',
5031 &
'-----(10):CONDITION NUMBER (1) ............=',
5034 &
'-----(11):CONDITION NUMBER (2) ............=',
5039 IF ( prokg .AND. abs(icntl10) .GT.0 )
WRITE( mpg, 131 )
5045 IF (id%MYID == master)
THEN
5046 nb_bytes = nb_bytes - int(
size(c_w),8)*k35_8
5048 nb_bytes = nb_bytes - int(
size(r_w),8)*k16_8
5049 & - int(
size(iw1),8)*k34_8
5052 IF (icntl11 .EQ. 1)
THEN
5054 nb_bytes = nb_bytes - int(
size(d ),8)*k16_8
5058 nb_bytes = nb_bytes -
5059 & (int(
size(r_y),8)+int
size
5060 nb_bytes = nb_bytes -
5061 & (int(
size(c_y),8)+int(
size(c_locwk54),8))*k35_8
5064 DEALLOCATE(r_locwk54)
5065 DEALLOCATE(c_locwk54)
5081 IF ( id%MYID .EQ. master .AND. icntl21==0
5082 & .AND. keep(23) .NE. 0.AND.keep(237).EQ.0)
THEN
5086 IF ((keep(221).NE.1 .AND. mtype .EQ. 1)
5087 & .OR. keep(111) .NE.0 .OR. keep(252).NE.0 )
THEN
5095 ALLOCATE( c_rw1( id%N ),stat =allocok )
5097 IF ( allocok .GT. 0 )
THEN
5100 WRITE(*,*)
'could not allocate ', id%N,
'integers.'
5104 IF (keep(242).EQ.0)
THEN
5105 kdec = (k-1)*ld_rhs+ibeg-1
5111 kdec = int(perm_rhs(k-1+jbeg_rhs)-1,8)*int(ld_rhs,8)
5114 c_rw1(i) = id%RHS(kdec+i)
5117 jperm = id%UNS_PERM(i)
5118 id%RHS( kdec+jperm ) = c_rw1( i )
5127 IF (id%MYID.EQ.master .and.icntl21==0.and.keep(221).NE.1.AND.
5128 & (keep(237).EQ.0) )
THEN
5130 IF ( info(1) .GE. 0 .AND. icntl(4).GE.3 .AND. icntl(3).GT.0)
5133 IF (icntl(4) .eq. 4 ) k = id%N
5134 j = min0(10,nbrhs_eff)
5135 IF (icntl(4) .eq. 4 ) j = nbrhs_eff
5137 WRITE(icntl(3),110) beg_rhs+ii-1
5139 & (id%RHS(ibeg+(ii-1)*ld_rhs+i-1),i=1,k)
5145 IF ((keep(248).EQ.1).AND.(keep(237).EQ.0))
THEN
5150 beg_rhs = beg_rhs + nbrhs_eff
5152 beg_rhs = beg_rhs + nbrhs
5158 IF (keep(400) .GT. 0)
THEN
5166 IF ( (id%MYID.EQ.master)
5167 & .AND. ( keep(248).NE.0 )
5168 & .AND. ( keep(237).EQ.0 )
5169 & .AND. ( icntl21.EQ.0 )
5170 & .AND. ( keep(221) .NE.1 )
5171 & .AND. ( jend_rhs .LT. id%NRHS )
5174 jbeg_new = jend_rhs + 1
5175 IF (do_permute_rhs.OR.interleave_par)
THEN
5176 DO WHILE ( jbeg_new.LE. id%NRHS)
5178 id%RHS(int(perm_rhs(jbeg_new) -1,8)*int(ld_rhs,8)+i)
5181 jbeg_new = jbeg_new +1
5184 DO WHILE ( jbeg_new.LE. id%NRHS)
5186 id%RHS(int(jbeg_new -1,8)*int(ld_rhs,8) + i) = zero
5188 jbeg_new = jbeg_new +1
5196 IF ( i_am_slave .AND. (icntl21.NE.0) .AND.
5197 & ( jend_rhs .LT. id%NRHS ) .AND. keep(221).NE.1 )
THEN
5198 jbeg_new = jend_rhs + 1
5199 IF (do_permute_rhs.OR.interleave_par)
THEN
5200 DO WHILE ( jbeg_new.LE. id%NRHS)
5202 id%SOL_loc(int(perm_rhs(jbeg_new) -1,8)*
5203 & int(id%LSOL_loc,8)+int(i,8)) = zero
5205 jbeg_new = jbeg_new +1
5209 DO WHILE ( jbeg_new.LE. id%NRHS)
5211 id%SOL_loc((jbeg_new -1)*id%LSOL_loc + i) = zero
5213 jbeg_new = jbeg_new +1
5222 IF ((keep(221).EQ.1) .AND.
5223 & ( jend_rhs .LT. id%NRHS ) )
THEN
5224 IF (id%MYID .EQ. master)
THEN
5225 jbeg_new = jend_rhs + 1
5226 DO WHILE ( jbeg_new.LE. id%NRHS)
5227 DO i=1, id%SIZE_SCHUR
5228 id%REDRHS(int(jbeg_new -1,8)*int(ld_redrhs,8) +
5231 jbeg_new = jbeg_new +1
5234 IF (i_am_slave)
THEN
5235 jbeg_new = jend_rhs + 1
5236 DO WHILE ( jbeg_new.LE. id%NRHS)
5237 DO i=1,nbent_rhscomp
5238 id%RHSCOMP(int(jbeg_new -1,8)*int(ld_rhscomp,8) +
5241 jbeg_new = jbeg_new +1
5248 id%INFO(26) = int(nb_bytes_max / 1000000_8)
5257 & id%INFO(26), id%INFOG(30), irank )
5259 IF (print_maxavg)
THEN
5260 WRITE( mpg,
'(A,I10) ')
5261 &
' ** Rank of processor needing largest memory in solve :',
5263 WRITE( mpg,
'(A,I10) ')
5264 &
' ** Space in MBYTES used by this processor for solve :',
5266 IF ( keep(46) .eq. 0 )
THEN
5267 WRITE( mpg,
'(A,I10) ')
5268 &
' ** Avg. Space in MBYTES per working proc during solve :',
5269 & ( id%INFOG(31)-id%INFO(26) ) / id%NSLAVES
5271 WRITE( mpg,
'(A,I10) ')
5272 &
' ** Avg. Space in MBYTES per working proc during solve :',
5273 & id%INFOG(31) / id%NSLAVES
5276 WRITE( mpg,
'(A,I10) ')
5277 &
' ** Space in MBYTES used for solve :',
5286 id%DKEEP(112)=real(time3)
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/
5536 &
' --- (11) =',i12/
5537 &
' --- (20) =',i12/
5538 &
' --- (21) =',i12/
5539 &
' --- (30) =',i12/
5542 151
FORMAT (
' --- (25) =',i12)
5543 152
FORMAT (
' --- (26) =',i12)
5544 153
FORMAT (
' --- (32) =',i12)
5545 160
FORMAT (
' RHS'/(1x,1p,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 REAL,
INTENT( IN ),
POINTER :: idRHS_loc (:)
5581 INTEGER,
POINTER :: idIRHS_loc (:)
5582 REAL,
POINTER :: idRHS_loc (:)
5584 INTEGER,
INTENT( INOUT ) :: (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 SMUMPS_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 smumps_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))