xref: /phasta/phSolver/compressible/itrdrv.f (revision 513954ef803c300cddba2bb96b4a5dac0b93489a)
159599516SKenneth E. Jansen              subroutine itrdrv (y,         ac,   uold, x,
259599516SKenneth E. Jansen     &                   iBC,       BC,
359599516SKenneth E. Jansen     &                   iper,      ilwork,     shp,
459599516SKenneth E. Jansen     &                   shgl,      shpb,       shglb,
559599516SKenneth E. Jansen     &                   ifath,     velbar,     nsons )
659599516SKenneth E. Jansenc
759599516SKenneth E. Jansenc----------------------------------------------------------------------
859599516SKenneth E. Jansenc
959599516SKenneth E. Jansenc This iterative driver is the semi-discrete, predictor multi-corrector
1059599516SKenneth E. Jansenc algorithm. It contains the Hulbert Generalized Alpha method which
1159599516SKenneth E. Jansenc is 2nd order accurate for Rho_inf from 0 to 1.  The method can be
1259599516SKenneth E. Jansenc made  first-order accurate by setting Rho_inf=-1. It uses a
1359599516SKenneth E. Jansenc GMRES iterative solver.
1459599516SKenneth E. Jansenc
1559599516SKenneth E. Jansenc working arrays:
1659599516SKenneth E. Jansenc  y      (nshg,ndof)           : Y variables
1759599516SKenneth E. Jansenc  x      (nshg,nsd)            : node coordinates
1859599516SKenneth E. Jansenc  iBC    (nshg)                : BC codes
1959599516SKenneth E. Jansenc  BC     (nshg,ndofBC)         : BC constraint parameters
2059599516SKenneth E. Jansenc  iper   (nshg)                : periodicity table
2159599516SKenneth E. Jansenc
2259599516SKenneth E. Jansenc shape functions:
2359599516SKenneth E. Jansenc  shp    (nshape,ngauss)        : interior element shape functions
2459599516SKenneth E. Jansenc  shgl   (nsd,nshape,ngauss)    : local shape function gradients
2559599516SKenneth E. Jansenc  shpb   (nshapeb,ngaussb)      : boundary element shape functions
2659599516SKenneth E. Jansenc  shglb  (nsd,nshapeb,ngaussb)  : bdry. elt. shape gradients
2759599516SKenneth E. Jansenc
2859599516SKenneth E. Jansenc Zdenek Johan,  Winter 1991.  (Fortran 90)
2959599516SKenneth E. Jansenc----------------------------------------------------------------------
3059599516SKenneth E. Jansenc
3159599516SKenneth E. Jansen      use pvsQbi        !gives us splag (the spmass at the end of this run
3259599516SKenneth E. Jansen      use specialBC     !gives us itvn
3359599516SKenneth E. Jansen      use timedata      !allows collection of time series
34*513954efSKenneth E. Jansen      use MachControl   !PID to control the inlet velocity.
35*513954efSKenneth E. Jansen      use blowerControl !gives us BC_enable
3659599516SKenneth E. Jansen      use turbSA
37*513954efSKenneth E. Jansen      use wallData
38*513954efSKenneth E. Jansen      use fncorpmod
3959599516SKenneth E. Jansen
4059599516SKenneth E. Jansen        include "common.h"
4159599516SKenneth E. Jansen        include "mpif.h"
4259599516SKenneth E. Jansen        include "auxmpi.h"
4359599516SKenneth E. Jansen
4459599516SKenneth E. Jansenc
4559599516SKenneth E. Jansen        dimension y(nshg,ndof),            ac(nshg,ndof),
4659599516SKenneth E. Jansen     &            yold(nshg,ndof),         acold(nshg,ndof),
4759599516SKenneth E. Jansen     &            x(numnp,nsd),            iBC(nshg),
4859599516SKenneth E. Jansen     &            BC(nshg,ndofBC),         ilwork(nlwork),
4959599516SKenneth E. Jansen     &            iper(nshg),              uold(nshg,nsd)
5059599516SKenneth E. Jansenc
51*513954efSKenneth E. Jansen        dimension res(nshg,nflow),
5259599516SKenneth E. Jansen     &            rest(nshg),              solinc(nshg,ndof)
5359599516SKenneth E. Jansenc
5459599516SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
5559599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
5659599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
5759599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
5859599516SKenneth E. Jansen        real*8   almit, alfit, gamit
5959599516SKenneth E. Jansen        dimension ifath(numnp),    velbar(nfath,ndof),  nsons(nfath)
6059599516SKenneth 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
61*513954efSKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: vortG
62*513954efSKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: BDiag
63*513954efSKenneth E. Jansen
64*513954efSKenneth E. Jansen!       integer, allocatable, dimension(:) :: iv_rank  !used with MRasquin's version of probe points
65*513954efSKenneth E. Jansen!       integer :: iv_rankpernode, iv_totnodes, iv_totcores
66*513954efSKenneth E. Jansen!       integer :: iv_node,        iv_core,     iv_thread
67*513954efSKenneth E. Jansen
6859599516SKenneth E. Jansen! assuming three profiles to control (inlet, bottom FC and top FC)
6959599516SKenneth E. Jansen! store velocity profile set via BC
7059599516SKenneth E. Jansen        real*8 vbc_prof(nshg,3)
71*513954efSKenneth E. Jansen        character(len=60) fvarts
7259599516SKenneth E. Jansen        integer ifuncs(6), iarray(10)
7359599516SKenneth E. Jansen        real*8 elDw(numel) ! element average of DES d variable
7459599516SKenneth E. Jansenc
7559599516SKenneth E. Jansenc  Here are the data structures for sparse matrix GMRES
7659599516SKenneth E. Jansenc
7759599516SKenneth E. Jansen        integer, allocatable, dimension(:,:) :: rowp
7859599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: colm
7959599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: lhsK
8059599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: EGmass
8159599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: EGmasst
8259599516SKenneth E. Jansen
83*513954efSKenneth E. Jansen        integer iTurbWall(nshg)
84*513954efSKenneth E. Jansen        real*8 yInlet(3), yInletg(3)
85*513954efSKenneth E. Jansen        integer imapped, imapInlet(nshg)  !for now, used for setting Blower conditions
86*513954efSKenneth E. Jansen!        real*8 M_th, M_tc, M_tt
87*513954efSKenneth E. Jansen!        logical  exMc
88*513954efSKenneth E. Jansen!        real*8 vBC, vBCg
89*513954efSKenneth E. Jansen        real*8 vortmax, vortmaxg
9059599516SKenneth E. Jansen
91*513954efSKenneth E. Jansen       iprec=0 !PETSc - Disable PHASTA's BDiag. TODO: Preprocssor Switch
9259599516SKenneth E. Jansen
93*513954efSKenneth E. Jansen       call findTurbWall(iTurbWall)
9459599516SKenneth E. Jansen
95*513954efSKenneth E. Jansen!-------
96*513954efSKenneth E. Jansen! SETUP
97*513954efSKenneth E. Jansen!-------
9859599516SKenneth E. Jansen
99*513954efSKenneth E. Jansen       !HACK for debugging suction
100*513954efSKenneth E. Jansen!       call Write_Debug(myrank, 'wallNormal'//char(0),
101*513954efSKenneth E. Jansen!     &                          'wnorm'//char(0), wnorm,
102*513954efSKenneth E. Jansen!     &                          'd', nshg, 3, lstep)
103*513954efSKenneth E. Jansen
104*513954efSKenneth E. Jansen       !Probe Point Setup
105*513954efSKenneth E. Jansen       call initProbePoints()
106*513954efSKenneth E. Jansen       if(exts) then  !exts is set in initProbePoints
107*513954efSKenneth E. Jansen         write(fvarts, "('./varts/varts.', I0, '.dat')") lstep
108*513954efSKenneth E. Jansen         fvarts = trim(fvarts)
10959599516SKenneth E. Jansen
11059599516SKenneth E. Jansen         if(myrank .eq. master) then
111*513954efSKenneth E. Jansen           call TD_writeHeader(fvarts)
112*513954efSKenneth E. Jansen         endif
11359599516SKenneth E. Jansen       endif
11459599516SKenneth E. Jansen
115*513954efSKenneth E. Jansen       !Mach Control Setup
116*513954efSKenneth E. Jansen       call MC_init(Delt, lstep, BC)
117*513954efSKenneth E. Jansen       exMC = exMC .and. exts   !If probe points aren't available, turn
118*513954efSKenneth E. Jansen                                !the Mach Control off
119*513954efSKenneth E. Jansen       if(exMC) then
120*513954efSKenneth E. Jansen         call MC_applyBC(BC)
121*513954efSKenneth E. Jansen         call MC_printState()
12259599516SKenneth E. Jansen       endif
12359599516SKenneth E. Jansen
124*513954efSKenneth E. Jansen
12559599516SKenneth E. Jansenc
12659599516SKenneth E. Jansenc.... open history and aerodynamic forces files
12759599516SKenneth E. Jansenc
12859599516SKenneth E. Jansen        if (myrank .eq. master) then
12959599516SKenneth E. Jansen          open (unit=ihist,  file=fhist,  status='unknown')
13059599516SKenneth E. Jansen          open (unit=iforce, file=fforce, status='unknown')
13159599516SKenneth E. Jansen        endif
13259599516SKenneth E. Jansenc
13359599516SKenneth E. Jansenc
13459599516SKenneth E. Jansenc.... initialize
13559599516SKenneth E. Jansenc
13659599516SKenneth E. Jansen        ifuncs  = 0                      ! func. evaluation counter
13759599516SKenneth E. Jansen        istep  = 0
13859599516SKenneth E. Jansen        ntotGM = 0                      ! number of GMRES iterations
13959599516SKenneth E. Jansen        time   = 0
14059599516SKenneth E. Jansen        yold   = y
14159599516SKenneth E. Jansen        acold  = ac
142*513954efSKenneth E. Jansen
143*513954efSKenneth E. Jansen!Blower Setup
144*513954efSKenneth E. Jansen       call BC_init(Delt, lstep, BC)  !Note: sets BC_enable
145*513954efSKenneth E. Jansen! fix the yold values to the reset BC
146*513954efSKenneth E. Jansen      if(BC_enable) call itrBC (yold,  ac,  iBC,  BC,  iper, ilwork)
147*513954efSKenneth E. Jansen! without the above, second solve of first steps is fouled up
148*513954efSKenneth E. Jansen!
14959599516SKenneth E. Jansen        if (mod(impl(1),100)/10 .eq. 1) then
15059599516SKenneth E. Jansenc
15159599516SKenneth E. Jansenc     generate the sparse data fill vectors
15259599516SKenneth E. Jansenc
15359599516SKenneth E. Jansen           allocate  (rowp(nshg,nnz))
15459599516SKenneth E. Jansen           allocate  (colm(nshg+1))
15559599516SKenneth E. Jansen           call genadj(colm, rowp, icnt ) ! preprocess the adjacency list
15659599516SKenneth E. Jansen
15759599516SKenneth E. Jansen           nnz_tot=icnt         ! this is exactly the number of non-zero
15859599516SKenneth E. Jansen                                ! blocks on this proc
159*513954efSKenneth E. Jansen           if(usingpetsc.eq.1) then
160*513954efSKenneth E. Jansen             allocate (BDiag(1,1,1))
161*513954efSKenneth E. Jansen           else
162*513954efSKenneth E. Jansen             allocate (BDiag(nshg,nflow,nflow))
16359599516SKenneth E. Jansen             allocate (lhsK(nflow*nflow,nnz_tot))
16459599516SKenneth E. Jansen           endif
165*513954efSKenneth E. Jansen        endif
16659599516SKenneth E. Jansen        if (mod(impl(1),100)/10 .eq. 3) then
16759599516SKenneth E. Jansenc
16859599516SKenneth E. Jansenc     generate the ebe data fill vectors
16959599516SKenneth E. Jansenc
17059599516SKenneth E. Jansen           nedof=nflow*nshape
17159599516SKenneth E. Jansen           allocate  (EGmass(numel,nedof*nedof))
17259599516SKenneth E. Jansen        endif
17359599516SKenneth E. Jansen
17459599516SKenneth E. Jansenc..........................................
17559599516SKenneth E. Jansen        rerr = zero
17659599516SKenneth E. Jansen        ybar(:,1:ndof) = y(:,1:ndof)
17759599516SKenneth E. Jansen        do idof=1,5
17859599516SKenneth E. Jansen           ybar(:,ndof+idof) = y(:,idof)*y(:,idof)
17959599516SKenneth E. Jansen        enddo
18059599516SKenneth E. Jansen        ybar(:,ndof+6) = y(:,1)*y(:,2)
18159599516SKenneth E. Jansen        ybar(:,ndof+7) = y(:,1)*y(:,3)
18259599516SKenneth E. Jansen        ybar(:,ndof+8) = y(:,2)*y(:,3)
18359599516SKenneth E. Jansenc.........................................
18459599516SKenneth E. Jansen
185*513954efSKenneth E. Jansen!  change the freestream and inflow eddy viscosity to reflect different
186*513954efSKenneth E. Jansen!  levels of freestream turbulence
187*513954efSKenneth E. Jansen!
188*513954efSKenneth E. Jansen! First override boundary condition values
189*513954efSKenneth E. Jansen!  USES imapInlet from Mach Control so if that gets conditionaled away
190*513954efSKenneth E. Jansen!  it has to know if it is needed here
191*513954efSKenneth E. Jansen!
192*513954efSKenneth E. Jansen      if(isetEV_IC_BC.eq.1) then
193*513954efSKenneth E. Jansen        allocate(vortG(nshg, 4))
194*513954efSKenneth E. Jansen        call vortGLB(yold, x, shp, shgl, ilwork, vortG)
195*513954efSKenneth E. Jansen        vortmax=maxval(abs(vortG(:,4)))  !column 4 is the magnitude of the shear tensor - should actually probably be calld shearmax instead of vortmax
196*513954efSKenneth E. Jansen        write(*,*) "vortmax = ", vortmax
19759599516SKenneth E. Jansen
198*513954efSKenneth E. Jansen        !Find the maximum shear in the simulation
199*513954efSKenneth E. Jansen        if(numpe.gt.1) then
200*513954efSKenneth E. Jansen           call MPI_ALLREDUCE(vortmax, vortmaxg, 1,
201*513954efSKenneth E. Jansen     &          MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr )
202*513954efSKenneth E. Jansen           vortmax = vortmaxg
203*513954efSKenneth E. Jansen        endif
20459599516SKenneth E. Jansen
205*513954efSKenneth E. Jansen        !Apply eddy viscosity at the inlet
206*513954efSKenneth E. Jansen        do i=1,icountInlet ! for now only coded to catch primary inlet, not blower
207*513954efSKenneth E. Jansen           BC(imapInlet(i),7)=evis_IC_BC
208*513954efSKenneth E. Jansen        enddo
209*513954efSKenneth E. Jansen
210*513954efSKenneth E. Jansen        !Apply eddy viscosity through the quasi-inviscid portion of the domain
211*513954efSKenneth E. Jansen        do i = 1,nshg
212*513954efSKenneth E. Jansen          if(abs(vortG(i,4)).ge.vortmax*0.01) yold(i,6)=evis_IC_BC
213*513954efSKenneth E. Jansen        enddo
214*513954efSKenneth E. Jansen        isclr=1 ! fix scalar
215*513954efSKenneth E. Jansen        call itrBCsclr(yold,ac,iBC,BC,iper,ilwork)
216*513954efSKenneth E. Jansen
217*513954efSKenneth E. Jansen        deallocate(vortG)
218*513954efSKenneth E. Jansen      endif
21959599516SKenneth E. Jansenc
22059599516SKenneth E. Jansenc.... loop through the time sequences
22159599516SKenneth E. Jansenc
22259599516SKenneth E. Jansen        do 3000 itsq = 1, ntseq
22359599516SKenneth E. Jansen        itseq = itsq
22459599516SKenneth E. Jansenc
22559599516SKenneth E. Jansenc.... set up the current parameters
22659599516SKenneth E. Jansenc
22759599516SKenneth E. Jansen        nstp   = nstep(itseq)
22859599516SKenneth E. Jansen        nitr   = niter(itseq)
22959599516SKenneth E. Jansen        LCtime = loctim(itseq)
23059599516SKenneth E. Jansenc
23159599516SKenneth E. Jansen        call itrSetup ( y,  acold)
23259599516SKenneth E. Jansen        isclr=0
23359599516SKenneth E. Jansen
23459599516SKenneth E. Jansen        niter(itseq)=0          ! count number of flow solves in a step
23559599516SKenneth E. Jansen                                !  (# of iterations)
23659599516SKenneth E. Jansen        do i=1,seqsize
23759599516SKenneth E. Jansen           if(stepseq(i).eq.0) niter(itseq)=niter(itseq)+1
23859599516SKenneth E. Jansen        enddo
23959599516SKenneth E. Jansen        nitr = niter(itseq)
24059599516SKenneth E. Jansenc
24159599516SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve
24259599516SKenneth E. Jansenc
24359599516SKenneth E. Jansen        nsclrsol=nsclr          ! total number of scalars solved. At
24459599516SKenneth E. Jansen                                ! some point we probably want to create
24559599516SKenneth E. Jansen                                ! a map, considering stepseq(), to find
24659599516SKenneth E. Jansen                                ! what is actually solved and only
24759599516SKenneth E. Jansen                                ! dimension EGmasst to the appropriate
24859599516SKenneth E. Jansen                                ! size.
24959599516SKenneth E. Jansen
25059599516SKenneth E. Jansen        if(nsclrsol.gt.0)allocate  (EGmasst(numel*nshape*nshape
25159599516SKenneth E. Jansen     &                              ,nsclrsol))
25259599516SKenneth E. Jansen
25359599516SKenneth E. Jansenc
25459599516SKenneth E. Jansenc.... loop through the time steps
25559599516SKenneth E. Jansenc
25659599516SKenneth E. Jansen        ttim(1) = REAL(secs(0.0)) / 100.
25759599516SKenneth E. Jansen        ttim(2) = secs(0.0)
25859599516SKenneth E. Jansen
25959599516SKenneth E. Jansenc        tcorecp1 = REAL(secs(0.0)) / 100.
26059599516SKenneth E. Jansenc        tcorewc1 = secs(0.0)
26159599516SKenneth E. Jansen        if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
262*513954efSKenneth E. Jansen        if(myrank.eq.master)  then
26359599516SKenneth E. Jansen           tcorecp1 = TMRC()
26459599516SKenneth E. Jansen        endif
26559599516SKenneth E. Jansen
26659599516SKenneth E. Jansen        rmub=datmat(1,2,1)
26759599516SKenneth E. Jansen        if(rmutarget.gt.0) then
26859599516SKenneth E. Jansen           rmue=rmutarget
26959599516SKenneth E. Jansen           xmulfact=(rmue/rmub)**(1.0/nstp)
270*513954efSKenneth E. Jansen           if(myrank.eq.master) then
27159599516SKenneth E. Jansen              write(*,*) 'viscosity will by multiplied by ', xmulfact
27259599516SKenneth E. Jansen              write(*,*) 'to bring it from ', rmub,' down to ', rmue
27359599516SKenneth E. Jansen           endif
27459599516SKenneth E. Jansen           datmat(1,2,1)=datmat(1,2,1)/xmulfact ! make first step right
27559599516SKenneth E. Jansen        else
27659599516SKenneth E. Jansen           rmue=datmat(1,2,1)   ! keep constant
27759599516SKenneth E. Jansen           xmulfact=one
27859599516SKenneth E. Jansen        endif
27959599516SKenneth E. Jansen        if(iramp.eq.1) then
28059599516SKenneth E. Jansen                call initBCprofileScale(vbc_prof,BC,yold,x)
28159599516SKenneth E. Jansen! fix the yold values to the reset BC
28259599516SKenneth E. Jansen                call itrBC (yold,  ac,  iBC,  BC,  iper, ilwork)
28359599516SKenneth E. Jansen                isclr=1 ! fix scalar
28459599516SKenneth E. Jansen                call itrBCsclr(yold,ac,iBC,BC,iper,ilwork)
28559599516SKenneth E. Jansen        endif
28659599516SKenneth E. Jansen
28759599516SKenneth E. Jansen867     continue
288*513954efSKenneth E. Jansen
289*513954efSKenneth E. Jansen
290*513954efSKenneth E. Jansenc============ Start the loop of time steps============================c
291*513954efSKenneth E. Jansen!        edamp2=.99
292*513954efSKenneth E. Jansen!        edamp3=0.05
293*513954efSKenneth E. Jansen        deltaInlInv=one/(0.125*0.0254)
29459599516SKenneth E. Jansen        do 2000 istp = 1, nstp
295*513954efSKenneth E. Jansen
296*513954efSKenneth E. Jansen
29759599516SKenneth E. Jansen        if(iramp.eq.1)
29859599516SKenneth E. Jansen     &        call BCprofileScale(vbc_prof,BC,yold)
29959599516SKenneth E. Jansen
30059599516SKenneth E. Jansenc           call rerun_check(stopjob)
30159599516SKenneth E. Jansencc          if(stopjob.ne.0) goto 2001
30259599516SKenneth E. Jansenc
30359599516SKenneth E. Jansenc Decay of scalars
30459599516SKenneth E. Jansenc
30559599516SKenneth E. Jansen           if(nsclr.gt.0 .and. tdecay.ne.1) then
30659599516SKenneth E. Jansen              yold(:,6:ndof)=y(:,6:ndof)*tdecay
30759599516SKenneth E. Jansen              BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*tdecay
30859599516SKenneth E. Jansen           endif
30959599516SKenneth E. Jansen
31059599516SKenneth E. Jansen           if(nosource.eq.1) BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*0.8
31159599516SKenneth E. Jansen
31259599516SKenneth E. Jansen
31359599516SKenneth E. Jansenc           xi=istp*one/nstp
31459599516SKenneth E. Jansenc           datmat(1,2,1)=rmub*(1.0-xi)+xi*rmue
31559599516SKenneth E. Jansen           datmat(1,2,1)=xmulfact*datmat(1,2,1)
31659599516SKenneth E. Jansen
31759599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC.
31859599516SKenneth E. Jansenc     these will be for time step n+1 so use lstep+1
31959599516SKenneth E. Jansenc
32059599516SKenneth E. Jansen           if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl,
32159599516SKenneth E. Jansen     &                              shpb, shglb, x, BC, iBC)
32259599516SKenneth E. Jansen
32359599516SKenneth E. Jansen            if(iLES.gt.0) then
32459599516SKenneth E. Jansenc
32559599516SKenneth E. Jansenc.... get dynamic model coefficient
32659599516SKenneth E. Jansenc
32759599516SKenneth E. Jansen            ilesmod=iLES/10
32859599516SKenneth E. Jansenc
32959599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model
33059599516SKenneth E. Jansenc
33159599516SKenneth E. Jansen            if (ilesmod.eq.0) then ! 0 < iLES < 10 => dyn. model calculated
33259599516SKenneth E. Jansen                                   ! at nodes based on discrete filtering
33359599516SKenneth E. Jansen               call getdmc (yold,       shgl,      shp,
33459599516SKenneth E. Jansen     &                      iper,       ilwork,    nsons,
33559599516SKenneth E. Jansen     &                      ifath,      x)
33659599516SKenneth E. Jansen            endif
33759599516SKenneth E. Jansen            if (ilesmod .eq. 1) then ! 10 < iLES < 20 => dynamic-mixed
33859599516SKenneth E. Jansen                                     ! at nodes based on discrete filtering
33959599516SKenneth E. Jansen               call bardmc (yold,       shgl,      shp,
34059599516SKenneth E. Jansen     &                      iper,       ilwork,
34159599516SKenneth E. Jansen     &                      nsons,      ifath,     x)
34259599516SKenneth E. Jansen            endif
34359599516SKenneth E. Jansen            if (ilesmod .eq. 2) then ! 20 < iLES < 30 => dynamic at quad
34459599516SKenneth E. Jansen                                     ! pts based on lumped projection filt.
34559599516SKenneth E. Jansen               call projdmc (yold,       shgl,      shp,
34659599516SKenneth E. Jansen     &                       iper,       ilwork,    x)
34759599516SKenneth E. Jansen            endif
34859599516SKenneth E. Jansenc
349*513954efSKenneth E. Jansen           endif ! endif of iLES
35059599516SKenneth E. Jansen
35159599516SKenneth E. Jansen
35259599516SKenneth E. Jansenc
35359599516SKenneth E. Jansenc.... set traction BCs for modeled walls
35459599516SKenneth E. Jansenc
35559599516SKenneth E. Jansen            if (itwmod.ne.0) then   !wallfn check
35659599516SKenneth E. Jansen               call asbwmod(yold,   acold,   x,      BC,     iBC,
35759599516SKenneth E. Jansen     &                      iper,   ilwork,  ifath,  velbar)
35859599516SKenneth E. Jansen            endif
35959599516SKenneth E. Jansenc
36059599516SKenneth E. Jansenc.... -----------------------> predictor phase <-----------------------
36159599516SKenneth E. Jansenc
36259599516SKenneth E. Jansen            call itrPredict(   yold,    acold,    y,   ac )
36359599516SKenneth E. Jansen            call itrBC (y,  ac,  iBC,  BC,  iper, ilwork)
36459599516SKenneth E. Jansen            isclr = zero
36559599516SKenneth E. Jansen            if (nsclr.gt.zero) then
36659599516SKenneth E. Jansen            do isclr=1,nsclr
36759599516SKenneth E. Jansen               call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
36859599516SKenneth E. Jansen            enddo
36959599516SKenneth E. Jansen            endif
37059599516SKenneth E. Jansenc
37159599516SKenneth E. Jansenc.... --------------------> multi-corrector phase <--------------------
37259599516SKenneth E. Jansenc
37359599516SKenneth E. Jansen           iter=0
37459599516SKenneth E. Jansen            ilss=0  ! this is a switch thrown on first solve of LS redistance
37559599516SKenneth E. Jansenc
37659599516SKenneth E. JansencHACK to make it keep solving RANS until tolerance is reached
37759599516SKenneth E. Jansenc
37859599516SKenneth E. Jansen       istop=0
379*513954efSKenneth E. Jansen! blocking extra RANS steps for now       iMoreRANS=0
380*513954efSKenneth E. Jansen       iMoreRANS=6
38159599516SKenneth E. Jansenc
38259599516SKenneth E. Jansenc find the the RANS portion of the sequence
38359599516SKenneth E. Jansenc
38459599516SKenneth E. Jansen       do istepc=1,seqsize
38559599516SKenneth E. Jansen          if(stepseq(istepc).eq.10) iLastRANS=istepc
38659599516SKenneth E. Jansen       enddo
38759599516SKenneth E. Jansen
38859599516SKenneth E. Jansen       iseqStart=1
38959599516SKenneth E. Jansen9876   continue
39059599516SKenneth E. Jansenc
39159599516SKenneth E. Jansen            do istepc=iseqStart,seqsize
39259599516SKenneth E. Jansen               icode=stepseq(istepc)
39359599516SKenneth E. Jansen               if(mod(icode,10).eq.0) then ! this is a solve
39459599516SKenneth E. Jansen                  isolve=icode/10
39559599516SKenneth E. Jansen                  if(isolve.eq.0) then   ! flow solve (encoded as 0)
39659599516SKenneth E. Jansenc
39759599516SKenneth E. Jansen                     etol=epstol(1)
39859599516SKenneth E. Jansen                     iter   = iter+1
39959599516SKenneth E. Jansen                     ifuncs(1)  = ifuncs(1) + 1
40059599516SKenneth E. Jansenc
40159599516SKenneth E. Jansenc.... reset the aerodynamic forces
40259599516SKenneth E. Jansenc
40359599516SKenneth E. Jansen                     Force(1) = zero
40459599516SKenneth E. Jansen                     Force(2) = zero
40559599516SKenneth E. Jansen                     Force(3) = zero
40659599516SKenneth E. Jansen                     HFlux    = zero
40759599516SKenneth E. Jansenc
40859599516SKenneth E. Jansenc.... form the element data and solve the matrix problem
40959599516SKenneth E. Jansenc
41059599516SKenneth E. Jansenc.... explicit solver
41159599516SKenneth E. Jansenc
41259599516SKenneth E. Jansen                     if (impl(itseq) .eq. 0) then
41359599516SKenneth E. Jansen                        if (myrank .eq. master)
41459599516SKenneth E. Jansen     &                       call error('itrdrv  ','impl ',impl(itseq))
41559599516SKenneth E. Jansen                     endif
41659599516SKenneth E. Jansen                     if (mod(impl(1),100)/10 .eq. 1) then  ! sparse solve
41759599516SKenneth E. Jansenc
41859599516SKenneth E. Jansenc.... preconditioned sparse matrix GMRES solver
41959599516SKenneth E. Jansenc
42059599516SKenneth E. Jansen                        lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
42159599516SKenneth E. Jansen                        iprec=lhs
42259599516SKenneth E. Jansen                        nedof = nflow*nshape
42359599516SKenneth E. Jansenc                        write(*,*) 'lhs=',lhs
424*513954efSKenneth E. Jansen                    if(usingpetsc.eq.1) then
425*513954efSKenneth E. Jansen               call SolGMRp (y,             ac,            yold,
426*513954efSKenneth E. Jansen     &                       x,
427*513954efSKenneth E. Jansen     &                       iBC,           BC,
428*513954efSKenneth E. Jansen     &                       colm,          rowp,          lhsk,
429*513954efSKenneth E. Jansen     &                       res,
430*513954efSKenneth E. Jansen     &                       BDiag,
431*513954efSKenneth E. Jansen     &                       iper,          ilwork,
432*513954efSKenneth E. Jansen     &                       shp,           shgl,
433*513954efSKenneth E. Jansen     &                       shpb,          shglb,         solinc,
434*513954efSKenneth E. Jansen     &                       rerr,          fncorp )
435*513954efSKenneth E. Jansen                     else
43659599516SKenneth E. Jansen                      call SolGMRs (y,             ac,            yold,
43759599516SKenneth E. Jansen     &                       acold,         x,
43859599516SKenneth E. Jansen     &                       iBC,           BC,
43959599516SKenneth E. Jansen     &                       colm,          rowp,          lhsk,
44059599516SKenneth E. Jansen     &                       res,
44159599516SKenneth E. Jansen     &                       BDiag,         a(mHBrg),      a(meBrg),
44259599516SKenneth E. Jansen     &                       a(myBrg),      a(mRcos),      a(mRsin),
44359599516SKenneth E. Jansen     &                       iper,          ilwork,
44459599516SKenneth E. Jansen     &                       shp,           shgl,
44559599516SKenneth E. Jansen     &                       shpb,          shglb,         solinc,
44659599516SKenneth E. Jansen     &                       rerr)
447*513954efSKenneth E. Jansen                    endif
44859599516SKenneth E. Jansen                      else if (mod(impl(1),100)/10 .eq. 2) then ! mfg solve
44959599516SKenneth E. Jansenc
45059599516SKenneth E. Jansenc.... preconditioned matrix-free GMRES solver
45159599516SKenneth E. Jansenc
45259599516SKenneth E. Jansen                        lhs=0
45359599516SKenneth E. Jansen                        iprec = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
45459599516SKenneth E. Jansen                        nedof = 0
45559599516SKenneth E. Jansen                        call SolMFG (y,             ac,            yold,
45659599516SKenneth E. Jansen     &                       acold,         x,
45759599516SKenneth E. Jansen     &                       iBC,           BC,
45859599516SKenneth E. Jansen     &                       res,
45959599516SKenneth E. Jansen     &                       BDiag,         a(mHBrg),      a(meBrg),
46059599516SKenneth E. Jansen     &                       a(myBrg),      a(mRcos),      a(mRsin),
46159599516SKenneth E. Jansen     &                       iper,          ilwork,
46259599516SKenneth E. Jansen     &                       shp,           shgl,
46359599516SKenneth E. Jansen     &                       shpb,          shglb,         solinc,
46459599516SKenneth E. Jansen     &                       rerr)
46559599516SKenneth E. Jansenc
46659599516SKenneth E. Jansen                     else if (mod(impl(1),100)/10 .eq. 3) then ! ebe solve
46759599516SKenneth E. Jansenc.... preconditioned ebe matrix GMRES solver
46859599516SKenneth E. Jansenc
46959599516SKenneth E. Jansen
47059599516SKenneth E. Jansen                        lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
47159599516SKenneth E. Jansen                        iprec = lhs
47259599516SKenneth E. Jansen                        nedof = nflow*nshape
47359599516SKenneth E. Jansenc                        write(*,*) 'lhs=',lhs
47459599516SKenneth E. Jansen                      call SolGMRe (y,             ac,            yold,
47559599516SKenneth E. Jansen     &                       acold,         x,
47659599516SKenneth E. Jansen     &                       iBC,           BC,
47759599516SKenneth E. Jansen     &                       EGmass,        res,
47859599516SKenneth E. Jansen     &                       BDiag,         a(mHBrg),      a(meBrg),
47959599516SKenneth E. Jansen     &                       a(myBrg),      a(mRcos),      a(mRsin),
48059599516SKenneth E. Jansen     &                       iper,          ilwork,
48159599516SKenneth E. Jansen     &                       shp,           shgl,
48259599516SKenneth E. Jansen     &                       shpb,          shglb,         solinc,
48359599516SKenneth E. Jansen     &                       rerr)
48459599516SKenneth E. Jansen                     endif
48559599516SKenneth E. Jansenc
48659599516SKenneth E. Jansen                else          ! solve a scalar  (encoded at isclr*10)
48759599516SKenneth E. Jansen                     isclr=isolve
488*513954efSKenneth E. Jansen                     etol=epstol(isclr+2) ! note that for both epstol and LHSupd 1 is flow 2 temp isclr+2 for scalars
489*513954efSKenneth E. Jansen                     ifuncs(isclr+2)  = ifuncs(isclr+2) + 1
49059599516SKenneth E. Jansen                     if((iLSet.eq.2).and.(ilss.eq.0)
49159599516SKenneth E. Jansen     &                    .and.(isclr.eq.2)) then
49259599516SKenneth E. Jansen                        ilss=1  ! throw switch (once per step)
49359599516SKenneth E. Jansenc
49459599516SKenneth E. Jansenc... copy the first scalar at t=n+1 into the second scalar of the
49559599516SKenneth E. Jansenc... level sets
49659599516SKenneth E. Jansenc
49759599516SKenneth E. Jansen                     y(:,6)    = yold(:,6)  + (y(:,6)-yold(:,6))/alfi
49859599516SKenneth E. Jansen                     y(:,7)    =  y(:,6)
49959599516SKenneth E. Jansen                     yold(:,7) = y(:,7)
50059599516SKenneth E. Jansen                     ac(:,7)   = zero
50159599516SKenneth E. Jansenc
50259599516SKenneth E. Jansen                     call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
50359599516SKenneth E. Jansenc
50459599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the
50559599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar
50659599516SKenneth E. Jansenc
50759599516SKenneth E. Jansen                        alfit=alfi
50859599516SKenneth E. Jansen                        gamit=gami
50959599516SKenneth E. Jansen                        almit=almi
51059599516SKenneth E. Jansen                        alfi = 1
51159599516SKenneth E. Jansen                        gami = 1
51259599516SKenneth E. Jansen                        almi = 1
51359599516SKenneth E. Jansen                     endif
51459599516SKenneth E. Jansenc
51559599516SKenneth E. Jansen                     lhs = 1 - min(1,mod(ifuncs(isclr+2)-1,
51659599516SKenneth E. Jansen     &                                       LHSupd(isclr+2)))
51759599516SKenneth E. Jansen                     iprec = lhs
51859599516SKenneth E. Jansen                     istop=0
519*513954efSKenneth E. Jansen                 if(usingPETSc.eq.1) then
520*513954efSKenneth E. Jansen                     call SolGMRpSclr(y,             ac,
521*513954efSKenneth E. Jansen     &                    x,             elDw,
522*513954efSKenneth E. Jansen     &                    iBC,           BC,
523*513954efSKenneth E. Jansen     &                    colm,           rowp,
524*513954efSKenneth E. Jansen     &                    iper,          ilwork,
525*513954efSKenneth E. Jansen     &                    shp,           shgl,
526*513954efSKenneth E. Jansen     &                    shpb,          shglb,     rest,
527*513954efSKenneth E. Jansen     &                    solinc(1,isclr+5),fncorp)
528*513954efSKenneth E. Jansen
529*513954efSKenneth E. Jansen                 else
53059599516SKenneth E. Jansen                     call SolGMRSclr(y,             ac,         yold,
53159599516SKenneth E. Jansen     &                    acold,         EGmasst(1,isclr),
53259599516SKenneth E. Jansen     &                    x,             elDw,
53359599516SKenneth E. Jansen     &                    iBC,           BC,
53459599516SKenneth E. Jansen     &                    rest,
53559599516SKenneth E. Jansen     &                    a(mHBrg),      a(meBrg),
53659599516SKenneth E. Jansen     &                    a(myBrg),      a(mRcos),    a(mRsin),
53759599516SKenneth E. Jansen     &                    iper,          ilwork,
53859599516SKenneth E. Jansen     &                    shp,           shgl,
53959599516SKenneth E. Jansen     &                    shpb,          shglb, solinc(1,isclr+5))
540*513954efSKenneth E. Jansen                  endif
54159599516SKenneth E. Jansenc
54259599516SKenneth E. Jansen                  endif         ! end of scalar type solve
54359599516SKenneth E. Jansenc
54459599516SKenneth E. Jansenc
54559599516SKenneth E. Jansenc.... end of the multi-corrector loop
54659599516SKenneth E. Jansenc
54759599516SKenneth E. Jansen 1000             continue      !check this
54859599516SKenneth E. Jansen
54959599516SKenneth E. Jansen               else             ! this is an update  (mod did not equal zero)
55059599516SKenneth E. Jansen                  iupdate=icode/10 ! what to update
55159599516SKenneth E. Jansen                  if(iupdate.eq.0) then !update flow
55259599516SKenneth E. Jansen                     call itrCorrect ( y, ac, yold, acold, solinc)
55359599516SKenneth E. Jansen                     call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
55459599516SKenneth E. Jansen                     call tnanq(y, 5, 'y_updbc')
55559599516SKenneth E. Jansenc Elaine-SPEBC
55659599516SKenneth E. Jansen                     if((irscale.ge.0).and.(myrank.eq.master)) then
55759599516SKenneth E. Jansen                        call genscale(y, x, iBC)
55859599516SKenneth E. Jansenc                       call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
55959599516SKenneth E. Jansen                     endif
56059599516SKenneth E. Jansen                  else          ! update scalar
56159599516SKenneth E. Jansen                     isclr=iupdate !unless
56259599516SKenneth E. Jansen                     if(iupdate.eq.nsclr+1) isclr=0
56359599516SKenneth E. Jansen                     call itrCorrectSclr ( y, ac, yold, acold,
56459599516SKenneth E. Jansen     &                                     solinc(1,isclr+5))
56559599516SKenneth E. Jansen                     if (ilset.eq.2 .and. isclr.eq.2)  then
56659599516SKenneth E. Jansen                        fct2=one/almi
56759599516SKenneth E. Jansen                        fct3=one/alfi
56859599516SKenneth E. Jansen                        acold(:,7) = acold(:,7)
56959599516SKenneth E. Jansen     &                             + (ac(:,7)-acold(:,7))*fct2
57059599516SKenneth E. Jansen                        yold(:,7)  = yold(:,7)
57159599516SKenneth E. Jansen     &                             + (y(:,7)-yold(:,7))*fct3
57259599516SKenneth E. Jansen                        call itrBCSclr (  yold,  acold,  iBC,  BC,
57359599516SKenneth E. Jansen     &                                    iper,  ilwork)
57459599516SKenneth E. Jansen                        ac(:,7) = acold(:,7)*(one-almi/gami)
57559599516SKenneth E. Jansen                        y(:,7)  = yold(:,7)
57659599516SKenneth E. Jansen                        ac(:,7) = zero
57759599516SKenneth E. Jansen                        if (ivconstraint .eq. 1) then
57859599516SKenneth E. Jansen     &
57959599516SKenneth E. Jansenc ... applying the volume constraint
58059599516SKenneth E. Jansenc
58159599516SKenneth E. Jansen                           call solvecon (y,    x,      iBC,  BC,
58259599516SKenneth E. Jansen     &                                    iper, ilwork, shp,  shgl)
58359599516SKenneth E. Jansenc
58459599516SKenneth E. Jansen                        endif   ! end of volume constraint calculations
58559599516SKenneth E. Jansen                     endif
58659599516SKenneth E. Jansen                     call itrBCSclr (  y,  ac,  iBC,  BC, iper, ilwork)
58759599516SKenneth E. Jansen                  endif
58859599516SKenneth E. Jansen               endif            !end of switch between solve or update
58959599516SKenneth E. Jansen            enddo               ! loop over sequence in step
59059599516SKenneth E. Jansen        if((istop.lt.0).and.(iMoreRANS.lt.5)) then
59159599516SKenneth E. Jansen            iMoreRANS=iMoreRANS+1
592*513954efSKenneth E. Jansen            if(myrank.eq.master) write(*,*) 'istop =', istop
59359599516SKenneth E. Jansen       iseqStart=iLastRANS
59459599516SKenneth E. Jansen       goto 9876
59559599516SKenneth E. Jansen       endif
59659599516SKenneth E. Jansenc
59759599516SKenneth E. Jansenc     Find the solution at the end of the timestep and move it to old
59859599516SKenneth E. Jansenc
59959599516SKenneth E. Jansenc.... First to reassign the parameters for the original time integrator scheme
60059599516SKenneth E. Jansenc
60159599516SKenneth E. Jansen            if((iLSet.eq.2).and.(ilss.eq.1)) then
60259599516SKenneth E. Jansen               alfi =alfit
60359599516SKenneth E. Jansen               gami =gamit
60459599516SKenneth E. Jansen               almi =almit
60559599516SKenneth E. Jansen            endif
60659599516SKenneth E. Jansen            call itrUpdate( yold,  acold,   y,    ac)
60759599516SKenneth E. Jansen            call itrBC (yold, acold,  iBC,  BC, iper,ilwork)
60859599516SKenneth E. Jansenc Elaine-SPEBC
60959599516SKenneth E. Jansen            if((irscale.ge.0).and.(myrank.eq.master)) then
61059599516SKenneth E. Jansen                call genscale(yold, x, iBC)
61159599516SKenneth E. Jansenc               call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
61259599516SKenneth E. Jansen            endif
61359599516SKenneth E. Jansen            do isclr=1,nsclr
61459599516SKenneth E. Jansen               call itrBCSclr (yold, acold,  iBC, BC, iper, ilwork)
61559599516SKenneth E. Jansen            enddo
61659599516SKenneth E. Jansenc
61759599516SKenneth E. Jansen            istep = istep + 1
61859599516SKenneth E. Jansen            lstep = lstep + 1
61959599516SKenneth E. Jansen            ntoutv=max(ntout,100)
620*513954efSKenneth E. Jansen            !boundary flux output moved after the error calculation so
621*513954efSKenneth E. Jansen            !everything can be written out in a single chunk of code -
622*513954efSKenneth E. Jansen            !Nicholas Mati
62359599516SKenneth E. Jansen
624*513954efSKenneth E. Jansen            !dump TIME SERIES
62559599516SKenneth E. Jansen            if (exts) then
626*513954efSKenneth E. Jansen              !Write the probe data to disc. Note that IO to disc only
627*513954efSKenneth E. Jansen              !occurs when mod(lstep, nbuff) == 0. However, this
628*513954efSKenneth E. Jansen              !function also does data buffering and must be called
629*513954efSKenneth E. Jansen              !every time step.
630*513954efSKenneth E. Jansen              call TD_bufferData()
631*513954efSKenneth E. Jansen              call TD_writeData(fvarts, .false.)
63259599516SKenneth E. Jansen            endif
63359599516SKenneth E. Jansen
634*513954efSKenneth E. Jansen            !Update the Mach Control
635*513954efSKenneth E. Jansen            if(exts .and. exMC) then
636*513954efSKenneth E. Jansen              !Note: the function MC_updateState must be called after
637*513954efSKenneth E. Jansen              !the function TD_bufferData due to dependencies on
638*513954efSKenneth E. Jansen              !vartsbuff(:,:,:).
639*513954efSKenneth E. Jansen              call MC_updateState()
640*513954efSKenneth E. Jansen              call MC_applyBC(BC)
641*513954efSKenneth E. Jansen              call MC_printState()
64259599516SKenneth E. Jansen
643*513954efSKenneth E. Jansen              !Write the state if a restart is also being written.
644*513954efSKenneth E. Jansen              if(mod(lstep,ntout).eq.0 ) call MC_writeState(lstep)
645*513954efSKenneth E. Jansen            endif
64659599516SKenneth E. Jansen
647*513954efSKenneth E. Jansen            !update blower control
648*513954efSKenneth E. Jansen            if(BC_enable) then
649*513954efSKenneth E. Jansen              !Update the blower boundary conditions for the next
650*513954efSKenneth E. Jansen              !iteration.
651*513954efSKenneth E. Jansen              call BC_iter(BC)
65259599516SKenneth E. Jansen
653*513954efSKenneth E. Jansen              !Also write the current phases of the blowers if a
654*513954efSKenneth E. Jansen              !restart is also being written.
655*513954efSKenneth E. Jansen              if(mod(lstep, ntout) == 0) call BC_writePhase(lstep)
656*513954efSKenneth E. Jansen            endif
65759599516SKenneth E. Jansen
658*513954efSKenneth E. Jansen            !.... Yi Chen Duct geometry8
659*513954efSKenneth E. Jansen            if(isetBlowing_Duct.gt.0)then
660*513954efSKenneth E. Jansen              if(ifixBlowingVel_Duct.eq.0)then
661*513954efSKenneth E. Jansen                if(nstp.gt.nBlowingStepsDuct)then
662*513954efSKenneth E. Jansen                  nBlowingStepsDuct = nstp-2
663*513954efSKenneth E. Jansen                endif
664*513954efSKenneth E. Jansen                call setBlowing_Duct2(x,BC,yold,iTurbWall,istp)
66559599516SKenneth E. Jansen              endif
66659599516SKenneth E. Jansen            endif
667*513954efSKenneth E. Jansen          !... Yi Chen Duct geometry8
66859599516SKenneth E. Jansen
66959599516SKenneth E. Jansenc
67059599516SKenneth E. Jansenc.... -------------------> error calculation  <-----------------
67159599516SKenneth E. Jansen            if(ierrcalc.eq.1.or.ioybar.eq.1) then
67259599516SKenneth E. Jansen               tfact=one/istep
67359599516SKenneth E. Jansen               do idof=1,ndof
67459599516SKenneth E. Jansen                 ybar(:,idof) =tfact*yold(:,idof) +
67559599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,idof)
67659599516SKenneth E. Jansen               enddo
67759599516SKenneth E. Jansenc....compute average
67859599516SKenneth E. Jansenc...  ybar(:,ndof+1:ndof+8) is for avg. of square as uu, vv, ww, pp, TT, uv, uw, and vw
67959599516SKenneth E. Jansen               do idof=1,5 ! avg. of square for 5 flow variables
68059599516SKenneth E. Jansen                   ybar(:,ndof+idof) = tfact*yold(:,idof)**2 +
68159599516SKenneth E. Jansen     &                             (one-tfact)*ybar(:,ndof+idof)
68259599516SKenneth E. Jansen               enddo
68359599516SKenneth E. Jansen               ybar(:,ndof+6) = tfact*yold(:,1)*yold(:,2) + !uv
68459599516SKenneth E. Jansen     &                          (one-tfact)*ybar(:,ndof+6)
68559599516SKenneth E. Jansen               ybar(:,ndof+7) = tfact*yold(:,1)*yold(:,3) + !uw
68659599516SKenneth E. Jansen     &                          (one-tfact)*ybar(:,ndof+7)
68759599516SKenneth E. Jansen               ybar(:,ndof+8) = tfact*yold(:,2)*yold(:,3) + !vw
68859599516SKenneth E. Jansen     &                          (one-tfact)*ybar(:,ndof+8)
68959599516SKenneth E. Jansenc... compute err
690*513954efSKenneth E. Jansen               rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2
691*513954efSKenneth E. Jansen               rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2
692*513954efSKenneth E. Jansen               rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2
693*513954efSKenneth E. Jansen               rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2
69459599516SKenneth E. Jansen            endif
695*513954efSKenneth E. Jansen
696*513954efSKenneth E. Jansenc.. writing ybar field if requested in each restart file
697*513954efSKenneth E. Jansen
698*513954efSKenneth E. Jansen            !here is where we save our averaged field.  In some cases we want to
699*513954efSKenneth E. Jansen            !write it less frequently
700*513954efSKenneth E. Jansen            if( (irs >= 1) .and. (
701*513954efSKenneth E. Jansen     &          mod(lstep, ntout) == 0 .or. !Checkpoint
702*513954efSKenneth E. Jansen     &          istep == nstp) )then        !End of simulation
703*513954efSKenneth E. Jansen
704*513954efSKenneth E. Jansen               if( (mod(lstep, ntoutv) .eq. 0) .and.
705*513954efSKenneth E. Jansen     &              ((irscale.ge.0).or.(itwmod.gt.0) .or.
706*513954efSKenneth E. Jansen     &              ((nsonmax.eq.1).and.(iLES.gt.0))))
707*513954efSKenneth E. Jansen     &              call rwvelb  ('out ',  velbar  ,ifail)
708*513954efSKenneth E. Jansen
709*513954efSKenneth E. Jansen               !BUG: need to update new_interface to work with SyncIO.
710*513954efSKenneth E. Jansen               !Bflux is presently completely crippled. Note that restar
711*513954efSKenneth E. Jansen               !has also been moved here for readability.
712*513954efSKenneth E. Jansen!              call Bflux  (yold,          acold,     x,  compute boundary fluxes and print out
713*513954efSKenneth E. Jansen!    &              shp,           shgl,      shpb,
714*513954efSKenneth E. Jansen!    &              shglb,         nodflx,    ilwork)
715*513954efSKenneth E. Jansen
716*513954efSKenneth E. Jansen               call timer ('Output  ')      !set up the timer
717*513954efSKenneth E. Jansen
718*513954efSKenneth E. Jansen               !write the solution and time derivative
719*513954efSKenneth E. Jansen               call restar ('out ',  yold, acold)
720*513954efSKenneth E. Jansen
721*513954efSKenneth E. Jansen               !Write the distance to wall field in each restart
722*513954efSKenneth E. Jansen               if((istep==nstp) .and. (irans < 0 )) then !d2wall is allocated
723*513954efSKenneth E. Jansen                 call write_field(myrank,'a'//char(0),'dwal'//char(0),4,
724*513954efSKenneth E. Jansen     &                            d2wall,'d'//char(0), nshg, 1, lstep)
725*513954efSKenneth E. Jansen               endif
726*513954efSKenneth E. Jansen
727*513954efSKenneth E. Jansen               !Write the time average in each restart.
728*513954efSKenneth E. Jansen               if(ioybar.eq.1)then
729*513954efSKenneth E. Jansen                 call write_field(myrank,'a'//char(0),'ybar'//char(0),4,
730*513954efSKenneth E. Jansen     &                              ybar,'d'//char(0),nshg,ndof+8,lstep)
731*513954efSKenneth E. Jansen               endif
732*513954efSKenneth E. Jansen
733*513954efSKenneth E. Jansen               !Write the error feild at the end of each step sequence
734*513954efSKenneth E. Jansen               if(ierrcalc.eq.1 .and. istep == nstp) then
735*513954efSKenneth E. Jansen                 !smooth the error indicators
736*513954efSKenneth E. Jansen
737*513954efSKenneth E. Jansen                do i=1,ierrsmooth
738*513954efSKenneth E. Jansen                  call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC )
739*513954efSKenneth E. Jansen                enddo
740*513954efSKenneth E. Jansen
741*513954efSKenneth E. Jansen!                call write_error(myrank, lstep, nshg, 10, rerr )
742*513954efSKenneth E. Jansen                 call write_field(
743*513954efSKenneth E. Jansen     &                      myrank, 'a'//char(0), 'errors'//char(0), 6,
744*513954efSKenneth E. Jansen     &                        rerr, 'd'//char(0), nshg, 10, lstep)
745*513954efSKenneth E. Jansen               endif
746*513954efSKenneth E. Jansen
747*513954efSKenneth E. Jansenc the following is a future way to have the number of steps in the header...done for posix but not yet for syncio
748*513954efSKenneth E. Jansenc
749*513954efSKenneth E. Jansenc              call write_field2(myrank,'a'//char(0),'ybar'//char(0),
750*513954efSKenneth E. Jansenc     &                          4,ybar,'d'//char(0),nshg,ndof+8,
751*513954efSKenneth E. Jansenc     &                         lstep,istep)
752*513954efSKenneth E. Jansen            endif
753*513954efSKenneth E. Jansen
754*513954efSKenneth E. Jansen 2000    continue  !end of NSTEP loop
75559599516SKenneth E. Jansen 2001    continue
75659599516SKenneth E. Jansen
75759599516SKenneth E. Jansen         ttim(1) = REAL(secs(0.0)) / 100. - ttim(1)
75859599516SKenneth E. Jansen         ttim(2) = secs(0.0)              - ttim(2)
75959599516SKenneth E. Jansen
76059599516SKenneth E. Jansenc         tcorecp2 = REAL(secs(0.0)) / 100.
76159599516SKenneth E. Jansenc         tcorewc2 = secs(0.0)
76259599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
763*513954efSKenneth E. Jansen         if(myrank.eq.master)  then
76459599516SKenneth E. Jansen            tcorecp2 = TMRC()
76559599516SKenneth E. Jansen            write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1
76659599516SKenneth E. Jansen         endif
76759599516SKenneth E. Jansen
76859599516SKenneth E. Jansenc     call wtime
76959599516SKenneth E. Jansen
770*513954efSKenneth E. Jansen 3000 continue !end of NTSEQ loop
77159599516SKenneth E. Jansenc
77259599516SKenneth E. Jansenc.... ---------------------->  Post Processing  <----------------------
77359599516SKenneth E. Jansenc
77459599516SKenneth E. Jansenc.... print out the last step
77559599516SKenneth E. Jansenc
776*513954efSKenneth E. Jansen!      if ( (irs .ge. 1) .and. ((mod(lstep, ntout) .ne. 0) .or.
777*513954efSKenneth E. Jansen!     &    (nstp .eq. 0))) then
778*513954efSKenneth E. Jansen!          if( (mod(lstep, ntoutv) .eq. 0) .and.
779*513954efSKenneth E. Jansen!     &        ((irscale.ge.0).or.(itwmod.gt.0) .or.
780*513954efSKenneth E. Jansen!     &        ((nsonmax.eq.1).and.(iLES.gt.0))))
781*513954efSKenneth E. Jansen!     &        call rwvelb  ('out ',  velbar  ,ifail)
782*513954efSKenneth E. Jansen!
783*513954efSKenneth E. Jansen!          call Bflux  (yold,  acold,     x,
784*513954efSKenneth E. Jansen!     &         shp,           shgl,      shpb,
785*513954efSKenneth E. Jansen!     &         shglb,         nodflx,    ilwork)
786*513954efSKenneth E. Jansen!      endif
78759599516SKenneth E. Jansen
788*513954efSKenneth E. Jansen
789*513954efSKenneth E. Jansen
790*513954efSKenneth E. Jansenc      if(ioybar.eq.1) then
791*513954efSKenneth E. Jansenc         call write_field(myrank,'a'//char(0),'ybar'//char(0),4,
792*513954efSKenneth E. Jansenc     &                      ybar,'d'//char(0),nshg,ndof+8,lstep)
793*513954efSKenneth E. Jansenc      endif
794*513954efSKenneth E. Jansen
795*513954efSKenneth E. Jansenc     if(iRANS.lt.0 .and. idistcalc.eq.1) then
796*513954efSKenneth E. Jansenc        call write_field(myrank,'a'//char(0),'DESd'//char(0),4,
797*513954efSKenneth E. Jansenc     &                      elDw,'d'//char(0),numel,1,lstep)
79859599516SKenneth E. Jansenc
799*513954efSKenneth E. Jansenc         call write_field(myrank,'a'//char(0),'dwal'//char(0),4,
800*513954efSKenneth E. Jansenc     &                    d2wall,'d'//char(0),nshg,1,lstep)
801*513954efSKenneth E. Jansenc     endif
80259599516SKenneth E. Jansen
80359599516SKenneth E. Jansenc
80459599516SKenneth E. Jansenc.... close history and aerodynamic forces files
80559599516SKenneth E. Jansenc
80659599516SKenneth E. Jansen      if (myrank .eq. master) then
80759599516SKenneth E. Jansen         close (ihist)
80859599516SKenneth E. Jansen         close (iforce)
809*513954efSKenneth E. Jansen
810*513954efSKenneth E. Jansen         if(exMC) then
811*513954efSKenneth E. Jansen           call MC_writeState(lstep)
812*513954efSKenneth E. Jansen           call MC_finalize
813*513954efSKenneth E. Jansen         endif
814*513954efSKenneth E. Jansen
81559599516SKenneth E. Jansen         if(exts) then
816*513954efSKenneth E. Jansen           call TD_writeData(fvarts, .true.)    !force the flush of the buffer.
817*513954efSKenneth E. Jansen           call TD_finalize
81859599516SKenneth E. Jansen         endif
81959599516SKenneth E. Jansen      endif
820*513954efSKenneth E. Jansen
821*513954efSKenneth E. Jansen      if(BC_enable) then  !blower is allocated on all processes.
822*513954efSKenneth E. Jansen        if(mod(lstep, ntout) /= 0) then !May have already written file.
823*513954efSKenneth E. Jansen           call BC_writePhase(lstep)
824*513954efSKenneth E. Jansen        endif
825*513954efSKenneth E. Jansen
826*513954efSKenneth E. Jansen        call BC_finalize
827*513954efSKenneth E. Jansen      endif
828*513954efSKenneth E. Jansen
82959599516SKenneth E. Jansen      close (iecho)
83059599516SKenneth E. Jansen      if(iabc==1) deallocate(acs)
83159599516SKenneth E. Jansenc
83259599516SKenneth E. Jansenc.... end
83359599516SKenneth E. Jansenc
83459599516SKenneth E. Jansen      return
83559599516SKenneth E. Jansen      end
836*513954efSKenneth E. Jansen
837*513954efSKenneth E. Jansen
838