xref: /phasta/phSolver/incompressible/itrdrv.f (revision 3beb3aadcae08c85d2c384662bab8f5663fa8443)
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
59939bc1351SMichel Rasquin            if (exts) then
60039bc1351SMichel Rasquin              ! Note: freq is only defined if exts is true,
60139bc1351SMichel Rasquin              ! i.e. if xyzts.dat is present in the #-procs_case
60239bc1351SMichel Rasquin              if ( mod(lstep-1,freq).eq.0) call dumpTimeSeries()
60339bc1351SMichel Rasquin            endif
60459599516SKenneth E. Jansen
60559599516SKenneth E. Jansen            if((irscale.ge.0).or.(itwmod.gt.0))
60659599516SKenneth E. Jansen     &           call getvel (yold,     ilwork, iBC,
60759599516SKenneth E. Jansen     &                        nsons,    ifath, velbar)
60859599516SKenneth E. Jansen
60959599516SKenneth E. Jansen            if((irscale.ge.0).and.(myrank.eq.master)) then
61059599516SKenneth E. Jansen               call genscale(yold,       x,       iper,
61159599516SKenneth E. Jansen     &                       iBC,     ifath,   velbar,
61259599516SKenneth E. Jansen     &                       nsons)
61359599516SKenneth E. Jansen            endif
61459599516SKenneth E. Jansenc
61559599516SKenneth E. Jansenc....  print out results.
61659599516SKenneth E. Jansenc
61759599516SKenneth E. Jansen            ntoutv=max(ntout,100)   ! velb is not needed so often
61859599516SKenneth E. Jansen            if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then
61959599516SKenneth E. Jansen               if( (mod(lstep, ntoutv) .eq. 0) .and.
62059599516SKenneth E. Jansen     &              ((irscale.ge.0).or.(itwmod.gt.0) .or.
62159599516SKenneth E. Jansen     &              ((nsonmax.eq.1).and.(iLES.gt.0))))
62259599516SKenneth E. Jansen     &              call rwvelb  ('out ',  velbar  ,ifail)
62359599516SKenneth E. Jansen            endif
62459599516SKenneth E. Jansenc
62559599516SKenneth E. Jansenc.... end of the NSTEP and NTSEQ loops
62659599516SKenneth E. Jansenc
62759599516SKenneth E. Jansen
62859599516SKenneth E. Jansen
62959599516SKenneth E. Jansenc
63059599516SKenneth E. Jansenc.... -------------------> error calculation  <-----------------
63159599516SKenneth E. Jansenc
63234e67057SKenneth E. Jansen            if(ierrcalc.eq.1 .or. ioybar.eq.1)
63334e67057SKenneth E. Jansen     &       call collectErrorYbar(ybar,yold,wallssVec,wallssVecBar,
63453c9b1fcSKenneth E. Jansen     &               vorticity,yphbar,rerr,irank2ybar,irank2yphbar)
635c89b8efeSKenneth E. Jansen 2003       continue ! we get here if stopjob equals lstep and this jumped over
636c89b8efeSKenneth E. Jansen!           the statistics computation because we have no new data to average in
637c89b8efeSKenneth E. Jansen!           rather we are just trying to output the last state that was not already
638c89b8efeSKenneth E. Jansen!           written
639c89b8efeSKenneth E. Jansenc
640c89b8efeSKenneth E. Jansenc.... ---------------------->  Complete Restart  Processing  <----------------------
641c89b8efeSKenneth E. Jansenc
642c89b8efeSKenneth E. Jansen!   for now it is the same frequency but need to change this
643c89b8efeSKenneth E. Jansen!   soon.... but don't forget to change the field counter in
644c89b8efeSKenneth E. Jansen!  new_interface.cc
645c89b8efeSKenneth E. Jansen!
646c89b8efeSKenneth E. Jansen        if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or.
647c89b8efeSKenneth E. Jansen     &      istep.eq.nstep(itseq)) then
64859599516SKenneth E. Jansen
649c89b8efeSKenneth E. Jansen          lesId   = numeqns(1)
650c89b8efeSKenneth E. Jansen          if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
651c89b8efeSKenneth E. Jansen          if(myrank.eq.0)  then
652c89b8efeSKenneth E. Jansen            tcormr1 = TMRC()
653c89b8efeSKenneth E. Jansen          endif
654efb88323SKenneth E. Jansen          if((nsolflow.eq.1).and.(ipresPrjFlag.eq.1)) then
65579f1763eSKenneth E. Jansen#ifdef HAVE_LESLIB
656c89b8efeSKenneth E. Jansen           call saveLesRestart( lesId,  aperm , nshg, myrank, lstep,
657c89b8efeSKenneth E. Jansen     &                    nPermDims )
658c89b8efeSKenneth E. Jansen          if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
659c89b8efeSKenneth E. Jansen          if(myrank.eq.0)  then
660c89b8efeSKenneth E. Jansen            tcormr2 = TMRC()
661c89b8efeSKenneth E. Jansen            write(6,*) 'call saveLesRestart for projection and'//
662c89b8efeSKenneth E. Jansen     &           'pressure projection vectors', tcormr2-tcormr1
663c89b8efeSKenneth E. Jansen          endif
66479f1763eSKenneth E. Jansen#endif
665c9a96f21SKenneth E. Jansen          endif
666c89b8efeSKenneth E. Jansen
667c89b8efeSKenneth E. Jansen          if(ierrcalc.eq.1) then
668c89b8efeSKenneth E. Jansenc
669c89b8efeSKenneth E. Jansenc.....smooth the error indicators
670c89b8efeSKenneth E. Jansenc
671c89b8efeSKenneth E. Jansen            do i=1,ierrsmooth
672c89b8efeSKenneth E. Jansen              call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC )
673c89b8efeSKenneth E. Jansen            end do
674c89b8efeSKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
675c89b8efeSKenneth E. Jansen            if(myrank.eq.0)  then
676c89b8efeSKenneth E. Jansen              tcormr1 = TMRC()
677c89b8efeSKenneth E. Jansen            endif
678c89b8efeSKenneth E. Jansen            call write_error(myrank, lstep, nshg, 10, rerr )
679c89b8efeSKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
680c89b8efeSKenneth E. Jansen            if(myrank.eq.0)  then
681c89b8efeSKenneth E. Jansen              tcormr2 = TMRC()
682c89b8efeSKenneth E. Jansen              write(6,*) 'Time to write the error fields to the disks',
683c89b8efeSKenneth E. Jansen     &            tcormr2-tcormr1
684c89b8efeSKenneth E. Jansen            endif
685c89b8efeSKenneth E. Jansen          endif ! ierrcalc
686c89b8efeSKenneth E. Jansen
687c89b8efeSKenneth E. Jansen          if(ioybar.eq.1) then
688c89b8efeSKenneth E. Jansen            if(ivort == 1) then
689c89b8efeSKenneth E. Jansen              call write_field(myrank,'a','ybar',4,
690c89b8efeSKenneth E. Jansen     &                  ybar,'d',nshg,17,lstep)
691c89b8efeSKenneth E. Jansen            else
692c89b8efeSKenneth E. Jansen              call write_field(myrank,'a','ybar',4,
693c89b8efeSKenneth E. Jansen     &                ybar,'d',nshg,13,lstep)
694c89b8efeSKenneth E. Jansen            endif
695c89b8efeSKenneth E. Jansen
696c89b8efeSKenneth E. Jansen            if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
697c89b8efeSKenneth E. Jansen              call write_field(myrank,'a','wssbar',6,
698c89b8efeSKenneth E. Jansen     &             wallssVecBar,'d',nshg,3,lstep)
699c89b8efeSKenneth E. Jansen            endif
700c89b8efeSKenneth E. Jansen
701c89b8efeSKenneth E. Jansen            if(nphasesincycle .gt. 0) then
702c89b8efeSKenneth E. Jansen              if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
703c89b8efeSKenneth E. Jansen              if(myrank.eq.0)  then
704c89b8efeSKenneth E. Jansen                tcormr1 = TMRC()
705c89b8efeSKenneth E. Jansen              endif
706c89b8efeSKenneth E. Jansen              do iphase=1,nphasesincycle
707c89b8efeSKenneth E. Jansen                if(ivort == 1) then
708c89b8efeSKenneth E. Jansen                 call write_phavg2(myrank,'a','phase_average',13,iphase,
709c89b8efeSKenneth E. Jansen     &              nphasesincycle,yphbar(:,:,iphase),'d',nshg,15,lstep)
710c89b8efeSKenneth E. Jansen                else
711c89b8efeSKenneth E. Jansen                 call write_phavg2(myrank,'a','phase_average',13,iphase,
712c89b8efeSKenneth E. Jansen     &              nphasesincycle,yphbar(:,:,iphase),'d',nshg,11,lstep)
713c89b8efeSKenneth E. Jansen                endif
714c89b8efeSKenneth E. Jansen              end do
715c89b8efeSKenneth E. Jansen              if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
716c89b8efeSKenneth E. Jansen              if(myrank.eq.0)  then
717c89b8efeSKenneth E. Jansen                tcormr2 = TMRC()
718c89b8efeSKenneth E. Jansen                write(6,*) 'write all phase avg to the disks = ',
719c89b8efeSKenneth E. Jansen     &                tcormr2-tcormr1
720c89b8efeSKenneth E. Jansen              endif
721c89b8efeSKenneth E. Jansen            endif !nphasesincyle
722c89b8efeSKenneth E. Jansen          endif !ioybar
723c89b8efeSKenneth E. Jansen
724c89b8efeSKenneth E. Jansen          if(iRANS.lt.0) then
725c89b8efeSKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
726c89b8efeSKenneth E. Jansen            if(myrank.eq.0)  then
727c89b8efeSKenneth E. Jansen              tcormr1 = TMRC()
728c89b8efeSKenneth E. Jansen            endif
729c89b8efeSKenneth E. Jansen            call write_field(myrank,'a','dwal',4,d2wall,'d',
730c89b8efeSKenneth E. Jansen     &                       nshg,1,lstep)
731c89b8efeSKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
732c89b8efeSKenneth E. Jansen            if(myrank.eq.0)  then
733c89b8efeSKenneth E. Jansen              tcormr2 = TMRC()
734c89b8efeSKenneth E. Jansen              write(6,*) 'Time to write dwal to the disks = ',
735c89b8efeSKenneth E. Jansen     &        tcormr2-tcormr1
736c89b8efeSKenneth E. Jansen            endif
737c89b8efeSKenneth E. Jansen          endif !iRANS
738c89b8efeSKenneth E. Jansen
739c89b8efeSKenneth E. Jansen        endif ! write out complete restart state
740c89b8efeSKenneth E. Jansen        !next 2 lines are two ways to end early
741c89b8efeSKenneth E. Jansen        if(stopjob.eq.-2) goto 2002
742c89b8efeSKenneth E. Jansen        if(istop.eq.1000) goto 2002 ! stop when delta small (see rstatic)
74359599516SKenneth E. Jansen 2000 continue
744c89b8efeSKenneth E. Jansen 2002 continue
745c89b8efeSKenneth E. Jansen
746c89b8efeSKenneth E. Jansen! done with time stepping so deallocate fields already written
747c89b8efeSKenneth E. Jansen!
74834e67057SKenneth E. Jansen
749c89b8efeSKenneth E. Jansen          if(ioybar.eq.1) then
750c89b8efeSKenneth E. Jansen            deallocate(ybar)
751c89b8efeSKenneth E. Jansen            if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
752c89b8efeSKenneth E. Jansen              deallocate(wallssVecbar)
753c89b8efeSKenneth E. Jansen            endif
754c89b8efeSKenneth E. Jansen            if(nphasesincycle .gt. 0) then
755c89b8efeSKenneth E. Jansen              deallocate(yphbar)
756c89b8efeSKenneth E. Jansen            endif !nphasesincyle
757c89b8efeSKenneth E. Jansen          endif !ioybar
758c89b8efeSKenneth E. Jansen          if(ivort == 1) then
759c89b8efeSKenneth E. Jansen            deallocate(strain,vorticity)
760c89b8efeSKenneth E. Jansen          endif
761c89b8efeSKenneth E. Jansen          if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
762c89b8efeSKenneth E. Jansen            deallocate(wallssVec)
763c89b8efeSKenneth E. Jansen          endif
764c89b8efeSKenneth E. Jansen          if(iRANS.lt.0) then
765c89b8efeSKenneth E. Jansen            deallocate(d2wall)
766c89b8efeSKenneth E. Jansen          endif
76759599516SKenneth E. Jansen
76859599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
76959599516SKenneth E. Jansen         if(myrank.eq.0)  then
77059599516SKenneth E. Jansen            tcorecp2 = TMRC()
77159599516SKenneth E. Jansen             write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1
77259599516SKenneth E. Jansen             write(6,*) '(Elm. form.',tcorecp(1),
77359599516SKenneth E. Jansen     &                    ',Lin. alg. sol.',tcorecp(2),')'
77459599516SKenneth E. Jansen             write(6,*) '(Elm. form. Scal.',tcorecpscal(1),
77559599516SKenneth E. Jansen     &                   ',Lin. alg. sol. Scal.',tcorecpscal(2),')'
77659599516SKenneth E. Jansen             write(6,*) ''
77759599516SKenneth E. Jansen
77859599516SKenneth E. Jansen         endif
77959599516SKenneth E. Jansen
78059599516SKenneth E. Jansen         call print_system_stats(tcorecp, tcorecpscal)
78159599516SKenneth E. Jansen         call print_mesh_stats()
78259599516SKenneth E. Jansen         call print_mpi_stats()
78359599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
78459599516SKenneth E. Jansen!         return
78559599516SKenneth E. Jansenc         call MPI_Finalize()
78659599516SKenneth E. Jansenc         call MPI_ABORT(MPI_COMM_WORLD, ierr)
78759599516SKenneth E. Jansen
78875f1c48cSCameron Smith         call destroyWallData
78992e15685SCameron Smith         call destroyfncorp
79075f1c48cSCameron Smith
79159599516SKenneth E. Jansen 3000 continue
79259599516SKenneth E. Jansen
79359599516SKenneth E. Jansen
79459599516SKenneth E. Jansenc
79559599516SKenneth E. Jansenc.... close history and aerodynamic forces files
79659599516SKenneth E. Jansenc
79759599516SKenneth E. Jansen      if (myrank .eq. master) then
79859599516SKenneth E. Jansen!         close (ihist)
79959599516SKenneth E. Jansen         close (iforce)
80059599516SKenneth E. Jansen         close(76)
80159599516SKenneth E. Jansen         if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then
80259599516SKenneth E. Jansen            close (8177)
80359599516SKenneth E. Jansen         endif
80459599516SKenneth E. Jansen      endif
80559599516SKenneth E. Jansenc
80659599516SKenneth E. Jansenc.... close varts file for probes
80759599516SKenneth E. Jansenc
808*3beb3aadSMichel Rasquin      call finalizeTimeSeries()
80959599516SKenneth E. Jansen
81059599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
81159599516SKenneth E. Jansen      if(myrank.eq.0)  then
81259599516SKenneth E. Jansen          write(*,*) 'itrdrv - done with aerodynamic forces'
81359599516SKenneth E. Jansen      endif
81459599516SKenneth E. Jansen
81559599516SKenneth E. Jansen      do isrf = 0,MAXSURF
81659599516SKenneth E. Jansen        if ( nsrflist(isrf).ne.0 .and.
81759599516SKenneth E. Jansen     &                     myrank.eq.irankfilesforce(isrf)) then
81859599516SKenneth E. Jansen          iunit=60+isrf
81959599516SKenneth E. Jansen          close(iunit)
82059599516SKenneth E. Jansen        endif
82159599516SKenneth E. Jansen      enddo
82259599516SKenneth E. Jansen
82359599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
82459599516SKenneth E. Jansen      if(myrank.eq.0)  then
82559599516SKenneth E. Jansen          write(*,*) 'itrdrv - done with MAXSURF'
82659599516SKenneth E. Jansen      endif
82759599516SKenneth E. Jansen
82859599516SKenneth E. Jansen
82959599516SKenneth E. Jansen 5    format(1X,F15.10,3X,F15.10,3X,F15.10,3X,F15.10)
83059599516SKenneth E. Jansen 444  format(6(2x,e14.7))
83159599516SKenneth E. Jansenc
83259599516SKenneth E. Jansenc.... end
83359599516SKenneth E. Jansenc
83459599516SKenneth E. Jansen      if(nsolflow.eq.1) then
83559599516SKenneth E. Jansen         deallocate (lhsK)
83659599516SKenneth E. Jansen         deallocate (lhsP)
837ae8d68e4SKenneth E. Jansen         IF (svLSFlag .NE. 1) THEN
83859599516SKenneth E. Jansen         deallocate (aperm)
83959599516SKenneth E. Jansen         deallocate (atemp)
840ae8d68e4SKenneth E. Jansen         ENDIF
84159599516SKenneth E. Jansen      endif
84234e67057SKenneth E. Jansen      if((nsclr+nsolt).gt.0) then
84359599516SKenneth E. Jansen         deallocate (lhsS)
84459599516SKenneth E. Jansen         deallocate (apermS)
84559599516SKenneth E. Jansen         deallocate (atempS)
84659599516SKenneth E. Jansen      endif
84759599516SKenneth E. Jansen
84859599516SKenneth E. Jansen      if(iabc==1) deallocate(acs)
84959599516SKenneth E. Jansen
85059599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
85159599516SKenneth E. Jansen      if(myrank.eq.0)  then
85259599516SKenneth E. Jansen          write(*,*) 'itrdrv - done - BACK TO process.f'
85359599516SKenneth E. Jansen      endif
85459599516SKenneth E. Jansen
85559599516SKenneth E. Jansen      return
85659599516SKenneth E. Jansen      end
85759599516SKenneth E. Jansen
85859599516SKenneth E. Jansen      subroutine lesmodels(y,     ac,        shgl,      shp,
85959599516SKenneth E. Jansen     &                     iper,  ilwork,    rowp,      colm,
86059599516SKenneth E. Jansen     &                     nsons, ifath,     x,
86159599516SKenneth E. Jansen     &                     iBC,   BC)
86259599516SKenneth E. Jansen
86359599516SKenneth E. Jansen      include "common.h"
86459599516SKenneth E. Jansen
86559599516SKenneth E. Jansen      real*8    y(nshg,ndof),              ac(nshg,ndof),
86659599516SKenneth E. Jansen     &            x(numnp,nsd),
86759599516SKenneth E. Jansen     &            BC(nshg,ndofBC)
86859599516SKenneth E. Jansen      real*8    shp(MAXTOP,maxsh,MAXQPT),
86959599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT)
87059599516SKenneth E. Jansen
87159599516SKenneth E. Jansenc
87259599516SKenneth E. Jansen      integer   rowp(nshg,nnz),         colm(nshg+1),
87359599516SKenneth E. Jansen     &            iBC(nshg),
87459599516SKenneth E. Jansen     &            ilwork(nlwork),
87559599516SKenneth E. Jansen     &            iper(nshg)
87659599516SKenneth E. Jansen      dimension ifath(numnp),    nsons(nfath)
87759599516SKenneth E. Jansen
87859599516SKenneth E. Jansen      real*8, allocatable, dimension(:) :: fwr2,fwr3,fwr4
87959599516SKenneth E. Jansen      real*8, allocatable, dimension(:) :: stabdis,cdelsq1
88059599516SKenneth E. Jansen      real*8, allocatable, dimension(:,:) :: xavegt, xavegt2,xavegt3
88159599516SKenneth E. Jansen
88259599516SKenneth E. Jansen      if( (iLES.gt.1) )   then ! Allocate Stuff for advanced LES models
88359599516SKenneth E. Jansen         allocate (fwr2(nshg))
88459599516SKenneth E. Jansen         allocate (fwr3(nshg))
88559599516SKenneth E. Jansen         allocate (fwr4(nshg))
88659599516SKenneth E. Jansen         allocate (xavegt(nfath,12))
88759599516SKenneth E. Jansen         allocate (xavegt2(nfath,12))
88859599516SKenneth E. Jansen         allocate (xavegt3(nfath,12))
88959599516SKenneth E. Jansen         allocate (stabdis(nfath))
89059599516SKenneth E. Jansen      endif
89159599516SKenneth E. Jansen
89259599516SKenneth E. Jansenc.... get dynamic model coefficient
89359599516SKenneth E. Jansenc
89459599516SKenneth E. Jansen      ilesmod=iLES/10
89559599516SKenneth E. Jansenc
89659599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model
89759599516SKenneth E. Jansenc
89859599516SKenneth E. Jansen      if (ilesmod.eq.0) then    ! 0 < iLES< 10 => dyn. model calculated
89959599516SKenneth E. Jansen                                ! at nodes based on discrete filtering
90059599516SKenneth E. Jansen
90159599516SKenneth E. Jansen
90259599516SKenneth E. Jansen         if(isubmod.eq.2) then
90359599516SKenneth E. Jansen            call SUPGdis(y,      ac,        shgl,      shp,
90459599516SKenneth E. Jansen     &                   iper,   ilwork,
90559599516SKenneth E. Jansen     &                   nsons,  ifath,     x,
90659599516SKenneth E. Jansen     &                   iBC,    BC, stabdis, xavegt3)
90759599516SKenneth E. Jansen         endif
90859599516SKenneth E. Jansen
90959599516SKenneth E. Jansen         if( ((isubmod.eq.0).or.(isubmod.eq.2)))then ! If no
91059599516SKenneth E. Jansen                                                     ! sub-model
91159599516SKenneth E. Jansen                                                     ! or SUPG
91259599516SKenneth E. Jansen                                                     ! model wanted
91359599516SKenneth E. Jansen
91459599516SKenneth E. Jansen            if(i2filt.eq.0)then ! If simple filter
91559599516SKenneth E. Jansen
91659599516SKenneth E. Jansen               if(modlstats .eq. 0) then ! If no model stats wanted
91759599516SKenneth E. Jansen                  call getdmc (y,       shgl,      shp,
91859599516SKenneth E. Jansen     &                         iper,       ilwork,    nsons,
91959599516SKenneth E. Jansen     &                         ifath,      x)
92059599516SKenneth E. Jansen               else             ! else get model stats
92159599516SKenneth E. Jansen                  call stdfdmc (y,       shgl,      shp,
92259599516SKenneth E. Jansen     &                          iper,       ilwork,    nsons,
92359599516SKenneth E. Jansen     &                          ifath,      x)
92459599516SKenneth E. Jansen               endif            ! end of stats if statement
92559599516SKenneth E. Jansen
92659599516SKenneth E. Jansen            else                ! else if twice filtering
92759599516SKenneth E. Jansen
92859599516SKenneth E. Jansen               call widefdmc(y,       shgl,      shp,
92959599516SKenneth E. Jansen     &                       iper,       ilwork,    nsons,
93059599516SKenneth E. Jansen     &                       ifath,      x)
93159599516SKenneth E. Jansen
93259599516SKenneth E. Jansen
93359599516SKenneth E. Jansen            endif               ! end of simple filter if statement
93459599516SKenneth E. Jansen
93559599516SKenneth E. Jansen         endif                  ! end of SUPG or no sub-model if statement
93659599516SKenneth E. Jansen
93759599516SKenneth E. Jansen
93859599516SKenneth E. Jansen         if( (isubmod.eq.1) ) then ! If DFWR sub-model wanted
93959599516SKenneth E. Jansen            call cdelBHsq (y,       shgl,      shp,
94059599516SKenneth E. Jansen     &                     iper,       ilwork,    nsons,
94159599516SKenneth E. Jansen     &                     ifath,      x,         cdelsq1)
94259599516SKenneth E. Jansen            call FiltRat (y,       shgl,      shp,
94359599516SKenneth E. Jansen     &                    iper,       ilwork,    nsons,
94459599516SKenneth E. Jansen     &                    ifath,      x,         cdelsq1,
94559599516SKenneth E. Jansen     &                    fwr4,       fwr3)
94659599516SKenneth E. Jansen
94759599516SKenneth E. Jansen
94859599516SKenneth E. Jansen            if (i2filt.eq.0) then ! If simple filter wanted
94959599516SKenneth E. Jansen               call DFWRsfdmc(y,       shgl,      shp,
95059599516SKenneth E. Jansen     &                        iper,       ilwork,    nsons,
95159599516SKenneth E. Jansen     &                        ifath,      x,         fwr2, fwr3)
95259599516SKenneth E. Jansen            else                ! else if twice filtering wanted
95359599516SKenneth E. Jansen               call DFWRwfdmc(y,       shgl,      shp,
95459599516SKenneth E. Jansen     &                        iper,       ilwork,    nsons,
95559599516SKenneth E. Jansen     &                        ifath,      x,         fwr4, fwr4)
95659599516SKenneth E. Jansen            endif               ! end of simple filter if statement
95759599516SKenneth E. Jansen
95859599516SKenneth E. Jansen         endif                  ! end of DFWR sub-model if statement
95959599516SKenneth E. Jansen
96059599516SKenneth E. Jansen         if( (isubmod.eq.2) )then ! If SUPG sub-model wanted
96159599516SKenneth E. Jansen            call dmcSUPG (y,           ac,         shgl,
96259599516SKenneth E. Jansen     &                    shp,         iper,       ilwork,
96359599516SKenneth E. Jansen     &                    nsons,       ifath,      x,
96459599516SKenneth E. Jansen     &                    iBC,    BC,  rowp,       colm,
96559599516SKenneth E. Jansen     &                    xavegt2,    stabdis)
96659599516SKenneth E. Jansen         endif
96759599516SKenneth E. Jansen
96859599516SKenneth E. Jansen         if(idis.eq.1)then      ! If SUPG/Model dissipation wanted
96959599516SKenneth E. Jansen            call ediss (y,        ac,      shgl,
97059599516SKenneth E. Jansen     &                  shp,      iper,       ilwork,
97159599516SKenneth E. Jansen     &                  nsons,    ifath,      x,
97259599516SKenneth E. Jansen     &                  iBC,      BC,  xavegt)
97359599516SKenneth E. Jansen         endif
97459599516SKenneth E. Jansen
97559599516SKenneth E. Jansen      endif                     ! end of ilesmod
97659599516SKenneth E. Jansen
97759599516SKenneth E. Jansen      if (ilesmod .eq. 1) then  ! 10 < iLES < 20 => dynamic-mixed
97859599516SKenneth E. Jansen                                ! at nodes based on discrete filtering
97959599516SKenneth E. Jansen         call bardmc (y,       shgl,      shp,
98059599516SKenneth E. Jansen     &                iper,    ilwork,
98159599516SKenneth E. Jansen     &                nsons,   ifath,     x)
98259599516SKenneth E. Jansen      endif
98359599516SKenneth E. Jansen
98459599516SKenneth E. Jansen      if (ilesmod .eq. 2) then  ! 20 < iLES < 30 => dynamic at quad
98559599516SKenneth E. Jansen                                ! pts based on lumped projection filt.
98659599516SKenneth E. Jansen
98759599516SKenneth E. Jansen         if(isubmod.eq.0)then
98859599516SKenneth E. Jansen            call projdmc (y,       shgl,      shp,
98959599516SKenneth E. Jansen     &                    iper,       ilwork,    x)
99059599516SKenneth E. Jansen         else
99159599516SKenneth E. Jansen            call cpjdmcnoi (y,      shgl,      shp,
99259599516SKenneth E. Jansen     &                      iper,   ilwork,       x,
99359599516SKenneth E. Jansen     &                      rowp,   colm,
99459599516SKenneth E. Jansen     &                      iBC,    BC)
99559599516SKenneth E. Jansen         endif
99659599516SKenneth E. Jansen
99759599516SKenneth E. Jansen      endif
99859599516SKenneth E. Jansen
99959599516SKenneth E. Jansen      if( (iLES.gt.1) )   then ! Deallocate Stuff for advanced LES models
100059599516SKenneth E. Jansen         deallocate (fwr2)
100159599516SKenneth E. Jansen         deallocate (fwr3)
100259599516SKenneth E. Jansen         deallocate (fwr4)
100359599516SKenneth E. Jansen         deallocate (xavegt)
100459599516SKenneth E. Jansen         deallocate (xavegt2)
100559599516SKenneth E. Jansen         deallocate (xavegt3)
100659599516SKenneth E. Jansen         deallocate (stabdis)
100759599516SKenneth E. Jansen      endif
100859599516SKenneth E. Jansen      return
100959599516SKenneth E. Jansen      end
101059599516SKenneth E. Jansen
101159599516SKenneth E. Jansenc
101259599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution
101359599516SKenneth E. Jansenc
101459599516SKenneth E. Jansen      subroutine CalcImpConvCoef (numISrfs, numTpoints)
101559599516SKenneth E. Jansen
101659599516SKenneth E. Jansen      use convolImpFlow !uses flow history and impedance for convolution
101759599516SKenneth E. Jansen
101859599516SKenneth E. Jansen      include "common.h" !for alfi
101959599516SKenneth E. Jansen
102059599516SKenneth E. Jansen      integer numISrfs, numTpoints
102159599516SKenneth E. Jansen
102259599516SKenneth E. Jansen      allocate (ConvCoef(numTpoints+2,3)) !same time discret. for all imp. BC
102359599516SKenneth E. Jansen      do j=1,numTpoints+2
102459599516SKenneth E. Jansen         ConvCoef(j,:)=0.5/numTpoints !dt/2 divided by period T=N*dt
102559599516SKenneth E. Jansen         ConvCoef(j,1)=ConvCoef(j,1)*(1.0-alfi)*(1.0-alfi)
102659599516SKenneth E. Jansen         ConvCoef(j,2)=ConvCoef(j,2)*(1.0+2*alfi*(1.0-alfi))
102759599516SKenneth E. Jansen         ConvCoef(j,3)=ConvCoef(j,3)*alfi*alfi
102859599516SKenneth E. Jansen      enddo
102959599516SKenneth E. Jansen      ConvCoef(1,2)=zero
103059599516SKenneth E. Jansen      ConvCoef(1,3)=zero
103159599516SKenneth E. Jansen      ConvCoef(2,3)=zero
103259599516SKenneth E. Jansen      ConvCoef(numTpoints+1,1)=zero
103359599516SKenneth E. Jansen      ConvCoef(numTpoints+2,2)=zero
103459599516SKenneth E. Jansen      ConvCoef(numTpoints+2,1)=zero
103559599516SKenneth E. Jansenc
103659599516SKenneth E. Jansenc...calculate the coefficients for the impedance convolution
103759599516SKenneth E. Jansenc
103859599516SKenneth E. Jansen      allocate (ImpConvCoef(numTpoints+2,numISrfs))
103959599516SKenneth E. Jansen
104059599516SKenneth E. Jansenc..coefficients below assume Q linear in time step, Z constant
104159599516SKenneth E. Jansenc            do j=3,numTpoints
104259599516SKenneth E. Jansenc                ImpConvCoef(j,:) = ValueListImp(j-1,:)*ConvCoef(j,3)
104359599516SKenneth E. Jansenc     &                             + ValueListImp(j,:)*ConvCoef(j,2)
104459599516SKenneth E. Jansenc     &                             + ValueListImp(j+1,:)*ConvCoef(j,1)
104559599516SKenneth E. Jansenc            enddo
104659599516SKenneth E. Jansenc            ImpConvCoef(1,:) = ValueListImp(2,:)*ConvCoef(1,1)
104759599516SKenneth E. Jansenc            ImpConvCoef(2,:) = ValueListImp(2,:)*ConvCoef(2,2)
104859599516SKenneth E. Jansenc     &                       + ValueListImp(3,:)*ConvCoef(2,1)
104959599516SKenneth E. Jansenc            ImpConvCoef(numTpoints+1,:) =
105059599516SKenneth E. Jansenc     &           ValueListImp(numTpoints,:)*ConvCoef(numTpoints+1,3)
105159599516SKenneth E. Jansenc     &         + ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+1,2)
105259599516SKenneth E. Jansenc            ImpConvCoef(numTpoints+2,:) =
105359599516SKenneth E. Jansenc     &           ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+2,3)
105459599516SKenneth E. Jansen
105559599516SKenneth E. Jansenc..try easiest convolution Q and Z constant per time step
105659599516SKenneth E. Jansen      do j=3,numTpoints+1
105759599516SKenneth E. Jansen         ImpConvCoef(j,:) = ValueListImp(j-1,:)/numTpoints
105859599516SKenneth E. Jansen      enddo
105959599516SKenneth E. Jansen      ImpConvCoef(1,:) =zero
106059599516SKenneth E. Jansen      ImpConvCoef(2,:) =zero
106159599516SKenneth E. Jansen      ImpConvCoef(numTpoints+2,:) =
106259599516SKenneth E. Jansen     &           ValueListImp(numTpoints+1,:)/numTpoints
106359599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr()
106459599516SKenneth E. Jansen      ImpConvCoef(numTpoints+1,:)= ImpConvCoef(numTpoints+1,:)
106559599516SKenneth E. Jansen     &                  - ImpConvCoef(numTpoints+2,:)*(1.0-alfi)/alfi
106659599516SKenneth E. Jansen      ImpConvCoef(numTpoints+2,:)= ImpConvCoef(numTpoints+2,:)/alfi
106759599516SKenneth E. Jansen      return
106859599516SKenneth E. Jansen      end
106959599516SKenneth E. Jansen
107059599516SKenneth E. Jansenc
107159599516SKenneth E. Jansenc ... update the flow rate history for the impedance convolution, filter it and write it out
107259599516SKenneth E. Jansenc
107359599516SKenneth E. Jansen      subroutine UpdHistConv(y,nsrfIdList,numSrfs)
107459599516SKenneth E. Jansen
107559599516SKenneth E. Jansen      use convolImpFlow !brings ntimeptpT, QHistImp, QHistTry, QHistTryF, numImpSrfs
107659599516SKenneth E. Jansen      use convolRCRFlow !brings QHistRCR, numRCRSrfs
107759599516SKenneth E. Jansen
107859599516SKenneth E. Jansen      include "common.h"
107959599516SKenneth E. Jansen
108059599516SKenneth E. Jansen      integer   nsrfIdList(0:MAXSURF), numSrfs
108159599516SKenneth E. Jansen      character*20 fname1
108259599516SKenneth E. Jansen      character*10 cname2
108359599516SKenneth E. Jansen      character*5 cname
108459599516SKenneth E. Jansen      real*8    y(nshg,3) !velocity at time n+1
108559599516SKenneth E. Jansen      real*8    NewQ(0:MAXSURF) !temporary unknown for the flow rate
108659599516SKenneth E. Jansen                        !that needs to be added to the flow history
108759599516SKenneth E. Jansen
108859599516SKenneth E. Jansen      call GetFlowQ(NewQ,y,nsrfIdList,numSrfs) !new flow at time n+1
108959599516SKenneth E. Jansenc
109059599516SKenneth E. Jansenc... for imp BC: shift QHist, add new constribution, filter and write out
109159599516SKenneth E. Jansenc
109259599516SKenneth E. Jansen      if(numImpSrfs.gt.zero) then
109359599516SKenneth E. Jansen         do j=1, ntimeptpT
109459599516SKenneth E. Jansen            QHistImp(j,1:numSrfs)=QHistImp(j+1,1:numSrfs)
109559599516SKenneth E. Jansen         enddo
109659599516SKenneth E. Jansen         QHistImp(ntimeptpT+1,1:numSrfs) = NewQ(1:numSrfs)
109759599516SKenneth E. Jansen
109859599516SKenneth E. Jansenc
109959599516SKenneth E. Jansenc....filter the flow rate history
110059599516SKenneth E. Jansenc
110159599516SKenneth E. Jansen         cutfreq = 10           !hardcoded cutting frequency of the filter
110259599516SKenneth E. Jansen         do j=1, ntimeptpT
110359599516SKenneth E. Jansen            QHistTry(j,:)=QHistImp(j+1,:)
110459599516SKenneth E. Jansen         enddo
110559599516SKenneth E. Jansen         call Filter(QHistTryF,QHistTry,ntimeptpT,Delt(1),cutfreq)
110659599516SKenneth E. Jansenc.... if no filter applied then uncomment next three lines
110759599516SKenneth E. Jansenc         do j=1, ntimeptpT
110859599516SKenneth E. Jansenc            QHistTryF(j,:)=QHistTry(j,:)
110959599516SKenneth E. Jansenc         enddo
111059599516SKenneth E. Jansen
111159599516SKenneth E. Jansenc         QHistImp(1,:)=zero ! why do we do this? for beta(1,:) = zero it does not really matters
111259599516SKenneth E. Jansen         do j=1, ntimeptpT
111359599516SKenneth E. Jansen            QHistImp(j+1,:)=QHistTryF(j,:)
111459599516SKenneth E. Jansen         enddo
111559599516SKenneth E. Jansenc
111659599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat
111759599516SKenneth E. Jansenc
111859599516SKenneth E. Jansen         if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or.
111959599516SKenneth E. Jansen     &        (istep .eq. nstep(1)))) .and.
112059599516SKenneth E. Jansen     &        (myrank .eq. master)) then
112159599516SKenneth E. Jansen            open(unit=816, file='Qhistor.dat',status='replace')
112259599516SKenneth E. Jansen            write(816,*) ntimeptpT
112359599516SKenneth E. Jansen            do j=1,ntimeptpT+1
112459599516SKenneth E. Jansen               write(816,*) (QHistImp(j,n),n=1, numSrfs)
112559599516SKenneth E. Jansen            enddo
112659599516SKenneth E. Jansen            close(816)
112759599516SKenneth E. Jansenc... write out a copy with step number to be able to restart
112859599516SKenneth E. Jansen            fname1 = 'Qhistor'
112959599516SKenneth E. Jansen            fname1 = trim(fname1)//trim(cname2(lstep))//'.dat'
113059599516SKenneth E. Jansen            open(unit=8166,file=trim(fname1),status='unknown')
113159599516SKenneth E. Jansen            write(8166,*) ntimeptpT
113259599516SKenneth E. Jansen            do j=1,ntimeptpT+1
113359599516SKenneth E. Jansen               write(8166,*) (QHistImp(j,n),n=1, numSrfs)
113459599516SKenneth E. Jansen            enddo
113559599516SKenneth E. Jansen            close(8166)
113659599516SKenneth E. Jansen         endif
113759599516SKenneth E. Jansen      endif
113859599516SKenneth E. Jansen
113959599516SKenneth E. Jansenc
114059599516SKenneth E. Jansenc... for RCR bc just add the new contribution
114159599516SKenneth E. Jansenc
114259599516SKenneth E. Jansen      if(numRCRSrfs.gt.zero) then
114359599516SKenneth E. Jansen         QHistRCR(lstep+1,1:numSrfs) = NewQ(1:numSrfs)
114459599516SKenneth E. Jansenc
114559599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat
114659599516SKenneth E. Jansenc
114759599516SKenneth E. Jansen         if ((irs .ge. 1) .and. (myrank .eq. master)) then
114859599516SKenneth E. Jansen            if(istep.eq.1) then
114959599516SKenneth E. Jansen               open(unit=816,file='Qhistor.dat',status='unknown')
115059599516SKenneth E. Jansen            else
115159599516SKenneth E. Jansen               open(unit=816,file='Qhistor.dat',position='append')
115259599516SKenneth E. Jansen            endif
115359599516SKenneth E. Jansen            if(istep.eq.1) then
115459599516SKenneth E. Jansen               do j=1,lstep
115559599516SKenneth E. Jansen                  write(816,*) j, (QHistRCR(j,n),n=1,numSrfs) ! read from file of previous run
115659599516SKenneth E. Jansen               enddo
115759599516SKenneth E. Jansen            endif
115859599516SKenneth E. Jansen            write(816,*) lstep+1, (QHistRCR(lstep+1,n),n=1, numSrfs)
115959599516SKenneth E. Jansen            close(816)
116059599516SKenneth E. Jansenc... write out a copy with step number to be able to restart
116159599516SKenneth E. Jansen            if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or.
116259599516SKenneth E. Jansen     &           (istep .eq. nstep(1)))) .and.
116359599516SKenneth E. Jansen     &           (myrank .eq. master)) then
116459599516SKenneth E. Jansen               fname1 = 'Qhistor'
116559599516SKenneth E. Jansen               fname1 = trim(fname1)//trim(cname2(lstep))//'.dat'
116659599516SKenneth E. Jansen               open(unit=8166,file=trim(fname1),status='unknown')
116759599516SKenneth E. Jansen               write(8166,*) lstep+1
116859599516SKenneth E. Jansen               do j=1,lstep+1
116959599516SKenneth E. Jansen                  write(8166,*) (QHistRCR(j,n),n=1, numSrfs)
117059599516SKenneth E. Jansen               enddo
117159599516SKenneth E. Jansen               close(8166)
117259599516SKenneth E. Jansen            endif
117359599516SKenneth E. Jansen         endif
117459599516SKenneth E. Jansen      endif
117559599516SKenneth E. Jansen
117659599516SKenneth E. Jansen      return
117759599516SKenneth E. Jansen      end
117859599516SKenneth E. Jansen
117959599516SKenneth E. Jansenc
118059599516SKenneth E. Jansenc...calculate the time varying coefficients for the RCR convolution
118159599516SKenneth E. Jansenc
118259599516SKenneth E. Jansen      subroutine CalcRCRConvCoef (stepn, numSrfs)
118359599516SKenneth E. Jansen
118459599516SKenneth E. Jansen      use convolRCRFlow !brings in ValueListRCR, dtRCR
118559599516SKenneth E. Jansen
118659599516SKenneth E. Jansen      include "common.h" !brings alfi
118759599516SKenneth E. Jansen
118859599516SKenneth E. Jansen      integer numSrfs, stepn
118959599516SKenneth E. Jansen
119059599516SKenneth E. Jansen      RCRConvCoef = zero
119159599516SKenneth E. Jansen      if (stepn .eq. 0) then
119259599516SKenneth E. Jansen        RCRConvCoef(1,:) = ValueListRCR(1,:)*(1.0-alfi) +
119359599516SKenneth E. Jansen     &   ValueListRCR(3,:)*(-alfi + 1.0 + 1/dtRCR(:)
119459599516SKenneth E. Jansen     &     - exp(-alfi*dtRCR(:))*(1 + 1/dtRCR(:)))
119559599516SKenneth E. Jansen        RCRConvCoef(2,:) = ValueListRCR(1,:)*alfi
119659599516SKenneth E. Jansen     &     + ValueListRCR(3,:)
119759599516SKenneth E. Jansen     &     *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:))
119859599516SKenneth E. Jansen      endif
119959599516SKenneth E. Jansen      if (stepn .ge. 1) then
120059599516SKenneth E. Jansen        RCRConvCoef(1,:) =-ValueListRCR(3,:)*exp(-dtRCR(:)*(stepn+alfi))
120159599516SKenneth E. Jansen     &        *(1 + (1 - exp(dtRCR(:)))/dtRCR(:))
120259599516SKenneth E. Jansen        RCRConvCoef(stepn+1,:) = ValueListRCR(1,:)*(1-alfi)
120359599516SKenneth E. Jansen     &     - ValueListRCR(3,:)*(alfi - 1 - 1/dtRCR(:)
120459599516SKenneth E. Jansen     &     + exp(-alfi*dtRCR(:))/dtRCR(:)*(2 - exp(-dtRCR(:))))
120559599516SKenneth E. Jansen        RCRConvCoef(stepn+2,:) = ValueListRCR(1,:)*alfi
120659599516SKenneth E. Jansen     &     + ValueListRCR(3,:)
120759599516SKenneth E. Jansen     &     *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:))
120859599516SKenneth E. Jansen      endif
120959599516SKenneth E. Jansen      if (stepn .ge. 2) then
121059599516SKenneth E. Jansen        do j=2,stepn
121159599516SKenneth E. Jansen         RCRConvCoef(j,:) = ValueListRCR(3,:)/dtRCR(:)*
121259599516SKenneth E. Jansen     &        exp(-dtRCR(:)*(stepn + alfi + 2 - j))*
121359599516SKenneth E. Jansen     &        (1 - exp(dtRCR(:)))**2
121459599516SKenneth E. Jansen        enddo
121559599516SKenneth E. Jansen      endif
121659599516SKenneth E. Jansen
121759599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr()
121859599516SKenneth E. Jansen      RCRConvCoef(stepn+1,:)= RCRConvCoef(stepn+1,:)
121959599516SKenneth E. Jansen     &                  - RCRConvCoef(stepn+2,:)*(1.0-alfi)/alfi
122059599516SKenneth E. Jansen      RCRConvCoef(stepn+2,:)= RCRConvCoef(stepn+2,:)/alfi
122159599516SKenneth E. Jansen
122259599516SKenneth E. Jansen      return
122359599516SKenneth E. Jansen      end
122459599516SKenneth E. Jansen
122559599516SKenneth E. Jansenc
122659599516SKenneth E. Jansenc...calculate the time dependent H operator for the RCR convolution
122759599516SKenneth E. Jansenc
122859599516SKenneth E. Jansen      subroutine CalcHopRCR (timestepRCR, stepn, numSrfs)
122959599516SKenneth E. Jansen
123059599516SKenneth E. Jansen      use convolRCRFlow !brings in HopRCR, dtRCR
123159599516SKenneth E. Jansen
123259599516SKenneth E. Jansen      include "common.h"
123359599516SKenneth E. Jansen
123459599516SKenneth E. Jansen      integer numSrfs, stepn
123559599516SKenneth E. Jansen      real*8  PdistCur(0:MAXSURF), timestepRCR
123659599516SKenneth E. Jansen
123759599516SKenneth E. Jansen      HopRCR=zero
123859599516SKenneth E. Jansen      call RCRint(timestepRCR*(stepn + alfi),PdistCur)
123959599516SKenneth E. Jansen      HopRCR(1:numSrfs) = RCRic(1:numSrfs)
124059599516SKenneth E. Jansen     &     *exp(-dtRCR(1:numSrfs)*(stepn + alfi)) + PdistCur(1:numSrfs)
124159599516SKenneth E. Jansen      return
124259599516SKenneth E. Jansen      end
124359599516SKenneth E. Jansenc
124459599516SKenneth E. Jansenc ... initialize the influence of the initial conditions for the RCR BC
124559599516SKenneth E. Jansenc
124659599516SKenneth E. Jansen      subroutine calcRCRic(y,srfIdList,numSrfs)
124759599516SKenneth E. Jansen
124859599516SKenneth E. Jansen      use convolRCRFlow    !brings RCRic, ValueListRCR, ValuePdist
124959599516SKenneth E. Jansen
125059599516SKenneth E. Jansen      include "common.h"
125159599516SKenneth E. Jansen
125259599516SKenneth E. Jansen      integer   srfIdList(0:MAXSURF), numSrfs, irankCoupled
125359599516SKenneth E. Jansen      real*8    y(nshg,4) !need velocity and pressure
125459599516SKenneth E. Jansen      real*8    Qini(0:MAXSURF) !initial flow rate
125559599516SKenneth E. Jansen      real*8    PdistIni(0:MAXSURF) !initial distal pressure
125659599516SKenneth E. Jansen      real*8    Pini(0:MAXSURF),CoupleArea(0:MAXSURF) ! initial pressure
125759599516SKenneth E. Jansen      real*8    VelOnly(nshg,3), POnly(nshg)
125859599516SKenneth E. Jansen
125959599516SKenneth E. Jansen      allocate (RCRic(0:MAXSURF))
126059599516SKenneth E. Jansen
126159599516SKenneth E. Jansen      if(lstep.eq.0) then
126259599516SKenneth E. Jansen         VelOnly(:,1:3)=y(:,1:3)
126359599516SKenneth E. Jansen         call GetFlowQ(Qini,VelOnly,srfIdList,numSrfs) !get initial flow
126459599516SKenneth E. Jansen         QHistRCR(1,1:numSrfs)=Qini(1:numSrfs) !initialize QHistRCR
126559599516SKenneth E. Jansen         POnly(:)=y(:,4)        ! pressure
126659599516SKenneth E. Jansen         call integrScalar(Pini,POnly,srfIdList,numSrfs) !get initial pressure integral
126759599516SKenneth E. Jansen         POnly(:)=one           ! one to get area
126859599516SKenneth E. Jansen         call integrScalar(CoupleArea,POnly,srfIdList,numSrfs) !get surf area
126959599516SKenneth E. Jansen         Pini(1:numSrfs) = Pini(1:numSrfs)/CoupleArea(1:numSrfs)
127059599516SKenneth E. Jansen      else
127159599516SKenneth E. Jansen         Qini(1:numSrfs)=QHistRCR(1,1:numSrfs)
127259599516SKenneth E. Jansen         Pini(1:numSrfs)=zero    ! hack
127359599516SKenneth E. Jansen      endif
127459599516SKenneth E. Jansen      call RCRint(istep,PdistIni) !get initial distal P (use istep)
127559599516SKenneth E. Jansen      RCRic(1:numSrfs) = Pini(1:numSrfs)
127659599516SKenneth E. Jansen     &          - ValueListRCR(1,:)*Qini(1:numSrfs)-PdistIni(1:numSrfs)
127759599516SKenneth E. Jansen      return
127859599516SKenneth E. Jansen      end
127959599516SKenneth E. Jansen
128059599516SKenneth E. Jansenc.........function that integrates a scalar over a boundary
128159599516SKenneth E. Jansen      subroutine integrScalar(scalInt,scal,srfIdList,numSrfs)
128259599516SKenneth E. Jansen
128359599516SKenneth E. Jansen      use pvsQbi !brings ndsurf, NASC
128459599516SKenneth E. Jansen
128559599516SKenneth E. Jansen      include "common.h"
128659599516SKenneth E. Jansen      include "mpif.h"
128759599516SKenneth E. Jansen
128859599516SKenneth E. Jansen      integer   srfIdList(0:MAXSURF), numSrfs, irankCoupled, i, k
128959599516SKenneth E. Jansen      real*8    scal(nshg), scalInt(0:MAXSURF), scalIntProc(0:MAXSURF)
129059599516SKenneth E. Jansen
129159599516SKenneth E. Jansen      scalIntProc = zero
129259599516SKenneth E. Jansen      do i = 1,nshg
129359599516SKenneth E. Jansen        if(numSrfs.gt.zero) then
129459599516SKenneth E. Jansen          do k = 1,numSrfs
129559599516SKenneth E. Jansen            irankCoupled = 0
129659599516SKenneth E. Jansen            if (srfIdList(k).eq.ndsurf(i)) then
129759599516SKenneth E. Jansen              irankCoupled=k
129859599516SKenneth E. Jansen              scalIntProc(irankCoupled) = scalIntProc(irankCoupled)
129959599516SKenneth E. Jansen     &                            + NASC(i)*scal(i)
130059599516SKenneth E. Jansen              exit
130159599516SKenneth E. Jansen            endif
130259599516SKenneth E. Jansen          enddo
130359599516SKenneth E. Jansen        endif
130459599516SKenneth E. Jansen      enddo
130559599516SKenneth E. Jansenc
130659599516SKenneth E. Jansenc     at this point, each scalint has its "nodes" contributions to the scalar
130759599516SKenneth E. Jansenc     accumulated into scalIntProc. Note, because NASC is on processor this
130859599516SKenneth E. Jansenc     will NOT be the scalar for the surface yet
130959599516SKenneth E. Jansenc
131059599516SKenneth E. Jansenc.... reduce integrated scalar for each surface, push on scalInt
131159599516SKenneth E. Jansenc
131259599516SKenneth E. Jansen        npars=MAXSURF+1
131359599516SKenneth E. Jansen       call MPI_ALLREDUCE (scalIntProc, scalInt(:), npars,
131459599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
131559599516SKenneth E. Jansen
131659599516SKenneth E. Jansen      return
131759599516SKenneth E. Jansen      end
131859599516SKenneth E. Jansen
13199071d3baSCameron Smith      subroutine writeTimingMessage(key,iomode,timing)
13209071d3baSCameron Smith      use iso_c_binding
13219071d3baSCameron Smith      use phstr
13229071d3baSCameron Smith      implicit none
132359599516SKenneth E. Jansen
13249071d3baSCameron Smith      character(len=*) :: key
13259071d3baSCameron Smith      integer :: iomode
13269071d3baSCameron Smith      real*8 :: timing
1327da7d5714SCameron Smith      character(len=1024) :: timing_msg
132889625e43SCameron Smith      character(len=*), parameter ::
132989625e43SCameron Smith     &  streamModeString = c_char_"stream"//c_null_char,
133089625e43SCameron Smith     &  fileModeString = c_char_"disk"//c_null_char
133159599516SKenneth E. Jansen
1332da7d5714SCameron Smith      timing_msg = c_char_"Time to write "//c_null_char
13339071d3baSCameron Smith      call phstr_appendStr(timing_msg,key)
13349071d3baSCameron Smith      if ( iomode .eq. -1 ) then
13359071d3baSCameron Smith        call phstr_appendStr(timing_msg, streamModeString)
13369071d3baSCameron Smith      else
13379071d3baSCameron Smith        call phstr_appendStr(timing_msg, fileModeString)
13389071d3baSCameron Smith      endif
13399071d3baSCameron Smith      call phstr_appendStr(timing_msg, c_char_' = '//c_null_char)
13409071d3baSCameron Smith      call phstr_appendDbl(timing_msg, timing)
1341da7d5714SCameron Smith      write(6,*) trim(timing_msg)
13429071d3baSCameron Smith      return
13439071d3baSCameron Smith      end subroutine
134459599516SKenneth E. Jansen
134534e67057SKenneth E. Jansen      subroutine initmpistat()
134634e67057SKenneth E. Jansen        include "common.h"
134734e67057SKenneth E. Jansen
134834e67057SKenneth E. Jansen        impistat = 0
134934e67057SKenneth E. Jansen        impistat2 = 0
135034e67057SKenneth E. Jansen        iISend = 0
135134e67057SKenneth E. Jansen        iISendScal = 0
135234e67057SKenneth E. Jansen        iIRecv = 0
135334e67057SKenneth E. Jansen        iIRecvScal = 0
135434e67057SKenneth E. Jansen        iWaitAll = 0
135534e67057SKenneth E. Jansen        iWaitAllScal = 0
135634e67057SKenneth E. Jansen        iAllR = 0
135734e67057SKenneth E. Jansen        iAllRScal = 0
135834e67057SKenneth E. Jansen        rISend = zero
135934e67057SKenneth E. Jansen        rISendScal = zero
136034e67057SKenneth E. Jansen        rIRecv = zero
136134e67057SKenneth E. Jansen        rIRecvScal = zero
136234e67057SKenneth E. Jansen        rWaitAll = zero
136334e67057SKenneth E. Jansen        rWaitAllScal = zero
136434e67057SKenneth E. Jansen        rAllR = zero
136534e67057SKenneth E. Jansen        rAllRScal = zero
136634e67057SKenneth E. Jansen        rCommu = zero
136734e67057SKenneth E. Jansen        rCommuScal = zero
136834e67057SKenneth E. Jansen      return
136934e67057SKenneth E. Jansen      end subroutine
137034e67057SKenneth E. Jansen
137134e67057SKenneth E. Jansen      subroutine initTimeSeries()
137234e67057SKenneth E. Jansen      use timedata   !allows collection of time series
137334e67057SKenneth E. Jansen        include "common.h"
137434e67057SKenneth E. Jansen       character*60    fvarts
137534e67057SKenneth E. Jansen       character*10    cname2
137634e67057SKenneth E. Jansen
137734e67057SKenneth E. Jansen        inquire(file='xyzts.dat',exist=exts)
137834e67057SKenneth E. Jansen        if(exts) then
137934e67057SKenneth E. Jansen           open(unit=626,file='xyzts.dat',status='old')
138034e67057SKenneth E. Jansen           read(626,*) ntspts, freq, tolpt, iterat, varcod
138134e67057SKenneth E. Jansen           call sTD             ! sets data structures
138234e67057SKenneth E. Jansen
138334e67057SKenneth E. Jansen           do jj=1,ntspts       ! read coordinate data where solution desired
138434e67057SKenneth E. Jansen              read(626,*) ptts(jj,1),ptts(jj,2),ptts(jj,3)
138534e67057SKenneth E. Jansen           enddo
138634e67057SKenneth E. Jansen           close(626)
138734e67057SKenneth E. Jansen
138834e67057SKenneth E. Jansen           statptts(:,:) = 0
138934e67057SKenneth E. Jansen           parptts(:,:) = zero
139034e67057SKenneth E. Jansen           varts(:,:) = zero
139134e67057SKenneth E. Jansen
139234e67057SKenneth E. Jansen
139334e67057SKenneth E. Jansen           iv_rankpernode = iv_rankpercore*iv_corepernode
139434e67057SKenneth E. Jansen           iv_totnodes = numpe/iv_rankpernode
139534e67057SKenneth E. Jansen           iv_totcores = iv_corepernode*iv_totnodes
139634e67057SKenneth E. Jansen           if (myrank .eq. 0) then
139734e67057SKenneth E. Jansen             write(*,*) 'Info for probes:'
139834e67057SKenneth E. Jansen             write(*,*) '  Ranks per core:',iv_rankpercore
139934e67057SKenneth E. Jansen             write(*,*) '  Cores per node:',iv_corepernode
140034e67057SKenneth E. Jansen             write(*,*) '  Ranks per node:',iv_rankpernode
140134e67057SKenneth E. Jansen             write(*,*) '  Total number of nodes:',iv_totnodes
140234e67057SKenneth E. Jansen             write(*,*) '  Total number of cores',iv_totcores
140334e67057SKenneth E. Jansen           endif
140434e67057SKenneth E. Jansen
140534e67057SKenneth E. Jansen!           if (myrank .eq. numpe-1) then
140634e67057SKenneth E. Jansen            do jj=1,ntspts
140734e67057SKenneth E. Jansen
140834e67057SKenneth E. Jansen               ! Compute the adequate rank which will take care of probe jj
140934e67057SKenneth E. Jansen               jjm1 = jj-1
141034e67057SKenneth E. Jansen               iv_node = (iv_totnodes-1)-mod(jjm1,iv_totnodes)
141134e67057SKenneth E. Jansen               iv_core = (iv_corepernode-1) - mod((jjm1 -
141234e67057SKenneth E. Jansen     &              mod(jjm1,iv_totnodes))/iv_totnodes,iv_corepernode)
141334e67057SKenneth E. Jansen               iv_thread = (iv_rankpercore-1) - mod((jjm1-
141434e67057SKenneth E. Jansen     &              (mod(jjm1,iv_totcores)))/iv_totcores,iv_rankpercore)
141534e67057SKenneth E. Jansen               iv_rank(jj) = iv_node*iv_rankpernode
141634e67057SKenneth E. Jansen     &                     + iv_core*iv_rankpercore
141734e67057SKenneth E. Jansen     &                     + iv_thread
141834e67057SKenneth E. Jansen
141934e67057SKenneth E. Jansen               if(myrank == 0) then
142034e67057SKenneth E. Jansen                 write(*,*) '  Probe', jj, 'handled by rank',
142134e67057SKenneth E. Jansen     &                         iv_rank(jj), ' on node', iv_node
142234e67057SKenneth E. Jansen               endif
142334e67057SKenneth E. Jansen
142434e67057SKenneth E. Jansen               ! Verification just in case
142534e67057SKenneth E. Jansen               if(iv_rank(jj) .lt.0 .or. iv_rank(jj) .ge. numpe) then
142634e67057SKenneth E. Jansen                 write(*,*) 'WARNING: iv_rank(',jj,') is ', iv_rank(jj),
142734e67057SKenneth E. Jansen     &                      ' and reset to numpe-1'
142834e67057SKenneth E. Jansen                 iv_rank(jj) = numpe-1
142934e67057SKenneth E. Jansen               endif
143034e67057SKenneth E. Jansen
143134e67057SKenneth E. Jansen               ! Open the varts files
143234e67057SKenneth E. Jansen               if(myrank == iv_rank(jj)) then
143334e67057SKenneth E. Jansen                 fvarts='varts/varts'
143434e67057SKenneth E. Jansen                 fvarts=trim(fvarts)//trim(cname2(jj))
143534e67057SKenneth E. Jansen                 fvarts=trim(fvarts)//trim(cname2(lstep))
143634e67057SKenneth E. Jansen                 fvarts=trim(fvarts)//'.dat'
143734e67057SKenneth E. Jansen                 fvarts=trim(fvarts)
143834e67057SKenneth E. Jansen                 open(unit=1000+jj, file=fvarts, status='unknown')
143934e67057SKenneth E. Jansen               endif
144034e67057SKenneth E. Jansen            enddo
144134e67057SKenneth E. Jansen!           endif
144234e67057SKenneth E. Jansen
144334e67057SKenneth E. Jansen        endif
144434e67057SKenneth E. Jansenc
144534e67057SKenneth E. Jansen      return
144634e67057SKenneth E. Jansen      end subroutine
144734e67057SKenneth E. Jansen
1448*3beb3aadSMichel Rasquin      subroutine finalizeTimeSeries()
1449*3beb3aadSMichel Rasquin      use timedata   !allows collection of time series
1450*3beb3aadSMichel Rasquin      include "common.h"
1451*3beb3aadSMichel Rasquin      if(exts) then
1452*3beb3aadSMichel Rasquin        do jj=1,ntspts
1453*3beb3aadSMichel Rasquin          if (myrank == iv_rank(jj)) then
1454*3beb3aadSMichel Rasquin            close(1000+jj)
1455*3beb3aadSMichel Rasquin          endif
1456*3beb3aadSMichel Rasquin        enddo
1457*3beb3aadSMichel Rasquin        call dTD   ! deallocates time series arrays
1458*3beb3aadSMichel Rasquin      endif
1459*3beb3aadSMichel Rasquin      return
1460*3beb3aadSMichel Rasquin      end subroutine
1461*3beb3aadSMichel Rasquin
1462*3beb3aadSMichel Rasquin
1463*3beb3aadSMichel Rasquin
146434e67057SKenneth E. Jansen       subroutine initEQS(iBC, rowp, colm)
146534e67057SKenneth E. Jansen
146634e67057SKenneth E. Jansen        use solvedata
146734e67057SKenneth E. Jansen        include "common.h"
146834e67057SKenneth E. Jansen#ifdef HAVE_SVLS
146934e67057SKenneth E. Jansen        include "svLS.h"
1470436f1a2bSCameron Smith
1471436f1a2bSCameron Smith        TYPE(svLS_lhsType) svLS_lhs
1472436f1a2bSCameron Smith        TYPE(svLS_lsType) svLS_ls
1473436f1a2bSCameron Smith        TYPE(svLS_commuType) communicator
1474436f1a2bSCameron Smith        TYPE(svLS_lsType) svLS_ls_S(4)
1475436f1a2bSCameron Smith        TYPE(svLS_lhsType) svLS_lhs_S(4)
1476436f1a2bSCameron Smith        TYPE(svLS_commuType) communicator_S(4)
1477436f1a2bSCameron Smith        INTEGER svLS_nFaces, gnNo, nNo, faIn, facenNo
147834e67057SKenneth E. Jansen#endif
147929511ef9SCameron Smith        integer, allocatable :: gNodes(:)
148029511ef9SCameron Smith        real*8, allocatable :: sV(:,:)
148134e67057SKenneth E. Jansen        character*1024    servername
148234e67057SKenneth E. Jansen#ifdef HAVE_LESLIB
148353c9b1fcSKenneth E. Jansen        integer   rowp(nshg,nnz),         colm(nshg+1),
148453c9b1fcSKenneth E. Jansen     &            iBC(nshg)
148534e67057SKenneth E. Jansen        integer eqnType
148634e67057SKenneth E. Jansen!      IF (svLSFlag .EQ. 0) THEN  !When we get a PETSc option it also could block this or a positive leslib
148734e67057SKenneth E. Jansen        call SolverLicenseServer(servername)
148834e67057SKenneth E. Jansen!      ENDIF
148934e67057SKenneth E. Jansen#endif
149034e67057SKenneth E. Jansenc
149134e67057SKenneth E. Jansenc.... For linear solver Library
149234e67057SKenneth E. Jansenc
149334e67057SKenneth E. Jansenc
149434e67057SKenneth E. Jansenc.... assign parameter values
149534e67057SKenneth E. Jansenc
149634e67057SKenneth E. Jansen        do i = 1, 100
149734e67057SKenneth E. Jansen           numeqns(i) = i
149834e67057SKenneth E. Jansen        enddo
149934e67057SKenneth E. Jansenc
150034e67057SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve
150134e67057SKenneth E. Jansenc
150234e67057SKenneth E. Jansen      nsolt=mod(impl(1),2)      ! 1 if solving temperature
150334e67057SKenneth E. Jansen      nsclrsol=nsolt+nsclr      ! total number of scalars solved At
150434e67057SKenneth E. Jansen                                ! some point we probably want to create
150534e67057SKenneth E. Jansen                                ! a map, considering stepseq(), to find
150634e67057SKenneth E. Jansen                                ! what is actually solved and only
150734e67057SKenneth E. Jansen                                ! dimension lhs to the appropriate
150834e67057SKenneth E. Jansen                                ! size. (see 1.6.1 and earlier for a
150934e67057SKenneth E. Jansen                                ! "failed" attempt at this).
151034e67057SKenneth E. Jansen
151134e67057SKenneth E. Jansen
151234e67057SKenneth E. Jansen      nsolflow=mod(impl(1),100)/10  ! 1 if solving flow
151334e67057SKenneth E. Jansen
151434e67057SKenneth E. Jansenc
151534e67057SKenneth E. Jansenc.... Now, call lesNew routine to initialize
151634e67057SKenneth E. Jansenc     memory space
151734e67057SKenneth E. Jansenc
151834e67057SKenneth E. Jansen      call genadj(colm, rowp, icnt )  ! preprocess the adjacency list
151934e67057SKenneth E. Jansen
152034e67057SKenneth E. Jansen      nnz_tot=icnt ! this is exactly the number of non-zero blocks on
152134e67057SKenneth E. Jansen                   ! this proc
152234e67057SKenneth E. Jansen
152334e67057SKenneth E. Jansen      if (nsolflow.eq.1) then  ! start of setup for the flow
152434e67057SKenneth E. Jansen         lesId   = numeqns(1)
152534e67057SKenneth E. Jansen         eqnType = 1
152634e67057SKenneth E. Jansen         nDofs   = 4
152734e67057SKenneth E. Jansen
152834e67057SKenneth E. Jansen!--------------------------------------------------------------------
152934e67057SKenneth E. Jansen!     Rest of configuration of svLS is added here, where we have LHS
153034e67057SKenneth E. Jansen!     pointers
153134e67057SKenneth E. Jansen
153234e67057SKenneth E. Jansen         nPermDims = 1
153334e67057SKenneth E. Jansen         nTmpDims = 1
153434e67057SKenneth E. Jansen
153534e67057SKenneth E. Jansen
153634e67057SKenneth E. Jansen         allocate (lhsP(4,nnz_tot))
153734e67057SKenneth E. Jansen         allocate (lhsK(9,nnz_tot))
153834e67057SKenneth E. Jansen
153934e67057SKenneth E. Jansen!     Setting up svLS or leslib for flow
154034e67057SKenneth E. Jansen
154134e67057SKenneth E. Jansen      IF (svLSFlag .EQ. 1) THEN
154234e67057SKenneth E. Jansen#ifdef HAVE_SVLS
154334e67057SKenneth E. Jansen        IF(nPrjs.eq.0) THEN
154434e67057SKenneth E. Jansen           svLSType=2  !GMRES if borrowed ACUSIM projection vectors variable set to zero
154534e67057SKenneth E. Jansen         ELSE
154634e67057SKenneth E. Jansen           svLSType=3 !NS solver
154734e67057SKenneth E. Jansen         ENDIF
154834e67057SKenneth E. Jansen!  reltol for the NSSOLVE is the stop criterion on the outer loop
154934e67057SKenneth E. Jansen!  reltolIn is (eps_GM, eps_CG) from the CompMech paper
155034e67057SKenneth E. Jansen!  for now we are using
155134e67057SKenneth E. Jansen!  Tolerance on ACUSIM Pressure Projection for CG and
155234e67057SKenneth E. Jansen!  Tolerance on Momentum Equations for GMRES
155334e67057SKenneth E. Jansen! also using Kspaceand maxIters from setup for ACUSIM
155434e67057SKenneth E. Jansen!
155534e67057SKenneth E. Jansen         eps_outer=40.0*epstol(1)  !following papers soggestion for now
155634e67057SKenneth E. Jansen         CALL svLS_LS_CREATE(svLS_ls, svLSType, dimKry=Kspace,
155734e67057SKenneth E. Jansen     2      relTol=eps_outer, relTolIn=(/epstol(1),prestol/),
155834e67057SKenneth E. Jansen     3      maxItr=maxIters,
155934e67057SKenneth E. Jansen     4      maxItrIn=(/maxIters,maxIters/))
156034e67057SKenneth E. Jansen
156134e67057SKenneth E. Jansen         CALL svLS_COMMU_CREATE(communicator, MPI_COMM_WORLD)
156234e67057SKenneth E. Jansen            nNo=nshg
156334e67057SKenneth E. Jansen            gnNo=nshgt
156434e67057SKenneth E. Jansen            IF  (ipvsq .GE. 2) THEN
156534e67057SKenneth E. Jansen
156634e67057SKenneth E. Jansen#if((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 1))
156734e67057SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs
156834e67057SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs + numCORSrfs
156934e67057SKenneth E. Jansen#elif((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 0))
157034e67057SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs
157134e67057SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs + numCORSrfs
157234e67057SKenneth E. Jansen#elif((VER_CORONARY == 0)&&(VER_CLOSEDLOOP == 1))
157334e67057SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs
157434e67057SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs
157534e67057SKenneth E. Jansen#else
157634e67057SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs
157734e67057SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs
157834e67057SKenneth E. Jansen#endif
157934e67057SKenneth E. Jansen
158034e67057SKenneth E. Jansen            ELSE
158134e67057SKenneth E. Jansen               svLS_nFaces = 1   !not sure about this...looks like 1 means 0 for array size issues
158234e67057SKenneth E. Jansen            END IF
158334e67057SKenneth E. Jansen
158434e67057SKenneth E. Jansen            faIn = 1
158534e67057SKenneth E. Jansen            facenNo = 0
158634e67057SKenneth E. Jansen            DO i=1, nshg
158734e67057SKenneth E. Jansen               IF (IBITS(iBC(i),3,3) .NE. 0)  facenNo = facenNo + 1
158834e67057SKenneth E. Jansen            END DO
158934e67057SKenneth E. Jansen            ALLOCATE(gNodes(facenNo), sV(nsd,facenNo))
159034e67057SKenneth E. Jansen            sV = 0D0
159134e67057SKenneth E. Jansen            j = 0
159234e67057SKenneth E. Jansen            DO i=1, nshg
159334e67057SKenneth E. Jansen               IF (IBITS(iBC(i),3,3) .NE. 0) THEN
159434e67057SKenneth E. Jansen                  j = j + 1
159534e67057SKenneth E. Jansen                  gNodes(j) = i
159634e67057SKenneth E. Jansen                  IF (.NOT.BTEST(iBC(i),3)) sV(1,j) = 1D0
159734e67057SKenneth E. Jansen                  IF (.NOT.BTEST(iBC(i),4)) sV(2,j) = 1D0
159834e67057SKenneth E. Jansen                  IF (.NOT.BTEST(iBC(i),5)) sV(3,j) = 1D0
159934e67057SKenneth E. Jansen               END IF
160034e67057SKenneth E. Jansen            END DO
1601436f1a2bSCameron Smith            CALL svLS_LHS_CREATE(svLS_lhs, communicator, gnNo, nNo,
1602436f1a2bSCameron Smith     2         nnz_tot, gNodes, colm, rowp, svLS_nFaces)
160334e67057SKenneth E. Jansen            CALL svLS_BC_CREATE(svLS_lhs, faIn, facenNo,
160434e67057SKenneth E. Jansen     2         nsd, BC_TYPE_Dir, gNodes, sV)
160534e67057SKenneth E. Jansen            DEALLOCATE(gNodes)
160634e67057SKenneth E. Jansen            DEALLOCATE(sV)
160734e67057SKenneth E. Jansen#else
160834e67057SKenneth E. Jansen         if(myrank.eq.0) write(*,*) 'your input requests svLS but your cmake did not build for it'
160934e67057SKenneth E. Jansen         call error('itrdrv  ','nosVLS',svLSFlag)
161034e67057SKenneth E. Jansen#endif
161134e67057SKenneth E. Jansen           ENDIF
161234e67057SKenneth E. Jansen
161334e67057SKenneth E. Jansen           if(leslib.eq.1) then
161434e67057SKenneth E. Jansen#ifdef HAVE_LESLIB
161534e67057SKenneth E. Jansen!--------------------------------------------------------------------
161634e67057SKenneth E. Jansen           call myfLesNew( lesId,   41994,
161734e67057SKenneth E. Jansen     &                 eqnType,
161834e67057SKenneth E. Jansen     &                 nDofs,          minIters,       maxIters,
161934e67057SKenneth E. Jansen     &                 Kspace,         iprjFlag,        nPrjs,
162034e67057SKenneth E. Jansen     &                 ipresPrjFlag,    nPresPrjs,      epstol(1),
162134e67057SKenneth E. Jansen     &                 prestol,        iverbose,        statsflow,
162234e67057SKenneth E. Jansen     &                 nPermDims,      nTmpDims,      servername  )
162334e67057SKenneth E. Jansen
162434e67057SKenneth E. Jansen           allocate (aperm(nshg,nPermDims))
162534e67057SKenneth E. Jansen           allocate (atemp(nshg,nTmpDims))
162634e67057SKenneth E. Jansen           call readLesRestart( lesId,  aperm, nshg, myrank, lstep,
162734e67057SKenneth E. Jansen     &                        nPermDims )
162834e67057SKenneth E. Jansen#else
162934e67057SKenneth E. Jansen         if(myrank.eq.0) write(*,*) 'your input requests leslib but your cmake did not build for it'
163034e67057SKenneth E. Jansen         call error('itrdrv  ','nolslb',leslib)
163134e67057SKenneth E. Jansen#endif
163234e67057SKenneth E. Jansen         endif !leslib=1
163334e67057SKenneth E. Jansen
163434e67057SKenneth E. Jansen      else   ! not solving flow just scalar
163534e67057SKenneth E. Jansen         nPermDims = 0
163634e67057SKenneth E. Jansen         nTmpDims = 0
163734e67057SKenneth E. Jansen      endif
163834e67057SKenneth E. Jansen
163934e67057SKenneth E. Jansen
164034e67057SKenneth E. Jansen      if(nsclrsol.gt.0) then
164134e67057SKenneth E. Jansen       do isolsc=1,nsclrsol
164234e67057SKenneth E. Jansen         lesId       = numeqns(isolsc+1)
164334e67057SKenneth E. Jansen         eqnType     = 2
164434e67057SKenneth E. Jansen         nDofs       = 1
164534e67057SKenneth E. Jansen         isclpresPrjflag = 0
164634e67057SKenneth E. Jansen         nPresPrjs   = 0
164734e67057SKenneth E. Jansen         isclprjFlag     = 1
164834e67057SKenneth E. Jansen         indx=isolsc+2-nsolt ! complicated to keep epstol(2) for
164934e67057SKenneth E. Jansen                             ! temperature followed by scalars
165034e67057SKenneth E. Jansen!     Setting up svLS or leslib for scalar
165134e67057SKenneth E. Jansen#ifdef HAVE_SVLS
165234e67057SKenneth E. Jansen      IF (svLSFlag .EQ. 1) THEN
165334e67057SKenneth E. Jansen           svLSType=2  !only option for scalars
165434e67057SKenneth E. Jansen!  reltol for the GMRES is the stop criterion
165534e67057SKenneth E. Jansen! also using Kspaceand maxIters from setup for ACUSIM
165634e67057SKenneth E. Jansen!
165734e67057SKenneth E. Jansen         CALL svLS_LS_CREATE(svLS_ls_S(isolsc), svLSType, dimKry=Kspace,
165834e67057SKenneth E. Jansen     2      relTol=epstol(indx),
165934e67057SKenneth E. Jansen     3      maxItr=maxIters
166034e67057SKenneth E. Jansen     4      )
166134e67057SKenneth E. Jansen
166234e67057SKenneth E. Jansen         CALL svLS_COMMU_CREATE(communicator_S(isolsc), MPI_COMM_WORLD)
166334e67057SKenneth E. Jansen
166434e67057SKenneth E. Jansen              faIn = 1
166534e67057SKenneth E. Jansen              facenNo = 0
166634e67057SKenneth E. Jansen              ib=5+isolsc
166734e67057SKenneth E. Jansen              DO i=1, nshg
166834e67057SKenneth E. Jansen                 IF (btest(iBC(i),ib))  facenNo = facenNo + 1
166934e67057SKenneth E. Jansen              END DO
167034e67057SKenneth E. Jansen              ALLOCATE(gNodes(facenNo), sV(1,facenNo))
167134e67057SKenneth E. Jansen              sV = 0D0
167234e67057SKenneth E. Jansen              j = 0
167334e67057SKenneth E. Jansen              DO i=1, nshg
167434e67057SKenneth E. Jansen               IF (btest(iBC(i),ib)) THEN
167534e67057SKenneth E. Jansen                  j = j + 1
167634e67057SKenneth E. Jansen                  gNodes(j) = i
167734e67057SKenneth E. Jansen               END IF
167834e67057SKenneth E. Jansen              END DO
167934e67057SKenneth E. Jansen
1680436f1a2bSCameron Smith            svLS_nFaces = 1   !not sure about this...should try it with zero
1681436f1a2bSCameron Smith            CALL svLS_LHS_CREATE(svLS_lhs_S(isolsc), communicator_S(isolsc), gnNo, nNo,
1682436f1a2bSCameron Smith     2         nnz_tot, gNodes, colm, rowp, svLS_nFaces)
1683436f1a2bSCameron Smith
168434e67057SKenneth E. Jansen            CALL svLS_BC_CREATE(svLS_lhs_S(isolsc), faIn, facenNo,
168534e67057SKenneth E. Jansen     2         1, BC_TYPE_Dir, gNodes, sV(1,:))
168634e67057SKenneth E. Jansen            DEALLOCATE(gNodes)
168734e67057SKenneth E. Jansen            DEALLOCATE(sV)
168834e67057SKenneth E. Jansen
168934e67057SKenneth E. Jansen            if( isolsc.eq.1) then ! if multiple scalars make sure done once
169034e67057SKenneth E. Jansen              allocate (apermS(1,1,1))
169134e67057SKenneth E. Jansen              allocate (atempS(1,1))  !they can all share this
169234e67057SKenneth E. Jansen            endif
169334e67057SKenneth E. Jansen         ENDIF  !svLS handing scalar solve
169434e67057SKenneth E. Jansen#endif
169534e67057SKenneth E. Jansen
169634e67057SKenneth E. Jansen
169734e67057SKenneth E. Jansen#ifdef HAVE_LESLIB
169834e67057SKenneth E. Jansen         if (leslib.eq.1) then
169934e67057SKenneth E. Jansen         call myfLesNew( lesId,            41994,
170034e67057SKenneth E. Jansen     &                 eqnType,
170134e67057SKenneth E. Jansen     &                 nDofs,          minIters,       maxIters,
170234e67057SKenneth E. Jansen     &                 Kspace,         isclprjFlag,        nPrjs,
170334e67057SKenneth E. Jansen     &                 isclpresPrjFlag,    nPresPrjs,      epstol(indx),
170434e67057SKenneth E. Jansen     &                 prestol,        iverbose,        statssclr,
170534e67057SKenneth E. Jansen     &                 nPermDimsS,     nTmpDimsS,   servername )
170634e67057SKenneth E. Jansen        endif
170734e67057SKenneth E. Jansen#endif
170834e67057SKenneth E. Jansen       enddo  !loop over scalars to solve  (not yet worked out for multiple svLS solves
170934e67057SKenneth E. Jansen       allocate (lhsS(nnz_tot,nsclrsol))
171034e67057SKenneth E. Jansen#ifdef HAVE_LESLIB
171134e67057SKenneth E. Jansen       if(leslib.eq.1) then  ! we just prepped scalar solves for leslib so allocate arrays
171234e67057SKenneth E. Jansenc
171334e67057SKenneth E. Jansenc  Assume all scalars have the same size needs
171434e67057SKenneth E. Jansenc
171534e67057SKenneth E. Jansen       allocate (apermS(nshg,nPermDimsS,nsclrsol))
171634e67057SKenneth E. Jansen       allocate (atempS(nshg,nTmpDimsS))  !they can all share this
171734e67057SKenneth E. Jansen       endif
171834e67057SKenneth E. Jansen#endif
171934e67057SKenneth E. Jansenc
172034e67057SKenneth E. Jansenc actually they could even share with atemp but leave that for later
172134e67057SKenneth E. Jansenc
172234e67057SKenneth E. Jansen      else !no scalar solves at all so zero dims not used
172334e67057SKenneth E. Jansen         nPermDimsS = 0
172434e67057SKenneth E. Jansen         nTmpDimsS  = 0
172534e67057SKenneth E. Jansen      endif
172634e67057SKenneth E. Jansen      return
172734e67057SKenneth E. Jansen      end subroutine
1728436f1a2bSCameron Smith
1729436f1a2bSCameron Smith
173034e67057SKenneth E. Jansen      subroutine seticomputevort
173134e67057SKenneth E. Jansen        include "common.h"
173234e67057SKenneth E. Jansen            icomputevort = 0
173334e67057SKenneth E. Jansen            if (ivort == 1) then ! Print vorticity = True in solver.inp
173434e67057SKenneth E. Jansen              ! We then compute the vorticity only if we
173534e67057SKenneth E. Jansen              ! 1) we write an intermediate checkpoint
173634e67057SKenneth E. Jansen              ! 2) we reach the last time step and write the last checkpoint
173734e67057SKenneth E. Jansen              ! 3) we accumulate statistics in ybar for every time step
173834e67057SKenneth E. Jansen              ! BEWARE: we need here lstep+1 and istep+1 because the lstep and
173934e67057SKenneth E. Jansen              ! istep gets incremened after the flowsolve, further below
174034e67057SKenneth E. Jansen              if (((irs .ge. 1) .and. (mod(lstep+1, ntout) .eq. 0)) .or.
174134e67057SKenneth E. Jansen     &                   istep+1.eq.nstep(itseq) .or. ioybar == 1) then
174234e67057SKenneth E. Jansen                icomputevort = 1
174334e67057SKenneth E. Jansen              endif
174434e67057SKenneth E. Jansen            endif
174534e67057SKenneth E. Jansen
174634e67057SKenneth E. Jansen!            write(*,*) 'icomputevort: ',icomputevort, ' - istep: ',
174734e67057SKenneth E. Jansen!     &                istep,' - nstep(itseq):',nstep(itseq),'- lstep:',
174834e67057SKenneth E. Jansen!     &                lstep, '- ntout:', ntout
174934e67057SKenneth E. Jansen      return
175034e67057SKenneth E. Jansen      end subroutine
175134e67057SKenneth E. Jansen
175253c9b1fcSKenneth E. Jansen      subroutine computeVort( vorticity, GradV,strain)
175353c9b1fcSKenneth E. Jansen        include "common.h"
175453c9b1fcSKenneth E. Jansen
175553c9b1fcSKenneth E. Jansen        real*8 gradV(nshg,nsdsq), strain(nshg,6), vorticity(nshg,5)
175634e67057SKenneth E. Jansen
175734e67057SKenneth E. Jansen              ! vorticity components and magnitude
175834e67057SKenneth E. Jansen              vorticity(:,1) = GradV(:,8)-GradV(:,6) !omega_x
175934e67057SKenneth E. Jansen              vorticity(:,2) = GradV(:,3)-GradV(:,7) !omega_y
176034e67057SKenneth E. Jansen              vorticity(:,3) = GradV(:,4)-GradV(:,2) !omega_z
176134e67057SKenneth E. Jansen              vorticity(:,4) = sqrt(   vorticity(:,1)*vorticity(:,1)
176234e67057SKenneth E. Jansen     &                               + vorticity(:,2)*vorticity(:,2)
176334e67057SKenneth E. Jansen     &                               + vorticity(:,3)*vorticity(:,3) )
176434e67057SKenneth E. Jansen              ! Q
176534e67057SKenneth E. Jansen              strain(:,1) = GradV(:,1)                  !S11
176634e67057SKenneth E. Jansen              strain(:,2) = 0.5*(GradV(:,2)+GradV(:,4)) !S12
176734e67057SKenneth E. Jansen              strain(:,3) = 0.5*(GradV(:,3)+GradV(:,7)) !S13
176834e67057SKenneth E. Jansen              strain(:,4) = GradV(:,5)                  !S22
176934e67057SKenneth E. Jansen              strain(:,5) = 0.5*(GradV(:,6)+GradV(:,8)) !S23
177034e67057SKenneth E. Jansen              strain(:,6) = GradV(:,9)                  !S33
177134e67057SKenneth E. Jansen
177234e67057SKenneth E. Jansen              vorticity(:,5) = 0.25*( vorticity(:,4)*vorticity(:,4)  !Q
177334e67057SKenneth E. Jansen     &                            - 2.0*(      strain(:,1)*strain(:,1)
177434e67057SKenneth E. Jansen     &                                    + 2* strain(:,2)*strain(:,2)
177534e67057SKenneth E. Jansen     &                                    + 2* strain(:,3)*strain(:,3)
177634e67057SKenneth E. Jansen     &                                    +    strain(:,4)*strain(:,4)
177734e67057SKenneth E. Jansen     &                                    + 2* strain(:,5)*strain(:,5)
177834e67057SKenneth E. Jansen     &                                    +    strain(:,6)*strain(:,6)))
177934e67057SKenneth E. Jansen
178034e67057SKenneth E. Jansen      return
178134e67057SKenneth E. Jansen      end subroutine
178234e67057SKenneth E. Jansen
178334e67057SKenneth E. Jansen      subroutine dumpTimeSeries()
178434e67057SKenneth E. Jansen      use timedata   !allows collection of time series
178534e67057SKenneth E. Jansen      include "common.h"
1786*3beb3aadSMichel Rasquin      include "mpif.h"
178753c9b1fcSKenneth E. Jansen       character*60    fvarts
178853c9b1fcSKenneth E. Jansen       character*10    cname2
178934e67057SKenneth E. Jansen
179034e67057SKenneth E. Jansen
179134e67057SKenneth E. Jansen                  if (numpe > 1) then
179234e67057SKenneth E. Jansen                     do jj = 1, ntspts
179334e67057SKenneth E. Jansen                        vartssoln((jj-1)*ndof+1:jj*ndof)=varts(jj,:)
179434e67057SKenneth E. Jansen                        ivarts=zero
179534e67057SKenneth E. Jansen                     enddo
179634e67057SKenneth E. Jansen                     do k=1,ndof*ntspts
179734e67057SKenneth E. Jansen                        if(vartssoln(k).ne.zero) ivarts(k)=1
179834e67057SKenneth E. Jansen                     enddo
179934e67057SKenneth E. Jansen
180034e67057SKenneth E. Jansen!                     call MPI_REDUCE(vartssoln, vartssolng, ndof*ntspts,
180134e67057SKenneth E. Jansen!     &                    MPI_DOUBLE_PRECISION, MPI_SUM, master,
180234e67057SKenneth E. Jansen!     &                    MPI_COMM_WORLD, ierr)
180334e67057SKenneth E. Jansen
180434e67057SKenneth E. Jansen                     call MPI_BARRIER(MPI_COMM_WORLD, ierr)
180534e67057SKenneth E. Jansen                     call MPI_ALLREDUCE(vartssoln, vartssolng,
180634e67057SKenneth E. Jansen     &                    ndof*ntspts,
180734e67057SKenneth E. Jansen     &                    MPI_DOUBLE_PRECISION, MPI_SUM,
180834e67057SKenneth E. Jansen     &                    MPI_COMM_WORLD, ierr)
180934e67057SKenneth E. Jansen
181034e67057SKenneth E. Jansen!                     call MPI_REDUCE(ivarts, ivartsg, ndof*ntspts,
181134e67057SKenneth E. Jansen!     &                    MPI_INTEGER, MPI_SUM, master,
181234e67057SKenneth E. Jansen!     &                    MPI_COMM_WORLD, ierr)
181334e67057SKenneth E. Jansen
181434e67057SKenneth E. Jansen                     call MPI_BARRIER(MPI_COMM_WORLD, ierr)
181534e67057SKenneth E. Jansen                     call MPI_ALLREDUCE(ivarts, ivartsg, ndof*ntspts,
181634e67057SKenneth E. Jansen     &                    MPI_INTEGER, MPI_SUM,
181734e67057SKenneth E. Jansen     &                    MPI_COMM_WORLD, ierr)
181834e67057SKenneth E. Jansen
181934e67057SKenneth E. Jansen!                     if (myrank.eq.zero) then
182034e67057SKenneth E. Jansen                     do jj = 1, ntspts
182134e67057SKenneth E. Jansen
182234e67057SKenneth E. Jansen                        if(myrank .eq. iv_rank(jj)) then
182334e67057SKenneth E. Jansen                           ! No need to update all varts components, only the one treated by the expected rank
182434e67057SKenneth E. Jansen                           ! Note: keep varts as a vector, as multiple probes could be treated by one rank
182534e67057SKenneth E. Jansen                           indxvarts = (jj-1)*ndof
182634e67057SKenneth E. Jansen                           do k=1,ndof
182734e67057SKenneth E. Jansen                              if(ivartsg(indxvarts+k).ne.0) then ! none of the vartssoln(parts) were non zero
182834e67057SKenneth E. Jansen                                 varts(jj,k)=vartssolng(indxvarts+k)/
182934e67057SKenneth E. Jansen     &                                             ivartsg(indxvarts+k)
183034e67057SKenneth E. Jansen                              endif
183134e67057SKenneth E. Jansen                           enddo
183234e67057SKenneth E. Jansen                       endif !only if myrank eq iv_rank(jj)
183334e67057SKenneth E. Jansen                     enddo
183434e67057SKenneth E. Jansen!                     endif !only on master
183534e67057SKenneth E. Jansen                  endif !only if numpe > 1
183634e67057SKenneth E. Jansen
183734e67057SKenneth E. Jansen!                  if (myrank.eq.zero) then
183834e67057SKenneth E. Jansen                  do jj = 1, ntspts
183934e67057SKenneth E. Jansen                     if(myrank .eq. iv_rank(jj)) then
184034e67057SKenneth E. Jansen                        ifile = 1000+jj
184134e67057SKenneth E. Jansen                        write(ifile,555) lstep, (varts(jj,k),k=1,ndof) !Beware of format 555 - check ndof
184234e67057SKenneth E. Jansenc                        call flush(ifile)
184334e67057SKenneth E. Jansen                        if (((irs .ge. 1) .and.
184434e67057SKenneth E. Jansen     &                       (mod(lstep, ntout) .eq. 0))) then
184534e67057SKenneth E. Jansen                           close(ifile)
184634e67057SKenneth E. Jansen                           fvarts='varts/varts'
184734e67057SKenneth E. Jansen                           fvarts=trim(fvarts)//trim(cname2(jj))
184834e67057SKenneth E. Jansen                           fvarts=trim(fvarts)//trim(cname2(lskeep))
184934e67057SKenneth E. Jansen                           fvarts=trim(fvarts)//'.dat'
185034e67057SKenneth E. Jansen                           fvarts=trim(fvarts)
185134e67057SKenneth E. Jansen                           open(unit=ifile, file=fvarts,
185234e67057SKenneth E. Jansen     &                          position='append')
185334e67057SKenneth E. Jansen                        endif !only when dumping restart
185434e67057SKenneth E. Jansen                     endif
185534e67057SKenneth E. Jansen                  enddo
185634e67057SKenneth E. Jansen!                  endif !only on master
185734e67057SKenneth E. Jansen
185834e67057SKenneth E. Jansen                  varts(:,:) = zero ! reset the array for next step
185934e67057SKenneth E. Jansen
186034e67057SKenneth E. Jansen
186134e67057SKenneth E. Jansen!555              format(i6,5(2x,E12.5e2))
186234e67057SKenneth E. Jansen555               format(i6,6(2x,E20.12e2)) !assuming ndof = 6 here
186334e67057SKenneth E. Jansen
186434e67057SKenneth E. Jansen      return
186534e67057SKenneth E. Jansen      end subroutine
186634e67057SKenneth E. Jansen
186734e67057SKenneth E. Jansen      subroutine collectErrorYbar(ybar,yold,wallssVec,wallssVecBar,
186853c9b1fcSKenneth E. Jansen     &               vorticity,yphbar,rerr,irank2ybar,irank2yphbar)
186934e67057SKenneth E. Jansen      include "common.h"
187053c9b1fcSKenneth E. Jansen      real*8 ybar(nshg,irank2yphbar),yold(nshg,ndof),vorticity(nshg,5)
187153c9b1fcSKenneth E. Jansen      real*8 yphbar(nshg,irank2yphbar,nphasesincycle)
187253c9b1fcSKenneth E. Jansen      real*8 wallssvec(nshg,3),wallssVecBar(nshg,3), rerr(nshg,numerr)
187334e67057SKenneth E. Jansenc$$$c
187434e67057SKenneth E. Jansenc$$$c compute average
187534e67057SKenneth E. Jansenc$$$c
187634e67057SKenneth E. Jansenc$$$               tfact=one/istep
187734e67057SKenneth E. Jansenc$$$               ybar =tfact*yold + (one-tfact)*ybar
187834e67057SKenneth E. Jansen
187934e67057SKenneth E. Jansenc compute average
188034e67057SKenneth E. Jansenc ybar(:,1:3) are average velocity components
188134e67057SKenneth E. Jansenc ybar(:,4) is average pressure
188234e67057SKenneth E. Jansenc ybar(:,5) is average speed
188334e67057SKenneth E. Jansenc ybar(:,6:8) is average of sq. of each vel. component
188434e67057SKenneth E. Jansenc ybar(:,9) is average of sq. of pressure
188534e67057SKenneth E. Jansenc ybar(:,10:12) is average of cross vel. components : uv, uw and vw
188634e67057SKenneth E. Jansenc averaging procedure justified only for identical time step sizes
188734e67057SKenneth E. Jansenc ybar(:,13) is average of eddy viscosity
188834e67057SKenneth E. Jansenc ybar(:,14:16) is average vorticity components
188934e67057SKenneth E. Jansenc ybar(:,17) is average vorticity magnitude
189034e67057SKenneth E. Jansenc istep is number of time step
189134e67057SKenneth E. Jansenc
189234e67057SKenneth E. Jansen      icollectybar = 0
189334e67057SKenneth E. Jansen      if(nphasesincycle.eq.0 .or.
189434e67057SKenneth E. Jansen     &            istep.gt.ncycles_startphaseavg*nstepsincycle) then
189534e67057SKenneth E. Jansen               icollectybar = 1
189634e67057SKenneth E. Jansen               if((istep-1).eq.ncycles_startphaseavg*nstepsincycle)
189734e67057SKenneth E. Jansen     &               istepsinybar = 0 ! init. to zero in first cycle in avg.
189834e67057SKenneth E. Jansen               endif
189934e67057SKenneth E. Jansen
190034e67057SKenneth E. Jansen               if(icollectybar.eq.1) then
190134e67057SKenneth E. Jansen                  istepsinybar = istepsinybar+1
190234e67057SKenneth E. Jansen                  tfact=one/istepsinybar
190334e67057SKenneth E. Jansen
190434e67057SKenneth E. Jansen!                  if(myrank.eq.master .and. nphasesincycle.ne.0 .and.
190534e67057SKenneth E. Jansen!     &               mod((istep-1),nstepsincycle).eq.0)
190634e67057SKenneth E. Jansen!     &               write(*,*)'nsamples in phase average:',istepsinybar
190734e67057SKenneth E. Jansen
190834e67057SKenneth E. Jansenc ybar to contain the averaged ((u,v,w),p)-fields
190934e67057SKenneth E. Jansenc and speed average, i.e., sqrt(u^2+v^2+w^2)
191034e67057SKenneth E. Jansenc and avg. of sq. terms including
191134e67057SKenneth E. Jansenc u^2, v^2, w^2, p^2 and cross terms of uv, uw and vw
191234e67057SKenneth E. Jansen
191334e67057SKenneth E. Jansen                  ybar(:,1) = tfact*yold(:,1) + (one-tfact)*ybar(:,1)
191434e67057SKenneth E. Jansen                  ybar(:,2) = tfact*yold(:,2) + (one-tfact)*ybar(:,2)
191534e67057SKenneth E. Jansen                  ybar(:,3) = tfact*yold(:,3) + (one-tfact)*ybar(:,3)
191634e67057SKenneth E. Jansen                  ybar(:,4) = tfact*yold(:,4) + (one-tfact)*ybar(:,4)
191734e67057SKenneth E. Jansen                  ybar(:,5) = tfact*sqrt(yold(:,1)**2+yold(:,2)**2+
191834e67057SKenneth E. Jansen     &                        yold(:,3)**2) + (one-tfact)*ybar(:,5)
191934e67057SKenneth E. Jansen                  ybar(:,6) = tfact*yold(:,1)**2 +
192034e67057SKenneth E. Jansen     &                        (one-tfact)*ybar(:,6)
192134e67057SKenneth E. Jansen                  ybar(:,7) = tfact*yold(:,2)**2 +
192234e67057SKenneth E. Jansen     &                        (one-tfact)*ybar(:,7)
192334e67057SKenneth E. Jansen                  ybar(:,8) = tfact*yold(:,3)**2 +
192434e67057SKenneth E. Jansen     &                        (one-tfact)*ybar(:,8)
192534e67057SKenneth E. Jansen                  ybar(:,9) = tfact*yold(:,4)**2 +
192634e67057SKenneth E. Jansen     &                        (one-tfact)*ybar(:,9)
192734e67057SKenneth E. Jansen                  ybar(:,10) = tfact*yold(:,1)*yold(:,2) + !uv
192834e67057SKenneth E. Jansen     &                         (one-tfact)*ybar(:,10)
192934e67057SKenneth E. Jansen                  ybar(:,11) = tfact*yold(:,1)*yold(:,3) + !uw
193034e67057SKenneth E. Jansen     &                         (one-tfact)*ybar(:,11)
193134e67057SKenneth E. Jansen                  ybar(:,12) = tfact*yold(:,2)*yold(:,3) + !vw
193234e67057SKenneth E. Jansen     &                         (one-tfact)*ybar(:,12)
193334e67057SKenneth E. Jansen                  if(nsclr.gt.0) !nut
193434e67057SKenneth E. Jansen     &             ybar(:,13) = tfact*yold(:,6) + (one-tfact)*ybar(:,13)
193534e67057SKenneth E. Jansen
193634e67057SKenneth E. Jansen                  if(ivort == 1) then !vorticity
193734e67057SKenneth E. Jansen                    ybar(:,14) = tfact*vorticity(:,1) +
193834e67057SKenneth E. Jansen     &                           (one-tfact)*ybar(:,14)
193934e67057SKenneth E. Jansen                    ybar(:,15) = tfact*vorticity(:,2) +
194034e67057SKenneth E. Jansen     &                           (one-tfact)*ybar(:,15)
194134e67057SKenneth E. Jansen                    ybar(:,16) = tfact*vorticity(:,3) +
194234e67057SKenneth E. Jansen     &                           (one-tfact)*ybar(:,16)
194334e67057SKenneth E. Jansen                    ybar(:,17) = tfact*vorticity(:,4) +
194434e67057SKenneth E. Jansen     &                           (one-tfact)*ybar(:,17)
194534e67057SKenneth E. Jansen                  endif
194634e67057SKenneth E. Jansen
194734e67057SKenneth E. Jansen                  if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
194834e67057SKenneth E. Jansen                    wallssVecBar(:,1) = tfact*wallssVec(:,1)
194934e67057SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,1)
195034e67057SKenneth E. Jansen                    wallssVecBar(:,2) = tfact*wallssVec(:,2)
195134e67057SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,2)
195234e67057SKenneth E. Jansen                    wallssVecBar(:,3) = tfact*wallssVec(:,3)
195334e67057SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,3)
195434e67057SKenneth E. Jansen                  endif
195534e67057SKenneth E. Jansen               endif !icollectybar.eq.1
195634e67057SKenneth E. Jansenc
195734e67057SKenneth E. Jansenc compute phase average
195834e67057SKenneth E. Jansenc
195934e67057SKenneth E. Jansen               if(nphasesincycle.ne.0 .and.
196034e67057SKenneth E. Jansen     &            istep.gt.ncycles_startphaseavg*nstepsincycle) then
196134e67057SKenneth E. Jansen
196234e67057SKenneth E. Jansenc beginning of cycle is considered as ncycles_startphaseavg*nstepsincycle+1
196334e67057SKenneth E. Jansen                  if((istep-1).eq.ncycles_startphaseavg*nstepsincycle)
196434e67057SKenneth E. Jansen     &               icyclesinavg = 0 ! init. to zero in first cycle in avg.
196534e67057SKenneth E. Jansen
196634e67057SKenneth E. Jansen                  ! find number of steps between phases
196734e67057SKenneth E. Jansen                  nstepsbtwphase = nstepsincycle/nphasesincycle ! integer value
196834e67057SKenneth E. Jansen                  if(mod(istep-1,nstepsincycle).eq.0) then
196934e67057SKenneth E. Jansen                     iphase = 1 ! init. to one in beginning of every cycle
197034e67057SKenneth E. Jansen                     icyclesinavg = icyclesinavg + 1
197134e67057SKenneth E. Jansen                  endif
197234e67057SKenneth E. Jansen
197334e67057SKenneth E. Jansen                  icollectphase = 0
197434e67057SKenneth E. Jansen                  istepincycle = mod(istep,nstepsincycle)
197534e67057SKenneth E. Jansen                  if(istepincycle.eq.0) istepincycle=nstepsincycle
197634e67057SKenneth E. Jansen                  if(istepincycle.eq.iphase*nstepsbtwphase) then
197734e67057SKenneth E. Jansen                     icollectphase = 1
197834e67057SKenneth E. Jansen                     iphase = iphase+1 ! use 'iphase-1' below
197934e67057SKenneth E. Jansen                  endif
198034e67057SKenneth E. Jansen
198134e67057SKenneth E. Jansen                  if(icollectphase.eq.1) then
198234e67057SKenneth E. Jansen                     tfactphase = one/icyclesinavg
198334e67057SKenneth E. Jansen
198434e67057SKenneth E. Jansen                     if(myrank.eq.master) then
198534e67057SKenneth E. Jansen                       write(*,*) 'nsamples in phase ',iphase-1,': ',
198634e67057SKenneth E. Jansen     &                             icyclesinavg
198734e67057SKenneth E. Jansen                     endif
198834e67057SKenneth E. Jansen
198934e67057SKenneth E. Jansen                     yphbar(:,1,iphase-1) = tfactphase*yold(:,1) +
199034e67057SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,1,iphase-1)
199134e67057SKenneth E. Jansen                     yphbar(:,2,iphase-1) = tfactphase*yold(:,2) +
199234e67057SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,2,iphase-1)
199334e67057SKenneth E. Jansen                     yphbar(:,3,iphase-1) = tfactphase*yold(:,3) +
199434e67057SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,3,iphase-1)
199534e67057SKenneth E. Jansen                     yphbar(:,4,iphase-1) = tfactphase*yold(:,4) +
199634e67057SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,4,iphase-1)
199734e67057SKenneth E. Jansen                     yphbar(:,5,iphase-1) = tfactphase*sqrt(yold(:,1)**2
199834e67057SKenneth E. Jansen     &                          +yold(:,2)**2+yold(:,3)**2) +
199934e67057SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,5,iphase-1)
200034e67057SKenneth E. Jansen                     yphbar(:,6,iphase-1) =
200134e67057SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,1)
200234e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,6,iphase-1)
200334e67057SKenneth E. Jansen
200434e67057SKenneth E. Jansen                     yphbar(:,7,iphase-1) =
200534e67057SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,2)
200634e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,7,iphase-1)
200734e67057SKenneth E. Jansen
200834e67057SKenneth E. Jansen                     yphbar(:,8,iphase-1) =
200934e67057SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,3)
201034e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,8,iphase-1)
201134e67057SKenneth E. Jansen
201234e67057SKenneth E. Jansen                     yphbar(:,9,iphase-1) =
201334e67057SKenneth E. Jansen     &                              tfactphase*yold(:,2)*yold(:,2)
201434e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,9,iphase-1)
201534e67057SKenneth E. Jansen
201634e67057SKenneth E. Jansen                     yphbar(:,10,iphase-1) =
201734e67057SKenneth E. Jansen     &                              tfactphase*yold(:,2)*yold(:,3)
201834e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,10,iphase-1)
201934e67057SKenneth E. Jansen
202034e67057SKenneth E. Jansen                     yphbar(:,11,iphase-1) =
202134e67057SKenneth E. Jansen     &                              tfactphase*yold(:,3)*yold(:,3)
202234e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,11,iphase-1)
202334e67057SKenneth E. Jansen
202434e67057SKenneth E. Jansen                     if(ivort == 1) then
202534e67057SKenneth E. Jansen                       yphbar(:,12,iphase-1) =
202634e67057SKenneth E. Jansen     &                              tfactphase*vorticity(:,1)
202734e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,12,iphase-1)
202834e67057SKenneth E. Jansen                       yphbar(:,13,iphase-1) =
202934e67057SKenneth E. Jansen     &                              tfactphase*vorticity(:,2)
203034e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,13,iphase-1)
203134e67057SKenneth E. Jansen                       yphbar(:,14,iphase-1) =
203234e67057SKenneth E. Jansen     &                              tfactphase*vorticity(:,3)
203334e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,14,iphase-1)
203434e67057SKenneth E. Jansen                       yphbar(:,15,iphase-1) =
203534e67057SKenneth E. Jansen     &                              tfactphase*vorticity(:,4)
203634e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,15,iphase-1)
203734e67057SKenneth E. Jansen                    endif
203834e67057SKenneth E. Jansen                  endif !compute phase average
203934e67057SKenneth E. Jansen      endif !if(nphasesincycle.eq.0 .or. istep.gt.ncycles_startphaseavg*nstepsincycle)
204034e67057SKenneth E. Jansenc
204134e67057SKenneth E. Jansenc compute rms
204234e67057SKenneth E. Jansenc
204334e67057SKenneth E. Jansen      if(icollectybar.eq.1) then
204434e67057SKenneth E. Jansen                  rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2
204534e67057SKenneth E. Jansen                  rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2
204634e67057SKenneth E. Jansen                  rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2
204734e67057SKenneth E. Jansen                  rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2
204834e67057SKenneth E. Jansen      endif
204934e67057SKenneth E. Jansen      return
205034e67057SKenneth E. Jansen      end subroutine
205134e67057SKenneth E. Jansen
2052