xref: /phasta/phSolver/compressible/itrdrv.f (revision 5124a526bf0251412abb7c1c6947b2d411acdbc8)
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
330d32f9a8SKenneth E. Jansen      use timedataC      !allows collection of time series
34513954efSKenneth E. Jansen      use MachControl   !PID to control the inlet velocity.
35513954efSKenneth E. Jansen      use blowerControl !gives us BC_enable
3659599516SKenneth E. Jansen      use turbSA
37513954efSKenneth E. Jansen      use wallData
38513954efSKenneth 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
51513954efSKenneth 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
61513954efSKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: vortG
62513954efSKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: BDiag
63513954efSKenneth E. Jansen
64513954efSKenneth E. Jansen!       integer, allocatable, dimension(:) :: iv_rank  !used with MRasquin's version of probe points
65513954efSKenneth E. Jansen!       integer :: iv_rankpernode, iv_totnodes, iv_totcores
66513954efSKenneth E. Jansen!       integer :: iv_node,        iv_core,     iv_thread
67513954efSKenneth 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)
71513954efSKenneth E. Jansen        character(len=60) fvarts
7259599516SKenneth E. Jansen        integer ifuncs(6), iarray(10)
73*5124a526SKenneth E. Jansen        integer BCdtKW, tsBase
74*5124a526SKenneth E. Jansen
7559599516SKenneth E. Jansen        real*8 elDw(numel) ! element average of DES d variable
76e72fd12cSBen Matthews
77e72fd12cSBen Matthews        real*8, allocatable, dimension(:,:) :: HBrg
78e72fd12cSBen Matthews        real*8, allocatable, dimension(:) :: eBrg
79e72fd12cSBen Matthews        real*8, allocatable, dimension(:) :: yBrg
80e72fd12cSBen Matthews        real*8, allocatable, dimension(:) :: Rcos, Rsin
8159599516SKenneth E. Jansenc
8259599516SKenneth E. Jansenc  Here are the data structures for sparse matrix GMRES
8359599516SKenneth E. Jansenc
8459599516SKenneth E. Jansen        integer, allocatable, dimension(:,:) :: rowp
8559599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: colm
8659599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: lhsK
8759599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: EGmass
8859599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: EGmasst
8959599516SKenneth E. Jansen
90513954efSKenneth E. Jansen        integer iTurbWall(nshg)
91513954efSKenneth E. Jansen        real*8 yInlet(3), yInletg(3)
92513954efSKenneth E. Jansen        integer imapped, imapInlet(nshg)  !for now, used for setting Blower conditions
93513954efSKenneth E. Jansen!        real*8 M_th, M_tc, M_tt
94513954efSKenneth E. Jansen!        logical  exMc
95513954efSKenneth E. Jansen!        real*8 vBC, vBCg
96513954efSKenneth E. Jansen        real*8 vortmax, vortmaxg
9759599516SKenneth E. Jansen
98513954efSKenneth E. Jansen       iprec=0 !PETSc - Disable PHASTA's BDiag. TODO: Preprocssor Switch
9959599516SKenneth E. Jansen
100513954efSKenneth E. Jansen       call findTurbWall(iTurbWall)
10159599516SKenneth E. Jansen
102513954efSKenneth E. Jansen!-------
103513954efSKenneth E. Jansen! SETUP
104513954efSKenneth E. Jansen!-------
10559599516SKenneth E. Jansen
106513954efSKenneth E. Jansen       !HACK for debugging suction
107513954efSKenneth E. Jansen!       call Write_Debug(myrank, 'wallNormal'//char(0),
108513954efSKenneth E. Jansen!     &                          'wnorm'//char(0), wnorm,
109513954efSKenneth E. Jansen!     &                          'd', nshg, 3, lstep)
110513954efSKenneth E. Jansen
111513954efSKenneth E. Jansen       !Probe Point Setup
112513954efSKenneth E. Jansen       call initProbePoints()
113513954efSKenneth E. Jansen       if(exts) then  !exts is set in initProbePoints
114513954efSKenneth E. Jansen         write(fvarts, "('./varts/varts.', I0, '.dat')") lstep
115513954efSKenneth E. Jansen         fvarts = trim(fvarts)
11659599516SKenneth E. Jansen
11759599516SKenneth E. Jansen         if(myrank .eq. master) then
118513954efSKenneth E. Jansen           call TD_writeHeader(fvarts)
119513954efSKenneth E. Jansen         endif
12059599516SKenneth E. Jansen       endif
12159599516SKenneth E. Jansen
122513954efSKenneth E. Jansen       !Mach Control Setup
123513954efSKenneth E. Jansen       call MC_init(Delt, lstep, BC)
124513954efSKenneth E. Jansen       exMC = exMC .and. exts   !If probe points aren't available, turn
125513954efSKenneth E. Jansen                                !the Mach Control off
126513954efSKenneth E. Jansen       if(exMC) then
127513954efSKenneth E. Jansen         call MC_applyBC(BC)
128513954efSKenneth E. Jansen         call MC_printState()
12959599516SKenneth E. Jansen       endif
13059599516SKenneth E. Jansen
131513954efSKenneth E. Jansen
13259599516SKenneth E. Jansenc
13359599516SKenneth E. Jansenc.... open history and aerodynamic forces files
13459599516SKenneth E. Jansenc
13559599516SKenneth E. Jansen        if (myrank .eq. master) then
13659599516SKenneth E. Jansen          open (unit=ihist,  file=fhist,  status='unknown')
13759599516SKenneth E. Jansen          open (unit=iforce, file=fforce, status='unknown')
13859599516SKenneth E. Jansen        endif
13959599516SKenneth E. Jansenc
14059599516SKenneth E. Jansenc
14159599516SKenneth E. Jansenc.... initialize
14259599516SKenneth E. Jansenc
14359599516SKenneth E. Jansen        ifuncs  = 0                      ! func. evaluation counter
14459599516SKenneth E. Jansen        istep  = 0
14559599516SKenneth E. Jansen        ntotGM = 0                      ! number of GMRES iterations
14659599516SKenneth E. Jansen        time   = 0
14759599516SKenneth E. Jansen        yold   = y
14859599516SKenneth E. Jansen        acold  = ac
149513954efSKenneth E. Jansen
150513954efSKenneth E. Jansen!Blower Setup
151513954efSKenneth E. Jansen       call BC_init(Delt, lstep, BC)  !Note: sets BC_enable
152513954efSKenneth E. Jansen! fix the yold values to the reset BC
153513954efSKenneth E. Jansen      if(BC_enable) call itrBC (yold,  ac,  iBC,  BC,  iper, ilwork)
154513954efSKenneth E. Jansen! without the above, second solve of first steps is fouled up
155513954efSKenneth E. Jansen!
156e72fd12cSBen Matthews        allocate(HBrg(Kspace+1,Kspace))
157e72fd12cSBen Matthews        allocate(eBrg(Kspace+1))
158e72fd12cSBen Matthews        allocate(yBrg(Kspace))
159e72fd12cSBen Matthews        allocate(Rcos(Kspace))
160e72fd12cSBen Matthews        allocate(Rsin(Kspace))
161e72fd12cSBen Matthews
16259599516SKenneth E. Jansen        if (mod(impl(1),100)/10 .eq. 1) then
16359599516SKenneth E. Jansenc
16459599516SKenneth E. Jansenc     generate the sparse data fill vectors
16559599516SKenneth E. Jansenc
16659599516SKenneth E. Jansen           allocate  (rowp(nshg,nnz))
16759599516SKenneth E. Jansen           allocate  (colm(nshg+1))
16859599516SKenneth E. Jansen           call genadj(colm, rowp, icnt ) ! preprocess the adjacency list
16959599516SKenneth E. Jansen
17059599516SKenneth E. Jansen           nnz_tot=icnt         ! this is exactly the number of non-zero
17159599516SKenneth E. Jansen                                ! blocks on this proc
172513954efSKenneth E. Jansen           if(usingpetsc.eq.1) then
173513954efSKenneth E. Jansen             allocate (BDiag(1,1,1))
174513954efSKenneth E. Jansen           else
175513954efSKenneth E. Jansen             allocate (BDiag(nshg,nflow,nflow))
17659599516SKenneth E. Jansen             allocate (lhsK(nflow*nflow,nnz_tot))
17759599516SKenneth E. Jansen           endif
178513954efSKenneth E. Jansen        endif
17959599516SKenneth E. Jansen        if (mod(impl(1),100)/10 .eq. 3) then
18059599516SKenneth E. Jansenc
18159599516SKenneth E. Jansenc     generate the ebe data fill vectors
18259599516SKenneth E. Jansenc
18359599516SKenneth E. Jansen           nedof=nflow*nshape
18459599516SKenneth E. Jansen           allocate  (EGmass(numel,nedof*nedof))
18559599516SKenneth E. Jansen        endif
18659599516SKenneth E. Jansen
18759599516SKenneth E. Jansenc..........................................
18859599516SKenneth E. Jansen        rerr = zero
18959599516SKenneth E. Jansen        ybar(:,1:ndof) = y(:,1:ndof)
19059599516SKenneth E. Jansen        do idof=1,5
19159599516SKenneth E. Jansen           ybar(:,ndof+idof) = y(:,idof)*y(:,idof)
19259599516SKenneth E. Jansen        enddo
19359599516SKenneth E. Jansen        ybar(:,ndof+6) = y(:,1)*y(:,2)
19459599516SKenneth E. Jansen        ybar(:,ndof+7) = y(:,1)*y(:,3)
19559599516SKenneth E. Jansen        ybar(:,ndof+8) = y(:,2)*y(:,3)
19659599516SKenneth E. Jansenc.........................................
19759599516SKenneth E. Jansen
198513954efSKenneth E. Jansen!  change the freestream and inflow eddy viscosity to reflect different
199513954efSKenneth E. Jansen!  levels of freestream turbulence
200513954efSKenneth E. Jansen!
201513954efSKenneth E. Jansen! First override boundary condition values
202513954efSKenneth E. Jansen!  USES imapInlet from Mach Control so if that gets conditionaled away
203513954efSKenneth E. Jansen!  it has to know if it is needed here
204513954efSKenneth E. Jansen!
205513954efSKenneth E. Jansen      if(isetEV_IC_BC.eq.1) then
206513954efSKenneth E. Jansen        allocate(vortG(nshg, 4))
207513954efSKenneth E. Jansen        call vortGLB(yold, x, shp, shgl, ilwork, vortG)
208513954efSKenneth 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
209513954efSKenneth E. Jansen        write(*,*) "vortmax = ", vortmax
21059599516SKenneth E. Jansen
211513954efSKenneth E. Jansen        !Find the maximum shear in the simulation
212513954efSKenneth E. Jansen        if(numpe.gt.1) then
213513954efSKenneth E. Jansen           call MPI_ALLREDUCE(vortmax, vortmaxg, 1,
214513954efSKenneth E. Jansen     &          MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr )
215513954efSKenneth E. Jansen           vortmax = vortmaxg
216513954efSKenneth E. Jansen        endif
21759599516SKenneth E. Jansen
218513954efSKenneth E. Jansen        !Apply eddy viscosity at the inlet
219513954efSKenneth E. Jansen        do i=1,icountInlet ! for now only coded to catch primary inlet, not blower
220513954efSKenneth E. Jansen           BC(imapInlet(i),7)=evis_IC_BC
221513954efSKenneth E. Jansen        enddo
222513954efSKenneth E. Jansen
223513954efSKenneth E. Jansen        !Apply eddy viscosity through the quasi-inviscid portion of the domain
224513954efSKenneth E. Jansen        do i = 1,nshg
225513954efSKenneth E. Jansen          if(abs(vortG(i,4)).ge.vortmax*0.01) yold(i,6)=evis_IC_BC
226513954efSKenneth E. Jansen        enddo
227513954efSKenneth E. Jansen        isclr=1 ! fix scalar
228513954efSKenneth E. Jansen        call itrBCsclr(yold,ac,iBC,BC,iper,ilwork)
229513954efSKenneth E. Jansen
230513954efSKenneth E. Jansen        deallocate(vortG)
231513954efSKenneth E. Jansen      endif
23259599516SKenneth E. Jansenc
23359599516SKenneth E. Jansenc.... loop through the time sequences
23459599516SKenneth E. Jansenc
23559599516SKenneth E. Jansen        do 3000 itsq = 1, ntseq
23659599516SKenneth E. Jansen        itseq = itsq
23759599516SKenneth E. Jansenc
23859599516SKenneth E. Jansenc.... set up the current parameters
23959599516SKenneth E. Jansenc
24059599516SKenneth E. Jansen        nstp   = nstep(itseq)
24159599516SKenneth E. Jansen        nitr   = niter(itseq)
24259599516SKenneth E. Jansen        LCtime = loctim(itseq)
24359599516SKenneth E. Jansenc
24459599516SKenneth E. Jansen        call itrSetup ( y,  acold)
24559599516SKenneth E. Jansen        isclr=0
24659599516SKenneth E. Jansen
24759599516SKenneth E. Jansen        niter(itseq)=0          ! count number of flow solves in a step
24859599516SKenneth E. Jansen                                !  (# of iterations)
24959599516SKenneth E. Jansen        do i=1,seqsize
25059599516SKenneth E. Jansen           if(stepseq(i).eq.0) niter(itseq)=niter(itseq)+1
25159599516SKenneth E. Jansen        enddo
25259599516SKenneth E. Jansen        nitr = niter(itseq)
25359599516SKenneth E. Jansenc
25459599516SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve
25559599516SKenneth E. Jansenc
25659599516SKenneth E. Jansen        nsclrsol=nsclr          ! total number of scalars solved. At
25759599516SKenneth E. Jansen                                ! some point we probably want to create
25859599516SKenneth E. Jansen                                ! a map, considering stepseq(), to find
25959599516SKenneth E. Jansen                                ! what is actually solved and only
26059599516SKenneth E. Jansen                                ! dimension EGmasst to the appropriate
26159599516SKenneth E. Jansen                                ! size.
26259599516SKenneth E. Jansen
26359599516SKenneth E. Jansen        if(nsclrsol.gt.0)allocate  (EGmasst(numel*nshape*nshape
26459599516SKenneth E. Jansen     &                              ,nsclrsol))
26559599516SKenneth E. Jansen
26659599516SKenneth E. Jansenc
26759599516SKenneth E. Jansenc.... loop through the time steps
26859599516SKenneth E. Jansenc
26959599516SKenneth E. Jansen        ttim(1) = REAL(secs(0.0)) / 100.
27059599516SKenneth E. Jansen        ttim(2) = secs(0.0)
27159599516SKenneth E. Jansen
27259599516SKenneth E. Jansenc        tcorecp1 = REAL(secs(0.0)) / 100.
27359599516SKenneth E. Jansenc        tcorewc1 = secs(0.0)
27459599516SKenneth E. Jansen        if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
275513954efSKenneth E. Jansen        if(myrank.eq.master)  then
27659599516SKenneth E. Jansen           tcorecp1 = TMRC()
27759599516SKenneth E. Jansen        endif
27859599516SKenneth E. Jansen
27959599516SKenneth E. Jansen        rmub=datmat(1,2,1)
28059599516SKenneth E. Jansen        if(rmutarget.gt.0) then
28159599516SKenneth E. Jansen           rmue=rmutarget
28259599516SKenneth E. Jansen           xmulfact=(rmue/rmub)**(1.0/nstp)
283513954efSKenneth E. Jansen           if(myrank.eq.master) then
28459599516SKenneth E. Jansen              write(*,*) 'viscosity will by multiplied by ', xmulfact
28559599516SKenneth E. Jansen              write(*,*) 'to bring it from ', rmub,' down to ', rmue
28659599516SKenneth E. Jansen           endif
28759599516SKenneth E. Jansen           datmat(1,2,1)=datmat(1,2,1)/xmulfact ! make first step right
28859599516SKenneth E. Jansen        else
28959599516SKenneth E. Jansen           rmue=datmat(1,2,1)   ! keep constant
29059599516SKenneth E. Jansen           xmulfact=one
29159599516SKenneth E. Jansen        endif
29259599516SKenneth E. Jansen        if(iramp.eq.1) then
29359599516SKenneth E. Jansen                call initBCprofileScale(vbc_prof,BC,yold,x)
29459599516SKenneth E. Jansen! fix the yold values to the reset BC
29559599516SKenneth E. Jansen                call itrBC (yold,  ac,  iBC,  BC,  iper, ilwork)
29659599516SKenneth E. Jansen                isclr=1 ! fix scalar
29759599516SKenneth E. Jansen                call itrBCsclr(yold,ac,iBC,BC,iper,ilwork)
29859599516SKenneth E. Jansen        endif
299*5124a526SKenneth E. Jansenc  Time Varying BCs------------------------------------(Kyle W 6-6-13)
300*5124a526SKenneth E. Jansenc        BCdtKW=0
301*5124a526SKenneth E. Jansen        if(BCdtKW.gt.0) then
302*5124a526SKenneth E. Jansen           call BCprofileInitKW(PresBase,VelBase,BC)
303*5124a526SKenneth E. Jansen        endif
304*5124a526SKenneth E. Jansenc  Time Varying BCs------------------------------------(Kyle W 6-6-13)
30559599516SKenneth E. Jansen
30659599516SKenneth E. Jansen867     continue
307513954efSKenneth E. Jansen
308513954efSKenneth E. Jansen
309513954efSKenneth E. Jansenc============ Start the loop of time steps============================c
310513954efSKenneth E. Jansen!        edamp2=.99
311513954efSKenneth E. Jansen!        edamp3=0.05
312513954efSKenneth E. Jansen        deltaInlInv=one/(0.125*0.0254)
31359599516SKenneth E. Jansen        do 2000 istp = 1, nstp
314513954efSKenneth E. Jansen
315*5124a526SKenneth E. Jansen           if (myrank.eq.master) write(*,*) 'Time step of current run',
316*5124a526SKenneth E. Jansen     &                                    istp
317*5124a526SKenneth E. Jansen
318*5124a526SKenneth E. Jansenc  Time Varying BCs------------------------------------(Kyle W 6-6-13)
319*5124a526SKenneth E. Jansen           if(BCdtKW.gt.0) then
320*5124a526SKenneth E. Jansen              call BCprofileScaleKW(PresBase,VelBase,BC,yold)
321*5124a526SKenneth E. Jansen           endif
322*5124a526SKenneth E. Jansenc  Time Varying BCs------------------------------------(Kyle W 6-6-13)
323513954efSKenneth E. Jansen
32459599516SKenneth E. Jansen           if(iramp.eq.1)
32559599516SKenneth E. Jansen     &        call BCprofileScale(vbc_prof,BC,yold)
32659599516SKenneth E. Jansen
32759599516SKenneth E. Jansenc           call rerun_check(stopjob)
32859599516SKenneth E. Jansencc          if(stopjob.ne.0) goto 2001
32959599516SKenneth E. Jansenc
33059599516SKenneth E. Jansenc Decay of scalars
33159599516SKenneth E. Jansenc
33259599516SKenneth E. Jansen           if(nsclr.gt.0 .and. tdecay.ne.1) then
33359599516SKenneth E. Jansen              yold(:,6:ndof)=y(:,6:ndof)*tdecay
33459599516SKenneth E. Jansen              BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*tdecay
33559599516SKenneth E. Jansen           endif
33659599516SKenneth E. Jansen
33759599516SKenneth E. Jansen           if(nosource.eq.1) BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*0.8
33859599516SKenneth E. Jansen
33959599516SKenneth E. Jansen
34059599516SKenneth E. Jansenc           xi=istp*one/nstp
34159599516SKenneth E. Jansenc           datmat(1,2,1)=rmub*(1.0-xi)+xi*rmue
34259599516SKenneth E. Jansen           datmat(1,2,1)=xmulfact*datmat(1,2,1)
34359599516SKenneth E. Jansen
34459599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC.
34559599516SKenneth E. Jansenc     these will be for time step n+1 so use lstep+1
34659599516SKenneth E. Jansenc
34759599516SKenneth E. Jansen           if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl,
34859599516SKenneth E. Jansen     &                              shpb, shglb, x, BC, iBC)
34959599516SKenneth E. Jansen
35059599516SKenneth E. Jansen            if(iLES.gt.0) then
35159599516SKenneth E. Jansenc
35259599516SKenneth E. Jansenc.... get dynamic model coefficient
35359599516SKenneth E. Jansenc
35459599516SKenneth E. Jansen            ilesmod=iLES/10
35559599516SKenneth E. Jansenc
35659599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model
35759599516SKenneth E. Jansenc
35859599516SKenneth E. Jansen            if (ilesmod.eq.0) then ! 0 < iLES < 10 => dyn. model calculated
35959599516SKenneth E. Jansen                                   ! at nodes based on discrete filtering
36059599516SKenneth E. Jansen               call getdmc (yold,       shgl,      shp,
36159599516SKenneth E. Jansen     &                      iper,       ilwork,    nsons,
36259599516SKenneth E. Jansen     &                      ifath,      x)
36359599516SKenneth E. Jansen            endif
36459599516SKenneth E. Jansen            if (ilesmod .eq. 1) then ! 10 < iLES < 20 => dynamic-mixed
36559599516SKenneth E. Jansen                                     ! at nodes based on discrete filtering
36659599516SKenneth E. Jansen               call bardmc (yold,       shgl,      shp,
36759599516SKenneth E. Jansen     &                      iper,       ilwork,
36859599516SKenneth E. Jansen     &                      nsons,      ifath,     x)
36959599516SKenneth E. Jansen            endif
37059599516SKenneth E. Jansen            if (ilesmod .eq. 2) then ! 20 < iLES < 30 => dynamic at quad
37159599516SKenneth E. Jansen                                     ! pts based on lumped projection filt.
37259599516SKenneth E. Jansen               call projdmc (yold,       shgl,      shp,
37359599516SKenneth E. Jansen     &                       iper,       ilwork,    x)
37459599516SKenneth E. Jansen            endif
37559599516SKenneth E. Jansenc
376513954efSKenneth E. Jansen           endif ! endif of iLES
37759599516SKenneth E. Jansen
37859599516SKenneth E. Jansen
37959599516SKenneth E. Jansenc
38059599516SKenneth E. Jansenc.... set traction BCs for modeled walls
38159599516SKenneth E. Jansenc
38259599516SKenneth E. Jansen            if (itwmod.ne.0) then   !wallfn check
38359599516SKenneth E. Jansen               call asbwmod(yold,   acold,   x,      BC,     iBC,
38459599516SKenneth E. Jansen     &                      iper,   ilwork,  ifath,  velbar)
38559599516SKenneth E. Jansen            endif
38659599516SKenneth E. Jansenc
38759599516SKenneth E. Jansenc.... -----------------------> predictor phase <-----------------------
38859599516SKenneth E. Jansenc
38959599516SKenneth E. Jansen            call itrPredict(   yold,    acold,    y,   ac )
39059599516SKenneth E. Jansen            call itrBC (y,  ac,  iBC,  BC,  iper, ilwork)
39159599516SKenneth E. Jansen            isclr = zero
39259599516SKenneth E. Jansen            if (nsclr.gt.zero) then
39359599516SKenneth E. Jansen            do isclr=1,nsclr
39459599516SKenneth E. Jansen               call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
39559599516SKenneth E. Jansen            enddo
39659599516SKenneth E. Jansen            endif
39759599516SKenneth E. Jansenc
39859599516SKenneth E. Jansenc.... --------------------> multi-corrector phase <--------------------
39959599516SKenneth E. Jansenc
40059599516SKenneth E. Jansen           iter=0
40159599516SKenneth E. Jansen            ilss=0  ! this is a switch thrown on first solve of LS redistance
40259599516SKenneth E. Jansenc
40359599516SKenneth E. JansencHACK to make it keep solving RANS until tolerance is reached
40459599516SKenneth E. Jansenc
40559599516SKenneth E. Jansen       istop=0
406513954efSKenneth E. Jansen! blocking extra RANS steps for now       iMoreRANS=0
407513954efSKenneth E. Jansen       iMoreRANS=6
40859599516SKenneth E. Jansenc
40959599516SKenneth E. Jansenc find the the RANS portion of the sequence
41059599516SKenneth E. Jansenc
41159599516SKenneth E. Jansen       do istepc=1,seqsize
41259599516SKenneth E. Jansen          if(stepseq(istepc).eq.10) iLastRANS=istepc
41359599516SKenneth E. Jansen       enddo
41459599516SKenneth E. Jansen
41559599516SKenneth E. Jansen       iseqStart=1
41659599516SKenneth E. Jansen9876   continue
41759599516SKenneth E. Jansenc
41859599516SKenneth E. Jansen            do istepc=iseqStart,seqsize
41959599516SKenneth E. Jansen               icode=stepseq(istepc)
42059599516SKenneth E. Jansen               if(mod(icode,10).eq.0) then ! this is a solve
42159599516SKenneth E. Jansen                  isolve=icode/10
42259599516SKenneth E. Jansen                  if(isolve.eq.0) then   ! flow solve (encoded as 0)
42359599516SKenneth E. Jansenc
42459599516SKenneth E. Jansen                     etol=epstol(1)
42559599516SKenneth E. Jansen                     iter   = iter+1
42659599516SKenneth E. Jansen                     ifuncs(1)  = ifuncs(1) + 1
42759599516SKenneth E. Jansenc
42859599516SKenneth E. Jansenc.... reset the aerodynamic forces
42959599516SKenneth E. Jansenc
43059599516SKenneth E. Jansen                     Force(1) = zero
43159599516SKenneth E. Jansen                     Force(2) = zero
43259599516SKenneth E. Jansen                     Force(3) = zero
43359599516SKenneth E. Jansen                     HFlux    = zero
43459599516SKenneth E. Jansenc
43559599516SKenneth E. Jansenc.... form the element data and solve the matrix problem
43659599516SKenneth E. Jansenc
43759599516SKenneth E. Jansenc.... explicit solver
43859599516SKenneth E. Jansenc
43959599516SKenneth E. Jansen                     if (impl(itseq) .eq. 0) then
44059599516SKenneth E. Jansen                        if (myrank .eq. master)
44159599516SKenneth E. Jansen     &                       call error('itrdrv  ','impl ',impl(itseq))
44259599516SKenneth E. Jansen                     endif
44359599516SKenneth E. Jansen                     if (mod(impl(1),100)/10 .eq. 1) then  ! sparse solve
44459599516SKenneth E. Jansenc
44559599516SKenneth E. Jansenc.... preconditioned sparse matrix GMRES solver
44659599516SKenneth E. Jansenc
44759599516SKenneth E. Jansen                        lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
44859599516SKenneth E. Jansen                        iprec=lhs
44959599516SKenneth E. Jansen                        nedof = nflow*nshape
45059599516SKenneth E. Jansenc                        write(*,*) 'lhs=',lhs
451513954efSKenneth E. Jansen                    if(usingpetsc.eq.1) then
45217860365SKenneth E. Jansen#if (HAVE_PETSC)
453513954efSKenneth E. Jansen               call SolGMRp (y,             ac,            yold,
454513954efSKenneth E. Jansen     &                       x,
455513954efSKenneth E. Jansen     &                       iBC,           BC,
456513954efSKenneth E. Jansen     &                       colm,          rowp,          lhsk,
457513954efSKenneth E. Jansen     &                       res,
458513954efSKenneth E. Jansen     &                       BDiag,
459513954efSKenneth E. Jansen     &                       iper,          ilwork,
460513954efSKenneth E. Jansen     &                       shp,           shgl,
461513954efSKenneth E. Jansen     &                       shpb,          shglb,         solinc,
462513954efSKenneth E. Jansen     &                       rerr,          fncorp )
46317860365SKenneth E. Jansen#else
46479f1763eSKenneth E. Jansen                     if(myrank.eq.0) write(*,*) 'exiting because run time input asked for PETSc, not linked in exec'
46517860365SKenneth E. Jansen                     call error('itrdrv  ','noPETSc',usingpetsc)
46617860365SKenneth E. Jansen#endif
467513954efSKenneth E. Jansen                     else
46859599516SKenneth E. Jansen                      call SolGMRs (y,             ac,            yold,
46959599516SKenneth E. Jansen     &                       acold,         x,
47059599516SKenneth E. Jansen     &                       iBC,           BC,
47159599516SKenneth E. Jansen     &                       colm,          rowp,          lhsk,
47259599516SKenneth E. Jansen     &                       res,
473e72fd12cSBen Matthews     &                       BDiag,         hBrg,          eBrg,
474e72fd12cSBen Matthews     &                       yBrg,          Rcos,          Rsin,
47559599516SKenneth E. Jansen     &                       iper,          ilwork,
47659599516SKenneth E. Jansen     &                       shp,           shgl,
47759599516SKenneth E. Jansen     &                       shpb,          shglb,         solinc,
47859599516SKenneth E. Jansen     &                       rerr)
479513954efSKenneth E. Jansen                    endif
48059599516SKenneth E. Jansen                      else if (mod(impl(1),100)/10 .eq. 2) then ! mfg solve
48159599516SKenneth E. Jansenc
48259599516SKenneth E. Jansenc.... preconditioned matrix-free GMRES solver
48359599516SKenneth E. Jansenc
48459599516SKenneth E. Jansen                        lhs=0
48559599516SKenneth E. Jansen                        iprec = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
48659599516SKenneth E. Jansen                        nedof = 0
48759599516SKenneth E. Jansen                        call SolMFG (y,             ac,            yold,
48859599516SKenneth E. Jansen     &                       acold,         x,
48959599516SKenneth E. Jansen     &                       iBC,           BC,
49059599516SKenneth E. Jansen     &                       res,
491e72fd12cSBen Matthews     &                       BDiag,         HBrg,          eBrg,
492e72fd12cSBen Matthews     &                       yBrg,          Rcos,          Rsin,
49359599516SKenneth E. Jansen     &                       iper,          ilwork,
49459599516SKenneth E. Jansen     &                       shp,           shgl,
49559599516SKenneth E. Jansen     &                       shpb,          shglb,         solinc,
49659599516SKenneth E. Jansen     &                       rerr)
49759599516SKenneth E. Jansenc
49859599516SKenneth E. Jansen                     else if (mod(impl(1),100)/10 .eq. 3) then ! ebe solve
49959599516SKenneth E. Jansenc.... preconditioned ebe matrix GMRES solver
50059599516SKenneth E. Jansenc
50159599516SKenneth E. Jansen
50259599516SKenneth E. Jansen                        lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
50359599516SKenneth E. Jansen                        iprec = lhs
50459599516SKenneth E. Jansen                        nedof = nflow*nshape
50559599516SKenneth E. Jansenc                        write(*,*) 'lhs=',lhs
50659599516SKenneth E. Jansen                      call SolGMRe (y,             ac,            yold,
50759599516SKenneth E. Jansen     &                       acold,         x,
50859599516SKenneth E. Jansen     &                       iBC,           BC,
50959599516SKenneth E. Jansen     &                       EGmass,        res,
510e72fd12cSBen Matthews     &                       BDiag,         HBrg,          eBrg,
511e72fd12cSBen Matthews     &                       yBrg,          Rcos,          Rsin,
51259599516SKenneth E. Jansen     &                       iper,          ilwork,
51359599516SKenneth E. Jansen     &                       shp,           shgl,
51459599516SKenneth E. Jansen     &                       shpb,          shglb,         solinc,
51559599516SKenneth E. Jansen     &                       rerr)
51659599516SKenneth E. Jansen                     endif
51759599516SKenneth E. Jansenc
51859599516SKenneth E. Jansen                else          ! solve a scalar  (encoded at isclr*10)
51959599516SKenneth E. Jansen                     isclr=isolve
520513954efSKenneth E. Jansen                     etol=epstol(isclr+2) ! note that for both epstol and LHSupd 1 is flow 2 temp isclr+2 for scalars
521513954efSKenneth E. Jansen                     ifuncs(isclr+2)  = ifuncs(isclr+2) + 1
52259599516SKenneth E. Jansen                     if((iLSet.eq.2).and.(ilss.eq.0)
52359599516SKenneth E. Jansen     &                    .and.(isclr.eq.2)) then
52459599516SKenneth E. Jansen                        ilss=1  ! throw switch (once per step)
52559599516SKenneth E. Jansenc
52659599516SKenneth E. Jansenc... copy the first scalar at t=n+1 into the second scalar of the
52759599516SKenneth E. Jansenc... level sets
52859599516SKenneth E. Jansenc
52959599516SKenneth E. Jansen                     y(:,6)    = yold(:,6)  + (y(:,6)-yold(:,6))/alfi
53059599516SKenneth E. Jansen                     y(:,7)    =  y(:,6)
53159599516SKenneth E. Jansen                     yold(:,7) = y(:,7)
53259599516SKenneth E. Jansen                     ac(:,7)   = zero
53359599516SKenneth E. Jansenc
53459599516SKenneth E. Jansen                     call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
53559599516SKenneth E. Jansenc
53659599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the
53759599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar
53859599516SKenneth E. Jansenc
53959599516SKenneth E. Jansen                        alfit=alfi
54059599516SKenneth E. Jansen                        gamit=gami
54159599516SKenneth E. Jansen                        almit=almi
54259599516SKenneth E. Jansen                        alfi = 1
54359599516SKenneth E. Jansen                        gami = 1
54459599516SKenneth E. Jansen                        almi = 1
54559599516SKenneth E. Jansen                     endif
54659599516SKenneth E. Jansenc
54759599516SKenneth E. Jansen                     lhs = 1 - min(1,mod(ifuncs(isclr+2)-1,
54859599516SKenneth E. Jansen     &                                       LHSupd(isclr+2)))
54959599516SKenneth E. Jansen                     iprec = lhs
55059599516SKenneth E. Jansen                     istop=0
551513954efSKenneth E. Jansen                 if(usingPETSc.eq.1) then
55217860365SKenneth E. Jansen#if (HAVE_PETSC)
553513954efSKenneth E. Jansen                     call SolGMRpSclr(y,             ac,
554513954efSKenneth E. Jansen     &                    x,             elDw,
555513954efSKenneth E. Jansen     &                    iBC,           BC,
556513954efSKenneth E. Jansen     &                    colm,           rowp,
557513954efSKenneth E. Jansen     &                    iper,          ilwork,
558513954efSKenneth E. Jansen     &                    shp,           shgl,
559513954efSKenneth E. Jansen     &                    shpb,          shglb,     rest,
560513954efSKenneth E. Jansen     &                    solinc(1,isclr+5),fncorp)
56117860365SKenneth E. Jansen#else
56217860365SKenneth E. Jansen                     write(*,*) 'exiting because run time input asked for PETSc, not linked in exec'
56317860365SKenneth E. Jansen                     call error('itrdrv  ','noPETSc',usingpetsc)
56417860365SKenneth E. Jansen#endif
565513954efSKenneth E. Jansen                 else
56659599516SKenneth E. Jansen                     call SolGMRSclr(y,             ac,         yold,
56759599516SKenneth E. Jansen     &                    acold,         EGmasst(1,isclr),
56859599516SKenneth E. Jansen     &                    x,             elDw,
56959599516SKenneth E. Jansen     &                    iBC,           BC,
57059599516SKenneth E. Jansen     &                    rest,
571e72fd12cSBen Matthews     &                    HBrg,          eBrg,
572e72fd12cSBen Matthews     &                    yBrg,          Rcos,      Rsin,
57359599516SKenneth E. Jansen     &                    iper,          ilwork,
57459599516SKenneth E. Jansen     &                    shp,           shgl,
57559599516SKenneth E. Jansen     &                    shpb,          shglb, solinc(1,isclr+5))
576513954efSKenneth E. Jansen                  endif
57759599516SKenneth E. Jansenc
57859599516SKenneth E. Jansen                  endif         ! end of scalar type solve
57959599516SKenneth E. Jansenc
58059599516SKenneth E. Jansenc
58159599516SKenneth E. Jansenc.... end of the multi-corrector loop
58259599516SKenneth E. Jansenc
58359599516SKenneth E. Jansen 1000             continue      !check this
58459599516SKenneth E. Jansen
58559599516SKenneth E. Jansen               else             ! this is an update  (mod did not equal zero)
58659599516SKenneth E. Jansen                  iupdate=icode/10 ! what to update
58759599516SKenneth E. Jansen                  if(iupdate.eq.0) then !update flow
58859599516SKenneth E. Jansen                     call itrCorrect ( y, ac, yold, acold, solinc)
58959599516SKenneth E. Jansen                     call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
59059599516SKenneth E. Jansen                     call tnanq(y, 5, 'y_updbc')
59159599516SKenneth E. Jansenc Elaine-SPEBC
59259599516SKenneth E. Jansen                     if((irscale.ge.0).and.(myrank.eq.master)) then
59359599516SKenneth E. Jansen                        call genscale(y, x, iBC)
59459599516SKenneth E. Jansenc                       call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
59559599516SKenneth E. Jansen                     endif
59659599516SKenneth E. Jansen                  else          ! update scalar
59759599516SKenneth E. Jansen                     isclr=iupdate !unless
59859599516SKenneth E. Jansen                     if(iupdate.eq.nsclr+1) isclr=0
59959599516SKenneth E. Jansen                     call itrCorrectSclr ( y, ac, yold, acold,
60059599516SKenneth E. Jansen     &                                     solinc(1,isclr+5))
60159599516SKenneth E. Jansen                     if (ilset.eq.2 .and. isclr.eq.2)  then
60259599516SKenneth E. Jansen                        fct2=one/almi
60359599516SKenneth E. Jansen                        fct3=one/alfi
60459599516SKenneth E. Jansen                        acold(:,7) = acold(:,7)
60559599516SKenneth E. Jansen     &                             + (ac(:,7)-acold(:,7))*fct2
60659599516SKenneth E. Jansen                        yold(:,7)  = yold(:,7)
60759599516SKenneth E. Jansen     &                             + (y(:,7)-yold(:,7))*fct3
60859599516SKenneth E. Jansen                        call itrBCSclr (  yold,  acold,  iBC,  BC,
60959599516SKenneth E. Jansen     &                                    iper,  ilwork)
61059599516SKenneth E. Jansen                        ac(:,7) = acold(:,7)*(one-almi/gami)
61159599516SKenneth E. Jansen                        y(:,7)  = yold(:,7)
61259599516SKenneth E. Jansen                        ac(:,7) = zero
61359599516SKenneth E. Jansen                        if (ivconstraint .eq. 1) then
61459599516SKenneth E. Jansen     &
61559599516SKenneth E. Jansenc ... applying the volume constraint
61659599516SKenneth E. Jansenc
61759599516SKenneth E. Jansen                           call solvecon (y,    x,      iBC,  BC,
61859599516SKenneth E. Jansen     &                                    iper, ilwork, shp,  shgl)
61959599516SKenneth E. Jansenc
62059599516SKenneth E. Jansen                        endif   ! end of volume constraint calculations
62159599516SKenneth E. Jansen                     endif
62259599516SKenneth E. Jansen                     call itrBCSclr (  y,  ac,  iBC,  BC, iper, ilwork)
62359599516SKenneth E. Jansen                  endif
62459599516SKenneth E. Jansen               endif            !end of switch between solve or update
62559599516SKenneth E. Jansen            enddo               ! loop over sequence in step
62659599516SKenneth E. Jansen        if((istop.lt.0).and.(iMoreRANS.lt.5)) then
62759599516SKenneth E. Jansen            iMoreRANS=iMoreRANS+1
628513954efSKenneth E. Jansen            if(myrank.eq.master) write(*,*) 'istop =', istop
62959599516SKenneth E. Jansen       iseqStart=iLastRANS
63059599516SKenneth E. Jansen       goto 9876
63159599516SKenneth E. Jansen       endif
63259599516SKenneth E. Jansenc
63359599516SKenneth E. Jansenc     Find the solution at the end of the timestep and move it to old
63459599516SKenneth E. Jansenc
63559599516SKenneth E. Jansenc.... First to reassign the parameters for the original time integrator scheme
63659599516SKenneth E. Jansenc
63759599516SKenneth E. Jansen            if((iLSet.eq.2).and.(ilss.eq.1)) then
63859599516SKenneth E. Jansen               alfi =alfit
63959599516SKenneth E. Jansen               gami =gamit
64059599516SKenneth E. Jansen               almi =almit
64159599516SKenneth E. Jansen            endif
64259599516SKenneth E. Jansen            call itrUpdate( yold,  acold,   y,    ac)
64359599516SKenneth E. Jansen            call itrBC (yold, acold,  iBC,  BC, iper,ilwork)
64459599516SKenneth E. Jansenc Elaine-SPEBC
64559599516SKenneth E. Jansen            if((irscale.ge.0).and.(myrank.eq.master)) then
64659599516SKenneth E. Jansen                call genscale(yold, x, iBC)
64759599516SKenneth E. Jansenc               call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
64859599516SKenneth E. Jansen            endif
64959599516SKenneth E. Jansen            do isclr=1,nsclr
65059599516SKenneth E. Jansen               call itrBCSclr (yold, acold,  iBC, BC, iper, ilwork)
65159599516SKenneth E. Jansen            enddo
65259599516SKenneth E. Jansenc
65359599516SKenneth E. Jansen            istep = istep + 1
65459599516SKenneth E. Jansen            lstep = lstep + 1
65559599516SKenneth E. Jansen            ntoutv=max(ntout,100)
656513954efSKenneth E. Jansen            !boundary flux output moved after the error calculation so
657513954efSKenneth E. Jansen            !everything can be written out in a single chunk of code -
658513954efSKenneth E. Jansen            !Nicholas Mati
65959599516SKenneth E. Jansen
660513954efSKenneth E. Jansen            !dump TIME SERIES
66159599516SKenneth E. Jansen            if (exts) then
662513954efSKenneth E. Jansen              !Write the probe data to disc. Note that IO to disc only
663513954efSKenneth E. Jansen              !occurs when mod(lstep, nbuff) == 0. However, this
664513954efSKenneth E. Jansen              !function also does data buffering and must be called
665513954efSKenneth E. Jansen              !every time step.
666513954efSKenneth E. Jansen              call TD_bufferData()
667513954efSKenneth E. Jansen              call TD_writeData(fvarts, .false.)
66859599516SKenneth E. Jansen            endif
66959599516SKenneth E. Jansen
670513954efSKenneth E. Jansen            !Update the Mach Control
671513954efSKenneth E. Jansen            if(exts .and. exMC) then
672513954efSKenneth E. Jansen              !Note: the function MC_updateState must be called after
673513954efSKenneth E. Jansen              !the function TD_bufferData due to dependencies on
674513954efSKenneth E. Jansen              !vartsbuff(:,:,:).
675513954efSKenneth E. Jansen              call MC_updateState()
676513954efSKenneth E. Jansen              call MC_applyBC(BC)
677513954efSKenneth E. Jansen              call MC_printState()
67859599516SKenneth E. Jansen
679513954efSKenneth E. Jansen              !Write the state if a restart is also being written.
680513954efSKenneth E. Jansen              if(mod(lstep,ntout).eq.0 ) call MC_writeState(lstep)
681513954efSKenneth E. Jansen            endif
68259599516SKenneth E. Jansen
683513954efSKenneth E. Jansen            !update blower control
684513954efSKenneth E. Jansen            if(BC_enable) then
685513954efSKenneth E. Jansen              !Update the blower boundary conditions for the next
686513954efSKenneth E. Jansen              !iteration.
687513954efSKenneth E. Jansen              call BC_iter(BC)
68859599516SKenneth E. Jansen
689513954efSKenneth E. Jansen              !Also write the current phases of the blowers if a
690513954efSKenneth E. Jansen              !restart is also being written.
691513954efSKenneth E. Jansen              if(mod(lstep, ntout) == 0) call BC_writePhase(lstep)
692513954efSKenneth E. Jansen            endif
69359599516SKenneth E. Jansen
694513954efSKenneth E. Jansen            !.... Yi Chen Duct geometry8
695513954efSKenneth E. Jansen            if(isetBlowing_Duct.gt.0)then
696513954efSKenneth E. Jansen              if(ifixBlowingVel_Duct.eq.0)then
697513954efSKenneth E. Jansen                if(nstp.gt.nBlowingStepsDuct)then
698513954efSKenneth E. Jansen                  nBlowingStepsDuct = nstp-2
699513954efSKenneth E. Jansen                endif
700513954efSKenneth E. Jansen                call setBlowing_Duct2(x,BC,yold,iTurbWall,istp)
70159599516SKenneth E. Jansen              endif
70259599516SKenneth E. Jansen            endif
703513954efSKenneth E. Jansen          !... Yi Chen Duct geometry8
70459599516SKenneth E. Jansen
70559599516SKenneth E. Jansenc
70659599516SKenneth E. Jansenc.... -------------------> error calculation  <-----------------
70759599516SKenneth E. Jansen            if(ierrcalc.eq.1.or.ioybar.eq.1) then
70859599516SKenneth E. Jansen               tfact=one/istep
70959599516SKenneth E. Jansen               do idof=1,ndof
71059599516SKenneth E. Jansen                 ybar(:,idof) =tfact*yold(:,idof) +
71159599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,idof)
71259599516SKenneth E. Jansen               enddo
71359599516SKenneth E. Jansenc....compute average
71459599516SKenneth E. Jansenc...  ybar(:,ndof+1:ndof+8) is for avg. of square as uu, vv, ww, pp, TT, uv, uw, and vw
71559599516SKenneth E. Jansen               do idof=1,5 ! avg. of square for 5 flow variables
71659599516SKenneth E. Jansen                   ybar(:,ndof+idof) = tfact*yold(:,idof)**2 +
71759599516SKenneth E. Jansen     &                             (one-tfact)*ybar(:,ndof+idof)
71859599516SKenneth E. Jansen               enddo
71959599516SKenneth E. Jansen               ybar(:,ndof+6) = tfact*yold(:,1)*yold(:,2) + !uv
72059599516SKenneth E. Jansen     &                          (one-tfact)*ybar(:,ndof+6)
72159599516SKenneth E. Jansen               ybar(:,ndof+7) = tfact*yold(:,1)*yold(:,3) + !uw
72259599516SKenneth E. Jansen     &                          (one-tfact)*ybar(:,ndof+7)
72359599516SKenneth E. Jansen               ybar(:,ndof+8) = tfact*yold(:,2)*yold(:,3) + !vw
72459599516SKenneth E. Jansen     &                          (one-tfact)*ybar(:,ndof+8)
72559599516SKenneth E. Jansenc... compute err
726513954efSKenneth E. Jansen               rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2
727513954efSKenneth E. Jansen               rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2
728513954efSKenneth E. Jansen               rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2
729513954efSKenneth E. Jansen               rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2
73059599516SKenneth E. Jansen            endif
731513954efSKenneth E. Jansen
732513954efSKenneth E. Jansenc.. writing ybar field if requested in each restart file
733513954efSKenneth E. Jansen
734513954efSKenneth E. Jansen            !here is where we save our averaged field.  In some cases we want to
735513954efSKenneth E. Jansen            !write it less frequently
736513954efSKenneth E. Jansen            if( (irs >= 1) .and. (
737513954efSKenneth E. Jansen     &          mod(lstep, ntout) == 0 .or. !Checkpoint
738513954efSKenneth E. Jansen     &          istep == nstp) )then        !End of simulation
739513954efSKenneth E. Jansen
740513954efSKenneth E. Jansen               if( (mod(lstep, ntoutv) .eq. 0) .and.
741513954efSKenneth E. Jansen     &              ((irscale.ge.0).or.(itwmod.gt.0) .or.
742513954efSKenneth E. Jansen     &              ((nsonmax.eq.1).and.(iLES.gt.0))))
743513954efSKenneth E. Jansen     &              call rwvelb  ('out ',  velbar  ,ifail)
744513954efSKenneth E. Jansen
745513954efSKenneth E. Jansen               !BUG: need to update new_interface to work with SyncIO.
746513954efSKenneth E. Jansen               !Bflux is presently completely crippled. Note that restar
747513954efSKenneth E. Jansen               !has also been moved here for readability.
748513954efSKenneth E. Jansen!              call Bflux  (yold,          acold,     x,  compute boundary fluxes and print out
749513954efSKenneth E. Jansen!    &              shp,           shgl,      shpb,
750513954efSKenneth E. Jansen!    &              shglb,         nodflx,    ilwork)
751513954efSKenneth E. Jansen
752513954efSKenneth E. Jansen               call timer ('Output  ')      !set up the timer
753513954efSKenneth E. Jansen
754513954efSKenneth E. Jansen               !write the solution and time derivative
755513954efSKenneth E. Jansen               call restar ('out ',  yold, acold)
756513954efSKenneth E. Jansen
757513954efSKenneth E. Jansen               !Write the distance to wall field in each restart
758513954efSKenneth E. Jansen               if((istep==nstp) .and. (irans < 0 )) then !d2wall is allocated
759513954efSKenneth E. Jansen                 call write_field(myrank,'a'//char(0),'dwal'//char(0),4,
760513954efSKenneth E. Jansen     &                            d2wall,'d'//char(0), nshg, 1, lstep)
761513954efSKenneth E. Jansen               endif
762513954efSKenneth E. Jansen
763513954efSKenneth E. Jansen               !Write the time average in each restart.
764513954efSKenneth E. Jansen               if(ioybar.eq.1)then
765513954efSKenneth E. Jansen                 call write_field(myrank,'a'//char(0),'ybar'//char(0),4,
766513954efSKenneth E. Jansen     &                              ybar,'d'//char(0),nshg,ndof+8,lstep)
767513954efSKenneth E. Jansen               endif
768513954efSKenneth E. Jansen
769513954efSKenneth E. Jansen               !Write the error feild at the end of each step sequence
770513954efSKenneth E. Jansen               if(ierrcalc.eq.1 .and. istep == nstp) then
771513954efSKenneth E. Jansen                 !smooth the error indicators
772513954efSKenneth E. Jansen
773513954efSKenneth E. Jansen                do i=1,ierrsmooth
774513954efSKenneth E. Jansen                  call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC )
775513954efSKenneth E. Jansen                enddo
776513954efSKenneth E. Jansen
777513954efSKenneth E. Jansen!                call write_error(myrank, lstep, nshg, 10, rerr )
778513954efSKenneth E. Jansen                 call write_field(
779513954efSKenneth E. Jansen     &                      myrank, 'a'//char(0), 'errors'//char(0), 6,
780513954efSKenneth E. Jansen     &                        rerr, 'd'//char(0), nshg, 10, lstep)
781513954efSKenneth E. Jansen               endif
782513954efSKenneth E. Jansen
783513954efSKenneth 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
784513954efSKenneth E. Jansenc
785513954efSKenneth E. Jansenc              call write_field2(myrank,'a'//char(0),'ybar'//char(0),
786513954efSKenneth E. Jansenc     &                          4,ybar,'d'//char(0),nshg,ndof+8,
787513954efSKenneth E. Jansenc     &                         lstep,istep)
788513954efSKenneth E. Jansen            endif
789513954efSKenneth E. Jansen
790513954efSKenneth E. Jansen 2000    continue  !end of NSTEP loop
79159599516SKenneth E. Jansen 2001    continue
79259599516SKenneth E. Jansen
79359599516SKenneth E. Jansen         ttim(1) = REAL(secs(0.0)) / 100. - ttim(1)
79459599516SKenneth E. Jansen         ttim(2) = secs(0.0)              - ttim(2)
79559599516SKenneth E. Jansen
79659599516SKenneth E. Jansenc         tcorecp2 = REAL(secs(0.0)) / 100.
79759599516SKenneth E. Jansenc         tcorewc2 = secs(0.0)
79859599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
799513954efSKenneth E. Jansen         if(myrank.eq.master)  then
80059599516SKenneth E. Jansen            tcorecp2 = TMRC()
80159599516SKenneth E. Jansen            write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1
80259599516SKenneth E. Jansen         endif
80359599516SKenneth E. Jansen
80459599516SKenneth E. Jansenc     call wtime
80559599516SKenneth E. Jansen
80675f1c48cSCameron Smith      call destroyWallData
80792e15685SCameron Smith      call destroyfncorp
80875f1c48cSCameron Smith
809513954efSKenneth E. Jansen 3000 continue !end of NTSEQ loop
81059599516SKenneth E. Jansenc
81159599516SKenneth E. Jansenc.... ---------------------->  Post Processing  <----------------------
81259599516SKenneth E. Jansenc
81359599516SKenneth E. Jansenc.... print out the last step
81459599516SKenneth E. Jansenc
815513954efSKenneth E. Jansen!      if ( (irs .ge. 1) .and. ((mod(lstep, ntout) .ne. 0) .or.
816513954efSKenneth E. Jansen!     &    (nstp .eq. 0))) then
817513954efSKenneth E. Jansen!          if( (mod(lstep, ntoutv) .eq. 0) .and.
818513954efSKenneth E. Jansen!     &        ((irscale.ge.0).or.(itwmod.gt.0) .or.
819513954efSKenneth E. Jansen!     &        ((nsonmax.eq.1).and.(iLES.gt.0))))
820513954efSKenneth E. Jansen!     &        call rwvelb  ('out ',  velbar  ,ifail)
821513954efSKenneth E. Jansen!
822513954efSKenneth E. Jansen!          call Bflux  (yold,  acold,     x,
823513954efSKenneth E. Jansen!     &         shp,           shgl,      shpb,
824513954efSKenneth E. Jansen!     &         shglb,         nodflx,    ilwork)
825513954efSKenneth E. Jansen!      endif
82659599516SKenneth E. Jansen
827513954efSKenneth E. Jansen
828513954efSKenneth E. Jansen
829513954efSKenneth E. Jansenc      if(ioybar.eq.1) then
830513954efSKenneth E. Jansenc         call write_field(myrank,'a'//char(0),'ybar'//char(0),4,
831513954efSKenneth E. Jansenc     &                      ybar,'d'//char(0),nshg,ndof+8,lstep)
832513954efSKenneth E. Jansenc      endif
833513954efSKenneth E. Jansen
834513954efSKenneth E. Jansenc     if(iRANS.lt.0 .and. idistcalc.eq.1) then
835513954efSKenneth E. Jansenc        call write_field(myrank,'a'//char(0),'DESd'//char(0),4,
836513954efSKenneth E. Jansenc     &                      elDw,'d'//char(0),numel,1,lstep)
83759599516SKenneth E. Jansenc
838513954efSKenneth E. Jansenc         call write_field(myrank,'a'//char(0),'dwal'//char(0),4,
839513954efSKenneth E. Jansenc     &                    d2wall,'d'//char(0),nshg,1,lstep)
840513954efSKenneth E. Jansenc     endif
84159599516SKenneth E. Jansen
84259599516SKenneth E. Jansenc
84359599516SKenneth E. Jansenc.... close history and aerodynamic forces files
84459599516SKenneth E. Jansenc
84559599516SKenneth E. Jansen      if (myrank .eq. master) then
84659599516SKenneth E. Jansen         close (ihist)
84759599516SKenneth E. Jansen         close (iforce)
848513954efSKenneth E. Jansen
849513954efSKenneth E. Jansen         if(exMC) then
850513954efSKenneth E. Jansen           call MC_writeState(lstep)
851513954efSKenneth E. Jansen           call MC_finalize
852513954efSKenneth E. Jansen         endif
853513954efSKenneth E. Jansen
85459599516SKenneth E. Jansen         if(exts) then
855513954efSKenneth E. Jansen           call TD_writeData(fvarts, .true.)    !force the flush of the buffer.
856513954efSKenneth E. Jansen           call TD_finalize
85759599516SKenneth E. Jansen         endif
85859599516SKenneth E. Jansen      endif
859513954efSKenneth E. Jansen
860513954efSKenneth E. Jansen      if(BC_enable) then  !blower is allocated on all processes.
861513954efSKenneth E. Jansen        if(mod(lstep, ntout) /= 0) then !May have already written file.
862513954efSKenneth E. Jansen           call BC_writePhase(lstep)
863513954efSKenneth E. Jansen        endif
864513954efSKenneth E. Jansen
865513954efSKenneth E. Jansen        call BC_finalize
866513954efSKenneth E. Jansen      endif
867513954efSKenneth E. Jansen
86859599516SKenneth E. Jansen      close (iecho)
86959599516SKenneth E. Jansen      if(iabc==1) deallocate(acs)
87059599516SKenneth E. Jansenc
87159599516SKenneth E. Jansenc.... end
87259599516SKenneth E. Jansenc
87359599516SKenneth E. Jansen      return
87459599516SKenneth E. Jansen      end
875513954efSKenneth E. Jansen
876513954efSKenneth E. Jansen
877