159599516SKenneth E. Jansen subroutine itrdrv (y, ac, 259599516SKenneth E. Jansen & uold, x, 359599516SKenneth E. Jansen & iBC, BC, 459599516SKenneth E. Jansen & iper, ilwork, shp, 559599516SKenneth E. Jansen & shgl, shpb, shglb, 659599516SKenneth E. Jansen & ifath, velbar, nsons ) 759599516SKenneth E. Jansenc 859599516SKenneth E. Jansenc---------------------------------------------------------------------- 959599516SKenneth E. Jansenc 1059599516SKenneth E. Jansenc This iterative driver is the semi-discrete, predictor multi-corrector 1159599516SKenneth E. Jansenc algorithm. It contains the Hulbert Generalized Alpha method which 1259599516SKenneth E. Jansenc is 2nd order accurate for Rho_inf from 0 to 1. The method can be 1359599516SKenneth E. Jansenc made first-order accurate by setting Rho_inf=-1. It uses CGP and 1459599516SKenneth E. Jansenc GMRES iterative solvers. 1559599516SKenneth E. Jansenc 1659599516SKenneth E. Jansenc working arrays: 1759599516SKenneth E. Jansenc y (nshg,ndof) : Y variables 1859599516SKenneth E. Jansenc x (nshg,nsd) : node coordinates 1959599516SKenneth E. Jansenc iBC (nshg) : BC codes 2059599516SKenneth E. Jansenc BC (nshg,ndofBC) : BC constraint parameters 2159599516SKenneth E. Jansenc iper (nshg) : periodicity table 2259599516SKenneth E. Jansenc 2359599516SKenneth E. Jansenc 2459599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 2559599516SKenneth E. Jansenc Alberto Figueroa, Winter 2004. CMM-FSI 2659599516SKenneth E. Jansenc Irene Vignon, Fall 2004. Impedance BC 2759599516SKenneth E. Jansenc---------------------------------------------------------------------- 2859599516SKenneth E. Jansenc 2959599516SKenneth E. Jansen use pvsQbi !gives us splag (the spmass at the end of this run 3059599516SKenneth E. Jansen use specialBC !gives us itvn 3159599516SKenneth E. Jansen use timedata !allows collection of time series 3259599516SKenneth E. Jansen use convolImpFlow !for Imp bc 3359599516SKenneth E. Jansen use convolRCRFlow !for RCR bc 3459599516SKenneth E. Jansen use turbsa ! used to access d2wall 3575f1c48cSCameron Smith use wallData 36ec121c45SKenneth E. Jansen use fncorpmod 379071d3baSCameron Smith use iso_c_binding 3859599516SKenneth E. Jansen 3959599516SKenneth E. Jansenc use readarrays !reads in uold and acold 4059599516SKenneth E. Jansen 4159599516SKenneth E. Jansen include "common.h" 4259599516SKenneth E. Jansen include "mpif.h" 4359599516SKenneth E. Jansen include "auxmpi.h" 44bd36043dSBen Matthews#ifdef HAVE_SVLS 45ae8d68e4SKenneth E. Jansen include "svLS.h" 46bd36043dSBen Matthews#endif 4779f1763eSKenneth E. Jansen#if !defined(HAVE_SVLS) && !defined(HAVE_LESLIB) 4879f1763eSKenneth E. Jansen#error "You must enable a linear solver during cmake setup" 49bd36043dSBen Matthews#endif 50bd36043dSBen Matthews 5159599516SKenneth E. Jansenc 5259599516SKenneth E. Jansen 5359599516SKenneth E. Jansen 5459599516SKenneth E. Jansen real*8 y(nshg,ndof), ac(nshg,ndof), 5559599516SKenneth E. Jansen & yold(nshg,ndof), acold(nshg,ndof), 5659599516SKenneth E. Jansen & u(nshg,nsd), uold(nshg,nsd), 5759599516SKenneth E. Jansen & x(numnp,nsd), solinc(nshg,ndof), 5859599516SKenneth E. Jansen & BC(nshg,ndofBC), tf(nshg,ndof), 5959599516SKenneth E. Jansen & GradV(nshg,nsdsq) 6059599516SKenneth E. Jansen 6159599516SKenneth E. Jansenc 6259599516SKenneth E. Jansen real*8 res(nshg,ndof) 6359599516SKenneth E. Jansenc 6459599516SKenneth E. Jansen real*8 shp(MAXTOP,maxsh,MAXQPT), 6559599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 6659599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 6759599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 6859599516SKenneth E. Jansenc 6959599516SKenneth E. Jansen integer rowp(nshg,nnz), colm(nshg+1), 7059599516SKenneth E. Jansen & iBC(nshg), 7159599516SKenneth E. Jansen & ilwork(nlwork), 7259599516SKenneth E. Jansen & iper(nshg), ifuncs(6) 7359599516SKenneth E. Jansen 7459599516SKenneth E. Jansen real*8 vbc_prof(nshg,3) 7559599516SKenneth E. Jansen 7659599516SKenneth E. Jansen integer stopjob 7759599516SKenneth E. Jansen character*10 cname2 7859599516SKenneth E. Jansen character*5 cname 7959599516SKenneth E. Jansenc 8059599516SKenneth E. Jansenc stuff for dynamic model s.w.avg and wall model 8159599516SKenneth E. Jansenc 8259599516SKenneth E. Jansen dimension ifath(numnp), velbar(nfath,ndof), nsons(nfath) 8359599516SKenneth E. Jansen 8459599516SKenneth E. Jansen dimension wallubar(2),walltot(2) 8559599516SKenneth E. Jansenc 8659599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: aperm, atemp, atempS 8759599516SKenneth E. Jansen real*8, allocatable, dimension(:,:,:) :: apermS 8859599516SKenneth E. Jansen 8959599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: lhsP, lhsK, lhsS 9059599516SKenneth E. Jansen real*8 almit, alfit, gamit 9159599516SKenneth E. Jansenc 9259599516SKenneth E. Jansen character*20 fname1,fmt1 9359599516SKenneth E. Jansen character*20 fname2,fmt2 9459599516SKenneth E. Jansen character*60 fnamepold, fvarts 9559599516SKenneth E. Jansen character*4 fname4c ! 4 characters 9659599516SKenneth E. Jansen integer iarray(50) ! integers for headers 9759599516SKenneth E. Jansen integer isgn(ndof), isgng(ndof) 9859599516SKenneth E. Jansen 99*34e67057SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: rerr 10059599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: ybar, strain, vorticity 10159599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: wallssVec, wallssVecbar 10259599516SKenneth E. Jansen 10359599516SKenneth E. Jansen real*8 tcorecp(2), tcorecpscal(2) 10459599516SKenneth E. Jansen 10559599516SKenneth E. Jansen real*8, allocatable, dimension(:,:,:) :: yphbar 10659599516SKenneth E. Jansen real*8 CFLworst(numel) 10759599516SKenneth E. Jansen 10859599516SKenneth E. Jansen integer :: iv_rankpernode, iv_totnodes, iv_totcores 10959599516SKenneth E. Jansen integer :: iv_node, iv_core, iv_thread 110ae8d68e4SKenneth E. Jansen!-------------------------------------------------------------------- 111ae8d68e4SKenneth E. Jansen! Setting up svLS 112bd36043dSBen Matthews#ifdef HAVE_SVLS 113ae8d68e4SKenneth E. Jansen INTEGER svLS_nFaces, gnNo, nNo, faIn, facenNo 114ec121c45SKenneth E. Jansen INTEGER, ALLOCATABLE :: gNodes(:) 115ae8d68e4SKenneth E. Jansen REAL*8, ALLOCATABLE :: sV(:,:) 116ae8d68e4SKenneth E. Jansen 117ae8d68e4SKenneth E. Jansen TYPE(svLS_commuType) communicator 118ae8d68e4SKenneth E. Jansen TYPE(svLS_lhsType) svLS_lhs 119ae8d68e4SKenneth E. Jansen TYPE(svLS_lsType) svLS_ls 120ec121c45SKenneth E. Jansen! repeat for scalar solves (up to 4 at this time which is consistent with rest of PHASTA) 121daa97cf2SKenneth E. Jansen TYPE(svLS_commuType) communicator_S(4) 122daa97cf2SKenneth E. Jansen TYPE(svLS_lhsType) svLS_lhs_S(4) 123daa97cf2SKenneth E. Jansen TYPE(svLS_lsType) svLS_ls_S(4) 124bd36043dSBen Matthews#endif 125*34e67057SKenneth E. Jansen call initmpistat() ! see bottom of code to see just how easy it is 12659599516SKenneth E. Jansen 12759599516SKenneth E. Jansen call initmemstat() 12859599516SKenneth E. Jansen 129ae8d68e4SKenneth E. Jansen!-------------------------------------------------------------------- 130436818eeSKenneth E. Jansen! Setting up svLS Moved down for better org 131ae8d68e4SKenneth E. Jansen 13259599516SKenneth E. Jansenc 13359599516SKenneth E. Jansenc only master should be verbose 13459599516SKenneth E. Jansenc 13559599516SKenneth E. Jansen 13659599516SKenneth E. Jansen if(numpe.gt.0 .and. myrank.ne.master)iverbose=0 13759599516SKenneth E. Jansenc 13859599516SKenneth E. Jansen 13959599516SKenneth E. Jansen lskeep=lstep 14059599516SKenneth E. Jansen 141*34e67057SKenneth E. Jansen call initTimeSeries() 14259599516SKenneth E. Jansenc 14359599516SKenneth E. Jansenc.... open history and aerodynamic forces files 14459599516SKenneth E. Jansenc 14559599516SKenneth E. Jansen if (myrank .eq. master) then 146c9a96f21SKenneth E. Jansen open (unit=ihist, file=fhist, status='unknown') 14759599516SKenneth E. Jansen open (unit=iforce, file=fforce, status='unknown') 14859599516SKenneth E. Jansen open (unit=76, file="fort.76", status='unknown') 14959599516SKenneth E. Jansen if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then 15059599516SKenneth E. Jansen fnamepold = 'pold' 15159599516SKenneth E. Jansen fnamepold = trim(fnamepold)//trim(cname2(lstep)) 15259599516SKenneth E. Jansen fnamepold = trim(fnamepold)//'.dat' 15359599516SKenneth E. Jansen fnamepold = trim(fnamepold) 15459599516SKenneth E. Jansen open (unit=8177, file=fnamepold, status='unknown') 15559599516SKenneth E. Jansen endif 15659599516SKenneth E. Jansen endif 15759599516SKenneth E. Jansenc 15859599516SKenneth E. Jansenc.... initialize 15959599516SKenneth E. Jansenc 16059599516SKenneth E. Jansen ifuncs(:) = 0 ! func. evaluation counter 16159599516SKenneth E. Jansen istep = 0 16259599516SKenneth E. Jansen yold = y 16359599516SKenneth E. Jansen acold = ac 16459599516SKenneth E. Jansen 165*34e67057SKenneth E. Jansen!!!!!!!!!!!!!!!!!!! 166*34e67057SKenneth E. Jansen!Init output fields 167*34e67057SKenneth E. Jansen!!!!!!!!!!!!!!!!!! 168*34e67057SKenneth E. Jansen numerr=10+isurf 169*34e67057SKenneth E. Jansen allocate(rerr(nshg,numerr)) 17059599516SKenneth E. Jansen rerr = zero 17159599516SKenneth E. Jansen 17259599516SKenneth E. Jansen if(ierrcalc.eq.1 .or. ioybar.eq.1) then ! we need ybar for error too 17359599516SKenneth E. Jansen if (ivort == 1) then 17459599516SKenneth E. Jansen allocate(ybar(nshg,17)) ! more space for vorticity if requested 17559599516SKenneth E. Jansen else 17659599516SKenneth E. Jansen allocate(ybar(nshg,13)) 17759599516SKenneth E. Jansen endif 17859599516SKenneth E. Jansen ybar = zero ! Initialize ybar to zero, which is essential 17959599516SKenneth E. Jansen endif 18059599516SKenneth E. Jansen 18159599516SKenneth E. Jansen if(ivort == 1) then 18259599516SKenneth E. Jansen allocate(strain(nshg,6)) 18359599516SKenneth E. Jansen allocate(vorticity(nshg,5)) 18459599516SKenneth E. Jansen endif 18559599516SKenneth E. Jansen 18659599516SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 18759599516SKenneth E. Jansen allocate(wallssVec(nshg,3)) 18859599516SKenneth E. Jansen if (ioybar .eq. 1) then 18959599516SKenneth E. Jansen allocate(wallssVecbar(nshg,3)) 19059599516SKenneth E. Jansen wallssVecbar = zero ! Initialization important if mean wss computed 19159599516SKenneth E. Jansen endif 19259599516SKenneth E. Jansen endif 19359599516SKenneth E. Jansen 19459599516SKenneth E. Jansen! both nstepsincycle and nphasesincycle needs to be set 19559599516SKenneth E. Jansen if(nstepsincycle.eq.0) nphasesincycle = 0 19659599516SKenneth E. Jansen if(nphasesincycle.ne.0) then 19759599516SKenneth E. Jansen! & allocate(yphbar(nshg,5,nphasesincycle)) 19859599516SKenneth E. Jansen if (ivort == 1) then 19959599516SKenneth E. Jansen allocate(yphbar(nshg,15,nphasesincycle)) ! more space for vorticity 20059599516SKenneth E. Jansen else 20159599516SKenneth E. Jansen allocate(yphbar(nshg,11,nphasesincycle)) 20259599516SKenneth E. Jansen endif 20359599516SKenneth E. Jansen yphbar = zero 20459599516SKenneth E. Jansen endif 20559599516SKenneth E. Jansen 206*34e67057SKenneth E. Jansen!!!!!!!!!!!!!!!!!!! 207*34e67057SKenneth E. Jansen!END Init output fields 208*34e67057SKenneth E. Jansen!!!!!!!!!!!!!!!!!! 20959599516SKenneth E. Jansen 21059599516SKenneth E. Jansen vbc_prof(:,1:3) = BC(:,3:5) 21159599516SKenneth E. Jansen if(iramp.eq.1) then 21259599516SKenneth E. Jansen call BCprofileInit(vbc_prof,x) 21359599516SKenneth E. Jansen endif 21459599516SKenneth E. Jansen 21559599516SKenneth E. Jansenc 216*34e67057SKenneth E. Jansenc.... ---------------> initialize Equation Solver <--------------- 21759599516SKenneth E. Jansenc 218*34e67057SKenneth E. Jansen call initEQS(iBC, rowp, colm) 21959599516SKenneth E. Jansenc 22059599516SKenneth E. Jansenc... prepare lumped mass if needed 22159599516SKenneth E. Jansenc 22259599516SKenneth E. Jansen if((flmpr.ne.0).or.(flmpl.ne.0)) call genlmass(x, shp,shgl) 22359599516SKenneth E. Jansenc 22459599516SKenneth E. Jansenc.... -----------------> End of initialization <----------------- 22559599516SKenneth E. Jansenc 22659599516SKenneth E. Jansenc.....open the necessary files to gather time series 22759599516SKenneth E. Jansenc 22859599516SKenneth E. Jansen lstep0 = lstep+1 22959599516SKenneth E. Jansen nsteprcr = nstep(1)+lstep 23059599516SKenneth E. Jansenc 23159599516SKenneth E. Jansenc.... loop through the time sequences 23259599516SKenneth E. Jansenc 23359599516SKenneth E. Jansen 23459599516SKenneth E. Jansen 23559599516SKenneth E. Jansen do 3000 itsq = 1, ntseq 23659599516SKenneth E. Jansen itseq = itsq 23759599516SKenneth E. Jansen 23859599516SKenneth E. Jansenc 23959599516SKenneth E. Jansenc.... set up the time integration parameters 24059599516SKenneth E. Jansenc 24159599516SKenneth E. Jansen nstp = nstep(itseq) 24259599516SKenneth E. Jansen nitr = niter(itseq) 24359599516SKenneth E. Jansen LCtime = loctim(itseq) 24459599516SKenneth E. Jansen dtol(:)= deltol(itseq,:) 24559599516SKenneth E. Jansen 24659599516SKenneth E. Jansen call itrSetup ( y, acold ) 247*34e67057SKenneth E. Jansen 24859599516SKenneth E. Jansenc 24959599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution, 25059599516SKenneth E. Jansenc which are functions of alphaf so need to do it after itrSetup 25159599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 25259599516SKenneth E. Jansen call calcImpConvCoef (numImpSrfs, ntimeptpT) 25359599516SKenneth E. Jansen endif 25459599516SKenneth E. Jansenc 25559599516SKenneth E. Jansenc...initialize the initial condition P(0)-RQ(0)-Pd(0) for RCR BC 25659599516SKenneth E. Jansenc need ndsurf so should be after initNABI 25759599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 25859599516SKenneth E. Jansen call calcRCRic(y,nsrflistRCR,numRCRSrfs) 25959599516SKenneth E. Jansen endif 26059599516SKenneth E. Jansenc 26159599516SKenneth E. Jansenc find the last solve of the flow in the step sequence so that we will 26259599516SKenneth E. Jansenc know when we are at/near end of step 26359599516SKenneth E. Jansenc 26459599516SKenneth E. Jansenc ilast=0 26559599516SKenneth E. Jansen nitr=0 ! count number of flow solves in a step (# of iterations) 26659599516SKenneth E. Jansen do i=1,seqsize 26759599516SKenneth E. Jansen if(stepseq(i).eq.0) nitr=nitr+1 26859599516SKenneth E. Jansen enddo 26959599516SKenneth E. Jansen 27059599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 27159599516SKenneth E. Jansen tcorecp(:) = zero ! used in solfar.f (solflow) 27259599516SKenneth E. Jansen tcorecpscal(:) = zero ! used in solfar.f (solflow) 27359599516SKenneth E. Jansen if(myrank.eq.0) then 27459599516SKenneth E. Jansen tcorecp1 = TMRC() 27559599516SKenneth E. Jansen endif 27659599516SKenneth E. Jansen 27759599516SKenneth E. Jansenc 27859599516SKenneth E. Jansenc.... loop through the time steps 27959599516SKenneth E. Jansenc 28059599516SKenneth E. Jansen istop=0 28159599516SKenneth E. Jansen rmub=datmat(1,2,1) 28259599516SKenneth E. Jansen if(rmutarget.gt.0) then 28359599516SKenneth E. Jansen rmue=rmutarget 28459599516SKenneth E. Jansen else 28559599516SKenneth E. Jansen rmue=datmat(1,2,1) ! keep constant 28659599516SKenneth E. Jansen endif 28759599516SKenneth E. Jansen 28859599516SKenneth E. Jansen if(iramp.eq.1) then 28959599516SKenneth E. Jansen call BCprofileScale(vbc_prof,BC,yold) ! fix the yold values to the reset BC 29059599516SKenneth E. Jansen isclr=1 ! fix scalar 29159599516SKenneth E. Jansen do isclr=1,nsclr 29259599516SKenneth E. Jansen call itrBCSclr(yold,ac,iBC,BC,iper,ilwork) 29359599516SKenneth E. Jansen enddo 29459599516SKenneth E. Jansen endif 29559599516SKenneth E. Jansen 29659599516SKenneth E. Jansen do 2000 istp = 1, nstp 29759599516SKenneth E. Jansen if(iramp.eq.1) 29859599516SKenneth E. Jansen & call BCprofileScale(vbc_prof,BC,yold) 29959599516SKenneth E. Jansen 30059599516SKenneth E. Jansen call rerun_check(stopjob) 301c89b8efeSKenneth E. Jansen if(myrank.eq.master) write(*,*) 302c89b8efeSKenneth E. Jansen & 'stopjob,lstep,istep', stopjob,lstep,istep 303c89b8efeSKenneth E. Jansen if(stopjob.eq.lstep) then 304c89b8efeSKenneth E. Jansen stopjob=-2 ! this is the code to finish 305c89b8efeSKenneth E. Jansen if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then 306c89b8efeSKenneth E. Jansen if(myrank.eq.master) write(*,*) 307c89b8efeSKenneth E. Jansen & 'line 473 says last step written so exit' 308c89b8efeSKenneth E. Jansen goto 2002 ! the step was written last step so just exit 309c89b8efeSKenneth E. Jansen else 310c89b8efeSKenneth E. Jansen if(myrank.eq.master) 311c89b8efeSKenneth E. Jansen & write(*,*) 'line 473 says last step not written' 312c89b8efeSKenneth E. Jansen istep=nstp ! have to do this so that solution will be written 313c89b8efeSKenneth E. Jansen goto 2001 314c89b8efeSKenneth E. Jansen endif 315c89b8efeSKenneth E. Jansen endif 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. Jansenc 32459599516SKenneth E. Jansenc ... calculate the pressure contribution that depends on the history for the Imp. BC 32559599516SKenneth E. Jansenc 32659599516SKenneth E. Jansen if(numImpSrfs.gt.0) then 32759599516SKenneth E. Jansen call pHist(poldImp,QHistImp,ImpConvCoef, 32859599516SKenneth E. Jansen & ntimeptpT,numImpSrfs) 32959599516SKenneth E. Jansen endif 33059599516SKenneth E. Jansenc 33159599516SKenneth E. Jansenc ... calc the pressure contribution that depends on the history for the RCR BC 33259599516SKenneth E. Jansenc 33359599516SKenneth E. Jansen if(numRCRSrfs.gt.0) then 33459599516SKenneth E. Jansen call CalcHopRCR (Delt(itseq), lstep, numRCRSrfs) 33559599516SKenneth E. Jansen call CalcRCRConvCoef(lstep,numRCRSrfs) 33659599516SKenneth E. Jansen call pHist(poldRCR,QHistRCR,RCRConvCoef,nsteprcr, 33759599516SKenneth E. Jansen & numRCRSrfs) 33859599516SKenneth E. Jansen endif 33959599516SKenneth E. Jansen 34059599516SKenneth E. Jansen if(iLES.gt.0) then !complicated stuff has moved to 34159599516SKenneth E. Jansen !routine below 34259599516SKenneth E. Jansen call lesmodels(yold, acold, shgl, shp, 34359599516SKenneth E. Jansen & iper, ilwork, rowp, colm, 34459599516SKenneth E. Jansen & nsons, ifath, x, 34559599516SKenneth E. Jansen & iBC, BC) 34659599516SKenneth E. Jansen 34759599516SKenneth E. Jansen 34859599516SKenneth E. Jansen endif 34959599516SKenneth E. Jansen 35059599516SKenneth E. Jansenc.... set traction BCs for modeled walls 35159599516SKenneth E. Jansenc 35259599516SKenneth E. Jansen if (itwmod.ne.0) then 35359599516SKenneth E. Jansen call asbwmod(yold, acold, x, BC, iBC, 35459599516SKenneth E. Jansen & iper, ilwork, ifath, velbar) 35559599516SKenneth E. Jansen endif 35659599516SKenneth E. Jansen 35759599516SKenneth E. Jansenc 35859599516SKenneth E. Jansenc.... Determine whether the vorticity field needs to be computed for this time step or not 35959599516SKenneth E. Jansenc 360*34e67057SKenneth E. Jansen call seticomputevort 36159599516SKenneth E. Jansenc 36259599516SKenneth E. Jansenc.... -----------------------> predictor phase <----------------------- 36359599516SKenneth E. Jansenc 36459599516SKenneth E. Jansen call itrPredict(yold, y, acold, ac , uold, u, iBC) 36559599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper,ilwork) 36659599516SKenneth E. Jansen 36759599516SKenneth E. Jansen if(nsolt.eq.1) then 36859599516SKenneth E. Jansen isclr=0 36959599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 37059599516SKenneth E. Jansen endif 37159599516SKenneth E. Jansen do isclr=1,nsclr 37259599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 37359599516SKenneth E. Jansen enddo 37459599516SKenneth E. Jansen iter=0 37559599516SKenneth E. Jansen ilss=0 ! this is a switch thrown on first solve of LS redistance 37659599516SKenneth E. Jansen do istepc=1,seqsize 37759599516SKenneth E. Jansen icode=stepseq(istepc) 37859599516SKenneth E. Jansen if(mod(icode,5).eq.0) then ! this is a solve 37959599516SKenneth E. Jansen isolve=icode/10 38059599516SKenneth E. Jansen if(icode.eq.0) then ! flow solve (encoded as 0) 38159599516SKenneth E. Jansenc 38259599516SKenneth E. Jansen iter = iter+1 38359599516SKenneth E. Jansen ifuncs(1) = ifuncs(1) + 1 38459599516SKenneth E. Jansenc 38559599516SKenneth E. Jansen Force(1) = zero 38659599516SKenneth E. Jansen Force(2) = zero 38759599516SKenneth E. Jansen Force(3) = zero 38859599516SKenneth E. Jansen HFlux = zero 38959599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1))) 39059599516SKenneth E. Jansen 39159599516SKenneth E. Jansen call SolFlow(y, ac, u, 39259599516SKenneth E. Jansen & yold, acold, uold, 39359599516SKenneth E. Jansen & x, iBC, 39459599516SKenneth E. Jansen & BC, res, 39559599516SKenneth E. Jansen & nPermDims, nTmpDims, aperm, 39659599516SKenneth E. Jansen & atemp, iper, 39759599516SKenneth E. Jansen & ilwork, shp, shgl, 39859599516SKenneth E. Jansen & shpb, shglb, rowp, 39959599516SKenneth E. Jansen & colm, lhsK, lhsP, 40059599516SKenneth E. Jansen & solinc, rerr, tcorecp, 401bd36043dSBen Matthews & GradV, sumtime 402bd36043dSBen Matthews#ifdef HAVE_SVLS 403bd36043dSBen Matthews & ,svLS_lhs, svLS_ls, svLS_nFaces) 404bd36043dSBen Matthews#else 405bd36043dSBen Matthews & ) 406bd36043dSBen Matthews#endif 40759599516SKenneth E. Jansen 40859599516SKenneth E. Jansen else ! scalar type solve 40959599516SKenneth E. Jansen if (icode.eq.5) then ! Solve for Temperature 41059599516SKenneth E. Jansen ! (encoded as (nsclr+1)*10) 41159599516SKenneth E. Jansen isclr=0 41259599516SKenneth E. Jansen ifuncs(2) = ifuncs(2) + 1 41359599516SKenneth E. Jansen j=1 41459599516SKenneth E. Jansen else ! solve a scalar (encoded at isclr*10) 41559599516SKenneth E. Jansen isclr=isolve 41659599516SKenneth E. Jansen ifuncs(isclr+2) = ifuncs(isclr+2) + 1 41759599516SKenneth E. Jansen j=isclr+nsolt 41859599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.0) 41959599516SKenneth E. Jansen & .and.(isclr.eq.2)) then 42059599516SKenneth E. Jansen ilss=1 ! throw switch (once per step) 42159599516SKenneth E. Jansen y(:,7)=y(:,6) ! redistance field initialized 42259599516SKenneth E. Jansen ac(:,7) = zero 42359599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 42459599516SKenneth E. Jansen & ilwork) 42559599516SKenneth E. Jansenc 42659599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the 42759599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar 42859599516SKenneth E. Jansenc 42959599516SKenneth E. Jansen alfit=alfi 43059599516SKenneth E. Jansen gamit=gami 43159599516SKenneth E. Jansen almit=almi 43259599516SKenneth E. Jansen Deltt=Delt(1) 43359599516SKenneth E. Jansen Dtglt=Dtgl 43459599516SKenneth E. Jansen alfi = 1 43559599516SKenneth E. Jansen gami = 1 43659599516SKenneth E. Jansen almi = 1 43759599516SKenneth E. Jansenc Delt(1)= Deltt ! Give a pseudo time step 43859599516SKenneth E. Jansen Dtgl = one / Delt(1) 43959599516SKenneth E. Jansen endif ! level set eq. 2 44059599516SKenneth E. Jansen endif ! deciding between temperature and scalar 44159599516SKenneth E. Jansen 44259599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(isclr+2)-1, 44359599516SKenneth E. Jansen & LHSupd(isclr+2))) 44459599516SKenneth E. Jansen 44559599516SKenneth E. Jansen call SolSclr(y, ac, u, 44659599516SKenneth E. Jansen & yold, acold, uold, 44759599516SKenneth E. Jansen & x, iBC, 44859599516SKenneth E. Jansen & BC, nPermDimsS,nTmpDimsS, 44959599516SKenneth E. Jansen & apermS(1,1,j), atempS, iper, 45059599516SKenneth E. Jansen & ilwork, shp, shgl, 45159599516SKenneth E. Jansen & shpb, shglb, rowp, 45259599516SKenneth E. Jansen & colm, lhsS(1,j), 453bd36043dSBen Matthews & solinc(1,isclr+5), tcorecpscal 454bd36043dSBen Matthews#ifdef HAVE_SVLS 455bd36043dSBen Matthews & ,svLS_lhs_S(isclr), svLS_ls_S(isclr), svls_nfaces) 456bd36043dSBen Matthews#else 457bd36043dSBen Matthews & ) 458bd36043dSBen Matthews#endif 45959599516SKenneth E. Jansen 46059599516SKenneth E. Jansen 46159599516SKenneth E. Jansen endif ! end of scalar type solve 46259599516SKenneth E. Jansen 46359599516SKenneth E. Jansen else ! this is an update (mod did not equal zero) 46459599516SKenneth E. Jansen iupdate=icode/10 ! what to update 46559599516SKenneth E. Jansen if(icode.eq.1) then !update flow 46659599516SKenneth E. Jansen call itrCorrect ( y, ac, u, solinc, iBC) 46759599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper, ilwork) 46859599516SKenneth E. Jansen else ! update scalar 46959599516SKenneth E. Jansen isclr=iupdate !unless 47059599516SKenneth E. Jansen if(icode.eq.6) isclr=0 47159599516SKenneth E. Jansen if(iRANS.lt.-100)then ! RANS 47259599516SKenneth E. Jansen call itrCorrectSclrPos(y,ac,solinc(1,isclr+5)) 47359599516SKenneth E. Jansen else 47459599516SKenneth E. Jansen call itrCorrectSclr (y, ac, solinc(1,isclr+5)) 47559599516SKenneth E. Jansen endif 47659599516SKenneth E. Jansen if (ilset.eq.2 .and. isclr.eq.2) then 47759599516SKenneth E. Jansen if (ivconstraint .eq. 1) then 47859599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 47959599516SKenneth E. Jansen & ilwork) 48059599516SKenneth E. Jansenc 48159599516SKenneth E. Jansenc ... applying the volume constraint on second level set scalar 48259599516SKenneth E. Jansenc 48359599516SKenneth E. Jansen call solvecon (y, x, iBC, BC, 48459599516SKenneth E. Jansen & iper, ilwork, shp, shgl) 48559599516SKenneth E. Jansenc 48659599516SKenneth E. Jansen endif ! end of volume constraint calculations 48759599516SKenneth E. Jansen endif ! end of redistance calculations 48859599516SKenneth E. Jansenc 48959599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 49059599516SKenneth E. Jansen & ilwork) 49159599516SKenneth E. Jansen endif ! end of flow or scalar update 49259599516SKenneth E. Jansen endif ! end of switch between solve or update 49359599516SKenneth E. Jansen enddo ! loop over sequence in step 49459599516SKenneth E. Jansenc 49559599516SKenneth E. Jansenc 49659599516SKenneth E. Jansenc.... obtain the time average statistics 49759599516SKenneth E. Jansenc 49859599516SKenneth E. Jansen if (ioform .eq. 2) then 49959599516SKenneth E. Jansen 50059599516SKenneth E. Jansen call stsGetStats( y, yold, ac, acold, 50159599516SKenneth E. Jansen & u, uold, x, 50259599516SKenneth E. Jansen & shp, shgl, shpb, shglb, 50359599516SKenneth E. Jansen & iBC, BC, iper, ilwork, 50459599516SKenneth E. Jansen & rowp, colm, lhsK, lhsP ) 50559599516SKenneth E. Jansen endif 50659599516SKenneth E. Jansen 50759599516SKenneth E. Jansenc 50859599516SKenneth E. Jansenc Find the solution at the end of the timestep and move it to old 50959599516SKenneth E. Jansenc 51059599516SKenneth E. Jansenc 51159599516SKenneth E. Jansenc ...First to reassign the parameters for the original time integrator scheme 51259599516SKenneth E. Jansenc 51359599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.1)) then 51459599516SKenneth E. Jansen alfi =alfit 51559599516SKenneth E. Jansen gami =gamit 51659599516SKenneth E. Jansen almi =almit 51759599516SKenneth E. Jansen Delt(1)=Deltt 51859599516SKenneth E. Jansen Dtgl =Dtglt 51959599516SKenneth E. Jansen endif 52059599516SKenneth E. Jansen call itrUpdate( yold, acold, uold, y, ac, u) 52159599516SKenneth E. Jansen call itrBC (yold, acold, iBC, BC, iper,ilwork) 52259599516SKenneth E. Jansen 52359599516SKenneth E. Jansen istep = istep + 1 52459599516SKenneth E. Jansen lstep = lstep + 1 52559599516SKenneth E. Jansenc 52659599516SKenneth E. Jansenc .. Print memory consumption on BGQ 52759599516SKenneth E. Jansenc 52859599516SKenneth E. Jansen call printmeminfo("itrdrv"//char(0)) 52959599516SKenneth E. Jansen 53059599516SKenneth E. Jansenc 53159599516SKenneth E. Jansenc .. Compute vorticity 53259599516SKenneth E. Jansenc 533*34e67057SKenneth E. Jansen if ( icomputevort == 1) 534*34e67057SKenneth E. Jansen & call computeVort( vorticity, GradV,strain) 53559599516SKenneth E. Jansenc 5369dcf5646SKenneth E. Jansenc.... update and the aerodynamic forces 5379dcf5646SKenneth E. Jansenc 5389dcf5646SKenneth E. Jansen call forces ( yold, ilwork ) 5399dcf5646SKenneth E. Jansen 5409dcf5646SKenneth E. Jansenc 541c89b8efeSKenneth E. Jansenc .. write out the instantaneous solution 54259599516SKenneth E. Jansenc 543c89b8efeSKenneth E. Jansen2001 continue ! we could get here by 2001 label if user requested stop 54459599516SKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or. 54559599516SKenneth E. Jansen & istep.eq.nstep(itseq)) then 546c89b8efeSKenneth E. Jansen 547c89b8efeSKenneth E. Jansen!so that we can see progress in force file close it so that it flushes 548c89b8efeSKenneth E. Jansen!and then reopen in append mode 549c89b8efeSKenneth E. Jansen 550c89b8efeSKenneth E. Jansen close(iforce) 551c89b8efeSKenneth E. Jansen open (unit=iforce, file=fforce, position='append') 55259599516SKenneth E. Jansen 55359599516SKenneth E. Jansen! Call to restar() will open restart file in write mode (and not append mode) 55459599516SKenneth E. Jansen! that is needed as other fields are written in append mode 555c89b8efeSKenneth E. Jansen 55659599516SKenneth E. Jansen call restar ('out ', yold ,ac) 55759599516SKenneth E. Jansen 55859599516SKenneth E. Jansen if(ivort == 1) then 55959599516SKenneth E. Jansen call write_field(myrank,'a','vorticity',9,vorticity, 56059599516SKenneth E. Jansen & 'd',nshg,5,lstep) 56159599516SKenneth E. Jansen endif 56259599516SKenneth E. Jansen 56359599516SKenneth E. Jansen call printmeminfo("itrdrv after checkpoint"//char(0)) 564c89b8efeSKenneth E. Jansen else if(stopjob.eq.-2) then 565c89b8efeSKenneth E. Jansen if(myrank.eq.master) then 566c89b8efeSKenneth E. Jansen write(*,*) 'line 755 says no write before stopping' 567c89b8efeSKenneth E. Jansen write(*,*) 'istep,nstep,irs',istep,nstep(itseq),irs 56859599516SKenneth E. Jansen endif 569c89b8efeSKenneth E. Jansen endif !just the instantaneous stuff for videos 570c89b8efeSKenneth E. Jansenc 571c89b8efeSKenneth E. Jansenc.... compute the consistent boundary flux 572c89b8efeSKenneth E. Jansenc 573c89b8efeSKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 574c89b8efeSKenneth E. Jansen call Bflux ( yold, acold, uold, x, 575c89b8efeSKenneth E. Jansen & shp, shgl, shpb, 576c89b8efeSKenneth E. Jansen & shglb, ilwork, iBC, 577c89b8efeSKenneth E. Jansen & BC, iper, wallssVec) 578c89b8efeSKenneth E. Jansen endif 579c89b8efeSKenneth E. Jansen 580c89b8efeSKenneth E. Jansen if(stopjob.eq.-2) goto 2003 581c89b8efeSKenneth E. Jansen 58259599516SKenneth E. Jansen 58359599516SKenneth E. Jansenc 58459599516SKenneth E. Jansenc ... update the flow history for the impedance convolution, filter it and write it out 58559599516SKenneth E. Jansenc 58659599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 58759599516SKenneth E. Jansen call UpdHistConv(y,nsrflistImp,numImpSrfs) !uses Delt(1) 58859599516SKenneth E. Jansen endif 58959599516SKenneth E. Jansen 59059599516SKenneth E. Jansenc 59159599516SKenneth E. Jansenc ... update the flow history for the RCR convolution 59259599516SKenneth E. Jansenc 59359599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 59459599516SKenneth E. Jansen call UpdHistConv(y,nsrflistRCR,numRCRSrfs) !uses lstep 59559599516SKenneth E. Jansen endif 59659599516SKenneth E. Jansen 59759599516SKenneth E. Jansen 59859599516SKenneth E. Jansenc... dump TIME SERIES 59959599516SKenneth E. Jansen 600*34e67057SKenneth E. Jansen if (exts .and. ( mod(lstep-1,freq).eq.0)) call dumpTimeSeries() 60159599516SKenneth E. Jansen 60259599516SKenneth E. Jansen if((irscale.ge.0).or.(itwmod.gt.0)) 60359599516SKenneth E. Jansen & call getvel (yold, ilwork, iBC, 60459599516SKenneth E. Jansen & nsons, ifath, velbar) 60559599516SKenneth E. Jansen 60659599516SKenneth E. Jansen if((irscale.ge.0).and.(myrank.eq.master)) then 60759599516SKenneth E. Jansen call genscale(yold, x, iper, 60859599516SKenneth E. Jansen & iBC, ifath, velbar, 60959599516SKenneth E. Jansen & nsons) 61059599516SKenneth E. Jansen endif 61159599516SKenneth E. Jansenc 61259599516SKenneth E. Jansenc.... print out results. 61359599516SKenneth E. Jansenc 61459599516SKenneth E. Jansen ntoutv=max(ntout,100) ! velb is not needed so often 61559599516SKenneth E. Jansen if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then 61659599516SKenneth E. Jansen if( (mod(lstep, ntoutv) .eq. 0) .and. 61759599516SKenneth E. Jansen & ((irscale.ge.0).or.(itwmod.gt.0) .or. 61859599516SKenneth E. Jansen & ((nsonmax.eq.1).and.(iLES.gt.0)))) 61959599516SKenneth E. Jansen & call rwvelb ('out ', velbar ,ifail) 62059599516SKenneth E. Jansen endif 62159599516SKenneth E. Jansenc 62259599516SKenneth E. Jansenc.... end of the NSTEP and NTSEQ loops 62359599516SKenneth E. Jansenc 62459599516SKenneth E. Jansen 62559599516SKenneth E. Jansen 62659599516SKenneth E. Jansenc 62759599516SKenneth E. Jansenc.... -------------------> error calculation <----------------- 62859599516SKenneth E. Jansenc 629*34e67057SKenneth E. Jansen if(ierrcalc.eq.1 .or. ioybar.eq.1) 630*34e67057SKenneth E. Jansen & call collectErrorYbar(ybar,yold,wallssVec,wallssVecBar, 631*34e67057SKenneth E. Jansen & vorticity,yphbar,rerr) 632c89b8efeSKenneth E. Jansen 2003 continue ! we get here if stopjob equals lstep and this jumped over 633c89b8efeSKenneth E. Jansen! the statistics computation because we have no new data to average in 634c89b8efeSKenneth E. Jansen! rather we are just trying to output the last state that was not already 635c89b8efeSKenneth E. Jansen! written 636c89b8efeSKenneth E. Jansenc 637c89b8efeSKenneth E. Jansenc.... ----------------------> Complete Restart Processing <---------------------- 638c89b8efeSKenneth E. Jansenc 639c89b8efeSKenneth E. Jansen! for now it is the same frequency but need to change this 640c89b8efeSKenneth E. Jansen! soon.... but don't forget to change the field counter in 641c89b8efeSKenneth E. Jansen! new_interface.cc 642c89b8efeSKenneth E. Jansen! 643c89b8efeSKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or. 644c89b8efeSKenneth E. Jansen & istep.eq.nstep(itseq)) then 64559599516SKenneth E. Jansen 646c89b8efeSKenneth E. Jansen lesId = numeqns(1) 647c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 648c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 649c89b8efeSKenneth E. Jansen tcormr1 = TMRC() 650c89b8efeSKenneth E. Jansen endif 651efb88323SKenneth E. Jansen if((nsolflow.eq.1).and.(ipresPrjFlag.eq.1)) then 65279f1763eSKenneth E. Jansen#ifdef HAVE_LESLIB 653c89b8efeSKenneth E. Jansen call saveLesRestart( lesId, aperm , nshg, myrank, lstep, 654c89b8efeSKenneth E. Jansen & nPermDims ) 655c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 656c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 657c89b8efeSKenneth E. Jansen tcormr2 = TMRC() 658c89b8efeSKenneth E. Jansen write(6,*) 'call saveLesRestart for projection and'// 659c89b8efeSKenneth E. Jansen & 'pressure projection vectors', tcormr2-tcormr1 660c89b8efeSKenneth E. Jansen endif 66179f1763eSKenneth E. Jansen#endif 662c9a96f21SKenneth E. Jansen endif 663c89b8efeSKenneth E. Jansen 664c89b8efeSKenneth E. Jansen if(ierrcalc.eq.1) then 665c89b8efeSKenneth E. Jansenc 666c89b8efeSKenneth E. Jansenc.....smooth the error indicators 667c89b8efeSKenneth E. Jansenc 668c89b8efeSKenneth E. Jansen do i=1,ierrsmooth 669c89b8efeSKenneth E. Jansen call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC ) 670c89b8efeSKenneth E. Jansen end do 671c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 672c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 673c89b8efeSKenneth E. Jansen tcormr1 = TMRC() 674c89b8efeSKenneth E. Jansen endif 675c89b8efeSKenneth E. Jansen call write_error(myrank, lstep, nshg, 10, rerr ) 676c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 677c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 678c89b8efeSKenneth E. Jansen tcormr2 = TMRC() 679c89b8efeSKenneth E. Jansen write(6,*) 'Time to write the error fields to the disks', 680c89b8efeSKenneth E. Jansen & tcormr2-tcormr1 681c89b8efeSKenneth E. Jansen endif 682c89b8efeSKenneth E. Jansen endif ! ierrcalc 683c89b8efeSKenneth E. Jansen 684c89b8efeSKenneth E. Jansen if(ioybar.eq.1) then 685c89b8efeSKenneth E. Jansen if(ivort == 1) then 686c89b8efeSKenneth E. Jansen call write_field(myrank,'a','ybar',4, 687c89b8efeSKenneth E. Jansen & ybar,'d',nshg,17,lstep) 688c89b8efeSKenneth E. Jansen else 689c89b8efeSKenneth E. Jansen call write_field(myrank,'a','ybar',4, 690c89b8efeSKenneth E. Jansen & ybar,'d',nshg,13,lstep) 691c89b8efeSKenneth E. Jansen endif 692c89b8efeSKenneth E. Jansen 693c89b8efeSKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 694c89b8efeSKenneth E. Jansen call write_field(myrank,'a','wssbar',6, 695c89b8efeSKenneth E. Jansen & wallssVecBar,'d',nshg,3,lstep) 696c89b8efeSKenneth E. Jansen endif 697c89b8efeSKenneth E. Jansen 698c89b8efeSKenneth E. Jansen if(nphasesincycle .gt. 0) then 699c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 700c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 701c89b8efeSKenneth E. Jansen tcormr1 = TMRC() 702c89b8efeSKenneth E. Jansen endif 703c89b8efeSKenneth E. Jansen do iphase=1,nphasesincycle 704c89b8efeSKenneth E. Jansen if(ivort == 1) then 705c89b8efeSKenneth E. Jansen call write_phavg2(myrank,'a','phase_average',13,iphase, 706c89b8efeSKenneth E. Jansen & nphasesincycle,yphbar(:,:,iphase),'d',nshg,15,lstep) 707c89b8efeSKenneth E. Jansen else 708c89b8efeSKenneth E. Jansen call write_phavg2(myrank,'a','phase_average',13,iphase, 709c89b8efeSKenneth E. Jansen & nphasesincycle,yphbar(:,:,iphase),'d',nshg,11,lstep) 710c89b8efeSKenneth E. Jansen endif 711c89b8efeSKenneth E. Jansen end do 712c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 713c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 714c89b8efeSKenneth E. Jansen tcormr2 = TMRC() 715c89b8efeSKenneth E. Jansen write(6,*) 'write all phase avg to the disks = ', 716c89b8efeSKenneth E. Jansen & tcormr2-tcormr1 717c89b8efeSKenneth E. Jansen endif 718c89b8efeSKenneth E. Jansen endif !nphasesincyle 719c89b8efeSKenneth E. Jansen endif !ioybar 720c89b8efeSKenneth E. Jansen 721c89b8efeSKenneth E. Jansen if(iRANS.lt.0) then 722c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 723c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 724c89b8efeSKenneth E. Jansen tcormr1 = TMRC() 725c89b8efeSKenneth E. Jansen endif 726c89b8efeSKenneth E. Jansen call write_field(myrank,'a','dwal',4,d2wall,'d', 727c89b8efeSKenneth E. Jansen & nshg,1,lstep) 728c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 729c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 730c89b8efeSKenneth E. Jansen tcormr2 = TMRC() 731c89b8efeSKenneth E. Jansen write(6,*) 'Time to write dwal to the disks = ', 732c89b8efeSKenneth E. Jansen & tcormr2-tcormr1 733c89b8efeSKenneth E. Jansen endif 734c89b8efeSKenneth E. Jansen endif !iRANS 735c89b8efeSKenneth E. Jansen 736c89b8efeSKenneth E. Jansen endif ! write out complete restart state 737c89b8efeSKenneth E. Jansen !next 2 lines are two ways to end early 738c89b8efeSKenneth E. Jansen if(stopjob.eq.-2) goto 2002 739c89b8efeSKenneth E. Jansen if(istop.eq.1000) goto 2002 ! stop when delta small (see rstatic) 74059599516SKenneth E. Jansen 2000 continue 741c89b8efeSKenneth E. Jansen 2002 continue 742c89b8efeSKenneth E. Jansen 743c89b8efeSKenneth E. Jansen! done with time stepping so deallocate fields already written 744c89b8efeSKenneth E. Jansen! 745*34e67057SKenneth E. Jansen 746c89b8efeSKenneth E. Jansen if(ioybar.eq.1) then 747c89b8efeSKenneth E. Jansen deallocate(ybar) 748c89b8efeSKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 749c89b8efeSKenneth E. Jansen deallocate(wallssVecbar) 750c89b8efeSKenneth E. Jansen endif 751c89b8efeSKenneth E. Jansen if(nphasesincycle .gt. 0) then 752c89b8efeSKenneth E. Jansen deallocate(yphbar) 753c89b8efeSKenneth E. Jansen endif !nphasesincyle 754c89b8efeSKenneth E. Jansen endif !ioybar 755c89b8efeSKenneth E. Jansen if(ivort == 1) then 756c89b8efeSKenneth E. Jansen deallocate(strain,vorticity) 757c89b8efeSKenneth E. Jansen endif 758c89b8efeSKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 759c89b8efeSKenneth E. Jansen deallocate(wallssVec) 760c89b8efeSKenneth E. Jansen endif 761c89b8efeSKenneth E. Jansen if(iRANS.lt.0) then 762c89b8efeSKenneth E. Jansen deallocate(d2wall) 763c89b8efeSKenneth E. Jansen endif 76459599516SKenneth E. Jansen 76559599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 76659599516SKenneth E. Jansen if(myrank.eq.0) then 76759599516SKenneth E. Jansen tcorecp2 = TMRC() 76859599516SKenneth E. Jansen write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1 76959599516SKenneth E. Jansen write(6,*) '(Elm. form.',tcorecp(1), 77059599516SKenneth E. Jansen & ',Lin. alg. sol.',tcorecp(2),')' 77159599516SKenneth E. Jansen write(6,*) '(Elm. form. Scal.',tcorecpscal(1), 77259599516SKenneth E. Jansen & ',Lin. alg. sol. Scal.',tcorecpscal(2),')' 77359599516SKenneth E. Jansen write(6,*) '' 77459599516SKenneth E. Jansen 77559599516SKenneth E. Jansen endif 77659599516SKenneth E. Jansen 77759599516SKenneth E. Jansen call print_system_stats(tcorecp, tcorecpscal) 77859599516SKenneth E. Jansen call print_mesh_stats() 77959599516SKenneth E. Jansen call print_mpi_stats() 78059599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 78159599516SKenneth E. Jansen! return 78259599516SKenneth E. Jansenc call MPI_Finalize() 78359599516SKenneth E. Jansenc call MPI_ABORT(MPI_COMM_WORLD, ierr) 78459599516SKenneth E. Jansen 78575f1c48cSCameron Smith call destroyWallData 78692e15685SCameron Smith call destroyfncorp 78775f1c48cSCameron Smith 78859599516SKenneth E. Jansen 3000 continue 78959599516SKenneth E. Jansen 79059599516SKenneth E. Jansen 79159599516SKenneth E. Jansenc 79259599516SKenneth E. Jansenc.... close history and aerodynamic forces files 79359599516SKenneth E. Jansenc 79459599516SKenneth E. Jansen if (myrank .eq. master) then 79559599516SKenneth E. Jansen! close (ihist) 79659599516SKenneth E. Jansen close (iforce) 79759599516SKenneth E. Jansen close(76) 79859599516SKenneth E. Jansen if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then 79959599516SKenneth E. Jansen close (8177) 80059599516SKenneth E. Jansen endif 80159599516SKenneth E. Jansen endif 80259599516SKenneth E. Jansenc 80359599516SKenneth E. Jansenc.... close varts file for probes 80459599516SKenneth E. Jansenc 80559599516SKenneth E. Jansen if(exts) then 80659599516SKenneth E. Jansen do jj=1,ntspts 80759599516SKenneth E. Jansen if (myrank == iv_rank(jj)) then 80859599516SKenneth E. Jansen close(1000+jj) 80959599516SKenneth E. Jansen endif 81059599516SKenneth E. Jansen enddo 811*34e67057SKenneth E. Jansen call dTD ! deallocates time series arrays 81259599516SKenneth E. Jansen endif 81359599516SKenneth E. Jansen 81459599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 81559599516SKenneth E. Jansen if(myrank.eq.0) then 81659599516SKenneth E. Jansen write(*,*) 'itrdrv - done with aerodynamic forces' 81759599516SKenneth E. Jansen endif 81859599516SKenneth E. Jansen 81959599516SKenneth E. Jansen do isrf = 0,MAXSURF 82059599516SKenneth E. Jansen if ( nsrflist(isrf).ne.0 .and. 82159599516SKenneth E. Jansen & myrank.eq.irankfilesforce(isrf)) then 82259599516SKenneth E. Jansen iunit=60+isrf 82359599516SKenneth E. Jansen close(iunit) 82459599516SKenneth E. Jansen endif 82559599516SKenneth E. Jansen enddo 82659599516SKenneth E. Jansen 82759599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 82859599516SKenneth E. Jansen if(myrank.eq.0) then 82959599516SKenneth E. Jansen write(*,*) 'itrdrv - done with MAXSURF' 83059599516SKenneth E. Jansen endif 83159599516SKenneth E. Jansen 83259599516SKenneth E. Jansen 83359599516SKenneth E. Jansen 5 format(1X,F15.10,3X,F15.10,3X,F15.10,3X,F15.10) 83459599516SKenneth E. Jansen 444 format(6(2x,e14.7)) 83559599516SKenneth E. Jansenc 83659599516SKenneth E. Jansenc.... end 83759599516SKenneth E. Jansenc 83859599516SKenneth E. Jansen if(nsolflow.eq.1) then 83959599516SKenneth E. Jansen deallocate (lhsK) 84059599516SKenneth E. Jansen deallocate (lhsP) 841ae8d68e4SKenneth E. Jansen IF (svLSFlag .NE. 1) THEN 84259599516SKenneth E. Jansen deallocate (aperm) 84359599516SKenneth E. Jansen deallocate (atemp) 844ae8d68e4SKenneth E. Jansen ENDIF 84559599516SKenneth E. Jansen endif 846*34e67057SKenneth E. Jansen if((nsclr+nsolt).gt.0) then 84759599516SKenneth E. Jansen deallocate (lhsS) 84859599516SKenneth E. Jansen deallocate (apermS) 84959599516SKenneth E. Jansen deallocate (atempS) 85059599516SKenneth E. Jansen endif 85159599516SKenneth E. Jansen 85259599516SKenneth E. Jansen if(iabc==1) deallocate(acs) 85359599516SKenneth E. Jansen 85459599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 85559599516SKenneth E. Jansen if(myrank.eq.0) then 85659599516SKenneth E. Jansen write(*,*) 'itrdrv - done - BACK TO process.f' 85759599516SKenneth E. Jansen endif 85859599516SKenneth E. Jansen 85959599516SKenneth E. Jansen return 86059599516SKenneth E. Jansen end 86159599516SKenneth E. Jansen 86259599516SKenneth E. Jansen subroutine lesmodels(y, ac, shgl, shp, 86359599516SKenneth E. Jansen & iper, ilwork, rowp, colm, 86459599516SKenneth E. Jansen & nsons, ifath, x, 86559599516SKenneth E. Jansen & iBC, BC) 86659599516SKenneth E. Jansen 86759599516SKenneth E. Jansen include "common.h" 86859599516SKenneth E. Jansen 86959599516SKenneth E. Jansen real*8 y(nshg,ndof), ac(nshg,ndof), 87059599516SKenneth E. Jansen & x(numnp,nsd), 87159599516SKenneth E. Jansen & BC(nshg,ndofBC) 87259599516SKenneth E. Jansen real*8 shp(MAXTOP,maxsh,MAXQPT), 87359599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT) 87459599516SKenneth E. Jansen 87559599516SKenneth E. Jansenc 87659599516SKenneth E. Jansen integer rowp(nshg,nnz), colm(nshg+1), 87759599516SKenneth E. Jansen & iBC(nshg), 87859599516SKenneth E. Jansen & ilwork(nlwork), 87959599516SKenneth E. Jansen & iper(nshg) 88059599516SKenneth E. Jansen dimension ifath(numnp), nsons(nfath) 88159599516SKenneth E. Jansen 88259599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: fwr2,fwr3,fwr4 88359599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: stabdis,cdelsq1 88459599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: xavegt, xavegt2,xavegt3 88559599516SKenneth E. Jansen 88659599516SKenneth E. Jansen if( (iLES.gt.1) ) then ! Allocate Stuff for advanced LES models 88759599516SKenneth E. Jansen allocate (fwr2(nshg)) 88859599516SKenneth E. Jansen allocate (fwr3(nshg)) 88959599516SKenneth E. Jansen allocate (fwr4(nshg)) 89059599516SKenneth E. Jansen allocate (xavegt(nfath,12)) 89159599516SKenneth E. Jansen allocate (xavegt2(nfath,12)) 89259599516SKenneth E. Jansen allocate (xavegt3(nfath,12)) 89359599516SKenneth E. Jansen allocate (stabdis(nfath)) 89459599516SKenneth E. Jansen endif 89559599516SKenneth E. Jansen 89659599516SKenneth E. Jansenc.... get dynamic model coefficient 89759599516SKenneth E. Jansenc 89859599516SKenneth E. Jansen ilesmod=iLES/10 89959599516SKenneth E. Jansenc 90059599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model 90159599516SKenneth E. Jansenc 90259599516SKenneth E. Jansen if (ilesmod.eq.0) then ! 0 < iLES< 10 => dyn. model calculated 90359599516SKenneth E. Jansen ! at nodes based on discrete filtering 90459599516SKenneth E. Jansen 90559599516SKenneth E. Jansen 90659599516SKenneth E. Jansen if(isubmod.eq.2) then 90759599516SKenneth E. Jansen call SUPGdis(y, ac, shgl, shp, 90859599516SKenneth E. Jansen & iper, ilwork, 90959599516SKenneth E. Jansen & nsons, ifath, x, 91059599516SKenneth E. Jansen & iBC, BC, stabdis, xavegt3) 91159599516SKenneth E. Jansen endif 91259599516SKenneth E. Jansen 91359599516SKenneth E. Jansen if( ((isubmod.eq.0).or.(isubmod.eq.2)))then ! If no 91459599516SKenneth E. Jansen ! sub-model 91559599516SKenneth E. Jansen ! or SUPG 91659599516SKenneth E. Jansen ! model wanted 91759599516SKenneth E. Jansen 91859599516SKenneth E. Jansen if(i2filt.eq.0)then ! If simple filter 91959599516SKenneth E. Jansen 92059599516SKenneth E. Jansen if(modlstats .eq. 0) then ! If no model stats wanted 92159599516SKenneth E. Jansen call getdmc (y, shgl, shp, 92259599516SKenneth E. Jansen & iper, ilwork, nsons, 92359599516SKenneth E. Jansen & ifath, x) 92459599516SKenneth E. Jansen else ! else get model stats 92559599516SKenneth E. Jansen call stdfdmc (y, shgl, shp, 92659599516SKenneth E. Jansen & iper, ilwork, nsons, 92759599516SKenneth E. Jansen & ifath, x) 92859599516SKenneth E. Jansen endif ! end of stats if statement 92959599516SKenneth E. Jansen 93059599516SKenneth E. Jansen else ! else if twice filtering 93159599516SKenneth E. Jansen 93259599516SKenneth E. Jansen call widefdmc(y, shgl, shp, 93359599516SKenneth E. Jansen & iper, ilwork, nsons, 93459599516SKenneth E. Jansen & ifath, x) 93559599516SKenneth E. Jansen 93659599516SKenneth E. Jansen 93759599516SKenneth E. Jansen endif ! end of simple filter if statement 93859599516SKenneth E. Jansen 93959599516SKenneth E. Jansen endif ! end of SUPG or no sub-model if statement 94059599516SKenneth E. Jansen 94159599516SKenneth E. Jansen 94259599516SKenneth E. Jansen if( (isubmod.eq.1) ) then ! If DFWR sub-model wanted 94359599516SKenneth E. Jansen call cdelBHsq (y, shgl, shp, 94459599516SKenneth E. Jansen & iper, ilwork, nsons, 94559599516SKenneth E. Jansen & ifath, x, cdelsq1) 94659599516SKenneth E. Jansen call FiltRat (y, shgl, shp, 94759599516SKenneth E. Jansen & iper, ilwork, nsons, 94859599516SKenneth E. Jansen & ifath, x, cdelsq1, 94959599516SKenneth E. Jansen & fwr4, fwr3) 95059599516SKenneth E. Jansen 95159599516SKenneth E. Jansen 95259599516SKenneth E. Jansen if (i2filt.eq.0) then ! If simple filter wanted 95359599516SKenneth E. Jansen call DFWRsfdmc(y, shgl, shp, 95459599516SKenneth E. Jansen & iper, ilwork, nsons, 95559599516SKenneth E. Jansen & ifath, x, fwr2, fwr3) 95659599516SKenneth E. Jansen else ! else if twice filtering wanted 95759599516SKenneth E. Jansen call DFWRwfdmc(y, shgl, shp, 95859599516SKenneth E. Jansen & iper, ilwork, nsons, 95959599516SKenneth E. Jansen & ifath, x, fwr4, fwr4) 96059599516SKenneth E. Jansen endif ! end of simple filter if statement 96159599516SKenneth E. Jansen 96259599516SKenneth E. Jansen endif ! end of DFWR sub-model if statement 96359599516SKenneth E. Jansen 96459599516SKenneth E. Jansen if( (isubmod.eq.2) )then ! If SUPG sub-model wanted 96559599516SKenneth E. Jansen call dmcSUPG (y, ac, shgl, 96659599516SKenneth E. Jansen & shp, iper, ilwork, 96759599516SKenneth E. Jansen & nsons, ifath, x, 96859599516SKenneth E. Jansen & iBC, BC, rowp, colm, 96959599516SKenneth E. Jansen & xavegt2, stabdis) 97059599516SKenneth E. Jansen endif 97159599516SKenneth E. Jansen 97259599516SKenneth E. Jansen if(idis.eq.1)then ! If SUPG/Model dissipation wanted 97359599516SKenneth E. Jansen call ediss (y, ac, shgl, 97459599516SKenneth E. Jansen & shp, iper, ilwork, 97559599516SKenneth E. Jansen & nsons, ifath, x, 97659599516SKenneth E. Jansen & iBC, BC, xavegt) 97759599516SKenneth E. Jansen endif 97859599516SKenneth E. Jansen 97959599516SKenneth E. Jansen endif ! end of ilesmod 98059599516SKenneth E. Jansen 98159599516SKenneth E. Jansen if (ilesmod .eq. 1) then ! 10 < iLES < 20 => dynamic-mixed 98259599516SKenneth E. Jansen ! at nodes based on discrete filtering 98359599516SKenneth E. Jansen call bardmc (y, shgl, shp, 98459599516SKenneth E. Jansen & iper, ilwork, 98559599516SKenneth E. Jansen & nsons, ifath, x) 98659599516SKenneth E. Jansen endif 98759599516SKenneth E. Jansen 98859599516SKenneth E. Jansen if (ilesmod .eq. 2) then ! 20 < iLES < 30 => dynamic at quad 98959599516SKenneth E. Jansen ! pts based on lumped projection filt. 99059599516SKenneth E. Jansen 99159599516SKenneth E. Jansen if(isubmod.eq.0)then 99259599516SKenneth E. Jansen call projdmc (y, shgl, shp, 99359599516SKenneth E. Jansen & iper, ilwork, x) 99459599516SKenneth E. Jansen else 99559599516SKenneth E. Jansen call cpjdmcnoi (y, shgl, shp, 99659599516SKenneth E. Jansen & iper, ilwork, x, 99759599516SKenneth E. Jansen & rowp, colm, 99859599516SKenneth E. Jansen & iBC, BC) 99959599516SKenneth E. Jansen endif 100059599516SKenneth E. Jansen 100159599516SKenneth E. Jansen endif 100259599516SKenneth E. Jansen 100359599516SKenneth E. Jansen if( (iLES.gt.1) ) then ! Deallocate Stuff for advanced LES models 100459599516SKenneth E. Jansen deallocate (fwr2) 100559599516SKenneth E. Jansen deallocate (fwr3) 100659599516SKenneth E. Jansen deallocate (fwr4) 100759599516SKenneth E. Jansen deallocate (xavegt) 100859599516SKenneth E. Jansen deallocate (xavegt2) 100959599516SKenneth E. Jansen deallocate (xavegt3) 101059599516SKenneth E. Jansen deallocate (stabdis) 101159599516SKenneth E. Jansen endif 101259599516SKenneth E. Jansen return 101359599516SKenneth E. Jansen end 101459599516SKenneth E. Jansen 101559599516SKenneth E. Jansenc 101659599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution 101759599516SKenneth E. Jansenc 101859599516SKenneth E. Jansen subroutine CalcImpConvCoef (numISrfs, numTpoints) 101959599516SKenneth E. Jansen 102059599516SKenneth E. Jansen use convolImpFlow !uses flow history and impedance for convolution 102159599516SKenneth E. Jansen 102259599516SKenneth E. Jansen include "common.h" !for alfi 102359599516SKenneth E. Jansen 102459599516SKenneth E. Jansen integer numISrfs, numTpoints 102559599516SKenneth E. Jansen 102659599516SKenneth E. Jansen allocate (ConvCoef(numTpoints+2,3)) !same time discret. for all imp. BC 102759599516SKenneth E. Jansen do j=1,numTpoints+2 102859599516SKenneth E. Jansen ConvCoef(j,:)=0.5/numTpoints !dt/2 divided by period T=N*dt 102959599516SKenneth E. Jansen ConvCoef(j,1)=ConvCoef(j,1)*(1.0-alfi)*(1.0-alfi) 103059599516SKenneth E. Jansen ConvCoef(j,2)=ConvCoef(j,2)*(1.0+2*alfi*(1.0-alfi)) 103159599516SKenneth E. Jansen ConvCoef(j,3)=ConvCoef(j,3)*alfi*alfi 103259599516SKenneth E. Jansen enddo 103359599516SKenneth E. Jansen ConvCoef(1,2)=zero 103459599516SKenneth E. Jansen ConvCoef(1,3)=zero 103559599516SKenneth E. Jansen ConvCoef(2,3)=zero 103659599516SKenneth E. Jansen ConvCoef(numTpoints+1,1)=zero 103759599516SKenneth E. Jansen ConvCoef(numTpoints+2,2)=zero 103859599516SKenneth E. Jansen ConvCoef(numTpoints+2,1)=zero 103959599516SKenneth E. Jansenc 104059599516SKenneth E. Jansenc...calculate the coefficients for the impedance convolution 104159599516SKenneth E. Jansenc 104259599516SKenneth E. Jansen allocate (ImpConvCoef(numTpoints+2,numISrfs)) 104359599516SKenneth E. Jansen 104459599516SKenneth E. Jansenc..coefficients below assume Q linear in time step, Z constant 104559599516SKenneth E. Jansenc do j=3,numTpoints 104659599516SKenneth E. Jansenc ImpConvCoef(j,:) = ValueListImp(j-1,:)*ConvCoef(j,3) 104759599516SKenneth E. Jansenc & + ValueListImp(j,:)*ConvCoef(j,2) 104859599516SKenneth E. Jansenc & + ValueListImp(j+1,:)*ConvCoef(j,1) 104959599516SKenneth E. Jansenc enddo 105059599516SKenneth E. Jansenc ImpConvCoef(1,:) = ValueListImp(2,:)*ConvCoef(1,1) 105159599516SKenneth E. Jansenc ImpConvCoef(2,:) = ValueListImp(2,:)*ConvCoef(2,2) 105259599516SKenneth E. Jansenc & + ValueListImp(3,:)*ConvCoef(2,1) 105359599516SKenneth E. Jansenc ImpConvCoef(numTpoints+1,:) = 105459599516SKenneth E. Jansenc & ValueListImp(numTpoints,:)*ConvCoef(numTpoints+1,3) 105559599516SKenneth E. Jansenc & + ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+1,2) 105659599516SKenneth E. Jansenc ImpConvCoef(numTpoints+2,:) = 105759599516SKenneth E. Jansenc & ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+2,3) 105859599516SKenneth E. Jansen 105959599516SKenneth E. Jansenc..try easiest convolution Q and Z constant per time step 106059599516SKenneth E. Jansen do j=3,numTpoints+1 106159599516SKenneth E. Jansen ImpConvCoef(j,:) = ValueListImp(j-1,:)/numTpoints 106259599516SKenneth E. Jansen enddo 106359599516SKenneth E. Jansen ImpConvCoef(1,:) =zero 106459599516SKenneth E. Jansen ImpConvCoef(2,:) =zero 106559599516SKenneth E. Jansen ImpConvCoef(numTpoints+2,:) = 106659599516SKenneth E. Jansen & ValueListImp(numTpoints+1,:)/numTpoints 106759599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr() 106859599516SKenneth E. Jansen ImpConvCoef(numTpoints+1,:)= ImpConvCoef(numTpoints+1,:) 106959599516SKenneth E. Jansen & - ImpConvCoef(numTpoints+2,:)*(1.0-alfi)/alfi 107059599516SKenneth E. Jansen ImpConvCoef(numTpoints+2,:)= ImpConvCoef(numTpoints+2,:)/alfi 107159599516SKenneth E. Jansen return 107259599516SKenneth E. Jansen end 107359599516SKenneth E. Jansen 107459599516SKenneth E. Jansenc 107559599516SKenneth E. Jansenc ... update the flow rate history for the impedance convolution, filter it and write it out 107659599516SKenneth E. Jansenc 107759599516SKenneth E. Jansen subroutine UpdHistConv(y,nsrfIdList,numSrfs) 107859599516SKenneth E. Jansen 107959599516SKenneth E. Jansen use convolImpFlow !brings ntimeptpT, QHistImp, QHistTry, QHistTryF, numImpSrfs 108059599516SKenneth E. Jansen use convolRCRFlow !brings QHistRCR, numRCRSrfs 108159599516SKenneth E. Jansen 108259599516SKenneth E. Jansen include "common.h" 108359599516SKenneth E. Jansen 108459599516SKenneth E. Jansen integer nsrfIdList(0:MAXSURF), numSrfs 108559599516SKenneth E. Jansen character*20 fname1 108659599516SKenneth E. Jansen character*10 cname2 108759599516SKenneth E. Jansen character*5 cname 108859599516SKenneth E. Jansen real*8 y(nshg,3) !velocity at time n+1 108959599516SKenneth E. Jansen real*8 NewQ(0:MAXSURF) !temporary unknown for the flow rate 109059599516SKenneth E. Jansen !that needs to be added to the flow history 109159599516SKenneth E. Jansen 109259599516SKenneth E. Jansen call GetFlowQ(NewQ,y,nsrfIdList,numSrfs) !new flow at time n+1 109359599516SKenneth E. Jansenc 109459599516SKenneth E. Jansenc... for imp BC: shift QHist, add new constribution, filter and write out 109559599516SKenneth E. Jansenc 109659599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 109759599516SKenneth E. Jansen do j=1, ntimeptpT 109859599516SKenneth E. Jansen QHistImp(j,1:numSrfs)=QHistImp(j+1,1:numSrfs) 109959599516SKenneth E. Jansen enddo 110059599516SKenneth E. Jansen QHistImp(ntimeptpT+1,1:numSrfs) = NewQ(1:numSrfs) 110159599516SKenneth E. Jansen 110259599516SKenneth E. Jansenc 110359599516SKenneth E. Jansenc....filter the flow rate history 110459599516SKenneth E. Jansenc 110559599516SKenneth E. Jansen cutfreq = 10 !hardcoded cutting frequency of the filter 110659599516SKenneth E. Jansen do j=1, ntimeptpT 110759599516SKenneth E. Jansen QHistTry(j,:)=QHistImp(j+1,:) 110859599516SKenneth E. Jansen enddo 110959599516SKenneth E. Jansen call Filter(QHistTryF,QHistTry,ntimeptpT,Delt(1),cutfreq) 111059599516SKenneth E. Jansenc.... if no filter applied then uncomment next three lines 111159599516SKenneth E. Jansenc do j=1, ntimeptpT 111259599516SKenneth E. Jansenc QHistTryF(j,:)=QHistTry(j,:) 111359599516SKenneth E. Jansenc enddo 111459599516SKenneth E. Jansen 111559599516SKenneth E. Jansenc QHistImp(1,:)=zero ! why do we do this? for beta(1,:) = zero it does not really matters 111659599516SKenneth E. Jansen do j=1, ntimeptpT 111759599516SKenneth E. Jansen QHistImp(j+1,:)=QHistTryF(j,:) 111859599516SKenneth E. Jansen enddo 111959599516SKenneth E. Jansenc 112059599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat 112159599516SKenneth E. Jansenc 112259599516SKenneth E. Jansen if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or. 112359599516SKenneth E. Jansen & (istep .eq. nstep(1)))) .and. 112459599516SKenneth E. Jansen & (myrank .eq. master)) then 112559599516SKenneth E. Jansen open(unit=816, file='Qhistor.dat',status='replace') 112659599516SKenneth E. Jansen write(816,*) ntimeptpT 112759599516SKenneth E. Jansen do j=1,ntimeptpT+1 112859599516SKenneth E. Jansen write(816,*) (QHistImp(j,n),n=1, numSrfs) 112959599516SKenneth E. Jansen enddo 113059599516SKenneth E. Jansen close(816) 113159599516SKenneth E. Jansenc... write out a copy with step number to be able to restart 113259599516SKenneth E. Jansen fname1 = 'Qhistor' 113359599516SKenneth E. Jansen fname1 = trim(fname1)//trim(cname2(lstep))//'.dat' 113459599516SKenneth E. Jansen open(unit=8166,file=trim(fname1),status='unknown') 113559599516SKenneth E. Jansen write(8166,*) ntimeptpT 113659599516SKenneth E. Jansen do j=1,ntimeptpT+1 113759599516SKenneth E. Jansen write(8166,*) (QHistImp(j,n),n=1, numSrfs) 113859599516SKenneth E. Jansen enddo 113959599516SKenneth E. Jansen close(8166) 114059599516SKenneth E. Jansen endif 114159599516SKenneth E. Jansen endif 114259599516SKenneth E. Jansen 114359599516SKenneth E. Jansenc 114459599516SKenneth E. Jansenc... for RCR bc just add the new contribution 114559599516SKenneth E. Jansenc 114659599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 114759599516SKenneth E. Jansen QHistRCR(lstep+1,1:numSrfs) = NewQ(1:numSrfs) 114859599516SKenneth E. Jansenc 114959599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat 115059599516SKenneth E. Jansenc 115159599516SKenneth E. Jansen if ((irs .ge. 1) .and. (myrank .eq. master)) then 115259599516SKenneth E. Jansen if(istep.eq.1) then 115359599516SKenneth E. Jansen open(unit=816,file='Qhistor.dat',status='unknown') 115459599516SKenneth E. Jansen else 115559599516SKenneth E. Jansen open(unit=816,file='Qhistor.dat',position='append') 115659599516SKenneth E. Jansen endif 115759599516SKenneth E. Jansen if(istep.eq.1) then 115859599516SKenneth E. Jansen do j=1,lstep 115959599516SKenneth E. Jansen write(816,*) j, (QHistRCR(j,n),n=1,numSrfs) ! read from file of previous run 116059599516SKenneth E. Jansen enddo 116159599516SKenneth E. Jansen endif 116259599516SKenneth E. Jansen write(816,*) lstep+1, (QHistRCR(lstep+1,n),n=1, numSrfs) 116359599516SKenneth E. Jansen close(816) 116459599516SKenneth E. Jansenc... write out a copy with step number to be able to restart 116559599516SKenneth E. Jansen if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or. 116659599516SKenneth E. Jansen & (istep .eq. nstep(1)))) .and. 116759599516SKenneth E. Jansen & (myrank .eq. master)) then 116859599516SKenneth E. Jansen fname1 = 'Qhistor' 116959599516SKenneth E. Jansen fname1 = trim(fname1)//trim(cname2(lstep))//'.dat' 117059599516SKenneth E. Jansen open(unit=8166,file=trim(fname1),status='unknown') 117159599516SKenneth E. Jansen write(8166,*) lstep+1 117259599516SKenneth E. Jansen do j=1,lstep+1 117359599516SKenneth E. Jansen write(8166,*) (QHistRCR(j,n),n=1, numSrfs) 117459599516SKenneth E. Jansen enddo 117559599516SKenneth E. Jansen close(8166) 117659599516SKenneth E. Jansen endif 117759599516SKenneth E. Jansen endif 117859599516SKenneth E. Jansen endif 117959599516SKenneth E. Jansen 118059599516SKenneth E. Jansen return 118159599516SKenneth E. Jansen end 118259599516SKenneth E. Jansen 118359599516SKenneth E. Jansenc 118459599516SKenneth E. Jansenc...calculate the time varying coefficients for the RCR convolution 118559599516SKenneth E. Jansenc 118659599516SKenneth E. Jansen subroutine CalcRCRConvCoef (stepn, numSrfs) 118759599516SKenneth E. Jansen 118859599516SKenneth E. Jansen use convolRCRFlow !brings in ValueListRCR, dtRCR 118959599516SKenneth E. Jansen 119059599516SKenneth E. Jansen include "common.h" !brings alfi 119159599516SKenneth E. Jansen 119259599516SKenneth E. Jansen integer numSrfs, stepn 119359599516SKenneth E. Jansen 119459599516SKenneth E. Jansen RCRConvCoef = zero 119559599516SKenneth E. Jansen if (stepn .eq. 0) then 119659599516SKenneth E. Jansen RCRConvCoef(1,:) = ValueListRCR(1,:)*(1.0-alfi) + 119759599516SKenneth E. Jansen & ValueListRCR(3,:)*(-alfi + 1.0 + 1/dtRCR(:) 119859599516SKenneth E. Jansen & - exp(-alfi*dtRCR(:))*(1 + 1/dtRCR(:))) 119959599516SKenneth E. Jansen RCRConvCoef(2,:) = ValueListRCR(1,:)*alfi 120059599516SKenneth E. Jansen & + ValueListRCR(3,:) 120159599516SKenneth E. Jansen & *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:)) 120259599516SKenneth E. Jansen endif 120359599516SKenneth E. Jansen if (stepn .ge. 1) then 120459599516SKenneth E. Jansen RCRConvCoef(1,:) =-ValueListRCR(3,:)*exp(-dtRCR(:)*(stepn+alfi)) 120559599516SKenneth E. Jansen & *(1 + (1 - exp(dtRCR(:)))/dtRCR(:)) 120659599516SKenneth E. Jansen RCRConvCoef(stepn+1,:) = ValueListRCR(1,:)*(1-alfi) 120759599516SKenneth E. Jansen & - ValueListRCR(3,:)*(alfi - 1 - 1/dtRCR(:) 120859599516SKenneth E. Jansen & + exp(-alfi*dtRCR(:))/dtRCR(:)*(2 - exp(-dtRCR(:)))) 120959599516SKenneth E. Jansen RCRConvCoef(stepn+2,:) = ValueListRCR(1,:)*alfi 121059599516SKenneth E. Jansen & + ValueListRCR(3,:) 121159599516SKenneth E. Jansen & *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:)) 121259599516SKenneth E. Jansen endif 121359599516SKenneth E. Jansen if (stepn .ge. 2) then 121459599516SKenneth E. Jansen do j=2,stepn 121559599516SKenneth E. Jansen RCRConvCoef(j,:) = ValueListRCR(3,:)/dtRCR(:)* 121659599516SKenneth E. Jansen & exp(-dtRCR(:)*(stepn + alfi + 2 - j))* 121759599516SKenneth E. Jansen & (1 - exp(dtRCR(:)))**2 121859599516SKenneth E. Jansen enddo 121959599516SKenneth E. Jansen endif 122059599516SKenneth E. Jansen 122159599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr() 122259599516SKenneth E. Jansen RCRConvCoef(stepn+1,:)= RCRConvCoef(stepn+1,:) 122359599516SKenneth E. Jansen & - RCRConvCoef(stepn+2,:)*(1.0-alfi)/alfi 122459599516SKenneth E. Jansen RCRConvCoef(stepn+2,:)= RCRConvCoef(stepn+2,:)/alfi 122559599516SKenneth E. Jansen 122659599516SKenneth E. Jansen return 122759599516SKenneth E. Jansen end 122859599516SKenneth E. Jansen 122959599516SKenneth E. Jansenc 123059599516SKenneth E. Jansenc...calculate the time dependent H operator for the RCR convolution 123159599516SKenneth E. Jansenc 123259599516SKenneth E. Jansen subroutine CalcHopRCR (timestepRCR, stepn, numSrfs) 123359599516SKenneth E. Jansen 123459599516SKenneth E. Jansen use convolRCRFlow !brings in HopRCR, dtRCR 123559599516SKenneth E. Jansen 123659599516SKenneth E. Jansen include "common.h" 123759599516SKenneth E. Jansen 123859599516SKenneth E. Jansen integer numSrfs, stepn 123959599516SKenneth E. Jansen real*8 PdistCur(0:MAXSURF), timestepRCR 124059599516SKenneth E. Jansen 124159599516SKenneth E. Jansen HopRCR=zero 124259599516SKenneth E. Jansen call RCRint(timestepRCR*(stepn + alfi),PdistCur) 124359599516SKenneth E. Jansen HopRCR(1:numSrfs) = RCRic(1:numSrfs) 124459599516SKenneth E. Jansen & *exp(-dtRCR(1:numSrfs)*(stepn + alfi)) + PdistCur(1:numSrfs) 124559599516SKenneth E. Jansen return 124659599516SKenneth E. Jansen end 124759599516SKenneth E. Jansenc 124859599516SKenneth E. Jansenc ... initialize the influence of the initial conditions for the RCR BC 124959599516SKenneth E. Jansenc 125059599516SKenneth E. Jansen subroutine calcRCRic(y,srfIdList,numSrfs) 125159599516SKenneth E. Jansen 125259599516SKenneth E. Jansen use convolRCRFlow !brings RCRic, ValueListRCR, ValuePdist 125359599516SKenneth E. Jansen 125459599516SKenneth E. Jansen include "common.h" 125559599516SKenneth E. Jansen 125659599516SKenneth E. Jansen integer srfIdList(0:MAXSURF), numSrfs, irankCoupled 125759599516SKenneth E. Jansen real*8 y(nshg,4) !need velocity and pressure 125859599516SKenneth E. Jansen real*8 Qini(0:MAXSURF) !initial flow rate 125959599516SKenneth E. Jansen real*8 PdistIni(0:MAXSURF) !initial distal pressure 126059599516SKenneth E. Jansen real*8 Pini(0:MAXSURF),CoupleArea(0:MAXSURF) ! initial pressure 126159599516SKenneth E. Jansen real*8 VelOnly(nshg,3), POnly(nshg) 126259599516SKenneth E. Jansen 126359599516SKenneth E. Jansen allocate (RCRic(0:MAXSURF)) 126459599516SKenneth E. Jansen 126559599516SKenneth E. Jansen if(lstep.eq.0) then 126659599516SKenneth E. Jansen VelOnly(:,1:3)=y(:,1:3) 126759599516SKenneth E. Jansen call GetFlowQ(Qini,VelOnly,srfIdList,numSrfs) !get initial flow 126859599516SKenneth E. Jansen QHistRCR(1,1:numSrfs)=Qini(1:numSrfs) !initialize QHistRCR 126959599516SKenneth E. Jansen POnly(:)=y(:,4) ! pressure 127059599516SKenneth E. Jansen call integrScalar(Pini,POnly,srfIdList,numSrfs) !get initial pressure integral 127159599516SKenneth E. Jansen POnly(:)=one ! one to get area 127259599516SKenneth E. Jansen call integrScalar(CoupleArea,POnly,srfIdList,numSrfs) !get surf area 127359599516SKenneth E. Jansen Pini(1:numSrfs) = Pini(1:numSrfs)/CoupleArea(1:numSrfs) 127459599516SKenneth E. Jansen else 127559599516SKenneth E. Jansen Qini(1:numSrfs)=QHistRCR(1,1:numSrfs) 127659599516SKenneth E. Jansen Pini(1:numSrfs)=zero ! hack 127759599516SKenneth E. Jansen endif 127859599516SKenneth E. Jansen call RCRint(istep,PdistIni) !get initial distal P (use istep) 127959599516SKenneth E. Jansen RCRic(1:numSrfs) = Pini(1:numSrfs) 128059599516SKenneth E. Jansen & - ValueListRCR(1,:)*Qini(1:numSrfs)-PdistIni(1:numSrfs) 128159599516SKenneth E. Jansen return 128259599516SKenneth E. Jansen end 128359599516SKenneth E. Jansen 128459599516SKenneth E. Jansenc.........function that integrates a scalar over a boundary 128559599516SKenneth E. Jansen subroutine integrScalar(scalInt,scal,srfIdList,numSrfs) 128659599516SKenneth E. Jansen 128759599516SKenneth E. Jansen use pvsQbi !brings ndsurf, NASC 128859599516SKenneth E. Jansen 128959599516SKenneth E. Jansen include "common.h" 129059599516SKenneth E. Jansen include "mpif.h" 129159599516SKenneth E. Jansen 129259599516SKenneth E. Jansen integer srfIdList(0:MAXSURF), numSrfs, irankCoupled, i, k 129359599516SKenneth E. Jansen real*8 scal(nshg), scalInt(0:MAXSURF), scalIntProc(0:MAXSURF) 129459599516SKenneth E. Jansen 129559599516SKenneth E. Jansen scalIntProc = zero 129659599516SKenneth E. Jansen do i = 1,nshg 129759599516SKenneth E. Jansen if(numSrfs.gt.zero) then 129859599516SKenneth E. Jansen do k = 1,numSrfs 129959599516SKenneth E. Jansen irankCoupled = 0 130059599516SKenneth E. Jansen if (srfIdList(k).eq.ndsurf(i)) then 130159599516SKenneth E. Jansen irankCoupled=k 130259599516SKenneth E. Jansen scalIntProc(irankCoupled) = scalIntProc(irankCoupled) 130359599516SKenneth E. Jansen & + NASC(i)*scal(i) 130459599516SKenneth E. Jansen exit 130559599516SKenneth E. Jansen endif 130659599516SKenneth E. Jansen enddo 130759599516SKenneth E. Jansen endif 130859599516SKenneth E. Jansen enddo 130959599516SKenneth E. Jansenc 131059599516SKenneth E. Jansenc at this point, each scalint has its "nodes" contributions to the scalar 131159599516SKenneth E. Jansenc accumulated into scalIntProc. Note, because NASC is on processor this 131259599516SKenneth E. Jansenc will NOT be the scalar for the surface yet 131359599516SKenneth E. Jansenc 131459599516SKenneth E. Jansenc.... reduce integrated scalar for each surface, push on scalInt 131559599516SKenneth E. Jansenc 131659599516SKenneth E. Jansen npars=MAXSURF+1 131759599516SKenneth E. Jansen call MPI_ALLREDUCE (scalIntProc, scalInt(:), npars, 131859599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 131959599516SKenneth E. Jansen 132059599516SKenneth E. Jansen return 132159599516SKenneth E. Jansen end 132259599516SKenneth E. Jansen 13239071d3baSCameron Smith subroutine writeTimingMessage(key,iomode,timing) 13249071d3baSCameron Smith use iso_c_binding 13259071d3baSCameron Smith use phstr 13269071d3baSCameron Smith implicit none 132759599516SKenneth E. Jansen 13289071d3baSCameron Smith character(len=*) :: key 13299071d3baSCameron Smith integer :: iomode 13309071d3baSCameron Smith real*8 :: timing 1331da7d5714SCameron Smith character(len=1024) :: timing_msg 133289625e43SCameron Smith character(len=*), parameter :: 133389625e43SCameron Smith & streamModeString = c_char_"stream"//c_null_char, 133489625e43SCameron Smith & fileModeString = c_char_"disk"//c_null_char 133559599516SKenneth E. Jansen 1336da7d5714SCameron Smith timing_msg = c_char_"Time to write "//c_null_char 13379071d3baSCameron Smith call phstr_appendStr(timing_msg,key) 13389071d3baSCameron Smith if ( iomode .eq. -1 ) then 13399071d3baSCameron Smith call phstr_appendStr(timing_msg, streamModeString) 13409071d3baSCameron Smith else 13419071d3baSCameron Smith call phstr_appendStr(timing_msg, fileModeString) 13429071d3baSCameron Smith endif 13439071d3baSCameron Smith call phstr_appendStr(timing_msg, c_char_' = '//c_null_char) 13449071d3baSCameron Smith call phstr_appendDbl(timing_msg, timing) 1345da7d5714SCameron Smith write(6,*) trim(timing_msg) 13469071d3baSCameron Smith return 13479071d3baSCameron Smith end subroutine 134859599516SKenneth E. Jansen 1349*34e67057SKenneth E. Jansen subroutine initmpistat() 1350*34e67057SKenneth E. Jansen include "common.h" 1351*34e67057SKenneth E. Jansen 1352*34e67057SKenneth E. Jansen impistat = 0 1353*34e67057SKenneth E. Jansen impistat2 = 0 1354*34e67057SKenneth E. Jansen iISend = 0 1355*34e67057SKenneth E. Jansen iISendScal = 0 1356*34e67057SKenneth E. Jansen iIRecv = 0 1357*34e67057SKenneth E. Jansen iIRecvScal = 0 1358*34e67057SKenneth E. Jansen iWaitAll = 0 1359*34e67057SKenneth E. Jansen iWaitAllScal = 0 1360*34e67057SKenneth E. Jansen iAllR = 0 1361*34e67057SKenneth E. Jansen iAllRScal = 0 1362*34e67057SKenneth E. Jansen rISend = zero 1363*34e67057SKenneth E. Jansen rISendScal = zero 1364*34e67057SKenneth E. Jansen rIRecv = zero 1365*34e67057SKenneth E. Jansen rIRecvScal = zero 1366*34e67057SKenneth E. Jansen rWaitAll = zero 1367*34e67057SKenneth E. Jansen rWaitAllScal = zero 1368*34e67057SKenneth E. Jansen rAllR = zero 1369*34e67057SKenneth E. Jansen rAllRScal = zero 1370*34e67057SKenneth E. Jansen rCommu = zero 1371*34e67057SKenneth E. Jansen rCommuScal = zero 1372*34e67057SKenneth E. Jansen return 1373*34e67057SKenneth E. Jansen end subroutine 1374*34e67057SKenneth E. Jansen 1375*34e67057SKenneth E. Jansen subroutine initTimeSeries() 1376*34e67057SKenneth E. Jansen use timedata !allows collection of time series 1377*34e67057SKenneth E. Jansen include "common.h" 1378*34e67057SKenneth E. Jansen character*60 fvarts 1379*34e67057SKenneth E. Jansen character*10 cname2 1380*34e67057SKenneth E. Jansen 1381*34e67057SKenneth E. Jansen 1382*34e67057SKenneth E. Jansen inquire(file='xyzts.dat',exist=exts) 1383*34e67057SKenneth E. Jansen if(exts) then 1384*34e67057SKenneth E. Jansen 1385*34e67057SKenneth E. Jansen open(unit=626,file='xyzts.dat',status='old') 1386*34e67057SKenneth E. Jansen read(626,*) ntspts, freq, tolpt, iterat, varcod 1387*34e67057SKenneth E. Jansen call sTD ! sets data structures 1388*34e67057SKenneth E. Jansen 1389*34e67057SKenneth E. Jansen do jj=1,ntspts ! read coordinate data where solution desired 1390*34e67057SKenneth E. Jansen read(626,*) ptts(jj,1),ptts(jj,2),ptts(jj,3) 1391*34e67057SKenneth E. Jansen enddo 1392*34e67057SKenneth E. Jansen close(626) 1393*34e67057SKenneth E. Jansen 1394*34e67057SKenneth E. Jansen statptts(:,:) = 0 1395*34e67057SKenneth E. Jansen parptts(:,:) = zero 1396*34e67057SKenneth E. Jansen varts(:,:) = zero 1397*34e67057SKenneth E. Jansen 1398*34e67057SKenneth E. Jansen 1399*34e67057SKenneth E. Jansen iv_rankpernode = iv_rankpercore*iv_corepernode 1400*34e67057SKenneth E. Jansen iv_totnodes = numpe/iv_rankpernode 1401*34e67057SKenneth E. Jansen iv_totcores = iv_corepernode*iv_totnodes 1402*34e67057SKenneth E. Jansen if (myrank .eq. 0) then 1403*34e67057SKenneth E. Jansen write(*,*) 'Info for probes:' 1404*34e67057SKenneth E. Jansen write(*,*) ' Ranks per core:',iv_rankpercore 1405*34e67057SKenneth E. Jansen write(*,*) ' Cores per node:',iv_corepernode 1406*34e67057SKenneth E. Jansen write(*,*) ' Ranks per node:',iv_rankpernode 1407*34e67057SKenneth E. Jansen write(*,*) ' Total number of nodes:',iv_totnodes 1408*34e67057SKenneth E. Jansen write(*,*) ' Total number of cores',iv_totcores 1409*34e67057SKenneth E. Jansen endif 1410*34e67057SKenneth E. Jansen 1411*34e67057SKenneth E. Jansen! if (myrank .eq. numpe-1) then 1412*34e67057SKenneth E. Jansen do jj=1,ntspts 1413*34e67057SKenneth E. Jansen 1414*34e67057SKenneth E. Jansen ! Compute the adequate rank which will take care of probe jj 1415*34e67057SKenneth E. Jansen jjm1 = jj-1 1416*34e67057SKenneth E. Jansen iv_node = (iv_totnodes-1)-mod(jjm1,iv_totnodes) 1417*34e67057SKenneth E. Jansen iv_core = (iv_corepernode-1) - mod((jjm1 - 1418*34e67057SKenneth E. Jansen & mod(jjm1,iv_totnodes))/iv_totnodes,iv_corepernode) 1419*34e67057SKenneth E. Jansen iv_thread = (iv_rankpercore-1) - mod((jjm1- 1420*34e67057SKenneth E. Jansen & (mod(jjm1,iv_totcores)))/iv_totcores,iv_rankpercore) 1421*34e67057SKenneth E. Jansen iv_rank(jj) = iv_node*iv_rankpernode 1422*34e67057SKenneth E. Jansen & + iv_core*iv_rankpercore 1423*34e67057SKenneth E. Jansen & + iv_thread 1424*34e67057SKenneth E. Jansen 1425*34e67057SKenneth E. Jansen if(myrank == 0) then 1426*34e67057SKenneth E. Jansen write(*,*) ' Probe', jj, 'handled by rank', 1427*34e67057SKenneth E. Jansen & iv_rank(jj), ' on node', iv_node 1428*34e67057SKenneth E. Jansen endif 1429*34e67057SKenneth E. Jansen 1430*34e67057SKenneth E. Jansen ! Verification just in case 1431*34e67057SKenneth E. Jansen if(iv_rank(jj) .lt.0 .or. iv_rank(jj) .ge. numpe) then 1432*34e67057SKenneth E. Jansen write(*,*) 'WARNING: iv_rank(',jj,') is ', iv_rank(jj), 1433*34e67057SKenneth E. Jansen & ' and reset to numpe-1' 1434*34e67057SKenneth E. Jansen iv_rank(jj) = numpe-1 1435*34e67057SKenneth E. Jansen endif 1436*34e67057SKenneth E. Jansen 1437*34e67057SKenneth E. Jansen ! Open the varts files 1438*34e67057SKenneth E. Jansen if(myrank == iv_rank(jj)) then 1439*34e67057SKenneth E. Jansen fvarts='varts/varts' 1440*34e67057SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(jj)) 1441*34e67057SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(lstep)) 1442*34e67057SKenneth E. Jansen fvarts=trim(fvarts)//'.dat' 1443*34e67057SKenneth E. Jansen fvarts=trim(fvarts) 1444*34e67057SKenneth E. Jansen open(unit=1000+jj, file=fvarts, status='unknown') 1445*34e67057SKenneth E. Jansen endif 1446*34e67057SKenneth E. Jansen enddo 1447*34e67057SKenneth E. Jansen! endif 1448*34e67057SKenneth E. Jansen 1449*34e67057SKenneth E. Jansen endif 1450*34e67057SKenneth E. Jansenc 1451*34e67057SKenneth E. Jansen return 1452*34e67057SKenneth E. Jansen end subroutine 1453*34e67057SKenneth E. Jansen 1454*34e67057SKenneth E. Jansen subroutine initEQS(iBC, rowp, colm) 1455*34e67057SKenneth E. Jansen 1456*34e67057SKenneth E. Jansen use solvedata 1457*34e67057SKenneth E. Jansen include "common.h" 1458*34e67057SKenneth E. Jansen#ifdef HAVE_SVLS 1459*34e67057SKenneth E. Jansen include "svLS.h" 1460*34e67057SKenneth E. Jansen#endif 1461*34e67057SKenneth E. Jansen character*1024 servername 1462*34e67057SKenneth E. Jansen#ifdef HAVE_LESLIB 1463*34e67057SKenneth E. Jansen integer eqnType 1464*34e67057SKenneth E. Jansen! IF (svLSFlag .EQ. 0) THEN !When we get a PETSc option it also could block this or a positive leslib 1465*34e67057SKenneth E. Jansen call SolverLicenseServer(servername) 1466*34e67057SKenneth E. Jansen! ENDIF 1467*34e67057SKenneth E. Jansen#endif 1468*34e67057SKenneth E. Jansenc 1469*34e67057SKenneth E. Jansenc.... For linear solver Library 1470*34e67057SKenneth E. Jansenc 1471*34e67057SKenneth E. Jansenc 1472*34e67057SKenneth E. Jansenc.... assign parameter values 1473*34e67057SKenneth E. Jansenc 1474*34e67057SKenneth E. Jansen do i = 1, 100 1475*34e67057SKenneth E. Jansen numeqns(i) = i 1476*34e67057SKenneth E. Jansen enddo 1477*34e67057SKenneth E. Jansenc 1478*34e67057SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve 1479*34e67057SKenneth E. Jansenc 1480*34e67057SKenneth E. Jansen nsolt=mod(impl(1),2) ! 1 if solving temperature 1481*34e67057SKenneth E. Jansen nsclrsol=nsolt+nsclr ! total number of scalars solved At 1482*34e67057SKenneth E. Jansen ! some point we probably want to create 1483*34e67057SKenneth E. Jansen ! a map, considering stepseq(), to find 1484*34e67057SKenneth E. Jansen ! what is actually solved and only 1485*34e67057SKenneth E. Jansen ! dimension lhs to the appropriate 1486*34e67057SKenneth E. Jansen ! size. (see 1.6.1 and earlier for a 1487*34e67057SKenneth E. Jansen ! "failed" attempt at this). 1488*34e67057SKenneth E. Jansen 1489*34e67057SKenneth E. Jansen 1490*34e67057SKenneth E. Jansen nsolflow=mod(impl(1),100)/10 ! 1 if solving flow 1491*34e67057SKenneth E. Jansen 1492*34e67057SKenneth E. Jansenc 1493*34e67057SKenneth E. Jansenc.... Now, call lesNew routine to initialize 1494*34e67057SKenneth E. Jansenc memory space 1495*34e67057SKenneth E. Jansenc 1496*34e67057SKenneth E. Jansen call genadj(colm, rowp, icnt ) ! preprocess the adjacency list 1497*34e67057SKenneth E. Jansen 1498*34e67057SKenneth E. Jansen nnz_tot=icnt ! this is exactly the number of non-zero blocks on 1499*34e67057SKenneth E. Jansen ! this proc 1500*34e67057SKenneth E. Jansen 1501*34e67057SKenneth E. Jansen if (nsolflow.eq.1) then ! start of setup for the flow 1502*34e67057SKenneth E. Jansen lesId = numeqns(1) 1503*34e67057SKenneth E. Jansen eqnType = 1 1504*34e67057SKenneth E. Jansen nDofs = 4 1505*34e67057SKenneth E. Jansen 1506*34e67057SKenneth E. Jansen!-------------------------------------------------------------------- 1507*34e67057SKenneth E. Jansen! Rest of configuration of svLS is added here, where we have LHS 1508*34e67057SKenneth E. Jansen! pointers 1509*34e67057SKenneth E. Jansen 1510*34e67057SKenneth E. Jansen nPermDims = 1 1511*34e67057SKenneth E. Jansen nTmpDims = 1 1512*34e67057SKenneth E. Jansen 1513*34e67057SKenneth E. Jansen 1514*34e67057SKenneth E. Jansen allocate (lhsP(4,nnz_tot)) 1515*34e67057SKenneth E. Jansen allocate (lhsK(9,nnz_tot)) 1516*34e67057SKenneth E. Jansen 1517*34e67057SKenneth E. Jansen! Setting up svLS or leslib for flow 1518*34e67057SKenneth E. Jansen 1519*34e67057SKenneth E. Jansen IF (svLSFlag .EQ. 1) THEN 1520*34e67057SKenneth E. Jansen#ifdef HAVE_SVLS 1521*34e67057SKenneth E. Jansen IF(nPrjs.eq.0) THEN 1522*34e67057SKenneth E. Jansen svLSType=2 !GMRES if borrowed ACUSIM projection vectors variable set to zero 1523*34e67057SKenneth E. Jansen ELSE 1524*34e67057SKenneth E. Jansen svLSType=3 !NS solver 1525*34e67057SKenneth E. Jansen ENDIF 1526*34e67057SKenneth E. Jansen! reltol for the NSSOLVE is the stop criterion on the outer loop 1527*34e67057SKenneth E. Jansen! reltolIn is (eps_GM, eps_CG) from the CompMech paper 1528*34e67057SKenneth E. Jansen! for now we are using 1529*34e67057SKenneth E. Jansen! Tolerance on ACUSIM Pressure Projection for CG and 1530*34e67057SKenneth E. Jansen! Tolerance on Momentum Equations for GMRES 1531*34e67057SKenneth E. Jansen! also using Kspaceand maxIters from setup for ACUSIM 1532*34e67057SKenneth E. Jansen! 1533*34e67057SKenneth E. Jansen eps_outer=40.0*epstol(1) !following papers soggestion for now 1534*34e67057SKenneth E. Jansen CALL svLS_LS_CREATE(svLS_ls, svLSType, dimKry=Kspace, 1535*34e67057SKenneth E. Jansen 2 relTol=eps_outer, relTolIn=(/epstol(1),prestol/), 1536*34e67057SKenneth E. Jansen 3 maxItr=maxIters, 1537*34e67057SKenneth E. Jansen 4 maxItrIn=(/maxIters,maxIters/)) 1538*34e67057SKenneth E. Jansen 1539*34e67057SKenneth E. Jansen CALL svLS_COMMU_CREATE(communicator, MPI_COMM_WORLD) 1540*34e67057SKenneth E. Jansen nNo=nshg 1541*34e67057SKenneth E. Jansen gnNo=nshgt 1542*34e67057SKenneth E. Jansen IF (ipvsq .GE. 2) THEN 1543*34e67057SKenneth E. Jansen 1544*34e67057SKenneth E. Jansen#if((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 1)) 1545*34e67057SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs 1546*34e67057SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs + numCORSrfs 1547*34e67057SKenneth E. Jansen#elif((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 0)) 1548*34e67057SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs 1549*34e67057SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs + numCORSrfs 1550*34e67057SKenneth E. Jansen#elif((VER_CORONARY == 0)&&(VER_CLOSEDLOOP == 1)) 1551*34e67057SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs 1552*34e67057SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs 1553*34e67057SKenneth E. Jansen#else 1554*34e67057SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs 1555*34e67057SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs 1556*34e67057SKenneth E. Jansen#endif 1557*34e67057SKenneth E. Jansen 1558*34e67057SKenneth E. Jansen ELSE 1559*34e67057SKenneth E. Jansen svLS_nFaces = 1 !not sure about this...looks like 1 means 0 for array size issues 1560*34e67057SKenneth E. Jansen END IF 1561*34e67057SKenneth E. Jansen 1562*34e67057SKenneth E. Jansen CALL svLS_LHS_CREATE(svLS_lhs, communicator, gnNo, nNo, 1563*34e67057SKenneth E. Jansen 2 nnz_tot, ltg, colm, rowp, svLS_nFaces) 1564*34e67057SKenneth E. Jansen 1565*34e67057SKenneth E. Jansen faIn = 1 1566*34e67057SKenneth E. Jansen facenNo = 0 1567*34e67057SKenneth E. Jansen DO i=1, nshg 1568*34e67057SKenneth E. Jansen IF (IBITS(iBC(i),3,3) .NE. 0) facenNo = facenNo + 1 1569*34e67057SKenneth E. Jansen END DO 1570*34e67057SKenneth E. Jansen ALLOCATE(gNodes(facenNo), sV(nsd,facenNo)) 1571*34e67057SKenneth E. Jansen sV = 0D0 1572*34e67057SKenneth E. Jansen j = 0 1573*34e67057SKenneth E. Jansen DO i=1, nshg 1574*34e67057SKenneth E. Jansen IF (IBITS(iBC(i),3,3) .NE. 0) THEN 1575*34e67057SKenneth E. Jansen j = j + 1 1576*34e67057SKenneth E. Jansen gNodes(j) = i 1577*34e67057SKenneth E. Jansen IF (.NOT.BTEST(iBC(i),3)) sV(1,j) = 1D0 1578*34e67057SKenneth E. Jansen IF (.NOT.BTEST(iBC(i),4)) sV(2,j) = 1D0 1579*34e67057SKenneth E. Jansen IF (.NOT.BTEST(iBC(i),5)) sV(3,j) = 1D0 1580*34e67057SKenneth E. Jansen END IF 1581*34e67057SKenneth E. Jansen END DO 1582*34e67057SKenneth E. Jansen CALL svLS_BC_CREATE(svLS_lhs, faIn, facenNo, 1583*34e67057SKenneth E. Jansen 2 nsd, BC_TYPE_Dir, gNodes, sV) 1584*34e67057SKenneth E. Jansen DEALLOCATE(gNodes) 1585*34e67057SKenneth E. Jansen DEALLOCATE(sV) 1586*34e67057SKenneth E. Jansen#else 1587*34e67057SKenneth E. Jansen if(myrank.eq.0) write(*,*) 'your input requests svLS but your cmake did not build for it' 1588*34e67057SKenneth E. Jansen call error('itrdrv ','nosVLS',svLSFlag) 1589*34e67057SKenneth E. Jansen#endif 1590*34e67057SKenneth E. Jansen ENDIF 1591*34e67057SKenneth E. Jansen 1592*34e67057SKenneth E. Jansen if(leslib.eq.1) then 1593*34e67057SKenneth E. Jansen#ifdef HAVE_LESLIB 1594*34e67057SKenneth E. Jansen!-------------------------------------------------------------------- 1595*34e67057SKenneth E. Jansen call myfLesNew( lesId, 41994, 1596*34e67057SKenneth E. Jansen & eqnType, 1597*34e67057SKenneth E. Jansen & nDofs, minIters, maxIters, 1598*34e67057SKenneth E. Jansen & Kspace, iprjFlag, nPrjs, 1599*34e67057SKenneth E. Jansen & ipresPrjFlag, nPresPrjs, epstol(1), 1600*34e67057SKenneth E. Jansen & prestol, iverbose, statsflow, 1601*34e67057SKenneth E. Jansen & nPermDims, nTmpDims, servername ) 1602*34e67057SKenneth E. Jansen 1603*34e67057SKenneth E. Jansen allocate (aperm(nshg,nPermDims)) 1604*34e67057SKenneth E. Jansen allocate (atemp(nshg,nTmpDims)) 1605*34e67057SKenneth E. Jansen call readLesRestart( lesId, aperm, nshg, myrank, lstep, 1606*34e67057SKenneth E. Jansen & nPermDims ) 1607*34e67057SKenneth E. Jansen#else 1608*34e67057SKenneth E. Jansen if(myrank.eq.0) write(*,*) 'your input requests leslib but your cmake did not build for it' 1609*34e67057SKenneth E. Jansen call error('itrdrv ','nolslb',leslib) 1610*34e67057SKenneth E. Jansen#endif 1611*34e67057SKenneth E. Jansen endif !leslib=1 1612*34e67057SKenneth E. Jansen 1613*34e67057SKenneth E. Jansen else ! not solving flow just scalar 1614*34e67057SKenneth E. Jansen nPermDims = 0 1615*34e67057SKenneth E. Jansen nTmpDims = 0 1616*34e67057SKenneth E. Jansen endif 1617*34e67057SKenneth E. Jansen 1618*34e67057SKenneth E. Jansen 1619*34e67057SKenneth E. Jansen if(nsclrsol.gt.0) then 1620*34e67057SKenneth E. Jansen do isolsc=1,nsclrsol 1621*34e67057SKenneth E. Jansen lesId = numeqns(isolsc+1) 1622*34e67057SKenneth E. Jansen eqnType = 2 1623*34e67057SKenneth E. Jansen nDofs = 1 1624*34e67057SKenneth E. Jansen isclpresPrjflag = 0 1625*34e67057SKenneth E. Jansen nPresPrjs = 0 1626*34e67057SKenneth E. Jansen isclprjFlag = 1 1627*34e67057SKenneth E. Jansen indx=isolsc+2-nsolt ! complicated to keep epstol(2) for 1628*34e67057SKenneth E. Jansen ! temperature followed by scalars 1629*34e67057SKenneth E. Jansen! Setting up svLS or leslib for scalar 1630*34e67057SKenneth E. Jansen#ifdef HAVE_SVLS 1631*34e67057SKenneth E. Jansen IF (svLSFlag .EQ. 1) THEN 1632*34e67057SKenneth E. Jansen svLSType=2 !only option for scalars 1633*34e67057SKenneth E. Jansen! reltol for the GMRES is the stop criterion 1634*34e67057SKenneth E. Jansen! also using Kspaceand maxIters from setup for ACUSIM 1635*34e67057SKenneth E. Jansen! 1636*34e67057SKenneth E. Jansen CALL svLS_LS_CREATE(svLS_ls_S(isolsc), svLSType, dimKry=Kspace, 1637*34e67057SKenneth E. Jansen 2 relTol=epstol(indx), 1638*34e67057SKenneth E. Jansen 3 maxItr=maxIters 1639*34e67057SKenneth E. Jansen 4 ) 1640*34e67057SKenneth E. Jansen 1641*34e67057SKenneth E. Jansen CALL svLS_COMMU_CREATE(communicator_S(isolsc), MPI_COMM_WORLD) 1642*34e67057SKenneth E. Jansen 1643*34e67057SKenneth E. Jansen svLS_nFaces = 1 !not sure about this...should try it with zero 1644*34e67057SKenneth E. Jansen 1645*34e67057SKenneth E. Jansen CALL svLS_LHS_CREATE(svLS_lhs_S(isolsc), communicator_S(isolsc), gnNo, nNo, 1646*34e67057SKenneth E. Jansen 2 nnz_tot, ltg, colm, rowp, svLS_nFaces) 1647*34e67057SKenneth E. Jansen 1648*34e67057SKenneth E. Jansen faIn = 1 1649*34e67057SKenneth E. Jansen facenNo = 0 1650*34e67057SKenneth E. Jansen ib=5+isolsc 1651*34e67057SKenneth E. Jansen DO i=1, nshg 1652*34e67057SKenneth E. Jansen IF (btest(iBC(i),ib)) facenNo = facenNo + 1 1653*34e67057SKenneth E. Jansen END DO 1654*34e67057SKenneth E. Jansen ALLOCATE(gNodes(facenNo), sV(1,facenNo)) 1655*34e67057SKenneth E. Jansen sV = 0D0 1656*34e67057SKenneth E. Jansen j = 0 1657*34e67057SKenneth E. Jansen DO i=1, nshg 1658*34e67057SKenneth E. Jansen IF (btest(iBC(i),ib)) THEN 1659*34e67057SKenneth E. Jansen j = j + 1 1660*34e67057SKenneth E. Jansen gNodes(j) = i 1661*34e67057SKenneth E. Jansen END IF 1662*34e67057SKenneth E. Jansen END DO 1663*34e67057SKenneth E. Jansen 1664*34e67057SKenneth E. Jansen CALL svLS_BC_CREATE(svLS_lhs_S(isolsc), faIn, facenNo, 1665*34e67057SKenneth E. Jansen 2 1, BC_TYPE_Dir, gNodes, sV(1,:)) 1666*34e67057SKenneth E. Jansen DEALLOCATE(gNodes) 1667*34e67057SKenneth E. Jansen DEALLOCATE(sV) 1668*34e67057SKenneth E. Jansen 1669*34e67057SKenneth E. Jansen if( isolsc.eq.1) then ! if multiple scalars make sure done once 1670*34e67057SKenneth E. Jansen allocate (apermS(1,1,1)) 1671*34e67057SKenneth E. Jansen allocate (atempS(1,1)) !they can all share this 1672*34e67057SKenneth E. Jansen endif 1673*34e67057SKenneth E. Jansen ENDIF !svLS handing scalar solve 1674*34e67057SKenneth E. Jansen#endif 1675*34e67057SKenneth E. Jansen 1676*34e67057SKenneth E. Jansen 1677*34e67057SKenneth E. Jansen#ifdef HAVE_LESLIB 1678*34e67057SKenneth E. Jansen if (leslib.eq.1) then 1679*34e67057SKenneth E. Jansen call myfLesNew( lesId, 41994, 1680*34e67057SKenneth E. Jansen & eqnType, 1681*34e67057SKenneth E. Jansen & nDofs, minIters, maxIters, 1682*34e67057SKenneth E. Jansen & Kspace, isclprjFlag, nPrjs, 1683*34e67057SKenneth E. Jansen & isclpresPrjFlag, nPresPrjs, epstol(indx), 1684*34e67057SKenneth E. Jansen & prestol, iverbose, statssclr, 1685*34e67057SKenneth E. Jansen & nPermDimsS, nTmpDimsS, servername ) 1686*34e67057SKenneth E. Jansen endif 1687*34e67057SKenneth E. Jansen#endif 1688*34e67057SKenneth E. Jansen enddo !loop over scalars to solve (not yet worked out for multiple svLS solves 1689*34e67057SKenneth E. Jansen allocate (lhsS(nnz_tot,nsclrsol)) 1690*34e67057SKenneth E. Jansen#ifdef HAVE_LESLIB 1691*34e67057SKenneth E. Jansen if(leslib.eq.1) then ! we just prepped scalar solves for leslib so allocate arrays 1692*34e67057SKenneth E. Jansenc 1693*34e67057SKenneth E. Jansenc Assume all scalars have the same size needs 1694*34e67057SKenneth E. Jansenc 1695*34e67057SKenneth E. Jansen allocate (apermS(nshg,nPermDimsS,nsclrsol)) 1696*34e67057SKenneth E. Jansen allocate (atempS(nshg,nTmpDimsS)) !they can all share this 1697*34e67057SKenneth E. Jansen endif 1698*34e67057SKenneth E. Jansen#endif 1699*34e67057SKenneth E. Jansenc 1700*34e67057SKenneth E. Jansenc actually they could even share with atemp but leave that for later 1701*34e67057SKenneth E. Jansenc 1702*34e67057SKenneth E. Jansen else !no scalar solves at all so zero dims not used 1703*34e67057SKenneth E. Jansen nPermDimsS = 0 1704*34e67057SKenneth E. Jansen nTmpDimsS = 0 1705*34e67057SKenneth E. Jansen endif 1706*34e67057SKenneth E. Jansen return 1707*34e67057SKenneth E. Jansen end subroutine 1708*34e67057SKenneth E. Jansen subroutine seticomputevort 1709*34e67057SKenneth E. Jansen include "common.h" 1710*34e67057SKenneth E. Jansen icomputevort = 0 1711*34e67057SKenneth E. Jansen if (ivort == 1) then ! Print vorticity = True in solver.inp 1712*34e67057SKenneth E. Jansen ! We then compute the vorticity only if we 1713*34e67057SKenneth E. Jansen ! 1) we write an intermediate checkpoint 1714*34e67057SKenneth E. Jansen ! 2) we reach the last time step and write the last checkpoint 1715*34e67057SKenneth E. Jansen ! 3) we accumulate statistics in ybar for every time step 1716*34e67057SKenneth E. Jansen ! BEWARE: we need here lstep+1 and istep+1 because the lstep and 1717*34e67057SKenneth E. Jansen ! istep gets incremened after the flowsolve, further below 1718*34e67057SKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep+1, ntout) .eq. 0)) .or. 1719*34e67057SKenneth E. Jansen & istep+1.eq.nstep(itseq) .or. ioybar == 1) then 1720*34e67057SKenneth E. Jansen icomputevort = 1 1721*34e67057SKenneth E. Jansen endif 1722*34e67057SKenneth E. Jansen endif 1723*34e67057SKenneth E. Jansen 1724*34e67057SKenneth E. Jansen! write(*,*) 'icomputevort: ',icomputevort, ' - istep: ', 1725*34e67057SKenneth E. Jansen! & istep,' - nstep(itseq):',nstep(itseq),'- lstep:', 1726*34e67057SKenneth E. Jansen! & lstep, '- ntout:', ntout 1727*34e67057SKenneth E. Jansen return 1728*34e67057SKenneth E. Jansen end subroutine 1729*34e67057SKenneth E. Jansen subroutine computeVort( vorticity, GradV,strain) 1730*34e67057SKenneth E. Jansen 1731*34e67057SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: gradV, strain, vorticity 1732*34e67057SKenneth E. Jansen 1733*34e67057SKenneth E. Jansen ! vorticity components and magnitude 1734*34e67057SKenneth E. Jansen vorticity(:,1) = GradV(:,8)-GradV(:,6) !omega_x 1735*34e67057SKenneth E. Jansen vorticity(:,2) = GradV(:,3)-GradV(:,7) !omega_y 1736*34e67057SKenneth E. Jansen vorticity(:,3) = GradV(:,4)-GradV(:,2) !omega_z 1737*34e67057SKenneth E. Jansen vorticity(:,4) = sqrt( vorticity(:,1)*vorticity(:,1) 1738*34e67057SKenneth E. Jansen & + vorticity(:,2)*vorticity(:,2) 1739*34e67057SKenneth E. Jansen & + vorticity(:,3)*vorticity(:,3) ) 1740*34e67057SKenneth E. Jansen ! Q 1741*34e67057SKenneth E. Jansen strain(:,1) = GradV(:,1) !S11 1742*34e67057SKenneth E. Jansen strain(:,2) = 0.5*(GradV(:,2)+GradV(:,4)) !S12 1743*34e67057SKenneth E. Jansen strain(:,3) = 0.5*(GradV(:,3)+GradV(:,7)) !S13 1744*34e67057SKenneth E. Jansen strain(:,4) = GradV(:,5) !S22 1745*34e67057SKenneth E. Jansen strain(:,5) = 0.5*(GradV(:,6)+GradV(:,8)) !S23 1746*34e67057SKenneth E. Jansen strain(:,6) = GradV(:,9) !S33 1747*34e67057SKenneth E. Jansen 1748*34e67057SKenneth E. Jansen vorticity(:,5) = 0.25*( vorticity(:,4)*vorticity(:,4) !Q 1749*34e67057SKenneth E. Jansen & - 2.0*( strain(:,1)*strain(:,1) 1750*34e67057SKenneth E. Jansen & + 2* strain(:,2)*strain(:,2) 1751*34e67057SKenneth E. Jansen & + 2* strain(:,3)*strain(:,3) 1752*34e67057SKenneth E. Jansen & + strain(:,4)*strain(:,4) 1753*34e67057SKenneth E. Jansen & + 2* strain(:,5)*strain(:,5) 1754*34e67057SKenneth E. Jansen & + strain(:,6)*strain(:,6))) 1755*34e67057SKenneth E. Jansen 1756*34e67057SKenneth E. Jansen return 1757*34e67057SKenneth E. Jansen end subroutine 1758*34e67057SKenneth E. Jansen 1759*34e67057SKenneth E. Jansen subroutine dumpTimeSeries() 1760*34e67057SKenneth E. Jansen use timedata !allows collection of time series 1761*34e67057SKenneth E. Jansen include "common.h" 1762*34e67057SKenneth E. Jansen 1763*34e67057SKenneth E. Jansen 1764*34e67057SKenneth E. Jansen if (numpe > 1) then 1765*34e67057SKenneth E. Jansen do jj = 1, ntspts 1766*34e67057SKenneth E. Jansen vartssoln((jj-1)*ndof+1:jj*ndof)=varts(jj,:) 1767*34e67057SKenneth E. Jansen ivarts=zero 1768*34e67057SKenneth E. Jansen enddo 1769*34e67057SKenneth E. Jansen do k=1,ndof*ntspts 1770*34e67057SKenneth E. Jansen if(vartssoln(k).ne.zero) ivarts(k)=1 1771*34e67057SKenneth E. Jansen enddo 1772*34e67057SKenneth E. Jansen 1773*34e67057SKenneth E. Jansen! call MPI_REDUCE(vartssoln, vartssolng, ndof*ntspts, 1774*34e67057SKenneth E. Jansen! & MPI_DOUBLE_PRECISION, MPI_SUM, master, 1775*34e67057SKenneth E. Jansen! & MPI_COMM_WORLD, ierr) 1776*34e67057SKenneth E. Jansen 1777*34e67057SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1778*34e67057SKenneth E. Jansen call MPI_ALLREDUCE(vartssoln, vartssolng, 1779*34e67057SKenneth E. Jansen & ndof*ntspts, 1780*34e67057SKenneth E. Jansen & MPI_DOUBLE_PRECISION, MPI_SUM, 1781*34e67057SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 1782*34e67057SKenneth E. Jansen 1783*34e67057SKenneth E. Jansen! call MPI_REDUCE(ivarts, ivartsg, ndof*ntspts, 1784*34e67057SKenneth E. Jansen! & MPI_INTEGER, MPI_SUM, master, 1785*34e67057SKenneth E. Jansen! & MPI_COMM_WORLD, ierr) 1786*34e67057SKenneth E. Jansen 1787*34e67057SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1788*34e67057SKenneth E. Jansen call MPI_ALLREDUCE(ivarts, ivartsg, ndof*ntspts, 1789*34e67057SKenneth E. Jansen & MPI_INTEGER, MPI_SUM, 1790*34e67057SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 1791*34e67057SKenneth E. Jansen 1792*34e67057SKenneth E. Jansen! if (myrank.eq.zero) then 1793*34e67057SKenneth E. Jansen do jj = 1, ntspts 1794*34e67057SKenneth E. Jansen 1795*34e67057SKenneth E. Jansen if(myrank .eq. iv_rank(jj)) then 1796*34e67057SKenneth E. Jansen ! No need to update all varts components, only the one treated by the expected rank 1797*34e67057SKenneth E. Jansen ! Note: keep varts as a vector, as multiple probes could be treated by one rank 1798*34e67057SKenneth E. Jansen indxvarts = (jj-1)*ndof 1799*34e67057SKenneth E. Jansen do k=1,ndof 1800*34e67057SKenneth E. Jansen if(ivartsg(indxvarts+k).ne.0) then ! none of the vartssoln(parts) were non zero 1801*34e67057SKenneth E. Jansen varts(jj,k)=vartssolng(indxvarts+k)/ 1802*34e67057SKenneth E. Jansen & ivartsg(indxvarts+k) 1803*34e67057SKenneth E. Jansen endif 1804*34e67057SKenneth E. Jansen enddo 1805*34e67057SKenneth E. Jansen endif !only if myrank eq iv_rank(jj) 1806*34e67057SKenneth E. Jansen enddo 1807*34e67057SKenneth E. Jansen! endif !only on master 1808*34e67057SKenneth E. Jansen endif !only if numpe > 1 1809*34e67057SKenneth E. Jansen 1810*34e67057SKenneth E. Jansen! if (myrank.eq.zero) then 1811*34e67057SKenneth E. Jansen do jj = 1, ntspts 1812*34e67057SKenneth E. Jansen if(myrank .eq. iv_rank(jj)) then 1813*34e67057SKenneth E. Jansen ifile = 1000+jj 1814*34e67057SKenneth E. Jansen write(ifile,555) lstep, (varts(jj,k),k=1,ndof) !Beware of format 555 - check ndof 1815*34e67057SKenneth E. Jansenc call flush(ifile) 1816*34e67057SKenneth E. Jansen if (((irs .ge. 1) .and. 1817*34e67057SKenneth E. Jansen & (mod(lstep, ntout) .eq. 0))) then 1818*34e67057SKenneth E. Jansen close(ifile) 1819*34e67057SKenneth E. Jansen fvarts='varts/varts' 1820*34e67057SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(jj)) 1821*34e67057SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(lskeep)) 1822*34e67057SKenneth E. Jansen fvarts=trim(fvarts)//'.dat' 1823*34e67057SKenneth E. Jansen fvarts=trim(fvarts) 1824*34e67057SKenneth E. Jansen open(unit=ifile, file=fvarts, 1825*34e67057SKenneth E. Jansen & position='append') 1826*34e67057SKenneth E. Jansen endif !only when dumping restart 1827*34e67057SKenneth E. Jansen endif 1828*34e67057SKenneth E. Jansen enddo 1829*34e67057SKenneth E. Jansen! endif !only on master 1830*34e67057SKenneth E. Jansen 1831*34e67057SKenneth E. Jansen varts(:,:) = zero ! reset the array for next step 1832*34e67057SKenneth E. Jansen 1833*34e67057SKenneth E. Jansen 1834*34e67057SKenneth E. Jansen!555 format(i6,5(2x,E12.5e2)) 1835*34e67057SKenneth E. Jansen555 format(i6,6(2x,E20.12e2)) !assuming ndof = 6 here 1836*34e67057SKenneth E. Jansen 1837*34e67057SKenneth E. Jansen return 1838*34e67057SKenneth E. Jansen end subroutine 1839*34e67057SKenneth E. Jansen 1840*34e67057SKenneth E. Jansen subroutine collectErrorYbar(ybar,yold,wallssVec,wallssVecBar, 1841*34e67057SKenneth E. Jansen & vorticity,yphbar,rerr) 1842*34e67057SKenneth E. Jansen include "common.h" 1843*34e67057SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: ybar, yold, vorticity 1844*34e67057SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: yphbar,wallssVec 1845*34e67057SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: wallssVecBar,rerr 1846*34e67057SKenneth E. Jansenc$$$c 1847*34e67057SKenneth E. Jansenc$$$c compute average 1848*34e67057SKenneth E. Jansenc$$$c 1849*34e67057SKenneth E. Jansenc$$$ tfact=one/istep 1850*34e67057SKenneth E. Jansenc$$$ ybar =tfact*yold + (one-tfact)*ybar 1851*34e67057SKenneth E. Jansen 1852*34e67057SKenneth E. Jansenc compute average 1853*34e67057SKenneth E. Jansenc ybar(:,1:3) are average velocity components 1854*34e67057SKenneth E. Jansenc ybar(:,4) is average pressure 1855*34e67057SKenneth E. Jansenc ybar(:,5) is average speed 1856*34e67057SKenneth E. Jansenc ybar(:,6:8) is average of sq. of each vel. component 1857*34e67057SKenneth E. Jansenc ybar(:,9) is average of sq. of pressure 1858*34e67057SKenneth E. Jansenc ybar(:,10:12) is average of cross vel. components : uv, uw and vw 1859*34e67057SKenneth E. Jansenc averaging procedure justified only for identical time step sizes 1860*34e67057SKenneth E. Jansenc ybar(:,13) is average of eddy viscosity 1861*34e67057SKenneth E. Jansenc ybar(:,14:16) is average vorticity components 1862*34e67057SKenneth E. Jansenc ybar(:,17) is average vorticity magnitude 1863*34e67057SKenneth E. Jansenc istep is number of time step 1864*34e67057SKenneth E. Jansenc 1865*34e67057SKenneth E. Jansen icollectybar = 0 1866*34e67057SKenneth E. Jansen if(nphasesincycle.eq.0 .or. 1867*34e67057SKenneth E. Jansen & istep.gt.ncycles_startphaseavg*nstepsincycle) then 1868*34e67057SKenneth E. Jansen icollectybar = 1 1869*34e67057SKenneth E. Jansen if((istep-1).eq.ncycles_startphaseavg*nstepsincycle) 1870*34e67057SKenneth E. Jansen & istepsinybar = 0 ! init. to zero in first cycle in avg. 1871*34e67057SKenneth E. Jansen endif 1872*34e67057SKenneth E. Jansen 1873*34e67057SKenneth E. Jansen if(icollectybar.eq.1) then 1874*34e67057SKenneth E. Jansen istepsinybar = istepsinybar+1 1875*34e67057SKenneth E. Jansen tfact=one/istepsinybar 1876*34e67057SKenneth E. Jansen 1877*34e67057SKenneth E. Jansen! if(myrank.eq.master .and. nphasesincycle.ne.0 .and. 1878*34e67057SKenneth E. Jansen! & mod((istep-1),nstepsincycle).eq.0) 1879*34e67057SKenneth E. Jansen! & write(*,*)'nsamples in phase average:',istepsinybar 1880*34e67057SKenneth E. Jansen 1881*34e67057SKenneth E. Jansenc ybar to contain the averaged ((u,v,w),p)-fields 1882*34e67057SKenneth E. Jansenc and speed average, i.e., sqrt(u^2+v^2+w^2) 1883*34e67057SKenneth E. Jansenc and avg. of sq. terms including 1884*34e67057SKenneth E. Jansenc u^2, v^2, w^2, p^2 and cross terms of uv, uw and vw 1885*34e67057SKenneth E. Jansen 1886*34e67057SKenneth E. Jansen ybar(:,1) = tfact*yold(:,1) + (one-tfact)*ybar(:,1) 1887*34e67057SKenneth E. Jansen ybar(:,2) = tfact*yold(:,2) + (one-tfact)*ybar(:,2) 1888*34e67057SKenneth E. Jansen ybar(:,3) = tfact*yold(:,3) + (one-tfact)*ybar(:,3) 1889*34e67057SKenneth E. Jansen ybar(:,4) = tfact*yold(:,4) + (one-tfact)*ybar(:,4) 1890*34e67057SKenneth E. Jansen ybar(:,5) = tfact*sqrt(yold(:,1)**2+yold(:,2)**2+ 1891*34e67057SKenneth E. Jansen & yold(:,3)**2) + (one-tfact)*ybar(:,5) 1892*34e67057SKenneth E. Jansen ybar(:,6) = tfact*yold(:,1)**2 + 1893*34e67057SKenneth E. Jansen & (one-tfact)*ybar(:,6) 1894*34e67057SKenneth E. Jansen ybar(:,7) = tfact*yold(:,2)**2 + 1895*34e67057SKenneth E. Jansen & (one-tfact)*ybar(:,7) 1896*34e67057SKenneth E. Jansen ybar(:,8) = tfact*yold(:,3)**2 + 1897*34e67057SKenneth E. Jansen & (one-tfact)*ybar(:,8) 1898*34e67057SKenneth E. Jansen ybar(:,9) = tfact*yold(:,4)**2 + 1899*34e67057SKenneth E. Jansen & (one-tfact)*ybar(:,9) 1900*34e67057SKenneth E. Jansen ybar(:,10) = tfact*yold(:,1)*yold(:,2) + !uv 1901*34e67057SKenneth E. Jansen & (one-tfact)*ybar(:,10) 1902*34e67057SKenneth E. Jansen ybar(:,11) = tfact*yold(:,1)*yold(:,3) + !uw 1903*34e67057SKenneth E. Jansen & (one-tfact)*ybar(:,11) 1904*34e67057SKenneth E. Jansen ybar(:,12) = tfact*yold(:,2)*yold(:,3) + !vw 1905*34e67057SKenneth E. Jansen & (one-tfact)*ybar(:,12) 1906*34e67057SKenneth E. Jansen if(nsclr.gt.0) !nut 1907*34e67057SKenneth E. Jansen & ybar(:,13) = tfact*yold(:,6) + (one-tfact)*ybar(:,13) 1908*34e67057SKenneth E. Jansen 1909*34e67057SKenneth E. Jansen if(ivort == 1) then !vorticity 1910*34e67057SKenneth E. Jansen ybar(:,14) = tfact*vorticity(:,1) + 1911*34e67057SKenneth E. Jansen & (one-tfact)*ybar(:,14) 1912*34e67057SKenneth E. Jansen ybar(:,15) = tfact*vorticity(:,2) + 1913*34e67057SKenneth E. Jansen & (one-tfact)*ybar(:,15) 1914*34e67057SKenneth E. Jansen ybar(:,16) = tfact*vorticity(:,3) + 1915*34e67057SKenneth E. Jansen & (one-tfact)*ybar(:,16) 1916*34e67057SKenneth E. Jansen ybar(:,17) = tfact*vorticity(:,4) + 1917*34e67057SKenneth E. Jansen & (one-tfact)*ybar(:,17) 1918*34e67057SKenneth E. Jansen endif 1919*34e67057SKenneth E. Jansen 1920*34e67057SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 1921*34e67057SKenneth E. Jansen wallssVecBar(:,1) = tfact*wallssVec(:,1) 1922*34e67057SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,1) 1923*34e67057SKenneth E. Jansen wallssVecBar(:,2) = tfact*wallssVec(:,2) 1924*34e67057SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,2) 1925*34e67057SKenneth E. Jansen wallssVecBar(:,3) = tfact*wallssVec(:,3) 1926*34e67057SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,3) 1927*34e67057SKenneth E. Jansen endif 1928*34e67057SKenneth E. Jansen endif !icollectybar.eq.1 1929*34e67057SKenneth E. Jansenc 1930*34e67057SKenneth E. Jansenc compute phase average 1931*34e67057SKenneth E. Jansenc 1932*34e67057SKenneth E. Jansen if(nphasesincycle.ne.0 .and. 1933*34e67057SKenneth E. Jansen & istep.gt.ncycles_startphaseavg*nstepsincycle) then 1934*34e67057SKenneth E. Jansen 1935*34e67057SKenneth E. Jansenc beginning of cycle is considered as ncycles_startphaseavg*nstepsincycle+1 1936*34e67057SKenneth E. Jansen if((istep-1).eq.ncycles_startphaseavg*nstepsincycle) 1937*34e67057SKenneth E. Jansen & icyclesinavg = 0 ! init. to zero in first cycle in avg. 1938*34e67057SKenneth E. Jansen 1939*34e67057SKenneth E. Jansen ! find number of steps between phases 1940*34e67057SKenneth E. Jansen nstepsbtwphase = nstepsincycle/nphasesincycle ! integer value 1941*34e67057SKenneth E. Jansen if(mod(istep-1,nstepsincycle).eq.0) then 1942*34e67057SKenneth E. Jansen iphase = 1 ! init. to one in beginning of every cycle 1943*34e67057SKenneth E. Jansen icyclesinavg = icyclesinavg + 1 1944*34e67057SKenneth E. Jansen endif 1945*34e67057SKenneth E. Jansen 1946*34e67057SKenneth E. Jansen icollectphase = 0 1947*34e67057SKenneth E. Jansen istepincycle = mod(istep,nstepsincycle) 1948*34e67057SKenneth E. Jansen if(istepincycle.eq.0) istepincycle=nstepsincycle 1949*34e67057SKenneth E. Jansen if(istepincycle.eq.iphase*nstepsbtwphase) then 1950*34e67057SKenneth E. Jansen icollectphase = 1 1951*34e67057SKenneth E. Jansen iphase = iphase+1 ! use 'iphase-1' below 1952*34e67057SKenneth E. Jansen endif 1953*34e67057SKenneth E. Jansen 1954*34e67057SKenneth E. Jansen if(icollectphase.eq.1) then 1955*34e67057SKenneth E. Jansen tfactphase = one/icyclesinavg 1956*34e67057SKenneth E. Jansen 1957*34e67057SKenneth E. Jansen if(myrank.eq.master) then 1958*34e67057SKenneth E. Jansen write(*,*) 'nsamples in phase ',iphase-1,': ', 1959*34e67057SKenneth E. Jansen & icyclesinavg 1960*34e67057SKenneth E. Jansen endif 1961*34e67057SKenneth E. Jansen 1962*34e67057SKenneth E. Jansen yphbar(:,1,iphase-1) = tfactphase*yold(:,1) + 1963*34e67057SKenneth E. Jansen & (one-tfactphase)*yphbar(:,1,iphase-1) 1964*34e67057SKenneth E. Jansen yphbar(:,2,iphase-1) = tfactphase*yold(:,2) + 1965*34e67057SKenneth E. Jansen & (one-tfactphase)*yphbar(:,2,iphase-1) 1966*34e67057SKenneth E. Jansen yphbar(:,3,iphase-1) = tfactphase*yold(:,3) + 1967*34e67057SKenneth E. Jansen & (one-tfactphase)*yphbar(:,3,iphase-1) 1968*34e67057SKenneth E. Jansen yphbar(:,4,iphase-1) = tfactphase*yold(:,4) + 1969*34e67057SKenneth E. Jansen & (one-tfactphase)*yphbar(:,4,iphase-1) 1970*34e67057SKenneth E. Jansen yphbar(:,5,iphase-1) = tfactphase*sqrt(yold(:,1)**2 1971*34e67057SKenneth E. Jansen & +yold(:,2)**2+yold(:,3)**2) + 1972*34e67057SKenneth E. Jansen & (one-tfactphase)*yphbar(:,5,iphase-1) 1973*34e67057SKenneth E. Jansen yphbar(:,6,iphase-1) = 1974*34e67057SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,1) 1975*34e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,6,iphase-1) 1976*34e67057SKenneth E. Jansen 1977*34e67057SKenneth E. Jansen yphbar(:,7,iphase-1) = 1978*34e67057SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,2) 1979*34e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,7,iphase-1) 1980*34e67057SKenneth E. Jansen 1981*34e67057SKenneth E. Jansen yphbar(:,8,iphase-1) = 1982*34e67057SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,3) 1983*34e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,8,iphase-1) 1984*34e67057SKenneth E. Jansen 1985*34e67057SKenneth E. Jansen yphbar(:,9,iphase-1) = 1986*34e67057SKenneth E. Jansen & tfactphase*yold(:,2)*yold(:,2) 1987*34e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,9,iphase-1) 1988*34e67057SKenneth E. Jansen 1989*34e67057SKenneth E. Jansen yphbar(:,10,iphase-1) = 1990*34e67057SKenneth E. Jansen & tfactphase*yold(:,2)*yold(:,3) 1991*34e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,10,iphase-1) 1992*34e67057SKenneth E. Jansen 1993*34e67057SKenneth E. Jansen yphbar(:,11,iphase-1) = 1994*34e67057SKenneth E. Jansen & tfactphase*yold(:,3)*yold(:,3) 1995*34e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,11,iphase-1) 1996*34e67057SKenneth E. Jansen 1997*34e67057SKenneth E. Jansen if(ivort == 1) then 1998*34e67057SKenneth E. Jansen yphbar(:,12,iphase-1) = 1999*34e67057SKenneth E. Jansen & tfactphase*vorticity(:,1) 2000*34e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,12,iphase-1) 2001*34e67057SKenneth E. Jansen yphbar(:,13,iphase-1) = 2002*34e67057SKenneth E. Jansen & tfactphase*vorticity(:,2) 2003*34e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,13,iphase-1) 2004*34e67057SKenneth E. Jansen yphbar(:,14,iphase-1) = 2005*34e67057SKenneth E. Jansen & tfactphase*vorticity(:,3) 2006*34e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,14,iphase-1) 2007*34e67057SKenneth E. Jansen yphbar(:,15,iphase-1) = 2008*34e67057SKenneth E. Jansen & tfactphase*vorticity(:,4) 2009*34e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,15,iphase-1) 2010*34e67057SKenneth E. Jansen endif 2011*34e67057SKenneth E. Jansen endif !compute phase average 2012*34e67057SKenneth E. Jansen endif !if(nphasesincycle.eq.0 .or. istep.gt.ncycles_startphaseavg*nstepsincycle) 2013*34e67057SKenneth E. Jansenc 2014*34e67057SKenneth E. Jansenc compute rms 2015*34e67057SKenneth E. Jansenc 2016*34e67057SKenneth E. Jansen if(icollectybar.eq.1) then 2017*34e67057SKenneth E. Jansen rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2 2018*34e67057SKenneth E. Jansen rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2 2019*34e67057SKenneth E. Jansen rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2 2020*34e67057SKenneth E. Jansen rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2 2021*34e67057SKenneth E. Jansen endif 2022*34e67057SKenneth E. Jansen return 2023*34e67057SKenneth E. Jansen end subroutine 2024*34e67057SKenneth E. Jansen 2025