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 56513954efSKenneth E. Jansen! if(myrank.eq.0) then 57513954efSKenneth E. Jansen! write(44,1000)lstep+1,(spmasstot(j),j=1,5) 58513954efSKenneth E. Jansen! call flush(44) 59513954efSKenneth 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 142513954efSKenneth E. Jansen !modified to not advance so that solver tolerance satisfaction failure 143513954efSKenneth E. Jansen ! can be appended. The line wrap occurs in solgmr 144513954efSKenneth E. Jansen if(usingPETSc.eq.0) then 145513954efSKenneth E. Jansen write(*, 2000, advance="no") lstep+1, cputme, totres, jtotrs, nrsmax, 14659599516SKenneth E. Jansen & jresmx, lGMRES, iKs, ntotGM 147513954efSKenneth E. Jansen else 148513954efSKenneth E. Jansen write(*, 2000) lstep+1, cputme, totres, jtotrs, nrsmax, 149513954efSKenneth E. Jansen & jresmx, lGMRES, iKs, ntotGM 150513954efSKenneth 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 167513954efSKenneth 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) 238513954efSKenneth E. Jansen if (resfrts .eq. zero) resfrts = totres 239513954efSKenneth 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, 251513954efSKenneth E. Jansen & jresmx, lgmress, iKss, ntotGMs 25259599516SKenneth E. Jansen write (ihist,2000) lstep+1, cputme, totres, jtotrs, nrsmax, 253513954efSKenneth 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*2801f607SKenneth E. Jansen subroutine rstatp (resNrm) 271*2801f607SKenneth E. Jansenc 272*2801f607SKenneth E. Jansenc---------------------------------------------------------------------- 273*2801f607SKenneth E. Jansenc 274*2801f607SKenneth E. Jansenc This subroutine calculates the statistics of the residual. 275*2801f607SKenneth E. Jansenc 276*2801f607SKenneth E. Jansenc input: 277*2801f607SKenneth E. Jansenc res (nshg,nflow) : preconditioned residual 278*2801f607SKenneth E. Jansenc 279*2801f607SKenneth E. Jansenc output: 280*2801f607SKenneth E. Jansenc The time step, cpu-time and entropy-norm of the residual 281*2801f607SKenneth E. Jansenc are printed in the file HISTOR.DAT. 282*2801f607SKenneth E. Jansenc 283*2801f607SKenneth E. Jansenc 284*2801f607SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 285*2801f607SKenneth E. Jansenc---------------------------------------------------------------------- 286*2801f607SKenneth E. Jansenc 287*2801f607SKenneth E. Jansen include "common.h" 288*2801f607SKenneth E. Jansen include "mpif.h" 289*2801f607SKenneth E. Jansen include "auxmpi.h" 290*2801f607SKenneth E. Jansenc 291*2801f607SKenneth E. Jansen dimension Forin(4), Forout(4) 292*2801f607SKenneth E. Jansen!SCATTER dimension irecvcount(numpe), resvec(numpe) 293*2801f607SKenneth E. Jansenc integer TMRC 294*2801f607SKenneth E. Jansen 295*2801f607SKenneth E. Jansen 296*2801f607SKenneth E. Jansen real*8 ftots(3,0:MAXSURF),ftot(3),spmasstot(0:MAXSURF),spmasss 297*2801f607SKenneth E. Jansen 298*2801f607SKenneth E. Jansen ttim(68) = ttim(68) - secs(0.0) 299*2801f607SKenneth E. Jansen 300*2801f607SKenneth E. Jansen if (numpe == 1) nshgt=nshg ! global = this processor 301*2801f607SKenneth E. Jansenc 302*2801f607SKenneth E. Jansenc incompressible style data from flx surface 303*2801f607SKenneth E. Jansenc 304*2801f607SKenneth E. Jansen if (numpe > 1) then 305*2801f607SKenneth E. Jansen call MPI_ALLREDUCE (flxID(2,isrfIM), spmasss,1, 306*2801f607SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 307*2801f607SKenneth E. Jansen call MPI_ALLREDUCE (flxID(1,isrfIM), Atots,1, 308*2801f607SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 309*2801f607SKenneth E. Jansen call MPI_ALLREDUCE (flxID(3,:), Ftots(1,:),MAXSURF+1, 310*2801f607SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 311*2801f607SKenneth E. Jansen call MPI_ALLREDUCE (flxID(4,:), Ftots(2,:),MAXSURF+1, 312*2801f607SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 313*2801f607SKenneth E. Jansen call MPI_ALLREDUCE (flxID(5,:), Ftots(3,:),MAXSURF+1, 314*2801f607SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 315*2801f607SKenneth E. Jansen call MPI_ALLREDUCE (flxID(2,:), spmasstot(:),MAXSURF+1, 316*2801f607SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 317*2801f607SKenneth E. Jansen else 318*2801f607SKenneth E. Jansen Ftots=flxID(3:5,:) 319*2801f607SKenneth E. Jansen Atots=flxID(1,isrfIM) 320*2801f607SKenneth E. Jansen spmasss=flxID(2,isrfIM) 321*2801f607SKenneth E. Jansen spmasstot(:)=flxID(2,:) 322*2801f607SKenneth E. Jansen endif 323*2801f607SKenneth E. Jansen ftot(1)=sum(Ftots(1,0:MAXSURF)) 324*2801f607SKenneth E. Jansen ftot(2)=sum(Ftots(2,0:MAXSURF)) 325*2801f607SKenneth E. Jansen ftot(3)=sum(Ftots(3,0:MAXSURF)) 326*2801f607SKenneth E. Jansenc 327*2801f607SKenneth E. Jansenc end of incompressible style 328*2801f607SKenneth E. Jansenc 329*2801f607SKenneth E. Jansenc 330*2801f607SKenneth E. Jansenc.... --------------------> Aerodynamic Forces <---------------------- 331*2801f607SKenneth E. Jansenc 332*2801f607SKenneth E. Jansenc.... output the forces and the heat flux 333*2801f607SKenneth E. Jansenc 334*2801f607SKenneth E. Jansen if (iter .eq. nitr) then 335*2801f607SKenneth E. Jansen Forin = (/ Force(1), Force(2), Force(3), HFlux /) 336*2801f607SKenneth E. Jansen if (numpe > 1) then 337*2801f607SKenneth E. Jansen call MPI_REDUCE (Forin(1), Forout(1), 4, MPI_DOUBLE_PRECISION, 338*2801f607SKenneth E. Jansen & MPI_SUM, master, 339*2801f607SKenneth E. Jansen & MPI_COMM_WORLD,ierr) 340*2801f607SKenneth E. Jansen endif 341*2801f607SKenneth E. Jansen Force = Forout(1:3) 342*2801f607SKenneth E. Jansen HFlux = Forout(4) 343*2801f607SKenneth E. Jansen if (myrank .eq. master) then 344*2801f607SKenneth E. Jansen write (iforce,1000) lstep+1, (Force(i), i=1,nsd), HFlux, 345*2801f607SKenneth E. Jansen & spmasss 346*2801f607SKenneth E. Jansen call flush(iforce) 347*2801f607SKenneth E. Jansen endif 348*2801f607SKenneth E. Jansen endif 349*2801f607SKenneth E. Jansen 350*2801f607SKenneth E. Jansenc 351*2801f607SKenneth E. Jansenc.... approximate the number of entries 352*2801f607SKenneth E. Jansenc 353*2801f607SKenneth E. Jansen totres =resNrm*resNrm / float(nshgt) 354*2801f607SKenneth E. Jansen totres = sqrt(totres) 355*2801f607SKenneth E. Jansen if (resfrt .eq. zero) resfrt = totres 356*2801f607SKenneth E. Jansen jtotrs = int ( 10.d0 * log10 ( totres / resfrt ) ) 357*2801f607SKenneth E. Jansenc 358*2801f607SKenneth E. Jansenc.... get the CPU-time 359*2801f607SKenneth E. Jansenc 360*2801f607SKenneth E. Jansen rsec=TMRC() 361*2801f607SKenneth E. Jansen cputme = (rsec-ttim(100)) 362*2801f607SKenneth E. Jansenc 363*2801f607SKenneth E. Jansenc.... output the result 364*2801f607SKenneth E. Jansenc 365*2801f607SKenneth E. Jansen nrsmax=1 366*2801f607SKenneth E. Jansen jresmx=1 ! these 2 no longer computed here 367*2801f607SKenneth E. Jansen if (myrank .eq. master) then 368*2801f607SKenneth E. Jansen write(*, 2000) lstep+1, cputme, totres, jtotrs, nrsmax, 369*2801f607SKenneth E. Jansen & jresmx, lGMRES, iKs, ntotGM 370*2801f607SKenneth E. Jansen write (ihist,2000) lstep+1, cputme, totres, jtotrs, nrsmax, 371*2801f607SKenneth E. Jansen & jresmx, lGMRES, iKs, ntotGM 372*2801f607SKenneth E. Jansen call flush(ihist) 373*2801f607SKenneth E. Jansen endif 374*2801f607SKenneth E. Jansen ttim(68) = ttim(68) + secs(0.0) 375*2801f607SKenneth E. Jansen 376*2801f607SKenneth E. Jansenc 377*2801f607SKenneth E. Jansenc.... return 378*2801f607SKenneth E. Jansenc 379*2801f607SKenneth E. Jansen return 380*2801f607SKenneth E. Jansenc 381*2801f607SKenneth E. Jansen1000 format(1p,i6,5e13.5) 382*2801f607SKenneth E. Jansen2000 format(1p,i6,e10.3,e10.3,3x,'(',i4,')',3x,'<',i6,'|',i4,'>', 383*2801f607SKenneth E. Jansen & ' [',i3,'-',i3,']',i10) 384*2801f607SKenneth E. Jansenc 385*2801f607SKenneth E. Jansen end 386*2801f607SKenneth E. Jansen subroutine rstatpSclr (resnrm ) 387*2801f607SKenneth E. Jansenc 388*2801f607SKenneth E. Jansenc---------------------------------------------------------------------- 389*2801f607SKenneth E. Jansenc 390*2801f607SKenneth E. Jansenc This subroutine calculates the statistics of the residual. 391*2801f607SKenneth E. Jansenc 392*2801f607SKenneth E. Jansenc input: 393*2801f607SKenneth E. Jansenc rest (nshg) : preconditioned residual 394*2801f607SKenneth E. Jansenc 395*2801f607SKenneth E. Jansenc output: 396*2801f607SKenneth E. Jansenc The time step, cpu-time and entropy-norm of the residual 397*2801f607SKenneth E. Jansenc are printed in the file HISTOR.DAT. 398*2801f607SKenneth E. Jansenc 399*2801f607SKenneth E. Jansenc 400*2801f607SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 401*2801f607SKenneth E. Jansenc---------------------------------------------------------------------- 402*2801f607SKenneth E. Jansenc 403*2801f607SKenneth E. Jansen include "common.h" 404*2801f607SKenneth E. Jansen include "mpif.h" 405*2801f607SKenneth E. Jansen include "auxmpi.h" 406*2801f607SKenneth E. Jansenc 407*2801f607SKenneth E. Jansen dimension rest(nshg) 408*2801f607SKenneth E. Jansen dimension rtmp(nshg), nrsmax(1), ilwork(nlwork) 409*2801f607SKenneth E. Jansen!SCATTER dimension irecvcount(numpe), resvec(numpe) 410*2801f607SKenneth E. Jansenc integer TMRC 411*2801f607SKenneth E. Jansen 412*2801f607SKenneth E. Jansen ttim(68) = ttim(68) - secs(0.0) 413*2801f607SKenneth E. Jansen if (numpe == 1) nshgt=nshg ! global = this processor 414*2801f607SKenneth E. Jansenc 415*2801f607SKenneth E. Jansenc.... -----------------------> Convergence <------------------------- 416*2801f607SKenneth E. Jansenc 417*2801f607SKenneth E. Jansen resmax = 1 418*2801f607SKenneth E. Jansenc 419*2801f607SKenneth E. Jansenc.... approximate the number of entries 420*2801f607SKenneth E. Jansenc 421*2801f607SKenneth E. Jansen totres = resnrm*resnrm / float(nshgt) 422*2801f607SKenneth E. Jansen totres = sqrt(totres) 423*2801f607SKenneth E. Jansen if (resfrts .eq. zero) resfrts = totres 424*2801f607SKenneth E. Jansen jtotrs = int ( 10.d0 * log10 ( totres / resfrts ) ) 425*2801f607SKenneth E. Jansen jresmx = int ( 10.d0 * log10 ( resmax / totres ) ) 426*2801f607SKenneth E. Jansenc 427*2801f607SKenneth E. Jansenc.... get the CPU-time 428*2801f607SKenneth E. Jansenc 429*2801f607SKenneth E. Jansen rsec=TMRC() 430*2801f607SKenneth E. Jansen cputme = (rsec-ttim(100)) 431*2801f607SKenneth E. Jansenc 432*2801f607SKenneth E. Jansenc.... output the result 433*2801f607SKenneth E. Jansenc 434*2801f607SKenneth E. Jansen if (myrank .eq. master) then 435*2801f607SKenneth E. Jansen print 2000, lstep+1, cputme, totres, jtotrs, nrsmax, 436*2801f607SKenneth E. Jansen & jresmx, lgmress, iKss, ntotGMs 437*2801f607SKenneth E. Jansen write (ihist,2000) lstep+1, cputme, totres, jtotrs, nrsmax, 438*2801f607SKenneth E. Jansen & jresmx, lgmress, iKss, ntotGMs 439*2801f607SKenneth E. Jansen call flush(ihist) 440*2801f607SKenneth E. Jansen endif 441*2801f607SKenneth E. Jansen if(totres.gt.1.0e-9) istop=istop-1 442*2801f607SKenneth E. Jansen 443*2801f607SKenneth E. Jansen ttim(68) = ttim(68) + secs(0.0) 444*2801f607SKenneth E. Jansen 445*2801f607SKenneth E. Jansenc 446*2801f607SKenneth E. Jansenc.... return 447*2801f607SKenneth E. Jansenc 448*2801f607SKenneth E. Jansen return 449*2801f607SKenneth E. Jansenc 450*2801f607SKenneth E. Jansen1000 format(1p,i6,4e13.5) 451*2801f607SKenneth E. Jansen2000 format(1p,i6,e10.3,e10.3,3x,'(',i4,')',3x,'<',i6,'|',i4,'>', 452*2801f607SKenneth E. Jansen & ' [',i3,'-',i3,']',i10) 453*2801f607SKenneth E. Jansenc 454*2801f607SKenneth E. Jansen end 455*2801f607SKenneth E. Jansen 456