xref: /phasta/phSolver/compressible/itrdrv.f (revision b4542ea82c77e372ce7105f8acc0203afe56d668)
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
59f0b806cbSKenneth E. Jansen
6059599516SKenneth E. Jansen        dimension ifath(numnp),    velbar(nfath,ndof),  nsons(nfath)
6159599516SKenneth 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
62513954efSKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: vortG
63513954efSKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: BDiag
64513954efSKenneth E. Jansen
65513954efSKenneth E. Jansen!       integer, allocatable, dimension(:) :: iv_rank  !used with MRasquin's version of probe points
66513954efSKenneth E. Jansen!       integer :: iv_rankpernode, iv_totnodes, iv_totcores
67513954efSKenneth E. Jansen!       integer :: iv_node,        iv_core,     iv_thread
68513954efSKenneth E. Jansen
6959599516SKenneth E. Jansen! assuming three profiles to control (inlet, bottom FC and top FC)
7059599516SKenneth E. Jansen! store velocity profile set via BC
7159599516SKenneth E. Jansen        real*8 vbc_prof(nshg,3)
72513954efSKenneth E. Jansen        character(len=60) fvarts
7359599516SKenneth E. Jansen        integer ifuncs(6), iarray(10)
745124a526SKenneth E. Jansen        integer BCdtKW, tsBase
755124a526SKenneth E. Jansen
7659599516SKenneth E. Jansen        real*8 elDw(numel) ! element average of DES d variable
77e72fd12cSBen Matthews
78e72fd12cSBen Matthews        real*8, allocatable, dimension(:,:) :: HBrg
79e72fd12cSBen Matthews        real*8, allocatable, dimension(:) :: eBrg
80e72fd12cSBen Matthews        real*8, allocatable, dimension(:) :: yBrg
81e72fd12cSBen Matthews        real*8, allocatable, dimension(:) :: Rcos, Rsin
8259599516SKenneth E. Jansenc
8359599516SKenneth E. Jansenc  Here are the data structures for sparse matrix GMRES
8459599516SKenneth E. Jansenc
8559599516SKenneth E. Jansen        integer, allocatable, dimension(:,:) :: rowp
8659599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: colm
8759599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: lhsK
8859599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: EGmass
8959599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: EGmasst
9059599516SKenneth E. Jansen
91513954efSKenneth E. Jansen        integer iTurbWall(nshg)
92513954efSKenneth E. Jansen        real*8 yInlet(3), yInletg(3)
93513954efSKenneth E. Jansen        integer imapped, imapInlet(nshg)  !for now, used for setting Blower conditions
94513954efSKenneth E. Jansen!        real*8 M_th, M_tc, M_tt
95513954efSKenneth E. Jansen!        logical  exMc
96513954efSKenneth E. Jansen!        real*8 vBC, vBCg
97513954efSKenneth E. Jansen        real*8 vortmax, vortmaxg
9859599516SKenneth E. Jansen
99513954efSKenneth E. Jansen       iprec=0 !PETSc - Disable PHASTA's BDiag. TODO: Preprocssor Switch
10059599516SKenneth E. Jansen
101513954efSKenneth E. Jansen       call findTurbWall(iTurbWall)
10259599516SKenneth E. Jansen
103513954efSKenneth E. Jansen!-------
104513954efSKenneth E. Jansen! SETUP
105513954efSKenneth E. Jansen!-------
10659599516SKenneth E. Jansen
107513954efSKenneth E. Jansen       !HACK for debugging suction
108513954efSKenneth E. Jansen!       call Write_Debug(myrank, 'wallNormal'//char(0),
109513954efSKenneth E. Jansen!     &                          'wnorm'//char(0), wnorm,
110513954efSKenneth E. Jansen!     &                          'd', nshg, 3, lstep)
111513954efSKenneth E. Jansen
112513954efSKenneth E. Jansen       !Probe Point Setup
113513954efSKenneth E. Jansen       call initProbePoints()
114513954efSKenneth E. Jansen       if(exts) then  !exts is set in initProbePoints
115513954efSKenneth E. Jansen         write(fvarts, "('./varts/varts.', I0, '.dat')") lstep
116513954efSKenneth E. Jansen         fvarts = trim(fvarts)
11759599516SKenneth E. Jansen
11859599516SKenneth E. Jansen         if(myrank .eq. master) then
119513954efSKenneth E. Jansen           call TD_writeHeader(fvarts)
120513954efSKenneth E. Jansen         endif
12159599516SKenneth E. Jansen       endif
12259599516SKenneth E. Jansen
123513954efSKenneth E. Jansen       !Mach Control Setup
124513954efSKenneth E. Jansen       call MC_init(Delt, lstep, BC)
125513954efSKenneth E. Jansen       exMC = exMC .and. exts   !If probe points aren't available, turn
126513954efSKenneth E. Jansen                                !the Mach Control off
127513954efSKenneth E. Jansen       if(exMC) then
128513954efSKenneth E. Jansen         call MC_applyBC(BC)
129513954efSKenneth E. Jansen         call MC_printState()
13059599516SKenneth E. Jansen       endif
13159599516SKenneth E. Jansen
132513954efSKenneth E. Jansen
13359599516SKenneth E. Jansenc
13459599516SKenneth E. Jansenc.... open history and aerodynamic forces files
13559599516SKenneth E. Jansenc
13659599516SKenneth E. Jansen        if (myrank .eq. master) then
13759599516SKenneth E. Jansen          open (unit=ihist,  file=fhist,  status='unknown')
13859599516SKenneth E. Jansen          open (unit=iforce, file=fforce, status='unknown')
13959599516SKenneth E. Jansen        endif
14059599516SKenneth E. Jansenc
14159599516SKenneth E. Jansenc
14259599516SKenneth E. Jansenc.... initialize
14359599516SKenneth E. Jansenc
14459599516SKenneth E. Jansen        ifuncs  = 0                      ! func. evaluation counter
14559599516SKenneth E. Jansen        istep  = 0
14659599516SKenneth E. Jansen        ntotGM = 0                      ! number of GMRES iterations
14759599516SKenneth E. Jansen        time   = 0
14859599516SKenneth E. Jansen        yold   = y
14959599516SKenneth E. Jansen        acold  = ac
150513954efSKenneth E. Jansen
151513954efSKenneth E. Jansen!Blower Setup
152513954efSKenneth E. Jansen       call BC_init(Delt, lstep, BC)  !Note: sets BC_enable
153513954efSKenneth E. Jansen! fix the yold values to the reset BC
154513954efSKenneth E. Jansen      if(BC_enable) call itrBC (yold,  ac,  iBC,  BC,  iper, ilwork)
155513954efSKenneth E. Jansen! without the above, second solve of first steps is fouled up
156513954efSKenneth E. Jansen!
157e72fd12cSBen Matthews        allocate(HBrg(Kspace+1,Kspace))
158e72fd12cSBen Matthews        allocate(eBrg(Kspace+1))
159e72fd12cSBen Matthews        allocate(yBrg(Kspace))
160e72fd12cSBen Matthews        allocate(Rcos(Kspace))
161e72fd12cSBen Matthews        allocate(Rsin(Kspace))
162e72fd12cSBen Matthews
16359599516SKenneth E. Jansen        if (mod(impl(1),100)/10 .eq. 1) then
16459599516SKenneth E. Jansenc
16559599516SKenneth E. Jansenc     generate the sparse data fill vectors
16659599516SKenneth E. Jansenc
16759599516SKenneth E. Jansen           allocate  (rowp(nshg,nnz))
16859599516SKenneth E. Jansen           allocate  (colm(nshg+1))
16959599516SKenneth E. Jansen           call genadj(colm, rowp, icnt ) ! preprocess the adjacency list
17059599516SKenneth E. Jansen
17159599516SKenneth E. Jansen           nnz_tot=icnt         ! this is exactly the number of non-zero
17259599516SKenneth E. Jansen                                ! blocks on this proc
173513954efSKenneth E. Jansen           if(usingpetsc.eq.1) then
174513954efSKenneth E. Jansen             allocate (BDiag(1,1,1))
175513954efSKenneth E. Jansen           else
176513954efSKenneth E. Jansen             allocate (BDiag(nshg,nflow,nflow))
17759599516SKenneth E. Jansen             allocate (lhsK(nflow*nflow,nnz_tot))
17859599516SKenneth E. Jansen           endif
179513954efSKenneth E. Jansen        endif
18095b6cef5Srickybalin        if (mod(impl(1),100)/10 .eq. 2) then
18195b6cef5Srickybalinc
18295b6cef5Srickybalinc     generate the mfg data fill vectors
18395b6cef5Srickybalinc
18495b6cef5Srickybalin           allocate (BDiag(nshg,nflow,nflow))
18595b6cef5Srickybalin        endif
18659599516SKenneth E. Jansen        if (mod(impl(1),100)/10 .eq. 3) then
18759599516SKenneth E. Jansenc
18859599516SKenneth E. Jansenc     generate the ebe data fill vectors
18959599516SKenneth E. Jansenc
19059599516SKenneth E. Jansen           nedof=nflow*nshape
19159599516SKenneth E. Jansen           allocate  (EGmass(numel,nedof*nedof))
19295b6cef5Srickybalin           allocate (BDiag(nshg,nflow,nflow))
19359599516SKenneth E. Jansen        endif
19459599516SKenneth E. Jansen
19559599516SKenneth E. Jansenc..........................................
19659599516SKenneth E. Jansen        rerr = zero
19759599516SKenneth E. Jansen        ybar(:,1:ndof) = y(:,1:ndof)
19859599516SKenneth E. Jansen        do idof=1,5
19959599516SKenneth E. Jansen           ybar(:,ndof+idof) = y(:,idof)*y(:,idof)
20059599516SKenneth E. Jansen        enddo
20159599516SKenneth E. Jansen        ybar(:,ndof+6) = y(:,1)*y(:,2)
20259599516SKenneth E. Jansen        ybar(:,ndof+7) = y(:,1)*y(:,3)
20359599516SKenneth E. Jansen        ybar(:,ndof+8) = y(:,2)*y(:,3)
20459599516SKenneth E. Jansenc.........................................
20559599516SKenneth E. Jansen
206513954efSKenneth E. Jansen!  change the freestream and inflow eddy viscosity to reflect different
207513954efSKenneth E. Jansen!  levels of freestream turbulence
208513954efSKenneth E. Jansen!
209513954efSKenneth E. Jansen! First override boundary condition values
210513954efSKenneth E. Jansen!  USES imapInlet from Mach Control so if that gets conditionaled away
211513954efSKenneth E. Jansen!  it has to know if it is needed here
212513954efSKenneth E. Jansen!
213513954efSKenneth E. Jansen      if(isetEV_IC_BC.eq.1) then
214513954efSKenneth E. Jansen        allocate(vortG(nshg, 4))
215513954efSKenneth E. Jansen        call vortGLB(yold, x, shp, shgl, ilwork, vortG)
216513954efSKenneth 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
217513954efSKenneth E. Jansen        write(*,*) "vortmax = ", vortmax
21859599516SKenneth E. Jansen
219513954efSKenneth E. Jansen        !Find the maximum shear in the simulation
220513954efSKenneth E. Jansen        if(numpe.gt.1) then
221513954efSKenneth E. Jansen           call MPI_ALLREDUCE(vortmax, vortmaxg, 1,
222513954efSKenneth E. Jansen     &          MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr )
223513954efSKenneth E. Jansen           vortmax = vortmaxg
224513954efSKenneth E. Jansen        endif
22559599516SKenneth E. Jansen
226513954efSKenneth E. Jansen        !Apply eddy viscosity at the inlet
227513954efSKenneth E. Jansen        do i=1,icountInlet ! for now only coded to catch primary inlet, not blower
228513954efSKenneth E. Jansen           BC(imapInlet(i),7)=evis_IC_BC
229513954efSKenneth E. Jansen        enddo
230513954efSKenneth E. Jansen
231513954efSKenneth E. Jansen        !Apply eddy viscosity through the quasi-inviscid portion of the domain
232513954efSKenneth E. Jansen        do i = 1,nshg
233513954efSKenneth E. Jansen          if(abs(vortG(i,4)).ge.vortmax*0.01) yold(i,6)=evis_IC_BC
234513954efSKenneth E. Jansen        enddo
235513954efSKenneth E. Jansen        isclr=1 ! fix scalar
236513954efSKenneth E. Jansen        call itrBCsclr(yold,ac,iBC,BC,iper,ilwork)
237513954efSKenneth E. Jansen
238513954efSKenneth E. Jansen        deallocate(vortG)
239513954efSKenneth E. Jansen      endif
24059599516SKenneth E. Jansenc
24159599516SKenneth E. Jansenc.... loop through the time sequences
24259599516SKenneth E. Jansenc
24359599516SKenneth E. Jansen        do 3000 itsq = 1, ntseq
24459599516SKenneth E. Jansen        itseq = itsq
24559599516SKenneth E. Jansenc
24659599516SKenneth E. Jansenc.... set up the current parameters
24759599516SKenneth E. Jansenc
24859599516SKenneth E. Jansen        nstp   = nstep(itseq)
24959599516SKenneth E. Jansen        nitr   = niter(itseq)
25059599516SKenneth E. Jansen        LCtime = loctim(itseq)
25159599516SKenneth E. Jansenc
25259599516SKenneth E. Jansen        call itrSetup ( y,  acold)
25359599516SKenneth E. Jansen        isclr=0
25459599516SKenneth E. Jansen
25559599516SKenneth E. Jansen        niter(itseq)=0          ! count number of flow solves in a step
25659599516SKenneth E. Jansen                                !  (# of iterations)
25759599516SKenneth E. Jansen        do i=1,seqsize
25859599516SKenneth E. Jansen           if(stepseq(i).eq.0) niter(itseq)=niter(itseq)+1
25959599516SKenneth E. Jansen        enddo
26059599516SKenneth E. Jansen        nitr = niter(itseq)
26159599516SKenneth E. Jansenc
26259599516SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve
26359599516SKenneth E. Jansenc
26459599516SKenneth E. Jansen        nsclrsol=nsclr          ! total number of scalars solved. At
26559599516SKenneth E. Jansen                                ! some point we probably want to create
26659599516SKenneth E. Jansen                                ! a map, considering stepseq(), to find
26759599516SKenneth E. Jansen                                ! what is actually solved and only
26859599516SKenneth E. Jansen                                ! dimension EGmasst to the appropriate
26959599516SKenneth E. Jansen                                ! size.
27059599516SKenneth E. Jansen
27159599516SKenneth E. Jansen        if(nsclrsol.gt.0)allocate  (EGmasst(numel*nshape*nshape
27259599516SKenneth E. Jansen     &                              ,nsclrsol))
27359599516SKenneth E. Jansen
27459599516SKenneth E. Jansenc
27559599516SKenneth E. Jansenc.... loop through the time steps
27659599516SKenneth E. Jansenc
27759599516SKenneth E. Jansen        ttim(1) = REAL(secs(0.0)) / 100.
27859599516SKenneth E. Jansen        ttim(2) = secs(0.0)
27959599516SKenneth E. Jansen
28059599516SKenneth E. Jansenc        tcorecp1 = REAL(secs(0.0)) / 100.
28159599516SKenneth E. Jansenc        tcorewc1 = secs(0.0)
28259599516SKenneth E. Jansen        if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
283513954efSKenneth E. Jansen        if(myrank.eq.master)  then
28459599516SKenneth E. Jansen           tcorecp1 = TMRC()
28559599516SKenneth E. Jansen        endif
28659599516SKenneth E. Jansen
28759599516SKenneth E. Jansen        rmub=datmat(1,2,1)
28859599516SKenneth E. Jansen        if(rmutarget.gt.0) then
28959599516SKenneth E. Jansen           rmue=rmutarget
29059599516SKenneth E. Jansen           xmulfact=(rmue/rmub)**(1.0/nstp)
291513954efSKenneth E. Jansen           if(myrank.eq.master) then
29259599516SKenneth E. Jansen              write(*,*) 'viscosity will by multiplied by ', xmulfact
29359599516SKenneth E. Jansen              write(*,*) 'to bring it from ', rmub,' down to ', rmue
29459599516SKenneth E. Jansen           endif
29559599516SKenneth E. Jansen           datmat(1,2,1)=datmat(1,2,1)/xmulfact ! make first step right
29659599516SKenneth E. Jansen        else
29759599516SKenneth E. Jansen           rmue=datmat(1,2,1)   ! keep constant
29859599516SKenneth E. Jansen           xmulfact=one
29959599516SKenneth E. Jansen        endif
30059599516SKenneth E. Jansen        if(iramp.eq.1) then
30159599516SKenneth E. Jansen                call initBCprofileScale(vbc_prof,BC,yold,x)
30259599516SKenneth E. Jansen! fix the yold values to the reset BC
30359599516SKenneth E. Jansen                call itrBC (yold,  ac,  iBC,  BC,  iper, ilwork)
30459599516SKenneth E. Jansen                isclr=1 ! fix scalar
30559599516SKenneth E. Jansen                call itrBCsclr(yold,ac,iBC,BC,iper,ilwork)
30659599516SKenneth E. Jansen        endif
3075124a526SKenneth E. Jansenc  Time Varying BCs------------------------------------(Kyle W 6-6-13)
3085124a526SKenneth E. Jansenc        BCdtKW=0
3095124a526SKenneth E. Jansen        if(BCdtKW.gt.0) then
3105124a526SKenneth E. Jansen           call BCprofileInitKW(PresBase,VelBase,BC)
3115124a526SKenneth E. Jansen        endif
3125124a526SKenneth E. Jansenc  Time Varying BCs------------------------------------(Kyle W 6-6-13)
31359599516SKenneth E. Jansen
31459599516SKenneth E. Jansen867     continue
315513954efSKenneth E. Jansen
316513954efSKenneth E. Jansen
317513954efSKenneth E. Jansenc============ Start the loop of time steps============================c
318513954efSKenneth E. Jansen!        edamp2=.99
319513954efSKenneth E. Jansen!        edamp3=0.05
320513954efSKenneth E. Jansen        deltaInlInv=one/(0.125*0.0254)
32159599516SKenneth E. Jansen        do 2000 istp = 1, nstp
322f0b806cbSKenneth E. Jansen           rerr=zero !extreme limit of 1 step window or error stats....later a variable
323513954efSKenneth E. Jansen
324f0b806cbSKenneth E. Jansen!           if (myrank.eq.master) write(*,*) 'Time step of current run',
325f0b806cbSKenneth E. Jansen!     &                                    istp
3265124a526SKenneth E. Jansen
3275124a526SKenneth E. Jansenc  Time Varying BCs------------------------------------(Kyle W 6-6-13)
3285124a526SKenneth E. Jansen           if(BCdtKW.gt.0) then
3295124a526SKenneth E. Jansen              call BCprofileScaleKW(PresBase,VelBase,BC,yold)
3305124a526SKenneth E. Jansen           endif
3315124a526SKenneth E. Jansenc  Time Varying BCs------------------------------------(Kyle W 6-6-13)
332513954efSKenneth E. Jansen
33359599516SKenneth E. Jansen           if(iramp.eq.1)
33459599516SKenneth E. Jansen     &        call BCprofileScale(vbc_prof,BC,yold)
33559599516SKenneth E. Jansen
33659599516SKenneth E. Jansenc           call rerun_check(stopjob)
33759599516SKenneth E. Jansencc          if(stopjob.ne.0) goto 2001
33859599516SKenneth E. Jansenc
33959599516SKenneth E. Jansenc Decay of scalars
34059599516SKenneth E. Jansenc
34159599516SKenneth E. Jansen           if(nsclr.gt.0 .and. tdecay.ne.1) then
34259599516SKenneth E. Jansen              yold(:,6:ndof)=y(:,6:ndof)*tdecay
34359599516SKenneth E. Jansen              BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*tdecay
34459599516SKenneth E. Jansen           endif
34559599516SKenneth E. Jansen
34659599516SKenneth E. Jansen           if(nosource.eq.1) BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*0.8
34759599516SKenneth E. Jansen
34859599516SKenneth E. Jansen
34959599516SKenneth E. Jansenc           xi=istp*one/nstp
35059599516SKenneth E. Jansenc           datmat(1,2,1)=rmub*(1.0-xi)+xi*rmue
35159599516SKenneth E. Jansen           datmat(1,2,1)=xmulfact*datmat(1,2,1)
35259599516SKenneth E. Jansen
35359599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC.
35459599516SKenneth E. Jansenc     these will be for time step n+1 so use lstep+1
35559599516SKenneth E. Jansenc
35659599516SKenneth E. Jansen           if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl,
35759599516SKenneth E. Jansen     &                              shpb, shglb, x, BC, iBC)
35859599516SKenneth E. Jansen
35959599516SKenneth E. Jansen            if(iLES.gt.0) then
36059599516SKenneth E. Jansenc
36159599516SKenneth E. Jansenc.... get dynamic model coefficient
36259599516SKenneth E. Jansenc
36359599516SKenneth E. Jansen            ilesmod=iLES/10
36459599516SKenneth E. Jansenc
36559599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model
36659599516SKenneth E. Jansenc
36759599516SKenneth E. Jansen            if (ilesmod.eq.0) then ! 0 < iLES < 10 => dyn. model calculated
36859599516SKenneth E. Jansen                                   ! at nodes based on discrete filtering
36959599516SKenneth E. Jansen               call getdmc (yold,       shgl,      shp,
37059599516SKenneth E. Jansen     &                      iper,       ilwork,    nsons,
37159599516SKenneth E. Jansen     &                      ifath,      x)
37259599516SKenneth E. Jansen            endif
37359599516SKenneth E. Jansen            if (ilesmod .eq. 1) then ! 10 < iLES < 20 => dynamic-mixed
37459599516SKenneth E. Jansen                                     ! at nodes based on discrete filtering
37559599516SKenneth E. Jansen               call bardmc (yold,       shgl,      shp,
37659599516SKenneth E. Jansen     &                      iper,       ilwork,
37759599516SKenneth E. Jansen     &                      nsons,      ifath,     x)
37859599516SKenneth E. Jansen            endif
37959599516SKenneth E. Jansen            if (ilesmod .eq. 2) then ! 20 < iLES < 30 => dynamic at quad
38059599516SKenneth E. Jansen                                     ! pts based on lumped projection filt.
38159599516SKenneth E. Jansen               call projdmc (yold,       shgl,      shp,
38259599516SKenneth E. Jansen     &                       iper,       ilwork,    x)
38359599516SKenneth E. Jansen            endif
38459599516SKenneth E. Jansenc
385513954efSKenneth E. Jansen           endif ! endif of iLES
38659599516SKenneth E. Jansen
38759599516SKenneth E. Jansen
38859599516SKenneth E. Jansenc
38959599516SKenneth E. Jansenc.... set traction BCs for modeled walls
39059599516SKenneth E. Jansenc
39159599516SKenneth E. Jansen            if (itwmod.ne.0) then   !wallfn check
39259599516SKenneth E. Jansen               call asbwmod(yold,   acold,   x,      BC,     iBC,
39359599516SKenneth E. Jansen     &                      iper,   ilwork,  ifath,  velbar)
39459599516SKenneth E. Jansen            endif
39559599516SKenneth E. Jansenc
39659599516SKenneth E. Jansenc.... -----------------------> predictor phase <-----------------------
39759599516SKenneth E. Jansenc
39859599516SKenneth E. Jansen            call itrPredict(   yold,    acold,    y,   ac )
39959599516SKenneth E. Jansen            call itrBC (y,  ac,  iBC,  BC,  iper, ilwork)
40059599516SKenneth E. Jansen            isclr = zero
40159599516SKenneth E. Jansen            if (nsclr.gt.zero) then
40259599516SKenneth E. Jansen            do isclr=1,nsclr
40359599516SKenneth E. Jansen               call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
40459599516SKenneth E. Jansen            enddo
40559599516SKenneth E. Jansen            endif
40659599516SKenneth E. Jansenc
40759599516SKenneth E. Jansenc.... --------------------> multi-corrector phase <--------------------
40859599516SKenneth E. Jansenc
40959599516SKenneth E. Jansen           iter=0
41059599516SKenneth E. Jansen            ilss=0  ! this is a switch thrown on first solve of LS redistance
41159599516SKenneth E. Jansenc
41259599516SKenneth E. JansencHACK to make it keep solving RANS until tolerance is reached
41359599516SKenneth E. Jansenc
41459599516SKenneth E. Jansen       istop=0
415513954efSKenneth E. Jansen! blocking extra RANS steps for now       iMoreRANS=0
416513954efSKenneth E. Jansen       iMoreRANS=6
41759599516SKenneth E. Jansenc
41859599516SKenneth E. Jansenc find the the RANS portion of the sequence
41959599516SKenneth E. Jansenc
42059599516SKenneth E. Jansen       do istepc=1,seqsize
42159599516SKenneth E. Jansen          if(stepseq(istepc).eq.10) iLastRANS=istepc
42259599516SKenneth E. Jansen       enddo
42359599516SKenneth E. Jansen
42459599516SKenneth E. Jansen       iseqStart=1
42559599516SKenneth E. Jansen9876   continue
42659599516SKenneth E. Jansenc
42759599516SKenneth E. Jansen            do istepc=iseqStart,seqsize
42859599516SKenneth E. Jansen               icode=stepseq(istepc)
42959599516SKenneth E. Jansen               if(mod(icode,10).eq.0) then ! this is a solve
43059599516SKenneth E. Jansen                  isolve=icode/10
43159599516SKenneth E. Jansen                  if(isolve.eq.0) then   ! flow solve (encoded as 0)
43259599516SKenneth E. Jansenc
43359599516SKenneth E. Jansen                     etol=epstol(1)
43459599516SKenneth E. Jansen                     iter   = iter+1
43559599516SKenneth E. Jansen                     ifuncs(1)  = ifuncs(1) + 1
43659599516SKenneth E. Jansenc
43759599516SKenneth E. Jansenc.... reset the aerodynamic forces
43859599516SKenneth E. Jansenc
43959599516SKenneth E. Jansen                     Force(1) = zero
44059599516SKenneth E. Jansen                     Force(2) = zero
44159599516SKenneth E. Jansen                     Force(3) = zero
44259599516SKenneth E. Jansen                     HFlux    = zero
44359599516SKenneth E. Jansenc
44459599516SKenneth E. Jansenc.... form the element data and solve the matrix problem
44559599516SKenneth E. Jansenc
44659599516SKenneth E. Jansenc.... explicit solver
44759599516SKenneth E. Jansenc
44859599516SKenneth E. Jansen                     if (impl(itseq) .eq. 0) then
44959599516SKenneth E. Jansen                        if (myrank .eq. master)
45059599516SKenneth E. Jansen     &                       call error('itrdrv  ','impl ',impl(itseq))
45159599516SKenneth E. Jansen                     endif
45259599516SKenneth E. Jansen                     if (mod(impl(1),100)/10 .eq. 1) then  ! sparse solve
45359599516SKenneth E. Jansenc
45459599516SKenneth E. Jansenc.... preconditioned sparse matrix GMRES solver
45559599516SKenneth E. Jansenc
45659599516SKenneth E. Jansen                        lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
45759599516SKenneth E. Jansen                        iprec=lhs
45859599516SKenneth E. Jansen                        nedof = nflow*nshape
45959599516SKenneth E. Jansenc                        write(*,*) 'lhs=',lhs
460513954efSKenneth E. Jansen                    if(usingpetsc.eq.1) then
46117860365SKenneth E. Jansen#if (HAVE_PETSC)
462513954efSKenneth E. Jansen               call SolGMRp (y,             ac,            yold,
463513954efSKenneth E. Jansen     &                       x,
464513954efSKenneth E. Jansen     &                       iBC,           BC,
465513954efSKenneth E. Jansen     &                       colm,          rowp,          lhsk,
466513954efSKenneth E. Jansen     &                       res,
467513954efSKenneth E. Jansen     &                       BDiag,
468513954efSKenneth E. Jansen     &                       iper,          ilwork,
469513954efSKenneth E. Jansen     &                       shp,           shgl,
470513954efSKenneth E. Jansen     &                       shpb,          shglb,         solinc,
471513954efSKenneth E. Jansen     &                       rerr,          fncorp )
47217860365SKenneth E. Jansen#else
47379f1763eSKenneth E. Jansen                     if(myrank.eq.0) write(*,*) 'exiting because run time input asked for PETSc, not linked in exec'
47417860365SKenneth E. Jansen                     call error('itrdrv  ','noPETSc',usingpetsc)
47517860365SKenneth E. Jansen#endif
476513954efSKenneth E. Jansen                     else
47759599516SKenneth E. Jansen                      call SolGMRs (y,             ac,            yold,
47859599516SKenneth E. Jansen     &                       acold,         x,
47959599516SKenneth E. Jansen     &                       iBC,           BC,
48059599516SKenneth E. Jansen     &                       colm,          rowp,          lhsk,
48159599516SKenneth E. Jansen     &                       res,
482e72fd12cSBen Matthews     &                       BDiag,         hBrg,          eBrg,
483e72fd12cSBen Matthews     &                       yBrg,          Rcos,          Rsin,
48459599516SKenneth E. Jansen     &                       iper,          ilwork,
48559599516SKenneth E. Jansen     &                       shp,           shgl,
48659599516SKenneth E. Jansen     &                       shpb,          shglb,         solinc,
48759599516SKenneth E. Jansen     &                       rerr)
488513954efSKenneth E. Jansen                    endif
48959599516SKenneth E. Jansen                      else if (mod(impl(1),100)/10 .eq. 2) then ! mfg solve
49059599516SKenneth E. Jansenc
49159599516SKenneth E. Jansenc.... preconditioned matrix-free GMRES solver
49259599516SKenneth E. Jansenc
49359599516SKenneth E. Jansen                        lhs=0
49459599516SKenneth E. Jansen                        iprec = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
49559599516SKenneth E. Jansen                        nedof = 0
49659599516SKenneth E. Jansen                        call SolMFG (y,             ac,            yold,
49759599516SKenneth E. Jansen     &                       acold,         x,
49859599516SKenneth E. Jansen     &                       iBC,           BC,
49959599516SKenneth E. Jansen     &                       res,
500e72fd12cSBen Matthews     &                       BDiag,         HBrg,          eBrg,
501e72fd12cSBen Matthews     &                       yBrg,          Rcos,          Rsin,
50259599516SKenneth E. Jansen     &                       iper,          ilwork,
50359599516SKenneth E. Jansen     &                       shp,           shgl,
50459599516SKenneth E. Jansen     &                       shpb,          shglb,         solinc,
50559599516SKenneth E. Jansen     &                       rerr)
50659599516SKenneth E. Jansenc
50759599516SKenneth E. Jansen                     else if (mod(impl(1),100)/10 .eq. 3) then ! ebe solve
50859599516SKenneth E. Jansenc.... preconditioned ebe matrix GMRES solver
50959599516SKenneth E. Jansenc
51059599516SKenneth E. Jansen
51159599516SKenneth E. Jansen                        lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
51259599516SKenneth E. Jansen                        iprec = lhs
51359599516SKenneth E. Jansen                        nedof = nflow*nshape
51459599516SKenneth E. Jansenc                        write(*,*) 'lhs=',lhs
51559599516SKenneth E. Jansen                      call SolGMRe (y,             ac,            yold,
51659599516SKenneth E. Jansen     &                       acold,         x,
51759599516SKenneth E. Jansen     &                       iBC,           BC,
51859599516SKenneth E. Jansen     &                       EGmass,        res,
519e72fd12cSBen Matthews     &                       BDiag,         HBrg,          eBrg,
520e72fd12cSBen Matthews     &                       yBrg,          Rcos,          Rsin,
52159599516SKenneth E. Jansen     &                       iper,          ilwork,
52259599516SKenneth E. Jansen     &                       shp,           shgl,
52359599516SKenneth E. Jansen     &                       shpb,          shglb,         solinc,
52459599516SKenneth E. Jansen     &                       rerr)
52559599516SKenneth E. Jansen                     endif
52659599516SKenneth E. Jansenc
52759599516SKenneth E. Jansen                else          ! solve a scalar  (encoded at isclr*10)
52859599516SKenneth E. Jansen                     isclr=isolve
529513954efSKenneth E. Jansen                     etol=epstol(isclr+2) ! note that for both epstol and LHSupd 1 is flow 2 temp isclr+2 for scalars
530513954efSKenneth E. Jansen                     ifuncs(isclr+2)  = ifuncs(isclr+2) + 1
53159599516SKenneth E. Jansen                     if((iLSet.eq.2).and.(ilss.eq.0)
53259599516SKenneth E. Jansen     &                    .and.(isclr.eq.2)) then
53359599516SKenneth E. Jansen                        ilss=1  ! throw switch (once per step)
53459599516SKenneth E. Jansenc
53559599516SKenneth E. Jansenc... copy the first scalar at t=n+1 into the second scalar of the
53659599516SKenneth E. Jansenc... level sets
53759599516SKenneth E. Jansenc
53859599516SKenneth E. Jansen                     y(:,6)    = yold(:,6)  + (y(:,6)-yold(:,6))/alfi
53959599516SKenneth E. Jansen                     y(:,7)    =  y(:,6)
54059599516SKenneth E. Jansen                     yold(:,7) = y(:,7)
54159599516SKenneth E. Jansen                     ac(:,7)   = zero
54259599516SKenneth E. Jansenc
54359599516SKenneth E. Jansen                     call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
54459599516SKenneth E. Jansenc
54559599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the
54659599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar
54759599516SKenneth E. Jansenc
54859599516SKenneth E. Jansen                        alfit=alfi
54959599516SKenneth E. Jansen                        gamit=gami
55059599516SKenneth E. Jansen                        almit=almi
55159599516SKenneth E. Jansen                        alfi = 1
55259599516SKenneth E. Jansen                        gami = 1
55359599516SKenneth E. Jansen                        almi = 1
55459599516SKenneth E. Jansen                     endif
55559599516SKenneth E. Jansenc
55659599516SKenneth E. Jansen                     lhs = 1 - min(1,mod(ifuncs(isclr+2)-1,
55759599516SKenneth E. Jansen     &                                       LHSupd(isclr+2)))
55859599516SKenneth E. Jansen                     iprec = lhs
55959599516SKenneth E. Jansen                     istop=0
560513954efSKenneth E. Jansen                 if(usingPETSc.eq.1) then
56117860365SKenneth E. Jansen#if (HAVE_PETSC)
562513954efSKenneth E. Jansen                     call SolGMRpSclr(y,             ac,
563513954efSKenneth E. Jansen     &                    x,             elDw,
564513954efSKenneth E. Jansen     &                    iBC,           BC,
565513954efSKenneth E. Jansen     &                    colm,           rowp,
566513954efSKenneth E. Jansen     &                    iper,          ilwork,
567513954efSKenneth E. Jansen     &                    shp,           shgl,
568513954efSKenneth E. Jansen     &                    shpb,          shglb,     rest,
569513954efSKenneth E. Jansen     &                    solinc(1,isclr+5),fncorp)
57017860365SKenneth E. Jansen#else
57117860365SKenneth E. Jansen                     write(*,*) 'exiting because run time input asked for PETSc, not linked in exec'
57217860365SKenneth E. Jansen                     call error('itrdrv  ','noPETSc',usingpetsc)
57317860365SKenneth E. Jansen#endif
574513954efSKenneth E. Jansen                 else
57559599516SKenneth E. Jansen                     call SolGMRSclr(y,             ac,         yold,
57659599516SKenneth E. Jansen     &                    acold,         EGmasst(1,isclr),
57759599516SKenneth E. Jansen     &                    x,             elDw,
57859599516SKenneth E. Jansen     &                    iBC,           BC,
57959599516SKenneth E. Jansen     &                    rest,
580e72fd12cSBen Matthews     &                    HBrg,          eBrg,
581e72fd12cSBen Matthews     &                    yBrg,          Rcos,      Rsin,
58259599516SKenneth E. Jansen     &                    iper,          ilwork,
58359599516SKenneth E. Jansen     &                    shp,           shgl,
58459599516SKenneth E. Jansen     &                    shpb,          shglb, solinc(1,isclr+5))
585513954efSKenneth E. Jansen                  endif
58659599516SKenneth E. Jansenc
58759599516SKenneth E. Jansen                  endif         ! end of scalar type solve
58859599516SKenneth E. Jansenc
58959599516SKenneth E. Jansenc
59059599516SKenneth E. Jansenc.... end of the multi-corrector loop
59159599516SKenneth E. Jansenc
59259599516SKenneth E. Jansen 1000             continue      !check this
59359599516SKenneth E. Jansen
59459599516SKenneth E. Jansen               else             ! this is an update  (mod did not equal zero)
59559599516SKenneth E. Jansen                  iupdate=icode/10 ! what to update
59659599516SKenneth E. Jansen                  if(iupdate.eq.0) then !update flow
59759599516SKenneth E. Jansen                     call itrCorrect ( y, ac, yold, acold, solinc)
59859599516SKenneth E. Jansen                     call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
59959599516SKenneth E. Jansen                     call tnanq(y, 5, 'y_updbc')
60059599516SKenneth E. Jansenc Elaine-SPEBC
60159599516SKenneth E. Jansen                     if((irscale.ge.0).and.(myrank.eq.master)) then
60259599516SKenneth E. Jansen                        call genscale(y, x, iBC)
60359599516SKenneth E. Jansenc                       call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
60459599516SKenneth E. Jansen                     endif
60559599516SKenneth E. Jansen                  else          ! update scalar
60659599516SKenneth E. Jansen                     isclr=iupdate !unless
60759599516SKenneth E. Jansen                     if(iupdate.eq.nsclr+1) isclr=0
60859599516SKenneth E. Jansen                     call itrCorrectSclr ( y, ac, yold, acold,
60959599516SKenneth E. Jansen     &                                     solinc(1,isclr+5))
61059599516SKenneth E. Jansen                     if (ilset.eq.2 .and. isclr.eq.2)  then
61159599516SKenneth E. Jansen                        fct2=one/almi
61259599516SKenneth E. Jansen                        fct3=one/alfi
61359599516SKenneth E. Jansen                        acold(:,7) = acold(:,7)
61459599516SKenneth E. Jansen     &                             + (ac(:,7)-acold(:,7))*fct2
61559599516SKenneth E. Jansen                        yold(:,7)  = yold(:,7)
61659599516SKenneth E. Jansen     &                             + (y(:,7)-yold(:,7))*fct3
61759599516SKenneth E. Jansen                        call itrBCSclr (  yold,  acold,  iBC,  BC,
61859599516SKenneth E. Jansen     &                                    iper,  ilwork)
61959599516SKenneth E. Jansen                        ac(:,7) = acold(:,7)*(one-almi/gami)
62059599516SKenneth E. Jansen                        y(:,7)  = yold(:,7)
62159599516SKenneth E. Jansen                        ac(:,7) = zero
62259599516SKenneth E. Jansen                        if (ivconstraint .eq. 1) then
62359599516SKenneth E. Jansen     &
62459599516SKenneth E. Jansenc ... applying the volume constraint
62559599516SKenneth E. Jansenc
62659599516SKenneth E. Jansen                           call solvecon (y,    x,      iBC,  BC,
62759599516SKenneth E. Jansen     &                                    iper, ilwork, shp,  shgl)
62859599516SKenneth E. Jansenc
62959599516SKenneth E. Jansen                        endif   ! end of volume constraint calculations
63059599516SKenneth E. Jansen                     endif
63159599516SKenneth E. Jansen                     call itrBCSclr (  y,  ac,  iBC,  BC, iper, ilwork)
63259599516SKenneth E. Jansen                  endif
63359599516SKenneth E. Jansen               endif            !end of switch between solve or update
63459599516SKenneth E. Jansen            enddo               ! loop over sequence in step
63559599516SKenneth E. Jansen        if((istop.lt.0).and.(iMoreRANS.lt.5)) then
63659599516SKenneth E. Jansen            iMoreRANS=iMoreRANS+1
637513954efSKenneth E. Jansen            if(myrank.eq.master) write(*,*) 'istop =', istop
63859599516SKenneth E. Jansen       iseqStart=iLastRANS
63959599516SKenneth E. Jansen       goto 9876
64059599516SKenneth E. Jansen       endif
64159599516SKenneth E. Jansenc
64259599516SKenneth E. Jansenc     Find the solution at the end of the timestep and move it to old
64359599516SKenneth E. Jansenc
64459599516SKenneth E. Jansenc.... First to reassign the parameters for the original time integrator scheme
64559599516SKenneth E. Jansenc
64659599516SKenneth E. Jansen            if((iLSet.eq.2).and.(ilss.eq.1)) then
64759599516SKenneth E. Jansen               alfi =alfit
64859599516SKenneth E. Jansen               gami =gamit
64959599516SKenneth E. Jansen               almi =almit
65059599516SKenneth E. Jansen            endif
65159599516SKenneth E. Jansen            call itrUpdate( yold,  acold,   y,    ac)
65259599516SKenneth E. Jansen            call itrBC (yold, acold,  iBC,  BC, iper,ilwork)
65359599516SKenneth E. Jansenc Elaine-SPEBC
65459599516SKenneth E. Jansen            if((irscale.ge.0).and.(myrank.eq.master)) then
65559599516SKenneth E. Jansen                call genscale(yold, x, iBC)
65659599516SKenneth E. Jansenc               call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
65759599516SKenneth E. Jansen            endif
65859599516SKenneth E. Jansen            do isclr=1,nsclr
65959599516SKenneth E. Jansen               call itrBCSclr (yold, acold,  iBC, BC, iper, ilwork)
66059599516SKenneth E. Jansen            enddo
66159599516SKenneth E. Jansenc
66259599516SKenneth E. Jansen            istep = istep + 1
66359599516SKenneth E. Jansen            lstep = lstep + 1
66459599516SKenneth E. Jansen            ntoutv=max(ntout,100)
665513954efSKenneth E. Jansen            !boundary flux output moved after the error calculation so
666513954efSKenneth E. Jansen            !everything can be written out in a single chunk of code -
667513954efSKenneth E. Jansen            !Nicholas Mati
66859599516SKenneth E. Jansen
669513954efSKenneth E. Jansen            !dump TIME SERIES
67059599516SKenneth E. Jansen            if (exts) then
671513954efSKenneth E. Jansen              !Write the probe data to disc. Note that IO to disc only
672513954efSKenneth E. Jansen              !occurs when mod(lstep, nbuff) == 0. However, this
673513954efSKenneth E. Jansen              !function also does data buffering and must be called
674513954efSKenneth E. Jansen              !every time step.
675513954efSKenneth E. Jansen              call TD_bufferData()
676513954efSKenneth E. Jansen              call TD_writeData(fvarts, .false.)
67759599516SKenneth E. Jansen            endif
67859599516SKenneth E. Jansen
679513954efSKenneth E. Jansen            !Update the Mach Control
680513954efSKenneth E. Jansen            if(exts .and. exMC) then
681513954efSKenneth E. Jansen              !Note: the function MC_updateState must be called after
682513954efSKenneth E. Jansen              !the function TD_bufferData due to dependencies on
683513954efSKenneth E. Jansen              !vartsbuff(:,:,:).
684513954efSKenneth E. Jansen              call MC_updateState()
685513954efSKenneth E. Jansen              call MC_applyBC(BC)
686513954efSKenneth E. Jansen              call MC_printState()
68759599516SKenneth E. Jansen
688513954efSKenneth E. Jansen              !Write the state if a restart is also being written.
689513954efSKenneth E. Jansen              if(mod(lstep,ntout).eq.0 ) call MC_writeState(lstep)
690513954efSKenneth E. Jansen            endif
69159599516SKenneth E. Jansen
692513954efSKenneth E. Jansen            !update blower control
693513954efSKenneth E. Jansen            if(BC_enable) then
694513954efSKenneth E. Jansen              !Update the blower boundary conditions for the next
695513954efSKenneth E. Jansen              !iteration.
696513954efSKenneth E. Jansen              call BC_iter(BC)
69759599516SKenneth E. Jansen
698513954efSKenneth E. Jansen              !Also write the current phases of the blowers if a
699513954efSKenneth E. Jansen              !restart is also being written.
700513954efSKenneth E. Jansen              if(mod(lstep, ntout) == 0) call BC_writePhase(lstep)
701513954efSKenneth E. Jansen            endif
70259599516SKenneth E. Jansen
703513954efSKenneth E. Jansen            !.... Yi Chen Duct geometry8
704513954efSKenneth E. Jansen            if(isetBlowing_Duct.gt.0)then
705513954efSKenneth E. Jansen              if(ifixBlowingVel_Duct.eq.0)then
706513954efSKenneth E. Jansen                if(nstp.gt.nBlowingStepsDuct)then
707513954efSKenneth E. Jansen                  nBlowingStepsDuct = nstp-2
708513954efSKenneth E. Jansen                endif
709513954efSKenneth E. Jansen                call setBlowing_Duct2(x,BC,yold,iTurbWall,istp)
71059599516SKenneth E. Jansen              endif
71159599516SKenneth E. Jansen            endif
712513954efSKenneth E. Jansen          !... Yi Chen Duct geometry8
71359599516SKenneth E. Jansen
71459599516SKenneth E. Jansenc
71559599516SKenneth E. Jansenc.... -------------------> error calculation  <-----------------
71659599516SKenneth E. Jansen            if(ierrcalc.eq.1.or.ioybar.eq.1) then
71759599516SKenneth E. Jansen               tfact=one/istep
71859599516SKenneth E. Jansen               do idof=1,ndof
71959599516SKenneth E. Jansen                 ybar(:,idof) =tfact*yold(:,idof) +
72059599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,idof)
72159599516SKenneth E. Jansen               enddo
72259599516SKenneth E. Jansenc....compute average
72359599516SKenneth E. Jansenc...  ybar(:,ndof+1:ndof+8) is for avg. of square as uu, vv, ww, pp, TT, uv, uw, and vw
72459599516SKenneth E. Jansen               do idof=1,5 ! avg. of square for 5 flow variables
72559599516SKenneth E. Jansen                   ybar(:,ndof+idof) = tfact*yold(:,idof)**2 +
72659599516SKenneth E. Jansen     &                             (one-tfact)*ybar(:,ndof+idof)
72759599516SKenneth E. Jansen               enddo
72859599516SKenneth E. Jansen               ybar(:,ndof+6) = tfact*yold(:,1)*yold(:,2) + !uv
72959599516SKenneth E. Jansen     &                          (one-tfact)*ybar(:,ndof+6)
73059599516SKenneth E. Jansen               ybar(:,ndof+7) = tfact*yold(:,1)*yold(:,3) + !uw
73159599516SKenneth E. Jansen     &                          (one-tfact)*ybar(:,ndof+7)
73259599516SKenneth E. Jansen               ybar(:,ndof+8) = tfact*yold(:,2)*yold(:,3) + !vw
73359599516SKenneth E. Jansen     &                          (one-tfact)*ybar(:,ndof+8)
73459599516SKenneth E. Jansenc... compute err
735f0b806cbSKenneth E. Jansenc hack ShockError
736f0b806cbSKenneth E. Jansenc
737f0b806cbSKenneth E. Jansen               errmax=maxval(rerr(:,6))
738f0b806cbSKenneth E. Jansen               errswitch=0.1*errmax
7390d39a63aSKenneth E. Jansen!
7400d39a63aSKenneth E. Jansen! note this scalefactor will govern the thickness of the refinement band around the shock.
7410d39a63aSKenneth E. Jansen! Higher values make it thinner (less refinement), lower -> thicker
7420d39a63aSKenneth E. Jansen! what is below is specific to SAM adapt's expectation to adapt when the 6th field is > 1.0e-6
7430d39a63aSKenneth E. Jansen! note also that this field was altered in e3.f and e3ls.f to no longer be the traditional error
7440d39a63aSKenneth E. Jansen! indicator, rather it is based on element jump of Temperature to identify shocks
7450d39a63aSKenneth E. Jansen!
746f0b806cbSKenneth E. Jansen               where(rerr(:,6).gt.errswitch)
747f0b806cbSKenneth E. Jansen                    rerr(:,6)=1.0
748f0b806cbSKenneth E. Jansen               elsewhere
749f0b806cbSKenneth E. Jansen                    rerr(:,6)=1e-10
750f0b806cbSKenneth E. Jansen               endwhere
751513954efSKenneth E. Jansen               rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2
752513954efSKenneth E. Jansen               rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2
753513954efSKenneth E. Jansen               rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2
754513954efSKenneth E. Jansen               rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2
75559599516SKenneth E. Jansen            endif
756513954efSKenneth E. Jansen
757513954efSKenneth E. Jansenc.. writing ybar field if requested in each restart file
758513954efSKenneth E. Jansen
759513954efSKenneth E. Jansen            !here is where we save our averaged field.  In some cases we want to
760513954efSKenneth E. Jansen            !write it less frequently
761513954efSKenneth E. Jansen            if( (irs >= 1) .and. (
762513954efSKenneth E. Jansen     &        mod(lstep, ntout) == 0 .or. !Checkpoint
763513954efSKenneth E. Jansen     &        istep == nstp) )then        !End of simulation
764f0b806cbSKenneth E. Jansen              if(output_mode .eq. -1 ) then ! this is an in-memory adapt case
765f0b806cbSKenneth E. Jansen                if(istep == nstp) then ! go ahead and take care of it
766f0b806cbSKenneth E. Jansen                  call checkpoint (nstp,yold, acold, ybar, rerr,  velbar,
767f0b806cbSKenneth E. Jansen     &                       x, iper, ilwork, shp, shgl, iBC )
768513954efSKenneth E. Jansen                endif
769f0b806cbSKenneth E. Jansen                if(ntout.le.lstep) then ! user also wants file output
770f0b806cbSKenneth E. Jansen                  output_mode=0
771f0b806cbSKenneth E. Jansen                  call checkpoint (nstp,yold, acold, ybar, rerr,  velbar,
772f0b806cbSKenneth E. Jansen     &                       x, iper, ilwork, shp, shgl, iBC )
773f0b806cbSKenneth E. Jansen                  output_mode=-1 ! reset to stream
774513954efSKenneth E. Jansen                endif
775f0b806cbSKenneth E. Jansen              else
776f0b806cbSKenneth E. Jansen                call checkpoint (nstp,yold, acold, ybar, rerr,  velbar,
777f0b806cbSKenneth E. Jansen     &                       x, iper, ilwork, shp, shgl, iBC )
778513954efSKenneth E. Jansen              endif
779513954efSKenneth E. Jansen             endif
780513954efSKenneth E. Jansen
781513954efSKenneth E. Jansen 2000    continue  !end of NSTEP loop
78259599516SKenneth E. Jansen 2001    continue
78359599516SKenneth E. Jansen
78459599516SKenneth E. Jansen         ttim(1) = REAL(secs(0.0)) / 100. - ttim(1)
78559599516SKenneth E. Jansen         ttim(2) = secs(0.0)              - ttim(2)
78659599516SKenneth E. Jansen
78759599516SKenneth E. Jansenc         tcorecp2 = REAL(secs(0.0)) / 100.
78859599516SKenneth E. Jansenc         tcorewc2 = secs(0.0)
78959599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
790513954efSKenneth E. Jansen         if(myrank.eq.master)  then
79159599516SKenneth E. Jansen            tcorecp2 = TMRC()
79259599516SKenneth E. Jansen            write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1
79359599516SKenneth E. Jansen         endif
79459599516SKenneth E. Jansen
79559599516SKenneth E. Jansenc     call wtime
79659599516SKenneth E. Jansen
79775f1c48cSCameron Smith      call destroyWallData
79892e15685SCameron Smith      call destroyfncorp
79975f1c48cSCameron Smith
800513954efSKenneth E. Jansen 3000 continue !end of NTSEQ loop
80159599516SKenneth E. Jansenc
80259599516SKenneth E. Jansenc.... ---------------------->  Post Processing  <----------------------
80359599516SKenneth E. Jansenc
80459599516SKenneth E. Jansenc.... print out the last step
80559599516SKenneth E. Jansenc
806513954efSKenneth E. Jansen!      if ( (irs .ge. 1) .and. ((mod(lstep, ntout) .ne. 0) .or.
807513954efSKenneth E. Jansen!     &    (nstp .eq. 0))) then
808513954efSKenneth E. Jansen!          if( (mod(lstep, ntoutv) .eq. 0) .and.
809513954efSKenneth E. Jansen!     &        ((irscale.ge.0).or.(itwmod.gt.0) .or.
810513954efSKenneth E. Jansen!     &        ((nsonmax.eq.1).and.(iLES.gt.0))))
811513954efSKenneth E. Jansen!     &        call rwvelb  ('out ',  velbar  ,ifail)
812513954efSKenneth E. Jansen!
813513954efSKenneth E. Jansen!          call Bflux  (yold,  acold,     x,
814513954efSKenneth E. Jansen!     &         shp,           shgl,      shpb,
815513954efSKenneth E. Jansen!     &         shglb,         nodflx,    ilwork)
816513954efSKenneth E. Jansen!      endif
81759599516SKenneth E. Jansen
818513954efSKenneth E. Jansen
819513954efSKenneth E. Jansen
820513954efSKenneth E. Jansenc      if(ioybar.eq.1) then
821513954efSKenneth E. Jansenc         call write_field(myrank,'a'//char(0),'ybar'//char(0),4,
822513954efSKenneth E. Jansenc     &                      ybar,'d'//char(0),nshg,ndof+8,lstep)
823513954efSKenneth E. Jansenc      endif
824513954efSKenneth E. Jansen
825513954efSKenneth E. Jansenc     if(iRANS.lt.0 .and. idistcalc.eq.1) then
826513954efSKenneth E. Jansenc        call write_field(myrank,'a'//char(0),'DESd'//char(0),4,
827513954efSKenneth E. Jansenc     &                      elDw,'d'//char(0),numel,1,lstep)
82859599516SKenneth E. Jansenc
829513954efSKenneth E. Jansenc         call write_field(myrank,'a'//char(0),'dwal'//char(0),4,
830513954efSKenneth E. Jansenc     &                    d2wall,'d'//char(0),nshg,1,lstep)
831513954efSKenneth E. Jansenc     endif
83259599516SKenneth E. Jansen
83359599516SKenneth E. Jansenc
83459599516SKenneth E. Jansenc.... close history and aerodynamic forces files
83559599516SKenneth E. Jansenc
83659599516SKenneth E. Jansen      if (myrank .eq. master) then
83759599516SKenneth E. Jansen         close (ihist)
83859599516SKenneth E. Jansen         close (iforce)
839513954efSKenneth E. Jansen
840513954efSKenneth E. Jansen         if(exMC) then
841513954efSKenneth E. Jansen           call MC_writeState(lstep)
842513954efSKenneth E. Jansen           call MC_finalize
843513954efSKenneth E. Jansen         endif
844513954efSKenneth E. Jansen
84559599516SKenneth E. Jansen         if(exts) then
846513954efSKenneth E. Jansen           call TD_writeData(fvarts, .true.)    !force the flush of the buffer.
847513954efSKenneth E. Jansen           call TD_finalize
84859599516SKenneth E. Jansen         endif
84959599516SKenneth E. Jansen      endif
850513954efSKenneth E. Jansen
851513954efSKenneth E. Jansen      if(BC_enable) then  !blower is allocated on all processes.
852513954efSKenneth E. Jansen        if(mod(lstep, ntout) /= 0) then !May have already written file.
853513954efSKenneth E. Jansen           call BC_writePhase(lstep)
854513954efSKenneth E. Jansen        endif
855513954efSKenneth E. Jansen
856513954efSKenneth E. Jansen        call BC_finalize
857513954efSKenneth E. Jansen      endif
858513954efSKenneth E. Jansen
85959599516SKenneth E. Jansen      close (iecho)
86059599516SKenneth E. Jansen      if(iabc==1) deallocate(acs)
86159599516SKenneth E. Jansenc
86259599516SKenneth E. Jansenc.... end
86359599516SKenneth E. Jansenc
86459599516SKenneth E. Jansen      return
86559599516SKenneth E. Jansen      end
866513954efSKenneth E. Jansen
867f0b806cbSKenneth E. Jansen      subroutine checkpoint (nstp,yold, acold, ybar, rerr,  velbar,
868f0b806cbSKenneth E. Jansen     &                       x, iper, ilwork, shp, shgl, iBC )
869f0b806cbSKenneth E. Jansenc
870f0b806cbSKenneth E. Jansen      use turbSA
871f0b806cbSKenneth E. Jansen      include "common.h"
872f0b806cbSKenneth E. Jansen      dimension shp(MAXTOP,maxsh,MAXQPT),
873f0b806cbSKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
874f0b806cbSKenneth E. Jansen     &            iper(nshg),              iBC(nshg),
875f0b806cbSKenneth E. Jansen     &            x(nshg,nsd),         ilwork(nlwork)
876f0b806cbSKenneth E. Jansen      real*8  velbar(nfath,ndof),
877f0b806cbSKenneth E. Jansen     &        yold(nshg,ndof),      acold(nshg,ndof),
878f0b806cbSKenneth E. Jansen     &        rerr(nshg,10),        ybar(nshg,ndof+8)
879f0b806cbSKenneth E. Jansen! 8 is for avg. of square as uu, vv, ww, pp, TT, uv, uw, and vw
880f0b806cbSKenneth E. Jansen
881f0b806cbSKenneth E. Jansen      if( (mod(lstep, ntout) .eq. 0) .and.
882f0b806cbSKenneth E. Jansen     &              ((irscale.ge.0).or.(itwmod.gt.0) .or.
883f0b806cbSKenneth E. Jansen     &              ((nsonmax.eq.1).and.(iLES.gt.0))))
884f0b806cbSKenneth E. Jansen     &              call rwvelb  ('out ',  velbar  ,ifail)
885f0b806cbSKenneth E. Jansen
886f0b806cbSKenneth E. Jansen!BUG: need to update new_interface to work with SyncIO.
887f0b806cbSKenneth E. Jansen      !Bflux is presently completely crippled. Note that restar
888f0b806cbSKenneth E. Jansen      !has also been moved here for readability.
889f0b806cbSKenneth E. Jansen!              call Bflux  (yold,          acold,     x,  compute boundary fluxes and print out
890f0b806cbSKenneth E. Jansen!    &              shp,           shgl,      shpb,
891f0b806cbSKenneth E. Jansen!    &              shglb,         nodflx,    ilwork)
892f0b806cbSKenneth E. Jansen
893f0b806cbSKenneth E. Jansen      call timer ('Output  ')      !set up the timer
894f0b806cbSKenneth E. Jansen
895f0b806cbSKenneth E. Jansen      !write the solution and time derivative
896f0b806cbSKenneth E. Jansen      call restar ('out ',  yold, acold)
897f0b806cbSKenneth E. Jansen
898f0b806cbSKenneth E. Jansen      !Write the distance to wall field in each restart
899*b4542ea8SKenneth E. Jansen!      if((istep==nstp) .and. (irans < 0 )) then !d2wall is allocated
900f0b806cbSKenneth E. Jansen                 call write_field(myrank,'a'//char(0),'dwal'//char(0),4,
901f0b806cbSKenneth E. Jansen     &                            d2wall,'d'//char(0), nshg, 1, lstep)
902*b4542ea8SKenneth E. Jansen!      endif
903f0b806cbSKenneth E. Jansen
904f0b806cbSKenneth E. Jansen      !Write the time average in each restart.
905f0b806cbSKenneth E. Jansen      if(ioybar.eq.1)then
906f0b806cbSKenneth E. Jansen                 call write_field(myrank,'a'//char(0),'ybar'//char(0),4,
907f0b806cbSKenneth E. Jansen     &                              ybar,'d'//char(0),nshg,ndof+8,lstep)
908f0b806cbSKenneth E. Jansen      endif
909f0b806cbSKenneth E. Jansen
910f0b806cbSKenneth E. Jansen      !Write the error feild at the end of each step sequence
911f0b806cbSKenneth E. Jansen      if(ierrcalc.eq.1 .and. istep == nstp) then
912f0b806cbSKenneth E. Jansen        !smooth the error indicators
913f0b806cbSKenneth E. Jansen
914f0b806cbSKenneth E. Jansen        do i=1,ierrsmooth
915f0b806cbSKenneth E. Jansen         call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC )
916f0b806cbSKenneth E. Jansen        enddo
917f0b806cbSKenneth E. Jansen
918f0b806cbSKenneth E. Jansen        call write_field( myrank, 'a'//char(0), 'errors'//char(0), 6,
919f0b806cbSKenneth E. Jansen     &                        rerr, 'd'//char(0), nshg, 10, lstep)
920f0b806cbSKenneth E. Jansen      endif
921f0b806cbSKenneth E. Jansen
922f0b806cbSKenneth 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
923f0b806cbSKenneth E. Jansenc
924f0b806cbSKenneth E. Jansenc              call write_field2(myrank,'a'//char(0),'ybar'//char(0),
925f0b806cbSKenneth E. Jansenc     &                          4,ybar,'d'//char(0),nshg,ndof+8,
926f0b806cbSKenneth E. Jansenc     &                         lstep,istep)
927f0b806cbSKenneth E. Jansenc
928f0b806cbSKenneth E. Jansenc.... end
929f0b806cbSKenneth E. Jansenc
930f0b806cbSKenneth E. Jansen      return
931f0b806cbSKenneth E. Jansen      end
932513954efSKenneth E. Jansen
933