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