xref: /phasta/svLS/NSSOLVER.f (revision 712d3df0b59ebebaaeaea358162c8d2c043c6e08)
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