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