1*59599516SKenneth E. Jansen subroutine rstatic (res, y, Dy) 2*59599516SKenneth E. Jansenc 3*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 4*59599516SKenneth E. Jansenc 5*59599516SKenneth E. Jansenc This subroutine calculates the statistics of the residual. 6*59599516SKenneth E. Jansenc 7*59599516SKenneth E. Jansenc input: 8*59599516SKenneth E. Jansenc res (nshg,nflow) : preconditioned residual 9*59599516SKenneth E. Jansenc 10*59599516SKenneth E. Jansenc output: 11*59599516SKenneth E. Jansenc The time step, cpu-time and entropy-norm of the residual 12*59599516SKenneth E. Jansenc are printed in the file HISTOR.DAT. 13*59599516SKenneth E. Jansenc 14*59599516SKenneth E. Jansenc 15*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 16*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 17*59599516SKenneth E. Jansenc 18*59599516SKenneth E. Jansen include "common.h" 19*59599516SKenneth E. Jansen include "mpif.h" 20*59599516SKenneth E. Jansen include "auxmpi.h" 21*59599516SKenneth E. Jansenc 22*59599516SKenneth E. Jansen dimension res(nshg,nflow), mproc(1) 23*59599516SKenneth E. Jansen!SCATTER dimension rvec(numpe) 24*59599516SKenneth E. Jansen dimension rtmp(nshg), nrsmax(1) 25*59599516SKenneth E. Jansen!SCATTER dimension irecvcount(numpe), resvec(numpe) 26*59599516SKenneth E. Jansen 27*59599516SKenneth E. Jansen real*8 y(nshg,ndof), Dy(nshg,4) 28*59599516SKenneth E. Jansenc integer tmrc 29*59599516SKenneth E. Jansenc 30*59599516SKenneth E. Jansenc$$$ ttim(68) = ttim(68) - tmr() 31*59599516SKenneth E. Jansenc 32*59599516SKenneth E. Jansenc.... compute max delta y 33*59599516SKenneth E. Jansenc 34*59599516SKenneth E. Jansen rdy1 = zero 35*59599516SKenneth E. Jansen rdy2 = zero 36*59599516SKenneth E. Jansen rdy4 = zero 37*59599516SKenneth E. Jansen rdy5 = zero 38*59599516SKenneth E. Jansen call sumgatN( abs(gami*Delt(itseq) 39*59599516SKenneth E. Jansen & * Dy(1:numnp,1:3)),3,rdy1, numnp) 40*59599516SKenneth E. Jansen call sumgatN( abs( y(1:numnp,1:3)),3,rdy2,numnp) 41*59599516SKenneth E. Jansen call sumgatN( abs(gami*alfi*Delt(itseq) 42*59599516SKenneth E. Jansen & * Dy(1:numnp,4)),1,rdy4,numnp) 43*59599516SKenneth E. Jansen call sumgatN( abs( y(1:numnp,4)), 1,rdy5,numnp) 44*59599516SKenneth E. Jansen rmaxdyU = rdy1/rdy2 45*59599516SKenneth E. Jansen rmaxdyP = rdy4/rdy5 46*59599516SKenneth E. Jansen 47*59599516SKenneth E. Jansenc 48*59599516SKenneth E. Jansenc..... Signal to quit if delta is very small. look in itrdrv.f for the 49*59599516SKenneth E. Jansenc completion of the hack. 50*59599516SKenneth E. Jansenc 51*59599516SKenneth E. Jansen if( rmaxdyU .lt. dtol(1) .and. rmaxdyP .lt. dtol(2)) then 52*59599516SKenneth E. Jansen istop = 1000 53*59599516SKenneth E. Jansen endif 54*59599516SKenneth E. Jansen 55*59599516SKenneth E. Jansen if (numpe == 1) nshgt=nshg ! global = this processor 56*59599516SKenneth E. Jansenc 57*59599516SKenneth E. Jansenc 58*59599516SKenneth E. Jansenc.... -----------------------> Convergence <------------------------- 59*59599516SKenneth E. Jansenc 60*59599516SKenneth E. Jansenc.... compute the maximum residual and the corresponding node number 61*59599516SKenneth E. Jansenc 62*59599516SKenneth E. Jansen rtmp = zero 63*59599516SKenneth E. Jansen if (impl(itseq) .ge. 9) then 64*59599516SKenneth E. Jansen do i = 1, nflow 65*59599516SKenneth E. Jansen rtmp = rtmp + res(:,i)**2 ! only add continuity and momentum 66*59599516SKenneth E. Jansen enddo 67*59599516SKenneth E. Jansen endif 68*59599516SKenneth E. Jansen 69*59599516SKenneth E. Jansen call sumgat (rtmp, 1, resnrm) 70*59599516SKenneth E. Jansen 71*59599516SKenneth E. Jansen resmaxl = maxval(rtmp) 72*59599516SKenneth E. Jansen 73*59599516SKenneth E. Jansen irecvcount = 1 74*59599516SKenneth E. Jansen resvec = resmaxl 75*59599516SKenneth E. Jansen if (numpe > 1) then 76*59599516SKenneth E. Jansen if(impistat.eq.1) then 77*59599516SKenneth E. Jansen iAllR = iAllR+1 78*59599516SKenneth E. Jansen elseif(impistat.eq.2) then 79*59599516SKenneth E. Jansen iAllRScal = iAllRScal+1 80*59599516SKenneth E. Jansen endif 81*59599516SKenneth E. Jansen if(impistat2.eq.1) call MPI_BARRIER (MPI_COMM_WORLD, ierr) 82*59599516SKenneth E. Jansen if(impistat.gt.0) rmpitmr = TMRC() 83*59599516SKenneth E. Jansen call MPI_ALLREDUCE (resvec, resmax, irecvcount, 84*59599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr) 85*59599516SKenneth E. Jansen if(impistat.eq.1) then 86*59599516SKenneth E. Jansen rAllR = rAllR+TMRC()-rmpitmr 87*59599516SKenneth E. Jansen elseif(impistat.eq.2) then 88*59599516SKenneth E. Jansen rAllRScal = rAllRScal+TMRC()-rmpitmr 89*59599516SKenneth E. Jansen endif 90*59599516SKenneth E. Jansenc call MPI_REDUCE_SCATTER (resvec, resmax, irecvcount, 91*59599516SKenneth E. Jansenc & MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr) 92*59599516SKenneth E. Jansen if (resmax .eq. resvec ) then 93*59599516SKenneth E. Jansenc if (resmax .eq. resvec(1) ) then 94*59599516SKenneth E. Jansen mproc(1) = myrank 95*59599516SKenneth E. Jansen nrsmax = maxloc(rtmp) 96*59599516SKenneth E. Jansen else 97*59599516SKenneth E. Jansen mproc(1) = -1 98*59599516SKenneth E. Jansen nrsmax(1) = -1 99*59599516SKenneth E. Jansen endif 100*59599516SKenneth E. Jansen resvec = nrsmax(1) 101*59599516SKenneth E. Jansen if(impistat.eq.1) then 102*59599516SKenneth E. Jansen iAllR = iAllR+1 103*59599516SKenneth E. Jansen elseif(impistat.eq.2) then 104*59599516SKenneth E. Jansen iAllRScal = iAllRScal+1 105*59599516SKenneth E. Jansen endif 106*59599516SKenneth E. Jansen if(impistat2.eq.1) call MPI_BARRIER (MPI_COMM_WORLD, ierr) 107*59599516SKenneth E. Jansen if(impistat.gt.0) rmpitmr = TMRC() 108*59599516SKenneth E. Jansen call MPI_ALLREDUCE (resvec, rvec, irecvcount, 109*59599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr) 110*59599516SKenneth E. Jansen if(impistat.eq.1) then 111*59599516SKenneth E. Jansen rAllR = rAllR+TMRC()-rmpitmr 112*59599516SKenneth E. Jansen elseif(impistat.eq.2) then 113*59599516SKenneth E. Jansen rAllRScal = rAllRScal+TMRC()-rmpitmr 114*59599516SKenneth E. Jansen endif 115*59599516SKenneth E. Jansenc call MPI_REDUCE_SCATTER (resvec, rvec, irecvcount, 116*59599516SKenneth E. Jansenc & MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr) 117*59599516SKenneth E. Jansen nrsmax = rvec 118*59599516SKenneth E. Jansenc nrsmax = rvec(1) 119*59599516SKenneth E. Jansen resvec = mproc(1) 120*59599516SKenneth E. Jansen if(impistat.eq.1) then 121*59599516SKenneth E. Jansen iAllR = iAllR+1 122*59599516SKenneth E. Jansen elseif(impistat.eq.2) then 123*59599516SKenneth E. Jansen iAllRScal = iAllRScal+1 124*59599516SKenneth E. Jansen endif 125*59599516SKenneth E. Jansen if(impistat2.eq.1) call MPI_BARRIER (MPI_COMM_WORLD, ierr) 126*59599516SKenneth E. Jansen if(impistat.gt.0) rmpitmr = TMRC() 127*59599516SKenneth E. Jansen call MPI_ALLREDUCE (resvec, rvec, irecvcount, 128*59599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr) 129*59599516SKenneth E. Jansen if(impistat.eq.1) then 130*59599516SKenneth E. Jansen rAllR = rAllR+TMRC()-rmpitmr 131*59599516SKenneth E. Jansen elseif(impistat.eq.2) then 132*59599516SKenneth E. Jansen rAllRScal = rAllRScal+TMRC()-rmpitmr 133*59599516SKenneth E. Jansen endif 134*59599516SKenneth E. Jansenc call MPI_REDUCE_SCATTER (resvec, rvec, irecvcount, 135*59599516SKenneth E. Jansenc & MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr) 136*59599516SKenneth E. Jansen mproc(1) = rvec 137*59599516SKenneth E. Jansenc mproc = rvec(1) 138*59599516SKenneth E. Jansen else 139*59599516SKenneth E. Jansen resmax = resmaxl 140*59599516SKenneth E. Jansen nrsmax = maxloc(rtmp) 141*59599516SKenneth E. Jansen mproc(1) = 0 142*59599516SKenneth E. Jansen endif 143*59599516SKenneth E. Jansenc 144*59599516SKenneth E. Jansenc.... correct the residuals 145*59599516SKenneth E. Jansenc 146*59599516SKenneth E. Jansen if (loctim(itseq) .eq. 0) then 147*59599516SKenneth E. Jansen resnrm = resnrm 148*59599516SKenneth E. Jansen resmax = resmax 149*59599516SKenneth E. Jansen else 150*59599516SKenneth E. Jansen resnrm = resnrm 151*59599516SKenneth E. Jansen resmax = resmax 152*59599516SKenneth E. Jansen endif 153*59599516SKenneth E. Jansenc 154*59599516SKenneth E. Jansenc.... approximate the number of entries 155*59599516SKenneth E. Jansenc 156*59599516SKenneth E. Jansen totres = resnrm / float(nshgt) 157*59599516SKenneth E. Jansen totres = sqrt(totres) 158*59599516SKenneth E. Jansen resmax = sqrt(resmax) 159*59599516SKenneth E. Jansen if (resfrt .eq. zero) resfrt = totres 160*59599516SKenneth E. Jansen jtotrs = int ( 10.d0 * log10 ( totres / resfrt ) ) 161*59599516SKenneth E. Jansen jresmx = int ( 10.d0 * log10 ( resmax / totres ) ) 162*59599516SKenneth E. Jansenc 163*59599516SKenneth E. Jansenc.... get the CPU-time 164*59599516SKenneth E. Jansenc 165*59599516SKenneth E. JansenCAD cputme = (second(0) - ttim(100)) 166*59599516SKenneth E. Jansen rsec=TMRC() 167*59599516SKenneth E. Jansen cputme = (rsec - ttim(100)) 168*59599516SKenneth E. Jansenc 169*59599516SKenneth E. Jansenc.... output the result 170*59599516SKenneth E. Jansenc 171*59599516SKenneth E. Jansenc if (numpe > 1) call MPI_BARRIER (MPI_COMM_WORLD, ierr) 172*59599516SKenneth E. Jansen 173*59599516SKenneth E. Jansen if (myrank .eq. master) then 174*59599516SKenneth E. Jansenc 175*59599516SKenneth E. Jansenc.... results of continuity and momentum 176*59599516SKenneth E. Jansenc 177*59599516SKenneth E. Jansen 178*59599516SKenneth E. Jansen print 2000, lstep+1, cputme, totres, jtotrs, rmaxdyU, 179*59599516SKenneth E. Jansen & rmaxdyP,nrsmax, 180*59599516SKenneth E. Jansen & mproc(1)+1, jresmx, int(statsflow(4)), 181*59599516SKenneth E. Jansen & int(statsflow(1)) 182*59599516SKenneth E. Jansen! write (ihist,2000) lstep+1, cputme, totres, jtotrs, 183*59599516SKenneth E. Jansen! & rmaxdyU, rmaxdyP, nrsmax, 184*59599516SKenneth E. Jansen! & mproc(1)+1,jresmx,int(statsflow(4)), 185*59599516SKenneth E. Jansen! & int(statsflow(1)) 186*59599516SKenneth E. Jansen 187*59599516SKenneth E. Jansen! call flush(ihist) 188*59599516SKenneth E. Jansen endif 189*59599516SKenneth E. Jansenc if(numpe>1) call MPI_BARRIER (MPI_COMM_WORLD,ierr) 190*59599516SKenneth E. Jansen 191*59599516SKenneth E. Jansenc$$$ ttim(68) = ttim(68) + tmr() 192*59599516SKenneth E. Jansen 193*59599516SKenneth E. Jansenc 194*59599516SKenneth E. Jansenc.... return 195*59599516SKenneth E. Jansenc 196*59599516SKenneth E. Jansen return 197*59599516SKenneth E. Jansenc 198*59599516SKenneth E. Jansen 1000 format(1p,i6,5e13.5) 199*59599516SKenneth E. Jansen 2000 format(1p,i6,e10.3,e10.3,2x,'(',i4,')',2x,e10.3,2x,e10.3, 200*59599516SKenneth E. Jansen & 2x,'<',i6,'-',i5,'|', 201*59599516SKenneth E. Jansen & i4,'>', ' [', i4,' -',i4,']') 202*59599516SKenneth E. Jansen 3000 format(1p,i6,e10.3,e10.3,3x,'(',i4,')',3x,'<',i6,'-',i5,'|', 203*59599516SKenneth E. Jansen & i4,'>', ' [', i4,' -',i4,' -',i4,']') 204*59599516SKenneth E. Jansen 205*59599516SKenneth E. Jansenc 206*59599516SKenneth E. Jansen end 207*59599516SKenneth E. Jansen 208*59599516SKenneth E. Jansen 209*59599516SKenneth E. Jansen subroutine rstaticSclr (res, y, Dy, icomp) 210*59599516SKenneth E. Jansenc 211*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 212*59599516SKenneth E. Jansenc 213*59599516SKenneth E. Jansenc This subroutine calculates the statistics of the residual 214*59599516SKenneth E. Jansenc 215*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 216*59599516SKenneth E. Jansenc 217*59599516SKenneth E. Jansen include "common.h" 218*59599516SKenneth E. Jansen include "mpif.h" 219*59599516SKenneth E. Jansen include "auxmpi.h" 220*59599516SKenneth E. Jansenc 221*59599516SKenneth E. Jansen dimension res(nshg) 222*59599516SKenneth E. Jansen dimension rtmp(nshg) 223*59599516SKenneth E. Jansen real*8 y(nshg,ndof), Dy(nshg), nrm 224*59599516SKenneth E. Jansenc integer tmrc 225*59599516SKenneth E. Jansenc 226*59599516SKenneth E. Jansenc.... compute max delta y 227*59599516SKenneth E. Jansenc 228*59599516SKenneth E. Jansen rdy1 = zero 229*59599516SKenneth E. Jansen rdy2 = zero 230*59599516SKenneth E. Jansenc 231*59599516SKenneth E. Jansenc.... normalize turbulence with molecular viscosity 232*59599516SKenneth E. Jansenc 233*59599516SKenneth E. Jansen if ( (icomp .eq. 6).and. (iRANS.eq.-1) ) then 234*59599516SKenneth E. Jansen nrm = datmat(1,2,1) 235*59599516SKenneth E. Jansen else 236*59599516SKenneth E. Jansen nrm = zero 237*59599516SKenneth E. Jansen endif 238*59599516SKenneth E. Jansen call sumgat( abs(gami*Delt(itseq)*Dy(:)),1,rdy1) 239*59599516SKenneth E. Jansen call sumgat( abs( y(:,icomp)),1,rdy2) 240*59599516SKenneth E. Jansen rmaxdyT = rdy1/(rdy2+nrm) 241*59599516SKenneth E. Jansenc 242*59599516SKenneth E. Jansenc.... compute the maximum residual and the corresponding node number 243*59599516SKenneth E. Jansenc 244*59599516SKenneth E. Jansen rtmp = zero 245*59599516SKenneth E. Jansen rtmp = rtmp + res**2 ! add temperature also 246*59599516SKenneth E. Jansen call sumgat (rtmp, 1, resnrm) 247*59599516SKenneth E. Jansen 248*59599516SKenneth E. Jansen if (numpe == 1) nshgt=nshg ! global = this processor 249*59599516SKenneth E. Jansen 250*59599516SKenneth E. Jansen totres = resnrm / float(nshgt) 251*59599516SKenneth E. Jansen totres = sqrt(totres) 252*59599516SKenneth E. Jansen 253*59599516SKenneth E. Jansenc if (mod(impl(1),100)/10 .eq. 0) then !not solving flow 254*59599516SKenneth E. Jansen if (myrank .eq. master) then 255*59599516SKenneth E. Jansenc 256*59599516SKenneth E. Jansenc.... get the CPU-time 257*59599516SKenneth E. Jansenc 258*59599516SKenneth E. Jansen rsec=TMRC() 259*59599516SKenneth E. Jansen cputme = (rsec - ttim(100)) 260*59599516SKenneth E. Jansen 261*59599516SKenneth E. Jansen print 802, lstep+1, cputme, totres, rmaxdyT, 262*59599516SKenneth E. Jansen & int(statssclr(1)) 263*59599516SKenneth E. Jansen! write (ihist,802) lstep+1, cputme, totres, 264*59599516SKenneth E. Jansen! & rmaxdyT,int(statssclr(1)) 265*59599516SKenneth E. Jansen 266*59599516SKenneth E. Jansen! call flush(ihist) 267*59599516SKenneth E. Jansen endif 268*59599516SKenneth E. Jansenc else 269*59599516SKenneth E. Jansenc if (myrank .eq. master) then 270*59599516SKenneth E. Jansenc print 803, totres, rmaxdyT, int(statssclr(1)) 271*59599516SKenneth E. Jansenc write(ihist,803) totres, rmaxdyT, int(statssclr(1)) 272*59599516SKenneth E. Jansenc endif 273*59599516SKenneth E. Jansenc endif 274*59599516SKenneth E. Jansen 275*59599516SKenneth E. Jansen return 276*59599516SKenneth E. Jansen 277*59599516SKenneth E. Jansen 802 format(1p,i6,e10.3,e10.3,10X,e10.3,31X,'[',i6,']') 278*59599516SKenneth E. Jansen 803 format(1p,16x,e10.3,10x,e10.3,31X,'[',i10,']') 279*59599516SKenneth E. Jansen 280*59599516SKenneth E. Jansen end 281*59599516SKenneth E. Jansen 282*59599516SKenneth E. Jansen 283*59599516SKenneth E. Jansen 284