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