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 3753c9b1fcSKenneth E. Jansen use solvedata 389071d3baSCameron Smith use iso_c_binding 3959599516SKenneth E. Jansen 4059599516SKenneth E. Jansenc use readarrays !reads in uold and acold 4159599516SKenneth E. Jansen 4259599516SKenneth E. Jansen include "common.h" 4359599516SKenneth E. Jansen include "mpif.h" 4459599516SKenneth E. Jansen include "auxmpi.h" 45bd36043dSBen Matthews#ifdef HAVE_SVLS 46ae8d68e4SKenneth E. Jansen include "svLS.h" 47bd36043dSBen Matthews#endif 4879f1763eSKenneth E. Jansen#if !defined(HAVE_SVLS) && !defined(HAVE_LESLIB) 4979f1763eSKenneth E. Jansen#error "You must enable a linear solver during cmake setup" 50bd36043dSBen Matthews#endif 51bd36043dSBen Matthews 5259599516SKenneth E. Jansenc 5359599516SKenneth E. Jansen 5459599516SKenneth E. Jansen 5559599516SKenneth E. Jansen real*8 y(nshg,ndof), ac(nshg,ndof), 5659599516SKenneth E. Jansen & yold(nshg,ndof), acold(nshg,ndof), 5759599516SKenneth E. Jansen & u(nshg,nsd), uold(nshg,nsd), 5859599516SKenneth E. Jansen & x(numnp,nsd), solinc(nshg,ndof), 5959599516SKenneth E. Jansen & BC(nshg,ndofBC), tf(nshg,ndof), 6059599516SKenneth E. Jansen & GradV(nshg,nsdsq) 6159599516SKenneth E. Jansen 6259599516SKenneth E. Jansenc 6359599516SKenneth E. Jansen real*8 res(nshg,ndof) 6459599516SKenneth E. Jansenc 6559599516SKenneth E. Jansen real*8 shp(MAXTOP,maxsh,MAXQPT), 6659599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 6759599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 6859599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 6959599516SKenneth E. Jansenc 7059599516SKenneth E. Jansen integer rowp(nshg,nnz), colm(nshg+1), 7159599516SKenneth E. Jansen & iBC(nshg), 7259599516SKenneth E. Jansen & ilwork(nlwork), 7359599516SKenneth E. Jansen & iper(nshg), ifuncs(6) 7459599516SKenneth E. Jansen 7559599516SKenneth E. Jansen real*8 vbc_prof(nshg,3) 7659599516SKenneth E. Jansen 7759599516SKenneth E. Jansen integer stopjob 7859599516SKenneth E. Jansen character*10 cname2 7959599516SKenneth E. Jansen character*5 cname 8059599516SKenneth E. Jansenc 8159599516SKenneth E. Jansenc stuff for dynamic model s.w.avg and wall model 8259599516SKenneth E. Jansenc 8359599516SKenneth E. Jansen dimension ifath(numnp), velbar(nfath,ndof), nsons(nfath) 8459599516SKenneth E. Jansen 8559599516SKenneth E. Jansen dimension wallubar(2),walltot(2) 8659599516SKenneth E. Jansenc 8759599516SKenneth E. Jansen real*8 almit, alfit, gamit 8859599516SKenneth E. Jansenc 8959599516SKenneth E. Jansen character*20 fname1,fmt1 9059599516SKenneth E. Jansen character*20 fname2,fmt2 9159599516SKenneth E. Jansen character*60 fnamepold, fvarts 9259599516SKenneth E. Jansen character*4 fname4c ! 4 characters 9359599516SKenneth E. Jansen integer iarray(50) ! integers for headers 9459599516SKenneth E. Jansen integer isgn(ndof), isgng(ndof) 9559599516SKenneth E. Jansen 9634e67057SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: rerr 9759599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: ybar, strain, vorticity 9859599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: wallssVec, wallssVecbar 9959599516SKenneth E. Jansen 10059599516SKenneth E. Jansen real*8 tcorecp(2), tcorecpscal(2) 10159599516SKenneth E. Jansen 10259599516SKenneth E. Jansen real*8, allocatable, dimension(:,:,:) :: yphbar 10359599516SKenneth E. Jansen real*8 CFLworst(numel) 10459599516SKenneth E. Jansen 10559599516SKenneth E. Jansen integer :: iv_rankpernode, iv_totnodes, iv_totcores 10659599516SKenneth E. Jansen integer :: iv_node, iv_core, iv_thread 107ae8d68e4SKenneth E. Jansen!-------------------------------------------------------------------- 108ae8d68e4SKenneth E. Jansen! Setting up svLS 109bd36043dSBen Matthews#ifdef HAVE_SVLS 110*da6af917SKenneth E. Jansen INTEGER svLS_nFaces 111ae8d68e4SKenneth E. Jansen TYPE(svLS_lhsType) svLS_lhs 112ae8d68e4SKenneth E. Jansen TYPE(svLS_lsType) svLS_ls 113ec121c45SKenneth E. Jansen! repeat for scalar solves (up to 4 at this time which is consistent with rest of PHASTA) 114daa97cf2SKenneth E. Jansen TYPE(svLS_lhsType) svLS_lhs_S(4) 115daa97cf2SKenneth E. Jansen TYPE(svLS_lsType) svLS_ls_S(4) 116bd36043dSBen Matthews#endif 11734e67057SKenneth E. Jansen call initmpistat() ! see bottom of code to see just how easy it is 11859599516SKenneth E. Jansen 11959599516SKenneth E. Jansen call initmemstat() 12059599516SKenneth E. Jansen 121ae8d68e4SKenneth E. Jansen!-------------------------------------------------------------------- 122436818eeSKenneth E. Jansen! Setting up svLS Moved down for better org 123ae8d68e4SKenneth E. Jansen 12459599516SKenneth E. Jansenc 12559599516SKenneth E. Jansenc only master should be verbose 12659599516SKenneth E. Jansenc 12759599516SKenneth E. Jansen 12859599516SKenneth E. Jansen if(numpe.gt.0 .and. myrank.ne.master)iverbose=0 12959599516SKenneth E. Jansenc 13059599516SKenneth E. Jansen 13159599516SKenneth E. Jansen lskeep=lstep 13259599516SKenneth E. Jansen 13334e67057SKenneth E. Jansen call initTimeSeries() 13459599516SKenneth E. Jansenc 13559599516SKenneth E. Jansenc.... open history and aerodynamic forces files 13659599516SKenneth E. Jansenc 13759599516SKenneth E. Jansen if (myrank .eq. master) then 138c9a96f21SKenneth E. Jansen open (unit=ihist, file=fhist, status='unknown') 13959599516SKenneth E. Jansen open (unit=iforce, file=fforce, status='unknown') 14059599516SKenneth E. Jansen open (unit=76, file="fort.76", status='unknown') 14159599516SKenneth E. Jansen if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then 14259599516SKenneth E. Jansen fnamepold = 'pold' 14359599516SKenneth E. Jansen fnamepold = trim(fnamepold)//trim(cname2(lstep)) 14459599516SKenneth E. Jansen fnamepold = trim(fnamepold)//'.dat' 14559599516SKenneth E. Jansen fnamepold = trim(fnamepold) 14659599516SKenneth E. Jansen open (unit=8177, file=fnamepold, status='unknown') 14759599516SKenneth E. Jansen endif 14859599516SKenneth E. Jansen endif 14959599516SKenneth E. Jansenc 15059599516SKenneth E. Jansenc.... initialize 15159599516SKenneth E. Jansenc 15259599516SKenneth E. Jansen ifuncs(:) = 0 ! func. evaluation counter 15359599516SKenneth E. Jansen istep = 0 15459599516SKenneth E. Jansen yold = y 15559599516SKenneth E. Jansen acold = ac 15659599516SKenneth E. Jansen 15734e67057SKenneth E. Jansen!!!!!!!!!!!!!!!!!!! 15834e67057SKenneth E. Jansen!Init output fields 15934e67057SKenneth E. Jansen!!!!!!!!!!!!!!!!!! 16034e67057SKenneth E. Jansen numerr=10+isurf 16134e67057SKenneth E. Jansen allocate(rerr(nshg,numerr)) 16259599516SKenneth E. Jansen rerr = zero 16359599516SKenneth E. Jansen 16459599516SKenneth E. Jansen if(ierrcalc.eq.1 .or. ioybar.eq.1) then ! we need ybar for error too 16559599516SKenneth E. Jansen if (ivort == 1) then 16653c9b1fcSKenneth E. Jansen irank2ybar=17 16753c9b1fcSKenneth E. Jansen allocate(ybar(nshg,irank2ybar)) ! more space for vorticity if requested 16859599516SKenneth E. Jansen else 16953c9b1fcSKenneth E. Jansen irank2ybar=13 17053c9b1fcSKenneth E. Jansen allocate(ybar(nshg,irank2ybar)) 17159599516SKenneth E. Jansen endif 17259599516SKenneth E. Jansen ybar = zero ! Initialize ybar to zero, which is essential 17359599516SKenneth E. Jansen endif 17459599516SKenneth E. Jansen 17559599516SKenneth E. Jansen if(ivort == 1) then 17659599516SKenneth E. Jansen allocate(strain(nshg,6)) 17759599516SKenneth E. Jansen allocate(vorticity(nshg,5)) 17859599516SKenneth E. Jansen endif 17959599516SKenneth E. Jansen 18059599516SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 18159599516SKenneth E. Jansen allocate(wallssVec(nshg,3)) 18259599516SKenneth E. Jansen if (ioybar .eq. 1) then 18359599516SKenneth E. Jansen allocate(wallssVecbar(nshg,3)) 18459599516SKenneth E. Jansen wallssVecbar = zero ! Initialization important if mean wss computed 18559599516SKenneth E. Jansen endif 18659599516SKenneth E. Jansen endif 18759599516SKenneth E. Jansen 18859599516SKenneth E. Jansen! both nstepsincycle and nphasesincycle needs to be set 18959599516SKenneth E. Jansen if(nstepsincycle.eq.0) nphasesincycle = 0 19059599516SKenneth E. Jansen if(nphasesincycle.ne.0) then 19159599516SKenneth E. Jansen! & allocate(yphbar(nshg,5,nphasesincycle)) 19259599516SKenneth E. Jansen if (ivort == 1) then 19353c9b1fcSKenneth E. Jansen irank2yphbar=15 19453c9b1fcSKenneth E. Jansen allocate(yphbar(nshg,irank2yphbar,nphasesincycle)) ! more space for vorticity 19559599516SKenneth E. Jansen else 19653c9b1fcSKenneth E. Jansen irank2yphbar=11 19753c9b1fcSKenneth E. Jansen allocate(yphbar(nshg,irank2yphbar,nphasesincycle)) 19859599516SKenneth E. Jansen endif 19959599516SKenneth E. Jansen yphbar = zero 20059599516SKenneth E. Jansen endif 20159599516SKenneth E. Jansen 20234e67057SKenneth E. Jansen!!!!!!!!!!!!!!!!!!! 20334e67057SKenneth E. Jansen!END Init output fields 20434e67057SKenneth E. Jansen!!!!!!!!!!!!!!!!!! 20559599516SKenneth E. Jansen 20659599516SKenneth E. Jansen vbc_prof(:,1:3) = BC(:,3:5) 20759599516SKenneth E. Jansen if(iramp.eq.1) then 20859599516SKenneth E. Jansen call BCprofileInit(vbc_prof,x) 20959599516SKenneth E. Jansen endif 21059599516SKenneth E. Jansen 21159599516SKenneth E. Jansenc 21234e67057SKenneth E. Jansenc.... ---------------> initialize Equation Solver <--------------- 21359599516SKenneth E. Jansenc 214*da6af917SKenneth E. Jansen call initEQS(iBC, rowp, colm,svLS_nFaces, 215*da6af917SKenneth E. Jansen 2 svLS_LHS,svLS_ls, 216*da6af917SKenneth E. Jansen 3 svLS_LHS_S,svLS_ls_S) 21759599516SKenneth E. Jansenc 21859599516SKenneth E. Jansenc... prepare lumped mass if needed 21959599516SKenneth E. Jansenc 22059599516SKenneth E. Jansen if((flmpr.ne.0).or.(flmpl.ne.0)) call genlmass(x, shp,shgl) 22159599516SKenneth E. Jansenc 22259599516SKenneth E. Jansenc.... -----------------> End of initialization <----------------- 22359599516SKenneth E. Jansenc 22459599516SKenneth E. Jansenc.....open the necessary files to gather time series 22559599516SKenneth E. Jansenc 22659599516SKenneth E. Jansen lstep0 = lstep+1 22759599516SKenneth E. Jansen nsteprcr = nstep(1)+lstep 22859599516SKenneth E. Jansenc 22959599516SKenneth E. Jansenc.... loop through the time sequences 23059599516SKenneth E. Jansenc 23159599516SKenneth E. Jansen 23259599516SKenneth E. Jansen 23359599516SKenneth E. Jansen do 3000 itsq = 1, ntseq 23459599516SKenneth E. Jansen itseq = itsq 23559599516SKenneth E. Jansen 23659599516SKenneth E. Jansenc 23759599516SKenneth E. Jansenc.... set up the time integration parameters 23859599516SKenneth E. Jansenc 23959599516SKenneth E. Jansen nstp = nstep(itseq) 24059599516SKenneth E. Jansen nitr = niter(itseq) 24159599516SKenneth E. Jansen LCtime = loctim(itseq) 24259599516SKenneth E. Jansen dtol(:)= deltol(itseq,:) 24359599516SKenneth E. Jansen 24459599516SKenneth E. Jansen call itrSetup ( y, acold ) 24534e67057SKenneth E. Jansen 24659599516SKenneth E. Jansenc 24759599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution, 24859599516SKenneth E. Jansenc which are functions of alphaf so need to do it after itrSetup 24959599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 25059599516SKenneth E. Jansen call calcImpConvCoef (numImpSrfs, ntimeptpT) 25159599516SKenneth E. Jansen endif 25259599516SKenneth E. Jansenc 25359599516SKenneth E. Jansenc...initialize the initial condition P(0)-RQ(0)-Pd(0) for RCR BC 25459599516SKenneth E. Jansenc need ndsurf so should be after initNABI 25559599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 25659599516SKenneth E. Jansen call calcRCRic(y,nsrflistRCR,numRCRSrfs) 25759599516SKenneth E. Jansen endif 25859599516SKenneth E. Jansenc 25959599516SKenneth E. Jansenc find the last solve of the flow in the step sequence so that we will 26059599516SKenneth E. Jansenc know when we are at/near end of step 26159599516SKenneth E. Jansenc 26259599516SKenneth E. Jansenc ilast=0 26359599516SKenneth E. Jansen nitr=0 ! count number of flow solves in a step (# of iterations) 26459599516SKenneth E. Jansen do i=1,seqsize 26559599516SKenneth E. Jansen if(stepseq(i).eq.0) nitr=nitr+1 26659599516SKenneth E. Jansen enddo 26759599516SKenneth E. Jansen 26859599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 26959599516SKenneth E. Jansen tcorecp(:) = zero ! used in solfar.f (solflow) 27059599516SKenneth E. Jansen tcorecpscal(:) = zero ! used in solfar.f (solflow) 27159599516SKenneth E. Jansen if(myrank.eq.0) then 27259599516SKenneth E. Jansen tcorecp1 = TMRC() 27359599516SKenneth E. Jansen endif 27459599516SKenneth E. Jansen 27559599516SKenneth E. Jansenc 27659599516SKenneth E. Jansenc.... loop through the time steps 27759599516SKenneth E. Jansenc 27859599516SKenneth E. Jansen istop=0 27959599516SKenneth E. Jansen rmub=datmat(1,2,1) 28059599516SKenneth E. Jansen if(rmutarget.gt.0) then 28159599516SKenneth E. Jansen rmue=rmutarget 28259599516SKenneth E. Jansen else 28359599516SKenneth E. Jansen rmue=datmat(1,2,1) ! keep constant 28459599516SKenneth E. Jansen endif 28559599516SKenneth E. Jansen 28659599516SKenneth E. Jansen if(iramp.eq.1) then 28759599516SKenneth E. Jansen call BCprofileScale(vbc_prof,BC,yold) ! fix the yold values to the reset BC 28859599516SKenneth E. Jansen isclr=1 ! fix scalar 28959599516SKenneth E. Jansen do isclr=1,nsclr 29059599516SKenneth E. Jansen call itrBCSclr(yold,ac,iBC,BC,iper,ilwork) 29159599516SKenneth E. Jansen enddo 29259599516SKenneth E. Jansen endif 29359599516SKenneth E. Jansen 29459599516SKenneth E. Jansen do 2000 istp = 1, nstp 29559599516SKenneth E. Jansen if(iramp.eq.1) 29659599516SKenneth E. Jansen & call BCprofileScale(vbc_prof,BC,yold) 29759599516SKenneth E. Jansen 29859599516SKenneth E. Jansen call rerun_check(stopjob) 299c89b8efeSKenneth E. Jansen if(myrank.eq.master) write(*,*) 300c89b8efeSKenneth E. Jansen & 'stopjob,lstep,istep', stopjob,lstep,istep 301c89b8efeSKenneth E. Jansen if(stopjob.eq.lstep) then 302c89b8efeSKenneth E. Jansen stopjob=-2 ! this is the code to finish 303c89b8efeSKenneth E. Jansen if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then 304c89b8efeSKenneth E. Jansen if(myrank.eq.master) write(*,*) 305c89b8efeSKenneth E. Jansen & 'line 473 says last step written so exit' 306c89b8efeSKenneth E. Jansen goto 2002 ! the step was written last step so just exit 307c89b8efeSKenneth E. Jansen else 308c89b8efeSKenneth E. Jansen if(myrank.eq.master) 309c89b8efeSKenneth E. Jansen & write(*,*) 'line 473 says last step not written' 310c89b8efeSKenneth E. Jansen istep=nstp ! have to do this so that solution will be written 311c89b8efeSKenneth E. Jansen goto 2001 312c89b8efeSKenneth E. Jansen endif 313c89b8efeSKenneth E. Jansen endif 31459599516SKenneth E. Jansen 31559599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC. 31659599516SKenneth E. Jansenc these will be for time step n+1 so use lstep+1 31759599516SKenneth E. Jansenc 31859599516SKenneth E. Jansen if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl, 31959599516SKenneth E. Jansen & shpb, shglb, x, BC, iBC) 32059599516SKenneth E. Jansen 32159599516SKenneth E. Jansenc 32259599516SKenneth E. Jansenc ... calculate the pressure contribution that depends on the history for the Imp. BC 32359599516SKenneth E. Jansenc 32459599516SKenneth E. Jansen if(numImpSrfs.gt.0) then 32559599516SKenneth E. Jansen call pHist(poldImp,QHistImp,ImpConvCoef, 32659599516SKenneth E. Jansen & ntimeptpT,numImpSrfs) 32759599516SKenneth E. Jansen endif 32859599516SKenneth E. Jansenc 32959599516SKenneth E. Jansenc ... calc the pressure contribution that depends on the history for the RCR BC 33059599516SKenneth E. Jansenc 33159599516SKenneth E. Jansen if(numRCRSrfs.gt.0) then 33259599516SKenneth E. Jansen call CalcHopRCR (Delt(itseq), lstep, numRCRSrfs) 33359599516SKenneth E. Jansen call CalcRCRConvCoef(lstep,numRCRSrfs) 33459599516SKenneth E. Jansen call pHist(poldRCR,QHistRCR,RCRConvCoef,nsteprcr, 33559599516SKenneth E. Jansen & numRCRSrfs) 33659599516SKenneth E. Jansen endif 33759599516SKenneth E. Jansen 33859599516SKenneth E. Jansen if(iLES.gt.0) then !complicated stuff has moved to 33959599516SKenneth E. Jansen !routine below 34059599516SKenneth E. Jansen call lesmodels(yold, acold, shgl, shp, 34159599516SKenneth E. Jansen & iper, ilwork, rowp, colm, 34259599516SKenneth E. Jansen & nsons, ifath, x, 34359599516SKenneth E. Jansen & iBC, BC) 34459599516SKenneth E. Jansen 34559599516SKenneth E. Jansen 34659599516SKenneth E. Jansen endif 34759599516SKenneth E. Jansen 34859599516SKenneth E. Jansenc.... set traction BCs for modeled walls 34959599516SKenneth E. Jansenc 35059599516SKenneth E. Jansen if (itwmod.ne.0) then 35159599516SKenneth E. Jansen call asbwmod(yold, acold, x, BC, iBC, 35259599516SKenneth E. Jansen & iper, ilwork, ifath, velbar) 35359599516SKenneth E. Jansen endif 35459599516SKenneth E. Jansen 35559599516SKenneth E. Jansenc 35659599516SKenneth E. Jansenc.... Determine whether the vorticity field needs to be computed for this time step or not 35759599516SKenneth E. Jansenc 35834e67057SKenneth E. Jansen call seticomputevort 35959599516SKenneth E. Jansenc 36059599516SKenneth E. Jansenc.... -----------------------> predictor phase <----------------------- 36159599516SKenneth E. Jansenc 36259599516SKenneth E. Jansen call itrPredict(yold, y, acold, ac , uold, u, iBC) 36359599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper,ilwork) 36459599516SKenneth E. Jansen 36559599516SKenneth E. Jansen if(nsolt.eq.1) then 36659599516SKenneth E. Jansen isclr=0 36759599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 36859599516SKenneth E. Jansen endif 36959599516SKenneth E. Jansen do isclr=1,nsclr 37059599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 37159599516SKenneth E. Jansen enddo 37259599516SKenneth E. Jansen iter=0 37359599516SKenneth E. Jansen ilss=0 ! this is a switch thrown on first solve of LS redistance 37459599516SKenneth E. Jansen do istepc=1,seqsize 37559599516SKenneth E. Jansen icode=stepseq(istepc) 37659599516SKenneth E. Jansen if(mod(icode,5).eq.0) then ! this is a solve 37759599516SKenneth E. Jansen isolve=icode/10 37859599516SKenneth E. Jansen if(icode.eq.0) then ! flow solve (encoded as 0) 37959599516SKenneth E. Jansenc 38059599516SKenneth E. Jansen iter = iter+1 38159599516SKenneth E. Jansen ifuncs(1) = ifuncs(1) + 1 38259599516SKenneth E. Jansenc 38359599516SKenneth E. Jansen Force(1) = zero 38459599516SKenneth E. Jansen Force(2) = zero 38559599516SKenneth E. Jansen Force(3) = zero 38659599516SKenneth E. Jansen HFlux = zero 38759599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1))) 38859599516SKenneth E. Jansen 38959599516SKenneth E. Jansen call SolFlow(y, ac, u, 39059599516SKenneth E. Jansen & yold, acold, uold, 39159599516SKenneth E. Jansen & x, iBC, 39259599516SKenneth E. Jansen & BC, res, 393*da6af917SKenneth E. Jansen & iper, 39459599516SKenneth E. Jansen & ilwork, shp, shgl, 39559599516SKenneth E. Jansen & shpb, shglb, rowp, 396*da6af917SKenneth E. Jansen & colm, 39759599516SKenneth E. Jansen & solinc, rerr, tcorecp, 398bd36043dSBen Matthews & GradV, sumtime 399bd36043dSBen Matthews#ifdef HAVE_SVLS 400bd36043dSBen Matthews & ,svLS_lhs, svLS_ls, svLS_nFaces) 401bd36043dSBen Matthews#else 402bd36043dSBen Matthews & ) 403bd36043dSBen Matthews#endif 40459599516SKenneth E. Jansen 40559599516SKenneth E. Jansen else ! scalar type solve 40659599516SKenneth E. Jansen if (icode.eq.5) then ! Solve for Temperature 40759599516SKenneth E. Jansen ! (encoded as (nsclr+1)*10) 40859599516SKenneth E. Jansen isclr=0 40959599516SKenneth E. Jansen ifuncs(2) = ifuncs(2) + 1 41059599516SKenneth E. Jansen j=1 41159599516SKenneth E. Jansen else ! solve a scalar (encoded at isclr*10) 41259599516SKenneth E. Jansen isclr=isolve 41359599516SKenneth E. Jansen ifuncs(isclr+2) = ifuncs(isclr+2) + 1 41459599516SKenneth E. Jansen j=isclr+nsolt 41559599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.0) 41659599516SKenneth E. Jansen & .and.(isclr.eq.2)) then 41759599516SKenneth E. Jansen ilss=1 ! throw switch (once per step) 41859599516SKenneth E. Jansen y(:,7)=y(:,6) ! redistance field initialized 41959599516SKenneth E. Jansen ac(:,7) = zero 42059599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 42159599516SKenneth E. Jansen & ilwork) 42259599516SKenneth E. Jansenc 42359599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the 42459599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar 42559599516SKenneth E. Jansenc 42659599516SKenneth E. Jansen alfit=alfi 42759599516SKenneth E. Jansen gamit=gami 42859599516SKenneth E. Jansen almit=almi 42959599516SKenneth E. Jansen Deltt=Delt(1) 43059599516SKenneth E. Jansen Dtglt=Dtgl 43159599516SKenneth E. Jansen alfi = 1 43259599516SKenneth E. Jansen gami = 1 43359599516SKenneth E. Jansen almi = 1 43459599516SKenneth E. Jansenc Delt(1)= Deltt ! Give a pseudo time step 43559599516SKenneth E. Jansen Dtgl = one / Delt(1) 43659599516SKenneth E. Jansen endif ! level set eq. 2 43759599516SKenneth E. Jansen endif ! deciding between temperature and scalar 43859599516SKenneth E. Jansen 43959599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(isclr+2)-1, 44059599516SKenneth E. Jansen & LHSupd(isclr+2))) 44159599516SKenneth E. Jansen 44259599516SKenneth E. Jansen call SolSclr(y, ac, u, 44359599516SKenneth E. Jansen & yold, acold, uold, 44459599516SKenneth E. Jansen & x, iBC, 445*da6af917SKenneth E. Jansen & BC, 446*da6af917SKenneth E. Jansen & iper, 44759599516SKenneth E. Jansen & ilwork, shp, shgl, 44859599516SKenneth E. Jansen & shpb, shglb, rowp, 449*da6af917SKenneth E. Jansen & colm, 450bd36043dSBen Matthews & solinc(1,isclr+5), tcorecpscal 451bd36043dSBen Matthews#ifdef HAVE_SVLS 452bd36043dSBen Matthews & ,svLS_lhs_S(isclr), svLS_ls_S(isclr), svls_nfaces) 453bd36043dSBen Matthews#else 454bd36043dSBen Matthews & ) 455bd36043dSBen Matthews#endif 45659599516SKenneth E. Jansen 45759599516SKenneth E. Jansen 45859599516SKenneth E. Jansen endif ! end of scalar type solve 45959599516SKenneth E. Jansen 46059599516SKenneth E. Jansen else ! this is an update (mod did not equal zero) 46159599516SKenneth E. Jansen iupdate=icode/10 ! what to update 46259599516SKenneth E. Jansen if(icode.eq.1) then !update flow 46359599516SKenneth E. Jansen call itrCorrect ( y, ac, u, solinc, iBC) 46459599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper, ilwork) 46559599516SKenneth E. Jansen else ! update scalar 46659599516SKenneth E. Jansen isclr=iupdate !unless 46759599516SKenneth E. Jansen if(icode.eq.6) isclr=0 46859599516SKenneth E. Jansen if(iRANS.lt.-100)then ! RANS 46959599516SKenneth E. Jansen call itrCorrectSclrPos(y,ac,solinc(1,isclr+5)) 47059599516SKenneth E. Jansen else 47159599516SKenneth E. Jansen call itrCorrectSclr (y, ac, solinc(1,isclr+5)) 47259599516SKenneth E. Jansen endif 47359599516SKenneth E. Jansen if (ilset.eq.2 .and. isclr.eq.2) then 47459599516SKenneth E. Jansen if (ivconstraint .eq. 1) then 47559599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 47659599516SKenneth E. Jansen & ilwork) 47759599516SKenneth E. Jansenc 47859599516SKenneth E. Jansenc ... applying the volume constraint on second level set scalar 47959599516SKenneth E. Jansenc 48059599516SKenneth E. Jansen call solvecon (y, x, iBC, BC, 48159599516SKenneth E. Jansen & iper, ilwork, shp, shgl) 48259599516SKenneth E. Jansenc 48359599516SKenneth E. Jansen endif ! end of volume constraint calculations 48459599516SKenneth E. Jansen endif ! end of redistance calculations 48559599516SKenneth E. Jansenc 48659599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 48759599516SKenneth E. Jansen & ilwork) 48859599516SKenneth E. Jansen endif ! end of flow or scalar update 48959599516SKenneth E. Jansen endif ! end of switch between solve or update 49059599516SKenneth E. Jansen enddo ! loop over sequence in step 49159599516SKenneth E. Jansenc 49259599516SKenneth E. Jansenc 49359599516SKenneth E. Jansenc.... obtain the time average statistics 49459599516SKenneth E. Jansenc 49559599516SKenneth E. Jansen if (ioform .eq. 2) then 49659599516SKenneth E. Jansen 49759599516SKenneth E. Jansen call stsGetStats( y, yold, ac, acold, 49859599516SKenneth E. Jansen & u, uold, x, 49959599516SKenneth E. Jansen & shp, shgl, shpb, shglb, 50059599516SKenneth E. Jansen & iBC, BC, iper, ilwork, 50159599516SKenneth E. Jansen & rowp, colm, lhsK, lhsP ) 50259599516SKenneth E. Jansen endif 50359599516SKenneth E. Jansen 50459599516SKenneth E. Jansenc 50559599516SKenneth E. Jansenc Find the solution at the end of the timestep and move it to old 50659599516SKenneth E. Jansenc 50759599516SKenneth E. Jansenc 50859599516SKenneth E. Jansenc ...First to reassign the parameters for the original time integrator scheme 50959599516SKenneth E. Jansenc 51059599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.1)) then 51159599516SKenneth E. Jansen alfi =alfit 51259599516SKenneth E. Jansen gami =gamit 51359599516SKenneth E. Jansen almi =almit 51459599516SKenneth E. Jansen Delt(1)=Deltt 51559599516SKenneth E. Jansen Dtgl =Dtglt 51659599516SKenneth E. Jansen endif 51759599516SKenneth E. Jansen call itrUpdate( yold, acold, uold, y, ac, u) 51859599516SKenneth E. Jansen call itrBC (yold, acold, iBC, BC, iper,ilwork) 51959599516SKenneth E. Jansen 52059599516SKenneth E. Jansen istep = istep + 1 52159599516SKenneth E. Jansen lstep = lstep + 1 52259599516SKenneth E. Jansenc 52359599516SKenneth E. Jansenc .. Print memory consumption on BGQ 52459599516SKenneth E. Jansenc 52559599516SKenneth E. Jansen call printmeminfo("itrdrv"//char(0)) 52659599516SKenneth E. Jansen 52759599516SKenneth E. Jansenc 52859599516SKenneth E. Jansenc .. Compute vorticity 52959599516SKenneth E. Jansenc 53034e67057SKenneth E. Jansen if ( icomputevort == 1) 53134e67057SKenneth E. Jansen & call computeVort( vorticity, GradV,strain) 53259599516SKenneth E. Jansenc 5339dcf5646SKenneth E. Jansenc.... update and the aerodynamic forces 5349dcf5646SKenneth E. Jansenc 5359dcf5646SKenneth E. Jansen call forces ( yold, ilwork ) 5369dcf5646SKenneth E. Jansen 5379dcf5646SKenneth E. Jansenc 538c89b8efeSKenneth E. Jansenc .. write out the instantaneous solution 53959599516SKenneth E. Jansenc 540c89b8efeSKenneth E. Jansen2001 continue ! we could get here by 2001 label if user requested stop 54159599516SKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or. 54259599516SKenneth E. Jansen & istep.eq.nstep(itseq)) then 543c89b8efeSKenneth E. Jansen 544c89b8efeSKenneth E. Jansen!so that we can see progress in force file close it so that it flushes 545c89b8efeSKenneth E. Jansen!and then reopen in append mode 546c89b8efeSKenneth E. Jansen 547c89b8efeSKenneth E. Jansen close(iforce) 548c89b8efeSKenneth E. Jansen open (unit=iforce, file=fforce, position='append') 54959599516SKenneth E. Jansen 55059599516SKenneth E. Jansen! Call to restar() will open restart file in write mode (and not append mode) 55159599516SKenneth E. Jansen! that is needed as other fields are written in append mode 552c89b8efeSKenneth E. Jansen 55359599516SKenneth E. Jansen call restar ('out ', yold ,ac) 55459599516SKenneth E. Jansen 55559599516SKenneth E. Jansen if(ivort == 1) then 55659599516SKenneth E. Jansen call write_field(myrank,'a','vorticity',9,vorticity, 55759599516SKenneth E. Jansen & 'd',nshg,5,lstep) 55859599516SKenneth E. Jansen endif 55959599516SKenneth E. Jansen 56059599516SKenneth E. Jansen call printmeminfo("itrdrv after checkpoint"//char(0)) 561c89b8efeSKenneth E. Jansen else if(stopjob.eq.-2) then 562c89b8efeSKenneth E. Jansen if(myrank.eq.master) then 563c89b8efeSKenneth E. Jansen write(*,*) 'line 755 says no write before stopping' 564c89b8efeSKenneth E. Jansen write(*,*) 'istep,nstep,irs',istep,nstep(itseq),irs 56559599516SKenneth E. Jansen endif 566c89b8efeSKenneth E. Jansen endif !just the instantaneous stuff for videos 567c89b8efeSKenneth E. Jansenc 568c89b8efeSKenneth E. Jansenc.... compute the consistent boundary flux 569c89b8efeSKenneth E. Jansenc 570c89b8efeSKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 571c89b8efeSKenneth E. Jansen call Bflux ( yold, acold, uold, x, 572c89b8efeSKenneth E. Jansen & shp, shgl, shpb, 573c89b8efeSKenneth E. Jansen & shglb, ilwork, iBC, 574c89b8efeSKenneth E. Jansen & BC, iper, wallssVec) 575c89b8efeSKenneth E. Jansen endif 576c89b8efeSKenneth E. Jansen 577c89b8efeSKenneth E. Jansen if(stopjob.eq.-2) goto 2003 578c89b8efeSKenneth E. Jansen 57959599516SKenneth E. Jansen 58059599516SKenneth E. Jansenc 58159599516SKenneth E. Jansenc ... update the flow history for the impedance convolution, filter it and write it out 58259599516SKenneth E. Jansenc 58359599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 58459599516SKenneth E. Jansen call UpdHistConv(y,nsrflistImp,numImpSrfs) !uses Delt(1) 58559599516SKenneth E. Jansen endif 58659599516SKenneth E. Jansen 58759599516SKenneth E. Jansenc 58859599516SKenneth E. Jansenc ... update the flow history for the RCR convolution 58959599516SKenneth E. Jansenc 59059599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 59159599516SKenneth E. Jansen call UpdHistConv(y,nsrflistRCR,numRCRSrfs) !uses lstep 59259599516SKenneth E. Jansen endif 59359599516SKenneth E. Jansen 59459599516SKenneth E. Jansen 59559599516SKenneth E. Jansenc... dump TIME SERIES 59659599516SKenneth E. Jansen 59739bc1351SMichel Rasquin if (exts) then 59839bc1351SMichel Rasquin ! Note: freq is only defined if exts is true, 59939bc1351SMichel Rasquin ! i.e. if xyzts.dat is present in the #-procs_case 60039bc1351SMichel Rasquin if ( mod(lstep-1,freq).eq.0) call dumpTimeSeries() 60139bc1351SMichel Rasquin endif 60259599516SKenneth E. Jansen 60359599516SKenneth E. Jansen if((irscale.ge.0).or.(itwmod.gt.0)) 60459599516SKenneth E. Jansen & call getvel (yold, ilwork, iBC, 60559599516SKenneth E. Jansen & nsons, ifath, velbar) 60659599516SKenneth E. Jansen 60759599516SKenneth E. Jansen if((irscale.ge.0).and.(myrank.eq.master)) then 60859599516SKenneth E. Jansen call genscale(yold, x, iper, 60959599516SKenneth E. Jansen & iBC, ifath, velbar, 61059599516SKenneth E. Jansen & nsons) 61159599516SKenneth E. Jansen endif 61259599516SKenneth E. Jansenc 61359599516SKenneth E. Jansenc.... print out results. 61459599516SKenneth E. Jansenc 61559599516SKenneth E. Jansen ntoutv=max(ntout,100) ! velb is not needed so often 61659599516SKenneth E. Jansen if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then 61759599516SKenneth E. Jansen if( (mod(lstep, ntoutv) .eq. 0) .and. 61859599516SKenneth E. Jansen & ((irscale.ge.0).or.(itwmod.gt.0) .or. 61959599516SKenneth E. Jansen & ((nsonmax.eq.1).and.(iLES.gt.0)))) 62059599516SKenneth E. Jansen & call rwvelb ('out ', velbar ,ifail) 62159599516SKenneth E. Jansen endif 62259599516SKenneth E. Jansenc 62359599516SKenneth E. Jansenc.... end of the NSTEP and NTSEQ loops 62459599516SKenneth E. Jansenc 62559599516SKenneth E. Jansen 62659599516SKenneth E. Jansen 62759599516SKenneth E. Jansenc 62859599516SKenneth E. Jansenc.... -------------------> error calculation <----------------- 62959599516SKenneth E. Jansenc 63034e67057SKenneth E. Jansen if(ierrcalc.eq.1 .or. ioybar.eq.1) 63134e67057SKenneth E. Jansen & call collectErrorYbar(ybar,yold,wallssVec,wallssVecBar, 63253c9b1fcSKenneth E. Jansen & vorticity,yphbar,rerr,irank2ybar,irank2yphbar) 633c89b8efeSKenneth E. Jansen 2003 continue ! we get here if stopjob equals lstep and this jumped over 634c89b8efeSKenneth E. Jansen! the statistics computation because we have no new data to average in 635c89b8efeSKenneth E. Jansen! rather we are just trying to output the last state that was not already 636c89b8efeSKenneth E. Jansen! written 637c89b8efeSKenneth E. Jansenc 638c89b8efeSKenneth E. Jansenc.... ----------------------> Complete Restart Processing <---------------------- 639c89b8efeSKenneth E. Jansenc 640c89b8efeSKenneth E. Jansen! for now it is the same frequency but need to change this 641c89b8efeSKenneth E. Jansen! soon.... but don't forget to change the field counter in 642c89b8efeSKenneth E. Jansen! new_interface.cc 643c89b8efeSKenneth E. Jansen! 644c89b8efeSKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or. 645c89b8efeSKenneth E. Jansen & istep.eq.nstep(itseq)) then 64659599516SKenneth E. Jansen 647c89b8efeSKenneth E. Jansen lesId = numeqns(1) 648c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 649c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 650c89b8efeSKenneth E. Jansen tcormr1 = TMRC() 651c89b8efeSKenneth E. Jansen endif 652efb88323SKenneth E. Jansen if((nsolflow.eq.1).and.(ipresPrjFlag.eq.1)) then 65379f1763eSKenneth E. Jansen#ifdef HAVE_LESLIB 654c89b8efeSKenneth E. Jansen call saveLesRestart( lesId, aperm , nshg, myrank, lstep, 655c89b8efeSKenneth E. Jansen & nPermDims ) 656c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 657c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 658c89b8efeSKenneth E. Jansen tcormr2 = TMRC() 659c89b8efeSKenneth E. Jansen write(6,*) 'call saveLesRestart for projection and'// 660c89b8efeSKenneth E. Jansen & 'pressure projection vectors', tcormr2-tcormr1 661c89b8efeSKenneth E. Jansen endif 66279f1763eSKenneth E. Jansen#endif 663c9a96f21SKenneth E. Jansen endif 664c89b8efeSKenneth E. Jansen 665c89b8efeSKenneth E. Jansen if(ierrcalc.eq.1) then 666c89b8efeSKenneth E. Jansenc 667c89b8efeSKenneth E. Jansenc.....smooth the error indicators 668c89b8efeSKenneth E. Jansenc 669c89b8efeSKenneth E. Jansen do i=1,ierrsmooth 670c89b8efeSKenneth E. Jansen call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC ) 671c89b8efeSKenneth E. Jansen end do 672c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 673c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 674c89b8efeSKenneth E. Jansen tcormr1 = TMRC() 675c89b8efeSKenneth E. Jansen endif 676c89b8efeSKenneth E. Jansen call write_error(myrank, lstep, nshg, 10, rerr ) 677c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 678c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 679c89b8efeSKenneth E. Jansen tcormr2 = TMRC() 680c89b8efeSKenneth E. Jansen write(6,*) 'Time to write the error fields to the disks', 681c89b8efeSKenneth E. Jansen & tcormr2-tcormr1 682c89b8efeSKenneth E. Jansen endif 683c89b8efeSKenneth E. Jansen endif ! ierrcalc 684c89b8efeSKenneth E. Jansen 685c89b8efeSKenneth E. Jansen if(ioybar.eq.1) then 686c89b8efeSKenneth E. Jansen if(ivort == 1) then 687c89b8efeSKenneth E. Jansen call write_field(myrank,'a','ybar',4, 688c89b8efeSKenneth E. Jansen & ybar,'d',nshg,17,lstep) 689c89b8efeSKenneth E. Jansen else 690c89b8efeSKenneth E. Jansen call write_field(myrank,'a','ybar',4, 691c89b8efeSKenneth E. Jansen & ybar,'d',nshg,13,lstep) 692c89b8efeSKenneth E. Jansen endif 693c89b8efeSKenneth E. Jansen 694c89b8efeSKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 695c89b8efeSKenneth E. Jansen call write_field(myrank,'a','wssbar',6, 696c89b8efeSKenneth E. Jansen & wallssVecBar,'d',nshg,3,lstep) 697c89b8efeSKenneth E. Jansen endif 698c89b8efeSKenneth E. Jansen 699c89b8efeSKenneth E. Jansen if(nphasesincycle .gt. 0) then 700c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 701c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 702c89b8efeSKenneth E. Jansen tcormr1 = TMRC() 703c89b8efeSKenneth E. Jansen endif 704c89b8efeSKenneth E. Jansen do iphase=1,nphasesincycle 705c89b8efeSKenneth E. Jansen if(ivort == 1) then 706c89b8efeSKenneth E. Jansen call write_phavg2(myrank,'a','phase_average',13,iphase, 707c89b8efeSKenneth E. Jansen & nphasesincycle,yphbar(:,:,iphase),'d',nshg,15,lstep) 708c89b8efeSKenneth E. Jansen else 709c89b8efeSKenneth E. Jansen call write_phavg2(myrank,'a','phase_average',13,iphase, 710c89b8efeSKenneth E. Jansen & nphasesincycle,yphbar(:,:,iphase),'d',nshg,11,lstep) 711c89b8efeSKenneth E. Jansen endif 712c89b8efeSKenneth E. Jansen end do 713c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 714c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 715c89b8efeSKenneth E. Jansen tcormr2 = TMRC() 716c89b8efeSKenneth E. Jansen write(6,*) 'write all phase avg to the disks = ', 717c89b8efeSKenneth E. Jansen & tcormr2-tcormr1 718c89b8efeSKenneth E. Jansen endif 719c89b8efeSKenneth E. Jansen endif !nphasesincyle 720c89b8efeSKenneth E. Jansen endif !ioybar 721c89b8efeSKenneth E. Jansen 722c89b8efeSKenneth E. Jansen if(iRANS.lt.0) then 723c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 724c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 725c89b8efeSKenneth E. Jansen tcormr1 = TMRC() 726c89b8efeSKenneth E. Jansen endif 727c89b8efeSKenneth E. Jansen call write_field(myrank,'a','dwal',4,d2wall,'d', 728c89b8efeSKenneth E. Jansen & nshg,1,lstep) 729c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 730c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 731c89b8efeSKenneth E. Jansen tcormr2 = TMRC() 732c89b8efeSKenneth E. Jansen write(6,*) 'Time to write dwal to the disks = ', 733c89b8efeSKenneth E. Jansen & tcormr2-tcormr1 734c89b8efeSKenneth E. Jansen endif 735c89b8efeSKenneth E. Jansen endif !iRANS 736c89b8efeSKenneth E. Jansen 737c89b8efeSKenneth E. Jansen endif ! write out complete restart state 738c89b8efeSKenneth E. Jansen !next 2 lines are two ways to end early 739c89b8efeSKenneth E. Jansen if(stopjob.eq.-2) goto 2002 740c89b8efeSKenneth E. Jansen if(istop.eq.1000) goto 2002 ! stop when delta small (see rstatic) 74159599516SKenneth E. Jansen 2000 continue 742c89b8efeSKenneth E. Jansen 2002 continue 743c89b8efeSKenneth E. Jansen 744c89b8efeSKenneth E. Jansen! done with time stepping so deallocate fields already written 745c89b8efeSKenneth E. Jansen! 74634e67057SKenneth E. Jansen 747c89b8efeSKenneth E. Jansen if(ioybar.eq.1) then 748c89b8efeSKenneth E. Jansen deallocate(ybar) 749c89b8efeSKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 750c89b8efeSKenneth E. Jansen deallocate(wallssVecbar) 751c89b8efeSKenneth E. Jansen endif 752c89b8efeSKenneth E. Jansen if(nphasesincycle .gt. 0) then 753c89b8efeSKenneth E. Jansen deallocate(yphbar) 754c89b8efeSKenneth E. Jansen endif !nphasesincyle 755c89b8efeSKenneth E. Jansen endif !ioybar 756c89b8efeSKenneth E. Jansen if(ivort == 1) then 757c89b8efeSKenneth E. Jansen deallocate(strain,vorticity) 758c89b8efeSKenneth E. Jansen endif 759c89b8efeSKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 760c89b8efeSKenneth E. Jansen deallocate(wallssVec) 761c89b8efeSKenneth E. Jansen endif 762c89b8efeSKenneth E. Jansen if(iRANS.lt.0) then 763c89b8efeSKenneth E. Jansen deallocate(d2wall) 764c89b8efeSKenneth E. Jansen endif 76559599516SKenneth E. Jansen 76659599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 76759599516SKenneth E. Jansen if(myrank.eq.0) then 76859599516SKenneth E. Jansen tcorecp2 = TMRC() 76959599516SKenneth E. Jansen write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1 77059599516SKenneth E. Jansen write(6,*) '(Elm. form.',tcorecp(1), 77159599516SKenneth E. Jansen & ',Lin. alg. sol.',tcorecp(2),')' 77259599516SKenneth E. Jansen write(6,*) '(Elm. form. Scal.',tcorecpscal(1), 77359599516SKenneth E. Jansen & ',Lin. alg. sol. Scal.',tcorecpscal(2),')' 77459599516SKenneth E. Jansen write(6,*) '' 77559599516SKenneth E. Jansen 77659599516SKenneth E. Jansen endif 77759599516SKenneth E. Jansen 77859599516SKenneth E. Jansen call print_system_stats(tcorecp, tcorecpscal) 77959599516SKenneth E. Jansen call print_mesh_stats() 78059599516SKenneth E. Jansen call print_mpi_stats() 78159599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 78259599516SKenneth E. Jansen! return 78359599516SKenneth E. Jansenc call MPI_Finalize() 78459599516SKenneth E. Jansenc call MPI_ABORT(MPI_COMM_WORLD, ierr) 78559599516SKenneth E. Jansen 78675f1c48cSCameron Smith call destroyWallData 78792e15685SCameron Smith call destroyfncorp 78875f1c48cSCameron Smith 78959599516SKenneth E. Jansen 3000 continue 79059599516SKenneth E. Jansen 79159599516SKenneth E. Jansen 79259599516SKenneth E. Jansenc 79359599516SKenneth E. Jansenc.... close history and aerodynamic forces files 79459599516SKenneth E. Jansenc 79559599516SKenneth E. Jansen if (myrank .eq. master) then 79659599516SKenneth E. Jansen! close (ihist) 79759599516SKenneth E. Jansen close (iforce) 79859599516SKenneth E. Jansen close(76) 79959599516SKenneth E. Jansen if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then 80059599516SKenneth E. Jansen close (8177) 80159599516SKenneth E. Jansen endif 80259599516SKenneth E. Jansen endif 80359599516SKenneth E. Jansenc 80459599516SKenneth E. Jansenc.... close varts file for probes 80559599516SKenneth E. Jansenc 8063beb3aadSMichel Rasquin call finalizeTimeSeries() 80759599516SKenneth E. Jansen 80859599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 80959599516SKenneth E. Jansen if(myrank.eq.0) then 81059599516SKenneth E. Jansen write(*,*) 'itrdrv - done with aerodynamic forces' 81159599516SKenneth E. Jansen endif 81259599516SKenneth E. Jansen 81359599516SKenneth E. Jansen do isrf = 0,MAXSURF 81459599516SKenneth E. Jansen if ( nsrflist(isrf).ne.0 .and. 81559599516SKenneth E. Jansen & myrank.eq.irankfilesforce(isrf)) then 81659599516SKenneth E. Jansen iunit=60+isrf 81759599516SKenneth E. Jansen close(iunit) 81859599516SKenneth E. Jansen endif 81959599516SKenneth E. Jansen enddo 82059599516SKenneth E. Jansen 82159599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 82259599516SKenneth E. Jansen if(myrank.eq.0) then 82359599516SKenneth E. Jansen write(*,*) 'itrdrv - done with MAXSURF' 82459599516SKenneth E. Jansen endif 82559599516SKenneth E. Jansen 82659599516SKenneth E. Jansen 82759599516SKenneth E. Jansen 5 format(1X,F15.10,3X,F15.10,3X,F15.10,3X,F15.10) 82859599516SKenneth E. Jansen 444 format(6(2x,e14.7)) 82959599516SKenneth E. Jansenc 83059599516SKenneth E. Jansenc.... end 83159599516SKenneth E. Jansenc 83259599516SKenneth E. Jansen if(nsolflow.eq.1) then 833*da6af917SKenneth E. Jansen call dsdF 83459599516SKenneth E. Jansen endif 83534e67057SKenneth E. Jansen if((nsclr+nsolt).gt.0) then 836*da6af917SKenneth E. Jansen call dsdS 83759599516SKenneth E. Jansen endif 83859599516SKenneth E. Jansen 83959599516SKenneth E. Jansen if(iabc==1) deallocate(acs) 84059599516SKenneth E. Jansen 84159599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 84259599516SKenneth E. Jansen if(myrank.eq.0) then 84359599516SKenneth E. Jansen write(*,*) 'itrdrv - done - BACK TO process.f' 84459599516SKenneth E. Jansen endif 84559599516SKenneth E. Jansen 84659599516SKenneth E. Jansen return 84759599516SKenneth E. Jansen end 84859599516SKenneth E. Jansen 84959599516SKenneth E. Jansen subroutine lesmodels(y, ac, shgl, shp, 85059599516SKenneth E. Jansen & iper, ilwork, rowp, colm, 85159599516SKenneth E. Jansen & nsons, ifath, x, 85259599516SKenneth E. Jansen & iBC, BC) 85359599516SKenneth E. Jansen 85459599516SKenneth E. Jansen include "common.h" 85559599516SKenneth E. Jansen 85659599516SKenneth E. Jansen real*8 y(nshg,ndof), ac(nshg,ndof), 85759599516SKenneth E. Jansen & x(numnp,nsd), 85859599516SKenneth E. Jansen & BC(nshg,ndofBC) 85959599516SKenneth E. Jansen real*8 shp(MAXTOP,maxsh,MAXQPT), 86059599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT) 86159599516SKenneth E. Jansen 86259599516SKenneth E. Jansenc 86359599516SKenneth E. Jansen integer rowp(nshg,nnz), colm(nshg+1), 86459599516SKenneth E. Jansen & iBC(nshg), 86559599516SKenneth E. Jansen & ilwork(nlwork), 86659599516SKenneth E. Jansen & iper(nshg) 86759599516SKenneth E. Jansen dimension ifath(numnp), nsons(nfath) 86859599516SKenneth E. Jansen 86959599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: fwr2,fwr3,fwr4 87059599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: stabdis,cdelsq1 87159599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: xavegt, xavegt2,xavegt3 87259599516SKenneth E. Jansen 87359599516SKenneth E. Jansen if( (iLES.gt.1) ) then ! Allocate Stuff for advanced LES models 87459599516SKenneth E. Jansen allocate (fwr2(nshg)) 87559599516SKenneth E. Jansen allocate (fwr3(nshg)) 87659599516SKenneth E. Jansen allocate (fwr4(nshg)) 87759599516SKenneth E. Jansen allocate (xavegt(nfath,12)) 87859599516SKenneth E. Jansen allocate (xavegt2(nfath,12)) 87959599516SKenneth E. Jansen allocate (xavegt3(nfath,12)) 88059599516SKenneth E. Jansen allocate (stabdis(nfath)) 88159599516SKenneth E. Jansen endif 88259599516SKenneth E. Jansen 88359599516SKenneth E. Jansenc.... get dynamic model coefficient 88459599516SKenneth E. Jansenc 88559599516SKenneth E. Jansen ilesmod=iLES/10 88659599516SKenneth E. Jansenc 88759599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model 88859599516SKenneth E. Jansenc 88959599516SKenneth E. Jansen if (ilesmod.eq.0) then ! 0 < iLES< 10 => dyn. model calculated 89059599516SKenneth E. Jansen ! at nodes based on discrete filtering 89159599516SKenneth E. Jansen 89259599516SKenneth E. Jansen 89359599516SKenneth E. Jansen if(isubmod.eq.2) then 89459599516SKenneth E. Jansen call SUPGdis(y, ac, shgl, shp, 89559599516SKenneth E. Jansen & iper, ilwork, 89659599516SKenneth E. Jansen & nsons, ifath, x, 89759599516SKenneth E. Jansen & iBC, BC, stabdis, xavegt3) 89859599516SKenneth E. Jansen endif 89959599516SKenneth E. Jansen 90059599516SKenneth E. Jansen if( ((isubmod.eq.0).or.(isubmod.eq.2)))then ! If no 90159599516SKenneth E. Jansen ! sub-model 90259599516SKenneth E. Jansen ! or SUPG 90359599516SKenneth E. Jansen ! model wanted 90459599516SKenneth E. Jansen 90559599516SKenneth E. Jansen if(i2filt.eq.0)then ! If simple filter 90659599516SKenneth E. Jansen 90759599516SKenneth E. Jansen if(modlstats .eq. 0) then ! If no model stats wanted 90859599516SKenneth E. Jansen call getdmc (y, shgl, shp, 90959599516SKenneth E. Jansen & iper, ilwork, nsons, 91059599516SKenneth E. Jansen & ifath, x) 91159599516SKenneth E. Jansen else ! else get model stats 91259599516SKenneth E. Jansen call stdfdmc (y, shgl, shp, 91359599516SKenneth E. Jansen & iper, ilwork, nsons, 91459599516SKenneth E. Jansen & ifath, x) 91559599516SKenneth E. Jansen endif ! end of stats if statement 91659599516SKenneth E. Jansen 91759599516SKenneth E. Jansen else ! else if twice filtering 91859599516SKenneth E. Jansen 91959599516SKenneth E. Jansen call widefdmc(y, shgl, shp, 92059599516SKenneth E. Jansen & iper, ilwork, nsons, 92159599516SKenneth E. Jansen & ifath, x) 92259599516SKenneth E. Jansen 92359599516SKenneth E. Jansen 92459599516SKenneth E. Jansen endif ! end of simple filter if statement 92559599516SKenneth E. Jansen 92659599516SKenneth E. Jansen endif ! end of SUPG or no sub-model if statement 92759599516SKenneth E. Jansen 92859599516SKenneth E. Jansen 92959599516SKenneth E. Jansen if( (isubmod.eq.1) ) then ! If DFWR sub-model wanted 93059599516SKenneth E. Jansen call cdelBHsq (y, shgl, shp, 93159599516SKenneth E. Jansen & iper, ilwork, nsons, 93259599516SKenneth E. Jansen & ifath, x, cdelsq1) 93359599516SKenneth E. Jansen call FiltRat (y, shgl, shp, 93459599516SKenneth E. Jansen & iper, ilwork, nsons, 93559599516SKenneth E. Jansen & ifath, x, cdelsq1, 93659599516SKenneth E. Jansen & fwr4, fwr3) 93759599516SKenneth E. Jansen 93859599516SKenneth E. Jansen 93959599516SKenneth E. Jansen if (i2filt.eq.0) then ! If simple filter wanted 94059599516SKenneth E. Jansen call DFWRsfdmc(y, shgl, shp, 94159599516SKenneth E. Jansen & iper, ilwork, nsons, 94259599516SKenneth E. Jansen & ifath, x, fwr2, fwr3) 94359599516SKenneth E. Jansen else ! else if twice filtering wanted 94459599516SKenneth E. Jansen call DFWRwfdmc(y, shgl, shp, 94559599516SKenneth E. Jansen & iper, ilwork, nsons, 94659599516SKenneth E. Jansen & ifath, x, fwr4, fwr4) 94759599516SKenneth E. Jansen endif ! end of simple filter if statement 94859599516SKenneth E. Jansen 94959599516SKenneth E. Jansen endif ! end of DFWR sub-model if statement 95059599516SKenneth E. Jansen 95159599516SKenneth E. Jansen if( (isubmod.eq.2) )then ! If SUPG sub-model wanted 95259599516SKenneth E. Jansen call dmcSUPG (y, ac, shgl, 95359599516SKenneth E. Jansen & shp, iper, ilwork, 95459599516SKenneth E. Jansen & nsons, ifath, x, 95559599516SKenneth E. Jansen & iBC, BC, rowp, colm, 95659599516SKenneth E. Jansen & xavegt2, stabdis) 95759599516SKenneth E. Jansen endif 95859599516SKenneth E. Jansen 95959599516SKenneth E. Jansen if(idis.eq.1)then ! If SUPG/Model dissipation wanted 96059599516SKenneth E. Jansen call ediss (y, ac, shgl, 96159599516SKenneth E. Jansen & shp, iper, ilwork, 96259599516SKenneth E. Jansen & nsons, ifath, x, 96359599516SKenneth E. Jansen & iBC, BC, xavegt) 96459599516SKenneth E. Jansen endif 96559599516SKenneth E. Jansen 96659599516SKenneth E. Jansen endif ! end of ilesmod 96759599516SKenneth E. Jansen 96859599516SKenneth E. Jansen if (ilesmod .eq. 1) then ! 10 < iLES < 20 => dynamic-mixed 96959599516SKenneth E. Jansen ! at nodes based on discrete filtering 97059599516SKenneth E. Jansen call bardmc (y, shgl, shp, 97159599516SKenneth E. Jansen & iper, ilwork, 97259599516SKenneth E. Jansen & nsons, ifath, x) 97359599516SKenneth E. Jansen endif 97459599516SKenneth E. Jansen 97559599516SKenneth E. Jansen if (ilesmod .eq. 2) then ! 20 < iLES < 30 => dynamic at quad 97659599516SKenneth E. Jansen ! pts based on lumped projection filt. 97759599516SKenneth E. Jansen 97859599516SKenneth E. Jansen if(isubmod.eq.0)then 97959599516SKenneth E. Jansen call projdmc (y, shgl, shp, 98059599516SKenneth E. Jansen & iper, ilwork, x) 98159599516SKenneth E. Jansen else 98259599516SKenneth E. Jansen call cpjdmcnoi (y, shgl, shp, 98359599516SKenneth E. Jansen & iper, ilwork, x, 98459599516SKenneth E. Jansen & rowp, colm, 98559599516SKenneth E. Jansen & iBC, BC) 98659599516SKenneth E. Jansen endif 98759599516SKenneth E. Jansen 98859599516SKenneth E. Jansen endif 98959599516SKenneth E. Jansen 99059599516SKenneth E. Jansen if( (iLES.gt.1) ) then ! Deallocate Stuff for advanced LES models 99159599516SKenneth E. Jansen deallocate (fwr2) 99259599516SKenneth E. Jansen deallocate (fwr3) 99359599516SKenneth E. Jansen deallocate (fwr4) 99459599516SKenneth E. Jansen deallocate (xavegt) 99559599516SKenneth E. Jansen deallocate (xavegt2) 99659599516SKenneth E. Jansen deallocate (xavegt3) 99759599516SKenneth E. Jansen deallocate (stabdis) 99859599516SKenneth E. Jansen endif 99959599516SKenneth E. Jansen return 100059599516SKenneth E. Jansen end 100159599516SKenneth E. Jansen 100259599516SKenneth E. Jansenc 100359599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution 100459599516SKenneth E. Jansenc 100559599516SKenneth E. Jansen subroutine CalcImpConvCoef (numISrfs, numTpoints) 100659599516SKenneth E. Jansen 100759599516SKenneth E. Jansen use convolImpFlow !uses flow history and impedance for convolution 100859599516SKenneth E. Jansen 100959599516SKenneth E. Jansen include "common.h" !for alfi 101059599516SKenneth E. Jansen 101159599516SKenneth E. Jansen integer numISrfs, numTpoints 101259599516SKenneth E. Jansen 101359599516SKenneth E. Jansen allocate (ConvCoef(numTpoints+2,3)) !same time discret. for all imp. BC 101459599516SKenneth E. Jansen do j=1,numTpoints+2 101559599516SKenneth E. Jansen ConvCoef(j,:)=0.5/numTpoints !dt/2 divided by period T=N*dt 101659599516SKenneth E. Jansen ConvCoef(j,1)=ConvCoef(j,1)*(1.0-alfi)*(1.0-alfi) 101759599516SKenneth E. Jansen ConvCoef(j,2)=ConvCoef(j,2)*(1.0+2*alfi*(1.0-alfi)) 101859599516SKenneth E. Jansen ConvCoef(j,3)=ConvCoef(j,3)*alfi*alfi 101959599516SKenneth E. Jansen enddo 102059599516SKenneth E. Jansen ConvCoef(1,2)=zero 102159599516SKenneth E. Jansen ConvCoef(1,3)=zero 102259599516SKenneth E. Jansen ConvCoef(2,3)=zero 102359599516SKenneth E. Jansen ConvCoef(numTpoints+1,1)=zero 102459599516SKenneth E. Jansen ConvCoef(numTpoints+2,2)=zero 102559599516SKenneth E. Jansen ConvCoef(numTpoints+2,1)=zero 102659599516SKenneth E. Jansenc 102759599516SKenneth E. Jansenc...calculate the coefficients for the impedance convolution 102859599516SKenneth E. Jansenc 102959599516SKenneth E. Jansen allocate (ImpConvCoef(numTpoints+2,numISrfs)) 103059599516SKenneth E. Jansen 103159599516SKenneth E. Jansenc..coefficients below assume Q linear in time step, Z constant 103259599516SKenneth E. Jansenc do j=3,numTpoints 103359599516SKenneth E. Jansenc ImpConvCoef(j,:) = ValueListImp(j-1,:)*ConvCoef(j,3) 103459599516SKenneth E. Jansenc & + ValueListImp(j,:)*ConvCoef(j,2) 103559599516SKenneth E. Jansenc & + ValueListImp(j+1,:)*ConvCoef(j,1) 103659599516SKenneth E. Jansenc enddo 103759599516SKenneth E. Jansenc ImpConvCoef(1,:) = ValueListImp(2,:)*ConvCoef(1,1) 103859599516SKenneth E. Jansenc ImpConvCoef(2,:) = ValueListImp(2,:)*ConvCoef(2,2) 103959599516SKenneth E. Jansenc & + ValueListImp(3,:)*ConvCoef(2,1) 104059599516SKenneth E. Jansenc ImpConvCoef(numTpoints+1,:) = 104159599516SKenneth E. Jansenc & ValueListImp(numTpoints,:)*ConvCoef(numTpoints+1,3) 104259599516SKenneth E. Jansenc & + ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+1,2) 104359599516SKenneth E. Jansenc ImpConvCoef(numTpoints+2,:) = 104459599516SKenneth E. Jansenc & ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+2,3) 104559599516SKenneth E. Jansen 104659599516SKenneth E. Jansenc..try easiest convolution Q and Z constant per time step 104759599516SKenneth E. Jansen do j=3,numTpoints+1 104859599516SKenneth E. Jansen ImpConvCoef(j,:) = ValueListImp(j-1,:)/numTpoints 104959599516SKenneth E. Jansen enddo 105059599516SKenneth E. Jansen ImpConvCoef(1,:) =zero 105159599516SKenneth E. Jansen ImpConvCoef(2,:) =zero 105259599516SKenneth E. Jansen ImpConvCoef(numTpoints+2,:) = 105359599516SKenneth E. Jansen & ValueListImp(numTpoints+1,:)/numTpoints 105459599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr() 105559599516SKenneth E. Jansen ImpConvCoef(numTpoints+1,:)= ImpConvCoef(numTpoints+1,:) 105659599516SKenneth E. Jansen & - ImpConvCoef(numTpoints+2,:)*(1.0-alfi)/alfi 105759599516SKenneth E. Jansen ImpConvCoef(numTpoints+2,:)= ImpConvCoef(numTpoints+2,:)/alfi 105859599516SKenneth E. Jansen return 105959599516SKenneth E. Jansen end 106059599516SKenneth E. Jansen 106159599516SKenneth E. Jansenc 106259599516SKenneth E. Jansenc ... update the flow rate history for the impedance convolution, filter it and write it out 106359599516SKenneth E. Jansenc 106459599516SKenneth E. Jansen subroutine UpdHistConv(y,nsrfIdList,numSrfs) 106559599516SKenneth E. Jansen 106659599516SKenneth E. Jansen use convolImpFlow !brings ntimeptpT, QHistImp, QHistTry, QHistTryF, numImpSrfs 106759599516SKenneth E. Jansen use convolRCRFlow !brings QHistRCR, numRCRSrfs 106859599516SKenneth E. Jansen 106959599516SKenneth E. Jansen include "common.h" 107059599516SKenneth E. Jansen 107159599516SKenneth E. Jansen integer nsrfIdList(0:MAXSURF), numSrfs 107259599516SKenneth E. Jansen character*20 fname1 107359599516SKenneth E. Jansen character*10 cname2 107459599516SKenneth E. Jansen character*5 cname 107559599516SKenneth E. Jansen real*8 y(nshg,3) !velocity at time n+1 107659599516SKenneth E. Jansen real*8 NewQ(0:MAXSURF) !temporary unknown for the flow rate 107759599516SKenneth E. Jansen !that needs to be added to the flow history 107859599516SKenneth E. Jansen 107959599516SKenneth E. Jansen call GetFlowQ(NewQ,y,nsrfIdList,numSrfs) !new flow at time n+1 108059599516SKenneth E. Jansenc 108159599516SKenneth E. Jansenc... for imp BC: shift QHist, add new constribution, filter and write out 108259599516SKenneth E. Jansenc 108359599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 108459599516SKenneth E. Jansen do j=1, ntimeptpT 108559599516SKenneth E. Jansen QHistImp(j,1:numSrfs)=QHistImp(j+1,1:numSrfs) 108659599516SKenneth E. Jansen enddo 108759599516SKenneth E. Jansen QHistImp(ntimeptpT+1,1:numSrfs) = NewQ(1:numSrfs) 108859599516SKenneth E. Jansen 108959599516SKenneth E. Jansenc 109059599516SKenneth E. Jansenc....filter the flow rate history 109159599516SKenneth E. Jansenc 109259599516SKenneth E. Jansen cutfreq = 10 !hardcoded cutting frequency of the filter 109359599516SKenneth E. Jansen do j=1, ntimeptpT 109459599516SKenneth E. Jansen QHistTry(j,:)=QHistImp(j+1,:) 109559599516SKenneth E. Jansen enddo 109659599516SKenneth E. Jansen call Filter(QHistTryF,QHistTry,ntimeptpT,Delt(1),cutfreq) 109759599516SKenneth E. Jansenc.... if no filter applied then uncomment next three lines 109859599516SKenneth E. Jansenc do j=1, ntimeptpT 109959599516SKenneth E. Jansenc QHistTryF(j,:)=QHistTry(j,:) 110059599516SKenneth E. Jansenc enddo 110159599516SKenneth E. Jansen 110259599516SKenneth E. Jansenc QHistImp(1,:)=zero ! why do we do this? for beta(1,:) = zero it does not really matters 110359599516SKenneth E. Jansen do j=1, ntimeptpT 110459599516SKenneth E. Jansen QHistImp(j+1,:)=QHistTryF(j,:) 110559599516SKenneth E. Jansen enddo 110659599516SKenneth E. Jansenc 110759599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat 110859599516SKenneth E. Jansenc 110959599516SKenneth E. Jansen if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or. 111059599516SKenneth E. Jansen & (istep .eq. nstep(1)))) .and. 111159599516SKenneth E. Jansen & (myrank .eq. master)) then 111259599516SKenneth E. Jansen open(unit=816, file='Qhistor.dat',status='replace') 111359599516SKenneth E. Jansen write(816,*) ntimeptpT 111459599516SKenneth E. Jansen do j=1,ntimeptpT+1 111559599516SKenneth E. Jansen write(816,*) (QHistImp(j,n),n=1, numSrfs) 111659599516SKenneth E. Jansen enddo 111759599516SKenneth E. Jansen close(816) 111859599516SKenneth E. Jansenc... write out a copy with step number to be able to restart 111959599516SKenneth E. Jansen fname1 = 'Qhistor' 112059599516SKenneth E. Jansen fname1 = trim(fname1)//trim(cname2(lstep))//'.dat' 112159599516SKenneth E. Jansen open(unit=8166,file=trim(fname1),status='unknown') 112259599516SKenneth E. Jansen write(8166,*) ntimeptpT 112359599516SKenneth E. Jansen do j=1,ntimeptpT+1 112459599516SKenneth E. Jansen write(8166,*) (QHistImp(j,n),n=1, numSrfs) 112559599516SKenneth E. Jansen enddo 112659599516SKenneth E. Jansen close(8166) 112759599516SKenneth E. Jansen endif 112859599516SKenneth E. Jansen endif 112959599516SKenneth E. Jansen 113059599516SKenneth E. Jansenc 113159599516SKenneth E. Jansenc... for RCR bc just add the new contribution 113259599516SKenneth E. Jansenc 113359599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 113459599516SKenneth E. Jansen QHistRCR(lstep+1,1:numSrfs) = NewQ(1:numSrfs) 113559599516SKenneth E. Jansenc 113659599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat 113759599516SKenneth E. Jansenc 113859599516SKenneth E. Jansen if ((irs .ge. 1) .and. (myrank .eq. master)) then 113959599516SKenneth E. Jansen if(istep.eq.1) then 114059599516SKenneth E. Jansen open(unit=816,file='Qhistor.dat',status='unknown') 114159599516SKenneth E. Jansen else 114259599516SKenneth E. Jansen open(unit=816,file='Qhistor.dat',position='append') 114359599516SKenneth E. Jansen endif 114459599516SKenneth E. Jansen if(istep.eq.1) then 114559599516SKenneth E. Jansen do j=1,lstep 114659599516SKenneth E. Jansen write(816,*) j, (QHistRCR(j,n),n=1,numSrfs) ! read from file of previous run 114759599516SKenneth E. Jansen enddo 114859599516SKenneth E. Jansen endif 114959599516SKenneth E. Jansen write(816,*) lstep+1, (QHistRCR(lstep+1,n),n=1, numSrfs) 115059599516SKenneth E. Jansen close(816) 115159599516SKenneth E. Jansenc... write out a copy with step number to be able to restart 115259599516SKenneth E. Jansen if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or. 115359599516SKenneth E. Jansen & (istep .eq. nstep(1)))) .and. 115459599516SKenneth E. Jansen & (myrank .eq. master)) then 115559599516SKenneth E. Jansen fname1 = 'Qhistor' 115659599516SKenneth E. Jansen fname1 = trim(fname1)//trim(cname2(lstep))//'.dat' 115759599516SKenneth E. Jansen open(unit=8166,file=trim(fname1),status='unknown') 115859599516SKenneth E. Jansen write(8166,*) lstep+1 115959599516SKenneth E. Jansen do j=1,lstep+1 116059599516SKenneth E. Jansen write(8166,*) (QHistRCR(j,n),n=1, numSrfs) 116159599516SKenneth E. Jansen enddo 116259599516SKenneth E. Jansen close(8166) 116359599516SKenneth E. Jansen endif 116459599516SKenneth E. Jansen endif 116559599516SKenneth E. Jansen endif 116659599516SKenneth E. Jansen 116759599516SKenneth E. Jansen return 116859599516SKenneth E. Jansen end 116959599516SKenneth E. Jansen 117059599516SKenneth E. Jansenc 117159599516SKenneth E. Jansenc...calculate the time varying coefficients for the RCR convolution 117259599516SKenneth E. Jansenc 117359599516SKenneth E. Jansen subroutine CalcRCRConvCoef (stepn, numSrfs) 117459599516SKenneth E. Jansen 117559599516SKenneth E. Jansen use convolRCRFlow !brings in ValueListRCR, dtRCR 117659599516SKenneth E. Jansen 117759599516SKenneth E. Jansen include "common.h" !brings alfi 117859599516SKenneth E. Jansen 117959599516SKenneth E. Jansen integer numSrfs, stepn 118059599516SKenneth E. Jansen 118159599516SKenneth E. Jansen RCRConvCoef = zero 118259599516SKenneth E. Jansen if (stepn .eq. 0) then 118359599516SKenneth E. Jansen RCRConvCoef(1,:) = ValueListRCR(1,:)*(1.0-alfi) + 118459599516SKenneth E. Jansen & ValueListRCR(3,:)*(-alfi + 1.0 + 1/dtRCR(:) 118559599516SKenneth E. Jansen & - exp(-alfi*dtRCR(:))*(1 + 1/dtRCR(:))) 118659599516SKenneth E. Jansen RCRConvCoef(2,:) = ValueListRCR(1,:)*alfi 118759599516SKenneth E. Jansen & + ValueListRCR(3,:) 118859599516SKenneth E. Jansen & *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:)) 118959599516SKenneth E. Jansen endif 119059599516SKenneth E. Jansen if (stepn .ge. 1) then 119159599516SKenneth E. Jansen RCRConvCoef(1,:) =-ValueListRCR(3,:)*exp(-dtRCR(:)*(stepn+alfi)) 119259599516SKenneth E. Jansen & *(1 + (1 - exp(dtRCR(:)))/dtRCR(:)) 119359599516SKenneth E. Jansen RCRConvCoef(stepn+1,:) = ValueListRCR(1,:)*(1-alfi) 119459599516SKenneth E. Jansen & - ValueListRCR(3,:)*(alfi - 1 - 1/dtRCR(:) 119559599516SKenneth E. Jansen & + exp(-alfi*dtRCR(:))/dtRCR(:)*(2 - exp(-dtRCR(:)))) 119659599516SKenneth E. Jansen RCRConvCoef(stepn+2,:) = ValueListRCR(1,:)*alfi 119759599516SKenneth E. Jansen & + ValueListRCR(3,:) 119859599516SKenneth E. Jansen & *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:)) 119959599516SKenneth E. Jansen endif 120059599516SKenneth E. Jansen if (stepn .ge. 2) then 120159599516SKenneth E. Jansen do j=2,stepn 120259599516SKenneth E. Jansen RCRConvCoef(j,:) = ValueListRCR(3,:)/dtRCR(:)* 120359599516SKenneth E. Jansen & exp(-dtRCR(:)*(stepn + alfi + 2 - j))* 120459599516SKenneth E. Jansen & (1 - exp(dtRCR(:)))**2 120559599516SKenneth E. Jansen enddo 120659599516SKenneth E. Jansen endif 120759599516SKenneth E. Jansen 120859599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr() 120959599516SKenneth E. Jansen RCRConvCoef(stepn+1,:)= RCRConvCoef(stepn+1,:) 121059599516SKenneth E. Jansen & - RCRConvCoef(stepn+2,:)*(1.0-alfi)/alfi 121159599516SKenneth E. Jansen RCRConvCoef(stepn+2,:)= RCRConvCoef(stepn+2,:)/alfi 121259599516SKenneth E. Jansen 121359599516SKenneth E. Jansen return 121459599516SKenneth E. Jansen end 121559599516SKenneth E. Jansen 121659599516SKenneth E. Jansenc 121759599516SKenneth E. Jansenc...calculate the time dependent H operator for the RCR convolution 121859599516SKenneth E. Jansenc 121959599516SKenneth E. Jansen subroutine CalcHopRCR (timestepRCR, stepn, numSrfs) 122059599516SKenneth E. Jansen 122159599516SKenneth E. Jansen use convolRCRFlow !brings in HopRCR, dtRCR 122259599516SKenneth E. Jansen 122359599516SKenneth E. Jansen include "common.h" 122459599516SKenneth E. Jansen 122559599516SKenneth E. Jansen integer numSrfs, stepn 122659599516SKenneth E. Jansen real*8 PdistCur(0:MAXSURF), timestepRCR 122759599516SKenneth E. Jansen 122859599516SKenneth E. Jansen HopRCR=zero 122959599516SKenneth E. Jansen call RCRint(timestepRCR*(stepn + alfi),PdistCur) 123059599516SKenneth E. Jansen HopRCR(1:numSrfs) = RCRic(1:numSrfs) 123159599516SKenneth E. Jansen & *exp(-dtRCR(1:numSrfs)*(stepn + alfi)) + PdistCur(1:numSrfs) 123259599516SKenneth E. Jansen return 123359599516SKenneth E. Jansen end 123459599516SKenneth E. Jansenc 123559599516SKenneth E. Jansenc ... initialize the influence of the initial conditions for the RCR BC 123659599516SKenneth E. Jansenc 123759599516SKenneth E. Jansen subroutine calcRCRic(y,srfIdList,numSrfs) 123859599516SKenneth E. Jansen 123959599516SKenneth E. Jansen use convolRCRFlow !brings RCRic, ValueListRCR, ValuePdist 124059599516SKenneth E. Jansen 124159599516SKenneth E. Jansen include "common.h" 124259599516SKenneth E. Jansen 124359599516SKenneth E. Jansen integer srfIdList(0:MAXSURF), numSrfs, irankCoupled 124459599516SKenneth E. Jansen real*8 y(nshg,4) !need velocity and pressure 124559599516SKenneth E. Jansen real*8 Qini(0:MAXSURF) !initial flow rate 124659599516SKenneth E. Jansen real*8 PdistIni(0:MAXSURF) !initial distal pressure 124759599516SKenneth E. Jansen real*8 Pini(0:MAXSURF),CoupleArea(0:MAXSURF) ! initial pressure 124859599516SKenneth E. Jansen real*8 VelOnly(nshg,3), POnly(nshg) 124959599516SKenneth E. Jansen 125059599516SKenneth E. Jansen allocate (RCRic(0:MAXSURF)) 125159599516SKenneth E. Jansen 125259599516SKenneth E. Jansen if(lstep.eq.0) then 125359599516SKenneth E. Jansen VelOnly(:,1:3)=y(:,1:3) 125459599516SKenneth E. Jansen call GetFlowQ(Qini,VelOnly,srfIdList,numSrfs) !get initial flow 125559599516SKenneth E. Jansen QHistRCR(1,1:numSrfs)=Qini(1:numSrfs) !initialize QHistRCR 125659599516SKenneth E. Jansen POnly(:)=y(:,4) ! pressure 125759599516SKenneth E. Jansen call integrScalar(Pini,POnly,srfIdList,numSrfs) !get initial pressure integral 125859599516SKenneth E. Jansen POnly(:)=one ! one to get area 125959599516SKenneth E. Jansen call integrScalar(CoupleArea,POnly,srfIdList,numSrfs) !get surf area 126059599516SKenneth E. Jansen Pini(1:numSrfs) = Pini(1:numSrfs)/CoupleArea(1:numSrfs) 126159599516SKenneth E. Jansen else 126259599516SKenneth E. Jansen Qini(1:numSrfs)=QHistRCR(1,1:numSrfs) 126359599516SKenneth E. Jansen Pini(1:numSrfs)=zero ! hack 126459599516SKenneth E. Jansen endif 126559599516SKenneth E. Jansen call RCRint(istep,PdistIni) !get initial distal P (use istep) 126659599516SKenneth E. Jansen RCRic(1:numSrfs) = Pini(1:numSrfs) 126759599516SKenneth E. Jansen & - ValueListRCR(1,:)*Qini(1:numSrfs)-PdistIni(1:numSrfs) 126859599516SKenneth E. Jansen return 126959599516SKenneth E. Jansen end 127059599516SKenneth E. Jansen 127159599516SKenneth E. Jansenc.........function that integrates a scalar over a boundary 127259599516SKenneth E. Jansen subroutine integrScalar(scalInt,scal,srfIdList,numSrfs) 127359599516SKenneth E. Jansen 127459599516SKenneth E. Jansen use pvsQbi !brings ndsurf, NASC 127559599516SKenneth E. Jansen 127659599516SKenneth E. Jansen include "common.h" 127759599516SKenneth E. Jansen include "mpif.h" 127859599516SKenneth E. Jansen 127959599516SKenneth E. Jansen integer srfIdList(0:MAXSURF), numSrfs, irankCoupled, i, k 128059599516SKenneth E. Jansen real*8 scal(nshg), scalInt(0:MAXSURF), scalIntProc(0:MAXSURF) 128159599516SKenneth E. Jansen 128259599516SKenneth E. Jansen scalIntProc = zero 128359599516SKenneth E. Jansen do i = 1,nshg 128459599516SKenneth E. Jansen if(numSrfs.gt.zero) then 128559599516SKenneth E. Jansen do k = 1,numSrfs 128659599516SKenneth E. Jansen irankCoupled = 0 128759599516SKenneth E. Jansen if (srfIdList(k).eq.ndsurf(i)) then 128859599516SKenneth E. Jansen irankCoupled=k 128959599516SKenneth E. Jansen scalIntProc(irankCoupled) = scalIntProc(irankCoupled) 129059599516SKenneth E. Jansen & + NASC(i)*scal(i) 129159599516SKenneth E. Jansen exit 129259599516SKenneth E. Jansen endif 129359599516SKenneth E. Jansen enddo 129459599516SKenneth E. Jansen endif 129559599516SKenneth E. Jansen enddo 129659599516SKenneth E. Jansenc 129759599516SKenneth E. Jansenc at this point, each scalint has its "nodes" contributions to the scalar 129859599516SKenneth E. Jansenc accumulated into scalIntProc. Note, because NASC is on processor this 129959599516SKenneth E. Jansenc will NOT be the scalar for the surface yet 130059599516SKenneth E. Jansenc 130159599516SKenneth E. Jansenc.... reduce integrated scalar for each surface, push on scalInt 130259599516SKenneth E. Jansenc 130359599516SKenneth E. Jansen npars=MAXSURF+1 130459599516SKenneth E. Jansen call MPI_ALLREDUCE (scalIntProc, scalInt(:), npars, 130559599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 130659599516SKenneth E. Jansen 130759599516SKenneth E. Jansen return 130859599516SKenneth E. Jansen end 130959599516SKenneth E. Jansen 13109071d3baSCameron Smith subroutine writeTimingMessage(key,iomode,timing) 13119071d3baSCameron Smith use iso_c_binding 13129071d3baSCameron Smith use phstr 13139071d3baSCameron Smith implicit none 131459599516SKenneth E. Jansen 13159071d3baSCameron Smith character(len=*) :: key 13169071d3baSCameron Smith integer :: iomode 13179071d3baSCameron Smith real*8 :: timing 1318da7d5714SCameron Smith character(len=1024) :: timing_msg 131989625e43SCameron Smith character(len=*), parameter :: 132089625e43SCameron Smith & streamModeString = c_char_"stream"//c_null_char, 132189625e43SCameron Smith & fileModeString = c_char_"disk"//c_null_char 132259599516SKenneth E. Jansen 1323da7d5714SCameron Smith timing_msg = c_char_"Time to write "//c_null_char 13249071d3baSCameron Smith call phstr_appendStr(timing_msg,key) 13259071d3baSCameron Smith if ( iomode .eq. -1 ) then 13269071d3baSCameron Smith call phstr_appendStr(timing_msg, streamModeString) 13279071d3baSCameron Smith else 13289071d3baSCameron Smith call phstr_appendStr(timing_msg, fileModeString) 13299071d3baSCameron Smith endif 13309071d3baSCameron Smith call phstr_appendStr(timing_msg, c_char_' = '//c_null_char) 13319071d3baSCameron Smith call phstr_appendDbl(timing_msg, timing) 1332da7d5714SCameron Smith write(6,*) trim(timing_msg) 13339071d3baSCameron Smith return 13349071d3baSCameron Smith end subroutine 133559599516SKenneth E. Jansen 133634e67057SKenneth E. Jansen subroutine initmpistat() 133734e67057SKenneth E. Jansen include "common.h" 133834e67057SKenneth E. Jansen 133934e67057SKenneth E. Jansen impistat = 0 134034e67057SKenneth E. Jansen impistat2 = 0 134134e67057SKenneth E. Jansen iISend = 0 134234e67057SKenneth E. Jansen iISendScal = 0 134334e67057SKenneth E. Jansen iIRecv = 0 134434e67057SKenneth E. Jansen iIRecvScal = 0 134534e67057SKenneth E. Jansen iWaitAll = 0 134634e67057SKenneth E. Jansen iWaitAllScal = 0 134734e67057SKenneth E. Jansen iAllR = 0 134834e67057SKenneth E. Jansen iAllRScal = 0 134934e67057SKenneth E. Jansen rISend = zero 135034e67057SKenneth E. Jansen rISendScal = zero 135134e67057SKenneth E. Jansen rIRecv = zero 135234e67057SKenneth E. Jansen rIRecvScal = zero 135334e67057SKenneth E. Jansen rWaitAll = zero 135434e67057SKenneth E. Jansen rWaitAllScal = zero 135534e67057SKenneth E. Jansen rAllR = zero 135634e67057SKenneth E. Jansen rAllRScal = zero 135734e67057SKenneth E. Jansen rCommu = zero 135834e67057SKenneth E. Jansen rCommuScal = zero 135934e67057SKenneth E. Jansen return 136034e67057SKenneth E. Jansen end subroutine 136134e67057SKenneth E. Jansen 136234e67057SKenneth E. Jansen subroutine initTimeSeries() 136334e67057SKenneth E. Jansen use timedata !allows collection of time series 136434e67057SKenneth E. Jansen include "common.h" 136534e67057SKenneth E. Jansen character*60 fvarts 136634e67057SKenneth E. Jansen character*10 cname2 136734e67057SKenneth E. Jansen 136834e67057SKenneth E. Jansen inquire(file='xyzts.dat',exist=exts) 136934e67057SKenneth E. Jansen if(exts) then 137034e67057SKenneth E. Jansen open(unit=626,file='xyzts.dat',status='old') 137134e67057SKenneth E. Jansen read(626,*) ntspts, freq, tolpt, iterat, varcod 137234e67057SKenneth E. Jansen call sTD ! sets data structures 137334e67057SKenneth E. Jansen 137434e67057SKenneth E. Jansen do jj=1,ntspts ! read coordinate data where solution desired 137534e67057SKenneth E. Jansen read(626,*) ptts(jj,1),ptts(jj,2),ptts(jj,3) 137634e67057SKenneth E. Jansen enddo 137734e67057SKenneth E. Jansen close(626) 137834e67057SKenneth E. Jansen 137934e67057SKenneth E. Jansen statptts(:,:) = 0 138034e67057SKenneth E. Jansen parptts(:,:) = zero 138134e67057SKenneth E. Jansen varts(:,:) = zero 138234e67057SKenneth E. Jansen 138334e67057SKenneth E. Jansen 138434e67057SKenneth E. Jansen iv_rankpernode = iv_rankpercore*iv_corepernode 138534e67057SKenneth E. Jansen iv_totnodes = numpe/iv_rankpernode 138634e67057SKenneth E. Jansen iv_totcores = iv_corepernode*iv_totnodes 138734e67057SKenneth E. Jansen if (myrank .eq. 0) then 138834e67057SKenneth E. Jansen write(*,*) 'Info for probes:' 138934e67057SKenneth E. Jansen write(*,*) ' Ranks per core:',iv_rankpercore 139034e67057SKenneth E. Jansen write(*,*) ' Cores per node:',iv_corepernode 139134e67057SKenneth E. Jansen write(*,*) ' Ranks per node:',iv_rankpernode 139234e67057SKenneth E. Jansen write(*,*) ' Total number of nodes:',iv_totnodes 139334e67057SKenneth E. Jansen write(*,*) ' Total number of cores',iv_totcores 139434e67057SKenneth E. Jansen endif 139534e67057SKenneth E. Jansen 139634e67057SKenneth E. Jansen! if (myrank .eq. numpe-1) then 139734e67057SKenneth E. Jansen do jj=1,ntspts 139834e67057SKenneth E. Jansen 139934e67057SKenneth E. Jansen ! Compute the adequate rank which will take care of probe jj 140034e67057SKenneth E. Jansen jjm1 = jj-1 140134e67057SKenneth E. Jansen iv_node = (iv_totnodes-1)-mod(jjm1,iv_totnodes) 140234e67057SKenneth E. Jansen iv_core = (iv_corepernode-1) - mod((jjm1 - 140334e67057SKenneth E. Jansen & mod(jjm1,iv_totnodes))/iv_totnodes,iv_corepernode) 140434e67057SKenneth E. Jansen iv_thread = (iv_rankpercore-1) - mod((jjm1- 140534e67057SKenneth E. Jansen & (mod(jjm1,iv_totcores)))/iv_totcores,iv_rankpercore) 140634e67057SKenneth E. Jansen iv_rank(jj) = iv_node*iv_rankpernode 140734e67057SKenneth E. Jansen & + iv_core*iv_rankpercore 140834e67057SKenneth E. Jansen & + iv_thread 140934e67057SKenneth E. Jansen 141034e67057SKenneth E. Jansen if(myrank == 0) then 141134e67057SKenneth E. Jansen write(*,*) ' Probe', jj, 'handled by rank', 141234e67057SKenneth E. Jansen & iv_rank(jj), ' on node', iv_node 141334e67057SKenneth E. Jansen endif 141434e67057SKenneth E. Jansen 141534e67057SKenneth E. Jansen ! Verification just in case 141634e67057SKenneth E. Jansen if(iv_rank(jj) .lt.0 .or. iv_rank(jj) .ge. numpe) then 141734e67057SKenneth E. Jansen write(*,*) 'WARNING: iv_rank(',jj,') is ', iv_rank(jj), 141834e67057SKenneth E. Jansen & ' and reset to numpe-1' 141934e67057SKenneth E. Jansen iv_rank(jj) = numpe-1 142034e67057SKenneth E. Jansen endif 142134e67057SKenneth E. Jansen 142234e67057SKenneth E. Jansen ! Open the varts files 142334e67057SKenneth E. Jansen if(myrank == iv_rank(jj)) then 142434e67057SKenneth E. Jansen fvarts='varts/varts' 142534e67057SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(jj)) 142634e67057SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(lstep)) 142734e67057SKenneth E. Jansen fvarts=trim(fvarts)//'.dat' 142834e67057SKenneth E. Jansen fvarts=trim(fvarts) 142934e67057SKenneth E. Jansen open(unit=1000+jj, file=fvarts, status='unknown') 143034e67057SKenneth E. Jansen endif 143134e67057SKenneth E. Jansen enddo 143234e67057SKenneth E. Jansen! endif 143334e67057SKenneth E. Jansen 143434e67057SKenneth E. Jansen endif 143534e67057SKenneth E. Jansenc 143634e67057SKenneth E. Jansen return 143734e67057SKenneth E. Jansen end subroutine 143834e67057SKenneth E. Jansen 14393beb3aadSMichel Rasquin subroutine finalizeTimeSeries() 14403beb3aadSMichel Rasquin use timedata !allows collection of time series 14413beb3aadSMichel Rasquin include "common.h" 14423beb3aadSMichel Rasquin if(exts) then 14433beb3aadSMichel Rasquin do jj=1,ntspts 14443beb3aadSMichel Rasquin if (myrank == iv_rank(jj)) then 14453beb3aadSMichel Rasquin close(1000+jj) 14463beb3aadSMichel Rasquin endif 14473beb3aadSMichel Rasquin enddo 14483beb3aadSMichel Rasquin call dTD ! deallocates time series arrays 14493beb3aadSMichel Rasquin endif 14503beb3aadSMichel Rasquin return 14513beb3aadSMichel Rasquin end subroutine 14523beb3aadSMichel Rasquin 14533beb3aadSMichel Rasquin 14543beb3aadSMichel Rasquin 1455*da6af917SKenneth E. Jansen subroutine initEQS(iBC, rowp, colm,svLS_nFaces, 1456*da6af917SKenneth E. Jansen 2 svLS_LHS,svLS_ls, 1457*da6af917SKenneth E. Jansen 3 svLS_LHS_S,svLS_ls_S) 145834e67057SKenneth E. Jansen 145934e67057SKenneth E. Jansen use solvedata 1460*da6af917SKenneth E. Jansen use fncorpmod 146134e67057SKenneth E. Jansen include "common.h" 146234e67057SKenneth E. Jansen#ifdef HAVE_SVLS 146334e67057SKenneth E. Jansen include "svLS.h" 1464*da6af917SKenneth E. Jansen include "mpif.h" 1465*da6af917SKenneth E. Jansen include "auxmpi.h" 1466436f1a2bSCameron Smith 1467436f1a2bSCameron Smith TYPE(svLS_lhsType) svLS_lhs 1468436f1a2bSCameron Smith TYPE(svLS_lsType) svLS_ls 1469436f1a2bSCameron Smith TYPE(svLS_commuType) communicator 1470436f1a2bSCameron Smith TYPE(svLS_lsType) svLS_ls_S(4) 1471436f1a2bSCameron Smith TYPE(svLS_lhsType) svLS_lhs_S(4) 1472436f1a2bSCameron Smith TYPE(svLS_commuType) communicator_S(4) 1473436f1a2bSCameron Smith INTEGER svLS_nFaces, gnNo, nNo, faIn, facenNo 147434e67057SKenneth E. Jansen#endif 147529511ef9SCameron Smith integer, allocatable :: gNodes(:) 147629511ef9SCameron Smith real*8, allocatable :: sV(:,:) 147734e67057SKenneth E. Jansen character*1024 servername 147853c9b1fcSKenneth E. Jansen integer rowp(nshg,nnz), colm(nshg+1), 147953c9b1fcSKenneth E. Jansen & iBC(nshg) 148017761b5dSBen Matthews#ifdef HAVE_LESLIB 148134e67057SKenneth E. Jansen integer eqnType 148234e67057SKenneth E. Jansen! IF (svLSFlag .EQ. 0) THEN !When we get a PETSc option it also could block this or a positive leslib 148334e67057SKenneth E. Jansen call SolverLicenseServer(servername) 148434e67057SKenneth E. Jansen! ENDIF 148534e67057SKenneth E. Jansen#endif 148634e67057SKenneth E. Jansenc 148734e67057SKenneth E. Jansenc.... For linear solver Library 148834e67057SKenneth E. Jansenc 148934e67057SKenneth E. Jansenc 149034e67057SKenneth E. Jansenc.... assign parameter values 149134e67057SKenneth E. Jansenc 149234e67057SKenneth E. Jansen do i = 1, 100 149334e67057SKenneth E. Jansen numeqns(i) = i 149434e67057SKenneth E. Jansen enddo 149534e67057SKenneth E. Jansenc 149634e67057SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve 149734e67057SKenneth E. Jansenc 149834e67057SKenneth E. Jansen nsolt=mod(impl(1),2) ! 1 if solving temperature 149934e67057SKenneth E. Jansen nsclrsol=nsolt+nsclr ! total number of scalars solved At 1500*da6af917SKenneth E. Jansen! some point we probably want to create a map, considering stepseq(), to find 1501*da6af917SKenneth E. Jansen! what is actually solved and only dimension lhs to the appropriate 1502*da6af917SKenneth E. Jansen! size. (see 1.6.1 and earlier for a "failed" attempt at this). 150334e67057SKenneth E. Jansen 150434e67057SKenneth E. Jansen nsolflow=mod(impl(1),100)/10 ! 1 if solving flow 150534e67057SKenneth E. Jansenc 150634e67057SKenneth E. Jansenc.... Now, call lesNew routine to initialize 150734e67057SKenneth E. Jansenc memory space 150834e67057SKenneth E. Jansenc 150934e67057SKenneth E. Jansen call genadj(colm, rowp, icnt ) ! preprocess the adjacency list 151034e67057SKenneth E. Jansen 151134e67057SKenneth E. Jansen nnz_tot=icnt ! this is exactly the number of non-zero blocks on 151234e67057SKenneth E. Jansen ! this proc 151334e67057SKenneth E. Jansen 151434e67057SKenneth E. Jansen if (nsolflow.eq.1) then ! start of setup for the flow 151534e67057SKenneth E. Jansen lesId = numeqns(1) 151634e67057SKenneth E. Jansen eqnType = 1 151734e67057SKenneth E. Jansen nDofs = 4 151834e67057SKenneth E. Jansen! Setting up svLS or leslib for flow 151934e67057SKenneth E. Jansen IF (svLSFlag .EQ. 1) THEN 1520*da6af917SKenneth E. Jansen! ifdef svLS_1 : opening large ifdef for svLS solver setup 152134e67057SKenneth E. Jansen#ifdef HAVE_SVLS 1522*da6af917SKenneth E. Jansen call aSDf 152334e67057SKenneth E. Jansen IF(nPrjs.eq.0) THEN 152434e67057SKenneth E. Jansen svLSType=2 !GMRES if borrowed ACUSIM projection vectors variable set to zero 152534e67057SKenneth E. Jansen ELSE 152634e67057SKenneth E. Jansen svLSType=3 !NS solver 152734e67057SKenneth E. Jansen ENDIF 152834e67057SKenneth E. Jansen! reltol for the NSSOLVE is the stop criterion on the outer loop 152934e67057SKenneth E. Jansen! reltolIn is (eps_GM, eps_CG) from the CompMech paper 153034e67057SKenneth E. Jansen! for now we are using 153134e67057SKenneth E. Jansen! Tolerance on ACUSIM Pressure Projection for CG and 153234e67057SKenneth E. Jansen! Tolerance on Momentum Equations for GMRES 153334e67057SKenneth E. Jansen! also using Kspaceand maxIters from setup for ACUSIM 153434e67057SKenneth E. Jansen! 153534e67057SKenneth E. Jansen eps_outer=40.0*epstol(1) !following papers soggestion for now 153634e67057SKenneth E. Jansen CALL svLS_LS_CREATE(svLS_ls, svLSType, dimKry=Kspace, 153734e67057SKenneth E. Jansen 2 relTol=eps_outer, relTolIn=(/epstol(1),prestol/), 153834e67057SKenneth E. Jansen 3 maxItr=maxIters, 153934e67057SKenneth E. Jansen 4 maxItrIn=(/maxIters,maxIters/)) 154034e67057SKenneth E. Jansen 154134e67057SKenneth E. Jansen CALL svLS_COMMU_CREATE(communicator, MPI_COMM_WORLD) 154234e67057SKenneth E. Jansen nNo=nshg 154334e67057SKenneth E. Jansen gnNo=nshgt 154434e67057SKenneth E. Jansen IF (ipvsq .GE. 2) THEN 154534e67057SKenneth E. Jansen 154634e67057SKenneth E. Jansen#if((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 1)) 154734e67057SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs 154834e67057SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs + numCORSrfs 154934e67057SKenneth E. Jansen#elif((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 0)) 155034e67057SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs 155134e67057SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs + numCORSrfs 155234e67057SKenneth E. Jansen#elif((VER_CORONARY == 0)&&(VER_CLOSEDLOOP == 1)) 155334e67057SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs 155434e67057SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs 155534e67057SKenneth E. Jansen#else 155634e67057SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs 155734e67057SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs 155834e67057SKenneth E. Jansen#endif 155934e67057SKenneth E. Jansen 156034e67057SKenneth E. Jansen ELSE 156134e67057SKenneth E. Jansen svLS_nFaces = 1 !not sure about this...looks like 1 means 0 for array size issues 156234e67057SKenneth E. Jansen END IF 156334e67057SKenneth E. Jansen 1564*da6af917SKenneth E. Jansen CALL svLS_LHS_CREATE(svLS_lhs, communicator, gnNo, nNo, 1565*da6af917SKenneth E. Jansen 2 nnz_tot, ltg, colm, rowp, svLS_nFaces) 1566*da6af917SKenneth E. Jansen 156734e67057SKenneth E. Jansen faIn = 1 156834e67057SKenneth E. Jansen facenNo = 0 156934e67057SKenneth E. Jansen DO i=1, nshg 157034e67057SKenneth E. Jansen IF (IBITS(iBC(i),3,3) .NE. 0) facenNo = facenNo + 1 157134e67057SKenneth E. Jansen END DO 157234e67057SKenneth E. Jansen ALLOCATE(gNodes(facenNo), sV(nsd,facenNo)) 157334e67057SKenneth E. Jansen sV = 0D0 157434e67057SKenneth E. Jansen j = 0 157534e67057SKenneth E. Jansen DO i=1, nshg 157634e67057SKenneth E. Jansen IF (IBITS(iBC(i),3,3) .NE. 0) THEN 157734e67057SKenneth E. Jansen j = j + 1 157834e67057SKenneth E. Jansen gNodes(j) = i 157934e67057SKenneth E. Jansen IF (.NOT.BTEST(iBC(i),3)) sV(1,j) = 1D0 158034e67057SKenneth E. Jansen IF (.NOT.BTEST(iBC(i),4)) sV(2,j) = 1D0 158134e67057SKenneth E. Jansen IF (.NOT.BTEST(iBC(i),5)) sV(3,j) = 1D0 158234e67057SKenneth E. Jansen END IF 158334e67057SKenneth E. Jansen END DO 158434e67057SKenneth E. Jansen CALL svLS_BC_CREATE(svLS_lhs, faIn, facenNo, 158534e67057SKenneth E. Jansen 2 nsd, BC_TYPE_Dir, gNodes, sV) 158634e67057SKenneth E. Jansen DEALLOCATE(gNodes) 158734e67057SKenneth E. Jansen DEALLOCATE(sV) 1588*da6af917SKenneth E. Jansen! else of ifdef svLS_1 158934e67057SKenneth E. Jansen#else 159034e67057SKenneth E. Jansen if(myrank.eq.0) write(*,*) 'your input requests svLS but your cmake did not build for it' 159134e67057SKenneth E. Jansen call error('itrdrv ','nosVLS',svLSFlag) 1592*da6af917SKenneth E. Jansen! endif of ifdef svLS_1 159334e67057SKenneth E. Jansen#endif 1594*da6af917SKenneth E. Jansen ENDIF !of svLS init. inside ifdef so we can trap above else 1595*da6af917SKenneth E. Jansen! note input_fform does not allow svLSFlag=1 AND leslib=1 so above or below only 159634e67057SKenneth E. Jansen if(leslib.eq.1) then 1597*da6af917SKenneth E. Jansen! ifdef leslib_1 : setup for leslib 159834e67057SKenneth E. Jansen#ifdef HAVE_LESLIB 159934e67057SKenneth E. Jansen!-------------------------------------------------------------------- 160034e67057SKenneth E. Jansen call myfLesNew( lesId, 41994, 160134e67057SKenneth E. Jansen & eqnType, 160234e67057SKenneth E. Jansen & nDofs, minIters, maxIters, 160334e67057SKenneth E. Jansen & Kspace, iprjFlag, nPrjs, 160434e67057SKenneth E. Jansen & ipresPrjFlag, nPresPrjs, epstol(1), 160534e67057SKenneth E. Jansen & prestol, iverbose, statsflow, 160634e67057SKenneth E. Jansen & nPermDims, nTmpDims, servername ) 1607*da6af917SKenneth E. Jansen call aSDf 160834e67057SKenneth E. Jansen call readLesRestart( lesId, aperm, nshg, myrank, lstep, 160934e67057SKenneth E. Jansen & nPermDims ) 1610*da6af917SKenneth E. Jansen! else leslib_1 161134e67057SKenneth E. Jansen#else 161234e67057SKenneth E. Jansen if(myrank.eq.0) write(*,*) 'your input requests leslib but your cmake did not build for it' 161334e67057SKenneth E. Jansen call error('itrdrv ','nolslb',leslib) 1614*da6af917SKenneth E. Jansen! endif leslib_1 161534e67057SKenneth E. Jansen#endif 161634e67057SKenneth E. Jansen endif !leslib=1 161734e67057SKenneth E. Jansen 1618*da6af917SKenneth E. Jansen else ! not solving flow at all so set it solverDims to zero 161934e67057SKenneth E. Jansen nPermDims = 0 162034e67057SKenneth E. Jansen nTmpDims = 0 162134e67057SKenneth E. Jansen endif 162234e67057SKenneth E. Jansen 1623*da6af917SKenneth E. Jansen!Above is setup for flow now we do scalar 162434e67057SKenneth E. Jansen 162534e67057SKenneth E. Jansen if(nsclrsol.gt.0) then 1626*da6af917SKenneth E. Jansen do isolsc=1,nsclrsol ! this loop sets up unique data for each scalar solved 162734e67057SKenneth E. Jansen lesId = numeqns(isolsc+1) 162834e67057SKenneth E. Jansen eqnType = 2 162934e67057SKenneth E. Jansen nDofs = 1 163034e67057SKenneth E. Jansen isclpresPrjflag = 0 163134e67057SKenneth E. Jansen nPresPrjs = 0 163234e67057SKenneth E. Jansen isclprjFlag = 1 163334e67057SKenneth E. Jansen indx=isolsc+2-nsolt ! complicated to keep epstol(2) for 163434e67057SKenneth E. Jansen ! temperature followed by scalars 1635*da6af917SKenneth E. Jansen! ifdef svLS_2 : Setting up svLS for scalar 163634e67057SKenneth E. Jansen#ifdef HAVE_SVLS 163734e67057SKenneth E. Jansen IF (svLSFlag .EQ. 1) THEN 163834e67057SKenneth E. Jansen svLSType=2 !only option for scalars 163934e67057SKenneth E. Jansen! reltol for the GMRES is the stop criterion 164034e67057SKenneth E. Jansen! also using Kspaceand maxIters from setup for ACUSIM 164134e67057SKenneth E. Jansen! 1642*da6af917SKenneth E. Jansen CALL svLS_LS_CREATE(svLS_ls_S(isolsc), svLSType, 1643*da6af917SKenneth E. Jansen 2 dimKry=Kspace, 1644*da6af917SKenneth E. Jansen 3 relTol=epstol(indx), 1645*da6af917SKenneth E. Jansen 4 maxItr=maxIters 1646*da6af917SKenneth E. Jansen 5 ) 164734e67057SKenneth E. Jansen 1648*da6af917SKenneth E. Jansen CALL svLS_COMMU_CREATE(communicator_S(isolsc), 1649*da6af917SKenneth E. Jansen 2 MPI_COMM_WORLD) 1650*da6af917SKenneth E. Jansen 1651*da6af917SKenneth E. Jansen svLS_nFaces = 1 !not sure about this...should try it with zero 1652*da6af917SKenneth E. Jansen 1653*da6af917SKenneth E. Jansen CALL svLS_LHS_CREATE(svLS_lhs_S(isolsc), 1654*da6af917SKenneth E. Jansen 2 communicator_S(isolsc), gnNo, nNo, 1655*da6af917SKenneth E. Jansen 3 nnz_tot, ltg, colm, rowp, svLS_nFaces) 1656*da6af917SKenneth E. Jansen 165734e67057SKenneth E. Jansen 165834e67057SKenneth E. Jansen faIn = 1 165934e67057SKenneth E. Jansen facenNo = 0 166034e67057SKenneth E. Jansen ib=5+isolsc 166134e67057SKenneth E. Jansen DO i=1, nshg 166234e67057SKenneth E. Jansen IF (btest(iBC(i),ib)) facenNo = facenNo + 1 166334e67057SKenneth E. Jansen END DO 166434e67057SKenneth E. Jansen ALLOCATE(gNodes(facenNo), sV(1,facenNo)) 166534e67057SKenneth E. Jansen sV = 0D0 166634e67057SKenneth E. Jansen j = 0 166734e67057SKenneth E. Jansen DO i=1, nshg 166834e67057SKenneth E. Jansen IF (btest(iBC(i),ib)) THEN 166934e67057SKenneth E. Jansen j = j + 1 167034e67057SKenneth E. Jansen gNodes(j) = i 167134e67057SKenneth E. Jansen END IF 167234e67057SKenneth E. Jansen END DO 167334e67057SKenneth E. Jansen 167434e67057SKenneth E. Jansen CALL svLS_BC_CREATE(svLS_lhs_S(isolsc), faIn, facenNo, 167534e67057SKenneth E. Jansen 2 1, BC_TYPE_Dir, gNodes, sV(1,:)) 167634e67057SKenneth E. Jansen DEALLOCATE(gNodes) 167734e67057SKenneth E. Jansen DEALLOCATE(sV) 167834e67057SKenneth E. Jansen 167934e67057SKenneth E. Jansen ENDIF !svLS handing scalar solve 168034e67057SKenneth E. Jansen#endif 168134e67057SKenneth E. Jansen 168234e67057SKenneth E. Jansen 168334e67057SKenneth E. Jansen#ifdef HAVE_LESLIB 168434e67057SKenneth E. Jansen if (leslib.eq.1) then 168534e67057SKenneth E. Jansen call myfLesNew( lesId, 41994, 168634e67057SKenneth E. Jansen & eqnType, 168734e67057SKenneth E. Jansen & nDofs, minIters, maxIters, 168834e67057SKenneth E. Jansen & Kspace, isclprjFlag, nPrjs, 168934e67057SKenneth E. Jansen & isclpresPrjFlag, nPresPrjs, epstol(indx), 169034e67057SKenneth E. Jansen & prestol, iverbose, statssclr, 169134e67057SKenneth E. Jansen & nPermDimsS, nTmpDimsS, servername ) 169234e67057SKenneth E. Jansen endif 169334e67057SKenneth E. Jansen#endif 1694*da6af917SKenneth E. Jansen enddo !loop over scalars to solve (not checked to worked out for multiple svLS solves 1695*da6af917SKenneth E. Jansen call aSDs(nsclrsol) 169634e67057SKenneth E. Jansen else !no scalar solves at all so zero dims not used 169734e67057SKenneth E. Jansen nPermDimsS = 0 169834e67057SKenneth E. Jansen nTmpDimsS = 0 169934e67057SKenneth E. Jansen endif 170034e67057SKenneth E. Jansen return 170134e67057SKenneth E. Jansen end subroutine 1702436f1a2bSCameron Smith 1703436f1a2bSCameron Smith 170434e67057SKenneth E. Jansen subroutine seticomputevort 170534e67057SKenneth E. Jansen include "common.h" 170634e67057SKenneth E. Jansen icomputevort = 0 170734e67057SKenneth E. Jansen if (ivort == 1) then ! Print vorticity = True in solver.inp 170834e67057SKenneth E. Jansen ! We then compute the vorticity only if we 170934e67057SKenneth E. Jansen ! 1) we write an intermediate checkpoint 171034e67057SKenneth E. Jansen ! 2) we reach the last time step and write the last checkpoint 171134e67057SKenneth E. Jansen ! 3) we accumulate statistics in ybar for every time step 171234e67057SKenneth E. Jansen ! BEWARE: we need here lstep+1 and istep+1 because the lstep and 171334e67057SKenneth E. Jansen ! istep gets incremened after the flowsolve, further below 171434e67057SKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep+1, ntout) .eq. 0)) .or. 171534e67057SKenneth E. Jansen & istep+1.eq.nstep(itseq) .or. ioybar == 1) then 171634e67057SKenneth E. Jansen icomputevort = 1 171734e67057SKenneth E. Jansen endif 171834e67057SKenneth E. Jansen endif 171934e67057SKenneth E. Jansen 172034e67057SKenneth E. Jansen! write(*,*) 'icomputevort: ',icomputevort, ' - istep: ', 172134e67057SKenneth E. Jansen! & istep,' - nstep(itseq):',nstep(itseq),'- lstep:', 172234e67057SKenneth E. Jansen! & lstep, '- ntout:', ntout 172334e67057SKenneth E. Jansen return 172434e67057SKenneth E. Jansen end subroutine 172534e67057SKenneth E. Jansen 172653c9b1fcSKenneth E. Jansen subroutine computeVort( vorticity, GradV,strain) 172753c9b1fcSKenneth E. Jansen include "common.h" 172853c9b1fcSKenneth E. Jansen 172953c9b1fcSKenneth E. Jansen real*8 gradV(nshg,nsdsq), strain(nshg,6), vorticity(nshg,5) 173034e67057SKenneth E. Jansen 173134e67057SKenneth E. Jansen ! vorticity components and magnitude 173234e67057SKenneth E. Jansen vorticity(:,1) = GradV(:,8)-GradV(:,6) !omega_x 173334e67057SKenneth E. Jansen vorticity(:,2) = GradV(:,3)-GradV(:,7) !omega_y 173434e67057SKenneth E. Jansen vorticity(:,3) = GradV(:,4)-GradV(:,2) !omega_z 173534e67057SKenneth E. Jansen vorticity(:,4) = sqrt( vorticity(:,1)*vorticity(:,1) 173634e67057SKenneth E. Jansen & + vorticity(:,2)*vorticity(:,2) 173734e67057SKenneth E. Jansen & + vorticity(:,3)*vorticity(:,3) ) 173834e67057SKenneth E. Jansen ! Q 173934e67057SKenneth E. Jansen strain(:,1) = GradV(:,1) !S11 174034e67057SKenneth E. Jansen strain(:,2) = 0.5*(GradV(:,2)+GradV(:,4)) !S12 174134e67057SKenneth E. Jansen strain(:,3) = 0.5*(GradV(:,3)+GradV(:,7)) !S13 174234e67057SKenneth E. Jansen strain(:,4) = GradV(:,5) !S22 174334e67057SKenneth E. Jansen strain(:,5) = 0.5*(GradV(:,6)+GradV(:,8)) !S23 174434e67057SKenneth E. Jansen strain(:,6) = GradV(:,9) !S33 174534e67057SKenneth E. Jansen 174634e67057SKenneth E. Jansen vorticity(:,5) = 0.25*( vorticity(:,4)*vorticity(:,4) !Q 174734e67057SKenneth E. Jansen & - 2.0*( strain(:,1)*strain(:,1) 174834e67057SKenneth E. Jansen & + 2* strain(:,2)*strain(:,2) 174934e67057SKenneth E. Jansen & + 2* strain(:,3)*strain(:,3) 175034e67057SKenneth E. Jansen & + strain(:,4)*strain(:,4) 175134e67057SKenneth E. Jansen & + 2* strain(:,5)*strain(:,5) 175234e67057SKenneth E. Jansen & + strain(:,6)*strain(:,6))) 175334e67057SKenneth E. Jansen 175434e67057SKenneth E. Jansen return 175534e67057SKenneth E. Jansen end subroutine 175634e67057SKenneth E. Jansen 175734e67057SKenneth E. Jansen subroutine dumpTimeSeries() 175834e67057SKenneth E. Jansen use timedata !allows collection of time series 175934e67057SKenneth E. Jansen include "common.h" 17603beb3aadSMichel Rasquin include "mpif.h" 176153c9b1fcSKenneth E. Jansen character*60 fvarts 176253c9b1fcSKenneth E. Jansen character*10 cname2 176334e67057SKenneth E. Jansen 176434e67057SKenneth E. Jansen 176534e67057SKenneth E. Jansen if (numpe > 1) then 176634e67057SKenneth E. Jansen do jj = 1, ntspts 176734e67057SKenneth E. Jansen vartssoln((jj-1)*ndof+1:jj*ndof)=varts(jj,:) 176834e67057SKenneth E. Jansen ivarts=zero 176934e67057SKenneth E. Jansen enddo 177034e67057SKenneth E. Jansen do k=1,ndof*ntspts 177134e67057SKenneth E. Jansen if(vartssoln(k).ne.zero) ivarts(k)=1 177234e67057SKenneth E. Jansen enddo 177334e67057SKenneth E. Jansen 177434e67057SKenneth E. Jansen! call MPI_REDUCE(vartssoln, vartssolng, ndof*ntspts, 177534e67057SKenneth E. Jansen! & MPI_DOUBLE_PRECISION, MPI_SUM, master, 177634e67057SKenneth E. Jansen! & MPI_COMM_WORLD, ierr) 177734e67057SKenneth E. Jansen 177834e67057SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 177934e67057SKenneth E. Jansen call MPI_ALLREDUCE(vartssoln, vartssolng, 178034e67057SKenneth E. Jansen & ndof*ntspts, 178134e67057SKenneth E. Jansen & MPI_DOUBLE_PRECISION, MPI_SUM, 178234e67057SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 178334e67057SKenneth E. Jansen 178434e67057SKenneth E. Jansen! call MPI_REDUCE(ivarts, ivartsg, ndof*ntspts, 178534e67057SKenneth E. Jansen! & MPI_INTEGER, MPI_SUM, master, 178634e67057SKenneth E. Jansen! & MPI_COMM_WORLD, ierr) 178734e67057SKenneth E. Jansen 178834e67057SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 178934e67057SKenneth E. Jansen call MPI_ALLREDUCE(ivarts, ivartsg, ndof*ntspts, 179034e67057SKenneth E. Jansen & MPI_INTEGER, MPI_SUM, 179134e67057SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 179234e67057SKenneth E. Jansen 179334e67057SKenneth E. Jansen! if (myrank.eq.zero) then 179434e67057SKenneth E. Jansen do jj = 1, ntspts 179534e67057SKenneth E. Jansen 179634e67057SKenneth E. Jansen if(myrank .eq. iv_rank(jj)) then 179734e67057SKenneth E. Jansen ! No need to update all varts components, only the one treated by the expected rank 179834e67057SKenneth E. Jansen ! Note: keep varts as a vector, as multiple probes could be treated by one rank 179934e67057SKenneth E. Jansen indxvarts = (jj-1)*ndof 180034e67057SKenneth E. Jansen do k=1,ndof 180134e67057SKenneth E. Jansen if(ivartsg(indxvarts+k).ne.0) then ! none of the vartssoln(parts) were non zero 180234e67057SKenneth E. Jansen varts(jj,k)=vartssolng(indxvarts+k)/ 180334e67057SKenneth E. Jansen & ivartsg(indxvarts+k) 180434e67057SKenneth E. Jansen endif 180534e67057SKenneth E. Jansen enddo 180634e67057SKenneth E. Jansen endif !only if myrank eq iv_rank(jj) 180734e67057SKenneth E. Jansen enddo 180834e67057SKenneth E. Jansen! endif !only on master 180934e67057SKenneth E. Jansen endif !only if numpe > 1 181034e67057SKenneth E. Jansen 181134e67057SKenneth E. Jansen! if (myrank.eq.zero) then 181234e67057SKenneth E. Jansen do jj = 1, ntspts 181334e67057SKenneth E. Jansen if(myrank .eq. iv_rank(jj)) then 181434e67057SKenneth E. Jansen ifile = 1000+jj 181534e67057SKenneth E. Jansen write(ifile,555) lstep, (varts(jj,k),k=1,ndof) !Beware of format 555 - check ndof 181634e67057SKenneth E. Jansenc call flush(ifile) 181734e67057SKenneth E. Jansen if (((irs .ge. 1) .and. 181834e67057SKenneth E. Jansen & (mod(lstep, ntout) .eq. 0))) then 181934e67057SKenneth E. Jansen close(ifile) 182034e67057SKenneth E. Jansen fvarts='varts/varts' 182134e67057SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(jj)) 182234e67057SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(lskeep)) 182334e67057SKenneth E. Jansen fvarts=trim(fvarts)//'.dat' 182434e67057SKenneth E. Jansen fvarts=trim(fvarts) 182534e67057SKenneth E. Jansen open(unit=ifile, file=fvarts, 182634e67057SKenneth E. Jansen & position='append') 182734e67057SKenneth E. Jansen endif !only when dumping restart 182834e67057SKenneth E. Jansen endif 182934e67057SKenneth E. Jansen enddo 183034e67057SKenneth E. Jansen! endif !only on master 183134e67057SKenneth E. Jansen 183234e67057SKenneth E. Jansen varts(:,:) = zero ! reset the array for next step 183334e67057SKenneth E. Jansen 183434e67057SKenneth E. Jansen 183534e67057SKenneth E. Jansen!555 format(i6,5(2x,E12.5e2)) 183634e67057SKenneth E. Jansen555 format(i6,6(2x,E20.12e2)) !assuming ndof = 6 here 183734e67057SKenneth E. Jansen 183834e67057SKenneth E. Jansen return 183934e67057SKenneth E. Jansen end subroutine 184034e67057SKenneth E. Jansen 184134e67057SKenneth E. Jansen subroutine collectErrorYbar(ybar,yold,wallssVec,wallssVecBar, 184253c9b1fcSKenneth E. Jansen & vorticity,yphbar,rerr,irank2ybar,irank2yphbar) 184334e67057SKenneth E. Jansen include "common.h" 184453c9b1fcSKenneth E. Jansen real*8 ybar(nshg,irank2yphbar),yold(nshg,ndof),vorticity(nshg,5) 184553c9b1fcSKenneth E. Jansen real*8 yphbar(nshg,irank2yphbar,nphasesincycle) 184653c9b1fcSKenneth E. Jansen real*8 wallssvec(nshg,3),wallssVecBar(nshg,3), rerr(nshg,numerr) 184734e67057SKenneth E. Jansenc$$$c 184834e67057SKenneth E. Jansenc$$$c compute average 184934e67057SKenneth E. Jansenc$$$c 185034e67057SKenneth E. Jansenc$$$ tfact=one/istep 185134e67057SKenneth E. Jansenc$$$ ybar =tfact*yold + (one-tfact)*ybar 185234e67057SKenneth E. Jansen 185334e67057SKenneth E. Jansenc compute average 185434e67057SKenneth E. Jansenc ybar(:,1:3) are average velocity components 185534e67057SKenneth E. Jansenc ybar(:,4) is average pressure 185634e67057SKenneth E. Jansenc ybar(:,5) is average speed 185734e67057SKenneth E. Jansenc ybar(:,6:8) is average of sq. of each vel. component 185834e67057SKenneth E. Jansenc ybar(:,9) is average of sq. of pressure 185934e67057SKenneth E. Jansenc ybar(:,10:12) is average of cross vel. components : uv, uw and vw 186034e67057SKenneth E. Jansenc averaging procedure justified only for identical time step sizes 186134e67057SKenneth E. Jansenc ybar(:,13) is average of eddy viscosity 186234e67057SKenneth E. Jansenc ybar(:,14:16) is average vorticity components 186334e67057SKenneth E. Jansenc ybar(:,17) is average vorticity magnitude 186434e67057SKenneth E. Jansenc istep is number of time step 186534e67057SKenneth E. Jansenc 186634e67057SKenneth E. Jansen icollectybar = 0 186734e67057SKenneth E. Jansen if(nphasesincycle.eq.0 .or. 186834e67057SKenneth E. Jansen & istep.gt.ncycles_startphaseavg*nstepsincycle) then 186934e67057SKenneth E. Jansen icollectybar = 1 187034e67057SKenneth E. Jansen if((istep-1).eq.ncycles_startphaseavg*nstepsincycle) 187134e67057SKenneth E. Jansen & istepsinybar = 0 ! init. to zero in first cycle in avg. 187234e67057SKenneth E. Jansen endif 187334e67057SKenneth E. Jansen 187434e67057SKenneth E. Jansen if(icollectybar.eq.1) then 187534e67057SKenneth E. Jansen istepsinybar = istepsinybar+1 187634e67057SKenneth E. Jansen tfact=one/istepsinybar 187734e67057SKenneth E. Jansen 187834e67057SKenneth E. Jansen! if(myrank.eq.master .and. nphasesincycle.ne.0 .and. 187934e67057SKenneth E. Jansen! & mod((istep-1),nstepsincycle).eq.0) 188034e67057SKenneth E. Jansen! & write(*,*)'nsamples in phase average:',istepsinybar 188134e67057SKenneth E. Jansen 188234e67057SKenneth E. Jansenc ybar to contain the averaged ((u,v,w),p)-fields 188334e67057SKenneth E. Jansenc and speed average, i.e., sqrt(u^2+v^2+w^2) 188434e67057SKenneth E. Jansenc and avg. of sq. terms including 188534e67057SKenneth E. Jansenc u^2, v^2, w^2, p^2 and cross terms of uv, uw and vw 188634e67057SKenneth E. Jansen 188734e67057SKenneth E. Jansen ybar(:,1) = tfact*yold(:,1) + (one-tfact)*ybar(:,1) 188834e67057SKenneth E. Jansen ybar(:,2) = tfact*yold(:,2) + (one-tfact)*ybar(:,2) 188934e67057SKenneth E. Jansen ybar(:,3) = tfact*yold(:,3) + (one-tfact)*ybar(:,3) 189034e67057SKenneth E. Jansen ybar(:,4) = tfact*yold(:,4) + (one-tfact)*ybar(:,4) 189134e67057SKenneth E. Jansen ybar(:,5) = tfact*sqrt(yold(:,1)**2+yold(:,2)**2+ 189234e67057SKenneth E. Jansen & yold(:,3)**2) + (one-tfact)*ybar(:,5) 189334e67057SKenneth E. Jansen ybar(:,6) = tfact*yold(:,1)**2 + 189434e67057SKenneth E. Jansen & (one-tfact)*ybar(:,6) 189534e67057SKenneth E. Jansen ybar(:,7) = tfact*yold(:,2)**2 + 189634e67057SKenneth E. Jansen & (one-tfact)*ybar(:,7) 189734e67057SKenneth E. Jansen ybar(:,8) = tfact*yold(:,3)**2 + 189834e67057SKenneth E. Jansen & (one-tfact)*ybar(:,8) 189934e67057SKenneth E. Jansen ybar(:,9) = tfact*yold(:,4)**2 + 190034e67057SKenneth E. Jansen & (one-tfact)*ybar(:,9) 190134e67057SKenneth E. Jansen ybar(:,10) = tfact*yold(:,1)*yold(:,2) + !uv 190234e67057SKenneth E. Jansen & (one-tfact)*ybar(:,10) 190334e67057SKenneth E. Jansen ybar(:,11) = tfact*yold(:,1)*yold(:,3) + !uw 190434e67057SKenneth E. Jansen & (one-tfact)*ybar(:,11) 190534e67057SKenneth E. Jansen ybar(:,12) = tfact*yold(:,2)*yold(:,3) + !vw 190634e67057SKenneth E. Jansen & (one-tfact)*ybar(:,12) 190734e67057SKenneth E. Jansen if(nsclr.gt.0) !nut 190834e67057SKenneth E. Jansen & ybar(:,13) = tfact*yold(:,6) + (one-tfact)*ybar(:,13) 190934e67057SKenneth E. Jansen 191034e67057SKenneth E. Jansen if(ivort == 1) then !vorticity 191134e67057SKenneth E. Jansen ybar(:,14) = tfact*vorticity(:,1) + 191234e67057SKenneth E. Jansen & (one-tfact)*ybar(:,14) 191334e67057SKenneth E. Jansen ybar(:,15) = tfact*vorticity(:,2) + 191434e67057SKenneth E. Jansen & (one-tfact)*ybar(:,15) 191534e67057SKenneth E. Jansen ybar(:,16) = tfact*vorticity(:,3) + 191634e67057SKenneth E. Jansen & (one-tfact)*ybar(:,16) 191734e67057SKenneth E. Jansen ybar(:,17) = tfact*vorticity(:,4) + 191834e67057SKenneth E. Jansen & (one-tfact)*ybar(:,17) 191934e67057SKenneth E. Jansen endif 192034e67057SKenneth E. Jansen 192134e67057SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 192234e67057SKenneth E. Jansen wallssVecBar(:,1) = tfact*wallssVec(:,1) 192334e67057SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,1) 192434e67057SKenneth E. Jansen wallssVecBar(:,2) = tfact*wallssVec(:,2) 192534e67057SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,2) 192634e67057SKenneth E. Jansen wallssVecBar(:,3) = tfact*wallssVec(:,3) 192734e67057SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,3) 192834e67057SKenneth E. Jansen endif 192934e67057SKenneth E. Jansen endif !icollectybar.eq.1 193034e67057SKenneth E. Jansenc 193134e67057SKenneth E. Jansenc compute phase average 193234e67057SKenneth E. Jansenc 193334e67057SKenneth E. Jansen if(nphasesincycle.ne.0 .and. 193434e67057SKenneth E. Jansen & istep.gt.ncycles_startphaseavg*nstepsincycle) then 193534e67057SKenneth E. Jansen 193634e67057SKenneth E. Jansenc beginning of cycle is considered as ncycles_startphaseavg*nstepsincycle+1 193734e67057SKenneth E. Jansen if((istep-1).eq.ncycles_startphaseavg*nstepsincycle) 193834e67057SKenneth E. Jansen & icyclesinavg = 0 ! init. to zero in first cycle in avg. 193934e67057SKenneth E. Jansen 194034e67057SKenneth E. Jansen ! find number of steps between phases 194134e67057SKenneth E. Jansen nstepsbtwphase = nstepsincycle/nphasesincycle ! integer value 194234e67057SKenneth E. Jansen if(mod(istep-1,nstepsincycle).eq.0) then 194334e67057SKenneth E. Jansen iphase = 1 ! init. to one in beginning of every cycle 194434e67057SKenneth E. Jansen icyclesinavg = icyclesinavg + 1 194534e67057SKenneth E. Jansen endif 194634e67057SKenneth E. Jansen 194734e67057SKenneth E. Jansen icollectphase = 0 194834e67057SKenneth E. Jansen istepincycle = mod(istep,nstepsincycle) 194934e67057SKenneth E. Jansen if(istepincycle.eq.0) istepincycle=nstepsincycle 195034e67057SKenneth E. Jansen if(istepincycle.eq.iphase*nstepsbtwphase) then 195134e67057SKenneth E. Jansen icollectphase = 1 195234e67057SKenneth E. Jansen iphase = iphase+1 ! use 'iphase-1' below 195334e67057SKenneth E. Jansen endif 195434e67057SKenneth E. Jansen 195534e67057SKenneth E. Jansen if(icollectphase.eq.1) then 195634e67057SKenneth E. Jansen tfactphase = one/icyclesinavg 195734e67057SKenneth E. Jansen 195834e67057SKenneth E. Jansen if(myrank.eq.master) then 195934e67057SKenneth E. Jansen write(*,*) 'nsamples in phase ',iphase-1,': ', 196034e67057SKenneth E. Jansen & icyclesinavg 196134e67057SKenneth E. Jansen endif 196234e67057SKenneth E. Jansen 196334e67057SKenneth E. Jansen yphbar(:,1,iphase-1) = tfactphase*yold(:,1) + 196434e67057SKenneth E. Jansen & (one-tfactphase)*yphbar(:,1,iphase-1) 196534e67057SKenneth E. Jansen yphbar(:,2,iphase-1) = tfactphase*yold(:,2) + 196634e67057SKenneth E. Jansen & (one-tfactphase)*yphbar(:,2,iphase-1) 196734e67057SKenneth E. Jansen yphbar(:,3,iphase-1) = tfactphase*yold(:,3) + 196834e67057SKenneth E. Jansen & (one-tfactphase)*yphbar(:,3,iphase-1) 196934e67057SKenneth E. Jansen yphbar(:,4,iphase-1) = tfactphase*yold(:,4) + 197034e67057SKenneth E. Jansen & (one-tfactphase)*yphbar(:,4,iphase-1) 197134e67057SKenneth E. Jansen yphbar(:,5,iphase-1) = tfactphase*sqrt(yold(:,1)**2 197234e67057SKenneth E. Jansen & +yold(:,2)**2+yold(:,3)**2) + 197334e67057SKenneth E. Jansen & (one-tfactphase)*yphbar(:,5,iphase-1) 197434e67057SKenneth E. Jansen yphbar(:,6,iphase-1) = 197534e67057SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,1) 197634e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,6,iphase-1) 197734e67057SKenneth E. Jansen 197834e67057SKenneth E. Jansen yphbar(:,7,iphase-1) = 197934e67057SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,2) 198034e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,7,iphase-1) 198134e67057SKenneth E. Jansen 198234e67057SKenneth E. Jansen yphbar(:,8,iphase-1) = 198334e67057SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,3) 198434e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,8,iphase-1) 198534e67057SKenneth E. Jansen 198634e67057SKenneth E. Jansen yphbar(:,9,iphase-1) = 198734e67057SKenneth E. Jansen & tfactphase*yold(:,2)*yold(:,2) 198834e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,9,iphase-1) 198934e67057SKenneth E. Jansen 199034e67057SKenneth E. Jansen yphbar(:,10,iphase-1) = 199134e67057SKenneth E. Jansen & tfactphase*yold(:,2)*yold(:,3) 199234e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,10,iphase-1) 199334e67057SKenneth E. Jansen 199434e67057SKenneth E. Jansen yphbar(:,11,iphase-1) = 199534e67057SKenneth E. Jansen & tfactphase*yold(:,3)*yold(:,3) 199634e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,11,iphase-1) 199734e67057SKenneth E. Jansen 199834e67057SKenneth E. Jansen if(ivort == 1) then 199934e67057SKenneth E. Jansen yphbar(:,12,iphase-1) = 200034e67057SKenneth E. Jansen & tfactphase*vorticity(:,1) 200134e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,12,iphase-1) 200234e67057SKenneth E. Jansen yphbar(:,13,iphase-1) = 200334e67057SKenneth E. Jansen & tfactphase*vorticity(:,2) 200434e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,13,iphase-1) 200534e67057SKenneth E. Jansen yphbar(:,14,iphase-1) = 200634e67057SKenneth E. Jansen & tfactphase*vorticity(:,3) 200734e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,14,iphase-1) 200834e67057SKenneth E. Jansen yphbar(:,15,iphase-1) = 200934e67057SKenneth E. Jansen & tfactphase*vorticity(:,4) 201034e67057SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,15,iphase-1) 201134e67057SKenneth E. Jansen endif 201234e67057SKenneth E. Jansen endif !compute phase average 201334e67057SKenneth E. Jansen endif !if(nphasesincycle.eq.0 .or. istep.gt.ncycles_startphaseavg*nstepsincycle) 201434e67057SKenneth E. Jansenc 201534e67057SKenneth E. Jansenc compute rms 201634e67057SKenneth E. Jansenc 201734e67057SKenneth E. Jansen if(icollectybar.eq.1) then 201834e67057SKenneth E. Jansen rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2 201934e67057SKenneth E. Jansen rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2 202034e67057SKenneth E. Jansen rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2 202134e67057SKenneth E. Jansen rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2 202234e67057SKenneth E. Jansen endif 202334e67057SKenneth E. Jansen return 202434e67057SKenneth E. Jansen end subroutine 202534e67057SKenneth E. Jansen 2026