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