xref: /phasta/phSolver/compressible/rstat.f (revision 513954ef803c300cddba2bb96b4a5dac0b93489a)
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
56*513954efSKenneth E. Jansen! 	if(myrank.eq.0) then
57*513954efSKenneth E. Jansen!     write(44,1000)lstep+1,(spmasstot(j),j=1,5)
58*513954efSKenneth E. Jansen!     call flush(44)
59*513954efSKenneth 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
142*513954efSKenneth E. Jansen          !modified to not advance so that solver tolerance satisfaction failure
143*513954efSKenneth E. Jansen          ! can be appended. The line wrap occurs in solgmr
144*513954efSKenneth E. Jansen          if(usingPETSc.eq.0) then
145*513954efSKenneth E. Jansen           write(*, 2000, advance="no")       lstep+1, cputme, totres, jtotrs, nrsmax,
14659599516SKenneth E. Jansen     &                     jresmx, lGMRES,  iKs, ntotGM
147*513954efSKenneth E. Jansen          else
148*513954efSKenneth E. Jansen           write(*, 2000)       lstep+1, cputme, totres, jtotrs, nrsmax,
149*513954efSKenneth E. Jansen     &                     jresmx, lGMRES,  iKs, ntotGM
150*513954efSKenneth 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
167*513954efSKenneth 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)
238*513954efSKenneth E. Jansen        if (resfrts .eq. zero) resfrts = totres
239*513954efSKenneth 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,
251*513954efSKenneth E. Jansen     &                     jresmx, lgmress,  iKss, ntotGMs
25259599516SKenneth E. Jansen          write (ihist,2000) lstep+1, cputme, totres, jtotrs, nrsmax,
253*513954efSKenneth 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