xref: /phasta/phSolver/incompressible/rstatic.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
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