xref: /phasta/phSolver/compressible/itrdrv.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen              subroutine itrdrv (y,         ac,   uold, x,
2*59599516SKenneth E. Jansen     &                   iBC,       BC,
3*59599516SKenneth E. Jansen     &                   iper,      ilwork,     shp,
4*59599516SKenneth E. Jansen     &                   shgl,      shpb,       shglb,
5*59599516SKenneth E. Jansen     &                   ifath,     velbar,     nsons )
6*59599516SKenneth E. Jansenc
7*59599516SKenneth E. Jansenc----------------------------------------------------------------------
8*59599516SKenneth E. Jansenc
9*59599516SKenneth E. Jansenc This iterative driver is the semi-discrete, predictor multi-corrector
10*59599516SKenneth E. Jansenc algorithm. It contains the Hulbert Generalized Alpha method which
11*59599516SKenneth E. Jansenc is 2nd order accurate for Rho_inf from 0 to 1.  The method can be
12*59599516SKenneth E. Jansenc made  first-order accurate by setting Rho_inf=-1. It uses a
13*59599516SKenneth E. Jansenc GMRES iterative solver.
14*59599516SKenneth E. Jansenc
15*59599516SKenneth E. Jansenc working arrays:
16*59599516SKenneth E. Jansenc  y      (nshg,ndof)           : Y variables
17*59599516SKenneth E. Jansenc  x      (nshg,nsd)            : node coordinates
18*59599516SKenneth E. Jansenc  iBC    (nshg)                : BC codes
19*59599516SKenneth E. Jansenc  BC     (nshg,ndofBC)         : BC constraint parameters
20*59599516SKenneth E. Jansenc  iper   (nshg)                : periodicity table
21*59599516SKenneth E. Jansenc
22*59599516SKenneth E. Jansenc shape functions:
23*59599516SKenneth E. Jansenc  shp    (nshape,ngauss)        : interior element shape functions
24*59599516SKenneth E. Jansenc  shgl   (nsd,nshape,ngauss)    : local shape function gradients
25*59599516SKenneth E. Jansenc  shpb   (nshapeb,ngaussb)      : boundary element shape functions
26*59599516SKenneth E. Jansenc  shglb  (nsd,nshapeb,ngaussb)  : bdry. elt. shape gradients
27*59599516SKenneth E. Jansenc
28*59599516SKenneth E. Jansenc Zdenek Johan,  Winter 1991.  (Fortran 90)
29*59599516SKenneth E. Jansenc----------------------------------------------------------------------
30*59599516SKenneth E. Jansenc
31*59599516SKenneth E. Jansen      use pvsQbi     !gives us splag (the spmass at the end of this run
32*59599516SKenneth E. Jansen      use specialBC  !gives us itvn
33*59599516SKenneth E. Jansen      use timedata   !allows collection of time series
34*59599516SKenneth E. Jansen      use turbSA
35*59599516SKenneth E. Jansen
36*59599516SKenneth E. Jansen        include "common.h"
37*59599516SKenneth E. Jansen        include "mpif.h"
38*59599516SKenneth E. Jansen        include "auxmpi.h"
39*59599516SKenneth E. Jansen
40*59599516SKenneth E. Jansenc
41*59599516SKenneth E. Jansen        dimension y(nshg,ndof),            ac(nshg,ndof),
42*59599516SKenneth E. Jansen     &		  yold(nshg,ndof),         acold(nshg,ndof),
43*59599516SKenneth E. Jansen     &            x(numnp,nsd),            iBC(nshg),
44*59599516SKenneth E. Jansen     &            BC(nshg,ndofBC),         ilwork(nlwork),
45*59599516SKenneth E. Jansen     &            iper(nshg),              uold(nshg,nsd)
46*59599516SKenneth E. Jansenc
47*59599516SKenneth E. Jansen        dimension res(nshg,nflow),         BDiag(nshg,nflow,nflow),
48*59599516SKenneth E. Jansen     &            rest(nshg),              solinc(nshg,ndof)
49*59599516SKenneth E. Jansenc
50*59599516SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
51*59599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
52*59599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
53*59599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
54*59599516SKenneth E. Jansen        real*8   almit, alfit, gamit
55*59599516SKenneth E. Jansen        dimension ifath(numnp),    velbar(nfath,ndof),  nsons(nfath)
56*59599516SKenneth E. Jansen        real*8 rerr(nshg,10),ybar(nshg,ndof+8) ! 8 is for avg. of square as uu, vv, ww, pp, TT, uv, uw, and vw
57*59599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: ivarts
58*59599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: ivartsg
59*59599516SKenneth E. Jansen        real*8, allocatable, dimension(:) :: vartssoln
60*59599516SKenneth E. Jansen        real*8, allocatable, dimension(:) :: vartssolng
61*59599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: vartsbuff
62*59599516SKenneth E. Jansen! assuming three profiles to control (inlet, bottom FC and top FC)
63*59599516SKenneth E. Jansen! store velocity profile set via BC
64*59599516SKenneth E. Jansen        real*8 vbc_prof(nshg,3)
65*59599516SKenneth E. Jansen        character*20 fname1, fmt1, fname2, fmt2
66*59599516SKenneth E. Jansen        character*4 fname4c ! 4 characters
67*59599516SKenneth E. Jansen        character*60 fvarts
68*59599516SKenneth E. Jansen        character*5  cname
69*59599516SKenneth E. Jansen        character*10  cname2
70*59599516SKenneth E. Jansen        integer ifuncs(6), iarray(10)
71*59599516SKenneth E. Jansen
72*59599516SKenneth E. Jansen        real*8 elDw(numel) ! element average of DES d variable
73*59599516SKenneth E. Jansenc
74*59599516SKenneth E. Jansenc  Here are the data structures for sparse matrix GMRES
75*59599516SKenneth E. Jansenc
76*59599516SKenneth E. Jansen       integer, allocatable, dimension(:,:) :: rowp
77*59599516SKenneth E. Jansen       integer, allocatable, dimension(:) :: colm
78*59599516SKenneth E. Jansen       real*8, allocatable, dimension(:,:) :: lhsK
79*59599516SKenneth E. Jansen       real*8, allocatable, dimension(:,:) :: EGmass
80*59599516SKenneth E. Jansen       real*8, allocatable, dimension(:,:) :: EGmasst
81*59599516SKenneth E. Jansen
82*59599516SKenneth E. Jansen       inquire(file='xyzts.dat',exist=exts)
83*59599516SKenneth E. Jansen       lskeep=lstep
84*59599516SKenneth E. Jansen       if(exts) then
85*59599516SKenneth E. Jansen
86*59599516SKenneth E. Jansen          open(unit=626,file='xyzts.dat',status='old')
87*59599516SKenneth E. Jansen          read(626,*) ntspts, freq, tolpt, iterat, varcod
88*59599516SKenneth E. Jansen          call sTD              ! sets data structures
89*59599516SKenneth E. Jansen          do jj=1,ntspts        ! read coordinate data where solution desired
90*59599516SKenneth E. Jansen             read(626,*) ptts(jj,1),ptts(jj,2),ptts(jj,3)
91*59599516SKenneth E. Jansen          enddo
92*59599516SKenneth E. Jansen          close(626)
93*59599516SKenneth E. Jansen
94*59599516SKenneth E. Jansen           statptts(:,:) = 0
95*59599516SKenneth E. Jansen           parptts(:,:) = zero
96*59599516SKenneth E. Jansen           varts(:,:) = zero
97*59599516SKenneth E. Jansen
98*59599516SKenneth E. Jansen           allocate (ivarts(ntspts*ndof))
99*59599516SKenneth E. Jansen           allocate (ivartsg(ntspts*ndof))
100*59599516SKenneth E. Jansen           allocate (vartssoln(ntspts*ndof))
101*59599516SKenneth E. Jansen           allocate (vartssolng(ntspts*ndof))
102*59599516SKenneth E. Jansen
103*59599516SKenneth E. Jansen           nbuff=ntout
104*59599516SKenneth E. Jansen           allocate (vartsbuff(ntspts,ndof,nbuff))
105*59599516SKenneth E. Jansen
106*59599516SKenneth E. Jansen           if (myrank .eq. master) then
107*59599516SKenneth E. Jansen              do jj=1,ntspts
108*59599516SKenneth E. Jansen                 fvarts='varts/varts'
109*59599516SKenneth E. Jansen                 fvarts=trim(fvarts)//trim(cname2(jj))
110*59599516SKenneth E. Jansen                 fvarts=trim(fvarts)//trim(cname2(lstep))
111*59599516SKenneth E. Jansen                 fvarts=trim(fvarts)//'.dat'
112*59599516SKenneth E. Jansen                 fvarts=trim(fvarts)
113*59599516SKenneth E. Jansen                 open(unit=1000+jj, file=fvarts, status='unknown')
114*59599516SKenneth E. Jansen              enddo
115*59599516SKenneth E. Jansen           endif
116*59599516SKenneth E. Jansen
117*59599516SKenneth E. Jansen       endif
118*59599516SKenneth E. Jansen
119*59599516SKenneth E. Jansenc
120*59599516SKenneth E. Jansenc
121*59599516SKenneth E. Jansenc.... open history and aerodynamic forces files
122*59599516SKenneth E. Jansenc
123*59599516SKenneth E. Jansen        if (myrank .eq. master) then
124*59599516SKenneth E. Jansen          open (unit=ihist,  file=fhist,  status='unknown')
125*59599516SKenneth E. Jansen          open (unit=iforce, file=fforce, status='unknown')
126*59599516SKenneth E. Jansen        endif
127*59599516SKenneth E. Jansenc
128*59599516SKenneth E. Jansenc
129*59599516SKenneth E. Jansenc.... initialize
130*59599516SKenneth E. Jansenc
131*59599516SKenneth E. Jansen        ifuncs  = 0                      ! func. evaluation counter
132*59599516SKenneth E. Jansen        istep  = 0
133*59599516SKenneth E. Jansen        ntotGM = 0                      ! number of GMRES iterations
134*59599516SKenneth E. Jansen        time   = 0
135*59599516SKenneth E. Jansen        yold   = y
136*59599516SKenneth E. Jansen        acold  = ac
137*59599516SKenneth E. Jansen        if (mod(impl(1),100)/10 .eq. 1) then
138*59599516SKenneth E. Jansenc
139*59599516SKenneth E. Jansenc     generate the sparse data fill vectors
140*59599516SKenneth E. Jansenc
141*59599516SKenneth E. Jansen           allocate  (rowp(nshg,nnz))
142*59599516SKenneth E. Jansen           allocate  (colm(nshg+1))
143*59599516SKenneth E. Jansen           call genadj(colm, rowp, icnt ) ! preprocess the adjacency list
144*59599516SKenneth E. Jansen
145*59599516SKenneth E. Jansen           nnz_tot=icnt         ! this is exactly the number of non-zero
146*59599516SKenneth E. Jansen                                ! blocks on this proc
147*59599516SKenneth E. Jansen           allocate (lhsK(nflow*nflow,nnz_tot))
148*59599516SKenneth E. Jansen        endif
149*59599516SKenneth E. Jansen        if (mod(impl(1),100)/10 .eq. 3) then
150*59599516SKenneth E. Jansenc
151*59599516SKenneth E. Jansenc     generate the ebe data fill vectors
152*59599516SKenneth E. Jansenc
153*59599516SKenneth E. Jansen           nedof=nflow*nshape
154*59599516SKenneth E. Jansen           allocate  (EGmass(numel,nedof*nedof))
155*59599516SKenneth E. Jansen        endif
156*59599516SKenneth E. Jansencc
157*59599516SKenneth E. Jansen
158*59599516SKenneth E. Jansenc..........................................
159*59599516SKenneth E. Jansen        rerr = zero
160*59599516SKenneth E. Jansen        ybar(:,1:ndof) = y(:,1:ndof)
161*59599516SKenneth E. Jansen        do idof=1,5
162*59599516SKenneth E. Jansen           ybar(:,ndof+idof) = y(:,idof)*y(:,idof)
163*59599516SKenneth E. Jansen        enddo
164*59599516SKenneth E. Jansen        ybar(:,ndof+6) = y(:,1)*y(:,2)
165*59599516SKenneth E. Jansen        ybar(:,ndof+7) = y(:,1)*y(:,3)
166*59599516SKenneth E. Jansen        ybar(:,ndof+8) = y(:,2)*y(:,3)
167*59599516SKenneth E. Jansenc.........................................
168*59599516SKenneth E. Jansen
169*59599516SKenneth E. Jansen
170*59599516SKenneth E. Jansen        vbc_prof(:,1:3) = BC(:,3:5)
171*59599516SKenneth E. Jansen
172*59599516SKenneth E. Jansenc
173*59599516SKenneth E. Jansenc.... loop through the time sequences
174*59599516SKenneth E. Jansenc
175*59599516SKenneth E. Jansen        do 3000 itsq = 1, ntseq
176*59599516SKenneth E. Jansen        itseq = itsq
177*59599516SKenneth E. Jansenc
178*59599516SKenneth E. Jansenc.... set up the current parameters
179*59599516SKenneth E. Jansenc
180*59599516SKenneth E. Jansen        nstp   = nstep(itseq)
181*59599516SKenneth E. Jansen        nitr   = niter(itseq)
182*59599516SKenneth E. Jansen        LCtime = loctim(itseq)
183*59599516SKenneth E. Jansenc
184*59599516SKenneth E. Jansen        call itrSetup ( y,  acold)
185*59599516SKenneth E. Jansen        isclr=0
186*59599516SKenneth E. Jansen
187*59599516SKenneth E. Jansen        niter(itseq)=0          ! count number of flow solves in a step
188*59599516SKenneth E. Jansen                                !  (# of iterations)
189*59599516SKenneth E. Jansen        do i=1,seqsize
190*59599516SKenneth E. Jansen           if(stepseq(i).eq.0) niter(itseq)=niter(itseq)+1
191*59599516SKenneth E. Jansen        enddo
192*59599516SKenneth E. Jansen        nitr = niter(itseq)
193*59599516SKenneth E. Jansenc
194*59599516SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve
195*59599516SKenneth E. Jansenc
196*59599516SKenneth E. Jansen        nsclrsol=nsclr          ! total number of scalars solved. At
197*59599516SKenneth E. Jansen                                ! some point we probably want to create
198*59599516SKenneth E. Jansen                                ! a map, considering stepseq(), to find
199*59599516SKenneth E. Jansen                                ! what is actually solved and only
200*59599516SKenneth E. Jansen                                ! dimension EGmasst to the appropriate
201*59599516SKenneth E. Jansen                                ! size.
202*59599516SKenneth E. Jansen
203*59599516SKenneth E. Jansen        if(nsclrsol.gt.0)allocate  (EGmasst(numel*nshape*nshape
204*59599516SKenneth E. Jansen     &                              ,nsclrsol))
205*59599516SKenneth E. Jansen
206*59599516SKenneth E. Jansenc
207*59599516SKenneth E. Jansenc.... loop through the time steps
208*59599516SKenneth E. Jansenc
209*59599516SKenneth E. Jansen        ttim(1) = REAL(secs(0.0)) / 100.
210*59599516SKenneth E. Jansen        ttim(2) = secs(0.0)
211*59599516SKenneth E. Jansen
212*59599516SKenneth E. Jansenc        tcorecp1 = REAL(secs(0.0)) / 100.
213*59599516SKenneth E. Jansenc        tcorewc1 = secs(0.0)
214*59599516SKenneth E. Jansen        if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
215*59599516SKenneth E. Jansen        if(myrank.eq.0)  then
216*59599516SKenneth E. Jansen           tcorecp1 = TMRC()
217*59599516SKenneth E. Jansen        endif
218*59599516SKenneth E. Jansen
219*59599516SKenneth E. Jansen        rmub=datmat(1,2,1)
220*59599516SKenneth E. Jansen        if(rmutarget.gt.0) then
221*59599516SKenneth E. Jansen           rmue=rmutarget
222*59599516SKenneth E. Jansen           xmulfact=(rmue/rmub)**(1.0/nstp)
223*59599516SKenneth E. Jansen           if(myrank.eq.0) then
224*59599516SKenneth E. Jansen              write(*,*) 'viscosity will by multiplied by ', xmulfact
225*59599516SKenneth E. Jansen              write(*,*) 'to bring it from ', rmub,' down to ', rmue
226*59599516SKenneth E. Jansen           endif
227*59599516SKenneth E. Jansen           datmat(1,2,1)=datmat(1,2,1)/xmulfact ! make first step right
228*59599516SKenneth E. Jansen        else
229*59599516SKenneth E. Jansen           rmue=datmat(1,2,1)   ! keep constant
230*59599516SKenneth E. Jansen           xmulfact=one
231*59599516SKenneth E. Jansen        endif
232*59599516SKenneth E. Jansen        if(iramp.eq.1) then
233*59599516SKenneth E. Jansen                call initBCprofileScale(vbc_prof,BC,yold,x)
234*59599516SKenneth E. Jansen! fix the yold values to the reset BC
235*59599516SKenneth E. Jansen                call itrBC (yold,  ac,  iBC,  BC,  iper, ilwork)
236*59599516SKenneth E. Jansen                isclr=1 ! fix scalar
237*59599516SKenneth E. Jansen                call itrBCsclr(yold,ac,iBC,BC,iper,ilwork)
238*59599516SKenneth E. Jansen        endif
239*59599516SKenneth E. Jansen
240*59599516SKenneth E. Jansen867     continue
241*59599516SKenneth E. Jansen        do 2000 istp = 1, nstp
242*59599516SKenneth E. Jansen        if(iramp.eq.1)
243*59599516SKenneth E. Jansen     &        call BCprofileScale(vbc_prof,BC,yold)
244*59599516SKenneth E. Jansen
245*59599516SKenneth E. Jansenc           call rerun_check(stopjob)
246*59599516SKenneth E. Jansencc          if(stopjob.ne.0) goto 2001
247*59599516SKenneth E. Jansenc
248*59599516SKenneth E. Jansenc Decay of scalars
249*59599516SKenneth E. Jansenc
250*59599516SKenneth E. Jansen           if(nsclr.gt.0 .and. tdecay.ne.1) then
251*59599516SKenneth E. Jansen              yold(:,6:ndof)=y(:,6:ndof)*tdecay
252*59599516SKenneth E. Jansen              BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*tdecay
253*59599516SKenneth E. Jansen           endif
254*59599516SKenneth E. Jansen
255*59599516SKenneth E. Jansen           if(nosource.eq.1) BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*0.8
256*59599516SKenneth E. Jansen
257*59599516SKenneth E. Jansen
258*59599516SKenneth E. Jansenc           xi=istp*one/nstp
259*59599516SKenneth E. Jansenc           datmat(1,2,1)=rmub*(1.0-xi)+xi*rmue
260*59599516SKenneth E. Jansen           datmat(1,2,1)=xmulfact*datmat(1,2,1)
261*59599516SKenneth E. Jansen
262*59599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC.
263*59599516SKenneth E. Jansenc     these will be for time step n+1 so use lstep+1
264*59599516SKenneth E. Jansenc
265*59599516SKenneth E. Jansen           if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl,
266*59599516SKenneth E. Jansen     &                              shpb, shglb, x, BC, iBC)
267*59599516SKenneth E. Jansen
268*59599516SKenneth E. Jansen            if(iLES.gt.0) then
269*59599516SKenneth E. Jansenc
270*59599516SKenneth E. Jansenc.... get dynamic model coefficient
271*59599516SKenneth E. Jansenc
272*59599516SKenneth E. Jansen            ilesmod=iLES/10
273*59599516SKenneth E. Jansenc
274*59599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model
275*59599516SKenneth E. Jansenc
276*59599516SKenneth E. Jansen            if (ilesmod.eq.0) then ! 0 < iLES < 10 => dyn. model calculated
277*59599516SKenneth E. Jansen                                   ! at nodes based on discrete filtering
278*59599516SKenneth E. Jansen               call getdmc (yold,       shgl,      shp,
279*59599516SKenneth E. Jansen     &                      iper,       ilwork,    nsons,
280*59599516SKenneth E. Jansen     &                      ifath,      x)
281*59599516SKenneth E. Jansen            endif
282*59599516SKenneth E. Jansen            if (ilesmod .eq. 1) then ! 10 < iLES < 20 => dynamic-mixed
283*59599516SKenneth E. Jansen                                     ! at nodes based on discrete filtering
284*59599516SKenneth E. Jansen               call bardmc (yold,       shgl,      shp,
285*59599516SKenneth E. Jansen     &                      iper,       ilwork,
286*59599516SKenneth E. Jansen     &                      nsons,      ifath,     x)
287*59599516SKenneth E. Jansen            endif
288*59599516SKenneth E. Jansen            if (ilesmod .eq. 2) then ! 20 < iLES < 30 => dynamic at quad
289*59599516SKenneth E. Jansen                                     ! pts based on lumped projection filt.
290*59599516SKenneth E. Jansen               call projdmc (yold,       shgl,      shp,
291*59599516SKenneth E. Jansen     &                       iper,       ilwork,    x)
292*59599516SKenneth E. Jansen            endif
293*59599516SKenneth E. Jansenc
294*59599516SKenneth E. Jansen            endif
295*59599516SKenneth E. Jansen
296*59599516SKenneth E. Jansen
297*59599516SKenneth E. Jansenc
298*59599516SKenneth E. Jansenc.... set traction BCs for modeled walls
299*59599516SKenneth E. Jansenc
300*59599516SKenneth E. Jansen            if (itwmod.ne.0) then   !wallfn check
301*59599516SKenneth E. Jansen               call asbwmod(yold,   acold,   x,      BC,     iBC,
302*59599516SKenneth E. Jansen     &                      iper,   ilwork,  ifath,  velbar)
303*59599516SKenneth E. Jansen            endif
304*59599516SKenneth E. Jansenc
305*59599516SKenneth E. Jansenc.... -----------------------> predictor phase <-----------------------
306*59599516SKenneth E. Jansenc
307*59599516SKenneth E. Jansen            call itrPredict(   yold,    acold,    y,   ac )
308*59599516SKenneth E. Jansen            call itrBC (y,  ac,  iBC,  BC,  iper, ilwork)
309*59599516SKenneth E. Jansen            isclr = zero
310*59599516SKenneth E. Jansen            if (nsclr.gt.zero) then
311*59599516SKenneth E. Jansen            do isclr=1,nsclr
312*59599516SKenneth E. Jansen               call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
313*59599516SKenneth E. Jansen            enddo
314*59599516SKenneth E. Jansen            endif
315*59599516SKenneth E. Jansenc
316*59599516SKenneth E. Jansenc.... --------------------> multi-corrector phase <--------------------
317*59599516SKenneth E. Jansenc
318*59599516SKenneth E. Jansen           iter=0
319*59599516SKenneth E. Jansen            ilss=0  ! this is a switch thrown on first solve of LS redistance
320*59599516SKenneth E. Jansenc
321*59599516SKenneth E. JansencHACK to make it keep solving RANS until tolerance is reached
322*59599516SKenneth E. Jansenc
323*59599516SKenneth E. Jansen       istop=0
324*59599516SKenneth E. Jansen       iMoreRANS=0
325*59599516SKenneth E. Jansenc
326*59599516SKenneth E. Jansenc find the the RANS portion of the sequence
327*59599516SKenneth E. Jansenc
328*59599516SKenneth E. Jansen	do istepc=1,seqsize
329*59599516SKenneth E. Jansen		if(stepseq(istepc).eq.10) iLastRANS=istepc
330*59599516SKenneth E. Jansen	enddo
331*59599516SKenneth E. Jansen
332*59599516SKenneth E. Jansen	iseqStart=	1
333*59599516SKenneth E. Jansen9876	continue
334*59599516SKenneth E. Jansenc
335*59599516SKenneth E. Jansen            do istepc=iseqStart,seqsize
336*59599516SKenneth E. Jansen               icode=stepseq(istepc)
337*59599516SKenneth E. Jansen               if(mod(icode,10).eq.0) then ! this is a solve
338*59599516SKenneth E. Jansen                  isolve=icode/10
339*59599516SKenneth E. Jansen                  if(isolve.eq.0) then   ! flow solve (encoded as 0)
340*59599516SKenneth E. Jansenc
341*59599516SKenneth E. Jansen                     etol=epstol(1)
342*59599516SKenneth E. Jansen                     iter   = iter+1
343*59599516SKenneth E. Jansen                     ifuncs(1)  = ifuncs(1) + 1
344*59599516SKenneth E. Jansenc
345*59599516SKenneth E. Jansenc.... reset the aerodynamic forces
346*59599516SKenneth E. Jansenc
347*59599516SKenneth E. Jansen                     Force(1) = zero
348*59599516SKenneth E. Jansen                     Force(2) = zero
349*59599516SKenneth E. Jansen                     Force(3) = zero
350*59599516SKenneth E. Jansen                     HFlux    = zero
351*59599516SKenneth E. Jansenc
352*59599516SKenneth E. Jansenc.... form the element data and solve the matrix problem
353*59599516SKenneth E. Jansenc
354*59599516SKenneth E. Jansenc.... explicit solver
355*59599516SKenneth E. Jansenc
356*59599516SKenneth E. Jansen                     if (impl(itseq) .eq. 0) then
357*59599516SKenneth E. Jansen                        if (myrank .eq. master)
358*59599516SKenneth E. Jansen     &                       call error('itrdrv  ','impl ',impl(itseq))
359*59599516SKenneth E. Jansen                     endif
360*59599516SKenneth E. Jansen                     if (mod(impl(1),100)/10 .eq. 1) then  ! sparse solve
361*59599516SKenneth E. Jansenc
362*59599516SKenneth E. Jansenc.... preconditioned sparse matrix GMRES solver
363*59599516SKenneth E. Jansenc
364*59599516SKenneth E. Jansen                        lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
365*59599516SKenneth E. Jansen                        iprec=lhs
366*59599516SKenneth E. Jansen                        nedof = nflow*nshape
367*59599516SKenneth E. Jansenc                        write(*,*) 'lhs=',lhs
368*59599516SKenneth E. Jansen                      call SolGMRs (y,             ac,            yold,
369*59599516SKenneth E. Jansen     &                       acold,         x,
370*59599516SKenneth E. Jansen     &                       iBC,           BC,
371*59599516SKenneth E. Jansen     &                       colm,          rowp,          lhsk,
372*59599516SKenneth E. Jansen     &                       res,
373*59599516SKenneth E. Jansen     &                       BDiag,         a(mHBrg),      a(meBrg),
374*59599516SKenneth E. Jansen     &                       a(myBrg),      a(mRcos),      a(mRsin),
375*59599516SKenneth E. Jansen     &                       iper,          ilwork,
376*59599516SKenneth E. Jansen     &                       shp,           shgl,
377*59599516SKenneth E. Jansen     &                       shpb,          shglb,         solinc,
378*59599516SKenneth E. Jansen     &                       rerr)
379*59599516SKenneth E. Jansen                      else if (mod(impl(1),100)/10 .eq. 2) then ! mfg solve
380*59599516SKenneth E. Jansenc
381*59599516SKenneth E. Jansenc.... preconditioned matrix-free GMRES solver
382*59599516SKenneth E. Jansenc
383*59599516SKenneth E. Jansen                        lhs=0
384*59599516SKenneth E. Jansen                        iprec = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
385*59599516SKenneth E. Jansen                        nedof = 0
386*59599516SKenneth E. Jansen                        call SolMFG (y,             ac,            yold,
387*59599516SKenneth E. Jansen     &                       acold,         x,
388*59599516SKenneth E. Jansen     &                       iBC,           BC,
389*59599516SKenneth E. Jansen     &                       res,
390*59599516SKenneth E. Jansen     &                       BDiag,         a(mHBrg),      a(meBrg),
391*59599516SKenneth E. Jansen     &                       a(myBrg),      a(mRcos),      a(mRsin),
392*59599516SKenneth E. Jansen     &                       iper,          ilwork,
393*59599516SKenneth E. Jansen     &                       shp,           shgl,
394*59599516SKenneth E. Jansen     &                       shpb,          shglb,         solinc,
395*59599516SKenneth E. Jansen     &                       rerr)
396*59599516SKenneth E. Jansenc
397*59599516SKenneth E. Jansen                     else if (mod(impl(1),100)/10 .eq. 3) then ! ebe solve
398*59599516SKenneth E. Jansenc.... preconditioned ebe matrix GMRES solver
399*59599516SKenneth E. Jansenc
400*59599516SKenneth E. Jansen
401*59599516SKenneth E. Jansen                        lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
402*59599516SKenneth E. Jansen                        iprec = lhs
403*59599516SKenneth E. Jansen                        nedof = nflow*nshape
404*59599516SKenneth E. Jansenc                        write(*,*) 'lhs=',lhs
405*59599516SKenneth E. Jansen                      call SolGMRe (y,             ac,            yold,
406*59599516SKenneth E. Jansen     &                       acold,         x,
407*59599516SKenneth E. Jansen     &                       iBC,           BC,
408*59599516SKenneth E. Jansen     &                       EGmass,        res,
409*59599516SKenneth E. Jansen     &                       BDiag,         a(mHBrg),      a(meBrg),
410*59599516SKenneth E. Jansen     &                       a(myBrg),      a(mRcos),      a(mRsin),
411*59599516SKenneth E. Jansen     &                       iper,          ilwork,
412*59599516SKenneth E. Jansen     &                       shp,           shgl,
413*59599516SKenneth E. Jansen     &                       shpb,          shglb,         solinc,
414*59599516SKenneth E. Jansen     &                       rerr)
415*59599516SKenneth E. Jansen                     endif
416*59599516SKenneth E. Jansenc
417*59599516SKenneth E. Jansen                else          ! solve a scalar  (encoded at isclr*10)
418*59599516SKenneth E. Jansen                     ifuncs(isclr+2)  = ifuncs(isclr+2) + 1
419*59599516SKenneth E. Jansen                     etol=epstol(isclr+1)
420*59599516SKenneth E. Jansen                     isclr=isolve
421*59599516SKenneth E. Jansen                     if((iLSet.eq.2).and.(ilss.eq.0)
422*59599516SKenneth E. Jansen     &                    .and.(isclr.eq.2)) then
423*59599516SKenneth E. Jansen                        ilss=1  ! throw switch (once per step)
424*59599516SKenneth E. Jansenc
425*59599516SKenneth E. Jansenc... copy the first scalar at t=n+1 into the second scalar of the
426*59599516SKenneth E. Jansenc... level sets
427*59599516SKenneth E. Jansenc
428*59599516SKenneth E. Jansen                     y(:,6)    = yold(:,6)  + (y(:,6)-yold(:,6))/alfi
429*59599516SKenneth E. Jansen                     y(:,7)    =  y(:,6)
430*59599516SKenneth E. Jansen                     yold(:,7) = y(:,7)
431*59599516SKenneth E. Jansen                     ac(:,7)   = zero
432*59599516SKenneth E. Jansenc
433*59599516SKenneth E. Jansen                     call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
434*59599516SKenneth E. Jansenc
435*59599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the
436*59599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar
437*59599516SKenneth E. Jansenc
438*59599516SKenneth E. Jansen                        alfit=alfi
439*59599516SKenneth E. Jansen                        gamit=gami
440*59599516SKenneth E. Jansen                        almit=almi
441*59599516SKenneth E. Jansen                        alfi = 1
442*59599516SKenneth E. Jansen                        gami = 1
443*59599516SKenneth E. Jansen                        almi = 1
444*59599516SKenneth E. Jansen                     endif
445*59599516SKenneth E. Jansenc
446*59599516SKenneth E. Jansen                     lhs = 1 - min(1,mod(ifuncs(isclr+2)-1,
447*59599516SKenneth E. Jansen     &                                       LHSupd(isclr+2)))
448*59599516SKenneth E. Jansen                     iprec = lhs
449*59599516SKenneth E. Jansen                     istop=0
450*59599516SKenneth E. Jansen                     call SolGMRSclr(y,             ac,         yold,
451*59599516SKenneth E. Jansen     &		          acold,         EGmasst(1,isclr),
452*59599516SKenneth E. Jansen     &                    x,             elDw,
453*59599516SKenneth E. Jansen     &                    iBC,           BC,
454*59599516SKenneth E. Jansen     &                    rest,
455*59599516SKenneth E. Jansen     &                    a(mHBrg),      a(meBrg),
456*59599516SKenneth E. Jansen     &                    a(myBrg),      a(mRcos),    a(mRsin),
457*59599516SKenneth E. Jansen     &                    iper,          ilwork,
458*59599516SKenneth E. Jansen     &                    shp,           shgl,
459*59599516SKenneth E. Jansen     &                    shpb,          shglb, solinc(1,isclr+5))
460*59599516SKenneth E. Jansenc
461*59599516SKenneth E. Jansen                  endif         ! end of scalar type solve
462*59599516SKenneth E. Jansenc
463*59599516SKenneth E. Jansenc
464*59599516SKenneth E. Jansenc.... end of the multi-corrector loop
465*59599516SKenneth E. Jansenc
466*59599516SKenneth E. Jansen 1000             continue      !check this
467*59599516SKenneth E. Jansen
468*59599516SKenneth E. Jansen               else             ! this is an update  (mod did not equal zero)
469*59599516SKenneth E. Jansen                  iupdate=icode/10 ! what to update
470*59599516SKenneth E. Jansen                  if(iupdate.eq.0) then !update flow
471*59599516SKenneth E. Jansen                     call itrCorrect ( y, ac, yold, acold, solinc)
472*59599516SKenneth E. Jansen                     call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
473*59599516SKenneth E. Jansen                     call tnanq(y, 5, 'y_updbc')
474*59599516SKenneth E. Jansenc Elaine-SPEBC
475*59599516SKenneth E. Jansen                     if((irscale.ge.0).and.(myrank.eq.master)) then
476*59599516SKenneth E. Jansen                        call genscale(y, x, iBC)
477*59599516SKenneth E. Jansenc                       call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
478*59599516SKenneth E. Jansen                     endif
479*59599516SKenneth E. Jansen                  else          ! update scalar
480*59599516SKenneth E. Jansen                     isclr=iupdate !unless
481*59599516SKenneth E. Jansen                     if(iupdate.eq.nsclr+1) isclr=0
482*59599516SKenneth E. Jansen                     call itrCorrectSclr ( y, ac, yold, acold,
483*59599516SKenneth E. Jansen     &                                     solinc(1,isclr+5))
484*59599516SKenneth E. Jansen                     if (ilset.eq.2 .and. isclr.eq.2)  then
485*59599516SKenneth E. Jansen                        fct2=one/almi
486*59599516SKenneth E. Jansen                        fct3=one/alfi
487*59599516SKenneth E. Jansen                        acold(:,7) = acold(:,7)
488*59599516SKenneth E. Jansen     &                             + (ac(:,7)-acold(:,7))*fct2
489*59599516SKenneth E. Jansen                        yold(:,7)  = yold(:,7)
490*59599516SKenneth E. Jansen     &                             + (y(:,7)-yold(:,7))*fct3
491*59599516SKenneth E. Jansen                        call itrBCSclr (  yold,  acold,  iBC,  BC,
492*59599516SKenneth E. Jansen     &                                    iper,  ilwork)
493*59599516SKenneth E. Jansen                        ac(:,7) = acold(:,7)*(one-almi/gami)
494*59599516SKenneth E. Jansen                        y(:,7)  = yold(:,7)
495*59599516SKenneth E. Jansen                        ac(:,7) = zero
496*59599516SKenneth E. Jansen                        if (ivconstraint .eq. 1) then
497*59599516SKenneth E. Jansen     &
498*59599516SKenneth E. Jansenc ... applying the volume constraint
499*59599516SKenneth E. Jansenc
500*59599516SKenneth E. Jansen                           call solvecon (y,    x,      iBC,  BC,
501*59599516SKenneth E. Jansen     &                                    iper, ilwork, shp,  shgl)
502*59599516SKenneth E. Jansenc
503*59599516SKenneth E. Jansen                        endif   ! end of volume constraint calculations
504*59599516SKenneth E. Jansen                     endif
505*59599516SKenneth E. Jansen                     call itrBCSclr (  y,  ac,  iBC,  BC, iper, ilwork)
506*59599516SKenneth E. Jansen                  endif
507*59599516SKenneth E. Jansen               endif            !end of switch between solve or update
508*59599516SKenneth E. Jansen            enddo               ! loop over sequence in step
509*59599516SKenneth E. Jansen	if((istop.lt.0).and.(iMoreRANS.lt.5)) then
510*59599516SKenneth E. Jansen            iMoreRANS=iMoreRANS+1
511*59599516SKenneth E. Jansen            if(myrank.eq.0) write(*,*) 'istop =', istop
512*59599516SKenneth E. Jansen	  iseqStart=iLastRANS
513*59599516SKenneth E. Jansen	  goto 9876
514*59599516SKenneth E. Jansen	endif
515*59599516SKenneth E. Jansenc
516*59599516SKenneth E. Jansenc     Find the solution at the end of the timestep and move it to old
517*59599516SKenneth E. Jansenc
518*59599516SKenneth E. Jansenc.... First to reassign the parameters for the original time integrator scheme
519*59599516SKenneth E. Jansenc
520*59599516SKenneth E. Jansen            if((iLSet.eq.2).and.(ilss.eq.1)) then
521*59599516SKenneth E. Jansen               alfi =alfit
522*59599516SKenneth E. Jansen               gami =gamit
523*59599516SKenneth E. Jansen               almi =almit
524*59599516SKenneth E. Jansen            endif
525*59599516SKenneth E. Jansen            call itrUpdate( yold,  acold,   y,    ac)
526*59599516SKenneth E. Jansen            call itrBC (yold, acold,  iBC,  BC, iper,ilwork)
527*59599516SKenneth E. Jansenc Elaine-SPEBC
528*59599516SKenneth E. Jansen            if((irscale.ge.0).and.(myrank.eq.master)) then
529*59599516SKenneth E. Jansen                call genscale(yold, x, iBC)
530*59599516SKenneth E. Jansenc               call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
531*59599516SKenneth E. Jansen            endif
532*59599516SKenneth E. Jansen            do isclr=1,nsclr
533*59599516SKenneth E. Jansen               call itrBCSclr (yold, acold,  iBC, BC, iper, ilwork)
534*59599516SKenneth E. Jansen            enddo
535*59599516SKenneth E. Jansenc
536*59599516SKenneth E. Jansen            istep = istep + 1
537*59599516SKenneth E. Jansenc
538*59599516SKenneth E. Jansenc.... compute boundary fluxes and print out
539*59599516SKenneth E. Jansenc
540*59599516SKenneth E. Jansen            lstep = lstep + 1
541*59599516SKenneth E. Jansen            ntoutv=max(ntout,100)
542*59599516SKenneth E. Jansen            if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then
543*59599516SKenneth E. Jansenc
544*59599516SKenneth E. Jansenc here is where we save our averaged field.  In some cases we want to
545*59599516SKenneth E. Jansenc write it less frequently
546*59599516SKenneth E. Jansen               if( (mod(lstep, ntoutv) .eq. 0) .and.
547*59599516SKenneth E. Jansen     &              ((irscale.ge.0).or.(itwmod.gt.0) .or.
548*59599516SKenneth E. Jansen     &              ((nsonmax.eq.1).and.(iLES.gt.0))))
549*59599516SKenneth E. Jansen     &              call rwvelb  ('out ',  velbar  ,ifail)
550*59599516SKenneth E. Jansen
551*59599516SKenneth E. Jansen               call Bflux  (yold,          acold,     x,
552*59599516SKenneth E. Jansen     &              shp,           shgl,      shpb,
553*59599516SKenneth E. Jansen     &              shglb,         nodflx,    ilwork)
554*59599516SKenneth E. Jansen            endif
555*59599516SKenneth E. Jansenc
556*59599516SKenneth E. Jansenc.... end of the NSTEP and NTSEQ loops
557*59599516SKenneth E. Jansenc
558*59599516SKenneth E. Jansen
559*59599516SKenneth E. Jansenc...  dump TIME SERIES
560*59599516SKenneth E. Jansen
561*59599516SKenneth E. Jansen            if (exts) then
562*59599516SKenneth E. Jansen               if (mod(lstep-1,freq).eq.0) then
563*59599516SKenneth E. Jansen
564*59599516SKenneth E. Jansen                  if (numpe > 1) then
565*59599516SKenneth E. Jansen                     do jj = 1, ntspts
566*59599516SKenneth E. Jansen                        vartssoln((jj-1)*ndof+1:jj*ndof)=varts(jj,:)
567*59599516SKenneth E. Jansen                        ivarts=zero
568*59599516SKenneth E. Jansen                     enddo
569*59599516SKenneth E. Jansen                     do k=1,ndof*ntspts
570*59599516SKenneth E. Jansen                        if(vartssoln(k).ne.zero) ivarts(k)=1
571*59599516SKenneth E. Jansen                     enddo
572*59599516SKenneth E. Jansen                     call MPI_REDUCE(vartssoln, vartssolng, ndof*ntspts,
573*59599516SKenneth E. Jansen     &                    MPI_DOUBLE_PRECISION, MPI_SUM, master,
574*59599516SKenneth E. Jansen     &                    MPI_COMM_WORLD, ierr)
575*59599516SKenneth E. Jansen
576*59599516SKenneth E. Jansen                     call MPI_REDUCE(ivarts, ivartsg, ndof*ntspts,
577*59599516SKenneth E. Jansen     &                    MPI_INTEGER, MPI_SUM, master,
578*59599516SKenneth E. Jansen     &                    MPI_COMM_WORLD, ierr)
579*59599516SKenneth E. Jansen
580*59599516SKenneth E. Jansen                     if (myrank.eq.zero) then
581*59599516SKenneth E. Jansen                        do jj = 1, ntspts
582*59599516SKenneth E. Jansen
583*59599516SKenneth E. Jansen                           indxvarts = (jj-1)*ndof
584*59599516SKenneth E. Jansen                           do k=1,ndof
585*59599516SKenneth E. Jansen                              if(ivartsg(indxvarts+k).ne.0) then ! none of the vartssoln(parts) were non zero
586*59599516SKenneth E. Jansen                                 varts(jj,k)=vartssolng(indxvarts+k)/
587*59599516SKenneth E. Jansen     &                                ivartsg(indxvarts+k)
588*59599516SKenneth E. Jansen                              endif
589*59599516SKenneth E. Jansen                           enddo
590*59599516SKenneth E. Jansen                        enddo
591*59599516SKenneth E. Jansen                     endif !only on master
592*59599516SKenneth E. Jansen                  endif !only if numpe > 1
593*59599516SKenneth E. Jansen
594*59599516SKenneth E. Jansen                 if( istp.eq. nstp) then !make sure incomplete buffers get purged.
595*59599516SKenneth E. Jansen		    icheck=mod(nstp,nbuff)
596*59599516SKenneth E. Jansen                    if(icheck.ne.0) nbuff=icheck
597*59599516SKenneth E. Jansen		 endif
598*59599516SKenneth E. Jansen
599*59599516SKenneth E. Jansen                  if (myrank.eq.zero) then
600*59599516SKenneth E. Jansen	             k=mod(lstep,nbuff)
601*59599516SKenneth E. Jansen		     if(k.eq.0) k=nbuff
602*59599516SKenneth E. Jansen                     do jj = 1, ntspts
603*59599516SKenneth E. Jansen			vartsbuff(jj,1:5,k)=varts(jj,1:5)
604*59599516SKenneth E. Jansen		     enddo
605*59599516SKenneth E. Jansen                     if(k.eq. nbuff) then
606*59599516SKenneth E. Jansen                       do jj = 1, ntspts
607*59599516SKenneth E. Jansen                        ifile = 1000+jj
608*59599516SKenneth E. Jansen			do ibuf=1,nbuff
609*59599516SKenneth E. Jansen                        write(ifile,555) lstep-1 -nbuff+ibuf,
610*59599516SKenneth E. Jansen     &                  (vartsbuff(jj,k,ibuf), k=1,5) ! assuming ndof to be 5
611*59599516SKenneth E. Jansen                        enddo ! buff empty
612*59599516SKenneth E. Jansen
613*59599516SKenneth E. Jansenc                        call flush(ifile)
614*59599516SKenneth E. Jansen                       enddo ! jj ntspts
615*59599516SKenneth E. Jansen                        endif !only dump when buffer full
616*59599516SKenneth E. Jansen                  endif !only on master
617*59599516SKenneth E. Jansen
618*59599516SKenneth E. Jansen                  varts(:,:) = zero ! reset the array for next step
619*59599516SKenneth E. Jansen
620*59599516SKenneth E. Jansen 555              format(i6,5(2x,E12.5e2))
621*59599516SKenneth E. Jansen
622*59599516SKenneth E. Jansen               endif
623*59599516SKenneth E. Jansen            endif
624*59599516SKenneth E. Jansen
625*59599516SKenneth E. Jansenc
626*59599516SKenneth E. Jansenc.... -------------------> error calculation  <-----------------
627*59599516SKenneth E. Jansen            if(ierrcalc.eq.1.or.ioybar.eq.1) then
628*59599516SKenneth E. Jansen               tfact=one/istep
629*59599516SKenneth E. Jansen               do idof=1,ndof
630*59599516SKenneth E. Jansen                 ybar(:,idof) =tfact*yold(:,idof) +
631*59599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,idof)
632*59599516SKenneth E. Jansen               enddo
633*59599516SKenneth E. Jansenc....compute average
634*59599516SKenneth E. Jansenc...  ybar(:,ndof+1:ndof+8) is for avg. of square as uu, vv, ww, pp, TT, uv, uw, and vw
635*59599516SKenneth E. Jansen               do idof=1,5 ! avg. of square for 5 flow variables
636*59599516SKenneth E. Jansen                   ybar(:,ndof+idof) = tfact*yold(:,idof)**2 +
637*59599516SKenneth E. Jansen     &                             (one-tfact)*ybar(:,ndof+idof)
638*59599516SKenneth E. Jansen               enddo
639*59599516SKenneth E. Jansen               ybar(:,ndof+6) = tfact*yold(:,1)*yold(:,2) + !uv
640*59599516SKenneth E. Jansen     &                          (one-tfact)*ybar(:,ndof+6)
641*59599516SKenneth E. Jansen               ybar(:,ndof+7) = tfact*yold(:,1)*yold(:,3) + !uw
642*59599516SKenneth E. Jansen     &                          (one-tfact)*ybar(:,ndof+7)
643*59599516SKenneth E. Jansen               ybar(:,ndof+8) = tfact*yold(:,2)*yold(:,3) + !vw
644*59599516SKenneth E. Jansen     &                          (one-tfact)*ybar(:,ndof+8)
645*59599516SKenneth E. Jansenc... compute err
646*59599516SKenneth E. Jansenc               rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2
647*59599516SKenneth E. Jansenc               rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2
648*59599516SKenneth E. Jansenc               rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2
649*59599516SKenneth E. Jansenc               rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2
650*59599516SKenneth E. Jansen            endif
651*59599516SKenneth E. Jansenc...........................................................................
652*59599516SKenneth E. Jansen 2000    continue
653*59599516SKenneth E. Jansen 2001    continue
654*59599516SKenneth E. Jansen
655*59599516SKenneth E. Jansen         ttim(1) = REAL(secs(0.0)) / 100. - ttim(1)
656*59599516SKenneth E. Jansen         ttim(2) = secs(0.0)                 - ttim(2)
657*59599516SKenneth E. Jansen
658*59599516SKenneth E. Jansenc         tcorecp2 = REAL(secs(0.0)) / 100.
659*59599516SKenneth E. Jansenc         tcorewc2 = secs(0.0)
660*59599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
661*59599516SKenneth E. Jansen         if(myrank.eq.0)  then
662*59599516SKenneth E. Jansen            tcorecp2 = TMRC()
663*59599516SKenneth E. Jansen            write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1
664*59599516SKenneth E. Jansen         endif
665*59599516SKenneth E. Jansen
666*59599516SKenneth E. Jansenc     call wtime
667*59599516SKenneth E. Jansen
668*59599516SKenneth E. Jansen 3000 continue
669*59599516SKenneth E. Jansenc
670*59599516SKenneth E. Jansenc.... ---------------------->  Post Processing  <----------------------
671*59599516SKenneth E. Jansenc
672*59599516SKenneth E. Jansenc.... print out the last step
673*59599516SKenneth E. Jansenc
674*59599516SKenneth E. Jansen      if ((irs .ge. 1) .and. ((mod(lstep, ntout) .ne. 0) .or.
675*59599516SKenneth E. Jansen     &     (nstp .eq. 0))) then
676*59599516SKenneth E. Jansen         if( (mod(lstep, ntoutv) .eq. 0) .and.
677*59599516SKenneth E. Jansen     &        ((irscale.ge.0).or.(itwmod.gt.0) .or.
678*59599516SKenneth E. Jansen     &        ((nsonmax.eq.1).and.(iLES.gt.0))))
679*59599516SKenneth E. Jansen     &        call rwvelb  ('out ',  velbar  ,ifail)
680*59599516SKenneth E. Jansen
681*59599516SKenneth E. Jansen         call Bflux  (yold,  acold,     x,
682*59599516SKenneth E. Jansen     &        shp,           shgl,      shpb,
683*59599516SKenneth E. Jansen     &        shglb,         nodflx,    ilwork)
684*59599516SKenneth E. Jansen      endif
685*59599516SKenneth E. Jansenc
686*59599516SKenneth E. Jansen      if(ierrcalc.eq.1) then
687*59599516SKenneth E. Jansenc
688*59599516SKenneth E. Jansenc.....smooth the error indicators
689*59599516SKenneth E. Jansenc
690*59599516SKenneth E. Jansenc ! errsmooth is currently available only for incompressible code
691*59599516SKenneth E. Jansenc        do i=1,ierrsmooth
692*59599516SKenneth E. Jansenc            call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC )
693*59599516SKenneth E. Jansenc        end do
694*59599516SKenneth E. Jansen
695*59599516SKenneth E. Jansen         call write_error(myrank, lstep, nshg, 10, rerr )
696*59599516SKenneth E. Jansen      endif
697*59599516SKenneth E. Jansen
698*59599516SKenneth E. Jansen      if(ioybar.eq.1) then
699*59599516SKenneth E. Jansen         call write_field(myrank,'a','ybar',4,
700*59599516SKenneth E. Jansen     &                    ybar,'d',nshg,ndof+8,lstep)
701*59599516SKenneth E. Jansen      endif
702*59599516SKenneth E. Jansen
703*59599516SKenneth E. Jansen      if(iRANS.lt.0 .and. idistcalc.eq.1) then
704*59599516SKenneth E. Jansen         call write_field(myrank,'a','DESd',4,
705*59599516SKenneth E. Jansen     &                    elDw,'d',numel,1,lstep)
706*59599516SKenneth E. Jansen
707*59599516SKenneth E. Jansen         call write_field(myrank,'a','dwal',4,
708*59599516SKenneth E. Jansen     &                    d2wall,'d',nshg,1,lstep)
709*59599516SKenneth E. Jansen      endif
710*59599516SKenneth E. Jansen
711*59599516SKenneth E. Jansenc
712*59599516SKenneth E. Jansenc.... close history and aerodynamic forces files
713*59599516SKenneth E. Jansenc
714*59599516SKenneth E. Jansen      if (myrank .eq. master) then
715*59599516SKenneth E. Jansen         close (ihist)
716*59599516SKenneth E. Jansen         close (iforce)
717*59599516SKenneth E. Jansen         if(exts) then
718*59599516SKenneth E. Jansen            deallocate(ivarts)
719*59599516SKenneth E. Jansen            deallocate(ivartsg)
720*59599516SKenneth E. Jansen            deallocate(vartssoln)
721*59599516SKenneth E. Jansen            deallocate(vartssolng)
722*59599516SKenneth E. Jansen            do jj=1,ntspts
723*59599516SKenneth E. Jansen               close(1000+jj)
724*59599516SKenneth E. Jansen            enddo
725*59599516SKenneth E. Jansen         endif
726*59599516SKenneth E. Jansen      endif
727*59599516SKenneth E. Jansen      close (iecho)
728*59599516SKenneth E. Jansen      if(iabc==1) deallocate(acs)
729*59599516SKenneth E. Jansenc
730*59599516SKenneth E. Jansenc.... end
731*59599516SKenneth E. Jansenc
732*59599516SKenneth E. Jansen        return
733*59599516SKenneth E. Jansen        end
734