xref: /phasta/phSolver/compressible/rstatCheck.f (revision 712d3df0b59ebebaaeaea358162c8d2c043c6e08)
159599516SKenneth E. Jansen        subroutine rstatCheck (res, ilwork,y,ac)
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        real*8 y(nshg,ndof),ac(nshg,ndof)
2859599516SKenneth E. Jansen        save ResLast
2959599516SKenneth E. Jansen
3059599516SKenneth E. Jansen        if (numpe == 1) nshgt=nshg   ! global = this processor
3159599516SKenneth E. Jansenc
3259599516SKenneth E. Jansenc.... ----------------------->  Convergence  <-------------------------
3359599516SKenneth E. Jansenc
3459599516SKenneth E. Jansenc.... compute the maximum residual and the corresponding node number
3559599516SKenneth E. Jansenc
3659599516SKenneth E. Jansen        rtmp = zero
3759599516SKenneth E. Jansen        do i = 1, nflow
3859599516SKenneth E. Jansen          rtmp = rtmp + res(:,i)**2
3959599516SKenneth E. Jansen        enddo
4059599516SKenneth E. Jansen
4159599516SKenneth E. Jansen        call sumgat (rtmp, 1, resnrm, ilwork)
4259599516SKenneth E. Jansen
4359599516SKenneth E. Jansen        resmaxl = maxval(rtmp)
4459599516SKenneth E. Jansen
4559599516SKenneth E. Jansen        irecvcount = 1
4659599516SKenneth E. Jansen        resvec = resmaxl
4759599516SKenneth E. Jansen        if (numpe > 1) then
4859599516SKenneth E. Jansen        call MPI_ALLREDUCE (resvec, resmax, irecvcount,
4959599516SKenneth E. Jansen     &                    MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD,
5059599516SKenneth E. Jansen     &                    ierr)
5159599516SKenneth E. Jansenc        call MPI_REDUCE_SCATTER (resvec, resmax, irecvcount,
5259599516SKenneth E. Jansenc     &                    MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD,
5359599516SKenneth E. Jansenc     &                    ierr)
5459599516SKenneth E. Jansen        else
5559599516SKenneth E. Jansen          resmax=resmaxl
5659599516SKenneth E. Jansen        endif
5759599516SKenneth E. Jansen        nrsmax = maxloc(rtmp)
5859599516SKenneth E. Jansenc
5959599516SKenneth E. Jansenc.... correct the residuals
6059599516SKenneth E. Jansenc
6159599516SKenneth E. Jansen        if (loctim(itseq) .eq. 0) then
6259599516SKenneth E. Jansen          resnrm = resnrm
6359599516SKenneth E. Jansen          resmax = resmax
6459599516SKenneth E. Jansen        else
6559599516SKenneth E. Jansen          resnrm = resnrm
6659599516SKenneth E. Jansen          resmax = resmax
6759599516SKenneth E. Jansen        endif
6859599516SKenneth E. Jansenc
6959599516SKenneth E. Jansenc.... approximate the number of entries
7059599516SKenneth E. Jansenc
7159599516SKenneth E. Jansen        totres = resnrm / float(nshgt)
7259599516SKenneth E. Jansen        totres = sqrt(totres)
73*513954efSKenneth E. Jansen       if((iter.gt.1).and.(totres.gt.10000.0*ResLast)) then !diverging
7459599516SKenneth E. Jansen               call restar('out ',y,res) ! 'res' is used instead of 'ac'
7559599516SKenneth E. Jansen               if(myrank.eq.0) write(*,*) 'ResLast totres', ResLast, totres
7659599516SKenneth E. Jansen               if(myrank.eq.0) write(*,*) 'resmax', resmax
77*513954efSKenneth E. Jansen               if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
7859599516SKenneth E. Jansen               call error('rstat    ','Diverge', iter)
7959599516SKenneth E. Jansen       endif
8059599516SKenneth E. Jansen       ResLast=totres
8159599516SKenneth E. Jansen	ttim(68) = ttim(68) + secs(0.0)
8259599516SKenneth E. Jansen
8359599516SKenneth E. Jansenc
8459599516SKenneth E. Jansenc.... return
8559599516SKenneth E. Jansenc
8659599516SKenneth E. Jansen        return
8759599516SKenneth E. Jansenc
8859599516SKenneth E. Jansen        end
8959599516SKenneth E. Jansen        subroutine rstatCheckSclr (rest, ilwork,y,ac)
9059599516SKenneth E. Jansenc
9159599516SKenneth E. Jansenc----------------------------------------------------------------------
9259599516SKenneth E. Jansenc
9359599516SKenneth E. Jansenc This subroutine calculates the statistics of the residual.
9459599516SKenneth E. Jansenc
9559599516SKenneth E. Jansenc input:
9659599516SKenneth E. Jansenc  rest   (nshg)   : preconditioned residual
9759599516SKenneth E. Jansenc
9859599516SKenneth E. Jansenc output:
9959599516SKenneth E. Jansenc  The time step, cpu-time and entropy-norm of the residual
10059599516SKenneth E. Jansenc     are printed in the file HISTOR.DAT.
10159599516SKenneth E. Jansenc
10259599516SKenneth E. Jansenc
10359599516SKenneth E. Jansenc Zdenek Johan, Winter 1991.  (Fortran 90)
10459599516SKenneth E. Jansenc----------------------------------------------------------------------
10559599516SKenneth E. Jansenc
10659599516SKenneth E. Jansen        include "common.h"
10759599516SKenneth E. Jansen        include "mpif.h"
10859599516SKenneth E. Jansen        include "auxmpi.h"
10959599516SKenneth E. Jansenc
11059599516SKenneth E. Jansen        dimension rest(nshg)
11159599516SKenneth E. Jansen        dimension rtmp(nshg), nrsmax(1), ilwork(nlwork)
11259599516SKenneth E. Jansen!SCATTER        dimension irecvcount(numpe), resvec(numpe)
11359599516SKenneth E. Jansenc        integer TMRC
11459599516SKenneth E. Jansen        real*8 y(nshg,ndof),ac(nshg,ndof)
11559599516SKenneth E. Jansen        save ResLast
11659599516SKenneth E. Jansen        save lstepLast
11759599516SKenneth E. Jansen
11859599516SKenneth E. Jansen	ttim(68) = ttim(68) - secs(0.0)
11959599516SKenneth E. Jansen        if (numpe == 1) nshgt=nshg   ! global = this processor
12059599516SKenneth E. Jansenc
12159599516SKenneth E. Jansenc.... ----------------------->  Convergence  <-------------------------
12259599516SKenneth E. Jansenc
12359599516SKenneth E. Jansenc.... compute the maximum residual and the corresponding node number
12459599516SKenneth E. Jansenc
12559599516SKenneth E. Jansen        rtmp = zero
12659599516SKenneth E. Jansen        rtmp = rtmp + rest**2
12759599516SKenneth E. Jansen
12859599516SKenneth E. Jansen        call sumgat (rtmp, 1, resnrm, ilwork)
12959599516SKenneth E. Jansen
13059599516SKenneth E. Jansen        resmaxl = maxval(rtmp)
13159599516SKenneth E. Jansen
13259599516SKenneth E. Jansencontinue on
13359599516SKenneth E. Jansen
13459599516SKenneth E. Jansen        irecvcount = 1
13559599516SKenneth E. Jansen        resvec = resmaxl
13659599516SKenneth E. Jansen        if (numpe > 1) then
13759599516SKenneth E. Jansen        call MPI_ALLREDUCE (resvec, resmax, irecvcount,
13859599516SKenneth E. Jansen     &                    MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD,
13959599516SKenneth E. Jansen     &                    ierr)
14059599516SKenneth E. Jansenc        call MPI_REDUCE_SCATTER (resvec, resmax, irecvcount,
14159599516SKenneth E. Jansenc     &                    MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD,
14259599516SKenneth E. Jansenc     &                    ierr)
14359599516SKenneth E. Jansen        else
14459599516SKenneth E. Jansen          resmax=resmaxl
14559599516SKenneth E. Jansen        endif
14659599516SKenneth E. Jansen        nrsmax = maxloc(rtmp)
14759599516SKenneth E. Jansenc
14859599516SKenneth E. Jansenc.... correct the residuals
14959599516SKenneth E. Jansenc
15059599516SKenneth E. Jansen        if (loctim(itseq) .eq. 0) then
15159599516SKenneth E. Jansen          resnrm = resnrm
15259599516SKenneth E. Jansen          resmax = resmax
15359599516SKenneth E. Jansen        else
15459599516SKenneth E. Jansen          resnrm = resnrm
15559599516SKenneth E. Jansen          resmax = resmax
15659599516SKenneth E. Jansen        endif
15759599516SKenneth E. Jansenc
15859599516SKenneth E. Jansenc.... approximate the number of entries
15959599516SKenneth E. Jansenc
16059599516SKenneth E. Jansen        totres = resnrm / float(nshgt)
16159599516SKenneth E. Jansen        totres = sqrt(totres)
16259599516SKenneth E. Jansen	if((lstep.gt.0).and.(lstepLast.eq.lstep)) then
163*513954efSKenneth E. Jansen           if(totres.gt.10000.0*ResLast) then !diverging
16459599516SKenneth E. Jansen               lstep = lstep+1
16559599516SKenneth E. Jansen               ac(:,5) = rest(:) ! T dot in 'ac' is filled with scl. res
16659599516SKenneth E. Jansen               call restar('out ',y,ac)
16759599516SKenneth E. Jansen               if(myrank.eq.0) write(*,*) 'ResLast totres', ResLast, totres
16859599516SKenneth E. Jansen               if(myrank.eq.0) write(*,*) 'resmax', resmax
16959599516SKenneth E. Jansen               call error('rstatSclr','Diverge', iter)
17059599516SKenneth E. Jansen           endif
17159599516SKenneth E. Jansen	else
17259599516SKenneth E. Jansen		lstepLast=lstep
17359599516SKenneth E. Jansen	endif
17459599516SKenneth E. Jansen       ResLast=totres
17559599516SKenneth E. Jansenc
17659599516SKenneth E. Jansenc.... return
17759599516SKenneth E. Jansenc
17859599516SKenneth E. Jansen        return
17959599516SKenneth E. Jansenc
18059599516SKenneth E. Jansen        end
181