62 SUBROUTINE w3xypug ( ISP, FACX, FACY, DTG, VQ, VGX, VGY, LCALC )
153 INTEGER,
INTENT(IN) :: ISP
154 REAL,
INTENT(IN) :: FACX, FACY, DTG, VGX, VGY
155 REAL,
INTENT(INOUT) :: VQ(1-NY:NY*(NX+2))
156 LOGICAL,
INTENT(IN) :: LCALC
161 INTEGER :: ITH, IK, ISEA, IXY
164 INTEGER,
SAVE :: IENT = 0
166 REAL :: CCOS, CSIN, CCURX, CCURY
172 REAL :: VLCFLX((NX+1)*NY), VLCFLY(NX*NY)
173 DOUBLE PRECISION :: AC(NX)
181 CALL strace (ient,
'W3XYPUG')
183 ith = 1 + mod(isp-1,
nth)
186 ccos = facx *
ecos(ith)
187 csin = facy *
esin(ith)
205 vq(ixy) = vq(ixy) /
cg(ik,isea) *
clats(isea)
206 vlcflx(ixy) = ccos *
cg(ik,isea) /
clats(isea)
207 vlcfly(ixy) = csin *
cg(ik,isea)
209 vlcflx(ixy) = vlcflx(ixy) - ccurx*vgx/
clats(isea)
210 vlcfly(ixy) = vlcfly(ixy) - ccury*vgy
220 IF (
iobp(ixy) .EQ. 1)
THEN
221 vlcflx(ixy) = vlcflx(ixy) + ccurx*
cx(isea)/
clats(isea)
222 vlcfly(ixy) = vlcfly(ixy) + ccury*
cy(isea)
230 ac(1:nx) = dble(vq(1:nx)) *
iobdp(1:nx)
231 c(1:nx,1) = vlcflx(1:nx) *
iobdp(1:nx)
232 c(1:nx,2) = vlcfly(1:nx) *
iobdp(1:nx)
248 CALL w3xypfsn2 (isp, c, lcalc, rd1, rd2, dtg, ac)
250 CALL w3xypfspsi2 (isp, c, lcalc, rd1, rd2, dtg, ac)
252 CALL w3xypfsfct2 (isp, c, lcalc, rd1, rd2, dtg, ac)
266 vq(ixy) = max( 0. ,
cg(ik,isea)/
clats(isea)*vq(ixy) )
270 SUBROUTINE w3cflug ( ISEA, NKCFL, FACX, FACY, DT, MAPFS, CFLXYMAX, &
363 INTEGER,
INTENT(IN) :: ISEA, NKCFL, MAPFS(NY*NX)
364 REAL,
INTENT(IN) :: FACX, FACY, DT, VGX, VGY
365 REAL,
INTENT(INOUT) :: CFLXYMAX
371 INTEGER :: IP, IP2, ISEA2, I, J, IE, IV, I1, I2, I3
373 INTEGER,
SAVE :: IENT = 0
375 REAL :: CCOS, CSIN, CCURX, CCURY
377 real*8 :: kelem(3), ktmp(3), lambda(2)
378 real*8 :: kksum, dtmaxexp
382 real*8,
PARAMETER :: onesixth = 1.0d0/6.0d0
383 real*8,
PARAMETER :: thr8 = tiny(1.0d0)
384 REAL,
PARAMETER :: THR = tiny(1.0)
393 CALL strace (ient,
'W3CFLUG')
400 IF (
iobp(ip).EQ.1)
THEN
408 ccos = facx *
ecos(ith)
409 csin = facy *
esin(ith)
423 c(ip2,1) = ccos *
cg(ik,isea2) /
clats(isea2)
424 c(ip2,2) = csin *
cg(ik,isea2)
426 c(ip2,1) = c(ip2,1) - ccurx*vgx/
clats(isea2)
427 c(ip2,2) = c(ip2,2) - ccury*vgy
430 IF (
iobp(ip2) .EQ. 1)
THEN
431 c(ip2,1) = c(ip2,1) + ccurx*
cx(isea2)/
clats(isea2)
432 c(ip2,2) = c(ip2,2) + ccury*
cy(isea2)
447 lambda(1) = onesixth *(c(i1,1)+c(i2,1)+c(i3,1))
448 lambda(2) = onesixth *(c(i1,2)+c(i2,2)+c(i3,2))
449 kelem(1) = lambda(1) *
ien(ie,1) + lambda(2) *
ien(ie,2)
450 kelem(2) = lambda(1) *
ien(ie,3) + lambda(2) *
ien(ie,4)
451 kelem(3) = lambda(1) *
ien(ie,5) + lambda(2) *
ien(ie,6)
454 kelem = max(0.d0,ktmp)
456 kksum = kksum + kelem(iv)
459 dtmaxexp =
si(ip)/max(dble(10.e-10),kksum)
460 cflxymax = max(dble(dt)/dtmaxexp,dble(cflxymax))
469 SUBROUTINE w3xypfsn2 ( ISP, C, LCALC, RD10, RD20, DT, AC)
542 INTEGER,
INTENT(IN) :: ISP
543 REAL,
INTENT(IN) :: DT
544 REAL,
INTENT(IN) :: C(:,:)
545 DOUBLE PRECISION,
INTENT(INOUT):: AC(:)
546 REAL,
INTENT(IN) :: RD10, RD20
547 LOGICAL,
INTENT(IN) :: LCALC
557 INTEGER,
SAVE :: IENT = 0
560 real*8,
PARAMETER :: onesixth = 1.0d0/6.0d0
561 real*8,
PARAMETER :: thr8 = tiny(1.0d0)
562 REAL,
PARAMETER :: THR = tiny(1.0)
569 INTEGER :: IP, IE, IT, I1, I2, I3, ITH, IK
570 INTEGER :: IBI, NI(3)
578 real*8 :: utilde, boundary_forcing
580 real*8 :: fl11, fl12, fl21, fl22, fl31, fl32
581 real*8 :: fl111, fl112, fl211, fl212, fl311, fl312
582 real*8 :: dtsi(nx), u(nx)
583 real*8 :: dtmaxgl, dtmaxexp, rest
584 real*8 :: lambda(2), ktmp(3), cloc(2,3)
585 real*8 :: kelem(3,ntri), flall(3,ntri)
586 real*8 :: kksum(nx), st(nx)
590 CALL strace (ient,
'W3XYPFSN')
595 ith = 1 + mod(isp-1,nth)
597 dtmaxgl = dble(10.e10)
608 lambda(1) = onesixth *(c(i1,1)+c(i2,1)+c(i3,1))
609 lambda(2) = onesixth *(c(i1,2)+c(i2,2)+c(i3,2))
610 kelem(1,ie) = lambda(1) * ien(ie,1) + lambda(2) * ien(ie,2)
611 kelem(2,ie) = lambda(1) * ien(ie,3) + lambda(2) * ien(ie,4)
612 kelem(3,ie) = lambda(1) * ien(ie,5) + lambda(2) * ien(ie,6)
615 nm(ie) = - 1.d0/min(-thr8,sum(min(0.d0,ktmp)))
616 kelem(:,ie) = max(0.d0,ktmp)
617 fl11 = c(i2,1) * ien(ie,1) + c(i2,2) * ien(ie,2)
618 fl12 = c(i3,1) * ien(ie,1) + c(i3,2) * ien(ie,2)
619 fl21 = c(i3,1) * ien(ie,3) + c(i3,2) * ien(ie,4)
620 fl22 = c(i1,1) * ien(ie,3) + c(i1,2) * ien(ie,4)
621 fl31 = c(i1,1) * ien(ie,5) + c(i1,2) * ien(ie,6)
622 fl32 = c(i2,1) * ien(ie,5) + c(i2,2) * ien(ie,6)
623 fl111 = 2.d0*fl11+fl12
624 fl112 = 2.d0*fl12+fl11
625 fl211 = 2.d0*fl21+fl22
626 fl212 = 2.d0*fl22+fl21
627 fl311 = 2.d0*fl31+fl32
628 fl312 = 2.d0*fl32+fl31
629 flall(1,ie) = (fl311 + fl212) * onesixth + kelem(1,ie)
630 flall(2,ie) = (fl111 + fl312) * onesixth + kelem(2,ie)
631 flall(3,ie) = (fl211 + fl112) * onesixth + kelem(3,ie)
639 kksum(ni) = kksum(ni) + kelem(:,ie)
643 IF (iobp(ip) .EQ. 1 .OR. fsbccfl)
THEN
644 dtmaxexp = si(ip)/max(dble(10.e-10),kksum(ip)*iobdp(ip))
645 dtmaxgl = min( dtmaxgl, dtmaxexp)
648 cflxy = dble(dt)/dtmaxgl
649 rest = abs(mod(cflxy,1.0d0))
650 IF (rest .LT. thr8)
THEN
651 iter(ik,ith) = abs(nint(cflxy))
652 ELSE IF (rest .GT. thr8 .AND. rest .LT. 0.5d0)
THEN
653 iter(ik,ith) = abs(nint(cflxy)) + 1
655 iter(ik,ith) = abs(nint(cflxy))
660 dtsi(ip) = dble(dt)/dble(
iter(ik,ith))/si(ip)
663 DO it = 1,
iter(ik,ith)
668 utilde = nm(ie) * (dot_product(flall(:,ie),u(ni)))
669 st(ni) = st(ni) + kelem(:,ie) * (u(ni) - utilde)
677 u(ip) = max(0.d0,u(ip)-dtsi(ip)*st(ip)*(1-iobpa(ip)))*dble(iobpd(ith,ip))
680 WRITE(10111,*)
refpars(3), iobpd(ith,ip), iobpa(ip), u(ip), ac(ip)
681 IF (
refpars(3).LT.0.5.AND.iobpd(ith,ip).EQ.0.AND.iobpa(ip).EQ.0)
THEN
695 rd1=rd10 - dt * real(
iter(ik,ith)-it)/real(
iter(ik,ith))
697 IF ( rd2 .GT. 0.001 )
THEN
698 rd2 = min(1.,max(0.,rd1/rd2))
708 ip = mapsf(
isbpi(ibi),1)
709 ac(ip) = ( rd1*
bbpi0(isp,ibi) + rd2*
bbpin(isp,ibi) ) &
723 SUBROUTINE w3xypfspsi2 ( ISP, C, LCALC, RD10, RD20, DT, AC)
788 INTEGER,
INTENT(IN) :: ISP
789 REAL,
INTENT(IN) :: DT
790 REAL,
INTENT(IN) :: C(:,:)
791 DOUBLE PRECISION,
INTENT(INOUT) :: AC(:)
792 REAL,
INTENT(IN) :: RD10, RD20
793 LOGICAL,
INTENT(IN) :: LCALC
803 INTEGER,
SAVE :: IENT = 0
806 real*8,
PARAMETER :: onesixth = 1.0d0/6.0d0
807 real*8,
PARAMETER :: thr8 = tiny(1.0d0)
808 REAL,
PARAMETER :: THR = tiny(1.0)
815 INTEGER :: IP, IE, IT, I1, I2, I3, ITH, IK
816 INTEGER :: IBI, NI(3)
824 real*8 :: utilde, boundary_forcing
826 real*8 :: fl11, fl12, fl21, fl22, fl31, fl32
827 real*8 :: fl111, fl112, fl211, fl212, fl311, fl312
828 real*8 :: dtsi(nx), u(nx)
829 real*8 :: dtmaxgl, dtmaxexp, rest
830 real*8 :: lambda(2), ktmp(3), tmp(3)
831 real*8 :: theta_l(3), bet1(3), betahat(3)
832 real*8 :: kelem(3,ntri), flall(3,ntri)
833 real*8 :: kksum(nx), st(nx)
837 CALL strace (ient,
'W3XYPFSN')
842 ith = 1 + mod(isp-1,nth)
844 dtmaxgl = dble(10.e10)
853 lambda(1) = onesixth *(c(i1,1)+c(i2,1)+c(i3,1))
854 lambda(2) = onesixth *(c(i1,2)+c(i2,2)+c(i3,2))
855 kelem(1,ie) = lambda(1) * ien(ie,1) + lambda(2) * ien(ie,2)
856 kelem(2,ie) = lambda(1) * ien(ie,3) + lambda(2) * ien(ie,4)
857 kelem(3,ie) = lambda(1) * ien(ie,5) + lambda(2) * ien(ie,6)
859 nm(ie) = - 1.d0/min(-thr8,sum(min(0.d0,ktmp)))
860 kelem(:,ie) = max(0.d0,ktmp)
861 fl11 = c(i2,1) * ien(ie,1) + c(i2,2) * ien(ie,2)
862 fl12 = c(i3,1) * ien(ie,1) + c(i3,2) * ien(ie,2)
863 fl21 = c(i3,1) * ien(ie,3) + c(i3,2) * ien(ie,4)
864 fl22 = c(i1,1) * ien(ie,3) + c(i1,2) * ien(ie,4)
865 fl31 = c(i1,1) * ien(ie,5) + c(i1,2) * ien(ie,6)
866 fl32 = c(i2,1) * ien(ie,5) + c(i2,2) * ien(ie,6)
867 fl111 = 2.d0*fl11+fl12
868 fl112 = 2.d0*fl12+fl11
869 fl211 = 2.d0*fl21+fl22
870 fl212 = 2.d0*fl22+fl21
871 fl311 = 2.d0*fl31+fl32
872 fl312 = 2.d0*fl32+fl31
873 flall(1,ie) = (fl311 + fl212)
874 flall(2,ie) = (fl111 + fl312)
875 flall(3,ie) = (fl211 + fl112)
882 kksum(ni) = kksum(ni) + kelem(:,ie)
886 dtmaxexp = si(ip)/max(dble(10.e-10),kksum(ip)*iobdp(ip))
887 dtmaxgl = min( dtmaxgl, dtmaxexp)
889 cflxy = dble(dt)/dtmaxgl
890 rest = abs(mod(cflxy,1.0d0))
891 IF (rest .LT. thr8)
THEN
892 iter(ik,ith) = abs(nint(cflxy))
893 ELSE IF (rest .GT. thr8 .AND. rest .LT. 0.5d0)
THEN
894 iter(ik,ith) = abs(nint(cflxy)) + 1
896 iter(ik,ith) = abs(nint(cflxy))
901 dtsi(ip) = dble(dt)/dble(
iter(ik,ith))/si(ip)
904 DO it = 1,
iter(ik,ith)
911 ft =-onesixth*dot_product(u(ni),flall(:,ie))
912 utilde = nm(ie) * ( dot_product(kelem(:,ie),u(ni)) - ft )
913 theta_l(:) = kelem(:,ie) * (u(ni) - utilde)
914 IF (abs(ft) .GT. 0.0d0)
THEN
915 bet1(:) = theta_l(:)/ft
916 IF (any( bet1 .LT. 0.0d0) )
THEN
917 betahat(1) = bet1(1) + 0.5d0 * bet1(2)
918 betahat(2) = bet1(2) + 0.5d0 * bet1(3)
919 betahat(3) = bet1(3) + 0.5d0 * bet1(1)
920 bet1(1) = max(0.d0,min(betahat(1),1.d0-betahat(2),1.d0))
921 bet1(2) = max(0.d0,min(betahat(2),1.d0-betahat(3),1.d0))
922 bet1(3) = max(0.d0,min(betahat(3),1.d0-betahat(1),1.d0))
923 theta_l(:) = ft * bet1
928 st(ni) = st(ni) + theta_l
932 u(ip) = max(0.d0,u(ip)-dtsi(ip)*st(ip)*(1-iobpa(ip)))*dble(iobpd(ith,ip))
934 IF (
refpars(3).LT.0.5.AND.iobpd(ith,ip).EQ.0.AND.iobpa(ip).EQ.0) u(ip)= ac(ip)
947 rd1=rd10 - dt * real(
iter(ik,ith)-it)/real(
iter(ik,ith))
949 IF ( rd2 .GT. 0.001 )
THEN
950 rd2 = min(1.,max(0.,rd1/rd2))
960 ip = mapsf(
isbpi(ibi),1)
961 ac(ip) = ( rd1*
bbpi0(isp,ibi) + rd2*
bbpin(isp,ibi) ) &
975 SUBROUTINE w3xypfsnimp ( ISP, C, LCALC, RD10, RD20, DT, AC)
1029 ien,
trigp,
clats,
mapsf,
iobpd,
iobpa,
iobp,
iaa,
jaa,
posi, &
1043 INTEGER,
INTENT(IN) :: ISP
1044 REAL,
INTENT(IN) :: DT
1045 REAL,
INTENT(IN) :: C(:,:)
1046 DOUBLE PRECISION,
INTENT(INOUT) :: AC(:)
1047 REAL,
INTENT(IN) :: RD10, RD20
1048 LOGICAL,
INTENT(IN) :: LCALC
1058 INTEGER,
SAVE :: IENT = 0
1061 real*8,
PARAMETER :: onesixth = 1.0d0/6.0d0
1062 real*8,
PARAMETER :: onethird = 1.0d0/3.0d0
1063 real*8,
PARAMETER :: thr8 = tiny(1.0d0)
1064 REAL,
PARAMETER :: THR = tiny(1.0)
1071 INTEGER :: IP, IE, POS, I1, I2, I3, I, J, ITH, IK
1080 real*8 :: boundary_forcing
1081 real*8 :: fl11, fl12, fl21, fl22, fl31, fl32
1085 real*8 :: kp(3,ntri)
1086 real*8 :: k1, dtk, tmp3, km(3), k(3)
1087 real*8 :: nm(ntri), crfs(3), deltal(3,ntri)
1088 real*8 :: b(nx), x(nx)
1089 real*8 :: aspar(nnz)
1091 INTEGER :: IWKSP( 20*NX )
1093 INTEGER :: FLJAU(NNZ+1)
1096 INTEGER :: POS_TRICK(3,2)
1100 INTEGER :: JAU(NNZ+1), JU(NX)
1103 real*8 :: wksp( 8 * nx )
1117 CALL strace (ient,
'W3XYPFSN')
1122 ith = 1 + mod(isp-1,nth)
1123 ik = 1 + (isp-1)/nth
1124 dtmaxgl = dble(10.e10)
1127 WRITE(*,*)
'NNZ', nnz
1128 WRITE(*,*)
'MINVAL IAA,JAA', minval(iaa), minval(jaa)
1129 WRITE(*,*)
'MINVAL IAA,JAA', maxval(iaa), maxval(jaa)
1130 WRITE(*,*)
'MAX/MIN POSI', maxval(posi), minval(posi)
1131 WRITE(*,*)
'AC, AQ', sum(ac)
1141 lambda(1) = onesixth * (c(i1,1)+c(i2,1)+c(i3,1))
1142 lambda(2) = onesixth * (c(i1,2)+c(i2,2)+c(i3,2))
1143 k(1) = lambda(1) * ien(ie,1) + lambda(2) * ien(ie,2)
1144 k(2) = lambda(1) * ien(ie,3) + lambda(2) * ien(ie,4)
1145 k(3) = lambda(1) * ien(ie,5) + lambda(2) * ien(ie,6)
1146 kp(1,ie) = max(0.d0,k(1))
1147 kp(2,ie) = max(0.d0,k(2))
1148 kp(3,ie) = max(0.d0,k(3))
1149 km(1) = min(0.d0,k(1))
1150 km(2) = min(0.d0,k(2))
1151 km(3) = min(0.d0,k(3))
1152 fl11 = c(i2,1)*ien(ie,1)+c(i2,2)*ien(ie,2)
1153 fl12 = c(i3,1)*ien(ie,1)+c(i3,2)*ien(ie,2)
1154 fl21 = c(i3,1)*ien(ie,3)+c(i3,2)*ien(ie,4)
1155 fl22 = c(i1,1)*ien(ie,3)+c(i1,2)*ien(ie,4)
1156 fl31 = c(i1,1)*ien(ie,5)+c(i1,2)*ien(ie,6)
1157 fl32 = c(i2,1)*ien(ie,5)+c(i2,2)*ien(ie,6)
1158 crfs(1) = - onesixth * (2.0d0 *fl31 + fl32 + fl21 + 2.0d0 * fl22 )
1159 crfs(2) = - onesixth * (2.0d0 *fl32 + 2.0d0 * fl11 + fl12 + fl31 )
1160 crfs(3) = - onesixth * (2.0d0 *fl12 + 2.0d0 * fl21 + fl22 + fl11 )
1161 deltal(:,ie) = crfs(:)- kp(:,ie)
1162 nm(ie) = 1.d0/min(dble(thr),sum(km(:)))
1174 k1 = kp(pos,ie) * iobpd(ith,ip)
1181 aspar(i1) = onethird * tria(ie) + dtk - tmp3 * deltal(pos,ie) + aspar(i1)
1182 aspar(i2) = - tmp3 * deltal(pos_trick(pos,1),ie) + aspar(i2)
1183 aspar(i3) = - tmp3 * deltal(pos_trick(pos,2),ie) + aspar(i3)
1184 b(ip) = b(ip) + onethird * tria(ie) * u(ip)
1187 aspar(i1) = onethird * tria(ie) + aspar(i1)
1188 b(ip) = b(ip) + onethird * tria(ie) * u(ip)
1201 fpar(1) = dble(1.0e-8)
1202 fpar(2) = dble(1.0e-10)
1211 CALL ilu0 (nx, aspar, jaa, iaa, au, fljau, flju, iwksp, ierror)
1218 WRITE(*,*)
'CALL SOLVER'
1219 WRITE(*,*)
'WRITE CG', sum(
cg)
1220 WRITE(*,*)
'B, X, AC, U', sum(b), sum(x), sum(ac), sum(u)
1221 WRITE(*,*)
'IPAR, FPAR', sum(ipar), sum(fpar)
1222 WRITE(*,*)
'WKSP, INIU', sum(wksp), sum(iniu)
1223 WRITE(*,*)
'ASPAR, JAA, IAA',sum(aspar), sum(iaa), sum(jaa)
1224 WRITE(*,*)
'AU, FLJAU, FLJU',sum(au), sum(fljau), sum(flju)
1230 CALL runrc (nx, b, x, ipar, fpar, wksp, iniu, aspar, jaa, iaa, au, fljau, flju,
bcgstab)
1233 WRITE(*,*)
'SOLUTION'
1234 WRITE(*,*)
'B, X, AC, U', sum(b), sum(x), sum(ac), sum(u)
1235 WRITE(*,*)
'IPAR, FPAR', sum(ipar), sum(fpar)
1236 WRITE(*,*)
'WKSP, INIU', sum(wksp), sum(iniu)
1237 WRITE(*,*)
'ASPAR, JAA, IAA', sum(aspar), sum(jaa), sum(iaa)
1238 WRITE(*,*)
'AU, FLJAU, FLJU', sum(au), sum(fljau), sum(flju)
1242 u(ip) = max(0.d0,x(ip)*dble(iobpd(ith,ip)))
1244 IF (
refpars(3).LT.0.5.AND.iobpd(ith,ip).EQ.0.AND.iobpa(ip).EQ.0) u(ip)= ac(ip)
1256 IF ( rd2 .GT. 0.001 )
THEN
1257 rd2 = min(1.,max(0.,rd1/rd2))
1267 ip = mapsf(
isbpi(ibi),1)
1268 ac(ip) = ( rd1*
bbpi0(isp,ibi) + rd2*
bbpin(isp,ibi) ) &
1269 *iobpa(ip)*iobpd(ith,ip) /
cg(ik,
isbpi(ibi)) * clats(
isbpi(ibi))
1281 SUBROUTINE w3xypfsfct2 ( ISP, C, LCALC, RD10, RD20, DT, AC)
1344 INTEGER,
INTENT(IN) :: ISP
1345 REAL,
INTENT(IN) :: DT
1346 REAL,
INTENT(IN) :: C(:,:)
1347 DOUBLE PRECISION,
INTENT(INOUT) :: AC(:)
1348 REAL,
INTENT(IN) :: RD10, RD20
1349 LOGICAL,
INTENT(IN) :: LCALC
1359 INTEGER,
SAVE :: IENT = 0
1362 real*8,
PARAMETER :: onesixth = 1.0d0/6.0d0
1363 real*8,
PARAMETER :: onethird = 1.0d0/3.0d0
1364 real*8,
PARAMETER :: thr8 = tiny(1.0d0)
1365 REAL,
PARAMETER :: THR = tiny(1.0)
1372 INTEGER :: IP, IE, IT, I1, I2, I3, I, ITH, IK
1373 INTEGER :: IBI, NI(3)
1381 real*8 :: utilde, boundary_forcing
1383 real*8 :: fl11, fl12, fl21, fl22, fl31, fl32
1384 real*8 :: fl111, fl112, fl211, fl212, fl311, fl312
1385 real*8 :: dtsi(nx), u(nx), dt4ai
1386 real*8 :: dtmaxgl, dtmaxexp, rest
1387 real*8 :: lambda(2), ktmp(3), tmp(3)
1388 real*8 :: bet1(3), betahat(3)
1389 real*8 :: theta_l(3,ntri), theta_h(3,ntri), theta_ace(3,ntri), utmp(3)
1390 real*8 :: wii(2,nx), ul(nx), ustari(2,nx)
1392 real*8 :: pm(nx), pp(nx), uim(nx), uip(nx)
1394 real*8 :: kelem(3,ntri), flall(3,ntri)
1395 real*8 :: kksum(nx), st(nx), beta
1399 CALL strace (ient,
'W3XYPFSFCT2')
1404 ith = 1 + mod(isp-1,nth)
1405 ik = 1 + (isp-1)/nth
1406 dtmaxgl = dble(10.e10)
1415 lambda(1) = onesixth *(c(i1,1)+c(i2,1)+c(i3,1))
1416 lambda(2) = onesixth *(c(i1,2)+c(i2,2)+c(i3,2))
1417 kelem(1,ie) = lambda(1) * ien(ie,1) + lambda(2) * ien(ie,2)
1418 kelem(2,ie) = lambda(1) * ien(ie,3) + lambda(2) * ien(ie,4)
1419 kelem(3,ie) = lambda(1) * ien(ie,5) + lambda(2) * ien(ie,6)
1421 nm(ie) = - 1.d0/min(-thr8,sum(min(0.d0,ktmp)))
1422 fl11 = c(i2,1) * ien(ie,1) + c(i2,2) * ien(ie,2)
1423 fl12 = c(i3,1) * ien(ie,1) + c(i3,2) * ien(ie,2)
1424 fl21 = c(i3,1) * ien(ie,3) + c(i3,2) * ien(ie,4)
1425 fl22 = c(i1,1) * ien(ie,3) + c(i1,2) * ien(ie,4)
1426 fl31 = c(i1,1) * ien(ie,5) + c(i1,2) * ien(ie,6)
1427 fl32 = c(i2,1) * ien(ie,5) + c(i2,2) * ien(ie,6)
1428 fl111 = 2.d0*fl11+fl12
1429 fl112 = 2.d0*fl12+fl11
1430 fl211 = 2.d0*fl21+fl22
1431 fl212 = 2.d0*fl22+fl21
1432 fl311 = 2.d0*fl31+fl32
1433 fl312 = 2.d0*fl32+fl31
1434 flall(1,ie) = (fl311 + fl212)
1435 flall(2,ie) = (fl111 + fl312)
1436 flall(3,ie) = (fl211 + fl112)
1443 kksum(ni) = kksum(ni) + kelem(:,ie)
1447 dtmaxexp = si(ip)/max(dble(10.e-10),kksum(ip)*iobdp(ip))
1448 dtmaxgl = min( dtmaxgl, dtmaxexp)
1450 cflxy = dble(dt)/dtmaxgl
1451 rest = abs(mod(cflxy,1.0d0))
1452 IF (rest .LT. thr8)
THEN
1453 iter(ik,ith) = abs(nint(cflxy))
1454 ELSE IF (rest .GT. thr8 .AND. rest .LT. 0.5d0)
THEN
1455 iter(ik,ith) = abs(nint(cflxy)) + 1
1457 iter(ik,ith) = abs(nint(cflxy))
1461 dt4ai = dble(dt)/dble(
iter(ik,ith))
1462 dtsi(:) = dt4ai/si(:)
1469 DO it = 1,
iter(ik,ith)
1476 ft = - onesixth*dot_product(utmp,flall(:,ie))
1477 tmp = max(0.d0,kelem(:,ie))
1478 utilde = nm(ie) * ( dot_product(tmp,utmp) - ft )
1479 theta_l(:,ie) = tmp * ( utmp - utilde )
1480 IF (abs(ft) .GT. dble(thr))
THEN
1481 bet1(:) = theta_l(:,ie)/ft
1482 IF (any( bet1 .LT. 0.0d0) )
THEN
1483 betahat(1) = bet1(1) + 0.5d0 * bet1(2)
1484 betahat(2) = bet1(2) + 0.5d0 * bet1(3)
1485 betahat(3) = bet1(3) + 0.5d0 * bet1(1)
1486 bet1(1) = max(0.d0,min(betahat(1),1.d0-betahat(2),1.d0))
1487 bet1(2) = max(0.d0,min(betahat(2),1.d0-betahat(3),1.d0))
1488 bet1(3) = max(0.d0,min(betahat(3),1.d0-betahat(1),1.d0))
1489 theta_l(:,ie) = ft * bet1
1492 theta_l(:,ie) = 0.d0
1495 theta_h(:,ie) = (1./3.+2./3.* kelem(:,ie)/sum(abs(kelem(:,ie))) )*ft
1497 theta_ace(:,ie) = ((theta_h(:,ie) - theta_l(:,ie))) * dt4ai/si(ni)
1498 st(ni) = st(ni) + theta_l(:,ie)*dt4ai/si(ni)
1504 ul(ip) = max(0.d0,u(ip)-st(ip))*dble(iobpd(ith,ip))
1507 ustari(1,:) = max(ul,u)
1508 ustari(2,:) = min(ul,u)
1516 pp(ni) = pp(ni) + max( thr8, -theta_ace(:,ie))
1517 pm(ni) = pm(ni) + min( -thr8, -theta_ace(:,ie))
1518 uip(ni) = max(uip(ni), maxval( ustari(1,ni) ))
1519 uim(ni) = min(uim(ni), minval( ustari(2,ni) ))
1522 wii(1,:) = min(1.0d0,(uip-ul)/max( thr8,pp))
1523 wii(2,:) = min(1.0d0,(uim-ul)/min(-thr8,pm))
1529 IF (-theta_ace(i,ie) .GE. 0.)
THEN
1537 st(ni) = st(ni) + beta * theta_ace(:,ie)
1544 u(ip) = max(0.d0,ul(ip)-st(ip))*dble(iobpd(ith,ip))
1546 IF (
refpars(3).LT.0.5.AND.iobpd(ith,ip).EQ.0.AND.iobpa(ip).EQ.0) u(ip)= ac(ip)
1559 rd1=rd10 - dt * real(
iter(ik,ith)-it)/real(
iter(ik,ith))
1561 IF ( rd2 .GT. 0.001 )
THEN
1562 rd2 = min(1.,max(0.,rd1/rd2))
1572 ip = mapsf(
isbpi(ibi),1)
1573 ac(ip) = ( rd1*
bbpi0(isp,ibi) + rd2*
bbpin(isp,ibi) ) &
1648 INTEGER,
SAVE :: IENT = 0
1653 INTEGER :: JSEA, ISEA, IX, IP
1654 real*8,
PARAMETER :: dthr = 10e-6
1656 CALL strace (ient,
'SETDEPTH')
2043 subroutine bcgstab(n, rhs, sol, ipar, fpar, w)
2046 real*8 rhs(n), sol(n), fpar(16), w(n,8)
2091 logical stopbis, brkdn
2092 external ddot, stopbis, brkdn
2095 parameter(one=1.0d0)
2100 real*8 alpha,beta,rho,omega
2106 if (ipar(1).gt.0)
then
2108 SELECT CASE (ipar(10))
2130 else if (ipar(1).lt.0)
then
2136 call bisinit(ipar,fpar,8*n,1,lp,rp,w)
2137 if (ipar(1).lt.0)
return
2149 10 ipar(7) = ipar(7) + 1
2150 ipar(13) = ipar(13) + 1
2152 w(i,1) = rhs(i) - w(i,2)
2154 fpar(11) = fpar(11) + n
2173 fpar(7) =
ddot(n,w,w)
2174 fpar(11) = fpar(11) + 2 * n
2175 fpar(5) = sqrt(fpar(7))
2177 if (abs(ipar(3)).eq.2)
then
2178 fpar(4) = fpar(1) * sqrt(
ddot(n,rhs,rhs)) + fpar(2)
2179 fpar(11) = fpar(11) + 2 * n
2180 else if (ipar(3).ne.999)
then
2181 fpar(4) = fpar(1) * fpar(3) + fpar(2)
2183 if (ipar(3).ge.0) fpar(6) = fpar(5)
2184 if (ipar(3).ge.0 .and. fpar(5).le.fpar(4) .and. ipar(3).ne.999)
then
2224 60 ipar(7) = ipar(7) + 1
2227 alpha =
ddot(n,w(1,1),w(1,5))
2228 fpar(11) = fpar(11) + 2 * n
2229 if (
brkdn(alpha, ipar))
goto 900
2230 alpha = fpar(7) / alpha
2235 w(i,3) = w(i,2) - alpha * w(i,5)
2237 fpar(11) = fpar(11) + 2 * n
2273 90 ipar(7) = ipar(7) + 1
2276 omega =
ddot(n,w(1,4),w(1,4))
2277 fpar(11) = fpar(11) + n + n
2278 if (
brkdn(omega,ipar))
goto 900
2279 omega =
ddot(n,w(1,4),w(1,3)) / omega
2280 fpar(11) = fpar(11) + n + n
2281 if (
brkdn(omega,ipar))
goto 900
2287 w(i,7) = alpha * w(i,6) + omega * w(i,3)
2288 w(i,8) = w(i,8) + w(i,7)
2289 w(i,2) = w(i,3) - omega * w(i,4)
2291 fpar(11) = fpar(11) + 6 * n + 1
2294 if (ipar(3).eq.999)
then
2301 if (
stopbis(n,ipar,2,fpar,w(1,2),w(1,7),one))
goto 900
2302 100
if (ipar(3).eq.999.and.ipar(11).eq.1)
goto 900
2307 fpar(7) =
ddot(n,w(1,2),w(1,1))
2309 beta = fpar(7) * fpar(8) / (fpar(9) * rho)
2311 w(i,6) = w(i,2) + beta * (w(i,6) - omega * w(i,5))
2313 fpar(11) = fpar(11) + 6 * n + 3
2314 if (
brkdn(fpar(7),ipar))
goto 900
2323 if (ipar(1).lt.0) ipar(12) = ipar(1)
2326 ipar(9) = ipar(8) - n
2332 call tidycg(n,ipar,fpar,sol,w(1,7))
2334 call tidycg(n,ipar,fpar,sol,w(1,8))
2341 subroutine implu(np,umm,beta,ypiv,u,permut,full)
2342 real*8 umm,beta,ypiv(*),u(*),x, xpiv
2343 logical full, perm, permut(*)
2349 if (np .le. 1)
goto 12
2355 if (.not. permut(k))
goto 5
2359 5 u(k+1) = u(k+1) - ypiv(k)*u(k)
2365 perm = (beta .gt. abs(umm))
2366 if (.not. perm)
goto 4
2373 if (.not. full)
return
2377 permut(k) = permut(k+1)
2381 end subroutine implu
2383 subroutine uppdir(n,p,np,lbp,indp,y,u,usav,flops)
2386 integer :: k,np,n,npm1,j,ju,indp,lbp
2387 real*8 :: p(n,lbp), y(*), u(*), usav(*), x, flops
2395 parameter(zero=0.0d0)
2398 if (np .le. 1)
goto 12
2401 10
if (j .le. 0) j=lbp
2403 if (x .eq. zero)
goto 115
2405 y(k) = y(k) - x*p(k,j)
2410 if (ju .ge. 1)
goto 10
2412 if (indp .gt. lbp) indp = 1
2422 subroutine givens(x,y,c,s)
2431 real*8 :: t,one,zero
2432 parameter(zero=0.0d0,one=1.0d0)
2434 if (x.eq.zero .and. y.eq.zero)
then
2437 else if (abs(y).gt.abs(x))
then
2440 s = sign(one / x, y)
2442 else if (abs(y).le.abs(x))
then
2445 c = sign(one / y, x)
2464 logical function stopbis(n,ipar,mvpi,fpar,r,delx,sx)
2466 integer n,mvpi,ipar(16)
2467 real*8 fpar(16), r(n), delx(n), sx,
ddot
2473 if (ipar(11) .eq. 1)
then
2478 if (ipar(6).gt.0 .and. ipar(7).ge.ipar(6))
then
2486 fpar(5) = sqrt(
ddot(n,r,r))
2487 fpar(11) = fpar(11) + 2 * n
2488 if (ipar(3).lt.0)
then
2492 fpar(6) = sx * sqrt(
ddot(n,delx,delx))
2493 fpar(11) = fpar(11) + 2 * n
2494 if (ipar(7).lt.mvpi+mvpi+1)
then
2499 if (ipar(3).eq.-1)
then
2500 fpar(4) = fpar(1) * fpar(3) + fpar(2)
2510 if (fpar(6).gt.fpar(4))
then
2522 subroutine tidycg(n,ipar,fpar,sol,delx)
2524 integer i,n,ipar(16)
2525 real*8 fpar(16),sol(n),delx(n)
2530 parameter(zero=0.0d0)
2532 if (ipar(12).ne.0)
then
2534 else if (ipar(1).gt.0)
then
2535 if ((ipar(3).eq.999 .and. ipar(11).eq.1) .or. &
2536 & fpar(6).le.fpar(4))
then
2538 else if (ipar(7).ge.ipar(6) .and. ipar(6).gt.0)
then
2544 if (fpar(3).gt.zero .and. fpar(6).gt.zero .and. ipar(7).gt.ipar(13))
then
2545 fpar(7) = log10(fpar(3) / fpar(6)) / dble(ipar(7)-ipar(13))
2550 sol(i) = sol(i) + delx(i)
2556 logical function brkdn(alpha, ipar)
2559 real*8 alpha, beta, zero, one
2560 parameter(zero=0.0d0, one=1.0d0)
2569 if (alpha.gt.zero)
then
2571 if (.not. beta.gt.zero)
then
2575 else if (alpha.lt.zero)
then
2577 if (.not. beta.lt.zero)
then
2581 else if (alpha.eq.zero)
then
2592 subroutine bisinit(ipar,fpar,wksize,dsc,lp,rp,wk)
2594 integer i,ipar(16),wksize,dsc
2596 real*8 fpar(16),wk(*)
2601 parameter(zero=0.0d0, one=1.0d0)
2606 if (ipar(4).lt.wksize)
then
2612 if (ipar(2).gt.2)
then
2615 else if (ipar(2).eq.2)
then
2618 else if (ipar(2).eq.1)
then
2625 if (ipar(3).eq.0) ipar(3) = dsc
2639 if (fpar(1).lt.zero .or. fpar(1).ge.one .or. fpar(2).lt.zero .or. &
2640 & (fpar(1).eq.zero .and. fpar(2).eq.zero))
then
2641 if (ipar(1).eq.0)
then
2653 if (fpar(11).lt.zero) fpar(11) = zero
2663 subroutine mgsro(full,lda,n,m,ind,ops,vec,hh,ierr)
2666 integer lda,m,n,ind,ierr
2667 real*8 ops,hh(m),vec(lda,m)
2699 real*8 nrm0, nrm1, fct, thr,
ddot, zero, one, reorth
2700 parameter(zero=0.0d0, one=1.0d0, reorth=0.98d0)
2705 nrm0 =
ddot(n,vec(1,ind),vec(1,ind))
2708 if (nrm0.le.zero)
then
2711 else if (nrm0.gt.zero .and. one/nrm0.gt.zero)
then
2722 fct =
ddot(n,vec(1,ind),vec(1,i))
2725 vec(k,ind) = vec(k,ind) - fct * vec(k,i)
2727 ops = ops + 4 * n + 2
2728 if (fct*fct.gt.thr)
then
2729 fct =
ddot(n,vec(1,ind),vec(1,i))
2732 vec(k,ind) = vec(k,ind) - fct * vec(k,i)
2736 nrm0 = nrm0 - hh(i) * hh(i)
2737 if (nrm0.lt.zero) nrm0 = zero
2743 fct =
ddot(n,vec(1,ind),vec(1,i))
2746 vec(k,ind) = vec(k,ind) - fct * vec(k,i)
2748 ops = ops + 4 * n + 2
2749 if (fct*fct.gt.thr)
then
2750 fct =
ddot(n,vec(1,ind),vec(1,i))
2753 vec(k,ind) = vec(k,ind) - fct * vec(k,i)
2757 nrm0 = nrm0 - hh(i) * hh(i)
2758 if (nrm0.lt.zero) nrm0 = zero
2764 nrm1 = sqrt(
ddot(n,vec(1,ind),vec(1,ind)))
2767 if (nrm1.le.zero)
then
2776 vec(k,ind) = vec(k,ind) * fct
2785 end subroutine mgsro
2819 subroutine amux (n, x, y, a,ja,ia)
2820 real*8 x(*), y(*), a(*)
2821 integer n, ja(*), ia(*)
2851 do k=ia(i), ia(i+1)-1
2852 t = t + a(k)*x(ja(k))
2865 subroutine amuxms (n, x, y, a,ja)
2866 real*8 x(*), y(*), a(*)
2897 do k=ja(i), ja(i+1)-1
2898 y(i) = y(i) + a(k) *x(ja(k))
2907 subroutine atmux (n, x, y, a, ja, ia)
2908 real*8 x(*), y(*), a(*)
2909 integer n, ia(*), ja(*)
2946 do k=ia(i), ia(i+1)-1
2947 y(ja(k)) = y(ja(k)) + x(i)*a(k)
2954 end subroutine atmux
2956 subroutine atmuxr (m, n, x, y, a, ja, ia)
2957 real*8 x(*), y(*), a(*)
2958 integer m, n, ia(*), ja(*)
2995 do k=ia(i), ia(i+1)-1
2996 y(ja(k)) = y(ja(k)) + x(i)*a(k)
3005 subroutine amuxe (n,x,y,na,ncol,a,ja)
3008 integer :: n, na, ncol, ja(na,*)
3009 real*8 :: x(n), y(n), a(na,*)
3045 y(i) = y(i)+a(i,j)*x(ja(i,j))
3052 end subroutine amuxe
3054 subroutine amuxd (n,x,y,diag,ndiag,idiag,ioff)
3055 integer n, ndiag, idiag, ioff(idiag)
3056 real*8 x(n), y(n), diag(ndiag,idiag)
3087 integer j, k, io, i1, i2
3097 y(k) = y(k)+diag(k,j)*x(k+io)
3104 end subroutine amuxd
3106 subroutine amuxj (n, x, y, jdiag, a, ja, ia)
3107 integer n, jdiag, ja(*), ia(*)
3108 real*8 x(n), y(n), a(*)
3142 integer i, ii, k1, ilen, j
3149 ilen = ia(ii+1)-k1-1
3151 y(j)= y(j)+a(k1+j)*x(ja(k1+j))
3158 end subroutine amuxj
3160 subroutine vbrmv(nr, nc, ia, ja, ka, a, kvstr, kvstc, x, b)
3162 integer nr, nc, ia(nr+1), ja(*), ka(*), kvstr(nr+1), kvstc(*)
3163 real*8 a(*), x(*), b(*)
3183 integer n, i, j, ii, jj, k, istart, istop
3194 istop = kvstr(i+1)-1
3195 do j = ia(i), ia(i+1)-1
3196 do jj = kvstc(ja(j)), kvstc(ja(j)+1)-1
3198 do ii = istart, istop
3199 b(ii) = b(ii) + xjj*a(k)
3207 end subroutine vbrmv
3214 subroutine lsol (n,x,y,al,jal,ial)
3215 integer n, jal(*),ial(n+1)
3216 real*8 x(n), y(n), al(*)
3246 do j = ial(k), ial(k+1)-1
3247 t = t-al(j)*x(jal(j))
3257 subroutine ldsol (n,x,y,al,jal)
3259 real*8 x(n), y(n), al(*)
3290 do j = jal(k), jal(k+1)-1
3291 t = t - al(j)*x(jal(j))
3298 end subroutine ldsol
3300 subroutine lsolc (n,x,y,al,jal,ial)
3301 integer n, jal(*),ial(*)
3302 real*8 x(n), y(n), al(*)
3334 do j = ial(k), ial(k+1)-1
3335 x(jal(j)) = x(jal(j)) - t*al(j)
3342 end subroutine lsolc
3344 subroutine ldsolc (n,x,y,al,jal)
3346 real*8 x(n), y(n), al(*)
3381 do j = jal(k), jal(k+1)-1
3382 x(jal(j)) = x(jal(j)) - t*al(j)
3391 subroutine ldsoll (n,x,y,al,jal,nlev,lev,ilev)
3392 integer n, nlev, jal(*), ilev(nlev+1), lev(n)
3393 real*8 x(n), y(n), al(*)
3418 integer ii, jrow, i, k
3427 do i=ilev(ii), ilev(ii+1)-1
3433 do k=jal(jrow), jal(jrow+1)-1
3434 t = t - al(k)*x(jal(k))
3436 x(jrow) = t*al(jrow)
3443 subroutine usol (n,x,y,au,jau,iau)
3444 integer n, jau(*),iau(n+1)
3445 real*8 x(n), y(n), au(*)
3475 do j = iau(k), iau(k+1)-1
3476 t = t - au(j)*x(jau(j))
3486 subroutine udsol (n,x,y,au,jau)
3488 real*8 x(n), y(n),au(*)
3519 do j = jau(k), jau(k+1)-1
3520 t = t - au(j)*x(jau(j))
3528 end subroutine udsol
3530 subroutine usolc (n,x,y,au,jau,iau)
3531 real*8 x(*), y(*), au(*)
3532 integer n, jau(*),iau(*)
3564 do j = iau(k), iau(k+1)-1
3565 x(jau(j)) = x(jau(j)) - t*au(j)
3572 end subroutine usolc
3574 subroutine udsolc (n,x,y,au,jau)
3576 real*8 x(n), y(n), au(*)
3610 do j = jau(k), jau(k+1)-1
3611 x(jau(j)) = x(jau(j)) - t*au(j)
3620 subroutine lusol(n, y, x, alu, jlu, ju)
3623 integer :: n, jlu(*), ju(*)
3624 real*8 :: x(n), y(n), alu(*)
3634 x(i) = x(i) - alu(k)* x(jlu(k))
3638 do k=ju(i),jlu(i+1)-1
3639 x(i) = x(i) - alu(k)*x(jlu(k))
3646 end subroutine lusol
3648 subroutine lutsol(n, y, x, alu, jlu, ju)
3651 integer :: n, jlu(*), ju(*)
3652 real*8 :: x(n), y(n), alu(*)
3666 x(i) = x(i) * alu(i)
3667 do k=ju(i),jlu(i+1)-1
3668 x(jlu(k)) = x(jlu(k)) - alu(k)* x(i)
3676 x(jlu(k)) = x(jlu(k)) - alu(k)*x(i)
3685 subroutine qsplit(a,ind,n,ncut)
3688 integer :: n, ind(n), ncut
3701 real*8 :: tmp, abskey
3702 integer :: itmp, first, last, j, mid
3706 if (ncut .lt. first .or. ncut .gt. last)
return
3711 abskey = abs(a(mid))
3713 if (abs(a(j)) .gt. abskey)
then
3732 ind(mid) = ind(first)
3737 if (mid .eq. ncut)
return
3738 if (mid .gt. ncut)
then
3747 subroutine runrc(n,rhs,sol,ipar,fpar,wk,guess,a,ja,ia,au,jau,ju,solver)
3749 integer n,ipar(16),ia(n+1),ja(*),ju(*),jau(*)
3750 real*8 fpar(16),rhs(n),sol(n),guess(n),wk(*),a(*),au(*)
3769 if (ipar(2).gt.2)
then
3770 WRITE(*,*)
'I can not do both left and right preconditioning.'
3783 10
call solver(n,rhs,sol,ipar,fpar,wk)
3785 if (ipar(7).ne.its)
then
3788 if (ipar(1).eq.1)
then
3789 call amux(n, wk(ipar(8)), wk(ipar(9)), a, ja, ia)
3791 else if (ipar(1).eq.2)
then
3792 call atmux(n, wk(ipar(8)), wk(ipar(9)), a, ja, ia)
3794 else if (ipar(1).eq.3 .or. ipar(1).eq.5)
then
3795 call lusol(n,wk(ipar(8)),wk(ipar(9)),au,jau,ju)
3797 else if (ipar(1).eq.4 .or. ipar(1).eq.6)
then
3798 call lutsol(n,wk(ipar(8)),wk(ipar(9)),au,jau,ju)
3800 else if (ipar(1).le.0)
then
3801 if (ipar(1).eq.0)
then
3803 else if (ipar(1).eq.-1)
then
3804 WRITE(*,*)
'Iterative solver has iterated too many times.'
3805 else if (ipar(1).eq.-2)
then
3806 WRITE(*,*)
'Iterative solver was not given enough work space.'
3807 WRITE(*,*)
'The work space should at least have ', ipar(4), &
3809 else if (ipar(1).eq.-3)
then
3810 WRITE(*,*)
'Iterative sovler is facing a break-down.'
3812 WRITE(*,*)
'Iterative solver terminated. code =', ipar(1)
3815 end subroutine runrc
3826 subroutine ilut(n,a,ja,ia,lfil,droptol,alu,jlu,ju,iwk,w,jw,ierr)
3830 real*8 a(*),alu(*),w(n+1),droptol
3831 integer ja(*),ia(n+1),jlu(*),ju(n),jw(2*n),lfil,iwk,ierr
3915 integer ju0,k,j1,j2,j,ii,i,lenl,lenu,jj,jrow,jpos,lenn
3916 real*8 tnorm, t, abs, s, fact
3917 if (lfil .lt. 0)
goto 998
3940 tnorm = tnorm+abs(a(k))
3942 if (abs(tnorm) .lt. tiny(1.))
goto 999
3944 tnorm = tnorm/real(j2-j1+1)
3962 else if (k .eq. ii)
then
3978 if (jj .gt. lenl)
goto 160
3989 if (jw(j) .lt. jrow)
then
4015 fact = w(jj)*alu(jrow)
4016 if (abs(fact) .le. droptol)
goto 150
4020 do k = ju(jrow), jlu(jrow+1)-1
4028 if (jpos .eq. 0)
then
4033 if (lenu .gt. n)
goto 995
4042 w(jpos) = w(jpos) - s
4049 if (jpos .eq. 0)
then
4054 if (lenl .gt. n)
goto 995
4062 w(jpos) = w(jpos) - s
4079 jw(n+jw(ii+k-1)) = 0
4085 lenn = min0(lenl,lfil)
4089 call qsplit (w,jw,lenl,lenn)
4094 if (ju0 .gt. iwk)
goto 996
4108 if (abs(w(ii+k)) .gt. droptol*tnorm)
then
4110 w(ii+lenn) = w(ii+k)
4111 jw(ii+lenn) = jw(ii+k)
4115 lenn = min0(lenu,lfil)
4117 call qsplit (w(ii+1), jw(ii+1), lenu-1,lenn)
4122 if (lenn + ju0 .gt. iwk)
goto 997
4133 if (abs(w(ii)) .lt. tiny(1.d0)) w(ii) = (0.0001d0 + droptol)*tnorm
4135 alu(ii) = 1.0d0/ w(ii)
4176 subroutine ilu0(n, a, ja, ia, alu, jlu, ju, iw, ierr)
4179 real*8 a(*), alu(*), tl
4180 integer n, ju0, ii, jj, i, j, jcol, js, jf, jm, jrow, jw, ierr
4181 integer ja(*), ia(*), ju(*), jlu(*), iw(n)
4189 do j=ia(ii),ia(ii+1)-1
4191 if (jcol .eq. ii)
then
4208 tl = alu(j)*alu(jrow)
4211 do jj = ju(jrow), jlu(jrow+1)-1
4214 alu(jw) = alu(jw) - tl*alu(jj)
4220 if (abs(alu(ii)) .lt. tiny(1.))
goto 600
4221 alu(ii) = 1.0d0/alu(ii)
4239 subroutine pgmres(n, im, rhs, sol, eps, maxits, aspar, nnz, ia, ja, alu, jlu, ju, vv, ierr)
4244 integer :: n, im, maxits, ierr, nnz
4246 integer :: ja(nnz), ia(n+1)
4247 integer :: jlu(nnz+1), ju(n)
4248 real*8 :: vv(n,im+1), alu(nnz+1)
4249 real*8 :: aspar(nnz)
4251 real*8 :: rhs(*), sol(*)
4254 real*8 :: eps1, epsmac, gam, t,
ddot,
dnrm2, ro, tl
4256 integer :: i,i1,j,jj,k,k1,iii,ii,ju0
4257 integer :: its,jrow,jcol,jf,jm,js,jw
4259 real*8 :: hh(im+1,im), c(im), s(im), rs(im+1)
4262 logical :: lblas = .false.
4263 logical :: lilu = .true.
4275 do j=ia(ii),ia(ii+1)-1
4277 if (jcol .eq. ii)
then
4294 tl = alu(j)*alu(jrow)
4297 do jj = ju(jrow), jlu(jrow+1)-1
4298 jw = int(iw(jlu(jj)))
4300 alu(jw) = alu(jw) - tl*alu(jj)
4306 if (abs(alu(ii)) .lt. epsmac)
then
4307 write (*,*)
'zero pivot'
4310 alu(ii) = 1.0d0/alu(ii)
4323 call amux (n, sol, vv, aspar, ja, ia)
4327 do k = ia(iii), ia(iii+1)-1
4328 t = t + aspar(k) * sol(ja(k))
4334 vv(j,1) = rhs(j) - vv(j,1)
4339 ro = sqrt(sum(vv(:,1)*vv(:,1)))
4341 if (abs(ro) .lt. epsmac)
goto 999
4346 if (its .eq. 0) eps1=eps*ro
4354 call lusol (n, vv(1,i), rhs, alu, jlu, ju)
4355 call amux (n, rhs, vv(1,i1), aspar, ja, ia)
4358 rhs(iii) = vv(iii,i)
4359 do k=jlu(iii),ju(iii)-1
4360 rhs(iii) = rhs(iii) - alu(k)* rhs(jlu(k))
4364 do k=ju(iii),jlu(iii+1)-1
4365 rhs(iii) = rhs(iii) - alu(k)*rhs(jlu(k))
4367 rhs(iii) = alu(iii)*rhs(iii)
4371 do k = ia(iii), ia(iii+1)-1
4372 t = t + aspar(k) * rhs(ja(k))
4380 t =
ddot(n, vv(1,j),vv(1,i1))
4382 call daxpy(n, -t, vv(1,j), 1, vv(1,i1), 1)
4383 t =
dnrm2(n, vv(1,i1))
4389 t = t + vv(iii,j)*vv(iii,i1)
4392 vv(:,i1) = vv(:,i1) - t * vv(:,j)
4393 t = sqrt(sum(vv(:,i1)*vv(:,i1)))
4397 if ( abs(t) .lt. epsmac)
goto 58
4400 vv(k,i1) = vv(k,i1)*t
4403 58
if (i .eq. 1)
goto 121
4407 hh(k1,i) = c(k1)*t + s(k1)*hh(k,i)
4408 hh(k,i) = -s(k1)*t + c(k1)*hh(k,i)
4410 121 gam = sqrt(hh(i,i)**2 + hh(i1,i)**2)
4411 if (abs(gam) .lt. epsmac) gam = epsmac
4415 rs(i1) = -s(i)*rs(i)
4418 hh(i,i) = c(i)*hh(i,i) + s(i)*hh(i1,i)
4420 if (i .lt. im .and. (ro .gt. eps1))
goto 4
4422 rs(i) = rs(i)/hh(i,i)
4440 rhs(k) = rhs(k)+t*vv(k,j)
4445 call lusol (n, rhs, rhs, alu, jlu, ju)
4448 do k=jlu(iii),ju(iii)-1
4449 rhs(iii) = rhs(iii) - alu(k)* rhs(jlu(k))
4453 do k=ju(iii),jlu(iii+1)-1
4454 rhs(iii) = rhs(iii) - alu(k)*rhs(jlu(k))
4456 rhs(iii) = alu(iii)*rhs(iii)
4460 sol(k) = sol(k) + rhs(k)
4463 if (ro .le. eps1)
goto 990
4464 if (its .ge. maxits)
goto 991
4468 rs(jj-1) = -s(jj-1)*rs(jj)
4469 rs(jj) = c(jj-1)*rs(jj)
4473 if (j .eq. 1) t = t-1.0d0
4475 call daxpy (n, t, vv(1,j), 1, vv, 1)
4477 vv(:,j) = vv(:,j) + t * vv(:,1)
4498 DOUBLE PRECISION FUNCTION dnrm2(N,X)
4503 DOUBLE PRECISION x(*)
4524 DOUBLE PRECISION one,zero
4525 parameter(one=1.0d+0,zero=0.0d+0)
4528 DOUBLE PRECISION absxi,norm,scale,ssq
4536 ELSE IF (n.EQ.1)
THEN
4546 IF (x(ix).NE.zero)
THEN
4548 IF (scale.LT.absxi)
THEN
4549 ssq = one + ssq* (scale/absxi)**2
4552 ssq = ssq + (absxi/scale)**2
4556 norm = scale*sqrt(ssq)
4567 SUBROUTINE dlassq( N, X, SCALE, SUMSQ )
4573 DOUBLE PRECISION SCALE, SUMSQ
4574 DOUBLE PRECISION X( * )
4589 DOUBLE PRECISION ZERO
4590 parameter( zero = 0.0d+0 )
4592 DOUBLE PRECISION ABSXI
4596 DO ix = 1, 1 + ( n-1 )
4597 IF( x( ix ).NE.zero )
THEN
4598 absxi = abs( x( ix ) )
4599 IF( scale.LT.absxi )
THEN
4600 sumsq = 1 + sumsq*( scale / absxi )**2
4603 sumsq = sumsq + ( absxi / scale )**2
4612 double precision function ddot(n,dx,dy)
4618 double precision dx(*),dy(*),dtemp
4626 if( m .eq. 0 )
go to 40
4628 dtemp = dtemp + dx(i)*dy(i)
4630 if( n .lt. 5 )
go to 60
4633 dtemp = dtemp + dx(i)*dy(i) + dx(i + 1)*dy(i + 1) + &
4634 & dx(i + 2)*dy(i + 2) + dx(i + 3)*dy(i + 3) + dx(i + 4)*dy(i + 4)
4640 subroutine daxpy(n,da,dx,incx,dy,incy)
4646 double precision dx(1),dy(1),da
4647 integer i,incx,incy,ix,iy,m,mp1,n
4650 if (abs(da) .lt. tiny(1.d0))
return
4651 if(incx.eq.1.and.incy.eq.1)
go to 20
4658 if(incx.lt.0)ix = (-n+1)*incx + 1
4659 if(incy.lt.0)iy = (-n+1)*incy + 1
4661 dy(iy) = dy(iy) + da*dx(ix)
4673 if( m .eq. 0 )
go to 40
4675 dy(i) = dy(i) + da*dx(i)
4677 if( n .lt. 4 )
return
4680 dy(i) = dy(i) + da*dx(i)
4681 dy(i + 1) = dy(i + 1) + da*dx(i + 1)
4682 dy(i + 2) = dy(i + 2) + da*dx(i + 2)
4683 dy(i + 3) = dy(i + 3) + da*dx(i + 3)
4686 end subroutine daxpy