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