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 3359599516SKenneth E. Jansen use timedata !allows collection of time series 34*513954efSKenneth E. Jansen use MachControl !PID to control the inlet velocity. 35*513954efSKenneth E. Jansen use blowerControl !gives us BC_enable 3659599516SKenneth E. Jansen use turbSA 37*513954efSKenneth E. Jansen use wallData 38*513954efSKenneth 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 51*513954efSKenneth E. Jansen dimension res(nshg,nflow), 5259599516SKenneth E. Jansen & rest(nshg), solinc(nshg,ndof) 5359599516SKenneth E. Jansenc 5459599516SKenneth E. Jansen dimension shp(MAXTOP,maxsh,MAXQPT), 5559599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 5659599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 5759599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 5859599516SKenneth E. Jansen real*8 almit, alfit, gamit 5959599516SKenneth E. Jansen dimension ifath(numnp), velbar(nfath,ndof), nsons(nfath) 6059599516SKenneth E. Jansen real*8 rerr(nshg,10),ybar(nshg,ndof+8) ! 8 is for avg. of square as uu, vv, ww, pp, TT, uv, uw, and vw 61*513954efSKenneth E. Jansen real*8, allocatable, dimension(:,:) :: vortG 62*513954efSKenneth E. Jansen real*8, allocatable, dimension(:,:,:) :: BDiag 63*513954efSKenneth E. Jansen 64*513954efSKenneth E. Jansen! integer, allocatable, dimension(:) :: iv_rank !used with MRasquin's version of probe points 65*513954efSKenneth E. Jansen! integer :: iv_rankpernode, iv_totnodes, iv_totcores 66*513954efSKenneth E. Jansen! integer :: iv_node, iv_core, iv_thread 67*513954efSKenneth E. Jansen 6859599516SKenneth E. Jansen! assuming three profiles to control (inlet, bottom FC and top FC) 6959599516SKenneth E. Jansen! store velocity profile set via BC 7059599516SKenneth E. Jansen real*8 vbc_prof(nshg,3) 71*513954efSKenneth E. Jansen character(len=60) fvarts 7259599516SKenneth E. Jansen integer ifuncs(6), iarray(10) 7359599516SKenneth E. Jansen real*8 elDw(numel) ! element average of DES d variable 7459599516SKenneth E. Jansenc 7559599516SKenneth E. Jansenc Here are the data structures for sparse matrix GMRES 7659599516SKenneth E. Jansenc 7759599516SKenneth E. Jansen integer, allocatable, dimension(:,:) :: rowp 7859599516SKenneth E. Jansen integer, allocatable, dimension(:) :: colm 7959599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: lhsK 8059599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: EGmass 8159599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: EGmasst 8259599516SKenneth E. Jansen 83*513954efSKenneth E. Jansen integer iTurbWall(nshg) 84*513954efSKenneth E. Jansen real*8 yInlet(3), yInletg(3) 85*513954efSKenneth E. Jansen integer imapped, imapInlet(nshg) !for now, used for setting Blower conditions 86*513954efSKenneth E. Jansen! real*8 M_th, M_tc, M_tt 87*513954efSKenneth E. Jansen! logical exMc 88*513954efSKenneth E. Jansen! real*8 vBC, vBCg 89*513954efSKenneth E. Jansen real*8 vortmax, vortmaxg 9059599516SKenneth E. Jansen 91*513954efSKenneth E. Jansen iprec=0 !PETSc - Disable PHASTA's BDiag. TODO: Preprocssor Switch 9259599516SKenneth E. Jansen 93*513954efSKenneth E. Jansen call findTurbWall(iTurbWall) 9459599516SKenneth E. Jansen 95*513954efSKenneth E. Jansen!------- 96*513954efSKenneth E. Jansen! SETUP 97*513954efSKenneth E. Jansen!------- 9859599516SKenneth E. Jansen 99*513954efSKenneth E. Jansen !HACK for debugging suction 100*513954efSKenneth E. Jansen! call Write_Debug(myrank, 'wallNormal'//char(0), 101*513954efSKenneth E. Jansen! & 'wnorm'//char(0), wnorm, 102*513954efSKenneth E. Jansen! & 'd', nshg, 3, lstep) 103*513954efSKenneth E. Jansen 104*513954efSKenneth E. Jansen !Probe Point Setup 105*513954efSKenneth E. Jansen call initProbePoints() 106*513954efSKenneth E. Jansen if(exts) then !exts is set in initProbePoints 107*513954efSKenneth E. Jansen write(fvarts, "('./varts/varts.', I0, '.dat')") lstep 108*513954efSKenneth E. Jansen fvarts = trim(fvarts) 10959599516SKenneth E. Jansen 11059599516SKenneth E. Jansen if(myrank .eq. master) then 111*513954efSKenneth E. Jansen call TD_writeHeader(fvarts) 112*513954efSKenneth E. Jansen endif 11359599516SKenneth E. Jansen endif 11459599516SKenneth E. Jansen 115*513954efSKenneth E. Jansen !Mach Control Setup 116*513954efSKenneth E. Jansen call MC_init(Delt, lstep, BC) 117*513954efSKenneth E. Jansen exMC = exMC .and. exts !If probe points aren't available, turn 118*513954efSKenneth E. Jansen !the Mach Control off 119*513954efSKenneth E. Jansen if(exMC) then 120*513954efSKenneth E. Jansen call MC_applyBC(BC) 121*513954efSKenneth E. Jansen call MC_printState() 12259599516SKenneth E. Jansen endif 12359599516SKenneth E. Jansen 124*513954efSKenneth E. Jansen 12559599516SKenneth E. Jansenc 12659599516SKenneth E. Jansenc.... open history and aerodynamic forces files 12759599516SKenneth E. Jansenc 12859599516SKenneth E. Jansen if (myrank .eq. master) then 12959599516SKenneth E. Jansen open (unit=ihist, file=fhist, status='unknown') 13059599516SKenneth E. Jansen open (unit=iforce, file=fforce, status='unknown') 13159599516SKenneth E. Jansen endif 13259599516SKenneth E. Jansenc 13359599516SKenneth E. Jansenc 13459599516SKenneth E. Jansenc.... initialize 13559599516SKenneth E. Jansenc 13659599516SKenneth E. Jansen ifuncs = 0 ! func. evaluation counter 13759599516SKenneth E. Jansen istep = 0 13859599516SKenneth E. Jansen ntotGM = 0 ! number of GMRES iterations 13959599516SKenneth E. Jansen time = 0 14059599516SKenneth E. Jansen yold = y 14159599516SKenneth E. Jansen acold = ac 142*513954efSKenneth E. Jansen 143*513954efSKenneth E. Jansen!Blower Setup 144*513954efSKenneth E. Jansen call BC_init(Delt, lstep, BC) !Note: sets BC_enable 145*513954efSKenneth E. Jansen! fix the yold values to the reset BC 146*513954efSKenneth E. Jansen if(BC_enable) call itrBC (yold, ac, iBC, BC, iper, ilwork) 147*513954efSKenneth E. Jansen! without the above, second solve of first steps is fouled up 148*513954efSKenneth E. Jansen! 14959599516SKenneth E. Jansen if (mod(impl(1),100)/10 .eq. 1) then 15059599516SKenneth E. Jansenc 15159599516SKenneth E. Jansenc generate the sparse data fill vectors 15259599516SKenneth E. Jansenc 15359599516SKenneth E. Jansen allocate (rowp(nshg,nnz)) 15459599516SKenneth E. Jansen allocate (colm(nshg+1)) 15559599516SKenneth E. Jansen call genadj(colm, rowp, icnt ) ! preprocess the adjacency list 15659599516SKenneth E. Jansen 15759599516SKenneth E. Jansen nnz_tot=icnt ! this is exactly the number of non-zero 15859599516SKenneth E. Jansen ! blocks on this proc 159*513954efSKenneth E. Jansen if(usingpetsc.eq.1) then 160*513954efSKenneth E. Jansen allocate (BDiag(1,1,1)) 161*513954efSKenneth E. Jansen else 162*513954efSKenneth E. Jansen allocate (BDiag(nshg,nflow,nflow)) 16359599516SKenneth E. Jansen allocate (lhsK(nflow*nflow,nnz_tot)) 16459599516SKenneth E. Jansen endif 165*513954efSKenneth E. Jansen endif 16659599516SKenneth E. Jansen if (mod(impl(1),100)/10 .eq. 3) then 16759599516SKenneth E. Jansenc 16859599516SKenneth E. Jansenc generate the ebe data fill vectors 16959599516SKenneth E. Jansenc 17059599516SKenneth E. Jansen nedof=nflow*nshape 17159599516SKenneth E. Jansen allocate (EGmass(numel,nedof*nedof)) 17259599516SKenneth E. Jansen endif 17359599516SKenneth E. Jansen 17459599516SKenneth E. Jansenc.......................................... 17559599516SKenneth E. Jansen rerr = zero 17659599516SKenneth E. Jansen ybar(:,1:ndof) = y(:,1:ndof) 17759599516SKenneth E. Jansen do idof=1,5 17859599516SKenneth E. Jansen ybar(:,ndof+idof) = y(:,idof)*y(:,idof) 17959599516SKenneth E. Jansen enddo 18059599516SKenneth E. Jansen ybar(:,ndof+6) = y(:,1)*y(:,2) 18159599516SKenneth E. Jansen ybar(:,ndof+7) = y(:,1)*y(:,3) 18259599516SKenneth E. Jansen ybar(:,ndof+8) = y(:,2)*y(:,3) 18359599516SKenneth E. Jansenc......................................... 18459599516SKenneth E. Jansen 185*513954efSKenneth E. Jansen! change the freestream and inflow eddy viscosity to reflect different 186*513954efSKenneth E. Jansen! levels of freestream turbulence 187*513954efSKenneth E. Jansen! 188*513954efSKenneth E. Jansen! First override boundary condition values 189*513954efSKenneth E. Jansen! USES imapInlet from Mach Control so if that gets conditionaled away 190*513954efSKenneth E. Jansen! it has to know if it is needed here 191*513954efSKenneth E. Jansen! 192*513954efSKenneth E. Jansen if(isetEV_IC_BC.eq.1) then 193*513954efSKenneth E. Jansen allocate(vortG(nshg, 4)) 194*513954efSKenneth E. Jansen call vortGLB(yold, x, shp, shgl, ilwork, vortG) 195*513954efSKenneth 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 196*513954efSKenneth E. Jansen write(*,*) "vortmax = ", vortmax 19759599516SKenneth E. Jansen 198*513954efSKenneth E. Jansen !Find the maximum shear in the simulation 199*513954efSKenneth E. Jansen if(numpe.gt.1) then 200*513954efSKenneth E. Jansen call MPI_ALLREDUCE(vortmax, vortmaxg, 1, 201*513954efSKenneth E. Jansen & MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr ) 202*513954efSKenneth E. Jansen vortmax = vortmaxg 203*513954efSKenneth E. Jansen endif 20459599516SKenneth E. Jansen 205*513954efSKenneth E. Jansen !Apply eddy viscosity at the inlet 206*513954efSKenneth E. Jansen do i=1,icountInlet ! for now only coded to catch primary inlet, not blower 207*513954efSKenneth E. Jansen BC(imapInlet(i),7)=evis_IC_BC 208*513954efSKenneth E. Jansen enddo 209*513954efSKenneth E. Jansen 210*513954efSKenneth E. Jansen !Apply eddy viscosity through the quasi-inviscid portion of the domain 211*513954efSKenneth E. Jansen do i = 1,nshg 212*513954efSKenneth E. Jansen if(abs(vortG(i,4)).ge.vortmax*0.01) yold(i,6)=evis_IC_BC 213*513954efSKenneth E. Jansen enddo 214*513954efSKenneth E. Jansen isclr=1 ! fix scalar 215*513954efSKenneth E. Jansen call itrBCsclr(yold,ac,iBC,BC,iper,ilwork) 216*513954efSKenneth E. Jansen 217*513954efSKenneth E. Jansen deallocate(vortG) 218*513954efSKenneth E. Jansen endif 21959599516SKenneth E. Jansenc 22059599516SKenneth E. Jansenc.... loop through the time sequences 22159599516SKenneth E. Jansenc 22259599516SKenneth E. Jansen do 3000 itsq = 1, ntseq 22359599516SKenneth E. Jansen itseq = itsq 22459599516SKenneth E. Jansenc 22559599516SKenneth E. Jansenc.... set up the current parameters 22659599516SKenneth E. Jansenc 22759599516SKenneth E. Jansen nstp = nstep(itseq) 22859599516SKenneth E. Jansen nitr = niter(itseq) 22959599516SKenneth E. Jansen LCtime = loctim(itseq) 23059599516SKenneth E. Jansenc 23159599516SKenneth E. Jansen call itrSetup ( y, acold) 23259599516SKenneth E. Jansen isclr=0 23359599516SKenneth E. Jansen 23459599516SKenneth E. Jansen niter(itseq)=0 ! count number of flow solves in a step 23559599516SKenneth E. Jansen ! (# of iterations) 23659599516SKenneth E. Jansen do i=1,seqsize 23759599516SKenneth E. Jansen if(stepseq(i).eq.0) niter(itseq)=niter(itseq)+1 23859599516SKenneth E. Jansen enddo 23959599516SKenneth E. Jansen nitr = niter(itseq) 24059599516SKenneth E. Jansenc 24159599516SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve 24259599516SKenneth E. Jansenc 24359599516SKenneth E. Jansen nsclrsol=nsclr ! total number of scalars solved. At 24459599516SKenneth E. Jansen ! some point we probably want to create 24559599516SKenneth E. Jansen ! a map, considering stepseq(), to find 24659599516SKenneth E. Jansen ! what is actually solved and only 24759599516SKenneth E. Jansen ! dimension EGmasst to the appropriate 24859599516SKenneth E. Jansen ! size. 24959599516SKenneth E. Jansen 25059599516SKenneth E. Jansen if(nsclrsol.gt.0)allocate (EGmasst(numel*nshape*nshape 25159599516SKenneth E. Jansen & ,nsclrsol)) 25259599516SKenneth E. Jansen 25359599516SKenneth E. Jansenc 25459599516SKenneth E. Jansenc.... loop through the time steps 25559599516SKenneth E. Jansenc 25659599516SKenneth E. Jansen ttim(1) = REAL(secs(0.0)) / 100. 25759599516SKenneth E. Jansen ttim(2) = secs(0.0) 25859599516SKenneth E. Jansen 25959599516SKenneth E. Jansenc tcorecp1 = REAL(secs(0.0)) / 100. 26059599516SKenneth E. Jansenc tcorewc1 = secs(0.0) 26159599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 262*513954efSKenneth E. Jansen if(myrank.eq.master) then 26359599516SKenneth E. Jansen tcorecp1 = TMRC() 26459599516SKenneth E. Jansen endif 26559599516SKenneth E. Jansen 26659599516SKenneth E. Jansen rmub=datmat(1,2,1) 26759599516SKenneth E. Jansen if(rmutarget.gt.0) then 26859599516SKenneth E. Jansen rmue=rmutarget 26959599516SKenneth E. Jansen xmulfact=(rmue/rmub)**(1.0/nstp) 270*513954efSKenneth E. Jansen if(myrank.eq.master) then 27159599516SKenneth E. Jansen write(*,*) 'viscosity will by multiplied by ', xmulfact 27259599516SKenneth E. Jansen write(*,*) 'to bring it from ', rmub,' down to ', rmue 27359599516SKenneth E. Jansen endif 27459599516SKenneth E. Jansen datmat(1,2,1)=datmat(1,2,1)/xmulfact ! make first step right 27559599516SKenneth E. Jansen else 27659599516SKenneth E. Jansen rmue=datmat(1,2,1) ! keep constant 27759599516SKenneth E. Jansen xmulfact=one 27859599516SKenneth E. Jansen endif 27959599516SKenneth E. Jansen if(iramp.eq.1) then 28059599516SKenneth E. Jansen call initBCprofileScale(vbc_prof,BC,yold,x) 28159599516SKenneth E. Jansen! fix the yold values to the reset BC 28259599516SKenneth E. Jansen call itrBC (yold, ac, iBC, BC, iper, ilwork) 28359599516SKenneth E. Jansen isclr=1 ! fix scalar 28459599516SKenneth E. Jansen call itrBCsclr(yold,ac,iBC,BC,iper,ilwork) 28559599516SKenneth E. Jansen endif 28659599516SKenneth E. Jansen 28759599516SKenneth E. Jansen867 continue 288*513954efSKenneth E. Jansen 289*513954efSKenneth E. Jansen 290*513954efSKenneth E. Jansenc============ Start the loop of time steps============================c 291*513954efSKenneth E. Jansen! edamp2=.99 292*513954efSKenneth E. Jansen! edamp3=0.05 293*513954efSKenneth E. Jansen deltaInlInv=one/(0.125*0.0254) 29459599516SKenneth E. Jansen do 2000 istp = 1, nstp 295*513954efSKenneth E. Jansen 296*513954efSKenneth E. Jansen 29759599516SKenneth E. Jansen if(iramp.eq.1) 29859599516SKenneth E. Jansen & call BCprofileScale(vbc_prof,BC,yold) 29959599516SKenneth E. Jansen 30059599516SKenneth E. Jansenc call rerun_check(stopjob) 30159599516SKenneth E. Jansencc if(stopjob.ne.0) goto 2001 30259599516SKenneth E. Jansenc 30359599516SKenneth E. Jansenc Decay of scalars 30459599516SKenneth E. Jansenc 30559599516SKenneth E. Jansen if(nsclr.gt.0 .and. tdecay.ne.1) then 30659599516SKenneth E. Jansen yold(:,6:ndof)=y(:,6:ndof)*tdecay 30759599516SKenneth E. Jansen BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*tdecay 30859599516SKenneth E. Jansen endif 30959599516SKenneth E. Jansen 31059599516SKenneth E. Jansen if(nosource.eq.1) BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*0.8 31159599516SKenneth E. Jansen 31259599516SKenneth E. Jansen 31359599516SKenneth E. Jansenc xi=istp*one/nstp 31459599516SKenneth E. Jansenc datmat(1,2,1)=rmub*(1.0-xi)+xi*rmue 31559599516SKenneth E. Jansen datmat(1,2,1)=xmulfact*datmat(1,2,1) 31659599516SKenneth E. Jansen 31759599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC. 31859599516SKenneth E. Jansenc these will be for time step n+1 so use lstep+1 31959599516SKenneth E. Jansenc 32059599516SKenneth E. Jansen if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl, 32159599516SKenneth E. Jansen & shpb, shglb, x, BC, iBC) 32259599516SKenneth E. Jansen 32359599516SKenneth E. Jansen if(iLES.gt.0) then 32459599516SKenneth E. Jansenc 32559599516SKenneth E. Jansenc.... get dynamic model coefficient 32659599516SKenneth E. Jansenc 32759599516SKenneth E. Jansen ilesmod=iLES/10 32859599516SKenneth E. Jansenc 32959599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model 33059599516SKenneth E. Jansenc 33159599516SKenneth E. Jansen if (ilesmod.eq.0) then ! 0 < iLES < 10 => dyn. model calculated 33259599516SKenneth E. Jansen ! at nodes based on discrete filtering 33359599516SKenneth E. Jansen call getdmc (yold, shgl, shp, 33459599516SKenneth E. Jansen & iper, ilwork, nsons, 33559599516SKenneth E. Jansen & ifath, x) 33659599516SKenneth E. Jansen endif 33759599516SKenneth E. Jansen if (ilesmod .eq. 1) then ! 10 < iLES < 20 => dynamic-mixed 33859599516SKenneth E. Jansen ! at nodes based on discrete filtering 33959599516SKenneth E. Jansen call bardmc (yold, shgl, shp, 34059599516SKenneth E. Jansen & iper, ilwork, 34159599516SKenneth E. Jansen & nsons, ifath, x) 34259599516SKenneth E. Jansen endif 34359599516SKenneth E. Jansen if (ilesmod .eq. 2) then ! 20 < iLES < 30 => dynamic at quad 34459599516SKenneth E. Jansen ! pts based on lumped projection filt. 34559599516SKenneth E. Jansen call projdmc (yold, shgl, shp, 34659599516SKenneth E. Jansen & iper, ilwork, x) 34759599516SKenneth E. Jansen endif 34859599516SKenneth E. Jansenc 349*513954efSKenneth E. Jansen endif ! endif of iLES 35059599516SKenneth E. Jansen 35159599516SKenneth E. Jansen 35259599516SKenneth E. Jansenc 35359599516SKenneth E. Jansenc.... set traction BCs for modeled walls 35459599516SKenneth E. Jansenc 35559599516SKenneth E. Jansen if (itwmod.ne.0) then !wallfn check 35659599516SKenneth E. Jansen call asbwmod(yold, acold, x, BC, iBC, 35759599516SKenneth E. Jansen & iper, ilwork, ifath, velbar) 35859599516SKenneth E. Jansen endif 35959599516SKenneth E. Jansenc 36059599516SKenneth E. Jansenc.... -----------------------> predictor phase <----------------------- 36159599516SKenneth E. Jansenc 36259599516SKenneth E. Jansen call itrPredict( yold, acold, y, ac ) 36359599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper, ilwork) 36459599516SKenneth E. Jansen isclr = zero 36559599516SKenneth E. Jansen if (nsclr.gt.zero) then 36659599516SKenneth E. Jansen do isclr=1,nsclr 36759599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 36859599516SKenneth E. Jansen enddo 36959599516SKenneth E. Jansen endif 37059599516SKenneth E. Jansenc 37159599516SKenneth E. Jansenc.... --------------------> multi-corrector phase <-------------------- 37259599516SKenneth E. Jansenc 37359599516SKenneth E. Jansen iter=0 37459599516SKenneth E. Jansen ilss=0 ! this is a switch thrown on first solve of LS redistance 37559599516SKenneth E. Jansenc 37659599516SKenneth E. JansencHACK to make it keep solving RANS until tolerance is reached 37759599516SKenneth E. Jansenc 37859599516SKenneth E. Jansen istop=0 379*513954efSKenneth E. Jansen! blocking extra RANS steps for now iMoreRANS=0 380*513954efSKenneth E. Jansen iMoreRANS=6 38159599516SKenneth E. Jansenc 38259599516SKenneth E. Jansenc find the the RANS portion of the sequence 38359599516SKenneth E. Jansenc 38459599516SKenneth E. Jansen do istepc=1,seqsize 38559599516SKenneth E. Jansen if(stepseq(istepc).eq.10) iLastRANS=istepc 38659599516SKenneth E. Jansen enddo 38759599516SKenneth E. Jansen 38859599516SKenneth E. Jansen iseqStart=1 38959599516SKenneth E. Jansen9876 continue 39059599516SKenneth E. Jansenc 39159599516SKenneth E. Jansen do istepc=iseqStart,seqsize 39259599516SKenneth E. Jansen icode=stepseq(istepc) 39359599516SKenneth E. Jansen if(mod(icode,10).eq.0) then ! this is a solve 39459599516SKenneth E. Jansen isolve=icode/10 39559599516SKenneth E. Jansen if(isolve.eq.0) then ! flow solve (encoded as 0) 39659599516SKenneth E. Jansenc 39759599516SKenneth E. Jansen etol=epstol(1) 39859599516SKenneth E. Jansen iter = iter+1 39959599516SKenneth E. Jansen ifuncs(1) = ifuncs(1) + 1 40059599516SKenneth E. Jansenc 40159599516SKenneth E. Jansenc.... reset the aerodynamic forces 40259599516SKenneth E. Jansenc 40359599516SKenneth E. Jansen Force(1) = zero 40459599516SKenneth E. Jansen Force(2) = zero 40559599516SKenneth E. Jansen Force(3) = zero 40659599516SKenneth E. Jansen HFlux = zero 40759599516SKenneth E. Jansenc 40859599516SKenneth E. Jansenc.... form the element data and solve the matrix problem 40959599516SKenneth E. Jansenc 41059599516SKenneth E. Jansenc.... explicit solver 41159599516SKenneth E. Jansenc 41259599516SKenneth E. Jansen if (impl(itseq) .eq. 0) then 41359599516SKenneth E. Jansen if (myrank .eq. master) 41459599516SKenneth E. Jansen & call error('itrdrv ','impl ',impl(itseq)) 41559599516SKenneth E. Jansen endif 41659599516SKenneth E. Jansen if (mod(impl(1),100)/10 .eq. 1) then ! sparse solve 41759599516SKenneth E. Jansenc 41859599516SKenneth E. Jansenc.... preconditioned sparse matrix GMRES solver 41959599516SKenneth E. Jansenc 42059599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1))) 42159599516SKenneth E. Jansen iprec=lhs 42259599516SKenneth E. Jansen nedof = nflow*nshape 42359599516SKenneth E. Jansenc write(*,*) 'lhs=',lhs 424*513954efSKenneth E. Jansen if(usingpetsc.eq.1) then 425*513954efSKenneth E. Jansen call SolGMRp (y, ac, yold, 426*513954efSKenneth E. Jansen & x, 427*513954efSKenneth E. Jansen & iBC, BC, 428*513954efSKenneth E. Jansen & colm, rowp, lhsk, 429*513954efSKenneth E. Jansen & res, 430*513954efSKenneth E. Jansen & BDiag, 431*513954efSKenneth E. Jansen & iper, ilwork, 432*513954efSKenneth E. Jansen & shp, shgl, 433*513954efSKenneth E. Jansen & shpb, shglb, solinc, 434*513954efSKenneth E. Jansen & rerr, fncorp ) 435*513954efSKenneth E. Jansen else 43659599516SKenneth E. Jansen call SolGMRs (y, ac, yold, 43759599516SKenneth E. Jansen & acold, x, 43859599516SKenneth E. Jansen & iBC, BC, 43959599516SKenneth E. Jansen & colm, rowp, lhsk, 44059599516SKenneth E. Jansen & res, 44159599516SKenneth E. Jansen & BDiag, a(mHBrg), a(meBrg), 44259599516SKenneth E. Jansen & a(myBrg), a(mRcos), a(mRsin), 44359599516SKenneth E. Jansen & iper, ilwork, 44459599516SKenneth E. Jansen & shp, shgl, 44559599516SKenneth E. Jansen & shpb, shglb, solinc, 44659599516SKenneth E. Jansen & rerr) 447*513954efSKenneth E. Jansen endif 44859599516SKenneth E. Jansen else if (mod(impl(1),100)/10 .eq. 2) then ! mfg solve 44959599516SKenneth E. Jansenc 45059599516SKenneth E. Jansenc.... preconditioned matrix-free GMRES solver 45159599516SKenneth E. Jansenc 45259599516SKenneth E. Jansen lhs=0 45359599516SKenneth E. Jansen iprec = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1))) 45459599516SKenneth E. Jansen nedof = 0 45559599516SKenneth E. Jansen call SolMFG (y, ac, yold, 45659599516SKenneth E. Jansen & acold, x, 45759599516SKenneth E. Jansen & iBC, BC, 45859599516SKenneth E. Jansen & res, 45959599516SKenneth E. Jansen & BDiag, a(mHBrg), a(meBrg), 46059599516SKenneth E. Jansen & a(myBrg), a(mRcos), a(mRsin), 46159599516SKenneth E. Jansen & iper, ilwork, 46259599516SKenneth E. Jansen & shp, shgl, 46359599516SKenneth E. Jansen & shpb, shglb, solinc, 46459599516SKenneth E. Jansen & rerr) 46559599516SKenneth E. Jansenc 46659599516SKenneth E. Jansen else if (mod(impl(1),100)/10 .eq. 3) then ! ebe solve 46759599516SKenneth E. Jansenc.... preconditioned ebe matrix GMRES solver 46859599516SKenneth E. Jansenc 46959599516SKenneth E. Jansen 47059599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1))) 47159599516SKenneth E. Jansen iprec = lhs 47259599516SKenneth E. Jansen nedof = nflow*nshape 47359599516SKenneth E. Jansenc write(*,*) 'lhs=',lhs 47459599516SKenneth E. Jansen call SolGMRe (y, ac, yold, 47559599516SKenneth E. Jansen & acold, x, 47659599516SKenneth E. Jansen & iBC, BC, 47759599516SKenneth E. Jansen & EGmass, res, 47859599516SKenneth E. Jansen & BDiag, a(mHBrg), a(meBrg), 47959599516SKenneth E. Jansen & a(myBrg), a(mRcos), a(mRsin), 48059599516SKenneth E. Jansen & iper, ilwork, 48159599516SKenneth E. Jansen & shp, shgl, 48259599516SKenneth E. Jansen & shpb, shglb, solinc, 48359599516SKenneth E. Jansen & rerr) 48459599516SKenneth E. Jansen endif 48559599516SKenneth E. Jansenc 48659599516SKenneth E. Jansen else ! solve a scalar (encoded at isclr*10) 48759599516SKenneth E. Jansen isclr=isolve 488*513954efSKenneth E. Jansen etol=epstol(isclr+2) ! note that for both epstol and LHSupd 1 is flow 2 temp isclr+2 for scalars 489*513954efSKenneth E. Jansen ifuncs(isclr+2) = ifuncs(isclr+2) + 1 49059599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.0) 49159599516SKenneth E. Jansen & .and.(isclr.eq.2)) then 49259599516SKenneth E. Jansen ilss=1 ! throw switch (once per step) 49359599516SKenneth E. Jansenc 49459599516SKenneth E. Jansenc... copy the first scalar at t=n+1 into the second scalar of the 49559599516SKenneth E. Jansenc... level sets 49659599516SKenneth E. Jansenc 49759599516SKenneth E. Jansen y(:,6) = yold(:,6) + (y(:,6)-yold(:,6))/alfi 49859599516SKenneth E. Jansen y(:,7) = y(:,6) 49959599516SKenneth E. Jansen yold(:,7) = y(:,7) 50059599516SKenneth E. Jansen ac(:,7) = zero 50159599516SKenneth E. Jansenc 50259599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 50359599516SKenneth E. Jansenc 50459599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the 50559599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar 50659599516SKenneth E. Jansenc 50759599516SKenneth E. Jansen alfit=alfi 50859599516SKenneth E. Jansen gamit=gami 50959599516SKenneth E. Jansen almit=almi 51059599516SKenneth E. Jansen alfi = 1 51159599516SKenneth E. Jansen gami = 1 51259599516SKenneth E. Jansen almi = 1 51359599516SKenneth E. Jansen endif 51459599516SKenneth E. Jansenc 51559599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(isclr+2)-1, 51659599516SKenneth E. Jansen & LHSupd(isclr+2))) 51759599516SKenneth E. Jansen iprec = lhs 51859599516SKenneth E. Jansen istop=0 519*513954efSKenneth E. Jansen if(usingPETSc.eq.1) then 520*513954efSKenneth E. Jansen call SolGMRpSclr(y, ac, 521*513954efSKenneth E. Jansen & x, elDw, 522*513954efSKenneth E. Jansen & iBC, BC, 523*513954efSKenneth E. Jansen & colm, rowp, 524*513954efSKenneth E. Jansen & iper, ilwork, 525*513954efSKenneth E. Jansen & shp, shgl, 526*513954efSKenneth E. Jansen & shpb, shglb, rest, 527*513954efSKenneth E. Jansen & solinc(1,isclr+5),fncorp) 528*513954efSKenneth E. Jansen 529*513954efSKenneth E. Jansen else 53059599516SKenneth E. Jansen call SolGMRSclr(y, ac, yold, 53159599516SKenneth E. Jansen & acold, EGmasst(1,isclr), 53259599516SKenneth E. Jansen & x, elDw, 53359599516SKenneth E. Jansen & iBC, BC, 53459599516SKenneth E. Jansen & rest, 53559599516SKenneth E. Jansen & a(mHBrg), a(meBrg), 53659599516SKenneth E. Jansen & a(myBrg), a(mRcos), a(mRsin), 53759599516SKenneth E. Jansen & iper, ilwork, 53859599516SKenneth E. Jansen & shp, shgl, 53959599516SKenneth E. Jansen & shpb, shglb, solinc(1,isclr+5)) 540*513954efSKenneth E. Jansen endif 54159599516SKenneth E. Jansenc 54259599516SKenneth E. Jansen endif ! end of scalar type solve 54359599516SKenneth E. Jansenc 54459599516SKenneth E. Jansenc 54559599516SKenneth E. Jansenc.... end of the multi-corrector loop 54659599516SKenneth E. Jansenc 54759599516SKenneth E. Jansen 1000 continue !check this 54859599516SKenneth E. Jansen 54959599516SKenneth E. Jansen else ! this is an update (mod did not equal zero) 55059599516SKenneth E. Jansen iupdate=icode/10 ! what to update 55159599516SKenneth E. Jansen if(iupdate.eq.0) then !update flow 55259599516SKenneth E. Jansen call itrCorrect ( y, ac, yold, acold, solinc) 55359599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper, ilwork) 55459599516SKenneth E. Jansen call tnanq(y, 5, 'y_updbc') 55559599516SKenneth E. Jansenc Elaine-SPEBC 55659599516SKenneth E. Jansen if((irscale.ge.0).and.(myrank.eq.master)) then 55759599516SKenneth E. Jansen call genscale(y, x, iBC) 55859599516SKenneth E. Jansenc call itrBC (y, ac, iBC, BC, iper, ilwork) 55959599516SKenneth E. Jansen endif 56059599516SKenneth E. Jansen else ! update scalar 56159599516SKenneth E. Jansen isclr=iupdate !unless 56259599516SKenneth E. Jansen if(iupdate.eq.nsclr+1) isclr=0 56359599516SKenneth E. Jansen call itrCorrectSclr ( y, ac, yold, acold, 56459599516SKenneth E. Jansen & solinc(1,isclr+5)) 56559599516SKenneth E. Jansen if (ilset.eq.2 .and. isclr.eq.2) then 56659599516SKenneth E. Jansen fct2=one/almi 56759599516SKenneth E. Jansen fct3=one/alfi 56859599516SKenneth E. Jansen acold(:,7) = acold(:,7) 56959599516SKenneth E. Jansen & + (ac(:,7)-acold(:,7))*fct2 57059599516SKenneth E. Jansen yold(:,7) = yold(:,7) 57159599516SKenneth E. Jansen & + (y(:,7)-yold(:,7))*fct3 57259599516SKenneth E. Jansen call itrBCSclr ( yold, acold, iBC, BC, 57359599516SKenneth E. Jansen & iper, ilwork) 57459599516SKenneth E. Jansen ac(:,7) = acold(:,7)*(one-almi/gami) 57559599516SKenneth E. Jansen y(:,7) = yold(:,7) 57659599516SKenneth E. Jansen ac(:,7) = zero 57759599516SKenneth E. Jansen if (ivconstraint .eq. 1) then 57859599516SKenneth E. Jansen & 57959599516SKenneth E. Jansenc ... applying the volume constraint 58059599516SKenneth E. Jansenc 58159599516SKenneth E. Jansen call solvecon (y, x, iBC, BC, 58259599516SKenneth E. Jansen & iper, ilwork, shp, shgl) 58359599516SKenneth E. Jansenc 58459599516SKenneth E. Jansen endif ! end of volume constraint calculations 58559599516SKenneth E. Jansen endif 58659599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, ilwork) 58759599516SKenneth E. Jansen endif 58859599516SKenneth E. Jansen endif !end of switch between solve or update 58959599516SKenneth E. Jansen enddo ! loop over sequence in step 59059599516SKenneth E. Jansen if((istop.lt.0).and.(iMoreRANS.lt.5)) then 59159599516SKenneth E. Jansen iMoreRANS=iMoreRANS+1 592*513954efSKenneth E. Jansen if(myrank.eq.master) write(*,*) 'istop =', istop 59359599516SKenneth E. Jansen iseqStart=iLastRANS 59459599516SKenneth E. Jansen goto 9876 59559599516SKenneth E. Jansen endif 59659599516SKenneth E. Jansenc 59759599516SKenneth E. Jansenc Find the solution at the end of the timestep and move it to old 59859599516SKenneth E. Jansenc 59959599516SKenneth E. Jansenc.... First to reassign the parameters for the original time integrator scheme 60059599516SKenneth E. Jansenc 60159599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.1)) then 60259599516SKenneth E. Jansen alfi =alfit 60359599516SKenneth E. Jansen gami =gamit 60459599516SKenneth E. Jansen almi =almit 60559599516SKenneth E. Jansen endif 60659599516SKenneth E. Jansen call itrUpdate( yold, acold, y, ac) 60759599516SKenneth E. Jansen call itrBC (yold, acold, iBC, BC, iper,ilwork) 60859599516SKenneth E. Jansenc Elaine-SPEBC 60959599516SKenneth E. Jansen if((irscale.ge.0).and.(myrank.eq.master)) then 61059599516SKenneth E. Jansen call genscale(yold, x, iBC) 61159599516SKenneth E. Jansenc call itrBC (y, ac, iBC, BC, iper, ilwork) 61259599516SKenneth E. Jansen endif 61359599516SKenneth E. Jansen do isclr=1,nsclr 61459599516SKenneth E. Jansen call itrBCSclr (yold, acold, iBC, BC, iper, ilwork) 61559599516SKenneth E. Jansen enddo 61659599516SKenneth E. Jansenc 61759599516SKenneth E. Jansen istep = istep + 1 61859599516SKenneth E. Jansen lstep = lstep + 1 61959599516SKenneth E. Jansen ntoutv=max(ntout,100) 620*513954efSKenneth E. Jansen !boundary flux output moved after the error calculation so 621*513954efSKenneth E. Jansen !everything can be written out in a single chunk of code - 622*513954efSKenneth E. Jansen !Nicholas Mati 62359599516SKenneth E. Jansen 624*513954efSKenneth E. Jansen !dump TIME SERIES 62559599516SKenneth E. Jansen if (exts) then 626*513954efSKenneth E. Jansen !Write the probe data to disc. Note that IO to disc only 627*513954efSKenneth E. Jansen !occurs when mod(lstep, nbuff) == 0. However, this 628*513954efSKenneth E. Jansen !function also does data buffering and must be called 629*513954efSKenneth E. Jansen !every time step. 630*513954efSKenneth E. Jansen call TD_bufferData() 631*513954efSKenneth E. Jansen call TD_writeData(fvarts, .false.) 63259599516SKenneth E. Jansen endif 63359599516SKenneth E. Jansen 634*513954efSKenneth E. Jansen !Update the Mach Control 635*513954efSKenneth E. Jansen if(exts .and. exMC) then 636*513954efSKenneth E. Jansen !Note: the function MC_updateState must be called after 637*513954efSKenneth E. Jansen !the function TD_bufferData due to dependencies on 638*513954efSKenneth E. Jansen !vartsbuff(:,:,:). 639*513954efSKenneth E. Jansen call MC_updateState() 640*513954efSKenneth E. Jansen call MC_applyBC(BC) 641*513954efSKenneth E. Jansen call MC_printState() 64259599516SKenneth E. Jansen 643*513954efSKenneth E. Jansen !Write the state if a restart is also being written. 644*513954efSKenneth E. Jansen if(mod(lstep,ntout).eq.0 ) call MC_writeState(lstep) 645*513954efSKenneth E. Jansen endif 64659599516SKenneth E. Jansen 647*513954efSKenneth E. Jansen !update blower control 648*513954efSKenneth E. Jansen if(BC_enable) then 649*513954efSKenneth E. Jansen !Update the blower boundary conditions for the next 650*513954efSKenneth E. Jansen !iteration. 651*513954efSKenneth E. Jansen call BC_iter(BC) 65259599516SKenneth E. Jansen 653*513954efSKenneth E. Jansen !Also write the current phases of the blowers if a 654*513954efSKenneth E. Jansen !restart is also being written. 655*513954efSKenneth E. Jansen if(mod(lstep, ntout) == 0) call BC_writePhase(lstep) 656*513954efSKenneth E. Jansen endif 65759599516SKenneth E. Jansen 658*513954efSKenneth E. Jansen !.... Yi Chen Duct geometry8 659*513954efSKenneth E. Jansen if(isetBlowing_Duct.gt.0)then 660*513954efSKenneth E. Jansen if(ifixBlowingVel_Duct.eq.0)then 661*513954efSKenneth E. Jansen if(nstp.gt.nBlowingStepsDuct)then 662*513954efSKenneth E. Jansen nBlowingStepsDuct = nstp-2 663*513954efSKenneth E. Jansen endif 664*513954efSKenneth E. Jansen call setBlowing_Duct2(x,BC,yold,iTurbWall,istp) 66559599516SKenneth E. Jansen endif 66659599516SKenneth E. Jansen endif 667*513954efSKenneth E. Jansen !... Yi Chen Duct geometry8 66859599516SKenneth E. Jansen 66959599516SKenneth E. Jansenc 67059599516SKenneth E. Jansenc.... -------------------> error calculation <----------------- 67159599516SKenneth E. Jansen if(ierrcalc.eq.1.or.ioybar.eq.1) then 67259599516SKenneth E. Jansen tfact=one/istep 67359599516SKenneth E. Jansen do idof=1,ndof 67459599516SKenneth E. Jansen ybar(:,idof) =tfact*yold(:,idof) + 67559599516SKenneth E. Jansen & (one-tfact)*ybar(:,idof) 67659599516SKenneth E. Jansen enddo 67759599516SKenneth E. Jansenc....compute average 67859599516SKenneth E. Jansenc... ybar(:,ndof+1:ndof+8) is for avg. of square as uu, vv, ww, pp, TT, uv, uw, and vw 67959599516SKenneth E. Jansen do idof=1,5 ! avg. of square for 5 flow variables 68059599516SKenneth E. Jansen ybar(:,ndof+idof) = tfact*yold(:,idof)**2 + 68159599516SKenneth E. Jansen & (one-tfact)*ybar(:,ndof+idof) 68259599516SKenneth E. Jansen enddo 68359599516SKenneth E. Jansen ybar(:,ndof+6) = tfact*yold(:,1)*yold(:,2) + !uv 68459599516SKenneth E. Jansen & (one-tfact)*ybar(:,ndof+6) 68559599516SKenneth E. Jansen ybar(:,ndof+7) = tfact*yold(:,1)*yold(:,3) + !uw 68659599516SKenneth E. Jansen & (one-tfact)*ybar(:,ndof+7) 68759599516SKenneth E. Jansen ybar(:,ndof+8) = tfact*yold(:,2)*yold(:,3) + !vw 68859599516SKenneth E. Jansen & (one-tfact)*ybar(:,ndof+8) 68959599516SKenneth E. Jansenc... compute err 690*513954efSKenneth E. Jansen rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2 691*513954efSKenneth E. Jansen rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2 692*513954efSKenneth E. Jansen rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2 693*513954efSKenneth E. Jansen rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2 69459599516SKenneth E. Jansen endif 695*513954efSKenneth E. Jansen 696*513954efSKenneth E. Jansenc.. writing ybar field if requested in each restart file 697*513954efSKenneth E. Jansen 698*513954efSKenneth E. Jansen !here is where we save our averaged field. In some cases we want to 699*513954efSKenneth E. Jansen !write it less frequently 700*513954efSKenneth E. Jansen if( (irs >= 1) .and. ( 701*513954efSKenneth E. Jansen & mod(lstep, ntout) == 0 .or. !Checkpoint 702*513954efSKenneth E. Jansen & istep == nstp) )then !End of simulation 703*513954efSKenneth E. Jansen 704*513954efSKenneth E. Jansen if( (mod(lstep, ntoutv) .eq. 0) .and. 705*513954efSKenneth E. Jansen & ((irscale.ge.0).or.(itwmod.gt.0) .or. 706*513954efSKenneth E. Jansen & ((nsonmax.eq.1).and.(iLES.gt.0)))) 707*513954efSKenneth E. Jansen & call rwvelb ('out ', velbar ,ifail) 708*513954efSKenneth E. Jansen 709*513954efSKenneth E. Jansen !BUG: need to update new_interface to work with SyncIO. 710*513954efSKenneth E. Jansen !Bflux is presently completely crippled. Note that restar 711*513954efSKenneth E. Jansen !has also been moved here for readability. 712*513954efSKenneth E. Jansen! call Bflux (yold, acold, x, compute boundary fluxes and print out 713*513954efSKenneth E. Jansen! & shp, shgl, shpb, 714*513954efSKenneth E. Jansen! & shglb, nodflx, ilwork) 715*513954efSKenneth E. Jansen 716*513954efSKenneth E. Jansen call timer ('Output ') !set up the timer 717*513954efSKenneth E. Jansen 718*513954efSKenneth E. Jansen !write the solution and time derivative 719*513954efSKenneth E. Jansen call restar ('out ', yold, acold) 720*513954efSKenneth E. Jansen 721*513954efSKenneth E. Jansen !Write the distance to wall field in each restart 722*513954efSKenneth E. Jansen if((istep==nstp) .and. (irans < 0 )) then !d2wall is allocated 723*513954efSKenneth E. Jansen call write_field(myrank,'a'//char(0),'dwal'//char(0),4, 724*513954efSKenneth E. Jansen & d2wall,'d'//char(0), nshg, 1, lstep) 725*513954efSKenneth E. Jansen endif 726*513954efSKenneth E. Jansen 727*513954efSKenneth E. Jansen !Write the time average in each restart. 728*513954efSKenneth E. Jansen if(ioybar.eq.1)then 729*513954efSKenneth E. Jansen call write_field(myrank,'a'//char(0),'ybar'//char(0),4, 730*513954efSKenneth E. Jansen & ybar,'d'//char(0),nshg,ndof+8,lstep) 731*513954efSKenneth E. Jansen endif 732*513954efSKenneth E. Jansen 733*513954efSKenneth E. Jansen !Write the error feild at the end of each step sequence 734*513954efSKenneth E. Jansen if(ierrcalc.eq.1 .and. istep == nstp) then 735*513954efSKenneth E. Jansen !smooth the error indicators 736*513954efSKenneth E. Jansen 737*513954efSKenneth E. Jansen do i=1,ierrsmooth 738*513954efSKenneth E. Jansen call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC ) 739*513954efSKenneth E. Jansen enddo 740*513954efSKenneth E. Jansen 741*513954efSKenneth E. Jansen! call write_error(myrank, lstep, nshg, 10, rerr ) 742*513954efSKenneth E. Jansen call write_field( 743*513954efSKenneth E. Jansen & myrank, 'a'//char(0), 'errors'//char(0), 6, 744*513954efSKenneth E. Jansen & rerr, 'd'//char(0), nshg, 10, lstep) 745*513954efSKenneth E. Jansen endif 746*513954efSKenneth E. Jansen 747*513954efSKenneth 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 748*513954efSKenneth E. Jansenc 749*513954efSKenneth E. Jansenc call write_field2(myrank,'a'//char(0),'ybar'//char(0), 750*513954efSKenneth E. Jansenc & 4,ybar,'d'//char(0),nshg,ndof+8, 751*513954efSKenneth E. Jansenc & lstep,istep) 752*513954efSKenneth E. Jansen endif 753*513954efSKenneth E. Jansen 754*513954efSKenneth E. Jansen 2000 continue !end of NSTEP loop 75559599516SKenneth E. Jansen 2001 continue 75659599516SKenneth E. Jansen 75759599516SKenneth E. Jansen ttim(1) = REAL(secs(0.0)) / 100. - ttim(1) 75859599516SKenneth E. Jansen ttim(2) = secs(0.0) - ttim(2) 75959599516SKenneth E. Jansen 76059599516SKenneth E. Jansenc tcorecp2 = REAL(secs(0.0)) / 100. 76159599516SKenneth E. Jansenc tcorewc2 = secs(0.0) 76259599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 763*513954efSKenneth E. Jansen if(myrank.eq.master) then 76459599516SKenneth E. Jansen tcorecp2 = TMRC() 76559599516SKenneth E. Jansen write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1 76659599516SKenneth E. Jansen endif 76759599516SKenneth E. Jansen 76859599516SKenneth E. Jansenc call wtime 76959599516SKenneth E. Jansen 770*513954efSKenneth E. Jansen 3000 continue !end of NTSEQ loop 77159599516SKenneth E. Jansenc 77259599516SKenneth E. Jansenc.... ----------------------> Post Processing <---------------------- 77359599516SKenneth E. Jansenc 77459599516SKenneth E. Jansenc.... print out the last step 77559599516SKenneth E. Jansenc 776*513954efSKenneth E. Jansen! if ( (irs .ge. 1) .and. ((mod(lstep, ntout) .ne. 0) .or. 777*513954efSKenneth E. Jansen! & (nstp .eq. 0))) then 778*513954efSKenneth E. Jansen! if( (mod(lstep, ntoutv) .eq. 0) .and. 779*513954efSKenneth E. Jansen! & ((irscale.ge.0).or.(itwmod.gt.0) .or. 780*513954efSKenneth E. Jansen! & ((nsonmax.eq.1).and.(iLES.gt.0)))) 781*513954efSKenneth E. Jansen! & call rwvelb ('out ', velbar ,ifail) 782*513954efSKenneth E. Jansen! 783*513954efSKenneth E. Jansen! call Bflux (yold, acold, x, 784*513954efSKenneth E. Jansen! & shp, shgl, shpb, 785*513954efSKenneth E. Jansen! & shglb, nodflx, ilwork) 786*513954efSKenneth E. Jansen! endif 78759599516SKenneth E. Jansen 788*513954efSKenneth E. Jansen 789*513954efSKenneth E. Jansen 790*513954efSKenneth E. Jansenc if(ioybar.eq.1) then 791*513954efSKenneth E. Jansenc call write_field(myrank,'a'//char(0),'ybar'//char(0),4, 792*513954efSKenneth E. Jansenc & ybar,'d'//char(0),nshg,ndof+8,lstep) 793*513954efSKenneth E. Jansenc endif 794*513954efSKenneth E. Jansen 795*513954efSKenneth E. Jansenc if(iRANS.lt.0 .and. idistcalc.eq.1) then 796*513954efSKenneth E. Jansenc call write_field(myrank,'a'//char(0),'DESd'//char(0),4, 797*513954efSKenneth E. Jansenc & elDw,'d'//char(0),numel,1,lstep) 79859599516SKenneth E. Jansenc 799*513954efSKenneth E. Jansenc call write_field(myrank,'a'//char(0),'dwal'//char(0),4, 800*513954efSKenneth E. Jansenc & d2wall,'d'//char(0),nshg,1,lstep) 801*513954efSKenneth E. Jansenc endif 80259599516SKenneth E. Jansen 80359599516SKenneth E. Jansenc 80459599516SKenneth E. Jansenc.... close history and aerodynamic forces files 80559599516SKenneth E. Jansenc 80659599516SKenneth E. Jansen if (myrank .eq. master) then 80759599516SKenneth E. Jansen close (ihist) 80859599516SKenneth E. Jansen close (iforce) 809*513954efSKenneth E. Jansen 810*513954efSKenneth E. Jansen if(exMC) then 811*513954efSKenneth E. Jansen call MC_writeState(lstep) 812*513954efSKenneth E. Jansen call MC_finalize 813*513954efSKenneth E. Jansen endif 814*513954efSKenneth E. Jansen 81559599516SKenneth E. Jansen if(exts) then 816*513954efSKenneth E. Jansen call TD_writeData(fvarts, .true.) !force the flush of the buffer. 817*513954efSKenneth E. Jansen call TD_finalize 81859599516SKenneth E. Jansen endif 81959599516SKenneth E. Jansen endif 820*513954efSKenneth E. Jansen 821*513954efSKenneth E. Jansen if(BC_enable) then !blower is allocated on all processes. 822*513954efSKenneth E. Jansen if(mod(lstep, ntout) /= 0) then !May have already written file. 823*513954efSKenneth E. Jansen call BC_writePhase(lstep) 824*513954efSKenneth E. Jansen endif 825*513954efSKenneth E. Jansen 826*513954efSKenneth E. Jansen call BC_finalize 827*513954efSKenneth E. Jansen endif 828*513954efSKenneth E. Jansen 82959599516SKenneth E. Jansen close (iecho) 83059599516SKenneth E. Jansen if(iabc==1) deallocate(acs) 83159599516SKenneth E. Jansenc 83259599516SKenneth E. Jansenc.... end 83359599516SKenneth E. Jansenc 83459599516SKenneth E. Jansen return 83559599516SKenneth E. Jansen end 836*513954efSKenneth E. Jansen 837*513954efSKenneth E. Jansen 838