xref: /phasta/phSolver/compressible/rstat.f (revision 2801f60755a34dd6e121c3898c0c6af7ba206cd9)
159599516SKenneth E. Jansen        subroutine rstat (res, ilwork)
259599516SKenneth E. Jansenc
359599516SKenneth E. Jansenc----------------------------------------------------------------------
459599516SKenneth E. Jansenc
559599516SKenneth E. Jansenc This subroutine calculates the statistics of the residual.
659599516SKenneth E. Jansenc
759599516SKenneth E. Jansenc input:
859599516SKenneth E. Jansenc  res   (nshg,nflow)   : preconditioned residual
959599516SKenneth E. Jansenc
1059599516SKenneth E. Jansenc output:
1159599516SKenneth E. Jansenc  The time step, cpu-time and entropy-norm of the residual
1259599516SKenneth E. Jansenc     are printed in the file HISTOR.DAT.
1359599516SKenneth E. Jansenc
1459599516SKenneth E. Jansenc
1559599516SKenneth E. Jansenc Zdenek Johan, Winter 1991.  (Fortran 90)
1659599516SKenneth E. Jansenc----------------------------------------------------------------------
1759599516SKenneth E. Jansenc
1859599516SKenneth E. Jansen        include "common.h"
1959599516SKenneth E. Jansen        include "mpif.h"
2059599516SKenneth E. Jansen        include "auxmpi.h"
2159599516SKenneth E. Jansenc
2259599516SKenneth E. Jansen        dimension res(nshg,nflow)
2359599516SKenneth E. Jansen        dimension rtmp(nshg), nrsmax(1), ilwork(nlwork)
2459599516SKenneth E. Jansen        dimension Forin(4), Forout(4)
2559599516SKenneth E. Jansen!SCATTER        dimension irecvcount(numpe), resvec(numpe)
2659599516SKenneth E. Jansenc        integer TMRC
2759599516SKenneth E. Jansen
2859599516SKenneth E. Jansen
2959599516SKenneth E. Jansen        real*8  ftots(3,0:MAXSURF),ftot(3),spmasstot(0:MAXSURF),spmasss
3059599516SKenneth E. Jansen
3159599516SKenneth E. Jansen	ttim(68) = ttim(68) - secs(0.0)
3259599516SKenneth E. Jansen
3359599516SKenneth E. Jansen        if (numpe == 1) nshgt=nshg   ! global = this processor
3459599516SKenneth E. Jansenc
3559599516SKenneth E. Jansenc incompressible style data from flx surface
3659599516SKenneth E. Jansenc
3759599516SKenneth E. Jansen      if (numpe > 1) then
3859599516SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(2,isrfIM), spmasss,1,
3959599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
4059599516SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(1,isrfIM), Atots,1,
4159599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
4259599516SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(3,:), Ftots(1,:),MAXSURF+1,
4359599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
4459599516SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(4,:), Ftots(2,:),MAXSURF+1,
4559599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
4659599516SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(5,:), Ftots(3,:),MAXSURF+1,
4759599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
4859599516SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(2,:), spmasstot(:),MAXSURF+1,
4959599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
5059599516SKenneth E. Jansen      else
5159599516SKenneth E. Jansen         Ftots=flxID(3:5,:)
5259599516SKenneth E. Jansen         Atots=flxID(1,isrfIM)
5359599516SKenneth E. Jansen         spmasss=flxID(2,isrfIM)
5459599516SKenneth E. Jansen         spmasstot(:)=flxID(2,:)
5559599516SKenneth E. Jansen      endif
56513954efSKenneth E. Jansen! 	if(myrank.eq.0) then
57513954efSKenneth E. Jansen!     write(44,1000)lstep+1,(spmasstot(j),j=1,5)
58513954efSKenneth E. Jansen!     call flush(44)
59513954efSKenneth E. Jansen!	endif
6059599516SKenneth E. Jansen      ftot(1)=sum(Ftots(1,0:MAXSURF))
6159599516SKenneth E. Jansen      ftot(2)=sum(Ftots(2,0:MAXSURF))
6259599516SKenneth E. Jansen      ftot(3)=sum(Ftots(3,0:MAXSURF))
6359599516SKenneth E. Jansenc
6459599516SKenneth E. Jansenc end of incompressible style
6559599516SKenneth E. Jansenc
6659599516SKenneth E. Jansenc
6759599516SKenneth E. Jansenc.... -------------------->  Aerodynamic Forces  <----------------------
6859599516SKenneth E. Jansenc
6959599516SKenneth E. Jansenc.... output the forces and the heat flux
7059599516SKenneth E. Jansenc
7159599516SKenneth E. Jansen        if (iter .eq. nitr) then
7259599516SKenneth E. Jansen          Forin = (/ Force(1), Force(2), Force(3), HFlux /)
7359599516SKenneth E. Jansen          if (numpe > 1) then
7459599516SKenneth E. Jansen          call MPI_REDUCE (Forin(1), Forout(1), 4, MPI_DOUBLE_PRECISION,
7559599516SKenneth E. Jansen     &                                   MPI_SUM, master,
7659599516SKenneth E. Jansen     &                                   MPI_COMM_WORLD,ierr)
7759599516SKenneth E. Jansen          endif
7859599516SKenneth E. Jansen          Force = Forout(1:3)
7959599516SKenneth E. Jansen          HFlux = Forout(4)
8059599516SKenneth E. Jansen          if (myrank .eq. master) then
8159599516SKenneth E. Jansen             write (iforce,1000) lstep+1, (Force(i), i=1,nsd), HFlux,
8259599516SKenneth E. Jansen     &                           spmasss
8359599516SKenneth E. Jansen             call flush(iforce)
8459599516SKenneth E. Jansen          endif
8559599516SKenneth E. Jansen        endif
8659599516SKenneth E. Jansen
8759599516SKenneth E. Jansenc
8859599516SKenneth E. Jansenc.... ----------------------->  Convergence  <-------------------------
8959599516SKenneth E. Jansenc
9059599516SKenneth E. Jansenc.... compute the maximum residual and the corresponding node number
9159599516SKenneth E. Jansenc
9259599516SKenneth E. Jansen        rtmp = zero
9359599516SKenneth E. Jansen        do i = 1, nflow
9459599516SKenneth E. Jansen          rtmp = rtmp + res(:,i)**2
9559599516SKenneth E. Jansen        enddo
9659599516SKenneth E. Jansen
9759599516SKenneth E. Jansen        call sumgat (rtmp, 1, resnrm, ilwork)
9859599516SKenneth E. Jansen
9959599516SKenneth E. Jansen        resmaxl = maxval(rtmp)
10059599516SKenneth E. Jansen
10159599516SKenneth E. Jansen        irecvcount = 1
10259599516SKenneth E. Jansen        resvec = resmaxl
10359599516SKenneth E. Jansen        if (numpe > 1) then
10459599516SKenneth E. Jansen        call MPI_ALLREDUCE (resvec, resmax, irecvcount,
10559599516SKenneth E. Jansen     &                    MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD,
10659599516SKenneth E. Jansen     &                    ierr)
10759599516SKenneth E. Jansenc        call MPI_REDUCE_SCATTER (resvec, resmax, irecvcount,
10859599516SKenneth E. Jansenc     &                    MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD,
10959599516SKenneth E. Jansenc     &                    ierr)
11059599516SKenneth E. Jansen        else
11159599516SKenneth E. Jansen          resmax=resmaxl
11259599516SKenneth E. Jansen        endif
11359599516SKenneth E. Jansen        nrsmax = maxloc(rtmp)
11459599516SKenneth E. Jansenc
11559599516SKenneth E. Jansenc.... correct the residuals
11659599516SKenneth E. Jansenc
11759599516SKenneth E. Jansen        if (loctim(itseq) .eq. 0) then
11859599516SKenneth E. Jansen          resnrm = resnrm
11959599516SKenneth E. Jansen          resmax = resmax
12059599516SKenneth E. Jansen        else
12159599516SKenneth E. Jansen          resnrm = resnrm
12259599516SKenneth E. Jansen          resmax = resmax
12359599516SKenneth E. Jansen        endif
12459599516SKenneth E. Jansenc
12559599516SKenneth E. Jansenc.... approximate the number of entries
12659599516SKenneth E. Jansenc
12759599516SKenneth E. Jansen        totres = resnrm / float(nshgt)
12859599516SKenneth E. Jansen        totres = sqrt(totres)
12959599516SKenneth E. Jansen        resmax = sqrt(resmax)
13059599516SKenneth E. Jansen        if (resfrt .eq. zero) resfrt = totres
13159599516SKenneth E. Jansen        jtotrs = int  ( 10.d0 * log10 ( totres / resfrt ) )
13259599516SKenneth E. Jansen        jresmx = int  ( 10.d0 * log10 ( resmax / totres ) )
13359599516SKenneth E. Jansenc
13459599516SKenneth E. Jansenc.... get the CPU-time
13559599516SKenneth E. Jansenc
13659599516SKenneth E. Jansen        rsec=TMRC()
13759599516SKenneth E. Jansen        cputme = (rsec-ttim(100))
13859599516SKenneth E. Jansenc
13959599516SKenneth E. Jansenc.... output the result
14059599516SKenneth E. Jansenc
14159599516SKenneth E. Jansen        if (myrank .eq. master) then
142513954efSKenneth E. Jansen          !modified to not advance so that solver tolerance satisfaction failure
143513954efSKenneth E. Jansen          ! can be appended. The line wrap occurs in solgmr
144513954efSKenneth E. Jansen          if(usingPETSc.eq.0) then
145513954efSKenneth E. Jansen           write(*, 2000, advance="no")       lstep+1, cputme, totres, jtotrs, nrsmax,
14659599516SKenneth E. Jansen     &                     jresmx, lGMRES,  iKs, ntotGM
147513954efSKenneth E. Jansen          else
148513954efSKenneth E. Jansen           write(*, 2000)       lstep+1, cputme, totres, jtotrs, nrsmax,
149513954efSKenneth E. Jansen     &                     jresmx, lGMRES,  iKs, ntotGM
150513954efSKenneth E. Jansen          endif
15159599516SKenneth E. Jansen          write (ihist,2000) lstep+1, cputme, totres, jtotrs, nrsmax,
15259599516SKenneth E. Jansen     &                     jresmx, lGMRES,  iKs, ntotGM
15359599516SKenneth E. Jansen          call flush(ihist)
15459599516SKenneth E. Jansen        endif
15559599516SKenneth E. Jansen	ttim(68) = ttim(68) + secs(0.0)
15659599516SKenneth E. Jansen
15759599516SKenneth E. Jansenc
15859599516SKenneth E. Jansenc.... return
15959599516SKenneth E. Jansenc
16059599516SKenneth E. Jansen        return
16159599516SKenneth E. Jansenc
16259599516SKenneth E. Jansen1000    format(1p,i6,5e13.5)
16359599516SKenneth E. Jansen2000    format(1p,i6,e10.3,e10.3,3x,'(',i4,')',3x,'<',i6,'|',i4,'>',
16459599516SKenneth E. Jansen     &         ' [',i3,'-',i3,']',i10)
16559599516SKenneth E. Jansenc
16659599516SKenneth E. Jansen        end
167513954efSKenneth E. Jansen        subroutine rstatSclr (rest, ilwork)
16859599516SKenneth E. Jansenc
16959599516SKenneth E. Jansenc----------------------------------------------------------------------
17059599516SKenneth E. Jansenc
17159599516SKenneth E. Jansenc This subroutine calculates the statistics of the residual.
17259599516SKenneth E. Jansenc
17359599516SKenneth E. Jansenc input:
17459599516SKenneth E. Jansenc  rest   (nshg)   : preconditioned residual
17559599516SKenneth E. Jansenc
17659599516SKenneth E. Jansenc output:
17759599516SKenneth E. Jansenc  The time step, cpu-time and entropy-norm of the residual
17859599516SKenneth E. Jansenc     are printed in the file HISTOR.DAT.
17959599516SKenneth E. Jansenc
18059599516SKenneth E. Jansenc
18159599516SKenneth E. Jansenc Zdenek Johan, Winter 1991.  (Fortran 90)
18259599516SKenneth E. Jansenc----------------------------------------------------------------------
18359599516SKenneth E. Jansenc
18459599516SKenneth E. Jansen        include "common.h"
18559599516SKenneth E. Jansen        include "mpif.h"
18659599516SKenneth E. Jansen        include "auxmpi.h"
18759599516SKenneth E. Jansenc
18859599516SKenneth E. Jansen        dimension rest(nshg)
18959599516SKenneth E. Jansen        dimension rtmp(nshg), nrsmax(1), ilwork(nlwork)
19059599516SKenneth E. Jansen!SCATTER        dimension irecvcount(numpe), resvec(numpe)
19159599516SKenneth E. Jansenc        integer TMRC
19259599516SKenneth E. Jansen
19359599516SKenneth E. Jansen	ttim(68) = ttim(68) - secs(0.0)
19459599516SKenneth E. Jansen        if (numpe == 1) nshgt=nshg   ! global = this processor
19559599516SKenneth E. Jansenc
19659599516SKenneth E. Jansenc.... ----------------------->  Convergence  <-------------------------
19759599516SKenneth E. Jansenc
19859599516SKenneth E. Jansenc.... compute the maximum residual and the corresponding node number
19959599516SKenneth E. Jansenc
20059599516SKenneth E. Jansen        rtmp = zero
20159599516SKenneth E. Jansen        rtmp = rtmp + rest**2
20259599516SKenneth E. Jansen
20359599516SKenneth E. Jansen        call sumgat (rtmp, 1, resnrm, ilwork)
20459599516SKenneth E. Jansen
20559599516SKenneth E. Jansen        resmaxl = maxval(rtmp)
20659599516SKenneth E. Jansen
20759599516SKenneth E. Jansencontinue on
20859599516SKenneth E. Jansen
20959599516SKenneth E. Jansen        irecvcount = 1
21059599516SKenneth E. Jansen        resvec = resmaxl
21159599516SKenneth E. Jansen        if (numpe > 1) then
21259599516SKenneth E. Jansen        call MPI_ALLREDUCE (resvec, resmax, irecvcount,
21359599516SKenneth E. Jansen     &                    MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD,
21459599516SKenneth E. Jansen     &                    ierr)
21559599516SKenneth E. Jansenc        call MPI_REDUCE_SCATTER (resvec, resmax, irecvcount,
21659599516SKenneth E. Jansenc     &                    MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD,
21759599516SKenneth E. Jansenc     &                    ierr)
21859599516SKenneth E. Jansen        else
21959599516SKenneth E. Jansen          resmax=resmaxl
22059599516SKenneth E. Jansen        endif
22159599516SKenneth E. Jansen        nrsmax = maxloc(rtmp)
22259599516SKenneth E. Jansenc
22359599516SKenneth E. Jansenc.... correct the residuals
22459599516SKenneth E. Jansenc
22559599516SKenneth E. Jansen        if (loctim(itseq) .eq. 0) then
22659599516SKenneth E. Jansen          resnrm = resnrm
22759599516SKenneth E. Jansen          resmax = resmax
22859599516SKenneth E. Jansen        else
22959599516SKenneth E. Jansen          resnrm = resnrm
23059599516SKenneth E. Jansen          resmax = resmax
23159599516SKenneth E. Jansen        endif
23259599516SKenneth E. Jansenc
23359599516SKenneth E. Jansenc.... approximate the number of entries
23459599516SKenneth E. Jansenc
23559599516SKenneth E. Jansen        totres = resnrm / float(nshgt)
23659599516SKenneth E. Jansen        totres = sqrt(totres)
23759599516SKenneth E. Jansen        resmax = sqrt(resmax)
238513954efSKenneth E. Jansen        if (resfrts .eq. zero) resfrts = totres
239513954efSKenneth E. Jansen        jtotrs = int  ( 10.d0 * log10 ( totres / resfrts ) )
24059599516SKenneth E. Jansen        jresmx = int  ( 10.d0 * log10 ( resmax / totres ) )
24159599516SKenneth E. Jansenc
24259599516SKenneth E. Jansenc.... get the CPU-time
24359599516SKenneth E. Jansenc
24459599516SKenneth E. Jansen        rsec=TMRC()
24559599516SKenneth E. Jansen        cputme = (rsec-ttim(100))
24659599516SKenneth E. Jansenc
24759599516SKenneth E. Jansenc.... output the result
24859599516SKenneth E. Jansenc
24959599516SKenneth E. Jansen        if (myrank .eq. master) then
25059599516SKenneth E. Jansen          print 2000,        lstep+1, cputme, totres, jtotrs, nrsmax,
251513954efSKenneth E. Jansen     &                     jresmx, lgmress,  iKss, ntotGMs
25259599516SKenneth E. Jansen          write (ihist,2000) lstep+1, cputme, totres, jtotrs, nrsmax,
253513954efSKenneth E. Jansen     &                     jresmx, lgmress,  iKss, ntotGMs
25459599516SKenneth E. Jansen          call flush(ihist)
25559599516SKenneth E. Jansen        endif
25659599516SKenneth E. Jansen        if(totres.gt.1.0e-9) istop=istop-1
25759599516SKenneth E. Jansen
25859599516SKenneth E. Jansen	ttim(68) = ttim(68) + secs(0.0)
25959599516SKenneth E. Jansen
26059599516SKenneth E. Jansenc
26159599516SKenneth E. Jansenc.... return
26259599516SKenneth E. Jansenc
26359599516SKenneth E. Jansen        return
26459599516SKenneth E. Jansenc
26559599516SKenneth E. Jansen1000    format(1p,i6,4e13.5)
26659599516SKenneth E. Jansen2000    format(1p,i6,e10.3,e10.3,3x,'(',i4,')',3x,'<',i6,'|',i4,'>',
26759599516SKenneth E. Jansen     &         ' [',i3,'-',i3,']',i10)
26859599516SKenneth E. Jansenc
26959599516SKenneth E. Jansen        end
270*2801f607SKenneth E. Jansen        subroutine rstatp (resNrm)
271*2801f607SKenneth E. Jansenc
272*2801f607SKenneth E. Jansenc----------------------------------------------------------------------
273*2801f607SKenneth E. Jansenc
274*2801f607SKenneth E. Jansenc This subroutine calculates the statistics of the residual.
275*2801f607SKenneth E. Jansenc
276*2801f607SKenneth E. Jansenc input:
277*2801f607SKenneth E. Jansenc  res   (nshg,nflow)   : preconditioned residual
278*2801f607SKenneth E. Jansenc
279*2801f607SKenneth E. Jansenc output:
280*2801f607SKenneth E. Jansenc  The time step, cpu-time and entropy-norm of the residual
281*2801f607SKenneth E. Jansenc     are printed in the file HISTOR.DAT.
282*2801f607SKenneth E. Jansenc
283*2801f607SKenneth E. Jansenc
284*2801f607SKenneth E. Jansenc Zdenek Johan, Winter 1991.  (Fortran 90)
285*2801f607SKenneth E. Jansenc----------------------------------------------------------------------
286*2801f607SKenneth E. Jansenc
287*2801f607SKenneth E. Jansen        include "common.h"
288*2801f607SKenneth E. Jansen        include "mpif.h"
289*2801f607SKenneth E. Jansen        include "auxmpi.h"
290*2801f607SKenneth E. Jansenc
291*2801f607SKenneth E. Jansen        dimension Forin(4), Forout(4)
292*2801f607SKenneth E. Jansen!SCATTER        dimension irecvcount(numpe), resvec(numpe)
293*2801f607SKenneth E. Jansenc        integer TMRC
294*2801f607SKenneth E. Jansen
295*2801f607SKenneth E. Jansen
296*2801f607SKenneth E. Jansen        real*8  ftots(3,0:MAXSURF),ftot(3),spmasstot(0:MAXSURF),spmasss
297*2801f607SKenneth E. Jansen
298*2801f607SKenneth E. Jansen	ttim(68) = ttim(68) - secs(0.0)
299*2801f607SKenneth E. Jansen
300*2801f607SKenneth E. Jansen        if (numpe == 1) nshgt=nshg   ! global = this processor
301*2801f607SKenneth E. Jansenc
302*2801f607SKenneth E. Jansenc incompressible style data from flx surface
303*2801f607SKenneth E. Jansenc
304*2801f607SKenneth E. Jansen      if (numpe > 1) then
305*2801f607SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(2,isrfIM), spmasss,1,
306*2801f607SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
307*2801f607SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(1,isrfIM), Atots,1,
308*2801f607SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
309*2801f607SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(3,:), Ftots(1,:),MAXSURF+1,
310*2801f607SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
311*2801f607SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(4,:), Ftots(2,:),MAXSURF+1,
312*2801f607SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
313*2801f607SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(5,:), Ftots(3,:),MAXSURF+1,
314*2801f607SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
315*2801f607SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(2,:), spmasstot(:),MAXSURF+1,
316*2801f607SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
317*2801f607SKenneth E. Jansen      else
318*2801f607SKenneth E. Jansen         Ftots=flxID(3:5,:)
319*2801f607SKenneth E. Jansen         Atots=flxID(1,isrfIM)
320*2801f607SKenneth E. Jansen         spmasss=flxID(2,isrfIM)
321*2801f607SKenneth E. Jansen         spmasstot(:)=flxID(2,:)
322*2801f607SKenneth E. Jansen      endif
323*2801f607SKenneth E. Jansen      ftot(1)=sum(Ftots(1,0:MAXSURF))
324*2801f607SKenneth E. Jansen      ftot(2)=sum(Ftots(2,0:MAXSURF))
325*2801f607SKenneth E. Jansen      ftot(3)=sum(Ftots(3,0:MAXSURF))
326*2801f607SKenneth E. Jansenc
327*2801f607SKenneth E. Jansenc end of incompressible style
328*2801f607SKenneth E. Jansenc
329*2801f607SKenneth E. Jansenc
330*2801f607SKenneth E. Jansenc.... -------------------->  Aerodynamic Forces  <----------------------
331*2801f607SKenneth E. Jansenc
332*2801f607SKenneth E. Jansenc.... output the forces and the heat flux
333*2801f607SKenneth E. Jansenc
334*2801f607SKenneth E. Jansen        if (iter .eq. nitr) then
335*2801f607SKenneth E. Jansen          Forin = (/ Force(1), Force(2), Force(3), HFlux /)
336*2801f607SKenneth E. Jansen          if (numpe > 1) then
337*2801f607SKenneth E. Jansen          call MPI_REDUCE (Forin(1), Forout(1), 4, MPI_DOUBLE_PRECISION,
338*2801f607SKenneth E. Jansen     &                                   MPI_SUM, master,
339*2801f607SKenneth E. Jansen     &                                   MPI_COMM_WORLD,ierr)
340*2801f607SKenneth E. Jansen          endif
341*2801f607SKenneth E. Jansen          Force = Forout(1:3)
342*2801f607SKenneth E. Jansen          HFlux = Forout(4)
343*2801f607SKenneth E. Jansen          if (myrank .eq. master) then
344*2801f607SKenneth E. Jansen             write (iforce,1000) lstep+1, (Force(i), i=1,nsd), HFlux,
345*2801f607SKenneth E. Jansen     &                           spmasss
346*2801f607SKenneth E. Jansen             call flush(iforce)
347*2801f607SKenneth E. Jansen          endif
348*2801f607SKenneth E. Jansen        endif
349*2801f607SKenneth E. Jansen
350*2801f607SKenneth E. Jansenc
351*2801f607SKenneth E. Jansenc.... approximate the number of entries
352*2801f607SKenneth E. Jansenc
353*2801f607SKenneth E. Jansen        totres =resNrm*resNrm / float(nshgt)
354*2801f607SKenneth E. Jansen        totres = sqrt(totres)
355*2801f607SKenneth E. Jansen        if (resfrt .eq. zero) resfrt = totres
356*2801f607SKenneth E. Jansen        jtotrs = int  ( 10.d0 * log10 ( totres / resfrt ) )
357*2801f607SKenneth E. Jansenc
358*2801f607SKenneth E. Jansenc.... get the CPU-time
359*2801f607SKenneth E. Jansenc
360*2801f607SKenneth E. Jansen        rsec=TMRC()
361*2801f607SKenneth E. Jansen        cputme = (rsec-ttim(100))
362*2801f607SKenneth E. Jansenc
363*2801f607SKenneth E. Jansenc.... output the result
364*2801f607SKenneth E. Jansenc
365*2801f607SKenneth E. Jansen        nrsmax=1
366*2801f607SKenneth E. Jansen        jresmx=1  ! these 2 no longer computed here
367*2801f607SKenneth E. Jansen        if (myrank .eq. master) then
368*2801f607SKenneth E. Jansen           write(*, 2000)       lstep+1, cputme, totres, jtotrs, nrsmax,
369*2801f607SKenneth E. Jansen     &                     jresmx, lGMRES,  iKs, ntotGM
370*2801f607SKenneth E. Jansen          write (ihist,2000) lstep+1, cputme, totres, jtotrs, nrsmax,
371*2801f607SKenneth E. Jansen     &                     jresmx, lGMRES,  iKs, ntotGM
372*2801f607SKenneth E. Jansen          call flush(ihist)
373*2801f607SKenneth E. Jansen        endif
374*2801f607SKenneth E. Jansen	ttim(68) = ttim(68) + secs(0.0)
375*2801f607SKenneth E. Jansen
376*2801f607SKenneth E. Jansenc
377*2801f607SKenneth E. Jansenc.... return
378*2801f607SKenneth E. Jansenc
379*2801f607SKenneth E. Jansen        return
380*2801f607SKenneth E. Jansenc
381*2801f607SKenneth E. Jansen1000    format(1p,i6,5e13.5)
382*2801f607SKenneth E. Jansen2000    format(1p,i6,e10.3,e10.3,3x,'(',i4,')',3x,'<',i6,'|',i4,'>',
383*2801f607SKenneth E. Jansen     &         ' [',i3,'-',i3,']',i10)
384*2801f607SKenneth E. Jansenc
385*2801f607SKenneth E. Jansen        end
386*2801f607SKenneth E. Jansen        subroutine rstatpSclr (resnrm )
387*2801f607SKenneth E. Jansenc
388*2801f607SKenneth E. Jansenc----------------------------------------------------------------------
389*2801f607SKenneth E. Jansenc
390*2801f607SKenneth E. Jansenc This subroutine calculates the statistics of the residual.
391*2801f607SKenneth E. Jansenc
392*2801f607SKenneth E. Jansenc input:
393*2801f607SKenneth E. Jansenc  rest   (nshg)   : preconditioned residual
394*2801f607SKenneth E. Jansenc
395*2801f607SKenneth E. Jansenc output:
396*2801f607SKenneth E. Jansenc  The time step, cpu-time and entropy-norm of the residual
397*2801f607SKenneth E. Jansenc     are printed in the file HISTOR.DAT.
398*2801f607SKenneth E. Jansenc
399*2801f607SKenneth E. Jansenc
400*2801f607SKenneth E. Jansenc Zdenek Johan, Winter 1991.  (Fortran 90)
401*2801f607SKenneth E. Jansenc----------------------------------------------------------------------
402*2801f607SKenneth E. Jansenc
403*2801f607SKenneth E. Jansen        include "common.h"
404*2801f607SKenneth E. Jansen        include "mpif.h"
405*2801f607SKenneth E. Jansen        include "auxmpi.h"
406*2801f607SKenneth E. Jansenc
407*2801f607SKenneth E. Jansen        dimension rest(nshg)
408*2801f607SKenneth E. Jansen        dimension rtmp(nshg), nrsmax(1), ilwork(nlwork)
409*2801f607SKenneth E. Jansen!SCATTER        dimension irecvcount(numpe), resvec(numpe)
410*2801f607SKenneth E. Jansenc        integer TMRC
411*2801f607SKenneth E. Jansen
412*2801f607SKenneth E. Jansen	ttim(68) = ttim(68) - secs(0.0)
413*2801f607SKenneth E. Jansen        if (numpe == 1) nshgt=nshg   ! global = this processor
414*2801f607SKenneth E. Jansenc
415*2801f607SKenneth E. Jansenc.... ----------------------->  Convergence  <-------------------------
416*2801f607SKenneth E. Jansenc
417*2801f607SKenneth E. Jansen          resmax = 1
418*2801f607SKenneth E. Jansenc
419*2801f607SKenneth E. Jansenc.... approximate the number of entries
420*2801f607SKenneth E. Jansenc
421*2801f607SKenneth E. Jansen        totres = resnrm*resnrm / float(nshgt)
422*2801f607SKenneth E. Jansen        totres = sqrt(totres)
423*2801f607SKenneth E. Jansen        if (resfrts .eq. zero) resfrts = totres
424*2801f607SKenneth E. Jansen        jtotrs = int  ( 10.d0 * log10 ( totres / resfrts ) )
425*2801f607SKenneth E. Jansen        jresmx = int  ( 10.d0 * log10 ( resmax / totres ) )
426*2801f607SKenneth E. Jansenc
427*2801f607SKenneth E. Jansenc.... get the CPU-time
428*2801f607SKenneth E. Jansenc
429*2801f607SKenneth E. Jansen        rsec=TMRC()
430*2801f607SKenneth E. Jansen        cputme = (rsec-ttim(100))
431*2801f607SKenneth E. Jansenc
432*2801f607SKenneth E. Jansenc.... output the result
433*2801f607SKenneth E. Jansenc
434*2801f607SKenneth E. Jansen        if (myrank .eq. master) then
435*2801f607SKenneth E. Jansen          print 2000,        lstep+1, cputme, totres, jtotrs, nrsmax,
436*2801f607SKenneth E. Jansen     &                     jresmx, lgmress,  iKss, ntotGMs
437*2801f607SKenneth E. Jansen          write (ihist,2000) lstep+1, cputme, totres, jtotrs, nrsmax,
438*2801f607SKenneth E. Jansen     &                     jresmx, lgmress,  iKss, ntotGMs
439*2801f607SKenneth E. Jansen          call flush(ihist)
440*2801f607SKenneth E. Jansen        endif
441*2801f607SKenneth E. Jansen        if(totres.gt.1.0e-9) istop=istop-1
442*2801f607SKenneth E. Jansen
443*2801f607SKenneth E. Jansen	ttim(68) = ttim(68) + secs(0.0)
444*2801f607SKenneth E. Jansen
445*2801f607SKenneth E. Jansenc
446*2801f607SKenneth E. Jansenc.... return
447*2801f607SKenneth E. Jansenc
448*2801f607SKenneth E. Jansen        return
449*2801f607SKenneth E. Jansenc
450*2801f607SKenneth E. Jansen1000    format(1p,i6,4e13.5)
451*2801f607SKenneth E. Jansen2000    format(1p,i6,e10.3,e10.3,3x,'(',i4,')',3x,'<',i6,'|',i4,'>',
452*2801f607SKenneth E. Jansen     &         ' [',i3,'-',i3,']',i10)
453*2801f607SKenneth E. Jansenc
454*2801f607SKenneth E. Jansen        end
455*2801f607SKenneth E. Jansen
456