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