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