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 DOUBLE PRECISION 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 DOUBLE PRECISION 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+1),8)
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 DOUBLE PRECISION,
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 DOUBLE PRECISION,
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
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 DOUBLE PRECISION,
INTENT(IN) :: A(NZ8), RHS(N), X(N)
230 DOUBLE PRECISION,
INTENT(OUT) :: W()
231 DOUBLE PRECISION,
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. 1) .OR.
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 DOUBLE PRECISION,
intent(inout) :: R(N)
304 INTEGER,
intent(in) :: N
305 INTEGER,
intent(inout) :: KASE
307 DOUBLE PRECISION W(N), X(N)
308 DOUBLE PRECISION,
intent(inout) :: EST
309 INTEGER,
intent(in) :: GRAIN
310 INTRINSIC abs, nint, real, sign
311 INTEGER DMUMPS_IXAMAX
312 EXTERNAL dmumps_ixamax
315 INTEGER I, ITER, J, JLAST, JUMP
316 DOUBLE PRECISION ALTSGN
317 DOUBLE PRECISION TEMP
318 SAVE iter, j, jlast, jump
319 DOUBLE PRECISION ZERO
321 parameter( one = 1.0d0 )
322 DOUBLE PRECISION,
PARAMETER :: RZERO = 0.0d0
323 DOUBLE PRECISION,
PARAMETER :: RONE = 1.0d0
324 IF (kase .EQ. 0)
THEN
352 x(i) = sign( rone,dble(x(i)) )
353 iw(i) = nint(dble(x(i)))
359 j = dmumps_ixamax(n, x, 1, grain)
374 IF (nint(sign(rone, dble(x(i)))) .NE. iw(i))
GOTO 100
379 x(i) = sign(rone, dble(x(i)))
380 iw(i) = nint(dble(x(i)))
387 j = dmumps_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) = altsgn * (rone + dble(i - 1) / dble(n - 1))
408 temp = temp + abs(x(i))
410 temp = 2.0d0 * temp / dble(3 * n)
411 IF (temp .GT. est)
THEN
421 & LHS, WRHS, W, RHS, KEEP,KEEP8)
424 INTEGER(8),
INTENT(IN) :: NZ8
425 INTEGER,
INTENT(IN) :: IRN( NZ8 ), ICN( NZ8 )
427 INTEGER(8) KEEP8(150)
428 DOUBLE PRECISION,
INTENT(IN) :: ASPK( NZ8 )
429 DOUBLE PRECISION,
INTENT(IN) :: LHS( N ), WRHS( N )
430 DOUBLE PRECISION,
INTENT(OUT):: RHS( N )
431 DOUBLE PRECISION,
INTENT(OUT):: W( N )
434 DOUBLE PRECISION,
PARAMETER :: DZERO = 0.0d0
439 IF ( keep(50) .EQ. 0 )
THEN
440 IF (mtype .EQ. 1)
THEN
441 IF (keep(264).EQ.0)
THEN
445 IF ((i .LE. 0) .OR. (i .GT. n) .OR. (j .LE. 0) .OR.
447 rhs(i) = rhs(i) - aspk(k8) * lhs(j)
448 w(i) = w(i) + abs(aspk(k8))
454 rhs(i) = rhs(i) - aspk(k8) * lhs(j)
455 w(i) = w(i) + abs(aspk(k8))
459 IF (keep(264).EQ.0)
THEN
463 IF ((i .LE. 0) .OR. (i .GT. n) .OR. (j .LE. 0) .OR.
465 rhs(j) = rhs(j) - aspk(k8) * lhs(i)
466 w(j) = w(j) + abs(aspk(k8))
472 rhs(j) = rhs(j) - aspk(k8) * lhs(i)
473 w(j) = w(j) + abs(aspk(k8))
478 IF (keep(264).EQ.0)
THEN
482 IF ((i .LE. 0) .OR. (i .GT. n) .OR. (j .LE. 0) .OR.
484 rhs(i) = rhs(i) - aspk(k8) * lhs(j)
485 w(i) = w(i) + abs(aspk(k8))
487 rhs(j) = rhs(j) - aspk(k8
488 w(j) = w(j) + abs(aspk(k8))
495 rhs(i) = rhs(i) - aspk(k8) * lhs(j)
496 w(i) = w(i) + abs(aspk(k8))
498 rhs(j) = rhs(j) - aspk(k8) * lhs(i)
499 w(j) = w(j) + abs(aspk(k8))
507 & NELT, ELTPTR, LELTVAR, ELTVAR, NA_ELT8, A_ELT,
508 & LHS, WRHS, W, RHS, KEEP,KEEP8 )
510 INTEGER MTYPE, N, NELT, LELTVAR
511 INTEGER(8),
INTENT(IN) :: NA_ELT8
512 INTEGER ELTPTR(NELT+1), ELTVAR(LELTVAR)
514 INTEGER(8) KEEP8(150)
515 DOUBLE PRECISION A_ELT(NA_ELT8)
516 DOUBLE PRECISION LHS( N ), WRHS( N ), RHS( N )
517 DOUBLE PRECISION W(N)
522 & nelt, eltptr, leltvar, eltvar, na_elt8, a_elt,
527 & NELT, ELTPTR, LELTVAR, ELTVAR, NA_ELT8, A_ELT,
530 INTEGER MTYPE, N, , LELTVAR
531 INTEGER(8),
INTENT(IN) :: NA_ELT8
532 INTEGER ELTPTR(NELT+1), ELTVAR(LELTVAR)
534 INTEGER(8) KEEP8(150)
535 DOUBLE PRECISION (NA_ELT8)
536 DOUBLE PRECISION TEMP
537 DOUBLE PRECISION W(N)
538 INTEGER I, J, IEL, SIZEI, IELPTR
540 DOUBLE PRECISION DZERO
541 parameter(dzero = 0.0d0)
545 sizei = eltptr( iel + 1 ) - eltptr( iel )
546 ielptr = eltptr( iel ) - 1
547 IF ( keep(50).EQ.0 )
THEN
551 w( eltvar( ielptr + i) ) =
552 & w( eltvar( ielptr + i) )
559 temp = w( eltvar( ielptr + j ) )
561 temp = temp + abs( a_elt(k8))
564 w(eltvar( ielptr + j )) =
565 & w(eltvar( ielptr + j )) + temp
570 w(eltvar( ielptr + j )) =
571 & w(eltvar( ielptr + j )) + abs(a_elt( k8 ))
574 w(eltvar( ielptr + j )) =
575 & w(eltvar( ielptr + j )) + abs(a_elt( k8 ))
576 w(eltvar( ielptr + i ) ) =
577 & w(eltvar( ielptr + i )) + abs(a_elt( k8 ))
586 & NELT, ELTPTR, LELTVAR, ELTVAR, NA_ELT8, A_ELT,
587 & W, KEEP,KEEP8, COLSCA )
590INTEGER(8),
INTENT(IN) :: NA_ELT8
591 INTEGER ELTPTR(NELT+1), ELTVAR(LELTVAR)
593 INTEGER(8) KEEP8(150)
594 DOUBLE PRECISION COLSCA(N)
595 DOUBLE PRECISION (NA_ELT8)
596 DOUBLE PRECISION W(N)
597 DOUBLE PRECISION TEMP, TEMP2
598 INTEGER I, J, IEL, SIZEI, IELPTR
600 DOUBLE PRECISION DZERO
601 parameter(dzero = 0.0d0)
605 sizei = eltptr( iel + 1 ) - eltptr( iel )
606 ielptr = eltptr( iel ) - 1
607 IF ( keep(50).EQ.0 )
THEN
610 temp2 = abs(colsca(eltvar( ielptr + j) ))
612 w( eltvar( ielptr + i) ) =
613 & w( eltvar( ielptr + i) )
614 & + abs(a_elt( k8 )) * temp2
620 temp = w( eltvar( ielptr + j ) )
621 temp2= abs(colsca(eltvar( ielptr + j) ))
623 temp = temp + abs(a_elt( k8 )) * temp2
626 w(eltvar( ielptr + j )) =
627 & w(eltvar( ielptr + j )) + temp
632 w(eltvar( ielptr + j )) =
633 & w(eltvar( ielptr + j )) +
634 & abs( a_elt( k8 )*colsca(eltvar( ielptr + j)) )
637 w(eltvar( ielptr + j )) =
638 & w(eltvar( ielptr + j )) +
639 & abs(a_elt( k8 )*colsca(eltvar( ielptr + j)))
640 w(eltvar( ielptr + i ) ) =
641 & w(eltvar( ielptr + i )) +
642 & abs(a_elt( k8 )*colsca(eltvar( ielptr + i)))
651 & LELTVAR, ELTVAR, NA_ELT8, A_ELT,
652 & SAVERHS, X, Y, W, K50 )
654 INTEGER N, NELT, K50, MTYPE, LELTVAR
655 INTEGER(8) :: NA_ELT8
656 INTEGER ELTPTR( NELT + 1 ), ELTVAR( LELTVAR )
657 DOUBLE PRECISION A_ELT( NA_ELT8 ), X( N ), Y( N ),
659 DOUBLE PRECISION W(N)
660 INTEGER IEL, I , J, K, SIZEI, IELPTR
661 DOUBLE PRECISION ZERO
662 DOUBLE PRECISION TEMP
663 DOUBLE PRECISION TEMP2
664 parameter( zero = 0.0d0 )
669 sizei = eltptr( iel + 1 ) - eltptr( iel )
670 ielptr = eltptr( iel ) - 1
671 IF ( k50 .eq. 0 )
THEN
672 IF ( mtype .eq. 1 )
THEN
674 temp = x( eltvar( ielptr + j ) )
676 y( eltvar( ielptr + i ) ) =
677 & y( eltvar( ielptr + i ) ) -
679 w( eltvar( ielptr + i ) ) =
680 & w( eltvar( ielptr + i ) ) +
681 & abs( a_elt( k ) * temp )
687 temp = y( eltvar( ielptr + j ) )
688 temp2 = w( eltvar( ielptr + j ) )
691 & a_elt( k ) * x( eltvar( ielptr + i ) )
693 & a_elt( k ) * x( eltvar( ielptr + i ) ) )
696 y( eltvar( ielptr + j ) ) = temp
697 w( eltvar( ielptr + j ) ) = temp2
702 y( eltvar( ielptr + j ) ) =
703 & y( eltvar( ielptr + j ) ) -
704 & a_elt( k ) * x( eltvar( ielptr + j ) )
705 w( eltvar( ielptr + j ) ) =
706 & w( eltvar( ielptr + j ) ) + abs(
707 & a_elt( k ) * x( eltvar( ielptr + j ) ) )
710 y( eltvar( ielptr + i ) ) =
711 & y( eltvar( ielptr + i ) ) -
712 & a_elt( k ) * x( eltvar( ielptr + j ) )
713 y( eltvar( ielptr + j ) ) =
714 & y( eltvar( ielptr + j ) ) -
715 & a_elt( k ) * x( eltvar( ielptr + i ) )
716 w( eltvar( ielptr + i ) ) =
717 & w( eltvar( ielptr + i ) ) + abs(
718 & a_elt( k ) * x( eltvar( ielptr + j ) ) )
719 w( eltvar( ielptr + j ) ) =
720 & w( eltvar( ielptr + j ) ) + abs(
721 & a_elt( k ) * x( eltvar( ielptr + i ) ) )
730 & INODE,PTRFAC,KEEP,A,LA,STEP,
731 & KEEP8,N,MUST_BE_PERMUTED,IERR)
734 INTEGER INODE,(500),N
735 INTEGER(8) KEEP8(150)
737 INTEGER(8) :: PTRFAC(KEEP(28))
740 DOUBLE PRECISION A(LA)
742 LOGICAL MUST_BE_PERMUTED
744 & keep(28),a,la,ierr)
755 & a(ptrfac(step(inode))),
767 must_be_permuted=.true.
770 must_be_permuted=.false.
778 TYPE(dmumps_struc),
TARGET :: id
779 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: LOCAL_LIST
780 INTEGER :: I,IERR,TMP,NSTEPS,N_LOCAL_LIST
781 INTEGER :: MASTER,TAG_SIZE,TAG_LIST
782 INTEGER :: STATUS(MPI_STATUS_SIZE)
783 LOGICAL :: I_AM_SLAVE
784 parameter(master=0, tag_size=85,tag_list=86)
785 i_am_slave = (id%MYID .NE. master
786 & .OR. ((id%MYID.EQ.master).AND.(id%KEEP(46).EQ.1)))
788 ALLOCATE(local_list(nsteps),stat=ierr)
790 WRITE(*,*)
'Problem in solve: error allocating LOCAL_LIST'
796 IF(id%PTLUST_S(i).NE.0)
THEN
797 n_local_list = n_local_list + 1
798 local_list(n_local_list) = i
801 IF(id%MYID.NE.master)
THEN
803 & mpi_integer, master, tag_size, id%COMM,ierr)
804 CALL mpi_send(local_list, n_local_list,
805 & mpi_integer, master, tag_list, id%COMM,ierr)
806 DEALLOCATE(local_list)
807 ALLOCATE(id%IPTR_WORKING(1),
811 WRITE(*,*)
'Problem in solve: error allocating ',
812 &
'IPTR_WORKING and WORKING'
817 IF(id%MYID.EQ.master)
THEN
818 ALLOCATE(id%IPTR_WORKING(id%NPROCS+1), stat=ierr)
820 WRITE(*,*)
'Problem in solve: error allocating IPTR_WORKING'
824 id%IPTR_WORKING(1) = 1
825 id%IPTR_WORKING(master+2) = n_local_list
828 & tag_size, id%COMM, status, ierr)
829 id%IPTR_WORKING(status(mpi_source)+2) = tmp
832 id%IPTR_WORKING(i) = id%IPTR_WORKING(i)
833 & + id%IPTR_WORKING(i-1)
835 ALLOCATE(id%WORKING(id%IPTR_WORKING(id%NPROCS+1)-1),stat=ierr)
837 WRITE(*,*)
'Problem in solve: error allocating LOCAL_LIST'
842 id%WORKING(id%IPTR_WORKING(tmp):id%IPTR_WORKING(tmp+1)-1)
843 & = local_list(1:id%IPTR_WORKING(tmp+1)
844 & -id%IPTR_WORKING(tmp))
847 CALL mpi_recv(local_list, nsteps, mpi_integer,
848 & mpi_any_source, tag_list, id%COMM, status, ierr)
849 tmp = status(mpi_source)+1
850 id%WORKING(id%IPTR_WORKING(tmp):id%IPTR_WORKING(tmp+1)-1)
851 & = local_list(1:id%IPTR_WORKING(tmp+1)-
852 & id%IPTR_WORKING(tmp))
854 DEALLOCATE(local_list)
858 & X, Y, R_W, C_W, IW, IFLAG,
859 & OMEGA, NOITER, TESTConv,
864 DOUBLE PRECISION RHS(N)
865 DOUBLE PRECISION X(N), Y(N)
866 DOUBLE PRECISION R_W(N,2)
867 DOUBLE PRECISION C_W(N)
870 DOUBLE PRECISION OMEGA(2)
872 INTEGER,
intent(in) :: GRAIN
873 DOUBLE PRECISION,
PARAMETER :: CGCE=0.2d0
874 DOUBLE PRECISION,
PARAMETER :: CTAU=1.0d3
876 DOUBLE PRECISION OM1, OM2, DXMAX
877 DOUBLE PRECISION TAU, DD
878 DOUBLE PRECISION OLDOMG(2)
879 DOUBLE PRECISION,
PARAMETER :: ZERO=0.0d0
880 DOUBLE PRECISION,
PARAMETER :: ONE=1.0d0
881 INTEGER DMUMPS_IXAMAX
884 imax = dmumps_ixamax(n, x, 1, grain)
889 tau = (r_w(i, 2) * dxmax + abs(rhs(i))) * dble(n) * ctau
890 dd = r_w(i, 1) + abs(rhs(i))
891 IF (dd .GT. tau * epsilon(ctau))
THEN
892 omega(1) =
max(omega(1), abs(y(i)) / dd)
895 IF (tau .GT. zero)
THEN
896 omega(2) =
max(omega(2),
897 & abs(y(i)) / (dd + r_w(i, 2) * dxmax
903 om2 = omega(1) + omega(2)
904 IF (om2 .LT.
arret )
THEN
908 IF (noiter .GE. 1)
THEN
909 IF (om2 .GT. om1 * cgce)
THEN
910 IF (om2 .GT. om1)
THEN
936 & X, Y, D, R_W, C_W, IW, KASE,
940 INTEGER N, KASE, KEEP(500)
941 INTEGER(8) KEEP8(150)
943 DOUBLE PRECISION RHS(N)
944 DOUBLE PRECISION X(N), Y(N)
945 DOUBLE PRECISION D(N)
946 DOUBLE PRECISION (N,2)
947 DOUBLE PRECISION C_W(N)
949 DOUBLE PRECISION COND(2),OMEGA(2)
950 LOGICAL LCOND1, LCOND2
951 INTEGER JUMP, I, IMAX
952 DOUBLE PRECISION ERX, DXMAX
953 DOUBLE PRECISION DXIMAX
954 DOUBLE PRECISION,
PARAMETER :: ZERO = 0.0d0
955 DOUBLE PRECISION,
PARAMETER :: ONE = 1.0d0
956 INTEGER DMUMPS_IXAMAX
958 SAVE lcond1, lcond2, jump, dximax, dxmax
959 IF (kase .EQ. 0)
THEN
983 imax = dmumps_ixamax(n, x, 1, keep(361))
986 IF (iw(i, 1) .EQ. 1)
THEN
987 r_w(i, 1) = r_w(i, 1) + abs(rhs(i))
991 r_w(i, 2) = r_w(i, 2) * dxmax + r_w(i, 1)
999 imax = dmumps_ixamax(n, c_w(1), 1, keep(361))
1000 dximax = abs(c_w(imax))
1001 IF (.NOT.lcond1)
GOTO 130
1003 CALL dmumps_sol_b(n, kase, y, cond(1), c_w, iw(1, 2), keep(361))
1004 IF (kase .EQ. 0)
GOTO 120
1014 IF (dximax .GT. zero) cond(1) = cond(1) / dximax
1015 erx = omega(1) * cond(1)
1017 IF (.NOT.lcond2)
GOTO 170
1020 CALL dmumps_sol_b(n, kase, y, cond(2), c_w, iw(1, 2), keep(361))
1021 IF (kase .EQ. 0)
GOTO 160
1030 160
IF (dximax .GT. zero)
THEN
1031 cond(2) = cond(2) / dximax
1033 erx = erx + omega(2) * cond(2)
1038 & KEEP, RHSCOMP, NRHS, LRHSCOMP, FIRST_ROW_RHSCOMP, W, LD_W,
1040 INTEGER :: JBDEB, JBFIN, NBROWS
1041 INTEGER :: NRHS, LRHSCOMP
1042 INTEGER :: FIRST_ROW_RHSCOMP
1043 INTEGER,
INTENT(IN) :: KEEP(500)
1044 DOUBLE PRECISION,
INTENT(INOUT) :: RHSCOMP(LRHSCOMP,NRHS)
1045 INTEGER :: LD_W, FIRST_ROW_W
1046 DOUBLE PRECISION :: (LD_W*(JBFIN-JBDEB+1))
1047 INTEGER :: JJ, K, ISHIFT
1052 ishift = first_row_w + ld_w * (k-jbdeb)
1054 rhscomp(first_row_rhscomp+jj,k) = w(ishift+jj)
1061 & RHSCOMP, NRHS, LRHSCOMP, W, LD_W, FIRST_ROW_W,
1062 & IW, LIW, KEEP, N, POSINRHSCOMP_BWD )
1063 INTEGER,
INTENT(IN) :: JBDEB, JBFIN, J1, J2
1064 INTEGER,
INTENT(IN) :: NRHS, LRHSCOMP
1065 INTEGER,
INTENT(IN) :: FIRST_ROW_W, LD_W, LIW
1066 INTEGER,
INTENT(IN) :: IW(LIW)
1067 INTEGER,
INTENT(IN) :: KEEP(500)
1068 DOUBLE PRECISION,
INTENT(INOUT) :: RHSCOMP(LRHSCOMP,NRHS)
1069 DOUBLE PRECISION :: W(LD_W*(JBFIN-JBDEB+1))
1070 INTEGER,
INTENT(IN) :: N
1071 INTEGER,
INTENT(IN) :: POSINRHSCOMP_BWD(N)
1072 INTEGER :: ISHIFT, JJ, K, IPOSINRHSCOMP
1077 ishift = first_row_w+(k-jbdeb)*ld_w
1078 DO jj = j1, j2-keep(253)
1079 iposinrhscomp = abs(posinrhscomp_bwd(iw(jj)))
1080 w(ishift+jj-j1)= rhscomp(iposinrhscomp,k)
1087 & LHS, WRHS, W, RES, GIVNORM, ANORM, XNORM, SCLNRM,
1088 & MPRINT, ICNTL, KEEP,KEEP8)
1089 INTEGER MTYPE,N,IFLAG,ICNTL(60), KEEP(500)
1090 INTEGER(8) KEEP8(150)
1091 DOUBLE PRECISION RES(N),(N)
1092 DOUBLE PRECISION WRHS(N)
1093 DOUBLE PRECISION W(N)
1094 DOUBLE PRECISION RESMAX,RESL2,XNORM, SCLNRM
1095 DOUBLE PRECISION ANORM,DZERO
1096 LOGICAL GIVNORM,PROK
1099 INTRINSIC abs,
max, sqrt
1101 prok = (mprint .GT. 0)
1103 IF (.NOT.givnorm) anorm = dzero
1107 resmax =
max(resmax, abs(res(k)))
1108 resl2 = resl2 + abs(res(k)) * abs(res(k))
1109 IF (.NOT.givnorm) anorm =
max(anorm, w(k))
1113 xnorm =
max(xnorm, abs(lhs(k)))
1115 IF ( xnorm .EQ. dzero .OR. (exponent(xnorm) .LT.
1116 & minexponent(xnorm) + keep(122) )
1118 & ( exponent(anorm)+exponent(xnorm) .LT.
1119 & minexponent(xnorm) + keep(122) )
1121 & ( exponent(anorm) + exponent(xnorm) -exponent(resmax)
1122 & .LT. minexponent(xnorm) + keep(122) )
1124 IF (mod(iflag/2,2) .EQ. 0)
THEN
1127 IF ((mp .GT. 0) .AND. (icntl(4) .GE. 2))
WRITE( mp, * )
1128 &
' max-NORM of computed solut. is zero or close to zero. '
1130 IF (resmax .EQ. dzero)
THEN
1133 sclnrm = resmax / (anorm * xnorm)
1136 IF (prok)
WRITE( mprint, 90 ) resmax, resl2, anorm, xnorm,
1138 90
FORMAT (/
' RESIDUAL IS ............ (MAX-NORM) =',1pd9.2/
1139 &
' .. (2-NORM) =',1pd9.2/
1140 &
' RINFOG(4):NORM OF input Matrix (MAX-NORM)=',1pd9.2/
1141 &
' RINFOG(5):NORM OF Computed SOLUT (MAX-NORM)=',1pd9.2/
1142 &
' RINFOG(6):SCALED RESIDUAL ...... (MAX-NORM)=',1pd9.2)
1146 & NRHS_B, WCB, LWCB, LDA_WCB, PPIV_COURANT, MTYPE, KEEP)
1147 INTEGER,
INTENT(IN) :: MTYPE, LDADIAG, , KEEP(500)
1148 INTEGER,
INTENT(IN) :: NRHS_B, LDA_WCB
1149 INTEGER(8),
INTENT(IN) :: LA, APOS, LWCB, PPIV_COURANT
1150 DOUBLE PRECISION,
INTENT(IN) :: (LA)
1151 DOUBLE PRECISION,
INTENT(INOUT) :: WCB(LWCB)
1152 DOUBLE PRECISION ONE
1153 PARAMETER (ONE = 1.0d0)
1154 IF (keep(50).NE.0 .OR. mtype .eq. 1 )
THEN
1155#if defined(MUMPS_USE_BLAS2)
1156 IF ( nrhs_b == 1 )
THEN
1157 CALL dtrsv(
'U',
'T',
'U', npiv, a(apos), ldadiag,
1158 & wcb(ppiv_courant), 1 )
1161 CALL dtrsm(
'L',
'U',
'T',
'U', npiv, nrhs_b, one,
1162 & a(apos), ldadiag, wcb(ppiv_courant),
1164#if defined(MUMPS_USE_BLAS2)
1168#if defined(MUMPS_USE_BLAS2)
1169 IF ( nrhs_b == 1 )
THEN
1170 CALL dtrsv(
'L',
'N',
'N', npiv, a(apos), ldadiag,
1171 & wcb(ppiv_courant), 1 )
1174 CALL dtrsm(
'L',
'L',
'N',
'N', npiv, nrhs_b, one,
1175 & a(apos), ldadiag, wcb(ppiv_courant),
1177#if defined(MUMPS_USE_BLAS2)
1184 & NRHS_B, WCB, LWCB, LDA_WCB, PPIV_COURANT, MTYPE, KEEP)
1185 INTEGER,
INTENT(IN) :: MTYPE, LDADIAG, NPIV, KEEP(500)
1186 INTEGER,
INTENT(IN) :: NRHS_B, LDA_WCB
1187 INTEGER(8),
INTENT(IN) :: LA, APOS, LWCB, PPIV_COURANT
1188 DOUBLE PRECISION,
INTENT(IN) :: A(LA)
1189 DOUBLE PRECISION,
INTENT(INOUT) :: WCB(LWCB)
1190 DOUBLE PRECISION ONE
1191 PARAMETER (ONE = 1.0d0)
1192 IF (mtype .eq. 1 )
THEN
1193#if defined(MUMPS_USE_BLAS2)
1194 IF ( nrhs_b == 1 )
THEN
1195 CALL dtrsv(
'L',
'T',
'N', npiv, a(apos), ldadiag,
1196 & wcb(ppiv_courant), 1 )
1199 CALL dtrsm(
'L',
'L',
'T',
'N', npiv, nrhs_b, one,
1200 & a(apos), ldadiag, wcb(ppiv_courant),
1202#if defined(MUMPS_USE_BLAS2)
1206#if defined(MUMPS_USE_BLAS2)
1207 IF ( nrhs_b == 1 )
THEN
1208 CALL dtrsv(
'U',
'N',
'U', npiv, a(apos), ldadiag,
1209 & wcb(ppiv_courant), 1 )
1212 CALL dtrsm(
'L',
'U',
'N',
'U', npiv, nrhs_b, one,
1213 & a(apos), ldadiag, wcb(ppiv_courant),
1215#if defined(MUMPS_USE_BLAS2)
1222 & A, LA, APOS, NPIV, IW,
1223 & NRHS_B, WCB, LWCB, LDA_WCB,
1224 & PPIV_COURANT, MTYPE, KEEP)
1225 INTEGER,
INTENT(IN) :: MTYPE, , KEEP(500)
1226 INTEGER,
INTENT(IN) :: IW(NPIV)
1227 INTEGER,
INTENT(IN) :: NRHS_B, LDA_WCB
1228 INTEGER(8),
INTENT(IN) :: LA, APOS, LWCB, PPIV_COURANT
1229 DOUBLE PRECISION,
INTENT(IN) :: A(LA)
1230 DOUBLE PRECISION,
INTENT(INOUT) :: WCB(LWCB)
1231 INTEGER :: NB_TARGET
1233 INTEGER :: NBROWS_PANEL, NBCOLS_PANEL, ICOL_BEG, ICOL_END
1234 INTEGER(8) :: PANEL_APOS, PPIV_PANEL
1235 DOUBLE PRECISION,
PARAMETER :: ONE=1.0d0
1236 IF (keep(459) .LE. 1)
THEN
1237 WRITE(*,*)
" Internal error in DMUMPS_SOLVE_FWD_PANELS"
1245 ppiv_panel = ppiv_courant
1246 DO WHILE ( icol_beg .LE. npiv )
1247 nbpanels = nbpanels + 1
1248 icol_end =
min(nb_target * nbpanels, npiv)
1249 IF ( iw(icol_end) .LT. 0 ) icol_end=icol_end+1
1250 nbcols_panel = icol_end - icol_beg + 1
1252 & nbcols_panel, nbcols_panel,
1253 & nrhs_b, wcb, lwcb, lda_wcb, ppiv_panel, mtype, keep)
1254 IF ( nbrows_panel .GT. nbcols_panel )
THEN
1256 & panel_apos + int(nbcols_panel,8) * int(nbcols_panel,8),
1257 & nbcols_panel, nbcols_panel, nbrows_panel-nbcols_panel,
1258 & nrhs_b, wcb, lwcb, ppiv_panel, lda_wcb,
1259 & ppiv_panel+nbcols_panel, lda_wcb,
1260 & mtype, keep, one )
1262 icol_beg = icol_end + 1
1263 panel_apos = panel_apos + int(nbcols_panel,8) *
1264 & int(nbrows_panel,8)
1265 nbrows_panel = nbrows_panel - nbcols_panel
1266 ppiv_panel = ppiv_panel + nbcols_panel
1271 & A, LA, APOS, NPIV, IW,
1272 & NRHS_B, WCB, LWCB, LDA_WCB,
1273 & PPIV_COURANT, MTYPE, KEEP)
1274 INTEGER,
INTENT(IN) :: MTYPE, NPIV, KEEP(500)
1275 INTEGER,
INTENT(IN) :: IW(NPIV)
1276 INTEGER,
INTENT(IN) :: NRHS_B, LDA_WCB
1277 INTEGER(8),
INTENT(IN) :: LA, APOS, LWCB, PPIV_COURANT
1278 DOUBLE PRECISION,
INTENT(IN) :: A(LA)
1279 DOUBLE PRECISION,
INTENT(INOUT) :: (LWCB)
1280 INTEGER,
PARAMETER :: PANEL_TABSIZE = 20
1281 INTEGER(8) :: PANEL_POS(PANEL_TABSIZE)
1282 INTEGER :: PANEL_COL(PANEL_TABSIZE)
1283 INTEGER :: IPANEL, NBPANELS, NB_TARGET
1284 INTEGER :: NBROWS_PANEL, NBCOLS_PANEL
1285 INTEGER(8) :: PPIV_PANEL
1286 INTEGER :: MTYPE_TEMP
1287 DOUBLE PRECISION,
PARAMETER :: ONE=1.0d0
1288 IF (keep(459) .LE. 1)
THEN
1289 WRITE(*,*)
" Internal error 1 in DMUMPS_SOLVE_BWD_PANELS"
1292 IF ( keep(459)+1 .GT. panel_tabsize )
THEN
1293 WRITE(*,*)
" Internal error 2 in DMUMPS_SOLVE_BWD_PANELS"
1297 &nb_target, nbpanels, panel_col, panel_pos, panel_tabsize,
1299 DO ipanel = nbpanels, 1, -1
1300 nbcols_panel = panel_col( ipanel+1 ) - panel_col( ipanel )
1301 nbrows_panel = npiv - panel_col( ipanel ) + 1
1302 ppiv_panel = ppiv_courant + panel_col( ipanel ) - 1
1303 IF ( nbrows_panel .GT. nbcols_panel )
THEN
1306 & apos-1_8+panel_pos(ipanel)+
1307 & int(nbcols_panel,8)*int(nbcols_panel,8),
1308 & nbrows_panel-nbcols_panel, nbcols_panel,
1310 & nrhs_b, wcb, lwcb, ppiv_panel+nbcols_panel, lda_wcb,
1311 & ppiv_panel, lda_wcb,
1312 & mtype_temp, keep, one )
1315 & apos+panel_pos(ipanel)-1_8,
1316 & nbcols_panel, nbcols_panel,
1317 & nrhs_b, wcb, lwcb, lda_wcb, ppiv_panel, mtype, keep)
1322 & (a, la, apos1, nx, lda, ny,
1323 & nrhs_b, wcb, lwcb, ptrx, ldx,
1325 & mtype, keep, coef_y )
1326 INTEGER,
INTENT(IN) :: MTYPE, NY, NX, KEEP(500)
1327 INTEGER,
INTENT(IN) :: NRHS_B, LDY, LDA, LDX
1328 INTEGER(8),
INTENT(IN) :: LA, APOS1, LWCB, PTRX,
1330 DOUBLE PRECISION,
INTENT(IN) :: A(LA)
1331 DOUBLE PRECISION,
INTENT(INOUT) :: WCB(LWCB)
1332 DOUBLE PRECISION,
INTENT(IN) :: COEF_Y
1333 DOUBLE PRECISION ALPHA, ZERO, ONE
1334 PARAMETER ( = 0.0d0, one = 1.0d0, alpha=-1.0d0)
1335 IF ( nx .NE. 0 .AND. ny.NE.0 )
THEN
1336 IF ( mtype .eq. 1 )
THEN
1337#if defined(MUMPS_USE_BLAS2)
1338 IF ( nrhs_b == 1 )
THEN
1339 CALL dgemv(
'T', nx, ny, alpha, a(apos1),
1340 & lda, wcb(ptrx), 1, coef_y,
1344 CALL dgemm(
'T',
'N', ny, nrhs_b, nx, alpha,
1347#if defined(MUMPS_USE_BLAS2)
1351#if defined(MUMPS_USE_BLAS2)
1352 IF ( nrhs_b == 1 )
THEN
1353 CALL dgemv(
'N',ny, nx, alpha, a(apos1),
1354 & lda, wcb(ptrx), 1,
1355 & coef_y, wcb(ptry), 1 )
1358 CALL dgemm(
'N', 'n
', NY, NRHS_B, NX, ALPHA,
1359 & A(APOS1), LDA, WCB(PTRX), LDX,
1360 & COEF_Y, WCB(PTRY), LDY)
1361#if defined(MUMPS_USE_BLAS2)
1367 END SUBROUTINE DMUMPS_SOLVE_GEMM_UPDATE
1368 SUBROUTINE DMUMPS_SOL_LD_AND_RELOAD_PANEL (
1369 & INODE, N, NPIV, LIELL, NELIM, NSLAVES,
1373 & WCB, LWCB, LD_WCBPIV,
1374 & RHSCOMP, LRHSCOMP, NRHS,
1375 & POSINRHSCOMP_FWD, JBDEB, JBFIN,
1376 & MTYPE, KEEP, OOCWRITE_COMPATIBLE_WITH_BLR,
1381 INTEGER, INTENT(IN) :: MTYPE, INODE, N, NPIV, LIELL,
1383 INTEGER, INTENT(IN) :: LRHSCOMP, NRHS, LIW, JBDEB, JBFIN
1384 INTEGER, INTENT(IN) :: IW(LIW), IPOS, POSINRHSCOMP_FWD(N)
1385 INTEGER(8), INTENT(IN) :: LWCB, APOS, LA, PPIV_COURANT
1386 INTEGER, INTENT(IN) :: LD_WCBPIV
1387 INTEGER, INTENT(IN) :: KEEP(500)
1388 DOUBLE PRECISION, INTENT(IN) :: WCB( LWCB )
1389 DOUBLE PRECISION, INTENT(IN) :: A( LA )
1390 DOUBLE PRECISION, INTENT(INOUT) :: RHSCOMP(LRHSCOMP, NRHS)
1391 LOGICAL, INTENT(IN) :: OOCWRITE_COMPATIBLE_WITH_BLR
1392 LOGICAL, INTENT(IN) :: IGNORE_K459
1394 INTEGER :: IPOSINRHSCOMP, JJ, K, NBK,
1396 INTEGER(8) :: IFR8 , APOS1, APOS2, APOSOFF, IFR_ini8,
1398 DOUBLE PRECISION :: VALPIV, A11, A22, A12, DETPIV
1399 INTEGER, PARAMETER :: PANEL_TABSIZE = 20
1400 INTEGER(8) :: PANEL_POS(PANEL_TABSIZE)
1401 INTEGER :: PANEL_COL(PANEL_TABSIZE)
1402 INTEGER :: IPANEL, ICOL, NBPANELS, NB_TARGET
1405 DOUBLE PRECISION ONE
1406 PARAMETER (ONE = 1.0D0)
1407.EQ.
IF ( NPIV 0 ) RETURN
1408 NRHS_B = JBFIN-JBDEB+1
1409.EQ..OR..NE.
IF ( MTYPE 1 KEEP(50) 0 ) THEN
1413 J1 = IPOS + LIELL + 1
1414 J3 = IPOS + LIELL + NPIV
1416 IPOSINRHSCOMP = POSINRHSCOMP_FWD(IW(J1))
1417.eq.
IF ( KEEP(50) 0 ) THEN
1419.GE.
!$ OMP_FLAG=(int(NRHS_B,8)*int(NPIV,8)int(KEEP(363),8))
1421!$OMP PARALLEL DO PRIVATE(IFR8) COLLAPSE(2)
1423 DO IFR8 = 0_8, int(NPIV-1,8)
1424 RHSCOMP(IPOSINRHSCOMP+IFR8, K) =
1425 & WCB(PPIV_COURANT+(K-JBDEB)*LD_WCBPIV+IFR8)
1428!$OMP END PARALLEL DO
1431 DO IFR8 = 0_8, int(NPIV-1,8)
1432 RHSCOMP(IPOSINRHSCOMP+IFR8, K) =
1433 & WCB(PPIV_COURANT+(K-JBDEB)*LD_WCBPIV+IFR8)
1438 CALL MUMPS_LDLTPANEL_PANELINFOS( NPIV, KEEP, IW(IPOS+LIELL+1),
1439 & NB_TARGET, NBPANELS, PANEL_COL, PANEL_POS, PANEL_TABSIZE,
1441 IFR_ini8 = PPIV_COURANT
1442.GE..AND.
!$ OMP_FLAG = ( JBFIN-JBDEB+1KEEP(362)
1443.GE.
!$ & ((J3-J1+1)*(JBFIN-JBDEB+1) KEEP(363)))
1444!$OMP PARALLEL DO PRIVATE(JJ,IFR8,NBK,APOS1,APOS2,APOSOFF,VALPIV,
1446!$OMP& POSWCB1,POSWCB2,A11,A22,A12,DETPIV,LDAJ,SKIP_IT)
1450 IPANEL = (JJ-J1)/NB_TARGET + 1
1451.LT.
IF ( JJ-J1+1 PANEL_COL(IPANEL) ) IPANEL = IPANEL -1
1452 ICOL = JJ-J1+1 - PANEL_COL(IPANEL) + 1
1453 LDAJ = PANEL_COL(IPANEL+1) - PANEL_COL(IPANEL)
1454 APOS1 = APOS-1_8+PANEL_POS( IPANEL ) + int(ICOL-1,8) *
1456 IFR8 = IFR_ini8 + int(K-JBDEB,8)*int(LD_WCBPIV,8) +
1458.NE.
IF ( JJ J1 ) THEN
1459.LT.
IF ( IW(LIELL+JJ-1) 0 ) THEN
1468.GT.
ELSE IF ( IW(JJ+LIELL) 0 ) THEN
1469 VALPIV = ONE/A( APOS1 )
1470 RHSCOMP(IPOSINRHSCOMP+JJ-J1 , K ) =
1471 & WCB( IFR8 ) * VALPIV
1472 APOS1 = APOS1 + int(LDAJ + 1,8)
1474 APOS2 = APOS1+int(LDAJ+1,8)
1479 DETPIV = A11*A22 - A12**2
1481 A11 = A(APOS2)/DETPIV
1484 POSWCB2 = POSWCB1+1_8
1485 RHSCOMP(IPOSINRHSCOMP+JJ-J1,K) =
1487 & + WCB(POSWCB2)*A12
1488 RHSCOMP(IPOSINRHSCOMP+JJ-J1+1,K) =
1490 & + WCB(POSWCB2)*A22
1494!$OMP END PARALLEL DO
1497 END SUBROUTINE DMUMPS_SOL_LD_AND_RELOAD_PANEL
1498 SUBROUTINE DMUMPS_SOL_LD_AND_RELOAD (
1499 & INODE, N, NPIV, LIELL, NELIM, NSLAVES,
1503 & WCB, LWCB, LD_WCBPIV,
1504 & RHSCOMP, LRHSCOMP, NRHS,
1505 & POSINRHSCOMP_FWD, JBDEB, JBFIN,
1506 & MTYPE, KEEP, OOCWRITE_COMPATIBLE_WITH_BLR,
1510 INTEGER, INTENT(IN) :: MTYPE, INODE, N, NPIV, LIELL,
1512 INTEGER, INTENT(IN) :: LRHSCOMP, NRHS, LIW, JBDEB, JBFIN
1513 INTEGER, INTENT(IN) :: IW(LIW), IPOS, POSINRHSCOMP_FWD(N)
1514 INTEGER(8), INTENT(IN) :: LWCB, APOS, LA, PPIV_COURANT
1515 INTEGER, INTENT(IN) :: LD_WCBPIV
1516 INTEGER, INTENT(IN) :: KEEP(500)
1517 DOUBLE PRECISION, INTENT(IN) :: WCB( LWCB )
1518 DOUBLE PRECISION, INTENT(IN) :: A( LA )
1519 DOUBLE PRECISION, INTENT(INOUT) :: RHSCOMP(LRHSCOMP, NRHS)
1520 LOGICAL, INTENT(IN) :: OOCWRITE_COMPATIBLE_WITH_BLR
1521 LOGICAL, INTENT(IN) :: IGNORE_K459
1522 INTEGER :: TempNROW, J1, J3, PANEL_SIZE, TYPEF
1523 INTEGER :: IPOSINRHSCOMP, JJ, K, NBK, LDAJ,
1524 & LDAJ_ini, NBK_ini, LDAJ_FIRST_PANEL, NRHS_B
1525 INTEGER(8) :: IFR8 , APOS1, APOS2, APOSOFF, IFR_ini8,
1527 DOUBLE PRECISION :: VALPIV, A11, A22, A12, DETPIV
1528!$ LOGICAL :: OMP_FLAG
1529 DOUBLE PRECISION ONE
1530 PARAMETER (ONE = 1.0D0)
1531 NRHS_B = JBFIN-JBDEB+1
1532.EQ..OR..NE.
IF ( MTYPE 1 KEEP(50) 0 ) THEN
1536 J1 = IPOS + LIELL + 1
1537 J3 = IPOS + LIELL + NPIV
1539 IPOSINRHSCOMP = POSINRHSCOMP_FWD(IW(J1))
1540.eq.
IF ( KEEP(50) 0 ) THEN
1541.GE..AND..GE.
!$ OMP_FLAG=(NRHS_BKEEP(362)NRHS_B*NPIVKEEP(363))
1542!$OMP PARALLEL DO PRIVATE(IFR8) IF (OMP_FLAG)
1544 IFR8 = PPIV_COURANT + (K-JBDEB)*LD_WCBPIV
1545 RHSCOMP(IPOSINRHSCOMP:IPOSINRHSCOMP+NPIV-1, K) =
1546 & WCB(IFR8:IFR8+int(NPIV-1,8))
1548!$OMP END PARALLEL DO
1550 IFR8 = PPIV_COURANT - 1_8
1551.EQ..AND.
IF (KEEP(201)1OOCWRITE_COMPATIBLE_WITH_BLR) THEN
1552.EQ.
IF (MTYPE1) THEN
1553.EQ..AND..NE.
IF ((MTYPE1)NSLAVES0) THEN
1554 TempNROW= NPIV+NELIM
1555 LDAJ_FIRST_PANEL=TempNROW
1558 LDAJ_FIRST_PANEL=TempNROW
1563 LDAJ_FIRST_PANEL=LIELL
1566 PANEL_SIZE = DMUMPS_OOC_PANEL_SIZE( LDAJ_FIRST_PANEL )
1569.GT..AND..NE.
IF ( KEEP(459) 1 KEEP(50) 0
1570.AND..NOT.
& IGNORE_K459 ) THEN
1571 CALL MUMPS_LDLTPANEL_NBTARGET( NPIV, PANEL_SIZE, KEEP )
1578.EQ..AND.
IF (KEEP(201)1OOCWRITE_COMPATIBLE_WITH_BLR) THEN
1581 IFR_ini8 = PPIV_COURANT - 1_8
1583.EQ..AND.
IF (KEEP(201)1OOCWRITE_COMPATIBLE_WITH_BLR)
1585.GE..AND.
!$ OMP_FLAG = ( JBFIN-JBDEB+1KEEP(362)
1586.GE.
!$ & ((J3-J1+1)*(JBFIN-JBDEB+1) KEEP(363)))
1587!$OMP PARALLEL DO PRIVATE(JJ,IFR8,NBK,APOS1,APOS2,APOSOFF,VALPIV,
1588!$OMP& POSWCB1, POSWCB2,A11,A22,A12,DETPIV,LDAJ) IF(OMP_FLAG)
1590 IFR8 = IFR_ini8 + int(K-JBDEB,8)*int(LD_WCBPIV,8)
1598.GT.
IF (IW(JJ+LIELL) 0) THEN
1599 VALPIV = ONE/A( APOS1 )
1600 RHSCOMP(IPOSINRHSCOMP+JJ-J1 , K ) =
1601 & WCB( IFR8 ) * VALPIV
1602.EQ..AND.
IF (KEEP(201)1OOCWRITE_COMPATIBLE_WITH_BLR)
1605.EQ.
IF (NBKPANEL_SIZE) THEN
1607 LDAJ = LDAJ - PANEL_SIZE
1610 APOS1 = APOS1 + int(LDAJ + 1,8)
1613.EQ..AND.
IF (KEEP(201)1OOCWRITE_COMPATIBLE_WITH_BLR)
1617 APOS2 = APOS1+int(LDAJ+1,8)
1618.EQ..AND.
IF (KEEP(201)1OOCWRITE_COMPATIBLE_WITH_BLR)
1620 APOSOFF = APOS1+int(LDAJ,8)
1627 DETPIV = A11*A22 - A12**2
1629 A11 = A(APOS2)/DETPIV
1632 POSWCB2 = POSWCB1+1_8
1633 RHSCOMP(IPOSINRHSCOMP+JJ-J1,K) =
1635 & + WCB(POSWCB2)*A12
1636 RHSCOMP(IPOSINRHSCOMP+JJ-J1+1,K) =
1638 & + WCB(POSWCB2)*A22
1639.EQ..AND.
IF (KEEP(201)1OOCWRITE_COMPATIBLE_WITH_BLR)
1642.GE.
IF (NBKPANEL_SIZE) THEN
1647 APOS1 = APOS2 + int(LDAJ + 1,8)
1653!$OMP END PARALLEL DO
1656 END SUBROUTINE DMUMPS_SOL_LD_AND_RELOAD
1657 SUBROUTINE DMUMPS_SET_SCALING_LOC( scaling_data, N, ILOC, LILOC,
1658 & COMM, MYID, I_AM_SLAVE, MASTER, NB_BYTES, NB_BYTES_MAX,
1659 & K16_8, LP, LPOK, ICNTL, INFO )
1663 DOUBLE PRECISION, dimension(:), pointer :: SCALING
1664 DOUBLE PRECISION, dimension(:), pointer :: SCALING_LOC
1665 end type scaling_data_t
1666 type (scaling_data_t), INTENT(INOUT) :: scaling_data
1667 INTEGER, INTENT(IN) :: N, LILOC, COMM, MYID, MASTER, LP
1668 INTEGER, INTENT(IN) :: ILOC(LILOC)
1669 INTEGER(8), INTENT(INOUT) :: NB_BYTES, NB_BYTES_MAX
1670 INTEGER(8), INTENT(IN) :: K16_8
1671 LOGICAL, INTENT(IN) :: I_AM_SLAVE, LPOK
1672 INTEGER, INTENT(INOUT) :: INFO(80)
1673 INTEGER, INTENT(IN) :: ICNTL(60)
1674 DOUBLE PRECISION, POINTER, DIMENSION(:) :: SCALING
1675 INTEGER :: I, IERR_MPI, allocok
1677 NULLIFY(scaling_data%SCALING_LOC)
1678 IF (I_AM_SLAVE) THEN
1679 ALLOCATE(scaling_data%SCALING_LOC(max(1,LILOC)),
1681 IF (allocok > 0) THEN
1683 INFO(2)=max(1,LILOC)
1686 NB_BYTES = NB_BYTES + int(max(1,LILOC),8)*K16_8
1687 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
1689.NE.
IF (MYID MASTER) THEN
1690 ALLOCATE(SCALING(N), stat=allocok)
1691 IF (allocok > 0) THEN
1693 WRITE(LP,*) 'error allocating temporary scaling array
'
1699 NB_BYTES = NB_BYTES + int(N,8)*K16_8
1700 NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
1702 SCALING => scaling_data%SCALING
1705 CALL MUMPS_PROPINFO( ICNTL(1), INFO(1),
1707.LT.
IF (INFO(1) 0) GOTO 90
1708 CALL MPI_BCAST( SCALING(1), N, MPI_DOUBLE_PRECISION,
1709 & MASTER, COMM, IERR_MPI)
1710 IF ( I_AM_SLAVE ) THEN
1712.GE..AND..LE.
IF (ILOC(I) 1 ILOC(I) N) THEN
1713 scaling_data%SCALING_LOC(I) = SCALING(ILOC(I))
1718.NE.
IF (MYID MASTER) THEN
1719 IF (associated(SCALING)) THEN
1721 NB_BYTES = NB_BYTES - int(N,8)*K16_8
1725.LT.
IF (INFO(1) 0) THEN
1726 IF (associated(scaling_data%SCALING_LOC)) THEN
1727 DEALLOCATE(scaling_data%SCALING_LOC)
1728 NULLIFY(scaling_data%SCALING_LOC)
1732 END SUBROUTINE DMUMPS_SET_SCALING_LOC
subroutine dmumps_solve_fwd_trsolve(a, la, apos, npiv, ldadiag, nrhs_b, wcb, lwcb, lda_wcb, ppiv_courant, mtype, keep)
subroutine dmumps_solve_bwd_panels(a, la, apos, npiv, iw, nrhs_b, wcb, lwcb, lda_wcb, ppiv_courant, mtype, keep)
subroutine dmumps_eltyd(mtype, n, nelt, eltptr, leltvar, eltvar, na_elt8, a_elt, saverhs, x, y, w, k50)
subroutine dmumps_eltqd2(mtype, n, nelt, eltptr, leltvar, eltvar, na_elt8, a_elt, lhs, wrhs, w, rhs, keep, keep8)
subroutine dmumps_sol_x_elt(mtype, n, nelt, eltptr, leltvar, eltvar, na_elt8, a_elt, w, keep, keep8)
subroutine dmumps_freetopso(n, keep28, iwcb, liww, w, lwc, poswcb, iwposcb, ptricb, ptracb)
subroutine dmumps_solve_bwd_trsolve(a, la, apos, npiv, ldadiag, nrhs_b, wcb, lwcb, lda_wcb, ppiv_courant, mtype, keep)
subroutine dmumps_scal_x(a, nz8, n, irn, icn, z, keep, keep8, colsca, eff_size_schur, sym_perm)
subroutine dmumps_sol_omega(n, rhs, x, y, r_w, c_w, iw, iflag, omega, noiter, testconv, lp, arret, grain)
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 dmumps_solve_gemm_update(a, la, apos1, nx, lda, ny, nrhs_b, wcb, lwcb, ptrx, ldx, ptry, ldy, mtype, keep, coef_y)
subroutine dmumps_sol_cpy_fs2rhscomp(jbdeb, jbfin, nbrows, keep, rhscomp, nrhs, lrhscomp, first_row_rhscomp, w, ld_w, first_row_w)
subroutine dmumps_sol_mulr(n, r, w)
subroutine dmumps_solve_get_ooc_node(inode, ptrfac, keep, a, la, step, keep8, n, must_be_permuted, ierr)
subroutine dmumps_sol_b(n, kase, x, est, w, iw, grain)
subroutine dmumps_sol_bwd_gthr(jbdeb, jbfin, j1, j2, rhscomp, nrhs, lrhscomp, w, ld_w, first_row_w, iw, liw, keep, n, posinrhscomp_bwd)
subroutine dmumps_qd2(mtype, n, nz8, aspk, irn, icn, lhs, wrhs, w, rhs, keep, keep8)
subroutine dmumps_compso(n, keep28, iwcb, liww, w, lwc, poswcb, iwposcb, ptricb, ptracb)
subroutine dmumps_sol_y(a, nz8, n, irn, icn, rhs, x, r, w, keep, keep8)
subroutine dmumps_sol_q(mtype, iflag, n, lhs, wrhs, w, res, givnorm, anorm, xnorm, sclnrm, mprint, icntl, keep, keep8)
subroutine dmumps_build_mapping_info(id)
subroutine dmumps_sol_lcond(n, rhs, x, y, d, r_w, c_w, iw, kase, omega, erx, cond, lp, keep, keep8)
subroutine dmumps_solve_fwd_panels(a, la, apos, npiv, iw, nrhs_b, wcb, lwcb, lda_wcb, ppiv_courant, mtype, keep)
subroutine dmumps_mv_elt(n, nelt, eltptr, eltvar, a_elt, x, y, k50, mtype)
subroutine dtrsv(uplo, trans, diag, n, a, lda, x, incx)
DTRSV
subroutine dgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
DGEMV
subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM
subroutine dtrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
DTRSM
subroutine mpi_recv(buf, cnt, datatype, source, tag, comm, status, ierr)
subroutine mpi_send(buf, cnt, datatype, dest, tag, comm, ierr)
integer ooc_node_permuted
integer ooc_node_not_in_mem
subroutine, public dmumps_read_ooc(dest, inode, ierr)
subroutine dmumps_solve_modify_state_node(inode)
integer function dmumps_solve_is_inode_in_mem(inode, ptrfac, nsteps, a, la, ierr)
subroutine, public dmumps_solve_alloc_factor_space(inode, ptrfac, keep, keep8, a, ierr)