xref: /phasta/phSolver/incompressible/itrdrv.f (revision 34e670573a35f7483bc764e7984cd2aafb2bfc73)
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
379071d3baSCameron Smith      use iso_c_binding
3859599516SKenneth E. Jansen
3959599516SKenneth E. Jansenc      use readarrays !reads in uold and acold
4059599516SKenneth E. Jansen
4159599516SKenneth E. Jansen        include "common.h"
4259599516SKenneth E. Jansen        include "mpif.h"
4359599516SKenneth E. Jansen        include "auxmpi.h"
44bd36043dSBen Matthews#ifdef HAVE_SVLS
45ae8d68e4SKenneth E. Jansen        include "svLS.h"
46bd36043dSBen Matthews#endif
4779f1763eSKenneth E. Jansen#if !defined(HAVE_SVLS) && !defined(HAVE_LESLIB)
4879f1763eSKenneth E. Jansen#error "You must enable a linear solver during cmake setup"
49bd36043dSBen Matthews#endif
50bd36043dSBen Matthews
5159599516SKenneth E. Jansenc
5259599516SKenneth E. Jansen
5359599516SKenneth E. Jansen
5459599516SKenneth E. Jansen        real*8    y(nshg,ndof),              ac(nshg,ndof),
5559599516SKenneth E. Jansen     &            yold(nshg,ndof),           acold(nshg,ndof),
5659599516SKenneth E. Jansen     &            u(nshg,nsd),               uold(nshg,nsd),
5759599516SKenneth E. Jansen     &            x(numnp,nsd),              solinc(nshg,ndof),
5859599516SKenneth E. Jansen     &            BC(nshg,ndofBC),           tf(nshg,ndof),
5959599516SKenneth E. Jansen     &            GradV(nshg,nsdsq)
6059599516SKenneth E. Jansen
6159599516SKenneth E. Jansenc
6259599516SKenneth E. Jansen        real*8    res(nshg,ndof)
6359599516SKenneth E. Jansenc
6459599516SKenneth E. Jansen        real*8    shp(MAXTOP,maxsh,MAXQPT),
6559599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
6659599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
6759599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
6859599516SKenneth E. Jansenc
6959599516SKenneth E. Jansen        integer   rowp(nshg,nnz),         colm(nshg+1),
7059599516SKenneth E. Jansen     &            iBC(nshg),
7159599516SKenneth E. Jansen     &            ilwork(nlwork),
7259599516SKenneth E. Jansen     &            iper(nshg),            ifuncs(6)
7359599516SKenneth E. Jansen
7459599516SKenneth E. Jansen        real*8 vbc_prof(nshg,3)
7559599516SKenneth E. Jansen
7659599516SKenneth E. Jansen        integer stopjob
7759599516SKenneth E. Jansen        character*10 cname2
7859599516SKenneth E. Jansen        character*5  cname
7959599516SKenneth E. Jansenc
8059599516SKenneth E. Jansenc  stuff for dynamic model s.w.avg and wall model
8159599516SKenneth E. Jansenc
8259599516SKenneth E. Jansen        dimension ifath(numnp),    velbar(nfath,ndof),  nsons(nfath)
8359599516SKenneth E. Jansen
8459599516SKenneth E. Jansen        dimension wallubar(2),walltot(2)
8559599516SKenneth E. Jansenc
8659599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: aperm,  atemp, atempS
8759599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: apermS
8859599516SKenneth E. Jansen
8959599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: lhsP, lhsK, lhsS
9059599516SKenneth E. Jansen        real*8   almit, alfit, gamit
9159599516SKenneth E. Jansenc
9259599516SKenneth E. Jansen        character*20    fname1,fmt1
9359599516SKenneth E. Jansen        character*20    fname2,fmt2
9459599516SKenneth E. Jansen        character*60    fnamepold, fvarts
9559599516SKenneth E. Jansen        character*4     fname4c ! 4 characters
9659599516SKenneth E. Jansen        integer         iarray(50) ! integers for headers
9759599516SKenneth E. Jansen        integer         isgn(ndof), isgng(ndof)
9859599516SKenneth E. Jansen
99*34e67057SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: rerr
10059599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: ybar, strain, vorticity
10159599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: wallssVec, wallssVecbar
10259599516SKenneth E. Jansen
10359599516SKenneth E. Jansen        real*8 tcorecp(2), tcorecpscal(2)
10459599516SKenneth E. Jansen
10559599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: yphbar
10659599516SKenneth E. Jansen        real*8 CFLworst(numel)
10759599516SKenneth E. Jansen
10859599516SKenneth E. Jansen        integer :: iv_rankpernode, iv_totnodes, iv_totcores
10959599516SKenneth E. Jansen        integer :: iv_node, iv_core, iv_thread
110ae8d68e4SKenneth E. Jansen!--------------------------------------------------------------------
111ae8d68e4SKenneth E. Jansen!     Setting up svLS
112bd36043dSBen Matthews#ifdef HAVE_SVLS
113ae8d68e4SKenneth E. Jansen      INTEGER svLS_nFaces, gnNo, nNo, faIn, facenNo
114ec121c45SKenneth E. Jansen      INTEGER, ALLOCATABLE :: gNodes(:)
115ae8d68e4SKenneth E. Jansen      REAL*8, ALLOCATABLE :: sV(:,:)
116ae8d68e4SKenneth E. Jansen
117ae8d68e4SKenneth E. Jansen      TYPE(svLS_commuType) communicator
118ae8d68e4SKenneth E. Jansen      TYPE(svLS_lhsType) svLS_lhs
119ae8d68e4SKenneth E. Jansen      TYPE(svLS_lsType) svLS_ls
120ec121c45SKenneth E. Jansen! repeat for scalar solves (up to 4 at this time which is consistent with rest of PHASTA)
121daa97cf2SKenneth E. Jansen      TYPE(svLS_commuType) communicator_S(4)
122daa97cf2SKenneth E. Jansen      TYPE(svLS_lhsType) svLS_lhs_S(4)
123daa97cf2SKenneth E. Jansen      TYPE(svLS_lsType) svLS_ls_S(4)
124bd36043dSBen Matthews#endif
125*34e67057SKenneth E. Jansen      call initmpistat()  ! see bottom of code to see just how easy it is
12659599516SKenneth E. Jansen
12759599516SKenneth E. Jansen      call initmemstat()
12859599516SKenneth E. Jansen
129ae8d68e4SKenneth E. Jansen!--------------------------------------------------------------------
130436818eeSKenneth E. Jansen!     Setting up svLS Moved down for better org
131ae8d68e4SKenneth E. Jansen
13259599516SKenneth E. Jansenc
13359599516SKenneth E. Jansenc only master should be verbose
13459599516SKenneth E. Jansenc
13559599516SKenneth E. Jansen
13659599516SKenneth E. Jansen        if(numpe.gt.0 .and. myrank.ne.master)iverbose=0
13759599516SKenneth E. Jansenc
13859599516SKenneth E. Jansen
13959599516SKenneth E. Jansen        lskeep=lstep
14059599516SKenneth E. Jansen
141*34e67057SKenneth E. Jansen        call initTimeSeries()
14259599516SKenneth E. Jansenc
14359599516SKenneth E. Jansenc.... open history and aerodynamic forces files
14459599516SKenneth E. Jansenc
14559599516SKenneth E. Jansen        if (myrank .eq. master) then
146c9a96f21SKenneth E. Jansen           open (unit=ihist,  file=fhist,  status='unknown')
14759599516SKenneth E. Jansen           open (unit=iforce, file=fforce, status='unknown')
14859599516SKenneth E. Jansen           open (unit=76, file="fort.76", status='unknown')
14959599516SKenneth E. Jansen           if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then
15059599516SKenneth E. Jansen              fnamepold = 'pold'
15159599516SKenneth E. Jansen              fnamepold = trim(fnamepold)//trim(cname2(lstep))
15259599516SKenneth E. Jansen              fnamepold = trim(fnamepold)//'.dat'
15359599516SKenneth E. Jansen              fnamepold = trim(fnamepold)
15459599516SKenneth E. Jansen              open (unit=8177, file=fnamepold, status='unknown')
15559599516SKenneth E. Jansen           endif
15659599516SKenneth E. Jansen        endif
15759599516SKenneth E. Jansenc
15859599516SKenneth E. Jansenc.... initialize
15959599516SKenneth E. Jansenc
16059599516SKenneth E. Jansen        ifuncs(:)  = 0              ! func. evaluation counter
16159599516SKenneth E. Jansen        istep  = 0
16259599516SKenneth E. Jansen        yold   = y
16359599516SKenneth E. Jansen        acold  = ac
16459599516SKenneth E. Jansen
165*34e67057SKenneth E. Jansen!!!!!!!!!!!!!!!!!!!
166*34e67057SKenneth E. Jansen!Init output fields
167*34e67057SKenneth E. Jansen!!!!!!!!!!!!!!!!!!
168*34e67057SKenneth E. Jansen        numerr=10+isurf
169*34e67057SKenneth E. Jansen        allocate(rerr(nshg,numerr))
17059599516SKenneth E. Jansen        rerr = zero
17159599516SKenneth E. Jansen
17259599516SKenneth E. Jansen        if(ierrcalc.eq.1 .or. ioybar.eq.1) then ! we need ybar for error too
17359599516SKenneth E. Jansen          if (ivort == 1) then
17459599516SKenneth E. Jansen            allocate(ybar(nshg,17)) ! more space for vorticity if requested
17559599516SKenneth E. Jansen          else
17659599516SKenneth E. Jansen            allocate(ybar(nshg,13))
17759599516SKenneth E. Jansen          endif
17859599516SKenneth E. Jansen          ybar = zero ! Initialize ybar to zero, which is essential
17959599516SKenneth E. Jansen        endif
18059599516SKenneth E. Jansen
18159599516SKenneth E. Jansen        if(ivort == 1) then
18259599516SKenneth E. Jansen          allocate(strain(nshg,6))
18359599516SKenneth E. Jansen          allocate(vorticity(nshg,5))
18459599516SKenneth E. Jansen        endif
18559599516SKenneth E. Jansen
18659599516SKenneth E. Jansen        if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
18759599516SKenneth E. Jansen          allocate(wallssVec(nshg,3))
18859599516SKenneth E. Jansen          if (ioybar .eq. 1) then
18959599516SKenneth E. Jansen            allocate(wallssVecbar(nshg,3))
19059599516SKenneth E. Jansen            wallssVecbar = zero ! Initialization important if mean wss computed
19159599516SKenneth E. Jansen          endif
19259599516SKenneth E. Jansen        endif
19359599516SKenneth E. Jansen
19459599516SKenneth E. Jansen! both nstepsincycle and nphasesincycle needs to be set
19559599516SKenneth E. Jansen        if(nstepsincycle.eq.0) nphasesincycle = 0
19659599516SKenneth E. Jansen        if(nphasesincycle.ne.0) then
19759599516SKenneth E. Jansen!     &     allocate(yphbar(nshg,5,nphasesincycle))
19859599516SKenneth E. Jansen          if (ivort == 1) then
19959599516SKenneth E. Jansen            allocate(yphbar(nshg,15,nphasesincycle)) ! more space for vorticity
20059599516SKenneth E. Jansen          else
20159599516SKenneth E. Jansen            allocate(yphbar(nshg,11,nphasesincycle))
20259599516SKenneth E. Jansen          endif
20359599516SKenneth E. Jansen          yphbar = zero
20459599516SKenneth E. Jansen        endif
20559599516SKenneth E. Jansen
206*34e67057SKenneth E. Jansen!!!!!!!!!!!!!!!!!!!
207*34e67057SKenneth E. Jansen!END Init output fields
208*34e67057SKenneth E. Jansen!!!!!!!!!!!!!!!!!!
20959599516SKenneth E. Jansen
21059599516SKenneth E. Jansen        vbc_prof(:,1:3) = BC(:,3:5)
21159599516SKenneth E. Jansen        if(iramp.eq.1) then
21259599516SKenneth E. Jansen          call BCprofileInit(vbc_prof,x)
21359599516SKenneth E. Jansen        endif
21459599516SKenneth E. Jansen
21559599516SKenneth E. Jansenc
216*34e67057SKenneth E. Jansenc.... ---------------> initialize Equation Solver <---------------
21759599516SKenneth E. Jansenc
218*34e67057SKenneth E. Jansen       call initEQS(iBC, rowp, colm)
21959599516SKenneth E. Jansenc
22059599516SKenneth E. Jansenc...  prepare lumped mass if needed
22159599516SKenneth E. Jansenc
22259599516SKenneth E. Jansen      if((flmpr.ne.0).or.(flmpl.ne.0)) call genlmass(x, shp,shgl)
22359599516SKenneth E. Jansenc
22459599516SKenneth E. Jansenc.... -----------------> End of initialization <-----------------
22559599516SKenneth E. Jansenc
22659599516SKenneth E. Jansenc.....open the necessary files to gather time series
22759599516SKenneth E. Jansenc
22859599516SKenneth E. Jansen      lstep0 = lstep+1
22959599516SKenneth E. Jansen      nsteprcr = nstep(1)+lstep
23059599516SKenneth E. Jansenc
23159599516SKenneth E. Jansenc.... loop through the time sequences
23259599516SKenneth E. Jansenc
23359599516SKenneth E. Jansen
23459599516SKenneth E. Jansen
23559599516SKenneth E. Jansen      do 3000 itsq = 1, ntseq
23659599516SKenneth E. Jansen         itseq = itsq
23759599516SKenneth E. Jansen
23859599516SKenneth E. Jansenc
23959599516SKenneth E. Jansenc.... set up the time integration parameters
24059599516SKenneth E. Jansenc
24159599516SKenneth E. Jansen         nstp   = nstep(itseq)
24259599516SKenneth E. Jansen         nitr   = niter(itseq)
24359599516SKenneth E. Jansen         LCtime = loctim(itseq)
24459599516SKenneth E. Jansen         dtol(:)= deltol(itseq,:)
24559599516SKenneth E. Jansen
24659599516SKenneth E. Jansen         call itrSetup ( y, acold )
247*34e67057SKenneth E. Jansen
24859599516SKenneth E. Jansenc
24959599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution,
25059599516SKenneth E. Jansenc   which are functions of alphaf so need to do it after itrSetup
25159599516SKenneth E. Jansen         if(numImpSrfs.gt.zero) then
25259599516SKenneth E. Jansen            call calcImpConvCoef (numImpSrfs, ntimeptpT)
25359599516SKenneth E. Jansen         endif
25459599516SKenneth E. Jansenc
25559599516SKenneth E. Jansenc...initialize the initial condition P(0)-RQ(0)-Pd(0) for RCR BC
25659599516SKenneth E. Jansenc   need ndsurf so should be after initNABI
25759599516SKenneth E. Jansen         if(numRCRSrfs.gt.zero) then
25859599516SKenneth E. Jansen            call calcRCRic(y,nsrflistRCR,numRCRSrfs)
25959599516SKenneth E. Jansen         endif
26059599516SKenneth E. Jansenc
26159599516SKenneth E. Jansenc  find the last solve of the flow in the step sequence so that we will
26259599516SKenneth E. Jansenc         know when we are at/near end of step
26359599516SKenneth E. Jansenc
26459599516SKenneth E. Jansenc         ilast=0
26559599516SKenneth E. Jansen         nitr=0  ! count number of flow solves in a step (# of iterations)
26659599516SKenneth E. Jansen         do i=1,seqsize
26759599516SKenneth E. Jansen            if(stepseq(i).eq.0) nitr=nitr+1
26859599516SKenneth E. Jansen         enddo
26959599516SKenneth E. Jansen
27059599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
27159599516SKenneth E. Jansen         tcorecp(:) = zero ! used in solfar.f (solflow)
27259599516SKenneth E. Jansen         tcorecpscal(:) = zero ! used in solfar.f (solflow)
27359599516SKenneth E. Jansen         if(myrank.eq.0)  then
27459599516SKenneth E. Jansen            tcorecp1 = TMRC()
27559599516SKenneth E. Jansen         endif
27659599516SKenneth E. Jansen
27759599516SKenneth E. Jansenc
27859599516SKenneth E. Jansenc.... loop through the time steps
27959599516SKenneth E. Jansenc
28059599516SKenneth E. Jansen         istop=0
28159599516SKenneth E. Jansen         rmub=datmat(1,2,1)
28259599516SKenneth E. Jansen         if(rmutarget.gt.0) then
28359599516SKenneth E. Jansen            rmue=rmutarget
28459599516SKenneth E. Jansen         else
28559599516SKenneth E. Jansen            rmue=datmat(1,2,1) ! keep constant
28659599516SKenneth E. Jansen         endif
28759599516SKenneth E. Jansen
28859599516SKenneth E. Jansen        if(iramp.eq.1) then
28959599516SKenneth E. Jansen            call BCprofileScale(vbc_prof,BC,yold) ! fix the yold values to the reset BC
29059599516SKenneth E. Jansen            isclr=1 ! fix scalar
29159599516SKenneth E. Jansen            do isclr=1,nsclr
29259599516SKenneth E. Jansen               call itrBCSclr(yold,ac,iBC,BC,iper,ilwork)
29359599516SKenneth E. Jansen            enddo
29459599516SKenneth E. Jansen        endif
29559599516SKenneth E. Jansen
29659599516SKenneth E. Jansen         do 2000 istp = 1, nstp
29759599516SKenneth E. Jansen           if(iramp.eq.1)
29859599516SKenneth E. Jansen     &        call BCprofileScale(vbc_prof,BC,yold)
29959599516SKenneth E. Jansen
30059599516SKenneth E. Jansen           call rerun_check(stopjob)
301c89b8efeSKenneth E. Jansen           if(myrank.eq.master) write(*,*)
302c89b8efeSKenneth E. Jansen     &         'stopjob,lstep,istep', stopjob,lstep,istep
303c89b8efeSKenneth E. Jansen           if(stopjob.eq.lstep) then
304c89b8efeSKenneth E. Jansen              stopjob=-2 ! this is the code to finish
305c89b8efeSKenneth E. Jansen             if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then
306c89b8efeSKenneth E. Jansen                if(myrank.eq.master) write(*,*)
307c89b8efeSKenneth E. Jansen     &         'line 473 says last step written so exit'
308c89b8efeSKenneth E. Jansen                goto 2002  ! the step was written last step so just exit
309c89b8efeSKenneth E. Jansen             else
310c89b8efeSKenneth E. Jansen                if(myrank.eq.master)
311c89b8efeSKenneth E. Jansen     &         write(*,*) 'line 473 says last step not written'
312c89b8efeSKenneth E. Jansen                istep=nstp  ! have to do this so that solution will be written
313c89b8efeSKenneth E. Jansen                goto 2001
314c89b8efeSKenneth E. Jansen             endif
315c89b8efeSKenneth E. Jansen           endif
31659599516SKenneth E. Jansen
31759599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC.
31859599516SKenneth E. Jansenc     these will be for time step n+1 so use lstep+1
31959599516SKenneth E. Jansenc
32059599516SKenneth E. Jansen            if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl,
32159599516SKenneth E. Jansen     &                               shpb, shglb, x, BC, iBC)
32259599516SKenneth E. Jansen
32359599516SKenneth E. Jansenc
32459599516SKenneth E. Jansenc ... calculate the pressure contribution that depends on the history for the Imp. BC
32559599516SKenneth E. Jansenc
32659599516SKenneth E. Jansen            if(numImpSrfs.gt.0) then
32759599516SKenneth E. Jansen               call pHist(poldImp,QHistImp,ImpConvCoef,
32859599516SKenneth E. Jansen     &                    ntimeptpT,numImpSrfs)
32959599516SKenneth E. Jansen            endif
33059599516SKenneth E. Jansenc
33159599516SKenneth E. Jansenc ... calc the pressure contribution that depends on the history for the RCR BC
33259599516SKenneth E. Jansenc
33359599516SKenneth E. Jansen            if(numRCRSrfs.gt.0) then
33459599516SKenneth E. Jansen               call CalcHopRCR (Delt(itseq), lstep, numRCRSrfs)
33559599516SKenneth E. Jansen               call CalcRCRConvCoef(lstep,numRCRSrfs)
33659599516SKenneth E. Jansen               call pHist(poldRCR,QHistRCR,RCRConvCoef,nsteprcr,
33759599516SKenneth E. Jansen     &              numRCRSrfs)
33859599516SKenneth E. Jansen            endif
33959599516SKenneth E. Jansen
34059599516SKenneth E. Jansen            if(iLES.gt.0) then  !complicated stuff has moved to
34159599516SKenneth E. Jansen                                        !routine below
34259599516SKenneth E. Jansen               call lesmodels(yold,  acold,     shgl,      shp,
34359599516SKenneth E. Jansen     &                        iper,  ilwork,    rowp,      colm,
34459599516SKenneth E. Jansen     &                        nsons, ifath,     x,
34559599516SKenneth E. Jansen     &                        iBC,   BC)
34659599516SKenneth E. Jansen
34759599516SKenneth E. Jansen
34859599516SKenneth E. Jansen            endif
34959599516SKenneth E. Jansen
35059599516SKenneth E. Jansenc.... set traction BCs for modeled walls
35159599516SKenneth E. Jansenc
35259599516SKenneth E. Jansen            if (itwmod.ne.0) then
35359599516SKenneth E. Jansen               call asbwmod(yold,   acold,   x,      BC,     iBC,
35459599516SKenneth E. Jansen     &                      iper,   ilwork,  ifath,  velbar)
35559599516SKenneth E. Jansen            endif
35659599516SKenneth E. Jansen
35759599516SKenneth E. Jansenc
35859599516SKenneth E. Jansenc.... Determine whether the vorticity field needs to be computed for this time step or not
35959599516SKenneth E. Jansenc
360*34e67057SKenneth E. Jansen            call seticomputevort
36159599516SKenneth E. Jansenc
36259599516SKenneth E. Jansenc.... -----------------------> predictor phase <-----------------------
36359599516SKenneth E. Jansenc
36459599516SKenneth E. Jansen            call itrPredict(yold, y,   acold,  ac ,  uold,  u, iBC)
36559599516SKenneth E. Jansen            call itrBC (y,  ac,  iBC,  BC,  iper,ilwork)
36659599516SKenneth E. Jansen
36759599516SKenneth E. Jansen            if(nsolt.eq.1) then
36859599516SKenneth E. Jansen               isclr=0
36959599516SKenneth E. Jansen               call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
37059599516SKenneth E. Jansen            endif
37159599516SKenneth E. Jansen            do isclr=1,nsclr
37259599516SKenneth E. Jansen               call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
37359599516SKenneth E. Jansen            enddo
37459599516SKenneth E. Jansen            iter=0
37559599516SKenneth E. Jansen            ilss=0  ! this is a switch thrown on first solve of LS redistance
37659599516SKenneth E. Jansen            do istepc=1,seqsize
37759599516SKenneth E. Jansen               icode=stepseq(istepc)
37859599516SKenneth E. Jansen               if(mod(icode,5).eq.0) then ! this is a solve
37959599516SKenneth E. Jansen                  isolve=icode/10
38059599516SKenneth E. Jansen                  if(icode.eq.0) then ! flow solve (encoded as 0)
38159599516SKenneth E. Jansenc
38259599516SKenneth E. Jansen                     iter   = iter+1
38359599516SKenneth E. Jansen                     ifuncs(1)  = ifuncs(1) + 1
38459599516SKenneth E. Jansenc
38559599516SKenneth E. Jansen                     Force(1) = zero
38659599516SKenneth E. Jansen                     Force(2) = zero
38759599516SKenneth E. Jansen                     Force(3) = zero
38859599516SKenneth E. Jansen                     HFlux    = zero
38959599516SKenneth E. Jansen                     lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
39059599516SKenneth E. Jansen
39159599516SKenneth E. Jansen                     call SolFlow(y,          ac,        u,
39259599516SKenneth E. Jansen     &                         yold,          acold,     uold,
39359599516SKenneth E. Jansen     &                         x,             iBC,
39459599516SKenneth E. Jansen     &                         BC,            res,
39559599516SKenneth E. Jansen     &                         nPermDims,     nTmpDims,  aperm,
39659599516SKenneth E. Jansen     &                         atemp,         iper,
39759599516SKenneth E. Jansen     &                         ilwork,        shp,       shgl,
39859599516SKenneth E. Jansen     &                         shpb,          shglb,     rowp,
39959599516SKenneth E. Jansen     &                         colm,          lhsK,      lhsP,
40059599516SKenneth E. Jansen     &                         solinc,        rerr,      tcorecp,
401bd36043dSBen Matthews     &                         GradV,      sumtime
402bd36043dSBen Matthews#ifdef HAVE_SVLS
403bd36043dSBen Matthews     &                         ,svLS_lhs,     svLS_ls,  svLS_nFaces)
404bd36043dSBen Matthews#else
405bd36043dSBen Matthews     &                         )
406bd36043dSBen Matthews#endif
40759599516SKenneth E. Jansen
40859599516SKenneth E. Jansen                  else          ! scalar type solve
40959599516SKenneth E. Jansen                     if (icode.eq.5) then ! Solve for Temperature
41059599516SKenneth E. Jansen                                ! (encoded as (nsclr+1)*10)
41159599516SKenneth E. Jansen                        isclr=0
41259599516SKenneth E. Jansen                        ifuncs(2)  = ifuncs(2) + 1
41359599516SKenneth E. Jansen                        j=1
41459599516SKenneth E. Jansen                     else       ! solve a scalar  (encoded at isclr*10)
41559599516SKenneth E. Jansen                        isclr=isolve
41659599516SKenneth E. Jansen                        ifuncs(isclr+2)  = ifuncs(isclr+2) + 1
41759599516SKenneth E. Jansen                        j=isclr+nsolt
41859599516SKenneth E. Jansen                        if((iLSet.eq.2).and.(ilss.eq.0)
41959599516SKenneth E. Jansen     &                       .and.(isclr.eq.2)) then
42059599516SKenneth E. Jansen                           ilss=1 ! throw switch (once per step)
42159599516SKenneth E. Jansen                           y(:,7)=y(:,6) ! redistance field initialized
42259599516SKenneth E. Jansen                           ac(:,7)   = zero
42359599516SKenneth E. Jansen                           call itrBCSclr (  y,  ac,  iBC,  BC, iper,
42459599516SKenneth E. Jansen     &                          ilwork)
42559599516SKenneth E. Jansenc
42659599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the
42759599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar
42859599516SKenneth E. Jansenc
42959599516SKenneth E. Jansen                           alfit=alfi
43059599516SKenneth E. Jansen                           gamit=gami
43159599516SKenneth E. Jansen                           almit=almi
43259599516SKenneth E. Jansen                           Deltt=Delt(1)
43359599516SKenneth E. Jansen                           Dtglt=Dtgl
43459599516SKenneth E. Jansen                           alfi = 1
43559599516SKenneth E. Jansen                           gami = 1
43659599516SKenneth E. Jansen                           almi = 1
43759599516SKenneth E. Jansenc     Delt(1)= Deltt ! Give a pseudo time step
43859599516SKenneth E. Jansen                           Dtgl = one / Delt(1)
43959599516SKenneth E. Jansen                        endif  ! level set eq. 2
44059599516SKenneth E. Jansen                     endif ! deciding between temperature and scalar
44159599516SKenneth E. Jansen
44259599516SKenneth E. Jansen                     lhs = 1 - min(1,mod(ifuncs(isclr+2)-1,
44359599516SKenneth E. Jansen     &                                   LHSupd(isclr+2)))
44459599516SKenneth E. Jansen
44559599516SKenneth E. Jansen                     call SolSclr(y,          ac,        u,
44659599516SKenneth E. Jansen     &                         yold,          acold,     uold,
44759599516SKenneth E. Jansen     &                         x,             iBC,
44859599516SKenneth E. Jansen     &                         BC,            nPermDimsS,nTmpDimsS,
44959599516SKenneth E. Jansen     &                         apermS(1,1,j), atempS,    iper,
45059599516SKenneth E. Jansen     &                         ilwork,        shp,       shgl,
45159599516SKenneth E. Jansen     &                         shpb,          shglb,     rowp,
45259599516SKenneth E. Jansen     &                         colm,          lhsS(1,j),
453bd36043dSBen Matthews     &                         solinc(1,isclr+5), tcorecpscal
454bd36043dSBen Matthews#ifdef HAVE_SVLS
455bd36043dSBen Matthews     &                         ,svLS_lhs_S(isclr),   svLS_ls_S(isclr), svls_nfaces)
456bd36043dSBen Matthews#else
457bd36043dSBen Matthews     &                         )
458bd36043dSBen Matthews#endif
45959599516SKenneth E. Jansen
46059599516SKenneth E. Jansen
46159599516SKenneth E. Jansen                  endif         ! end of scalar type solve
46259599516SKenneth E. Jansen
46359599516SKenneth E. Jansen               else ! this is an update  (mod did not equal zero)
46459599516SKenneth E. Jansen                  iupdate=icode/10  ! what to update
46559599516SKenneth E. Jansen                  if(icode.eq.1) then !update flow
46659599516SKenneth E. Jansen                     call itrCorrect ( y,    ac,    u,   solinc, iBC)
46759599516SKenneth E. Jansen                     call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
46859599516SKenneth E. Jansen                  else  ! update scalar
46959599516SKenneth E. Jansen                     isclr=iupdate  !unless
47059599516SKenneth E. Jansen                     if(icode.eq.6) isclr=0
47159599516SKenneth E. Jansen                     if(iRANS.lt.-100)then  ! RANS
47259599516SKenneth E. Jansen                        call itrCorrectSclrPos(y,ac,solinc(1,isclr+5))
47359599516SKenneth E. Jansen                     else
47459599516SKenneth E. Jansen                        call itrCorrectSclr (y, ac, solinc(1,isclr+5))
47559599516SKenneth E. Jansen                     endif
47659599516SKenneth E. Jansen                     if (ilset.eq.2 .and. isclr.eq.2)  then
47759599516SKenneth E. Jansen                        if (ivconstraint .eq. 1) then
47859599516SKenneth E. Jansen                           call itrBCSclr (  y,  ac,  iBC,  BC, iper,
47959599516SKenneth E. Jansen     &                          ilwork)
48059599516SKenneth E. Jansenc
48159599516SKenneth E. Jansenc ... applying the volume constraint on second level set scalar
48259599516SKenneth E. Jansenc
48359599516SKenneth E. Jansen                           call solvecon (y,    x,      iBC,  BC,
48459599516SKenneth E. Jansen     &                          iper, ilwork, shp,  shgl)
48559599516SKenneth E. Jansenc
48659599516SKenneth E. Jansen                        endif   ! end of volume constraint calculations
48759599516SKenneth E. Jansen                     endif      ! end of redistance calculations
48859599516SKenneth E. Jansenc
48959599516SKenneth E. Jansen                        call itrBCSclr (  y,  ac,  iBC,  BC, iper,
49059599516SKenneth E. Jansen     &                       ilwork)
49159599516SKenneth E. Jansen                     endif      ! end of flow or scalar update
49259599516SKenneth E. Jansen                  endif         ! end of switch between solve or update
49359599516SKenneth E. Jansen               enddo            ! loop over sequence in step
49459599516SKenneth E. Jansenc
49559599516SKenneth E. Jansenc
49659599516SKenneth E. Jansenc.... obtain the time average statistics
49759599516SKenneth E. Jansenc
49859599516SKenneth E. Jansen            if (ioform .eq. 2) then
49959599516SKenneth E. Jansen
50059599516SKenneth E. Jansen               call stsGetStats( y,      yold,     ac,     acold,
50159599516SKenneth E. Jansen     &                           u,      uold,     x,
50259599516SKenneth E. Jansen     &                           shp,    shgl,     shpb,   shglb,
50359599516SKenneth E. Jansen     &                           iBC,    BC,       iper,   ilwork,
50459599516SKenneth E. Jansen     &                           rowp,   colm,     lhsK,   lhsP )
50559599516SKenneth E. Jansen            endif
50659599516SKenneth E. Jansen
50759599516SKenneth E. Jansenc
50859599516SKenneth E. Jansenc  Find the solution at the end of the timestep and move it to old
50959599516SKenneth E. Jansenc
51059599516SKenneth E. Jansenc
51159599516SKenneth E. Jansenc ...First to reassign the parameters for the original time integrator scheme
51259599516SKenneth E. Jansenc
51359599516SKenneth E. Jansen            if((iLSet.eq.2).and.(ilss.eq.1)) then
51459599516SKenneth E. Jansen               alfi =alfit
51559599516SKenneth E. Jansen               gami =gamit
51659599516SKenneth E. Jansen               almi =almit
51759599516SKenneth E. Jansen               Delt(1)=Deltt
51859599516SKenneth E. Jansen               Dtgl =Dtglt
51959599516SKenneth E. Jansen            endif
52059599516SKenneth E. Jansen            call itrUpdate( yold,  acold,   uold,  y,    ac,   u)
52159599516SKenneth E. Jansen            call itrBC (yold, acold,  iBC,  BC,  iper,ilwork)
52259599516SKenneth E. Jansen
52359599516SKenneth E. Jansen            istep = istep + 1
52459599516SKenneth E. Jansen            lstep = lstep + 1
52559599516SKenneth E. Jansenc
52659599516SKenneth E. Jansenc ..  Print memory consumption on BGQ
52759599516SKenneth E. Jansenc
52859599516SKenneth E. Jansen            call printmeminfo("itrdrv"//char(0))
52959599516SKenneth E. Jansen
53059599516SKenneth E. Jansenc
53159599516SKenneth E. Jansenc ..  Compute vorticity
53259599516SKenneth E. Jansenc
533*34e67057SKenneth E. Jansen            if ( icomputevort == 1)
534*34e67057SKenneth E. Jansen     &        call computeVort( vorticity, GradV,strain)
53559599516SKenneth E. Jansenc
5369dcf5646SKenneth E. Jansenc.... update and the aerodynamic forces
5379dcf5646SKenneth E. Jansenc
5389dcf5646SKenneth E. Jansen            call forces ( yold,  ilwork )
5399dcf5646SKenneth E. Jansen
5409dcf5646SKenneth E. Jansenc
541c89b8efeSKenneth E. Jansenc .. write out the instantaneous solution
54259599516SKenneth E. Jansenc
543c89b8efeSKenneth E. Jansen2001    continue  ! we could get here by 2001 label if user requested stop
54459599516SKenneth E. Jansen        if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or.
54559599516SKenneth E. Jansen     &      istep.eq.nstep(itseq)) then
546c89b8efeSKenneth E. Jansen
547c89b8efeSKenneth E. Jansen!so that we can see progress in force file close it so that it flushes
548c89b8efeSKenneth E. Jansen!and  then reopen in append mode
549c89b8efeSKenneth E. Jansen
550c89b8efeSKenneth E. Jansen           close(iforce)
551c89b8efeSKenneth E. Jansen           open (unit=iforce, file=fforce, position='append')
55259599516SKenneth E. Jansen
55359599516SKenneth E. Jansen!              Call to restar() will open restart file in write mode (and not append mode)
55459599516SKenneth E. Jansen!              that is needed as other fields are written in append mode
555c89b8efeSKenneth E. Jansen
55659599516SKenneth E. Jansen           call restar ('out ',  yold  ,ac)
55759599516SKenneth E. Jansen
55859599516SKenneth E. Jansen           if(ivort == 1) then
55959599516SKenneth E. Jansen             call write_field(myrank,'a','vorticity',9,vorticity,
56059599516SKenneth E. Jansen     &                       'd',nshg,5,lstep)
56159599516SKenneth E. Jansen           endif
56259599516SKenneth E. Jansen
56359599516SKenneth E. Jansen           call printmeminfo("itrdrv after checkpoint"//char(0))
564c89b8efeSKenneth E. Jansen         else if(stopjob.eq.-2) then
565c89b8efeSKenneth E. Jansen           if(myrank.eq.master) then
566c89b8efeSKenneth E. Jansen             write(*,*) 'line 755 says no write before stopping'
567c89b8efeSKenneth E. Jansen             write(*,*) 'istep,nstep,irs',istep,nstep(itseq),irs
56859599516SKenneth E. Jansen           endif
569c89b8efeSKenneth E. Jansen        endif  !just the instantaneous stuff for videos
570c89b8efeSKenneth E. Jansenc
571c89b8efeSKenneth E. Jansenc.... compute the consistent boundary flux
572c89b8efeSKenneth E. Jansenc
573c89b8efeSKenneth E. Jansen            if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
574c89b8efeSKenneth E. Jansen               call Bflux ( yold,      acold,      uold,    x,
575c89b8efeSKenneth E. Jansen     &                      shp,       shgl,       shpb,
576c89b8efeSKenneth E. Jansen     &                      shglb,     ilwork,     iBC,
577c89b8efeSKenneth E. Jansen     &                      BC,        iper,       wallssVec)
578c89b8efeSKenneth E. Jansen            endif
579c89b8efeSKenneth E. Jansen
580c89b8efeSKenneth E. Jansen           if(stopjob.eq.-2) goto 2003
581c89b8efeSKenneth E. Jansen
58259599516SKenneth E. Jansen
58359599516SKenneth E. Jansenc
58459599516SKenneth E. Jansenc ... update the flow history for the impedance convolution, filter it and write it out
58559599516SKenneth E. Jansenc
58659599516SKenneth E. Jansen            if(numImpSrfs.gt.zero) then
58759599516SKenneth E. Jansen               call UpdHistConv(y,nsrflistImp,numImpSrfs) !uses Delt(1)
58859599516SKenneth E. Jansen            endif
58959599516SKenneth E. Jansen
59059599516SKenneth E. Jansenc
59159599516SKenneth E. Jansenc ... update the flow history for the RCR convolution
59259599516SKenneth E. Jansenc
59359599516SKenneth E. Jansen            if(numRCRSrfs.gt.zero) then
59459599516SKenneth E. Jansen               call UpdHistConv(y,nsrflistRCR,numRCRSrfs) !uses lstep
59559599516SKenneth E. Jansen            endif
59659599516SKenneth E. Jansen
59759599516SKenneth E. Jansen
59859599516SKenneth E. Jansenc...  dump TIME SERIES
59959599516SKenneth E. Jansen
600*34e67057SKenneth E. Jansen            if (exts .and. ( mod(lstep-1,freq).eq.0)) call dumpTimeSeries()
60159599516SKenneth E. Jansen
60259599516SKenneth E. Jansen            if((irscale.ge.0).or.(itwmod.gt.0))
60359599516SKenneth E. Jansen     &           call getvel (yold,     ilwork, iBC,
60459599516SKenneth E. Jansen     &                        nsons,    ifath, velbar)
60559599516SKenneth E. Jansen
60659599516SKenneth E. Jansen            if((irscale.ge.0).and.(myrank.eq.master)) then
60759599516SKenneth E. Jansen               call genscale(yold,       x,       iper,
60859599516SKenneth E. Jansen     &                       iBC,     ifath,   velbar,
60959599516SKenneth E. Jansen     &                       nsons)
61059599516SKenneth E. Jansen            endif
61159599516SKenneth E. Jansenc
61259599516SKenneth E. Jansenc....  print out results.
61359599516SKenneth E. Jansenc
61459599516SKenneth E. Jansen            ntoutv=max(ntout,100)   ! velb is not needed so often
61559599516SKenneth E. Jansen            if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then
61659599516SKenneth E. Jansen               if( (mod(lstep, ntoutv) .eq. 0) .and.
61759599516SKenneth E. Jansen     &              ((irscale.ge.0).or.(itwmod.gt.0) .or.
61859599516SKenneth E. Jansen     &              ((nsonmax.eq.1).and.(iLES.gt.0))))
61959599516SKenneth E. Jansen     &              call rwvelb  ('out ',  velbar  ,ifail)
62059599516SKenneth E. Jansen            endif
62159599516SKenneth E. Jansenc
62259599516SKenneth E. Jansenc.... end of the NSTEP and NTSEQ loops
62359599516SKenneth E. Jansenc
62459599516SKenneth E. Jansen
62559599516SKenneth E. Jansen
62659599516SKenneth E. Jansenc
62759599516SKenneth E. Jansenc.... -------------------> error calculation  <-----------------
62859599516SKenneth E. Jansenc
629*34e67057SKenneth E. Jansen            if(ierrcalc.eq.1 .or. ioybar.eq.1)
630*34e67057SKenneth E. Jansen     &       call collectErrorYbar(ybar,yold,wallssVec,wallssVecBar,
631*34e67057SKenneth E. Jansen     &               vorticity,yphbar,rerr)
632c89b8efeSKenneth E. Jansen 2003       continue ! we get here if stopjob equals lstep and this jumped over
633c89b8efeSKenneth E. Jansen!           the statistics computation because we have no new data to average in
634c89b8efeSKenneth E. Jansen!           rather we are just trying to output the last state that was not already
635c89b8efeSKenneth E. Jansen!           written
636c89b8efeSKenneth E. Jansenc
637c89b8efeSKenneth E. Jansenc.... ---------------------->  Complete Restart  Processing  <----------------------
638c89b8efeSKenneth E. Jansenc
639c89b8efeSKenneth E. Jansen!   for now it is the same frequency but need to change this
640c89b8efeSKenneth E. Jansen!   soon.... but don't forget to change the field counter in
641c89b8efeSKenneth E. Jansen!  new_interface.cc
642c89b8efeSKenneth E. Jansen!
643c89b8efeSKenneth E. Jansen        if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or.
644c89b8efeSKenneth E. Jansen     &      istep.eq.nstep(itseq)) then
64559599516SKenneth E. Jansen
646c89b8efeSKenneth E. Jansen          lesId   = numeqns(1)
647c89b8efeSKenneth E. Jansen          if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
648c89b8efeSKenneth E. Jansen          if(myrank.eq.0)  then
649c89b8efeSKenneth E. Jansen            tcormr1 = TMRC()
650c89b8efeSKenneth E. Jansen          endif
651efb88323SKenneth E. Jansen          if((nsolflow.eq.1).and.(ipresPrjFlag.eq.1)) then
65279f1763eSKenneth E. Jansen#ifdef HAVE_LESLIB
653c89b8efeSKenneth E. Jansen           call saveLesRestart( lesId,  aperm , nshg, myrank, lstep,
654c89b8efeSKenneth E. Jansen     &                    nPermDims )
655c89b8efeSKenneth E. Jansen          if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
656c89b8efeSKenneth E. Jansen          if(myrank.eq.0)  then
657c89b8efeSKenneth E. Jansen            tcormr2 = TMRC()
658c89b8efeSKenneth E. Jansen            write(6,*) 'call saveLesRestart for projection and'//
659c89b8efeSKenneth E. Jansen     &           'pressure projection vectors', tcormr2-tcormr1
660c89b8efeSKenneth E. Jansen          endif
66179f1763eSKenneth E. Jansen#endif
662c9a96f21SKenneth E. Jansen          endif
663c89b8efeSKenneth E. Jansen
664c89b8efeSKenneth E. Jansen          if(ierrcalc.eq.1) then
665c89b8efeSKenneth E. Jansenc
666c89b8efeSKenneth E. Jansenc.....smooth the error indicators
667c89b8efeSKenneth E. Jansenc
668c89b8efeSKenneth E. Jansen            do i=1,ierrsmooth
669c89b8efeSKenneth E. Jansen              call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC )
670c89b8efeSKenneth E. Jansen            end do
671c89b8efeSKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
672c89b8efeSKenneth E. Jansen            if(myrank.eq.0)  then
673c89b8efeSKenneth E. Jansen              tcormr1 = TMRC()
674c89b8efeSKenneth E. Jansen            endif
675c89b8efeSKenneth E. Jansen            call write_error(myrank, lstep, nshg, 10, rerr )
676c89b8efeSKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
677c89b8efeSKenneth E. Jansen            if(myrank.eq.0)  then
678c89b8efeSKenneth E. Jansen              tcormr2 = TMRC()
679c89b8efeSKenneth E. Jansen              write(6,*) 'Time to write the error fields to the disks',
680c89b8efeSKenneth E. Jansen     &            tcormr2-tcormr1
681c89b8efeSKenneth E. Jansen            endif
682c89b8efeSKenneth E. Jansen          endif ! ierrcalc
683c89b8efeSKenneth E. Jansen
684c89b8efeSKenneth E. Jansen          if(ioybar.eq.1) then
685c89b8efeSKenneth E. Jansen            if(ivort == 1) then
686c89b8efeSKenneth E. Jansen              call write_field(myrank,'a','ybar',4,
687c89b8efeSKenneth E. Jansen     &                  ybar,'d',nshg,17,lstep)
688c89b8efeSKenneth E. Jansen            else
689c89b8efeSKenneth E. Jansen              call write_field(myrank,'a','ybar',4,
690c89b8efeSKenneth E. Jansen     &                ybar,'d',nshg,13,lstep)
691c89b8efeSKenneth E. Jansen            endif
692c89b8efeSKenneth E. Jansen
693c89b8efeSKenneth E. Jansen            if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
694c89b8efeSKenneth E. Jansen              call write_field(myrank,'a','wssbar',6,
695c89b8efeSKenneth E. Jansen     &             wallssVecBar,'d',nshg,3,lstep)
696c89b8efeSKenneth E. Jansen            endif
697c89b8efeSKenneth E. Jansen
698c89b8efeSKenneth E. Jansen            if(nphasesincycle .gt. 0) then
699c89b8efeSKenneth E. Jansen              if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
700c89b8efeSKenneth E. Jansen              if(myrank.eq.0)  then
701c89b8efeSKenneth E. Jansen                tcormr1 = TMRC()
702c89b8efeSKenneth E. Jansen              endif
703c89b8efeSKenneth E. Jansen              do iphase=1,nphasesincycle
704c89b8efeSKenneth E. Jansen                if(ivort == 1) then
705c89b8efeSKenneth E. Jansen                 call write_phavg2(myrank,'a','phase_average',13,iphase,
706c89b8efeSKenneth E. Jansen     &              nphasesincycle,yphbar(:,:,iphase),'d',nshg,15,lstep)
707c89b8efeSKenneth E. Jansen                else
708c89b8efeSKenneth E. Jansen                 call write_phavg2(myrank,'a','phase_average',13,iphase,
709c89b8efeSKenneth E. Jansen     &              nphasesincycle,yphbar(:,:,iphase),'d',nshg,11,lstep)
710c89b8efeSKenneth E. Jansen                endif
711c89b8efeSKenneth E. Jansen              end do
712c89b8efeSKenneth E. Jansen              if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
713c89b8efeSKenneth E. Jansen              if(myrank.eq.0)  then
714c89b8efeSKenneth E. Jansen                tcormr2 = TMRC()
715c89b8efeSKenneth E. Jansen                write(6,*) 'write all phase avg to the disks = ',
716c89b8efeSKenneth E. Jansen     &                tcormr2-tcormr1
717c89b8efeSKenneth E. Jansen              endif
718c89b8efeSKenneth E. Jansen            endif !nphasesincyle
719c89b8efeSKenneth E. Jansen          endif !ioybar
720c89b8efeSKenneth E. Jansen
721c89b8efeSKenneth E. Jansen          if(iRANS.lt.0) then
722c89b8efeSKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
723c89b8efeSKenneth E. Jansen            if(myrank.eq.0)  then
724c89b8efeSKenneth E. Jansen              tcormr1 = TMRC()
725c89b8efeSKenneth E. Jansen            endif
726c89b8efeSKenneth E. Jansen            call write_field(myrank,'a','dwal',4,d2wall,'d',
727c89b8efeSKenneth E. Jansen     &                       nshg,1,lstep)
728c89b8efeSKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
729c89b8efeSKenneth E. Jansen            if(myrank.eq.0)  then
730c89b8efeSKenneth E. Jansen              tcormr2 = TMRC()
731c89b8efeSKenneth E. Jansen              write(6,*) 'Time to write dwal to the disks = ',
732c89b8efeSKenneth E. Jansen     &        tcormr2-tcormr1
733c89b8efeSKenneth E. Jansen            endif
734c89b8efeSKenneth E. Jansen          endif !iRANS
735c89b8efeSKenneth E. Jansen
736c89b8efeSKenneth E. Jansen        endif ! write out complete restart state
737c89b8efeSKenneth E. Jansen        !next 2 lines are two ways to end early
738c89b8efeSKenneth E. Jansen        if(stopjob.eq.-2) goto 2002
739c89b8efeSKenneth E. Jansen        if(istop.eq.1000) goto 2002 ! stop when delta small (see rstatic)
74059599516SKenneth E. Jansen 2000 continue
741c89b8efeSKenneth E. Jansen 2002 continue
742c89b8efeSKenneth E. Jansen
743c89b8efeSKenneth E. Jansen! done with time stepping so deallocate fields already written
744c89b8efeSKenneth E. Jansen!
745*34e67057SKenneth E. Jansen
746c89b8efeSKenneth E. Jansen          if(ioybar.eq.1) then
747c89b8efeSKenneth E. Jansen            deallocate(ybar)
748c89b8efeSKenneth E. Jansen            if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
749c89b8efeSKenneth E. Jansen              deallocate(wallssVecbar)
750c89b8efeSKenneth E. Jansen            endif
751c89b8efeSKenneth E. Jansen            if(nphasesincycle .gt. 0) then
752c89b8efeSKenneth E. Jansen              deallocate(yphbar)
753c89b8efeSKenneth E. Jansen            endif !nphasesincyle
754c89b8efeSKenneth E. Jansen          endif !ioybar
755c89b8efeSKenneth E. Jansen          if(ivort == 1) then
756c89b8efeSKenneth E. Jansen            deallocate(strain,vorticity)
757c89b8efeSKenneth E. Jansen          endif
758c89b8efeSKenneth E. Jansen          if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
759c89b8efeSKenneth E. Jansen            deallocate(wallssVec)
760c89b8efeSKenneth E. Jansen          endif
761c89b8efeSKenneth E. Jansen          if(iRANS.lt.0) then
762c89b8efeSKenneth E. Jansen            deallocate(d2wall)
763c89b8efeSKenneth E. Jansen          endif
76459599516SKenneth E. Jansen
76559599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
76659599516SKenneth E. Jansen         if(myrank.eq.0)  then
76759599516SKenneth E. Jansen            tcorecp2 = TMRC()
76859599516SKenneth E. Jansen             write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1
76959599516SKenneth E. Jansen             write(6,*) '(Elm. form.',tcorecp(1),
77059599516SKenneth E. Jansen     &                    ',Lin. alg. sol.',tcorecp(2),')'
77159599516SKenneth E. Jansen             write(6,*) '(Elm. form. Scal.',tcorecpscal(1),
77259599516SKenneth E. Jansen     &                   ',Lin. alg. sol. Scal.',tcorecpscal(2),')'
77359599516SKenneth E. Jansen             write(6,*) ''
77459599516SKenneth E. Jansen
77559599516SKenneth E. Jansen         endif
77659599516SKenneth E. Jansen
77759599516SKenneth E. Jansen         call print_system_stats(tcorecp, tcorecpscal)
77859599516SKenneth E. Jansen         call print_mesh_stats()
77959599516SKenneth E. Jansen         call print_mpi_stats()
78059599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
78159599516SKenneth E. Jansen!         return
78259599516SKenneth E. Jansenc         call MPI_Finalize()
78359599516SKenneth E. Jansenc         call MPI_ABORT(MPI_COMM_WORLD, ierr)
78459599516SKenneth E. Jansen
78575f1c48cSCameron Smith         call destroyWallData
78692e15685SCameron Smith         call destroyfncorp
78775f1c48cSCameron Smith
78859599516SKenneth E. Jansen 3000 continue
78959599516SKenneth E. Jansen
79059599516SKenneth E. Jansen
79159599516SKenneth E. Jansenc
79259599516SKenneth E. Jansenc.... close history and aerodynamic forces files
79359599516SKenneth E. Jansenc
79459599516SKenneth E. Jansen      if (myrank .eq. master) then
79559599516SKenneth E. Jansen!         close (ihist)
79659599516SKenneth E. Jansen         close (iforce)
79759599516SKenneth E. Jansen         close(76)
79859599516SKenneth E. Jansen         if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then
79959599516SKenneth E. Jansen            close (8177)
80059599516SKenneth E. Jansen         endif
80159599516SKenneth E. Jansen      endif
80259599516SKenneth E. Jansenc
80359599516SKenneth E. Jansenc.... close varts file for probes
80459599516SKenneth E. Jansenc
80559599516SKenneth E. Jansen      if(exts) then
80659599516SKenneth E. Jansen        do jj=1,ntspts
80759599516SKenneth E. Jansen          if (myrank == iv_rank(jj)) then
80859599516SKenneth E. Jansen            close(1000+jj)
80959599516SKenneth E. Jansen          endif
81059599516SKenneth E. Jansen        enddo
811*34e67057SKenneth E. Jansen        call dTD   ! deallocates time series arrays
81259599516SKenneth E. Jansen      endif
81359599516SKenneth E. Jansen
81459599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
81559599516SKenneth E. Jansen      if(myrank.eq.0)  then
81659599516SKenneth E. Jansen          write(*,*) 'itrdrv - done with aerodynamic forces'
81759599516SKenneth E. Jansen      endif
81859599516SKenneth E. Jansen
81959599516SKenneth E. Jansen      do isrf = 0,MAXSURF
82059599516SKenneth E. Jansen        if ( nsrflist(isrf).ne.0 .and.
82159599516SKenneth E. Jansen     &                     myrank.eq.irankfilesforce(isrf)) then
82259599516SKenneth E. Jansen          iunit=60+isrf
82359599516SKenneth E. Jansen          close(iunit)
82459599516SKenneth E. Jansen        endif
82559599516SKenneth E. Jansen      enddo
82659599516SKenneth E. Jansen
82759599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
82859599516SKenneth E. Jansen      if(myrank.eq.0)  then
82959599516SKenneth E. Jansen          write(*,*) 'itrdrv - done with MAXSURF'
83059599516SKenneth E. Jansen      endif
83159599516SKenneth E. Jansen
83259599516SKenneth E. Jansen
83359599516SKenneth E. Jansen 5    format(1X,F15.10,3X,F15.10,3X,F15.10,3X,F15.10)
83459599516SKenneth E. Jansen 444  format(6(2x,e14.7))
83559599516SKenneth E. Jansenc
83659599516SKenneth E. Jansenc.... end
83759599516SKenneth E. Jansenc
83859599516SKenneth E. Jansen      if(nsolflow.eq.1) then
83959599516SKenneth E. Jansen         deallocate (lhsK)
84059599516SKenneth E. Jansen         deallocate (lhsP)
841ae8d68e4SKenneth E. Jansen         IF (svLSFlag .NE. 1) THEN
84259599516SKenneth E. Jansen         deallocate (aperm)
84359599516SKenneth E. Jansen         deallocate (atemp)
844ae8d68e4SKenneth E. Jansen         ENDIF
84559599516SKenneth E. Jansen      endif
846*34e67057SKenneth E. Jansen      if((nsclr+nsolt).gt.0) then
84759599516SKenneth E. Jansen         deallocate (lhsS)
84859599516SKenneth E. Jansen         deallocate (apermS)
84959599516SKenneth E. Jansen         deallocate (atempS)
85059599516SKenneth E. Jansen      endif
85159599516SKenneth E. Jansen
85259599516SKenneth E. Jansen      if(iabc==1) deallocate(acs)
85359599516SKenneth E. Jansen
85459599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
85559599516SKenneth E. Jansen      if(myrank.eq.0)  then
85659599516SKenneth E. Jansen          write(*,*) 'itrdrv - done - BACK TO process.f'
85759599516SKenneth E. Jansen      endif
85859599516SKenneth E. Jansen
85959599516SKenneth E. Jansen      return
86059599516SKenneth E. Jansen      end
86159599516SKenneth E. Jansen
86259599516SKenneth E. Jansen      subroutine lesmodels(y,     ac,        shgl,      shp,
86359599516SKenneth E. Jansen     &                     iper,  ilwork,    rowp,      colm,
86459599516SKenneth E. Jansen     &                     nsons, ifath,     x,
86559599516SKenneth E. Jansen     &                     iBC,   BC)
86659599516SKenneth E. Jansen
86759599516SKenneth E. Jansen      include "common.h"
86859599516SKenneth E. Jansen
86959599516SKenneth E. Jansen      real*8    y(nshg,ndof),              ac(nshg,ndof),
87059599516SKenneth E. Jansen     &            x(numnp,nsd),
87159599516SKenneth E. Jansen     &            BC(nshg,ndofBC)
87259599516SKenneth E. Jansen      real*8    shp(MAXTOP,maxsh,MAXQPT),
87359599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT)
87459599516SKenneth E. Jansen
87559599516SKenneth E. Jansenc
87659599516SKenneth E. Jansen      integer   rowp(nshg,nnz),         colm(nshg+1),
87759599516SKenneth E. Jansen     &            iBC(nshg),
87859599516SKenneth E. Jansen     &            ilwork(nlwork),
87959599516SKenneth E. Jansen     &            iper(nshg)
88059599516SKenneth E. Jansen      dimension ifath(numnp),    nsons(nfath)
88159599516SKenneth E. Jansen
88259599516SKenneth E. Jansen      real*8, allocatable, dimension(:) :: fwr2,fwr3,fwr4
88359599516SKenneth E. Jansen      real*8, allocatable, dimension(:) :: stabdis,cdelsq1
88459599516SKenneth E. Jansen      real*8, allocatable, dimension(:,:) :: xavegt, xavegt2,xavegt3
88559599516SKenneth E. Jansen
88659599516SKenneth E. Jansen      if( (iLES.gt.1) )   then ! Allocate Stuff for advanced LES models
88759599516SKenneth E. Jansen         allocate (fwr2(nshg))
88859599516SKenneth E. Jansen         allocate (fwr3(nshg))
88959599516SKenneth E. Jansen         allocate (fwr4(nshg))
89059599516SKenneth E. Jansen         allocate (xavegt(nfath,12))
89159599516SKenneth E. Jansen         allocate (xavegt2(nfath,12))
89259599516SKenneth E. Jansen         allocate (xavegt3(nfath,12))
89359599516SKenneth E. Jansen         allocate (stabdis(nfath))
89459599516SKenneth E. Jansen      endif
89559599516SKenneth E. Jansen
89659599516SKenneth E. Jansenc.... get dynamic model coefficient
89759599516SKenneth E. Jansenc
89859599516SKenneth E. Jansen      ilesmod=iLES/10
89959599516SKenneth E. Jansenc
90059599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model
90159599516SKenneth E. Jansenc
90259599516SKenneth E. Jansen      if (ilesmod.eq.0) then    ! 0 < iLES< 10 => dyn. model calculated
90359599516SKenneth E. Jansen                                ! at nodes based on discrete filtering
90459599516SKenneth E. Jansen
90559599516SKenneth E. Jansen
90659599516SKenneth E. Jansen         if(isubmod.eq.2) then
90759599516SKenneth E. Jansen            call SUPGdis(y,      ac,        shgl,      shp,
90859599516SKenneth E. Jansen     &                   iper,   ilwork,
90959599516SKenneth E. Jansen     &                   nsons,  ifath,     x,
91059599516SKenneth E. Jansen     &                   iBC,    BC, stabdis, xavegt3)
91159599516SKenneth E. Jansen         endif
91259599516SKenneth E. Jansen
91359599516SKenneth E. Jansen         if( ((isubmod.eq.0).or.(isubmod.eq.2)))then ! If no
91459599516SKenneth E. Jansen                                                     ! sub-model
91559599516SKenneth E. Jansen                                                     ! or SUPG
91659599516SKenneth E. Jansen                                                     ! model wanted
91759599516SKenneth E. Jansen
91859599516SKenneth E. Jansen            if(i2filt.eq.0)then ! If simple filter
91959599516SKenneth E. Jansen
92059599516SKenneth E. Jansen               if(modlstats .eq. 0) then ! If no model stats wanted
92159599516SKenneth E. Jansen                  call getdmc (y,       shgl,      shp,
92259599516SKenneth E. Jansen     &                         iper,       ilwork,    nsons,
92359599516SKenneth E. Jansen     &                         ifath,      x)
92459599516SKenneth E. Jansen               else             ! else get model stats
92559599516SKenneth E. Jansen                  call stdfdmc (y,       shgl,      shp,
92659599516SKenneth E. Jansen     &                          iper,       ilwork,    nsons,
92759599516SKenneth E. Jansen     &                          ifath,      x)
92859599516SKenneth E. Jansen               endif            ! end of stats if statement
92959599516SKenneth E. Jansen
93059599516SKenneth E. Jansen            else                ! else if twice filtering
93159599516SKenneth E. Jansen
93259599516SKenneth E. Jansen               call widefdmc(y,       shgl,      shp,
93359599516SKenneth E. Jansen     &                       iper,       ilwork,    nsons,
93459599516SKenneth E. Jansen     &                       ifath,      x)
93559599516SKenneth E. Jansen
93659599516SKenneth E. Jansen
93759599516SKenneth E. Jansen            endif               ! end of simple filter if statement
93859599516SKenneth E. Jansen
93959599516SKenneth E. Jansen         endif                  ! end of SUPG or no sub-model if statement
94059599516SKenneth E. Jansen
94159599516SKenneth E. Jansen
94259599516SKenneth E. Jansen         if( (isubmod.eq.1) ) then ! If DFWR sub-model wanted
94359599516SKenneth E. Jansen            call cdelBHsq (y,       shgl,      shp,
94459599516SKenneth E. Jansen     &                     iper,       ilwork,    nsons,
94559599516SKenneth E. Jansen     &                     ifath,      x,         cdelsq1)
94659599516SKenneth E. Jansen            call FiltRat (y,       shgl,      shp,
94759599516SKenneth E. Jansen     &                    iper,       ilwork,    nsons,
94859599516SKenneth E. Jansen     &                    ifath,      x,         cdelsq1,
94959599516SKenneth E. Jansen     &                    fwr4,       fwr3)
95059599516SKenneth E. Jansen
95159599516SKenneth E. Jansen
95259599516SKenneth E. Jansen            if (i2filt.eq.0) then ! If simple filter wanted
95359599516SKenneth E. Jansen               call DFWRsfdmc(y,       shgl,      shp,
95459599516SKenneth E. Jansen     &                        iper,       ilwork,    nsons,
95559599516SKenneth E. Jansen     &                        ifath,      x,         fwr2, fwr3)
95659599516SKenneth E. Jansen            else                ! else if twice filtering wanted
95759599516SKenneth E. Jansen               call DFWRwfdmc(y,       shgl,      shp,
95859599516SKenneth E. Jansen     &                        iper,       ilwork,    nsons,
95959599516SKenneth E. Jansen     &                        ifath,      x,         fwr4, fwr4)
96059599516SKenneth E. Jansen            endif               ! end of simple filter if statement
96159599516SKenneth E. Jansen
96259599516SKenneth E. Jansen         endif                  ! end of DFWR sub-model if statement
96359599516SKenneth E. Jansen
96459599516SKenneth E. Jansen         if( (isubmod.eq.2) )then ! If SUPG sub-model wanted
96559599516SKenneth E. Jansen            call dmcSUPG (y,           ac,         shgl,
96659599516SKenneth E. Jansen     &                    shp,         iper,       ilwork,
96759599516SKenneth E. Jansen     &                    nsons,       ifath,      x,
96859599516SKenneth E. Jansen     &                    iBC,    BC,  rowp,       colm,
96959599516SKenneth E. Jansen     &                    xavegt2,    stabdis)
97059599516SKenneth E. Jansen         endif
97159599516SKenneth E. Jansen
97259599516SKenneth E. Jansen         if(idis.eq.1)then      ! If SUPG/Model dissipation wanted
97359599516SKenneth E. Jansen            call ediss (y,        ac,      shgl,
97459599516SKenneth E. Jansen     &                  shp,      iper,       ilwork,
97559599516SKenneth E. Jansen     &                  nsons,    ifath,      x,
97659599516SKenneth E. Jansen     &                  iBC,      BC,  xavegt)
97759599516SKenneth E. Jansen         endif
97859599516SKenneth E. Jansen
97959599516SKenneth E. Jansen      endif                     ! end of ilesmod
98059599516SKenneth E. Jansen
98159599516SKenneth E. Jansen      if (ilesmod .eq. 1) then  ! 10 < iLES < 20 => dynamic-mixed
98259599516SKenneth E. Jansen                                ! at nodes based on discrete filtering
98359599516SKenneth E. Jansen         call bardmc (y,       shgl,      shp,
98459599516SKenneth E. Jansen     &                iper,    ilwork,
98559599516SKenneth E. Jansen     &                nsons,   ifath,     x)
98659599516SKenneth E. Jansen      endif
98759599516SKenneth E. Jansen
98859599516SKenneth E. Jansen      if (ilesmod .eq. 2) then  ! 20 < iLES < 30 => dynamic at quad
98959599516SKenneth E. Jansen                                ! pts based on lumped projection filt.
99059599516SKenneth E. Jansen
99159599516SKenneth E. Jansen         if(isubmod.eq.0)then
99259599516SKenneth E. Jansen            call projdmc (y,       shgl,      shp,
99359599516SKenneth E. Jansen     &                    iper,       ilwork,    x)
99459599516SKenneth E. Jansen         else
99559599516SKenneth E. Jansen            call cpjdmcnoi (y,      shgl,      shp,
99659599516SKenneth E. Jansen     &                      iper,   ilwork,       x,
99759599516SKenneth E. Jansen     &                      rowp,   colm,
99859599516SKenneth E. Jansen     &                      iBC,    BC)
99959599516SKenneth E. Jansen         endif
100059599516SKenneth E. Jansen
100159599516SKenneth E. Jansen      endif
100259599516SKenneth E. Jansen
100359599516SKenneth E. Jansen      if( (iLES.gt.1) )   then ! Deallocate Stuff for advanced LES models
100459599516SKenneth E. Jansen         deallocate (fwr2)
100559599516SKenneth E. Jansen         deallocate (fwr3)
100659599516SKenneth E. Jansen         deallocate (fwr4)
100759599516SKenneth E. Jansen         deallocate (xavegt)
100859599516SKenneth E. Jansen         deallocate (xavegt2)
100959599516SKenneth E. Jansen         deallocate (xavegt3)
101059599516SKenneth E. Jansen         deallocate (stabdis)
101159599516SKenneth E. Jansen      endif
101259599516SKenneth E. Jansen      return
101359599516SKenneth E. Jansen      end
101459599516SKenneth E. Jansen
101559599516SKenneth E. Jansenc
101659599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution
101759599516SKenneth E. Jansenc
101859599516SKenneth E. Jansen      subroutine CalcImpConvCoef (numISrfs, numTpoints)
101959599516SKenneth E. Jansen
102059599516SKenneth E. Jansen      use convolImpFlow !uses flow history and impedance for convolution
102159599516SKenneth E. Jansen
102259599516SKenneth E. Jansen      include "common.h" !for alfi
102359599516SKenneth E. Jansen
102459599516SKenneth E. Jansen      integer numISrfs, numTpoints
102559599516SKenneth E. Jansen
102659599516SKenneth E. Jansen      allocate (ConvCoef(numTpoints+2,3)) !same time discret. for all imp. BC
102759599516SKenneth E. Jansen      do j=1,numTpoints+2
102859599516SKenneth E. Jansen         ConvCoef(j,:)=0.5/numTpoints !dt/2 divided by period T=N*dt
102959599516SKenneth E. Jansen         ConvCoef(j,1)=ConvCoef(j,1)*(1.0-alfi)*(1.0-alfi)
103059599516SKenneth E. Jansen         ConvCoef(j,2)=ConvCoef(j,2)*(1.0+2*alfi*(1.0-alfi))
103159599516SKenneth E. Jansen         ConvCoef(j,3)=ConvCoef(j,3)*alfi*alfi
103259599516SKenneth E. Jansen      enddo
103359599516SKenneth E. Jansen      ConvCoef(1,2)=zero
103459599516SKenneth E. Jansen      ConvCoef(1,3)=zero
103559599516SKenneth E. Jansen      ConvCoef(2,3)=zero
103659599516SKenneth E. Jansen      ConvCoef(numTpoints+1,1)=zero
103759599516SKenneth E. Jansen      ConvCoef(numTpoints+2,2)=zero
103859599516SKenneth E. Jansen      ConvCoef(numTpoints+2,1)=zero
103959599516SKenneth E. Jansenc
104059599516SKenneth E. Jansenc...calculate the coefficients for the impedance convolution
104159599516SKenneth E. Jansenc
104259599516SKenneth E. Jansen      allocate (ImpConvCoef(numTpoints+2,numISrfs))
104359599516SKenneth E. Jansen
104459599516SKenneth E. Jansenc..coefficients below assume Q linear in time step, Z constant
104559599516SKenneth E. Jansenc            do j=3,numTpoints
104659599516SKenneth E. Jansenc                ImpConvCoef(j,:) = ValueListImp(j-1,:)*ConvCoef(j,3)
104759599516SKenneth E. Jansenc     &                             + ValueListImp(j,:)*ConvCoef(j,2)
104859599516SKenneth E. Jansenc     &                             + ValueListImp(j+1,:)*ConvCoef(j,1)
104959599516SKenneth E. Jansenc            enddo
105059599516SKenneth E. Jansenc            ImpConvCoef(1,:) = ValueListImp(2,:)*ConvCoef(1,1)
105159599516SKenneth E. Jansenc            ImpConvCoef(2,:) = ValueListImp(2,:)*ConvCoef(2,2)
105259599516SKenneth E. Jansenc     &                       + ValueListImp(3,:)*ConvCoef(2,1)
105359599516SKenneth E. Jansenc            ImpConvCoef(numTpoints+1,:) =
105459599516SKenneth E. Jansenc     &           ValueListImp(numTpoints,:)*ConvCoef(numTpoints+1,3)
105559599516SKenneth E. Jansenc     &         + ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+1,2)
105659599516SKenneth E. Jansenc            ImpConvCoef(numTpoints+2,:) =
105759599516SKenneth E. Jansenc     &           ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+2,3)
105859599516SKenneth E. Jansen
105959599516SKenneth E. Jansenc..try easiest convolution Q and Z constant per time step
106059599516SKenneth E. Jansen      do j=3,numTpoints+1
106159599516SKenneth E. Jansen         ImpConvCoef(j,:) = ValueListImp(j-1,:)/numTpoints
106259599516SKenneth E. Jansen      enddo
106359599516SKenneth E. Jansen      ImpConvCoef(1,:) =zero
106459599516SKenneth E. Jansen      ImpConvCoef(2,:) =zero
106559599516SKenneth E. Jansen      ImpConvCoef(numTpoints+2,:) =
106659599516SKenneth E. Jansen     &           ValueListImp(numTpoints+1,:)/numTpoints
106759599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr()
106859599516SKenneth E. Jansen      ImpConvCoef(numTpoints+1,:)= ImpConvCoef(numTpoints+1,:)
106959599516SKenneth E. Jansen     &                  - ImpConvCoef(numTpoints+2,:)*(1.0-alfi)/alfi
107059599516SKenneth E. Jansen      ImpConvCoef(numTpoints+2,:)= ImpConvCoef(numTpoints+2,:)/alfi
107159599516SKenneth E. Jansen      return
107259599516SKenneth E. Jansen      end
107359599516SKenneth E. Jansen
107459599516SKenneth E. Jansenc
107559599516SKenneth E. Jansenc ... update the flow rate history for the impedance convolution, filter it and write it out
107659599516SKenneth E. Jansenc
107759599516SKenneth E. Jansen      subroutine UpdHistConv(y,nsrfIdList,numSrfs)
107859599516SKenneth E. Jansen
107959599516SKenneth E. Jansen      use convolImpFlow !brings ntimeptpT, QHistImp, QHistTry, QHistTryF, numImpSrfs
108059599516SKenneth E. Jansen      use convolRCRFlow !brings QHistRCR, numRCRSrfs
108159599516SKenneth E. Jansen
108259599516SKenneth E. Jansen      include "common.h"
108359599516SKenneth E. Jansen
108459599516SKenneth E. Jansen      integer   nsrfIdList(0:MAXSURF), numSrfs
108559599516SKenneth E. Jansen      character*20 fname1
108659599516SKenneth E. Jansen      character*10 cname2
108759599516SKenneth E. Jansen      character*5 cname
108859599516SKenneth E. Jansen      real*8    y(nshg,3) !velocity at time n+1
108959599516SKenneth E. Jansen      real*8    NewQ(0:MAXSURF) !temporary unknown for the flow rate
109059599516SKenneth E. Jansen                        !that needs to be added to the flow history
109159599516SKenneth E. Jansen
109259599516SKenneth E. Jansen      call GetFlowQ(NewQ,y,nsrfIdList,numSrfs) !new flow at time n+1
109359599516SKenneth E. Jansenc
109459599516SKenneth E. Jansenc... for imp BC: shift QHist, add new constribution, filter and write out
109559599516SKenneth E. Jansenc
109659599516SKenneth E. Jansen      if(numImpSrfs.gt.zero) then
109759599516SKenneth E. Jansen         do j=1, ntimeptpT
109859599516SKenneth E. Jansen            QHistImp(j,1:numSrfs)=QHistImp(j+1,1:numSrfs)
109959599516SKenneth E. Jansen         enddo
110059599516SKenneth E. Jansen         QHistImp(ntimeptpT+1,1:numSrfs) = NewQ(1:numSrfs)
110159599516SKenneth E. Jansen
110259599516SKenneth E. Jansenc
110359599516SKenneth E. Jansenc....filter the flow rate history
110459599516SKenneth E. Jansenc
110559599516SKenneth E. Jansen         cutfreq = 10           !hardcoded cutting frequency of the filter
110659599516SKenneth E. Jansen         do j=1, ntimeptpT
110759599516SKenneth E. Jansen            QHistTry(j,:)=QHistImp(j+1,:)
110859599516SKenneth E. Jansen         enddo
110959599516SKenneth E. Jansen         call Filter(QHistTryF,QHistTry,ntimeptpT,Delt(1),cutfreq)
111059599516SKenneth E. Jansenc.... if no filter applied then uncomment next three lines
111159599516SKenneth E. Jansenc         do j=1, ntimeptpT
111259599516SKenneth E. Jansenc            QHistTryF(j,:)=QHistTry(j,:)
111359599516SKenneth E. Jansenc         enddo
111459599516SKenneth E. Jansen
111559599516SKenneth E. Jansenc         QHistImp(1,:)=zero ! why do we do this? for beta(1,:) = zero it does not really matters
111659599516SKenneth E. Jansen         do j=1, ntimeptpT
111759599516SKenneth E. Jansen            QHistImp(j+1,:)=QHistTryF(j,:)
111859599516SKenneth E. Jansen         enddo
111959599516SKenneth E. Jansenc
112059599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat
112159599516SKenneth E. Jansenc
112259599516SKenneth E. Jansen         if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or.
112359599516SKenneth E. Jansen     &        (istep .eq. nstep(1)))) .and.
112459599516SKenneth E. Jansen     &        (myrank .eq. master)) then
112559599516SKenneth E. Jansen            open(unit=816, file='Qhistor.dat',status='replace')
112659599516SKenneth E. Jansen            write(816,*) ntimeptpT
112759599516SKenneth E. Jansen            do j=1,ntimeptpT+1
112859599516SKenneth E. Jansen               write(816,*) (QHistImp(j,n),n=1, numSrfs)
112959599516SKenneth E. Jansen            enddo
113059599516SKenneth E. Jansen            close(816)
113159599516SKenneth E. Jansenc... write out a copy with step number to be able to restart
113259599516SKenneth E. Jansen            fname1 = 'Qhistor'
113359599516SKenneth E. Jansen            fname1 = trim(fname1)//trim(cname2(lstep))//'.dat'
113459599516SKenneth E. Jansen            open(unit=8166,file=trim(fname1),status='unknown')
113559599516SKenneth E. Jansen            write(8166,*) ntimeptpT
113659599516SKenneth E. Jansen            do j=1,ntimeptpT+1
113759599516SKenneth E. Jansen               write(8166,*) (QHistImp(j,n),n=1, numSrfs)
113859599516SKenneth E. Jansen            enddo
113959599516SKenneth E. Jansen            close(8166)
114059599516SKenneth E. Jansen         endif
114159599516SKenneth E. Jansen      endif
114259599516SKenneth E. Jansen
114359599516SKenneth E. Jansenc
114459599516SKenneth E. Jansenc... for RCR bc just add the new contribution
114559599516SKenneth E. Jansenc
114659599516SKenneth E. Jansen      if(numRCRSrfs.gt.zero) then
114759599516SKenneth E. Jansen         QHistRCR(lstep+1,1:numSrfs) = NewQ(1:numSrfs)
114859599516SKenneth E. Jansenc
114959599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat
115059599516SKenneth E. Jansenc
115159599516SKenneth E. Jansen         if ((irs .ge. 1) .and. (myrank .eq. master)) then
115259599516SKenneth E. Jansen            if(istep.eq.1) then
115359599516SKenneth E. Jansen               open(unit=816,file='Qhistor.dat',status='unknown')
115459599516SKenneth E. Jansen            else
115559599516SKenneth E. Jansen               open(unit=816,file='Qhistor.dat',position='append')
115659599516SKenneth E. Jansen            endif
115759599516SKenneth E. Jansen            if(istep.eq.1) then
115859599516SKenneth E. Jansen               do j=1,lstep
115959599516SKenneth E. Jansen                  write(816,*) j, (QHistRCR(j,n),n=1,numSrfs) ! read from file of previous run
116059599516SKenneth E. Jansen               enddo
116159599516SKenneth E. Jansen            endif
116259599516SKenneth E. Jansen            write(816,*) lstep+1, (QHistRCR(lstep+1,n),n=1, numSrfs)
116359599516SKenneth E. Jansen            close(816)
116459599516SKenneth E. Jansenc... write out a copy with step number to be able to restart
116559599516SKenneth E. Jansen            if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or.
116659599516SKenneth E. Jansen     &           (istep .eq. nstep(1)))) .and.
116759599516SKenneth E. Jansen     &           (myrank .eq. master)) then
116859599516SKenneth E. Jansen               fname1 = 'Qhistor'
116959599516SKenneth E. Jansen               fname1 = trim(fname1)//trim(cname2(lstep))//'.dat'
117059599516SKenneth E. Jansen               open(unit=8166,file=trim(fname1),status='unknown')
117159599516SKenneth E. Jansen               write(8166,*) lstep+1
117259599516SKenneth E. Jansen               do j=1,lstep+1
117359599516SKenneth E. Jansen                  write(8166,*) (QHistRCR(j,n),n=1, numSrfs)
117459599516SKenneth E. Jansen               enddo
117559599516SKenneth E. Jansen               close(8166)
117659599516SKenneth E. Jansen            endif
117759599516SKenneth E. Jansen         endif
117859599516SKenneth E. Jansen      endif
117959599516SKenneth E. Jansen
118059599516SKenneth E. Jansen      return
118159599516SKenneth E. Jansen      end
118259599516SKenneth E. Jansen
118359599516SKenneth E. Jansenc
118459599516SKenneth E. Jansenc...calculate the time varying coefficients for the RCR convolution
118559599516SKenneth E. Jansenc
118659599516SKenneth E. Jansen      subroutine CalcRCRConvCoef (stepn, numSrfs)
118759599516SKenneth E. Jansen
118859599516SKenneth E. Jansen      use convolRCRFlow !brings in ValueListRCR, dtRCR
118959599516SKenneth E. Jansen
119059599516SKenneth E. Jansen      include "common.h" !brings alfi
119159599516SKenneth E. Jansen
119259599516SKenneth E. Jansen      integer numSrfs, stepn
119359599516SKenneth E. Jansen
119459599516SKenneth E. Jansen      RCRConvCoef = zero
119559599516SKenneth E. Jansen      if (stepn .eq. 0) then
119659599516SKenneth E. Jansen        RCRConvCoef(1,:) = ValueListRCR(1,:)*(1.0-alfi) +
119759599516SKenneth E. Jansen     &   ValueListRCR(3,:)*(-alfi + 1.0 + 1/dtRCR(:)
119859599516SKenneth E. Jansen     &     - exp(-alfi*dtRCR(:))*(1 + 1/dtRCR(:)))
119959599516SKenneth E. Jansen        RCRConvCoef(2,:) = ValueListRCR(1,:)*alfi
120059599516SKenneth E. Jansen     &     + ValueListRCR(3,:)
120159599516SKenneth E. Jansen     &     *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:))
120259599516SKenneth E. Jansen      endif
120359599516SKenneth E. Jansen      if (stepn .ge. 1) then
120459599516SKenneth E. Jansen        RCRConvCoef(1,:) =-ValueListRCR(3,:)*exp(-dtRCR(:)*(stepn+alfi))
120559599516SKenneth E. Jansen     &        *(1 + (1 - exp(dtRCR(:)))/dtRCR(:))
120659599516SKenneth E. Jansen        RCRConvCoef(stepn+1,:) = ValueListRCR(1,:)*(1-alfi)
120759599516SKenneth E. Jansen     &     - ValueListRCR(3,:)*(alfi - 1 - 1/dtRCR(:)
120859599516SKenneth E. Jansen     &     + exp(-alfi*dtRCR(:))/dtRCR(:)*(2 - exp(-dtRCR(:))))
120959599516SKenneth E. Jansen        RCRConvCoef(stepn+2,:) = ValueListRCR(1,:)*alfi
121059599516SKenneth E. Jansen     &     + ValueListRCR(3,:)
121159599516SKenneth E. Jansen     &     *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:))
121259599516SKenneth E. Jansen      endif
121359599516SKenneth E. Jansen      if (stepn .ge. 2) then
121459599516SKenneth E. Jansen        do j=2,stepn
121559599516SKenneth E. Jansen         RCRConvCoef(j,:) = ValueListRCR(3,:)/dtRCR(:)*
121659599516SKenneth E. Jansen     &        exp(-dtRCR(:)*(stepn + alfi + 2 - j))*
121759599516SKenneth E. Jansen     &        (1 - exp(dtRCR(:)))**2
121859599516SKenneth E. Jansen        enddo
121959599516SKenneth E. Jansen      endif
122059599516SKenneth E. Jansen
122159599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr()
122259599516SKenneth E. Jansen      RCRConvCoef(stepn+1,:)= RCRConvCoef(stepn+1,:)
122359599516SKenneth E. Jansen     &                  - RCRConvCoef(stepn+2,:)*(1.0-alfi)/alfi
122459599516SKenneth E. Jansen      RCRConvCoef(stepn+2,:)= RCRConvCoef(stepn+2,:)/alfi
122559599516SKenneth E. Jansen
122659599516SKenneth E. Jansen      return
122759599516SKenneth E. Jansen      end
122859599516SKenneth E. Jansen
122959599516SKenneth E. Jansenc
123059599516SKenneth E. Jansenc...calculate the time dependent H operator for the RCR convolution
123159599516SKenneth E. Jansenc
123259599516SKenneth E. Jansen      subroutine CalcHopRCR (timestepRCR, stepn, numSrfs)
123359599516SKenneth E. Jansen
123459599516SKenneth E. Jansen      use convolRCRFlow !brings in HopRCR, dtRCR
123559599516SKenneth E. Jansen
123659599516SKenneth E. Jansen      include "common.h"
123759599516SKenneth E. Jansen
123859599516SKenneth E. Jansen      integer numSrfs, stepn
123959599516SKenneth E. Jansen      real*8  PdistCur(0:MAXSURF), timestepRCR
124059599516SKenneth E. Jansen
124159599516SKenneth E. Jansen      HopRCR=zero
124259599516SKenneth E. Jansen      call RCRint(timestepRCR*(stepn + alfi),PdistCur)
124359599516SKenneth E. Jansen      HopRCR(1:numSrfs) = RCRic(1:numSrfs)
124459599516SKenneth E. Jansen     &     *exp(-dtRCR(1:numSrfs)*(stepn + alfi)) + PdistCur(1:numSrfs)
124559599516SKenneth E. Jansen      return
124659599516SKenneth E. Jansen      end
124759599516SKenneth E. Jansenc
124859599516SKenneth E. Jansenc ... initialize the influence of the initial conditions for the RCR BC
124959599516SKenneth E. Jansenc
125059599516SKenneth E. Jansen      subroutine calcRCRic(y,srfIdList,numSrfs)
125159599516SKenneth E. Jansen
125259599516SKenneth E. Jansen      use convolRCRFlow    !brings RCRic, ValueListRCR, ValuePdist
125359599516SKenneth E. Jansen
125459599516SKenneth E. Jansen      include "common.h"
125559599516SKenneth E. Jansen
125659599516SKenneth E. Jansen      integer   srfIdList(0:MAXSURF), numSrfs, irankCoupled
125759599516SKenneth E. Jansen      real*8    y(nshg,4) !need velocity and pressure
125859599516SKenneth E. Jansen      real*8    Qini(0:MAXSURF) !initial flow rate
125959599516SKenneth E. Jansen      real*8    PdistIni(0:MAXSURF) !initial distal pressure
126059599516SKenneth E. Jansen      real*8    Pini(0:MAXSURF),CoupleArea(0:MAXSURF) ! initial pressure
126159599516SKenneth E. Jansen      real*8    VelOnly(nshg,3), POnly(nshg)
126259599516SKenneth E. Jansen
126359599516SKenneth E. Jansen      allocate (RCRic(0:MAXSURF))
126459599516SKenneth E. Jansen
126559599516SKenneth E. Jansen      if(lstep.eq.0) then
126659599516SKenneth E. Jansen         VelOnly(:,1:3)=y(:,1:3)
126759599516SKenneth E. Jansen         call GetFlowQ(Qini,VelOnly,srfIdList,numSrfs) !get initial flow
126859599516SKenneth E. Jansen         QHistRCR(1,1:numSrfs)=Qini(1:numSrfs) !initialize QHistRCR
126959599516SKenneth E. Jansen         POnly(:)=y(:,4)        ! pressure
127059599516SKenneth E. Jansen         call integrScalar(Pini,POnly,srfIdList,numSrfs) !get initial pressure integral
127159599516SKenneth E. Jansen         POnly(:)=one           ! one to get area
127259599516SKenneth E. Jansen         call integrScalar(CoupleArea,POnly,srfIdList,numSrfs) !get surf area
127359599516SKenneth E. Jansen         Pini(1:numSrfs) = Pini(1:numSrfs)/CoupleArea(1:numSrfs)
127459599516SKenneth E. Jansen      else
127559599516SKenneth E. Jansen         Qini(1:numSrfs)=QHistRCR(1,1:numSrfs)
127659599516SKenneth E. Jansen         Pini(1:numSrfs)=zero    ! hack
127759599516SKenneth E. Jansen      endif
127859599516SKenneth E. Jansen      call RCRint(istep,PdistIni) !get initial distal P (use istep)
127959599516SKenneth E. Jansen      RCRic(1:numSrfs) = Pini(1:numSrfs)
128059599516SKenneth E. Jansen     &          - ValueListRCR(1,:)*Qini(1:numSrfs)-PdistIni(1:numSrfs)
128159599516SKenneth E. Jansen      return
128259599516SKenneth E. Jansen      end
128359599516SKenneth E. Jansen
128459599516SKenneth E. Jansenc.........function that integrates a scalar over a boundary
128559599516SKenneth E. Jansen      subroutine integrScalar(scalInt,scal,srfIdList,numSrfs)
128659599516SKenneth E. Jansen
128759599516SKenneth E. Jansen      use pvsQbi !brings ndsurf, NASC
128859599516SKenneth E. Jansen
128959599516SKenneth E. Jansen      include "common.h"
129059599516SKenneth E. Jansen      include "mpif.h"
129159599516SKenneth E. Jansen
129259599516SKenneth E. Jansen      integer   srfIdList(0:MAXSURF), numSrfs, irankCoupled, i, k
129359599516SKenneth E. Jansen      real*8    scal(nshg), scalInt(0:MAXSURF), scalIntProc(0:MAXSURF)
129459599516SKenneth E. Jansen
129559599516SKenneth E. Jansen      scalIntProc = zero
129659599516SKenneth E. Jansen      do i = 1,nshg
129759599516SKenneth E. Jansen        if(numSrfs.gt.zero) then
129859599516SKenneth E. Jansen          do k = 1,numSrfs
129959599516SKenneth E. Jansen            irankCoupled = 0
130059599516SKenneth E. Jansen            if (srfIdList(k).eq.ndsurf(i)) then
130159599516SKenneth E. Jansen              irankCoupled=k
130259599516SKenneth E. Jansen              scalIntProc(irankCoupled) = scalIntProc(irankCoupled)
130359599516SKenneth E. Jansen     &                            + NASC(i)*scal(i)
130459599516SKenneth E. Jansen              exit
130559599516SKenneth E. Jansen            endif
130659599516SKenneth E. Jansen          enddo
130759599516SKenneth E. Jansen        endif
130859599516SKenneth E. Jansen      enddo
130959599516SKenneth E. Jansenc
131059599516SKenneth E. Jansenc     at this point, each scalint has its "nodes" contributions to the scalar
131159599516SKenneth E. Jansenc     accumulated into scalIntProc. Note, because NASC is on processor this
131259599516SKenneth E. Jansenc     will NOT be the scalar for the surface yet
131359599516SKenneth E. Jansenc
131459599516SKenneth E. Jansenc.... reduce integrated scalar for each surface, push on scalInt
131559599516SKenneth E. Jansenc
131659599516SKenneth E. Jansen        npars=MAXSURF+1
131759599516SKenneth E. Jansen       call MPI_ALLREDUCE (scalIntProc, scalInt(:), npars,
131859599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
131959599516SKenneth E. Jansen
132059599516SKenneth E. Jansen      return
132159599516SKenneth E. Jansen      end
132259599516SKenneth E. Jansen
13239071d3baSCameron Smith      subroutine writeTimingMessage(key,iomode,timing)
13249071d3baSCameron Smith      use iso_c_binding
13259071d3baSCameron Smith      use phstr
13269071d3baSCameron Smith      implicit none
132759599516SKenneth E. Jansen
13289071d3baSCameron Smith      character(len=*) :: key
13299071d3baSCameron Smith      integer :: iomode
13309071d3baSCameron Smith      real*8 :: timing
1331da7d5714SCameron Smith      character(len=1024) :: timing_msg
133289625e43SCameron Smith      character(len=*), parameter ::
133389625e43SCameron Smith     &  streamModeString = c_char_"stream"//c_null_char,
133489625e43SCameron Smith     &  fileModeString = c_char_"disk"//c_null_char
133559599516SKenneth E. Jansen
1336da7d5714SCameron Smith      timing_msg = c_char_"Time to write "//c_null_char
13379071d3baSCameron Smith      call phstr_appendStr(timing_msg,key)
13389071d3baSCameron Smith      if ( iomode .eq. -1 ) then
13399071d3baSCameron Smith        call phstr_appendStr(timing_msg, streamModeString)
13409071d3baSCameron Smith      else
13419071d3baSCameron Smith        call phstr_appendStr(timing_msg, fileModeString)
13429071d3baSCameron Smith      endif
13439071d3baSCameron Smith      call phstr_appendStr(timing_msg, c_char_' = '//c_null_char)
13449071d3baSCameron Smith      call phstr_appendDbl(timing_msg, timing)
1345da7d5714SCameron Smith      write(6,*) trim(timing_msg)
13469071d3baSCameron Smith      return
13479071d3baSCameron Smith      end subroutine
134859599516SKenneth E. Jansen
1349*34e67057SKenneth E. Jansen      subroutine initmpistat()
1350*34e67057SKenneth E. Jansen        include "common.h"
1351*34e67057SKenneth E. Jansen
1352*34e67057SKenneth E. Jansen        impistat = 0
1353*34e67057SKenneth E. Jansen        impistat2 = 0
1354*34e67057SKenneth E. Jansen        iISend = 0
1355*34e67057SKenneth E. Jansen        iISendScal = 0
1356*34e67057SKenneth E. Jansen        iIRecv = 0
1357*34e67057SKenneth E. Jansen        iIRecvScal = 0
1358*34e67057SKenneth E. Jansen        iWaitAll = 0
1359*34e67057SKenneth E. Jansen        iWaitAllScal = 0
1360*34e67057SKenneth E. Jansen        iAllR = 0
1361*34e67057SKenneth E. Jansen        iAllRScal = 0
1362*34e67057SKenneth E. Jansen        rISend = zero
1363*34e67057SKenneth E. Jansen        rISendScal = zero
1364*34e67057SKenneth E. Jansen        rIRecv = zero
1365*34e67057SKenneth E. Jansen        rIRecvScal = zero
1366*34e67057SKenneth E. Jansen        rWaitAll = zero
1367*34e67057SKenneth E. Jansen        rWaitAllScal = zero
1368*34e67057SKenneth E. Jansen        rAllR = zero
1369*34e67057SKenneth E. Jansen        rAllRScal = zero
1370*34e67057SKenneth E. Jansen        rCommu = zero
1371*34e67057SKenneth E. Jansen        rCommuScal = zero
1372*34e67057SKenneth E. Jansen      return
1373*34e67057SKenneth E. Jansen      end subroutine
1374*34e67057SKenneth E. Jansen
1375*34e67057SKenneth E. Jansen      subroutine initTimeSeries()
1376*34e67057SKenneth E. Jansen      use timedata   !allows collection of time series
1377*34e67057SKenneth E. Jansen        include "common.h"
1378*34e67057SKenneth E. Jansen       character*60    fvarts
1379*34e67057SKenneth E. Jansen       character*10    cname2
1380*34e67057SKenneth E. Jansen
1381*34e67057SKenneth E. Jansen
1382*34e67057SKenneth E. Jansen        inquire(file='xyzts.dat',exist=exts)
1383*34e67057SKenneth E. Jansen        if(exts) then
1384*34e67057SKenneth E. Jansen
1385*34e67057SKenneth E. Jansen           open(unit=626,file='xyzts.dat',status='old')
1386*34e67057SKenneth E. Jansen           read(626,*) ntspts, freq, tolpt, iterat, varcod
1387*34e67057SKenneth E. Jansen           call sTD             ! sets data structures
1388*34e67057SKenneth E. Jansen
1389*34e67057SKenneth E. Jansen           do jj=1,ntspts       ! read coordinate data where solution desired
1390*34e67057SKenneth E. Jansen              read(626,*) ptts(jj,1),ptts(jj,2),ptts(jj,3)
1391*34e67057SKenneth E. Jansen           enddo
1392*34e67057SKenneth E. Jansen           close(626)
1393*34e67057SKenneth E. Jansen
1394*34e67057SKenneth E. Jansen           statptts(:,:) = 0
1395*34e67057SKenneth E. Jansen           parptts(:,:) = zero
1396*34e67057SKenneth E. Jansen           varts(:,:) = zero
1397*34e67057SKenneth E. Jansen
1398*34e67057SKenneth E. Jansen
1399*34e67057SKenneth E. Jansen           iv_rankpernode = iv_rankpercore*iv_corepernode
1400*34e67057SKenneth E. Jansen           iv_totnodes = numpe/iv_rankpernode
1401*34e67057SKenneth E. Jansen           iv_totcores = iv_corepernode*iv_totnodes
1402*34e67057SKenneth E. Jansen           if (myrank .eq. 0) then
1403*34e67057SKenneth E. Jansen             write(*,*) 'Info for probes:'
1404*34e67057SKenneth E. Jansen             write(*,*) '  Ranks per core:',iv_rankpercore
1405*34e67057SKenneth E. Jansen             write(*,*) '  Cores per node:',iv_corepernode
1406*34e67057SKenneth E. Jansen             write(*,*) '  Ranks per node:',iv_rankpernode
1407*34e67057SKenneth E. Jansen             write(*,*) '  Total number of nodes:',iv_totnodes
1408*34e67057SKenneth E. Jansen             write(*,*) '  Total number of cores',iv_totcores
1409*34e67057SKenneth E. Jansen           endif
1410*34e67057SKenneth E. Jansen
1411*34e67057SKenneth E. Jansen!           if (myrank .eq. numpe-1) then
1412*34e67057SKenneth E. Jansen            do jj=1,ntspts
1413*34e67057SKenneth E. Jansen
1414*34e67057SKenneth E. Jansen               ! Compute the adequate rank which will take care of probe jj
1415*34e67057SKenneth E. Jansen               jjm1 = jj-1
1416*34e67057SKenneth E. Jansen               iv_node = (iv_totnodes-1)-mod(jjm1,iv_totnodes)
1417*34e67057SKenneth E. Jansen               iv_core = (iv_corepernode-1) - mod((jjm1 -
1418*34e67057SKenneth E. Jansen     &              mod(jjm1,iv_totnodes))/iv_totnodes,iv_corepernode)
1419*34e67057SKenneth E. Jansen               iv_thread = (iv_rankpercore-1) - mod((jjm1-
1420*34e67057SKenneth E. Jansen     &              (mod(jjm1,iv_totcores)))/iv_totcores,iv_rankpercore)
1421*34e67057SKenneth E. Jansen               iv_rank(jj) = iv_node*iv_rankpernode
1422*34e67057SKenneth E. Jansen     &                     + iv_core*iv_rankpercore
1423*34e67057SKenneth E. Jansen     &                     + iv_thread
1424*34e67057SKenneth E. Jansen
1425*34e67057SKenneth E. Jansen               if(myrank == 0) then
1426*34e67057SKenneth E. Jansen                 write(*,*) '  Probe', jj, 'handled by rank',
1427*34e67057SKenneth E. Jansen     &                         iv_rank(jj), ' on node', iv_node
1428*34e67057SKenneth E. Jansen               endif
1429*34e67057SKenneth E. Jansen
1430*34e67057SKenneth E. Jansen               ! Verification just in case
1431*34e67057SKenneth E. Jansen               if(iv_rank(jj) .lt.0 .or. iv_rank(jj) .ge. numpe) then
1432*34e67057SKenneth E. Jansen                 write(*,*) 'WARNING: iv_rank(',jj,') is ', iv_rank(jj),
1433*34e67057SKenneth E. Jansen     &                      ' and reset to numpe-1'
1434*34e67057SKenneth E. Jansen                 iv_rank(jj) = numpe-1
1435*34e67057SKenneth E. Jansen               endif
1436*34e67057SKenneth E. Jansen
1437*34e67057SKenneth E. Jansen               ! Open the varts files
1438*34e67057SKenneth E. Jansen               if(myrank == iv_rank(jj)) then
1439*34e67057SKenneth E. Jansen                 fvarts='varts/varts'
1440*34e67057SKenneth E. Jansen                 fvarts=trim(fvarts)//trim(cname2(jj))
1441*34e67057SKenneth E. Jansen                 fvarts=trim(fvarts)//trim(cname2(lstep))
1442*34e67057SKenneth E. Jansen                 fvarts=trim(fvarts)//'.dat'
1443*34e67057SKenneth E. Jansen                 fvarts=trim(fvarts)
1444*34e67057SKenneth E. Jansen                 open(unit=1000+jj, file=fvarts, status='unknown')
1445*34e67057SKenneth E. Jansen               endif
1446*34e67057SKenneth E. Jansen            enddo
1447*34e67057SKenneth E. Jansen!           endif
1448*34e67057SKenneth E. Jansen
1449*34e67057SKenneth E. Jansen        endif
1450*34e67057SKenneth E. Jansenc
1451*34e67057SKenneth E. Jansen      return
1452*34e67057SKenneth E. Jansen      end subroutine
1453*34e67057SKenneth E. Jansen
1454*34e67057SKenneth E. Jansen       subroutine initEQS(iBC, rowp, colm)
1455*34e67057SKenneth E. Jansen
1456*34e67057SKenneth E. Jansen        use solvedata
1457*34e67057SKenneth E. Jansen        include "common.h"
1458*34e67057SKenneth E. Jansen#ifdef HAVE_SVLS
1459*34e67057SKenneth E. Jansen        include "svLS.h"
1460*34e67057SKenneth E. Jansen#endif
1461*34e67057SKenneth E. Jansen        character*1024    servername
1462*34e67057SKenneth E. Jansen#ifdef HAVE_LESLIB
1463*34e67057SKenneth E. Jansen        integer eqnType
1464*34e67057SKenneth E. Jansen!      IF (svLSFlag .EQ. 0) THEN  !When we get a PETSc option it also could block this or a positive leslib
1465*34e67057SKenneth E. Jansen        call SolverLicenseServer(servername)
1466*34e67057SKenneth E. Jansen!      ENDIF
1467*34e67057SKenneth E. Jansen#endif
1468*34e67057SKenneth E. Jansenc
1469*34e67057SKenneth E. Jansenc.... For linear solver Library
1470*34e67057SKenneth E. Jansenc
1471*34e67057SKenneth E. Jansenc
1472*34e67057SKenneth E. Jansenc.... assign parameter values
1473*34e67057SKenneth E. Jansenc
1474*34e67057SKenneth E. Jansen        do i = 1, 100
1475*34e67057SKenneth E. Jansen           numeqns(i) = i
1476*34e67057SKenneth E. Jansen        enddo
1477*34e67057SKenneth E. Jansenc
1478*34e67057SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve
1479*34e67057SKenneth E. Jansenc
1480*34e67057SKenneth E. Jansen      nsolt=mod(impl(1),2)      ! 1 if solving temperature
1481*34e67057SKenneth E. Jansen      nsclrsol=nsolt+nsclr      ! total number of scalars solved At
1482*34e67057SKenneth E. Jansen                                ! some point we probably want to create
1483*34e67057SKenneth E. Jansen                                ! a map, considering stepseq(), to find
1484*34e67057SKenneth E. Jansen                                ! what is actually solved and only
1485*34e67057SKenneth E. Jansen                                ! dimension lhs to the appropriate
1486*34e67057SKenneth E. Jansen                                ! size. (see 1.6.1 and earlier for a
1487*34e67057SKenneth E. Jansen                                ! "failed" attempt at this).
1488*34e67057SKenneth E. Jansen
1489*34e67057SKenneth E. Jansen
1490*34e67057SKenneth E. Jansen      nsolflow=mod(impl(1),100)/10  ! 1 if solving flow
1491*34e67057SKenneth E. Jansen
1492*34e67057SKenneth E. Jansenc
1493*34e67057SKenneth E. Jansenc.... Now, call lesNew routine to initialize
1494*34e67057SKenneth E. Jansenc     memory space
1495*34e67057SKenneth E. Jansenc
1496*34e67057SKenneth E. Jansen      call genadj(colm, rowp, icnt )  ! preprocess the adjacency list
1497*34e67057SKenneth E. Jansen
1498*34e67057SKenneth E. Jansen      nnz_tot=icnt ! this is exactly the number of non-zero blocks on
1499*34e67057SKenneth E. Jansen                   ! this proc
1500*34e67057SKenneth E. Jansen
1501*34e67057SKenneth E. Jansen      if (nsolflow.eq.1) then  ! start of setup for the flow
1502*34e67057SKenneth E. Jansen         lesId   = numeqns(1)
1503*34e67057SKenneth E. Jansen         eqnType = 1
1504*34e67057SKenneth E. Jansen         nDofs   = 4
1505*34e67057SKenneth E. Jansen
1506*34e67057SKenneth E. Jansen!--------------------------------------------------------------------
1507*34e67057SKenneth E. Jansen!     Rest of configuration of svLS is added here, where we have LHS
1508*34e67057SKenneth E. Jansen!     pointers
1509*34e67057SKenneth E. Jansen
1510*34e67057SKenneth E. Jansen         nPermDims = 1
1511*34e67057SKenneth E. Jansen         nTmpDims = 1
1512*34e67057SKenneth E. Jansen
1513*34e67057SKenneth E. Jansen
1514*34e67057SKenneth E. Jansen         allocate (lhsP(4,nnz_tot))
1515*34e67057SKenneth E. Jansen         allocate (lhsK(9,nnz_tot))
1516*34e67057SKenneth E. Jansen
1517*34e67057SKenneth E. Jansen!     Setting up svLS or leslib for flow
1518*34e67057SKenneth E. Jansen
1519*34e67057SKenneth E. Jansen      IF (svLSFlag .EQ. 1) THEN
1520*34e67057SKenneth E. Jansen#ifdef HAVE_SVLS
1521*34e67057SKenneth E. Jansen        IF(nPrjs.eq.0) THEN
1522*34e67057SKenneth E. Jansen           svLSType=2  !GMRES if borrowed ACUSIM projection vectors variable set to zero
1523*34e67057SKenneth E. Jansen         ELSE
1524*34e67057SKenneth E. Jansen           svLSType=3 !NS solver
1525*34e67057SKenneth E. Jansen         ENDIF
1526*34e67057SKenneth E. Jansen!  reltol for the NSSOLVE is the stop criterion on the outer loop
1527*34e67057SKenneth E. Jansen!  reltolIn is (eps_GM, eps_CG) from the CompMech paper
1528*34e67057SKenneth E. Jansen!  for now we are using
1529*34e67057SKenneth E. Jansen!  Tolerance on ACUSIM Pressure Projection for CG and
1530*34e67057SKenneth E. Jansen!  Tolerance on Momentum Equations for GMRES
1531*34e67057SKenneth E. Jansen! also using Kspaceand maxIters from setup for ACUSIM
1532*34e67057SKenneth E. Jansen!
1533*34e67057SKenneth E. Jansen         eps_outer=40.0*epstol(1)  !following papers soggestion for now
1534*34e67057SKenneth E. Jansen         CALL svLS_LS_CREATE(svLS_ls, svLSType, dimKry=Kspace,
1535*34e67057SKenneth E. Jansen     2      relTol=eps_outer, relTolIn=(/epstol(1),prestol/),
1536*34e67057SKenneth E. Jansen     3      maxItr=maxIters,
1537*34e67057SKenneth E. Jansen     4      maxItrIn=(/maxIters,maxIters/))
1538*34e67057SKenneth E. Jansen
1539*34e67057SKenneth E. Jansen         CALL svLS_COMMU_CREATE(communicator, MPI_COMM_WORLD)
1540*34e67057SKenneth E. Jansen            nNo=nshg
1541*34e67057SKenneth E. Jansen            gnNo=nshgt
1542*34e67057SKenneth E. Jansen            IF  (ipvsq .GE. 2) THEN
1543*34e67057SKenneth E. Jansen
1544*34e67057SKenneth E. Jansen#if((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 1))
1545*34e67057SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs
1546*34e67057SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs + numCORSrfs
1547*34e67057SKenneth E. Jansen#elif((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 0))
1548*34e67057SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs
1549*34e67057SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs + numCORSrfs
1550*34e67057SKenneth E. Jansen#elif((VER_CORONARY == 0)&&(VER_CLOSEDLOOP == 1))
1551*34e67057SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs
1552*34e67057SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs
1553*34e67057SKenneth E. Jansen#else
1554*34e67057SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs
1555*34e67057SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs
1556*34e67057SKenneth E. Jansen#endif
1557*34e67057SKenneth E. Jansen
1558*34e67057SKenneth E. Jansen            ELSE
1559*34e67057SKenneth E. Jansen               svLS_nFaces = 1   !not sure about this...looks like 1 means 0 for array size issues
1560*34e67057SKenneth E. Jansen            END IF
1561*34e67057SKenneth E. Jansen
1562*34e67057SKenneth E. Jansen            CALL svLS_LHS_CREATE(svLS_lhs, communicator, gnNo, nNo,
1563*34e67057SKenneth E. Jansen     2         nnz_tot, ltg, colm, rowp, svLS_nFaces)
1564*34e67057SKenneth E. Jansen
1565*34e67057SKenneth E. Jansen            faIn = 1
1566*34e67057SKenneth E. Jansen            facenNo = 0
1567*34e67057SKenneth E. Jansen            DO i=1, nshg
1568*34e67057SKenneth E. Jansen               IF (IBITS(iBC(i),3,3) .NE. 0)  facenNo = facenNo + 1
1569*34e67057SKenneth E. Jansen            END DO
1570*34e67057SKenneth E. Jansen            ALLOCATE(gNodes(facenNo), sV(nsd,facenNo))
1571*34e67057SKenneth E. Jansen            sV = 0D0
1572*34e67057SKenneth E. Jansen            j = 0
1573*34e67057SKenneth E. Jansen            DO i=1, nshg
1574*34e67057SKenneth E. Jansen               IF (IBITS(iBC(i),3,3) .NE. 0) THEN
1575*34e67057SKenneth E. Jansen                  j = j + 1
1576*34e67057SKenneth E. Jansen                  gNodes(j) = i
1577*34e67057SKenneth E. Jansen                  IF (.NOT.BTEST(iBC(i),3)) sV(1,j) = 1D0
1578*34e67057SKenneth E. Jansen                  IF (.NOT.BTEST(iBC(i),4)) sV(2,j) = 1D0
1579*34e67057SKenneth E. Jansen                  IF (.NOT.BTEST(iBC(i),5)) sV(3,j) = 1D0
1580*34e67057SKenneth E. Jansen               END IF
1581*34e67057SKenneth E. Jansen            END DO
1582*34e67057SKenneth E. Jansen            CALL svLS_BC_CREATE(svLS_lhs, faIn, facenNo,
1583*34e67057SKenneth E. Jansen     2         nsd, BC_TYPE_Dir, gNodes, sV)
1584*34e67057SKenneth E. Jansen            DEALLOCATE(gNodes)
1585*34e67057SKenneth E. Jansen            DEALLOCATE(sV)
1586*34e67057SKenneth E. Jansen#else
1587*34e67057SKenneth E. Jansen         if(myrank.eq.0) write(*,*) 'your input requests svLS but your cmake did not build for it'
1588*34e67057SKenneth E. Jansen         call error('itrdrv  ','nosVLS',svLSFlag)
1589*34e67057SKenneth E. Jansen#endif
1590*34e67057SKenneth E. Jansen           ENDIF
1591*34e67057SKenneth E. Jansen
1592*34e67057SKenneth E. Jansen           if(leslib.eq.1) then
1593*34e67057SKenneth E. Jansen#ifdef HAVE_LESLIB
1594*34e67057SKenneth E. Jansen!--------------------------------------------------------------------
1595*34e67057SKenneth E. Jansen           call myfLesNew( lesId,   41994,
1596*34e67057SKenneth E. Jansen     &                 eqnType,
1597*34e67057SKenneth E. Jansen     &                 nDofs,          minIters,       maxIters,
1598*34e67057SKenneth E. Jansen     &                 Kspace,         iprjFlag,        nPrjs,
1599*34e67057SKenneth E. Jansen     &                 ipresPrjFlag,    nPresPrjs,      epstol(1),
1600*34e67057SKenneth E. Jansen     &                 prestol,        iverbose,        statsflow,
1601*34e67057SKenneth E. Jansen     &                 nPermDims,      nTmpDims,      servername  )
1602*34e67057SKenneth E. Jansen
1603*34e67057SKenneth E. Jansen           allocate (aperm(nshg,nPermDims))
1604*34e67057SKenneth E. Jansen           allocate (atemp(nshg,nTmpDims))
1605*34e67057SKenneth E. Jansen           call readLesRestart( lesId,  aperm, nshg, myrank, lstep,
1606*34e67057SKenneth E. Jansen     &                        nPermDims )
1607*34e67057SKenneth E. Jansen#else
1608*34e67057SKenneth E. Jansen         if(myrank.eq.0) write(*,*) 'your input requests leslib but your cmake did not build for it'
1609*34e67057SKenneth E. Jansen         call error('itrdrv  ','nolslb',leslib)
1610*34e67057SKenneth E. Jansen#endif
1611*34e67057SKenneth E. Jansen         endif !leslib=1
1612*34e67057SKenneth E. Jansen
1613*34e67057SKenneth E. Jansen      else   ! not solving flow just scalar
1614*34e67057SKenneth E. Jansen         nPermDims = 0
1615*34e67057SKenneth E. Jansen         nTmpDims = 0
1616*34e67057SKenneth E. Jansen      endif
1617*34e67057SKenneth E. Jansen
1618*34e67057SKenneth E. Jansen
1619*34e67057SKenneth E. Jansen      if(nsclrsol.gt.0) then
1620*34e67057SKenneth E. Jansen       do isolsc=1,nsclrsol
1621*34e67057SKenneth E. Jansen         lesId       = numeqns(isolsc+1)
1622*34e67057SKenneth E. Jansen         eqnType     = 2
1623*34e67057SKenneth E. Jansen         nDofs       = 1
1624*34e67057SKenneth E. Jansen         isclpresPrjflag = 0
1625*34e67057SKenneth E. Jansen         nPresPrjs   = 0
1626*34e67057SKenneth E. Jansen         isclprjFlag     = 1
1627*34e67057SKenneth E. Jansen         indx=isolsc+2-nsolt ! complicated to keep epstol(2) for
1628*34e67057SKenneth E. Jansen                             ! temperature followed by scalars
1629*34e67057SKenneth E. Jansen!     Setting up svLS or leslib for scalar
1630*34e67057SKenneth E. Jansen#ifdef HAVE_SVLS
1631*34e67057SKenneth E. Jansen      IF (svLSFlag .EQ. 1) THEN
1632*34e67057SKenneth E. Jansen           svLSType=2  !only option for scalars
1633*34e67057SKenneth E. Jansen!  reltol for the GMRES is the stop criterion
1634*34e67057SKenneth E. Jansen! also using Kspaceand maxIters from setup for ACUSIM
1635*34e67057SKenneth E. Jansen!
1636*34e67057SKenneth E. Jansen         CALL svLS_LS_CREATE(svLS_ls_S(isolsc), svLSType, dimKry=Kspace,
1637*34e67057SKenneth E. Jansen     2      relTol=epstol(indx),
1638*34e67057SKenneth E. Jansen     3      maxItr=maxIters
1639*34e67057SKenneth E. Jansen     4      )
1640*34e67057SKenneth E. Jansen
1641*34e67057SKenneth E. Jansen         CALL svLS_COMMU_CREATE(communicator_S(isolsc), MPI_COMM_WORLD)
1642*34e67057SKenneth E. Jansen
1643*34e67057SKenneth E. Jansen               svLS_nFaces = 1   !not sure about this...should try it with zero
1644*34e67057SKenneth E. Jansen
1645*34e67057SKenneth E. Jansen            CALL svLS_LHS_CREATE(svLS_lhs_S(isolsc), communicator_S(isolsc), gnNo, nNo,
1646*34e67057SKenneth E. Jansen     2         nnz_tot, ltg, colm, rowp, svLS_nFaces)
1647*34e67057SKenneth E. Jansen
1648*34e67057SKenneth E. Jansen              faIn = 1
1649*34e67057SKenneth E. Jansen              facenNo = 0
1650*34e67057SKenneth E. Jansen              ib=5+isolsc
1651*34e67057SKenneth E. Jansen              DO i=1, nshg
1652*34e67057SKenneth E. Jansen                 IF (btest(iBC(i),ib))  facenNo = facenNo + 1
1653*34e67057SKenneth E. Jansen              END DO
1654*34e67057SKenneth E. Jansen              ALLOCATE(gNodes(facenNo), sV(1,facenNo))
1655*34e67057SKenneth E. Jansen              sV = 0D0
1656*34e67057SKenneth E. Jansen              j = 0
1657*34e67057SKenneth E. Jansen              DO i=1, nshg
1658*34e67057SKenneth E. Jansen               IF (btest(iBC(i),ib)) THEN
1659*34e67057SKenneth E. Jansen                  j = j + 1
1660*34e67057SKenneth E. Jansen                  gNodes(j) = i
1661*34e67057SKenneth E. Jansen               END IF
1662*34e67057SKenneth E. Jansen              END DO
1663*34e67057SKenneth E. Jansen
1664*34e67057SKenneth E. Jansen            CALL svLS_BC_CREATE(svLS_lhs_S(isolsc), faIn, facenNo,
1665*34e67057SKenneth E. Jansen     2         1, BC_TYPE_Dir, gNodes, sV(1,:))
1666*34e67057SKenneth E. Jansen            DEALLOCATE(gNodes)
1667*34e67057SKenneth E. Jansen            DEALLOCATE(sV)
1668*34e67057SKenneth E. Jansen
1669*34e67057SKenneth E. Jansen            if( isolsc.eq.1) then ! if multiple scalars make sure done once
1670*34e67057SKenneth E. Jansen              allocate (apermS(1,1,1))
1671*34e67057SKenneth E. Jansen              allocate (atempS(1,1))  !they can all share this
1672*34e67057SKenneth E. Jansen            endif
1673*34e67057SKenneth E. Jansen         ENDIF  !svLS handing scalar solve
1674*34e67057SKenneth E. Jansen#endif
1675*34e67057SKenneth E. Jansen
1676*34e67057SKenneth E. Jansen
1677*34e67057SKenneth E. Jansen#ifdef HAVE_LESLIB
1678*34e67057SKenneth E. Jansen         if (leslib.eq.1) then
1679*34e67057SKenneth E. Jansen         call myfLesNew( lesId,            41994,
1680*34e67057SKenneth E. Jansen     &                 eqnType,
1681*34e67057SKenneth E. Jansen     &                 nDofs,          minIters,       maxIters,
1682*34e67057SKenneth E. Jansen     &                 Kspace,         isclprjFlag,        nPrjs,
1683*34e67057SKenneth E. Jansen     &                 isclpresPrjFlag,    nPresPrjs,      epstol(indx),
1684*34e67057SKenneth E. Jansen     &                 prestol,        iverbose,        statssclr,
1685*34e67057SKenneth E. Jansen     &                 nPermDimsS,     nTmpDimsS,   servername )
1686*34e67057SKenneth E. Jansen        endif
1687*34e67057SKenneth E. Jansen#endif
1688*34e67057SKenneth E. Jansen       enddo  !loop over scalars to solve  (not yet worked out for multiple svLS solves
1689*34e67057SKenneth E. Jansen       allocate (lhsS(nnz_tot,nsclrsol))
1690*34e67057SKenneth E. Jansen#ifdef HAVE_LESLIB
1691*34e67057SKenneth E. Jansen       if(leslib.eq.1) then  ! we just prepped scalar solves for leslib so allocate arrays
1692*34e67057SKenneth E. Jansenc
1693*34e67057SKenneth E. Jansenc  Assume all scalars have the same size needs
1694*34e67057SKenneth E. Jansenc
1695*34e67057SKenneth E. Jansen       allocate (apermS(nshg,nPermDimsS,nsclrsol))
1696*34e67057SKenneth E. Jansen       allocate (atempS(nshg,nTmpDimsS))  !they can all share this
1697*34e67057SKenneth E. Jansen       endif
1698*34e67057SKenneth E. Jansen#endif
1699*34e67057SKenneth E. Jansenc
1700*34e67057SKenneth E. Jansenc actually they could even share with atemp but leave that for later
1701*34e67057SKenneth E. Jansenc
1702*34e67057SKenneth E. Jansen      else !no scalar solves at all so zero dims not used
1703*34e67057SKenneth E. Jansen         nPermDimsS = 0
1704*34e67057SKenneth E. Jansen         nTmpDimsS  = 0
1705*34e67057SKenneth E. Jansen      endif
1706*34e67057SKenneth E. Jansen      return
1707*34e67057SKenneth E. Jansen      end subroutine
1708*34e67057SKenneth E. Jansen      subroutine seticomputevort
1709*34e67057SKenneth E. Jansen        include "common.h"
1710*34e67057SKenneth E. Jansen            icomputevort = 0
1711*34e67057SKenneth E. Jansen            if (ivort == 1) then ! Print vorticity = True in solver.inp
1712*34e67057SKenneth E. Jansen              ! We then compute the vorticity only if we
1713*34e67057SKenneth E. Jansen              ! 1) we write an intermediate checkpoint
1714*34e67057SKenneth E. Jansen              ! 2) we reach the last time step and write the last checkpoint
1715*34e67057SKenneth E. Jansen              ! 3) we accumulate statistics in ybar for every time step
1716*34e67057SKenneth E. Jansen              ! BEWARE: we need here lstep+1 and istep+1 because the lstep and
1717*34e67057SKenneth E. Jansen              ! istep gets incremened after the flowsolve, further below
1718*34e67057SKenneth E. Jansen              if (((irs .ge. 1) .and. (mod(lstep+1, ntout) .eq. 0)) .or.
1719*34e67057SKenneth E. Jansen     &                   istep+1.eq.nstep(itseq) .or. ioybar == 1) then
1720*34e67057SKenneth E. Jansen                icomputevort = 1
1721*34e67057SKenneth E. Jansen              endif
1722*34e67057SKenneth E. Jansen            endif
1723*34e67057SKenneth E. Jansen
1724*34e67057SKenneth E. Jansen!            write(*,*) 'icomputevort: ',icomputevort, ' - istep: ',
1725*34e67057SKenneth E. Jansen!     &                istep,' - nstep(itseq):',nstep(itseq),'- lstep:',
1726*34e67057SKenneth E. Jansen!     &                lstep, '- ntout:', ntout
1727*34e67057SKenneth E. Jansen      return
1728*34e67057SKenneth E. Jansen      end subroutine
1729*34e67057SKenneth E. Jansen      subroutine computeVort( vorticity, GradV,strain)
1730*34e67057SKenneth E. Jansen
1731*34e67057SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: gradV, strain, vorticity
1732*34e67057SKenneth E. Jansen
1733*34e67057SKenneth E. Jansen              ! vorticity components and magnitude
1734*34e67057SKenneth E. Jansen              vorticity(:,1) = GradV(:,8)-GradV(:,6) !omega_x
1735*34e67057SKenneth E. Jansen              vorticity(:,2) = GradV(:,3)-GradV(:,7) !omega_y
1736*34e67057SKenneth E. Jansen              vorticity(:,3) = GradV(:,4)-GradV(:,2) !omega_z
1737*34e67057SKenneth E. Jansen              vorticity(:,4) = sqrt(   vorticity(:,1)*vorticity(:,1)
1738*34e67057SKenneth E. Jansen     &                               + vorticity(:,2)*vorticity(:,2)
1739*34e67057SKenneth E. Jansen     &                               + vorticity(:,3)*vorticity(:,3) )
1740*34e67057SKenneth E. Jansen              ! Q
1741*34e67057SKenneth E. Jansen              strain(:,1) = GradV(:,1)                  !S11
1742*34e67057SKenneth E. Jansen              strain(:,2) = 0.5*(GradV(:,2)+GradV(:,4)) !S12
1743*34e67057SKenneth E. Jansen              strain(:,3) = 0.5*(GradV(:,3)+GradV(:,7)) !S13
1744*34e67057SKenneth E. Jansen              strain(:,4) = GradV(:,5)                  !S22
1745*34e67057SKenneth E. Jansen              strain(:,5) = 0.5*(GradV(:,6)+GradV(:,8)) !S23
1746*34e67057SKenneth E. Jansen              strain(:,6) = GradV(:,9)                  !S33
1747*34e67057SKenneth E. Jansen
1748*34e67057SKenneth E. Jansen              vorticity(:,5) = 0.25*( vorticity(:,4)*vorticity(:,4)  !Q
1749*34e67057SKenneth E. Jansen     &                            - 2.0*(      strain(:,1)*strain(:,1)
1750*34e67057SKenneth E. Jansen     &                                    + 2* strain(:,2)*strain(:,2)
1751*34e67057SKenneth E. Jansen     &                                    + 2* strain(:,3)*strain(:,3)
1752*34e67057SKenneth E. Jansen     &                                    +    strain(:,4)*strain(:,4)
1753*34e67057SKenneth E. Jansen     &                                    + 2* strain(:,5)*strain(:,5)
1754*34e67057SKenneth E. Jansen     &                                    +    strain(:,6)*strain(:,6)))
1755*34e67057SKenneth E. Jansen
1756*34e67057SKenneth E. Jansen      return
1757*34e67057SKenneth E. Jansen      end subroutine
1758*34e67057SKenneth E. Jansen
1759*34e67057SKenneth E. Jansen      subroutine dumpTimeSeries()
1760*34e67057SKenneth E. Jansen      use timedata   !allows collection of time series
1761*34e67057SKenneth E. Jansen      include "common.h"
1762*34e67057SKenneth E. Jansen
1763*34e67057SKenneth E. Jansen
1764*34e67057SKenneth E. Jansen                  if (numpe > 1) then
1765*34e67057SKenneth E. Jansen                     do jj = 1, ntspts
1766*34e67057SKenneth E. Jansen                        vartssoln((jj-1)*ndof+1:jj*ndof)=varts(jj,:)
1767*34e67057SKenneth E. Jansen                        ivarts=zero
1768*34e67057SKenneth E. Jansen                     enddo
1769*34e67057SKenneth E. Jansen                     do k=1,ndof*ntspts
1770*34e67057SKenneth E. Jansen                        if(vartssoln(k).ne.zero) ivarts(k)=1
1771*34e67057SKenneth E. Jansen                     enddo
1772*34e67057SKenneth E. Jansen
1773*34e67057SKenneth E. Jansen!                     call MPI_REDUCE(vartssoln, vartssolng, ndof*ntspts,
1774*34e67057SKenneth E. Jansen!     &                    MPI_DOUBLE_PRECISION, MPI_SUM, master,
1775*34e67057SKenneth E. Jansen!     &                    MPI_COMM_WORLD, ierr)
1776*34e67057SKenneth E. Jansen
1777*34e67057SKenneth E. Jansen                     call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1778*34e67057SKenneth E. Jansen                     call MPI_ALLREDUCE(vartssoln, vartssolng,
1779*34e67057SKenneth E. Jansen     &                    ndof*ntspts,
1780*34e67057SKenneth E. Jansen     &                    MPI_DOUBLE_PRECISION, MPI_SUM,
1781*34e67057SKenneth E. Jansen     &                    MPI_COMM_WORLD, ierr)
1782*34e67057SKenneth E. Jansen
1783*34e67057SKenneth E. Jansen!                     call MPI_REDUCE(ivarts, ivartsg, ndof*ntspts,
1784*34e67057SKenneth E. Jansen!     &                    MPI_INTEGER, MPI_SUM, master,
1785*34e67057SKenneth E. Jansen!     &                    MPI_COMM_WORLD, ierr)
1786*34e67057SKenneth E. Jansen
1787*34e67057SKenneth E. Jansen                     call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1788*34e67057SKenneth E. Jansen                     call MPI_ALLREDUCE(ivarts, ivartsg, ndof*ntspts,
1789*34e67057SKenneth E. Jansen     &                    MPI_INTEGER, MPI_SUM,
1790*34e67057SKenneth E. Jansen     &                    MPI_COMM_WORLD, ierr)
1791*34e67057SKenneth E. Jansen
1792*34e67057SKenneth E. Jansen!                     if (myrank.eq.zero) then
1793*34e67057SKenneth E. Jansen                     do jj = 1, ntspts
1794*34e67057SKenneth E. Jansen
1795*34e67057SKenneth E. Jansen                        if(myrank .eq. iv_rank(jj)) then
1796*34e67057SKenneth E. Jansen                           ! No need to update all varts components, only the one treated by the expected rank
1797*34e67057SKenneth E. Jansen                           ! Note: keep varts as a vector, as multiple probes could be treated by one rank
1798*34e67057SKenneth E. Jansen                           indxvarts = (jj-1)*ndof
1799*34e67057SKenneth E. Jansen                           do k=1,ndof
1800*34e67057SKenneth E. Jansen                              if(ivartsg(indxvarts+k).ne.0) then ! none of the vartssoln(parts) were non zero
1801*34e67057SKenneth E. Jansen                                 varts(jj,k)=vartssolng(indxvarts+k)/
1802*34e67057SKenneth E. Jansen     &                                             ivartsg(indxvarts+k)
1803*34e67057SKenneth E. Jansen                              endif
1804*34e67057SKenneth E. Jansen                           enddo
1805*34e67057SKenneth E. Jansen                       endif !only if myrank eq iv_rank(jj)
1806*34e67057SKenneth E. Jansen                     enddo
1807*34e67057SKenneth E. Jansen!                     endif !only on master
1808*34e67057SKenneth E. Jansen                  endif !only if numpe > 1
1809*34e67057SKenneth E. Jansen
1810*34e67057SKenneth E. Jansen!                  if (myrank.eq.zero) then
1811*34e67057SKenneth E. Jansen                  do jj = 1, ntspts
1812*34e67057SKenneth E. Jansen                     if(myrank .eq. iv_rank(jj)) then
1813*34e67057SKenneth E. Jansen                        ifile = 1000+jj
1814*34e67057SKenneth E. Jansen                        write(ifile,555) lstep, (varts(jj,k),k=1,ndof) !Beware of format 555 - check ndof
1815*34e67057SKenneth E. Jansenc                        call flush(ifile)
1816*34e67057SKenneth E. Jansen                        if (((irs .ge. 1) .and.
1817*34e67057SKenneth E. Jansen     &                       (mod(lstep, ntout) .eq. 0))) then
1818*34e67057SKenneth E. Jansen                           close(ifile)
1819*34e67057SKenneth E. Jansen                           fvarts='varts/varts'
1820*34e67057SKenneth E. Jansen                           fvarts=trim(fvarts)//trim(cname2(jj))
1821*34e67057SKenneth E. Jansen                           fvarts=trim(fvarts)//trim(cname2(lskeep))
1822*34e67057SKenneth E. Jansen                           fvarts=trim(fvarts)//'.dat'
1823*34e67057SKenneth E. Jansen                           fvarts=trim(fvarts)
1824*34e67057SKenneth E. Jansen                           open(unit=ifile, file=fvarts,
1825*34e67057SKenneth E. Jansen     &                          position='append')
1826*34e67057SKenneth E. Jansen                        endif !only when dumping restart
1827*34e67057SKenneth E. Jansen                     endif
1828*34e67057SKenneth E. Jansen                  enddo
1829*34e67057SKenneth E. Jansen!                  endif !only on master
1830*34e67057SKenneth E. Jansen
1831*34e67057SKenneth E. Jansen                  varts(:,:) = zero ! reset the array for next step
1832*34e67057SKenneth E. Jansen
1833*34e67057SKenneth E. Jansen
1834*34e67057SKenneth E. Jansen!555              format(i6,5(2x,E12.5e2))
1835*34e67057SKenneth E. Jansen555               format(i6,6(2x,E20.12e2)) !assuming ndof = 6 here
1836*34e67057SKenneth E. Jansen
1837*34e67057SKenneth E. Jansen      return
1838*34e67057SKenneth E. Jansen      end subroutine
1839*34e67057SKenneth E. Jansen
1840*34e67057SKenneth E. Jansen      subroutine collectErrorYbar(ybar,yold,wallssVec,wallssVecBar,
1841*34e67057SKenneth E. Jansen     &               vorticity,yphbar,rerr)
1842*34e67057SKenneth E. Jansen      include "common.h"
1843*34e67057SKenneth E. Jansen      real*8, allocatable, dimension(:,:) :: ybar, yold, vorticity
1844*34e67057SKenneth E. Jansen      real*8, allocatable, dimension(:,:) :: yphbar,wallssVec
1845*34e67057SKenneth E. Jansen      real*8, allocatable, dimension(:,:) :: wallssVecBar,rerr
1846*34e67057SKenneth E. Jansenc$$$c
1847*34e67057SKenneth E. Jansenc$$$c compute average
1848*34e67057SKenneth E. Jansenc$$$c
1849*34e67057SKenneth E. Jansenc$$$               tfact=one/istep
1850*34e67057SKenneth E. Jansenc$$$               ybar =tfact*yold + (one-tfact)*ybar
1851*34e67057SKenneth E. Jansen
1852*34e67057SKenneth E. Jansenc compute average
1853*34e67057SKenneth E. Jansenc ybar(:,1:3) are average velocity components
1854*34e67057SKenneth E. Jansenc ybar(:,4) is average pressure
1855*34e67057SKenneth E. Jansenc ybar(:,5) is average speed
1856*34e67057SKenneth E. Jansenc ybar(:,6:8) is average of sq. of each vel. component
1857*34e67057SKenneth E. Jansenc ybar(:,9) is average of sq. of pressure
1858*34e67057SKenneth E. Jansenc ybar(:,10:12) is average of cross vel. components : uv, uw and vw
1859*34e67057SKenneth E. Jansenc averaging procedure justified only for identical time step sizes
1860*34e67057SKenneth E. Jansenc ybar(:,13) is average of eddy viscosity
1861*34e67057SKenneth E. Jansenc ybar(:,14:16) is average vorticity components
1862*34e67057SKenneth E. Jansenc ybar(:,17) is average vorticity magnitude
1863*34e67057SKenneth E. Jansenc istep is number of time step
1864*34e67057SKenneth E. Jansenc
1865*34e67057SKenneth E. Jansen      icollectybar = 0
1866*34e67057SKenneth E. Jansen      if(nphasesincycle.eq.0 .or.
1867*34e67057SKenneth E. Jansen     &            istep.gt.ncycles_startphaseavg*nstepsincycle) then
1868*34e67057SKenneth E. Jansen               icollectybar = 1
1869*34e67057SKenneth E. Jansen               if((istep-1).eq.ncycles_startphaseavg*nstepsincycle)
1870*34e67057SKenneth E. Jansen     &               istepsinybar = 0 ! init. to zero in first cycle in avg.
1871*34e67057SKenneth E. Jansen               endif
1872*34e67057SKenneth E. Jansen
1873*34e67057SKenneth E. Jansen               if(icollectybar.eq.1) then
1874*34e67057SKenneth E. Jansen                  istepsinybar = istepsinybar+1
1875*34e67057SKenneth E. Jansen                  tfact=one/istepsinybar
1876*34e67057SKenneth E. Jansen
1877*34e67057SKenneth E. Jansen!                  if(myrank.eq.master .and. nphasesincycle.ne.0 .and.
1878*34e67057SKenneth E. Jansen!     &               mod((istep-1),nstepsincycle).eq.0)
1879*34e67057SKenneth E. Jansen!     &               write(*,*)'nsamples in phase average:',istepsinybar
1880*34e67057SKenneth E. Jansen
1881*34e67057SKenneth E. Jansenc ybar to contain the averaged ((u,v,w),p)-fields
1882*34e67057SKenneth E. Jansenc and speed average, i.e., sqrt(u^2+v^2+w^2)
1883*34e67057SKenneth E. Jansenc and avg. of sq. terms including
1884*34e67057SKenneth E. Jansenc u^2, v^2, w^2, p^2 and cross terms of uv, uw and vw
1885*34e67057SKenneth E. Jansen
1886*34e67057SKenneth E. Jansen                  ybar(:,1) = tfact*yold(:,1) + (one-tfact)*ybar(:,1)
1887*34e67057SKenneth E. Jansen                  ybar(:,2) = tfact*yold(:,2) + (one-tfact)*ybar(:,2)
1888*34e67057SKenneth E. Jansen                  ybar(:,3) = tfact*yold(:,3) + (one-tfact)*ybar(:,3)
1889*34e67057SKenneth E. Jansen                  ybar(:,4) = tfact*yold(:,4) + (one-tfact)*ybar(:,4)
1890*34e67057SKenneth E. Jansen                  ybar(:,5) = tfact*sqrt(yold(:,1)**2+yold(:,2)**2+
1891*34e67057SKenneth E. Jansen     &                        yold(:,3)**2) + (one-tfact)*ybar(:,5)
1892*34e67057SKenneth E. Jansen                  ybar(:,6) = tfact*yold(:,1)**2 +
1893*34e67057SKenneth E. Jansen     &                        (one-tfact)*ybar(:,6)
1894*34e67057SKenneth E. Jansen                  ybar(:,7) = tfact*yold(:,2)**2 +
1895*34e67057SKenneth E. Jansen     &                        (one-tfact)*ybar(:,7)
1896*34e67057SKenneth E. Jansen                  ybar(:,8) = tfact*yold(:,3)**2 +
1897*34e67057SKenneth E. Jansen     &                        (one-tfact)*ybar(:,8)
1898*34e67057SKenneth E. Jansen                  ybar(:,9) = tfact*yold(:,4)**2 +
1899*34e67057SKenneth E. Jansen     &                        (one-tfact)*ybar(:,9)
1900*34e67057SKenneth E. Jansen                  ybar(:,10) = tfact*yold(:,1)*yold(:,2) + !uv
1901*34e67057SKenneth E. Jansen     &                         (one-tfact)*ybar(:,10)
1902*34e67057SKenneth E. Jansen                  ybar(:,11) = tfact*yold(:,1)*yold(:,3) + !uw
1903*34e67057SKenneth E. Jansen     &                         (one-tfact)*ybar(:,11)
1904*34e67057SKenneth E. Jansen                  ybar(:,12) = tfact*yold(:,2)*yold(:,3) + !vw
1905*34e67057SKenneth E. Jansen     &                         (one-tfact)*ybar(:,12)
1906*34e67057SKenneth E. Jansen                  if(nsclr.gt.0) !nut
1907*34e67057SKenneth E. Jansen     &             ybar(:,13) = tfact*yold(:,6) + (one-tfact)*ybar(:,13)
1908*34e67057SKenneth E. Jansen
1909*34e67057SKenneth E. Jansen                  if(ivort == 1) then !vorticity
1910*34e67057SKenneth E. Jansen                    ybar(:,14) = tfact*vorticity(:,1) +
1911*34e67057SKenneth E. Jansen     &                           (one-tfact)*ybar(:,14)
1912*34e67057SKenneth E. Jansen                    ybar(:,15) = tfact*vorticity(:,2) +
1913*34e67057SKenneth E. Jansen     &                           (one-tfact)*ybar(:,15)
1914*34e67057SKenneth E. Jansen                    ybar(:,16) = tfact*vorticity(:,3) +
1915*34e67057SKenneth E. Jansen     &                           (one-tfact)*ybar(:,16)
1916*34e67057SKenneth E. Jansen                    ybar(:,17) = tfact*vorticity(:,4) +
1917*34e67057SKenneth E. Jansen     &                           (one-tfact)*ybar(:,17)
1918*34e67057SKenneth E. Jansen                  endif
1919*34e67057SKenneth E. Jansen
1920*34e67057SKenneth E. Jansen                  if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
1921*34e67057SKenneth E. Jansen                    wallssVecBar(:,1) = tfact*wallssVec(:,1)
1922*34e67057SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,1)
1923*34e67057SKenneth E. Jansen                    wallssVecBar(:,2) = tfact*wallssVec(:,2)
1924*34e67057SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,2)
1925*34e67057SKenneth E. Jansen                    wallssVecBar(:,3) = tfact*wallssVec(:,3)
1926*34e67057SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,3)
1927*34e67057SKenneth E. Jansen                  endif
1928*34e67057SKenneth E. Jansen               endif !icollectybar.eq.1
1929*34e67057SKenneth E. Jansenc
1930*34e67057SKenneth E. Jansenc compute phase average
1931*34e67057SKenneth E. Jansenc
1932*34e67057SKenneth E. Jansen               if(nphasesincycle.ne.0 .and.
1933*34e67057SKenneth E. Jansen     &            istep.gt.ncycles_startphaseavg*nstepsincycle) then
1934*34e67057SKenneth E. Jansen
1935*34e67057SKenneth E. Jansenc beginning of cycle is considered as ncycles_startphaseavg*nstepsincycle+1
1936*34e67057SKenneth E. Jansen                  if((istep-1).eq.ncycles_startphaseavg*nstepsincycle)
1937*34e67057SKenneth E. Jansen     &               icyclesinavg = 0 ! init. to zero in first cycle in avg.
1938*34e67057SKenneth E. Jansen
1939*34e67057SKenneth E. Jansen                  ! find number of steps between phases
1940*34e67057SKenneth E. Jansen                  nstepsbtwphase = nstepsincycle/nphasesincycle ! integer value
1941*34e67057SKenneth E. Jansen                  if(mod(istep-1,nstepsincycle).eq.0) then
1942*34e67057SKenneth E. Jansen                     iphase = 1 ! init. to one in beginning of every cycle
1943*34e67057SKenneth E. Jansen                     icyclesinavg = icyclesinavg + 1
1944*34e67057SKenneth E. Jansen                  endif
1945*34e67057SKenneth E. Jansen
1946*34e67057SKenneth E. Jansen                  icollectphase = 0
1947*34e67057SKenneth E. Jansen                  istepincycle = mod(istep,nstepsincycle)
1948*34e67057SKenneth E. Jansen                  if(istepincycle.eq.0) istepincycle=nstepsincycle
1949*34e67057SKenneth E. Jansen                  if(istepincycle.eq.iphase*nstepsbtwphase) then
1950*34e67057SKenneth E. Jansen                     icollectphase = 1
1951*34e67057SKenneth E. Jansen                     iphase = iphase+1 ! use 'iphase-1' below
1952*34e67057SKenneth E. Jansen                  endif
1953*34e67057SKenneth E. Jansen
1954*34e67057SKenneth E. Jansen                  if(icollectphase.eq.1) then
1955*34e67057SKenneth E. Jansen                     tfactphase = one/icyclesinavg
1956*34e67057SKenneth E. Jansen
1957*34e67057SKenneth E. Jansen                     if(myrank.eq.master) then
1958*34e67057SKenneth E. Jansen                       write(*,*) 'nsamples in phase ',iphase-1,': ',
1959*34e67057SKenneth E. Jansen     &                             icyclesinavg
1960*34e67057SKenneth E. Jansen                     endif
1961*34e67057SKenneth E. Jansen
1962*34e67057SKenneth E. Jansen                     yphbar(:,1,iphase-1) = tfactphase*yold(:,1) +
1963*34e67057SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,1,iphase-1)
1964*34e67057SKenneth E. Jansen                     yphbar(:,2,iphase-1) = tfactphase*yold(:,2) +
1965*34e67057SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,2,iphase-1)
1966*34e67057SKenneth E. Jansen                     yphbar(:,3,iphase-1) = tfactphase*yold(:,3) +
1967*34e67057SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,3,iphase-1)
1968*34e67057SKenneth E. Jansen                     yphbar(:,4,iphase-1) = tfactphase*yold(:,4) +
1969*34e67057SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,4,iphase-1)
1970*34e67057SKenneth E. Jansen                     yphbar(:,5,iphase-1) = tfactphase*sqrt(yold(:,1)**2
1971*34e67057SKenneth E. Jansen     &                          +yold(:,2)**2+yold(:,3)**2) +
1972*34e67057SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,5,iphase-1)
1973*34e67057SKenneth E. Jansen                     yphbar(:,6,iphase-1) =
1974*34e67057SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,1)
1975*34e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,6,iphase-1)
1976*34e67057SKenneth E. Jansen
1977*34e67057SKenneth E. Jansen                     yphbar(:,7,iphase-1) =
1978*34e67057SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,2)
1979*34e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,7,iphase-1)
1980*34e67057SKenneth E. Jansen
1981*34e67057SKenneth E. Jansen                     yphbar(:,8,iphase-1) =
1982*34e67057SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,3)
1983*34e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,8,iphase-1)
1984*34e67057SKenneth E. Jansen
1985*34e67057SKenneth E. Jansen                     yphbar(:,9,iphase-1) =
1986*34e67057SKenneth E. Jansen     &                              tfactphase*yold(:,2)*yold(:,2)
1987*34e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,9,iphase-1)
1988*34e67057SKenneth E. Jansen
1989*34e67057SKenneth E. Jansen                     yphbar(:,10,iphase-1) =
1990*34e67057SKenneth E. Jansen     &                              tfactphase*yold(:,2)*yold(:,3)
1991*34e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,10,iphase-1)
1992*34e67057SKenneth E. Jansen
1993*34e67057SKenneth E. Jansen                     yphbar(:,11,iphase-1) =
1994*34e67057SKenneth E. Jansen     &                              tfactphase*yold(:,3)*yold(:,3)
1995*34e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,11,iphase-1)
1996*34e67057SKenneth E. Jansen
1997*34e67057SKenneth E. Jansen                     if(ivort == 1) then
1998*34e67057SKenneth E. Jansen                       yphbar(:,12,iphase-1) =
1999*34e67057SKenneth E. Jansen     &                              tfactphase*vorticity(:,1)
2000*34e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,12,iphase-1)
2001*34e67057SKenneth E. Jansen                       yphbar(:,13,iphase-1) =
2002*34e67057SKenneth E. Jansen     &                              tfactphase*vorticity(:,2)
2003*34e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,13,iphase-1)
2004*34e67057SKenneth E. Jansen                       yphbar(:,14,iphase-1) =
2005*34e67057SKenneth E. Jansen     &                              tfactphase*vorticity(:,3)
2006*34e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,14,iphase-1)
2007*34e67057SKenneth E. Jansen                       yphbar(:,15,iphase-1) =
2008*34e67057SKenneth E. Jansen     &                              tfactphase*vorticity(:,4)
2009*34e67057SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,15,iphase-1)
2010*34e67057SKenneth E. Jansen                    endif
2011*34e67057SKenneth E. Jansen                  endif !compute phase average
2012*34e67057SKenneth E. Jansen      endif !if(nphasesincycle.eq.0 .or. istep.gt.ncycles_startphaseavg*nstepsincycle)
2013*34e67057SKenneth E. Jansenc
2014*34e67057SKenneth E. Jansenc compute rms
2015*34e67057SKenneth E. Jansenc
2016*34e67057SKenneth E. Jansen      if(icollectybar.eq.1) then
2017*34e67057SKenneth E. Jansen                  rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2
2018*34e67057SKenneth E. Jansen                  rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2
2019*34e67057SKenneth E. Jansen                  rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2
2020*34e67057SKenneth E. Jansen                  rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2
2021*34e67057SKenneth E. Jansen      endif
2022*34e67057SKenneth E. Jansen      return
2023*34e67057SKenneth E. Jansen      end subroutine
2024*34e67057SKenneth E. Jansen
2025