xref: /phasta/phSolver/incompressible/itrdrv.f (revision daa97cf2c2a9d918c8d32e5c219eb6a5750d139b)
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
379071d3baSCameron Smith      use iso_c_binding
3859599516SKenneth E. Jansen
3959599516SKenneth E. Jansenc      use readarrays !reads in uold and acold
4059599516SKenneth E. Jansen
4159599516SKenneth E. Jansen        include "common.h"
4259599516SKenneth E. Jansen        include "mpif.h"
4359599516SKenneth E. Jansen        include "auxmpi.h"
44ae8d68e4SKenneth E. Jansen        include "svLS.h"
4559599516SKenneth E. Jansenc
4659599516SKenneth E. Jansen
4759599516SKenneth E. Jansen
4859599516SKenneth E. Jansen        real*8    y(nshg,ndof),              ac(nshg,ndof),
4959599516SKenneth E. Jansen     &            yold(nshg,ndof),           acold(nshg,ndof),
5059599516SKenneth E. Jansen     &            u(nshg,nsd),               uold(nshg,nsd),
5159599516SKenneth E. Jansen     &            x(numnp,nsd),              solinc(nshg,ndof),
5259599516SKenneth E. Jansen     &            BC(nshg,ndofBC),           tf(nshg,ndof),
5359599516SKenneth E. Jansen     &            GradV(nshg,nsdsq)
5459599516SKenneth E. Jansen
5559599516SKenneth E. Jansenc
5659599516SKenneth E. Jansen        real*8    res(nshg,ndof)
5759599516SKenneth E. Jansenc
5859599516SKenneth E. Jansen        real*8    shp(MAXTOP,maxsh,MAXQPT),
5959599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
6059599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
6159599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
6259599516SKenneth E. Jansenc
6359599516SKenneth E. Jansen        integer   rowp(nshg,nnz),         colm(nshg+1),
6459599516SKenneth E. Jansen     &            iBC(nshg),
6559599516SKenneth E. Jansen     &            ilwork(nlwork),
6659599516SKenneth E. Jansen     &            iper(nshg),            ifuncs(6)
6759599516SKenneth E. Jansen
6859599516SKenneth E. Jansen        real*8 vbc_prof(nshg,3)
6959599516SKenneth E. Jansen
7059599516SKenneth E. Jansen        integer stopjob
7159599516SKenneth E. Jansen        character*10 cname2
7259599516SKenneth E. Jansen        character*5  cname
7359599516SKenneth E. Jansenc
7459599516SKenneth E. Jansenc  stuff for dynamic model s.w.avg and wall model
7559599516SKenneth E. Jansenc
7659599516SKenneth E. Jansen        dimension ifath(numnp),    velbar(nfath,ndof),  nsons(nfath)
7759599516SKenneth E. Jansen
7859599516SKenneth E. Jansen        dimension wallubar(2),walltot(2)
7959599516SKenneth E. Jansenc
80ae8d68e4SKenneth E. Jansenc.... For linear solver Library
8159599516SKenneth E. Jansenc
8259599516SKenneth E. Jansen        integer eqnType, prjFlag, presPrjFlag, verbose
8359599516SKenneth E. Jansenc
8459599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: aperm,  atemp, atempS
8559599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: apermS
8659599516SKenneth E. Jansen
8759599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: lhsP, lhsK, lhsS
8859599516SKenneth E. Jansen        real*8   almit, alfit, gamit
8959599516SKenneth E. Jansenc
9059599516SKenneth E. Jansen        character*1024    servername
9159599516SKenneth E. Jansen        character*20    fname1,fmt1
9259599516SKenneth E. Jansen        character*20    fname2,fmt2
9359599516SKenneth E. Jansen        character*60    fnamepold, fvarts
9459599516SKenneth E. Jansen        character*4     fname4c ! 4 characters
9559599516SKenneth E. Jansen        integer         iarray(50) ! integers for headers
9659599516SKenneth E. Jansen        integer         isgn(ndof), isgng(ndof)
9759599516SKenneth E. Jansen
9859599516SKenneth E. Jansen!MR CHANGE
9959599516SKenneth E. Jansen!        real*8 rerr(nshg,10), ybar(nshg,13) ! including 7 sq. terms with 3 cross terms of uv, uw and vw
10059599516SKenneth E. Jansen!        real*8 rerr(nshg,10), ybar(nshg,12) ! including 7 sq. terms with 3 cross terms of uv, uw and vw
10159599516SKenneth E. Jansen        real*8 rerr(nshg,10)
10259599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: ybar, strain, vorticity
10359599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: wallssVec, wallssVecbar
10459599516SKenneth E. Jansen!MR CHANGE
10559599516SKenneth E. Jansen
10659599516SKenneth E. Jansen        real*8 tcorecp(2), tcorecpscal(2)
10759599516SKenneth E. Jansen
10859599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: ivarts
10959599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: ivartsg
11059599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: iv_rank
11159599516SKenneth E. Jansen        real*8, allocatable, dimension(:) :: vartssoln
11259599516SKenneth E. Jansen        real*8, allocatable, dimension(:) :: vartssolng
11359599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: yphbar
11459599516SKenneth E. Jansen        real*8 CFLworst(numel)
11559599516SKenneth E. Jansen
11659599516SKenneth E. Jansen!MR CHANGE
11759599516SKenneth E. Jansen        integer :: iv_rankpernode, iv_totnodes, iv_totcores
11859599516SKenneth E. Jansen        integer :: iv_node, iv_core, iv_thread
11959599516SKenneth E. Jansen!MR CHANGE
120ae8d68e4SKenneth E. Jansen!--------------------------------------------------------------------
121ae8d68e4SKenneth E. Jansen!     Setting up svLS
122ae8d68e4SKenneth E. Jansen      INTEGER svLS_nFaces, gnNo, nNo, faIn, facenNo
123ae8d68e4SKenneth E. Jansen      INTEGER, ALLOCATABLE :: ltg(:), gNodes(:)
124ae8d68e4SKenneth E. Jansen      REAL*8, ALLOCATABLE :: sV(:,:)
125ae8d68e4SKenneth E. Jansen
126ae8d68e4SKenneth E. Jansen      CHARACTER*128 fileName
127ae8d68e4SKenneth E. Jansen      TYPE(svLS_commuType) communicator
128ae8d68e4SKenneth E. Jansen      TYPE(svLS_lhsType) svLS_lhs
129ae8d68e4SKenneth E. Jansen      TYPE(svLS_lsType) svLS_ls
130436818eeSKenneth E. Jansen! repeat for scalar solve would like to make this an array if possible to handle multiphase better
131436818eeSKenneth E. Jansen! but lets get one working first
132*daa97cf2SKenneth E. Jansen      TYPE(svLS_commuType) communicator_S(4)
133*daa97cf2SKenneth E. Jansen      TYPE(svLS_lhsType) svLS_lhs_S(4)
134*daa97cf2SKenneth E. Jansen      TYPE(svLS_lsType) svLS_ls_S(4)
13559599516SKenneth E. Jansen
13659599516SKenneth E. Jansen        impistat = 0
13759599516SKenneth E. Jansen        impistat2 = 0
13859599516SKenneth E. Jansen        iISend = 0
13959599516SKenneth E. Jansen        iISendScal = 0
14059599516SKenneth E. Jansen        iIRecv = 0
14159599516SKenneth E. Jansen        iIRecvScal = 0
14259599516SKenneth E. Jansen        iWaitAll = 0
14359599516SKenneth E. Jansen        iWaitAllScal = 0
14459599516SKenneth E. Jansen        iAllR = 0
14559599516SKenneth E. Jansen        iAllRScal = 0
14659599516SKenneth E. Jansen        rISend = zero
14759599516SKenneth E. Jansen        rISendScal = zero
14859599516SKenneth E. Jansen        rIRecv = zero
14959599516SKenneth E. Jansen        rIRecvScal = zero
15059599516SKenneth E. Jansen        rWaitAll = zero
15159599516SKenneth E. Jansen        rWaitAllScal = zero
15259599516SKenneth E. Jansen        rAllR = zero
15359599516SKenneth E. Jansen        rAllRScal = zero
15459599516SKenneth E. Jansen        rCommu = zero
15559599516SKenneth E. Jansen        rCommuScal = zero
15659599516SKenneth E. Jansen
15759599516SKenneth E. Jansen        call initmemstat()
15859599516SKenneth E. Jansen
15959599516SKenneth E. Jansenc
16059599516SKenneth E. Jansenc  hack SA variable
16159599516SKenneth E. Jansenc
16259599516SKenneth E. JansencHack        BC(:,7)=BC(:,7)*0.001
16359599516SKenneth E. JansencHack        if(lstep.eq.0) y(:,6)=y(:,6)*0.001
164ae8d68e4SKenneth E. Jansen!--------------------------------------------------------------------
165436818eeSKenneth E. Jansen!     Setting up svLS Moved down for better org
166ae8d68e4SKenneth E. Jansen
167436818eeSKenneth E. Jansen      IF (svLSFlag .EQ. 0) THEN  !When we get a PETSc option it also could block this or a positive leslib
16859599516SKenneth E. Jansen        call SolverLicenseServer(servername)
169ae8d68e4SKenneth E. Jansen      ENDIF
17059599516SKenneth E. Jansenc
17159599516SKenneth E. Jansenc only master should be verbose
17259599516SKenneth E. Jansenc
17359599516SKenneth E. Jansen
17459599516SKenneth E. Jansen        if(numpe.gt.0 .and. myrank.ne.master)iverbose=0
17559599516SKenneth E. Jansenc
17659599516SKenneth E. Jansen
17759599516SKenneth E. Jansen        lskeep=lstep
17859599516SKenneth E. Jansen
17959599516SKenneth E. Jansen        inquire(file='xyzts.dat',exist=exts)
18059599516SKenneth E. Jansen        if(exts) then
18159599516SKenneth E. Jansen
18259599516SKenneth E. Jansen           open(unit=626,file='xyzts.dat',status='old')
18359599516SKenneth E. Jansen           read(626,*) ntspts, freq, tolpt, iterat, varcod
18459599516SKenneth E. Jansen           call sTD             ! sets data structures
18559599516SKenneth E. Jansen
18659599516SKenneth E. Jansen           do jj=1,ntspts       ! read coordinate data where solution desired
18759599516SKenneth E. Jansen              read(626,*) ptts(jj,1),ptts(jj,2),ptts(jj,3)
18859599516SKenneth E. Jansen           enddo
18959599516SKenneth E. Jansen           close(626)
19059599516SKenneth E. Jansen
19159599516SKenneth E. Jansen           statptts(:,:) = 0
19259599516SKenneth E. Jansen           parptts(:,:) = zero
19359599516SKenneth E. Jansen           varts(:,:) = zero
19459599516SKenneth E. Jansen
19559599516SKenneth E. Jansen           allocate (ivarts(ntspts*ndof))
19659599516SKenneth E. Jansen           allocate (ivartsg(ntspts*ndof))
19759599516SKenneth E. Jansen           allocate (iv_rank(ntspts))
19859599516SKenneth E. Jansen           allocate (vartssoln(ntspts*ndof))
19959599516SKenneth E. Jansen           allocate (vartssolng(ntspts*ndof))
20059599516SKenneth E. Jansen
20159599516SKenneth E. Jansen           iv_rankpernode = iv_rankpercore*iv_corepernode
20259599516SKenneth E. Jansen           iv_totnodes = numpe/iv_rankpernode
20359599516SKenneth E. Jansen           iv_totcores = iv_corepernode*iv_totnodes
20459599516SKenneth E. Jansen           if (myrank .eq. 0) then
20559599516SKenneth E. Jansen             write(*,*) 'Info for probes:'
20659599516SKenneth E. Jansen             write(*,*) '  Ranks per core:',iv_rankpercore
20759599516SKenneth E. Jansen             write(*,*) '  Cores per node:',iv_corepernode
20859599516SKenneth E. Jansen             write(*,*) '  Ranks per node:',iv_rankpernode
20959599516SKenneth E. Jansen             write(*,*) '  Total number of nodes:',iv_totnodes
21059599516SKenneth E. Jansen             write(*,*) '  Total number of cores',iv_totcores
21159599516SKenneth E. Jansen           endif
21259599516SKenneth E. Jansen
21359599516SKenneth E. Jansen!           if (myrank .eq. numpe-1) then
21459599516SKenneth E. Jansen            do jj=1,ntspts
21559599516SKenneth E. Jansen
21659599516SKenneth E. Jansen               ! Compute the adequate rank which will take care of probe jj
21759599516SKenneth E. Jansen               jjm1 = jj-1
21859599516SKenneth E. Jansen               iv_node = (iv_totnodes-1)-mod(jjm1,iv_totnodes)
21959599516SKenneth E. Jansen               iv_core = (iv_corepernode-1) - mod((jjm1 -
22059599516SKenneth E. Jansen     &              mod(jjm1,iv_totnodes))/iv_totnodes,iv_corepernode)
22159599516SKenneth E. Jansen               iv_thread = (iv_rankpercore-1) - mod((jjm1-
22259599516SKenneth E. Jansen     &              (mod(jjm1,iv_totcores)))/iv_totcores,iv_rankpercore)
22359599516SKenneth E. Jansen               iv_rank(jj) = iv_node*iv_rankpernode
22459599516SKenneth E. Jansen     &                     + iv_core*iv_rankpercore
22559599516SKenneth E. Jansen     &                     + iv_thread
22659599516SKenneth E. Jansen
22759599516SKenneth E. Jansen               if(myrank == 0) then
22859599516SKenneth E. Jansen                 write(*,*) '  Probe', jj, 'handled by rank',
22959599516SKenneth E. Jansen     &                         iv_rank(jj), ' on node', iv_node
23059599516SKenneth E. Jansen               endif
23159599516SKenneth E. Jansen
23259599516SKenneth E. Jansen               ! Verification just in case
23359599516SKenneth E. Jansen               if(iv_rank(jj) .lt.0 .or. iv_rank(jj) .ge. numpe) then
23459599516SKenneth E. Jansen                 write(*,*) 'WARNING: iv_rank(',jj,') is ', iv_rank(jj),
23559599516SKenneth E. Jansen     &                      ' and reset to numpe-1'
23659599516SKenneth E. Jansen                 iv_rank(jj) = numpe-1
23759599516SKenneth E. Jansen               endif
23859599516SKenneth E. Jansen
23959599516SKenneth E. Jansen               ! Open the varts files
24059599516SKenneth E. Jansen               if(myrank == iv_rank(jj)) then
24159599516SKenneth E. Jansen                 fvarts='varts/varts'
24259599516SKenneth E. Jansen                 fvarts=trim(fvarts)//trim(cname2(jj))
24359599516SKenneth E. Jansen                 fvarts=trim(fvarts)//trim(cname2(lstep))
24459599516SKenneth E. Jansen                 fvarts=trim(fvarts)//'.dat'
24559599516SKenneth E. Jansen                 fvarts=trim(fvarts)
24659599516SKenneth E. Jansen                 open(unit=1000+jj, file=fvarts, status='unknown')
24759599516SKenneth E. Jansen               endif
24859599516SKenneth E. Jansen            enddo
24959599516SKenneth E. Jansen!           endif
25059599516SKenneth E. Jansen
25159599516SKenneth E. Jansen        endif
25259599516SKenneth E. Jansenc
25359599516SKenneth E. Jansenc.... open history and aerodynamic forces files
25459599516SKenneth E. Jansenc
25559599516SKenneth E. Jansen        if (myrank .eq. master) then
256c9a96f21SKenneth E. Jansen           open (unit=ihist,  file=fhist,  status='unknown')
25759599516SKenneth E. Jansen           open (unit=iforce, file=fforce, status='unknown')
25859599516SKenneth E. Jansen           open (unit=76, file="fort.76", status='unknown')
25959599516SKenneth E. Jansen           if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then
26059599516SKenneth E. Jansen              fnamepold = 'pold'
26159599516SKenneth E. Jansen              fnamepold = trim(fnamepold)//trim(cname2(lstep))
26259599516SKenneth E. Jansen              fnamepold = trim(fnamepold)//'.dat'
26359599516SKenneth E. Jansen              fnamepold = trim(fnamepold)
26459599516SKenneth E. Jansen              open (unit=8177, file=fnamepold, status='unknown')
26559599516SKenneth E. Jansen           endif
26659599516SKenneth E. Jansen        endif
26759599516SKenneth E. Jansenc
26859599516SKenneth E. Jansenc.... initialize
26959599516SKenneth E. Jansenc
27059599516SKenneth E. Jansen        ifuncs(:)  = 0              ! func. evaluation counter
27159599516SKenneth E. Jansen        istep  = 0
27259599516SKenneth E. Jansen        yold   = y
27359599516SKenneth E. Jansen        acold  = ac
27459599516SKenneth E. Jansen
27559599516SKenneth E. Jansen        rerr = zero
27659599516SKenneth E. Jansen
27759599516SKenneth E. Jansen        if(ierrcalc.eq.1 .or. ioybar.eq.1) then ! we need ybar for error too
27859599516SKenneth E. Jansen          if (ivort == 1) then
27959599516SKenneth E. Jansen            allocate(ybar(nshg,17)) ! more space for vorticity if requested
28059599516SKenneth E. Jansen          else
28159599516SKenneth E. Jansen            allocate(ybar(nshg,13))
28259599516SKenneth E. Jansen          endif
28359599516SKenneth E. Jansen          ybar = zero ! Initialize ybar to zero, which is essential
28459599516SKenneth E. Jansen        endif
28559599516SKenneth E. Jansen
28659599516SKenneth E. Jansen        if(ivort == 1) then
28759599516SKenneth E. Jansen          allocate(strain(nshg,6))
28859599516SKenneth E. Jansen          allocate(vorticity(nshg,5))
28959599516SKenneth E. Jansen        endif
29059599516SKenneth E. Jansen
29159599516SKenneth E. Jansen        if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
29259599516SKenneth E. Jansen          allocate(wallssVec(nshg,3))
29359599516SKenneth E. Jansen          if (ioybar .eq. 1) then
29459599516SKenneth E. Jansen            allocate(wallssVecbar(nshg,3))
29559599516SKenneth E. Jansen            wallssVecbar = zero ! Initialization important if mean wss computed
29659599516SKenneth E. Jansen          endif
29759599516SKenneth E. Jansen        endif
29859599516SKenneth E. Jansen
29959599516SKenneth E. Jansen! both nstepsincycle and nphasesincycle needs to be set
30059599516SKenneth E. Jansen        if(nstepsincycle.eq.0) nphasesincycle = 0
30159599516SKenneth E. Jansen        if(nphasesincycle.ne.0) then
30259599516SKenneth E. Jansen!     &     allocate(yphbar(nshg,5,nphasesincycle))
30359599516SKenneth E. Jansen          if (ivort == 1) then
30459599516SKenneth E. Jansen            allocate(yphbar(nshg,15,nphasesincycle)) ! more space for vorticity
30559599516SKenneth E. Jansen          else
30659599516SKenneth E. Jansen            allocate(yphbar(nshg,11,nphasesincycle))
30759599516SKenneth E. Jansen          endif
30859599516SKenneth E. Jansen          yphbar = zero
30959599516SKenneth E. Jansen        endif
31059599516SKenneth E. Jansen
31159599516SKenneth E. Jansen!MR CHANGE END
31259599516SKenneth E. Jansen
31359599516SKenneth E. Jansen        vbc_prof(:,1:3) = BC(:,3:5)
31459599516SKenneth E. Jansen        if(iramp.eq.1) then
31559599516SKenneth E. Jansen          call BCprofileInit(vbc_prof,x)
31659599516SKenneth E. Jansen        endif
31759599516SKenneth E. Jansen
31859599516SKenneth E. Jansenc
319ae8d68e4SKenneth E. Jansenc.... ---------------> initialize LesLib Library <---------------
32059599516SKenneth E. Jansenc
32159599516SKenneth E. Jansenc.... assign parameter values
32259599516SKenneth E. Jansenc
32359599516SKenneth E. Jansen        do i = 1, 100
32459599516SKenneth E. Jansen           numeqns(i) = i
32559599516SKenneth E. Jansen        enddo
32659599516SKenneth E. Jansen        nKvecs       = Kspace
32759599516SKenneth E. Jansen        prjFlag      = iprjFlag
32859599516SKenneth E. Jansen        presPrjFlag  = ipresPrjFlag
32959599516SKenneth E. Jansen        verbose      = iverbose
33059599516SKenneth E. Jansenc
33159599516SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve
33259599516SKenneth E. Jansenc
33359599516SKenneth E. Jansen      nsolt=mod(impl(1),2)      ! 1 if solving temperature
33459599516SKenneth E. Jansen      nsclrsol=nsolt+nsclr      ! total number of scalars solved At
33559599516SKenneth E. Jansen                                ! some point we probably want to create
33659599516SKenneth E. Jansen                                ! a map, considering stepseq(), to find
33759599516SKenneth E. Jansen                                ! what is actually solved and only
33859599516SKenneth E. Jansen                                ! dimension lhs to the appropriate
33959599516SKenneth E. Jansen                                ! size. (see 1.6.1 and earlier for a
34059599516SKenneth E. Jansen                                ! "failed" attempt at this).
34159599516SKenneth E. Jansen
34259599516SKenneth E. Jansen
34359599516SKenneth E. Jansen      nsolflow=mod(impl(1),100)/10  ! 1 if solving flow
34459599516SKenneth E. Jansen
34559599516SKenneth E. Jansenc
346ae8d68e4SKenneth E. Jansenc.... Now, call lesNew routine to initialize
34759599516SKenneth E. Jansenc     memory space
34859599516SKenneth E. Jansenc
34959599516SKenneth E. Jansen      call genadj(colm, rowp, icnt )  ! preprocess the adjacency list
35059599516SKenneth E. Jansen
35159599516SKenneth E. Jansen      nnz_tot=icnt ! this is exactly the number of non-zero blocks on
35259599516SKenneth E. Jansen                   ! this proc
35359599516SKenneth E. Jansen
35459599516SKenneth E. Jansen      if (nsolflow.eq.1) then
35559599516SKenneth E. Jansen         lesId   = numeqns(1)
35659599516SKenneth E. Jansen         eqnType = 1
35759599516SKenneth E. Jansen         nDofs   = 4
358ae8d68e4SKenneth E. Jansen
359ae8d68e4SKenneth E. Jansen!--------------------------------------------------------------------
360ae8d68e4SKenneth E. Jansen!     Rest of configuration of svLS is added here, where we have LHS
361ae8d68e4SKenneth E. Jansen!     pointers
362ae8d68e4SKenneth E. Jansen
363ae8d68e4SKenneth E. Jansen         nPermDims = 1
364ae8d68e4SKenneth E. Jansen         nTmpDims = 1
365ae8d68e4SKenneth E. Jansen
366ae8d68e4SKenneth E. Jansen         allocate (lhsP(4,nnz_tot))
367ae8d68e4SKenneth E. Jansen         allocate (lhsK(9,nnz_tot))
368ae8d68e4SKenneth E. Jansen
369436818eeSKenneth E. Jansen!     Setting up svLS or leslib for flow
370436818eeSKenneth E. Jansen
371ae8d68e4SKenneth E. Jansen      IF (svLSFlag .EQ. 1) THEN
372436818eeSKenneth E. Jansen         IF(nPrjs.eq.0) THEN
373436818eeSKenneth E. Jansen           svLSType=2  !GMRES if borrowed ACUSIM projection vectors variable set to zero
374436818eeSKenneth E. Jansen         ELSE
375436818eeSKenneth E. Jansen           svLSType=3 !NS solver
376436818eeSKenneth E. Jansen         ENDIF
377436818eeSKenneth E. Jansen!  reltol for the NSSOLVE is the stop criterion on the outer loop
378436818eeSKenneth E. Jansen!  reltolIn is (eps_GM, eps_CG) from the CompMech paper
379436818eeSKenneth E. Jansen!  for now we are using
380436818eeSKenneth E. Jansen!  Tolerance on ACUSIM Pressure Projection for CG and
381436818eeSKenneth E. Jansen!  Tolerance on Momentum Equations for GMRES
382436818eeSKenneth E. Jansen! also using Kspaceand maxIters from setup for ACUSIM
383436818eeSKenneth E. Jansen!
384436818eeSKenneth E. Jansen         eps_outer=40.0*epstol(1)  !following papers soggestion for now
385436818eeSKenneth E. Jansen         CALL svLS_LS_CREATE(svLS_ls, svLSType, dimKry=Kspace,
386436818eeSKenneth E. Jansen     2      relTol=eps_outer, relTolIn=(/epstol(1),prestol/),
387436818eeSKenneth E. Jansen     3      maxItr=maxIters,
388436818eeSKenneth E. Jansen     4      maxItrIn=(/maxIters,maxIters/))
389436818eeSKenneth E. Jansen
390436818eeSKenneth E. Jansen         CALL svLS_COMMU_CREATE(communicator, MPI_COMM_WORLD)
391436818eeSKenneth E. Jansen
392436818eeSKenneth E. Jansen!  next stuff should is computed for PETSc in this version of code but for 64 bit integers
393436818eeSKenneth E. Jansen!  so have to decide to either change their code to use that (as will be necessary for large
394436818eeSKenneth E. Jansen!  problems) or create it for 32 bit.  Leaving old code until then.
395436818eeSKenneth E. Jansen!
396436818eeSKenneth E. Jansen         IF (numpe .GT. 1) THEN
397436818eeSKenneth E. Jansen            WRITE(fileName,*) myrank
398436818eeSKenneth E. Jansen            fileName = "ltg.dat."//ADJUSTL(TRIM(fileName))
399436818eeSKenneth E. Jansen            OPEN(1,FILE=fileName)
400436818eeSKenneth E. Jansen            READ(1,*) gnNo
401436818eeSKenneth E. Jansen            READ(1,*) nNo
402436818eeSKenneth E. Jansen            ALLOCATE(ltg(nNo))
403436818eeSKenneth E. Jansen            READ(1,*) ltg
404436818eeSKenneth E. Jansen            CLOSE(1)
405436818eeSKenneth E. Jansen         ELSE
406436818eeSKenneth E. Jansen            gnNo = nshg
407436818eeSKenneth E. Jansen            nNo = nshg
408436818eeSKenneth E. Jansen            ALLOCATE(ltg(nNo))
409436818eeSKenneth E. Jansen            DO i=1, nNo
410436818eeSKenneth E. Jansen               ltg(i) = i
411436818eeSKenneth E. Jansen            END DO
412436818eeSKenneth E. Jansen         END IF
413436818eeSKenneth E. Jansenc
414ae8d68e4SKenneth E. Jansen            IF  (ipvsq .GE. 2) THEN
415ae8d68e4SKenneth E. Jansen
416ae8d68e4SKenneth E. Jansen#if((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 1))
417ae8d68e4SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs
418ae8d68e4SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs + numCORSrfs
419ae8d68e4SKenneth E. Jansen#elif((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 0))
420ae8d68e4SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs
421ae8d68e4SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs + numCORSrfs
422ae8d68e4SKenneth E. Jansen#elif((VER_CORONARY == 0)&&(VER_CLOSEDLOOP == 1))
423ae8d68e4SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs
424ae8d68e4SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs
425ae8d68e4SKenneth E. Jansen#else
426ae8d68e4SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs
427ae8d68e4SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs
428ae8d68e4SKenneth E. Jansen#endif
429ae8d68e4SKenneth E. Jansen
430ae8d68e4SKenneth E. Jansen            ELSE
431436818eeSKenneth E. Jansen               svLS_nFaces = 1   !not sure about this...looks like 1 means 0 for array size issues
432ae8d68e4SKenneth E. Jansen            END IF
433ae8d68e4SKenneth E. Jansen
434ae8d68e4SKenneth E. Jansen            CALL svLS_LHS_CREATE(svLS_lhs, communicator, gnNo, nNo,
435ae8d68e4SKenneth E. Jansen     2         nnz_tot, ltg, colm, rowp, svLS_nFaces)
436ae8d68e4SKenneth E. Jansen
437ae8d68e4SKenneth E. Jansen            faIn = 1
438ae8d68e4SKenneth E. Jansen            facenNo = 0
439ae8d68e4SKenneth E. Jansen            DO i=1, nshg
440ae8d68e4SKenneth E. Jansen               IF (IBITS(iBC(i),3,3) .NE. 0)  facenNo = facenNo + 1
441ae8d68e4SKenneth E. Jansen            END DO
442ae8d68e4SKenneth E. Jansen            ALLOCATE(gNodes(facenNo), sV(nsd,facenNo))
443ae8d68e4SKenneth E. Jansen            sV = 0D0
444ae8d68e4SKenneth E. Jansen            j = 0
445ae8d68e4SKenneth E. Jansen            DO i=1, nshg
446ae8d68e4SKenneth E. Jansen               IF (IBITS(iBC(i),3,3) .NE. 0) THEN
447ae8d68e4SKenneth E. Jansen                  j = j + 1
448ae8d68e4SKenneth E. Jansen                  gNodes(j) = i
449ae8d68e4SKenneth E. Jansen                  IF (.NOT.BTEST(iBC(i),3)) sV(1,j) = 1D0
450ae8d68e4SKenneth E. Jansen                  IF (.NOT.BTEST(iBC(i),4)) sV(2,j) = 1D0
451ae8d68e4SKenneth E. Jansen                  IF (.NOT.BTEST(iBC(i),5)) sV(3,j) = 1D0
452ae8d68e4SKenneth E. Jansen               END IF
453ae8d68e4SKenneth E. Jansen            END DO
454ae8d68e4SKenneth E. Jansen            CALL svLS_BC_CREATE(svLS_lhs, faIn, facenNo,
455ae8d68e4SKenneth E. Jansen     2         nsd, BC_TYPE_Dir, gNodes, sV)
456436818eeSKenneth E. Jansen            DEALLOCATE(gNodes)
457436818eeSKenneth E. Jansen            DEALLOCATE(sV)
458ae8d68e4SKenneth E. Jansen
459436818eeSKenneth E. Jansen         ELSE ! leslib solve
460ae8d68e4SKenneth E. Jansen!--------------------------------------------------------------------
46159599516SKenneth E. Jansen           call myfLesNew( lesId,   41994,
46259599516SKenneth E. Jansen     &                 eqnType,
46359599516SKenneth E. Jansen     &                 nDofs,          minIters,       maxIters,
46459599516SKenneth E. Jansen     &                 nKvecs,         prjFlag,        nPrjs,
46559599516SKenneth E. Jansen     &                 presPrjFlag,    nPresPrjs,      epstol(1),
46659599516SKenneth E. Jansen     &                 prestol,        verbose,        statsflow,
46759599516SKenneth E. Jansen     &                 nPermDims,      nTmpDims,      servername  )
46859599516SKenneth E. Jansen
46959599516SKenneth E. Jansen           allocate (aperm(nshg,nPermDims))
47059599516SKenneth E. Jansen           allocate (atemp(nshg,nTmpDims))
47159599516SKenneth E. Jansen           call readLesRestart( lesId,  aperm, nshg, myrank, lstep,
47259599516SKenneth E. Jansen     &                        nPermDims )
473436818eeSKenneth E. Jansen         ENDIF !flow solver selector
47459599516SKenneth E. Jansen
475436818eeSKenneth E. Jansen      else   ! not solving flow just scalar
47659599516SKenneth E. Jansen         nPermDims = 0
47759599516SKenneth E. Jansen         nTempDims = 0
47859599516SKenneth E. Jansen      endif
47959599516SKenneth E. Jansen
48059599516SKenneth E. Jansen
48159599516SKenneth E. Jansen      if(nsclrsol.gt.0) then
48259599516SKenneth E. Jansen       do isolsc=1,nsclrsol
48359599516SKenneth E. Jansen         lesId       = numeqns(isolsc+1)
48459599516SKenneth E. Jansen         eqnType     = 2
48559599516SKenneth E. Jansen         nDofs       = 1
48659599516SKenneth E. Jansen         presPrjflag = 0
48759599516SKenneth E. Jansen         nPresPrjs   = 0
48859599516SKenneth E. Jansen         prjFlag     = 1
48959599516SKenneth E. Jansen         indx=isolsc+2-nsolt ! complicated to keep epstol(2) for
49059599516SKenneth E. Jansen                             ! temperature followed by scalars
491436818eeSKenneth E. Jansen!     Setting up svLS or leslib for scalar
492436818eeSKenneth E. Jansen
493436818eeSKenneth E. Jansen      IF (svLSFlag .EQ. 1) THEN
494436818eeSKenneth E. Jansen           svLSType=2  !only option for scalars
495436818eeSKenneth E. Jansen!  reltol for the GMRES is the stop criterion
496436818eeSKenneth E. Jansen! also using Kspaceand maxIters from setup for ACUSIM
497436818eeSKenneth E. Jansen!
498*daa97cf2SKenneth E. Jansen         CALL svLS_LS_CREATE(svLS_ls_S(isolsc), svLSType, dimKry=Kspace,
499436818eeSKenneth E. Jansen     2      relTol=epstol(indx),
500436818eeSKenneth E. Jansen     3      maxItr=maxIters
501436818eeSKenneth E. Jansen     4      )
502436818eeSKenneth E. Jansen
503*daa97cf2SKenneth E. Jansen         CALL svLS_COMMU_CREATE(communicator_S(isolsc), MPI_COMM_WORLD)
504436818eeSKenneth E. Jansen
505436818eeSKenneth E. Jansen               svLS_nFaces = 1   !not sure about this...should try it with zero
506436818eeSKenneth E. Jansen
507*daa97cf2SKenneth E. Jansen            CALL svLS_LHS_CREATE(svLS_lhs_S(isolsc), communicator_S(isolsc), gnNo, nNo,
508436818eeSKenneth E. Jansen     2         nnz_tot, ltg, colm, rowp, svLS_nFaces)
509436818eeSKenneth E. Jansen
510436818eeSKenneth E. Jansen              faIn = 1
511436818eeSKenneth E. Jansen              facenNo = 0
512436818eeSKenneth E. Jansen              ib=5+isolsc
513436818eeSKenneth E. Jansen              DO i=1, nshg
514436818eeSKenneth E. Jansen                 IF (btest(iBC(i),ib))  facenNo = facenNo + 1
515436818eeSKenneth E. Jansen              END DO
516436818eeSKenneth E. Jansen              ALLOCATE(gNodes(facenNo), sV(1,facenNo))
517436818eeSKenneth E. Jansen              sV = 0D0
518436818eeSKenneth E. Jansen              j = 0
519436818eeSKenneth E. Jansen              DO i=1, nshg
520436818eeSKenneth E. Jansen               IF (btest(iBC(i),ib)) THEN
521436818eeSKenneth E. Jansen                  j = j + 1
522436818eeSKenneth E. Jansen                  gNodes(j) = i
523436818eeSKenneth E. Jansen               END IF
524436818eeSKenneth E. Jansen              END DO
525436818eeSKenneth E. Jansen
526*daa97cf2SKenneth E. Jansen            CALL svLS_BC_CREATE(svLS_lhs_S(isolsc), faIn, facenNo,
527436818eeSKenneth E. Jansen     2         1, BC_TYPE_Dir, gNodes, sV(1,:))
528436818eeSKenneth E. Jansen            DEALLOCATE(gNodes)
529436818eeSKenneth E. Jansen            DEALLOCATE(sV)
530436818eeSKenneth E. Jansen
531436818eeSKenneth E. Jansen            if( isolsc.eq.1) then ! if multiple scalars make sure done once
532436818eeSKenneth E. Jansen              allocate (apermS(1,1,1))
533436818eeSKenneth E. Jansen              allocate (atempS(1,1))  !they can all share this
534436818eeSKenneth E. Jansen            endif
535436818eeSKenneth E. Jansen
536436818eeSKenneth E. Jansen         ELSE ! leslib solve of scalar
537436818eeSKenneth E. Jansen
53859599516SKenneth E. Jansen         call myfLesNew( lesId,            41994,
53959599516SKenneth E. Jansen     &                 eqnType,
54059599516SKenneth E. Jansen     &                 nDofs,          minIters,       maxIters,
54159599516SKenneth E. Jansen     &                 nKvecs,         prjFlag,        nPrjs,
54259599516SKenneth E. Jansen     &                 presPrjFlag,    nPresPrjs,      epstol(indx),
54359599516SKenneth E. Jansen     &                 prestol,        verbose,        statssclr,
54459599516SKenneth E. Jansen     &                 nPermDimsS,     nTmpDimsS,   servername )
545436818eeSKenneth E. Jansen        ENDIF
546436818eeSKenneth E. Jansen       enddo  !loop over scalars to solve  (not yet worked out for multiple svLS solves
547436818eeSKenneth E. Jansen       allocate (lhsS(nnz_tot,nsclrsol))
548436818eeSKenneth E. Jansen       if(svLSFlag.eq.0) then  ! we just prepped scalar solves for leslib so allocate arrays
54959599516SKenneth E. Jansenc
55059599516SKenneth E. Jansenc  Assume all scalars have the same size needs
55159599516SKenneth E. Jansenc
55259599516SKenneth E. Jansen       allocate (apermS(nshg,nPermDimsS,nsclrsol))
55359599516SKenneth E. Jansen       allocate (atempS(nshg,nTmpDimsS))  !they can all share this
554436818eeSKenneth E. Jansen       endif
55559599516SKenneth E. Jansenc
55659599516SKenneth E. Jansenc actually they could even share with atemp but leave that for later
55759599516SKenneth E. Jansenc
558436818eeSKenneth E. Jansen      else !no scalar solves at all so zero dims not used
55959599516SKenneth E. Jansen         nPermDimsS = 0
56059599516SKenneth E. Jansen         nTmpDimsS  = 0
56159599516SKenneth E. Jansen      endif
56259599516SKenneth E. Jansenc
56359599516SKenneth E. Jansenc...  prepare lumped mass if needed
56459599516SKenneth E. Jansenc
56559599516SKenneth E. Jansen      if((flmpr.ne.0).or.(flmpl.ne.0)) call genlmass(x, shp,shgl)
56659599516SKenneth E. Jansenc
56759599516SKenneth E. Jansenc.... -----------------> End of initialization <-----------------
56859599516SKenneth E. Jansenc
56959599516SKenneth E. Jansenc.....open the necessary files to gather time series
57059599516SKenneth E. Jansenc
57159599516SKenneth E. Jansen      lstep0 = lstep+1
57259599516SKenneth E. Jansen      nsteprcr = nstep(1)+lstep
57359599516SKenneth E. Jansenc
57459599516SKenneth E. Jansenc.... loop through the time sequences
57559599516SKenneth E. Jansenc
57659599516SKenneth E. Jansen
57759599516SKenneth E. Jansen
57859599516SKenneth E. Jansen      do 3000 itsq = 1, ntseq
57959599516SKenneth E. Jansen         itseq = itsq
58059599516SKenneth E. Jansen
58159599516SKenneth E. JansenCAD         tcorecp1 = second(0)
58259599516SKenneth E. JansenCAD         tcorewc1 = second(-1)
58359599516SKenneth E. Jansenc
58459599516SKenneth E. Jansenc.... set up the time integration parameters
58559599516SKenneth E. Jansenc
58659599516SKenneth E. Jansen         nstp   = nstep(itseq)
58759599516SKenneth E. Jansen         nitr   = niter(itseq)
58859599516SKenneth E. Jansen         LCtime = loctim(itseq)
58959599516SKenneth E. Jansen         dtol(:)= deltol(itseq,:)
59059599516SKenneth E. Jansen
59159599516SKenneth E. Jansen         call itrSetup ( y, acold )
59259599516SKenneth E. Jansenc
59359599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution,
59459599516SKenneth E. Jansenc   which are functions of alphaf so need to do it after itrSetup
59559599516SKenneth E. Jansen         if(numImpSrfs.gt.zero) then
59659599516SKenneth E. Jansen            call calcImpConvCoef (numImpSrfs, ntimeptpT)
59759599516SKenneth E. Jansen         endif
59859599516SKenneth E. Jansenc
59959599516SKenneth E. Jansenc...initialize the initial condition P(0)-RQ(0)-Pd(0) for RCR BC
60059599516SKenneth E. Jansenc   need ndsurf so should be after initNABI
60159599516SKenneth E. Jansen         if(numRCRSrfs.gt.zero) then
60259599516SKenneth E. Jansen            call calcRCRic(y,nsrflistRCR,numRCRSrfs)
60359599516SKenneth E. Jansen         endif
60459599516SKenneth E. Jansenc
60559599516SKenneth E. Jansenc  find the last solve of the flow in the step sequence so that we will
60659599516SKenneth E. Jansenc         know when we are at/near end of step
60759599516SKenneth E. Jansenc
60859599516SKenneth E. Jansenc         ilast=0
60959599516SKenneth E. Jansen         nitr=0  ! count number of flow solves in a step (# of iterations)
61059599516SKenneth E. Jansen         do i=1,seqsize
61159599516SKenneth E. Jansen            if(stepseq(i).eq.0) nitr=nitr+1
61259599516SKenneth E. Jansen         enddo
61359599516SKenneth E. Jansen
61459599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
61559599516SKenneth E. Jansen         tcorecp(:) = zero ! used in solfar.f (solflow)
61659599516SKenneth E. Jansen         tcorecpscal(:) = zero ! used in solfar.f (solflow)
61759599516SKenneth E. Jansen         if(myrank.eq.0)  then
61859599516SKenneth E. Jansen            tcorecp1 = TMRC()
61959599516SKenneth E. Jansen         endif
62059599516SKenneth E. Jansen
62159599516SKenneth E. Jansenc
62259599516SKenneth E. Jansenc.... loop through the time steps
62359599516SKenneth E. Jansenc
62459599516SKenneth E. Jansen         istop=0
62559599516SKenneth E. Jansen         rmub=datmat(1,2,1)
62659599516SKenneth E. Jansen         if(rmutarget.gt.0) then
62759599516SKenneth E. Jansen            rmue=rmutarget
62859599516SKenneth E. Jansen         else
62959599516SKenneth E. Jansen            rmue=datmat(1,2,1) ! keep constant
63059599516SKenneth E. Jansen         endif
63159599516SKenneth E. Jansen
63259599516SKenneth E. Jansen        if(iramp.eq.1) then
63359599516SKenneth E. Jansen            call BCprofileScale(vbc_prof,BC,yold) ! fix the yold values to the reset BC
63459599516SKenneth E. Jansen            isclr=1 ! fix scalar
63559599516SKenneth E. Jansen            do isclr=1,nsclr
63659599516SKenneth E. Jansen               call itrBCSclr(yold,ac,iBC,BC,iper,ilwork)
63759599516SKenneth E. Jansen            enddo
63859599516SKenneth E. Jansen        endif
63959599516SKenneth E. Jansen
64059599516SKenneth E. Jansen         do 2000 istp = 1, nstp
64159599516SKenneth E. Jansen           if(iramp.eq.1)
64259599516SKenneth E. Jansen     &        call BCprofileScale(vbc_prof,BC,yold)
64359599516SKenneth E. Jansen
64459599516SKenneth E. Jansen           call rerun_check(stopjob)
64532eed141SKenneth E. Jansen           if(myrank.eq.master) write(*,*)
64632eed141SKenneth E. Jansen     &         'stopjob,lstep,istep', stopjob,lstep,istep
64732eed141SKenneth E. Jansen           if(stopjob.eq.lstep) then
64832eed141SKenneth E. Jansen              stopjob=-2 ! this is the code to finish
64932eed141SKenneth E. Jansen             if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then
65032eed141SKenneth E. Jansen                if(myrank.eq.master) write(*,*)
65132eed141SKenneth E. Jansen     &         'line 473 says last step written so exit'
65232eed141SKenneth E. Jansen                goto 2002  ! the step was written last step so just exit
65332eed141SKenneth E. Jansen             else
65432eed141SKenneth E. Jansen                if(myrank.eq.master)
65532eed141SKenneth E. Jansen     &         write(*,*) 'line 473 says last step not written'
65632eed141SKenneth E. Jansen                istep=nstp  ! have to do this so that solution will be written
65732eed141SKenneth E. Jansen                goto 2001
65832eed141SKenneth E. Jansen             endif
65932eed141SKenneth E. Jansen           endif
66059599516SKenneth E. Jansen
66159599516SKenneth E. Jansen            xi=istp*1.0/nstp
66259599516SKenneth E. Jansen            datmat(1,2,1)=rmub*(1.0-xi)+xi*rmue
66359599516SKenneth E. Jansenc            write(*,*) "current mol. visc = ", datmat(1,2,1)
66459599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC.
66559599516SKenneth E. Jansenc     these will be for time step n+1 so use lstep+1
66659599516SKenneth E. Jansenc
66759599516SKenneth E. Jansen            if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl,
66859599516SKenneth E. Jansen     &                               shpb, shglb, x, BC, iBC)
66959599516SKenneth E. Jansen
67059599516SKenneth E. Jansenc
67159599516SKenneth E. Jansenc ... calculate the pressure contribution that depends on the history for the Imp. BC
67259599516SKenneth E. Jansenc
67359599516SKenneth E. Jansen            if(numImpSrfs.gt.0) then
67459599516SKenneth E. Jansen               call pHist(poldImp,QHistImp,ImpConvCoef,
67559599516SKenneth E. Jansen     &                    ntimeptpT,numImpSrfs)
67659599516SKenneth E. Jansen               if (myrank.eq.master)
67759599516SKenneth E. Jansen     &             write(8177,*) (poldImp(n), n=1,numImpSrfs)
67859599516SKenneth E. Jansen            endif
67959599516SKenneth E. Jansenc
68059599516SKenneth E. Jansenc ... calc the pressure contribution that depends on the history for the RCR BC
68159599516SKenneth E. Jansenc
68259599516SKenneth E. Jansen            if(numRCRSrfs.gt.0) then
68359599516SKenneth E. Jansen               call CalcHopRCR (Delt(itseq), lstep, numRCRSrfs)
68459599516SKenneth E. Jansen               call CalcRCRConvCoef(lstep,numRCRSrfs)
68559599516SKenneth E. Jansen               call pHist(poldRCR,QHistRCR,RCRConvCoef,nsteprcr,
68659599516SKenneth E. Jansen     &              numRCRSrfs)
68759599516SKenneth E. Jansen               if (myrank.eq.master)
68859599516SKenneth E. Jansen     &             write(8177,*) (poldRCR(n), n=1,numRCRSrfs)
68959599516SKenneth E. Jansen            endif
69059599516SKenneth E. Jansenc
69159599516SKenneth E. Jansenc Decay of scalars
69259599516SKenneth E. Jansenc
69359599516SKenneth E. Jansen           if(nsclr.gt.0 .and. tdecay.ne.1) then
69459599516SKenneth E. Jansen              yold(:,6:ndof)=y(:,6:ndof)*tdecay
69559599516SKenneth E. Jansen              BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*tdecay
69659599516SKenneth E. Jansen           endif
69759599516SKenneth E. Jansen
69859599516SKenneth E. Jansen           if(nosource.eq.1) BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*0.8
69959599516SKenneth E. Jansen
70059599516SKenneth E. Jansen
70159599516SKenneth E. Jansen            if(iLES.gt.0) then  !complicated stuff has moved to
70259599516SKenneth E. Jansen                                        !routine below
70359599516SKenneth E. Jansen               call lesmodels(yold,  acold,     shgl,      shp,
70459599516SKenneth E. Jansen     &                        iper,  ilwork,    rowp,      colm,
70559599516SKenneth E. Jansen     &                        nsons, ifath,     x,
70659599516SKenneth E. Jansen     &                        iBC,   BC)
70759599516SKenneth E. Jansen
70859599516SKenneth E. Jansen
70959599516SKenneth E. Jansen            endif
71059599516SKenneth E. Jansen
71159599516SKenneth E. Jansenc.... set traction BCs for modeled walls
71259599516SKenneth E. Jansenc
71359599516SKenneth E. Jansen            if (itwmod.ne.0) then
71459599516SKenneth E. Jansen               call asbwmod(yold,   acold,   x,      BC,     iBC,
71559599516SKenneth E. Jansen     &                      iper,   ilwork,  ifath,  velbar)
71659599516SKenneth E. Jansen            endif
71759599516SKenneth E. Jansen
71859599516SKenneth E. Jansen!MR CHANGE
71959599516SKenneth E. Jansenc
72059599516SKenneth E. Jansenc.... Determine whether the vorticity field needs to be computed for this time step or not
72159599516SKenneth E. Jansenc
72259599516SKenneth E. Jansen            icomputevort = 0
72359599516SKenneth E. Jansen            if (ivort == 1) then ! Print vorticity = True in solver.inp
72459599516SKenneth E. Jansen              ! We then compute the vorticity only if we
72559599516SKenneth E. Jansen              ! 1) we write an intermediate checkpoint
72659599516SKenneth E. Jansen              ! 2) we reach the last time step and write the last checkpoint
72759599516SKenneth E. Jansen              ! 3) we accumulate statistics in ybar for every time step
72859599516SKenneth E. Jansen              ! BEWARE: we need here lstep+1 and istep+1 because the lstep and
72959599516SKenneth E. Jansen              ! istep gets incremened after the flowsolve, further below
73059599516SKenneth E. Jansen              if (((irs .ge. 1) .and. (mod(lstep+1, ntout) .eq. 0)) .or.
73159599516SKenneth E. Jansen     &                   istep+1.eq.nstep(itseq) .or. ioybar == 1) then
73259599516SKenneth E. Jansen                icomputevort = 1
73359599516SKenneth E. Jansen              endif
73459599516SKenneth E. Jansen            endif
73559599516SKenneth E. Jansen
73659599516SKenneth E. Jansen!            write(*,*) 'icomputevort: ',icomputevort, ' - istep: ',
73759599516SKenneth E. Jansen!     &                istep,' - nstep(itseq):',nstep(itseq),'- lstep:',
73859599516SKenneth E. Jansen!     &                lstep, '- ntout:', ntout
73959599516SKenneth E. Jansen!MR CHANGE
74059599516SKenneth E. Jansen
74159599516SKenneth E. Jansenc
74259599516SKenneth E. Jansenc.... -----------------------> predictor phase <-----------------------
74359599516SKenneth E. Jansenc
74459599516SKenneth E. Jansen            call itrPredict(yold, y,   acold,  ac ,  uold,  u, iBC)
74559599516SKenneth E. Jansen            call itrBC (y,  ac,  iBC,  BC,  iper,ilwork)
74659599516SKenneth E. Jansen
74759599516SKenneth E. Jansen            if(nsolt.eq.1) then
74859599516SKenneth E. Jansen               isclr=0
74959599516SKenneth E. Jansen               call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
75059599516SKenneth E. Jansen            endif
75159599516SKenneth E. Jansen            do isclr=1,nsclr
75259599516SKenneth E. Jansen               call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
75359599516SKenneth E. Jansen            enddo
75459599516SKenneth E. Jansen            iter=0
75559599516SKenneth E. Jansen            ilss=0  ! this is a switch thrown on first solve of LS redistance
75659599516SKenneth E. Jansen            do istepc=1,seqsize
75759599516SKenneth E. Jansen               icode=stepseq(istepc)
75859599516SKenneth E. Jansen               if(mod(icode,5).eq.0) then ! this is a solve
75959599516SKenneth E. Jansen                  isolve=icode/10
76059599516SKenneth E. Jansen                  if(icode.eq.0) then ! flow solve (encoded as 0)
76159599516SKenneth E. Jansenc
76259599516SKenneth E. Jansen                     iter   = iter+1
76359599516SKenneth E. Jansen                     ifuncs(1)  = ifuncs(1) + 1
76459599516SKenneth E. Jansenc
76559599516SKenneth E. Jansen                     Force(1) = zero
76659599516SKenneth E. Jansen                     Force(2) = zero
76759599516SKenneth E. Jansen                     Force(3) = zero
76859599516SKenneth E. Jansen                     HFlux    = zero
76959599516SKenneth E. Jansen                     lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
77059599516SKenneth E. Jansen
77159599516SKenneth E. Jansen                     call SolFlow(y,          ac,        u,
77259599516SKenneth E. Jansen     &                         yold,          acold,     uold,
77359599516SKenneth E. Jansen     &                         x,             iBC,
77459599516SKenneth E. Jansen     &                         BC,            res,
77559599516SKenneth E. Jansen     &                         nPermDims,     nTmpDims,  aperm,
77659599516SKenneth E. Jansen     &                         atemp,         iper,
77759599516SKenneth E. Jansen     &                         ilwork,        shp,       shgl,
77859599516SKenneth E. Jansen     &                         shpb,          shglb,     rowp,
77959599516SKenneth E. Jansen     &                         colm,          lhsK,      lhsP,
78059599516SKenneth E. Jansen     &                         solinc,        rerr,      tcorecp,
781ae8d68e4SKenneth E. Jansen     &                         GradV,      sumtime,
782ae8d68e4SKenneth E. Jansen     &                         svLS_lhs,     svLS_ls,  svLS_nFaces)
78359599516SKenneth E. Jansen
78459599516SKenneth E. Jansen                  else          ! scalar type solve
78559599516SKenneth E. Jansen                     if (icode.eq.5) then ! Solve for Temperature
78659599516SKenneth E. Jansen                                ! (encoded as (nsclr+1)*10)
78759599516SKenneth E. Jansen                        isclr=0
78859599516SKenneth E. Jansen                        ifuncs(2)  = ifuncs(2) + 1
78959599516SKenneth E. Jansen                        j=1
79059599516SKenneth E. Jansen                     else       ! solve a scalar  (encoded at isclr*10)
79159599516SKenneth E. Jansen                        isclr=isolve
79259599516SKenneth E. Jansen                        ifuncs(isclr+2)  = ifuncs(isclr+2) + 1
79359599516SKenneth E. Jansen                        j=isclr+nsolt
79459599516SKenneth E. Jansen                        if((iLSet.eq.2).and.(ilss.eq.0)
79559599516SKenneth E. Jansen     &                       .and.(isclr.eq.2)) then
79659599516SKenneth E. Jansen                           ilss=1 ! throw switch (once per step)
79759599516SKenneth E. Jansen                           y(:,7)=y(:,6) ! redistance field initialized
79859599516SKenneth E. Jansen                           ac(:,7)   = zero
79959599516SKenneth E. Jansen                           call itrBCSclr (  y,  ac,  iBC,  BC, iper,
80059599516SKenneth E. Jansen     &                          ilwork)
80159599516SKenneth E. Jansenc
80259599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the
80359599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar
80459599516SKenneth E. Jansenc
80559599516SKenneth E. Jansen                           alfit=alfi
80659599516SKenneth E. Jansen                           gamit=gami
80759599516SKenneth E. Jansen                           almit=almi
80859599516SKenneth E. Jansen                           Deltt=Delt(1)
80959599516SKenneth E. Jansen                           Dtglt=Dtgl
81059599516SKenneth E. Jansen                           alfi = 1
81159599516SKenneth E. Jansen                           gami = 1
81259599516SKenneth E. Jansen                           almi = 1
81359599516SKenneth E. Jansenc     Delt(1)= Deltt ! Give a pseudo time step
81459599516SKenneth E. Jansen                           Dtgl = one / Delt(1)
81559599516SKenneth E. Jansen                        endif  ! level set eq. 2
81659599516SKenneth E. Jansen                     endif ! deciding between temperature and scalar
81759599516SKenneth E. Jansen
81859599516SKenneth E. Jansen                     lhs = 1 - min(1,mod(ifuncs(isclr+2)-1,
81959599516SKenneth E. Jansen     &                                   LHSupd(isclr+2)))
82059599516SKenneth E. Jansen
82159599516SKenneth E. Jansen                     call SolSclr(y,          ac,        u,
82259599516SKenneth E. Jansen     &                         yold,          acold,     uold,
82359599516SKenneth E. Jansen     &                         x,             iBC,
82459599516SKenneth E. Jansen     &                         BC,            nPermDimsS,nTmpDimsS,
82559599516SKenneth E. Jansen     &                         apermS(1,1,j), atempS,    iper,
82659599516SKenneth E. Jansen     &                         ilwork,        shp,       shgl,
82759599516SKenneth E. Jansen     &                         shpb,          shglb,     rowp,
82859599516SKenneth E. Jansen     &                         colm,          lhsS(1,j),
829436818eeSKenneth E. Jansen     &                         solinc(1,isclr+5), tcorecpscal,
830*daa97cf2SKenneth E. Jansen     &                         svLS_lhs_S(isclr),   svLS_ls_S(isclr), svls_nfaces)
83159599516SKenneth E. Jansen
83259599516SKenneth E. Jansen
83359599516SKenneth E. Jansen                  endif         ! end of scalar type solve
83459599516SKenneth E. Jansen
83559599516SKenneth E. Jansen               else ! this is an update  (mod did not equal zero)
83659599516SKenneth E. Jansen                  iupdate=icode/10  ! what to update
83759599516SKenneth E. Jansen                  if(icode.eq.1) then !update flow
83859599516SKenneth E. Jansen                     call itrCorrect ( y,    ac,    u,   solinc, iBC)
83959599516SKenneth E. Jansen                     call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
84059599516SKenneth E. Jansen                  else  ! update scalar
84159599516SKenneth E. Jansen                     isclr=iupdate  !unless
84259599516SKenneth E. Jansen                     if(icode.eq.6) isclr=0
84359599516SKenneth E. Jansen                     if(iRANS.lt.-100)then  ! RANS
84459599516SKenneth E. Jansen                        call itrCorrectSclrPos(y,ac,solinc(1,isclr+5))
84559599516SKenneth E. Jansen                     else
84659599516SKenneth E. Jansen                        call itrCorrectSclr (y, ac, solinc(1,isclr+5))
84759599516SKenneth E. Jansen                     endif
84859599516SKenneth E. Jansen                     if (ilset.eq.2 .and. isclr.eq.2)  then
84959599516SKenneth E. Jansen                        if (ivconstraint .eq. 1) then
85059599516SKenneth E. Jansen                           call itrBCSclr (  y,  ac,  iBC,  BC, iper,
85159599516SKenneth E. Jansen     &                          ilwork)
85259599516SKenneth E. Jansenc
85359599516SKenneth E. Jansenc ... applying the volume constraint on second level set scalar
85459599516SKenneth E. Jansenc
85559599516SKenneth E. Jansen                           call solvecon (y,    x,      iBC,  BC,
85659599516SKenneth E. Jansen     &                          iper, ilwork, shp,  shgl)
85759599516SKenneth E. Jansenc
85859599516SKenneth E. Jansen                        endif   ! end of volume constraint calculations
85959599516SKenneth E. Jansen                     endif      ! end of redistance calculations
86059599516SKenneth E. Jansenc
86159599516SKenneth E. Jansen                        call itrBCSclr (  y,  ac,  iBC,  BC, iper,
86259599516SKenneth E. Jansen     &                       ilwork)
86359599516SKenneth E. Jansen                     endif      ! end of flow or scalar update
86459599516SKenneth E. Jansen                  endif         ! end of switch between solve or update
86559599516SKenneth E. Jansen               enddo            ! loop over sequence in step
86659599516SKenneth E. Jansenc
86759599516SKenneth E. Jansenc
86859599516SKenneth E. Jansenc.... obtain the time average statistics
86959599516SKenneth E. Jansenc
87059599516SKenneth E. Jansen            if (ioform .eq. 2) then
87159599516SKenneth E. Jansen
87259599516SKenneth E. Jansen               call stsGetStats( y,      yold,     ac,     acold,
87359599516SKenneth E. Jansen     &                           u,      uold,     x,
87459599516SKenneth E. Jansen     &                           shp,    shgl,     shpb,   shglb,
87559599516SKenneth E. Jansen     &                           iBC,    BC,       iper,   ilwork,
87659599516SKenneth E. Jansen     &                           rowp,   colm,     lhsK,   lhsP )
87759599516SKenneth E. Jansen            endif
87859599516SKenneth E. Jansen
87959599516SKenneth E. Jansenc
88059599516SKenneth E. Jansenc  Find the solution at the end of the timestep and move it to old
88159599516SKenneth E. Jansenc
88259599516SKenneth E. Jansenc
88359599516SKenneth E. Jansenc ...First to reassign the parameters for the original time integrator scheme
88459599516SKenneth E. Jansenc
88559599516SKenneth E. Jansen            if((iLSet.eq.2).and.(ilss.eq.1)) then
88659599516SKenneth E. Jansen               alfi =alfit
88759599516SKenneth E. Jansen               gami =gamit
88859599516SKenneth E. Jansen               almi =almit
88959599516SKenneth E. Jansen               Delt(1)=Deltt
89059599516SKenneth E. Jansen               Dtgl =Dtglt
89159599516SKenneth E. Jansen            endif
89259599516SKenneth E. Jansen            call itrUpdate( yold,  acold,   uold,  y,    ac,   u)
89359599516SKenneth E. Jansen            call itrBC (yold, acold,  iBC,  BC,  iper,ilwork)
89459599516SKenneth E. Jansen
89559599516SKenneth E. Jansen            istep = istep + 1
89659599516SKenneth E. Jansen            lstep = lstep + 1
89759599516SKenneth E. Jansenc
89859599516SKenneth E. Jansenc ..  Print memory consumption on BGQ
89959599516SKenneth E. Jansenc
90059599516SKenneth E. Jansen            call printmeminfo("itrdrv"//char(0))
90159599516SKenneth E. Jansen
90259599516SKenneth E. Jansenc
90359599516SKenneth E. Jansenc ..  Compute vorticity
90459599516SKenneth E. Jansenc
90559599516SKenneth E. Jansen            if ( icomputevort == 1) then
90659599516SKenneth E. Jansen
90759599516SKenneth E. Jansen              ! vorticity components and magnitude
90859599516SKenneth E. Jansen              vorticity(:,1) = GradV(:,8)-GradV(:,6) !omega_x
90959599516SKenneth E. Jansen              vorticity(:,2) = GradV(:,3)-GradV(:,7) !omega_y
91059599516SKenneth E. Jansen              vorticity(:,3) = GradV(:,4)-GradV(:,2) !omega_z
91159599516SKenneth E. Jansen              vorticity(:,4) = sqrt(   vorticity(:,1)*vorticity(:,1)
91259599516SKenneth E. Jansen     &                               + vorticity(:,2)*vorticity(:,2)
91359599516SKenneth E. Jansen     &                               + vorticity(:,3)*vorticity(:,3) )
91459599516SKenneth E. Jansen              ! Q
91559599516SKenneth E. Jansen              strain(:,1) = GradV(:,1)                  !S11
91659599516SKenneth E. Jansen              strain(:,2) = 0.5*(GradV(:,2)+GradV(:,4)) !S12
91759599516SKenneth E. Jansen              strain(:,3) = 0.5*(GradV(:,3)+GradV(:,7)) !S13
91859599516SKenneth E. Jansen              strain(:,4) = GradV(:,5)                  !S22
91959599516SKenneth E. Jansen              strain(:,5) = 0.5*(GradV(:,6)+GradV(:,8)) !S23
92059599516SKenneth E. Jansen              strain(:,6) = GradV(:,9)                  !S33
92159599516SKenneth E. Jansen
92259599516SKenneth E. Jansen              vorticity(:,5) = 0.25*( vorticity(:,4)*vorticity(:,4)  !Q
92359599516SKenneth E. Jansen     &                            - 2.0*(      strain(:,1)*strain(:,1)
92459599516SKenneth E. Jansen     &                                    + 2* strain(:,2)*strain(:,2)
92559599516SKenneth E. Jansen     &                                    + 2* strain(:,3)*strain(:,3)
92659599516SKenneth E. Jansen     &                                    +    strain(:,4)*strain(:,4)
92759599516SKenneth E. Jansen     &                                    + 2* strain(:,5)*strain(:,5)
92859599516SKenneth E. Jansen     &                                    +    strain(:,6)*strain(:,6)))
92959599516SKenneth E. Jansen
93059599516SKenneth E. Jansen            endif
93159599516SKenneth E. Jansenc
932f32d06b0SKenneth E. Jansenc .. write out the instantaneous solution
93359599516SKenneth E. Jansenc
93432eed141SKenneth E. Jansen2001    continue  ! we could get here by 2001 label if user requested stop
93559599516SKenneth E. Jansen        if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or.
93659599516SKenneth E. Jansen     &      istep.eq.nstep(itseq)) then
93732eed141SKenneth E. Jansen
93832eed141SKenneth E. Jansen!so that we can see progress in force file close it so that it flushes
93932eed141SKenneth E. Jansen!and  then reopen in append mode
94032eed141SKenneth E. Jansen
94132eed141SKenneth E. Jansen           close(iforce)
94232eed141SKenneth E. Jansen           open (unit=iforce, file=fforce, position='append')
94359599516SKenneth E. Jansen
94459599516SKenneth E. Jansen!              Call to restar() will open restart file in write mode (and not append mode)
94559599516SKenneth E. Jansen!              that is needed as other fields are written in append mode
94632eed141SKenneth E. Jansen
94759599516SKenneth E. Jansen           call restar ('out ',  yold  ,ac)
94859599516SKenneth E. Jansen           if(ideformwall == 1) then
9494c3261e2SCameron Smith             if(myrank.eq.master) then
9504c3261e2SCameron Smith               write(*,*) 'ideformwall is 1 and is a dead code path... exiting'
9514c3261e2SCameron Smith             endif
9524c3261e2SCameron Smith             stop
95359599516SKenneth E. Jansen           endif
95459599516SKenneth E. Jansen
95559599516SKenneth E. Jansen           if(ivort == 1) then
95659599516SKenneth E. Jansen             call write_field(myrank,'a','vorticity',9,vorticity,
95759599516SKenneth E. Jansen     &                       'd',nshg,5,lstep)
95859599516SKenneth E. Jansen           endif
95959599516SKenneth E. Jansen
96059599516SKenneth E. Jansen           call printmeminfo("itrdrv after checkpoint"//char(0))
96132eed141SKenneth E. Jansen         else if(stopjob.eq.-2) then
96232eed141SKenneth E. Jansen           if(myrank.eq.master) then
96332eed141SKenneth E. Jansen             write(*,*) 'line 755 says no write before stopping'
96432eed141SKenneth E. Jansen             write(*,*) 'istep,nstep,irs',istep,nstep(itseq),irs
96559599516SKenneth E. Jansen           endif
966f32d06b0SKenneth E. Jansen        endif  !just the instantaneous stuff for videos
96732eed141SKenneth E. Jansenc
96832eed141SKenneth E. Jansenc.... compute the consistent boundary flux
96932eed141SKenneth E. Jansenc
97032eed141SKenneth E. Jansen            if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
97132eed141SKenneth E. Jansen               call Bflux ( yold,      acold,      uold,    x,
97232eed141SKenneth E. Jansen     &                      shp,       shgl,       shpb,
97332eed141SKenneth E. Jansen     &                      shglb,     ilwork,     iBC,
97432eed141SKenneth E. Jansen     &                      BC,        iper,       wallssVec)
97532eed141SKenneth E. Jansen            endif
97632eed141SKenneth E. Jansen
97732eed141SKenneth E. Jansen           if(stopjob.eq.-2) goto 2003
97832eed141SKenneth E. Jansen
97959599516SKenneth E. Jansen
98059599516SKenneth E. Jansenc
98159599516SKenneth E. Jansenc ... update the flow history for the impedance convolution, filter it and write it out
98259599516SKenneth E. Jansenc
98359599516SKenneth E. Jansen            if(numImpSrfs.gt.zero) then
98459599516SKenneth E. Jansen               call UpdHistConv(y,nsrflistImp,numImpSrfs) !uses Delt(1)
98559599516SKenneth E. Jansen            endif
98659599516SKenneth E. Jansen
98759599516SKenneth E. Jansenc
98859599516SKenneth E. Jansenc ... update the flow history for the RCR convolution
98959599516SKenneth E. Jansenc
99059599516SKenneth E. Jansen            if(numRCRSrfs.gt.zero) then
99159599516SKenneth E. Jansen               call UpdHistConv(y,nsrflistRCR,numRCRSrfs) !uses lstep
99259599516SKenneth E. Jansen            endif
99359599516SKenneth E. Jansen
99459599516SKenneth E. Jansen
99559599516SKenneth E. Jansenc...  dump TIME SERIES
99659599516SKenneth E. Jansen
99759599516SKenneth E. Jansen            if (exts) then
99859599516SKenneth E. Jansen               if (mod(lstep-1,freq).eq.0) then
99959599516SKenneth E. Jansen
100059599516SKenneth E. Jansen                  if (numpe > 1) then
100159599516SKenneth E. Jansen                     do jj = 1, ntspts
100259599516SKenneth E. Jansen                        vartssoln((jj-1)*ndof+1:jj*ndof)=varts(jj,:)
100359599516SKenneth E. Jansen                        ivarts=zero
100459599516SKenneth E. Jansen                     enddo
100559599516SKenneth E. Jansen                     do k=1,ndof*ntspts
100659599516SKenneth E. Jansen                        if(vartssoln(k).ne.zero) ivarts(k)=1
100759599516SKenneth E. Jansen                     enddo
100859599516SKenneth E. Jansen
100959599516SKenneth E. Jansen!                     call MPI_REDUCE(vartssoln, vartssolng, ndof*ntspts,
101059599516SKenneth E. Jansen!     &                    MPI_DOUBLE_PRECISION, MPI_SUM, master,
101159599516SKenneth E. Jansen!     &                    MPI_COMM_WORLD, ierr)
101259599516SKenneth E. Jansen
101359599516SKenneth E. Jansen                     call MPI_BARRIER(MPI_COMM_WORLD, ierr)
101459599516SKenneth E. Jansen                     call MPI_ALLREDUCE(vartssoln, vartssolng,
101559599516SKenneth E. Jansen     &                    ndof*ntspts,
101659599516SKenneth E. Jansen     &                    MPI_DOUBLE_PRECISION, MPI_SUM,
101759599516SKenneth E. Jansen     &                    MPI_COMM_WORLD, ierr)
101859599516SKenneth E. Jansen
101959599516SKenneth E. Jansen!                     call MPI_REDUCE(ivarts, ivartsg, ndof*ntspts,
102059599516SKenneth E. Jansen!     &                    MPI_INTEGER, MPI_SUM, master,
102159599516SKenneth E. Jansen!     &                    MPI_COMM_WORLD, ierr)
102259599516SKenneth E. Jansen
102359599516SKenneth E. Jansen                     call MPI_BARRIER(MPI_COMM_WORLD, ierr)
102459599516SKenneth E. Jansen                     call MPI_ALLREDUCE(ivarts, ivartsg, ndof*ntspts,
102559599516SKenneth E. Jansen     &                    MPI_INTEGER, MPI_SUM,
102659599516SKenneth E. Jansen     &                    MPI_COMM_WORLD, ierr)
102759599516SKenneth E. Jansen
102859599516SKenneth E. Jansen!                     if (myrank.eq.zero) then
102959599516SKenneth E. Jansen                     do jj = 1, ntspts
103059599516SKenneth E. Jansen
103159599516SKenneth E. Jansen                        if(myrank .eq. iv_rank(jj)) then
103259599516SKenneth E. Jansen                           ! No need to update all varts components, only the one treated by the expected rank
103359599516SKenneth E. Jansen                           ! Note: keep varts as a vector, as multiple probes could be treated by one rank
103459599516SKenneth E. Jansen                           indxvarts = (jj-1)*ndof
103559599516SKenneth E. Jansen                           do k=1,ndof
103659599516SKenneth E. Jansen                              if(ivartsg(indxvarts+k).ne.0) then ! none of the vartssoln(parts) were non zero
103759599516SKenneth E. Jansen                                 varts(jj,k)=vartssolng(indxvarts+k)/
103859599516SKenneth E. Jansen     &                                             ivartsg(indxvarts+k)
103959599516SKenneth E. Jansen                              endif
104059599516SKenneth E. Jansen                           enddo
104159599516SKenneth E. Jansen                       endif !only if myrank eq iv_rank(jj)
104259599516SKenneth E. Jansen                     enddo
104359599516SKenneth E. Jansen!                     endif !only on master
104459599516SKenneth E. Jansen                  endif !only if numpe > 1
104559599516SKenneth E. Jansen
104659599516SKenneth E. Jansen!                  if (myrank.eq.zero) then
104759599516SKenneth E. Jansen                  do jj = 1, ntspts
104859599516SKenneth E. Jansen                     if(myrank .eq. iv_rank(jj)) then
104959599516SKenneth E. Jansen                        ifile = 1000+jj
105059599516SKenneth E. Jansen                        write(ifile,555) lstep, (varts(jj,k),k=1,ndof) !Beware of format 555 - check ndof
105159599516SKenneth E. Jansenc                        call flush(ifile)
105259599516SKenneth E. Jansen                        if (((irs .ge. 1) .and.
105359599516SKenneth E. Jansen     &                       (mod(lstep, ntout) .eq. 0))) then
105459599516SKenneth E. Jansen                           close(ifile)
105559599516SKenneth E. Jansen                           fvarts='varts/varts'
105659599516SKenneth E. Jansen                           fvarts=trim(fvarts)//trim(cname2(jj))
105759599516SKenneth E. Jansen                           fvarts=trim(fvarts)//trim(cname2(lskeep))
105859599516SKenneth E. Jansen                           fvarts=trim(fvarts)//'.dat'
105959599516SKenneth E. Jansen                           fvarts=trim(fvarts)
106059599516SKenneth E. Jansen                           open(unit=ifile, file=fvarts,
106159599516SKenneth E. Jansen     &                          position='append')
106259599516SKenneth E. Jansen                        endif !only when dumping restart
106359599516SKenneth E. Jansen                     endif
106459599516SKenneth E. Jansen                  enddo
106559599516SKenneth E. Jansen!                  endif !only on master
106659599516SKenneth E. Jansen
106759599516SKenneth E. Jansen                  varts(:,:) = zero ! reset the array for next step
106859599516SKenneth E. Jansen
106959599516SKenneth E. Jansen
107059599516SKenneth E. Jansen!555              format(i6,5(2x,E12.5e2))
107159599516SKenneth E. Jansen555               format(i6,6(2x,E20.12e2)) !assuming ndof = 6 here
107259599516SKenneth E. Jansen
107359599516SKenneth E. Jansen               endif
107459599516SKenneth E. Jansen            endif
107559599516SKenneth E. Jansen
107659599516SKenneth E. Jansenc
107759599516SKenneth E. Jansenc.... update and the aerodynamic forces
107859599516SKenneth E. Jansenc
107959599516SKenneth E. Jansen            call forces ( yold,  ilwork )
108059599516SKenneth E. Jansen
108159599516SKenneth E. Jansen            if((irscale.ge.0).or.(itwmod.gt.0))
108259599516SKenneth E. Jansen     &           call getvel (yold,     ilwork, iBC,
108359599516SKenneth E. Jansen     &                        nsons,    ifath, velbar)
108459599516SKenneth E. Jansen
108559599516SKenneth E. Jansen            if((irscale.ge.0).and.(myrank.eq.master)) then
108659599516SKenneth E. Jansen               call genscale(yold,       x,       iper,
108759599516SKenneth E. Jansen     &                       iBC,     ifath,   velbar,
108859599516SKenneth E. Jansen     &                       nsons)
108959599516SKenneth E. Jansen            endif
109059599516SKenneth E. Jansenc
109159599516SKenneth E. Jansenc....  print out results.
109259599516SKenneth E. Jansenc
109359599516SKenneth E. Jansen            ntoutv=max(ntout,100)   ! velb is not needed so often
109459599516SKenneth E. Jansen            if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then
109559599516SKenneth E. Jansen               if( (mod(lstep, ntoutv) .eq. 0) .and.
109659599516SKenneth E. Jansen     &              ((irscale.ge.0).or.(itwmod.gt.0) .or.
109759599516SKenneth E. Jansen     &              ((nsonmax.eq.1).and.(iLES.gt.0))))
109859599516SKenneth E. Jansen     &              call rwvelb  ('out ',  velbar  ,ifail)
109959599516SKenneth E. Jansen            endif
110059599516SKenneth E. Jansenc
110159599516SKenneth E. Jansenc.... end of the NSTEP and NTSEQ loops
110259599516SKenneth E. Jansenc
110359599516SKenneth E. Jansen
110459599516SKenneth E. Jansen
110559599516SKenneth E. Jansenc
110659599516SKenneth E. Jansenc.... -------------------> error calculation  <-----------------
110759599516SKenneth E. Jansenc
110859599516SKenneth E. Jansen            if(ierrcalc.eq.1 .or. ioybar.eq.1) then
110959599516SKenneth E. Jansenc$$$c
111059599516SKenneth E. Jansenc$$$c compute average
111159599516SKenneth E. Jansenc$$$c
111259599516SKenneth E. Jansenc$$$               tfact=one/istep
111359599516SKenneth E. Jansenc$$$               ybar =tfact*yold + (one-tfact)*ybar
111459599516SKenneth E. Jansen
111559599516SKenneth E. Jansenc compute average
111659599516SKenneth E. Jansenc ybar(:,1:3) are average velocity components
111759599516SKenneth E. Jansenc ybar(:,4) is average pressure
111859599516SKenneth E. Jansenc ybar(:,5) is average speed
111959599516SKenneth E. Jansenc ybar(:,6:8) is average of sq. of each vel. component
112059599516SKenneth E. Jansenc ybar(:,9) is average of sq. of pressure
112159599516SKenneth E. Jansenc ybar(:,10:12) is average of cross vel. components : uv, uw and vw
112259599516SKenneth E. Jansenc averaging procedure justified only for identical time step sizes
112359599516SKenneth E. Jansenc ybar(:,13) is average of eddy viscosity
112459599516SKenneth E. Jansenc ybar(:,14:16) is average vorticity components
112559599516SKenneth E. Jansenc ybar(:,17) is average vorticity magnitude
112659599516SKenneth E. Jansenc istep is number of time step
112759599516SKenneth E. Jansenc
112859599516SKenneth E. Jansen               icollectybar = 0
112959599516SKenneth E. Jansen          if(nphasesincycle.eq.0 .or.
113059599516SKenneth E. Jansen     &            istep.gt.ncycles_startphaseavg*nstepsincycle) then
113159599516SKenneth E. Jansen                 icollectybar = 1
113259599516SKenneth E. Jansen                  if((istep-1).eq.ncycles_startphaseavg*nstepsincycle)
113359599516SKenneth E. Jansen     &               istepsinybar = 0 ! init. to zero in first cycle in avg.
113459599516SKenneth E. Jansen               endif
113559599516SKenneth E. Jansen
113659599516SKenneth E. Jansen               if(icollectybar.eq.1) then
113759599516SKenneth E. Jansen                  istepsinybar = istepsinybar+1
113859599516SKenneth E. Jansen                  tfact=one/istepsinybar
113959599516SKenneth E. Jansen
114059599516SKenneth E. Jansen                  if(myrank.eq.master .and. nphasesincycle.ne.0 .and.
114159599516SKenneth E. Jansen     &               mod((istep-1),nstepsincycle).eq.0)
114259599516SKenneth E. Jansen     &               write(*,*)'nsamples in phase average:',istepsinybar
114359599516SKenneth E. Jansen
114459599516SKenneth E. Jansenc ybar to contain the averaged ((u,v,w),p)-fields
114559599516SKenneth E. Jansenc and speed average, i.e., sqrt(u^2+v^2+w^2)
114659599516SKenneth E. Jansenc and avg. of sq. terms including
114759599516SKenneth E. Jansenc u^2, v^2, w^2, p^2 and cross terms of uv, uw and vw
114859599516SKenneth E. Jansen
114959599516SKenneth E. Jansen                  ybar(:,1) = tfact*yold(:,1) + (one-tfact)*ybar(:,1)
115059599516SKenneth E. Jansen                  ybar(:,2) = tfact*yold(:,2) + (one-tfact)*ybar(:,2)
115159599516SKenneth E. Jansen                  ybar(:,3) = tfact*yold(:,3) + (one-tfact)*ybar(:,3)
115259599516SKenneth E. Jansen                  ybar(:,4) = tfact*yold(:,4) + (one-tfact)*ybar(:,4)
115359599516SKenneth E. Jansen                  ybar(:,5) = tfact*sqrt(yold(:,1)**2+yold(:,2)**2+
115459599516SKenneth E. Jansen     &                        yold(:,3)**2) + (one-tfact)*ybar(:,5)
115559599516SKenneth E. Jansen                  ybar(:,6) = tfact*yold(:,1)**2 +
115659599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,6)
115759599516SKenneth E. Jansen                  ybar(:,7) = tfact*yold(:,2)**2 +
115859599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,7)
115959599516SKenneth E. Jansen                  ybar(:,8) = tfact*yold(:,3)**2 +
116059599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,8)
116159599516SKenneth E. Jansen                  ybar(:,9) = tfact*yold(:,4)**2 +
116259599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,9)
116359599516SKenneth E. Jansen                  ybar(:,10) = tfact*yold(:,1)*yold(:,2) + !uv
116459599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,10)
116559599516SKenneth E. Jansen                  ybar(:,11) = tfact*yold(:,1)*yold(:,3) + !uw
116659599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,11)
116759599516SKenneth E. Jansen                  ybar(:,12) = tfact*yold(:,2)*yold(:,3) + !vw
116859599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,12)
116959599516SKenneth E. Jansen!MR CHANGE
117059599516SKenneth E. Jansen                  if(nsclr.gt.0) !nut
117159599516SKenneth E. Jansen     &             ybar(:,13) = tfact*yold(:,6) + (one-tfact)*ybar(:,13)
117259599516SKenneth E. Jansen
117359599516SKenneth E. Jansen                  if(ivort == 1) then !vorticity
117459599516SKenneth E. Jansen                    ybar(:,14) = tfact*vorticity(:,1) +
117559599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,14)
117659599516SKenneth E. Jansen                    ybar(:,15) = tfact*vorticity(:,2) +
117759599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,15)
117859599516SKenneth E. Jansen                    ybar(:,16) = tfact*vorticity(:,3) +
117959599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,16)
118059599516SKenneth E. Jansen                    ybar(:,17) = tfact*vorticity(:,4) +
118159599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,17)
118259599516SKenneth E. Jansen                  endif
118359599516SKenneth E. Jansen
118459599516SKenneth E. Jansen                  if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
118559599516SKenneth E. Jansen                    wallssVecBar(:,1) = tfact*wallssVec(:,1)
118659599516SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,1)
118759599516SKenneth E. Jansen                    wallssVecBar(:,2) = tfact*wallssVec(:,2)
118859599516SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,2)
118959599516SKenneth E. Jansen                    wallssVecBar(:,3) = tfact*wallssVec(:,3)
119059599516SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,3)
119159599516SKenneth E. Jansen                  endif
119259599516SKenneth E. Jansen!MR CHANGE END
119359599516SKenneth E. Jansen               endif
119459599516SKenneth E. Jansenc
119559599516SKenneth E. Jansenc compute phase average
119659599516SKenneth E. Jansenc
119759599516SKenneth E. Jansen               if(nphasesincycle.ne.0 .and.
119859599516SKenneth E. Jansen     &            istep.gt.ncycles_startphaseavg*nstepsincycle) then
119959599516SKenneth E. Jansen
120059599516SKenneth E. Jansenc beginning of cycle is considered as ncycles_startphaseavg*nstepsincycle+1
120159599516SKenneth E. Jansen                  if((istep-1).eq.ncycles_startphaseavg*nstepsincycle)
120259599516SKenneth E. Jansen     &               icyclesinavg = 0 ! init. to zero in first cycle in avg.
120359599516SKenneth E. Jansen
120459599516SKenneth E. Jansen                  ! find number of steps between phases
120559599516SKenneth E. Jansen                  nstepsbtwphase = nstepsincycle/nphasesincycle ! integer value
120659599516SKenneth E. Jansen                  if(mod(istep-1,nstepsincycle).eq.0) then
120759599516SKenneth E. Jansen                     iphase = 1 ! init. to one in beginning of every cycle
120859599516SKenneth E. Jansen                     icyclesinavg = icyclesinavg + 1
120959599516SKenneth E. Jansen                  endif
121059599516SKenneth E. Jansen
121159599516SKenneth E. Jansen                  icollectphase = 0
121259599516SKenneth E. Jansen                  istepincycle = mod(istep,nstepsincycle)
121359599516SKenneth E. Jansen                  if(istepincycle.eq.0) istepincycle=nstepsincycle
121459599516SKenneth E. Jansen                  if(istepincycle.eq.iphase*nstepsbtwphase) then
121559599516SKenneth E. Jansen                     icollectphase = 1
121659599516SKenneth E. Jansen                     iphase = iphase+1 ! use 'iphase-1' below
121759599516SKenneth E. Jansen                  endif
121859599516SKenneth E. Jansen
121959599516SKenneth E. Jansen                  if(icollectphase.eq.1) then
122059599516SKenneth E. Jansen                     tfactphase = one/icyclesinavg
122159599516SKenneth E. Jansen
122259599516SKenneth E. Jansen                     if(myrank.eq.master) then
122359599516SKenneth E. Jansen                       write(*,*) 'nsamples in phase ',iphase-1,': ',
122459599516SKenneth E. Jansen     &                             icyclesinavg
122559599516SKenneth E. Jansen                     endif
122659599516SKenneth E. Jansen
122759599516SKenneth E. Jansen                     yphbar(:,1,iphase-1) = tfactphase*yold(:,1) +
122859599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,1,iphase-1)
122959599516SKenneth E. Jansen                     yphbar(:,2,iphase-1) = tfactphase*yold(:,2) +
123059599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,2,iphase-1)
123159599516SKenneth E. Jansen                     yphbar(:,3,iphase-1) = tfactphase*yold(:,3) +
123259599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,3,iphase-1)
123359599516SKenneth E. Jansen                     yphbar(:,4,iphase-1) = tfactphase*yold(:,4) +
123459599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,4,iphase-1)
123559599516SKenneth E. Jansen                     yphbar(:,5,iphase-1) = tfactphase*sqrt(yold(:,1)**2
123659599516SKenneth E. Jansen     &                          +yold(:,2)**2+yold(:,3)**2) +
123759599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,5,iphase-1)
123859599516SKenneth E. Jansen!MR CHANGE
123959599516SKenneth E. Jansen                     yphbar(:,6,iphase-1) =
124059599516SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,1)
124159599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,6,iphase-1)
124259599516SKenneth E. Jansen
124359599516SKenneth E. Jansen                     yphbar(:,7,iphase-1) =
124459599516SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,2)
124559599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,7,iphase-1)
124659599516SKenneth E. Jansen
124759599516SKenneth E. Jansen                     yphbar(:,8,iphase-1) =
124859599516SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,3)
124959599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,8,iphase-1)
125059599516SKenneth E. Jansen
125159599516SKenneth E. Jansen                     yphbar(:,9,iphase-1) =
125259599516SKenneth E. Jansen     &                              tfactphase*yold(:,2)*yold(:,2)
125359599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,9,iphase-1)
125459599516SKenneth E. Jansen
125559599516SKenneth E. Jansen                     yphbar(:,10,iphase-1) =
125659599516SKenneth E. Jansen     &                              tfactphase*yold(:,2)*yold(:,3)
125759599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,10,iphase-1)
125859599516SKenneth E. Jansen
125959599516SKenneth E. Jansen                     yphbar(:,11,iphase-1) =
126059599516SKenneth E. Jansen     &                              tfactphase*yold(:,3)*yold(:,3)
126159599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,11,iphase-1)
126259599516SKenneth E. Jansen
126359599516SKenneth E. Jansen                     if(ivort == 1) then
126459599516SKenneth E. Jansen                       yphbar(:,12,iphase-1) =
126559599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,1)
126659599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,12,iphase-1)
126759599516SKenneth E. Jansen                       yphbar(:,13,iphase-1) =
126859599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,2)
126959599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,13,iphase-1)
127059599516SKenneth E. Jansen                       yphbar(:,14,iphase-1) =
127159599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,3)
127259599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,14,iphase-1)
127359599516SKenneth E. Jansen                       yphbar(:,15,iphase-1) =
127459599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,4)
127559599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,15,iphase-1)
127659599516SKenneth E. Jansen                    endif
127759599516SKenneth E. Jansen!MR CHANGE END
127859599516SKenneth E. Jansen                  endif
127959599516SKenneth E. Jansen               endif
128059599516SKenneth E. Jansenc
128159599516SKenneth E. Jansenc compute rms
128259599516SKenneth E. Jansenc
128359599516SKenneth E. Jansen               if(icollectybar.eq.1) then
128459599516SKenneth E. Jansen                  rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2
128559599516SKenneth E. Jansen                  rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2
128659599516SKenneth E. Jansen                  rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2
128759599516SKenneth E. Jansen                  rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2
128859599516SKenneth E. Jansen               endif
128959599516SKenneth E. Jansen            endif
129032eed141SKenneth E. Jansen 2003       continue ! we get here if stopjob equals lstep and this jumped over
129132eed141SKenneth E. Jansen!           the statistics computation because we have no new data to average in
129232eed141SKenneth E. Jansen!           rather we are just trying to output the last state that was not already
129332eed141SKenneth E. Jansen!           written
129432eed141SKenneth E. Jansenc
129532eed141SKenneth E. Jansenc.... ---------------------->  Complete Restart  Processing  <----------------------
129632eed141SKenneth E. Jansenc
129732eed141SKenneth E. Jansen!   for now it is the same frequency but need to change this
129832eed141SKenneth E. Jansen!   soon.... but don't forget to change the field counter in
129932eed141SKenneth E. Jansen!  new_interface.cc
130032eed141SKenneth E. Jansen!
130132eed141SKenneth E. Jansen        if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or.
130232eed141SKenneth E. Jansen     &      istep.eq.nstep(itseq)) then
130332eed141SKenneth E. Jansen          if ((irs .ge. 1) .and. ((mod(lstep, ntout) .ne. 0) .or.
130432eed141SKenneth E. Jansen     &         (nstp .eq. 0))) then
130532eed141SKenneth E. Jansen             if(
130632eed141SKenneth E. Jansen     &          ((irscale.ge.0).or.(itwmod.gt.0) .or.
130732eed141SKenneth E. Jansen     &          ((nsonmax.eq.1).and.iLES.gt.0)))
130832eed141SKenneth E. Jansen     &          call rwvelb  ('out ',  velbar  ,ifail)
130932eed141SKenneth E. Jansen          endif
131059599516SKenneth E. Jansen
131132eed141SKenneth E. Jansen          lesId   = numeqns(1)
131232eed141SKenneth E. Jansen          if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
131332eed141SKenneth E. Jansen          if(myrank.eq.0)  then
131432eed141SKenneth E. Jansen            tcormr1 = TMRC()
131532eed141SKenneth E. Jansen          endif
1316efb88323SKenneth E. Jansen          if((nsolflow.eq.1).and.(ipresPrjFlag.eq.1)) then
131732eed141SKenneth E. Jansen           call saveLesRestart( lesId,  aperm , nshg, myrank, lstep,
131832eed141SKenneth E. Jansen     &                    nPermDims )
131932eed141SKenneth E. Jansen           if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
132032eed141SKenneth E. Jansen           if(myrank.eq.0)  then
132132eed141SKenneth E. Jansen            tcormr2 = TMRC()
132232eed141SKenneth E. Jansen            write(6,*) 'call saveLesRestart for projection and'//
132332eed141SKenneth E. Jansen     &           'pressure projection vectors', tcormr2-tcormr1
132432eed141SKenneth E. Jansen           endif
1325c9a96f21SKenneth E. Jansen          endif
132632eed141SKenneth E. Jansen
132732eed141SKenneth E. Jansen          if(ierrcalc.eq.1) then
132832eed141SKenneth E. Jansenc
132932eed141SKenneth E. Jansenc.....smooth the error indicators
133032eed141SKenneth E. Jansenc
133132eed141SKenneth E. Jansen            do i=1,ierrsmooth
133232eed141SKenneth E. Jansen              call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC )
133332eed141SKenneth E. Jansen            end do
133432eed141SKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
133532eed141SKenneth E. Jansen            if(myrank.eq.0)  then
133632eed141SKenneth E. Jansen              tcormr1 = TMRC()
133732eed141SKenneth E. Jansen            endif
133832eed141SKenneth E. Jansen            call write_error(myrank, lstep, nshg, 10, rerr )
133932eed141SKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
134032eed141SKenneth E. Jansen            if(myrank.eq.0)  then
134132eed141SKenneth E. Jansen              tcormr2 = TMRC()
134232eed141SKenneth E. Jansen              write(6,*) 'Time to write the error fields to the disks',
134332eed141SKenneth E. Jansen     &            tcormr2-tcormr1
134432eed141SKenneth E. Jansen            endif
134532eed141SKenneth E. Jansen          endif ! ierrcalc
134632eed141SKenneth E. Jansen
134732eed141SKenneth E. Jansen          if(ioybar.eq.1) then
134832eed141SKenneth E. Jansen            if(ivort == 1) then
134932eed141SKenneth E. Jansen              call write_field(myrank,'a','ybar',4,
135032eed141SKenneth E. Jansen     &                  ybar,'d',nshg,17,lstep)
135132eed141SKenneth E. Jansen            else
135232eed141SKenneth E. Jansen              call write_field(myrank,'a','ybar',4,
135332eed141SKenneth E. Jansen     &                ybar,'d',nshg,13,lstep)
135432eed141SKenneth E. Jansen            endif
135532eed141SKenneth E. Jansen
135632eed141SKenneth E. Jansen            if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
135732eed141SKenneth E. Jansen              call write_field(myrank,'a','wssbar',6,
135832eed141SKenneth E. Jansen     &             wallssVecBar,'d',nshg,3,lstep)
135932eed141SKenneth E. Jansen            endif
136032eed141SKenneth E. Jansen
136132eed141SKenneth E. Jansen            if(nphasesincycle .gt. 0) then
136232eed141SKenneth E. Jansen              if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
136332eed141SKenneth E. Jansen              if(myrank.eq.0)  then
136432eed141SKenneth E. Jansen                tcormr1 = TMRC()
136532eed141SKenneth E. Jansen              endif
136632eed141SKenneth E. Jansen              do iphase=1,nphasesincycle
136732eed141SKenneth E. Jansen                if(ivort == 1) then
136832eed141SKenneth E. Jansen                 call write_phavg2(myrank,'a','phase_average',13,iphase,
136932eed141SKenneth E. Jansen     &              nphasesincycle,yphbar(:,:,iphase),'d',nshg,15,lstep)
137032eed141SKenneth E. Jansen                else
137132eed141SKenneth E. Jansen                 call write_phavg2(myrank,'a','phase_average',13,iphase,
137232eed141SKenneth E. Jansen     &              nphasesincycle,yphbar(:,:,iphase),'d',nshg,11,lstep)
137332eed141SKenneth E. Jansen                endif
137432eed141SKenneth E. Jansen              end do
137532eed141SKenneth E. Jansen              if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
137632eed141SKenneth E. Jansen              if(myrank.eq.0)  then
137732eed141SKenneth E. Jansen                tcormr2 = TMRC()
137832eed141SKenneth E. Jansen                write(6,*) 'write all phase avg to the disks = ',
137932eed141SKenneth E. Jansen     &                tcormr2-tcormr1
138032eed141SKenneth E. Jansen              endif
138132eed141SKenneth E. Jansen            endif !nphasesincyle
138232eed141SKenneth E. Jansen          endif !ioybar
138332eed141SKenneth E. Jansen
138432eed141SKenneth E. Jansen          if ( ( ihessian .eq. 1 ) .and. ( numpe < 2 )  )then
138532eed141SKenneth E. Jansen            uhess = zero
138632eed141SKenneth E. Jansen            gradu = zero
138732eed141SKenneth E. Jansen            tf = zero
138832eed141SKenneth E. Jansen
138932eed141SKenneth E. Jansen            do ku=1,nshg
139032eed141SKenneth E. Jansen              tf(ku,1) = x(ku,1)**3
139132eed141SKenneth E. Jansen            end do
139232eed141SKenneth E. Jansen            call hessian( yold, x,     shp,  shgl,   iBC,
139332eed141SKenneth E. Jansen     &              shpb, shglb, iper, ilwork, uhess, gradu )
139432eed141SKenneth E. Jansen
139532eed141SKenneth E. Jansen            call write_hessian( uhess, gradu, nshg )
139632eed141SKenneth E. Jansen          endif
139732eed141SKenneth E. Jansen
139832eed141SKenneth E. Jansen          if(iRANS.lt.0) then
139932eed141SKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
140032eed141SKenneth E. Jansen            if(myrank.eq.0)  then
140132eed141SKenneth E. Jansen              tcormr1 = TMRC()
140232eed141SKenneth E. Jansen            endif
140332eed141SKenneth E. Jansen            call write_field(myrank,'a','dwal',4,d2wall,'d',
140432eed141SKenneth E. Jansen     &                       nshg,1,lstep)
140532eed141SKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
140632eed141SKenneth E. Jansen            if(myrank.eq.0)  then
140732eed141SKenneth E. Jansen              tcormr2 = TMRC()
140832eed141SKenneth E. Jansen              write(6,*) 'Time to write dwal to the disks = ',
140932eed141SKenneth E. Jansen     &        tcormr2-tcormr1
141032eed141SKenneth E. Jansen            endif
141132eed141SKenneth E. Jansen          endif !iRANS
141232eed141SKenneth E. Jansen
141332eed141SKenneth E. Jansen        endif ! write out complete restart state
141432eed141SKenneth E. Jansen        !next 2 lines are two ways to end early
141532eed141SKenneth E. Jansen        if(stopjob.eq.-2) goto 2002
141632eed141SKenneth E. Jansen        if(istop.eq.1000) goto 2002 ! stop when delta small (see rstatic)
141759599516SKenneth E. Jansen 2000 continue
141832eed141SKenneth E. Jansen 2002 continue
141932eed141SKenneth E. Jansen
1420f32d06b0SKenneth E. Jansen! done with time stepping so deallocate fields already written
142132eed141SKenneth E. Jansen!
142232eed141SKenneth E. Jansen          if(ioybar.eq.1) then
142332eed141SKenneth E. Jansen            deallocate(ybar)
142432eed141SKenneth E. Jansen            if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
142532eed141SKenneth E. Jansen              deallocate(wallssVecbar)
142632eed141SKenneth E. Jansen            endif
142732eed141SKenneth E. Jansen            if(nphasesincycle .gt. 0) then
142832eed141SKenneth E. Jansen              deallocate(yphbar)
142932eed141SKenneth E. Jansen            endif !nphasesincyle
143032eed141SKenneth E. Jansen          endif !ioybar
143132eed141SKenneth E. Jansen          if(ivort == 1) then
143232eed141SKenneth E. Jansen            deallocate(strain,vorticity)
143332eed141SKenneth E. Jansen          endif
143432eed141SKenneth E. Jansen          if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
143532eed141SKenneth E. Jansen            deallocate(wallssVec)
143632eed141SKenneth E. Jansen          endif
143732eed141SKenneth E. Jansen          if(iRANS.lt.0) then
143832eed141SKenneth E. Jansen            deallocate(d2wall)
143932eed141SKenneth E. Jansen          endif
144059599516SKenneth E. Jansen
144159599516SKenneth E. Jansen
144259599516SKenneth E. JansenCAD         tcorecp2 = second(0)
144359599516SKenneth E. JansenCAD         tcorewc2 = second(-1)
144459599516SKenneth E. Jansen
144559599516SKenneth E. JansenCAD         write(6,*) 'T(core) cpu-wallclock = ',tcorecp2-tcorecp1,
144659599516SKenneth E. JansenCAD     &                                        tcorewc2-tcorewc1
144759599516SKenneth E. Jansen
144859599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
144959599516SKenneth E. Jansen         if(myrank.eq.0)  then
145059599516SKenneth E. Jansen            tcorecp2 = TMRC()
145159599516SKenneth E. Jansen             write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1
145259599516SKenneth E. Jansen             write(6,*) '(Elm. form.',tcorecp(1),
145359599516SKenneth E. Jansen     &                    ',Lin. alg. sol.',tcorecp(2),')'
145459599516SKenneth E. Jansen             write(6,*) '(Elm. form. Scal.',tcorecpscal(1),
145559599516SKenneth E. Jansen     &                   ',Lin. alg. sol. Scal.',tcorecpscal(2),')'
145659599516SKenneth E. Jansen             write(6,*) ''
145759599516SKenneth E. Jansen
145859599516SKenneth E. Jansen         endif
145959599516SKenneth E. Jansen
146059599516SKenneth E. Jansen         call print_system_stats(tcorecp, tcorecpscal)
146159599516SKenneth E. Jansen         call print_mesh_stats()
146259599516SKenneth E. Jansen         call print_mpi_stats()
146359599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
146459599516SKenneth E. Jansen!         return
146559599516SKenneth E. Jansenc         call MPI_Finalize()
146659599516SKenneth E. Jansenc         call MPI_ABORT(MPI_COMM_WORLD, ierr)
146759599516SKenneth E. Jansen
146859599516SKenneth E. Jansen 3000 continue
146959599516SKenneth E. Jansen
147059599516SKenneth E. Jansen
147159599516SKenneth E. Jansenc
147259599516SKenneth E. Jansenc.... close history and aerodynamic forces files
147359599516SKenneth E. Jansenc
147459599516SKenneth E. Jansen      if (myrank .eq. master) then
147559599516SKenneth E. Jansen!         close (ihist)
147659599516SKenneth E. Jansen         close (iforce)
147759599516SKenneth E. Jansen         close(76)
147859599516SKenneth E. Jansen         if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then
147959599516SKenneth E. Jansen            close (8177)
148059599516SKenneth E. Jansen         endif
148159599516SKenneth E. Jansen      endif
148259599516SKenneth E. Jansenc
148359599516SKenneth E. Jansenc.... close varts file for probes
148459599516SKenneth E. Jansenc
148559599516SKenneth E. Jansen      if(exts) then
148659599516SKenneth E. Jansen        do jj=1,ntspts
148759599516SKenneth E. Jansen          if (myrank == iv_rank(jj)) then
148859599516SKenneth E. Jansen            close(1000+jj)
148959599516SKenneth E. Jansen          endif
149059599516SKenneth E. Jansen        enddo
149159599516SKenneth E. Jansen        deallocate (ivarts)
149259599516SKenneth E. Jansen        deallocate (ivartsg)
149359599516SKenneth E. Jansen        deallocate (iv_rank)
149459599516SKenneth E. Jansen        deallocate (vartssoln)
149559599516SKenneth E. Jansen        deallocate (vartssolng)
149659599516SKenneth E. Jansen      endif
149759599516SKenneth E. Jansen
149859599516SKenneth E. Jansen!MR CHANGE
149959599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
150059599516SKenneth E. Jansen      if(myrank.eq.0)  then
150159599516SKenneth E. Jansen          write(*,*) 'itrdrv - done with aerodynamic forces'
150259599516SKenneth E. Jansen      endif
150359599516SKenneth E. Jansen!MR CHANGE
150459599516SKenneth E. Jansen
150559599516SKenneth E. Jansen      do isrf = 0,MAXSURF
150659599516SKenneth E. Jansen!        if ( nsrflist(isrf).ne.0 ) then
150759599516SKenneth E. Jansen        if ( nsrflist(isrf).ne.0 .and.
150859599516SKenneth E. Jansen     &                     myrank.eq.irankfilesforce(isrf)) then
150959599516SKenneth E. Jansen          iunit=60+isrf
151059599516SKenneth E. Jansen          close(iunit)
151159599516SKenneth E. Jansen        endif
151259599516SKenneth E. Jansen      enddo
151359599516SKenneth E. Jansen
151459599516SKenneth E. Jansen!MR CHANGE
151559599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
151659599516SKenneth E. Jansen      if(myrank.eq.0)  then
151759599516SKenneth E. Jansen          write(*,*) 'itrdrv - done with MAXSURF'
151859599516SKenneth E. Jansen      endif
151959599516SKenneth E. Jansen!MR CHANGE
152059599516SKenneth E. Jansen
152159599516SKenneth E. Jansen
152259599516SKenneth E. Jansen 5    format(1X,F15.10,3X,F15.10,3X,F15.10,3X,F15.10)
152359599516SKenneth E. Jansen 444  format(6(2x,e14.7))
152459599516SKenneth E. Jansenc
152559599516SKenneth E. Jansenc.... end
152659599516SKenneth E. Jansenc
152759599516SKenneth E. Jansen      if(nsolflow.eq.1) then
152859599516SKenneth E. Jansen         deallocate (lhsK)
152959599516SKenneth E. Jansen         deallocate (lhsP)
1530ae8d68e4SKenneth E. Jansen         IF (svLSFlag .NE. 1) THEN
153159599516SKenneth E. Jansen         deallocate (aperm)
153259599516SKenneth E. Jansen         deallocate (atemp)
1533ae8d68e4SKenneth E. Jansen         ENDIF
153459599516SKenneth E. Jansen      endif
153559599516SKenneth E. Jansen      if(nsclrsol.gt.0) then
153659599516SKenneth E. Jansen         deallocate (lhsS)
153759599516SKenneth E. Jansen         deallocate (apermS)
153859599516SKenneth E. Jansen         deallocate (atempS)
153959599516SKenneth E. Jansen      endif
154059599516SKenneth E. Jansen
154159599516SKenneth E. Jansen      if(iabc==1) deallocate(acs)
154259599516SKenneth E. Jansen
154359599516SKenneth E. Jansen!MR CHANGE
154459599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
154559599516SKenneth E. Jansen      if(myrank.eq.0)  then
154659599516SKenneth E. Jansen          write(*,*) 'itrdrv - done - BACK TO process.f'
154759599516SKenneth E. Jansen      endif
154859599516SKenneth E. Jansen!MR CHANGE
154959599516SKenneth E. Jansen
155059599516SKenneth E. Jansen
155159599516SKenneth E. Jansen
155259599516SKenneth E. Jansen      return
155359599516SKenneth E. Jansen      end
155459599516SKenneth E. Jansen
155559599516SKenneth E. Jansen      subroutine lesmodels(y,     ac,        shgl,      shp,
155659599516SKenneth E. Jansen     &                     iper,  ilwork,    rowp,      colm,
155759599516SKenneth E. Jansen     &                     nsons, ifath,     x,
155859599516SKenneth E. Jansen     &                     iBC,   BC)
155959599516SKenneth E. Jansen
156059599516SKenneth E. Jansen      include "common.h"
156159599516SKenneth E. Jansen
156259599516SKenneth E. Jansen      real*8    y(nshg,ndof),              ac(nshg,ndof),
156359599516SKenneth E. Jansen     &            x(numnp,nsd),
156459599516SKenneth E. Jansen     &            BC(nshg,ndofBC)
156559599516SKenneth E. Jansen      real*8    shp(MAXTOP,maxsh,MAXQPT),
156659599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT)
156759599516SKenneth E. Jansen
156859599516SKenneth E. Jansenc
156959599516SKenneth E. Jansen      integer   rowp(nshg,nnz),         colm(nshg+1),
157059599516SKenneth E. Jansen     &            iBC(nshg),
157159599516SKenneth E. Jansen     &            ilwork(nlwork),
157259599516SKenneth E. Jansen     &            iper(nshg)
157359599516SKenneth E. Jansen      dimension ifath(numnp),    nsons(nfath)
157459599516SKenneth E. Jansen
157559599516SKenneth E. Jansen      real*8, allocatable, dimension(:) :: fwr2,fwr3,fwr4
157659599516SKenneth E. Jansen      real*8, allocatable, dimension(:) :: stabdis,cdelsq1
157759599516SKenneth E. Jansen      real*8, allocatable, dimension(:,:) :: xavegt, xavegt2,xavegt3
157859599516SKenneth E. Jansen
157959599516SKenneth E. Jansen      if( (iLES.gt.1) )   then ! Allocate Stuff for advanced LES models
158059599516SKenneth E. Jansen         allocate (fwr2(nshg))
158159599516SKenneth E. Jansen         allocate (fwr3(nshg))
158259599516SKenneth E. Jansen         allocate (fwr4(nshg))
158359599516SKenneth E. Jansen         allocate (xavegt(nfath,12))
158459599516SKenneth E. Jansen         allocate (xavegt2(nfath,12))
158559599516SKenneth E. Jansen         allocate (xavegt3(nfath,12))
158659599516SKenneth E. Jansen         allocate (stabdis(nfath))
158759599516SKenneth E. Jansen      endif
158859599516SKenneth E. Jansen
158959599516SKenneth E. Jansenc.... get dynamic model coefficient
159059599516SKenneth E. Jansenc
159159599516SKenneth E. Jansen      ilesmod=iLES/10
159259599516SKenneth E. Jansenc
159359599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model
159459599516SKenneth E. Jansenc
159559599516SKenneth E. Jansen      if (ilesmod.eq.0) then    ! 0 < iLES< 10 => dyn. model calculated
159659599516SKenneth E. Jansen                                ! at nodes based on discrete filtering
159759599516SKenneth E. Jansen
159859599516SKenneth E. Jansen
159959599516SKenneth E. Jansen         if(isubmod.eq.2) then
160059599516SKenneth E. Jansen            call SUPGdis(y,      ac,        shgl,      shp,
160159599516SKenneth E. Jansen     &                   iper,   ilwork,
160259599516SKenneth E. Jansen     &                   nsons,  ifath,     x,
160359599516SKenneth E. Jansen     &                   iBC,    BC, stabdis, xavegt3)
160459599516SKenneth E. Jansen         endif
160559599516SKenneth E. Jansen
160659599516SKenneth E. Jansen         if( ((isubmod.eq.0).or.(isubmod.eq.2)))then ! If no
160759599516SKenneth E. Jansen                                                     ! sub-model
160859599516SKenneth E. Jansen                                                     ! or SUPG
160959599516SKenneth E. Jansen                                                     ! model wanted
161059599516SKenneth E. Jansen
161159599516SKenneth E. Jansen            if(i2filt.eq.0)then ! If simple filter
161259599516SKenneth E. Jansen
161359599516SKenneth E. Jansen               if(modlstats .eq. 0) then ! If no model stats wanted
161459599516SKenneth E. Jansen                  call getdmc (y,       shgl,      shp,
161559599516SKenneth E. Jansen     &                         iper,       ilwork,    nsons,
161659599516SKenneth E. Jansen     &                         ifath,      x)
161759599516SKenneth E. Jansen               else             ! else get model stats
161859599516SKenneth E. Jansen                  call stdfdmc (y,       shgl,      shp,
161959599516SKenneth E. Jansen     &                          iper,       ilwork,    nsons,
162059599516SKenneth E. Jansen     &                          ifath,      x)
162159599516SKenneth E. Jansen               endif            ! end of stats if statement
162259599516SKenneth E. Jansen
162359599516SKenneth E. Jansen            else                ! else if twice filtering
162459599516SKenneth E. Jansen
162559599516SKenneth E. Jansen               call widefdmc(y,       shgl,      shp,
162659599516SKenneth E. Jansen     &                       iper,       ilwork,    nsons,
162759599516SKenneth E. Jansen     &                       ifath,      x)
162859599516SKenneth E. Jansen
162959599516SKenneth E. Jansen
163059599516SKenneth E. Jansen            endif               ! end of simple filter if statement
163159599516SKenneth E. Jansen
163259599516SKenneth E. Jansen         endif                  ! end of SUPG or no sub-model if statement
163359599516SKenneth E. Jansen
163459599516SKenneth E. Jansen
163559599516SKenneth E. Jansen         if( (isubmod.eq.1) ) then ! If DFWR sub-model wanted
163659599516SKenneth E. Jansen            call cdelBHsq (y,       shgl,      shp,
163759599516SKenneth E. Jansen     &                     iper,       ilwork,    nsons,
163859599516SKenneth E. Jansen     &                     ifath,      x,         cdelsq1)
163959599516SKenneth E. Jansen            call FiltRat (y,       shgl,      shp,
164059599516SKenneth E. Jansen     &                    iper,       ilwork,    nsons,
164159599516SKenneth E. Jansen     &                    ifath,      x,         cdelsq1,
164259599516SKenneth E. Jansen     &                    fwr4,       fwr3)
164359599516SKenneth E. Jansen
164459599516SKenneth E. Jansen
164559599516SKenneth E. Jansen            if (i2filt.eq.0) then ! If simple filter wanted
164659599516SKenneth E. Jansen               call DFWRsfdmc(y,       shgl,      shp,
164759599516SKenneth E. Jansen     &                        iper,       ilwork,    nsons,
164859599516SKenneth E. Jansen     &                        ifath,      x,         fwr2, fwr3)
164959599516SKenneth E. Jansen            else                ! else if twice filtering wanted
165059599516SKenneth E. Jansen               call DFWRwfdmc(y,       shgl,      shp,
165159599516SKenneth E. Jansen     &                        iper,       ilwork,    nsons,
165259599516SKenneth E. Jansen     &                        ifath,      x,         fwr4, fwr4)
165359599516SKenneth E. Jansen            endif               ! end of simple filter if statement
165459599516SKenneth E. Jansen
165559599516SKenneth E. Jansen         endif                  ! end of DFWR sub-model if statement
165659599516SKenneth E. Jansen
165759599516SKenneth E. Jansen         if( (isubmod.eq.2) )then ! If SUPG sub-model wanted
165859599516SKenneth E. Jansen            call dmcSUPG (y,           ac,         shgl,
165959599516SKenneth E. Jansen     &                    shp,         iper,       ilwork,
166059599516SKenneth E. Jansen     &                    nsons,       ifath,      x,
166159599516SKenneth E. Jansen     &                    iBC,    BC,  rowp,       colm,
166259599516SKenneth E. Jansen     &                    xavegt2,    stabdis)
166359599516SKenneth E. Jansen         endif
166459599516SKenneth E. Jansen
166559599516SKenneth E. Jansen         if(idis.eq.1)then      ! If SUPG/Model dissipation wanted
166659599516SKenneth E. Jansen            call ediss (y,        ac,      shgl,
166759599516SKenneth E. Jansen     &                  shp,      iper,       ilwork,
166859599516SKenneth E. Jansen     &                  nsons,    ifath,      x,
166959599516SKenneth E. Jansen     &                  iBC,      BC,  xavegt)
167059599516SKenneth E. Jansen         endif
167159599516SKenneth E. Jansen
167259599516SKenneth E. Jansen      endif                     ! end of ilesmod
167359599516SKenneth E. Jansen
167459599516SKenneth E. Jansen      if (ilesmod .eq. 1) then  ! 10 < iLES < 20 => dynamic-mixed
167559599516SKenneth E. Jansen                                ! at nodes based on discrete filtering
167659599516SKenneth E. Jansen         call bardmc (y,       shgl,      shp,
167759599516SKenneth E. Jansen     &                iper,    ilwork,
167859599516SKenneth E. Jansen     &                nsons,   ifath,     x)
167959599516SKenneth E. Jansen      endif
168059599516SKenneth E. Jansen
168159599516SKenneth E. Jansen      if (ilesmod .eq. 2) then  ! 20 < iLES < 30 => dynamic at quad
168259599516SKenneth E. Jansen                                ! pts based on lumped projection filt.
168359599516SKenneth E. Jansen
168459599516SKenneth E. Jansen         if(isubmod.eq.0)then
168559599516SKenneth E. Jansen            call projdmc (y,       shgl,      shp,
168659599516SKenneth E. Jansen     &                    iper,       ilwork,    x)
168759599516SKenneth E. Jansen         else
168859599516SKenneth E. Jansen            call cpjdmcnoi (y,      shgl,      shp,
168959599516SKenneth E. Jansen     &                      iper,   ilwork,       x,
169059599516SKenneth E. Jansen     &                      rowp,   colm,
169159599516SKenneth E. Jansen     &                      iBC,    BC)
169259599516SKenneth E. Jansen         endif
169359599516SKenneth E. Jansen
169459599516SKenneth E. Jansen      endif
169559599516SKenneth E. Jansen
169659599516SKenneth E. Jansen      if( (iLES.gt.1) )   then ! Deallocate Stuff for advanced LES models
169759599516SKenneth E. Jansen         deallocate (fwr2)
169859599516SKenneth E. Jansen         deallocate (fwr3)
169959599516SKenneth E. Jansen         deallocate (fwr4)
170059599516SKenneth E. Jansen         deallocate (xavegt)
170159599516SKenneth E. Jansen         deallocate (xavegt2)
170259599516SKenneth E. Jansen         deallocate (xavegt3)
170359599516SKenneth E. Jansen         deallocate (stabdis)
170459599516SKenneth E. Jansen      endif
170559599516SKenneth E. Jansen      return
170659599516SKenneth E. Jansen      end
170759599516SKenneth E. Jansen
170859599516SKenneth E. Jansenc
170959599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution
171059599516SKenneth E. Jansenc
171159599516SKenneth E. Jansen      subroutine CalcImpConvCoef (numISrfs, numTpoints)
171259599516SKenneth E. Jansen
171359599516SKenneth E. Jansen      use convolImpFlow !uses flow history and impedance for convolution
171459599516SKenneth E. Jansen
171559599516SKenneth E. Jansen      include "common.h" !for alfi
171659599516SKenneth E. Jansen
171759599516SKenneth E. Jansen      integer numISrfs, numTpoints
171859599516SKenneth E. Jansen
171959599516SKenneth E. Jansen      allocate (ConvCoef(numTpoints+2,3)) !same time discret. for all imp. BC
172059599516SKenneth E. Jansen      do j=1,numTpoints+2
172159599516SKenneth E. Jansen         ConvCoef(j,:)=0.5/numTpoints !dt/2 divided by period T=N*dt
172259599516SKenneth E. Jansen         ConvCoef(j,1)=ConvCoef(j,1)*(1.0-alfi)*(1.0-alfi)
172359599516SKenneth E. Jansen         ConvCoef(j,2)=ConvCoef(j,2)*(1.0+2*alfi*(1.0-alfi))
172459599516SKenneth E. Jansen         ConvCoef(j,3)=ConvCoef(j,3)*alfi*alfi
172559599516SKenneth E. Jansen      enddo
172659599516SKenneth E. Jansen      ConvCoef(1,2)=zero
172759599516SKenneth E. Jansen      ConvCoef(1,3)=zero
172859599516SKenneth E. Jansen      ConvCoef(2,3)=zero
172959599516SKenneth E. Jansen      ConvCoef(numTpoints+1,1)=zero
173059599516SKenneth E. Jansen      ConvCoef(numTpoints+2,2)=zero
173159599516SKenneth E. Jansen      ConvCoef(numTpoints+2,1)=zero
173259599516SKenneth E. Jansenc
173359599516SKenneth E. Jansenc...calculate the coefficients for the impedance convolution
173459599516SKenneth E. Jansenc
173559599516SKenneth E. Jansen      allocate (ImpConvCoef(numTpoints+2,numISrfs))
173659599516SKenneth E. Jansen
173759599516SKenneth E. Jansenc..coefficients below assume Q linear in time step, Z constant
173859599516SKenneth E. Jansenc            do j=3,numTpoints
173959599516SKenneth E. Jansenc                ImpConvCoef(j,:) = ValueListImp(j-1,:)*ConvCoef(j,3)
174059599516SKenneth E. Jansenc     &                             + ValueListImp(j,:)*ConvCoef(j,2)
174159599516SKenneth E. Jansenc     &                             + ValueListImp(j+1,:)*ConvCoef(j,1)
174259599516SKenneth E. Jansenc            enddo
174359599516SKenneth E. Jansenc            ImpConvCoef(1,:) = ValueListImp(2,:)*ConvCoef(1,1)
174459599516SKenneth E. Jansenc            ImpConvCoef(2,:) = ValueListImp(2,:)*ConvCoef(2,2)
174559599516SKenneth E. Jansenc     &                       + ValueListImp(3,:)*ConvCoef(2,1)
174659599516SKenneth E. Jansenc            ImpConvCoef(numTpoints+1,:) =
174759599516SKenneth E. Jansenc     &           ValueListImp(numTpoints,:)*ConvCoef(numTpoints+1,3)
174859599516SKenneth E. Jansenc     &         + ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+1,2)
174959599516SKenneth E. Jansenc            ImpConvCoef(numTpoints+2,:) =
175059599516SKenneth E. Jansenc     &           ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+2,3)
175159599516SKenneth E. Jansen
175259599516SKenneth E. Jansenc..try easiest convolution Q and Z constant per time step
175359599516SKenneth E. Jansen      do j=3,numTpoints+1
175459599516SKenneth E. Jansen         ImpConvCoef(j,:) = ValueListImp(j-1,:)/numTpoints
175559599516SKenneth E. Jansen      enddo
175659599516SKenneth E. Jansen      ImpConvCoef(1,:) =zero
175759599516SKenneth E. Jansen      ImpConvCoef(2,:) =zero
175859599516SKenneth E. Jansen      ImpConvCoef(numTpoints+2,:) =
175959599516SKenneth E. Jansen     &           ValueListImp(numTpoints+1,:)/numTpoints
176059599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr()
176159599516SKenneth E. Jansen      ImpConvCoef(numTpoints+1,:)= ImpConvCoef(numTpoints+1,:)
176259599516SKenneth E. Jansen     &                  - ImpConvCoef(numTpoints+2,:)*(1.0-alfi)/alfi
176359599516SKenneth E. Jansen      ImpConvCoef(numTpoints+2,:)= ImpConvCoef(numTpoints+2,:)/alfi
176459599516SKenneth E. Jansen      return
176559599516SKenneth E. Jansen      end
176659599516SKenneth E. Jansen
176759599516SKenneth E. Jansenc
176859599516SKenneth E. Jansenc ... update the flow rate history for the impedance convolution, filter it and write it out
176959599516SKenneth E. Jansenc
177059599516SKenneth E. Jansen      subroutine UpdHistConv(y,nsrfIdList,numSrfs)
177159599516SKenneth E. Jansen
177259599516SKenneth E. Jansen      use convolImpFlow !brings ntimeptpT, QHistImp, QHistTry, QHistTryF, numImpSrfs
177359599516SKenneth E. Jansen      use convolRCRFlow !brings QHistRCR, numRCRSrfs
177459599516SKenneth E. Jansen
177559599516SKenneth E. Jansen      include "common.h"
177659599516SKenneth E. Jansen
177759599516SKenneth E. Jansen      integer   nsrfIdList(0:MAXSURF), numSrfs
177859599516SKenneth E. Jansen      character*20 fname1
177959599516SKenneth E. Jansen      character*10 cname2
178059599516SKenneth E. Jansen      character*5 cname
178159599516SKenneth E. Jansen      real*8    y(nshg,3) !velocity at time n+1
178259599516SKenneth E. Jansen      real*8    NewQ(0:MAXSURF) !temporary unknown for the flow rate
178359599516SKenneth E. Jansen                        !that needs to be added to the flow history
178459599516SKenneth E. Jansen
178559599516SKenneth E. Jansen      call GetFlowQ(NewQ,y,nsrfIdList,numSrfs) !new flow at time n+1
178659599516SKenneth E. Jansenc
178759599516SKenneth E. Jansenc... for imp BC: shift QHist, add new constribution, filter and write out
178859599516SKenneth E. Jansenc
178959599516SKenneth E. Jansen      if(numImpSrfs.gt.zero) then
179059599516SKenneth E. Jansen         do j=1, ntimeptpT
179159599516SKenneth E. Jansen            QHistImp(j,1:numSrfs)=QHistImp(j+1,1:numSrfs)
179259599516SKenneth E. Jansen         enddo
179359599516SKenneth E. Jansen         QHistImp(ntimeptpT+1,1:numSrfs) = NewQ(1:numSrfs)
179459599516SKenneth E. Jansen
179559599516SKenneth E. Jansenc
179659599516SKenneth E. Jansenc....filter the flow rate history
179759599516SKenneth E. Jansenc
179859599516SKenneth E. Jansen         cutfreq = 10           !hardcoded cutting frequency of the filter
179959599516SKenneth E. Jansen         do j=1, ntimeptpT
180059599516SKenneth E. Jansen            QHistTry(j,:)=QHistImp(j+1,:)
180159599516SKenneth E. Jansen         enddo
180259599516SKenneth E. Jansen         call Filter(QHistTryF,QHistTry,ntimeptpT,Delt(1),cutfreq)
180359599516SKenneth E. Jansenc.... if no filter applied then uncomment next three lines
180459599516SKenneth E. Jansenc         do j=1, ntimeptpT
180559599516SKenneth E. Jansenc            QHistTryF(j,:)=QHistTry(j,:)
180659599516SKenneth E. Jansenc         enddo
180759599516SKenneth E. Jansen
180859599516SKenneth E. Jansenc         QHistImp(1,:)=zero ! why do we do this? for beta(1,:) = zero it does not really matters
180959599516SKenneth E. Jansen         do j=1, ntimeptpT
181059599516SKenneth E. Jansen            QHistImp(j+1,:)=QHistTryF(j,:)
181159599516SKenneth E. Jansen         enddo
181259599516SKenneth E. Jansenc
181359599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat
181459599516SKenneth E. Jansenc
181559599516SKenneth E. Jansen         if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or.
181659599516SKenneth E. Jansen     &        (istep .eq. nstep(1)))) .and.
181759599516SKenneth E. Jansen     &        (myrank .eq. master)) then
181859599516SKenneth E. Jansen            open(unit=816, file='Qhistor.dat',status='replace')
181959599516SKenneth E. Jansen            write(816,*) ntimeptpT
182059599516SKenneth E. Jansen            do j=1,ntimeptpT+1
182159599516SKenneth E. Jansen               write(816,*) (QHistImp(j,n),n=1, numSrfs)
182259599516SKenneth E. Jansen            enddo
182359599516SKenneth E. Jansen            close(816)
182459599516SKenneth E. Jansenc... write out a copy with step number to be able to restart
182559599516SKenneth E. Jansen            fname1 = 'Qhistor'
182659599516SKenneth E. Jansen            fname1 = trim(fname1)//trim(cname2(lstep))//'.dat'
182759599516SKenneth E. Jansen            open(unit=8166,file=trim(fname1),status='unknown')
182859599516SKenneth E. Jansen            write(8166,*) ntimeptpT
182959599516SKenneth E. Jansen            do j=1,ntimeptpT+1
183059599516SKenneth E. Jansen               write(8166,*) (QHistImp(j,n),n=1, numSrfs)
183159599516SKenneth E. Jansen            enddo
183259599516SKenneth E. Jansen            close(8166)
183359599516SKenneth E. Jansen         endif
183459599516SKenneth E. Jansen      endif
183559599516SKenneth E. Jansen
183659599516SKenneth E. Jansenc
183759599516SKenneth E. Jansenc... for RCR bc just add the new contribution
183859599516SKenneth E. Jansenc
183959599516SKenneth E. Jansen      if(numRCRSrfs.gt.zero) then
184059599516SKenneth E. Jansen         QHistRCR(lstep+1,1:numSrfs) = NewQ(1:numSrfs)
184159599516SKenneth E. Jansenc
184259599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat
184359599516SKenneth E. Jansenc
184459599516SKenneth E. Jansen         if ((irs .ge. 1) .and. (myrank .eq. master)) then
184559599516SKenneth E. Jansen            if(istep.eq.1) then
184659599516SKenneth E. Jansen               open(unit=816,file='Qhistor.dat',status='unknown')
184759599516SKenneth E. Jansen            else
184859599516SKenneth E. Jansen               open(unit=816,file='Qhistor.dat',position='append')
184959599516SKenneth E. Jansen            endif
185059599516SKenneth E. Jansen            if(istep.eq.1) then
185159599516SKenneth E. Jansen               do j=1,lstep
185259599516SKenneth E. Jansen                  write(816,*) j, (QHistRCR(j,n),n=1,numSrfs) ! read from file of previous run
185359599516SKenneth E. Jansen               enddo
185459599516SKenneth E. Jansen            endif
185559599516SKenneth E. Jansen            write(816,*) lstep+1, (QHistRCR(lstep+1,n),n=1, numSrfs)
185659599516SKenneth E. Jansen            close(816)
185759599516SKenneth E. Jansenc... write out a copy with step number to be able to restart
185859599516SKenneth E. Jansen            if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or.
185959599516SKenneth E. Jansen     &           (istep .eq. nstep(1)))) .and.
186059599516SKenneth E. Jansen     &           (myrank .eq. master)) then
186159599516SKenneth E. Jansen               fname1 = 'Qhistor'
186259599516SKenneth E. Jansen               fname1 = trim(fname1)//trim(cname2(lstep))//'.dat'
186359599516SKenneth E. Jansen               open(unit=8166,file=trim(fname1),status='unknown')
186459599516SKenneth E. Jansen               write(8166,*) lstep+1
186559599516SKenneth E. Jansen               do j=1,lstep+1
186659599516SKenneth E. Jansen                  write(8166,*) (QHistRCR(j,n),n=1, numSrfs)
186759599516SKenneth E. Jansen               enddo
186859599516SKenneth E. Jansen               close(8166)
186959599516SKenneth E. Jansen            endif
187059599516SKenneth E. Jansen         endif
187159599516SKenneth E. Jansen      endif
187259599516SKenneth E. Jansen
187359599516SKenneth E. Jansen      return
187459599516SKenneth E. Jansen      end
187559599516SKenneth E. Jansen
187659599516SKenneth E. Jansenc
187759599516SKenneth E. Jansenc...calculate the time varying coefficients for the RCR convolution
187859599516SKenneth E. Jansenc
187959599516SKenneth E. Jansen      subroutine CalcRCRConvCoef (stepn, numSrfs)
188059599516SKenneth E. Jansen
188159599516SKenneth E. Jansen      use convolRCRFlow !brings in ValueListRCR, dtRCR
188259599516SKenneth E. Jansen
188359599516SKenneth E. Jansen      include "common.h" !brings alfi
188459599516SKenneth E. Jansen
188559599516SKenneth E. Jansen      integer numSrfs, stepn
188659599516SKenneth E. Jansen
188759599516SKenneth E. Jansen      RCRConvCoef = zero
188859599516SKenneth E. Jansen      if (stepn .eq. 0) then
188959599516SKenneth E. Jansen        RCRConvCoef(1,:) = ValueListRCR(1,:)*(1.0-alfi) +
189059599516SKenneth E. Jansen     &   ValueListRCR(3,:)*(-alfi + 1.0 + 1/dtRCR(:)
189159599516SKenneth E. Jansen     &     - exp(-alfi*dtRCR(:))*(1 + 1/dtRCR(:)))
189259599516SKenneth E. Jansen        RCRConvCoef(2,:) = ValueListRCR(1,:)*alfi
189359599516SKenneth E. Jansen     &     + ValueListRCR(3,:)
189459599516SKenneth E. Jansen     &     *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:))
189559599516SKenneth E. Jansen      endif
189659599516SKenneth E. Jansen      if (stepn .ge. 1) then
189759599516SKenneth E. Jansen        RCRConvCoef(1,:) =-ValueListRCR(3,:)*exp(-dtRCR(:)*(stepn+alfi))
189859599516SKenneth E. Jansen     &        *(1 + (1 - exp(dtRCR(:)))/dtRCR(:))
189959599516SKenneth E. Jansen        RCRConvCoef(stepn+1,:) = ValueListRCR(1,:)*(1-alfi)
190059599516SKenneth E. Jansen     &     - ValueListRCR(3,:)*(alfi - 1 - 1/dtRCR(:)
190159599516SKenneth E. Jansen     &     + exp(-alfi*dtRCR(:))/dtRCR(:)*(2 - exp(-dtRCR(:))))
190259599516SKenneth E. Jansen        RCRConvCoef(stepn+2,:) = ValueListRCR(1,:)*alfi
190359599516SKenneth E. Jansen     &     + ValueListRCR(3,:)
190459599516SKenneth E. Jansen     &     *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:))
190559599516SKenneth E. Jansen      endif
190659599516SKenneth E. Jansen      if (stepn .ge. 2) then
190759599516SKenneth E. Jansen        do j=2,stepn
190859599516SKenneth E. Jansen         RCRConvCoef(j,:) = ValueListRCR(3,:)/dtRCR(:)*
190959599516SKenneth E. Jansen     &        exp(-dtRCR(:)*(stepn + alfi + 2 - j))*
191059599516SKenneth E. Jansen     &        (1 - exp(dtRCR(:)))**2
191159599516SKenneth E. Jansen        enddo
191259599516SKenneth E. Jansen      endif
191359599516SKenneth E. Jansen
191459599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr()
191559599516SKenneth E. Jansen      RCRConvCoef(stepn+1,:)= RCRConvCoef(stepn+1,:)
191659599516SKenneth E. Jansen     &                  - RCRConvCoef(stepn+2,:)*(1.0-alfi)/alfi
191759599516SKenneth E. Jansen      RCRConvCoef(stepn+2,:)= RCRConvCoef(stepn+2,:)/alfi
191859599516SKenneth E. Jansen
191959599516SKenneth E. Jansen      return
192059599516SKenneth E. Jansen      end
192159599516SKenneth E. Jansen
192259599516SKenneth E. Jansenc
192359599516SKenneth E. Jansenc...calculate the time dependent H operator for the RCR convolution
192459599516SKenneth E. Jansenc
192559599516SKenneth E. Jansen      subroutine CalcHopRCR (timestepRCR, stepn, numSrfs)
192659599516SKenneth E. Jansen
192759599516SKenneth E. Jansen      use convolRCRFlow !brings in HopRCR, dtRCR
192859599516SKenneth E. Jansen
192959599516SKenneth E. Jansen      include "common.h"
193059599516SKenneth E. Jansen
193159599516SKenneth E. Jansen      integer numSrfs, stepn
193259599516SKenneth E. Jansen      real*8  PdistCur(0:MAXSURF), timestepRCR
193359599516SKenneth E. Jansen
193459599516SKenneth E. Jansen      HopRCR=zero
193559599516SKenneth E. Jansen      call RCRint(timestepRCR*(stepn + alfi),PdistCur)
193659599516SKenneth E. Jansen      HopRCR(1:numSrfs) = RCRic(1:numSrfs)
193759599516SKenneth E. Jansen     &     *exp(-dtRCR(1:numSrfs)*(stepn + alfi)) + PdistCur(1:numSrfs)
193859599516SKenneth E. Jansen      return
193959599516SKenneth E. Jansen      end
194059599516SKenneth E. Jansenc
194159599516SKenneth E. Jansenc ... initialize the influence of the initial conditions for the RCR BC
194259599516SKenneth E. Jansenc
194359599516SKenneth E. Jansen      subroutine calcRCRic(y,srfIdList,numSrfs)
194459599516SKenneth E. Jansen
194559599516SKenneth E. Jansen      use convolRCRFlow    !brings RCRic, ValueListRCR, ValuePdist
194659599516SKenneth E. Jansen
194759599516SKenneth E. Jansen      include "common.h"
194859599516SKenneth E. Jansen
194959599516SKenneth E. Jansen      integer   srfIdList(0:MAXSURF), numSrfs, irankCoupled
195059599516SKenneth E. Jansen      real*8    y(nshg,4) !need velocity and pressure
195159599516SKenneth E. Jansen      real*8    Qini(0:MAXSURF) !initial flow rate
195259599516SKenneth E. Jansen      real*8    PdistIni(0:MAXSURF) !initial distal pressure
195359599516SKenneth E. Jansen      real*8    Pini(0:MAXSURF),CoupleArea(0:MAXSURF) ! initial pressure
195459599516SKenneth E. Jansen      real*8    VelOnly(nshg,3), POnly(nshg)
195559599516SKenneth E. Jansen
195659599516SKenneth E. Jansen      allocate (RCRic(0:MAXSURF))
195759599516SKenneth E. Jansen
195859599516SKenneth E. Jansen      if(lstep.eq.0) then
195959599516SKenneth E. Jansen         VelOnly(:,1:3)=y(:,1:3)
196059599516SKenneth E. Jansen         call GetFlowQ(Qini,VelOnly,srfIdList,numSrfs) !get initial flow
196159599516SKenneth E. Jansen         QHistRCR(1,1:numSrfs)=Qini(1:numSrfs) !initialize QHistRCR
196259599516SKenneth E. Jansen         POnly(:)=y(:,4)        ! pressure
196359599516SKenneth E. Jansen         call integrScalar(Pini,POnly,srfIdList,numSrfs) !get initial pressure integral
196459599516SKenneth E. Jansen         POnly(:)=one           ! one to get area
196559599516SKenneth E. Jansen         call integrScalar(CoupleArea,POnly,srfIdList,numSrfs) !get surf area
196659599516SKenneth E. Jansen         Pini(1:numSrfs) = Pini(1:numSrfs)/CoupleArea(1:numSrfs)
196759599516SKenneth E. Jansen      else
196859599516SKenneth E. Jansen         Qini(1:numSrfs)=QHistRCR(1,1:numSrfs)
196959599516SKenneth E. Jansen         Pini(1:numSrfs)=zero    ! hack
197059599516SKenneth E. Jansen      endif
197159599516SKenneth E. Jansen      call RCRint(istep,PdistIni) !get initial distal P (use istep)
197259599516SKenneth E. Jansen      RCRic(1:numSrfs) = Pini(1:numSrfs)
197359599516SKenneth E. Jansen     &          - ValueListRCR(1,:)*Qini(1:numSrfs)-PdistIni(1:numSrfs)
197459599516SKenneth E. Jansen      return
197559599516SKenneth E. Jansen      end
197659599516SKenneth E. Jansen
197759599516SKenneth E. Jansenc.........function that integrates a scalar over a boundary
197859599516SKenneth E. Jansen      subroutine integrScalar(scalInt,scal,srfIdList,numSrfs)
197959599516SKenneth E. Jansen
198059599516SKenneth E. Jansen      use pvsQbi !brings ndsurf, NASC
198159599516SKenneth E. Jansen
198259599516SKenneth E. Jansen      include "common.h"
198359599516SKenneth E. Jansen      include "mpif.h"
198459599516SKenneth E. Jansen
198559599516SKenneth E. Jansen      integer   srfIdList(0:MAXSURF), numSrfs, irankCoupled, i, k
198659599516SKenneth E. Jansen      real*8    scal(nshg), scalInt(0:MAXSURF), scalIntProc(0:MAXSURF)
198759599516SKenneth E. Jansen
198859599516SKenneth E. Jansen      scalIntProc = zero
198959599516SKenneth E. Jansen      do i = 1,nshg
199059599516SKenneth E. Jansen        if(numSrfs.gt.zero) then
199159599516SKenneth E. Jansen          do k = 1,numSrfs
199259599516SKenneth E. Jansen            irankCoupled = 0
199359599516SKenneth E. Jansen            if (srfIdList(k).eq.ndsurf(i)) then
199459599516SKenneth E. Jansen              irankCoupled=k
199559599516SKenneth E. Jansen              scalIntProc(irankCoupled) = scalIntProc(irankCoupled)
199659599516SKenneth E. Jansen     &                            + NASC(i)*scal(i)
199759599516SKenneth E. Jansen              exit
199859599516SKenneth E. Jansen            endif
199959599516SKenneth E. Jansen          enddo
200059599516SKenneth E. Jansen        endif
200159599516SKenneth E. Jansen      enddo
200259599516SKenneth E. Jansenc
200359599516SKenneth E. Jansenc     at this point, each scalint has its "nodes" contributions to the scalar
200459599516SKenneth E. Jansenc     accumulated into scalIntProc. Note, because NASC is on processor this
200559599516SKenneth E. Jansenc     will NOT be the scalar for the surface yet
200659599516SKenneth E. Jansenc
200759599516SKenneth E. Jansenc.... reduce integrated scalar for each surface, push on scalInt
200859599516SKenneth E. Jansenc
200959599516SKenneth E. Jansen        npars=MAXSURF+1
201059599516SKenneth E. Jansen       call MPI_ALLREDUCE (scalIntProc, scalInt(:), npars,
201159599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
201259599516SKenneth E. Jansen
201359599516SKenneth E. Jansen      return
201459599516SKenneth E. Jansen      end
201559599516SKenneth E. Jansen
20169071d3baSCameron Smith      subroutine writeTimingMessage(key,iomode,timing)
20179071d3baSCameron Smith      use iso_c_binding
20189071d3baSCameron Smith      use phstr
20199071d3baSCameron Smith      implicit none
202059599516SKenneth E. Jansen
20219071d3baSCameron Smith      character(len=*) :: key
20229071d3baSCameron Smith      integer :: iomode
20239071d3baSCameron Smith      real*8 :: timing
2024da7d5714SCameron Smith      character(len=1024) :: timing_msg
202589625e43SCameron Smith      character(len=*), parameter ::
202689625e43SCameron Smith     &  streamModeString = c_char_"stream"//c_null_char,
202789625e43SCameron Smith     &  fileModeString = c_char_"disk"//c_null_char
202859599516SKenneth E. Jansen
2029da7d5714SCameron Smith      timing_msg = c_char_"Time to write "//c_null_char
20309071d3baSCameron Smith      call phstr_appendStr(timing_msg,key)
20319071d3baSCameron Smith      if ( iomode .eq. -1 ) then
20329071d3baSCameron Smith        call phstr_appendStr(timing_msg, streamModeString)
20339071d3baSCameron Smith      else
20349071d3baSCameron Smith        call phstr_appendStr(timing_msg, fileModeString)
20359071d3baSCameron Smith      endif
20369071d3baSCameron Smith      call phstr_appendStr(timing_msg, c_char_' = '//c_null_char)
20379071d3baSCameron Smith      call phstr_appendDbl(timing_msg, timing)
2038da7d5714SCameron Smith      write(6,*) trim(timing_msg)
20399071d3baSCameron Smith      return
20409071d3baSCameron Smith      end subroutine
204159599516SKenneth E. Jansen
2042