1*1e99f302SBen Matthews! This software is Copyright (c) 2012-2015 The Regents of the 2*1e99f302SBen Matthews! University of California. All Rights Reserved. 3*1e99f302SBen Matthews! 4*1e99f302SBen Matthews! Permission to copy and modify this software and its documentation 5*1e99f302SBen Matthews! for educational, research and non-profit purposes, without fee, 6*1e99f302SBen Matthews! and without a written agreement is hereby granted, provided that 7*1e99f302SBen Matthews! the above copyright notice, this paragraph and the following three 8*1e99f302SBen Matthews! paragraphs appear in all copies. 9*1e99f302SBen Matthews! 10*1e99f302SBen Matthews! Permission to make commercial use of this software may be obtained 11*1e99f302SBen Matthews! by contacting: 12*1e99f302SBen Matthews! 13*1e99f302SBen Matthews! Technology Transfer Office 14*1e99f302SBen Matthews! 9500 Gilman Drive, Mail Code 0910 15*1e99f302SBen Matthews! University of California 16*1e99f302SBen Matthews! La Jolla, CA 92093-0910 17*1e99f302SBen Matthews! (858) 534-5815 18*1e99f302SBen Matthews! invent@ucsd.edu 19*1e99f302SBen Matthews! 20*1e99f302SBen Matthews! This software program and documentation are copyrighted by The 21*1e99f302SBen Matthews! Regents of the University of California. The software program and 22*1e99f302SBen Matthews! documentation are supplied "as is", without any accompanying 23*1e99f302SBen Matthews! services from The Regents. The Regents does not warrant that the 24*1e99f302SBen Matthews! operation of the program will be uninterrupted or error-free. The 25*1e99f302SBen Matthews! end-user understands that the program was developed for research 26*1e99f302SBen Matthews! purposes and is advised not to rely exclusively on the program for 27*1e99f302SBen Matthews! any reason. 28*1e99f302SBen Matthews! 29*1e99f302SBen Matthews! IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY 30*1e99f302SBen Matthews! PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL 31*1e99f302SBen Matthews! DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS 32*1e99f302SBen Matthews! SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF 33*1e99f302SBen Matthews! CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34*1e99f302SBen Matthews! THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY 35*1e99f302SBen Matthews! WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 36*1e99f302SBen Matthews! OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE 37*1e99f302SBen Matthews! SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE 38*1e99f302SBen Matthews! UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE 39*1e99f302SBen Matthews! MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 40*1e99f302SBen Matthews 41*1e99f302SBen Matthews SUBROUTINE NSSOLVER(nFaces, gnNo, dof, nNo, nnz, mynNo, commu, 42*1e99f302SBen Matthews 2 cS, face, ls, rowPtr, colPtr, Val, Ri) 43*1e99f302SBen Matthews 44*1e99f302SBen Matthews INCLUDE "svLS_STD.h" 45*1e99f302SBen Matthews 46*1e99f302SBen Matthews 47*1e99f302SBen Matthews INTEGER, INTENT(IN) :: nFaces, gnNo, dof, nNo, nnz, mynNo 48*1e99f302SBen Matthews TYPE(svLS_commuType), INTENT(IN) :: commu 49*1e99f302SBen Matthews TYPE(svLS_cSType), INTENT(IN) :: cS(commu%nTasks) 50*1e99f302SBen Matthews TYPE(svLS_faceType), INTENT(INOUT) :: face(nFaces) 51*1e99f302SBen Matthews TYPE(svLS_lsType), INTENT(INOUT) :: ls 52*1e99f302SBen Matthews INTEGER, INTENT(IN) :: rowPtr(2,nNo), colPtr(nnz) 53*1e99f302SBen Matthews REAL*8, INTENT(IN) :: Val(dof*dof,nnz) 54*1e99f302SBen Matthews REAL*8, INTENT(INOUT) :: Ri(dof,nNo) 55*1e99f302SBen Matthews 56*1e99f302SBen Matthews INTEGER i, j, k, iB, iBB, nB, nsd 57*1e99f302SBen Matthews REAL*8 CPUT, NORMS, NORMV, DOTS, DOTV, eps 58*1e99f302SBen Matthews REAL*8, ALLOCATABLE :: U(:,:,:), P(:,:), 59*1e99f302SBen Matthews 2 MU(:,:,:), MP(:,:), A(:,:), B(:), xB(:), mK(:,:), mG(:,:), 60*1e99f302SBen Matthews 3 mD(:,:), mL(:), Gt(:,:), Rm(:,:), Rc(:), Rmi(:,:), Rci(:) 61*1e99f302SBen Matthews 62*1e99f302SBen Matthews nsd = dof - 1 63*1e99f302SBen Matthews iB = ls%RI%mItr 64*1e99f302SBen Matthews nB = 2*iB 65*1e99f302SBen Matthews ALLOCATE(Rm(nsd,nNo), Rc(nNo), Rmi(nsd,nNo), Rci(nNo), 66*1e99f302SBen Matthews 2 U(nsd,nNo,iB), P(nNo,iB), MU(nsd,nNo,nB), MP(nNo,nB), 67*1e99f302SBen Matthews 3 A(nB,nB), B(nB), xB(nB)) 68*1e99f302SBen Matthews 69*1e99f302SBen Matthews Rmi = Ri(1:nsd,:) 70*1e99f302SBen Matthews Rci = Ri(dof,:) 71*1e99f302SBen Matthews 72*1e99f302SBen Matthews xB = 0D0 73*1e99f302SBen Matthews B = 0D0 74*1e99f302SBen Matthews Rm = Rmi 75*1e99f302SBen Matthews Rc = Rci 76*1e99f302SBen Matthews eps = SQRT(NORMV(nsd, mynNo, commu, Rm)**2D0 77*1e99f302SBen Matthews 2 + NORMS( mynNo, commu, Rc)**2D0) 78*1e99f302SBen Matthews ls%RI%iNorm = eps 79*1e99f302SBen Matthews ls%RI%fNorm = eps 80*1e99f302SBen Matthews ls%CG%callD = 0D0 81*1e99f302SBen Matthews ls%GM%callD = 0D0 82*1e99f302SBen Matthews ls%CG%itr = 0 83*1e99f302SBen Matthews ls%GM%itr = 0 84*1e99f302SBen Matthews ls%RI%callD = CPUT() 85*1e99f302SBen Matthews ls%RI%suc = .FALSE. 86*1e99f302SBen Matthews eps = MAX(ls%RI%absTol,ls%RI%relTol*eps) 87*1e99f302SBen Matthews 88*1e99f302SBen Matthews CALL DEPART 89*1e99f302SBen Matthews CALL BCPRE 90*1e99f302SBen Matthews 91*1e99f302SBen Matthews DO i=1, ls%RI%mItr 92*1e99f302SBen Matthews iB = 2*i - 1 93*1e99f302SBen Matthews iBB = 2*i 94*1e99f302SBen Matthews ls%RI%dB = ls%RI%fNorm 95*1e99f302SBen Matthews CALL GMRES(nFaces, nsd, nNo, nnz, mynNo, commu, cS, face, 96*1e99f302SBen Matthews 2 ls%GM, rowPtr, colPtr, mK, Rm, U(:,:,i)) 97*1e99f302SBen Matthews 98*1e99f302SBen Matthews CALL SPARMULVS(nsd, nNo, nnz, commu, cS, 99*1e99f302SBen Matthews 2 rowPtr, colPtr, mD, U(:,:,i), P(:,i)) 100*1e99f302SBen Matthews 101*1e99f302SBen Matthews P(:,i) = Rc - P(:,i) 102*1e99f302SBen Matthews CALL CGRAD(nFaces, nsd, nNo, nnz, mynNo, commu, cS, face, 103*1e99f302SBen Matthews 2 ls%CG, rowPtr, colPtr, Gt, mG, mL, P(:,i)) 104*1e99f302SBen Matthews 105*1e99f302SBen Matthews CALL SPARMULSV(nsd, nNo, nnz, commu, cS, 106*1e99f302SBen Matthews 2 rowPtr, colPtr, mG, P(:,i), MU(:,:,iB)) 107*1e99f302SBen Matthews 108*1e99f302SBen Matthews MU(:,:,iBB) = Rm - MU(:,:,iB) 109*1e99f302SBen Matthews CALL GMRES(nFaces, nsd, nNo, nnz, mynNo, commu, cS, face, 110*1e99f302SBen Matthews 2 ls%GM, rowPtr, colPtr, mK, MU(:,:,iBB), U(:,:,i)) 111*1e99f302SBen Matthews 112*1e99f302SBen Matthews CALL SPARMULVV(nsd, nNo, nnz, commu, cS, 113*1e99f302SBen Matthews 2 rowPtr, colPtr, mK, U(:,:,i), MU(:,:,iBB)) 114*1e99f302SBen Matthews 115*1e99f302SBen Matthews CALL ADDBCMUL(BCOP_TYPE_ADD, nFaces, nsd, nNo, mynNo, commu, 116*1e99f302SBen Matthews 2 face, U(:,:,i), MU(:,:,iBB)) 117*1e99f302SBen Matthews 118*1e99f302SBen Matthews CALL SPARMULSS(nNo, nnz, commu, cS, 119*1e99f302SBen Matthews 2 rowPtr, colPtr, mL, P(:,i), MP(:,iB)) 120*1e99f302SBen Matthews 121*1e99f302SBen Matthews CALL SPARMULVS(nsd, nNo, nnz, commu, cS, 122*1e99f302SBen Matthews 2 rowPtr, colPtr, mD, U(:,:,i), MP(:,iBB)) 123*1e99f302SBen Matthews 124*1e99f302SBen Matthews DO k=iB, iBB 125*1e99f302SBen Matthews DO j=1, k - 1 126*1e99f302SBen Matthews A(j,k) = DOTV(nsd, mynNo, commu, MU(:,:,j), MU(:,:,k)) 127*1e99f302SBen Matthews 2 + DOTS( mynNo, commu, MP(:,j), MP(:,k)) 128*1e99f302SBen Matthews A(k,j) = A(j,k) 129*1e99f302SBen Matthews END DO 130*1e99f302SBen Matthews A(k,k) = NORMV(nsd, mynNo, commu, MU(:,:,k))**2D0 131*1e99f302SBen Matthews 2 + NORMS( mynNo, commu, MP(:,k))**2D0 132*1e99f302SBen Matthews B(k) = DOTV (nsd, mynNo, commu, MU(:,:,k), Rmi) 133*1e99f302SBen Matthews 2 + DOTS ( mynNo, commu, MP(:,k), Rci) 134*1e99f302SBen Matthews END DO 135*1e99f302SBen Matthews 136*1e99f302SBen Matthews xB = B 137*1e99f302SBen Matthews CALL GE(iBB, A(1:iBB,1:iBB), xB(1:iBB)) 138*1e99f302SBen Matthews 139*1e99f302SBen Matthews ls%RI%fNorm = SQRT(ls%RI%iNorm**2D0 - SUM(xB(1:iBB)*B(1:iBB))) 140*1e99f302SBen Matthews IF(ls%RI%fNorm .LT. eps) THEN 141*1e99f302SBen Matthews ls%RI%suc = .TRUE. 142*1e99f302SBen Matthews EXIT 143*1e99f302SBen Matthews END IF 144*1e99f302SBen Matthews 145*1e99f302SBen Matthews Rm = Rmi - xB(1)*MU(:,:,1) 146*1e99f302SBen Matthews Rc = Rci - xB(1)*MP(:,1) 147*1e99f302SBen Matthews DO j=2, iBB 148*1e99f302SBen Matthews Rm = Rm - xB(j)*MU(:,:,j) 149*1e99f302SBen Matthews Rc = Rc - xB(j)*MP(:,j) 150*1e99f302SBen Matthews END DO 151*1e99f302SBen Matthews END DO 152*1e99f302SBen Matthews IF (i .GT. ls%RI%mItr) THEN 153*1e99f302SBen Matthews ls%RI%itr = ls%RI%mItr 154*1e99f302SBen Matthews ELSE 155*1e99f302SBen Matthews ls%RI%itr = i 156*1e99f302SBen Matthews 157*1e99f302SBen Matthews Rc = Rci - xB(1)*MP(:,1) 158*1e99f302SBen Matthews DO j=2, iBB 159*1e99f302SBen Matthews Rc = Rc - xB(j)*MP(:,j) 160*1e99f302SBen Matthews END DO 161*1e99f302SBen Matthews END IF 162*1e99f302SBen Matthews ls%Resc = NINT(1D2*(NORMS(mynNo, commu, Rc)/ 163*1e99f302SBen Matthews 2 ls%RI%fNorm)**2D0) 164*1e99f302SBen Matthews ls%Resm = 100 - ls%Resc 165*1e99f302SBen Matthews 166*1e99f302SBen Matthews Rmi = xB(2)*U(:,:,1) 167*1e99f302SBen Matthews Rci = xB(1)*P(:,1) 168*1e99f302SBen Matthews DO i=2, ls%RI%itr 169*1e99f302SBen Matthews iB = 2*i - 1 170*1e99f302SBen Matthews iBB = 2*i 171*1e99f302SBen Matthews 172*1e99f302SBen Matthews Rmi = Rmi + xB(iBB)*U(:,:,i) 173*1e99f302SBen Matthews Rci = Rci + xB(iB)*P(:,i) 174*1e99f302SBen Matthews END DO 175*1e99f302SBen Matthews 176*1e99f302SBen Matthews ls%RI%callD = CPUT() - ls%RI%callD 177*1e99f302SBen Matthews ls%RI%dB = 1D1*LOG(ls%RI%fNorm/ls%RI%dB) 178*1e99f302SBen Matthews 179*1e99f302SBen Matthews Ri(1:nsd,:) = Rmi 180*1e99f302SBen Matthews Ri(dof,:) = Rci 181*1e99f302SBen Matthews 182*1e99f302SBen Matthews DEALLOCATE (Rm, Rc, Rmi, Rci, U, P, MU, MP, A, B, mK, mD, mG, mL, 183*1e99f302SBen Matthews 2 Gt) 184*1e99f302SBen Matthews 185*1e99f302SBen Matthews IF (commu%masF) CALL LOGFILE 186*1e99f302SBen Matthews 187*1e99f302SBen Matthews RETURN 188*1e99f302SBen Matthews CONTAINS 189*1e99f302SBen Matthews 190*1e99f302SBen Matthews!==================================================================== 191*1e99f302SBen Matthews 192*1e99f302SBen Matthews SUBROUTINE DEPART 193*1e99f302SBen Matthews 194*1e99f302SBen Matthews IMPLICIT NONE 195*1e99f302SBen Matthews 196*1e99f302SBen Matthews INTEGER i, j, k, l 197*1e99f302SBen Matthews REAL*8, ALLOCATABLE :: tmp(:) 198*1e99f302SBen Matthews 199*1e99f302SBen Matthews ALLOCATE(mK(nsd*nsd,nnz), mG(nsd,nnz), mD(nsd,nnz), mL(nnz), 200*1e99f302SBen Matthews 2 Gt(nsd,nnz), tmp((nsd+1)*(nsd+1))) 201*1e99f302SBen Matthews 202*1e99f302SBen Matthews IF (nsd .EQ. 2) THEN 203*1e99f302SBen Matthews DO i=1, nnz 204*1e99f302SBen Matthews tmp = Val(:,i) 205*1e99f302SBen Matthews 206*1e99f302SBen Matthews mK(1,i) = tmp(1) 207*1e99f302SBen Matthews mK(2,i) = tmp(2) 208*1e99f302SBen Matthews mK(3,i) = tmp(4) 209*1e99f302SBen Matthews mK(4,i) = tmp(5) 210*1e99f302SBen Matthews 211*1e99f302SBen Matthews mG(1,i) = tmp(3) 212*1e99f302SBen Matthews mG(2,i) = tmp(6) 213*1e99f302SBen Matthews 214*1e99f302SBen Matthews mD(1,i) = tmp(7) 215*1e99f302SBen Matthews mD(2,i) = tmp(8) 216*1e99f302SBen Matthews 217*1e99f302SBen Matthews mL(i) = tmp(9) 218*1e99f302SBen Matthews END DO 219*1e99f302SBen Matthews ELSE IF(nsd .EQ. 3) THEN 220*1e99f302SBen Matthews DO i=1, nnz 221*1e99f302SBen Matthews tmp = Val(:,i) 222*1e99f302SBen Matthews 223*1e99f302SBen Matthews mK(1,i) = tmp(1) 224*1e99f302SBen Matthews mK(2,i) = tmp(2) 225*1e99f302SBen Matthews mK(3,i) = tmp(3) 226*1e99f302SBen Matthews mK(4,i) = tmp(5) 227*1e99f302SBen Matthews mK(5,i) = tmp(6) 228*1e99f302SBen Matthews mK(6,i) = tmp(7) 229*1e99f302SBen Matthews mK(7,i) = tmp(9) 230*1e99f302SBen Matthews mK(8,i) = tmp(10) 231*1e99f302SBen Matthews mK(9,i) = tmp(11) 232*1e99f302SBen Matthews 233*1e99f302SBen Matthews mG(1,i) = tmp(4) 234*1e99f302SBen Matthews mG(2,i) = tmp(8) 235*1e99f302SBen Matthews mG(3,i) = tmp(12) 236*1e99f302SBen Matthews 237*1e99f302SBen Matthews mD(1,i) = tmp(13) 238*1e99f302SBen Matthews mD(2,i) = tmp(14) 239*1e99f302SBen Matthews mD(3,i) = tmp(15) 240*1e99f302SBen Matthews 241*1e99f302SBen Matthews mL(i) = tmp(16) 242*1e99f302SBen Matthews END DO 243*1e99f302SBen Matthews ELSE 244*1e99f302SBen Matthews PRINT *, "Not defined nsd for DEPART", nsd 245*1e99f302SBen Matthews END IF 246*1e99f302SBen Matthews 247*1e99f302SBen Matthews DO i=1, nNo 248*1e99f302SBen Matthews Do j=rowPtr(1,i), rowPtr(2,i) 249*1e99f302SBen Matthews k = colPtr(j) 250*1e99f302SBen Matthews DO l=rowPtr(1,k), rowPtr(2,k) 251*1e99f302SBen Matthews IF (colPtr(l) .EQ. i) THEN 252*1e99f302SBen Matthews Gt(:,l) = -mG(:,j) 253*1e99f302SBen Matthews EXIT 254*1e99f302SBen Matthews END IF 255*1e99f302SBen Matthews END DO 256*1e99f302SBen Matthews END DO 257*1e99f302SBen Matthews END DO 258*1e99f302SBen Matthews 259*1e99f302SBen Matthews RETURN 260*1e99f302SBen Matthews END SUBROUTINE DEPART 261*1e99f302SBen Matthews 262*1e99f302SBen Matthews!==================================================================== 263*1e99f302SBen Matthews 264*1e99f302SBen Matthews SUBROUTINE BCPRE 265*1e99f302SBen Matthews 266*1e99f302SBen Matthews IMPLICIT NONE 267*1e99f302SBen Matthews 268*1e99f302SBen Matthews INTEGER faIn, i, a, Ac 269*1e99f302SBen Matthews REAL*8 NORMV 270*1e99f302SBen Matthews REAL*8, ALLOCATABLE :: v(:,:) 271*1e99f302SBen Matthews 272*1e99f302SBen Matthews DO faIn=1, nFaces 273*1e99f302SBen Matthews IF (face(faIn)%coupledFlag) THEN 274*1e99f302SBen Matthews IF (face(faIn)%sharedFlag) THEN 275*1e99f302SBen Matthews IF (.NOT.ALLOCATED(v)) ALLOCATE(v(nsd,nNo)) 276*1e99f302SBen Matthews v = 0D0 277*1e99f302SBen Matthews DO a=1, face(faIn)%nNo 278*1e99f302SBen Matthews Ac = face(faIn)%glob(a) 279*1e99f302SBen Matthews DO i=1, nsd 280*1e99f302SBen Matthews v(i,Ac) = face(faIn)%valM(i,a) 281*1e99f302SBen Matthews END DO 282*1e99f302SBen Matthews END DO 283*1e99f302SBen Matthews face(faIn)%nS = NORMV(nsd, mynNo, commu, v)**2D0 284*1e99f302SBen Matthews ELSE 285*1e99f302SBen Matthews face(faIn)%nS = 0D0 286*1e99f302SBen Matthews DO a=1, face(faIn)%nNo 287*1e99f302SBen Matthews Ac = face(faIn)%glob(a) 288*1e99f302SBen Matthews DO i=1, nsd 289*1e99f302SBen Matthews face(faIn)%nS = face(faIn)%nS + 290*1e99f302SBen Matthews 2 face(faIn)%valM(i,a)**2D0 291*1e99f302SBen Matthews END DO 292*1e99f302SBen Matthews END DO 293*1e99f302SBen Matthews END IF 294*1e99f302SBen Matthews END IF 295*1e99f302SBen Matthews END DO 296*1e99f302SBen Matthews 297*1e99f302SBen Matthews RETURN 298*1e99f302SBen Matthews END SUBROUTINE BCPRE 299*1e99f302SBen Matthews 300*1e99f302SBen Matthews!==================================================================== 301*1e99f302SBen Matthews 302*1e99f302SBen Matthews SUBROUTINE LOGFILE 303*1e99f302SBen Matthews 304*1e99f302SBen Matthews IMPLICIT NONE 305*1e99f302SBen Matthews 306*1e99f302SBen Matthews LOGICAL flag 307*1e99f302SBen Matthews INTEGER fid, i, j 308*1e99f302SBen Matthews CHARACTER*16, PARAMETER :: fName = 'svLS_NS.log' 309*1e99f302SBen Matthews 310*1e99f302SBen Matthews INQUIRE(FILE=fName, EXIST=flag) 311*1e99f302SBen Matthews 312*1e99f302SBen Matthews fid = 11232 313*1e99f302SBen Matthews OPEN(fid, FILE=fName, POSITION='APPEND') 314*1e99f302SBen Matthews 315*1e99f302SBen Matthews IF (.NOT.flag) THEN 316*1e99f302SBen Matthews i = 0 317*1e99f302SBen Matthews DO j=1, nFaces 318*1e99f302SBen Matthews IF (face(j)%coupledFlag) i = i + 1 319*1e99f302SBen Matthews END DO 320*1e99f302SBen Matthews WRITE(fid,*) gnNo, commu%nTasks, i 321*1e99f302SBen Matthews END IF 322*1e99f302SBen Matthews 323*1e99f302SBen Matthews i = 0 324*1e99f302SBen Matthews IF (ls%RI%suc) i = i + 100 325*1e99f302SBen Matthews IF (ls%GM%suc) i = i + 10 326*1e99f302SBen Matthews IF (ls%CG%suc) i = i + 1 327*1e99f302SBen Matthews 328*1e99f302SBen Matthews WRITE(fid,"(I4.3,I3,I4,I5,3I4,3ES9.2E2,3I4)") 329*1e99f302SBen Matthews 2 i, ls%RI%itr, ls%GM%itr, ls%CG%itr, 330*1e99f302SBen Matthews 3 NINT((ls%RI%CallD-ls%GM%CallD-ls%CG%CallD)/ls%RI%CallD*1D2), 331*1e99f302SBen Matthews 4 NINT(ls%GM%callD/ls%RI%CallD*1D2), 332*1e99f302SBen Matthews 5 NINT(ls%CG%callD/ls%RI%CallD*1D2), 333*1e99f302SBen Matthews 6 ls%RI%iNorm, ls%RI%fNorm/ls%RI%iNorm, ls%RI%CallD, 334*1e99f302SBen Matthews 7 ls%Resm, ls%Resc, NINT(ls%RI%dB) 335*1e99f302SBen Matthews 336*1e99f302SBen Matthews CLOSE(fid) 337*1e99f302SBen Matthews 338*1e99f302SBen Matthews RETURN 339*1e99f302SBen Matthews END SUBROUTINE LOGFILE 340*1e99f302SBen Matthews 341*1e99f302SBen Matthews END SUBROUTINE NSSOLVER 342*1e99f302SBen Matthews 343