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