1*59599516SKenneth E. Jansen subroutine rstat (res, ilwork) 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) 23*59599516SKenneth E. Jansen dimension rtmp(nshg), nrsmax(1), ilwork(nlwork) 24*59599516SKenneth E. Jansen dimension Forin(4), Forout(4) 25*59599516SKenneth E. Jansen!SCATTER dimension irecvcount(numpe), resvec(numpe) 26*59599516SKenneth E. Jansenc integer TMRC 27*59599516SKenneth E. Jansen 28*59599516SKenneth E. Jansen 29*59599516SKenneth E. Jansen real*8 ftots(3,0:MAXSURF),ftot(3),spmasstot(0:MAXSURF),spmasss 30*59599516SKenneth E. Jansen 31*59599516SKenneth E. Jansen ttim(68) = ttim(68) - secs(0.0) 32*59599516SKenneth E. Jansen 33*59599516SKenneth E. Jansen if (numpe == 1) nshgt=nshg ! global = this processor 34*59599516SKenneth E. Jansenc 35*59599516SKenneth E. Jansenc incompressible style data from flx surface 36*59599516SKenneth E. Jansenc 37*59599516SKenneth E. Jansen if (numpe > 1) then 38*59599516SKenneth E. Jansen call MPI_ALLREDUCE (flxID(2,isrfIM), spmasss,1, 39*59599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 40*59599516SKenneth E. Jansen call MPI_ALLREDUCE (flxID(1,isrfIM), Atots,1, 41*59599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 42*59599516SKenneth E. Jansen call MPI_ALLREDUCE (flxID(3,:), Ftots(1,:),MAXSURF+1, 43*59599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 44*59599516SKenneth E. Jansen call MPI_ALLREDUCE (flxID(4,:), Ftots(2,:),MAXSURF+1, 45*59599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 46*59599516SKenneth E. Jansen call MPI_ALLREDUCE (flxID(5,:), Ftots(3,:),MAXSURF+1, 47*59599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 48*59599516SKenneth E. Jansen call MPI_ALLREDUCE (flxID(2,:), spmasstot(:),MAXSURF+1, 49*59599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 50*59599516SKenneth E. Jansen else 51*59599516SKenneth E. Jansen Ftots=flxID(3:5,:) 52*59599516SKenneth E. Jansen Atots=flxID(1,isrfIM) 53*59599516SKenneth E. Jansen spmasss=flxID(2,isrfIM) 54*59599516SKenneth E. Jansen spmasstot(:)=flxID(2,:) 55*59599516SKenneth E. Jansen endif 56*59599516SKenneth E. Jansen if(myrank.eq.0) then 57*59599516SKenneth E. Jansen write(44,1000)lstep+1,(spmasstot(j),j=1,5) 58*59599516SKenneth E. Jansen call flush(44) 59*59599516SKenneth E. Jansen endif 60*59599516SKenneth E. Jansen ftot(1)=sum(Ftots(1,0:MAXSURF)) 61*59599516SKenneth E. Jansen ftot(2)=sum(Ftots(2,0:MAXSURF)) 62*59599516SKenneth E. Jansen ftot(3)=sum(Ftots(3,0:MAXSURF)) 63*59599516SKenneth E. Jansenc 64*59599516SKenneth E. Jansenc end of incompressible style 65*59599516SKenneth E. Jansenc 66*59599516SKenneth E. Jansenc 67*59599516SKenneth E. Jansenc.... --------------------> Aerodynamic Forces <---------------------- 68*59599516SKenneth E. Jansenc 69*59599516SKenneth E. Jansenc.... output the forces and the heat flux 70*59599516SKenneth E. Jansenc 71*59599516SKenneth E. Jansen if (iter .eq. nitr) then 72*59599516SKenneth E. Jansen Forin = (/ Force(1), Force(2), Force(3), HFlux /) 73*59599516SKenneth E. Jansen if (numpe > 1) then 74*59599516SKenneth E. Jansen call MPI_REDUCE (Forin(1), Forout(1), 4, MPI_DOUBLE_PRECISION, 75*59599516SKenneth E. Jansen & MPI_SUM, master, 76*59599516SKenneth E. Jansen & MPI_COMM_WORLD,ierr) 77*59599516SKenneth E. Jansen endif 78*59599516SKenneth E. Jansen Force = Forout(1:3) 79*59599516SKenneth E. Jansen HFlux = Forout(4) 80*59599516SKenneth E. Jansen if (myrank .eq. master) then 81*59599516SKenneth E. Jansen write (iforce,1000) lstep+1, (Force(i), i=1,nsd), HFlux, 82*59599516SKenneth E. Jansen & spmasss 83*59599516SKenneth E. Jansen call flush(iforce) 84*59599516SKenneth E. Jansen endif 85*59599516SKenneth E. Jansen endif 86*59599516SKenneth E. Jansen 87*59599516SKenneth E. Jansenc 88*59599516SKenneth E. Jansenc.... -----------------------> Convergence <------------------------- 89*59599516SKenneth E. Jansenc 90*59599516SKenneth E. Jansenc.... compute the maximum residual and the corresponding node number 91*59599516SKenneth E. Jansenc 92*59599516SKenneth E. Jansen rtmp = zero 93*59599516SKenneth E. Jansen do i = 1, nflow 94*59599516SKenneth E. Jansen rtmp = rtmp + res(:,i)**2 95*59599516SKenneth E. Jansen enddo 96*59599516SKenneth E. Jansen 97*59599516SKenneth E. Jansen call sumgat (rtmp, 1, resnrm, ilwork) 98*59599516SKenneth E. Jansen 99*59599516SKenneth E. Jansen resmaxl = maxval(rtmp) 100*59599516SKenneth E. Jansen 101*59599516SKenneth E. Jansen irecvcount = 1 102*59599516SKenneth E. Jansen resvec = resmaxl 103*59599516SKenneth E. Jansen if (numpe > 1) then 104*59599516SKenneth E. Jansen call MPI_ALLREDUCE (resvec, resmax, irecvcount, 105*59599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, 106*59599516SKenneth E. Jansen & ierr) 107*59599516SKenneth E. Jansenc call MPI_REDUCE_SCATTER (resvec, resmax, irecvcount, 108*59599516SKenneth E. Jansenc & MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, 109*59599516SKenneth E. Jansenc & ierr) 110*59599516SKenneth E. Jansen else 111*59599516SKenneth E. Jansen resmax=resmaxl 112*59599516SKenneth E. Jansen endif 113*59599516SKenneth E. Jansen nrsmax = maxloc(rtmp) 114*59599516SKenneth E. Jansenc 115*59599516SKenneth E. Jansenc.... correct the residuals 116*59599516SKenneth E. Jansenc 117*59599516SKenneth E. Jansen if (loctim(itseq) .eq. 0) then 118*59599516SKenneth E. Jansen resnrm = resnrm 119*59599516SKenneth E. Jansen resmax = resmax 120*59599516SKenneth E. Jansen else 121*59599516SKenneth E. Jansen resnrm = resnrm 122*59599516SKenneth E. Jansen resmax = resmax 123*59599516SKenneth E. Jansen endif 124*59599516SKenneth E. Jansenc 125*59599516SKenneth E. Jansenc.... approximate the number of entries 126*59599516SKenneth E. Jansenc 127*59599516SKenneth E. Jansen totres = resnrm / float(nshgt) 128*59599516SKenneth E. Jansen totres = sqrt(totres) 129*59599516SKenneth E. Jansen resmax = sqrt(resmax) 130*59599516SKenneth E. Jansen if (resfrt .eq. zero) resfrt = totres 131*59599516SKenneth E. Jansen jtotrs = int ( 10.d0 * log10 ( totres / resfrt ) ) 132*59599516SKenneth E. Jansen jresmx = int ( 10.d0 * log10 ( resmax / totres ) ) 133*59599516SKenneth E. Jansenc 134*59599516SKenneth E. Jansenc.... get the CPU-time 135*59599516SKenneth E. Jansenc 136*59599516SKenneth E. Jansen rsec=TMRC() 137*59599516SKenneth E. Jansen cputme = (rsec-ttim(100)) 138*59599516SKenneth E. Jansenc 139*59599516SKenneth E. Jansenc.... output the result 140*59599516SKenneth E. Jansenc 141*59599516SKenneth E. Jansen if (myrank .eq. master) then 142*59599516SKenneth E. Jansen print 2000, lstep+1, cputme, totres, jtotrs, nrsmax, 143*59599516SKenneth E. Jansen & jresmx, lGMRES, iKs, ntotGM 144*59599516SKenneth E. Jansen write (ihist,2000) lstep+1, cputme, totres, jtotrs, nrsmax, 145*59599516SKenneth E. Jansen & jresmx, lGMRES, iKs, ntotGM 146*59599516SKenneth E. Jansen call flush(ihist) 147*59599516SKenneth E. Jansen endif 148*59599516SKenneth E. Jansen ttim(68) = ttim(68) + secs(0.0) 149*59599516SKenneth E. Jansen 150*59599516SKenneth E. Jansenc 151*59599516SKenneth E. Jansenc.... return 152*59599516SKenneth E. Jansenc 153*59599516SKenneth E. Jansen return 154*59599516SKenneth E. Jansenc 155*59599516SKenneth E. Jansen1000 format(1p,i6,5e13.5) 156*59599516SKenneth E. Jansen2000 format(1p,i6,e10.3,e10.3,3x,'(',i4,')',3x,'<',i6,'|',i4,'>', 157*59599516SKenneth E. Jansen & ' [',i3,'-',i3,']',i10) 158*59599516SKenneth E. Jansenc 159*59599516SKenneth E. Jansen end 160*59599516SKenneth E. Jansen subroutine rstatSclr (rest, ilwork,lgmrest,ikst) 161*59599516SKenneth E. Jansenc 162*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 163*59599516SKenneth E. Jansenc 164*59599516SKenneth E. Jansenc This subroutine calculates the statistics of the residual. 165*59599516SKenneth E. Jansenc 166*59599516SKenneth E. Jansenc input: 167*59599516SKenneth E. Jansenc rest (nshg) : preconditioned residual 168*59599516SKenneth E. Jansenc 169*59599516SKenneth E. Jansenc output: 170*59599516SKenneth E. Jansenc The time step, cpu-time and entropy-norm of the residual 171*59599516SKenneth E. Jansenc are printed in the file HISTOR.DAT. 172*59599516SKenneth E. Jansenc 173*59599516SKenneth E. Jansenc 174*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 175*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 176*59599516SKenneth E. Jansenc 177*59599516SKenneth E. Jansen include "common.h" 178*59599516SKenneth E. Jansen include "mpif.h" 179*59599516SKenneth E. Jansen include "auxmpi.h" 180*59599516SKenneth E. Jansenc 181*59599516SKenneth E. Jansen dimension rest(nshg) 182*59599516SKenneth E. Jansen dimension rtmp(nshg), nrsmax(1), ilwork(nlwork) 183*59599516SKenneth E. Jansen!SCATTER dimension irecvcount(numpe), resvec(numpe) 184*59599516SKenneth E. Jansenc integer TMRC 185*59599516SKenneth E. Jansen 186*59599516SKenneth E. Jansen ttim(68) = ttim(68) - secs(0.0) 187*59599516SKenneth E. Jansen if (numpe == 1) nshgt=nshg ! global = this processor 188*59599516SKenneth E. Jansenc 189*59599516SKenneth E. Jansenc.... -----------------------> Convergence <------------------------- 190*59599516SKenneth E. Jansenc 191*59599516SKenneth E. Jansenc.... compute the maximum residual and the corresponding node number 192*59599516SKenneth E. Jansenc 193*59599516SKenneth E. Jansen rtmp = zero 194*59599516SKenneth E. Jansen rtmp = rtmp + rest**2 195*59599516SKenneth E. Jansen 196*59599516SKenneth E. Jansen call sumgat (rtmp, 1, resnrm, ilwork) 197*59599516SKenneth E. Jansen 198*59599516SKenneth E. Jansen resmaxl = maxval(rtmp) 199*59599516SKenneth E. Jansen 200*59599516SKenneth E. Jansencontinue on 201*59599516SKenneth E. Jansen 202*59599516SKenneth E. Jansen irecvcount = 1 203*59599516SKenneth E. Jansen resvec = resmaxl 204*59599516SKenneth E. Jansen if (numpe > 1) then 205*59599516SKenneth E. Jansen call MPI_ALLREDUCE (resvec, resmax, irecvcount, 206*59599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, 207*59599516SKenneth E. Jansen & ierr) 208*59599516SKenneth E. Jansenc call MPI_REDUCE_SCATTER (resvec, resmax, irecvcount, 209*59599516SKenneth E. Jansenc & MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, 210*59599516SKenneth E. Jansenc & ierr) 211*59599516SKenneth E. Jansen else 212*59599516SKenneth E. Jansen resmax=resmaxl 213*59599516SKenneth E. Jansen endif 214*59599516SKenneth E. Jansen nrsmax = maxloc(rtmp) 215*59599516SKenneth E. Jansenc 216*59599516SKenneth E. Jansenc.... correct the residuals 217*59599516SKenneth E. Jansenc 218*59599516SKenneth E. Jansen if (loctim(itseq) .eq. 0) then 219*59599516SKenneth E. Jansen resnrm = resnrm 220*59599516SKenneth E. Jansen resmax = resmax 221*59599516SKenneth E. Jansen else 222*59599516SKenneth E. Jansen resnrm = resnrm 223*59599516SKenneth E. Jansen resmax = resmax 224*59599516SKenneth E. Jansen endif 225*59599516SKenneth E. Jansenc 226*59599516SKenneth E. Jansenc.... approximate the number of entries 227*59599516SKenneth E. Jansenc 228*59599516SKenneth E. Jansen totres = resnrm / float(nshgt) 229*59599516SKenneth E. Jansen totres = sqrt(totres) 230*59599516SKenneth E. Jansen resmax = sqrt(resmax) 231*59599516SKenneth E. Jansen if (resfrt .eq. zero) resfrt = totres 232*59599516SKenneth E. Jansen jtotrs = int ( 10.d0 * log10 ( totres / resfrt ) ) 233*59599516SKenneth E. Jansen jresmx = int ( 10.d0 * log10 ( resmax / totres ) ) 234*59599516SKenneth E. Jansenc 235*59599516SKenneth E. Jansenc.... get the CPU-time 236*59599516SKenneth E. Jansenc 237*59599516SKenneth E. Jansen rsec=TMRC() 238*59599516SKenneth E. Jansen cputme = (rsec-ttim(100)) 239*59599516SKenneth E. Jansenc 240*59599516SKenneth E. Jansenc.... output the result 241*59599516SKenneth E. Jansenc 242*59599516SKenneth E. Jansen if (myrank .eq. master) then 243*59599516SKenneth E. Jansen print 2000, lstep+1, cputme, totres, jtotrs, nrsmax, 244*59599516SKenneth E. Jansen & jresmx, lgmrest, iKst, ntotGM 245*59599516SKenneth E. Jansen write (ihist,2000) lstep+1, cputme, totres, jtotrs, nrsmax, 246*59599516SKenneth E. Jansen & jresmx, lgmrest, iKst, ntotGM 247*59599516SKenneth E. Jansen call flush(ihist) 248*59599516SKenneth E. Jansen endif 249*59599516SKenneth E. Jansen if(totres.gt.1.0e-9) istop=istop-1 250*59599516SKenneth E. Jansen 251*59599516SKenneth E. Jansen ttim(68) = ttim(68) + secs(0.0) 252*59599516SKenneth E. Jansen 253*59599516SKenneth E. Jansenc 254*59599516SKenneth E. Jansenc.... return 255*59599516SKenneth E. Jansenc 256*59599516SKenneth E. Jansen return 257*59599516SKenneth E. Jansenc 258*59599516SKenneth E. Jansen1000 format(1p,i6,4e13.5) 259*59599516SKenneth E. Jansen2000 format(1p,i6,e10.3,e10.3,3x,'(',i4,')',3x,'<',i6,'|',i4,'>', 260*59599516SKenneth E. Jansen & ' [',i3,'-',i3,']',i10) 261*59599516SKenneth E. Jansenc 262*59599516SKenneth E. Jansen end 263