1
1
c
2
- c $Id : nksol .m ,v 7.1 2019 / 10 / 14 22 : 59 : 29 meyer8 Exp $
2
+ c $Id : nksol .m ,v 7.2 2020 / 02 / 12 18 : 35 : 18 meyer8 Exp $
3
3
c
4
4
5
5
c ! include "../mppl.h"
@@ -811,7 +811,9 @@ ccc write(*,*) 'epsmch = ', epsmch
811
811
c-----------------------------------------------------------------------
812
812
c initialize parameters. check for illegal input.
813
813
c-----------------------------------------------------------------------
814
- if ( (iabs(mf) .lt. 1) .or. (iabs(mf) .gt. 3) ) then
814
+
815
+ c:MVU 15-jan-2020 if ( (iabs(mf) .lt. 1) .or. (iabs(mf) .gt. 3) ) then
816
+ if ( (iabs(mf) .lt. 1) .or. (iabs(mf) .gt. 4) ) then
815
817
c illegal value of method flag mf.
816
818
iterm = -1
817
819
ierr = 10
@@ -832,9 +834,21 @@ call errgen(ierr,zero,zero,0,0)
832
834
elseif (mf .eq. -1) then
833
835
methn = 0
834
836
methk = 2
835
- elseif (mf .ge. 2) then
837
+ ccc MVU: 15-jan-2020
838
+ c elseif (mf .ge. 2) then
839
+ c methn = 2
840
+ c methk = mf - 1
841
+ elseif (mf .eq. 2) then
842
+ methn = 2
843
+ methk = 1
844
+ elseif (mf .eq. 3) then
836
845
methn = 2
837
- methk = mf - 1
846
+ methk = 2
847
+ elseif (mf .eq. 4) then
848
+ c........ using direct solver
849
+ methn = 2
850
+ methk = 3
851
+ ccc MVU: 15-jan-2020
838
852
elseif (mf .le. -2) then
839
853
methn = 0
840
854
methk = -mf - 1
@@ -920,6 +934,10 @@ call errgen(ierr,rwork(i),zero,i,0)
920
934
lenk = 1 + 3*n + 3 + n*mmax + n + mmax**2
921
935
else if (methk .eq. 2) then
922
936
lenk = 1 + 3*n + 3 + n*mmax + n + 2 + 2*mmax*(mmax+1) + mmax
937
+ ccc MVU: 15-jan-2020
938
+ else if (methk .eq. 3) then
939
+ lenk = 1 + 3*n + 3 + n*mmax + n + 2 + 2*mmax*(mmax+1) + mmax
940
+ ccc MVU: 15-jan-2020
923
941
endif
924
942
lenwm = lenk + lenwmp
925
943
if (lenwmp .ne. 0) then
@@ -1565,6 +1583,9 @@ dimension u(*), savf(n), su(n), sf(n), wm(lenwm), iwm(leniwm),
1565
1583
c methods used so far:
1566
1584
c 1. methk = 1 ------> spiom
1567
1585
c 2. methk = 2 ------> gmres
1586
+ ccc MVU: 15-jan-2020
1587
+ c 3. methk = 3 ------> direct
1588
+ ccc MVU: 15-jan-2020
1568
1589
c-----------------------------------------------------------------------
1569
1590
integer i, ib, iflag, ihes, iv, miom
1570
1591
real bnrm
@@ -1578,7 +1599,7 @@ dimension u(*), savf(n), su(n), sf(n), wm(lenwm), iwm(leniwm),
1578
1599
save
1579
1600
c
1580
1601
iersl = 0
1581
- go to (100,200), methk
1602
+ go to (100,200,300 ), methk
1582
1603
c-----------------------------------------------------------------------
1583
1604
c use the spiom algorithm to solve the linear system j*x = -f.
1584
1605
c-----------------------------------------------------------------------
@@ -1628,6 +1649,56 @@ call scopy (mmax, wm(ib), 1, wm(ihes), 1)
1628
1649
iwm(1) = mgmr
1629
1650
endif
1630
1651
return
1652
+
1653
+ ccc MVU: 15-jan-2020
1654
+ c-----------------------------------------------------------------------
1655
+ c use the direct algorithm to solve the linear system j*x = -f.
1656
+ c-----------------------------------------------------------------------
1657
+ 300 continue
1658
+ mmaxp1 = mmax + 1
1659
+ iv = 3
1660
+ ib = iv + n*mmax
1661
+ ihes = ib + n + 1
1662
+ ihsv = ihes + mmax*(mmaxp1+1) + 1
1663
+ iwk = ihsv + mmax*mmaxp1
1664
+ iq = iwk + n
1665
+ do 310 i = 1,n
1666
+ 310 wm(i+ib-1) = x(i)
1667
+
1668
+ ccc - this is direct solver
1669
+ do i=1,n
1670
+ x(i)=x(i)*sf(i)/su(i)
1671
+ enddo
1672
+ call psol(n, u, savf, su, sf, f, jac, wm(iwk), wm(locwmp),
1673
+ * iwm(locimp), x, iflag)
1674
+ npsl = 1
1675
+ bnrm = 0.
1676
+ mgmr = 1
1677
+ rhom = 0.
1678
+
1679
+ ccc - this way mfnksol=4 would identically match mfnksol=3
1680
+ c$$$ call spigmr (n, u, savf, wm(ib), su, sf, mmax, mmaxp1, kmp,
1681
+ c$$$ * eps, f, jac, psol, npsl, x, wm(iv), wm(ihes), wm(iq),
1682
+ c$$$ * wm(ihsv), mgmr, wm(locwmp), iwm(locimp), wm(iwk), methn,
1683
+ c$$$ * bnrm, ipflg, iflag, rhom)
1684
+
1685
+ nni = nni + 1
1686
+ nli = nli + mgmr
1687
+ nps = nps + npsl
1688
+ if (iflag .ne. 0) ncfl = ncfl + 1
1689
+ if (iflag .ge. 2) iersl = 1
1690
+ if (iflag .lt. 0) iersl = -1
1691
+ if (iersl .eq. 0) then
1692
+ call scopy (mmax, wm(ib), 1, wm(ihes), 1)
1693
+ wm(1) = bnrm
1694
+ iwm(1) = mgmr
1695
+ endif
1696
+ return
1697
+ ccc MVU: 15-jan-2020
1698
+
1699
+
1700
+
1701
+
1631
1702
c----------------------- end of subroutine solpk -----------------------
1632
1703
end
1633
1704
subroutine spiom (n, u, savf, b, su, sf, mmax, iomp, eps,
@@ -3186,6 +3257,9 @@ call cnstrt (n, u, p, icnstr, tau, rlx, iret, ivar)
3186
3257
slpi = -two*f1nrm*ratio
3187
3258
CCC should an adjf1 be used for f1nrm above??
3188
3259
if (methk .eq. 2) slpi = slpi + rhom*rhom*ratio
3260
+ ccc MVU: 15-jan-2020
3261
+ if (methk .eq. 3) slpi = slpi + rhom*rhom*ratio
3262
+ ccc MVU: 15-jan-2020
3189
3263
call slngth(n, u, p, su, rlngth)
3190
3264
rlmin = stptol/rlngth
3191
3265
rl = one
@@ -3368,7 +3442,7 @@ subroutine errgen (ierr, v1, v2, i1, i2)
3368
3442
c-----------------------------------------------------------------------
3369
3443
9000 format(//
3370
3444
* ' nksol --- illegal value for mf. mf must be between '
3371
- */' 1 and 3 , or between -3 and -1.'
3445
+ */' 1 and 4 , or between -3 and -1.'
3372
3446
*)
3373
3447
9010 format(//
3374
3448
* ' nksol --- illegal value for mdif. mdif must either 0 or 1. '
0 commit comments