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