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