xref: /phasta/phSolver/incompressible/rstatic.f (revision d06028c1ed09954bf598b0145fe1ac8aecabad11)
159599516SKenneth E. Jansen        subroutine rstatic (res, y, Dy)
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),    mproc(1)
2359599516SKenneth E. Jansen!SCATTER        dimension  rvec(numpe)
2459599516SKenneth E. Jansen        dimension rtmp(nshg),        nrsmax(1)
2559599516SKenneth E. Jansen!SCATTER        dimension irecvcount(numpe), resvec(numpe)
2659599516SKenneth E. Jansen
2759599516SKenneth E. Jansen        real*8    y(nshg,ndof),    Dy(nshg,4)
2859599516SKenneth E. Jansenc        integer tmrc
2959599516SKenneth E. Jansenc
3059599516SKenneth E. Jansenc$$$	ttim(68) = ttim(68) - tmr()
3159599516SKenneth E. Jansenc
3259599516SKenneth E. Jansenc.... compute max delta y
3359599516SKenneth E. Jansenc
3459599516SKenneth E. Jansen        rdy1 = zero
3559599516SKenneth E. Jansen        rdy2 = zero
3659599516SKenneth E. Jansen        rdy4 = zero
3759599516SKenneth E. Jansen        rdy5 = zero
3859599516SKenneth E. Jansen        call sumgatN( abs(gami*Delt(itseq)
3959599516SKenneth E. Jansen     &                * Dy(1:numnp,1:3)),3,rdy1, numnp)
4059599516SKenneth E. Jansen        call sumgatN( abs( y(1:numnp,1:3)),3,rdy2,numnp)
4159599516SKenneth E. Jansen        call sumgatN( abs(gami*alfi*Delt(itseq)
4259599516SKenneth E. Jansen     &                * Dy(1:numnp,4)),1,rdy4,numnp)
4359599516SKenneth E. Jansen        call sumgatN( abs( y(1:numnp,4)),  1,rdy5,numnp)
4459599516SKenneth E. Jansen        rmaxdyU = rdy1/rdy2
4559599516SKenneth E. Jansen        rmaxdyP = rdy4/rdy5
4659599516SKenneth E. Jansen
4759599516SKenneth E. Jansenc
4859599516SKenneth E. Jansenc..... Signal to quit if delta is very small. look in itrdrv.f for the
4959599516SKenneth E. Jansenc      completion of the hack.
5059599516SKenneth E. Jansenc
5159599516SKenneth E. Jansen	if( rmaxdyU .lt. dtol(1) .and. rmaxdyP .lt. dtol(2)) then
5259599516SKenneth E. Jansen           istop = 1000
5359599516SKenneth E. Jansen        endif
5459599516SKenneth E. Jansen
5559599516SKenneth E. Jansen        if (numpe == 1) nshgt=nshg   ! global = this processor
5659599516SKenneth E. Jansenc
5759599516SKenneth E. Jansenc
5859599516SKenneth E. Jansenc.... ----------------------->  Convergence  <-------------------------
5959599516SKenneth E. Jansenc
6059599516SKenneth E. Jansenc.... compute the maximum residual and the corresponding node number
6159599516SKenneth E. Jansenc
6259599516SKenneth E. Jansen        rtmp = zero
6359599516SKenneth E. Jansen        if (impl(itseq) .ge. 9) then
6459599516SKenneth E. Jansen          do i = 1, nflow
6559599516SKenneth E. Jansen            rtmp = rtmp + res(:,i)**2    ! only add continuity and momentum
6659599516SKenneth E. Jansen          enddo
6759599516SKenneth E. Jansen        endif
6859599516SKenneth E. Jansen
6959599516SKenneth E. Jansen        call sumgat (rtmp, 1, resnrm)
7059599516SKenneth E. Jansen
7159599516SKenneth E. Jansen        resmaxl = maxval(rtmp)
7259599516SKenneth E. Jansen
7359599516SKenneth E. Jansen        irecvcount = 1
7459599516SKenneth E. Jansen        resvec = resmaxl
7559599516SKenneth E. Jansen        if (numpe > 1) then
7659599516SKenneth E. Jansen           if(impistat.eq.1) then
7759599516SKenneth E. Jansen             iAllR = iAllR+1
7859599516SKenneth E. Jansen           elseif(impistat.eq.2) then
7959599516SKenneth E. Jansen             iAllRScal = iAllRScal+1
8059599516SKenneth E. Jansen           endif
8159599516SKenneth E. Jansen           if(impistat2.eq.1) call MPI_BARRIER (MPI_COMM_WORLD, ierr)
8259599516SKenneth E. Jansen           if(impistat.gt.0) rmpitmr = TMRC()
8359599516SKenneth E. Jansen           call MPI_ALLREDUCE (resvec, resmax, irecvcount,
8459599516SKenneth E. Jansen     &          MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr)
8559599516SKenneth E. Jansen           if(impistat.eq.1) then
8659599516SKenneth E. Jansen            rAllR = rAllR+TMRC()-rmpitmr
8759599516SKenneth E. Jansen           elseif(impistat.eq.2) then
8859599516SKenneth E. Jansen            rAllRScal = rAllRScal+TMRC()-rmpitmr
8959599516SKenneth E. Jansen           endif
9059599516SKenneth E. Jansenc           call MPI_REDUCE_SCATTER (resvec, resmax, irecvcount,
9159599516SKenneth E. Jansenc     &          MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr)
9259599516SKenneth E. Jansen           if (resmax .eq. resvec ) then
9359599516SKenneth E. Jansenc           if (resmax .eq. resvec(1) ) then
9459599516SKenneth E. Jansen              mproc(1) = myrank
9559599516SKenneth E. Jansen              nrsmax   = maxloc(rtmp)
9659599516SKenneth E. Jansen           else
9759599516SKenneth E. Jansen              mproc(1)  = -1
9859599516SKenneth E. Jansen              nrsmax(1) = -1
9959599516SKenneth E. Jansen           endif
10059599516SKenneth E. Jansen           resvec = nrsmax(1)
10159599516SKenneth E. Jansen           if(impistat.eq.1) then
10259599516SKenneth E. Jansen             iAllR = iAllR+1
10359599516SKenneth E. Jansen           elseif(impistat.eq.2) then
10459599516SKenneth E. Jansen             iAllRScal = iAllRScal+1
10559599516SKenneth E. Jansen           endif
10659599516SKenneth E. Jansen           if(impistat2.eq.1) call MPI_BARRIER (MPI_COMM_WORLD, ierr)
10759599516SKenneth E. Jansen           if(impistat.gt.0) rmpitmr = TMRC()
10859599516SKenneth E. Jansen           call MPI_ALLREDUCE (resvec, rvec, irecvcount,
10959599516SKenneth E. Jansen     &          MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr)
11059599516SKenneth E. Jansen           if(impistat.eq.1) then
11159599516SKenneth E. Jansen             rAllR = rAllR+TMRC()-rmpitmr
11259599516SKenneth E. Jansen           elseif(impistat.eq.2) then
11359599516SKenneth E. Jansen             rAllRScal = rAllRScal+TMRC()-rmpitmr
11459599516SKenneth E. Jansen           endif
11559599516SKenneth E. Jansenc           call MPI_REDUCE_SCATTER (resvec, rvec, irecvcount,
11659599516SKenneth E. Jansenc     &          MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr)
11759599516SKenneth E. Jansen           nrsmax = rvec
11859599516SKenneth E. Jansenc           nrsmax = rvec(1)
11959599516SKenneth E. Jansen           resvec = mproc(1)
12059599516SKenneth E. Jansen           if(impistat.eq.1) then
12159599516SKenneth E. Jansen             iAllR = iAllR+1
12259599516SKenneth E. Jansen           elseif(impistat.eq.2) then
12359599516SKenneth E. Jansen             iAllRScal = iAllRScal+1
12459599516SKenneth E. Jansen           endif
12559599516SKenneth E. Jansen           if(impistat2.eq.1) call MPI_BARRIER (MPI_COMM_WORLD, ierr)
12659599516SKenneth E. Jansen           if(impistat.gt.0) rmpitmr = TMRC()
12759599516SKenneth E. Jansen           call MPI_ALLREDUCE (resvec, rvec, irecvcount,
12859599516SKenneth E. Jansen     &          MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr)
12959599516SKenneth E. Jansen           if(impistat.eq.1) then
13059599516SKenneth E. Jansen             rAllR = rAllR+TMRC()-rmpitmr
13159599516SKenneth E. Jansen           elseif(impistat.eq.2) then
13259599516SKenneth E. Jansen             rAllRScal = rAllRScal+TMRC()-rmpitmr
13359599516SKenneth E. Jansen           endif
13459599516SKenneth E. Jansenc           call MPI_REDUCE_SCATTER (resvec, rvec, irecvcount,
13559599516SKenneth E. Jansenc     &          MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr)
13659599516SKenneth E. Jansen           mproc(1) = rvec
13759599516SKenneth E. Jansenc           mproc = rvec(1)
13859599516SKenneth E. Jansen      else
13959599516SKenneth E. Jansen          resmax = resmaxl
14059599516SKenneth E. Jansen          nrsmax = maxloc(rtmp)
14159599516SKenneth E. Jansen          mproc(1) = 0
14259599516SKenneth E. Jansen      endif
14359599516SKenneth E. Jansenc
14459599516SKenneth E. Jansenc.... correct the residuals
14559599516SKenneth E. Jansenc
14659599516SKenneth E. Jansen        if (loctim(itseq) .eq. 0) then
14759599516SKenneth E. Jansen          resnrm = resnrm
14859599516SKenneth E. Jansen          resmax = resmax
14959599516SKenneth E. Jansen        else
15059599516SKenneth E. Jansen          resnrm = resnrm
15159599516SKenneth E. Jansen          resmax = resmax
15259599516SKenneth E. Jansen        endif
15359599516SKenneth E. Jansenc
15459599516SKenneth E. Jansenc.... approximate the number of entries
15559599516SKenneth E. Jansenc
15659599516SKenneth E. Jansen        totres = resnrm / float(nshgt)
15759599516SKenneth E. Jansen        totres = sqrt(totres)
15859599516SKenneth E. Jansen        resmax = sqrt(resmax)
159*6d194905SKenneth E. Jansen        if (resfrt(1) .eq. zero) resfrt(1) = totres
160*6d194905SKenneth E. Jansen        jtotrs = int  ( 10.d0 * log10 ( totres / resfrt(1) ) )
16159599516SKenneth E. Jansen        jresmx = int  ( 10.d0 * log10 ( resmax / totres ) )
16259599516SKenneth E. Jansenc
16359599516SKenneth E. Jansenc.... get the CPU-time
16459599516SKenneth E. Jansenc
16559599516SKenneth E. JansenCAD        cputme = (second(0) - ttim(100))
16659599516SKenneth E. Jansen        rsec=TMRC()
16759599516SKenneth E. Jansen        cputme = (rsec - ttim(100))
16859599516SKenneth E. Jansenc
16959599516SKenneth E. Jansenc.... output the result
17059599516SKenneth E. Jansenc
17159599516SKenneth E. Jansenc        if (numpe > 1) call MPI_BARRIER (MPI_COMM_WORLD, ierr)
17259599516SKenneth E. Jansen
17359599516SKenneth E. Jansen        if (myrank .eq. master) then
17459599516SKenneth E. Jansenc
17559599516SKenneth E. Jansenc.... results of continuity and momentum
17659599516SKenneth E. Jansenc
17759599516SKenneth E. Jansen
17859599516SKenneth E. Jansen           print 2000, lstep+1, cputme, totres, jtotrs, rmaxdyU,
17959599516SKenneth E. Jansen     &          rmaxdyP,nrsmax,
18059599516SKenneth E. Jansen     &          mproc(1)+1, jresmx, int(statsflow(4)),
18159599516SKenneth E. Jansen     &          int(statsflow(1))
182c9a96f21SKenneth E. Jansen           write (ihist,2000) lstep+1, cputme, totres, jtotrs,
183c9a96f21SKenneth E. Jansen     &          rmaxdyU, rmaxdyP, nrsmax,
184c9a96f21SKenneth E. Jansen     &          mproc(1)+1,jresmx,int(statsflow(4)),
185c9a96f21SKenneth E. Jansen     &          int(statsflow(1))
18659599516SKenneth E. Jansen
187c9a96f21SKenneth E. Jansen           call flush(ihist)
18859599516SKenneth E. Jansen        endif
18959599516SKenneth E. Jansenc        if(numpe>1) call MPI_BARRIER (MPI_COMM_WORLD,ierr)
19059599516SKenneth E. Jansen
19159599516SKenneth E. Jansenc$$$	ttim(68) = ttim(68) + tmr()
19259599516SKenneth E. Jansen
19359599516SKenneth E. Jansenc
19459599516SKenneth E. Jansenc.... return
19559599516SKenneth E. Jansenc
19659599516SKenneth E. Jansen        return
19759599516SKenneth E. Jansenc
19859599516SKenneth E. Jansen 1000   format(1p,i6,5e13.5)
19959599516SKenneth E. Jansen 2000   format(1p,i6,e10.3,e10.3,2x,'(',i4,')',2x,e10.3,2x,e10.3,
20059599516SKenneth E. Jansen     &       2x,'<',i6,'-',i5,'|',
20159599516SKenneth E. Jansen     &       i4,'>', ' [', i4,' -',i4,']')
20259599516SKenneth E. Jansen 3000   format(1p,i6,e10.3,e10.3,3x,'(',i4,')',3x,'<',i6,'-',i5,'|',
20359599516SKenneth E. Jansen     &       i4,'>', ' [', i4,' -',i4,' -',i4,']')
20459599516SKenneth E. Jansen
20559599516SKenneth E. Jansenc
20659599516SKenneth E. Jansen        end
20759599516SKenneth E. Jansen
20859599516SKenneth E. Jansen
20959599516SKenneth E. Jansen        subroutine rstaticSclr (res, y, Dy, icomp)
21059599516SKenneth E. Jansenc
21159599516SKenneth E. Jansenc----------------------------------------------------------------------
21259599516SKenneth E. Jansenc
21359599516SKenneth E. Jansenc This subroutine calculates the statistics of the residual
21459599516SKenneth E. Jansenc
21559599516SKenneth E. Jansenc----------------------------------------------------------------------
21659599516SKenneth E. Jansenc
21759599516SKenneth E. Jansen        include "common.h"
21859599516SKenneth E. Jansen        include "mpif.h"
21959599516SKenneth E. Jansen        include "auxmpi.h"
22059599516SKenneth E. Jansenc
22159599516SKenneth E. Jansen        dimension res(nshg)
22259599516SKenneth E. Jansen        dimension rtmp(nshg)
22359599516SKenneth E. Jansen        real*8    y(nshg,ndof),    Dy(nshg), nrm
22459599516SKenneth E. Jansenc        integer tmrc
22559599516SKenneth E. Jansenc
22659599516SKenneth E. Jansenc.... compute max delta y
22759599516SKenneth E. Jansenc
22859599516SKenneth E. Jansen        rdy1 = zero
22959599516SKenneth E. Jansen        rdy2 = zero
23059599516SKenneth E. Jansenc
23159599516SKenneth E. Jansenc.... normalize turbulence with molecular viscosity
23259599516SKenneth E. Jansenc
23359599516SKenneth E. Jansen        if ( (icomp .eq. 6).and. (iRANS.eq.-1) ) then
23459599516SKenneth E. Jansen           nrm = datmat(1,2,1)
23559599516SKenneth E. Jansen        else
23659599516SKenneth E. Jansen           nrm = zero
23759599516SKenneth E. Jansen        endif
23859599516SKenneth E. Jansen        call sumgat( abs(gami*Delt(itseq)*Dy(:)),1,rdy1)
23959599516SKenneth E. Jansen        call sumgat( abs( y(:,icomp)),1,rdy2)
24059599516SKenneth E. Jansen        rmaxdyT = rdy1/(rdy2+nrm)
24159599516SKenneth E. Jansenc
24259599516SKenneth E. Jansenc.... compute the maximum residual and the corresponding node number
24359599516SKenneth E. Jansenc
24459599516SKenneth E. Jansen        rtmp = zero
24559599516SKenneth E. Jansen        rtmp = rtmp + res**2 ! add temperature also
24659599516SKenneth E. Jansen        call sumgat (rtmp, 1, resnrm)
24759599516SKenneth E. Jansen
24859599516SKenneth E. Jansen        if (numpe == 1) nshgt=nshg ! global = this processor
24959599516SKenneth E. Jansen
25059599516SKenneth E. Jansen        totres = resnrm / float(nshgt)
25159599516SKenneth E. Jansen        totres = sqrt(totres)
25259599516SKenneth E. Jansen
25359599516SKenneth E. Jansenc        if (mod(impl(1),100)/10 .eq. 0) then  !not solving flow
25459599516SKenneth E. Jansen           if (myrank .eq. master) then
25559599516SKenneth E. Jansenc
25659599516SKenneth E. Jansenc.... get the CPU-time
25759599516SKenneth E. Jansenc
25859599516SKenneth E. Jansen              rsec=TMRC()
25959599516SKenneth E. Jansen              cputme = (rsec - ttim(100))
26059599516SKenneth E. Jansen
26159599516SKenneth E. Jansen           print 802, lstep+1, cputme, totres, rmaxdyT,
26259599516SKenneth E. Jansen     &                int(statssclr(1))
263c9a96f21SKenneth E. Jansen           write (ihist,802) lstep+1, cputme, totres,
264c9a96f21SKenneth E. Jansen     &          rmaxdyT,int(statssclr(1))
26559599516SKenneth E. Jansen
266c9a96f21SKenneth E. Jansen               call flush(ihist)
26759599516SKenneth E. Jansen           endif
26859599516SKenneth E. Jansenc        else
26959599516SKenneth E. Jansenc           if (myrank .eq. master) then
27059599516SKenneth E. Jansenc              print 803, totres, rmaxdyT, int(statssclr(1))
27159599516SKenneth E. Jansenc              write(ihist,803) totres, rmaxdyT, int(statssclr(1))
27259599516SKenneth E. Jansenc           endif
27359599516SKenneth E. Jansenc        endif
27459599516SKenneth E. Jansen
27559599516SKenneth E. Jansen        return
27659599516SKenneth E. Jansen
27759599516SKenneth E. Jansen 802    format(1p,i6,e10.3,e10.3,10X,e10.3,31X,'[',i6,']')
27859599516SKenneth E. Jansen 803    format(1p,16x,e10.3,10x,e10.3,31X,'[',i10,']')
27959599516SKenneth E. Jansen
28059599516SKenneth E. Jansen        end
28159599516SKenneth E. Jansen
28259599516SKenneth E. Jansen
28359599516SKenneth E. Jansen
284