xref: /phasta/phSolver/incompressible/itrdrv.f (revision 75f1c48cf62ef249f52322de5c51e7d33ddb5068)
159599516SKenneth E. Jansen      subroutine itrdrv (y,         ac,
259599516SKenneth E. Jansen     &                   uold,      x,
359599516SKenneth E. Jansen     &                   iBC,       BC,
459599516SKenneth E. Jansen     &                   iper,      ilwork,     shp,
559599516SKenneth E. Jansen     &                   shgl,      shpb,       shglb,
659599516SKenneth E. Jansen     &                   ifath,     velbar,     nsons )
759599516SKenneth E. Jansenc
859599516SKenneth E. Jansenc----------------------------------------------------------------------
959599516SKenneth E. Jansenc
1059599516SKenneth E. Jansenc This iterative driver is the semi-discrete, predictor multi-corrector
1159599516SKenneth E. Jansenc algorithm. It contains the Hulbert Generalized Alpha method which
1259599516SKenneth E. Jansenc is 2nd order accurate for Rho_inf from 0 to 1.  The method can be
1359599516SKenneth E. Jansenc made  first-order accurate by setting Rho_inf=-1. It uses CGP and
1459599516SKenneth E. Jansenc GMRES iterative solvers.
1559599516SKenneth E. Jansenc
1659599516SKenneth E. Jansenc working arrays:
1759599516SKenneth E. Jansenc  y      (nshg,ndof)           : Y variables
1859599516SKenneth E. Jansenc  x      (nshg,nsd)            : node coordinates
1959599516SKenneth E. Jansenc  iBC    (nshg)                : BC codes
2059599516SKenneth E. Jansenc  BC     (nshg,ndofBC)         : BC constraint parameters
2159599516SKenneth E. Jansenc  iper   (nshg)                : periodicity table
2259599516SKenneth E. Jansenc
2359599516SKenneth E. Jansenc
2459599516SKenneth E. Jansenc Zdenek Johan,  Winter 1991.  (Fortran 90)
2559599516SKenneth E. Jansenc Alberto Figueroa, Winter 2004.  CMM-FSI
2659599516SKenneth E. Jansenc Irene Vignon, Fall 2004. Impedance BC
2759599516SKenneth E. Jansenc----------------------------------------------------------------------
2859599516SKenneth E. Jansenc
2959599516SKenneth E. Jansen      use pvsQbi     !gives us splag (the spmass at the end of this run
3059599516SKenneth E. Jansen      use specialBC !gives us itvn
3159599516SKenneth E. Jansen      use timedata   !allows collection of time series
3259599516SKenneth E. Jansen      use convolImpFlow !for Imp bc
3359599516SKenneth E. Jansen      use convolRCRFlow !for RCR bc
3459599516SKenneth E. Jansen      use turbsa          ! used to access d2wall
35*75f1c48cSCameron Smith      use wallData
36ec121c45SKenneth E. Jansen      use fncorpmod
379071d3baSCameron Smith      use iso_c_binding
3859599516SKenneth E. Jansen
3959599516SKenneth E. Jansenc      use readarrays !reads in uold and acold
4059599516SKenneth E. Jansen
4159599516SKenneth E. Jansen        include "common.h"
4259599516SKenneth E. Jansen        include "mpif.h"
4359599516SKenneth E. Jansen        include "auxmpi.h"
44bd36043dSBen Matthews#ifdef HAVE_SVLS
45ae8d68e4SKenneth E. Jansen        include "svLS.h"
46bd36043dSBen Matthews#endif
4779f1763eSKenneth E. Jansen#if !defined(HAVE_SVLS) && !defined(HAVE_LESLIB)
4879f1763eSKenneth E. Jansen#error "You must enable a linear solver during cmake setup"
49bd36043dSBen Matthews#endif
50bd36043dSBen Matthews
5159599516SKenneth E. Jansenc
5259599516SKenneth E. Jansen
5359599516SKenneth E. Jansen
5459599516SKenneth E. Jansen        real*8    y(nshg,ndof),              ac(nshg,ndof),
5559599516SKenneth E. Jansen     &            yold(nshg,ndof),           acold(nshg,ndof),
5659599516SKenneth E. Jansen     &            u(nshg,nsd),               uold(nshg,nsd),
5759599516SKenneth E. Jansen     &            x(numnp,nsd),              solinc(nshg,ndof),
5859599516SKenneth E. Jansen     &            BC(nshg,ndofBC),           tf(nshg,ndof),
5959599516SKenneth E. Jansen     &            GradV(nshg,nsdsq)
6059599516SKenneth E. Jansen
6159599516SKenneth E. Jansenc
6259599516SKenneth E. Jansen        real*8    res(nshg,ndof)
6359599516SKenneth E. Jansenc
6459599516SKenneth E. Jansen        real*8    shp(MAXTOP,maxsh,MAXQPT),
6559599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
6659599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
6759599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
6859599516SKenneth E. Jansenc
6959599516SKenneth E. Jansen        integer   rowp(nshg,nnz),         colm(nshg+1),
7059599516SKenneth E. Jansen     &            iBC(nshg),
7159599516SKenneth E. Jansen     &            ilwork(nlwork),
7259599516SKenneth E. Jansen     &            iper(nshg),            ifuncs(6)
7359599516SKenneth E. Jansen
7459599516SKenneth E. Jansen        real*8 vbc_prof(nshg,3)
7559599516SKenneth E. Jansen
7659599516SKenneth E. Jansen        integer stopjob
7759599516SKenneth E. Jansen        character*10 cname2
7859599516SKenneth E. Jansen        character*5  cname
7959599516SKenneth E. Jansenc
8059599516SKenneth E. Jansenc  stuff for dynamic model s.w.avg and wall model
8159599516SKenneth E. Jansenc
8259599516SKenneth E. Jansen        dimension ifath(numnp),    velbar(nfath,ndof),  nsons(nfath)
8359599516SKenneth E. Jansen
8459599516SKenneth E. Jansen        dimension wallubar(2),walltot(2)
8559599516SKenneth E. Jansenc
86ae8d68e4SKenneth E. Jansenc.... For linear solver Library
8759599516SKenneth E. Jansenc
8859599516SKenneth E. Jansen        integer eqnType, prjFlag, presPrjFlag, verbose
8959599516SKenneth E. Jansenc
9059599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: aperm,  atemp, atempS
9159599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: apermS
9259599516SKenneth E. Jansen
9359599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: lhsP, lhsK, lhsS
9459599516SKenneth E. Jansen        real*8   almit, alfit, gamit
9559599516SKenneth E. Jansenc
9659599516SKenneth E. Jansen        character*1024    servername
9759599516SKenneth E. Jansen        character*20    fname1,fmt1
9859599516SKenneth E. Jansen        character*20    fname2,fmt2
9959599516SKenneth E. Jansen        character*60    fnamepold, fvarts
10059599516SKenneth E. Jansen        character*4     fname4c ! 4 characters
10159599516SKenneth E. Jansen        integer         iarray(50) ! integers for headers
10259599516SKenneth E. Jansen        integer         isgn(ndof), isgng(ndof)
10359599516SKenneth E. Jansen
10459599516SKenneth E. Jansen!MR CHANGE
10559599516SKenneth E. Jansen!        real*8 rerr(nshg,10), ybar(nshg,13) ! including 7 sq. terms with 3 cross terms of uv, uw and vw
10659599516SKenneth E. Jansen!        real*8 rerr(nshg,10), ybar(nshg,12) ! including 7 sq. terms with 3 cross terms of uv, uw and vw
10759599516SKenneth E. Jansen        real*8 rerr(nshg,10)
10859599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: ybar, strain, vorticity
10959599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: wallssVec, wallssVecbar
11059599516SKenneth E. Jansen!MR CHANGE
11159599516SKenneth E. Jansen
11259599516SKenneth E. Jansen        real*8 tcorecp(2), tcorecpscal(2)
11359599516SKenneth E. Jansen
11459599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: ivarts
11559599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: ivartsg
11659599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: iv_rank
11759599516SKenneth E. Jansen        real*8, allocatable, dimension(:) :: vartssoln
11859599516SKenneth E. Jansen        real*8, allocatable, dimension(:) :: vartssolng
11959599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: yphbar
12059599516SKenneth E. Jansen        real*8 CFLworst(numel)
12159599516SKenneth E. Jansen
12259599516SKenneth E. Jansen!MR CHANGE
12359599516SKenneth E. Jansen        integer :: iv_rankpernode, iv_totnodes, iv_totcores
12459599516SKenneth E. Jansen        integer :: iv_node, iv_core, iv_thread
12559599516SKenneth E. Jansen!MR CHANGE
126ae8d68e4SKenneth E. Jansen!--------------------------------------------------------------------
127ae8d68e4SKenneth E. Jansen!     Setting up svLS
128bd36043dSBen Matthews#ifdef HAVE_SVLS
129ae8d68e4SKenneth E. Jansen      INTEGER svLS_nFaces, gnNo, nNo, faIn, facenNo
130ec121c45SKenneth E. Jansen      INTEGER, ALLOCATABLE :: gNodes(:)
131ae8d68e4SKenneth E. Jansen      REAL*8, ALLOCATABLE :: sV(:,:)
132ae8d68e4SKenneth E. Jansen
133ae8d68e4SKenneth E. Jansen      TYPE(svLS_commuType) communicator
134ae8d68e4SKenneth E. Jansen      TYPE(svLS_lhsType) svLS_lhs
135ae8d68e4SKenneth E. Jansen      TYPE(svLS_lsType) svLS_ls
136ec121c45SKenneth E. Jansen! repeat for scalar solves (up to 4 at this time which is consistent with rest of PHASTA)
137daa97cf2SKenneth E. Jansen      TYPE(svLS_commuType) communicator_S(4)
138daa97cf2SKenneth E. Jansen      TYPE(svLS_lhsType) svLS_lhs_S(4)
139daa97cf2SKenneth E. Jansen      TYPE(svLS_lsType) svLS_ls_S(4)
140bd36043dSBen Matthews#endif
14159599516SKenneth E. Jansen
14259599516SKenneth E. Jansen        impistat = 0
14359599516SKenneth E. Jansen        impistat2 = 0
14459599516SKenneth E. Jansen        iISend = 0
14559599516SKenneth E. Jansen        iISendScal = 0
14659599516SKenneth E. Jansen        iIRecv = 0
14759599516SKenneth E. Jansen        iIRecvScal = 0
14859599516SKenneth E. Jansen        iWaitAll = 0
14959599516SKenneth E. Jansen        iWaitAllScal = 0
15059599516SKenneth E. Jansen        iAllR = 0
15159599516SKenneth E. Jansen        iAllRScal = 0
15259599516SKenneth E. Jansen        rISend = zero
15359599516SKenneth E. Jansen        rISendScal = zero
15459599516SKenneth E. Jansen        rIRecv = zero
15559599516SKenneth E. Jansen        rIRecvScal = zero
15659599516SKenneth E. Jansen        rWaitAll = zero
15759599516SKenneth E. Jansen        rWaitAllScal = zero
15859599516SKenneth E. Jansen        rAllR = zero
15959599516SKenneth E. Jansen        rAllRScal = zero
16059599516SKenneth E. Jansen        rCommu = zero
16159599516SKenneth E. Jansen        rCommuScal = zero
16259599516SKenneth E. Jansen
16359599516SKenneth E. Jansen        call initmemstat()
16459599516SKenneth E. Jansen
16559599516SKenneth E. Jansenc
16659599516SKenneth E. Jansenc  hack SA variable
16759599516SKenneth E. Jansenc
16859599516SKenneth E. JansencHack        BC(:,7)=BC(:,7)*0.001
16959599516SKenneth E. JansencHack        if(lstep.eq.0) y(:,6)=y(:,6)*0.001
170ae8d68e4SKenneth E. Jansen!--------------------------------------------------------------------
171436818eeSKenneth E. Jansen!     Setting up svLS Moved down for better org
172ae8d68e4SKenneth E. Jansen
17379f1763eSKenneth E. Jansen#ifdef HAVE_LESLIB
17479f1763eSKenneth E. Jansen!      IF (svLSFlag .EQ. 0) THEN  !When we get a PETSc option it also could block this or a positive leslib
17559599516SKenneth E. Jansen        call SolverLicenseServer(servername)
17679f1763eSKenneth E. Jansen!      ENDIF
177bd36043dSBen Matthews#endif
17859599516SKenneth E. Jansenc
17959599516SKenneth E. Jansenc only master should be verbose
18059599516SKenneth E. Jansenc
18159599516SKenneth E. Jansen
18259599516SKenneth E. Jansen        if(numpe.gt.0 .and. myrank.ne.master)iverbose=0
18359599516SKenneth E. Jansenc
18459599516SKenneth E. Jansen
18559599516SKenneth E. Jansen        lskeep=lstep
18659599516SKenneth E. Jansen
18759599516SKenneth E. Jansen        inquire(file='xyzts.dat',exist=exts)
18859599516SKenneth E. Jansen        if(exts) then
18959599516SKenneth E. Jansen
19059599516SKenneth E. Jansen           open(unit=626,file='xyzts.dat',status='old')
19159599516SKenneth E. Jansen           read(626,*) ntspts, freq, tolpt, iterat, varcod
19259599516SKenneth E. Jansen           call sTD             ! sets data structures
19359599516SKenneth E. Jansen
19459599516SKenneth E. Jansen           do jj=1,ntspts       ! read coordinate data where solution desired
19559599516SKenneth E. Jansen              read(626,*) ptts(jj,1),ptts(jj,2),ptts(jj,3)
19659599516SKenneth E. Jansen           enddo
19759599516SKenneth E. Jansen           close(626)
19859599516SKenneth E. Jansen
19959599516SKenneth E. Jansen           statptts(:,:) = 0
20059599516SKenneth E. Jansen           parptts(:,:) = zero
20159599516SKenneth E. Jansen           varts(:,:) = zero
20259599516SKenneth E. Jansen
20359599516SKenneth E. Jansen           allocate (ivarts(ntspts*ndof))
20459599516SKenneth E. Jansen           allocate (ivartsg(ntspts*ndof))
20559599516SKenneth E. Jansen           allocate (iv_rank(ntspts))
20659599516SKenneth E. Jansen           allocate (vartssoln(ntspts*ndof))
20759599516SKenneth E. Jansen           allocate (vartssolng(ntspts*ndof))
20859599516SKenneth E. Jansen
20959599516SKenneth E. Jansen           iv_rankpernode = iv_rankpercore*iv_corepernode
21059599516SKenneth E. Jansen           iv_totnodes = numpe/iv_rankpernode
21159599516SKenneth E. Jansen           iv_totcores = iv_corepernode*iv_totnodes
21259599516SKenneth E. Jansen           if (myrank .eq. 0) then
21359599516SKenneth E. Jansen             write(*,*) 'Info for probes:'
21459599516SKenneth E. Jansen             write(*,*) '  Ranks per core:',iv_rankpercore
21559599516SKenneth E. Jansen             write(*,*) '  Cores per node:',iv_corepernode
21659599516SKenneth E. Jansen             write(*,*) '  Ranks per node:',iv_rankpernode
21759599516SKenneth E. Jansen             write(*,*) '  Total number of nodes:',iv_totnodes
21859599516SKenneth E. Jansen             write(*,*) '  Total number of cores',iv_totcores
21959599516SKenneth E. Jansen           endif
22059599516SKenneth E. Jansen
22159599516SKenneth E. Jansen!           if (myrank .eq. numpe-1) then
22259599516SKenneth E. Jansen            do jj=1,ntspts
22359599516SKenneth E. Jansen
22459599516SKenneth E. Jansen               ! Compute the adequate rank which will take care of probe jj
22559599516SKenneth E. Jansen               jjm1 = jj-1
22659599516SKenneth E. Jansen               iv_node = (iv_totnodes-1)-mod(jjm1,iv_totnodes)
22759599516SKenneth E. Jansen               iv_core = (iv_corepernode-1) - mod((jjm1 -
22859599516SKenneth E. Jansen     &              mod(jjm1,iv_totnodes))/iv_totnodes,iv_corepernode)
22959599516SKenneth E. Jansen               iv_thread = (iv_rankpercore-1) - mod((jjm1-
23059599516SKenneth E. Jansen     &              (mod(jjm1,iv_totcores)))/iv_totcores,iv_rankpercore)
23159599516SKenneth E. Jansen               iv_rank(jj) = iv_node*iv_rankpernode
23259599516SKenneth E. Jansen     &                     + iv_core*iv_rankpercore
23359599516SKenneth E. Jansen     &                     + iv_thread
23459599516SKenneth E. Jansen
23559599516SKenneth E. Jansen               if(myrank == 0) then
23659599516SKenneth E. Jansen                 write(*,*) '  Probe', jj, 'handled by rank',
23759599516SKenneth E. Jansen     &                         iv_rank(jj), ' on node', iv_node
23859599516SKenneth E. Jansen               endif
23959599516SKenneth E. Jansen
24059599516SKenneth E. Jansen               ! Verification just in case
24159599516SKenneth E. Jansen               if(iv_rank(jj) .lt.0 .or. iv_rank(jj) .ge. numpe) then
24259599516SKenneth E. Jansen                 write(*,*) 'WARNING: iv_rank(',jj,') is ', iv_rank(jj),
24359599516SKenneth E. Jansen     &                      ' and reset to numpe-1'
24459599516SKenneth E. Jansen                 iv_rank(jj) = numpe-1
24559599516SKenneth E. Jansen               endif
24659599516SKenneth E. Jansen
24759599516SKenneth E. Jansen               ! Open the varts files
24859599516SKenneth E. Jansen               if(myrank == iv_rank(jj)) then
24959599516SKenneth E. Jansen                 fvarts='varts/varts'
25059599516SKenneth E. Jansen                 fvarts=trim(fvarts)//trim(cname2(jj))
25159599516SKenneth E. Jansen                 fvarts=trim(fvarts)//trim(cname2(lstep))
25259599516SKenneth E. Jansen                 fvarts=trim(fvarts)//'.dat'
25359599516SKenneth E. Jansen                 fvarts=trim(fvarts)
25459599516SKenneth E. Jansen                 open(unit=1000+jj, file=fvarts, status='unknown')
25559599516SKenneth E. Jansen               endif
25659599516SKenneth E. Jansen            enddo
25759599516SKenneth E. Jansen!           endif
25859599516SKenneth E. Jansen
25959599516SKenneth E. Jansen        endif
26059599516SKenneth E. Jansenc
26159599516SKenneth E. Jansenc.... open history and aerodynamic forces files
26259599516SKenneth E. Jansenc
26359599516SKenneth E. Jansen        if (myrank .eq. master) then
264c9a96f21SKenneth E. Jansen           open (unit=ihist,  file=fhist,  status='unknown')
26559599516SKenneth E. Jansen           open (unit=iforce, file=fforce, status='unknown')
26659599516SKenneth E. Jansen           open (unit=76, file="fort.76", status='unknown')
26759599516SKenneth E. Jansen           if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then
26859599516SKenneth E. Jansen              fnamepold = 'pold'
26959599516SKenneth E. Jansen              fnamepold = trim(fnamepold)//trim(cname2(lstep))
27059599516SKenneth E. Jansen              fnamepold = trim(fnamepold)//'.dat'
27159599516SKenneth E. Jansen              fnamepold = trim(fnamepold)
27259599516SKenneth E. Jansen              open (unit=8177, file=fnamepold, status='unknown')
27359599516SKenneth E. Jansen           endif
27459599516SKenneth E. Jansen        endif
27559599516SKenneth E. Jansenc
27659599516SKenneth E. Jansenc.... initialize
27759599516SKenneth E. Jansenc
27859599516SKenneth E. Jansen        ifuncs(:)  = 0              ! func. evaluation counter
27959599516SKenneth E. Jansen        istep  = 0
28059599516SKenneth E. Jansen        yold   = y
28159599516SKenneth E. Jansen        acold  = ac
28259599516SKenneth E. Jansen
28359599516SKenneth E. Jansen        rerr = zero
28459599516SKenneth E. Jansen
28559599516SKenneth E. Jansen        if(ierrcalc.eq.1 .or. ioybar.eq.1) then ! we need ybar for error too
28659599516SKenneth E. Jansen          if (ivort == 1) then
28759599516SKenneth E. Jansen            allocate(ybar(nshg,17)) ! more space for vorticity if requested
28859599516SKenneth E. Jansen          else
28959599516SKenneth E. Jansen            allocate(ybar(nshg,13))
29059599516SKenneth E. Jansen          endif
29159599516SKenneth E. Jansen          ybar = zero ! Initialize ybar to zero, which is essential
29259599516SKenneth E. Jansen        endif
29359599516SKenneth E. Jansen
29459599516SKenneth E. Jansen        if(ivort == 1) then
29559599516SKenneth E. Jansen          allocate(strain(nshg,6))
29659599516SKenneth E. Jansen          allocate(vorticity(nshg,5))
29759599516SKenneth E. Jansen        endif
29859599516SKenneth E. Jansen
29959599516SKenneth E. Jansen        if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
30059599516SKenneth E. Jansen          allocate(wallssVec(nshg,3))
30159599516SKenneth E. Jansen          if (ioybar .eq. 1) then
30259599516SKenneth E. Jansen            allocate(wallssVecbar(nshg,3))
30359599516SKenneth E. Jansen            wallssVecbar = zero ! Initialization important if mean wss computed
30459599516SKenneth E. Jansen          endif
30559599516SKenneth E. Jansen        endif
30659599516SKenneth E. Jansen
30759599516SKenneth E. Jansen! both nstepsincycle and nphasesincycle needs to be set
30859599516SKenneth E. Jansen        if(nstepsincycle.eq.0) nphasesincycle = 0
30959599516SKenneth E. Jansen        if(nphasesincycle.ne.0) then
31059599516SKenneth E. Jansen!     &     allocate(yphbar(nshg,5,nphasesincycle))
31159599516SKenneth E. Jansen          if (ivort == 1) then
31259599516SKenneth E. Jansen            allocate(yphbar(nshg,15,nphasesincycle)) ! more space for vorticity
31359599516SKenneth E. Jansen          else
31459599516SKenneth E. Jansen            allocate(yphbar(nshg,11,nphasesincycle))
31559599516SKenneth E. Jansen          endif
31659599516SKenneth E. Jansen          yphbar = zero
31759599516SKenneth E. Jansen        endif
31859599516SKenneth E. Jansen
31959599516SKenneth E. Jansen!MR CHANGE END
32059599516SKenneth E. Jansen
32159599516SKenneth E. Jansen        vbc_prof(:,1:3) = BC(:,3:5)
32259599516SKenneth E. Jansen        if(iramp.eq.1) then
32359599516SKenneth E. Jansen          call BCprofileInit(vbc_prof,x)
32459599516SKenneth E. Jansen        endif
32559599516SKenneth E. Jansen
32659599516SKenneth E. Jansenc
327ae8d68e4SKenneth E. Jansenc.... ---------------> initialize LesLib Library <---------------
32859599516SKenneth E. Jansenc
32959599516SKenneth E. Jansenc.... assign parameter values
33059599516SKenneth E. Jansenc
33159599516SKenneth E. Jansen        do i = 1, 100
33259599516SKenneth E. Jansen           numeqns(i) = i
33359599516SKenneth E. Jansen        enddo
33459599516SKenneth E. Jansen        nKvecs       = Kspace
33559599516SKenneth E. Jansen        prjFlag      = iprjFlag
33659599516SKenneth E. Jansen        presPrjFlag  = ipresPrjFlag
33759599516SKenneth E. Jansen        verbose      = iverbose
33859599516SKenneth E. Jansenc
33959599516SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve
34059599516SKenneth E. Jansenc
34159599516SKenneth E. Jansen      nsolt=mod(impl(1),2)      ! 1 if solving temperature
34259599516SKenneth E. Jansen      nsclrsol=nsolt+nsclr      ! total number of scalars solved At
34359599516SKenneth E. Jansen                                ! some point we probably want to create
34459599516SKenneth E. Jansen                                ! a map, considering stepseq(), to find
34559599516SKenneth E. Jansen                                ! what is actually solved and only
34659599516SKenneth E. Jansen                                ! dimension lhs to the appropriate
34759599516SKenneth E. Jansen                                ! size. (see 1.6.1 and earlier for a
34859599516SKenneth E. Jansen                                ! "failed" attempt at this).
34959599516SKenneth E. Jansen
35059599516SKenneth E. Jansen
35159599516SKenneth E. Jansen      nsolflow=mod(impl(1),100)/10  ! 1 if solving flow
35259599516SKenneth E. Jansen
35359599516SKenneth E. Jansenc
354ae8d68e4SKenneth E. Jansenc.... Now, call lesNew routine to initialize
35559599516SKenneth E. Jansenc     memory space
35659599516SKenneth E. Jansenc
35759599516SKenneth E. Jansen      call genadj(colm, rowp, icnt )  ! preprocess the adjacency list
35859599516SKenneth E. Jansen
35959599516SKenneth E. Jansen      nnz_tot=icnt ! this is exactly the number of non-zero blocks on
36059599516SKenneth E. Jansen                   ! this proc
36159599516SKenneth E. Jansen
36279f1763eSKenneth E. Jansen      if (nsolflow.eq.1) then  ! start of setup for the flow
36359599516SKenneth E. Jansen         lesId   = numeqns(1)
36459599516SKenneth E. Jansen         eqnType = 1
36559599516SKenneth E. Jansen         nDofs   = 4
366ae8d68e4SKenneth E. Jansen
367ae8d68e4SKenneth E. Jansen!--------------------------------------------------------------------
368ae8d68e4SKenneth E. Jansen!     Rest of configuration of svLS is added here, where we have LHS
369ae8d68e4SKenneth E. Jansen!     pointers
370ae8d68e4SKenneth E. Jansen
371ae8d68e4SKenneth E. Jansen         nPermDims = 1
372ae8d68e4SKenneth E. Jansen         nTmpDims = 1
373ae8d68e4SKenneth E. Jansen
374ae8d68e4SKenneth E. Jansen         allocate (lhsP(4,nnz_tot))
375ae8d68e4SKenneth E. Jansen         allocate (lhsK(9,nnz_tot))
376ae8d68e4SKenneth E. Jansen
377436818eeSKenneth E. Jansen!     Setting up svLS or leslib for flow
37879f1763eSKenneth E. Jansen
379ae8d68e4SKenneth E. Jansen      IF (svLSFlag .EQ. 1) THEN
38079f1763eSKenneth E. Jansen#ifdef HAVE_SVLS
381436818eeSKenneth E. Jansen        IF(nPrjs.eq.0) THEN
382436818eeSKenneth E. Jansen           svLSType=2  !GMRES if borrowed ACUSIM projection vectors variable set to zero
383436818eeSKenneth E. Jansen         ELSE
384436818eeSKenneth E. Jansen           svLSType=3 !NS solver
385436818eeSKenneth E. Jansen         ENDIF
386436818eeSKenneth E. Jansen!  reltol for the NSSOLVE is the stop criterion on the outer loop
387436818eeSKenneth E. Jansen!  reltolIn is (eps_GM, eps_CG) from the CompMech paper
388436818eeSKenneth E. Jansen!  for now we are using
389436818eeSKenneth E. Jansen!  Tolerance on ACUSIM Pressure Projection for CG and
390436818eeSKenneth E. Jansen!  Tolerance on Momentum Equations for GMRES
391436818eeSKenneth E. Jansen! also using Kspaceand maxIters from setup for ACUSIM
392436818eeSKenneth E. Jansen!
393436818eeSKenneth E. Jansen         eps_outer=40.0*epstol(1)  !following papers soggestion for now
394436818eeSKenneth E. Jansen         CALL svLS_LS_CREATE(svLS_ls, svLSType, dimKry=Kspace,
395436818eeSKenneth E. Jansen     2      relTol=eps_outer, relTolIn=(/epstol(1),prestol/),
396436818eeSKenneth E. Jansen     3      maxItr=maxIters,
397436818eeSKenneth E. Jansen     4      maxItrIn=(/maxIters,maxIters/))
398436818eeSKenneth E. Jansen
399436818eeSKenneth E. Jansen         CALL svLS_COMMU_CREATE(communicator, MPI_COMM_WORLD)
400436818eeSKenneth E. Jansen            nNo=nshg
401ec121c45SKenneth E. Jansen            gnNo=nshgt
402ae8d68e4SKenneth E. Jansen            IF  (ipvsq .GE. 2) THEN
403ae8d68e4SKenneth E. Jansen
404ae8d68e4SKenneth E. Jansen#if((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 1))
405ae8d68e4SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs
406ae8d68e4SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs + numCORSrfs
407ae8d68e4SKenneth E. Jansen#elif((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 0))
408ae8d68e4SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs
409ae8d68e4SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs + numCORSrfs
410ae8d68e4SKenneth E. Jansen#elif((VER_CORONARY == 0)&&(VER_CLOSEDLOOP == 1))
411ae8d68e4SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs
412ae8d68e4SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs
413ae8d68e4SKenneth E. Jansen#else
414ae8d68e4SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs
415ae8d68e4SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs
416ae8d68e4SKenneth E. Jansen#endif
417ae8d68e4SKenneth E. Jansen
418ae8d68e4SKenneth E. Jansen            ELSE
419436818eeSKenneth E. Jansen               svLS_nFaces = 1   !not sure about this...looks like 1 means 0 for array size issues
420ae8d68e4SKenneth E. Jansen            END IF
421ae8d68e4SKenneth E. Jansen
422ae8d68e4SKenneth E. Jansen            CALL svLS_LHS_CREATE(svLS_lhs, communicator, gnNo, nNo,
423ae8d68e4SKenneth E. Jansen     2         nnz_tot, ltg, colm, rowp, svLS_nFaces)
424ae8d68e4SKenneth E. Jansen
425ae8d68e4SKenneth E. Jansen            faIn = 1
426ae8d68e4SKenneth E. Jansen            facenNo = 0
427ae8d68e4SKenneth E. Jansen            DO i=1, nshg
428ae8d68e4SKenneth E. Jansen               IF (IBITS(iBC(i),3,3) .NE. 0)  facenNo = facenNo + 1
429ae8d68e4SKenneth E. Jansen            END DO
430ae8d68e4SKenneth E. Jansen            ALLOCATE(gNodes(facenNo), sV(nsd,facenNo))
431ae8d68e4SKenneth E. Jansen            sV = 0D0
432ae8d68e4SKenneth E. Jansen            j = 0
433ae8d68e4SKenneth E. Jansen            DO i=1, nshg
434ae8d68e4SKenneth E. Jansen               IF (IBITS(iBC(i),3,3) .NE. 0) THEN
435ae8d68e4SKenneth E. Jansen                  j = j + 1
436ae8d68e4SKenneth E. Jansen                  gNodes(j) = i
437ae8d68e4SKenneth E. Jansen                  IF (.NOT.BTEST(iBC(i),3)) sV(1,j) = 1D0
438ae8d68e4SKenneth E. Jansen                  IF (.NOT.BTEST(iBC(i),4)) sV(2,j) = 1D0
439ae8d68e4SKenneth E. Jansen                  IF (.NOT.BTEST(iBC(i),5)) sV(3,j) = 1D0
440ae8d68e4SKenneth E. Jansen               END IF
441ae8d68e4SKenneth E. Jansen            END DO
442ae8d68e4SKenneth E. Jansen            CALL svLS_BC_CREATE(svLS_lhs, faIn, facenNo,
443ae8d68e4SKenneth E. Jansen     2         nsd, BC_TYPE_Dir, gNodes, sV)
444436818eeSKenneth E. Jansen            DEALLOCATE(gNodes)
445436818eeSKenneth E. Jansen            DEALLOCATE(sV)
44679f1763eSKenneth E. Jansen#else
44779f1763eSKenneth E. Jansen         if(myrank.eq.0) write(*,*) 'your input requests svLS but your cmake did not build for it'
44879f1763eSKenneth E. Jansen         call error('itrdrv  ','nosVLS',svLSFlag)
449bd36043dSBen Matthews#endif
450bd36043dSBen Matthews           ENDIF
45179f1763eSKenneth E. Jansen
45279f1763eSKenneth E. Jansen           if(leslib.eq.1) then
45379f1763eSKenneth E. Jansen#ifdef HAVE_LESLIB
454ae8d68e4SKenneth E. Jansen!--------------------------------------------------------------------
45559599516SKenneth E. Jansen           call myfLesNew( lesId,   41994,
45659599516SKenneth E. Jansen     &                 eqnType,
45759599516SKenneth E. Jansen     &                 nDofs,          minIters,       maxIters,
45859599516SKenneth E. Jansen     &                 nKvecs,         prjFlag,        nPrjs,
45959599516SKenneth E. Jansen     &                 presPrjFlag,    nPresPrjs,      epstol(1),
46059599516SKenneth E. Jansen     &                 prestol,        verbose,        statsflow,
46159599516SKenneth E. Jansen     &                 nPermDims,      nTmpDims,      servername  )
46259599516SKenneth E. Jansen
46359599516SKenneth E. Jansen           allocate (aperm(nshg,nPermDims))
46459599516SKenneth E. Jansen           allocate (atemp(nshg,nTmpDims))
46559599516SKenneth E. Jansen           call readLesRestart( lesId,  aperm, nshg, myrank, lstep,
46659599516SKenneth E. Jansen     &                        nPermDims )
46779f1763eSKenneth E. Jansen#else
46879f1763eSKenneth E. Jansen         if(myrank.eq.0) write(*,*) 'your input requests leslib but your cmake did not build for it'
46979f1763eSKenneth E. Jansen         call error('itrdrv  ','nolslb',leslib)
470bd36043dSBen Matthews#endif
47179f1763eSKenneth E. Jansen         endif !leslib=1
47259599516SKenneth E. Jansen
473436818eeSKenneth E. Jansen      else   ! not solving flow just scalar
47459599516SKenneth E. Jansen         nPermDims = 0
47559599516SKenneth E. Jansen         nTempDims = 0
47659599516SKenneth E. Jansen      endif
47759599516SKenneth E. Jansen
47859599516SKenneth E. Jansen
47959599516SKenneth E. Jansen      if(nsclrsol.gt.0) then
48059599516SKenneth E. Jansen       do isolsc=1,nsclrsol
48159599516SKenneth E. Jansen         lesId       = numeqns(isolsc+1)
48259599516SKenneth E. Jansen         eqnType     = 2
48359599516SKenneth E. Jansen         nDofs       = 1
48459599516SKenneth E. Jansen         presPrjflag = 0
48559599516SKenneth E. Jansen         nPresPrjs   = 0
48659599516SKenneth E. Jansen         prjFlag     = 1
48759599516SKenneth E. Jansen         indx=isolsc+2-nsolt ! complicated to keep epstol(2) for
48859599516SKenneth E. Jansen                             ! temperature followed by scalars
489436818eeSKenneth E. Jansen!     Setting up svLS or leslib for scalar
490bd36043dSBen Matthews#ifdef HAVE_SVLS
491436818eeSKenneth E. Jansen      IF (svLSFlag .EQ. 1) THEN
492436818eeSKenneth E. Jansen           svLSType=2  !only option for scalars
493436818eeSKenneth E. Jansen!  reltol for the GMRES is the stop criterion
494436818eeSKenneth E. Jansen! also using Kspaceand maxIters from setup for ACUSIM
495436818eeSKenneth E. Jansen!
496daa97cf2SKenneth E. Jansen         CALL svLS_LS_CREATE(svLS_ls_S(isolsc), svLSType, dimKry=Kspace,
497436818eeSKenneth E. Jansen     2      relTol=epstol(indx),
498436818eeSKenneth E. Jansen     3      maxItr=maxIters
499436818eeSKenneth E. Jansen     4      )
500436818eeSKenneth E. Jansen
501daa97cf2SKenneth E. Jansen         CALL svLS_COMMU_CREATE(communicator_S(isolsc), MPI_COMM_WORLD)
502436818eeSKenneth E. Jansen
503436818eeSKenneth E. Jansen               svLS_nFaces = 1   !not sure about this...should try it with zero
504436818eeSKenneth E. Jansen
505daa97cf2SKenneth E. Jansen            CALL svLS_LHS_CREATE(svLS_lhs_S(isolsc), communicator_S(isolsc), gnNo, nNo,
506436818eeSKenneth E. Jansen     2         nnz_tot, ltg, colm, rowp, svLS_nFaces)
507436818eeSKenneth E. Jansen
508436818eeSKenneth E. Jansen              faIn = 1
509436818eeSKenneth E. Jansen              facenNo = 0
510436818eeSKenneth E. Jansen              ib=5+isolsc
511436818eeSKenneth E. Jansen              DO i=1, nshg
512436818eeSKenneth E. Jansen                 IF (btest(iBC(i),ib))  facenNo = facenNo + 1
513436818eeSKenneth E. Jansen              END DO
514436818eeSKenneth E. Jansen              ALLOCATE(gNodes(facenNo), sV(1,facenNo))
515436818eeSKenneth E. Jansen              sV = 0D0
516436818eeSKenneth E. Jansen              j = 0
517436818eeSKenneth E. Jansen              DO i=1, nshg
518436818eeSKenneth E. Jansen               IF (btest(iBC(i),ib)) THEN
519436818eeSKenneth E. Jansen                  j = j + 1
520436818eeSKenneth E. Jansen                  gNodes(j) = i
521436818eeSKenneth E. Jansen               END IF
522436818eeSKenneth E. Jansen              END DO
523436818eeSKenneth E. Jansen
524daa97cf2SKenneth E. Jansen            CALL svLS_BC_CREATE(svLS_lhs_S(isolsc), faIn, facenNo,
525436818eeSKenneth E. Jansen     2         1, BC_TYPE_Dir, gNodes, sV(1,:))
526436818eeSKenneth E. Jansen            DEALLOCATE(gNodes)
527436818eeSKenneth E. Jansen            DEALLOCATE(sV)
528436818eeSKenneth E. Jansen
529436818eeSKenneth E. Jansen            if( isolsc.eq.1) then ! if multiple scalars make sure done once
530436818eeSKenneth E. Jansen              allocate (apermS(1,1,1))
531436818eeSKenneth E. Jansen              allocate (atempS(1,1))  !they can all share this
532436818eeSKenneth E. Jansen            endif
53379f1763eSKenneth E. Jansen         ENDIF  !svLS handing scalar solve
534bd36043dSBen Matthews#endif
53579f1763eSKenneth E. Jansen
53679f1763eSKenneth E. Jansen
53779f1763eSKenneth E. Jansen#ifdef HAVE_LESLIB
53879f1763eSKenneth E. Jansen         if (leslib.eq.1) then
53959599516SKenneth E. Jansen         call myfLesNew( lesId,            41994,
54059599516SKenneth E. Jansen     &                 eqnType,
54159599516SKenneth E. Jansen     &                 nDofs,          minIters,       maxIters,
54259599516SKenneth E. Jansen     &                 nKvecs,         prjFlag,        nPrjs,
54359599516SKenneth E. Jansen     &                 presPrjFlag,    nPresPrjs,      epstol(indx),
54459599516SKenneth E. Jansen     &                 prestol,        verbose,        statssclr,
54559599516SKenneth E. Jansen     &                 nPermDimsS,     nTmpDimsS,   servername )
54679f1763eSKenneth E. Jansen        endif
547bd36043dSBen Matthews#endif
548436818eeSKenneth E. Jansen       enddo  !loop over scalars to solve  (not yet worked out for multiple svLS solves
549436818eeSKenneth E. Jansen       allocate (lhsS(nnz_tot,nsclrsol))
55079f1763eSKenneth E. Jansen#ifdef HAVE_LESLIB
55179f1763eSKenneth E. Jansen       if(leslib.eq.1) then  ! we just prepped scalar solves for leslib so allocate arrays
55259599516SKenneth E. Jansenc
55359599516SKenneth E. Jansenc  Assume all scalars have the same size needs
55459599516SKenneth E. Jansenc
55559599516SKenneth E. Jansen       allocate (apermS(nshg,nPermDimsS,nsclrsol))
55659599516SKenneth E. Jansen       allocate (atempS(nshg,nTmpDimsS))  !they can all share this
557436818eeSKenneth E. Jansen       endif
558bd36043dSBen Matthews#endif
55959599516SKenneth E. Jansenc
56059599516SKenneth E. Jansenc actually they could even share with atemp but leave that for later
56159599516SKenneth E. Jansenc
562436818eeSKenneth E. Jansen      else !no scalar solves at all so zero dims not used
56359599516SKenneth E. Jansen         nPermDimsS = 0
56459599516SKenneth E. Jansen         nTmpDimsS  = 0
56559599516SKenneth E. Jansen      endif
56659599516SKenneth E. Jansenc
56759599516SKenneth E. Jansenc...  prepare lumped mass if needed
56859599516SKenneth E. Jansenc
56959599516SKenneth E. Jansen      if((flmpr.ne.0).or.(flmpl.ne.0)) call genlmass(x, shp,shgl)
57059599516SKenneth E. Jansenc
57159599516SKenneth E. Jansenc.... -----------------> End of initialization <-----------------
57259599516SKenneth E. Jansenc
57359599516SKenneth E. Jansenc.....open the necessary files to gather time series
57459599516SKenneth E. Jansenc
57559599516SKenneth E. Jansen      lstep0 = lstep+1
57659599516SKenneth E. Jansen      nsteprcr = nstep(1)+lstep
57759599516SKenneth E. Jansenc
57859599516SKenneth E. Jansenc.... loop through the time sequences
57959599516SKenneth E. Jansenc
58059599516SKenneth E. Jansen
58159599516SKenneth E. Jansen
58259599516SKenneth E. Jansen      do 3000 itsq = 1, ntseq
58359599516SKenneth E. Jansen         itseq = itsq
58459599516SKenneth E. Jansen
58559599516SKenneth E. JansenCAD         tcorecp1 = second(0)
58659599516SKenneth E. JansenCAD         tcorewc1 = second(-1)
58759599516SKenneth E. Jansenc
58859599516SKenneth E. Jansenc.... set up the time integration parameters
58959599516SKenneth E. Jansenc
59059599516SKenneth E. Jansen         nstp   = nstep(itseq)
59159599516SKenneth E. Jansen         nitr   = niter(itseq)
59259599516SKenneth E. Jansen         LCtime = loctim(itseq)
59359599516SKenneth E. Jansen         dtol(:)= deltol(itseq,:)
59459599516SKenneth E. Jansen
59559599516SKenneth E. Jansen         call itrSetup ( y, acold )
59659599516SKenneth E. Jansenc
59759599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution,
59859599516SKenneth E. Jansenc   which are functions of alphaf so need to do it after itrSetup
59959599516SKenneth E. Jansen         if(numImpSrfs.gt.zero) then
60059599516SKenneth E. Jansen            call calcImpConvCoef (numImpSrfs, ntimeptpT)
60159599516SKenneth E. Jansen         endif
60259599516SKenneth E. Jansenc
60359599516SKenneth E. Jansenc...initialize the initial condition P(0)-RQ(0)-Pd(0) for RCR BC
60459599516SKenneth E. Jansenc   need ndsurf so should be after initNABI
60559599516SKenneth E. Jansen         if(numRCRSrfs.gt.zero) then
60659599516SKenneth E. Jansen            call calcRCRic(y,nsrflistRCR,numRCRSrfs)
60759599516SKenneth E. Jansen         endif
60859599516SKenneth E. Jansenc
60959599516SKenneth E. Jansenc  find the last solve of the flow in the step sequence so that we will
61059599516SKenneth E. Jansenc         know when we are at/near end of step
61159599516SKenneth E. Jansenc
61259599516SKenneth E. Jansenc         ilast=0
61359599516SKenneth E. Jansen         nitr=0  ! count number of flow solves in a step (# of iterations)
61459599516SKenneth E. Jansen         do i=1,seqsize
61559599516SKenneth E. Jansen            if(stepseq(i).eq.0) nitr=nitr+1
61659599516SKenneth E. Jansen         enddo
61759599516SKenneth E. Jansen
61859599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
61959599516SKenneth E. Jansen         tcorecp(:) = zero ! used in solfar.f (solflow)
62059599516SKenneth E. Jansen         tcorecpscal(:) = zero ! used in solfar.f (solflow)
62159599516SKenneth E. Jansen         if(myrank.eq.0)  then
62259599516SKenneth E. Jansen            tcorecp1 = TMRC()
62359599516SKenneth E. Jansen         endif
62459599516SKenneth E. Jansen
62559599516SKenneth E. Jansenc
62659599516SKenneth E. Jansenc.... loop through the time steps
62759599516SKenneth E. Jansenc
62859599516SKenneth E. Jansen         istop=0
62959599516SKenneth E. Jansen         rmub=datmat(1,2,1)
63059599516SKenneth E. Jansen         if(rmutarget.gt.0) then
63159599516SKenneth E. Jansen            rmue=rmutarget
63259599516SKenneth E. Jansen         else
63359599516SKenneth E. Jansen            rmue=datmat(1,2,1) ! keep constant
63459599516SKenneth E. Jansen         endif
63559599516SKenneth E. Jansen
63659599516SKenneth E. Jansen        if(iramp.eq.1) then
63759599516SKenneth E. Jansen            call BCprofileScale(vbc_prof,BC,yold) ! fix the yold values to the reset BC
63859599516SKenneth E. Jansen            isclr=1 ! fix scalar
63959599516SKenneth E. Jansen            do isclr=1,nsclr
64059599516SKenneth E. Jansen               call itrBCSclr(yold,ac,iBC,BC,iper,ilwork)
64159599516SKenneth E. Jansen            enddo
64259599516SKenneth E. Jansen        endif
64359599516SKenneth E. Jansen
64459599516SKenneth E. Jansen         do 2000 istp = 1, nstp
64559599516SKenneth E. Jansen           if(iramp.eq.1)
64659599516SKenneth E. Jansen     &        call BCprofileScale(vbc_prof,BC,yold)
64759599516SKenneth E. Jansen
64859599516SKenneth E. Jansen           call rerun_check(stopjob)
649c89b8efeSKenneth E. Jansen           if(myrank.eq.master) write(*,*)
650c89b8efeSKenneth E. Jansen     &         'stopjob,lstep,istep', stopjob,lstep,istep
651c89b8efeSKenneth E. Jansen           if(stopjob.eq.lstep) then
652c89b8efeSKenneth E. Jansen              stopjob=-2 ! this is the code to finish
653c89b8efeSKenneth E. Jansen             if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then
654c89b8efeSKenneth E. Jansen                if(myrank.eq.master) write(*,*)
655c89b8efeSKenneth E. Jansen     &         'line 473 says last step written so exit'
656c89b8efeSKenneth E. Jansen                goto 2002  ! the step was written last step so just exit
657c89b8efeSKenneth E. Jansen             else
658c89b8efeSKenneth E. Jansen                if(myrank.eq.master)
659c89b8efeSKenneth E. Jansen     &         write(*,*) 'line 473 says last step not written'
660c89b8efeSKenneth E. Jansen                istep=nstp  ! have to do this so that solution will be written
661c89b8efeSKenneth E. Jansen                goto 2001
662c89b8efeSKenneth E. Jansen             endif
663c89b8efeSKenneth E. Jansen           endif
66459599516SKenneth E. Jansen
66559599516SKenneth E. Jansen            xi=istp*1.0/nstp
66659599516SKenneth E. Jansen            datmat(1,2,1)=rmub*(1.0-xi)+xi*rmue
66759599516SKenneth E. Jansenc            write(*,*) "current mol. visc = ", datmat(1,2,1)
66859599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC.
66959599516SKenneth E. Jansenc     these will be for time step n+1 so use lstep+1
67059599516SKenneth E. Jansenc
67159599516SKenneth E. Jansen            if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl,
67259599516SKenneth E. Jansen     &                               shpb, shglb, x, BC, iBC)
67359599516SKenneth E. Jansen
67459599516SKenneth E. Jansenc
67559599516SKenneth E. Jansenc ... calculate the pressure contribution that depends on the history for the Imp. BC
67659599516SKenneth E. Jansenc
67759599516SKenneth E. Jansen            if(numImpSrfs.gt.0) then
67859599516SKenneth E. Jansen               call pHist(poldImp,QHistImp,ImpConvCoef,
67959599516SKenneth E. Jansen     &                    ntimeptpT,numImpSrfs)
68059599516SKenneth E. Jansen               if (myrank.eq.master)
68159599516SKenneth E. Jansen     &             write(8177,*) (poldImp(n), n=1,numImpSrfs)
68259599516SKenneth E. Jansen            endif
68359599516SKenneth E. Jansenc
68459599516SKenneth E. Jansenc ... calc the pressure contribution that depends on the history for the RCR BC
68559599516SKenneth E. Jansenc
68659599516SKenneth E. Jansen            if(numRCRSrfs.gt.0) then
68759599516SKenneth E. Jansen               call CalcHopRCR (Delt(itseq), lstep, numRCRSrfs)
68859599516SKenneth E. Jansen               call CalcRCRConvCoef(lstep,numRCRSrfs)
68959599516SKenneth E. Jansen               call pHist(poldRCR,QHistRCR,RCRConvCoef,nsteprcr,
69059599516SKenneth E. Jansen     &              numRCRSrfs)
69159599516SKenneth E. Jansen               if (myrank.eq.master)
69259599516SKenneth E. Jansen     &             write(8177,*) (poldRCR(n), n=1,numRCRSrfs)
69359599516SKenneth E. Jansen            endif
69459599516SKenneth E. Jansenc
69559599516SKenneth E. Jansenc Decay of scalars
69659599516SKenneth E. Jansenc
69759599516SKenneth E. Jansen           if(nsclr.gt.0 .and. tdecay.ne.1) then
69859599516SKenneth E. Jansen              yold(:,6:ndof)=y(:,6:ndof)*tdecay
69959599516SKenneth E. Jansen              BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*tdecay
70059599516SKenneth E. Jansen           endif
70159599516SKenneth E. Jansen
70259599516SKenneth E. Jansen           if(nosource.eq.1) BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*0.8
70359599516SKenneth E. Jansen
70459599516SKenneth E. Jansen
70559599516SKenneth E. Jansen            if(iLES.gt.0) then  !complicated stuff has moved to
70659599516SKenneth E. Jansen                                        !routine below
70759599516SKenneth E. Jansen               call lesmodels(yold,  acold,     shgl,      shp,
70859599516SKenneth E. Jansen     &                        iper,  ilwork,    rowp,      colm,
70959599516SKenneth E. Jansen     &                        nsons, ifath,     x,
71059599516SKenneth E. Jansen     &                        iBC,   BC)
71159599516SKenneth E. Jansen
71259599516SKenneth E. Jansen
71359599516SKenneth E. Jansen            endif
71459599516SKenneth E. Jansen
71559599516SKenneth E. Jansenc.... set traction BCs for modeled walls
71659599516SKenneth E. Jansenc
71759599516SKenneth E. Jansen            if (itwmod.ne.0) then
71859599516SKenneth E. Jansen               call asbwmod(yold,   acold,   x,      BC,     iBC,
71959599516SKenneth E. Jansen     &                      iper,   ilwork,  ifath,  velbar)
72059599516SKenneth E. Jansen            endif
72159599516SKenneth E. Jansen
72259599516SKenneth E. Jansen!MR CHANGE
72359599516SKenneth E. Jansenc
72459599516SKenneth E. Jansenc.... Determine whether the vorticity field needs to be computed for this time step or not
72559599516SKenneth E. Jansenc
72659599516SKenneth E. Jansen            icomputevort = 0
72759599516SKenneth E. Jansen            if (ivort == 1) then ! Print vorticity = True in solver.inp
72859599516SKenneth E. Jansen              ! We then compute the vorticity only if we
72959599516SKenneth E. Jansen              ! 1) we write an intermediate checkpoint
73059599516SKenneth E. Jansen              ! 2) we reach the last time step and write the last checkpoint
73159599516SKenneth E. Jansen              ! 3) we accumulate statistics in ybar for every time step
73259599516SKenneth E. Jansen              ! BEWARE: we need here lstep+1 and istep+1 because the lstep and
73359599516SKenneth E. Jansen              ! istep gets incremened after the flowsolve, further below
73459599516SKenneth E. Jansen              if (((irs .ge. 1) .and. (mod(lstep+1, ntout) .eq. 0)) .or.
73559599516SKenneth E. Jansen     &                   istep+1.eq.nstep(itseq) .or. ioybar == 1) then
73659599516SKenneth E. Jansen                icomputevort = 1
73759599516SKenneth E. Jansen              endif
73859599516SKenneth E. Jansen            endif
73959599516SKenneth E. Jansen
74059599516SKenneth E. Jansen!            write(*,*) 'icomputevort: ',icomputevort, ' - istep: ',
74159599516SKenneth E. Jansen!     &                istep,' - nstep(itseq):',nstep(itseq),'- lstep:',
74259599516SKenneth E. Jansen!     &                lstep, '- ntout:', ntout
74359599516SKenneth E. Jansen!MR CHANGE
74459599516SKenneth E. Jansen
74559599516SKenneth E. Jansenc
74659599516SKenneth E. Jansenc.... -----------------------> predictor phase <-----------------------
74759599516SKenneth E. Jansenc
74859599516SKenneth E. Jansen            call itrPredict(yold, y,   acold,  ac ,  uold,  u, iBC)
74959599516SKenneth E. Jansen            call itrBC (y,  ac,  iBC,  BC,  iper,ilwork)
75059599516SKenneth E. Jansen
75159599516SKenneth E. Jansen            if(nsolt.eq.1) then
75259599516SKenneth E. Jansen               isclr=0
75359599516SKenneth E. Jansen               call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
75459599516SKenneth E. Jansen            endif
75559599516SKenneth E. Jansen            do isclr=1,nsclr
75659599516SKenneth E. Jansen               call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
75759599516SKenneth E. Jansen            enddo
75859599516SKenneth E. Jansen            iter=0
75959599516SKenneth E. Jansen            ilss=0  ! this is a switch thrown on first solve of LS redistance
76059599516SKenneth E. Jansen            do istepc=1,seqsize
76159599516SKenneth E. Jansen               icode=stepseq(istepc)
76259599516SKenneth E. Jansen               if(mod(icode,5).eq.0) then ! this is a solve
76359599516SKenneth E. Jansen                  isolve=icode/10
76459599516SKenneth E. Jansen                  if(icode.eq.0) then ! flow solve (encoded as 0)
76559599516SKenneth E. Jansenc
76659599516SKenneth E. Jansen                     iter   = iter+1
76759599516SKenneth E. Jansen                     ifuncs(1)  = ifuncs(1) + 1
76859599516SKenneth E. Jansenc
76959599516SKenneth E. Jansen                     Force(1) = zero
77059599516SKenneth E. Jansen                     Force(2) = zero
77159599516SKenneth E. Jansen                     Force(3) = zero
77259599516SKenneth E. Jansen                     HFlux    = zero
77359599516SKenneth E. Jansen                     lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
77459599516SKenneth E. Jansen
77559599516SKenneth E. Jansen                     call SolFlow(y,          ac,        u,
77659599516SKenneth E. Jansen     &                         yold,          acold,     uold,
77759599516SKenneth E. Jansen     &                         x,             iBC,
77859599516SKenneth E. Jansen     &                         BC,            res,
77959599516SKenneth E. Jansen     &                         nPermDims,     nTmpDims,  aperm,
78059599516SKenneth E. Jansen     &                         atemp,         iper,
78159599516SKenneth E. Jansen     &                         ilwork,        shp,       shgl,
78259599516SKenneth E. Jansen     &                         shpb,          shglb,     rowp,
78359599516SKenneth E. Jansen     &                         colm,          lhsK,      lhsP,
78459599516SKenneth E. Jansen     &                         solinc,        rerr,      tcorecp,
785bd36043dSBen Matthews     &                         GradV,      sumtime
786bd36043dSBen Matthews#ifdef HAVE_SVLS
787bd36043dSBen Matthews     &                         ,svLS_lhs,     svLS_ls,  svLS_nFaces)
788bd36043dSBen Matthews#else
789bd36043dSBen Matthews     &                         )
790bd36043dSBen Matthews#endif
79159599516SKenneth E. Jansen
79259599516SKenneth E. Jansen                  else          ! scalar type solve
79359599516SKenneth E. Jansen                     if (icode.eq.5) then ! Solve for Temperature
79459599516SKenneth E. Jansen                                ! (encoded as (nsclr+1)*10)
79559599516SKenneth E. Jansen                        isclr=0
79659599516SKenneth E. Jansen                        ifuncs(2)  = ifuncs(2) + 1
79759599516SKenneth E. Jansen                        j=1
79859599516SKenneth E. Jansen                     else       ! solve a scalar  (encoded at isclr*10)
79959599516SKenneth E. Jansen                        isclr=isolve
80059599516SKenneth E. Jansen                        ifuncs(isclr+2)  = ifuncs(isclr+2) + 1
80159599516SKenneth E. Jansen                        j=isclr+nsolt
80259599516SKenneth E. Jansen                        if((iLSet.eq.2).and.(ilss.eq.0)
80359599516SKenneth E. Jansen     &                       .and.(isclr.eq.2)) then
80459599516SKenneth E. Jansen                           ilss=1 ! throw switch (once per step)
80559599516SKenneth E. Jansen                           y(:,7)=y(:,6) ! redistance field initialized
80659599516SKenneth E. Jansen                           ac(:,7)   = zero
80759599516SKenneth E. Jansen                           call itrBCSclr (  y,  ac,  iBC,  BC, iper,
80859599516SKenneth E. Jansen     &                          ilwork)
80959599516SKenneth E. Jansenc
81059599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the
81159599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar
81259599516SKenneth E. Jansenc
81359599516SKenneth E. Jansen                           alfit=alfi
81459599516SKenneth E. Jansen                           gamit=gami
81559599516SKenneth E. Jansen                           almit=almi
81659599516SKenneth E. Jansen                           Deltt=Delt(1)
81759599516SKenneth E. Jansen                           Dtglt=Dtgl
81859599516SKenneth E. Jansen                           alfi = 1
81959599516SKenneth E. Jansen                           gami = 1
82059599516SKenneth E. Jansen                           almi = 1
82159599516SKenneth E. Jansenc     Delt(1)= Deltt ! Give a pseudo time step
82259599516SKenneth E. Jansen                           Dtgl = one / Delt(1)
82359599516SKenneth E. Jansen                        endif  ! level set eq. 2
82459599516SKenneth E. Jansen                     endif ! deciding between temperature and scalar
82559599516SKenneth E. Jansen
82659599516SKenneth E. Jansen                     lhs = 1 - min(1,mod(ifuncs(isclr+2)-1,
82759599516SKenneth E. Jansen     &                                   LHSupd(isclr+2)))
82859599516SKenneth E. Jansen
82959599516SKenneth E. Jansen                     call SolSclr(y,          ac,        u,
83059599516SKenneth E. Jansen     &                         yold,          acold,     uold,
83159599516SKenneth E. Jansen     &                         x,             iBC,
83259599516SKenneth E. Jansen     &                         BC,            nPermDimsS,nTmpDimsS,
83359599516SKenneth E. Jansen     &                         apermS(1,1,j), atempS,    iper,
83459599516SKenneth E. Jansen     &                         ilwork,        shp,       shgl,
83559599516SKenneth E. Jansen     &                         shpb,          shglb,     rowp,
83659599516SKenneth E. Jansen     &                         colm,          lhsS(1,j),
837bd36043dSBen Matthews     &                         solinc(1,isclr+5), tcorecpscal
838bd36043dSBen Matthews#ifdef HAVE_SVLS
839bd36043dSBen Matthews     &                         ,svLS_lhs_S(isclr),   svLS_ls_S(isclr), svls_nfaces)
840bd36043dSBen Matthews#else
841bd36043dSBen Matthews     &                         )
842bd36043dSBen Matthews#endif
84359599516SKenneth E. Jansen
84459599516SKenneth E. Jansen
84559599516SKenneth E. Jansen                  endif         ! end of scalar type solve
84659599516SKenneth E. Jansen
84759599516SKenneth E. Jansen               else ! this is an update  (mod did not equal zero)
84859599516SKenneth E. Jansen                  iupdate=icode/10  ! what to update
84959599516SKenneth E. Jansen                  if(icode.eq.1) then !update flow
85059599516SKenneth E. Jansen                     call itrCorrect ( y,    ac,    u,   solinc, iBC)
85159599516SKenneth E. Jansen                     call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
85259599516SKenneth E. Jansen                  else  ! update scalar
85359599516SKenneth E. Jansen                     isclr=iupdate  !unless
85459599516SKenneth E. Jansen                     if(icode.eq.6) isclr=0
85559599516SKenneth E. Jansen                     if(iRANS.lt.-100)then  ! RANS
85659599516SKenneth E. Jansen                        call itrCorrectSclrPos(y,ac,solinc(1,isclr+5))
85759599516SKenneth E. Jansen                     else
85859599516SKenneth E. Jansen                        call itrCorrectSclr (y, ac, solinc(1,isclr+5))
85959599516SKenneth E. Jansen                     endif
86059599516SKenneth E. Jansen                     if (ilset.eq.2 .and. isclr.eq.2)  then
86159599516SKenneth E. Jansen                        if (ivconstraint .eq. 1) then
86259599516SKenneth E. Jansen                           call itrBCSclr (  y,  ac,  iBC,  BC, iper,
86359599516SKenneth E. Jansen     &                          ilwork)
86459599516SKenneth E. Jansenc
86559599516SKenneth E. Jansenc ... applying the volume constraint on second level set scalar
86659599516SKenneth E. Jansenc
86759599516SKenneth E. Jansen                           call solvecon (y,    x,      iBC,  BC,
86859599516SKenneth E. Jansen     &                          iper, ilwork, shp,  shgl)
86959599516SKenneth E. Jansenc
87059599516SKenneth E. Jansen                        endif   ! end of volume constraint calculations
87159599516SKenneth E. Jansen                     endif      ! end of redistance calculations
87259599516SKenneth E. Jansenc
87359599516SKenneth E. Jansen                        call itrBCSclr (  y,  ac,  iBC,  BC, iper,
87459599516SKenneth E. Jansen     &                       ilwork)
87559599516SKenneth E. Jansen                     endif      ! end of flow or scalar update
87659599516SKenneth E. Jansen                  endif         ! end of switch between solve or update
87759599516SKenneth E. Jansen               enddo            ! loop over sequence in step
87859599516SKenneth E. Jansenc
87959599516SKenneth E. Jansenc
88059599516SKenneth E. Jansenc.... obtain the time average statistics
88159599516SKenneth E. Jansenc
88259599516SKenneth E. Jansen            if (ioform .eq. 2) then
88359599516SKenneth E. Jansen
88459599516SKenneth E. Jansen               call stsGetStats( y,      yold,     ac,     acold,
88559599516SKenneth E. Jansen     &                           u,      uold,     x,
88659599516SKenneth E. Jansen     &                           shp,    shgl,     shpb,   shglb,
88759599516SKenneth E. Jansen     &                           iBC,    BC,       iper,   ilwork,
88859599516SKenneth E. Jansen     &                           rowp,   colm,     lhsK,   lhsP )
88959599516SKenneth E. Jansen            endif
89059599516SKenneth E. Jansen
89159599516SKenneth E. Jansenc
89259599516SKenneth E. Jansenc  Find the solution at the end of the timestep and move it to old
89359599516SKenneth E. Jansenc
89459599516SKenneth E. Jansenc
89559599516SKenneth E. Jansenc ...First to reassign the parameters for the original time integrator scheme
89659599516SKenneth E. Jansenc
89759599516SKenneth E. Jansen            if((iLSet.eq.2).and.(ilss.eq.1)) then
89859599516SKenneth E. Jansen               alfi =alfit
89959599516SKenneth E. Jansen               gami =gamit
90059599516SKenneth E. Jansen               almi =almit
90159599516SKenneth E. Jansen               Delt(1)=Deltt
90259599516SKenneth E. Jansen               Dtgl =Dtglt
90359599516SKenneth E. Jansen            endif
90459599516SKenneth E. Jansen            call itrUpdate( yold,  acold,   uold,  y,    ac,   u)
90559599516SKenneth E. Jansen            call itrBC (yold, acold,  iBC,  BC,  iper,ilwork)
90659599516SKenneth E. Jansen
90759599516SKenneth E. Jansen            istep = istep + 1
90859599516SKenneth E. Jansen            lstep = lstep + 1
90959599516SKenneth E. Jansenc
91059599516SKenneth E. Jansenc ..  Print memory consumption on BGQ
91159599516SKenneth E. Jansenc
91259599516SKenneth E. Jansen            call printmeminfo("itrdrv"//char(0))
91359599516SKenneth E. Jansen
91459599516SKenneth E. Jansenc
91559599516SKenneth E. Jansenc ..  Compute vorticity
91659599516SKenneth E. Jansenc
91759599516SKenneth E. Jansen            if ( icomputevort == 1) then
91859599516SKenneth E. Jansen
91959599516SKenneth E. Jansen              ! vorticity components and magnitude
92059599516SKenneth E. Jansen              vorticity(:,1) = GradV(:,8)-GradV(:,6) !omega_x
92159599516SKenneth E. Jansen              vorticity(:,2) = GradV(:,3)-GradV(:,7) !omega_y
92259599516SKenneth E. Jansen              vorticity(:,3) = GradV(:,4)-GradV(:,2) !omega_z
92359599516SKenneth E. Jansen              vorticity(:,4) = sqrt(   vorticity(:,1)*vorticity(:,1)
92459599516SKenneth E. Jansen     &                               + vorticity(:,2)*vorticity(:,2)
92559599516SKenneth E. Jansen     &                               + vorticity(:,3)*vorticity(:,3) )
92659599516SKenneth E. Jansen              ! Q
92759599516SKenneth E. Jansen              strain(:,1) = GradV(:,1)                  !S11
92859599516SKenneth E. Jansen              strain(:,2) = 0.5*(GradV(:,2)+GradV(:,4)) !S12
92959599516SKenneth E. Jansen              strain(:,3) = 0.5*(GradV(:,3)+GradV(:,7)) !S13
93059599516SKenneth E. Jansen              strain(:,4) = GradV(:,5)                  !S22
93159599516SKenneth E. Jansen              strain(:,5) = 0.5*(GradV(:,6)+GradV(:,8)) !S23
93259599516SKenneth E. Jansen              strain(:,6) = GradV(:,9)                  !S33
93359599516SKenneth E. Jansen
93459599516SKenneth E. Jansen              vorticity(:,5) = 0.25*( vorticity(:,4)*vorticity(:,4)  !Q
93559599516SKenneth E. Jansen     &                            - 2.0*(      strain(:,1)*strain(:,1)
93659599516SKenneth E. Jansen     &                                    + 2* strain(:,2)*strain(:,2)
93759599516SKenneth E. Jansen     &                                    + 2* strain(:,3)*strain(:,3)
93859599516SKenneth E. Jansen     &                                    +    strain(:,4)*strain(:,4)
93959599516SKenneth E. Jansen     &                                    + 2* strain(:,5)*strain(:,5)
94059599516SKenneth E. Jansen     &                                    +    strain(:,6)*strain(:,6)))
94159599516SKenneth E. Jansen
94259599516SKenneth E. Jansen            endif
94359599516SKenneth E. Jansenc
9449dcf5646SKenneth E. Jansenc.... update and the aerodynamic forces
9459dcf5646SKenneth E. Jansenc
9469dcf5646SKenneth E. Jansen            call forces ( yold,  ilwork )
9479dcf5646SKenneth E. Jansen
9489dcf5646SKenneth E. Jansenc
949c89b8efeSKenneth E. Jansenc .. write out the instantaneous solution
95059599516SKenneth E. Jansenc
951c89b8efeSKenneth E. Jansen2001    continue  ! we could get here by 2001 label if user requested stop
95259599516SKenneth E. Jansen        if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or.
95359599516SKenneth E. Jansen     &      istep.eq.nstep(itseq)) then
954c89b8efeSKenneth E. Jansen
955c89b8efeSKenneth E. Jansen!so that we can see progress in force file close it so that it flushes
956c89b8efeSKenneth E. Jansen!and  then reopen in append mode
957c89b8efeSKenneth E. Jansen
958c89b8efeSKenneth E. Jansen           close(iforce)
959c89b8efeSKenneth E. Jansen           open (unit=iforce, file=fforce, position='append')
96059599516SKenneth E. Jansen
96159599516SKenneth E. Jansen!              Call to restar() will open restart file in write mode (and not append mode)
96259599516SKenneth E. Jansen!              that is needed as other fields are written in append mode
963c89b8efeSKenneth E. Jansen
96459599516SKenneth E. Jansen           call restar ('out ',  yold  ,ac)
96559599516SKenneth E. Jansen           if(ideformwall == 1) then
9669dcf5646SKenneth E. Jansen!              call write_displ(myrank, lstep, nshg, 3, uold )
9674c3261e2SCameron Smith             if(myrank.eq.master) then
9684c3261e2SCameron Smith               write(*,*) 'ideformwall is 1 and is a dead code path... exiting'
9694c3261e2SCameron Smith             endif
9704c3261e2SCameron Smith             stop
97159599516SKenneth E. Jansen           endif
97259599516SKenneth E. Jansen
97359599516SKenneth E. Jansen           if(ivort == 1) then
97459599516SKenneth E. Jansen             call write_field(myrank,'a','vorticity',9,vorticity,
97559599516SKenneth E. Jansen     &                       'd',nshg,5,lstep)
97659599516SKenneth E. Jansen           endif
97759599516SKenneth E. Jansen
97859599516SKenneth E. Jansen           call printmeminfo("itrdrv after checkpoint"//char(0))
979c89b8efeSKenneth E. Jansen         else if(stopjob.eq.-2) then
980c89b8efeSKenneth E. Jansen           if(myrank.eq.master) then
981c89b8efeSKenneth E. Jansen             write(*,*) 'line 755 says no write before stopping'
982c89b8efeSKenneth E. Jansen             write(*,*) 'istep,nstep,irs',istep,nstep(itseq),irs
98359599516SKenneth E. Jansen           endif
984c89b8efeSKenneth E. Jansen        endif  !just the instantaneous stuff for videos
985c89b8efeSKenneth E. Jansenc
986c89b8efeSKenneth E. Jansenc.... compute the consistent boundary flux
987c89b8efeSKenneth E. Jansenc
988c89b8efeSKenneth E. Jansen            if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
989c89b8efeSKenneth E. Jansen               call Bflux ( yold,      acold,      uold,    x,
990c89b8efeSKenneth E. Jansen     &                      shp,       shgl,       shpb,
991c89b8efeSKenneth E. Jansen     &                      shglb,     ilwork,     iBC,
992c89b8efeSKenneth E. Jansen     &                      BC,        iper,       wallssVec)
993c89b8efeSKenneth E. Jansen            endif
994c89b8efeSKenneth E. Jansen
995c89b8efeSKenneth E. Jansen           if(stopjob.eq.-2) goto 2003
996c89b8efeSKenneth E. Jansen
99759599516SKenneth E. Jansen
99859599516SKenneth E. Jansenc
99959599516SKenneth E. Jansenc ... update the flow history for the impedance convolution, filter it and write it out
100059599516SKenneth E. Jansenc
100159599516SKenneth E. Jansen            if(numImpSrfs.gt.zero) then
100259599516SKenneth E. Jansen               call UpdHistConv(y,nsrflistImp,numImpSrfs) !uses Delt(1)
100359599516SKenneth E. Jansen            endif
100459599516SKenneth E. Jansen
100559599516SKenneth E. Jansenc
100659599516SKenneth E. Jansenc ... update the flow history for the RCR convolution
100759599516SKenneth E. Jansenc
100859599516SKenneth E. Jansen            if(numRCRSrfs.gt.zero) then
100959599516SKenneth E. Jansen               call UpdHistConv(y,nsrflistRCR,numRCRSrfs) !uses lstep
101059599516SKenneth E. Jansen            endif
101159599516SKenneth E. Jansen
101259599516SKenneth E. Jansen
101359599516SKenneth E. Jansenc...  dump TIME SERIES
101459599516SKenneth E. Jansen
101559599516SKenneth E. Jansen            if (exts) then
101659599516SKenneth E. Jansen               if (mod(lstep-1,freq).eq.0) then
101759599516SKenneth E. Jansen
101859599516SKenneth E. Jansen                  if (numpe > 1) then
101959599516SKenneth E. Jansen                     do jj = 1, ntspts
102059599516SKenneth E. Jansen                        vartssoln((jj-1)*ndof+1:jj*ndof)=varts(jj,:)
102159599516SKenneth E. Jansen                        ivarts=zero
102259599516SKenneth E. Jansen                     enddo
102359599516SKenneth E. Jansen                     do k=1,ndof*ntspts
102459599516SKenneth E. Jansen                        if(vartssoln(k).ne.zero) ivarts(k)=1
102559599516SKenneth E. Jansen                     enddo
102659599516SKenneth E. Jansen
102759599516SKenneth E. Jansen!                     call MPI_REDUCE(vartssoln, vartssolng, ndof*ntspts,
102859599516SKenneth E. Jansen!     &                    MPI_DOUBLE_PRECISION, MPI_SUM, master,
102959599516SKenneth E. Jansen!     &                    MPI_COMM_WORLD, ierr)
103059599516SKenneth E. Jansen
103159599516SKenneth E. Jansen                     call MPI_BARRIER(MPI_COMM_WORLD, ierr)
103259599516SKenneth E. Jansen                     call MPI_ALLREDUCE(vartssoln, vartssolng,
103359599516SKenneth E. Jansen     &                    ndof*ntspts,
103459599516SKenneth E. Jansen     &                    MPI_DOUBLE_PRECISION, MPI_SUM,
103559599516SKenneth E. Jansen     &                    MPI_COMM_WORLD, ierr)
103659599516SKenneth E. Jansen
103759599516SKenneth E. Jansen!                     call MPI_REDUCE(ivarts, ivartsg, ndof*ntspts,
103859599516SKenneth E. Jansen!     &                    MPI_INTEGER, MPI_SUM, master,
103959599516SKenneth E. Jansen!     &                    MPI_COMM_WORLD, ierr)
104059599516SKenneth E. Jansen
104159599516SKenneth E. Jansen                     call MPI_BARRIER(MPI_COMM_WORLD, ierr)
104259599516SKenneth E. Jansen                     call MPI_ALLREDUCE(ivarts, ivartsg, ndof*ntspts,
104359599516SKenneth E. Jansen     &                    MPI_INTEGER, MPI_SUM,
104459599516SKenneth E. Jansen     &                    MPI_COMM_WORLD, ierr)
104559599516SKenneth E. Jansen
104659599516SKenneth E. Jansen!                     if (myrank.eq.zero) then
104759599516SKenneth E. Jansen                     do jj = 1, ntspts
104859599516SKenneth E. Jansen
104959599516SKenneth E. Jansen                        if(myrank .eq. iv_rank(jj)) then
105059599516SKenneth E. Jansen                           ! No need to update all varts components, only the one treated by the expected rank
105159599516SKenneth E. Jansen                           ! Note: keep varts as a vector, as multiple probes could be treated by one rank
105259599516SKenneth E. Jansen                           indxvarts = (jj-1)*ndof
105359599516SKenneth E. Jansen                           do k=1,ndof
105459599516SKenneth E. Jansen                              if(ivartsg(indxvarts+k).ne.0) then ! none of the vartssoln(parts) were non zero
105559599516SKenneth E. Jansen                                 varts(jj,k)=vartssolng(indxvarts+k)/
105659599516SKenneth E. Jansen     &                                             ivartsg(indxvarts+k)
105759599516SKenneth E. Jansen                              endif
105859599516SKenneth E. Jansen                           enddo
105959599516SKenneth E. Jansen                       endif !only if myrank eq iv_rank(jj)
106059599516SKenneth E. Jansen                     enddo
106159599516SKenneth E. Jansen!                     endif !only on master
106259599516SKenneth E. Jansen                  endif !only if numpe > 1
106359599516SKenneth E. Jansen
106459599516SKenneth E. Jansen!                  if (myrank.eq.zero) then
106559599516SKenneth E. Jansen                  do jj = 1, ntspts
106659599516SKenneth E. Jansen                     if(myrank .eq. iv_rank(jj)) then
106759599516SKenneth E. Jansen                        ifile = 1000+jj
106859599516SKenneth E. Jansen                        write(ifile,555) lstep, (varts(jj,k),k=1,ndof) !Beware of format 555 - check ndof
106959599516SKenneth E. Jansenc                        call flush(ifile)
107059599516SKenneth E. Jansen                        if (((irs .ge. 1) .and.
107159599516SKenneth E. Jansen     &                       (mod(lstep, ntout) .eq. 0))) then
107259599516SKenneth E. Jansen                           close(ifile)
107359599516SKenneth E. Jansen                           fvarts='varts/varts'
107459599516SKenneth E. Jansen                           fvarts=trim(fvarts)//trim(cname2(jj))
107559599516SKenneth E. Jansen                           fvarts=trim(fvarts)//trim(cname2(lskeep))
107659599516SKenneth E. Jansen                           fvarts=trim(fvarts)//'.dat'
107759599516SKenneth E. Jansen                           fvarts=trim(fvarts)
107859599516SKenneth E. Jansen                           open(unit=ifile, file=fvarts,
107959599516SKenneth E. Jansen     &                          position='append')
108059599516SKenneth E. Jansen                        endif !only when dumping restart
108159599516SKenneth E. Jansen                     endif
108259599516SKenneth E. Jansen                  enddo
108359599516SKenneth E. Jansen!                  endif !only on master
108459599516SKenneth E. Jansen
108559599516SKenneth E. Jansen                  varts(:,:) = zero ! reset the array for next step
108659599516SKenneth E. Jansen
108759599516SKenneth E. Jansen
108859599516SKenneth E. Jansen!555              format(i6,5(2x,E12.5e2))
108959599516SKenneth E. Jansen555               format(i6,6(2x,E20.12e2)) !assuming ndof = 6 here
109059599516SKenneth E. Jansen
109159599516SKenneth E. Jansen               endif
109259599516SKenneth E. Jansen            endif
109359599516SKenneth E. Jansen
109459599516SKenneth E. Jansen            if((irscale.ge.0).or.(itwmod.gt.0))
109559599516SKenneth E. Jansen     &           call getvel (yold,     ilwork, iBC,
109659599516SKenneth E. Jansen     &                        nsons,    ifath, velbar)
109759599516SKenneth E. Jansen
109859599516SKenneth E. Jansen            if((irscale.ge.0).and.(myrank.eq.master)) then
109959599516SKenneth E. Jansen               call genscale(yold,       x,       iper,
110059599516SKenneth E. Jansen     &                       iBC,     ifath,   velbar,
110159599516SKenneth E. Jansen     &                       nsons)
110259599516SKenneth E. Jansen            endif
110359599516SKenneth E. Jansenc
110459599516SKenneth E. Jansenc....  print out results.
110559599516SKenneth E. Jansenc
110659599516SKenneth E. Jansen            ntoutv=max(ntout,100)   ! velb is not needed so often
110759599516SKenneth E. Jansen            if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then
110859599516SKenneth E. Jansen               if( (mod(lstep, ntoutv) .eq. 0) .and.
110959599516SKenneth E. Jansen     &              ((irscale.ge.0).or.(itwmod.gt.0) .or.
111059599516SKenneth E. Jansen     &              ((nsonmax.eq.1).and.(iLES.gt.0))))
111159599516SKenneth E. Jansen     &              call rwvelb  ('out ',  velbar  ,ifail)
111259599516SKenneth E. Jansen            endif
111359599516SKenneth E. Jansenc
111459599516SKenneth E. Jansenc.... end of the NSTEP and NTSEQ loops
111559599516SKenneth E. Jansenc
111659599516SKenneth E. Jansen
111759599516SKenneth E. Jansen
111859599516SKenneth E. Jansenc
111959599516SKenneth E. Jansenc.... -------------------> error calculation  <-----------------
112059599516SKenneth E. Jansenc
112159599516SKenneth E. Jansen            if(ierrcalc.eq.1 .or. ioybar.eq.1) then
112259599516SKenneth E. Jansenc$$$c
112359599516SKenneth E. Jansenc$$$c compute average
112459599516SKenneth E. Jansenc$$$c
112559599516SKenneth E. Jansenc$$$               tfact=one/istep
112659599516SKenneth E. Jansenc$$$               ybar =tfact*yold + (one-tfact)*ybar
112759599516SKenneth E. Jansen
112859599516SKenneth E. Jansenc compute average
112959599516SKenneth E. Jansenc ybar(:,1:3) are average velocity components
113059599516SKenneth E. Jansenc ybar(:,4) is average pressure
113159599516SKenneth E. Jansenc ybar(:,5) is average speed
113259599516SKenneth E. Jansenc ybar(:,6:8) is average of sq. of each vel. component
113359599516SKenneth E. Jansenc ybar(:,9) is average of sq. of pressure
113459599516SKenneth E. Jansenc ybar(:,10:12) is average of cross vel. components : uv, uw and vw
113559599516SKenneth E. Jansenc averaging procedure justified only for identical time step sizes
113659599516SKenneth E. Jansenc ybar(:,13) is average of eddy viscosity
113759599516SKenneth E. Jansenc ybar(:,14:16) is average vorticity components
113859599516SKenneth E. Jansenc ybar(:,17) is average vorticity magnitude
113959599516SKenneth E. Jansenc istep is number of time step
114059599516SKenneth E. Jansenc
114159599516SKenneth E. Jansen               icollectybar = 0
114259599516SKenneth E. Jansen          if(nphasesincycle.eq.0 .or.
114359599516SKenneth E. Jansen     &            istep.gt.ncycles_startphaseavg*nstepsincycle) then
114459599516SKenneth E. Jansen                 icollectybar = 1
114559599516SKenneth E. Jansen                  if((istep-1).eq.ncycles_startphaseavg*nstepsincycle)
114659599516SKenneth E. Jansen     &               istepsinybar = 0 ! init. to zero in first cycle in avg.
114759599516SKenneth E. Jansen               endif
114859599516SKenneth E. Jansen
114959599516SKenneth E. Jansen               if(icollectybar.eq.1) then
115059599516SKenneth E. Jansen                  istepsinybar = istepsinybar+1
115159599516SKenneth E. Jansen                  tfact=one/istepsinybar
115259599516SKenneth E. Jansen
115359599516SKenneth E. Jansen                  if(myrank.eq.master .and. nphasesincycle.ne.0 .and.
115459599516SKenneth E. Jansen     &               mod((istep-1),nstepsincycle).eq.0)
115559599516SKenneth E. Jansen     &               write(*,*)'nsamples in phase average:',istepsinybar
115659599516SKenneth E. Jansen
115759599516SKenneth E. Jansenc ybar to contain the averaged ((u,v,w),p)-fields
115859599516SKenneth E. Jansenc and speed average, i.e., sqrt(u^2+v^2+w^2)
115959599516SKenneth E. Jansenc and avg. of sq. terms including
116059599516SKenneth E. Jansenc u^2, v^2, w^2, p^2 and cross terms of uv, uw and vw
116159599516SKenneth E. Jansen
116259599516SKenneth E. Jansen                  ybar(:,1) = tfact*yold(:,1) + (one-tfact)*ybar(:,1)
116359599516SKenneth E. Jansen                  ybar(:,2) = tfact*yold(:,2) + (one-tfact)*ybar(:,2)
116459599516SKenneth E. Jansen                  ybar(:,3) = tfact*yold(:,3) + (one-tfact)*ybar(:,3)
116559599516SKenneth E. Jansen                  ybar(:,4) = tfact*yold(:,4) + (one-tfact)*ybar(:,4)
116659599516SKenneth E. Jansen                  ybar(:,5) = tfact*sqrt(yold(:,1)**2+yold(:,2)**2+
116759599516SKenneth E. Jansen     &                        yold(:,3)**2) + (one-tfact)*ybar(:,5)
116859599516SKenneth E. Jansen                  ybar(:,6) = tfact*yold(:,1)**2 +
116959599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,6)
117059599516SKenneth E. Jansen                  ybar(:,7) = tfact*yold(:,2)**2 +
117159599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,7)
117259599516SKenneth E. Jansen                  ybar(:,8) = tfact*yold(:,3)**2 +
117359599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,8)
117459599516SKenneth E. Jansen                  ybar(:,9) = tfact*yold(:,4)**2 +
117559599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,9)
117659599516SKenneth E. Jansen                  ybar(:,10) = tfact*yold(:,1)*yold(:,2) + !uv
117759599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,10)
117859599516SKenneth E. Jansen                  ybar(:,11) = tfact*yold(:,1)*yold(:,3) + !uw
117959599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,11)
118059599516SKenneth E. Jansen                  ybar(:,12) = tfact*yold(:,2)*yold(:,3) + !vw
118159599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,12)
118259599516SKenneth E. Jansen!MR CHANGE
118359599516SKenneth E. Jansen                  if(nsclr.gt.0) !nut
118459599516SKenneth E. Jansen     &             ybar(:,13) = tfact*yold(:,6) + (one-tfact)*ybar(:,13)
118559599516SKenneth E. Jansen
118659599516SKenneth E. Jansen                  if(ivort == 1) then !vorticity
118759599516SKenneth E. Jansen                    ybar(:,14) = tfact*vorticity(:,1) +
118859599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,14)
118959599516SKenneth E. Jansen                    ybar(:,15) = tfact*vorticity(:,2) +
119059599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,15)
119159599516SKenneth E. Jansen                    ybar(:,16) = tfact*vorticity(:,3) +
119259599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,16)
119359599516SKenneth E. Jansen                    ybar(:,17) = tfact*vorticity(:,4) +
119459599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,17)
119559599516SKenneth E. Jansen                  endif
119659599516SKenneth E. Jansen
119759599516SKenneth E. Jansen                  if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
119859599516SKenneth E. Jansen                    wallssVecBar(:,1) = tfact*wallssVec(:,1)
119959599516SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,1)
120059599516SKenneth E. Jansen                    wallssVecBar(:,2) = tfact*wallssVec(:,2)
120159599516SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,2)
120259599516SKenneth E. Jansen                    wallssVecBar(:,3) = tfact*wallssVec(:,3)
120359599516SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,3)
120459599516SKenneth E. Jansen                  endif
120559599516SKenneth E. Jansen!MR CHANGE END
120659599516SKenneth E. Jansen               endif
120759599516SKenneth E. Jansenc
120859599516SKenneth E. Jansenc compute phase average
120959599516SKenneth E. Jansenc
121059599516SKenneth E. Jansen               if(nphasesincycle.ne.0 .and.
121159599516SKenneth E. Jansen     &            istep.gt.ncycles_startphaseavg*nstepsincycle) then
121259599516SKenneth E. Jansen
121359599516SKenneth E. Jansenc beginning of cycle is considered as ncycles_startphaseavg*nstepsincycle+1
121459599516SKenneth E. Jansen                  if((istep-1).eq.ncycles_startphaseavg*nstepsincycle)
121559599516SKenneth E. Jansen     &               icyclesinavg = 0 ! init. to zero in first cycle in avg.
121659599516SKenneth E. Jansen
121759599516SKenneth E. Jansen                  ! find number of steps between phases
121859599516SKenneth E. Jansen                  nstepsbtwphase = nstepsincycle/nphasesincycle ! integer value
121959599516SKenneth E. Jansen                  if(mod(istep-1,nstepsincycle).eq.0) then
122059599516SKenneth E. Jansen                     iphase = 1 ! init. to one in beginning of every cycle
122159599516SKenneth E. Jansen                     icyclesinavg = icyclesinavg + 1
122259599516SKenneth E. Jansen                  endif
122359599516SKenneth E. Jansen
122459599516SKenneth E. Jansen                  icollectphase = 0
122559599516SKenneth E. Jansen                  istepincycle = mod(istep,nstepsincycle)
122659599516SKenneth E. Jansen                  if(istepincycle.eq.0) istepincycle=nstepsincycle
122759599516SKenneth E. Jansen                  if(istepincycle.eq.iphase*nstepsbtwphase) then
122859599516SKenneth E. Jansen                     icollectphase = 1
122959599516SKenneth E. Jansen                     iphase = iphase+1 ! use 'iphase-1' below
123059599516SKenneth E. Jansen                  endif
123159599516SKenneth E. Jansen
123259599516SKenneth E. Jansen                  if(icollectphase.eq.1) then
123359599516SKenneth E. Jansen                     tfactphase = one/icyclesinavg
123459599516SKenneth E. Jansen
123559599516SKenneth E. Jansen                     if(myrank.eq.master) then
123659599516SKenneth E. Jansen                       write(*,*) 'nsamples in phase ',iphase-1,': ',
123759599516SKenneth E. Jansen     &                             icyclesinavg
123859599516SKenneth E. Jansen                     endif
123959599516SKenneth E. Jansen
124059599516SKenneth E. Jansen                     yphbar(:,1,iphase-1) = tfactphase*yold(:,1) +
124159599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,1,iphase-1)
124259599516SKenneth E. Jansen                     yphbar(:,2,iphase-1) = tfactphase*yold(:,2) +
124359599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,2,iphase-1)
124459599516SKenneth E. Jansen                     yphbar(:,3,iphase-1) = tfactphase*yold(:,3) +
124559599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,3,iphase-1)
124659599516SKenneth E. Jansen                     yphbar(:,4,iphase-1) = tfactphase*yold(:,4) +
124759599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,4,iphase-1)
124859599516SKenneth E. Jansen                     yphbar(:,5,iphase-1) = tfactphase*sqrt(yold(:,1)**2
124959599516SKenneth E. Jansen     &                          +yold(:,2)**2+yold(:,3)**2) +
125059599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,5,iphase-1)
125159599516SKenneth E. Jansen!MR CHANGE
125259599516SKenneth E. Jansen                     yphbar(:,6,iphase-1) =
125359599516SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,1)
125459599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,6,iphase-1)
125559599516SKenneth E. Jansen
125659599516SKenneth E. Jansen                     yphbar(:,7,iphase-1) =
125759599516SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,2)
125859599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,7,iphase-1)
125959599516SKenneth E. Jansen
126059599516SKenneth E. Jansen                     yphbar(:,8,iphase-1) =
126159599516SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,3)
126259599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,8,iphase-1)
126359599516SKenneth E. Jansen
126459599516SKenneth E. Jansen                     yphbar(:,9,iphase-1) =
126559599516SKenneth E. Jansen     &                              tfactphase*yold(:,2)*yold(:,2)
126659599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,9,iphase-1)
126759599516SKenneth E. Jansen
126859599516SKenneth E. Jansen                     yphbar(:,10,iphase-1) =
126959599516SKenneth E. Jansen     &                              tfactphase*yold(:,2)*yold(:,3)
127059599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,10,iphase-1)
127159599516SKenneth E. Jansen
127259599516SKenneth E. Jansen                     yphbar(:,11,iphase-1) =
127359599516SKenneth E. Jansen     &                              tfactphase*yold(:,3)*yold(:,3)
127459599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,11,iphase-1)
127559599516SKenneth E. Jansen
127659599516SKenneth E. Jansen                     if(ivort == 1) then
127759599516SKenneth E. Jansen                       yphbar(:,12,iphase-1) =
127859599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,1)
127959599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,12,iphase-1)
128059599516SKenneth E. Jansen                       yphbar(:,13,iphase-1) =
128159599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,2)
128259599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,13,iphase-1)
128359599516SKenneth E. Jansen                       yphbar(:,14,iphase-1) =
128459599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,3)
128559599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,14,iphase-1)
128659599516SKenneth E. Jansen                       yphbar(:,15,iphase-1) =
128759599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,4)
128859599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,15,iphase-1)
128959599516SKenneth E. Jansen                    endif
129059599516SKenneth E. Jansen!MR CHANGE END
129159599516SKenneth E. Jansen                  endif
129259599516SKenneth E. Jansen               endif
129359599516SKenneth E. Jansenc
129459599516SKenneth E. Jansenc compute rms
129559599516SKenneth E. Jansenc
129659599516SKenneth E. Jansen               if(icollectybar.eq.1) then
129759599516SKenneth E. Jansen                  rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2
129859599516SKenneth E. Jansen                  rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2
129959599516SKenneth E. Jansen                  rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2
130059599516SKenneth E. Jansen                  rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2
130159599516SKenneth E. Jansen               endif
130259599516SKenneth E. Jansen            endif
1303c89b8efeSKenneth E. Jansen 2003       continue ! we get here if stopjob equals lstep and this jumped over
1304c89b8efeSKenneth E. Jansen!           the statistics computation because we have no new data to average in
1305c89b8efeSKenneth E. Jansen!           rather we are just trying to output the last state that was not already
1306c89b8efeSKenneth E. Jansen!           written
1307c89b8efeSKenneth E. Jansenc
1308c89b8efeSKenneth E. Jansenc.... ---------------------->  Complete Restart  Processing  <----------------------
1309c89b8efeSKenneth E. Jansenc
1310c89b8efeSKenneth E. Jansen!   for now it is the same frequency but need to change this
1311c89b8efeSKenneth E. Jansen!   soon.... but don't forget to change the field counter in
1312c89b8efeSKenneth E. Jansen!  new_interface.cc
1313c89b8efeSKenneth E. Jansen!
1314c89b8efeSKenneth E. Jansen        if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or.
1315c89b8efeSKenneth E. Jansen     &      istep.eq.nstep(itseq)) then
1316c89b8efeSKenneth E. Jansen          if ((irs .ge. 1) .and. ((mod(lstep, ntout) .ne. 0) .or.
1317c89b8efeSKenneth E. Jansen     &         (nstp .eq. 0))) then
1318c89b8efeSKenneth E. Jansen             if(
1319c89b8efeSKenneth E. Jansen     &          ((irscale.ge.0).or.(itwmod.gt.0) .or.
1320c89b8efeSKenneth E. Jansen     &          ((nsonmax.eq.1).and.iLES.gt.0)))
1321c89b8efeSKenneth E. Jansen     &          call rwvelb  ('out ',  velbar  ,ifail)
1322c89b8efeSKenneth E. Jansen          endif
132359599516SKenneth E. Jansen
1324c89b8efeSKenneth E. Jansen          lesId   = numeqns(1)
1325c89b8efeSKenneth E. Jansen          if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1326c89b8efeSKenneth E. Jansen          if(myrank.eq.0)  then
1327c89b8efeSKenneth E. Jansen            tcormr1 = TMRC()
1328c89b8efeSKenneth E. Jansen          endif
1329efb88323SKenneth E. Jansen          if((nsolflow.eq.1).and.(ipresPrjFlag.eq.1)) then
133079f1763eSKenneth E. Jansen#ifdef HAVE_LESLIB
1331c89b8efeSKenneth E. Jansen           call saveLesRestart( lesId,  aperm , nshg, myrank, lstep,
1332c89b8efeSKenneth E. Jansen     &                    nPermDims )
1333c89b8efeSKenneth E. Jansen          if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1334c89b8efeSKenneth E. Jansen          if(myrank.eq.0)  then
1335c89b8efeSKenneth E. Jansen            tcormr2 = TMRC()
1336c89b8efeSKenneth E. Jansen            write(6,*) 'call saveLesRestart for projection and'//
1337c89b8efeSKenneth E. Jansen     &           'pressure projection vectors', tcormr2-tcormr1
1338c89b8efeSKenneth E. Jansen          endif
133979f1763eSKenneth E. Jansen#endif
1340c9a96f21SKenneth E. Jansen          endif
1341c89b8efeSKenneth E. Jansen
1342c89b8efeSKenneth E. Jansen          if(ierrcalc.eq.1) then
1343c89b8efeSKenneth E. Jansenc
1344c89b8efeSKenneth E. Jansenc.....smooth the error indicators
1345c89b8efeSKenneth E. Jansenc
1346c89b8efeSKenneth E. Jansen            do i=1,ierrsmooth
1347c89b8efeSKenneth E. Jansen              call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC )
1348c89b8efeSKenneth E. Jansen            end do
1349c89b8efeSKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1350c89b8efeSKenneth E. Jansen            if(myrank.eq.0)  then
1351c89b8efeSKenneth E. Jansen              tcormr1 = TMRC()
1352c89b8efeSKenneth E. Jansen            endif
1353c89b8efeSKenneth E. Jansen            call write_error(myrank, lstep, nshg, 10, rerr )
1354c89b8efeSKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1355c89b8efeSKenneth E. Jansen            if(myrank.eq.0)  then
1356c89b8efeSKenneth E. Jansen              tcormr2 = TMRC()
1357c89b8efeSKenneth E. Jansen              write(6,*) 'Time to write the error fields to the disks',
1358c89b8efeSKenneth E. Jansen     &            tcormr2-tcormr1
1359c89b8efeSKenneth E. Jansen            endif
1360c89b8efeSKenneth E. Jansen          endif ! ierrcalc
1361c89b8efeSKenneth E. Jansen
1362c89b8efeSKenneth E. Jansen          if(ioybar.eq.1) then
1363c89b8efeSKenneth E. Jansen            if(ivort == 1) then
1364c89b8efeSKenneth E. Jansen              call write_field(myrank,'a','ybar',4,
1365c89b8efeSKenneth E. Jansen     &                  ybar,'d',nshg,17,lstep)
1366c89b8efeSKenneth E. Jansen            else
1367c89b8efeSKenneth E. Jansen              call write_field(myrank,'a','ybar',4,
1368c89b8efeSKenneth E. Jansen     &                ybar,'d',nshg,13,lstep)
1369c89b8efeSKenneth E. Jansen            endif
1370c89b8efeSKenneth E. Jansen
1371c89b8efeSKenneth E. Jansen            if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
1372c89b8efeSKenneth E. Jansen              call write_field(myrank,'a','wssbar',6,
1373c89b8efeSKenneth E. Jansen     &             wallssVecBar,'d',nshg,3,lstep)
1374c89b8efeSKenneth E. Jansen            endif
1375c89b8efeSKenneth E. Jansen
1376c89b8efeSKenneth E. Jansen            if(nphasesincycle .gt. 0) then
1377c89b8efeSKenneth E. Jansen              if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1378c89b8efeSKenneth E. Jansen              if(myrank.eq.0)  then
1379c89b8efeSKenneth E. Jansen                tcormr1 = TMRC()
1380c89b8efeSKenneth E. Jansen              endif
1381c89b8efeSKenneth E. Jansen              do iphase=1,nphasesincycle
1382c89b8efeSKenneth E. Jansen                if(ivort == 1) then
1383c89b8efeSKenneth E. Jansen                 call write_phavg2(myrank,'a','phase_average',13,iphase,
1384c89b8efeSKenneth E. Jansen     &              nphasesincycle,yphbar(:,:,iphase),'d',nshg,15,lstep)
1385c89b8efeSKenneth E. Jansen                else
1386c89b8efeSKenneth E. Jansen                 call write_phavg2(myrank,'a','phase_average',13,iphase,
1387c89b8efeSKenneth E. Jansen     &              nphasesincycle,yphbar(:,:,iphase),'d',nshg,11,lstep)
1388c89b8efeSKenneth E. Jansen                endif
1389c89b8efeSKenneth E. Jansen              end do
1390c89b8efeSKenneth E. Jansen              if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1391c89b8efeSKenneth E. Jansen              if(myrank.eq.0)  then
1392c89b8efeSKenneth E. Jansen                tcormr2 = TMRC()
1393c89b8efeSKenneth E. Jansen                write(6,*) 'write all phase avg to the disks = ',
1394c89b8efeSKenneth E. Jansen     &                tcormr2-tcormr1
1395c89b8efeSKenneth E. Jansen              endif
1396c89b8efeSKenneth E. Jansen            endif !nphasesincyle
1397c89b8efeSKenneth E. Jansen          endif !ioybar
1398c89b8efeSKenneth E. Jansen
1399c89b8efeSKenneth E. Jansen          if ( ( ihessian .eq. 1 ) .and. ( numpe < 2 )  )then
1400c89b8efeSKenneth E. Jansen            uhess = zero
1401c89b8efeSKenneth E. Jansen            gradu = zero
1402c89b8efeSKenneth E. Jansen            tf = zero
1403c89b8efeSKenneth E. Jansen
1404c89b8efeSKenneth E. Jansen            do ku=1,nshg
1405c89b8efeSKenneth E. Jansen              tf(ku,1) = x(ku,1)**3
1406c89b8efeSKenneth E. Jansen            end do
1407c89b8efeSKenneth E. Jansen            call hessian( yold, x,     shp,  shgl,   iBC,
1408c89b8efeSKenneth E. Jansen     &              shpb, shglb, iper, ilwork, uhess, gradu )
1409c89b8efeSKenneth E. Jansen
1410c89b8efeSKenneth E. Jansen            call write_hessian( uhess, gradu, nshg )
1411c89b8efeSKenneth E. Jansen          endif
1412c89b8efeSKenneth E. Jansen
1413c89b8efeSKenneth E. Jansen          if(iRANS.lt.0) then
1414c89b8efeSKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1415c89b8efeSKenneth E. Jansen            if(myrank.eq.0)  then
1416c89b8efeSKenneth E. Jansen              tcormr1 = TMRC()
1417c89b8efeSKenneth E. Jansen            endif
1418c89b8efeSKenneth E. Jansen            call write_field(myrank,'a','dwal',4,d2wall,'d',
1419c89b8efeSKenneth E. Jansen     &                       nshg,1,lstep)
1420c89b8efeSKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1421c89b8efeSKenneth E. Jansen            if(myrank.eq.0)  then
1422c89b8efeSKenneth E. Jansen              tcormr2 = TMRC()
1423c89b8efeSKenneth E. Jansen              write(6,*) 'Time to write dwal to the disks = ',
1424c89b8efeSKenneth E. Jansen     &        tcormr2-tcormr1
1425c89b8efeSKenneth E. Jansen            endif
1426c89b8efeSKenneth E. Jansen          endif !iRANS
1427c89b8efeSKenneth E. Jansen
1428c89b8efeSKenneth E. Jansen        endif ! write out complete restart state
1429c89b8efeSKenneth E. Jansen        !next 2 lines are two ways to end early
1430c89b8efeSKenneth E. Jansen        if(stopjob.eq.-2) goto 2002
1431c89b8efeSKenneth E. Jansen        if(istop.eq.1000) goto 2002 ! stop when delta small (see rstatic)
143259599516SKenneth E. Jansen 2000 continue
1433c89b8efeSKenneth E. Jansen 2002 continue
1434c89b8efeSKenneth E. Jansen
1435c89b8efeSKenneth E. Jansen! done with time stepping so deallocate fields already written
1436c89b8efeSKenneth E. Jansen!
1437c89b8efeSKenneth E. Jansen          if(ioybar.eq.1) then
1438c89b8efeSKenneth E. Jansen            deallocate(ybar)
1439c89b8efeSKenneth E. Jansen            if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
1440c89b8efeSKenneth E. Jansen              deallocate(wallssVecbar)
1441c89b8efeSKenneth E. Jansen            endif
1442c89b8efeSKenneth E. Jansen            if(nphasesincycle .gt. 0) then
1443c89b8efeSKenneth E. Jansen              deallocate(yphbar)
1444c89b8efeSKenneth E. Jansen            endif !nphasesincyle
1445c89b8efeSKenneth E. Jansen          endif !ioybar
1446c89b8efeSKenneth E. Jansen          if(ivort == 1) then
1447c89b8efeSKenneth E. Jansen            deallocate(strain,vorticity)
1448c89b8efeSKenneth E. Jansen          endif
1449c89b8efeSKenneth E. Jansen          if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
1450c89b8efeSKenneth E. Jansen            deallocate(wallssVec)
1451c89b8efeSKenneth E. Jansen          endif
1452c89b8efeSKenneth E. Jansen          if(iRANS.lt.0) then
1453c89b8efeSKenneth E. Jansen            deallocate(d2wall)
1454c89b8efeSKenneth E. Jansen          endif
145559599516SKenneth E. Jansen
145659599516SKenneth E. Jansen
145759599516SKenneth E. JansenCAD         tcorecp2 = second(0)
145859599516SKenneth E. JansenCAD         tcorewc2 = second(-1)
145959599516SKenneth E. Jansen
146059599516SKenneth E. JansenCAD         write(6,*) 'T(core) cpu-wallclock = ',tcorecp2-tcorecp1,
146159599516SKenneth E. JansenCAD     &                                        tcorewc2-tcorewc1
146259599516SKenneth E. Jansen
146359599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
146459599516SKenneth E. Jansen         if(myrank.eq.0)  then
146559599516SKenneth E. Jansen            tcorecp2 = TMRC()
146659599516SKenneth E. Jansen             write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1
146759599516SKenneth E. Jansen             write(6,*) '(Elm. form.',tcorecp(1),
146859599516SKenneth E. Jansen     &                    ',Lin. alg. sol.',tcorecp(2),')'
146959599516SKenneth E. Jansen             write(6,*) '(Elm. form. Scal.',tcorecpscal(1),
147059599516SKenneth E. Jansen     &                   ',Lin. alg. sol. Scal.',tcorecpscal(2),')'
147159599516SKenneth E. Jansen             write(6,*) ''
147259599516SKenneth E. Jansen
147359599516SKenneth E. Jansen         endif
147459599516SKenneth E. Jansen
147559599516SKenneth E. Jansen         call print_system_stats(tcorecp, tcorecpscal)
147659599516SKenneth E. Jansen         call print_mesh_stats()
147759599516SKenneth E. Jansen         call print_mpi_stats()
147859599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
147959599516SKenneth E. Jansen!         return
148059599516SKenneth E. Jansenc         call MPI_Finalize()
148159599516SKenneth E. Jansenc         call MPI_ABORT(MPI_COMM_WORLD, ierr)
148259599516SKenneth E. Jansen
1483*75f1c48cSCameron Smith         call destroyWallData
1484*75f1c48cSCameron Smith
148559599516SKenneth E. Jansen 3000 continue
148659599516SKenneth E. Jansen
148759599516SKenneth E. Jansen
148859599516SKenneth E. Jansenc
148959599516SKenneth E. Jansenc.... close history and aerodynamic forces files
149059599516SKenneth E. Jansenc
149159599516SKenneth E. Jansen      if (myrank .eq. master) then
149259599516SKenneth E. Jansen!         close (ihist)
149359599516SKenneth E. Jansen         close (iforce)
149459599516SKenneth E. Jansen         close(76)
149559599516SKenneth E. Jansen         if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then
149659599516SKenneth E. Jansen            close (8177)
149759599516SKenneth E. Jansen         endif
149859599516SKenneth E. Jansen      endif
149959599516SKenneth E. Jansenc
150059599516SKenneth E. Jansenc.... close varts file for probes
150159599516SKenneth E. Jansenc
150259599516SKenneth E. Jansen      if(exts) then
150359599516SKenneth E. Jansen        do jj=1,ntspts
150459599516SKenneth E. Jansen          if (myrank == iv_rank(jj)) then
150559599516SKenneth E. Jansen            close(1000+jj)
150659599516SKenneth E. Jansen          endif
150759599516SKenneth E. Jansen        enddo
150859599516SKenneth E. Jansen        deallocate (ivarts)
150959599516SKenneth E. Jansen        deallocate (ivartsg)
151059599516SKenneth E. Jansen        deallocate (iv_rank)
151159599516SKenneth E. Jansen        deallocate (vartssoln)
151259599516SKenneth E. Jansen        deallocate (vartssolng)
151359599516SKenneth E. Jansen      endif
151459599516SKenneth E. Jansen
151559599516SKenneth E. Jansen!MR CHANGE
151659599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
151759599516SKenneth E. Jansen      if(myrank.eq.0)  then
151859599516SKenneth E. Jansen          write(*,*) 'itrdrv - done with aerodynamic forces'
151959599516SKenneth E. Jansen      endif
152059599516SKenneth E. Jansen!MR CHANGE
152159599516SKenneth E. Jansen
152259599516SKenneth E. Jansen      do isrf = 0,MAXSURF
152359599516SKenneth E. Jansen!        if ( nsrflist(isrf).ne.0 ) then
152459599516SKenneth E. Jansen        if ( nsrflist(isrf).ne.0 .and.
152559599516SKenneth E. Jansen     &                     myrank.eq.irankfilesforce(isrf)) then
152659599516SKenneth E. Jansen          iunit=60+isrf
152759599516SKenneth E. Jansen          close(iunit)
152859599516SKenneth E. Jansen        endif
152959599516SKenneth E. Jansen      enddo
153059599516SKenneth E. Jansen
153159599516SKenneth E. Jansen!MR CHANGE
153259599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
153359599516SKenneth E. Jansen      if(myrank.eq.0)  then
153459599516SKenneth E. Jansen          write(*,*) 'itrdrv - done with MAXSURF'
153559599516SKenneth E. Jansen      endif
153659599516SKenneth E. Jansen!MR CHANGE
153759599516SKenneth E. Jansen
153859599516SKenneth E. Jansen
153959599516SKenneth E. Jansen 5    format(1X,F15.10,3X,F15.10,3X,F15.10,3X,F15.10)
154059599516SKenneth E. Jansen 444  format(6(2x,e14.7))
154159599516SKenneth E. Jansenc
154259599516SKenneth E. Jansenc.... end
154359599516SKenneth E. Jansenc
154459599516SKenneth E. Jansen      if(nsolflow.eq.1) then
154559599516SKenneth E. Jansen         deallocate (lhsK)
154659599516SKenneth E. Jansen         deallocate (lhsP)
1547ae8d68e4SKenneth E. Jansen         IF (svLSFlag .NE. 1) THEN
154859599516SKenneth E. Jansen         deallocate (aperm)
154959599516SKenneth E. Jansen         deallocate (atemp)
1550ae8d68e4SKenneth E. Jansen         ENDIF
155159599516SKenneth E. Jansen      endif
155259599516SKenneth E. Jansen      if(nsclrsol.gt.0) then
155359599516SKenneth E. Jansen         deallocate (lhsS)
155459599516SKenneth E. Jansen         deallocate (apermS)
155559599516SKenneth E. Jansen         deallocate (atempS)
155659599516SKenneth E. Jansen      endif
155759599516SKenneth E. Jansen
155859599516SKenneth E. Jansen      if(iabc==1) deallocate(acs)
155959599516SKenneth E. Jansen
156059599516SKenneth E. Jansen!MR CHANGE
156159599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
156259599516SKenneth E. Jansen      if(myrank.eq.0)  then
156359599516SKenneth E. Jansen          write(*,*) 'itrdrv - done - BACK TO process.f'
156459599516SKenneth E. Jansen      endif
156559599516SKenneth E. Jansen!MR CHANGE
156659599516SKenneth E. Jansen
156759599516SKenneth E. Jansen
156859599516SKenneth E. Jansen
156959599516SKenneth E. Jansen      return
157059599516SKenneth E. Jansen      end
157159599516SKenneth E. Jansen
157259599516SKenneth E. Jansen      subroutine lesmodels(y,     ac,        shgl,      shp,
157359599516SKenneth E. Jansen     &                     iper,  ilwork,    rowp,      colm,
157459599516SKenneth E. Jansen     &                     nsons, ifath,     x,
157559599516SKenneth E. Jansen     &                     iBC,   BC)
157659599516SKenneth E. Jansen
157759599516SKenneth E. Jansen      include "common.h"
157859599516SKenneth E. Jansen
157959599516SKenneth E. Jansen      real*8    y(nshg,ndof),              ac(nshg,ndof),
158059599516SKenneth E. Jansen     &            x(numnp,nsd),
158159599516SKenneth E. Jansen     &            BC(nshg,ndofBC)
158259599516SKenneth E. Jansen      real*8    shp(MAXTOP,maxsh,MAXQPT),
158359599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT)
158459599516SKenneth E. Jansen
158559599516SKenneth E. Jansenc
158659599516SKenneth E. Jansen      integer   rowp(nshg,nnz),         colm(nshg+1),
158759599516SKenneth E. Jansen     &            iBC(nshg),
158859599516SKenneth E. Jansen     &            ilwork(nlwork),
158959599516SKenneth E. Jansen     &            iper(nshg)
159059599516SKenneth E. Jansen      dimension ifath(numnp),    nsons(nfath)
159159599516SKenneth E. Jansen
159259599516SKenneth E. Jansen      real*8, allocatable, dimension(:) :: fwr2,fwr3,fwr4
159359599516SKenneth E. Jansen      real*8, allocatable, dimension(:) :: stabdis,cdelsq1
159459599516SKenneth E. Jansen      real*8, allocatable, dimension(:,:) :: xavegt, xavegt2,xavegt3
159559599516SKenneth E. Jansen
159659599516SKenneth E. Jansen      if( (iLES.gt.1) )   then ! Allocate Stuff for advanced LES models
159759599516SKenneth E. Jansen         allocate (fwr2(nshg))
159859599516SKenneth E. Jansen         allocate (fwr3(nshg))
159959599516SKenneth E. Jansen         allocate (fwr4(nshg))
160059599516SKenneth E. Jansen         allocate (xavegt(nfath,12))
160159599516SKenneth E. Jansen         allocate (xavegt2(nfath,12))
160259599516SKenneth E. Jansen         allocate (xavegt3(nfath,12))
160359599516SKenneth E. Jansen         allocate (stabdis(nfath))
160459599516SKenneth E. Jansen      endif
160559599516SKenneth E. Jansen
160659599516SKenneth E. Jansenc.... get dynamic model coefficient
160759599516SKenneth E. Jansenc
160859599516SKenneth E. Jansen      ilesmod=iLES/10
160959599516SKenneth E. Jansenc
161059599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model
161159599516SKenneth E. Jansenc
161259599516SKenneth E. Jansen      if (ilesmod.eq.0) then    ! 0 < iLES< 10 => dyn. model calculated
161359599516SKenneth E. Jansen                                ! at nodes based on discrete filtering
161459599516SKenneth E. Jansen
161559599516SKenneth E. Jansen
161659599516SKenneth E. Jansen         if(isubmod.eq.2) then
161759599516SKenneth E. Jansen            call SUPGdis(y,      ac,        shgl,      shp,
161859599516SKenneth E. Jansen     &                   iper,   ilwork,
161959599516SKenneth E. Jansen     &                   nsons,  ifath,     x,
162059599516SKenneth E. Jansen     &                   iBC,    BC, stabdis, xavegt3)
162159599516SKenneth E. Jansen         endif
162259599516SKenneth E. Jansen
162359599516SKenneth E. Jansen         if( ((isubmod.eq.0).or.(isubmod.eq.2)))then ! If no
162459599516SKenneth E. Jansen                                                     ! sub-model
162559599516SKenneth E. Jansen                                                     ! or SUPG
162659599516SKenneth E. Jansen                                                     ! model wanted
162759599516SKenneth E. Jansen
162859599516SKenneth E. Jansen            if(i2filt.eq.0)then ! If simple filter
162959599516SKenneth E. Jansen
163059599516SKenneth E. Jansen               if(modlstats .eq. 0) then ! If no model stats wanted
163159599516SKenneth E. Jansen                  call getdmc (y,       shgl,      shp,
163259599516SKenneth E. Jansen     &                         iper,       ilwork,    nsons,
163359599516SKenneth E. Jansen     &                         ifath,      x)
163459599516SKenneth E. Jansen               else             ! else get model stats
163559599516SKenneth E. Jansen                  call stdfdmc (y,       shgl,      shp,
163659599516SKenneth E. Jansen     &                          iper,       ilwork,    nsons,
163759599516SKenneth E. Jansen     &                          ifath,      x)
163859599516SKenneth E. Jansen               endif            ! end of stats if statement
163959599516SKenneth E. Jansen
164059599516SKenneth E. Jansen            else                ! else if twice filtering
164159599516SKenneth E. Jansen
164259599516SKenneth E. Jansen               call widefdmc(y,       shgl,      shp,
164359599516SKenneth E. Jansen     &                       iper,       ilwork,    nsons,
164459599516SKenneth E. Jansen     &                       ifath,      x)
164559599516SKenneth E. Jansen
164659599516SKenneth E. Jansen
164759599516SKenneth E. Jansen            endif               ! end of simple filter if statement
164859599516SKenneth E. Jansen
164959599516SKenneth E. Jansen         endif                  ! end of SUPG or no sub-model if statement
165059599516SKenneth E. Jansen
165159599516SKenneth E. Jansen
165259599516SKenneth E. Jansen         if( (isubmod.eq.1) ) then ! If DFWR sub-model wanted
165359599516SKenneth E. Jansen            call cdelBHsq (y,       shgl,      shp,
165459599516SKenneth E. Jansen     &                     iper,       ilwork,    nsons,
165559599516SKenneth E. Jansen     &                     ifath,      x,         cdelsq1)
165659599516SKenneth E. Jansen            call FiltRat (y,       shgl,      shp,
165759599516SKenneth E. Jansen     &                    iper,       ilwork,    nsons,
165859599516SKenneth E. Jansen     &                    ifath,      x,         cdelsq1,
165959599516SKenneth E. Jansen     &                    fwr4,       fwr3)
166059599516SKenneth E. Jansen
166159599516SKenneth E. Jansen
166259599516SKenneth E. Jansen            if (i2filt.eq.0) then ! If simple filter wanted
166359599516SKenneth E. Jansen               call DFWRsfdmc(y,       shgl,      shp,
166459599516SKenneth E. Jansen     &                        iper,       ilwork,    nsons,
166559599516SKenneth E. Jansen     &                        ifath,      x,         fwr2, fwr3)
166659599516SKenneth E. Jansen            else                ! else if twice filtering wanted
166759599516SKenneth E. Jansen               call DFWRwfdmc(y,       shgl,      shp,
166859599516SKenneth E. Jansen     &                        iper,       ilwork,    nsons,
166959599516SKenneth E. Jansen     &                        ifath,      x,         fwr4, fwr4)
167059599516SKenneth E. Jansen            endif               ! end of simple filter if statement
167159599516SKenneth E. Jansen
167259599516SKenneth E. Jansen         endif                  ! end of DFWR sub-model if statement
167359599516SKenneth E. Jansen
167459599516SKenneth E. Jansen         if( (isubmod.eq.2) )then ! If SUPG sub-model wanted
167559599516SKenneth E. Jansen            call dmcSUPG (y,           ac,         shgl,
167659599516SKenneth E. Jansen     &                    shp,         iper,       ilwork,
167759599516SKenneth E. Jansen     &                    nsons,       ifath,      x,
167859599516SKenneth E. Jansen     &                    iBC,    BC,  rowp,       colm,
167959599516SKenneth E. Jansen     &                    xavegt2,    stabdis)
168059599516SKenneth E. Jansen         endif
168159599516SKenneth E. Jansen
168259599516SKenneth E. Jansen         if(idis.eq.1)then      ! If SUPG/Model dissipation wanted
168359599516SKenneth E. Jansen            call ediss (y,        ac,      shgl,
168459599516SKenneth E. Jansen     &                  shp,      iper,       ilwork,
168559599516SKenneth E. Jansen     &                  nsons,    ifath,      x,
168659599516SKenneth E. Jansen     &                  iBC,      BC,  xavegt)
168759599516SKenneth E. Jansen         endif
168859599516SKenneth E. Jansen
168959599516SKenneth E. Jansen      endif                     ! end of ilesmod
169059599516SKenneth E. Jansen
169159599516SKenneth E. Jansen      if (ilesmod .eq. 1) then  ! 10 < iLES < 20 => dynamic-mixed
169259599516SKenneth E. Jansen                                ! at nodes based on discrete filtering
169359599516SKenneth E. Jansen         call bardmc (y,       shgl,      shp,
169459599516SKenneth E. Jansen     &                iper,    ilwork,
169559599516SKenneth E. Jansen     &                nsons,   ifath,     x)
169659599516SKenneth E. Jansen      endif
169759599516SKenneth E. Jansen
169859599516SKenneth E. Jansen      if (ilesmod .eq. 2) then  ! 20 < iLES < 30 => dynamic at quad
169959599516SKenneth E. Jansen                                ! pts based on lumped projection filt.
170059599516SKenneth E. Jansen
170159599516SKenneth E. Jansen         if(isubmod.eq.0)then
170259599516SKenneth E. Jansen            call projdmc (y,       shgl,      shp,
170359599516SKenneth E. Jansen     &                    iper,       ilwork,    x)
170459599516SKenneth E. Jansen         else
170559599516SKenneth E. Jansen            call cpjdmcnoi (y,      shgl,      shp,
170659599516SKenneth E. Jansen     &                      iper,   ilwork,       x,
170759599516SKenneth E. Jansen     &                      rowp,   colm,
170859599516SKenneth E. Jansen     &                      iBC,    BC)
170959599516SKenneth E. Jansen         endif
171059599516SKenneth E. Jansen
171159599516SKenneth E. Jansen      endif
171259599516SKenneth E. Jansen
171359599516SKenneth E. Jansen      if( (iLES.gt.1) )   then ! Deallocate Stuff for advanced LES models
171459599516SKenneth E. Jansen         deallocate (fwr2)
171559599516SKenneth E. Jansen         deallocate (fwr3)
171659599516SKenneth E. Jansen         deallocate (fwr4)
171759599516SKenneth E. Jansen         deallocate (xavegt)
171859599516SKenneth E. Jansen         deallocate (xavegt2)
171959599516SKenneth E. Jansen         deallocate (xavegt3)
172059599516SKenneth E. Jansen         deallocate (stabdis)
172159599516SKenneth E. Jansen      endif
172259599516SKenneth E. Jansen      return
172359599516SKenneth E. Jansen      end
172459599516SKenneth E. Jansen
172559599516SKenneth E. Jansenc
172659599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution
172759599516SKenneth E. Jansenc
172859599516SKenneth E. Jansen      subroutine CalcImpConvCoef (numISrfs, numTpoints)
172959599516SKenneth E. Jansen
173059599516SKenneth E. Jansen      use convolImpFlow !uses flow history and impedance for convolution
173159599516SKenneth E. Jansen
173259599516SKenneth E. Jansen      include "common.h" !for alfi
173359599516SKenneth E. Jansen
173459599516SKenneth E. Jansen      integer numISrfs, numTpoints
173559599516SKenneth E. Jansen
173659599516SKenneth E. Jansen      allocate (ConvCoef(numTpoints+2,3)) !same time discret. for all imp. BC
173759599516SKenneth E. Jansen      do j=1,numTpoints+2
173859599516SKenneth E. Jansen         ConvCoef(j,:)=0.5/numTpoints !dt/2 divided by period T=N*dt
173959599516SKenneth E. Jansen         ConvCoef(j,1)=ConvCoef(j,1)*(1.0-alfi)*(1.0-alfi)
174059599516SKenneth E. Jansen         ConvCoef(j,2)=ConvCoef(j,2)*(1.0+2*alfi*(1.0-alfi))
174159599516SKenneth E. Jansen         ConvCoef(j,3)=ConvCoef(j,3)*alfi*alfi
174259599516SKenneth E. Jansen      enddo
174359599516SKenneth E. Jansen      ConvCoef(1,2)=zero
174459599516SKenneth E. Jansen      ConvCoef(1,3)=zero
174559599516SKenneth E. Jansen      ConvCoef(2,3)=zero
174659599516SKenneth E. Jansen      ConvCoef(numTpoints+1,1)=zero
174759599516SKenneth E. Jansen      ConvCoef(numTpoints+2,2)=zero
174859599516SKenneth E. Jansen      ConvCoef(numTpoints+2,1)=zero
174959599516SKenneth E. Jansenc
175059599516SKenneth E. Jansenc...calculate the coefficients for the impedance convolution
175159599516SKenneth E. Jansenc
175259599516SKenneth E. Jansen      allocate (ImpConvCoef(numTpoints+2,numISrfs))
175359599516SKenneth E. Jansen
175459599516SKenneth E. Jansenc..coefficients below assume Q linear in time step, Z constant
175559599516SKenneth E. Jansenc            do j=3,numTpoints
175659599516SKenneth E. Jansenc                ImpConvCoef(j,:) = ValueListImp(j-1,:)*ConvCoef(j,3)
175759599516SKenneth E. Jansenc     &                             + ValueListImp(j,:)*ConvCoef(j,2)
175859599516SKenneth E. Jansenc     &                             + ValueListImp(j+1,:)*ConvCoef(j,1)
175959599516SKenneth E. Jansenc            enddo
176059599516SKenneth E. Jansenc            ImpConvCoef(1,:) = ValueListImp(2,:)*ConvCoef(1,1)
176159599516SKenneth E. Jansenc            ImpConvCoef(2,:) = ValueListImp(2,:)*ConvCoef(2,2)
176259599516SKenneth E. Jansenc     &                       + ValueListImp(3,:)*ConvCoef(2,1)
176359599516SKenneth E. Jansenc            ImpConvCoef(numTpoints+1,:) =
176459599516SKenneth E. Jansenc     &           ValueListImp(numTpoints,:)*ConvCoef(numTpoints+1,3)
176559599516SKenneth E. Jansenc     &         + ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+1,2)
176659599516SKenneth E. Jansenc            ImpConvCoef(numTpoints+2,:) =
176759599516SKenneth E. Jansenc     &           ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+2,3)
176859599516SKenneth E. Jansen
176959599516SKenneth E. Jansenc..try easiest convolution Q and Z constant per time step
177059599516SKenneth E. Jansen      do j=3,numTpoints+1
177159599516SKenneth E. Jansen         ImpConvCoef(j,:) = ValueListImp(j-1,:)/numTpoints
177259599516SKenneth E. Jansen      enddo
177359599516SKenneth E. Jansen      ImpConvCoef(1,:) =zero
177459599516SKenneth E. Jansen      ImpConvCoef(2,:) =zero
177559599516SKenneth E. Jansen      ImpConvCoef(numTpoints+2,:) =
177659599516SKenneth E. Jansen     &           ValueListImp(numTpoints+1,:)/numTpoints
177759599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr()
177859599516SKenneth E. Jansen      ImpConvCoef(numTpoints+1,:)= ImpConvCoef(numTpoints+1,:)
177959599516SKenneth E. Jansen     &                  - ImpConvCoef(numTpoints+2,:)*(1.0-alfi)/alfi
178059599516SKenneth E. Jansen      ImpConvCoef(numTpoints+2,:)= ImpConvCoef(numTpoints+2,:)/alfi
178159599516SKenneth E. Jansen      return
178259599516SKenneth E. Jansen      end
178359599516SKenneth E. Jansen
178459599516SKenneth E. Jansenc
178559599516SKenneth E. Jansenc ... update the flow rate history for the impedance convolution, filter it and write it out
178659599516SKenneth E. Jansenc
178759599516SKenneth E. Jansen      subroutine UpdHistConv(y,nsrfIdList,numSrfs)
178859599516SKenneth E. Jansen
178959599516SKenneth E. Jansen      use convolImpFlow !brings ntimeptpT, QHistImp, QHistTry, QHistTryF, numImpSrfs
179059599516SKenneth E. Jansen      use convolRCRFlow !brings QHistRCR, numRCRSrfs
179159599516SKenneth E. Jansen
179259599516SKenneth E. Jansen      include "common.h"
179359599516SKenneth E. Jansen
179459599516SKenneth E. Jansen      integer   nsrfIdList(0:MAXSURF), numSrfs
179559599516SKenneth E. Jansen      character*20 fname1
179659599516SKenneth E. Jansen      character*10 cname2
179759599516SKenneth E. Jansen      character*5 cname
179859599516SKenneth E. Jansen      real*8    y(nshg,3) !velocity at time n+1
179959599516SKenneth E. Jansen      real*8    NewQ(0:MAXSURF) !temporary unknown for the flow rate
180059599516SKenneth E. Jansen                        !that needs to be added to the flow history
180159599516SKenneth E. Jansen
180259599516SKenneth E. Jansen      call GetFlowQ(NewQ,y,nsrfIdList,numSrfs) !new flow at time n+1
180359599516SKenneth E. Jansenc
180459599516SKenneth E. Jansenc... for imp BC: shift QHist, add new constribution, filter and write out
180559599516SKenneth E. Jansenc
180659599516SKenneth E. Jansen      if(numImpSrfs.gt.zero) then
180759599516SKenneth E. Jansen         do j=1, ntimeptpT
180859599516SKenneth E. Jansen            QHistImp(j,1:numSrfs)=QHistImp(j+1,1:numSrfs)
180959599516SKenneth E. Jansen         enddo
181059599516SKenneth E. Jansen         QHistImp(ntimeptpT+1,1:numSrfs) = NewQ(1:numSrfs)
181159599516SKenneth E. Jansen
181259599516SKenneth E. Jansenc
181359599516SKenneth E. Jansenc....filter the flow rate history
181459599516SKenneth E. Jansenc
181559599516SKenneth E. Jansen         cutfreq = 10           !hardcoded cutting frequency of the filter
181659599516SKenneth E. Jansen         do j=1, ntimeptpT
181759599516SKenneth E. Jansen            QHistTry(j,:)=QHistImp(j+1,:)
181859599516SKenneth E. Jansen         enddo
181959599516SKenneth E. Jansen         call Filter(QHistTryF,QHistTry,ntimeptpT,Delt(1),cutfreq)
182059599516SKenneth E. Jansenc.... if no filter applied then uncomment next three lines
182159599516SKenneth E. Jansenc         do j=1, ntimeptpT
182259599516SKenneth E. Jansenc            QHistTryF(j,:)=QHistTry(j,:)
182359599516SKenneth E. Jansenc         enddo
182459599516SKenneth E. Jansen
182559599516SKenneth E. Jansenc         QHistImp(1,:)=zero ! why do we do this? for beta(1,:) = zero it does not really matters
182659599516SKenneth E. Jansen         do j=1, ntimeptpT
182759599516SKenneth E. Jansen            QHistImp(j+1,:)=QHistTryF(j,:)
182859599516SKenneth E. Jansen         enddo
182959599516SKenneth E. Jansenc
183059599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat
183159599516SKenneth E. Jansenc
183259599516SKenneth E. Jansen         if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or.
183359599516SKenneth E. Jansen     &        (istep .eq. nstep(1)))) .and.
183459599516SKenneth E. Jansen     &        (myrank .eq. master)) then
183559599516SKenneth E. Jansen            open(unit=816, file='Qhistor.dat',status='replace')
183659599516SKenneth E. Jansen            write(816,*) ntimeptpT
183759599516SKenneth E. Jansen            do j=1,ntimeptpT+1
183859599516SKenneth E. Jansen               write(816,*) (QHistImp(j,n),n=1, numSrfs)
183959599516SKenneth E. Jansen            enddo
184059599516SKenneth E. Jansen            close(816)
184159599516SKenneth E. Jansenc... write out a copy with step number to be able to restart
184259599516SKenneth E. Jansen            fname1 = 'Qhistor'
184359599516SKenneth E. Jansen            fname1 = trim(fname1)//trim(cname2(lstep))//'.dat'
184459599516SKenneth E. Jansen            open(unit=8166,file=trim(fname1),status='unknown')
184559599516SKenneth E. Jansen            write(8166,*) ntimeptpT
184659599516SKenneth E. Jansen            do j=1,ntimeptpT+1
184759599516SKenneth E. Jansen               write(8166,*) (QHistImp(j,n),n=1, numSrfs)
184859599516SKenneth E. Jansen            enddo
184959599516SKenneth E. Jansen            close(8166)
185059599516SKenneth E. Jansen         endif
185159599516SKenneth E. Jansen      endif
185259599516SKenneth E. Jansen
185359599516SKenneth E. Jansenc
185459599516SKenneth E. Jansenc... for RCR bc just add the new contribution
185559599516SKenneth E. Jansenc
185659599516SKenneth E. Jansen      if(numRCRSrfs.gt.zero) then
185759599516SKenneth E. Jansen         QHistRCR(lstep+1,1:numSrfs) = NewQ(1:numSrfs)
185859599516SKenneth E. Jansenc
185959599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat
186059599516SKenneth E. Jansenc
186159599516SKenneth E. Jansen         if ((irs .ge. 1) .and. (myrank .eq. master)) then
186259599516SKenneth E. Jansen            if(istep.eq.1) then
186359599516SKenneth E. Jansen               open(unit=816,file='Qhistor.dat',status='unknown')
186459599516SKenneth E. Jansen            else
186559599516SKenneth E. Jansen               open(unit=816,file='Qhistor.dat',position='append')
186659599516SKenneth E. Jansen            endif
186759599516SKenneth E. Jansen            if(istep.eq.1) then
186859599516SKenneth E. Jansen               do j=1,lstep
186959599516SKenneth E. Jansen                  write(816,*) j, (QHistRCR(j,n),n=1,numSrfs) ! read from file of previous run
187059599516SKenneth E. Jansen               enddo
187159599516SKenneth E. Jansen            endif
187259599516SKenneth E. Jansen            write(816,*) lstep+1, (QHistRCR(lstep+1,n),n=1, numSrfs)
187359599516SKenneth E. Jansen            close(816)
187459599516SKenneth E. Jansenc... write out a copy with step number to be able to restart
187559599516SKenneth E. Jansen            if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or.
187659599516SKenneth E. Jansen     &           (istep .eq. nstep(1)))) .and.
187759599516SKenneth E. Jansen     &           (myrank .eq. master)) then
187859599516SKenneth E. Jansen               fname1 = 'Qhistor'
187959599516SKenneth E. Jansen               fname1 = trim(fname1)//trim(cname2(lstep))//'.dat'
188059599516SKenneth E. Jansen               open(unit=8166,file=trim(fname1),status='unknown')
188159599516SKenneth E. Jansen               write(8166,*) lstep+1
188259599516SKenneth E. Jansen               do j=1,lstep+1
188359599516SKenneth E. Jansen                  write(8166,*) (QHistRCR(j,n),n=1, numSrfs)
188459599516SKenneth E. Jansen               enddo
188559599516SKenneth E. Jansen               close(8166)
188659599516SKenneth E. Jansen            endif
188759599516SKenneth E. Jansen         endif
188859599516SKenneth E. Jansen      endif
188959599516SKenneth E. Jansen
189059599516SKenneth E. Jansen      return
189159599516SKenneth E. Jansen      end
189259599516SKenneth E. Jansen
189359599516SKenneth E. Jansenc
189459599516SKenneth E. Jansenc...calculate the time varying coefficients for the RCR convolution
189559599516SKenneth E. Jansenc
189659599516SKenneth E. Jansen      subroutine CalcRCRConvCoef (stepn, numSrfs)
189759599516SKenneth E. Jansen
189859599516SKenneth E. Jansen      use convolRCRFlow !brings in ValueListRCR, dtRCR
189959599516SKenneth E. Jansen
190059599516SKenneth E. Jansen      include "common.h" !brings alfi
190159599516SKenneth E. Jansen
190259599516SKenneth E. Jansen      integer numSrfs, stepn
190359599516SKenneth E. Jansen
190459599516SKenneth E. Jansen      RCRConvCoef = zero
190559599516SKenneth E. Jansen      if (stepn .eq. 0) then
190659599516SKenneth E. Jansen        RCRConvCoef(1,:) = ValueListRCR(1,:)*(1.0-alfi) +
190759599516SKenneth E. Jansen     &   ValueListRCR(3,:)*(-alfi + 1.0 + 1/dtRCR(:)
190859599516SKenneth E. Jansen     &     - exp(-alfi*dtRCR(:))*(1 + 1/dtRCR(:)))
190959599516SKenneth E. Jansen        RCRConvCoef(2,:) = ValueListRCR(1,:)*alfi
191059599516SKenneth E. Jansen     &     + ValueListRCR(3,:)
191159599516SKenneth E. Jansen     &     *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:))
191259599516SKenneth E. Jansen      endif
191359599516SKenneth E. Jansen      if (stepn .ge. 1) then
191459599516SKenneth E. Jansen        RCRConvCoef(1,:) =-ValueListRCR(3,:)*exp(-dtRCR(:)*(stepn+alfi))
191559599516SKenneth E. Jansen     &        *(1 + (1 - exp(dtRCR(:)))/dtRCR(:))
191659599516SKenneth E. Jansen        RCRConvCoef(stepn+1,:) = ValueListRCR(1,:)*(1-alfi)
191759599516SKenneth E. Jansen     &     - ValueListRCR(3,:)*(alfi - 1 - 1/dtRCR(:)
191859599516SKenneth E. Jansen     &     + exp(-alfi*dtRCR(:))/dtRCR(:)*(2 - exp(-dtRCR(:))))
191959599516SKenneth E. Jansen        RCRConvCoef(stepn+2,:) = ValueListRCR(1,:)*alfi
192059599516SKenneth E. Jansen     &     + ValueListRCR(3,:)
192159599516SKenneth E. Jansen     &     *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:))
192259599516SKenneth E. Jansen      endif
192359599516SKenneth E. Jansen      if (stepn .ge. 2) then
192459599516SKenneth E. Jansen        do j=2,stepn
192559599516SKenneth E. Jansen         RCRConvCoef(j,:) = ValueListRCR(3,:)/dtRCR(:)*
192659599516SKenneth E. Jansen     &        exp(-dtRCR(:)*(stepn + alfi + 2 - j))*
192759599516SKenneth E. Jansen     &        (1 - exp(dtRCR(:)))**2
192859599516SKenneth E. Jansen        enddo
192959599516SKenneth E. Jansen      endif
193059599516SKenneth E. Jansen
193159599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr()
193259599516SKenneth E. Jansen      RCRConvCoef(stepn+1,:)= RCRConvCoef(stepn+1,:)
193359599516SKenneth E. Jansen     &                  - RCRConvCoef(stepn+2,:)*(1.0-alfi)/alfi
193459599516SKenneth E. Jansen      RCRConvCoef(stepn+2,:)= RCRConvCoef(stepn+2,:)/alfi
193559599516SKenneth E. Jansen
193659599516SKenneth E. Jansen      return
193759599516SKenneth E. Jansen      end
193859599516SKenneth E. Jansen
193959599516SKenneth E. Jansenc
194059599516SKenneth E. Jansenc...calculate the time dependent H operator for the RCR convolution
194159599516SKenneth E. Jansenc
194259599516SKenneth E. Jansen      subroutine CalcHopRCR (timestepRCR, stepn, numSrfs)
194359599516SKenneth E. Jansen
194459599516SKenneth E. Jansen      use convolRCRFlow !brings in HopRCR, dtRCR
194559599516SKenneth E. Jansen
194659599516SKenneth E. Jansen      include "common.h"
194759599516SKenneth E. Jansen
194859599516SKenneth E. Jansen      integer numSrfs, stepn
194959599516SKenneth E. Jansen      real*8  PdistCur(0:MAXSURF), timestepRCR
195059599516SKenneth E. Jansen
195159599516SKenneth E. Jansen      HopRCR=zero
195259599516SKenneth E. Jansen      call RCRint(timestepRCR*(stepn + alfi),PdistCur)
195359599516SKenneth E. Jansen      HopRCR(1:numSrfs) = RCRic(1:numSrfs)
195459599516SKenneth E. Jansen     &     *exp(-dtRCR(1:numSrfs)*(stepn + alfi)) + PdistCur(1:numSrfs)
195559599516SKenneth E. Jansen      return
195659599516SKenneth E. Jansen      end
195759599516SKenneth E. Jansenc
195859599516SKenneth E. Jansenc ... initialize the influence of the initial conditions for the RCR BC
195959599516SKenneth E. Jansenc
196059599516SKenneth E. Jansen      subroutine calcRCRic(y,srfIdList,numSrfs)
196159599516SKenneth E. Jansen
196259599516SKenneth E. Jansen      use convolRCRFlow    !brings RCRic, ValueListRCR, ValuePdist
196359599516SKenneth E. Jansen
196459599516SKenneth E. Jansen      include "common.h"
196559599516SKenneth E. Jansen
196659599516SKenneth E. Jansen      integer   srfIdList(0:MAXSURF), numSrfs, irankCoupled
196759599516SKenneth E. Jansen      real*8    y(nshg,4) !need velocity and pressure
196859599516SKenneth E. Jansen      real*8    Qini(0:MAXSURF) !initial flow rate
196959599516SKenneth E. Jansen      real*8    PdistIni(0:MAXSURF) !initial distal pressure
197059599516SKenneth E. Jansen      real*8    Pini(0:MAXSURF),CoupleArea(0:MAXSURF) ! initial pressure
197159599516SKenneth E. Jansen      real*8    VelOnly(nshg,3), POnly(nshg)
197259599516SKenneth E. Jansen
197359599516SKenneth E. Jansen      allocate (RCRic(0:MAXSURF))
197459599516SKenneth E. Jansen
197559599516SKenneth E. Jansen      if(lstep.eq.0) then
197659599516SKenneth E. Jansen         VelOnly(:,1:3)=y(:,1:3)
197759599516SKenneth E. Jansen         call GetFlowQ(Qini,VelOnly,srfIdList,numSrfs) !get initial flow
197859599516SKenneth E. Jansen         QHistRCR(1,1:numSrfs)=Qini(1:numSrfs) !initialize QHistRCR
197959599516SKenneth E. Jansen         POnly(:)=y(:,4)        ! pressure
198059599516SKenneth E. Jansen         call integrScalar(Pini,POnly,srfIdList,numSrfs) !get initial pressure integral
198159599516SKenneth E. Jansen         POnly(:)=one           ! one to get area
198259599516SKenneth E. Jansen         call integrScalar(CoupleArea,POnly,srfIdList,numSrfs) !get surf area
198359599516SKenneth E. Jansen         Pini(1:numSrfs) = Pini(1:numSrfs)/CoupleArea(1:numSrfs)
198459599516SKenneth E. Jansen      else
198559599516SKenneth E. Jansen         Qini(1:numSrfs)=QHistRCR(1,1:numSrfs)
198659599516SKenneth E. Jansen         Pini(1:numSrfs)=zero    ! hack
198759599516SKenneth E. Jansen      endif
198859599516SKenneth E. Jansen      call RCRint(istep,PdistIni) !get initial distal P (use istep)
198959599516SKenneth E. Jansen      RCRic(1:numSrfs) = Pini(1:numSrfs)
199059599516SKenneth E. Jansen     &          - ValueListRCR(1,:)*Qini(1:numSrfs)-PdistIni(1:numSrfs)
199159599516SKenneth E. Jansen      return
199259599516SKenneth E. Jansen      end
199359599516SKenneth E. Jansen
199459599516SKenneth E. Jansenc.........function that integrates a scalar over a boundary
199559599516SKenneth E. Jansen      subroutine integrScalar(scalInt,scal,srfIdList,numSrfs)
199659599516SKenneth E. Jansen
199759599516SKenneth E. Jansen      use pvsQbi !brings ndsurf, NASC
199859599516SKenneth E. Jansen
199959599516SKenneth E. Jansen      include "common.h"
200059599516SKenneth E. Jansen      include "mpif.h"
200159599516SKenneth E. Jansen
200259599516SKenneth E. Jansen      integer   srfIdList(0:MAXSURF), numSrfs, irankCoupled, i, k
200359599516SKenneth E. Jansen      real*8    scal(nshg), scalInt(0:MAXSURF), scalIntProc(0:MAXSURF)
200459599516SKenneth E. Jansen
200559599516SKenneth E. Jansen      scalIntProc = zero
200659599516SKenneth E. Jansen      do i = 1,nshg
200759599516SKenneth E. Jansen        if(numSrfs.gt.zero) then
200859599516SKenneth E. Jansen          do k = 1,numSrfs
200959599516SKenneth E. Jansen            irankCoupled = 0
201059599516SKenneth E. Jansen            if (srfIdList(k).eq.ndsurf(i)) then
201159599516SKenneth E. Jansen              irankCoupled=k
201259599516SKenneth E. Jansen              scalIntProc(irankCoupled) = scalIntProc(irankCoupled)
201359599516SKenneth E. Jansen     &                            + NASC(i)*scal(i)
201459599516SKenneth E. Jansen              exit
201559599516SKenneth E. Jansen            endif
201659599516SKenneth E. Jansen          enddo
201759599516SKenneth E. Jansen        endif
201859599516SKenneth E. Jansen      enddo
201959599516SKenneth E. Jansenc
202059599516SKenneth E. Jansenc     at this point, each scalint has its "nodes" contributions to the scalar
202159599516SKenneth E. Jansenc     accumulated into scalIntProc. Note, because NASC is on processor this
202259599516SKenneth E. Jansenc     will NOT be the scalar for the surface yet
202359599516SKenneth E. Jansenc
202459599516SKenneth E. Jansenc.... reduce integrated scalar for each surface, push on scalInt
202559599516SKenneth E. Jansenc
202659599516SKenneth E. Jansen        npars=MAXSURF+1
202759599516SKenneth E. Jansen       call MPI_ALLREDUCE (scalIntProc, scalInt(:), npars,
202859599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
202959599516SKenneth E. Jansen
203059599516SKenneth E. Jansen      return
203159599516SKenneth E. Jansen      end
203259599516SKenneth E. Jansen
20339071d3baSCameron Smith      subroutine writeTimingMessage(key,iomode,timing)
20349071d3baSCameron Smith      use iso_c_binding
20359071d3baSCameron Smith      use phstr
20369071d3baSCameron Smith      implicit none
203759599516SKenneth E. Jansen
20389071d3baSCameron Smith      character(len=*) :: key
20399071d3baSCameron Smith      integer :: iomode
20409071d3baSCameron Smith      real*8 :: timing
2041da7d5714SCameron Smith      character(len=1024) :: timing_msg
204289625e43SCameron Smith      character(len=*), parameter ::
204389625e43SCameron Smith     &  streamModeString = c_char_"stream"//c_null_char,
204489625e43SCameron Smith     &  fileModeString = c_char_"disk"//c_null_char
204559599516SKenneth E. Jansen
2046da7d5714SCameron Smith      timing_msg = c_char_"Time to write "//c_null_char
20479071d3baSCameron Smith      call phstr_appendStr(timing_msg,key)
20489071d3baSCameron Smith      if ( iomode .eq. -1 ) then
20499071d3baSCameron Smith        call phstr_appendStr(timing_msg, streamModeString)
20509071d3baSCameron Smith      else
20519071d3baSCameron Smith        call phstr_appendStr(timing_msg, fileModeString)
20529071d3baSCameron Smith      endif
20539071d3baSCameron Smith      call phstr_appendStr(timing_msg, c_char_' = '//c_null_char)
20549071d3baSCameron Smith      call phstr_appendDbl(timing_msg, timing)
2055da7d5714SCameron Smith      write(6,*) trim(timing_msg)
20569071d3baSCameron Smith      return
20579071d3baSCameron Smith      end subroutine
205859599516SKenneth E. Jansen
2059