15 & ASPK, IRN, ICN, COLSCA, ROWSCA, WK, LWK8, WK_REAL,
16 & LWK_REAL, ICNTL, INFO)
19 INTEGER(8),
INTENT(IN) :: NZ8
20 INTEGER IRN(NZ8), ICN(NZ8)
21 INTEGER ICNTL(60), (80)
22 DOUBLE PRECISION,
INTENT(IN) :: ASPK(NZ8)
23 DOUBLE PRECISION COLSCA(*), ROWSCA(*)
24 INTEGER(8),
INTENT(IN) :: LWK8
26 DOUBLE PRECISION WK(LWK8)
27 DOUBLE PRECISION WK_REAL(LWK_REAL)
33 parameter( one = 1.0d0 )
37 prok = ((mpg.GT.0).AND.(icntl(4).GE.2))
43 101
FORMAT(/
' ****** SCALING OF ORIGINAL MATRIX '/)
46 &
WRITE (mpg,*)
' DIAGONAL SCALING '
47 ELSEIF (nsca.EQ.3)
THEN
49 &
WRITE (mpg,*)
' COLUMN SCALING'
50 ELSEIF (nsca.EQ.4)
THEN
52 &
WRITE (mpg,*)
' ROW AND COLUMN SCALING (1 Pass)'
58 IF (5*n.GT.lwk_real)
GOTO 410
63 ELSEIF (nsca.EQ.3)
THEN
66 ELSEIF (nsca.EQ.4)
THEN
68 & wk_real(iwnor),wk_real(iwnor+n),colsca,rowsca,mpg)
72 info(2) = 5*n-lwk_real
73 IF ((lp.GT.0).AND.(icntl(4).GE.1))
74 &
WRITE(lp,*)
'*** ERROR: Not enough space to scale matrix'
80 & RNOR,CNOR,COLSCA,ROWSCA,MPRINT)
81 INTEGER,
INTENT(IN) :: N
82 INTEGER(8),
INTENT(IN) :: NZ8
83 DOUBLE PRECISION VAL(NZ8)
84 DOUBLE PRECISION RNOR(N),CNOR(N)
85 DOUBLE PRECISION COLSCA(N),ROWSCA(N)
86 DOUBLE PRECISION CMIN,CMAX,RMIN,ARNOR,ACNOR
87 INTEGER IRN(NZ8), ICN(NZ8)
88 DOUBLE PRECISION VDIAG
92 DOUBLE PRECISION ZERO, ONE
93 parameter(zero=0.0d0, one=1.0d0)
101 IF ((i.LE.0).OR.(i.GT.n).OR.
102 & (j.LE.0).OR.(j.GT.n))
GOTO 100
104 IF (vdiag.GT.cnor(j))
THEN
107 IF (vdiag.GT.rnor(i))
THEN
111 IF (mprint.GT.0)
THEN
118 IF (acnor.GT.cmax) cmax=acnor
119 IF (acnor.LT.cmin) cmin=acnor
120 IF (arnor.LT.rmin) rmin=arnor
122 WRITE(mprint,*)
'**** STAT. OF MATRIX PRIOR ROW&COL SCALING'
123 WRITE(mprint,*)
' MAXIMUM NORM-MAX OF COLUMNS:',cmax
124 WRITE(mprint,*)
' MINIMUM NORM-MAX OF COLUMNS:',cmin
125 WRITE(mprint,*)
' MINIMUM NORM-MAX OF ROWS :',rmin
128 IF (cnor(j).LE.zero)
THEN
131 cnor(j) = one / cnor(j)
135 IF (rnor(j).LE.zero)
THEN
138 rnor(j) = one / rnor(j)
142 rowsca(i) = rowsca(i) * rnor(i)
143 colsca(i) = colsca(i) * cnor(i)
146 &
WRITE(mprint,*)
' END OF SCALING BY MAX IN ROW AND COL'
150 & CNOR,COLSCA,MPRINT)
151 INTEGER,
INTENT(IN) :: N
152 INTEGER(8),
INTENT(IN) :: NZ8
153 DOUBLE PRECISION,
INTENT(IN) :: VAL(NZ8)
154 DOUBLE PRECISION,
INTENT(OUT) :: CNOR(N)
155 DOUBLE PRECISION,
INTENT(INOUT) :: COLSCA(N)
156 INTEGER,
INTENT(IN) :: IRN(NZ8), ICN(NZ8)
157 INTEGER,
INTENT(IN) :: MPRINT
158 DOUBLE PRECISION VDIAG
161 DOUBLE PRECISION ZERO, ONE
162 parameter(zero=0.0d0,one=1.0d0)
169 IF ((i.LE.0).OR.(i.GT.n).OR.
170 & (j.LE.0).OR.(j.GT.n))
GOTO 100
172 IF (vdiag.GT.cnor(j))
THEN
177 IF (cnor(j).LE.zero)
THEN
180 cnor(j) = one/cnor(j)
184 colsca(i) = colsca(i) * cnor(i)
186 IF (mprint.GT.0)
WRITE(mprint,*)
' END OF COLUMN SCALING'
190 & COLSCA,ROWSCA,MPRINT)
191 INTEGER ,
INTENT(IN) :: N
192 INTEGER(8),
INTENT(IN) :: NZ8
193 DOUBLE PRECISION ,
INTENT(IN) :: VAL(NZ8)
194 DOUBLE PRECISION ,
INTENT(OUT) :: ROWSCA(N),COLSCA(N)
195 INTEGER ,
INTENT(IN) :: IRN(NZ8),ICN(NZ8)
196 INTEGER ,
INTENT(IN) :: MPRINT
197 DOUBLE PRECISION :: VDIAG
201 DOUBLE PRECISION , ONE
202 parameter(zero=0.0d0, one=1.0d0)
208 IF ((i.GT.n).OR.(i.LE.0))
GOTO 100
212 IF (vdiag.GT.zero)
THEN
213 rowsca(j) = one/(sqrt(vdiag))
218 colsca(i) = rowsca(i)
220 IF (mprint.GT.0)
WRITE(mprint,*)
' END OF DIAGONAL SCALING'
224 & RNOR,ROWSCA,MPRINT)
225 INTEGER,
INTENT(IN) :: N,
226 INTEGER(8),
INTENT(IN) :: NZ8
227 INTEGER,
INTENT(IN) :: IRN(NZ8), ICN(NZ8)
228 DOUBLE PRECISION (NZ8)
229 DOUBLE PRECISION RNOR(N)
230 DOUBLE PRECISION ROWSCA(N)
232 DOUBLE PRECISION VDIAG
235 DOUBLE PRECISION,
PARAMETER :: ZERO = 0.0d0
236 DOUBLE PRECISION,
PARAMETER :: ONE = 1.0d0
243 IF ((i.LE.0).OR.(i.GT.n).OR.
244 & (j.LE.0).OR.(j.GT.n))
GOTO 100
246 IF (vdiag.GT.rnor(i))
THEN
251 IF (rnor(j).LE.zero)
THEN
254 rnor(j) = one/rnor(j)
258 rowsca(i) = rowsca(i)* rnor(i)
260 IF ( (nsca.EQ.4) .OR. (nsca.EQ.6) )
THEN
264 IF (
min(i,j).LT.1 .OR. i.GT.n .OR. j.GT.n)
GOTO 150
265 val(k8) = val(k8) * rnor(i)
269 &
WRITE(mprint,
'(A)')
' END OF ROW SCALING'
278 parameter( master = 0 )
279 TYPE(dmumps_struc),
TARGET :: id
280 DOUBLE PRECISION,
INTENT(OUT) :: ANORMINF
281 LOGICAL,
INTENT(IN) :: LSCAL
282 INTEGER,
INTENT(IN) :: EFF_SIZE_SCHUR
283 INTEGER,
DIMENSION (:),
POINTER :: KEEP,INFO
284 INTEGER(8),
DIMENSION (:),
POINTER :: KEEP8
285 LOGICAL :: I_AM_SLAVE
286 DOUBLE PRECISION DUMMY(1)
287 DOUBLE PRECISION ZERO
288 parameter( zero = 0.0d0)
289 DOUBLE PRECISION,
ALLOCATABLE :: SUMR(:), SUMR_LOC(:)
290 INTEGER :: allocok, MTYPE, I
294 i_am_slave = ( id%MYID .ne. master .OR.
295 & ( id%MYID .eq. master .AND.
296 & keep(46) .eq. 1 ) )
297 IF (id%MYID .EQ. master)
THEN
298 ALLOCATE( sumr( id%N ), stat =allocok )
299 IF (allocok .GT.0 )
THEN
305 IF ( keep(54) .eq. 0 )
THEN
306 IF (id%MYID .EQ. master)
THEN
307 IF (keep(55).EQ.0)
THEN
310 & id%KEEP8(28), id%N,
311 & id%IRN(1), id%JCN(1),
312 & sumr, keep(1),keep8(1),
313 & eff_size_schur, id%SYM_PERM(1) )
316 & id%KEEP8(28), id%N,
317 & id%IRN(1), id%JCN(1),
318 & sumr, keep(1), keep8(1),
320 & eff_size_schur, id%SYM_PERM(1) )
326 & id%NELT, id%ELTPTR(1),
327 & id%LELTVAR, id%ELTVAR(1),
329 & id%A_ELT(1), sumr, keep(1),keep8(1) )
332 & id%NELT, id%ELTPTR(1),
333 & id%LELTVAR, id%ELTVAR(1),
336 & sumr, keep(1),keep8(1), id%COLSCA(1))
341 ALLOCATE( sumr_loc( id%N ), stat =allocok )
342 IF (allocok .GT.0 )
THEN
347 IF ( i_am_slave .and.
348 & id%KEEP8(29) .NE. 0 )
THEN
351 & id%KEEP8(29), id%N,
352 & id%IRN_loc(1), id%JCN_loc(1),
353 & sumr_loc, id%KEEP(1),id%KEEP8(1),
354 & eff_size_schur, id%SYM_PERM(1) )
357 & id%KEEP8(29), id%N,
358 & id%IRN_loc(1), id%JCN_loc(1),
359 & sumr_loc, id%KEEP(1),id%KEEP8(1),
361 & eff_size_schur, id%SYM_PERM(1) )
366 IF ( id%MYID .eq. master )
THEN
368 & id%N, mpi_double_precision,
369 & mpi_sum,master,id%COMM, ierr)
372 & id%N, mpi_double_precision,
373 & mpi_sum,master,id%COMM, ierr)
375 DEALLOCATE (sumr_loc)
377 IF ( id%MYID .eq. master )
THEN
378 anorminf = dble(zero)
381 anorminf =
max(abs(id%ROWSCA(i) * sumr(i)),
386 anorminf =
max(abs(sumr(i)),
392 & mpi_double_precision, master,
394 IF (id%MYID .eq. master)
DEALLOCATE (sumr)
subroutine dmumps_fac_v(n, nz8, val, irn, icn, colsca, rowsca, mprint)
subroutine dmumps_rowcol(n, nz8, irn, icn, val, rnor, cnor, colsca, rowsca, mprint)
subroutine dmumps_anorminf(id, anorminf, lscal, eff_size_schur)
subroutine dmumps_fac_x(nsca, n, nz8, irn, icn, val, rnor, rowsca, mprint)
subroutine dmumps_fac_y(n, nz8, val, irn, icn, cnor, colsca, mprint)
subroutine dmumps_fac_a(n, nz8, nsca, aspk, irn, icn, colsca, rowsca, wk, lwk8, wk_real, lwk_real, icntl, info)
subroutine dmumps_sol_x_elt(mtype, n, nelt, eltptr, leltvar, eltvar, na_elt8, a_elt, w, keep, keep8)
subroutine dmumps_scal_x(a, nz8, n, irn, icn, z, keep, keep8, colsca, eff_size_schur, sym_perm)
subroutine dmumps_sol_scalx_elt(mtype, n, nelt, eltptr, leltvar, eltvar, na_elt8, a_elt, w, keep, keep8, colsca)
subroutine dmumps_sol_x(a, nz8, n, irn, icn, z, keep, keep8, eff_size_schur, sym_perm)
subroutine mpi_reduce(sendbuf, recvbuf, cnt, datatype, op, root, comm, ierr)
subroutine mpi_bcast(buffer, cnt, datatype, root, comm, ierr)