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