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