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), INFO(80)
22 REAL,
INTENT(IN) :: ASPK(NZ8)
23 REAL COLSCA(*), ROWSCA(*)
24 INTEGER(8),
INTENT(IN) :: LWK8
27 REAL WK_REAL(LWK_REAL)
33 parameter( one = 1.0e0 )
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
85 REAL COLSCA(N),ROWSCA(N)
86 REAL CMIN,CMAX,RMIN,ARNOR,ACNOR
87 INTEGER IRN(NZ8), ICN(NZ8)
93 parameter(zero=0.0e0, one=1.0e0)
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 REAL,
INTENT(IN) :: VAL(NZ8)
154 REAL,
INTENT(OUT) :: CNOR(N)
155 REAL,
INTENT(INOUT) :: COLSCA(N)
156 INTEGER,
INTENT(IN) :: IRN(NZ8), ICN(NZ8)
157 INTEGER,
INTENT(IN) :: MPRINT
162 parameter(zero=0.0e0,one=1.0e0)
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 REAL ,
INTENT(IN) :: VAL(NZ8)
194 REAL ,
INTENT(OUT) :: ROWSCA(N),COLSCA(N)
195 INTEGER ,
INTENT(IN) :: IRN(NZ8),ICN(NZ8)
196 INTEGER ,
INTENT(IN) :: MPRINT
202 parameter(zero=0.0e0, one=1.0e0)
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, NSCA
226 INTEGER(8),
INTENT(IN) :: NZ8
227 INTEGER,
INTENT(IN) :: IRN(NZ8), ICN(NZ8)
235 REAL,
PARAMETER :: ZERO = 0.0e0
236 REAL,
PARAMETER :: ONE = 1.0e0
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(smumps_struc),
TARGET :: id
280 REAL,
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
288 parameter( zero = 0.0e0)
289 REAL,
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
369 & mpi_sum,master,id%COMM, ierr)
373 & mpi_sum,master,id%COMM, ierr)
375 DEALLOCATE (sumr_loc)
377 IF ( id%MYID .eq. master )
THEN
378 anorminf = real(zero)
381 anorminf =
max(abs(id%ROWSCA(i) * sumr(i)),
386 anorminf =
max(abs(sumr(i)),
394 IF (id%MYID .eq. master)
DEALLOCATE (sumr)
subroutine mpi_reduce(sendbuf, recvbuf, cnt, datatype, op, root, comm, ierr)
subroutine mpi_bcast(buffer, cnt, datatype, root, comm, ierr)
subroutine smumps_fac_y(n, nz8, val, irn, icn, cnor, colsca, mprint)
subroutine smumps_anorminf(id, anorminf, lscal, eff_size_schur)
subroutine smumps_fac_x(nsca, n, nz8, irn, icn, val, rnor, rowsca, mprint)
subroutine smumps_fac_a(n, nz8, nsca, aspk, irn, icn, colsca, rowsca, wk, lwk8, wk_real, lwk_real, icntl, info)
subroutine smumps_fac_v(n, nz8, val, irn, icn, colsca, rowsca, mprint)
subroutine smumps_rowcol(n, nz8, irn, icn, val, rnor, cnor, colsca, rowsca, mprint)
subroutine smumps_sol_x_elt(mtype, n, nelt, eltptr, leltvar, eltvar, na_elt8, a_elt, w, keep, keep8)
subroutine smumps_scal_x(a, nz8, n, irn, icn, z, keep, keep8, colsca, eff_size_schur, sym_perm)
subroutine smumps_sol_x(a, nz8, n, irn, icn, z, keep, keep8, eff_size_schur, sym_perm)
subroutine smumps_sol_scalx_elt(mtype, n, nelt, eltptr, leltvar, eltvar, na_elt8, a_elt, w, keep, keep8, colsca)