16 & POSWCB,IWPOSCB,PTRICB,PTRACB)
18 INTEGER(8),
INTENT(IN) :: LWC
19 INTEGER(8),
INTENT(INOUT) :: POSWCB
20 INTEGER N,LIWW,IWPOSCB, KEEP28
21 INTEGER IWCB(LIWW),PTRICB(KEEP28)
22 INTEGER(8) :: PTRACB(KEEP28)
23 COMPLEX(kind=8) W(LWC)
25 IF ( iwposcb .eq. liww )
RETURN
26 DO WHILE ( iwcb( iwposcb + 2 ) .eq. 0 )
27 sizfr = iwcb( iwposcb + 1 )
29 iwposcb = iwposcb + sizfi
30 poswcb = poswcb + sizfr
31 IF ( iwposcb .eq. liww )
RETURN
36 & POSWCB,IWPOSCB,PTRICB,PTRACB)
38 INTEGER(8),
INTENT(IN) :: LWC
39 INTEGER(8),
INTENT(INOUT) :: POSWCB
40 INTEGER N,LIWW,IWPOSCB,KEEP28
41 INTEGER IWCB(LIWW),PTRICB(KEEP28)
42 INTEGER(8) :: PTRACB(KEEP28)
43 COMPLEX(kind=8) W(LWC)
44 INTEGER IPTIW,SIZFI,LONGI
45 INTEGER(8) :: IPTA, LONGR, SIZFR, I8
51 IF ( iptiw .EQ. liww )
RETURN
53 IF (iwcb(iptiw+2).EQ.0)
THEN
54 sizfr = int(iwcb(iptiw+1),8)
58 iwcb(iptiw + sizfi - i) = iwcb(iptiw - i)
61 w(ipta + sizfr - i8) = w(ipta - i8)
65 IF ((ptricb(i).LE.(iptiw+1)).AND.
66 & (ptricb(i).GT.iwposcb) )
THEN
67 ptricb(i) = ptricb(i) + sizfi
68 ptracb(i) = ptracb(i) + sizfr
71 iwposcb = iwposcb + sizfi
73 poswcb = poswcb + sizfr
76 sizfr = int(iwcb(iptiw
83 IF (iptiw.NE.liww)
GOTO 10
87 & EFF_SIZE_SCHUR, SYM_PERM )
88 INTEGER,
INTENT(IN) :: N, KEEP(500)
89 INTEGER(8),
INTENT(IN) :: NZ8
90 INTEGER(8),
INTENT(IN) :: KEEP8(150)
91 INTEGER,
INTENT(IN) :: IRN(NZ8), ICN(NZ8)
92 COMPLEX(kind=8),
INTENT(IN) :: A(NZ8)
93 DOUBLE PRECISION,
INTENT(OUT) :: Z(N)
94 INTEGER,
INTENT(IN) :: EFF_SIZE_SCHUR, SYM_PERM(N)
96 LOGICAL :: SKIP_COLinSchur
97 DOUBLE PRECISION,
PARAMETER :: ZERO = 0.0d0
103 skip_colinschur = (eff_size_schur.GT.0)
104 IF (keep(264).EQ.0)
THEN
105 IF (keep(50) .EQ.0)
THEN
109 IF ((i .LT. 1) .OR. (i .GT. n)) cycle
110 IF ((j .LT. 1) .OR. (j .GT. n)) cycle
111 IF ( skip_colinschur.AND.
112 & (sym_perm(j).GT.n-eff_size_schur)) cycle
113 IF ( skip_colinschur.AND.
114 & (sym_perm(i).GT.n-eff_size_schur)) cycle
115 z(i) = z(i) + abs(a(k))
121 IF ((i .LT. 1) .OR. (i .GT. n)) cycle
122 IF ((j .LT. 1) .OR. (j .GT. n)) cycle
123 IF ( skip_colinschur.AND.
124 & ( (sym_perm(i).GT.n-eff_size_schur)
126 & (sym_perm(j).GT.n-eff_size_schur)
129 z(i) = z(i) + abs(a(k))
131 z(j) = z(j) + abs(a(k))
136 IF (keep(50) .EQ.0)
THEN
137 IF (skip_colinschur)
THEN
140 IF ( sym_perm(j).GT.n-eff_size_schur ) cycle
142 IF ( sym_perm(i).GT.n-eff_size_schur ) cycle
143 z(i) = z(i) + abs(a(k))
149 z(i) = z(i) + abs(a(k))
156 IF ( skip_colinschur.AND.
157 & ( (sym_perm(i).GT.n-eff_size_schur)
159 & (sym_perm(j).GT.n-eff_size_schur)
162 z(i) = z(i) + abs(a(k))
164 z(j) = z(j) + abs(a(k))
172 & KEEP, KEEP8, COLSCA,
173 & EFF_SIZE_SCHUR, SYM_PERM )
174 INTEGER,
INTENT(IN) :: N, KEEP(500)
175 INTEGER(8),
INTENT(IN) :: NZ8
176 INTEGER(8),
INTENT(IN) :: KEEP8(150)
177 INTEGER,
INTENT(IN) :: IRN(NZ8), ICN(NZ8)
178 COMPLEX(kind=8),
INTENT(IN) :: A(NZ8)
179 DOUBLE PRECISION,
INTENT(IN) :: COLSCA(N)
180 DOUBLE PRECISION,
INTENT(OUT) :: Z(N)
181 INTEGER,
INTENT(IN) :: EFF_SIZE_SCHUR, SYM_PERM(N)
182 DOUBLE PRECISION,
PARAMETER :: ZERO = 0.0d0
185 LOGICAL :: SKIP_COLinSchur
189 skip_colinschur = (eff_size_schur.GT.0)
190 IF (keep(50) .EQ.0)
THEN
194 IF ((i .LT. 1) .OR. (i .GT. n)) cycle
195 IF ((j .LT. 1) .OR. (j .GT. n)) cycle
196 IF ( skip_colinschur.AND.
197 & (sym_perm(j).GT.n-eff_size_schur)) cycle
198 IF ( skip_colinschur.AND.
199 & (sym_perm(i).GT.n-eff_size_schur)) cycle
200 z(i) = z(i) + abs(a(k)*colsca(j))
206 IF ((i .LT. 1) .OR. (i .GT. n)) cycle
207 IF ((j .LT. 1) .OR. (j .GT. n)) cycle
208 IF ( skip_colinschur.AND.
209 & ( (sym_perm(i).GT.n-eff_size_schur)
211 & (sym_perm(j).GT.n-eff_size_schur)
214 z(i) = z(i) + abs(a(k)*colsca(j))
216 z(j) = z(j) + abs(a(k)*colsca(i))
225 INTEGER,
INTENT(IN) :: N, KEEP(500)
226 INTEGER(8),
INTENT(IN) :: NZ8
227 INTEGER(8),
INTENT(IN) :: KEEP8(150)
228 INTEGER,
INTENT(IN) :: IRN(NZ8), ICN(NZ8)
229 COMPLEX(kind=8),
INTENT(IN) :: A(NZ8), RHS(N), X(N)
230 DOUBLE PRECISION,
INTENT(OUT) :: W(N)
231 COMPLEX(kind=8),
INTENT(OUT) :: R(N)
234 DOUBLE PRECISION,
PARAMETER :: ZERO = 0.0d0
240 IF (keep(264).EQ.0)
THEN
241 IF (keep(50) .EQ.0)
THEN
245 IF ((i .GT. n) .OR. (j .GT. n) .OR. (i .LT.
255 IF ((i .GT. n) .OR. (j .GT. n) .OR. (i .LT. 1) .OR.
268 IF (keep(50) .EQ.0)
THEN
294 INTEGER,
intent(in) :: N
295 DOUBLE PRECISION,
intent(in) :: W(N)
296 COMPLEX(kind=8),
intent(inout) :: R(N)
304 INTEGER,
intent(in) :: N
305 INTEGER,
intent(inout) :: KASE
307 COMPLEX(kind=8) W(N), X(N)
308 DOUBLE PRECISION,
intent(inout) :: EST
309 INTEGER,
intent(in) ::
310 INTRINSIC abs, nint, real, sign
311 INTEGER ZMUMPS_IXAMAX
312 EXTERNAL zmumps_ixamax
315 INTEGER I, ITER, J, JLAST, JUMP
316 DOUBLE PRECISION ALTSGN
317 DOUBLE PRECISION TEMP
318 SAVE iter, j, jlast, jump
319 COMPLEX(kind=8) ZERO, ONE
320 parameter( zero = (0.0d0,0
321 parameter( one = (1.0d0,0.0d0) )
322 DOUBLE PRECISION,
PARAMETER :: RZERO = 0.0d0
323 DOUBLE PRECISION,
PARAMETER :: RONE = 1.0d0
324 IF (kase .EQ. 0)
THEN
352 x(i) =
cmplx( sign(rone,dble(x(i))), kind=kind(x))
353 iw(i) = nint(dble(x(i)))
359 j = zmumps_ixamax(n, x, 1, grain)
374 IF (nint(sign(rone, dble(x(i)))) .NE. iw(i))
GOTO 100
379 x(i) =
cmplx( sign(rone, dble(x(i))), kind=kind(x) )
380 iw(i) = nint(dble(x(i)))
387 j = zmumps_ixamax(n, x, 1, grain)
388 IF ((abs(x(jlast)) .NE. abs(x(j))) .AND. (iter .LT. itmax))
THEN
395 est = est + abs(w(i))
399 x(i) =
cmplx(altsgn * (rone + dble(i - 1) / dble(n - 1)),
409 temp = temp + abs(x(i))
411 temp = 2.0d0 * temp / dble(3 * n)
412 IF (temp .GT. est)
THEN
422 & LHS, WRHS, W, RHS, KEEP,KEEP8)
425 INTEGER(8),
INTENT(IN) :: NZ8
426 INTEGER,
INTENT(IN) :: IRN( NZ8 ), ICN( NZ8 )
428 INTEGER(8) KEEP8(150)
429 COMPLEX(kind=8),
INTENT(IN) :: ASPK( NZ8 )
430 COMPLEX(kind=8),
INTENT(IN) :: LHS( N ), WRHS( N )
431 COMPLEX(kind=8),
INTENT(OUT):: RHS( N )
432 DOUBLE PRECISION,
INTENT(OUT):: W( N )
435 DOUBLE PRECISION,
PARAMETER :: DZERO = 0.0d0
440 IF ( keep(50) .EQ. 0 )
THEN
441 IF (mtype .EQ. 1)
THEN
442 IF (keep(264).EQ.0)
THEN
446 IF ((i .LE. 0) .OR. (i .GT. n) .OR. (j .LE. 0) .OR.
448 rhs(i) = rhs(i) - aspk(k8) * lhs(j)
449 w(i) = w(i) + abs(aspk(k8))
455 rhs(i) = rhs(i) - aspk(k8) * lhs(j)
456 w(i) = w(i) + abs(aspk(k8))
460 IF (keep(264).EQ.0)
THEN
464 IF ((i .LE. 0) .OR. (i .GT. n) .OR. (j .LE. 0) .OR.
466 rhs(j) = rhs(j) - aspk(k8) * lhs(i)
467 w(j) = w(j) + abs(aspk(k8))
473 rhs(j) = rhs(j) - aspk(k8) * lhs(i)
474 w(j) = w(j) + abs(aspk(k8))
479 IF (keep(264).EQ.0)
THEN
483 IF ((i .LE. 0) .OR. (i .GT. n) .OR. (j .LE. 0) .OR.
485 rhs(i) = rhs(i) - aspk(k8) * lhs(j)
486 w(i) = w(i) + abs(aspk(k8))
488 rhs(j) = rhs(j) - aspk(k8) * lhs(i)
489 w(j) = w(j) + abs(aspk(k8))
496 rhs(i) = rhs(i) - aspk(k8) * lhs(j)
497 w(i) = w(i) + abs(aspk(k8))
499 rhs(j) = rhs(j) - aspk(k8) * lhs(i)
500 w(j) = w(j) + abs(aspk(k8))
508 & NELT, ELTPTR, LELTVAR, ELTVAR, NA_ELT8, A_ELT,
509 & LHS, WRHS, W, RHS, KEEP,KEEP8 )
511 INTEGER MTYPE, N, NELT, LELTVAR
512 INTEGER(8),
INTENT(IN) :: NA_ELT8
513 INTEGER ELTPTR(NELT+1), ELTVAR(LELTVAR)
515 INTEGER(8) KEEP8(150)
516 COMPLEX(kind=8) A_ELT(NA_ELT8)
517 COMPLEX(kind=8) LHS( N ), WRHS( N ), RHS( N )
518 DOUBLE PRECISION W(N)
519 CALL ZMUMPS_MV_ELT(N, NELT, ELTPTR, ELTVAR, A_ELT,
520 & lhs, rhs, keep(50), mtype )
523 & nelt, eltptr, leltvar, eltvar, na_elt8, a_elt,
528 & NELT, ELTPTR, LELTVAR, ELTVAR, NA_ELT8, A_ELT,
531 INTEGER MTYPE, N, NELT, LELTVAR
532 INTEGER(8),
INTENT(IN) :: NA_ELT8
533 INTEGER ELTPTR(NELT+1), ELTVAR(LELTVAR)
535 INTEGER(8) KEEP8(150)
536 COMPLEX(kind=8) A_ELT(NA_ELT8)
539 INTEGER I, J, IEL, SIZEI, IELPTR
541 DOUBLE PRECISION DZERO
542 parameter(dzero = 0.0d0)
546 sizei = eltptr( iel + 1 ) - eltptr( iel )
547 ielptr = eltptr( iel ) - 1
548 IF ( keep(50).EQ.0 )
THEN
552 w( eltvar( ielptr + i) ) =
553 & w( eltvar( ielptr + i) )
560 temp = w( eltvar( ielptr + j ) )
562 temp = temp + abs( a_elt(k8))
565 w(eltvar( ielptr + j )) =
566 & w(eltvar( ielptr + j )) + temp
572 & w(eltvar( ielptr + j )) + abs(a_elt( k8 ))
575 w(eltvar( ielptr + j )) =
576 & w(eltvar( ielptr + j )) + abs(a_elt( k8 ))
577 w(eltvar( ielptr + i ) ) =
578 & w(eltvar( ielptr + i )) + abs(a_elt( k8 ))
587 & NELT, ELTPTR, LELTVAR, ELTVAR, NA_ELT8, A_ELT,
588 & W, KEEP,KEEP8, COLSCA )
590 INTEGER MTYPE, N, NELT, LELTVAR
591 INTEGER(8),
INTENT(IN) :: NA_ELT8
592 INTEGER ELTPTR(NELT+1), ELTVAR(LELTVAR)
594 INTEGER(8) KEEP8(150)
595 DOUBLE PRECISION COLSCA(N)
596 COMPLEX(kind=8) A_ELT(NA_ELT8)
597 DOUBLE PRECISION W(N)
598 DOUBLE PRECISION , TEMP2
599 INTEGER I, J, IEL, SIZEI, IELPTR
601 DOUBLE PRECISION DZERO
606 sizei = eltptr( iel + 1 ) - eltptr( iel )
607 ielptr = eltptr( iel ) - 1
608 IF ( keep(50).EQ.0 )
THEN
611 temp2 = abs(colsca(eltvar( ielptr + j) ))
613 w( eltvar( ielptr + i) ) =
614 & w( eltvar( ielptr + i) )
615 & + abs(a_elt( k8 )) * temp2
621 temp = w( eltvar( ielptr + j ) )
622 temp2= abs(colsca(eltvar( ielptr + j) ))
624 temp = temp + abs(a_elt( k8 )) * temp2
627 w(eltvar( ielptr + j )) =
628 & w(eltvar( ielptr + j )) + temp
633 w(eltvar( ielptr + j )) =
634 & w(eltvar( ielptr + j )) +
635 & abs( a_elt( k8 )*colsca(eltvar( ielptr + j)) )
638 w(eltvar( ielptr + j )) =
639 & w(eltvar( ielptr + j )) +
640 & abs(a_elt( k8 )*colsca(eltvar( ielptr + j)))
641 w(eltvar( ielptr + i ) ) =
642 & w(eltvar( ielptr + i )) +
643 & abs(a_elt( k8 )*colsca(eltvar( ielptr + i)))
652 & LELTVAR, ELTVAR, NA_ELT8, A_ELT,
653 & SAVERHS, X, Y, W, K50 )
655 INTEGER N, NELT, K50, MTYPE, LELTVAR
656 INTEGER(8) :: NA_ELT8
657 INTEGER ELTPTR( NELT + 1 ), ELTVAR( LELTVAR )
658 COMPLEX(kind=8) A_ELT( NA_ELT8 ), X( N ), Y( N ),
660 DOUBLE PRECISION W(N)
661 INTEGER IEL, I , J, K, SIZEI, IELPTR
662 DOUBLE PRECISION ZERO
664 DOUBLE PRECISION TEMP2
665 parameter( zero = 0.0d0 )
670 sizei = eltptr( iel + 1 ) - eltptr( iel )
671 ielptr = eltptr( iel ) - 1
672 IF ( k50 .eq. 0 )
THEN
673 IF ( mtype .eq. 1 )
THEN
675 temp = x( eltvar( ielptr + j ) )
677 y( eltvar( ielptr + i ) ) =
678 & y( eltvar( ielptr + i ) ) -
680 w( eltvar( ielptr + i ) ) =
681 & w( eltvar( ielptr + i ) ) +
682 & abs( a_elt( k ) * temp )
688 temp = y( eltvar( ielptr + j ) )
689 temp2 = w( eltvar( ielptr + j ) )
692 & a_elt( k ) * x( eltvar( ielptr + i ) )
694 & a_elt( k ) * x( eltvar( ielptr + i ) ) )
697 y( eltvar( ielptr + j ) ) = temp
698 w( eltvar( ielptr + j ) ) = temp2
703 y( eltvar( ielptr + j ) ) =
704 & y( eltvar( ielptr + j ) ) -
705 & a_elt( k ) * x( eltvar( ielptr + j ) )
706 w( eltvar( ielptr + j ) ) =
707 & w( eltvar( ielptr + j ) ) + abs(
708 & a_elt( k ) * x( eltvar( ielptr + j ) ) )
711 y( eltvar( ielptr + i ) ) =
712 & y( eltvar( ielptr + i ) ) -
713 & a_elt( k ) * x( eltvar( ielptr + j ) )
714 y( eltvar( ielptr + j ) ) =
715 & y( eltvar( ielptr + j ) ) -
716 & a_elt( k ) * x( eltvar( ielptr + i ) )
717 w( eltvar( ielptr + i ) ) =
718 & w( eltvar( ielptr + i ) ) + abs(
719 & a_elt( k ) * x( eltvar( ielptr + j ) ) )
720 w( eltvar( ielptr + j ) ) =
721 & w( eltvar( ielptr + j ) ) + abs(
722 & a_elt( k ) * x( eltvar( ielptr + i ) ) )
731 & INODE,PTRFAC,KEEP,A,LA,STEP,
732 & KEEP8,N,MUST_BE_PERMUTED,IERR)
735 INTEGER INODE,KEEP(500),N
736 INTEGER(8) KEEP8(150)
738 INTEGER(8) :: PTRFAC(KEEP(28))
741 COMPLEX(kind=8) A(LA)
743 LOGICAL MUST_BE_PERMUTED
745 & keep(28),a,la,ierr)
756 & a(ptrfac(step(inode))),
768 must_be_permuted=.true.
771 must_be_permuted=.false.
779 TYPE(zmumps_struc),
TARGET :: id
780 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: LOCAL_LIST
781 INTEGER :: I,IERR,TMP,NSTEPS,N_LOCAL_LIST
782 INTEGER :: ,TAG_SIZE,TAG_LIST
783 INTEGER :: STATUS(MPI_STATUS_SIZE)
784 LOGICAL :: I_AM_SLAVE
785 parameter(master=0, tag_size=85,tag_list=86)
786 i_am_slave = (id%MYID .NE. master
787 & .OR. ((id%MYID.EQ.master).AND.(id%KEEP(46).EQ.1)))
789 ALLOCATE(local_list(nsteps),stat=ierr)
791 WRITE(*,*)
'Problem in solve: error allocating LOCAL_LIST'
797 IF(id%PTLUST_S(i).NE.0)
THEN
798 n_local_list = n_local_list + 1
799 local_list(n_local_list) = i
802 IF(id%MYID.NE.master)
THEN
804 & mpi_integer, master, tag_size, id%COMM,ierr)
805 CALL mpi_send(local_list, n_local_list,
806 & mpi_integer, master, tag_list, id%COMM,ierr)
807 DEALLOCATE(local_list)
808 ALLOCATE(id%IPTR_WORKING(1),
812 WRITE(*,*)
'Problem in solve: error allocating ',
813 &
'IPTR_WORKING and WORKING'
818 IF(id%MYID.EQ.master)
THEN
819 ALLOCATE(id%IPTR_WORKING(id%NPROCS+1), stat=ierr)
821 WRITE(*,*)
'Problem in solve: error allocating IPTR_WORKING'
825 id%IPTR_WORKING(1) = 1
826 id%IPTR_WORKING(master+2) = n_local_list
828 CALL mpi_recv(tmp, 1, mpi_integer, mpi_any_source,
829 & tag_size, id%COMM, status, ierr)
830 id%IPTR_WORKING(status(mpi_source)+2) = tmp
833 id%IPTR_WORKING(i) = id%IPTR_WORKING(i)
834 & + id%IPTR_WORKING(i-1)
836 ALLOCATE(id%WORKING(id%IPTR_WORKING(id%NPROCS+1)-1),stat=ierr)
838 WRITE(*,*)
'Problem in solve: error allocating LOCAL_LIST'
843 id%WORKING(id%IPTR_WORKING(tmp):id%IPTR_WORKING(tmp+1)-1)
844 & = local_list(1:id%IPTR_WORKING(tmp+1)
845 & -id%IPTR_WORKING(tmp))
848 CALL mpi_recv(local_list, nsteps, mpi_integer,
849 & mpi_any_source, tag_list, id%COMM, status, ierr)
850 tmp = status(mpi_source)+1
851 id%WORKING(id%IPTR_WORKING(tmp):id%IPTR_WORKING(tmp+1)-1)
852 & = local_list(1:id%IPTR_WORKING
853 & id%IPTR_WORKING(tmp))
855 DEALLOCATE(local_list)
859 & X, Y, R_W, C_W, IW, IFLAG,
860 & OMEGA, NOITER, TESTConv,
865 COMPLEX(kind=8) RHS(N)
866 COMPLEX(kind=8) X(), Y(N)
867 DOUBLE PRECISION R_W(N,2)
868 COMPLEX(kind=8) C_W(N)
871 DOUBLE PRECISION OMEGA(2)
872 DOUBLE PRECISION ARRET
873 INTEGER,
intent(in) :: GRAIN
874 DOUBLE PRECISION,
PARAMETER :: CGCE=0.2d0
875 DOUBLE PRECISION,
PARAMETER :: CTAU=1.0d3
877 DOUBLE PRECISION OM1, OM2, DXMAX
878 DOUBLE PRECISION TAU, DD
879 DOUBLE PRECISION OLDOMG(2)
880 DOUBLE PRECISION,
PARAMETER :: =0.0d0
881 DOUBLE PRECISION,
PARAMETER :: ONE=1.0d0
882 INTEGER ZMUMPS_IXAMAX
885 imax = zmumps_ixamax(n, x, 1, grain)
890 tau = (r_w(i, 2) * dxmax + abs(rhs(i))) * dble(n) * ctau
891 dd = r_w(i, 1) + abs(rhs(i))
892 IF (dd .GT. tau * epsilon(ctau))
THEN
893 omega(1) =
max(omega(1), abs(y(i)) / dd)
896 IF (tau .GT. zero)
THEN
897 omega(2) =
max(omega(2),
898 & abs(y(i)) / (dd + r_w(i, 2) * dxmax))
904 om2 = omega(1) + omega(2)
905 IF (om2 .LT. arret )
THEN
909 IF (noiter .GE. 1)
THEN
910 IF (om2 .GT. om1 * cgce)
THEN
911 IF (om2 .GT. om1)
THEN
937 & X, Y, D, R_W, C_W, IW, KASE,
941 INTEGER N, KASE, KEEP(500)
942 INTEGER(8) KEEP8(150)
944 COMPLEX(kind=8) RHS(N)
945 COMPLEX(kind=8) X(N), Y(N)
946 DOUBLE PRECISION D(N)
947 DOUBLE PRECISION R_W(N,2)
948 COMPLEX(kind=8) C_W(N)
950 DOUBLE PRECISION COND(2),OMEGA(2)
951 LOGICAL LCOND1, LCOND2
953 DOUBLE PRECISION ERX, DXMAX
954 DOUBLE PRECISION DXIMAX
955 DOUBLE PRECISION,
PARAMETER :: ZERO = 0.0d0
956 DOUBLE PRECISION,
PARAMETER :: ONE = 1.0d0
957 INTEGER ZMUMPS_IXAMAX
959 SAVE lcond1, lcond2, jump, dximax, dxmax
960 IF (kase .EQ. 0)
THEN
984 imax = zmumps_ixamax(n, x, 1, keep(361))
992 r_w(i, 2) = r_w(i, 2) * dxmax + r_w(i, 1)
1000 imax = zmumps_ixamax(n, c_w(1), 1, keep(361))
1001 dximax = abs(c_w(imax))
1002 IF (.NOT.lcond1)
GOTO 130
1004 CALL zmumps_sol_b(n, kase, y, cond(1), c_w, iw(1, 2), keep(361))
1005 IF (kase .EQ. 0)
GOTO 120
1015 IF (dximax .GT. zero) cond(1) = cond(1) / dximax
1016 erx = omega(1) * cond(1)
1018 IF (.NOT.lcond2)
GOTO 170
1021 CALL zmumps_sol_b(n, kase, y, cond(2), c_w, iw(1, 2), keep(361))
1022 IF (kase .EQ. 0)
GOTO 160
1031 160
IF (dximax .GT. zero)
THEN
1032 cond(2) = cond(2) / dximax
1034 erx = erx + omega(2) * cond(2)
1039 & KEEP, RHSCOMP, NRHS, LRHSCOMP, FIRST_ROW_RHSCOMP, W, LD_W,
1041 INTEGER :: JBDEB, JBFIN, NBROWS
1042 INTEGER :: NRHS, LRHSCOMP
1043 INTEGER :: FIRST_ROW_RHSCOMP
1044 INTEGER,
INTENT(IN) :: (500)
1045 COMPLEX(kind=8),
INTENT(INOUT) :: RHSCOMP(LRHSCOMP,NRHS)
1046 INTEGER :: LD_W, FIRST_ROW_W
1047 COMPLEX(kind=8) :: W(LD_W*(JBFIN-JBDEB+1))
1048 INTEGER :: JJ, K, ISHIFT
1053 ishift = first_row_w + ld_w * (k-jbdeb)
1055 rhscomp(first_row_rhscomp+jj,k) = w(ishift+jj)
1062 & RHSCOMP, NRHS, LRHSCOMP, W, LD_W, FIRST_ROW_W,
1063 & IW, LIW, KEEP, N, POSINRHSCOMP_BWD )
1064 INTEGER,
INTENT(IN) :: JBDEB, , J1, J2
1065 INTEGER,
INTENT(IN) :: NRHS, LRHSCOMP
1066 INTEGER,
INTENT(IN) :: FIRST_ROW_W, LD_W, LIW
1067 INTEGER,
INTENT(IN) :: IW(LIW)
1068 INTEGER,
INTENT(IN) :: KEEP(500)
1069 COMPLEX(kind=8),
INTENT(INOUT) :: RHSCOMP(LRHSCOMP,NRHS)
1070 COMPLEX(kind=8) :: W(LD_W*(JBFIN-JBDEB+1))
1071 INTEGER,
INTENT(IN) :: N
1072 INTEGER,
INTENT(IN) :: (N)
1073 INTEGER :: ISHIFT, JJ, K, IPOSINRHSCOMP
1078 ishift = first_row_w+(k-jbdeb)*ld_w
1079 DO jj = j1, j2-keep(253)
1080 iposinrhscomp = abs(posinrhscomp_bwd(iw(jj)))
1081 w(ishift+jj-j1)= rhscomp(iposinrhscomp,k)
1088 & LHS, WRHS, W, RES, GIVNORM, ANORM, XNORM, SCLNRM,
1089 & MPRINT, ICNTL, KEEP,KEEP8)
1090 INTEGER MTYPE,N,IFLAG,ICNTL(60), KEEP(500)
1091 INTEGER(8) KEEP8(150)
1092 COMPLEX(kind=8) RES(N),LHS(N)
1093 COMPLEX(kind=8) WRHS(N)
1094 DOUBLE PRECISION W(N)
1095 DOUBLE PRECISION RESMAX,RESL2,XNORM, SCLNRM
1096 DOUBLE PRECISION ANORM,DZERO
1097 LOGICAL GIVNORM,PROK
1100 INTRINSIC abs,
max, sqrt
1102 prok = (mprint .GT. 0)
1104 IF (.NOT.givnorm) anorm = dzero
1108 resmax =
max(resmax, abs(res(k)))
1109 resl2 = resl2 + abs(res(k)) * abs(res(k))
1110 IF (.NOT.givnorm) anorm =
max(anorm, w(k))
1114 xnorm =
max(xnorm, abs(lhs(k)))
1116 IF ( xnorm .EQ. dzero .OR. (exponent(xnorm) .LT.
1117 & minexponent(xnorm) + keep(122) )
1119 & ( exponent(anorm)+exponent(xnorm) .LT.
1120 & minexponent(xnorm) + keep(122) )
1122 & ( exponent(anorm) + exponent(xnorm) -exponent(resmax)
1123 & .LT. minexponent(xnorm) + keep(122) )
1125 IF (mod(iflag/2,2) .EQ. 0)
THEN
1128 IF ((mp .GT. 0) .AND. (icntl(4) .GE. 2))
WRITE( mp, * )
1129 &
' max-NORM of computed solut. is zero or close to zero. '
1131 IF (resmax .EQ. dzero)
THEN
1134 sclnrm = resmax / (anorm * xnorm)
1137 IF (prok)
WRITE( mprint, 90 ) resmax, resl2, anorm, xnorm,
1139 90
FORMAT (/
' RESIDUAL IS ............ (MAX-NORM) =',1pd9.2/
1140 &
' .. (2-NORM) =',1pd9.2/
1141 &
' RINFOG(4):NORM OF input Matrix (MAX-NORM)=',1pd9.2/
1142 &
' RINFOG(5):NORM OF Computed SOLUT (MAX-NORM)=',1pd9.2/
1143 &
' RINFOG(6):SCALED RESIDUAL ...... (MAX-NORM)=',1pd9.2)
1147 & NRHS_B, WCB, LWCB, LDA_WCB, PPIV_COURANT, MTYPE, KEEP)
1148 INTEGER,
INTENT(IN) :: MTYPE, LDADIAG, NPIV, KEEP(500)
1149 INTEGER,
INTENT(IN) :: NRHS_B, LDA_WCB
1150 INTEGER(8),
INTENT(IN) :: LA, APOS, LWCB, PPIV_COURANT
1151 COMPLEX(kind=8),
INTENT(IN) :: A(LA)
1152 COMPLEX(kind=8),
INTENT(INOUT) :: WCB(LWCB)
1154 PARAMETER ( ONE=(1.0d0,0.0d0) )
1155 IF (keep(50).NE.0 .OR. mtype .eq. 1 )
THEN
1156#if defined(MUMPS_USE_BLAS2)
1157 IF ( nrhs_b == 1 )
THEN
1158 CALL ztrsv(
'U',
'T',
'U', npiv, a(apos), ldadiag
1159 & wcb(ppiv_courant), 1 )
1162 CALL ztrsm(
'L',
'U',
'T',
'U', npiv, nrhs_b, one,
1163 & a(apos), ldadiag, wcb(ppiv_courant),
1165#if defined(MUMPS_USE_BLAS2)
1169#if defined(MUMPS_USE_BLAS2)
1170 IF ( nrhs_b == 1 )
THEN
1171 CALL ztrsv(
'L',
'N',
'N', npiv, a(apos), ldadiag,
1172 & wcb(ppiv_courant), 1 )
1175 CALL ztrsm(
'L',
'L',
'N',
'N', npiv, nrhs_b, one,
1176 & a(apos), ldadiag, wcb(ppiv_courant),
1178#if defined(MUMPS_USE_BLAS2)
1185 & NRHS_B, WCB, LWCB, LDA_WCB, PPIV_COURANT, MTYPE, KEEP)
1186 INTEGER,
INTENT(IN) :: MTYPE, LDADIAG, NPIV, KEEP(500)
1187 INTEGER,
INTENT(IN) :: NRHS_B, LDA_WCB
1188 INTEGER(8),
INTENT(IN) :: LA, APOS, LWCB, PPIV_COURANT
1189 COMPLEX(kind=8),
INTENT(IN) :: A(LA)
1190 COMPLEX(kind=8),
INTENT(INOUT) :: WCB(LWCB)
1192 PARAMETER ( ONE=(1.0d0,0.0d0) )
1193 IF (mtype .eq. 1 )
THEN
1194#if defined(MUMPS_USE_BLAS2)
1195 IF ( nrhs_b == 1 )
THEN
1196 CALL ztrsv(
'L',
'T',
'N', npiv, a(apos), ldadiag,
1197 & wcb(ppiv_courant), 1 )
1200 CALL ztrsm(
'L',
'L',
'T',
'N', npiv, nrhs_b, one,
1201 & a(apos), ldadiag, wcb(ppiv_courant),
1203#if defined(MUMPS_USE_BLAS2)
1207#if defined(MUMPS_USE_BLAS2)
1208 IF ( nrhs_b == 1 )
THEN
1209 CALL ztrsv(
'U',
'N',
'U', npiv, a(apos), ldadiag,
1210 & wcb(ppiv_courant), 1 )
1213 CALL ztrsm(
'L',
'U',
'N',
'U', npiv, nrhs_b, one,
1214 & a(apos), ldadiag, wcb(ppiv_courant),
1216#if defined(MUMPS_USE_BLAS2)
1223 & A, LA, APOS, NPIV, IW,
1224 & NRHS_B, WCB, LWCB, LDA_WCB,
1225 & PPIV_COURANT, MTYPE, KEEP)
1226 INTEGER,
INTENT(IN) :: MTYPE, NPIV, KEEP(500)
1227 INTEGER,
INTENT(IN) :: IW(NPIV)
1228 INTEGER,
INTENT(IN) :: NRHS_B, LDA_WCB
1229 INTEGER(8),
INTENT(IN) :: LA, APOS, LWCB, PPIV_COURANT
1230 COMPLEX(kind=8),
INTENT(IN) :: A(LA)
1231 COMPLEX(kind=8),
INTENT(INOUT) :: WCB(LWCB)
1232 INTEGER :: NB_TARGET
1234 INTEGER :: NBROWS_PANEL, NBCOLS_PANEL, , ICOL_END
1235 INTEGER(8) :: PANEL_APOS, PPIV_PANEL
1236 COMPLEX(kind=8),
PARAMETER :: ONE=(1.0d0,0.0d0)
1237 IF (keep(459) .LE. 1)
THEN
1238 WRITE(*,*)
" Internal error in ZMUMPS_SOLVE_FWD_PANELS"
1246 ppiv_panel = ppiv_courant
1247 DO WHILE ( icol_beg .LE. npiv )
1248 nbpanels = nbpanels + 1
1249 icol_end =
min(nb_target * nbpanels, npiv)
1250 IF ( iw(icol_end) .LT. 0 ) icol_end=icol_end+1
1251 nbcols_panel = icol_end - icol_beg + 1
1253 & nbcols_panel, nbcols_panel,
1254 & nrhs_b, wcb, lwcb, lda_wcb, ppiv_panel, mtype, keep)
1255 IF ( nbrows_panel .GT. nbcols_panel )
THEN
1257 & panel_apos + int(nbcols_panel,8) * int(nbcols_panel,8),
1258 & nbcols_panel, nbcols_panel, nbrows_panel-nbcols_panel,
1259 & nrhs_b, wcb, lwcb, ppiv_panel, lda_wcb,
1260 & ppiv_panel+nbcols_panel, lda_wcb,
1261 & mtype, keep, one )
1263 icol_beg = icol_end + 1
1264 panel_apos = panel_apos + int(nbcols_panel,8) *
1265 & int(nbrows_panel,8)
1266 nbrows_panel = nbrows_panel - nbcols_panel
1267 ppiv_panel = ppiv_panel + nbcols_panel
1272 & A, LA, APOS, NPIV, IW,
1273 & NRHS_B, WCB, LWCB, LDA_WCB,
1274 & PPIV_COURANT, MTYPE, KEEP)
1275 INTEGER,
INTENT(IN) :: MTYPE, NPIV, KEEP(500)
1276 INTEGER,
INTENT(IN) :: IW(NPIV)
1277 INTEGER,
INTENT(IN) :: NRHS_B, LDA_WCB
1278 INTEGER(8),
INTENT(IN) :: LA, APOS, LWCB, PPIV_COURANT
1279 COMPLEX(kind=8),
INTENT(IN) :: A(LA)
1280 COMPLEX(kind=8),
INTENT(INOUT) :: WCB(LWCB)
1281 INTEGER,
PARAMETER :: PANEL_TABSIZE = 20
1282 INTEGER(8) :: PANEL_POS(PANEL_TABSIZE)
1283 INTEGER :: PANEL_COL(PANEL_TABSIZE)
1284 INTEGER :: IPANEL, NBPANELS, NB_TARGET
1285 INTEGER :: NBROWS_PANEL, NBCOLS_PANEL
1286 INTEGER(8) :: PPIV_PANEL
1287 INTEGER :: MTYPE_TEMP
1288 COMPLEX(kind=8),
PARAMETER :: ONE=(1.0d0,0.0d0)
1289 IF (keep(459) .LE. 1)
THEN
1290 WRITE(*,*)
" Internal error 1 in ZMUMPS_SOLVE_BWD_PANELS"
1293 IF ( keep(459)+1 .GT. panel_tabsize )
THEN
1294 WRITE(*,*)
" Internal error 2 in ZMUMPS_SOLVE_BWD_PANELS"
1298 &nb_target, nbpanels, panel_col, panel_pos, panel_tabsize,
1300 DO ipanel = nbpanels, 1, -1
1301 nbcols_panel = panel_col( ipanel+1 ) - panel_col( ipanel )
1302 nbrows_panel = npiv - panel_col( ipanel ) + 1
1303 ppiv_panel = ppiv_courant + panel_col( ipanel ) - 1
1304 IF ( nbrows_panel .GT. nbcols_panel )
THEN
1307 & apos-1_8+panel_pos(ipanel)+
1308 & int(nbcols_panel,8)*int(nbcols_panel,8),
1309 & nbrows_panel-nbcols_panel, nbcols_panel,
1311 & nrhs_b, wcb, lwcb, ppiv_panel+nbcols_panel, lda_wcb,
1312 & ppiv_panel, lda_wcb,
1313 & mtype_temp, keep, one )
1316 & apos+panel_pos(ipanel)-1_8,
1317 & nbcols_panel, nbcols_panel,
1318 & nrhs_b, wcb, lwcb, lda_wcb, ppiv_panel, mtype, keep)
1323 & (a, la, apos1, nx, lda, ny,
1324 & nrhs_b, wcb, lwcb, ptrx, ldx,
1326 & mtype, keep, coef_y )
1327 INTEGER,
INTENT(IN) :: MTYPE, NY, NX, KEEP(500)
1328 INTEGER,
INTENT(IN) :: NRHS_B, LDY, LDA, LDX
1329 INTEGER(8),
INTENT(IN) :: LA, APOS1, LWCB, PTRX,
1331 COMPLEX(kind=8),
INTENT(IN) :: A(LA)
1332 COMPLEX(kind=8),
INTENT(INOUT) :: WCB(LWCB)
1333 COMPLEX(kind=8),
INTENT(IN) ::
1334 COMPLEX(kind=8) ALPHA, ZERO, ONE
1335 PARAMETER (ZERO=(0.0d0,0.0d0), one=(1.0d0,0.0d0),
1336 & alpha=(-1.0d0,0.0d0))
1337 IF ( nx .NE. 0 .AND. ny.NE.0 )
THEN
1338 IF ( mtype .eq. 1 )
THEN
1339#if defined(MUMPS_USE_BLAS2)
1340 IF ( nrhs_b == 1 )
THEN
1341 CALL zgemv(
'T', nx, ny, alpha, a(apos1),
1342 & lda, wcb(ptrx), 1, coef_y,
1346 CALL zgemm(
'T',
'N', ny, nrhs_b, nx, alpha,
1347 & a(apos1), lda, wcb(ptrx), ldx, coef_y,
1349#if defined(MUMPS_USE_BLAS2)
1353#
if defined(mumps_use_blas2)
1354 IF ( nrhs_b == 1 )
THEN
1355 CALL zgemv(
'N',ny, nx, alpha, a(apos1),
1356 & lda, wcb(ptrx), 1,
1357 & coef_y, wcb(ptry), 1 )
1360 CALL zgemm(
'N',
'N', ny, nrhs_b, nx, alpha,
1361 & a(apos1), lda, wcb(ptrx), ldx,
1362 & coef_y, wcb(ptry), ldy)
1363#if defined(MUMPS_USE_BLAS2)
1371 & INODE, N, NPIV, LIELL, NELIM, NSLAVES,
1375 & WCB, LWCB, LD_WCBPIV,
1376 & RHSCOMP, LRHSCOMP, NRHS,
1377 & POSINRHSCOMP_FWD, JBDEB, JBFIN,
1378 & MTYPE, KEEP, OOCWRITE_COMPATIBLE_WITH_BLR,
1383 INTEGER,
INTENT(IN) :: MTYPE, INODE, N, NPIV, LIELL,
1385 INTEGER,
INTENT(IN) :: LRHSCOMP, NRHS, LIW, JBDEB, JBFIN
1386 INTEGER,
INTENT(IN) :: IW(LIW), IPOS, POSINRHSCOMP_FWD(N)
1387 INTEGER(8),
INTENT(IN) :: LWCB, APOS, LA, PPIV_COURANT
1388 INTEGER,
INTENT(IN) :: LD_WCBPIV
1389 INTEGER,
INTENT(IN) :: KEEP(500)
1390 COMPLEX(kind=8),
INTENT(IN) :: WCB( LWCB )
1391 COMPLEX(kind=8),
INTENT(IN) :: A( LA )
1392 COMPLEX(kind=8),
INTENT(INOUT) :: RHSCOMP(LRHSCOMP, NRHS)
1393 LOGICAL,
INTENT(IN) :: OOCWRITE_COMPATIBLE_WITH_BLR
1394 LOGICAL,
INTENT(IN) :: IGNORE_K459
1396 INTEGER :: IPOSINRHSCOMP, JJ, K, NBK,
1398 INTEGER(8) :: IFR8 , APOS1, APOS2, APOSOFF, IFR_ini8,
1400 COMPLEX(kind=8) :: VALPIV, A11, A22, A12, DETPIV
1401 INTEGER,
PARAMETER :: PANEL_TABSIZE = 20
1402 INTEGER(8) :: PANEL_POS(PANEL_TABSIZE)
1403 INTEGER :: PANEL_COL(PANEL_TABSIZE)
1404 INTEGER :: IPANEL, ICOL, NBPANELS, NB_TARGET
1408 PARAMETER ( ONE=(1.0d0,0.0d0) )
1409 IF ( npiv.EQ. 0 )
RETURN
1410 nrhs_b = jbfin-jbdeb+1
1411 IF ( mtype .EQ. 1 .OR. keep(50) .NE. 0 )
THEN
1415 j1 = ipos + liell + 1
1416 j3 = ipos + liell + npiv
1418 iposinrhscomp = posinrhscomp_fwd(iw(j1))
1419 IF ( keep(50) .eq. 0 )
THEN
1425 DO ifr8 = 0_8, int(npiv-1,8)
1426 rhscomp(iposinrhscomp+ifr8, k) =
1427 & wcb(ppiv_courant+(k-jbdeb)*ld_wcbpiv+ifr8)
1433 DO ifr8 = 0_8, int(npiv-1,8)
1434 rhscomp(iposinrhscomp+ifr8, k) =
1435 & wcb(ppiv_courant+(k-jbdeb)*ld_wcbpiv+ifr8)
1441 & nb_target, nbpanels, panel_col, panel_pos, panel_tabsize,
1443 ifr_ini8 = ppiv_courant
1452 ipanel = (jj-j1)/nb_target + 1
1453 IF ( jj-j1+1 .LT. panel_col(ipanel) ) ipanel = ipanel -1
1454 icol = jj-j1+1 - panel_col(ipanel) + 1
1455 ldaj = panel_col(ipanel+1) - panel_col(ipanel)
1456 apos1 = apos-1_8+panel_pos( ipanel ) + int(icol-1,8) *
1458 ifr8 = ifr_ini8 + int(k-jbdeb,8)*int(ld_wcbpiv,8) +
1461 IF ( iw(liell+jj-1) .LT. 0 )
THEN
1470 ELSE IF ( iw(jj+liell) .GT. 0 )
THEN
1471 valpiv = one/a( apos1 )
1472 rhscomp(iposinrhscomp+jj-j1 , k ) =
1473 & wcb( ifr8 ) * valpiv
1474 apos1 = apos1 + int(ldaj + 1,8)
1476 apos2 = apos1+int(ldaj+1,8)
1481 detpiv = a11*a22 - a12**2
1483 a11 = a(apos2)/detpiv
1486 poswcb2 = poswcb1+1_8
1487 rhscomp(iposinrhscomp+jj-j1,k) =
1489 & + wcb(poswcb2)*a12
1490 rhscomp(iposinrhscomp+jj-j1+1,k) =
1492 & + wcb(poswcb2)*a22
1501 & INODE, N, NPIV, LIELL, NELIM, NSLAVES,
1505 & WCB, LWCB, LD_WCBPIV,
1506 & RHSCOMP, LRHSCOMP, NRHS,
1507 & POSINRHSCOMP_FWD, JBDEB, JBFIN,
1508 & MTYPE, KEEP, OOCWRITE_COMPATIBLE_WITH_BLR,
1512 INTEGER,
INTENT(IN) :: MTYPE, INODE, N, NPIV, LIELL,
1514 INTEGER,
INTENT(IN) :: LRHSCOMP, NRHS, LIW, JBDEB, JBFIN
1515 INTEGER,
INTENT(IN) :: IW(LIW), IPOS, POSINRHSCOMP_FWD(N)
1516 INTEGER(8),
INTENT(IN) :: LWCB, APOS, LA, PPIV_COURANT
1517 INTEGER,
INTENT(IN) :: LD_WCBPIV
1518 INTEGER,
INTENT(IN) :: KEEP(500)
1519 COMPLEX(kind=8),
INTENT(IN) :: WCB( LWCB )
1520 COMPLEX(kind=8),
INTENT(IN) :: A( LA )
1521 COMPLEX(kind=8),
INTENT(INOUT) :: RHSCOMP(LRHSCOMP, NRHS)
1522 LOGICAL,
INTENT(IN) ::
1523 LOGICAL,
INTENT(IN) :: IGNORE_K459
1524 INTEGER :: TempNROW, J1, J3, PANEL_SIZE, TYPEF
1525 INTEGER :: IPOSINRHSCOMP, JJ, K, NBK, LDAJ,
1526 & ldaj_ini, nbk_ini, ldaj_first_panel, nrhs_b
1527 INTEGER(8) :: IFR8 , APOS1, APOS2, APOSOFF, IFR_ini8,
1529 COMPLEX(kind=8) :: VALPIV, A11, A22, A12, DETPIV
1532 parameter( one=(1.0d0,0.0d0) )
1533 nrhs_b = jbfin-jbdeb+1
1534 IF ( mtype .EQ. 1 .OR. keep(50) .NE. 0 )
THEN
1538 j1 = ipos + liell + 1
1539 j3 = ipos + liell + npiv
1541 iposinrhscomp = posinrhscomp_fwd(iw(j1))
1542 IF ( keep(50) .eq. 0 )
THEN
1546 ifr8 = ppiv_courant + (k-jbdeb)*ld_wcbpiv
1547 rhscomp(iposinrhscomp:iposinrhscomp+npiv-1, k) =
1548 & wcb(ifr8:ifr8+int(npiv-1,8))
1552 ifr8 = ppiv_courant - 1_8
1553 IF (keep(201).EQ.1.AND.oocwrite_compatible_with_blr)
THEN
1554 IF (mtype.EQ.1)
THEN
1555 IF ((mtype.EQ.1).AND.nslaves.NE.0)
THEN
1556 tempnrow= npiv+nelim
1557 ldaj_first_panel=tempnrow
1560 ldaj_first_panel=tempnrow
1565 ldaj_first_panel=liell
1571 IF ( keep(459) .GT. 1 .AND. keep(50) .NE. 0
1572 & .AND. .NOT. ignore_k459 )
THEN
1580 IF (keep(201).EQ.1.AND.oocwrite_compatible_with_blr)
THEN
1583 ifr_ini8 = ppiv_courant - 1_8
1585 IF (keep(201).EQ.1.AND.oocwrite_compatible_with_blr)
1592 ifr8 = ifr_ini8 + int(k-jbdeb,8)*int(ld_wcbpiv,8)
1598 IF (jj .GT. j3)
EXIT
1600 IF (iw(jj+liell) .GT. 0)
THEN
1601 valpiv = one/a( apos1 )
1602 rhscomp(iposinrhscomp+jj-j1 , k ) =
1603 & wcb( ifr8 ) * valpiv
1604 IF (keep(201).EQ.1.AND.oocwrite_compatible_with_blr)
1607 IF (nbk.EQ.panel_size)
THEN
1609 ldaj = ldaj - panel_size
1612 apos1 = apos1 + int(ldaj + 1,8)
1615 IF (keep(201).EQ.1.AND.oocwrite_compatible_with_blr)
1619 apos2 = apos1+int(ldaj+1,8)
1620 IF (keep(201).EQ.1.AND.oocwrite_compatible_with_blr)
1622 aposoff = apos1+int(ldaj,8)
1629 detpiv = a11*a22 - a12**2
1631 a11 = a(apos2)/detpiv
1634 poswcb2 = poswcb1+1_8
1635 rhscomp(iposinrhscomp+jj-j1,k) =
1637 & + wcb(poswcb2)*a12
1638 rhscomp(iposinrhscomp+jj-j1+1,k) =
1640 & + wcb(poswcb2)*a22
1641 IF (keep(201).EQ.1.AND.oocwrite_compatible_with_blr)
1644 IF (nbk.GE.panel_size)
THEN
1649 apos1 = apos2 + int(ldaj + 1,8)
1660 & COMM, MYID, I_AM_SLAVE, MASTER, NB_BYTES, NB_BYTES_MAX,
1661 & K16_8, LP, LPOK, ICNTL, INFO )
1665 DOUBLE PRECISION,
dimension(:),
pointer :: SCALING
1666 DOUBLE PRECISION,
dimension(:),
pointer :: SCALING_LOC
1667 end type scaling_data_t
1668 type (scaling_data_t),
INTENT(INOUT) :: scaling_data
1669 INTEGER,
INTENT(IN) :: N, LILOC, COMM, MYID, MASTER, LP
1670 INTEGER,
INTENT(IN) :: ILOC(LILOC)
1671 INTEGER(8),
INTENT(INOUT) :: NB_BYTES, NB_BYTES_MAX
1672 INTEGER(8),
INTENT(IN) :: K16_8
1673 LOGICAL,
INTENT(IN) :: I_AM_SLAVE, LPOK
1674 INTEGER,
INTENT(INOUT) :: INFO(80)
1675 INTEGER,
INTENT(IN) :: ICNTL(60)
1676 DOUBLE PRECISION,
POINTER,
DIMENSION(:) ::
1677 INTEGER :: I, IERR_MPI, allocok
1679 NULLIFY(scaling_data%SCALING_LOC)
1680 IF (i_am_slave)
THEN
1681 ALLOCATE(scaling_data%SCALING_LOC(
max(1,liloc)),
1683 IF (allocok > 0)
THEN
1685 info(2)=
max(1,liloc)
1688 nb_bytes = nb_bytes + int(
max(1,liloc),8)*k16_8
1689 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
1691 IF (myid .NE. master)
THEN
1692 ALLOCATE(scaling(n), stat=allocok)
1693 IF (allocok > 0)
THEN
1695 WRITE(lp,*)
'Error allocating temporary scaling array'
1701 nb_bytes = nb_bytes + int(n,8)*k16_8
1702 nb_bytes_max =
max(nb_bytes_max,nb_bytes)
1704 scaling => scaling_data%SCALING
1709 IF (info(1) .LT. 0)
GOTO 90
1710 CALL mpi_bcast( scaling(1), n, mpi_double_precision,
1711 & master, comm, ierr_mpi)
1712 IF ( i_am_slave )
THEN
1714 IF (iloc(i) .GE. 1 .AND. iloc(i) .LE. n)
THEN
1715 scaling_data%SCALING_LOC(i) = scaling(iloc(i))
1720 IF (myid.NE. master)
THEN
1721 IF (
associated(scaling))
THEN
1723 nb_bytes = nb_bytes - int(n,8)*k16_8
1727 IF (info(1) .LT. 0)
THEN
1728 IF (
associated(scaling_data%SCALING_LOC))
THEN
1729 DEALLOCATE(scaling_data%SCALING_LOC)
1730 NULLIFY(scaling_data%SCALING_LOC)
subroutine mumps_propinfo(icntl, info, comm, id)
subroutine zgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
ZGEMV
subroutine ztrsv(uplo, trans, diag, n, a, lda, x, incx)
ZTRSV
subroutine zgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
ZGEMM
subroutine ztrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
ZTRSM
subroutine mpi_recv(buf, cnt, datatype, source, tag, comm, status, ierr)
subroutine mpi_send(buf, cnt, datatype, dest, tag, comm, ierr)
subroutine mpi_bcast(buffer, cnt, datatype, root, comm, ierr)
integer function zmumps_solve_is_inode_in_mem(inode, ptrfac, nsteps, a, la, ierr)
subroutine zmumps_solve_modify_state_node(inode)
subroutine, public zmumps_read_ooc(dest, inode, ierr)
integer function, public zmumps_ooc_panel_size(nnmax)
integer ooc_node_permuted
integer ooc_node_not_in_mem
subroutine, public zmumps_solve_alloc_factor_space(inode, ptrfac, keep, keep8, a, ierr)
subroutine zmumps_eltyd(mtype, n, nelt, eltptr, leltvar, eltvar, na_elt8, a_elt, saverhs, x, y, w, k50)
subroutine zmumps_solve_gemm_update(a, la, apos1, nx, lda, ny, nrhs_b, wcb, lwcb, ptrx, ldx, ptry, ldy, mtype, keep, coef_y)
subroutine zmumps_solve_fwd_panels(a, la, apos, npiv, iw, nrhs_b, wcb, lwcb, lda_wcb, ppiv_courant, mtype, keep)
subroutine zmumps_solve_get_ooc_node(inode, ptrfac, keep, a, la, step, keep8, n, must_be_permuted, ierr)
subroutine zmumps_scal_x(a, nz8, n, irn, icn, z, keep, keep8, colsca, eff_size_schur, sym_perm)
subroutine zmumps_solve_bwd_trsolve(a, la, apos, npiv, ldadiag, nrhs_b, wcb, lwcb, lda_wcb, ppiv_courant, mtype, keep)
subroutine zmumps_sol_ld_and_reload(inode, n, npiv, liell, nelim, nslaves, ppiv_courant, iw, ipos, liw, a, la, apos, wcb, lwcb, ld_wcbpiv, rhscomp, lrhscomp, nrhs, posinrhscomp_fwd, jbdeb, jbfin, mtype, keep, oocwrite_compatible_with_blr, ignore_k459)
subroutine zmumps_eltqd2(mtype, n, nelt, eltptr, leltvar, eltvar, na_elt8, a_elt, lhs, wrhs, w, rhs, keep, keep8)
subroutine zmumps_sol_b(n, kase, x, est, w, iw, grain)
subroutine zmumps_solve_fwd_trsolve(a, la, apos, npiv, ldadiag, nrhs_b, wcb, lwcb, lda_wcb, ppiv_courant, mtype, keep)
subroutine zmumps_sol_x(a, nz8, n, irn, icn, z, keep, keep8, eff_size_schur, sym_perm)
subroutine zmumps_sol_y(a, nz8, n, irn, icn, rhs, x, r, w, keep, keep8)
subroutine zmumps_sol_bwd_gthr(jbdeb, jbfin, j1, j2, rhscomp, nrhs, lrhscomp, w, ld_w, first_row_w, iw, liw, keep, n, posinrhscomp_bwd)
subroutine zmumps_sol_x_elt(mtype, n, nelt, eltptr, leltvar, eltvar, na_elt8, a_elt, w, keep, keep8)
subroutine zmumps_qd2(mtype, n, nz8, aspk, irn, icn, lhs, wrhs, w, rhs, keep, keep8)
subroutine zmumps_sol_cpy_fs2rhscomp(jbdeb, jbfin, nbrows, keep, rhscomp, nrhs, lrhscomp, first_row_rhscomp, w, ld_w, first_row_w)
subroutine zmumps_sol_lcond(n, rhs, x, y, d, r_w, c_w, iw, kase, omega, erx, cond, lp, keep, keep8)
subroutine zmumps_build_mapping_info(id)
subroutine zmumps_sol_scalx_elt(mtype, n, nelt, eltptr, leltvar, eltvar, na_elt8, a_elt, w, keep, keep8, colsca)
subroutine zmumps_sol_omega(n, rhs, x, y, r_w, c_w, iw, iflag, omega, noiter, testconv, lp, arret, grain)
subroutine zmumps_sol_q(mtype, iflag, n, lhs, wrhs, w, res, givnorm, anorm, xnorm, sclnrm, mprint, icntl, keep, keep8)
subroutine zmumps_sol_mulr(n, r, w)
subroutine zmumps_sol_ld_and_reload_panel(inode, n, npiv, liell, nelim, nslaves, ppiv_courant, iw, ipos, liw, a, la, apos, wcb, lwcb, ld_wcbpiv, rhscomp, lrhscomp, nrhs, posinrhscomp_fwd, jbdeb, jbfin, mtype, keep, oocwrite_compatible_with_blr, ignore_k459)
subroutine zmumps_solve_bwd_panels(a, la, apos, npiv, iw, nrhs_b, wcb, lwcb, lda_wcb, ppiv_courant, mtype, keep)
subroutine zmumps_compso(n, keep28, iwcb, liww, w, lwc, poswcb, iwposcb, ptricb, ptracb)
subroutine zmumps_set_scaling_loc(scaling_data, n, iloc, liloc, comm, myid, i_am_slave, master, nb_bytes, nb_bytes_max, k16_8, lp, lpok, icntl, info)
subroutine zmumps_freetopso(n, keep28, iwcb, liww, w, lwc, poswcb, iwposcb, ptricb, ptracb)