32 NEQ, NJA, NIAPC, NJAPC, &
33 IPC, ICNVGOPT, NORTH, &
34 DVCLOSE, RCLOSE, L2NORM0, EPFACT, &
35 IA0, JA0, A0, IAPC, JAPC, APC, &
38 NCONV, CONVNMOD, CONVMODSTART, &
41 integer(I4B),
INTENT(INOUT) :: ICNVG
42 integer(I4B),
INTENT(IN) :: ITMAX
43 integer(I4B),
INTENT(INOUT) :: INNERIT
44 integer(I4B),
INTENT(IN) :: NEQ
45 integer(I4B),
INTENT(IN) :: NJA
46 integer(I4B),
INTENT(IN) :: NIAPC
47 integer(I4B),
INTENT(IN) :: NJAPC
48 integer(I4B),
INTENT(IN) :: IPC
49 integer(I4B),
INTENT(IN) :: ICNVGOPT
50 integer(I4B),
INTENT(IN) :: NORTH
51 real(DP),
INTENT(IN) :: DVCLOSE
52 real(DP),
INTENT(IN) :: RCLOSE
53 real(DP),
INTENT(IN) :: L2NORM0
54 real(DP),
INTENT(IN) :: EPFACT
55 integer(I4B),
DIMENSION(NEQ + 1),
INTENT(IN) :: IA0
56 integer(I4B),
DIMENSION(NJA),
INTENT(IN) :: JA0
57 real(DP),
DIMENSION(NJA),
INTENT(IN) :: A0
58 integer(I4B),
DIMENSION(NIAPC + 1),
INTENT(IN) :: IAPC
59 integer(I4B),
DIMENSION(NJAPC),
INTENT(IN) :: JAPC
60 real(DP),
DIMENSION(NJAPC),
INTENT(IN) :: APC
61 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: X
62 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: B
63 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: D
64 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: P
65 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: Q
66 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: Z
68 integer(I4B),
INTENT(IN) :: NJLU
69 integer(I4B),
DIMENSION(NIAPC),
INTENT(IN) :: IW
70 integer(I4B),
DIMENSION(NJLU),
INTENT(IN) :: JLU
72 integer(I4B),
INTENT(IN) :: NCONV
73 integer(I4B),
INTENT(IN) :: CONVNMOD
74 integer(I4B),
DIMENSION(CONVNMOD + 1),
INTENT(INOUT) :: CONVMODSTART
75 character(len=31),
DIMENSION(NCONV),
INTENT(INOUT) :: CACCEL
80 character(len=31) :: cval
83 integer(I4B) :: xloc, rloc
84 integer(I4B) :: im, im0, im1
91 real(DP) :: denominator
92 real(DP) :: alpha, beta
101 inner:
DO iiter = 1, itmax
102 innerit = innerit + 1
103 summary%iter_cnt = summary%iter_cnt + 1
114 CALL lusol(neq, d, z, apc, jlu, iw)
116 rho = ddot(neq, d, 1, z, 1)
126 p(n) = z(n) + beta * p(n)
133 call amux(neq, p, q, a0, ja0, ia0)
134 denominator = ddot(neq, p, 1, q, 1)
135 denominator = denominator + sign(
dprec, denominator)
136 alpha = rho / denominator
143 summary%locdv(im) = 0
144 summary%dvmax(im) =
dzero
146 summary%rmax(im) =
dzero
149 im0 = convmodstart(1)
150 im1 = convmodstart(2)
156 im0 = convmodstart(im)
157 im1 = convmodstart(im + 1)
163 IF (abs(tv) > abs(deltax))
THEN
167 IF (abs(tv) > abs(summary%dvmax(im)))
THEN
168 summary%dvmax(im) = tv
169 summary%locdv(im) = n
172 tv = tv - alpha * q(n)
174 IF (abs(tv) > abs(rmax))
THEN
178 IF (abs(tv) > abs(summary%rmax(im)))
THEN
179 summary%rmax(im) = tv
182 l2norm = l2norm + tv * tv
184 l2norm = sqrt(l2norm)
189 WRITE (cval,
'(g15.7)') alpha
191 summary%itinner(n) = iiter
193 summary%convlocdv(im, n) = summary%locdv(im)
194 summary%convlocr(im, n) = summary%locr(im)
195 summary%convdvmax(im, n) = summary%dvmax(im)
196 summary%convrmax(im, n) = summary%rmax(im)
201 IF (icnvgopt == 2 .OR. icnvgopt == 3 .OR. icnvgopt == 4)
THEN
208 l2norm0, epfact, dvclose, rclose)
211 IF (rcnvg ==
dzero) icnvg = 1
214 IF (icnvg .NE. 0)
EXIT inner
224 lorth = mod(iiter + 1, north) == 0
231 if (rho ==
dzero)
then
240 IF (icnvg < 0) icnvg = 0
251 NEQ, NJA, NIAPC, NJAPC, &
252 IPC, ICNVGOPT, NORTH, ISCL, DSCALE, &
253 DVCLOSE, RCLOSE, L2NORM0, EPFACT, &
254 IA0, JA0, A0, IAPC, JAPC, APC, &
256 T, V, DHAT, PHAT, QHAT, &
258 NCONV, CONVNMOD, CONVMODSTART, &
261 integer(I4B),
INTENT(INOUT) :: ICNVG
262 integer(I4B),
INTENT(IN) :: ITMAX
263 integer(I4B),
INTENT(INOUT) :: INNERIT
264 integer(I4B),
INTENT(IN) :: NEQ
265 integer(I4B),
INTENT(IN) :: NJA
266 integer(I4B),
INTENT(IN) :: NIAPC
267 integer(I4B),
INTENT(IN) :: NJAPC
268 integer(I4B),
INTENT(IN) :: IPC
269 integer(I4B),
INTENT(IN) :: ICNVGOPT
270 integer(I4B),
INTENT(IN) :: NORTH
271 integer(I4B),
INTENT(IN) :: ISCL
272 real(DP),
DIMENSION(NEQ),
INTENT(IN) :: DSCALE
273 real(DP),
INTENT(IN) :: DVCLOSE
274 real(DP),
INTENT(IN) :: RCLOSE
275 real(DP),
INTENT(IN) :: L2NORM0
276 real(DP),
INTENT(IN) :: EPFACT
277 integer(I4B),
DIMENSION(NEQ + 1),
INTENT(IN) :: IA0
278 integer(I4B),
DIMENSION(NJA),
INTENT(IN) :: JA0
279 real(DP),
DIMENSION(NJA),
INTENT(IN) :: A0
280 integer(I4B),
DIMENSION(NIAPC + 1),
INTENT(IN) :: IAPC
281 integer(I4B),
DIMENSION(NJAPC),
INTENT(IN) :: JAPC
282 real(DP),
DIMENSION(NJAPC),
INTENT(IN) :: APC
283 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: X
284 real(DP),
DIMENSION(NEQ),
INTENT(IN) :: B
285 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: D
286 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: P
287 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: Q
288 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: T
289 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: V
290 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: DHAT
291 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: PHAT
292 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: QHAT
294 integer(I4B),
INTENT(IN) :: NJLU
295 integer(I4B),
DIMENSION(NIAPC),
INTENT(IN) :: IW
296 integer(I4B),
DIMENSION(NJLU),
INTENT(IN) :: JLU
298 integer(I4B),
INTENT(IN) :: NCONV
299 integer(I4B),
INTENT(IN) :: CONVNMOD
300 integer(I4B),
DIMENSION(CONVNMOD + 1),
INTENT(INOUT) :: CONVMODSTART
301 character(len=31),
DIMENSION(NCONV),
INTENT(INOUT) :: CACCEL
306 character(len=15) :: cval1, cval2
308 integer(I4B) :: iiter
309 integer(I4B) :: xloc, rloc
310 integer(I4B) :: im, im0, im1
317 real(DP) :: alpha, alpha0
319 real(DP) :: rho, rho0
320 real(DP) :: omega, omega0
321 real(DP) :: numerator, denominator
339 inner:
DO iiter = 1, itmax
340 innerit = innerit + 1
341 summary%iter_cnt = summary%iter_cnt + 1
344 rho = ddot(neq, dhat, 1, d, 1)
352 beta = (rho / rho0) * (alpha0 / omega0)
354 p(n) = d(n) + beta * (p(n) - omega0 * v(n))
367 CALL lusol(neq, p, phat, apc, jlu, iw)
373 call amux(neq, phat, v, a0, ja0, ia0)
376 denominator = ddot(neq, dhat, 1, v, 1)
377 denominator = denominator + sign(
dprec, denominator)
378 alpha = rho / denominator
382 q(n) = d(n) - alpha * v(n)
418 CALL lusol(neq, q, qhat, apc, jlu, iw)
422 call amux(neq, qhat, t, a0, ja0, ia0)
425 numerator = ddot(neq, t, 1, q, 1)
426 denominator = ddot(neq, t, 1, t, 1)
427 denominator = denominator + sign(
dprec, denominator)
428 omega = numerator / denominator
435 summary%dvmax(im) =
dzero
436 summary%rmax(im) =
dzero
439 im0 = convmodstart(1)
440 im1 = convmodstart(2)
446 im0 = convmodstart(im)
447 im1 = convmodstart(im + 1)
451 tv = alpha * phat(n) + omega * qhat(n)
453 IF (iscl .NE. 0)
THEN
456 IF (abs(tv) > abs(deltax))
THEN
460 IF (abs(tv) > abs(summary%dvmax(im)))
THEN
461 summary%dvmax(im) = tv
462 summary%locdv(im) = n
466 tv = q(n) - omega * t(n)
468 IF (iscl .NE. 0)
THEN
471 IF (abs(tv) > abs(rmax))
THEN
475 IF (abs(tv) > abs(summary%rmax(im)))
THEN
476 summary%rmax(im) = tv
479 l2norm = l2norm + tv * tv
481 l2norm = sqrt(l2norm)
486 WRITE (cval1,
'(g15.7)') alpha
487 WRITE (cval2,
'(g15.7)') omega
488 caccel(n) = trim(adjustl(cval1))//
','//trim(adjustl(cval2))
489 summary%itinner(n) = iiter
491 summary%convdvmax(im, n) = summary%dvmax(im)
492 summary%convlocdv(im, n) = summary%locdv(im)
493 summary%convrmax(im, n) = summary%rmax(im)
494 summary%convlocr(im, n) = summary%locr(im)
499 IF (icnvgopt == 2 .OR. icnvgopt == 3 .OR. icnvgopt == 4)
THEN
506 l2norm0, epfact, dvclose, rclose)
509 IF (rcnvg ==
dzero) icnvg = 1
512 IF (icnvg .NE. 0)
EXIT inner
531 lorth = mod(iiter + 1, north) == 0
538 if (rho * omega ==
dzero)
then
549 IF (icnvg < 0) icnvg = 0
561 integer(I4B),
INTENT(IN) :: IORD
562 integer(I4B),
INTENT(IN) :: NEQ
563 integer(I4B),
INTENT(IN) :: NJA
564 integer(I4B),
DIMENSION(NEQ + 1),
INTENT(IN) :: IA
565 integer(I4B),
DIMENSION(NJA),
INTENT(IN) :: JA
566 integer(I4B),
DIMENSION(NEQ),
INTENT(INOUT) :: LORDER
567 integer(I4B),
DIMENSION(NEQ),
INTENT(INOUT) :: IORDER
569 character(len=LINELENGTH) :: errmsg
572 integer(I4B),
DIMENSION(:),
ALLOCATABLE :: iwork0
573 integer(I4B),
DIMENSION(:),
ALLOCATABLE :: iwork1
574 integer(I4B) :: iflag
584 CALL genrcm(neq, nja, ia, ja, lorder)
586 nsp = 3 * neq + 4 * nja
587 allocate (iwork0(neq))
588 allocate (iwork1(nsp))
589 CALL ims_odrv(neq, nja, nsp, ia, ja, lorder, iwork0, &
591 IF (iflag .NE. 0)
THEN
592 write (errmsg,
'(A,1X,A)') &
593 'IMSLINEARSUB_CALC_ORDER error creating minimum degree ', &
599 deallocate (iwork0, iwork1)
604 iorder(lorder(n)) = n
609 call parser%StoreErrorUnit()
623 integer(I4B),
INTENT(IN) :: IOPT
624 integer(I4B),
INTENT(IN) :: ISCL
625 integer(I4B),
INTENT(IN) :: NEQ
626 integer(I4B),
INTENT(IN) :: NJA
627 integer(I4B),
DIMENSION(NEQ + 1),
INTENT(IN) :: IA
628 integer(I4B),
DIMENSION(NJA),
INTENT(IN) :: JA
629 real(DP),
DIMENSION(NJA),
INTENT(INOUT) :: AMAT
630 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: X
631 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: B
632 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: DSCALE
633 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: DSCALE2
636 integer(I4B) :: id, jc
637 integer(I4B) :: i0, i1
638 real(DP) :: v, c1, c2
649 c1 =
done / sqrt(abs(v))
662 amat(i) = c1 * amat(i) * c2
675 c1 = c1 + amat(i) * amat(i)
678 IF (c1 ==
dzero)
THEN
687 amat(i) = c1 * amat(i)
702 dscale2(jc) = dscale2(jc) + c2 * c2
707 IF (c2 ==
dzero)
THEN
722 amat(i) = c2 * amat(i)
746 amat(i) = (
done / c1) * amat(i) * (
done / c2)
763 AMAT, IA, JA, APC, IAPC, JAPC, IW, W, &
764 LEVEL, DROPTOL, NJLU, NJW, NWLU, JLU, JW, WLU)
768 integer(I4B),
INTENT(IN) :: IOUT
769 integer(I4B),
INTENT(IN) :: NJA
770 integer(I4B),
INTENT(IN) :: NEQ
771 integer(I4B),
INTENT(IN) :: NIAPC
772 integer(I4B),
INTENT(IN) :: NJAPC
773 integer(I4B),
INTENT(IN) :: IPC
774 real(DP),
INTENT(IN) :: RELAX
775 real(DP),
DIMENSION(NJA),
INTENT(IN) :: AMAT
776 integer(I4B),
DIMENSION(NEQ + 1),
INTENT(IN) :: IA
777 integer(I4B),
DIMENSION(NJA),
INTENT(IN) :: JA
778 real(DP),
DIMENSION(NJAPC),
INTENT(INOUT) :: APC
779 integer(I4B),
DIMENSION(NIAPC + 1),
INTENT(INOUT) :: IAPC
780 integer(I4B),
DIMENSION(NJAPC),
INTENT(INOUT) :: JAPC
781 integer(I4B),
DIMENSION(NIAPC),
INTENT(INOUT) :: IW
782 real(DP),
DIMENSION(NIAPC),
INTENT(INOUT) :: W
784 integer(I4B),
INTENT(IN) :: LEVEL
785 real(DP),
INTENT(IN) :: DROPTOL
786 integer(I4B),
INTENT(IN) :: NJLU
787 integer(I4B),
INTENT(IN) :: NJW
788 integer(I4B),
INTENT(IN) :: NWLU
789 integer(I4B),
DIMENSION(NJLU),
INTENT(INOUT) :: JLU
790 integer(I4B),
DIMENSION(NJW),
INTENT(INOUT) :: JW
791 real(DP),
DIMENSION(NWLU),
INTENT(INOUT) :: WLU
793 character(len=LINELENGTH) :: errmsg
794 character(len=100),
dimension(5),
parameter :: cerr = &
795 [
"Elimination process has generated a row in L or U whose length is > n.", &
796 &
"The matrix L overflows the array al. ", &
797 &
"The matrix U overflows the array alu. ", &
798 &
"Illegal value for lfil. ", &
799 &
"Zero row encountered. "]
800 integer(i4b) :: ipcflag
801 integer(I4B) :: icount
805 2000
FORMAT(/,
' MATRIX IS SEVERELY NON-DIAGONALLY DOMINANT.', &
806 /,
' ADDED SMALL VALUE TO PIVOT ', i0,
' TIMES IN', &
807 ' IMSLINEARSUB_PCU.')
819 apc, iapc, japc, iw, w, &
820 relax, ipcflag, delta)
825 CALL ilut(neq, amat, ja, ia, level, droptol, &
826 apc, jlu, iw, njapc, wlu, jw, ierr, &
827 relax, ipcflag, delta)
830 write (errmsg,
'(a,1x,i0,1x,a)') &
831 'ILUT: zero pivot encountered at step number', ierr,
'.'
833 write (errmsg,
'(a,1x,a)')
'ILUT:', cerr(-ierr)
836 call parser%StoreErrorUnit()
843 IF (ipcflag < 1)
THEN
846 delta = 1.5d0 * delta +
dem3
848 IF (delta >
dhalf)
THEN
855 if (icount > 10)
then
863 write (iout, 2000) icount
875 integer(I4B),
INTENT(IN) :: NJA
876 integer(I4B),
INTENT(IN) :: NEQ
877 real(DP),
DIMENSION(NJA),
INTENT(IN) :: AMAT
878 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: APC
879 integer(I4B),
DIMENSION(NEQ + 1),
INTENT(IN) :: IA
880 integer(I4B),
DIMENSION(NJA),
INTENT(IN) :: JA
883 integer(I4B) :: ic0, ic1
910 integer(I4B),
INTENT(IN) :: NEQ
911 real(DP),
DIMENSION(NEQ),
INTENT(IN) :: A
912 real(DP),
DIMENSION(NEQ),
INTENT(IN) :: D1
913 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: D2
930 APC, IAPC, JAPC, IW, W, &
931 RELAX, IPCFLAG, DELTA)
933 integer(I4B),
INTENT(IN) :: NJA
934 integer(I4B),
INTENT(IN) :: NEQ
935 real(DP),
DIMENSION(NJA),
INTENT(IN) :: AMAT
936 integer(I4B),
DIMENSION(NEQ + 1),
INTENT(IN) :: IA
937 integer(I4B),
DIMENSION(NJA),
INTENT(IN) :: JA
938 real(DP),
DIMENSION(NJA),
INTENT(INOUT) :: APC
939 integer(I4B),
DIMENSION(NEQ + 1),
INTENT(INOUT) :: IAPC
940 integer(I4B),
DIMENSION(NJA),
INTENT(INOUT) :: JAPC
941 integer(I4B),
DIMENSION(NEQ),
INTENT(INOUT) :: IW
942 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: W
943 real(DP),
INTENT(IN) :: RELAX
944 integer(I4B),
INTENT(INOUT) :: IPCFLAG
945 real(DP),
INTENT(IN) :: DELTA
947 integer(I4B) :: ic0, ic1
948 integer(I4B) :: iic0, iic1
949 integer(I4B) :: iu, iiu
952 integer(I4B) :: jcol, jw
953 integer(I4B) :: jjcol
972 w(jcol) = w(jcol) + amat(j)
975 ic1 = iapc(n + 1) - 1
978 lower:
DO j = ic0, iu - 1
981 iic1 = iapc(jcol + 1) - 1
983 tl = w(jcol) * apc(jcol)
989 w(jjcol) = w(jjcol) - tl * apc(jj)
991 rs = rs + tl * apc(jj)
998 tl = (
done + delta) * d - (drelax * rs)
1002 IF (sd1 .NE. d)
THEN
1006 IF (ipcflag > 1)
THEN
1015 IF (abs(tl) ==
dzero)
THEN
1019 IF (ipcflag > 1)
THEN
1052 integer(I4B),
INTENT(IN) :: NJA
1053 integer(I4B),
INTENT(IN) :: NEQ
1054 real(DP),
DIMENSION(NJA),
INTENT(IN) :: APC
1055 integer(I4B),
DIMENSION(NEQ + 1),
INTENT(IN) :: IAPC
1056 integer(I4B),
DIMENSION(NJA),
INTENT(IN) :: JAPC
1057 real(DP),
DIMENSION(NEQ),
INTENT(IN) :: R
1058 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: D
1060 integer(I4B) :: ic0, ic1
1062 integer(I4B) :: jcol
1063 integer(I4B) :: j, n
1067 forward:
DO n = 1, neq
1070 ic1 = iapc(n + 1) - 1
1072 lower:
DO j = ic0, iu
1074 tv = tv - apc(j) * d(jcol)
1080 backward:
DO n = neq, 1, -1
1082 ic1 = iapc(n + 1) - 1
1085 upper:
DO j = iu, ic1
1087 tv = tv - apc(j) * d(jcol)
1104 Rmax0, Epfact, Dvclose, Rclose)
1106 integer(I4B),
INTENT(IN) :: Icnvgopt
1107 integer(I4B),
INTENT(INOUT) :: Icnvg
1108 integer(I4B),
INTENT(IN) :: Iiter
1109 real(DP),
INTENT(IN) :: Dvmax
1110 real(DP),
INTENT(IN) :: Rmax
1111 real(DP),
INTENT(IN) :: Rmax0
1112 real(DP),
INTENT(IN) :: Epfact
1113 real(DP),
INTENT(IN) :: Dvclose
1114 real(DP),
INTENT(IN) :: Rclose
1116 IF (icnvgopt == 0)
THEN
1117 IF (abs(dvmax) <= dvclose .AND. abs(rmax) <= rclose)
THEN
1120 ELSE IF (icnvgopt == 1)
THEN
1121 IF (abs(dvmax) <= dvclose .AND. abs(rmax) <= rclose)
THEN
1122 IF (iiter == 1)
THEN
1128 ELSE IF (icnvgopt == 2)
THEN
1129 IF (abs(dvmax) <= dvclose .OR. rmax <= rclose)
THEN
1131 ELSE IF (rmax <= rmax0 * epfact)
THEN
1134 ELSE IF (icnvgopt == 3)
THEN
1135 IF (abs(dvmax) <= dvclose)
THEN
1137 ELSE IF (rmax <= rmax0 * rclose)
THEN
1140 ELSE IF (icnvgopt == 4)
THEN
1141 IF (abs(dvmax) <= dvclose .AND. rmax <= rclose)
THEN
1143 ELSE IF (rmax <= rmax0 * epfact)
THEN
1150 niapc, njapc, njlu, njw, nwlu)
1151 integer(I4B),
intent(in) :: neq
1152 integer(I4B),
intent(in) :: nja
1153 integer(I4B),
dimension(:),
intent(in) :: ia
1154 integer(I4B),
intent(in) :: level
1155 integer(I4B),
intent(in) :: ipc
1156 integer(I4B),
intent(inout) :: niapc
1157 integer(I4B),
intent(inout) :: njapc
1158 integer(I4B),
intent(inout) :: njlu
1159 integer(I4B),
intent(inout) :: njw
1160 integer(I4B),
intent(inout) :: nwlu
1162 integer(I4B) :: n, i
1163 integer(I4B) :: ijlu, ijw, iwlu, iwk
1174 if (ipc == 3 .or. ipc == 4)
then
1177 iwk = neq * (level * 2 + 1)
1181 i = ia(n + 1) - ia(n)
1211 integer(I4B),
INTENT(IN) :: NEQ
1212 integer(I4B),
INTENT(IN) :: NJA
1213 integer(I4B),
DIMENSION(NEQ + 1),
INTENT(IN) :: IA
1214 integer(I4B),
DIMENSION(NJA),
INTENT(IN) :: JA
1215 integer(I4B),
DIMENSION(NEQ + 1),
INTENT(INOUT) :: IAPC
1216 integer(I4B),
DIMENSION(NJA),
INTENT(INOUT) :: JAPC
1218 integer(I4B) :: n, j
1219 integer(I4B) :: i0, i1
1220 integer(I4B) :: nlen
1221 integer(I4B) :: ic, ip
1222 integer(I4B) :: jcol
1223 integer(I4B),
DIMENSION(:),
ALLOCATABLE :: iarr
1230 ALLOCATE (iarr(nlen))
1234 IF (jcol == n) cycle
1247 iapc(neq + 1) = nja + 1
1252 i1 = iapc(n + 1) - 1
1253 japc(n) = iapc(n + 1)
1271 integer(I4B),
INTENT(IN) :: NVAL
1272 integer(I4B),
DIMENSION(NVAL),
INTENT(INOUT) :: IARRAY
1274 integer(I4B) :: i, j, itemp
1278 if (iarray(i) > iarray(j))
then
1280 iarray(j) = iarray(i)
1294 integer(I4B),
INTENT(IN) :: NEQ
1295 integer(I4B),
INTENT(IN) :: NJA
1296 real(DP),
DIMENSION(NEQ),
INTENT(IN) :: X
1297 real(DP),
DIMENSION(NEQ),
INTENT(IN) :: B
1298 real(DP),
DIMENSION(NEQ),
INTENT(INOUT) :: D
1299 real(DP),
DIMENSION(NJA),
INTENT(IN) :: A
1300 integer(I4B),
DIMENSION(NEQ + 1),
INTENT(IN) :: IA
1301 integer(I4B),
DIMENSION(NJA),
INTENT(IN) :: JA
1307 call amux(neq, x, d, a, ja, ia)
1318 integer(I4B) :: icnvgopt
1319 integer(I4B) :: kstp
1322 if (icnvgopt == 2)
then
1328 else if (icnvgopt == 4)
then
subroutine ilut(n, a, ja, ia, lfil, droptol, alu, jlu, ju, iwk, w, jw, ierr, relax, izero, delta)
subroutine lusol(n, y, x, alu, jlu, ju)
This module contains block parser methods.
This module contains simulation constants.
integer(i4b), parameter linelength
maximum length of a standard line
real(dp), parameter dhalf
real constant 1/2
real(dp), parameter dem3
real constant 1e-3
integer(i4b), parameter izero
integer constant zero
real(dp), parameter dem4
real constant 1e-4
real(dp), parameter dem6
real constant 1e-6
real(dp), parameter dzero
real constant zero
real(dp), parameter dprec
real constant machine precision
real(dp), parameter done
real constant 1
This module contains the IMS linear accelerator subroutines.
subroutine ims_base_pcu(IOUT, NJA, NEQ, NIAPC, NJAPC, IPC, RELAX, AMAT, IA, JA, APC, IAPC, JAPC, IW, W, LEVEL, DROPTOL, NJLU, NJW, NWLU, JLU, JW, WLU)
@ brief Update the preconditioner
subroutine ims_base_cg(ICNVG, ITMAX, INNERIT, NEQ, NJA, NIAPC, NJAPC, IPC, ICNVGOPT, NORTH, DVCLOSE, RCLOSE, L2NORM0, EPFACT, IA0, JA0, A0, IAPC, JAPC, APC, X, B, D, P, Q, Z, NJLU, IW, JLU, NCONV, CONVNMOD, CONVMODSTART, CACCEL, summary)
@ brief Preconditioned Conjugate Gradient linear accelerator
subroutine ims_base_pccrs(NEQ, NJA, IA, JA, IAPC, JAPC)
@ brief Generate CRS pointers for the preconditioner
subroutine ims_base_isort(NVAL, IARRAY)
In-place sorting for an integer array.
subroutine ims_base_bcgs(ICNVG, ITMAX, INNERIT, NEQ, NJA, NIAPC, NJAPC, IPC, ICNVGOPT, NORTH, ISCL, DSCALE, DVCLOSE, RCLOSE, L2NORM0, EPFACT, IA0, JA0, A0, IAPC, JAPC, APC, X, B, D, P, Q, T, V, DHAT, PHAT, QHAT, NJLU, IW, JLU, NCONV, CONVNMOD, CONVMODSTART, CACCEL, summary)
@ brief Preconditioned BiConjugate Gradient Stabilized linear accelerator
subroutine ims_calc_pcdims(neq, nja, ia, level, ipc, niapc, njapc, njlu, njw, nwlu)
subroutine ims_base_scale(IOPT, ISCL, NEQ, NJA, IA, JA, AMAT, X, B, DSCALE, DSCALE2)
@ brief Scale the coefficient matrix
subroutine ims_base_testcnvg(Icnvgopt, Icnvg, Iiter, Dvmax, Rmax, Rmax0, Epfact, Dvclose, Rclose)
@ brief Test for solver convergence
real(dp) function ims_base_epfact(icnvgopt, kstp)
Function returning EPFACT.
subroutine ims_base_ilu0a(NJA, NEQ, APC, IAPC, JAPC, R, D)
@ brief Apply the ILU0 and MILU0 preconditioners
subroutine ims_base_pcjac(NJA, NEQ, AMAT, APC, IA, JA)
@ brief Jacobi preconditioner
subroutine ims_base_calc_order(IORD, NEQ, NJA, IA, JA, LORDER, IORDER)
@ brief Calculate LORDER AND IORDER
subroutine ims_base_residual(NEQ, NJA, X, B, D, A, IA, JA)
Calculate residual.
subroutine ims_base_pcilu0(NJA, NEQ, AMAT, IA, JA, APC, IAPC, JAPC, IW, W, RELAX, IPCFLAG, DELTA)
@ brief Update the ILU0 preconditioner
type(blockparsertype), private parser
subroutine ims_base_jaca(NEQ, A, D1, D2)
@ brief Apply the Jacobi preconditioner
@, public ipc_ilu0
ILU0 (incomplete LU, zero fill)
@, public ipc_milut
modified ILUT
@, public ipc_milu0
modified ILU0
@, public ipc_ilut
ILUT (incomplete LU with threshold)
subroutine, public ims_odrv(n, nja, nsp, ia, ja, p, ip, isp, flag)
This module defines variable data types.
pure logical function, public is_close(a, b, rtol, atol, symmetric)
Check if a real value is approximately equal to another.
This module contains simulation methods.
subroutine, public store_error(msg, terminate)
Store an error message.
integer(i4b) function, public count_errors()
Return number of errors.
subroutine genrcm(node_num, adj_num, adj_row, adj, perm)
subroutine amux(n, x, y, a, ja, ia)
This structure stores the generic convergence info for a solution.