xref: /phasta/phSolver/incompressible/itrdrv.f (revision 9071d3bab45df86fa797e42ab42eb06bc57c5455)
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!MR CHANGE
3559599516SKenneth E. Jansen      use turbsa          ! used to access d2wall
3659599516SKenneth E. Jansen!MR CHANGE END
37*9071d3baSCameron 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"
4459599516SKenneth E. Jansenc
4559599516SKenneth E. Jansen
4659599516SKenneth E. Jansen
4759599516SKenneth E. Jansen        real*8    y(nshg,ndof),              ac(nshg,ndof),
4859599516SKenneth E. Jansen     &            yold(nshg,ndof),           acold(nshg,ndof),
4959599516SKenneth E. Jansen     &            u(nshg,nsd),               uold(nshg,nsd),
5059599516SKenneth E. Jansen     &            x(numnp,nsd),              solinc(nshg,ndof),
5159599516SKenneth E. Jansen     &            BC(nshg,ndofBC),           tf(nshg,ndof),
5259599516SKenneth E. Jansen     &            GradV(nshg,nsdsq)
5359599516SKenneth E. Jansen
5459599516SKenneth E. Jansenc
5559599516SKenneth E. Jansen        real*8    res(nshg,ndof)
5659599516SKenneth E. Jansenc
5759599516SKenneth E. Jansen        real*8    shp(MAXTOP,maxsh,MAXQPT),
5859599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
5959599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
6059599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
6159599516SKenneth E. Jansenc
6259599516SKenneth E. Jansen        integer   rowp(nshg,nnz),         colm(nshg+1),
6359599516SKenneth E. Jansen     &            iBC(nshg),
6459599516SKenneth E. Jansen     &            ilwork(nlwork),
6559599516SKenneth E. Jansen     &            iper(nshg),            ifuncs(6)
6659599516SKenneth E. Jansen
6759599516SKenneth E. Jansen        real*8 vbc_prof(nshg,3)
6859599516SKenneth E. Jansen
6959599516SKenneth E. Jansen        integer stopjob
7059599516SKenneth E. Jansen        character*10 cname2
7159599516SKenneth E. Jansen        character*5  cname
7259599516SKenneth E. Jansenc
7359599516SKenneth E. Jansenc  stuff for dynamic model s.w.avg and wall model
7459599516SKenneth E. Jansenc
7559599516SKenneth E. Jansen        dimension ifath(numnp),    velbar(nfath,ndof),  nsons(nfath)
7659599516SKenneth E. Jansen
7759599516SKenneth E. Jansen        dimension wallubar(2),walltot(2)
7859599516SKenneth E. Jansenc
7959599516SKenneth E. Jansenc.... For Farzin's Library
8059599516SKenneth E. Jansenc
8159599516SKenneth E. Jansen        integer eqnType, prjFlag, presPrjFlag, verbose
8259599516SKenneth E. Jansenc
8359599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: aperm,  atemp, atempS
8459599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: apermS
8559599516SKenneth E. Jansen
8659599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: lhsP, lhsK, lhsS
8759599516SKenneth E. Jansen        real*8   almit, alfit, gamit
8859599516SKenneth E. Jansenc
8959599516SKenneth E. Jansen        character*1024    servername
9059599516SKenneth E. Jansen        character*20    fname1,fmt1
9159599516SKenneth E. Jansen        character*20    fname2,fmt2
9259599516SKenneth E. Jansen        character*60    fnamepold, fvarts
9359599516SKenneth E. Jansen        character*4     fname4c ! 4 characters
9459599516SKenneth E. Jansen        integer         iarray(50) ! integers for headers
9559599516SKenneth E. Jansen        integer         isgn(ndof), isgng(ndof)
9659599516SKenneth E. Jansen
9759599516SKenneth E. Jansen!MR CHANGE
9859599516SKenneth E. Jansen!        real*8 rerr(nshg,10), ybar(nshg,13) ! including 7 sq. terms with 3 cross terms of uv, uw and vw
9959599516SKenneth E. Jansen!        real*8 rerr(nshg,10), ybar(nshg,12) ! including 7 sq. terms with 3 cross terms of uv, uw and vw
10059599516SKenneth E. Jansen        real*8 rerr(nshg,10)
10159599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: ybar, strain, vorticity
10259599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: wallssVec, wallssVecbar
10359599516SKenneth E. Jansen!MR CHANGE
10459599516SKenneth E. Jansen
10559599516SKenneth E. Jansen        real*8 tcorecp(2), tcorecpscal(2)
10659599516SKenneth E. Jansen
10759599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: ivarts
10859599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: ivartsg
10959599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: iv_rank
11059599516SKenneth E. Jansen        real*8, allocatable, dimension(:) :: vartssoln
11159599516SKenneth E. Jansen        real*8, allocatable, dimension(:) :: vartssolng
11259599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: yphbar
11359599516SKenneth E. Jansen        real*8 CFLworst(numel)
11459599516SKenneth E. Jansen
11559599516SKenneth E. Jansen!MR CHANGE
11659599516SKenneth E. Jansen        integer :: iv_rankpernode, iv_totnodes, iv_totcores
11759599516SKenneth E. Jansen        integer :: iv_node, iv_core, iv_thread
11859599516SKenneth E. Jansen!MR CHANGE
11959599516SKenneth E. Jansen
12059599516SKenneth E. Jansen        impistat = 0
12159599516SKenneth E. Jansen        impistat2 = 0
12259599516SKenneth E. Jansen        iISend = 0
12359599516SKenneth E. Jansen        iISendScal = 0
12459599516SKenneth E. Jansen        iIRecv = 0
12559599516SKenneth E. Jansen        iIRecvScal = 0
12659599516SKenneth E. Jansen        iWaitAll = 0
12759599516SKenneth E. Jansen        iWaitAllScal = 0
12859599516SKenneth E. Jansen        iAllR = 0
12959599516SKenneth E. Jansen        iAllRScal = 0
13059599516SKenneth E. Jansen        rISend = zero
13159599516SKenneth E. Jansen        rISendScal = zero
13259599516SKenneth E. Jansen        rIRecv = zero
13359599516SKenneth E. Jansen        rIRecvScal = zero
13459599516SKenneth E. Jansen        rWaitAll = zero
13559599516SKenneth E. Jansen        rWaitAllScal = zero
13659599516SKenneth E. Jansen        rAllR = zero
13759599516SKenneth E. Jansen        rAllRScal = zero
13859599516SKenneth E. Jansen        rCommu = zero
13959599516SKenneth E. Jansen        rCommuScal = zero
14059599516SKenneth E. Jansen
14159599516SKenneth E. Jansen        call initmemstat()
14259599516SKenneth E. Jansen
14359599516SKenneth E. Jansenc
14459599516SKenneth E. Jansenc  hack SA variable
14559599516SKenneth E. Jansenc
14659599516SKenneth E. JansencHack        BC(:,7)=BC(:,7)*0.001
14759599516SKenneth E. JansencHack        if(lstep.eq.0) y(:,6)=y(:,6)*0.001
14859599516SKenneth E. Jansen        call SolverLicenseServer(servername)
14959599516SKenneth E. Jansenc
15059599516SKenneth E. Jansenc only master should be verbose
15159599516SKenneth E. Jansenc
15259599516SKenneth E. Jansen
15359599516SKenneth E. Jansen        if(numpe.gt.0 .and. myrank.ne.master)iverbose=0
15459599516SKenneth E. Jansenc
15559599516SKenneth E. Jansen
15659599516SKenneth E. Jansen        lskeep=lstep
15759599516SKenneth E. Jansen
15859599516SKenneth E. Jansen        inquire(file='xyzts.dat',exist=exts)
15959599516SKenneth E. Jansen        if(exts) then
16059599516SKenneth E. Jansen
16159599516SKenneth E. Jansen           open(unit=626,file='xyzts.dat',status='old')
16259599516SKenneth E. Jansen           read(626,*) ntspts, freq, tolpt, iterat, varcod
16359599516SKenneth E. Jansen           call sTD             ! sets data structures
16459599516SKenneth E. Jansen
16559599516SKenneth E. Jansen           do jj=1,ntspts       ! read coordinate data where solution desired
16659599516SKenneth E. Jansen              read(626,*) ptts(jj,1),ptts(jj,2),ptts(jj,3)
16759599516SKenneth E. Jansen           enddo
16859599516SKenneth E. Jansen           close(626)
16959599516SKenneth E. Jansen
17059599516SKenneth E. Jansen           statptts(:,:) = 0
17159599516SKenneth E. Jansen           parptts(:,:) = zero
17259599516SKenneth E. Jansen           varts(:,:) = zero
17359599516SKenneth E. Jansen
17459599516SKenneth E. Jansen           allocate (ivarts(ntspts*ndof))
17559599516SKenneth E. Jansen           allocate (ivartsg(ntspts*ndof))
17659599516SKenneth E. Jansen           allocate (iv_rank(ntspts))
17759599516SKenneth E. Jansen           allocate (vartssoln(ntspts*ndof))
17859599516SKenneth E. Jansen           allocate (vartssolng(ntspts*ndof))
17959599516SKenneth E. Jansen
18059599516SKenneth E. Jansen           iv_rankpernode = iv_rankpercore*iv_corepernode
18159599516SKenneth E. Jansen           iv_totnodes = numpe/iv_rankpernode
18259599516SKenneth E. Jansen           iv_totcores = iv_corepernode*iv_totnodes
18359599516SKenneth E. Jansen           if (myrank .eq. 0) then
18459599516SKenneth E. Jansen             write(*,*) 'Info for probes:'
18559599516SKenneth E. Jansen             write(*,*) '  Ranks per core:',iv_rankpercore
18659599516SKenneth E. Jansen             write(*,*) '  Cores per node:',iv_corepernode
18759599516SKenneth E. Jansen             write(*,*) '  Ranks per node:',iv_rankpernode
18859599516SKenneth E. Jansen             write(*,*) '  Total number of nodes:',iv_totnodes
18959599516SKenneth E. Jansen             write(*,*) '  Total number of cores',iv_totcores
19059599516SKenneth E. Jansen           endif
19159599516SKenneth E. Jansen
19259599516SKenneth E. Jansen!           if (myrank .eq. numpe-1) then
19359599516SKenneth E. Jansen            do jj=1,ntspts
19459599516SKenneth E. Jansen
19559599516SKenneth E. Jansen               ! Compute the adequate rank which will take care of probe jj
19659599516SKenneth E. Jansen               jjm1 = jj-1
19759599516SKenneth E. Jansen               iv_node = (iv_totnodes-1)-mod(jjm1,iv_totnodes)
19859599516SKenneth E. Jansen               iv_core = (iv_corepernode-1) - mod((jjm1 -
19959599516SKenneth E. Jansen     &              mod(jjm1,iv_totnodes))/iv_totnodes,iv_corepernode)
20059599516SKenneth E. Jansen               iv_thread = (iv_rankpercore-1) - mod((jjm1-
20159599516SKenneth E. Jansen     &              (mod(jjm1,iv_totcores)))/iv_totcores,iv_rankpercore)
20259599516SKenneth E. Jansen               iv_rank(jj) = iv_node*iv_rankpernode
20359599516SKenneth E. Jansen     &                     + iv_core*iv_rankpercore
20459599516SKenneth E. Jansen     &                     + iv_thread
20559599516SKenneth E. Jansen
20659599516SKenneth E. Jansen               if(myrank == 0) then
20759599516SKenneth E. Jansen                 write(*,*) '  Probe', jj, 'handled by rank',
20859599516SKenneth E. Jansen     &                         iv_rank(jj), ' on node', iv_node
20959599516SKenneth E. Jansen               endif
21059599516SKenneth E. Jansen
21159599516SKenneth E. Jansen               ! Verification just in case
21259599516SKenneth E. Jansen               if(iv_rank(jj) .lt.0 .or. iv_rank(jj) .ge. numpe) then
21359599516SKenneth E. Jansen                 write(*,*) 'WARNING: iv_rank(',jj,') is ', iv_rank(jj),
21459599516SKenneth E. Jansen     &                      ' and reset to numpe-1'
21559599516SKenneth E. Jansen                 iv_rank(jj) = numpe-1
21659599516SKenneth E. Jansen               endif
21759599516SKenneth E. Jansen
21859599516SKenneth E. Jansen               ! Open the varts files
21959599516SKenneth E. Jansen               if(myrank == iv_rank(jj)) then
22059599516SKenneth E. Jansen                 fvarts='varts/varts'
22159599516SKenneth E. Jansen                 fvarts=trim(fvarts)//trim(cname2(jj))
22259599516SKenneth E. Jansen                 fvarts=trim(fvarts)//trim(cname2(lstep))
22359599516SKenneth E. Jansen                 fvarts=trim(fvarts)//'.dat'
22459599516SKenneth E. Jansen                 fvarts=trim(fvarts)
22559599516SKenneth E. Jansen                 open(unit=1000+jj, file=fvarts, status='unknown')
22659599516SKenneth E. Jansen               endif
22759599516SKenneth E. Jansen            enddo
22859599516SKenneth E. Jansen!           endif
22959599516SKenneth E. Jansen
23059599516SKenneth E. Jansen        endif
23159599516SKenneth E. Jansenc
23259599516SKenneth E. Jansenc.... open history and aerodynamic forces files
23359599516SKenneth E. Jansenc
23459599516SKenneth E. Jansen        if (myrank .eq. master) then
23559599516SKenneth E. Jansen!           open (unit=ihist,  file=fhist,  status='unknown')
23659599516SKenneth E. Jansen           open (unit=iforce, file=fforce, status='unknown')
23759599516SKenneth E. Jansen           open (unit=76, file="fort.76", status='unknown')
23859599516SKenneth E. Jansen           if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then
23959599516SKenneth E. Jansen              fnamepold = 'pold'
24059599516SKenneth E. Jansen              fnamepold = trim(fnamepold)//trim(cname2(lstep))
24159599516SKenneth E. Jansen              fnamepold = trim(fnamepold)//'.dat'
24259599516SKenneth E. Jansen              fnamepold = trim(fnamepold)
24359599516SKenneth E. Jansen              open (unit=8177, file=fnamepold, status='unknown')
24459599516SKenneth E. Jansen           endif
24559599516SKenneth E. Jansen        endif
24659599516SKenneth E. Jansenc
24759599516SKenneth E. Jansenc.... initialize
24859599516SKenneth E. Jansenc
24959599516SKenneth E. Jansen        ifuncs(:)  = 0              ! func. evaluation counter
25059599516SKenneth E. Jansen        istep  = 0
25159599516SKenneth E. Jansen        yold   = y
25259599516SKenneth E. Jansen        acold  = ac
25359599516SKenneth E. Jansen
25459599516SKenneth E. Jansen        rerr = zero
25559599516SKenneth E. Jansen
25659599516SKenneth E. Jansen        if(ierrcalc.eq.1 .or. ioybar.eq.1) then ! we need ybar for error too
25759599516SKenneth E. Jansen          if (ivort == 1) then
25859599516SKenneth E. Jansen            allocate(ybar(nshg,17)) ! more space for vorticity if requested
25959599516SKenneth E. Jansen          else
26059599516SKenneth E. Jansen            allocate(ybar(nshg,13))
26159599516SKenneth E. Jansen          endif
26259599516SKenneth E. Jansen          ybar = zero ! Initialize ybar to zero, which is essential
26359599516SKenneth E. Jansen        endif
26459599516SKenneth E. Jansen
26559599516SKenneth E. Jansen        if(ivort == 1) then
26659599516SKenneth E. Jansen          allocate(strain(nshg,6))
26759599516SKenneth E. Jansen          allocate(vorticity(nshg,5))
26859599516SKenneth E. Jansen        endif
26959599516SKenneth E. Jansen
27059599516SKenneth E. Jansen        if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
27159599516SKenneth E. Jansen          allocate(wallssVec(nshg,3))
27259599516SKenneth E. Jansen          if (ioybar .eq. 1) then
27359599516SKenneth E. Jansen            allocate(wallssVecbar(nshg,3))
27459599516SKenneth E. Jansen            wallssVecbar = zero ! Initialization important if mean wss computed
27559599516SKenneth E. Jansen          endif
27659599516SKenneth E. Jansen        endif
27759599516SKenneth E. Jansen
27859599516SKenneth E. Jansen! both nstepsincycle and nphasesincycle needs to be set
27959599516SKenneth E. Jansen        if(nstepsincycle.eq.0) nphasesincycle = 0
28059599516SKenneth E. Jansen        if(nphasesincycle.ne.0) then
28159599516SKenneth E. Jansen!     &     allocate(yphbar(nshg,5,nphasesincycle))
28259599516SKenneth E. Jansen          if (ivort == 1) then
28359599516SKenneth E. Jansen            allocate(yphbar(nshg,15,nphasesincycle)) ! more space for vorticity
28459599516SKenneth E. Jansen          else
28559599516SKenneth E. Jansen            allocate(yphbar(nshg,11,nphasesincycle))
28659599516SKenneth E. Jansen          endif
28759599516SKenneth E. Jansen          yphbar = zero
28859599516SKenneth E. Jansen        endif
28959599516SKenneth E. Jansen
29059599516SKenneth E. Jansen!MR CHANGE END
29159599516SKenneth E. Jansen
29259599516SKenneth E. Jansen        vbc_prof(:,1:3) = BC(:,3:5)
29359599516SKenneth E. Jansen        if(iramp.eq.1) then
29459599516SKenneth E. Jansen          call BCprofileInit(vbc_prof,x)
29559599516SKenneth E. Jansen        endif
29659599516SKenneth E. Jansen
29759599516SKenneth E. Jansenc
29859599516SKenneth E. Jansenc.... ---------------> initialize Farzin's Library <---------------
29959599516SKenneth E. Jansenc
30059599516SKenneth E. Jansenc.... assign parameter values
30159599516SKenneth E. Jansenc
30259599516SKenneth E. Jansen        do i = 1, 100
30359599516SKenneth E. Jansen           numeqns(i) = i
30459599516SKenneth E. Jansen        enddo
30559599516SKenneth E. Jansen        nKvecs       = Kspace
30659599516SKenneth E. Jansen        prjFlag      = iprjFlag
30759599516SKenneth E. Jansen        presPrjFlag  = ipresPrjFlag
30859599516SKenneth E. Jansen        verbose      = iverbose
30959599516SKenneth E. Jansenc
31059599516SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve
31159599516SKenneth E. Jansenc
31259599516SKenneth E. Jansen      nsolt=mod(impl(1),2)      ! 1 if solving temperature
31359599516SKenneth E. Jansen      nsclrsol=nsolt+nsclr      ! total number of scalars solved At
31459599516SKenneth E. Jansen                                ! some point we probably want to create
31559599516SKenneth E. Jansen                                ! a map, considering stepseq(), to find
31659599516SKenneth E. Jansen                                ! what is actually solved and only
31759599516SKenneth E. Jansen                                ! dimension lhs to the appropriate
31859599516SKenneth E. Jansen                                ! size. (see 1.6.1 and earlier for a
31959599516SKenneth E. Jansen                                ! "failed" attempt at this).
32059599516SKenneth E. Jansen
32159599516SKenneth E. Jansen
32259599516SKenneth E. Jansen      nsolflow=mod(impl(1),100)/10  ! 1 if solving flow
32359599516SKenneth E. Jansen
32459599516SKenneth E. Jansenc
32559599516SKenneth E. Jansenc.... Now, call Farzin's lesNew routine to initialize
32659599516SKenneth E. Jansenc     memory space
32759599516SKenneth E. Jansenc
32859599516SKenneth E. Jansen      call genadj(colm, rowp, icnt )  ! preprocess the adjacency list
32959599516SKenneth E. Jansen
33059599516SKenneth E. Jansen      nnz_tot=icnt ! this is exactly the number of non-zero blocks on
33159599516SKenneth E. Jansen                   ! this proc
33259599516SKenneth E. Jansen
33359599516SKenneth E. Jansen      if (nsolflow.eq.1) then
33459599516SKenneth E. Jansen         lesId   = numeqns(1)
33559599516SKenneth E. Jansen         eqnType = 1
33659599516SKenneth E. Jansen         nDofs   = 4
33759599516SKenneth E. Jansen         call myfLesNew( lesId,   41994,
33859599516SKenneth E. Jansen     &                 eqnType,
33959599516SKenneth E. Jansen     &                 nDofs,          minIters,       maxIters,
34059599516SKenneth E. Jansen     &                 nKvecs,         prjFlag,        nPrjs,
34159599516SKenneth E. Jansen     &                 presPrjFlag,    nPresPrjs,      epstol(1),
34259599516SKenneth E. Jansen     &                 prestol,        verbose,        statsflow,
34359599516SKenneth E. Jansen     &                 nPermDims,      nTmpDims,      servername  )
34459599516SKenneth E. Jansen
34559599516SKenneth E. Jansen         allocate (aperm(nshg,nPermDims))
34659599516SKenneth E. Jansen         allocate (atemp(nshg,nTmpDims))
34759599516SKenneth E. Jansen         allocate (lhsP(4,nnz_tot))
34859599516SKenneth E. Jansen         allocate (lhsK(9,nnz_tot))
34959599516SKenneth E. Jansen
35059599516SKenneth E. Jansen         call readLesRestart( lesId,  aperm, nshg, myrank, lstep,
35159599516SKenneth E. Jansen     &                        nPermDims )
35259599516SKenneth E. Jansen
35359599516SKenneth E. Jansen      else
35459599516SKenneth E. Jansen         nPermDims = 0
35559599516SKenneth E. Jansen         nTempDims = 0
35659599516SKenneth E. Jansen      endif
35759599516SKenneth E. Jansen
35859599516SKenneth E. Jansen
35959599516SKenneth E. Jansen      if(nsclrsol.gt.0) then
36059599516SKenneth E. Jansen       do isolsc=1,nsclrsol
36159599516SKenneth E. Jansen         lesId       = numeqns(isolsc+1)
36259599516SKenneth E. Jansen         eqnType     = 2
36359599516SKenneth E. Jansen         nDofs       = 1
36459599516SKenneth E. Jansen         presPrjflag = 0
36559599516SKenneth E. Jansen         nPresPrjs   = 0
36659599516SKenneth E. Jansen         prjFlag     = 1
36759599516SKenneth E. Jansen         indx=isolsc+2-nsolt ! complicated to keep epstol(2) for
36859599516SKenneth E. Jansen                             ! temperature followed by scalars
36959599516SKenneth E. Jansen         call myfLesNew( lesId,            41994,
37059599516SKenneth E. Jansen     &                 eqnType,
37159599516SKenneth E. Jansen     &                 nDofs,          minIters,       maxIters,
37259599516SKenneth E. Jansen     &                 nKvecs,         prjFlag,        nPrjs,
37359599516SKenneth E. Jansen     &                 presPrjFlag,    nPresPrjs,      epstol(indx),
37459599516SKenneth E. Jansen     &                 prestol,        verbose,        statssclr,
37559599516SKenneth E. Jansen     &                 nPermDimsS,     nTmpDimsS,   servername )
37659599516SKenneth E. Jansen       enddo
37759599516SKenneth E. Jansenc
37859599516SKenneth E. Jansenc  Assume all scalars have the same size needs
37959599516SKenneth E. Jansenc
38059599516SKenneth E. Jansen       allocate (apermS(nshg,nPermDimsS,nsclrsol))
38159599516SKenneth E. Jansen       allocate (atempS(nshg,nTmpDimsS))  !they can all share this
38259599516SKenneth E. Jansen       allocate (lhsS(nnz_tot,nsclrsol))
38359599516SKenneth E. Jansenc
38459599516SKenneth E. Jansenc actually they could even share with atemp but leave that for later
38559599516SKenneth E. Jansenc
38659599516SKenneth E. Jansen      else
38759599516SKenneth E. Jansen         nPermDimsS = 0
38859599516SKenneth E. Jansen         nTmpDimsS  = 0
38959599516SKenneth E. Jansen      endif
39059599516SKenneth E. Jansenc
39159599516SKenneth E. Jansenc...  prepare lumped mass if needed
39259599516SKenneth E. Jansenc
39359599516SKenneth E. Jansen      if((flmpr.ne.0).or.(flmpl.ne.0)) call genlmass(x, shp,shgl)
39459599516SKenneth E. Jansenc
39559599516SKenneth E. Jansenc.... -----------------> End of initialization <-----------------
39659599516SKenneth E. Jansenc
39759599516SKenneth E. Jansenc.....open the necessary files to gather time series
39859599516SKenneth E. Jansenc
39959599516SKenneth E. Jansen      lstep0 = lstep+1
40059599516SKenneth E. Jansen      nsteprcr = nstep(1)+lstep
40159599516SKenneth E. Jansenc
40259599516SKenneth E. Jansenc.... loop through the time sequences
40359599516SKenneth E. Jansenc
40459599516SKenneth E. Jansen
40559599516SKenneth E. Jansen
40659599516SKenneth E. Jansen      do 3000 itsq = 1, ntseq
40759599516SKenneth E. Jansen         itseq = itsq
40859599516SKenneth E. Jansen
40959599516SKenneth E. JansenCAD         tcorecp1 = second(0)
41059599516SKenneth E. JansenCAD         tcorewc1 = second(-1)
41159599516SKenneth E. Jansenc
41259599516SKenneth E. Jansenc.... set up the time integration parameters
41359599516SKenneth E. Jansenc
41459599516SKenneth E. Jansen         nstp   = nstep(itseq)
41559599516SKenneth E. Jansen         nitr   = niter(itseq)
41659599516SKenneth E. Jansen         LCtime = loctim(itseq)
41759599516SKenneth E. Jansen         dtol(:)= deltol(itseq,:)
41859599516SKenneth E. Jansen
41959599516SKenneth E. Jansen         call itrSetup ( y, acold )
42059599516SKenneth E. Jansenc
42159599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution,
42259599516SKenneth E. Jansenc   which are functions of alphaf so need to do it after itrSetup
42359599516SKenneth E. Jansen         if(numImpSrfs.gt.zero) then
42459599516SKenneth E. Jansen            call calcImpConvCoef (numImpSrfs, ntimeptpT)
42559599516SKenneth E. Jansen         endif
42659599516SKenneth E. Jansenc
42759599516SKenneth E. Jansenc...initialize the initial condition P(0)-RQ(0)-Pd(0) for RCR BC
42859599516SKenneth E. Jansenc   need ndsurf so should be after initNABI
42959599516SKenneth E. Jansen         if(numRCRSrfs.gt.zero) then
43059599516SKenneth E. Jansen            call calcRCRic(y,nsrflistRCR,numRCRSrfs)
43159599516SKenneth E. Jansen         endif
43259599516SKenneth E. Jansenc
43359599516SKenneth E. Jansenc  find the last solve of the flow in the step sequence so that we will
43459599516SKenneth E. Jansenc         know when we are at/near end of step
43559599516SKenneth E. Jansenc
43659599516SKenneth E. Jansenc         ilast=0
43759599516SKenneth E. Jansen         nitr=0  ! count number of flow solves in a step (# of iterations)
43859599516SKenneth E. Jansen         do i=1,seqsize
43959599516SKenneth E. Jansen            if(stepseq(i).eq.0) nitr=nitr+1
44059599516SKenneth E. Jansen         enddo
44159599516SKenneth E. Jansen
44259599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
44359599516SKenneth E. Jansen         tcorecp(:) = zero ! used in solfar.f (solflow)
44459599516SKenneth E. Jansen         tcorecpscal(:) = zero ! used in solfar.f (solflow)
44559599516SKenneth E. Jansen         if(myrank.eq.0)  then
44659599516SKenneth E. Jansen            tcorecp1 = TMRC()
44759599516SKenneth E. Jansen         endif
44859599516SKenneth E. Jansen
44959599516SKenneth E. Jansenc
45059599516SKenneth E. Jansenc.... loop through the time steps
45159599516SKenneth E. Jansenc
45259599516SKenneth E. Jansen         istop=0
45359599516SKenneth E. Jansen         rmub=datmat(1,2,1)
45459599516SKenneth E. Jansen         if(rmutarget.gt.0) then
45559599516SKenneth E. Jansen            rmue=rmutarget
45659599516SKenneth E. Jansen         else
45759599516SKenneth E. Jansen            rmue=datmat(1,2,1) ! keep constant
45859599516SKenneth E. Jansen         endif
45959599516SKenneth E. Jansen
46059599516SKenneth E. Jansen        if(iramp.eq.1) then
46159599516SKenneth E. Jansen            call BCprofileScale(vbc_prof,BC,yold) ! fix the yold values to the reset BC
46259599516SKenneth E. Jansen            isclr=1 ! fix scalar
46359599516SKenneth E. Jansen            do isclr=1,nsclr
46459599516SKenneth E. Jansen               call itrBCSclr(yold,ac,iBC,BC,iper,ilwork)
46559599516SKenneth E. Jansen            enddo
46659599516SKenneth E. Jansen        endif
46759599516SKenneth E. Jansen
46859599516SKenneth E. Jansen!MR CHANGE
46959599516SKenneth E. Jansen!        do irank=0,numpe-1
47059599516SKenneth E. Jansen!          if(irank==myrank) then
47159599516SKenneth E. Jansen!             write(*,*) 'NUMTASK - rank,numtask: ',myrank,ilwork(1)
47259599516SKenneth E. Jansen!          endif
47359599516SKenneth E. Jansen!          call MPI_Barrier(MPI_COMM_WORLD,ierr)
47459599516SKenneth E. Jansen!        enddo
47559599516SKenneth E. Jansen!MR CHANGE END
47659599516SKenneth E. Jansen
47759599516SKenneth E. Jansen         do 2000 istp = 1, nstp
47859599516SKenneth E. Jansen           if(iramp.eq.1)
47959599516SKenneth E. Jansen     &        call BCprofileScale(vbc_prof,BC,yold)
48059599516SKenneth E. Jansen
48159599516SKenneth E. Jansen           call rerun_check(stopjob)
48259599516SKenneth E. Jansen           if(stopjob.ne.0) goto 2001
48359599516SKenneth E. Jansen
48459599516SKenneth E. Jansen            xi=istp*1.0/nstp
48559599516SKenneth E. Jansen            datmat(1,2,1)=rmub*(1.0-xi)+xi*rmue
48659599516SKenneth E. Jansenc            write(*,*) "current mol. visc = ", datmat(1,2,1)
48759599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC.
48859599516SKenneth E. Jansenc     these will be for time step n+1 so use lstep+1
48959599516SKenneth E. Jansenc
49059599516SKenneth E. Jansen            if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl,
49159599516SKenneth E. Jansen     &                               shpb, shglb, x, BC, iBC)
49259599516SKenneth E. Jansen
49359599516SKenneth E. Jansenc
49459599516SKenneth E. Jansenc ... calculate the pressure contribution that depends on the history for the Imp. BC
49559599516SKenneth E. Jansenc
49659599516SKenneth E. Jansen            if(numImpSrfs.gt.0) then
49759599516SKenneth E. Jansen               call pHist(poldImp,QHistImp,ImpConvCoef,
49859599516SKenneth E. Jansen     &                    ntimeptpT,numImpSrfs)
49959599516SKenneth E. Jansen               if (myrank.eq.master)
50059599516SKenneth E. Jansen     &             write(8177,*) (poldImp(n), n=1,numImpSrfs)
50159599516SKenneth E. Jansen            endif
50259599516SKenneth E. Jansenc
50359599516SKenneth E. Jansenc ... calc the pressure contribution that depends on the history for the RCR BC
50459599516SKenneth E. Jansenc
50559599516SKenneth E. Jansen            if(numRCRSrfs.gt.0) then
50659599516SKenneth E. Jansen               call CalcHopRCR (Delt(itseq), lstep, numRCRSrfs)
50759599516SKenneth E. Jansen               call CalcRCRConvCoef(lstep,numRCRSrfs)
50859599516SKenneth E. Jansen               call pHist(poldRCR,QHistRCR,RCRConvCoef,nsteprcr,
50959599516SKenneth E. Jansen     &              numRCRSrfs)
51059599516SKenneth E. Jansen               if (myrank.eq.master)
51159599516SKenneth E. Jansen     &             write(8177,*) (poldRCR(n), n=1,numRCRSrfs)
51259599516SKenneth E. Jansen            endif
51359599516SKenneth E. Jansenc
51459599516SKenneth E. Jansenc Decay of scalars
51559599516SKenneth E. Jansenc
51659599516SKenneth E. Jansen           if(nsclr.gt.0 .and. tdecay.ne.1) then
51759599516SKenneth E. Jansen              yold(:,6:ndof)=y(:,6:ndof)*tdecay
51859599516SKenneth E. Jansen              BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*tdecay
51959599516SKenneth E. Jansen           endif
52059599516SKenneth E. Jansen
52159599516SKenneth E. Jansen           if(nosource.eq.1) BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*0.8
52259599516SKenneth E. Jansen
52359599516SKenneth E. Jansen
52459599516SKenneth E. Jansen            if(iLES.gt.0) then  !complicated stuff has moved to
52559599516SKenneth E. Jansen                                        !routine below
52659599516SKenneth E. Jansen               call lesmodels(yold,  acold,     shgl,      shp,
52759599516SKenneth E. Jansen     &                        iper,  ilwork,    rowp,      colm,
52859599516SKenneth E. Jansen     &                        nsons, ifath,     x,
52959599516SKenneth E. Jansen     &                        iBC,   BC)
53059599516SKenneth E. Jansen
53159599516SKenneth E. Jansen
53259599516SKenneth E. Jansen            endif
53359599516SKenneth E. Jansen
53459599516SKenneth E. Jansenc.... set traction BCs for modeled walls
53559599516SKenneth E. Jansenc
53659599516SKenneth E. Jansen            if (itwmod.ne.0) then
53759599516SKenneth E. Jansen               call asbwmod(yold,   acold,   x,      BC,     iBC,
53859599516SKenneth E. Jansen     &                      iper,   ilwork,  ifath,  velbar)
53959599516SKenneth E. Jansen            endif
54059599516SKenneth E. Jansen
54159599516SKenneth E. Jansen!MR CHANGE
54259599516SKenneth E. Jansenc
54359599516SKenneth E. Jansenc.... Determine whether the vorticity field needs to be computed for this time step or not
54459599516SKenneth E. Jansenc
54559599516SKenneth E. Jansen            icomputevort = 0
54659599516SKenneth E. Jansen            if (ivort == 1) then ! Print vorticity = True in solver.inp
54759599516SKenneth E. Jansen              ! We then compute the vorticity only if we
54859599516SKenneth E. Jansen              ! 1) we write an intermediate checkpoint
54959599516SKenneth E. Jansen              ! 2) we reach the last time step and write the last checkpoint
55059599516SKenneth E. Jansen              ! 3) we accumulate statistics in ybar for every time step
55159599516SKenneth E. Jansen              ! BEWARE: we need here lstep+1 and istep+1 because the lstep and
55259599516SKenneth E. Jansen              ! istep gets incremened after the flowsolve, further below
55359599516SKenneth E. Jansen              if (((irs .ge. 1) .and. (mod(lstep+1, ntout) .eq. 0)) .or.
55459599516SKenneth E. Jansen     &                   istep+1.eq.nstep(itseq) .or. ioybar == 1) then
55559599516SKenneth E. Jansen                icomputevort = 1
55659599516SKenneth E. Jansen              endif
55759599516SKenneth E. Jansen            endif
55859599516SKenneth E. Jansen
55959599516SKenneth E. Jansen!            write(*,*) 'icomputevort: ',icomputevort, ' - istep: ',
56059599516SKenneth E. Jansen!     &                istep,' - nstep(itseq):',nstep(itseq),'- lstep:',
56159599516SKenneth E. Jansen!     &                lstep, '- ntout:', ntout
56259599516SKenneth E. Jansen!MR CHANGE
56359599516SKenneth E. Jansen
56459599516SKenneth E. Jansenc
56559599516SKenneth E. Jansenc.... -----------------------> predictor phase <-----------------------
56659599516SKenneth E. Jansenc
56759599516SKenneth E. Jansen            call itrPredict(yold, y,   acold,  ac ,  uold,  u, iBC)
56859599516SKenneth E. Jansen            call itrBC (y,  ac,  iBC,  BC,  iper,ilwork)
56959599516SKenneth E. Jansen
57059599516SKenneth E. Jansen            if(nsolt.eq.1) then
57159599516SKenneth E. Jansen               isclr=0
57259599516SKenneth E. Jansen               call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
57359599516SKenneth E. Jansen            endif
57459599516SKenneth E. Jansen            do isclr=1,nsclr
57559599516SKenneth E. Jansen               call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
57659599516SKenneth E. Jansen            enddo
57759599516SKenneth E. Jansen            iter=0
57859599516SKenneth E. Jansen            ilss=0  ! this is a switch thrown on first solve of LS redistance
57959599516SKenneth E. Jansen            do istepc=1,seqsize
58059599516SKenneth E. Jansen               icode=stepseq(istepc)
58159599516SKenneth E. Jansen               if(mod(icode,5).eq.0) then ! this is a solve
58259599516SKenneth E. Jansen                  isolve=icode/10
58359599516SKenneth E. Jansen                  if(icode.eq.0) then ! flow solve (encoded as 0)
58459599516SKenneth E. Jansenc
58559599516SKenneth E. Jansen                     iter   = iter+1
58659599516SKenneth E. Jansen                     ifuncs(1)  = ifuncs(1) + 1
58759599516SKenneth E. Jansenc
58859599516SKenneth E. Jansen                     Force(1) = zero
58959599516SKenneth E. Jansen                     Force(2) = zero
59059599516SKenneth E. Jansen                     Force(3) = zero
59159599516SKenneth E. Jansen                     HFlux    = zero
59259599516SKenneth E. Jansen                     lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
59359599516SKenneth E. Jansen
59459599516SKenneth E. Jansen                     call SolFlow(y,          ac,        u,
59559599516SKenneth E. Jansen     &                         yold,          acold,     uold,
59659599516SKenneth E. Jansen     &                         x,             iBC,
59759599516SKenneth E. Jansen     &                         BC,            res,
59859599516SKenneth E. Jansen     &                         nPermDims,     nTmpDims,  aperm,
59959599516SKenneth E. Jansen     &                         atemp,         iper,
60059599516SKenneth E. Jansen     &                         ilwork,        shp,       shgl,
60159599516SKenneth E. Jansen     &                         shpb,          shglb,     rowp,
60259599516SKenneth E. Jansen     &                         colm,          lhsK,      lhsP,
60359599516SKenneth E. Jansen     &                         solinc,        rerr,      tcorecp,
60459599516SKenneth E. Jansen     &                         GradV)
60559599516SKenneth E. Jansen
60659599516SKenneth E. Jansen                  else          ! scalar type solve
60759599516SKenneth E. Jansen                     if (icode.eq.5) then ! Solve for Temperature
60859599516SKenneth E. Jansen                                ! (encoded as (nsclr+1)*10)
60959599516SKenneth E. Jansen                        isclr=0
61059599516SKenneth E. Jansen                        ifuncs(2)  = ifuncs(2) + 1
61159599516SKenneth E. Jansen                        j=1
61259599516SKenneth E. Jansen                     else       ! solve a scalar  (encoded at isclr*10)
61359599516SKenneth E. Jansen                        isclr=isolve
61459599516SKenneth E. Jansen                        ifuncs(isclr+2)  = ifuncs(isclr+2) + 1
61559599516SKenneth E. Jansen                        j=isclr+nsolt
61659599516SKenneth E. Jansen                        if((iLSet.eq.2).and.(ilss.eq.0)
61759599516SKenneth E. Jansen     &                       .and.(isclr.eq.2)) then
61859599516SKenneth E. Jansen                           ilss=1 ! throw switch (once per step)
61959599516SKenneth E. Jansen                           y(:,7)=y(:,6) ! redistance field initialized
62059599516SKenneth E. Jansen                           ac(:,7)   = zero
62159599516SKenneth E. Jansen                           call itrBCSclr (  y,  ac,  iBC,  BC, iper,
62259599516SKenneth E. Jansen     &                          ilwork)
62359599516SKenneth E. Jansenc
62459599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the
62559599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar
62659599516SKenneth E. Jansenc
62759599516SKenneth E. Jansen                           alfit=alfi
62859599516SKenneth E. Jansen                           gamit=gami
62959599516SKenneth E. Jansen                           almit=almi
63059599516SKenneth E. Jansen                           Deltt=Delt(1)
63159599516SKenneth E. Jansen                           Dtglt=Dtgl
63259599516SKenneth E. Jansen                           alfi = 1
63359599516SKenneth E. Jansen                           gami = 1
63459599516SKenneth E. Jansen                           almi = 1
63559599516SKenneth E. Jansenc     Delt(1)= Deltt ! Give a pseudo time step
63659599516SKenneth E. Jansen                           Dtgl = one / Delt(1)
63759599516SKenneth E. Jansen                        endif  ! level set eq. 2
63859599516SKenneth E. Jansen                     endif ! deciding between temperature and scalar
63959599516SKenneth E. Jansen
64059599516SKenneth E. Jansen                     lhs = 1 - min(1,mod(ifuncs(isclr+2)-1,
64159599516SKenneth E. Jansen     &                                   LHSupd(isclr+2)))
64259599516SKenneth E. Jansen
64359599516SKenneth E. Jansen                     call SolSclr(y,          ac,        u,
64459599516SKenneth E. Jansen     &                         yold,          acold,     uold,
64559599516SKenneth E. Jansen     &                         x,             iBC,
64659599516SKenneth E. Jansen     &                         BC,            nPermDimsS,nTmpDimsS,
64759599516SKenneth E. Jansen     &                         apermS(1,1,j), atempS,    iper,
64859599516SKenneth E. Jansen     &                         ilwork,        shp,       shgl,
64959599516SKenneth E. Jansen     &                         shpb,          shglb,     rowp,
65059599516SKenneth E. Jansen     &                         colm,          lhsS(1,j),
65159599516SKenneth E. Jansen     &                         solinc(1,isclr+5), tcorecpscal)
65259599516SKenneth E. Jansen
65359599516SKenneth E. Jansen
65459599516SKenneth E. Jansen                  endif         ! end of scalar type solve
65559599516SKenneth E. Jansen
65659599516SKenneth E. Jansen               else ! this is an update  (mod did not equal zero)
65759599516SKenneth E. Jansen                  iupdate=icode/10  ! what to update
65859599516SKenneth E. Jansen                  if(icode.eq.1) then !update flow
65959599516SKenneth E. Jansen                     call itrCorrect ( y,    ac,    u,   solinc, iBC)
66059599516SKenneth E. Jansen                     call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
66159599516SKenneth E. Jansen                  else  ! update scalar
66259599516SKenneth E. Jansen                     isclr=iupdate  !unless
66359599516SKenneth E. Jansen                     if(icode.eq.6) isclr=0
66459599516SKenneth E. Jansen                     if(iRANS.lt.-100)then  ! RANS
66559599516SKenneth E. Jansen                        call itrCorrectSclrPos(y,ac,solinc(1,isclr+5))
66659599516SKenneth E. Jansen                     else
66759599516SKenneth E. Jansen                        call itrCorrectSclr (y, ac, solinc(1,isclr+5))
66859599516SKenneth E. Jansen                     endif
66959599516SKenneth E. Jansen                     if (ilset.eq.2 .and. isclr.eq.2)  then
67059599516SKenneth E. Jansen                        if (ivconstraint .eq. 1) then
67159599516SKenneth E. Jansen                           call itrBCSclr (  y,  ac,  iBC,  BC, iper,
67259599516SKenneth E. Jansen     &                          ilwork)
67359599516SKenneth E. Jansenc
67459599516SKenneth E. Jansenc ... applying the volume constraint on second level set scalar
67559599516SKenneth E. Jansenc
67659599516SKenneth E. Jansen                           call solvecon (y,    x,      iBC,  BC,
67759599516SKenneth E. Jansen     &                          iper, ilwork, shp,  shgl)
67859599516SKenneth E. Jansenc
67959599516SKenneth E. Jansen                        endif   ! end of volume constraint calculations
68059599516SKenneth E. Jansen                     endif      ! end of redistance calculations
68159599516SKenneth E. Jansenc
68259599516SKenneth E. Jansen                        call itrBCSclr (  y,  ac,  iBC,  BC, iper,
68359599516SKenneth E. Jansen     &                       ilwork)
68459599516SKenneth E. Jansen                     endif      ! end of flow or scalar update
68559599516SKenneth E. Jansen                  endif         ! end of switch between solve or update
68659599516SKenneth E. Jansen               enddo            ! loop over sequence in step
68759599516SKenneth E. Jansenc
68859599516SKenneth E. Jansenc
68959599516SKenneth E. Jansenc.... obtain the time average statistics
69059599516SKenneth E. Jansenc
69159599516SKenneth E. Jansen            if (ioform .eq. 2) then
69259599516SKenneth E. Jansen
69359599516SKenneth E. Jansen               call stsGetStats( y,      yold,     ac,     acold,
69459599516SKenneth E. Jansen     &                           u,      uold,     x,
69559599516SKenneth E. Jansen     &                           shp,    shgl,     shpb,   shglb,
69659599516SKenneth E. Jansen     &                           iBC,    BC,       iper,   ilwork,
69759599516SKenneth E. Jansen     &                           rowp,   colm,     lhsK,   lhsP )
69859599516SKenneth E. Jansen            endif
69959599516SKenneth E. Jansen
70059599516SKenneth E. Jansenc
70159599516SKenneth E. Jansenc  Find the solution at the end of the timestep and move it to old
70259599516SKenneth E. Jansenc
70359599516SKenneth E. Jansenc
70459599516SKenneth E. Jansenc ...First to reassign the parameters for the original time integrator scheme
70559599516SKenneth E. Jansenc
70659599516SKenneth E. Jansen            if((iLSet.eq.2).and.(ilss.eq.1)) then
70759599516SKenneth E. Jansen               alfi =alfit
70859599516SKenneth E. Jansen               gami =gamit
70959599516SKenneth E. Jansen               almi =almit
71059599516SKenneth E. Jansen               Delt(1)=Deltt
71159599516SKenneth E. Jansen               Dtgl =Dtglt
71259599516SKenneth E. Jansen            endif
71359599516SKenneth E. Jansen            call itrUpdate( yold,  acold,   uold,  y,    ac,   u)
71459599516SKenneth E. Jansen            call itrBC (yold, acold,  iBC,  BC,  iper,ilwork)
71559599516SKenneth E. Jansen
71659599516SKenneth E. Jansen            istep = istep + 1
71759599516SKenneth E. Jansen            lstep = lstep + 1
71859599516SKenneth E. Jansenc
71959599516SKenneth E. Jansenc ..  Print memory consumption on BGQ
72059599516SKenneth E. Jansenc
72159599516SKenneth E. Jansen            call printmeminfo("itrdrv"//char(0))
72259599516SKenneth E. Jansen
72359599516SKenneth E. Jansenc
72459599516SKenneth E. Jansenc ..  Compute vorticity
72559599516SKenneth E. Jansenc
72659599516SKenneth E. Jansen            if ( icomputevort == 1) then
72759599516SKenneth E. Jansen
72859599516SKenneth E. Jansen              ! vorticity components and magnitude
72959599516SKenneth E. Jansen              vorticity(:,1) = GradV(:,8)-GradV(:,6) !omega_x
73059599516SKenneth E. Jansen              vorticity(:,2) = GradV(:,3)-GradV(:,7) !omega_y
73159599516SKenneth E. Jansen              vorticity(:,3) = GradV(:,4)-GradV(:,2) !omega_z
73259599516SKenneth E. Jansen              vorticity(:,4) = sqrt(   vorticity(:,1)*vorticity(:,1)
73359599516SKenneth E. Jansen     &                               + vorticity(:,2)*vorticity(:,2)
73459599516SKenneth E. Jansen     &                               + vorticity(:,3)*vorticity(:,3) )
73559599516SKenneth E. Jansen              ! Q
73659599516SKenneth E. Jansen              strain(:,1) = GradV(:,1)                  !S11
73759599516SKenneth E. Jansen              strain(:,2) = 0.5*(GradV(:,2)+GradV(:,4)) !S12
73859599516SKenneth E. Jansen              strain(:,3) = 0.5*(GradV(:,3)+GradV(:,7)) !S13
73959599516SKenneth E. Jansen              strain(:,4) = GradV(:,5)                  !S22
74059599516SKenneth E. Jansen              strain(:,5) = 0.5*(GradV(:,6)+GradV(:,8)) !S23
74159599516SKenneth E. Jansen              strain(:,6) = GradV(:,9)                  !S33
74259599516SKenneth E. Jansen
74359599516SKenneth E. Jansen              vorticity(:,5) = 0.25*( vorticity(:,4)*vorticity(:,4)  !Q
74459599516SKenneth E. Jansen     &                            - 2.0*(      strain(:,1)*strain(:,1)
74559599516SKenneth E. Jansen     &                                    + 2* strain(:,2)*strain(:,2)
74659599516SKenneth E. Jansen     &                                    + 2* strain(:,3)*strain(:,3)
74759599516SKenneth E. Jansen     &                                    +    strain(:,4)*strain(:,4)
74859599516SKenneth E. Jansen     &                                    + 2* strain(:,5)*strain(:,5)
74959599516SKenneth E. Jansen     &                                    +    strain(:,6)*strain(:,6)))
75059599516SKenneth E. Jansen
75159599516SKenneth E. Jansen            endif
75259599516SKenneth E. Jansen
75359599516SKenneth E. Jansenc
75459599516SKenneth E. Jansenc .. write out the solution
75559599516SKenneth E. Jansenc
75659599516SKenneth E. Jansen!MR CHANGE
75759599516SKenneth E. Jansen
75859599516SKenneth E. Jansen!             if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or.
75959599516SKenneth E. Jansen!      &          lstep.eq.nstep(itseq)) then
76059599516SKenneth E. Jansen            if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or.
76159599516SKenneth E. Jansen     &          istep.eq.nstep(itseq)) then
76259599516SKenneth E. Jansen!MR CHANGE END
76359599516SKenneth E. Jansen
76459599516SKenneth E. Jansen!              Call to restar() will open restart file in write mode (and not append mode)
76559599516SKenneth E. Jansen!              that is needed as other fields are written in append mode
76659599516SKenneth E. Jansen               call restar ('out ',  yold  ,ac)
76759599516SKenneth E. Jansen               if(ideformwall == 1) then
76859599516SKenneth E. Jansen                  call write_displ(myrank, lstep, nshg, 3, uold )
76959599516SKenneth E. Jansen               endif
77059599516SKenneth E. Jansen
77159599516SKenneth E. Jansen               if(ivort == 1) then
77259599516SKenneth E. Jansen                 call write_field(myrank,'a','vorticity',9,vorticity,
77359599516SKenneth E. Jansen     &                       'd',nshg,5,lstep)
77459599516SKenneth E. Jansen               endif
77559599516SKenneth E. Jansen!MR CHANGE
77659599516SKenneth E. Jansen!               if(ioybar.eq.1) then
77759599516SKenneth E. Jansen!                 call write_field(myrank,'a','ybar',4,
77859599516SKenneth E. Jansen!     &                    ybar,'d',nshg,13,lstep)
77959599516SKenneth E. Jansen!                 call write_field(myrank,'a','ybar',4,
78059599516SKenneth E. Jansen!     &                    ybar,'d',nshg,12,lstep)
78159599516SKenneth E. Jansen!               endif
78259599516SKenneth E. Jansen
78359599516SKenneth E. Jansen               call printmeminfo("itrdrv after checkpoint"//char(0))
78459599516SKenneth E. Jansen!MR CHANGE END
78559599516SKenneth E. Jansen
78659599516SKenneth E. Jansen            endif
78759599516SKenneth E. Jansen
78859599516SKenneth E. Jansenc
78959599516SKenneth E. Jansenc ... update the flow history for the impedance convolution, filter it and write it out
79059599516SKenneth E. Jansenc
79159599516SKenneth E. Jansen            if(numImpSrfs.gt.zero) then
79259599516SKenneth E. Jansen               call UpdHistConv(y,nsrflistImp,numImpSrfs) !uses Delt(1)
79359599516SKenneth E. Jansen            endif
79459599516SKenneth E. Jansen
79559599516SKenneth E. Jansenc
79659599516SKenneth E. Jansenc ... update the flow history for the RCR convolution
79759599516SKenneth E. Jansenc
79859599516SKenneth E. Jansen            if(numRCRSrfs.gt.zero) then
79959599516SKenneth E. Jansen               call UpdHistConv(y,nsrflistRCR,numRCRSrfs) !uses lstep
80059599516SKenneth E. Jansen            endif
80159599516SKenneth E. Jansen
80259599516SKenneth E. Jansenc
80359599516SKenneth E. Jansenc.... compute the consistent boundary flux
80459599516SKenneth E. Jansenc
80559599516SKenneth E. Jansen            if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
80659599516SKenneth E. Jansen               call Bflux ( yold,      acold,      uold,    x,
80759599516SKenneth E. Jansen     &                      shp,       shgl,       shpb,
80859599516SKenneth E. Jansen     &                      shglb,     ilwork,     iBC,
80959599516SKenneth E. Jansen     &                      BC,        iper,       wallssVec)
81059599516SKenneth E. Jansen            endif
81159599516SKenneth E. Jansen
81259599516SKenneth E. Jansenc...  dump TIME SERIES
81359599516SKenneth E. Jansen
81459599516SKenneth E. Jansen            if (exts) then
81559599516SKenneth E. Jansen               if (mod(lstep-1,freq).eq.0) then
81659599516SKenneth E. Jansen
81759599516SKenneth E. Jansen                  if (numpe > 1) then
81859599516SKenneth E. Jansen                     do jj = 1, ntspts
81959599516SKenneth E. Jansen                        vartssoln((jj-1)*ndof+1:jj*ndof)=varts(jj,:)
82059599516SKenneth E. Jansen                        ivarts=zero
82159599516SKenneth E. Jansen                     enddo
82259599516SKenneth E. Jansen                     do k=1,ndof*ntspts
82359599516SKenneth E. Jansen                        if(vartssoln(k).ne.zero) ivarts(k)=1
82459599516SKenneth E. Jansen                     enddo
82559599516SKenneth E. Jansen
82659599516SKenneth E. Jansen!                     call MPI_REDUCE(vartssoln, vartssolng, ndof*ntspts,
82759599516SKenneth E. Jansen!     &                    MPI_DOUBLE_PRECISION, MPI_SUM, master,
82859599516SKenneth E. Jansen!     &                    MPI_COMM_WORLD, ierr)
82959599516SKenneth E. Jansen
83059599516SKenneth E. Jansen                     call MPI_BARRIER(MPI_COMM_WORLD, ierr)
83159599516SKenneth E. Jansen                     call MPI_ALLREDUCE(vartssoln, vartssolng,
83259599516SKenneth E. Jansen     &                    ndof*ntspts,
83359599516SKenneth E. Jansen     &                    MPI_DOUBLE_PRECISION, MPI_SUM,
83459599516SKenneth E. Jansen     &                    MPI_COMM_WORLD, ierr)
83559599516SKenneth E. Jansen
83659599516SKenneth E. Jansen!                     call MPI_REDUCE(ivarts, ivartsg, ndof*ntspts,
83759599516SKenneth E. Jansen!     &                    MPI_INTEGER, MPI_SUM, master,
83859599516SKenneth E. Jansen!     &                    MPI_COMM_WORLD, ierr)
83959599516SKenneth E. Jansen
84059599516SKenneth E. Jansen                     call MPI_BARRIER(MPI_COMM_WORLD, ierr)
84159599516SKenneth E. Jansen                     call MPI_ALLREDUCE(ivarts, ivartsg, ndof*ntspts,
84259599516SKenneth E. Jansen     &                    MPI_INTEGER, MPI_SUM,
84359599516SKenneth E. Jansen     &                    MPI_COMM_WORLD, ierr)
84459599516SKenneth E. Jansen
84559599516SKenneth E. Jansen!                     if (myrank.eq.zero) then
84659599516SKenneth E. Jansen                     do jj = 1, ntspts
84759599516SKenneth E. Jansen
84859599516SKenneth E. Jansen                        if(myrank .eq. iv_rank(jj)) then
84959599516SKenneth E. Jansen                           ! No need to update all varts components, only the one treated by the expected rank
85059599516SKenneth E. Jansen                           ! Note: keep varts as a vector, as multiple probes could be treated by one rank
85159599516SKenneth E. Jansen                           indxvarts = (jj-1)*ndof
85259599516SKenneth E. Jansen                           do k=1,ndof
85359599516SKenneth E. Jansen                              if(ivartsg(indxvarts+k).ne.0) then ! none of the vartssoln(parts) were non zero
85459599516SKenneth E. Jansen                                 varts(jj,k)=vartssolng(indxvarts+k)/
85559599516SKenneth E. Jansen     &                                             ivartsg(indxvarts+k)
85659599516SKenneth E. Jansen                              endif
85759599516SKenneth E. Jansen                           enddo
85859599516SKenneth E. Jansen                       endif !only if myrank eq iv_rank(jj)
85959599516SKenneth E. Jansen                     enddo
86059599516SKenneth E. Jansen!                     endif !only on master
86159599516SKenneth E. Jansen                  endif !only if numpe > 1
86259599516SKenneth E. Jansen
86359599516SKenneth E. Jansen!                  if (myrank.eq.zero) then
86459599516SKenneth E. Jansen                  do jj = 1, ntspts
86559599516SKenneth E. Jansen                     if(myrank .eq. iv_rank(jj)) then
86659599516SKenneth E. Jansen                        ifile = 1000+jj
86759599516SKenneth E. Jansen                        write(ifile,555) lstep, (varts(jj,k),k=1,ndof) !Beware of format 555 - check ndof
86859599516SKenneth E. Jansenc                        call flush(ifile)
86959599516SKenneth E. Jansen                        if (((irs .ge. 1) .and.
87059599516SKenneth E. Jansen     &                       (mod(lstep, ntout) .eq. 0))) then
87159599516SKenneth E. Jansen                           close(ifile)
87259599516SKenneth E. Jansen                           fvarts='varts/varts'
87359599516SKenneth E. Jansen                           fvarts=trim(fvarts)//trim(cname2(jj))
87459599516SKenneth E. Jansen                           fvarts=trim(fvarts)//trim(cname2(lskeep))
87559599516SKenneth E. Jansen                           fvarts=trim(fvarts)//'.dat'
87659599516SKenneth E. Jansen                           fvarts=trim(fvarts)
87759599516SKenneth E. Jansen                           open(unit=ifile, file=fvarts,
87859599516SKenneth E. Jansen     &                          position='append')
87959599516SKenneth E. Jansen                        endif !only when dumping restart
88059599516SKenneth E. Jansen                     endif
88159599516SKenneth E. Jansen                  enddo
88259599516SKenneth E. Jansen!                  endif !only on master
88359599516SKenneth E. Jansen
88459599516SKenneth E. Jansen                  varts(:,:) = zero ! reset the array for next step
88559599516SKenneth E. Jansen
88659599516SKenneth E. Jansen
88759599516SKenneth E. Jansen!555              format(i6,5(2x,E12.5e2))
88859599516SKenneth E. Jansen555               format(i6,6(2x,E20.12e2)) !assuming ndof = 6 here
88959599516SKenneth E. Jansen
89059599516SKenneth E. Jansen               endif
89159599516SKenneth E. Jansen            endif
89259599516SKenneth E. Jansen
89359599516SKenneth E. Jansenc
89459599516SKenneth E. Jansenc.... update and the aerodynamic forces
89559599516SKenneth E. Jansenc
89659599516SKenneth E. Jansen            call forces ( yold,  ilwork )
89759599516SKenneth E. Jansen
89859599516SKenneth E. Jansen            if((irscale.ge.0).or.(itwmod.gt.0))
89959599516SKenneth E. Jansen     &           call getvel (yold,     ilwork, iBC,
90059599516SKenneth E. Jansen     &                        nsons,    ifath, velbar)
90159599516SKenneth E. Jansen
90259599516SKenneth E. Jansen            if((irscale.ge.0).and.(myrank.eq.master)) then
90359599516SKenneth E. Jansen               call genscale(yold,       x,       iper,
90459599516SKenneth E. Jansen     &                       iBC,     ifath,   velbar,
90559599516SKenneth E. Jansen     &                       nsons)
90659599516SKenneth E. Jansen            endif
90759599516SKenneth E. Jansenc
90859599516SKenneth E. Jansenc....  print out results.
90959599516SKenneth E. Jansenc
91059599516SKenneth E. Jansen            ntoutv=max(ntout,100)   ! velb is not needed so often
91159599516SKenneth E. Jansen            if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then
91259599516SKenneth E. Jansen               if( (mod(lstep, ntoutv) .eq. 0) .and.
91359599516SKenneth E. Jansen     &              ((irscale.ge.0).or.(itwmod.gt.0) .or.
91459599516SKenneth E. Jansen     &              ((nsonmax.eq.1).and.(iLES.gt.0))))
91559599516SKenneth E. Jansen     &              call rwvelb  ('out ',  velbar  ,ifail)
91659599516SKenneth E. Jansen            endif
91759599516SKenneth E. Jansenc
91859599516SKenneth E. Jansenc.... end of the NSTEP and NTSEQ loops
91959599516SKenneth E. Jansenc
92059599516SKenneth E. Jansen
92159599516SKenneth E. Jansen
92259599516SKenneth E. Jansenc
92359599516SKenneth E. Jansenc.... -------------------> error calculation  <-----------------
92459599516SKenneth E. Jansenc
92559599516SKenneth E. Jansen            if(ierrcalc.eq.1 .or. ioybar.eq.1) then
92659599516SKenneth E. Jansenc$$$c
92759599516SKenneth E. Jansenc$$$c compute average
92859599516SKenneth E. Jansenc$$$c
92959599516SKenneth E. Jansenc$$$               tfact=one/istep
93059599516SKenneth E. Jansenc$$$               ybar =tfact*yold + (one-tfact)*ybar
93159599516SKenneth E. Jansen
93259599516SKenneth E. Jansenc compute average
93359599516SKenneth E. Jansenc ybar(:,1:3) are average velocity components
93459599516SKenneth E. Jansenc ybar(:,4) is average pressure
93559599516SKenneth E. Jansenc ybar(:,5) is average speed
93659599516SKenneth E. Jansenc ybar(:,6:8) is average of sq. of each vel. component
93759599516SKenneth E. Jansenc ybar(:,9) is average of sq. of pressure
93859599516SKenneth E. Jansenc ybar(:,10:12) is average of cross vel. components : uv, uw and vw
93959599516SKenneth E. Jansenc averaging procedure justified only for identical time step sizes
94059599516SKenneth E. Jansenc ybar(:,13) is average of eddy viscosity
94159599516SKenneth E. Jansenc ybar(:,14:16) is average vorticity components
94259599516SKenneth E. Jansenc ybar(:,17) is average vorticity magnitude
94359599516SKenneth E. Jansenc istep is number of time step
94459599516SKenneth E. Jansenc
94559599516SKenneth E. Jansen               icollectybar = 0
94659599516SKenneth E. Jansen          if(nphasesincycle.eq.0 .or.
94759599516SKenneth E. Jansen     &            istep.gt.ncycles_startphaseavg*nstepsincycle) then
94859599516SKenneth E. Jansen                 icollectybar = 1
94959599516SKenneth E. Jansen                  if((istep-1).eq.ncycles_startphaseavg*nstepsincycle)
95059599516SKenneth E. Jansen     &               istepsinybar = 0 ! init. to zero in first cycle in avg.
95159599516SKenneth E. Jansen               endif
95259599516SKenneth E. Jansen
95359599516SKenneth E. Jansen               if(icollectybar.eq.1) then
95459599516SKenneth E. Jansen                  istepsinybar = istepsinybar+1
95559599516SKenneth E. Jansen                  tfact=one/istepsinybar
95659599516SKenneth E. Jansen
95759599516SKenneth E. Jansen                  if(myrank.eq.master .and. nphasesincycle.ne.0 .and.
95859599516SKenneth E. Jansen     &               mod((istep-1),nstepsincycle).eq.0)
95959599516SKenneth E. Jansen     &               write(*,*)'nsamples in phase average:',istepsinybar
96059599516SKenneth E. Jansen
96159599516SKenneth E. Jansenc ybar to contain the averaged ((u,v,w),p)-fields
96259599516SKenneth E. Jansenc and speed average, i.e., sqrt(u^2+v^2+w^2)
96359599516SKenneth E. Jansenc and avg. of sq. terms including
96459599516SKenneth E. Jansenc u^2, v^2, w^2, p^2 and cross terms of uv, uw and vw
96559599516SKenneth E. Jansen
96659599516SKenneth E. Jansen                  ybar(:,1) = tfact*yold(:,1) + (one-tfact)*ybar(:,1)
96759599516SKenneth E. Jansen                  ybar(:,2) = tfact*yold(:,2) + (one-tfact)*ybar(:,2)
96859599516SKenneth E. Jansen                  ybar(:,3) = tfact*yold(:,3) + (one-tfact)*ybar(:,3)
96959599516SKenneth E. Jansen                  ybar(:,4) = tfact*yold(:,4) + (one-tfact)*ybar(:,4)
97059599516SKenneth E. Jansen                  ybar(:,5) = tfact*sqrt(yold(:,1)**2+yold(:,2)**2+
97159599516SKenneth E. Jansen     &                        yold(:,3)**2) + (one-tfact)*ybar(:,5)
97259599516SKenneth E. Jansen                  ybar(:,6) = tfact*yold(:,1)**2 +
97359599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,6)
97459599516SKenneth E. Jansen                  ybar(:,7) = tfact*yold(:,2)**2 +
97559599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,7)
97659599516SKenneth E. Jansen                  ybar(:,8) = tfact*yold(:,3)**2 +
97759599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,8)
97859599516SKenneth E. Jansen                  ybar(:,9) = tfact*yold(:,4)**2 +
97959599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,9)
98059599516SKenneth E. Jansen                  ybar(:,10) = tfact*yold(:,1)*yold(:,2) + !uv
98159599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,10)
98259599516SKenneth E. Jansen                  ybar(:,11) = tfact*yold(:,1)*yold(:,3) + !uw
98359599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,11)
98459599516SKenneth E. Jansen                  ybar(:,12) = tfact*yold(:,2)*yold(:,3) + !vw
98559599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,12)
98659599516SKenneth E. Jansen!MR CHANGE
98759599516SKenneth E. Jansen                  if(nsclr.gt.0) !nut
98859599516SKenneth E. Jansen     &             ybar(:,13) = tfact*yold(:,6) + (one-tfact)*ybar(:,13)
98959599516SKenneth E. Jansen
99059599516SKenneth E. Jansen                  if(ivort == 1) then !vorticity
99159599516SKenneth E. Jansen                    ybar(:,14) = tfact*vorticity(:,1) +
99259599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,14)
99359599516SKenneth E. Jansen                    ybar(:,15) = tfact*vorticity(:,2) +
99459599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,15)
99559599516SKenneth E. Jansen                    ybar(:,16) = tfact*vorticity(:,3) +
99659599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,16)
99759599516SKenneth E. Jansen                    ybar(:,17) = tfact*vorticity(:,4) +
99859599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,17)
99959599516SKenneth E. Jansen                  endif
100059599516SKenneth E. Jansen
100159599516SKenneth E. Jansen                  if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
100259599516SKenneth E. Jansen                    wallssVecBar(:,1) = tfact*wallssVec(:,1)
100359599516SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,1)
100459599516SKenneth E. Jansen                    wallssVecBar(:,2) = tfact*wallssVec(:,2)
100559599516SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,2)
100659599516SKenneth E. Jansen                    wallssVecBar(:,3) = tfact*wallssVec(:,3)
100759599516SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,3)
100859599516SKenneth E. Jansen                  endif
100959599516SKenneth E. Jansen!MR CHANGE END
101059599516SKenneth E. Jansen               endif
101159599516SKenneth E. Jansenc
101259599516SKenneth E. Jansenc compute phase average
101359599516SKenneth E. Jansenc
101459599516SKenneth E. Jansen               if(nphasesincycle.ne.0 .and.
101559599516SKenneth E. Jansen     &            istep.gt.ncycles_startphaseavg*nstepsincycle) then
101659599516SKenneth E. Jansen
101759599516SKenneth E. Jansenc beginning of cycle is considered as ncycles_startphaseavg*nstepsincycle+1
101859599516SKenneth E. Jansen                  if((istep-1).eq.ncycles_startphaseavg*nstepsincycle)
101959599516SKenneth E. Jansen     &               icyclesinavg = 0 ! init. to zero in first cycle in avg.
102059599516SKenneth E. Jansen
102159599516SKenneth E. Jansen                  ! find number of steps between phases
102259599516SKenneth E. Jansen                  nstepsbtwphase = nstepsincycle/nphasesincycle ! integer value
102359599516SKenneth E. Jansen                  if(mod(istep-1,nstepsincycle).eq.0) then
102459599516SKenneth E. Jansen                     iphase = 1 ! init. to one in beginning of every cycle
102559599516SKenneth E. Jansen                     icyclesinavg = icyclesinavg + 1
102659599516SKenneth E. Jansen                  endif
102759599516SKenneth E. Jansen
102859599516SKenneth E. Jansen                  icollectphase = 0
102959599516SKenneth E. Jansen                  istepincycle = mod(istep,nstepsincycle)
103059599516SKenneth E. Jansen                  if(istepincycle.eq.0) istepincycle=nstepsincycle
103159599516SKenneth E. Jansen                  if(istepincycle.eq.iphase*nstepsbtwphase) then
103259599516SKenneth E. Jansen                     icollectphase = 1
103359599516SKenneth E. Jansen                     iphase = iphase+1 ! use 'iphase-1' below
103459599516SKenneth E. Jansen                  endif
103559599516SKenneth E. Jansen
103659599516SKenneth E. Jansen                  if(icollectphase.eq.1) then
103759599516SKenneth E. Jansen                     tfactphase = one/icyclesinavg
103859599516SKenneth E. Jansen
103959599516SKenneth E. Jansen                     if(myrank.eq.master) then
104059599516SKenneth E. Jansen                       write(*,*) 'nsamples in phase ',iphase-1,': ',
104159599516SKenneth E. Jansen     &                             icyclesinavg
104259599516SKenneth E. Jansen                     endif
104359599516SKenneth E. Jansen
104459599516SKenneth E. Jansen                     yphbar(:,1,iphase-1) = tfactphase*yold(:,1) +
104559599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,1,iphase-1)
104659599516SKenneth E. Jansen                     yphbar(:,2,iphase-1) = tfactphase*yold(:,2) +
104759599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,2,iphase-1)
104859599516SKenneth E. Jansen                     yphbar(:,3,iphase-1) = tfactphase*yold(:,3) +
104959599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,3,iphase-1)
105059599516SKenneth E. Jansen                     yphbar(:,4,iphase-1) = tfactphase*yold(:,4) +
105159599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,4,iphase-1)
105259599516SKenneth E. Jansen                     yphbar(:,5,iphase-1) = tfactphase*sqrt(yold(:,1)**2
105359599516SKenneth E. Jansen     &                          +yold(:,2)**2+yold(:,3)**2) +
105459599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,5,iphase-1)
105559599516SKenneth E. Jansen!MR CHANGE
105659599516SKenneth E. Jansen                     yphbar(:,6,iphase-1) =
105759599516SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,1)
105859599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,6,iphase-1)
105959599516SKenneth E. Jansen
106059599516SKenneth E. Jansen                     yphbar(:,7,iphase-1) =
106159599516SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,2)
106259599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,7,iphase-1)
106359599516SKenneth E. Jansen
106459599516SKenneth E. Jansen                     yphbar(:,8,iphase-1) =
106559599516SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,3)
106659599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,8,iphase-1)
106759599516SKenneth E. Jansen
106859599516SKenneth E. Jansen                     yphbar(:,9,iphase-1) =
106959599516SKenneth E. Jansen     &                              tfactphase*yold(:,2)*yold(:,2)
107059599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,9,iphase-1)
107159599516SKenneth E. Jansen
107259599516SKenneth E. Jansen                     yphbar(:,10,iphase-1) =
107359599516SKenneth E. Jansen     &                              tfactphase*yold(:,2)*yold(:,3)
107459599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,10,iphase-1)
107559599516SKenneth E. Jansen
107659599516SKenneth E. Jansen                     yphbar(:,11,iphase-1) =
107759599516SKenneth E. Jansen     &                              tfactphase*yold(:,3)*yold(:,3)
107859599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,11,iphase-1)
107959599516SKenneth E. Jansen
108059599516SKenneth E. Jansen                     if(ivort == 1) then
108159599516SKenneth E. Jansen                       yphbar(:,12,iphase-1) =
108259599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,1)
108359599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,12,iphase-1)
108459599516SKenneth E. Jansen                       yphbar(:,13,iphase-1) =
108559599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,2)
108659599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,13,iphase-1)
108759599516SKenneth E. Jansen                       yphbar(:,14,iphase-1) =
108859599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,3)
108959599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,14,iphase-1)
109059599516SKenneth E. Jansen                       yphbar(:,15,iphase-1) =
109159599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,4)
109259599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,15,iphase-1)
109359599516SKenneth E. Jansen                    endif
109459599516SKenneth E. Jansen!MR CHANGE END
109559599516SKenneth E. Jansen                  endif
109659599516SKenneth E. Jansen               endif
109759599516SKenneth E. Jansenc
109859599516SKenneth E. Jansenc compute rms
109959599516SKenneth E. Jansenc
110059599516SKenneth E. Jansen               if(icollectybar.eq.1) then
110159599516SKenneth E. Jansen                  rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2
110259599516SKenneth E. Jansen                  rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2
110359599516SKenneth E. Jansen                  rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2
110459599516SKenneth E. Jansen                  rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2
110559599516SKenneth E. Jansen               endif
110659599516SKenneth E. Jansen            endif
110759599516SKenneth E. Jansen
110859599516SKenneth E. Jansen            if(istop.eq.1000) exit ! stop when delta small (see rstatic)
110959599516SKenneth E. Jansen 2000    continue
111059599516SKenneth E. Jansen 2001    continue
111159599516SKenneth E. Jansen
111259599516SKenneth E. Jansen
111359599516SKenneth E. JansenCAD         tcorecp2 = second(0)
111459599516SKenneth E. JansenCAD         tcorewc2 = second(-1)
111559599516SKenneth E. Jansen
111659599516SKenneth E. JansenCAD         write(6,*) 'T(core) cpu-wallclock = ',tcorecp2-tcorecp1,
111759599516SKenneth E. JansenCAD     &                                        tcorewc2-tcorewc1
111859599516SKenneth E. Jansen
111959599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
112059599516SKenneth E. Jansen         if(myrank.eq.0)  then
112159599516SKenneth E. Jansen            tcorecp2 = TMRC()
112259599516SKenneth E. Jansen             write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1
112359599516SKenneth E. Jansen             write(6,*) '(Elm. form.',tcorecp(1),
112459599516SKenneth E. Jansen     &                    ',Lin. alg. sol.',tcorecp(2),')'
112559599516SKenneth E. Jansen             write(6,*) '(Elm. form. Scal.',tcorecpscal(1),
112659599516SKenneth E. Jansen     &                   ',Lin. alg. sol. Scal.',tcorecpscal(2),')'
112759599516SKenneth E. Jansen             write(6,*) ''
112859599516SKenneth E. Jansen
112959599516SKenneth E. Jansen         endif
113059599516SKenneth E. Jansen
113159599516SKenneth E. Jansen         call print_system_stats(tcorecp, tcorecpscal)
113259599516SKenneth E. Jansen         call print_mesh_stats()
113359599516SKenneth E. Jansen         call print_mpi_stats()
113459599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
113559599516SKenneth E. Jansen!         return
113659599516SKenneth E. Jansenc         call MPI_Finalize()
113759599516SKenneth E. Jansenc         call MPI_ABORT(MPI_COMM_WORLD, ierr)
113859599516SKenneth E. Jansen
113959599516SKenneth E. Jansen 3000 continue
114059599516SKenneth E. Jansen
114159599516SKenneth E. Jansenc
114259599516SKenneth E. Jansenc.... ---------------------->  Post Processing  <----------------------
114359599516SKenneth E. Jansenc
114459599516SKenneth E. Jansenc.... print out the last step
114559599516SKenneth E. Jansenc
114659599516SKenneth E. Jansen      if ((irs .ge. 1) .and. ((mod(lstep, ntout) .ne. 0) .or.
114759599516SKenneth E. Jansen     &     (nstp .eq. 0))) then
114859599516SKenneth E. Jansen         if(
114959599516SKenneth E. Jansen     &              ((irscale.ge.0).or.(itwmod.gt.0) .or.
115059599516SKenneth E. Jansen     &              ((nsonmax.eq.1).and.iLES.gt.0)))
115159599516SKenneth E. Jansen     &              call rwvelb  ('out ',  velbar  ,ifail)
115259599516SKenneth E. Jansen      endif
115359599516SKenneth E. Jansen
115459599516SKenneth E. Jansen
115559599516SKenneth E. Jansen         lesId   = numeqns(1)
115659599516SKenneth E. Jansen
115759599516SKenneth E. Jansen!MR CHANGE
115859599516SKenneth E. Jansen          if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
115959599516SKenneth E. Jansen          if(myrank.eq.0)  then
116059599516SKenneth E. Jansen            tcormr1 = TMRC()
116159599516SKenneth E. Jansen          endif
116259599516SKenneth E. Jansen!MR CHANGE END
116359599516SKenneth E. Jansen
116459599516SKenneth E. Jansen         call saveLesRestart( lesId,  aperm , nshg, myrank, lstep,
116559599516SKenneth E. Jansen     &                        nPermDims )
116659599516SKenneth E. Jansen
116759599516SKenneth E. Jansen!MR CHANGE
116859599516SKenneth E. Jansen        if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
116959599516SKenneth E. Jansen        if(myrank.eq.0)  then
117059599516SKenneth E. Jansen          tcormr2 = TMRC()
117159599516SKenneth E. Jansen          write(6,*) 'Time to call saveLesRestart for projection and'//
117259599516SKenneth E. Jansen     &               'pressure projection vectors', tcormr2-tcormr1
117359599516SKenneth E. Jansen        endif
117459599516SKenneth E. Jansen!MR CHANGE END
117559599516SKenneth E. Jansen
117659599516SKenneth E. Jansen
117759599516SKenneth E. Jansen      if(ierrcalc.eq.1) then
117859599516SKenneth E. Jansenc
117959599516SKenneth E. Jansenc.....smooth the error indicators
118059599516SKenneth E. Jansenc
118159599516SKenneth E. Jansen        do i=1,ierrsmooth
118259599516SKenneth E. Jansen            call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC )
118359599516SKenneth E. Jansen        end do
118459599516SKenneth E. Jansen
118559599516SKenneth E. Jansen!MR CHANGE
118659599516SKenneth E. Jansen        if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
118759599516SKenneth E. Jansen        if(myrank.eq.0)  then
118859599516SKenneth E. Jansen          tcormr1 = TMRC()
118959599516SKenneth E. Jansen        endif
119059599516SKenneth E. Jansen!MR CHANGE END
119159599516SKenneth E. Jansen
119259599516SKenneth E. Jansen         call write_error(myrank, lstep, nshg, 10, rerr )
119359599516SKenneth E. Jansen
119459599516SKenneth E. Jansen!MR CHANGE
119559599516SKenneth E. Jansen        if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
119659599516SKenneth E. Jansen        if(myrank.eq.0)  then
1197*9071d3baSCameron Smith          call writeTimingMessage(
1198*9071d3baSCameron Smith     &           c_char_"error fields to " // c_null_char,
1199*9071d3baSCameron Smith     &           output_mode,
1200*9071d3baSCameron Smith     &           TMRC()-tcormr1)
120159599516SKenneth E. Jansen        endif
120259599516SKenneth E. Jansen!MR CHANGE END
120359599516SKenneth E. Jansen
120459599516SKenneth E. Jansen
120559599516SKenneth E. Jansen      endif
120659599516SKenneth E. Jansen
120759599516SKenneth E. Jansen      if(ioybar.eq.1) then
120859599516SKenneth E. Jansen
120959599516SKenneth E. Jansen!MR CHANGE
121059599516SKenneth E. Jansen!        call write_field(myrank,'a','ybar',4,
121159599516SKenneth E. Jansen!     &                    ybar,'d',nshg,12,lstep)
121259599516SKenneth E. Jansen         if(ivort == 1) then
121359599516SKenneth E. Jansen           call write_field(myrank,'a','ybar',4,
121459599516SKenneth E. Jansen     &                      ybar,'d',nshg,17,lstep)
121559599516SKenneth E. Jansen         else
121659599516SKenneth E. Jansen           call write_field(myrank,'a','ybar',4,
121759599516SKenneth E. Jansen     &                    ybar,'d',nshg,13,lstep)
121859599516SKenneth E. Jansen         endif
121959599516SKenneth E. Jansen         deallocate(ybar)
122059599516SKenneth E. Jansen
122159599516SKenneth E. Jansen
122259599516SKenneth E. Jansen         if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
122359599516SKenneth E. Jansen           call write_field(myrank,'a','wssbar',6,
122459599516SKenneth E. Jansen     &                 wallssVecBar,'d',nshg,3,lstep)
122559599516SKenneth E. Jansen           deallocate(wallssVecbar)
122659599516SKenneth E. Jansen         endif
122759599516SKenneth E. Jansen
122859599516SKenneth E. Jansen!MR CHANGE END
122959599516SKenneth E. Jansen        if(nphasesincycle .gt. 0) then
123059599516SKenneth E. Jansen
123159599516SKenneth E. Jansen          if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
123259599516SKenneth E. Jansen          if(myrank.eq.0)  then
123359599516SKenneth E. Jansen            tcormr1 = TMRC()
123459599516SKenneth E. Jansen          endif
123559599516SKenneth E. Jansen
123659599516SKenneth E. Jansen          do iphase=1,nphasesincycle
123759599516SKenneth E. Jansen
123859599516SKenneth E. Jansen!           call write_phavg(myrank,'w','phase average',13,iphase,
123959599516SKenneth E. Jansen!     &                      yphbar(:,:,iphase),'d',nshg,5,lstep)
124059599516SKenneth E. Jansen!           ! ybar field is repeated in files for phase average
124159599516SKenneth E. Jansen!           call write_phavg(myrank,'a','ybar',4,iphase,
124259599516SKenneth E. Jansen!     &                      ybar(:,1:5),'d',nshg,5,lstep)
124359599516SKenneth E. Jansen            if(ivort == 1) then
124459599516SKenneth E. Jansen              call write_phavg2(myrank,'a','phase_average',13,iphase,
124559599516SKenneth E. Jansen     &             nphasesincycle,yphbar(:,:,iphase),'d',nshg,15,lstep)
124659599516SKenneth E. Jansen            else
124759599516SKenneth E. Jansen              call write_phavg2(myrank,'a','phase_average',13,iphase,
124859599516SKenneth E. Jansen     &             nphasesincycle,yphbar(:,:,iphase),'d',nshg,11,lstep)
124959599516SKenneth E. Jansen            endif
125059599516SKenneth E. Jansen
125159599516SKenneth E. Jansen          end do
125259599516SKenneth E. Jansen
125359599516SKenneth E. Jansen          if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
125459599516SKenneth E. Jansen          if(myrank.eq.0)  then
125559599516SKenneth E. Jansen              tcormr2 = TMRC()
125659599516SKenneth E. Jansen              write(6,*) 'Time to write all phase avg to the disks = ',
125759599516SKenneth E. Jansen     &                        tcormr2-tcormr1
125859599516SKenneth E. Jansen          endif
125959599516SKenneth E. Jansen          deallocate(yphbar)
126059599516SKenneth E. Jansen        endif
126159599516SKenneth E. Jansen
126259599516SKenneth E. Jansen      endif
126359599516SKenneth E. Jansen
126459599516SKenneth E. Jansen      if(ivort == 1) then
126559599516SKenneth E. Jansen         deallocate(strain,vorticity)
126659599516SKenneth E. Jansen      endif
126759599516SKenneth E. Jansen
126859599516SKenneth E. Jansen      if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
126959599516SKenneth E. Jansen        deallocate(wallssVec)
127059599516SKenneth E. Jansen      endif
127159599516SKenneth E. Jansen
127259599516SKenneth E. Jansen!MR CHANGE END
127359599516SKenneth E. Jansen
127459599516SKenneth E. Jansen      if ( ( ihessian .eq. 1 ) .and. ( numpe < 2 )  )then
127559599516SKenneth E. Jansen          uhess = zero
127659599516SKenneth E. Jansen          gradu = zero
127759599516SKenneth E. Jansen          tf = zero
127859599516SKenneth E. Jansen
127959599516SKenneth E. Jansen          do ku=1,nshg
128059599516SKenneth E. Jansenc           tf(ku,1) = x(ku,1)**2+2*x(ku,1)*x(ku,2)
128159599516SKenneth E. Jansen            tf(ku,1) = x(ku,1)**3
128259599516SKenneth E. Jansen          end do
128359599516SKenneth E. Jansen
128459599516SKenneth E. Jansen          call hessian( yold, x,     shp,  shgl,   iBC,
128559599516SKenneth E. Jansen     &                  shpb, shglb, iper, ilwork, uhess, gradu )
128659599516SKenneth E. Jansen
128759599516SKenneth E. Jansen          call write_hessian( uhess, gradu, nshg )
128859599516SKenneth E. Jansen      endif
128959599516SKenneth E. Jansen
129059599516SKenneth E. Jansenc      if(iRANS.lt.0 .and. idistcalc.eq.1) then
129159599516SKenneth E. Jansen      if(iRANS.lt.0) then
129259599516SKenneth E. Jansenc         call write_field(myrank,'a','DESd',4,
129359599516SKenneth E. Jansenc     &                    elDw,'d',numel,1,lstep)
129459599516SKenneth E. Jansen
129559599516SKenneth E. Jansen!MR CHANGE
129659599516SKenneth E. Jansen        if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
129759599516SKenneth E. Jansen        if(myrank.eq.0)  then
129859599516SKenneth E. Jansen           tcormr1 = TMRC()
129959599516SKenneth E. Jansen        endif
130059599516SKenneth E. Jansen!MR CHANGE END
130159599516SKenneth E. Jansen
130259599516SKenneth E. Jansen        call write_field(myrank,'a','dwal',4,d2wall,'d',nshg,1,lstep)
130359599516SKenneth E. Jansen        deallocate(d2wall)
130459599516SKenneth E. Jansen
130559599516SKenneth E. Jansen!MR CHANGE
130659599516SKenneth E. Jansen        if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
130759599516SKenneth E. Jansen        if(myrank.eq.0)  then
130859599516SKenneth E. Jansen          tcormr2 = TMRC()
1309*9071d3baSCameron Smith          if ( output_mode .eq. -1 ) then
1310*9071d3baSCameron Smith            write(6,*) 'Time to write dwal to stream = ', tcormr2-tcormr1
1311*9071d3baSCameron Smith          else
1312*9071d3baSCameron Smith            write(6,*) 'Time to write dwal to disk = ', tcormr2-tcormr1
1313*9071d3baSCameron Smith          endif
131459599516SKenneth E. Jansen        endif
131559599516SKenneth E. Jansen!MR CHANGE END
131659599516SKenneth E. Jansen
131759599516SKenneth E. Jansen
131859599516SKenneth E. Jansen      endif
131959599516SKenneth E. Jansen
132059599516SKenneth E. Jansenc
132159599516SKenneth E. Jansenc.... close history and aerodynamic forces files
132259599516SKenneth E. Jansenc
132359599516SKenneth E. Jansen      if (myrank .eq. master) then
132459599516SKenneth E. Jansen!         close (ihist)
132559599516SKenneth E. Jansen         close (iforce)
132659599516SKenneth E. Jansen         close(76)
132759599516SKenneth E. Jansen         if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then
132859599516SKenneth E. Jansen            close (8177)
132959599516SKenneth E. Jansen         endif
133059599516SKenneth E. Jansen      endif
133159599516SKenneth E. Jansenc
133259599516SKenneth E. Jansenc.... close varts file for probes
133359599516SKenneth E. Jansenc
133459599516SKenneth E. Jansen      if(exts) then
133559599516SKenneth E. Jansen        do jj=1,ntspts
133659599516SKenneth E. Jansen          if (myrank == iv_rank(jj)) then
133759599516SKenneth E. Jansen            close(1000+jj)
133859599516SKenneth E. Jansen          endif
133959599516SKenneth E. Jansen        enddo
134059599516SKenneth E. Jansen        deallocate (ivarts)
134159599516SKenneth E. Jansen        deallocate (ivartsg)
134259599516SKenneth E. Jansen        deallocate (iv_rank)
134359599516SKenneth E. Jansen        deallocate (vartssoln)
134459599516SKenneth E. Jansen        deallocate (vartssolng)
134559599516SKenneth E. Jansen      endif
134659599516SKenneth E. Jansen
134759599516SKenneth E. Jansen!MR CHANGE
134859599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
134959599516SKenneth E. Jansen      if(myrank.eq.0)  then
135059599516SKenneth E. Jansen          write(*,*) 'itrdrv - done with aerodynamic forces'
135159599516SKenneth E. Jansen      endif
135259599516SKenneth E. Jansen!MR CHANGE
135359599516SKenneth E. Jansen
135459599516SKenneth E. Jansen      do isrf = 0,MAXSURF
135559599516SKenneth E. Jansen!        if ( nsrflist(isrf).ne.0 ) then
135659599516SKenneth E. Jansen        if ( nsrflist(isrf).ne.0 .and.
135759599516SKenneth E. Jansen     &                     myrank.eq.irankfilesforce(isrf)) then
135859599516SKenneth E. Jansen          iunit=60+isrf
135959599516SKenneth E. Jansen          close(iunit)
136059599516SKenneth E. Jansen        endif
136159599516SKenneth E. Jansen      enddo
136259599516SKenneth E. Jansen
136359599516SKenneth E. Jansen!MR CHANGE
136459599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
136559599516SKenneth E. Jansen      if(myrank.eq.0)  then
136659599516SKenneth E. Jansen          write(*,*) 'itrdrv - done with MAXSURF'
136759599516SKenneth E. Jansen      endif
136859599516SKenneth E. Jansen!MR CHANGE
136959599516SKenneth E. Jansen
137059599516SKenneth E. Jansen
137159599516SKenneth E. Jansen 5    format(1X,F15.10,3X,F15.10,3X,F15.10,3X,F15.10)
137259599516SKenneth E. Jansen 444  format(6(2x,e14.7))
137359599516SKenneth E. Jansenc
137459599516SKenneth E. Jansenc.... end
137559599516SKenneth E. Jansenc
137659599516SKenneth E. Jansen      if(nsolflow.eq.1) then
137759599516SKenneth E. Jansen         deallocate (lhsK)
137859599516SKenneth E. Jansen         deallocate (lhsP)
137959599516SKenneth E. Jansen         deallocate (aperm)
138059599516SKenneth E. Jansen         deallocate (atemp)
138159599516SKenneth E. Jansen      endif
138259599516SKenneth E. Jansen      if(nsclrsol.gt.0) then
138359599516SKenneth E. Jansen         deallocate (lhsS)
138459599516SKenneth E. Jansen         deallocate (apermS)
138559599516SKenneth E. Jansen         deallocate (atempS)
138659599516SKenneth E. Jansen      endif
138759599516SKenneth E. Jansen
138859599516SKenneth E. Jansen      if(iabc==1) deallocate(acs)
138959599516SKenneth E. Jansen
139059599516SKenneth E. Jansen!MR CHANGE
139159599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
139259599516SKenneth E. Jansen      if(myrank.eq.0)  then
139359599516SKenneth E. Jansen          write(*,*) 'itrdrv - done - BACK TO process.f'
139459599516SKenneth E. Jansen      endif
139559599516SKenneth E. Jansen!MR CHANGE
139659599516SKenneth E. Jansen
139759599516SKenneth E. Jansen
139859599516SKenneth E. Jansen
139959599516SKenneth E. Jansen      return
140059599516SKenneth E. Jansen      end
140159599516SKenneth E. Jansen
140259599516SKenneth E. Jansen      subroutine lesmodels(y,     ac,        shgl,      shp,
140359599516SKenneth E. Jansen     &                     iper,  ilwork,    rowp,      colm,
140459599516SKenneth E. Jansen     &                     nsons, ifath,     x,
140559599516SKenneth E. Jansen     &                     iBC,   BC)
140659599516SKenneth E. Jansen
140759599516SKenneth E. Jansen      include "common.h"
140859599516SKenneth E. Jansen
140959599516SKenneth E. Jansen      real*8    y(nshg,ndof),              ac(nshg,ndof),
141059599516SKenneth E. Jansen     &            x(numnp,nsd),
141159599516SKenneth E. Jansen     &            BC(nshg,ndofBC)
141259599516SKenneth E. Jansen      real*8    shp(MAXTOP,maxsh,MAXQPT),
141359599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT)
141459599516SKenneth E. Jansen
141559599516SKenneth E. Jansenc
141659599516SKenneth E. Jansen      integer   rowp(nshg,nnz),         colm(nshg+1),
141759599516SKenneth E. Jansen     &            iBC(nshg),
141859599516SKenneth E. Jansen     &            ilwork(nlwork),
141959599516SKenneth E. Jansen     &            iper(nshg)
142059599516SKenneth E. Jansen      dimension ifath(numnp),    nsons(nfath)
142159599516SKenneth E. Jansen
142259599516SKenneth E. Jansen      real*8, allocatable, dimension(:) :: fwr2,fwr3,fwr4
142359599516SKenneth E. Jansen      real*8, allocatable, dimension(:) :: stabdis,cdelsq1
142459599516SKenneth E. Jansen      real*8, allocatable, dimension(:,:) :: xavegt, xavegt2,xavegt3
142559599516SKenneth E. Jansen
142659599516SKenneth E. Jansen      if( (iLES.gt.1) )   then ! Allocate Stuff for advanced LES models
142759599516SKenneth E. Jansen         allocate (fwr2(nshg))
142859599516SKenneth E. Jansen         allocate (fwr3(nshg))
142959599516SKenneth E. Jansen         allocate (fwr4(nshg))
143059599516SKenneth E. Jansen         allocate (xavegt(nfath,12))
143159599516SKenneth E. Jansen         allocate (xavegt2(nfath,12))
143259599516SKenneth E. Jansen         allocate (xavegt3(nfath,12))
143359599516SKenneth E. Jansen         allocate (stabdis(nfath))
143459599516SKenneth E. Jansen      endif
143559599516SKenneth E. Jansen
143659599516SKenneth E. Jansenc.... get dynamic model coefficient
143759599516SKenneth E. Jansenc
143859599516SKenneth E. Jansen      ilesmod=iLES/10
143959599516SKenneth E. Jansenc
144059599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model
144159599516SKenneth E. Jansenc
144259599516SKenneth E. Jansen      if (ilesmod.eq.0) then    ! 0 < iLES< 10 => dyn. model calculated
144359599516SKenneth E. Jansen                                ! at nodes based on discrete filtering
144459599516SKenneth E. Jansen
144559599516SKenneth E. Jansen
144659599516SKenneth E. Jansen         if(isubmod.eq.2) then
144759599516SKenneth E. Jansen            call SUPGdis(y,      ac,        shgl,      shp,
144859599516SKenneth E. Jansen     &                   iper,   ilwork,
144959599516SKenneth E. Jansen     &                   nsons,  ifath,     x,
145059599516SKenneth E. Jansen     &                   iBC,    BC, stabdis, xavegt3)
145159599516SKenneth E. Jansen         endif
145259599516SKenneth E. Jansen
145359599516SKenneth E. Jansen         if( ((isubmod.eq.0).or.(isubmod.eq.2)))then ! If no
145459599516SKenneth E. Jansen                                                     ! sub-model
145559599516SKenneth E. Jansen                                                     ! or SUPG
145659599516SKenneth E. Jansen                                                     ! model wanted
145759599516SKenneth E. Jansen
145859599516SKenneth E. Jansen            if(i2filt.eq.0)then ! If simple filter
145959599516SKenneth E. Jansen
146059599516SKenneth E. Jansen               if(modlstats .eq. 0) then ! If no model stats wanted
146159599516SKenneth E. Jansen                  call getdmc (y,       shgl,      shp,
146259599516SKenneth E. Jansen     &                         iper,       ilwork,    nsons,
146359599516SKenneth E. Jansen     &                         ifath,      x)
146459599516SKenneth E. Jansen               else             ! else get model stats
146559599516SKenneth E. Jansen                  call stdfdmc (y,       shgl,      shp,
146659599516SKenneth E. Jansen     &                          iper,       ilwork,    nsons,
146759599516SKenneth E. Jansen     &                          ifath,      x)
146859599516SKenneth E. Jansen               endif            ! end of stats if statement
146959599516SKenneth E. Jansen
147059599516SKenneth E. Jansen            else                ! else if twice filtering
147159599516SKenneth E. Jansen
147259599516SKenneth E. Jansen               call widefdmc(y,       shgl,      shp,
147359599516SKenneth E. Jansen     &                       iper,       ilwork,    nsons,
147459599516SKenneth E. Jansen     &                       ifath,      x)
147559599516SKenneth E. Jansen
147659599516SKenneth E. Jansen
147759599516SKenneth E. Jansen            endif               ! end of simple filter if statement
147859599516SKenneth E. Jansen
147959599516SKenneth E. Jansen         endif                  ! end of SUPG or no sub-model if statement
148059599516SKenneth E. Jansen
148159599516SKenneth E. Jansen
148259599516SKenneth E. Jansen         if( (isubmod.eq.1) ) then ! If DFWR sub-model wanted
148359599516SKenneth E. Jansen            call cdelBHsq (y,       shgl,      shp,
148459599516SKenneth E. Jansen     &                     iper,       ilwork,    nsons,
148559599516SKenneth E. Jansen     &                     ifath,      x,         cdelsq1)
148659599516SKenneth E. Jansen            call FiltRat (y,       shgl,      shp,
148759599516SKenneth E. Jansen     &                    iper,       ilwork,    nsons,
148859599516SKenneth E. Jansen     &                    ifath,      x,         cdelsq1,
148959599516SKenneth E. Jansen     &                    fwr4,       fwr3)
149059599516SKenneth E. Jansen
149159599516SKenneth E. Jansen
149259599516SKenneth E. Jansen            if (i2filt.eq.0) then ! If simple filter wanted
149359599516SKenneth E. Jansen               call DFWRsfdmc(y,       shgl,      shp,
149459599516SKenneth E. Jansen     &                        iper,       ilwork,    nsons,
149559599516SKenneth E. Jansen     &                        ifath,      x,         fwr2, fwr3)
149659599516SKenneth E. Jansen            else                ! else if twice filtering wanted
149759599516SKenneth E. Jansen               call DFWRwfdmc(y,       shgl,      shp,
149859599516SKenneth E. Jansen     &                        iper,       ilwork,    nsons,
149959599516SKenneth E. Jansen     &                        ifath,      x,         fwr4, fwr4)
150059599516SKenneth E. Jansen            endif               ! end of simple filter if statement
150159599516SKenneth E. Jansen
150259599516SKenneth E. Jansen         endif                  ! end of DFWR sub-model if statement
150359599516SKenneth E. Jansen
150459599516SKenneth E. Jansen         if( (isubmod.eq.2) )then ! If SUPG sub-model wanted
150559599516SKenneth E. Jansen            call dmcSUPG (y,           ac,         shgl,
150659599516SKenneth E. Jansen     &                    shp,         iper,       ilwork,
150759599516SKenneth E. Jansen     &                    nsons,       ifath,      x,
150859599516SKenneth E. Jansen     &                    iBC,    BC,  rowp,       colm,
150959599516SKenneth E. Jansen     &                    xavegt2,    stabdis)
151059599516SKenneth E. Jansen         endif
151159599516SKenneth E. Jansen
151259599516SKenneth E. Jansen         if(idis.eq.1)then      ! If SUPG/Model dissipation wanted
151359599516SKenneth E. Jansen            call ediss (y,        ac,      shgl,
151459599516SKenneth E. Jansen     &                  shp,      iper,       ilwork,
151559599516SKenneth E. Jansen     &                  nsons,    ifath,      x,
151659599516SKenneth E. Jansen     &                  iBC,      BC,  xavegt)
151759599516SKenneth E. Jansen         endif
151859599516SKenneth E. Jansen
151959599516SKenneth E. Jansen      endif                     ! end of ilesmod
152059599516SKenneth E. Jansen
152159599516SKenneth E. Jansen      if (ilesmod .eq. 1) then  ! 10 < iLES < 20 => dynamic-mixed
152259599516SKenneth E. Jansen                                ! at nodes based on discrete filtering
152359599516SKenneth E. Jansen         call bardmc (y,       shgl,      shp,
152459599516SKenneth E. Jansen     &                iper,    ilwork,
152559599516SKenneth E. Jansen     &                nsons,   ifath,     x)
152659599516SKenneth E. Jansen      endif
152759599516SKenneth E. Jansen
152859599516SKenneth E. Jansen      if (ilesmod .eq. 2) then  ! 20 < iLES < 30 => dynamic at quad
152959599516SKenneth E. Jansen                                ! pts based on lumped projection filt.
153059599516SKenneth E. Jansen
153159599516SKenneth E. Jansen         if(isubmod.eq.0)then
153259599516SKenneth E. Jansen            call projdmc (y,       shgl,      shp,
153359599516SKenneth E. Jansen     &                    iper,       ilwork,    x)
153459599516SKenneth E. Jansen         else
153559599516SKenneth E. Jansen            call cpjdmcnoi (y,      shgl,      shp,
153659599516SKenneth E. Jansen     &                      iper,   ilwork,       x,
153759599516SKenneth E. Jansen     &                      rowp,   colm,
153859599516SKenneth E. Jansen     &                      iBC,    BC)
153959599516SKenneth E. Jansen         endif
154059599516SKenneth E. Jansen
154159599516SKenneth E. Jansen      endif
154259599516SKenneth E. Jansen
154359599516SKenneth E. Jansen      if( (iLES.gt.1) )   then ! Deallocate Stuff for advanced LES models
154459599516SKenneth E. Jansen         deallocate (fwr2)
154559599516SKenneth E. Jansen         deallocate (fwr3)
154659599516SKenneth E. Jansen         deallocate (fwr4)
154759599516SKenneth E. Jansen         deallocate (xavegt)
154859599516SKenneth E. Jansen         deallocate (xavegt2)
154959599516SKenneth E. Jansen         deallocate (xavegt3)
155059599516SKenneth E. Jansen         deallocate (stabdis)
155159599516SKenneth E. Jansen      endif
155259599516SKenneth E. Jansen      return
155359599516SKenneth E. Jansen      end
155459599516SKenneth E. Jansen
155559599516SKenneth E. Jansenc
155659599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution
155759599516SKenneth E. Jansenc
155859599516SKenneth E. Jansen      subroutine CalcImpConvCoef (numISrfs, numTpoints)
155959599516SKenneth E. Jansen
156059599516SKenneth E. Jansen      use convolImpFlow !uses flow history and impedance for convolution
156159599516SKenneth E. Jansen
156259599516SKenneth E. Jansen      include "common.h" !for alfi
156359599516SKenneth E. Jansen
156459599516SKenneth E. Jansen      integer numISrfs, numTpoints
156559599516SKenneth E. Jansen
156659599516SKenneth E. Jansen      allocate (ConvCoef(numTpoints+2,3)) !same time discret. for all imp. BC
156759599516SKenneth E. Jansen      do j=1,numTpoints+2
156859599516SKenneth E. Jansen         ConvCoef(j,:)=0.5/numTpoints !dt/2 divided by period T=N*dt
156959599516SKenneth E. Jansen         ConvCoef(j,1)=ConvCoef(j,1)*(1.0-alfi)*(1.0-alfi)
157059599516SKenneth E. Jansen         ConvCoef(j,2)=ConvCoef(j,2)*(1.0+2*alfi*(1.0-alfi))
157159599516SKenneth E. Jansen         ConvCoef(j,3)=ConvCoef(j,3)*alfi*alfi
157259599516SKenneth E. Jansen      enddo
157359599516SKenneth E. Jansen      ConvCoef(1,2)=zero
157459599516SKenneth E. Jansen      ConvCoef(1,3)=zero
157559599516SKenneth E. Jansen      ConvCoef(2,3)=zero
157659599516SKenneth E. Jansen      ConvCoef(numTpoints+1,1)=zero
157759599516SKenneth E. Jansen      ConvCoef(numTpoints+2,2)=zero
157859599516SKenneth E. Jansen      ConvCoef(numTpoints+2,1)=zero
157959599516SKenneth E. Jansenc
158059599516SKenneth E. Jansenc...calculate the coefficients for the impedance convolution
158159599516SKenneth E. Jansenc
158259599516SKenneth E. Jansen      allocate (ImpConvCoef(numTpoints+2,numISrfs))
158359599516SKenneth E. Jansen
158459599516SKenneth E. Jansenc..coefficients below assume Q linear in time step, Z constant
158559599516SKenneth E. Jansenc            do j=3,numTpoints
158659599516SKenneth E. Jansenc                ImpConvCoef(j,:) = ValueListImp(j-1,:)*ConvCoef(j,3)
158759599516SKenneth E. Jansenc     &                             + ValueListImp(j,:)*ConvCoef(j,2)
158859599516SKenneth E. Jansenc     &                             + ValueListImp(j+1,:)*ConvCoef(j,1)
158959599516SKenneth E. Jansenc            enddo
159059599516SKenneth E. Jansenc            ImpConvCoef(1,:) = ValueListImp(2,:)*ConvCoef(1,1)
159159599516SKenneth E. Jansenc            ImpConvCoef(2,:) = ValueListImp(2,:)*ConvCoef(2,2)
159259599516SKenneth E. Jansenc     &                       + ValueListImp(3,:)*ConvCoef(2,1)
159359599516SKenneth E. Jansenc            ImpConvCoef(numTpoints+1,:) =
159459599516SKenneth E. Jansenc     &           ValueListImp(numTpoints,:)*ConvCoef(numTpoints+1,3)
159559599516SKenneth E. Jansenc     &         + ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+1,2)
159659599516SKenneth E. Jansenc            ImpConvCoef(numTpoints+2,:) =
159759599516SKenneth E. Jansenc     &           ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+2,3)
159859599516SKenneth E. Jansen
159959599516SKenneth E. Jansenc..try easiest convolution Q and Z constant per time step
160059599516SKenneth E. Jansen      do j=3,numTpoints+1
160159599516SKenneth E. Jansen         ImpConvCoef(j,:) = ValueListImp(j-1,:)/numTpoints
160259599516SKenneth E. Jansen      enddo
160359599516SKenneth E. Jansen      ImpConvCoef(1,:) =zero
160459599516SKenneth E. Jansen      ImpConvCoef(2,:) =zero
160559599516SKenneth E. Jansen      ImpConvCoef(numTpoints+2,:) =
160659599516SKenneth E. Jansen     &           ValueListImp(numTpoints+1,:)/numTpoints
160759599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr()
160859599516SKenneth E. Jansen      ImpConvCoef(numTpoints+1,:)= ImpConvCoef(numTpoints+1,:)
160959599516SKenneth E. Jansen     &                  - ImpConvCoef(numTpoints+2,:)*(1.0-alfi)/alfi
161059599516SKenneth E. Jansen      ImpConvCoef(numTpoints+2,:)= ImpConvCoef(numTpoints+2,:)/alfi
161159599516SKenneth E. Jansen      return
161259599516SKenneth E. Jansen      end
161359599516SKenneth E. Jansen
161459599516SKenneth E. Jansenc
161559599516SKenneth E. Jansenc ... update the flow rate history for the impedance convolution, filter it and write it out
161659599516SKenneth E. Jansenc
161759599516SKenneth E. Jansen      subroutine UpdHistConv(y,nsrfIdList,numSrfs)
161859599516SKenneth E. Jansen
161959599516SKenneth E. Jansen      use convolImpFlow !brings ntimeptpT, QHistImp, QHistTry, QHistTryF, numImpSrfs
162059599516SKenneth E. Jansen      use convolRCRFlow !brings QHistRCR, numRCRSrfs
162159599516SKenneth E. Jansen
162259599516SKenneth E. Jansen      include "common.h"
162359599516SKenneth E. Jansen
162459599516SKenneth E. Jansen      integer   nsrfIdList(0:MAXSURF), numSrfs
162559599516SKenneth E. Jansen      character*20 fname1
162659599516SKenneth E. Jansen      character*10 cname2
162759599516SKenneth E. Jansen      character*5 cname
162859599516SKenneth E. Jansen      real*8    y(nshg,3) !velocity at time n+1
162959599516SKenneth E. Jansen      real*8    NewQ(0:MAXSURF) !temporary unknown for the flow rate
163059599516SKenneth E. Jansen                        !that needs to be added to the flow history
163159599516SKenneth E. Jansen
163259599516SKenneth E. Jansen      call GetFlowQ(NewQ,y,nsrfIdList,numSrfs) !new flow at time n+1
163359599516SKenneth E. Jansenc
163459599516SKenneth E. Jansenc... for imp BC: shift QHist, add new constribution, filter and write out
163559599516SKenneth E. Jansenc
163659599516SKenneth E. Jansen      if(numImpSrfs.gt.zero) then
163759599516SKenneth E. Jansen         do j=1, ntimeptpT
163859599516SKenneth E. Jansen            QHistImp(j,1:numSrfs)=QHistImp(j+1,1:numSrfs)
163959599516SKenneth E. Jansen         enddo
164059599516SKenneth E. Jansen         QHistImp(ntimeptpT+1,1:numSrfs) = NewQ(1:numSrfs)
164159599516SKenneth E. Jansen
164259599516SKenneth E. Jansenc
164359599516SKenneth E. Jansenc....filter the flow rate history
164459599516SKenneth E. Jansenc
164559599516SKenneth E. Jansen         cutfreq = 10           !hardcoded cutting frequency of the filter
164659599516SKenneth E. Jansen         do j=1, ntimeptpT
164759599516SKenneth E. Jansen            QHistTry(j,:)=QHistImp(j+1,:)
164859599516SKenneth E. Jansen         enddo
164959599516SKenneth E. Jansen         call Filter(QHistTryF,QHistTry,ntimeptpT,Delt(1),cutfreq)
165059599516SKenneth E. Jansenc.... if no filter applied then uncomment next three lines
165159599516SKenneth E. Jansenc         do j=1, ntimeptpT
165259599516SKenneth E. Jansenc            QHistTryF(j,:)=QHistTry(j,:)
165359599516SKenneth E. Jansenc         enddo
165459599516SKenneth E. Jansen
165559599516SKenneth E. Jansenc         QHistImp(1,:)=zero ! why do we do this? for beta(1,:) = zero it does not really matters
165659599516SKenneth E. Jansen         do j=1, ntimeptpT
165759599516SKenneth E. Jansen            QHistImp(j+1,:)=QHistTryF(j,:)
165859599516SKenneth E. Jansen         enddo
165959599516SKenneth E. Jansenc
166059599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat
166159599516SKenneth E. Jansenc
166259599516SKenneth E. Jansen         if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or.
166359599516SKenneth E. Jansen     &        (istep .eq. nstep(1)))) .and.
166459599516SKenneth E. Jansen     &        (myrank .eq. master)) then
166559599516SKenneth E. Jansen            open(unit=816, file='Qhistor.dat',status='replace')
166659599516SKenneth E. Jansen            write(816,*) ntimeptpT
166759599516SKenneth E. Jansen            do j=1,ntimeptpT+1
166859599516SKenneth E. Jansen               write(816,*) (QHistImp(j,n),n=1, numSrfs)
166959599516SKenneth E. Jansen            enddo
167059599516SKenneth E. Jansen            close(816)
167159599516SKenneth E. Jansenc... write out a copy with step number to be able to restart
167259599516SKenneth E. Jansen            fname1 = 'Qhistor'
167359599516SKenneth E. Jansen            fname1 = trim(fname1)//trim(cname2(lstep))//'.dat'
167459599516SKenneth E. Jansen            open(unit=8166,file=trim(fname1),status='unknown')
167559599516SKenneth E. Jansen            write(8166,*) ntimeptpT
167659599516SKenneth E. Jansen            do j=1,ntimeptpT+1
167759599516SKenneth E. Jansen               write(8166,*) (QHistImp(j,n),n=1, numSrfs)
167859599516SKenneth E. Jansen            enddo
167959599516SKenneth E. Jansen            close(8166)
168059599516SKenneth E. Jansen         endif
168159599516SKenneth E. Jansen      endif
168259599516SKenneth E. Jansen
168359599516SKenneth E. Jansenc
168459599516SKenneth E. Jansenc... for RCR bc just add the new contribution
168559599516SKenneth E. Jansenc
168659599516SKenneth E. Jansen      if(numRCRSrfs.gt.zero) then
168759599516SKenneth E. Jansen         QHistRCR(lstep+1,1:numSrfs) = NewQ(1:numSrfs)
168859599516SKenneth E. Jansenc
168959599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat
169059599516SKenneth E. Jansenc
169159599516SKenneth E. Jansen         if ((irs .ge. 1) .and. (myrank .eq. master)) then
169259599516SKenneth E. Jansen            if(istep.eq.1) then
169359599516SKenneth E. Jansen               open(unit=816,file='Qhistor.dat',status='unknown')
169459599516SKenneth E. Jansen            else
169559599516SKenneth E. Jansen               open(unit=816,file='Qhistor.dat',position='append')
169659599516SKenneth E. Jansen            endif
169759599516SKenneth E. Jansen            if(istep.eq.1) then
169859599516SKenneth E. Jansen               do j=1,lstep
169959599516SKenneth E. Jansen                  write(816,*) j, (QHistRCR(j,n),n=1,numSrfs) ! read from file of previous run
170059599516SKenneth E. Jansen               enddo
170159599516SKenneth E. Jansen            endif
170259599516SKenneth E. Jansen            write(816,*) lstep+1, (QHistRCR(lstep+1,n),n=1, numSrfs)
170359599516SKenneth E. Jansen            close(816)
170459599516SKenneth E. Jansenc... write out a copy with step number to be able to restart
170559599516SKenneth E. Jansen            if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or.
170659599516SKenneth E. Jansen     &           (istep .eq. nstep(1)))) .and.
170759599516SKenneth E. Jansen     &           (myrank .eq. master)) then
170859599516SKenneth E. Jansen               fname1 = 'Qhistor'
170959599516SKenneth E. Jansen               fname1 = trim(fname1)//trim(cname2(lstep))//'.dat'
171059599516SKenneth E. Jansen               open(unit=8166,file=trim(fname1),status='unknown')
171159599516SKenneth E. Jansen               write(8166,*) lstep+1
171259599516SKenneth E. Jansen               do j=1,lstep+1
171359599516SKenneth E. Jansen                  write(8166,*) (QHistRCR(j,n),n=1, numSrfs)
171459599516SKenneth E. Jansen               enddo
171559599516SKenneth E. Jansen               close(8166)
171659599516SKenneth E. Jansen            endif
171759599516SKenneth E. Jansen         endif
171859599516SKenneth E. Jansen      endif
171959599516SKenneth E. Jansen
172059599516SKenneth E. Jansen      return
172159599516SKenneth E. Jansen      end
172259599516SKenneth E. Jansen
172359599516SKenneth E. Jansenc
172459599516SKenneth E. Jansenc...calculate the time varying coefficients for the RCR convolution
172559599516SKenneth E. Jansenc
172659599516SKenneth E. Jansen      subroutine CalcRCRConvCoef (stepn, numSrfs)
172759599516SKenneth E. Jansen
172859599516SKenneth E. Jansen      use convolRCRFlow !brings in ValueListRCR, dtRCR
172959599516SKenneth E. Jansen
173059599516SKenneth E. Jansen      include "common.h" !brings alfi
173159599516SKenneth E. Jansen
173259599516SKenneth E. Jansen      integer numSrfs, stepn
173359599516SKenneth E. Jansen
173459599516SKenneth E. Jansen      RCRConvCoef = zero
173559599516SKenneth E. Jansen      if (stepn .eq. 0) then
173659599516SKenneth E. Jansen        RCRConvCoef(1,:) = ValueListRCR(1,:)*(1.0-alfi) +
173759599516SKenneth E. Jansen     &   ValueListRCR(3,:)*(-alfi + 1.0 + 1/dtRCR(:)
173859599516SKenneth E. Jansen     &     - exp(-alfi*dtRCR(:))*(1 + 1/dtRCR(:)))
173959599516SKenneth E. Jansen        RCRConvCoef(2,:) = ValueListRCR(1,:)*alfi
174059599516SKenneth E. Jansen     &     + ValueListRCR(3,:)
174159599516SKenneth E. Jansen     &     *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:))
174259599516SKenneth E. Jansen      endif
174359599516SKenneth E. Jansen      if (stepn .ge. 1) then
174459599516SKenneth E. Jansen        RCRConvCoef(1,:) =-ValueListRCR(3,:)*exp(-dtRCR(:)*(stepn+alfi))
174559599516SKenneth E. Jansen     &        *(1 + (1 - exp(dtRCR(:)))/dtRCR(:))
174659599516SKenneth E. Jansen        RCRConvCoef(stepn+1,:) = ValueListRCR(1,:)*(1-alfi)
174759599516SKenneth E. Jansen     &     - ValueListRCR(3,:)*(alfi - 1 - 1/dtRCR(:)
174859599516SKenneth E. Jansen     &     + exp(-alfi*dtRCR(:))/dtRCR(:)*(2 - exp(-dtRCR(:))))
174959599516SKenneth E. Jansen        RCRConvCoef(stepn+2,:) = ValueListRCR(1,:)*alfi
175059599516SKenneth E. Jansen     &     + ValueListRCR(3,:)
175159599516SKenneth E. Jansen     &     *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:))
175259599516SKenneth E. Jansen      endif
175359599516SKenneth E. Jansen      if (stepn .ge. 2) then
175459599516SKenneth E. Jansen        do j=2,stepn
175559599516SKenneth E. Jansen         RCRConvCoef(j,:) = ValueListRCR(3,:)/dtRCR(:)*
175659599516SKenneth E. Jansen     &        exp(-dtRCR(:)*(stepn + alfi + 2 - j))*
175759599516SKenneth E. Jansen     &        (1 - exp(dtRCR(:)))**2
175859599516SKenneth E. Jansen        enddo
175959599516SKenneth E. Jansen      endif
176059599516SKenneth E. Jansen
176159599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr()
176259599516SKenneth E. Jansen      RCRConvCoef(stepn+1,:)= RCRConvCoef(stepn+1,:)
176359599516SKenneth E. Jansen     &                  - RCRConvCoef(stepn+2,:)*(1.0-alfi)/alfi
176459599516SKenneth E. Jansen      RCRConvCoef(stepn+2,:)= RCRConvCoef(stepn+2,:)/alfi
176559599516SKenneth E. Jansen
176659599516SKenneth E. Jansen      return
176759599516SKenneth E. Jansen      end
176859599516SKenneth E. Jansen
176959599516SKenneth E. Jansenc
177059599516SKenneth E. Jansenc...calculate the time dependent H operator for the RCR convolution
177159599516SKenneth E. Jansenc
177259599516SKenneth E. Jansen      subroutine CalcHopRCR (timestepRCR, stepn, numSrfs)
177359599516SKenneth E. Jansen
177459599516SKenneth E. Jansen      use convolRCRFlow !brings in HopRCR, dtRCR
177559599516SKenneth E. Jansen
177659599516SKenneth E. Jansen      include "common.h"
177759599516SKenneth E. Jansen
177859599516SKenneth E. Jansen      integer numSrfs, stepn
177959599516SKenneth E. Jansen      real*8  PdistCur(0:MAXSURF), timestepRCR
178059599516SKenneth E. Jansen
178159599516SKenneth E. Jansen      HopRCR=zero
178259599516SKenneth E. Jansen      call RCRint(timestepRCR*(stepn + alfi),PdistCur)
178359599516SKenneth E. Jansen      HopRCR(1:numSrfs) = RCRic(1:numSrfs)
178459599516SKenneth E. Jansen     &     *exp(-dtRCR(1:numSrfs)*(stepn + alfi)) + PdistCur(1:numSrfs)
178559599516SKenneth E. Jansen      return
178659599516SKenneth E. Jansen      end
178759599516SKenneth E. Jansenc
178859599516SKenneth E. Jansenc ... initialize the influence of the initial conditions for the RCR BC
178959599516SKenneth E. Jansenc
179059599516SKenneth E. Jansen      subroutine calcRCRic(y,srfIdList,numSrfs)
179159599516SKenneth E. Jansen
179259599516SKenneth E. Jansen      use convolRCRFlow    !brings RCRic, ValueListRCR, ValuePdist
179359599516SKenneth E. Jansen
179459599516SKenneth E. Jansen      include "common.h"
179559599516SKenneth E. Jansen
179659599516SKenneth E. Jansen      integer   srfIdList(0:MAXSURF), numSrfs, irankCoupled
179759599516SKenneth E. Jansen      real*8    y(nshg,4) !need velocity and pressure
179859599516SKenneth E. Jansen      real*8    Qini(0:MAXSURF) !initial flow rate
179959599516SKenneth E. Jansen      real*8    PdistIni(0:MAXSURF) !initial distal pressure
180059599516SKenneth E. Jansen      real*8    Pini(0:MAXSURF),CoupleArea(0:MAXSURF) ! initial pressure
180159599516SKenneth E. Jansen      real*8    VelOnly(nshg,3), POnly(nshg)
180259599516SKenneth E. Jansen
180359599516SKenneth E. Jansen      allocate (RCRic(0:MAXSURF))
180459599516SKenneth E. Jansen
180559599516SKenneth E. Jansen      if(lstep.eq.0) then
180659599516SKenneth E. Jansen         VelOnly(:,1:3)=y(:,1:3)
180759599516SKenneth E. Jansen         call GetFlowQ(Qini,VelOnly,srfIdList,numSrfs) !get initial flow
180859599516SKenneth E. Jansen         QHistRCR(1,1:numSrfs)=Qini(1:numSrfs) !initialize QHistRCR
180959599516SKenneth E. Jansen         POnly(:)=y(:,4)        ! pressure
181059599516SKenneth E. Jansen         call integrScalar(Pini,POnly,srfIdList,numSrfs) !get initial pressure integral
181159599516SKenneth E. Jansen         POnly(:)=one           ! one to get area
181259599516SKenneth E. Jansen         call integrScalar(CoupleArea,POnly,srfIdList,numSrfs) !get surf area
181359599516SKenneth E. Jansen         Pini(1:numSrfs) = Pini(1:numSrfs)/CoupleArea(1:numSrfs)
181459599516SKenneth E. Jansen      else
181559599516SKenneth E. Jansen         Qini(1:numSrfs)=QHistRCR(1,1:numSrfs)
181659599516SKenneth E. Jansen         Pini(1:numSrfs)=zero    ! hack
181759599516SKenneth E. Jansen      endif
181859599516SKenneth E. Jansen      call RCRint(istep,PdistIni) !get initial distal P (use istep)
181959599516SKenneth E. Jansen      RCRic(1:numSrfs) = Pini(1:numSrfs)
182059599516SKenneth E. Jansen     &          - ValueListRCR(1,:)*Qini(1:numSrfs)-PdistIni(1:numSrfs)
182159599516SKenneth E. Jansen      return
182259599516SKenneth E. Jansen      end
182359599516SKenneth E. Jansen
182459599516SKenneth E. Jansenc.........function that integrates a scalar over a boundary
182559599516SKenneth E. Jansen      subroutine integrScalar(scalInt,scal,srfIdList,numSrfs)
182659599516SKenneth E. Jansen
182759599516SKenneth E. Jansen      use pvsQbi !brings ndsurf, NASC
182859599516SKenneth E. Jansen
182959599516SKenneth E. Jansen      include "common.h"
183059599516SKenneth E. Jansen      include "mpif.h"
183159599516SKenneth E. Jansen
183259599516SKenneth E. Jansen      integer   srfIdList(0:MAXSURF), numSrfs, irankCoupled, i, k
183359599516SKenneth E. Jansen      real*8    scal(nshg), scalInt(0:MAXSURF), scalIntProc(0:MAXSURF)
183459599516SKenneth E. Jansen
183559599516SKenneth E. Jansen      scalIntProc = zero
183659599516SKenneth E. Jansen      do i = 1,nshg
183759599516SKenneth E. Jansen        if(numSrfs.gt.zero) then
183859599516SKenneth E. Jansen          do k = 1,numSrfs
183959599516SKenneth E. Jansen            irankCoupled = 0
184059599516SKenneth E. Jansen            if (srfIdList(k).eq.ndsurf(i)) then
184159599516SKenneth E. Jansen              irankCoupled=k
184259599516SKenneth E. Jansen              scalIntProc(irankCoupled) = scalIntProc(irankCoupled)
184359599516SKenneth E. Jansen     &                            + NASC(i)*scal(i)
184459599516SKenneth E. Jansen              exit
184559599516SKenneth E. Jansen            endif
184659599516SKenneth E. Jansen          enddo
184759599516SKenneth E. Jansen        endif
184859599516SKenneth E. Jansen      enddo
184959599516SKenneth E. Jansenc
185059599516SKenneth E. Jansenc     at this point, each scalint has its "nodes" contributions to the scalar
185159599516SKenneth E. Jansenc     accumulated into scalIntProc. Note, because NASC is on processor this
185259599516SKenneth E. Jansenc     will NOT be the scalar for the surface yet
185359599516SKenneth E. Jansenc
185459599516SKenneth E. Jansenc.... reduce integrated scalar for each surface, push on scalInt
185559599516SKenneth E. Jansenc
185659599516SKenneth E. Jansen        npars=MAXSURF+1
185759599516SKenneth E. Jansen       call MPI_ALLREDUCE (scalIntProc, scalInt(:), npars,
185859599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
185959599516SKenneth E. Jansen
186059599516SKenneth E. Jansen      return
186159599516SKenneth E. Jansen      end
186259599516SKenneth E. Jansen
1863*9071d3baSCameron Smith      subroutine writeTimingMessage(key,iomode,timing)
1864*9071d3baSCameron Smith      use iso_c_binding
1865*9071d3baSCameron Smith      use phstr
1866*9071d3baSCameron Smith      implicit none
186759599516SKenneth E. Jansen
1868*9071d3baSCameron Smith      character(len=*) :: key
1869*9071d3baSCameron Smith      integer :: iomode
1870*9071d3baSCameron Smith      real*8 :: timing
1871*9071d3baSCameron Smith      character(len=1024) :: timing_msg
1872*9071d3baSCameron Smith      character(len=*), parameter :: streamModeString = c_char_"stream"//c_null_char
1873*9071d3baSCameron Smith      character(len=*), parameter :: fileModeString = c_char_"disk"//c_null_char
187459599516SKenneth E. Jansen
1875*9071d3baSCameron Smith      call phstr_appendStr(timing_msg,key)
1876*9071d3baSCameron Smith      if ( iomode .eq. -1 ) then
1877*9071d3baSCameron Smith        call phstr_appendStr(timing_msg, streamModeString)
1878*9071d3baSCameron Smith      else
1879*9071d3baSCameron Smith        call phstr_appendStr(timing_msg, fileModeString)
1880*9071d3baSCameron Smith      endif
1881*9071d3baSCameron Smith      call phstr_appendStr(timing_msg, c_char_' = ' // c_null_char)
1882*9071d3baSCameron Smith      call phstr_appendDbl(timing_msg, timing)
1883*9071d3baSCameron Smith      write(6,*) timing_msg
1884*9071d3baSCameron Smith      return
1885*9071d3baSCameron Smith      end subroutine
188659599516SKenneth E. Jansen
1887