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 18059599516SKenneth E. Jansen if (mod(impl(1),100)/10 .eq. 3) then 18159599516SKenneth E. Jansenc 18259599516SKenneth E. Jansenc generate the ebe data fill vectors 18359599516SKenneth E. Jansenc 18459599516SKenneth E. Jansen nedof=nflow*nshape 18559599516SKenneth E. Jansen allocate (EGmass(numel,nedof*nedof)) 18659599516SKenneth E. Jansen endif 18759599516SKenneth E. Jansen 18859599516SKenneth E. Jansenc.......................................... 18959599516SKenneth E. Jansen rerr = zero 19059599516SKenneth E. Jansen ybar(:,1:ndof) = y(:,1:ndof) 19159599516SKenneth E. Jansen do idof=1,5 19259599516SKenneth E. Jansen ybar(:,ndof+idof) = y(:,idof)*y(:,idof) 19359599516SKenneth E. Jansen enddo 19459599516SKenneth E. Jansen ybar(:,ndof+6) = y(:,1)*y(:,2) 19559599516SKenneth E. Jansen ybar(:,ndof+7) = y(:,1)*y(:,3) 19659599516SKenneth E. Jansen ybar(:,ndof+8) = y(:,2)*y(:,3) 19759599516SKenneth E. Jansenc......................................... 19859599516SKenneth E. Jansen 199513954efSKenneth E. Jansen! change the freestream and inflow eddy viscosity to reflect different 200513954efSKenneth E. Jansen! levels of freestream turbulence 201513954efSKenneth E. Jansen! 202513954efSKenneth E. Jansen! First override boundary condition values 203513954efSKenneth E. Jansen! USES imapInlet from Mach Control so if that gets conditionaled away 204513954efSKenneth E. Jansen! it has to know if it is needed here 205513954efSKenneth E. Jansen! 206513954efSKenneth E. Jansen if(isetEV_IC_BC.eq.1) then 207513954efSKenneth E. Jansen allocate(vortG(nshg, 4)) 208513954efSKenneth E. Jansen call vortGLB(yold, x, shp, shgl, ilwork, vortG) 209513954efSKenneth 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 210513954efSKenneth E. Jansen write(*,*) "vortmax = ", vortmax 21159599516SKenneth E. Jansen 212513954efSKenneth E. Jansen !Find the maximum shear in the simulation 213513954efSKenneth E. Jansen if(numpe.gt.1) then 214513954efSKenneth E. Jansen call MPI_ALLREDUCE(vortmax, vortmaxg, 1, 215513954efSKenneth E. Jansen & MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr ) 216513954efSKenneth E. Jansen vortmax = vortmaxg 217513954efSKenneth E. Jansen endif 21859599516SKenneth E. Jansen 219513954efSKenneth E. Jansen !Apply eddy viscosity at the inlet 220513954efSKenneth E. Jansen do i=1,icountInlet ! for now only coded to catch primary inlet, not blower 221513954efSKenneth E. Jansen BC(imapInlet(i),7)=evis_IC_BC 222513954efSKenneth E. Jansen enddo 223513954efSKenneth E. Jansen 224513954efSKenneth E. Jansen !Apply eddy viscosity through the quasi-inviscid portion of the domain 225513954efSKenneth E. Jansen do i = 1,nshg 226513954efSKenneth E. Jansen if(abs(vortG(i,4)).ge.vortmax*0.01) yold(i,6)=evis_IC_BC 227513954efSKenneth E. Jansen enddo 228513954efSKenneth E. Jansen isclr=1 ! fix scalar 229513954efSKenneth E. Jansen call itrBCsclr(yold,ac,iBC,BC,iper,ilwork) 230513954efSKenneth E. Jansen 231513954efSKenneth E. Jansen deallocate(vortG) 232513954efSKenneth E. Jansen endif 23359599516SKenneth E. Jansenc 23459599516SKenneth E. Jansenc.... loop through the time sequences 23559599516SKenneth E. Jansenc 23659599516SKenneth E. Jansen do 3000 itsq = 1, ntseq 23759599516SKenneth E. Jansen itseq = itsq 23859599516SKenneth E. Jansenc 23959599516SKenneth E. Jansenc.... set up the current parameters 24059599516SKenneth E. Jansenc 24159599516SKenneth E. Jansen nstp = nstep(itseq) 24259599516SKenneth E. Jansen nitr = niter(itseq) 24359599516SKenneth E. Jansen LCtime = loctim(itseq) 24459599516SKenneth E. Jansenc 24559599516SKenneth E. Jansen call itrSetup ( y, acold) 24659599516SKenneth E. Jansen isclr=0 24759599516SKenneth E. Jansen 24859599516SKenneth E. Jansen niter(itseq)=0 ! count number of flow solves in a step 24959599516SKenneth E. Jansen ! (# of iterations) 25059599516SKenneth E. Jansen do i=1,seqsize 25159599516SKenneth E. Jansen if(stepseq(i).eq.0) niter(itseq)=niter(itseq)+1 25259599516SKenneth E. Jansen enddo 25359599516SKenneth E. Jansen nitr = niter(itseq) 25459599516SKenneth E. Jansenc 25559599516SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve 25659599516SKenneth E. Jansenc 25759599516SKenneth E. Jansen nsclrsol=nsclr ! total number of scalars solved. At 25859599516SKenneth E. Jansen ! some point we probably want to create 25959599516SKenneth E. Jansen ! a map, considering stepseq(), to find 26059599516SKenneth E. Jansen ! what is actually solved and only 26159599516SKenneth E. Jansen ! dimension EGmasst to the appropriate 26259599516SKenneth E. Jansen ! size. 26359599516SKenneth E. Jansen 26459599516SKenneth E. Jansen if(nsclrsol.gt.0)allocate (EGmasst(numel*nshape*nshape 26559599516SKenneth E. Jansen & ,nsclrsol)) 26659599516SKenneth E. Jansen 26759599516SKenneth E. Jansenc 26859599516SKenneth E. Jansenc.... loop through the time steps 26959599516SKenneth E. Jansenc 27059599516SKenneth E. Jansen ttim(1) = REAL(secs(0.0)) / 100. 27159599516SKenneth E. Jansen ttim(2) = secs(0.0) 27259599516SKenneth E. Jansen 27359599516SKenneth E. Jansenc tcorecp1 = REAL(secs(0.0)) / 100. 27459599516SKenneth E. Jansenc tcorewc1 = secs(0.0) 27559599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 276513954efSKenneth E. Jansen if(myrank.eq.master) then 27759599516SKenneth E. Jansen tcorecp1 = TMRC() 27859599516SKenneth E. Jansen endif 27959599516SKenneth E. Jansen 28059599516SKenneth E. Jansen rmub=datmat(1,2,1) 28159599516SKenneth E. Jansen if(rmutarget.gt.0) then 28259599516SKenneth E. Jansen rmue=rmutarget 28359599516SKenneth E. Jansen xmulfact=(rmue/rmub)**(1.0/nstp) 284513954efSKenneth E. Jansen if(myrank.eq.master) then 28559599516SKenneth E. Jansen write(*,*) 'viscosity will by multiplied by ', xmulfact 28659599516SKenneth E. Jansen write(*,*) 'to bring it from ', rmub,' down to ', rmue 28759599516SKenneth E. Jansen endif 28859599516SKenneth E. Jansen datmat(1,2,1)=datmat(1,2,1)/xmulfact ! make first step right 28959599516SKenneth E. Jansen else 29059599516SKenneth E. Jansen rmue=datmat(1,2,1) ! keep constant 29159599516SKenneth E. Jansen xmulfact=one 29259599516SKenneth E. Jansen endif 29359599516SKenneth E. Jansen if(iramp.eq.1) then 29459599516SKenneth E. Jansen call initBCprofileScale(vbc_prof,BC,yold,x) 29559599516SKenneth E. Jansen! fix the yold values to the reset BC 29659599516SKenneth E. Jansen call itrBC (yold, ac, iBC, BC, iper, ilwork) 29759599516SKenneth E. Jansen isclr=1 ! fix scalar 29859599516SKenneth E. Jansen call itrBCsclr(yold,ac,iBC,BC,iper,ilwork) 29959599516SKenneth E. Jansen endif 3005124a526SKenneth E. Jansenc Time Varying BCs------------------------------------(Kyle W 6-6-13) 3015124a526SKenneth E. Jansenc BCdtKW=0 3025124a526SKenneth E. Jansen if(BCdtKW.gt.0) then 3035124a526SKenneth E. Jansen call BCprofileInitKW(PresBase,VelBase,BC) 3045124a526SKenneth E. Jansen endif 3055124a526SKenneth E. Jansenc Time Varying BCs------------------------------------(Kyle W 6-6-13) 30659599516SKenneth E. Jansen 30759599516SKenneth E. Jansen867 continue 308513954efSKenneth E. Jansen 309513954efSKenneth E. Jansen 310513954efSKenneth E. Jansenc============ Start the loop of time steps============================c 311513954efSKenneth E. Jansen! edamp2=.99 312513954efSKenneth E. Jansen! edamp3=0.05 313513954efSKenneth E. Jansen deltaInlInv=one/(0.125*0.0254) 31459599516SKenneth E. Jansen do 2000 istp = 1, nstp 315f0b806cbSKenneth E. Jansen rerr=zero !extreme limit of 1 step window or error stats....later a variable 316513954efSKenneth E. Jansen 317f0b806cbSKenneth E. Jansen! if (myrank.eq.master) write(*,*) 'Time step of current run', 318f0b806cbSKenneth E. Jansen! & istp 3195124a526SKenneth E. Jansen 3205124a526SKenneth E. Jansenc Time Varying BCs------------------------------------(Kyle W 6-6-13) 3215124a526SKenneth E. Jansen if(BCdtKW.gt.0) then 3225124a526SKenneth E. Jansen call BCprofileScaleKW(PresBase,VelBase,BC,yold) 3235124a526SKenneth E. Jansen endif 3245124a526SKenneth E. Jansenc Time Varying BCs------------------------------------(Kyle W 6-6-13) 325513954efSKenneth E. Jansen 32659599516SKenneth E. Jansen if(iramp.eq.1) 32759599516SKenneth E. Jansen & call BCprofileScale(vbc_prof,BC,yold) 32859599516SKenneth E. Jansen 32959599516SKenneth E. Jansenc call rerun_check(stopjob) 33059599516SKenneth E. Jansencc if(stopjob.ne.0) goto 2001 33159599516SKenneth E. Jansenc 33259599516SKenneth E. Jansenc Decay of scalars 33359599516SKenneth E. Jansenc 33459599516SKenneth E. Jansen if(nsclr.gt.0 .and. tdecay.ne.1) then 33559599516SKenneth E. Jansen yold(:,6:ndof)=y(:,6:ndof)*tdecay 33659599516SKenneth E. Jansen BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*tdecay 33759599516SKenneth E. Jansen endif 33859599516SKenneth E. Jansen 33959599516SKenneth E. Jansen if(nosource.eq.1) BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*0.8 34059599516SKenneth E. Jansen 34159599516SKenneth E. Jansen 34259599516SKenneth E. Jansenc xi=istp*one/nstp 34359599516SKenneth E. Jansenc datmat(1,2,1)=rmub*(1.0-xi)+xi*rmue 34459599516SKenneth E. Jansen datmat(1,2,1)=xmulfact*datmat(1,2,1) 34559599516SKenneth E. Jansen 34659599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC. 34759599516SKenneth E. Jansenc these will be for time step n+1 so use lstep+1 34859599516SKenneth E. Jansenc 34959599516SKenneth E. Jansen if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl, 35059599516SKenneth E. Jansen & shpb, shglb, x, BC, iBC) 35159599516SKenneth E. Jansen 35259599516SKenneth E. Jansen if(iLES.gt.0) then 35359599516SKenneth E. Jansenc 35459599516SKenneth E. Jansenc.... get dynamic model coefficient 35559599516SKenneth E. Jansenc 35659599516SKenneth E. Jansen ilesmod=iLES/10 35759599516SKenneth E. Jansenc 35859599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model 35959599516SKenneth E. Jansenc 36059599516SKenneth E. Jansen if (ilesmod.eq.0) then ! 0 < iLES < 10 => dyn. model calculated 36159599516SKenneth E. Jansen ! at nodes based on discrete filtering 36259599516SKenneth E. Jansen call getdmc (yold, shgl, shp, 36359599516SKenneth E. Jansen & iper, ilwork, nsons, 36459599516SKenneth E. Jansen & ifath, x) 36559599516SKenneth E. Jansen endif 36659599516SKenneth E. Jansen if (ilesmod .eq. 1) then ! 10 < iLES < 20 => dynamic-mixed 36759599516SKenneth E. Jansen ! at nodes based on discrete filtering 36859599516SKenneth E. Jansen call bardmc (yold, shgl, shp, 36959599516SKenneth E. Jansen & iper, ilwork, 37059599516SKenneth E. Jansen & nsons, ifath, x) 37159599516SKenneth E. Jansen endif 37259599516SKenneth E. Jansen if (ilesmod .eq. 2) then ! 20 < iLES < 30 => dynamic at quad 37359599516SKenneth E. Jansen ! pts based on lumped projection filt. 37459599516SKenneth E. Jansen call projdmc (yold, shgl, shp, 37559599516SKenneth E. Jansen & iper, ilwork, x) 37659599516SKenneth E. Jansen endif 37759599516SKenneth E. Jansenc 378513954efSKenneth E. Jansen endif ! endif of iLES 37959599516SKenneth E. Jansen 38059599516SKenneth E. Jansen 38159599516SKenneth E. Jansenc 38259599516SKenneth E. Jansenc.... set traction BCs for modeled walls 38359599516SKenneth E. Jansenc 38459599516SKenneth E. Jansen if (itwmod.ne.0) then !wallfn check 38559599516SKenneth E. Jansen call asbwmod(yold, acold, x, BC, iBC, 38659599516SKenneth E. Jansen & iper, ilwork, ifath, velbar) 38759599516SKenneth E. Jansen endif 38859599516SKenneth E. Jansenc 38959599516SKenneth E. Jansenc.... -----------------------> predictor phase <----------------------- 39059599516SKenneth E. Jansenc 39159599516SKenneth E. Jansen call itrPredict( yold, acold, y, ac ) 39259599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper, ilwork) 39359599516SKenneth E. Jansen isclr = zero 39459599516SKenneth E. Jansen if (nsclr.gt.zero) then 39559599516SKenneth E. Jansen do isclr=1,nsclr 39659599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 39759599516SKenneth E. Jansen enddo 39859599516SKenneth E. Jansen endif 39959599516SKenneth E. Jansenc 40059599516SKenneth E. Jansenc.... --------------------> multi-corrector phase <-------------------- 40159599516SKenneth E. Jansenc 40259599516SKenneth E. Jansen iter=0 40359599516SKenneth E. Jansen ilss=0 ! this is a switch thrown on first solve of LS redistance 40459599516SKenneth E. Jansenc 40559599516SKenneth E. JansencHACK to make it keep solving RANS until tolerance is reached 40659599516SKenneth E. Jansenc 40759599516SKenneth E. Jansen istop=0 408513954efSKenneth E. Jansen! blocking extra RANS steps for now iMoreRANS=0 409513954efSKenneth E. Jansen iMoreRANS=6 41059599516SKenneth E. Jansenc 41159599516SKenneth E. Jansenc find the the RANS portion of the sequence 41259599516SKenneth E. Jansenc 41359599516SKenneth E. Jansen do istepc=1,seqsize 41459599516SKenneth E. Jansen if(stepseq(istepc).eq.10) iLastRANS=istepc 41559599516SKenneth E. Jansen enddo 41659599516SKenneth E. Jansen 41759599516SKenneth E. Jansen iseqStart=1 41859599516SKenneth E. Jansen9876 continue 41959599516SKenneth E. Jansenc 42059599516SKenneth E. Jansen do istepc=iseqStart,seqsize 42159599516SKenneth E. Jansen icode=stepseq(istepc) 42259599516SKenneth E. Jansen if(mod(icode,10).eq.0) then ! this is a solve 42359599516SKenneth E. Jansen isolve=icode/10 42459599516SKenneth E. Jansen if(isolve.eq.0) then ! flow solve (encoded as 0) 42559599516SKenneth E. Jansenc 42659599516SKenneth E. Jansen etol=epstol(1) 42759599516SKenneth E. Jansen iter = iter+1 42859599516SKenneth E. Jansen ifuncs(1) = ifuncs(1) + 1 42959599516SKenneth E. Jansenc 43059599516SKenneth E. Jansenc.... reset the aerodynamic forces 43159599516SKenneth E. Jansenc 43259599516SKenneth E. Jansen Force(1) = zero 43359599516SKenneth E. Jansen Force(2) = zero 43459599516SKenneth E. Jansen Force(3) = zero 43559599516SKenneth E. Jansen HFlux = zero 43659599516SKenneth E. Jansenc 43759599516SKenneth E. Jansenc.... form the element data and solve the matrix problem 43859599516SKenneth E. Jansenc 43959599516SKenneth E. Jansenc.... explicit solver 44059599516SKenneth E. Jansenc 44159599516SKenneth E. Jansen if (impl(itseq) .eq. 0) then 44259599516SKenneth E. Jansen if (myrank .eq. master) 44359599516SKenneth E. Jansen & call error('itrdrv ','impl ',impl(itseq)) 44459599516SKenneth E. Jansen endif 44559599516SKenneth E. Jansen if (mod(impl(1),100)/10 .eq. 1) then ! sparse solve 44659599516SKenneth E. Jansenc 44759599516SKenneth E. Jansenc.... preconditioned sparse matrix GMRES solver 44859599516SKenneth E. Jansenc 44959599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1))) 45059599516SKenneth E. Jansen iprec=lhs 45159599516SKenneth E. Jansen nedof = nflow*nshape 45259599516SKenneth E. Jansenc write(*,*) 'lhs=',lhs 453513954efSKenneth E. Jansen if(usingpetsc.eq.1) then 45417860365SKenneth E. Jansen#if (HAVE_PETSC) 455513954efSKenneth E. Jansen call SolGMRp (y, ac, yold, 456513954efSKenneth E. Jansen & x, 457513954efSKenneth E. Jansen & iBC, BC, 458513954efSKenneth E. Jansen & colm, rowp, lhsk, 459513954efSKenneth E. Jansen & res, 460513954efSKenneth E. Jansen & BDiag, 461513954efSKenneth E. Jansen & iper, ilwork, 462513954efSKenneth E. Jansen & shp, shgl, 463513954efSKenneth E. Jansen & shpb, shglb, solinc, 464513954efSKenneth E. Jansen & rerr, fncorp ) 46517860365SKenneth E. Jansen#else 46679f1763eSKenneth E. Jansen if(myrank.eq.0) write(*,*) 'exiting because run time input asked for PETSc, not linked in exec' 46717860365SKenneth E. Jansen call error('itrdrv ','noPETSc',usingpetsc) 46817860365SKenneth E. Jansen#endif 469513954efSKenneth E. Jansen else 47059599516SKenneth E. Jansen call SolGMRs (y, ac, yold, 47159599516SKenneth E. Jansen & acold, x, 47259599516SKenneth E. Jansen & iBC, BC, 47359599516SKenneth E. Jansen & colm, rowp, lhsk, 47459599516SKenneth E. Jansen & res, 475e72fd12cSBen Matthews & BDiag, hBrg, eBrg, 476e72fd12cSBen Matthews & yBrg, Rcos, Rsin, 47759599516SKenneth E. Jansen & iper, ilwork, 47859599516SKenneth E. Jansen & shp, shgl, 47959599516SKenneth E. Jansen & shpb, shglb, solinc, 48059599516SKenneth E. Jansen & rerr) 481513954efSKenneth E. Jansen endif 48259599516SKenneth E. Jansen else if (mod(impl(1),100)/10 .eq. 2) then ! mfg solve 48359599516SKenneth E. Jansenc 48459599516SKenneth E. Jansenc.... preconditioned matrix-free GMRES solver 48559599516SKenneth E. Jansenc 48659599516SKenneth E. Jansen lhs=0 48759599516SKenneth E. Jansen iprec = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1))) 48859599516SKenneth E. Jansen nedof = 0 48959599516SKenneth E. Jansen call SolMFG (y, ac, yold, 49059599516SKenneth E. Jansen & acold, x, 49159599516SKenneth E. Jansen & iBC, BC, 49259599516SKenneth E. Jansen & res, 493e72fd12cSBen Matthews & BDiag, HBrg, eBrg, 494e72fd12cSBen Matthews & yBrg, Rcos, Rsin, 49559599516SKenneth E. Jansen & iper, ilwork, 49659599516SKenneth E. Jansen & shp, shgl, 49759599516SKenneth E. Jansen & shpb, shglb, solinc, 49859599516SKenneth E. Jansen & rerr) 49959599516SKenneth E. Jansenc 50059599516SKenneth E. Jansen else if (mod(impl(1),100)/10 .eq. 3) then ! ebe solve 50159599516SKenneth E. Jansenc.... preconditioned ebe matrix GMRES solver 50259599516SKenneth E. Jansenc 50359599516SKenneth E. Jansen 50459599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1))) 50559599516SKenneth E. Jansen iprec = lhs 50659599516SKenneth E. Jansen nedof = nflow*nshape 50759599516SKenneth E. Jansenc write(*,*) 'lhs=',lhs 50859599516SKenneth E. Jansen call SolGMRe (y, ac, yold, 50959599516SKenneth E. Jansen & acold, x, 51059599516SKenneth E. Jansen & iBC, BC, 51159599516SKenneth E. Jansen & EGmass, res, 512e72fd12cSBen Matthews & BDiag, HBrg, eBrg, 513e72fd12cSBen Matthews & yBrg, Rcos, Rsin, 51459599516SKenneth E. Jansen & iper, ilwork, 51559599516SKenneth E. Jansen & shp, shgl, 51659599516SKenneth E. Jansen & shpb, shglb, solinc, 51759599516SKenneth E. Jansen & rerr) 51859599516SKenneth E. Jansen endif 51959599516SKenneth E. Jansenc 52059599516SKenneth E. Jansen else ! solve a scalar (encoded at isclr*10) 52159599516SKenneth E. Jansen isclr=isolve 522513954efSKenneth E. Jansen etol=epstol(isclr+2) ! note that for both epstol and LHSupd 1 is flow 2 temp isclr+2 for scalars 523513954efSKenneth E. Jansen ifuncs(isclr+2) = ifuncs(isclr+2) + 1 52459599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.0) 52559599516SKenneth E. Jansen & .and.(isclr.eq.2)) then 52659599516SKenneth E. Jansen ilss=1 ! throw switch (once per step) 52759599516SKenneth E. Jansenc 52859599516SKenneth E. Jansenc... copy the first scalar at t=n+1 into the second scalar of the 52959599516SKenneth E. Jansenc... level sets 53059599516SKenneth E. Jansenc 53159599516SKenneth E. Jansen y(:,6) = yold(:,6) + (y(:,6)-yold(:,6))/alfi 53259599516SKenneth E. Jansen y(:,7) = y(:,6) 53359599516SKenneth E. Jansen yold(:,7) = y(:,7) 53459599516SKenneth E. Jansen ac(:,7) = zero 53559599516SKenneth E. Jansenc 53659599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 53759599516SKenneth E. Jansenc 53859599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the 53959599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar 54059599516SKenneth E. Jansenc 54159599516SKenneth E. Jansen alfit=alfi 54259599516SKenneth E. Jansen gamit=gami 54359599516SKenneth E. Jansen almit=almi 54459599516SKenneth E. Jansen alfi = 1 54559599516SKenneth E. Jansen gami = 1 54659599516SKenneth E. Jansen almi = 1 54759599516SKenneth E. Jansen endif 54859599516SKenneth E. Jansenc 54959599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(isclr+2)-1, 55059599516SKenneth E. Jansen & LHSupd(isclr+2))) 55159599516SKenneth E. Jansen iprec = lhs 55259599516SKenneth E. Jansen istop=0 553513954efSKenneth E. Jansen if(usingPETSc.eq.1) then 55417860365SKenneth E. Jansen#if (HAVE_PETSC) 555513954efSKenneth E. Jansen call SolGMRpSclr(y, ac, 556513954efSKenneth E. Jansen & x, elDw, 557513954efSKenneth E. Jansen & iBC, BC, 558513954efSKenneth E. Jansen & colm, rowp, 559513954efSKenneth E. Jansen & iper, ilwork, 560513954efSKenneth E. Jansen & shp, shgl, 561513954efSKenneth E. Jansen & shpb, shglb, rest, 562513954efSKenneth E. Jansen & solinc(1,isclr+5),fncorp) 56317860365SKenneth E. Jansen#else 56417860365SKenneth E. Jansen write(*,*) 'exiting because run time input asked for PETSc, not linked in exec' 56517860365SKenneth E. Jansen call error('itrdrv ','noPETSc',usingpetsc) 56617860365SKenneth E. Jansen#endif 567513954efSKenneth E. Jansen else 56859599516SKenneth E. Jansen call SolGMRSclr(y, ac, yold, 56959599516SKenneth E. Jansen & acold, EGmasst(1,isclr), 57059599516SKenneth E. Jansen & x, elDw, 57159599516SKenneth E. Jansen & iBC, BC, 57259599516SKenneth E. Jansen & rest, 573e72fd12cSBen Matthews & HBrg, eBrg, 574e72fd12cSBen Matthews & yBrg, Rcos, Rsin, 57559599516SKenneth E. Jansen & iper, ilwork, 57659599516SKenneth E. Jansen & shp, shgl, 57759599516SKenneth E. Jansen & shpb, shglb, solinc(1,isclr+5)) 578513954efSKenneth E. Jansen endif 57959599516SKenneth E. Jansenc 58059599516SKenneth E. Jansen endif ! end of scalar type solve 58159599516SKenneth E. Jansenc 58259599516SKenneth E. Jansenc 58359599516SKenneth E. Jansenc.... end of the multi-corrector loop 58459599516SKenneth E. Jansenc 58559599516SKenneth E. Jansen 1000 continue !check this 58659599516SKenneth E. Jansen 58759599516SKenneth E. Jansen else ! this is an update (mod did not equal zero) 58859599516SKenneth E. Jansen iupdate=icode/10 ! what to update 58959599516SKenneth E. Jansen if(iupdate.eq.0) then !update flow 59059599516SKenneth E. Jansen call itrCorrect ( y, ac, yold, acold, solinc) 59159599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper, ilwork) 59259599516SKenneth E. Jansen call tnanq(y, 5, 'y_updbc') 59359599516SKenneth E. Jansenc Elaine-SPEBC 59459599516SKenneth E. Jansen if((irscale.ge.0).and.(myrank.eq.master)) then 59559599516SKenneth E. Jansen call genscale(y, x, iBC) 59659599516SKenneth E. Jansenc call itrBC (y, ac, iBC, BC, iper, ilwork) 59759599516SKenneth E. Jansen endif 59859599516SKenneth E. Jansen else ! update scalar 59959599516SKenneth E. Jansen isclr=iupdate !unless 60059599516SKenneth E. Jansen if(iupdate.eq.nsclr+1) isclr=0 60159599516SKenneth E. Jansen call itrCorrectSclr ( y, ac, yold, acold, 60259599516SKenneth E. Jansen & solinc(1,isclr+5)) 60359599516SKenneth E. Jansen if (ilset.eq.2 .and. isclr.eq.2) then 60459599516SKenneth E. Jansen fct2=one/almi 60559599516SKenneth E. Jansen fct3=one/alfi 60659599516SKenneth E. Jansen acold(:,7) = acold(:,7) 60759599516SKenneth E. Jansen & + (ac(:,7)-acold(:,7))*fct2 60859599516SKenneth E. Jansen yold(:,7) = yold(:,7) 60959599516SKenneth E. Jansen & + (y(:,7)-yold(:,7))*fct3 61059599516SKenneth E. Jansen call itrBCSclr ( yold, acold, iBC, BC, 61159599516SKenneth E. Jansen & iper, ilwork) 61259599516SKenneth E. Jansen ac(:,7) = acold(:,7)*(one-almi/gami) 61359599516SKenneth E. Jansen y(:,7) = yold(:,7) 61459599516SKenneth E. Jansen ac(:,7) = zero 61559599516SKenneth E. Jansen if (ivconstraint .eq. 1) then 61659599516SKenneth E. Jansen & 61759599516SKenneth E. Jansenc ... applying the volume constraint 61859599516SKenneth E. Jansenc 61959599516SKenneth E. Jansen call solvecon (y, x, iBC, BC, 62059599516SKenneth E. Jansen & iper, ilwork, shp, shgl) 62159599516SKenneth E. Jansenc 62259599516SKenneth E. Jansen endif ! end of volume constraint calculations 62359599516SKenneth E. Jansen endif 62459599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, ilwork) 62559599516SKenneth E. Jansen endif 62659599516SKenneth E. Jansen endif !end of switch between solve or update 62759599516SKenneth E. Jansen enddo ! loop over sequence in step 62859599516SKenneth E. Jansen if((istop.lt.0).and.(iMoreRANS.lt.5)) then 62959599516SKenneth E. Jansen iMoreRANS=iMoreRANS+1 630513954efSKenneth E. Jansen if(myrank.eq.master) write(*,*) 'istop =', istop 63159599516SKenneth E. Jansen iseqStart=iLastRANS 63259599516SKenneth E. Jansen goto 9876 63359599516SKenneth E. Jansen endif 63459599516SKenneth E. Jansenc 63559599516SKenneth E. Jansenc Find the solution at the end of the timestep and move it to old 63659599516SKenneth E. Jansenc 63759599516SKenneth E. Jansenc.... First to reassign the parameters for the original time integrator scheme 63859599516SKenneth E. Jansenc 63959599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.1)) then 64059599516SKenneth E. Jansen alfi =alfit 64159599516SKenneth E. Jansen gami =gamit 64259599516SKenneth E. Jansen almi =almit 64359599516SKenneth E. Jansen endif 64459599516SKenneth E. Jansen call itrUpdate( yold, acold, y, ac) 64559599516SKenneth E. Jansen call itrBC (yold, acold, iBC, BC, iper,ilwork) 64659599516SKenneth E. Jansenc Elaine-SPEBC 64759599516SKenneth E. Jansen if((irscale.ge.0).and.(myrank.eq.master)) then 64859599516SKenneth E. Jansen call genscale(yold, x, iBC) 64959599516SKenneth E. Jansenc call itrBC (y, ac, iBC, BC, iper, ilwork) 65059599516SKenneth E. Jansen endif 65159599516SKenneth E. Jansen do isclr=1,nsclr 65259599516SKenneth E. Jansen call itrBCSclr (yold, acold, iBC, BC, iper, ilwork) 65359599516SKenneth E. Jansen enddo 65459599516SKenneth E. Jansenc 65559599516SKenneth E. Jansen istep = istep + 1 65659599516SKenneth E. Jansen lstep = lstep + 1 65759599516SKenneth E. Jansen ntoutv=max(ntout,100) 658513954efSKenneth E. Jansen !boundary flux output moved after the error calculation so 659513954efSKenneth E. Jansen !everything can be written out in a single chunk of code - 660513954efSKenneth E. Jansen !Nicholas Mati 66159599516SKenneth E. Jansen 662513954efSKenneth E. Jansen !dump TIME SERIES 66359599516SKenneth E. Jansen if (exts) then 664513954efSKenneth E. Jansen !Write the probe data to disc. Note that IO to disc only 665513954efSKenneth E. Jansen !occurs when mod(lstep, nbuff) == 0. However, this 666513954efSKenneth E. Jansen !function also does data buffering and must be called 667513954efSKenneth E. Jansen !every time step. 668513954efSKenneth E. Jansen call TD_bufferData() 669513954efSKenneth E. Jansen call TD_writeData(fvarts, .false.) 67059599516SKenneth E. Jansen endif 67159599516SKenneth E. Jansen 672513954efSKenneth E. Jansen !Update the Mach Control 673513954efSKenneth E. Jansen if(exts .and. exMC) then 674513954efSKenneth E. Jansen !Note: the function MC_updateState must be called after 675513954efSKenneth E. Jansen !the function TD_bufferData due to dependencies on 676513954efSKenneth E. Jansen !vartsbuff(:,:,:). 677513954efSKenneth E. Jansen call MC_updateState() 678513954efSKenneth E. Jansen call MC_applyBC(BC) 679513954efSKenneth E. Jansen call MC_printState() 68059599516SKenneth E. Jansen 681513954efSKenneth E. Jansen !Write the state if a restart is also being written. 682513954efSKenneth E. Jansen if(mod(lstep,ntout).eq.0 ) call MC_writeState(lstep) 683513954efSKenneth E. Jansen endif 68459599516SKenneth E. Jansen 685513954efSKenneth E. Jansen !update blower control 686513954efSKenneth E. Jansen if(BC_enable) then 687513954efSKenneth E. Jansen !Update the blower boundary conditions for the next 688513954efSKenneth E. Jansen !iteration. 689513954efSKenneth E. Jansen call BC_iter(BC) 69059599516SKenneth E. Jansen 691513954efSKenneth E. Jansen !Also write the current phases of the blowers if a 692513954efSKenneth E. Jansen !restart is also being written. 693513954efSKenneth E. Jansen if(mod(lstep, ntout) == 0) call BC_writePhase(lstep) 694513954efSKenneth E. Jansen endif 69559599516SKenneth E. Jansen 696513954efSKenneth E. Jansen !.... Yi Chen Duct geometry8 697513954efSKenneth E. Jansen if(isetBlowing_Duct.gt.0)then 698513954efSKenneth E. Jansen if(ifixBlowingVel_Duct.eq.0)then 699513954efSKenneth E. Jansen if(nstp.gt.nBlowingStepsDuct)then 700513954efSKenneth E. Jansen nBlowingStepsDuct = nstp-2 701513954efSKenneth E. Jansen endif 702513954efSKenneth E. Jansen call setBlowing_Duct2(x,BC,yold,iTurbWall,istp) 70359599516SKenneth E. Jansen endif 70459599516SKenneth E. Jansen endif 705513954efSKenneth E. Jansen !... Yi Chen Duct geometry8 70659599516SKenneth E. Jansen 70759599516SKenneth E. Jansenc 70859599516SKenneth E. Jansenc.... -------------------> error calculation <----------------- 70959599516SKenneth E. Jansen if(ierrcalc.eq.1.or.ioybar.eq.1) then 71059599516SKenneth E. Jansen tfact=one/istep 71159599516SKenneth E. Jansen do idof=1,ndof 71259599516SKenneth E. Jansen ybar(:,idof) =tfact*yold(:,idof) + 71359599516SKenneth E. Jansen & (one-tfact)*ybar(:,idof) 71459599516SKenneth E. Jansen enddo 71559599516SKenneth E. Jansenc....compute average 71659599516SKenneth E. Jansenc... ybar(:,ndof+1:ndof+8) is for avg. of square as uu, vv, ww, pp, TT, uv, uw, and vw 71759599516SKenneth E. Jansen do idof=1,5 ! avg. of square for 5 flow variables 71859599516SKenneth E. Jansen ybar(:,ndof+idof) = tfact*yold(:,idof)**2 + 71959599516SKenneth E. Jansen & (one-tfact)*ybar(:,ndof+idof) 72059599516SKenneth E. Jansen enddo 72159599516SKenneth E. Jansen ybar(:,ndof+6) = tfact*yold(:,1)*yold(:,2) + !uv 72259599516SKenneth E. Jansen & (one-tfact)*ybar(:,ndof+6) 72359599516SKenneth E. Jansen ybar(:,ndof+7) = tfact*yold(:,1)*yold(:,3) + !uw 72459599516SKenneth E. Jansen & (one-tfact)*ybar(:,ndof+7) 72559599516SKenneth E. Jansen ybar(:,ndof+8) = tfact*yold(:,2)*yold(:,3) + !vw 72659599516SKenneth E. Jansen & (one-tfact)*ybar(:,ndof+8) 72759599516SKenneth E. Jansenc... compute err 728f0b806cbSKenneth E. Jansenc hack ShockError 729f0b806cbSKenneth E. Jansenc 730f0b806cbSKenneth E. Jansen errmax=maxval(rerr(:,6)) 731f0b806cbSKenneth E. Jansen errswitch=0.1*errmax 732*0d39a63aSKenneth E. Jansen! 733*0d39a63aSKenneth E. Jansen! note this scalefactor will govern the thickness of the refinement band around the shock. 734*0d39a63aSKenneth E. Jansen! Higher values make it thinner (less refinement), lower -> thicker 735*0d39a63aSKenneth E. Jansen! what is below is specific to SAM adapt's expectation to adapt when the 6th field is > 1.0e-6 736*0d39a63aSKenneth E. Jansen! note also that this field was altered in e3.f and e3ls.f to no longer be the traditional error 737*0d39a63aSKenneth E. Jansen! indicator, rather it is based on element jump of Temperature to identify shocks 738*0d39a63aSKenneth E. Jansen! 739f0b806cbSKenneth E. Jansen where(rerr(:,6).gt.errswitch) 740f0b806cbSKenneth E. Jansen rerr(:,6)=1.0 741f0b806cbSKenneth E. Jansen elsewhere 742f0b806cbSKenneth E. Jansen rerr(:,6)=1e-10 743f0b806cbSKenneth E. Jansen endwhere 744513954efSKenneth E. Jansen rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2 745513954efSKenneth E. Jansen rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2 746513954efSKenneth E. Jansen rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2 747513954efSKenneth E. Jansen rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2 74859599516SKenneth E. Jansen endif 749513954efSKenneth E. Jansen 750513954efSKenneth E. Jansenc.. writing ybar field if requested in each restart file 751513954efSKenneth E. Jansen 752513954efSKenneth E. Jansen !here is where we save our averaged field. In some cases we want to 753513954efSKenneth E. Jansen !write it less frequently 754513954efSKenneth E. Jansen if( (irs >= 1) .and. ( 755513954efSKenneth E. Jansen & mod(lstep, ntout) == 0 .or. !Checkpoint 756513954efSKenneth E. Jansen & istep == nstp) )then !End of simulation 757f0b806cbSKenneth E. Jansen if(output_mode .eq. -1 ) then ! this is an in-memory adapt case 758f0b806cbSKenneth E. Jansen if(istep == nstp) then ! go ahead and take care of it 759f0b806cbSKenneth E. Jansen call checkpoint (nstp,yold, acold, ybar, rerr, velbar, 760f0b806cbSKenneth E. Jansen & x, iper, ilwork, shp, shgl, iBC ) 761513954efSKenneth E. Jansen endif 762f0b806cbSKenneth E. Jansen if(ntout.le.lstep) then ! user also wants file output 763f0b806cbSKenneth E. Jansen output_mode=0 764f0b806cbSKenneth E. Jansen call checkpoint (nstp,yold, acold, ybar, rerr, velbar, 765f0b806cbSKenneth E. Jansen & x, iper, ilwork, shp, shgl, iBC ) 766f0b806cbSKenneth E. Jansen output_mode=-1 ! reset to stream 767513954efSKenneth E. Jansen endif 768f0b806cbSKenneth E. Jansen else 769f0b806cbSKenneth E. Jansen call checkpoint (nstp,yold, acold, ybar, rerr, velbar, 770f0b806cbSKenneth E. Jansen & x, iper, ilwork, shp, shgl, iBC ) 771513954efSKenneth E. Jansen endif 772513954efSKenneth E. Jansen endif 773513954efSKenneth E. Jansen 774513954efSKenneth E. Jansen 2000 continue !end of NSTEP loop 77559599516SKenneth E. Jansen 2001 continue 77659599516SKenneth E. Jansen 77759599516SKenneth E. Jansen ttim(1) = REAL(secs(0.0)) / 100. - ttim(1) 77859599516SKenneth E. Jansen ttim(2) = secs(0.0) - ttim(2) 77959599516SKenneth E. Jansen 78059599516SKenneth E. Jansenc tcorecp2 = REAL(secs(0.0)) / 100. 78159599516SKenneth E. Jansenc tcorewc2 = secs(0.0) 78259599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 783513954efSKenneth E. Jansen if(myrank.eq.master) then 78459599516SKenneth E. Jansen tcorecp2 = TMRC() 78559599516SKenneth E. Jansen write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1 78659599516SKenneth E. Jansen endif 78759599516SKenneth E. Jansen 78859599516SKenneth E. Jansenc call wtime 78959599516SKenneth E. Jansen 79075f1c48cSCameron Smith call destroyWallData 79192e15685SCameron Smith call destroyfncorp 79275f1c48cSCameron Smith 793513954efSKenneth E. Jansen 3000 continue !end of NTSEQ loop 79459599516SKenneth E. Jansenc 79559599516SKenneth E. Jansenc.... ----------------------> Post Processing <---------------------- 79659599516SKenneth E. Jansenc 79759599516SKenneth E. Jansenc.... print out the last step 79859599516SKenneth E. Jansenc 799513954efSKenneth E. Jansen! if ( (irs .ge. 1) .and. ((mod(lstep, ntout) .ne. 0) .or. 800513954efSKenneth E. Jansen! & (nstp .eq. 0))) then 801513954efSKenneth E. Jansen! if( (mod(lstep, ntoutv) .eq. 0) .and. 802513954efSKenneth E. Jansen! & ((irscale.ge.0).or.(itwmod.gt.0) .or. 803513954efSKenneth E. Jansen! & ((nsonmax.eq.1).and.(iLES.gt.0)))) 804513954efSKenneth E. Jansen! & call rwvelb ('out ', velbar ,ifail) 805513954efSKenneth E. Jansen! 806513954efSKenneth E. Jansen! call Bflux (yold, acold, x, 807513954efSKenneth E. Jansen! & shp, shgl, shpb, 808513954efSKenneth E. Jansen! & shglb, nodflx, ilwork) 809513954efSKenneth E. Jansen! endif 81059599516SKenneth E. Jansen 811513954efSKenneth E. Jansen 812513954efSKenneth E. Jansen 813513954efSKenneth E. Jansenc if(ioybar.eq.1) then 814513954efSKenneth E. Jansenc call write_field(myrank,'a'//char(0),'ybar'//char(0),4, 815513954efSKenneth E. Jansenc & ybar,'d'//char(0),nshg,ndof+8,lstep) 816513954efSKenneth E. Jansenc endif 817513954efSKenneth E. Jansen 818513954efSKenneth E. Jansenc if(iRANS.lt.0 .and. idistcalc.eq.1) then 819513954efSKenneth E. Jansenc call write_field(myrank,'a'//char(0),'DESd'//char(0),4, 820513954efSKenneth E. Jansenc & elDw,'d'//char(0),numel,1,lstep) 82159599516SKenneth E. Jansenc 822513954efSKenneth E. Jansenc call write_field(myrank,'a'//char(0),'dwal'//char(0),4, 823513954efSKenneth E. Jansenc & d2wall,'d'//char(0),nshg,1,lstep) 824513954efSKenneth E. Jansenc endif 82559599516SKenneth E. Jansen 82659599516SKenneth E. Jansenc 82759599516SKenneth E. Jansenc.... close history and aerodynamic forces files 82859599516SKenneth E. Jansenc 82959599516SKenneth E. Jansen if (myrank .eq. master) then 83059599516SKenneth E. Jansen close (ihist) 83159599516SKenneth E. Jansen close (iforce) 832513954efSKenneth E. Jansen 833513954efSKenneth E. Jansen if(exMC) then 834513954efSKenneth E. Jansen call MC_writeState(lstep) 835513954efSKenneth E. Jansen call MC_finalize 836513954efSKenneth E. Jansen endif 837513954efSKenneth E. Jansen 83859599516SKenneth E. Jansen if(exts) then 839513954efSKenneth E. Jansen call TD_writeData(fvarts, .true.) !force the flush of the buffer. 840513954efSKenneth E. Jansen call TD_finalize 84159599516SKenneth E. Jansen endif 84259599516SKenneth E. Jansen endif 843513954efSKenneth E. Jansen 844513954efSKenneth E. Jansen if(BC_enable) then !blower is allocated on all processes. 845513954efSKenneth E. Jansen if(mod(lstep, ntout) /= 0) then !May have already written file. 846513954efSKenneth E. Jansen call BC_writePhase(lstep) 847513954efSKenneth E. Jansen endif 848513954efSKenneth E. Jansen 849513954efSKenneth E. Jansen call BC_finalize 850513954efSKenneth E. Jansen endif 851513954efSKenneth E. Jansen 85259599516SKenneth E. Jansen close (iecho) 85359599516SKenneth E. Jansen if(iabc==1) deallocate(acs) 85459599516SKenneth E. Jansenc 85559599516SKenneth E. Jansenc.... end 85659599516SKenneth E. Jansenc 85759599516SKenneth E. Jansen return 85859599516SKenneth E. Jansen end 859513954efSKenneth E. Jansen 860f0b806cbSKenneth E. Jansen subroutine checkpoint (nstp,yold, acold, ybar, rerr, velbar, 861f0b806cbSKenneth E. Jansen & x, iper, ilwork, shp, shgl, iBC ) 862f0b806cbSKenneth E. Jansenc 863f0b806cbSKenneth E. Jansen use turbSA 864f0b806cbSKenneth E. Jansen include "common.h" 865f0b806cbSKenneth E. Jansen dimension shp(MAXTOP,maxsh,MAXQPT), 866f0b806cbSKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 867f0b806cbSKenneth E. Jansen & iper(nshg), iBC(nshg), 868f0b806cbSKenneth E. Jansen & x(nshg,nsd), ilwork(nlwork) 869f0b806cbSKenneth E. Jansen real*8 velbar(nfath,ndof), 870f0b806cbSKenneth E. Jansen & yold(nshg,ndof), acold(nshg,ndof), 871f0b806cbSKenneth E. Jansen & rerr(nshg,10), ybar(nshg,ndof+8) 872f0b806cbSKenneth E. Jansen! 8 is for avg. of square as uu, vv, ww, pp, TT, uv, uw, and vw 873f0b806cbSKenneth E. Jansen 874f0b806cbSKenneth E. Jansen if( (mod(lstep, ntout) .eq. 0) .and. 875f0b806cbSKenneth E. Jansen & ((irscale.ge.0).or.(itwmod.gt.0) .or. 876f0b806cbSKenneth E. Jansen & ((nsonmax.eq.1).and.(iLES.gt.0)))) 877f0b806cbSKenneth E. Jansen & call rwvelb ('out ', velbar ,ifail) 878f0b806cbSKenneth E. Jansen 879f0b806cbSKenneth E. Jansen!BUG: need to update new_interface to work with SyncIO. 880f0b806cbSKenneth E. Jansen !Bflux is presently completely crippled. Note that restar 881f0b806cbSKenneth E. Jansen !has also been moved here for readability. 882f0b806cbSKenneth E. Jansen! call Bflux (yold, acold, x, compute boundary fluxes and print out 883f0b806cbSKenneth E. Jansen! & shp, shgl, shpb, 884f0b806cbSKenneth E. Jansen! & shglb, nodflx, ilwork) 885f0b806cbSKenneth E. Jansen 886f0b806cbSKenneth E. Jansen call timer ('Output ') !set up the timer 887f0b806cbSKenneth E. Jansen 888f0b806cbSKenneth E. Jansen !write the solution and time derivative 889f0b806cbSKenneth E. Jansen call restar ('out ', yold, acold) 890f0b806cbSKenneth E. Jansen 891f0b806cbSKenneth E. Jansen !Write the distance to wall field in each restart 892f0b806cbSKenneth E. Jansen if((istep==nstp) .and. (irans < 0 )) then !d2wall is allocated 893f0b806cbSKenneth E. Jansen call write_field(myrank,'a'//char(0),'dwal'//char(0),4, 894f0b806cbSKenneth E. Jansen & d2wall,'d'//char(0), nshg, 1, lstep) 895f0b806cbSKenneth E. Jansen endif 896f0b806cbSKenneth E. Jansen 897f0b806cbSKenneth E. Jansen !Write the time average in each restart. 898f0b806cbSKenneth E. Jansen if(ioybar.eq.1)then 899f0b806cbSKenneth E. Jansen call write_field(myrank,'a'//char(0),'ybar'//char(0),4, 900f0b806cbSKenneth E. Jansen & ybar,'d'//char(0),nshg,ndof+8,lstep) 901f0b806cbSKenneth E. Jansen endif 902f0b806cbSKenneth E. Jansen 903f0b806cbSKenneth E. Jansen !Write the error feild at the end of each step sequence 904f0b806cbSKenneth E. Jansen if(ierrcalc.eq.1 .and. istep == nstp) then 905f0b806cbSKenneth E. Jansen !smooth the error indicators 906f0b806cbSKenneth E. Jansen 907f0b806cbSKenneth E. Jansen do i=1,ierrsmooth 908f0b806cbSKenneth E. Jansen call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC ) 909f0b806cbSKenneth E. Jansen enddo 910f0b806cbSKenneth E. Jansen 911f0b806cbSKenneth E. Jansen call write_field( myrank, 'a'//char(0), 'errors'//char(0), 6, 912f0b806cbSKenneth E. Jansen & rerr, 'd'//char(0), nshg, 10, lstep) 913f0b806cbSKenneth E. Jansen endif 914f0b806cbSKenneth E. Jansen 915f0b806cbSKenneth 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 916f0b806cbSKenneth E. Jansenc 917f0b806cbSKenneth E. Jansenc call write_field2(myrank,'a'//char(0),'ybar'//char(0), 918f0b806cbSKenneth E. Jansenc & 4,ybar,'d'//char(0),nshg,ndof+8, 919f0b806cbSKenneth E. Jansenc & lstep,istep) 920f0b806cbSKenneth E. Jansenc 921f0b806cbSKenneth E. Jansenc.... end 922f0b806cbSKenneth E. Jansenc 923f0b806cbSKenneth E. Jansen return 924f0b806cbSKenneth E. Jansen end 925513954efSKenneth E. Jansen 926