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 COMPLEX,
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
'
78 END SUBROUTINE CMUMPS_FAC_A
79 SUBROUTINE CMUMPS_ROWCOL(N,NZ8,IRN,ICN,VAL,
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.LE..OR..GT..OR.
IF ((I0)(IN)
102.LE..OR..GT.
& (J0)(JN)) GOTO 100
104.GT.
IF (VDIAGCNOR(J)) THEN
107.GT.
IF (VDIAGRNOR(I)) THEN
111.GT.
IF (MPRINT0) THEN
118.GT.
IF (ACNORCMAX) CMAX=ACNOR
119.LT.
IF (ACNORCMIN) CMIN=ACNOR
120.LT.
IF (ARNORRMIN) 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.LE.
IF (CNOR(J)ZERO) THEN
131 CNOR(J) = ONE / CNOR(J)
135.LE.
IF (RNOR(J)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
'
148 END SUBROUTINE CMUMPS_ROWCOL
149 SUBROUTINE CMUMPS_FAC_Y(N,NZ8,VAL,IRN,ICN,
150 & CNOR,COLSCA,MPRINT)
151 INTEGER, INTENT(IN) :: N
152 INTEGER(8), INTENT(IN) :: NZ8
153 COMPLEX, 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.LE..OR..GT..OR.
IF ((I0)(IN)
170.LE..OR..GT.
& (J0)(JN)) GOTO 100
172.GT.
IF (VDIAGCNOR(J)) THEN
177.LE.
IF (CNOR(J)ZERO) THEN
180 CNOR(J) = ONE/CNOR(J)
184 COLSCA(I) = COLSCA(I) * CNOR(I)
186.GT.
IF (MPRINT0) WRITE(MPRINT,*) ' END OF COLUMN SCALING
'
188 END SUBROUTINE CMUMPS_FAC_Y
189 SUBROUTINE CMUMPS_FAC_V(N,NZ8,VAL,IRN,ICN,
190 & COLSCA,ROWSCA,MPRINT)
191 INTEGER , INTENT(IN) :: N
192 INTEGER(8), INTENT(IN) :: NZ8
193 COMPLEX , 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.GT..OR..LE.
IF ((IN)(I0)) GOTO 100
212.GT.
IF (VDIAGZERO) THEN
213 ROWSCA(J) = ONE/(sqrt(VDIAG))
218 COLSCA(I) = ROWSCA(I)
220.GT.
IF (MPRINT0) WRITE(MPRINT,*) ' END OF DIAGONAL SCALING
'
222 END SUBROUTINE CMUMPS_FAC_V
223 SUBROUTINE CMUMPS_FAC_X(NSCA,N,NZ8,IRN,ICN,VAL,
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.LE..OR..GT..OR.
IF ((I0)(IN)
244.LE..OR..GT.
& (J0)(JN)) GOTO 100
246.GT.
IF (VDIAGRNOR(I)) THEN
251.LE.
IF (RNOR(J)ZERO) THEN
254 RNOR(J) = ONE/RNOR(J)
258 ROWSCA(I) = ROWSCA(I)* RNOR(I)
260.EQ..OR..EQ.
IF ( (NSCA4) (NSCA6) ) THEN
264.LT..OR..GT..OR..GT.
IF (min(I,J)1 IN JN) GOTO 150
265 VAL(K8) = VAL(K8) * RNOR(I)
269 & WRITE(MPRINT,'(A)
') ' END OF ROW SCALING
'
271 END SUBROUTINE CMUMPS_FAC_X
272 SUBROUTINE CMUMPS_ANORMINF( id, ANORMINF, LSCAL,
278 PARAMETER( MASTER = 0 )
279 TYPE(CMUMPS_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.ne..OR.
I_AM_SLAVE = ( id%MYID MASTER
295.eq..AND.
& ( id%MYID MASTER
297.EQ.
IF (id%MYID MASTER) THEN
298 ALLOCATE( SUMR( id%N ), stat =allocok )
299.GT.
IF (allocok 0 ) THEN
305.eq.
IF ( KEEP(54) 0 ) THEN
306.EQ.
IF (id%MYID MASTER) THEN
307.EQ.
IF (KEEP(55)0) THEN
309 CALL CMUMPS_SOL_X(id%A(1),
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) )
315 CALL CMUMPS_SCAL_X(id%A(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) )
325 CALL CMUMPS_SOL_X_ELT(MTYPE, id%N,
326 & id%NELT, id%ELTPTR(1),
327 & id%LELTVAR, id%ELTVAR(1),
329 & id%A_ELT(1), SUMR, KEEP(1),KEEP8(1) )
331 CALL CMUMPS_SOL_SCALX_ELT(MTYPE, id%N,
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.GT.
IF (allocok 0 ) THEN
348.NE.
& id%KEEP8(29) 0 ) THEN
350 CALL CMUMPS_SOL_X(id%A_loc(1),
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) )
356 CALL CMUMPS_SCAL_X(id%A_loc(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.eq.
IF ( id%MYID MASTER ) THEN
367 CALL MPI_REDUCE( SUMR_LOC, SUMR,
369 & MPI_SUM,MASTER,id%COMM, IERR)
371 CALL MPI_REDUCE( SUMR_LOC, DUMMY,
373 & MPI_SUM,MASTER,id%COMM, IERR)
375 DEALLOCATE (SUMR_LOC)
377.eq.
IF ( id%MYID MASTER ) THEN
378 ANORMINF = real(ZERO)
381 ANORMINF = max(abs(id%ROWSCA(I) * SUMR(I)),
386 ANORMINF = max(abs(SUMR(I)),
391 CALL MPI_BCAST(ANORMINF, 1,
394.eq.
IF (id%MYID MASTER) DEALLOCATE (SUMR)
396 END SUBROUTINE CMUMPS_ANORMINF
subroutine cmumps_fac_y(n, nz8, val, irn, icn, cnor, colsca, mprint)
subroutine cmumps_fac_a(n, nz8, nsca, aspk, irn, icn, colsca, rowsca, wk, lwk8, wk_real, lwk_real, icntl, info)
subroutine cmumps_rowcol(n, nz8, irn, icn, val, rnor, cnor, colsca, rowsca, mprint)
subroutine cmumps_fac_v(n, nz8, val, irn, icn, colsca, rowsca, mprint)
norm(diag(diag(diag(inv(mat))) -id.SOL), 2) % destroy mumps instance id.JOB