xref: /phasta/phSolver/incompressible/itrdrv.f (revision efb88323188ed9e19fe44766e380c23283186297)
159599516SKenneth E. Jansen      subroutine itrdrv (y,         ac,
259599516SKenneth E. Jansen     &                   uold,      x,
359599516SKenneth E. Jansen     &                   iBC,       BC,
459599516SKenneth E. Jansen     &                   iper,      ilwork,     shp,
559599516SKenneth E. Jansen     &                   shgl,      shpb,       shglb,
659599516SKenneth E. Jansen     &                   ifath,     velbar,     nsons )
759599516SKenneth E. Jansenc
859599516SKenneth E. Jansenc----------------------------------------------------------------------
959599516SKenneth E. Jansenc
1059599516SKenneth E. Jansenc This iterative driver is the semi-discrete, predictor multi-corrector
1159599516SKenneth E. Jansenc algorithm. It contains the Hulbert Generalized Alpha method which
1259599516SKenneth E. Jansenc is 2nd order accurate for Rho_inf from 0 to 1.  The method can be
1359599516SKenneth E. Jansenc made  first-order accurate by setting Rho_inf=-1. It uses CGP and
1459599516SKenneth E. Jansenc GMRES iterative solvers.
1559599516SKenneth E. Jansenc
1659599516SKenneth E. Jansenc working arrays:
1759599516SKenneth E. Jansenc  y      (nshg,ndof)           : Y variables
1859599516SKenneth E. Jansenc  x      (nshg,nsd)            : node coordinates
1959599516SKenneth E. Jansenc  iBC    (nshg)                : BC codes
2059599516SKenneth E. Jansenc  BC     (nshg,ndofBC)         : BC constraint parameters
2159599516SKenneth E. Jansenc  iper   (nshg)                : periodicity table
2259599516SKenneth E. Jansenc
2359599516SKenneth E. Jansenc
2459599516SKenneth E. Jansenc Zdenek Johan,  Winter 1991.  (Fortran 90)
2559599516SKenneth E. Jansenc Alberto Figueroa, Winter 2004.  CMM-FSI
2659599516SKenneth E. Jansenc Irene Vignon, Fall 2004. Impedance BC
2759599516SKenneth E. Jansenc----------------------------------------------------------------------
2859599516SKenneth E. Jansenc
2959599516SKenneth E. Jansen      use pvsQbi     !gives us splag (the spmass at the end of this run
3059599516SKenneth E. Jansen      use specialBC !gives us itvn
3159599516SKenneth E. Jansen      use timedata   !allows collection of time series
3259599516SKenneth E. Jansen      use convolImpFlow !for Imp bc
3359599516SKenneth E. Jansen      use convolRCRFlow !for RCR bc
3459599516SKenneth E. Jansen!MR CHANGE
3559599516SKenneth E. Jansen      use turbsa          ! used to access d2wall
3659599516SKenneth E. Jansen!MR CHANGE END
379071d3baSCameron Smith      use iso_c_binding
3859599516SKenneth E. Jansen
3959599516SKenneth E. Jansenc      use readarrays !reads in uold and acold
4059599516SKenneth E. Jansen
4159599516SKenneth E. Jansen        include "common.h"
4259599516SKenneth E. Jansen        include "mpif.h"
4359599516SKenneth E. Jansen        include "auxmpi.h"
44ae8d68e4SKenneth E. Jansen        include "svLS.h"
4559599516SKenneth E. Jansenc
4659599516SKenneth E. Jansen
4759599516SKenneth E. Jansen
4859599516SKenneth E. Jansen        real*8    y(nshg,ndof),              ac(nshg,ndof),
4959599516SKenneth E. Jansen     &            yold(nshg,ndof),           acold(nshg,ndof),
5059599516SKenneth E. Jansen     &            u(nshg,nsd),               uold(nshg,nsd),
5159599516SKenneth E. Jansen     &            x(numnp,nsd),              solinc(nshg,ndof),
5259599516SKenneth E. Jansen     &            BC(nshg,ndofBC),           tf(nshg,ndof),
5359599516SKenneth E. Jansen     &            GradV(nshg,nsdsq)
5459599516SKenneth E. Jansen
5559599516SKenneth E. Jansenc
5659599516SKenneth E. Jansen        real*8    res(nshg,ndof)
5759599516SKenneth E. Jansenc
5859599516SKenneth E. Jansen        real*8    shp(MAXTOP,maxsh,MAXQPT),
5959599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
6059599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
6159599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
6259599516SKenneth E. Jansenc
6359599516SKenneth E. Jansen        integer   rowp(nshg,nnz),         colm(nshg+1),
6459599516SKenneth E. Jansen     &            iBC(nshg),
6559599516SKenneth E. Jansen     &            ilwork(nlwork),
6659599516SKenneth E. Jansen     &            iper(nshg),            ifuncs(6)
6759599516SKenneth E. Jansen
6859599516SKenneth E. Jansen        real*8 vbc_prof(nshg,3)
6959599516SKenneth E. Jansen
7059599516SKenneth E. Jansen        integer stopjob
7159599516SKenneth E. Jansen        character*10 cname2
7259599516SKenneth E. Jansen        character*5  cname
7359599516SKenneth E. Jansenc
7459599516SKenneth E. Jansenc  stuff for dynamic model s.w.avg and wall model
7559599516SKenneth E. Jansenc
7659599516SKenneth E. Jansen        dimension ifath(numnp),    velbar(nfath,ndof),  nsons(nfath)
7759599516SKenneth E. Jansen
7859599516SKenneth E. Jansen        dimension wallubar(2),walltot(2)
7959599516SKenneth E. Jansenc
80ae8d68e4SKenneth E. Jansenc.... For linear solver Library
8159599516SKenneth E. Jansenc
8259599516SKenneth E. Jansen        integer eqnType, prjFlag, presPrjFlag, verbose
8359599516SKenneth E. Jansenc
8459599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: aperm,  atemp, atempS
8559599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: apermS
8659599516SKenneth E. Jansen
8759599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: lhsP, lhsK, lhsS
8859599516SKenneth E. Jansen        real*8   almit, alfit, gamit
8959599516SKenneth E. Jansenc
9059599516SKenneth E. Jansen        character*1024    servername
9159599516SKenneth E. Jansen        character*20    fname1,fmt1
9259599516SKenneth E. Jansen        character*20    fname2,fmt2
9359599516SKenneth E. Jansen        character*60    fnamepold, fvarts
9459599516SKenneth E. Jansen        character*4     fname4c ! 4 characters
9559599516SKenneth E. Jansen        integer         iarray(50) ! integers for headers
9659599516SKenneth E. Jansen        integer         isgn(ndof), isgng(ndof)
9759599516SKenneth E. Jansen
9859599516SKenneth E. Jansen!MR CHANGE
9959599516SKenneth E. Jansen!        real*8 rerr(nshg,10), ybar(nshg,13) ! including 7 sq. terms with 3 cross terms of uv, uw and vw
10059599516SKenneth E. Jansen!        real*8 rerr(nshg,10), ybar(nshg,12) ! including 7 sq. terms with 3 cross terms of uv, uw and vw
10159599516SKenneth E. Jansen        real*8 rerr(nshg,10)
10259599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: ybar, strain, vorticity
10359599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: wallssVec, wallssVecbar
10459599516SKenneth E. Jansen!MR CHANGE
10559599516SKenneth E. Jansen
10659599516SKenneth E. Jansen        real*8 tcorecp(2), tcorecpscal(2)
10759599516SKenneth E. Jansen
10859599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: ivarts
10959599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: ivartsg
11059599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: iv_rank
11159599516SKenneth E. Jansen        real*8, allocatable, dimension(:) :: vartssoln
11259599516SKenneth E. Jansen        real*8, allocatable, dimension(:) :: vartssolng
11359599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: yphbar
11459599516SKenneth E. Jansen        real*8 CFLworst(numel)
11559599516SKenneth E. Jansen
11659599516SKenneth E. Jansen!MR CHANGE
11759599516SKenneth E. Jansen        integer :: iv_rankpernode, iv_totnodes, iv_totcores
11859599516SKenneth E. Jansen        integer :: iv_node, iv_core, iv_thread
11959599516SKenneth E. Jansen!MR CHANGE
120ae8d68e4SKenneth E. Jansen!--------------------------------------------------------------------
121ae8d68e4SKenneth E. Jansen!     Setting up svLS
122ae8d68e4SKenneth E. Jansen      INTEGER svLS_nFaces, gnNo, nNo, faIn, facenNo
123ae8d68e4SKenneth E. Jansen      INTEGER, ALLOCATABLE :: ltg(:), gNodes(:)
124ae8d68e4SKenneth E. Jansen      REAL*8, ALLOCATABLE :: sV(:,:)
125ae8d68e4SKenneth E. Jansen
126ae8d68e4SKenneth E. Jansen      CHARACTER*128 fileName
127ae8d68e4SKenneth E. Jansen      TYPE(svLS_commuType) communicator
128ae8d68e4SKenneth E. Jansen      TYPE(svLS_lhsType) svLS_lhs
129ae8d68e4SKenneth E. Jansen      TYPE(svLS_lsType) svLS_ls
13059599516SKenneth E. Jansen
13159599516SKenneth E. Jansen        impistat = 0
13259599516SKenneth E. Jansen        impistat2 = 0
13359599516SKenneth E. Jansen        iISend = 0
13459599516SKenneth E. Jansen        iISendScal = 0
13559599516SKenneth E. Jansen        iIRecv = 0
13659599516SKenneth E. Jansen        iIRecvScal = 0
13759599516SKenneth E. Jansen        iWaitAll = 0
13859599516SKenneth E. Jansen        iWaitAllScal = 0
13959599516SKenneth E. Jansen        iAllR = 0
14059599516SKenneth E. Jansen        iAllRScal = 0
14159599516SKenneth E. Jansen        rISend = zero
14259599516SKenneth E. Jansen        rISendScal = zero
14359599516SKenneth E. Jansen        rIRecv = zero
14459599516SKenneth E. Jansen        rIRecvScal = zero
14559599516SKenneth E. Jansen        rWaitAll = zero
14659599516SKenneth E. Jansen        rWaitAllScal = zero
14759599516SKenneth E. Jansen        rAllR = zero
14859599516SKenneth E. Jansen        rAllRScal = zero
14959599516SKenneth E. Jansen        rCommu = zero
15059599516SKenneth E. Jansen        rCommuScal = zero
15159599516SKenneth E. Jansen
15259599516SKenneth E. Jansen        call initmemstat()
15359599516SKenneth E. Jansen
15459599516SKenneth E. Jansenc
15559599516SKenneth E. Jansenc  hack SA variable
15659599516SKenneth E. Jansenc
15759599516SKenneth E. JansencHack        BC(:,7)=BC(:,7)*0.001
15859599516SKenneth E. JansencHack        if(lstep.eq.0) y(:,6)=y(:,6)*0.001
159ae8d68e4SKenneth E. Jansen!--------------------------------------------------------------------
160ae8d68e4SKenneth E. Jansen!     Setting up svLS
161ae8d68e4SKenneth E. Jansen
162*efb88323SKenneth E. Jansen!      if(ipresPrjFlag.eq.1) then
163*efb88323SKenneth E. Jansen!        svLSFlag=0
164*efb88323SKenneth E. Jansen!      else
165*efb88323SKenneth E. Jansen!        svLSFlag=1  !hardcode for now while testing
166*efb88323SKenneth E. Jansen!        svLSType=3  !hardcode for now while testing
167*efb88323SKenneth E. Jansen!      endif
168ae8d68e4SKenneth E. Jansen      IF (svLSFlag .EQ. 1) THEN
169*efb88323SKenneth E. Jansen         svLSType=3 !NS solver
170*efb88323SKenneth E. Jansen!         svLSType=2 !GMRES
171*efb88323SKenneth E. Jansen! need to get a switch to handle the above two lines soon
172*efb88323SKenneth E. Jansen!  reltol for the NSSOLVE is the stop criterion on the outer loop
173*efb88323SKenneth E. Jansen!  reltolIn is (eps_GM, eps_CG) from the CompMech paper
174*efb88323SKenneth E. Jansen!  for now we are using
175*efb88323SKenneth E. Jansen!  Tolerance on ACUSIM Pressure Projection for CG and
176*efb88323SKenneth E. Jansen!  Tolerance on Momentum Equations for GMRES
177*efb88323SKenneth E. Jansen! also using Kspaceand maxIters from setup for ACUSIM
178*efb88323SKenneth E. Jansen!
179*efb88323SKenneth E. Jansen         eps_outer=40.0*epstol(1)  !following papers soggestion for now
180ae8d68e4SKenneth E. Jansen         CALL svLS_LS_CREATE(svLS_ls, svLSType, dimKry=Kspace,
181*efb88323SKenneth E. Jansen     2      relTol=eps_outer, relTolIn=(/epstol(1),prestol/),
182*efb88323SKenneth E. Jansen     3      maxItr=maxIters,
183*efb88323SKenneth E. Jansen     4      maxItrIn=(/maxIters,maxIters/))
184ae8d68e4SKenneth E. Jansen
185ae8d68e4SKenneth E. Jansen         CALL svLS_COMMU_CREATE(communicator, MPI_COMM_WORLD)
186ae8d68e4SKenneth E. Jansen
187ae8d68e4SKenneth E. Jansen         IF (numpe .GT. 1) THEN
188ae8d68e4SKenneth E. Jansen            WRITE(fileName,*) myrank
189ae8d68e4SKenneth E. Jansen            fileName = "ltg.dat."//ADJUSTL(TRIM(fileName))
190ae8d68e4SKenneth E. Jansen            OPEN(1,FILE=fileName)
191ae8d68e4SKenneth E. Jansen            READ(1,*) gnNo
192ae8d68e4SKenneth E. Jansen            READ(1,*) nNo
193ae8d68e4SKenneth E. Jansen            ALLOCATE(ltg(nNo))
194ae8d68e4SKenneth E. Jansen            READ(1,*) ltg
195ae8d68e4SKenneth E. Jansen            CLOSE(1)
196ae8d68e4SKenneth E. Jansen         ELSE
197ae8d68e4SKenneth E. Jansen            gnNo = nshg
198ae8d68e4SKenneth E. Jansen            nNo = nshg
199ae8d68e4SKenneth E. Jansen            ALLOCATE(ltg(nNo))
200ae8d68e4SKenneth E. Jansen            DO i=1, nNo
201ae8d68e4SKenneth E. Jansen               ltg(i) = i
202ae8d68e4SKenneth E. Jansen            END DO
203ae8d68e4SKenneth E. Jansen         END IF
204ae8d68e4SKenneth E. Jansen      ELSE
205ae8d68e4SKenneth E. Jansen!--------------------------------------------------------------------
20659599516SKenneth E. Jansen        call SolverLicenseServer(servername)
207ae8d68e4SKenneth E. Jansen      ENDIF
20859599516SKenneth E. Jansenc
20959599516SKenneth E. Jansenc only master should be verbose
21059599516SKenneth E. Jansenc
21159599516SKenneth E. Jansen
21259599516SKenneth E. Jansen        if(numpe.gt.0 .and. myrank.ne.master)iverbose=0
21359599516SKenneth E. Jansenc
21459599516SKenneth E. Jansen
21559599516SKenneth E. Jansen        lskeep=lstep
21659599516SKenneth E. Jansen
21759599516SKenneth E. Jansen        inquire(file='xyzts.dat',exist=exts)
21859599516SKenneth E. Jansen        if(exts) then
21959599516SKenneth E. Jansen
22059599516SKenneth E. Jansen           open(unit=626,file='xyzts.dat',status='old')
22159599516SKenneth E. Jansen           read(626,*) ntspts, freq, tolpt, iterat, varcod
22259599516SKenneth E. Jansen           call sTD             ! sets data structures
22359599516SKenneth E. Jansen
22459599516SKenneth E. Jansen           do jj=1,ntspts       ! read coordinate data where solution desired
22559599516SKenneth E. Jansen              read(626,*) ptts(jj,1),ptts(jj,2),ptts(jj,3)
22659599516SKenneth E. Jansen           enddo
22759599516SKenneth E. Jansen           close(626)
22859599516SKenneth E. Jansen
22959599516SKenneth E. Jansen           statptts(:,:) = 0
23059599516SKenneth E. Jansen           parptts(:,:) = zero
23159599516SKenneth E. Jansen           varts(:,:) = zero
23259599516SKenneth E. Jansen
23359599516SKenneth E. Jansen           allocate (ivarts(ntspts*ndof))
23459599516SKenneth E. Jansen           allocate (ivartsg(ntspts*ndof))
23559599516SKenneth E. Jansen           allocate (iv_rank(ntspts))
23659599516SKenneth E. Jansen           allocate (vartssoln(ntspts*ndof))
23759599516SKenneth E. Jansen           allocate (vartssolng(ntspts*ndof))
23859599516SKenneth E. Jansen
23959599516SKenneth E. Jansen           iv_rankpernode = iv_rankpercore*iv_corepernode
24059599516SKenneth E. Jansen           iv_totnodes = numpe/iv_rankpernode
24159599516SKenneth E. Jansen           iv_totcores = iv_corepernode*iv_totnodes
24259599516SKenneth E. Jansen           if (myrank .eq. 0) then
24359599516SKenneth E. Jansen             write(*,*) 'Info for probes:'
24459599516SKenneth E. Jansen             write(*,*) '  Ranks per core:',iv_rankpercore
24559599516SKenneth E. Jansen             write(*,*) '  Cores per node:',iv_corepernode
24659599516SKenneth E. Jansen             write(*,*) '  Ranks per node:',iv_rankpernode
24759599516SKenneth E. Jansen             write(*,*) '  Total number of nodes:',iv_totnodes
24859599516SKenneth E. Jansen             write(*,*) '  Total number of cores',iv_totcores
24959599516SKenneth E. Jansen           endif
25059599516SKenneth E. Jansen
25159599516SKenneth E. Jansen!           if (myrank .eq. numpe-1) then
25259599516SKenneth E. Jansen            do jj=1,ntspts
25359599516SKenneth E. Jansen
25459599516SKenneth E. Jansen               ! Compute the adequate rank which will take care of probe jj
25559599516SKenneth E. Jansen               jjm1 = jj-1
25659599516SKenneth E. Jansen               iv_node = (iv_totnodes-1)-mod(jjm1,iv_totnodes)
25759599516SKenneth E. Jansen               iv_core = (iv_corepernode-1) - mod((jjm1 -
25859599516SKenneth E. Jansen     &              mod(jjm1,iv_totnodes))/iv_totnodes,iv_corepernode)
25959599516SKenneth E. Jansen               iv_thread = (iv_rankpercore-1) - mod((jjm1-
26059599516SKenneth E. Jansen     &              (mod(jjm1,iv_totcores)))/iv_totcores,iv_rankpercore)
26159599516SKenneth E. Jansen               iv_rank(jj) = iv_node*iv_rankpernode
26259599516SKenneth E. Jansen     &                     + iv_core*iv_rankpercore
26359599516SKenneth E. Jansen     &                     + iv_thread
26459599516SKenneth E. Jansen
26559599516SKenneth E. Jansen               if(myrank == 0) then
26659599516SKenneth E. Jansen                 write(*,*) '  Probe', jj, 'handled by rank',
26759599516SKenneth E. Jansen     &                         iv_rank(jj), ' on node', iv_node
26859599516SKenneth E. Jansen               endif
26959599516SKenneth E. Jansen
27059599516SKenneth E. Jansen               ! Verification just in case
27159599516SKenneth E. Jansen               if(iv_rank(jj) .lt.0 .or. iv_rank(jj) .ge. numpe) then
27259599516SKenneth E. Jansen                 write(*,*) 'WARNING: iv_rank(',jj,') is ', iv_rank(jj),
27359599516SKenneth E. Jansen     &                      ' and reset to numpe-1'
27459599516SKenneth E. Jansen                 iv_rank(jj) = numpe-1
27559599516SKenneth E. Jansen               endif
27659599516SKenneth E. Jansen
27759599516SKenneth E. Jansen               ! Open the varts files
27859599516SKenneth E. Jansen               if(myrank == iv_rank(jj)) then
27959599516SKenneth E. Jansen                 fvarts='varts/varts'
28059599516SKenneth E. Jansen                 fvarts=trim(fvarts)//trim(cname2(jj))
28159599516SKenneth E. Jansen                 fvarts=trim(fvarts)//trim(cname2(lstep))
28259599516SKenneth E. Jansen                 fvarts=trim(fvarts)//'.dat'
28359599516SKenneth E. Jansen                 fvarts=trim(fvarts)
28459599516SKenneth E. Jansen                 open(unit=1000+jj, file=fvarts, status='unknown')
28559599516SKenneth E. Jansen               endif
28659599516SKenneth E. Jansen            enddo
28759599516SKenneth E. Jansen!           endif
28859599516SKenneth E. Jansen
28959599516SKenneth E. Jansen        endif
29059599516SKenneth E. Jansenc
29159599516SKenneth E. Jansenc.... open history and aerodynamic forces files
29259599516SKenneth E. Jansenc
29359599516SKenneth E. Jansen        if (myrank .eq. master) then
294c9a96f21SKenneth E. Jansen           open (unit=ihist,  file=fhist,  status='unknown')
29559599516SKenneth E. Jansen           open (unit=iforce, file=fforce, status='unknown')
29659599516SKenneth E. Jansen           open (unit=76, file="fort.76", status='unknown')
29759599516SKenneth E. Jansen           if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then
29859599516SKenneth E. Jansen              fnamepold = 'pold'
29959599516SKenneth E. Jansen              fnamepold = trim(fnamepold)//trim(cname2(lstep))
30059599516SKenneth E. Jansen              fnamepold = trim(fnamepold)//'.dat'
30159599516SKenneth E. Jansen              fnamepold = trim(fnamepold)
30259599516SKenneth E. Jansen              open (unit=8177, file=fnamepold, status='unknown')
30359599516SKenneth E. Jansen           endif
30459599516SKenneth E. Jansen        endif
30559599516SKenneth E. Jansenc
30659599516SKenneth E. Jansenc.... initialize
30759599516SKenneth E. Jansenc
30859599516SKenneth E. Jansen        ifuncs(:)  = 0              ! func. evaluation counter
30959599516SKenneth E. Jansen        istep  = 0
31059599516SKenneth E. Jansen        yold   = y
31159599516SKenneth E. Jansen        acold  = ac
31259599516SKenneth E. Jansen
31359599516SKenneth E. Jansen        rerr = zero
31459599516SKenneth E. Jansen
31559599516SKenneth E. Jansen        if(ierrcalc.eq.1 .or. ioybar.eq.1) then ! we need ybar for error too
31659599516SKenneth E. Jansen          if (ivort == 1) then
31759599516SKenneth E. Jansen            allocate(ybar(nshg,17)) ! more space for vorticity if requested
31859599516SKenneth E. Jansen          else
31959599516SKenneth E. Jansen            allocate(ybar(nshg,13))
32059599516SKenneth E. Jansen          endif
32159599516SKenneth E. Jansen          ybar = zero ! Initialize ybar to zero, which is essential
32259599516SKenneth E. Jansen        endif
32359599516SKenneth E. Jansen
32459599516SKenneth E. Jansen        if(ivort == 1) then
32559599516SKenneth E. Jansen          allocate(strain(nshg,6))
32659599516SKenneth E. Jansen          allocate(vorticity(nshg,5))
32759599516SKenneth E. Jansen        endif
32859599516SKenneth E. Jansen
32959599516SKenneth E. Jansen        if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
33059599516SKenneth E. Jansen          allocate(wallssVec(nshg,3))
33159599516SKenneth E. Jansen          if (ioybar .eq. 1) then
33259599516SKenneth E. Jansen            allocate(wallssVecbar(nshg,3))
33359599516SKenneth E. Jansen            wallssVecbar = zero ! Initialization important if mean wss computed
33459599516SKenneth E. Jansen          endif
33559599516SKenneth E. Jansen        endif
33659599516SKenneth E. Jansen
33759599516SKenneth E. Jansen! both nstepsincycle and nphasesincycle needs to be set
33859599516SKenneth E. Jansen        if(nstepsincycle.eq.0) nphasesincycle = 0
33959599516SKenneth E. Jansen        if(nphasesincycle.ne.0) then
34059599516SKenneth E. Jansen!     &     allocate(yphbar(nshg,5,nphasesincycle))
34159599516SKenneth E. Jansen          if (ivort == 1) then
34259599516SKenneth E. Jansen            allocate(yphbar(nshg,15,nphasesincycle)) ! more space for vorticity
34359599516SKenneth E. Jansen          else
34459599516SKenneth E. Jansen            allocate(yphbar(nshg,11,nphasesincycle))
34559599516SKenneth E. Jansen          endif
34659599516SKenneth E. Jansen          yphbar = zero
34759599516SKenneth E. Jansen        endif
34859599516SKenneth E. Jansen
34959599516SKenneth E. Jansen!MR CHANGE END
35059599516SKenneth E. Jansen
35159599516SKenneth E. Jansen        vbc_prof(:,1:3) = BC(:,3:5)
35259599516SKenneth E. Jansen        if(iramp.eq.1) then
35359599516SKenneth E. Jansen          call BCprofileInit(vbc_prof,x)
35459599516SKenneth E. Jansen        endif
35559599516SKenneth E. Jansen
35659599516SKenneth E. Jansenc
357ae8d68e4SKenneth E. Jansenc.... ---------------> initialize LesLib Library <---------------
35859599516SKenneth E. Jansenc
35959599516SKenneth E. Jansenc.... assign parameter values
36059599516SKenneth E. Jansenc
36159599516SKenneth E. Jansen        do i = 1, 100
36259599516SKenneth E. Jansen           numeqns(i) = i
36359599516SKenneth E. Jansen        enddo
36459599516SKenneth E. Jansen        nKvecs       = Kspace
36559599516SKenneth E. Jansen        prjFlag      = iprjFlag
36659599516SKenneth E. Jansen        presPrjFlag  = ipresPrjFlag
36759599516SKenneth E. Jansen        verbose      = iverbose
36859599516SKenneth E. Jansenc
36959599516SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve
37059599516SKenneth E. Jansenc
37159599516SKenneth E. Jansen      nsolt=mod(impl(1),2)      ! 1 if solving temperature
37259599516SKenneth E. Jansen      nsclrsol=nsolt+nsclr      ! total number of scalars solved At
37359599516SKenneth E. Jansen                                ! some point we probably want to create
37459599516SKenneth E. Jansen                                ! a map, considering stepseq(), to find
37559599516SKenneth E. Jansen                                ! what is actually solved and only
37659599516SKenneth E. Jansen                                ! dimension lhs to the appropriate
37759599516SKenneth E. Jansen                                ! size. (see 1.6.1 and earlier for a
37859599516SKenneth E. Jansen                                ! "failed" attempt at this).
37959599516SKenneth E. Jansen
38059599516SKenneth E. Jansen
38159599516SKenneth E. Jansen      nsolflow=mod(impl(1),100)/10  ! 1 if solving flow
38259599516SKenneth E. Jansen
38359599516SKenneth E. Jansenc
384ae8d68e4SKenneth E. Jansenc.... Now, call lesNew routine to initialize
38559599516SKenneth E. Jansenc     memory space
38659599516SKenneth E. Jansenc
38759599516SKenneth E. Jansen      call genadj(colm, rowp, icnt )  ! preprocess the adjacency list
38859599516SKenneth E. Jansen
38959599516SKenneth E. Jansen      nnz_tot=icnt ! this is exactly the number of non-zero blocks on
39059599516SKenneth E. Jansen                   ! this proc
39159599516SKenneth E. Jansen
39259599516SKenneth E. Jansen      if (nsolflow.eq.1) then
39359599516SKenneth E. Jansen         lesId   = numeqns(1)
39459599516SKenneth E. Jansen         eqnType = 1
39559599516SKenneth E. Jansen         nDofs   = 4
396ae8d68e4SKenneth E. Jansen
397ae8d68e4SKenneth E. Jansen!--------------------------------------------------------------------
398ae8d68e4SKenneth E. Jansen!     Rest of configuration of svLS is added here, where we have LHS
399ae8d68e4SKenneth E. Jansen!     pointers
400ae8d68e4SKenneth E. Jansen
401ae8d68e4SKenneth E. Jansen         nPermDims = 1
402ae8d68e4SKenneth E. Jansen         nTmpDims = 1
403ae8d68e4SKenneth E. Jansen
404ae8d68e4SKenneth E. Jansen         allocate (lhsP(4,nnz_tot))
405ae8d68e4SKenneth E. Jansen         allocate (lhsK(9,nnz_tot))
406ae8d68e4SKenneth E. Jansen
407ae8d68e4SKenneth E. Jansen         IF (svLSFlag .EQ. 1) THEN
408ae8d68e4SKenneth E. Jansen            IF  (ipvsq .GE. 2) THEN
409ae8d68e4SKenneth E. Jansen
410ae8d68e4SKenneth E. Jansen#if((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 1))
411ae8d68e4SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs
412ae8d68e4SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs + numCORSrfs
413ae8d68e4SKenneth E. Jansen#elif((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 0))
414ae8d68e4SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs
415ae8d68e4SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs + numCORSrfs
416ae8d68e4SKenneth E. Jansen#elif((VER_CORONARY == 0)&&(VER_CLOSEDLOOP == 1))
417ae8d68e4SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs
418ae8d68e4SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs
419ae8d68e4SKenneth E. Jansen#else
420ae8d68e4SKenneth E. Jansen               svLS_nFaces = 1 + numResistSrfs
421ae8d68e4SKenneth E. Jansen     2            + numImpSrfs + numRCRSrfs
422ae8d68e4SKenneth E. Jansen#endif
423ae8d68e4SKenneth E. Jansen
424ae8d68e4SKenneth E. Jansen            ELSE
425ae8d68e4SKenneth E. Jansen               svLS_nFaces = 1
426ae8d68e4SKenneth E. Jansen            END IF
427ae8d68e4SKenneth E. Jansen
428ae8d68e4SKenneth E. Jansen            CALL svLS_LHS_CREATE(svLS_lhs, communicator, gnNo, nNo,
429ae8d68e4SKenneth E. Jansen     2         nnz_tot, ltg, colm, rowp, svLS_nFaces)
430ae8d68e4SKenneth E. Jansen
431ae8d68e4SKenneth E. Jansen            faIn = 1
432ae8d68e4SKenneth E. Jansen            facenNo = 0
433ae8d68e4SKenneth E. Jansen            DO i=1, nshg
434ae8d68e4SKenneth E. Jansen               IF (IBITS(iBC(i),3,3) .NE. 0)  facenNo = facenNo + 1
435ae8d68e4SKenneth E. Jansen            END DO
436ae8d68e4SKenneth E. Jansen            ALLOCATE(gNodes(facenNo), sV(nsd,facenNo))
437ae8d68e4SKenneth E. Jansen            sV = 0D0
438ae8d68e4SKenneth E. Jansen            j = 0
439ae8d68e4SKenneth E. Jansen            DO i=1, nshg
440ae8d68e4SKenneth E. Jansen               IF (IBITS(iBC(i),3,3) .NE. 0) THEN
441ae8d68e4SKenneth E. Jansen                  j = j + 1
442ae8d68e4SKenneth E. Jansen                  gNodes(j) = i
443ae8d68e4SKenneth E. Jansen                  IF (.NOT.BTEST(iBC(i),3)) sV(1,j) = 1D0
444ae8d68e4SKenneth E. Jansen                  IF (.NOT.BTEST(iBC(i),4)) sV(2,j) = 1D0
445ae8d68e4SKenneth E. Jansen                  IF (.NOT.BTEST(iBC(i),5)) sV(3,j) = 1D0
446ae8d68e4SKenneth E. Jansen               END IF
447ae8d68e4SKenneth E. Jansen            END DO
448ae8d68e4SKenneth E. Jansen            CALL svLS_BC_CREATE(svLS_lhs, faIn, facenNo,
449ae8d68e4SKenneth E. Jansen     2         nsd, BC_TYPE_Dir, gNodes, sV)
450ae8d68e4SKenneth E. Jansen
451ae8d68e4SKenneth E. Jansen         ELSE
452ae8d68e4SKenneth E. Jansen!--------------------------------------------------------------------
45359599516SKenneth E. Jansen         call myfLesNew( lesId,   41994,
45459599516SKenneth E. Jansen     &                 eqnType,
45559599516SKenneth E. Jansen     &                 nDofs,          minIters,       maxIters,
45659599516SKenneth E. Jansen     &                 nKvecs,         prjFlag,        nPrjs,
45759599516SKenneth E. Jansen     &                 presPrjFlag,    nPresPrjs,      epstol(1),
45859599516SKenneth E. Jansen     &                 prestol,        verbose,        statsflow,
45959599516SKenneth E. Jansen     &                 nPermDims,      nTmpDims,      servername  )
46059599516SKenneth E. Jansen
461ae8d68e4SKenneth E. Jansen         END IF
46259599516SKenneth E. Jansen         allocate (aperm(nshg,nPermDims))
46359599516SKenneth E. Jansen         allocate (atemp(nshg,nTmpDims))
464ae8d68e4SKenneth E. Jansen         IF (svLSFlag .NE. 1) THEN
46559599516SKenneth E. Jansen           call readLesRestart( lesId,  aperm, nshg, myrank, lstep,
46659599516SKenneth E. Jansen     &                        nPermDims )
467ae8d68e4SKenneth E. Jansen         ENDIF
46859599516SKenneth E. Jansen
46959599516SKenneth E. Jansen      else
47059599516SKenneth E. Jansen         nPermDims = 0
47159599516SKenneth E. Jansen         nTempDims = 0
47259599516SKenneth E. Jansen      endif
47359599516SKenneth E. Jansen
47459599516SKenneth E. Jansen
47559599516SKenneth E. Jansen      if(nsclrsol.gt.0) then
47659599516SKenneth E. Jansen       do isolsc=1,nsclrsol
47759599516SKenneth E. Jansen         lesId       = numeqns(isolsc+1)
47859599516SKenneth E. Jansen         eqnType     = 2
47959599516SKenneth E. Jansen         nDofs       = 1
48059599516SKenneth E. Jansen         presPrjflag = 0
48159599516SKenneth E. Jansen         nPresPrjs   = 0
48259599516SKenneth E. Jansen         prjFlag     = 1
48359599516SKenneth E. Jansen         indx=isolsc+2-nsolt ! complicated to keep epstol(2) for
48459599516SKenneth E. Jansen                             ! temperature followed by scalars
48559599516SKenneth E. Jansen         call myfLesNew( lesId,            41994,
48659599516SKenneth E. Jansen     &                 eqnType,
48759599516SKenneth E. Jansen     &                 nDofs,          minIters,       maxIters,
48859599516SKenneth E. Jansen     &                 nKvecs,         prjFlag,        nPrjs,
48959599516SKenneth E. Jansen     &                 presPrjFlag,    nPresPrjs,      epstol(indx),
49059599516SKenneth E. Jansen     &                 prestol,        verbose,        statssclr,
49159599516SKenneth E. Jansen     &                 nPermDimsS,     nTmpDimsS,   servername )
49259599516SKenneth E. Jansen       enddo
49359599516SKenneth E. Jansenc
49459599516SKenneth E. Jansenc  Assume all scalars have the same size needs
49559599516SKenneth E. Jansenc
49659599516SKenneth E. Jansen       allocate (apermS(nshg,nPermDimsS,nsclrsol))
49759599516SKenneth E. Jansen       allocate (atempS(nshg,nTmpDimsS))  !they can all share this
49859599516SKenneth E. Jansen       allocate (lhsS(nnz_tot,nsclrsol))
49959599516SKenneth E. Jansenc
50059599516SKenneth E. Jansenc actually they could even share with atemp but leave that for later
50159599516SKenneth E. Jansenc
50259599516SKenneth E. Jansen      else
50359599516SKenneth E. Jansen         nPermDimsS = 0
50459599516SKenneth E. Jansen         nTmpDimsS  = 0
50559599516SKenneth E. Jansen      endif
50659599516SKenneth E. Jansenc
50759599516SKenneth E. Jansenc...  prepare lumped mass if needed
50859599516SKenneth E. Jansenc
50959599516SKenneth E. Jansen      if((flmpr.ne.0).or.(flmpl.ne.0)) call genlmass(x, shp,shgl)
51059599516SKenneth E. Jansenc
51159599516SKenneth E. Jansenc.... -----------------> End of initialization <-----------------
51259599516SKenneth E. Jansenc
51359599516SKenneth E. Jansenc.....open the necessary files to gather time series
51459599516SKenneth E. Jansenc
51559599516SKenneth E. Jansen      lstep0 = lstep+1
51659599516SKenneth E. Jansen      nsteprcr = nstep(1)+lstep
51759599516SKenneth E. Jansenc
51859599516SKenneth E. Jansenc.... loop through the time sequences
51959599516SKenneth E. Jansenc
52059599516SKenneth E. Jansen
52159599516SKenneth E. Jansen
52259599516SKenneth E. Jansen      do 3000 itsq = 1, ntseq
52359599516SKenneth E. Jansen         itseq = itsq
52459599516SKenneth E. Jansen
52559599516SKenneth E. JansenCAD         tcorecp1 = second(0)
52659599516SKenneth E. JansenCAD         tcorewc1 = second(-1)
52759599516SKenneth E. Jansenc
52859599516SKenneth E. Jansenc.... set up the time integration parameters
52959599516SKenneth E. Jansenc
53059599516SKenneth E. Jansen         nstp   = nstep(itseq)
53159599516SKenneth E. Jansen         nitr   = niter(itseq)
53259599516SKenneth E. Jansen         LCtime = loctim(itseq)
53359599516SKenneth E. Jansen         dtol(:)= deltol(itseq,:)
53459599516SKenneth E. Jansen
53559599516SKenneth E. Jansen         call itrSetup ( y, acold )
53659599516SKenneth E. Jansenc
53759599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution,
53859599516SKenneth E. Jansenc   which are functions of alphaf so need to do it after itrSetup
53959599516SKenneth E. Jansen         if(numImpSrfs.gt.zero) then
54059599516SKenneth E. Jansen            call calcImpConvCoef (numImpSrfs, ntimeptpT)
54159599516SKenneth E. Jansen         endif
54259599516SKenneth E. Jansenc
54359599516SKenneth E. Jansenc...initialize the initial condition P(0)-RQ(0)-Pd(0) for RCR BC
54459599516SKenneth E. Jansenc   need ndsurf so should be after initNABI
54559599516SKenneth E. Jansen         if(numRCRSrfs.gt.zero) then
54659599516SKenneth E. Jansen            call calcRCRic(y,nsrflistRCR,numRCRSrfs)
54759599516SKenneth E. Jansen         endif
54859599516SKenneth E. Jansenc
54959599516SKenneth E. Jansenc  find the last solve of the flow in the step sequence so that we will
55059599516SKenneth E. Jansenc         know when we are at/near end of step
55159599516SKenneth E. Jansenc
55259599516SKenneth E. Jansenc         ilast=0
55359599516SKenneth E. Jansen         nitr=0  ! count number of flow solves in a step (# of iterations)
55459599516SKenneth E. Jansen         do i=1,seqsize
55559599516SKenneth E. Jansen            if(stepseq(i).eq.0) nitr=nitr+1
55659599516SKenneth E. Jansen         enddo
55759599516SKenneth E. Jansen
55859599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
55959599516SKenneth E. Jansen         tcorecp(:) = zero ! used in solfar.f (solflow)
56059599516SKenneth E. Jansen         tcorecpscal(:) = zero ! used in solfar.f (solflow)
56159599516SKenneth E. Jansen         if(myrank.eq.0)  then
56259599516SKenneth E. Jansen            tcorecp1 = TMRC()
56359599516SKenneth E. Jansen         endif
56459599516SKenneth E. Jansen
56559599516SKenneth E. Jansenc
56659599516SKenneth E. Jansenc.... loop through the time steps
56759599516SKenneth E. Jansenc
56859599516SKenneth E. Jansen         istop=0
56959599516SKenneth E. Jansen         rmub=datmat(1,2,1)
57059599516SKenneth E. Jansen         if(rmutarget.gt.0) then
57159599516SKenneth E. Jansen            rmue=rmutarget
57259599516SKenneth E. Jansen         else
57359599516SKenneth E. Jansen            rmue=datmat(1,2,1) ! keep constant
57459599516SKenneth E. Jansen         endif
57559599516SKenneth E. Jansen
57659599516SKenneth E. Jansen        if(iramp.eq.1) then
57759599516SKenneth E. Jansen            call BCprofileScale(vbc_prof,BC,yold) ! fix the yold values to the reset BC
57859599516SKenneth E. Jansen            isclr=1 ! fix scalar
57959599516SKenneth E. Jansen            do isclr=1,nsclr
58059599516SKenneth E. Jansen               call itrBCSclr(yold,ac,iBC,BC,iper,ilwork)
58159599516SKenneth E. Jansen            enddo
58259599516SKenneth E. Jansen        endif
58359599516SKenneth E. Jansen
58459599516SKenneth E. Jansen         do 2000 istp = 1, nstp
58559599516SKenneth E. Jansen           if(iramp.eq.1)
58659599516SKenneth E. Jansen     &        call BCprofileScale(vbc_prof,BC,yold)
58759599516SKenneth E. Jansen
58859599516SKenneth E. Jansen           call rerun_check(stopjob)
58932eed141SKenneth E. Jansen           if(myrank.eq.master) write(*,*)
59032eed141SKenneth E. Jansen     &         'stopjob,lstep,istep', stopjob,lstep,istep
59132eed141SKenneth E. Jansen           if(stopjob.eq.lstep) then
59232eed141SKenneth E. Jansen              stopjob=-2 ! this is the code to finish
59332eed141SKenneth E. Jansen             if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then
59432eed141SKenneth E. Jansen                if(myrank.eq.master) write(*,*)
59532eed141SKenneth E. Jansen     &         'line 473 says last step written so exit'
59632eed141SKenneth E. Jansen                goto 2002  ! the step was written last step so just exit
59732eed141SKenneth E. Jansen             else
59832eed141SKenneth E. Jansen                if(myrank.eq.master)
59932eed141SKenneth E. Jansen     &         write(*,*) 'line 473 says last step not written'
60032eed141SKenneth E. Jansen                istep=nstp  ! have to do this so that solution will be written
60132eed141SKenneth E. Jansen                goto 2001
60232eed141SKenneth E. Jansen             endif
60332eed141SKenneth E. Jansen           endif
60459599516SKenneth E. Jansen
60559599516SKenneth E. Jansen            xi=istp*1.0/nstp
60659599516SKenneth E. Jansen            datmat(1,2,1)=rmub*(1.0-xi)+xi*rmue
60759599516SKenneth E. Jansenc            write(*,*) "current mol. visc = ", datmat(1,2,1)
60859599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC.
60959599516SKenneth E. Jansenc     these will be for time step n+1 so use lstep+1
61059599516SKenneth E. Jansenc
61159599516SKenneth E. Jansen            if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl,
61259599516SKenneth E. Jansen     &                               shpb, shglb, x, BC, iBC)
61359599516SKenneth E. Jansen
61459599516SKenneth E. Jansenc
61559599516SKenneth E. Jansenc ... calculate the pressure contribution that depends on the history for the Imp. BC
61659599516SKenneth E. Jansenc
61759599516SKenneth E. Jansen            if(numImpSrfs.gt.0) then
61859599516SKenneth E. Jansen               call pHist(poldImp,QHistImp,ImpConvCoef,
61959599516SKenneth E. Jansen     &                    ntimeptpT,numImpSrfs)
62059599516SKenneth E. Jansen               if (myrank.eq.master)
62159599516SKenneth E. Jansen     &             write(8177,*) (poldImp(n), n=1,numImpSrfs)
62259599516SKenneth E. Jansen            endif
62359599516SKenneth E. Jansenc
62459599516SKenneth E. Jansenc ... calc the pressure contribution that depends on the history for the RCR BC
62559599516SKenneth E. Jansenc
62659599516SKenneth E. Jansen            if(numRCRSrfs.gt.0) then
62759599516SKenneth E. Jansen               call CalcHopRCR (Delt(itseq), lstep, numRCRSrfs)
62859599516SKenneth E. Jansen               call CalcRCRConvCoef(lstep,numRCRSrfs)
62959599516SKenneth E. Jansen               call pHist(poldRCR,QHistRCR,RCRConvCoef,nsteprcr,
63059599516SKenneth E. Jansen     &              numRCRSrfs)
63159599516SKenneth E. Jansen               if (myrank.eq.master)
63259599516SKenneth E. Jansen     &             write(8177,*) (poldRCR(n), n=1,numRCRSrfs)
63359599516SKenneth E. Jansen            endif
63459599516SKenneth E. Jansenc
63559599516SKenneth E. Jansenc Decay of scalars
63659599516SKenneth E. Jansenc
63759599516SKenneth E. Jansen           if(nsclr.gt.0 .and. tdecay.ne.1) then
63859599516SKenneth E. Jansen              yold(:,6:ndof)=y(:,6:ndof)*tdecay
63959599516SKenneth E. Jansen              BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*tdecay
64059599516SKenneth E. Jansen           endif
64159599516SKenneth E. Jansen
64259599516SKenneth E. Jansen           if(nosource.eq.1) BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*0.8
64359599516SKenneth E. Jansen
64459599516SKenneth E. Jansen
64559599516SKenneth E. Jansen            if(iLES.gt.0) then  !complicated stuff has moved to
64659599516SKenneth E. Jansen                                        !routine below
64759599516SKenneth E. Jansen               call lesmodels(yold,  acold,     shgl,      shp,
64859599516SKenneth E. Jansen     &                        iper,  ilwork,    rowp,      colm,
64959599516SKenneth E. Jansen     &                        nsons, ifath,     x,
65059599516SKenneth E. Jansen     &                        iBC,   BC)
65159599516SKenneth E. Jansen
65259599516SKenneth E. Jansen
65359599516SKenneth E. Jansen            endif
65459599516SKenneth E. Jansen
65559599516SKenneth E. Jansenc.... set traction BCs for modeled walls
65659599516SKenneth E. Jansenc
65759599516SKenneth E. Jansen            if (itwmod.ne.0) then
65859599516SKenneth E. Jansen               call asbwmod(yold,   acold,   x,      BC,     iBC,
65959599516SKenneth E. Jansen     &                      iper,   ilwork,  ifath,  velbar)
66059599516SKenneth E. Jansen            endif
66159599516SKenneth E. Jansen
66259599516SKenneth E. Jansen!MR CHANGE
66359599516SKenneth E. Jansenc
66459599516SKenneth E. Jansenc.... Determine whether the vorticity field needs to be computed for this time step or not
66559599516SKenneth E. Jansenc
66659599516SKenneth E. Jansen            icomputevort = 0
66759599516SKenneth E. Jansen            if (ivort == 1) then ! Print vorticity = True in solver.inp
66859599516SKenneth E. Jansen              ! We then compute the vorticity only if we
66959599516SKenneth E. Jansen              ! 1) we write an intermediate checkpoint
67059599516SKenneth E. Jansen              ! 2) we reach the last time step and write the last checkpoint
67159599516SKenneth E. Jansen              ! 3) we accumulate statistics in ybar for every time step
67259599516SKenneth E. Jansen              ! BEWARE: we need here lstep+1 and istep+1 because the lstep and
67359599516SKenneth E. Jansen              ! istep gets incremened after the flowsolve, further below
67459599516SKenneth E. Jansen              if (((irs .ge. 1) .and. (mod(lstep+1, ntout) .eq. 0)) .or.
67559599516SKenneth E. Jansen     &                   istep+1.eq.nstep(itseq) .or. ioybar == 1) then
67659599516SKenneth E. Jansen                icomputevort = 1
67759599516SKenneth E. Jansen              endif
67859599516SKenneth E. Jansen            endif
67959599516SKenneth E. Jansen
68059599516SKenneth E. Jansen!            write(*,*) 'icomputevort: ',icomputevort, ' - istep: ',
68159599516SKenneth E. Jansen!     &                istep,' - nstep(itseq):',nstep(itseq),'- lstep:',
68259599516SKenneth E. Jansen!     &                lstep, '- ntout:', ntout
68359599516SKenneth E. Jansen!MR CHANGE
68459599516SKenneth E. Jansen
68559599516SKenneth E. Jansenc
68659599516SKenneth E. Jansenc.... -----------------------> predictor phase <-----------------------
68759599516SKenneth E. Jansenc
68859599516SKenneth E. Jansen            call itrPredict(yold, y,   acold,  ac ,  uold,  u, iBC)
68959599516SKenneth E. Jansen            call itrBC (y,  ac,  iBC,  BC,  iper,ilwork)
69059599516SKenneth E. Jansen
69159599516SKenneth E. Jansen            if(nsolt.eq.1) then
69259599516SKenneth E. Jansen               isclr=0
69359599516SKenneth E. Jansen               call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
69459599516SKenneth E. Jansen            endif
69559599516SKenneth E. Jansen            do isclr=1,nsclr
69659599516SKenneth E. Jansen               call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
69759599516SKenneth E. Jansen            enddo
69859599516SKenneth E. Jansen            iter=0
69959599516SKenneth E. Jansen            ilss=0  ! this is a switch thrown on first solve of LS redistance
70059599516SKenneth E. Jansen            do istepc=1,seqsize
70159599516SKenneth E. Jansen               icode=stepseq(istepc)
70259599516SKenneth E. Jansen               if(mod(icode,5).eq.0) then ! this is a solve
70359599516SKenneth E. Jansen                  isolve=icode/10
70459599516SKenneth E. Jansen                  if(icode.eq.0) then ! flow solve (encoded as 0)
70559599516SKenneth E. Jansenc
70659599516SKenneth E. Jansen                     iter   = iter+1
70759599516SKenneth E. Jansen                     ifuncs(1)  = ifuncs(1) + 1
70859599516SKenneth E. Jansenc
70959599516SKenneth E. Jansen                     Force(1) = zero
71059599516SKenneth E. Jansen                     Force(2) = zero
71159599516SKenneth E. Jansen                     Force(3) = zero
71259599516SKenneth E. Jansen                     HFlux    = zero
71359599516SKenneth E. Jansen                     lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
71459599516SKenneth E. Jansen
71559599516SKenneth E. Jansen                     call SolFlow(y,          ac,        u,
71659599516SKenneth E. Jansen     &                         yold,          acold,     uold,
71759599516SKenneth E. Jansen     &                         x,             iBC,
71859599516SKenneth E. Jansen     &                         BC,            res,
71959599516SKenneth E. Jansen     &                         nPermDims,     nTmpDims,  aperm,
72059599516SKenneth E. Jansen     &                         atemp,         iper,
72159599516SKenneth E. Jansen     &                         ilwork,        shp,       shgl,
72259599516SKenneth E. Jansen     &                         shpb,          shglb,     rowp,
72359599516SKenneth E. Jansen     &                         colm,          lhsK,      lhsP,
72459599516SKenneth E. Jansen     &                         solinc,        rerr,      tcorecp,
725ae8d68e4SKenneth E. Jansen     &                         GradV,      sumtime,
726ae8d68e4SKenneth E. Jansen     &                         svLS_lhs,     svLS_ls,  svLS_nFaces)
72759599516SKenneth E. Jansen
72859599516SKenneth E. Jansen                  else          ! scalar type solve
72959599516SKenneth E. Jansen                     if (icode.eq.5) then ! Solve for Temperature
73059599516SKenneth E. Jansen                                ! (encoded as (nsclr+1)*10)
73159599516SKenneth E. Jansen                        isclr=0
73259599516SKenneth E. Jansen                        ifuncs(2)  = ifuncs(2) + 1
73359599516SKenneth E. Jansen                        j=1
73459599516SKenneth E. Jansen                     else       ! solve a scalar  (encoded at isclr*10)
73559599516SKenneth E. Jansen                        isclr=isolve
73659599516SKenneth E. Jansen                        ifuncs(isclr+2)  = ifuncs(isclr+2) + 1
73759599516SKenneth E. Jansen                        j=isclr+nsolt
73859599516SKenneth E. Jansen                        if((iLSet.eq.2).and.(ilss.eq.0)
73959599516SKenneth E. Jansen     &                       .and.(isclr.eq.2)) then
74059599516SKenneth E. Jansen                           ilss=1 ! throw switch (once per step)
74159599516SKenneth E. Jansen                           y(:,7)=y(:,6) ! redistance field initialized
74259599516SKenneth E. Jansen                           ac(:,7)   = zero
74359599516SKenneth E. Jansen                           call itrBCSclr (  y,  ac,  iBC,  BC, iper,
74459599516SKenneth E. Jansen     &                          ilwork)
74559599516SKenneth E. Jansenc
74659599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the
74759599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar
74859599516SKenneth E. Jansenc
74959599516SKenneth E. Jansen                           alfit=alfi
75059599516SKenneth E. Jansen                           gamit=gami
75159599516SKenneth E. Jansen                           almit=almi
75259599516SKenneth E. Jansen                           Deltt=Delt(1)
75359599516SKenneth E. Jansen                           Dtglt=Dtgl
75459599516SKenneth E. Jansen                           alfi = 1
75559599516SKenneth E. Jansen                           gami = 1
75659599516SKenneth E. Jansen                           almi = 1
75759599516SKenneth E. Jansenc     Delt(1)= Deltt ! Give a pseudo time step
75859599516SKenneth E. Jansen                           Dtgl = one / Delt(1)
75959599516SKenneth E. Jansen                        endif  ! level set eq. 2
76059599516SKenneth E. Jansen                     endif ! deciding between temperature and scalar
76159599516SKenneth E. Jansen
76259599516SKenneth E. Jansen                     lhs = 1 - min(1,mod(ifuncs(isclr+2)-1,
76359599516SKenneth E. Jansen     &                                   LHSupd(isclr+2)))
76459599516SKenneth E. Jansen
76559599516SKenneth E. Jansen                     call SolSclr(y,          ac,        u,
76659599516SKenneth E. Jansen     &                         yold,          acold,     uold,
76759599516SKenneth E. Jansen     &                         x,             iBC,
76859599516SKenneth E. Jansen     &                         BC,            nPermDimsS,nTmpDimsS,
76959599516SKenneth E. Jansen     &                         apermS(1,1,j), atempS,    iper,
77059599516SKenneth E. Jansen     &                         ilwork,        shp,       shgl,
77159599516SKenneth E. Jansen     &                         shpb,          shglb,     rowp,
77259599516SKenneth E. Jansen     &                         colm,          lhsS(1,j),
77359599516SKenneth E. Jansen     &                         solinc(1,isclr+5), tcorecpscal)
77459599516SKenneth E. Jansen
77559599516SKenneth E. Jansen
77659599516SKenneth E. Jansen                  endif         ! end of scalar type solve
77759599516SKenneth E. Jansen
77859599516SKenneth E. Jansen               else ! this is an update  (mod did not equal zero)
77959599516SKenneth E. Jansen                  iupdate=icode/10  ! what to update
78059599516SKenneth E. Jansen                  if(icode.eq.1) then !update flow
78159599516SKenneth E. Jansen                     call itrCorrect ( y,    ac,    u,   solinc, iBC)
78259599516SKenneth E. Jansen                     call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
78359599516SKenneth E. Jansen                  else  ! update scalar
78459599516SKenneth E. Jansen                     isclr=iupdate  !unless
78559599516SKenneth E. Jansen                     if(icode.eq.6) isclr=0
78659599516SKenneth E. Jansen                     if(iRANS.lt.-100)then  ! RANS
78759599516SKenneth E. Jansen                        call itrCorrectSclrPos(y,ac,solinc(1,isclr+5))
78859599516SKenneth E. Jansen                     else
78959599516SKenneth E. Jansen                        call itrCorrectSclr (y, ac, solinc(1,isclr+5))
79059599516SKenneth E. Jansen                     endif
79159599516SKenneth E. Jansen                     if (ilset.eq.2 .and. isclr.eq.2)  then
79259599516SKenneth E. Jansen                        if (ivconstraint .eq. 1) then
79359599516SKenneth E. Jansen                           call itrBCSclr (  y,  ac,  iBC,  BC, iper,
79459599516SKenneth E. Jansen     &                          ilwork)
79559599516SKenneth E. Jansenc
79659599516SKenneth E. Jansenc ... applying the volume constraint on second level set scalar
79759599516SKenneth E. Jansenc
79859599516SKenneth E. Jansen                           call solvecon (y,    x,      iBC,  BC,
79959599516SKenneth E. Jansen     &                          iper, ilwork, shp,  shgl)
80059599516SKenneth E. Jansenc
80159599516SKenneth E. Jansen                        endif   ! end of volume constraint calculations
80259599516SKenneth E. Jansen                     endif      ! end of redistance calculations
80359599516SKenneth E. Jansenc
80459599516SKenneth E. Jansen                        call itrBCSclr (  y,  ac,  iBC,  BC, iper,
80559599516SKenneth E. Jansen     &                       ilwork)
80659599516SKenneth E. Jansen                     endif      ! end of flow or scalar update
80759599516SKenneth E. Jansen                  endif         ! end of switch between solve or update
80859599516SKenneth E. Jansen               enddo            ! loop over sequence in step
80959599516SKenneth E. Jansenc
81059599516SKenneth E. Jansenc
81159599516SKenneth E. Jansenc.... obtain the time average statistics
81259599516SKenneth E. Jansenc
81359599516SKenneth E. Jansen            if (ioform .eq. 2) then
81459599516SKenneth E. Jansen
81559599516SKenneth E. Jansen               call stsGetStats( y,      yold,     ac,     acold,
81659599516SKenneth E. Jansen     &                           u,      uold,     x,
81759599516SKenneth E. Jansen     &                           shp,    shgl,     shpb,   shglb,
81859599516SKenneth E. Jansen     &                           iBC,    BC,       iper,   ilwork,
81959599516SKenneth E. Jansen     &                           rowp,   colm,     lhsK,   lhsP )
82059599516SKenneth E. Jansen            endif
82159599516SKenneth E. Jansen
82259599516SKenneth E. Jansenc
82359599516SKenneth E. Jansenc  Find the solution at the end of the timestep and move it to old
82459599516SKenneth E. Jansenc
82559599516SKenneth E. Jansenc
82659599516SKenneth E. Jansenc ...First to reassign the parameters for the original time integrator scheme
82759599516SKenneth E. Jansenc
82859599516SKenneth E. Jansen            if((iLSet.eq.2).and.(ilss.eq.1)) then
82959599516SKenneth E. Jansen               alfi =alfit
83059599516SKenneth E. Jansen               gami =gamit
83159599516SKenneth E. Jansen               almi =almit
83259599516SKenneth E. Jansen               Delt(1)=Deltt
83359599516SKenneth E. Jansen               Dtgl =Dtglt
83459599516SKenneth E. Jansen            endif
83559599516SKenneth E. Jansen            call itrUpdate( yold,  acold,   uold,  y,    ac,   u)
83659599516SKenneth E. Jansen            call itrBC (yold, acold,  iBC,  BC,  iper,ilwork)
83759599516SKenneth E. Jansen
83859599516SKenneth E. Jansen            istep = istep + 1
83959599516SKenneth E. Jansen            lstep = lstep + 1
84059599516SKenneth E. Jansenc
84159599516SKenneth E. Jansenc ..  Print memory consumption on BGQ
84259599516SKenneth E. Jansenc
84359599516SKenneth E. Jansen            call printmeminfo("itrdrv"//char(0))
84459599516SKenneth E. Jansen
84559599516SKenneth E. Jansenc
84659599516SKenneth E. Jansenc ..  Compute vorticity
84759599516SKenneth E. Jansenc
84859599516SKenneth E. Jansen            if ( icomputevort == 1) then
84959599516SKenneth E. Jansen
85059599516SKenneth E. Jansen              ! vorticity components and magnitude
85159599516SKenneth E. Jansen              vorticity(:,1) = GradV(:,8)-GradV(:,6) !omega_x
85259599516SKenneth E. Jansen              vorticity(:,2) = GradV(:,3)-GradV(:,7) !omega_y
85359599516SKenneth E. Jansen              vorticity(:,3) = GradV(:,4)-GradV(:,2) !omega_z
85459599516SKenneth E. Jansen              vorticity(:,4) = sqrt(   vorticity(:,1)*vorticity(:,1)
85559599516SKenneth E. Jansen     &                               + vorticity(:,2)*vorticity(:,2)
85659599516SKenneth E. Jansen     &                               + vorticity(:,3)*vorticity(:,3) )
85759599516SKenneth E. Jansen              ! Q
85859599516SKenneth E. Jansen              strain(:,1) = GradV(:,1)                  !S11
85959599516SKenneth E. Jansen              strain(:,2) = 0.5*(GradV(:,2)+GradV(:,4)) !S12
86059599516SKenneth E. Jansen              strain(:,3) = 0.5*(GradV(:,3)+GradV(:,7)) !S13
86159599516SKenneth E. Jansen              strain(:,4) = GradV(:,5)                  !S22
86259599516SKenneth E. Jansen              strain(:,5) = 0.5*(GradV(:,6)+GradV(:,8)) !S23
86359599516SKenneth E. Jansen              strain(:,6) = GradV(:,9)                  !S33
86459599516SKenneth E. Jansen
86559599516SKenneth E. Jansen              vorticity(:,5) = 0.25*( vorticity(:,4)*vorticity(:,4)  !Q
86659599516SKenneth E. Jansen     &                            - 2.0*(      strain(:,1)*strain(:,1)
86759599516SKenneth E. Jansen     &                                    + 2* strain(:,2)*strain(:,2)
86859599516SKenneth E. Jansen     &                                    + 2* strain(:,3)*strain(:,3)
86959599516SKenneth E. Jansen     &                                    +    strain(:,4)*strain(:,4)
87059599516SKenneth E. Jansen     &                                    + 2* strain(:,5)*strain(:,5)
87159599516SKenneth E. Jansen     &                                    +    strain(:,6)*strain(:,6)))
87259599516SKenneth E. Jansen
87359599516SKenneth E. Jansen            endif
87459599516SKenneth E. Jansenc
875f32d06b0SKenneth E. Jansenc .. write out the instantaneous solution
87659599516SKenneth E. Jansenc
87732eed141SKenneth E. Jansen2001    continue  ! we could get here by 2001 label if user requested stop
87859599516SKenneth E. Jansen        if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or.
87959599516SKenneth E. Jansen     &      istep.eq.nstep(itseq)) then
88032eed141SKenneth E. Jansen
88132eed141SKenneth E. Jansen!so that we can see progress in force file close it so that it flushes
88232eed141SKenneth E. Jansen!and  then reopen in append mode
88332eed141SKenneth E. Jansen
88432eed141SKenneth E. Jansen           close(iforce)
88532eed141SKenneth E. Jansen           open (unit=iforce, file=fforce, position='append')
88659599516SKenneth E. Jansen
88759599516SKenneth E. Jansen!              Call to restar() will open restart file in write mode (and not append mode)
88859599516SKenneth E. Jansen!              that is needed as other fields are written in append mode
88932eed141SKenneth E. Jansen
89059599516SKenneth E. Jansen           call restar ('out ',  yold  ,ac)
89159599516SKenneth E. Jansen           if(ideformwall == 1) then
8924c3261e2SCameron Smith             if(myrank.eq.master) then
8934c3261e2SCameron Smith               write(*,*) 'ideformwall is 1 and is a dead code path... exiting'
8944c3261e2SCameron Smith             endif
8954c3261e2SCameron Smith             stop
89659599516SKenneth E. Jansen           endif
89759599516SKenneth E. Jansen
89859599516SKenneth E. Jansen           if(ivort == 1) then
89959599516SKenneth E. Jansen             call write_field(myrank,'a','vorticity',9,vorticity,
90059599516SKenneth E. Jansen     &                       'd',nshg,5,lstep)
90159599516SKenneth E. Jansen           endif
90259599516SKenneth E. Jansen
90359599516SKenneth E. Jansen           call printmeminfo("itrdrv after checkpoint"//char(0))
90432eed141SKenneth E. Jansen         else if(stopjob.eq.-2) then
90532eed141SKenneth E. Jansen           if(myrank.eq.master) then
90632eed141SKenneth E. Jansen             write(*,*) 'line 755 says no write before stopping'
90732eed141SKenneth E. Jansen             write(*,*) 'istep,nstep,irs',istep,nstep(itseq),irs
90859599516SKenneth E. Jansen           endif
909f32d06b0SKenneth E. Jansen        endif  !just the instantaneous stuff for videos
91032eed141SKenneth E. Jansenc
91132eed141SKenneth E. Jansenc.... compute the consistent boundary flux
91232eed141SKenneth E. Jansenc
91332eed141SKenneth E. Jansen            if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
91432eed141SKenneth E. Jansen               call Bflux ( yold,      acold,      uold,    x,
91532eed141SKenneth E. Jansen     &                      shp,       shgl,       shpb,
91632eed141SKenneth E. Jansen     &                      shglb,     ilwork,     iBC,
91732eed141SKenneth E. Jansen     &                      BC,        iper,       wallssVec)
91832eed141SKenneth E. Jansen            endif
91932eed141SKenneth E. Jansen
92032eed141SKenneth E. Jansen           if(stopjob.eq.-2) goto 2003
92132eed141SKenneth E. Jansen
92259599516SKenneth E. Jansen
92359599516SKenneth E. Jansenc
92459599516SKenneth E. Jansenc ... update the flow history for the impedance convolution, filter it and write it out
92559599516SKenneth E. Jansenc
92659599516SKenneth E. Jansen            if(numImpSrfs.gt.zero) then
92759599516SKenneth E. Jansen               call UpdHistConv(y,nsrflistImp,numImpSrfs) !uses Delt(1)
92859599516SKenneth E. Jansen            endif
92959599516SKenneth E. Jansen
93059599516SKenneth E. Jansenc
93159599516SKenneth E. Jansenc ... update the flow history for the RCR convolution
93259599516SKenneth E. Jansenc
93359599516SKenneth E. Jansen            if(numRCRSrfs.gt.zero) then
93459599516SKenneth E. Jansen               call UpdHistConv(y,nsrflistRCR,numRCRSrfs) !uses lstep
93559599516SKenneth E. Jansen            endif
93659599516SKenneth E. Jansen
93759599516SKenneth E. Jansen
93859599516SKenneth E. Jansenc...  dump TIME SERIES
93959599516SKenneth E. Jansen
94059599516SKenneth E. Jansen            if (exts) then
94159599516SKenneth E. Jansen               if (mod(lstep-1,freq).eq.0) then
94259599516SKenneth E. Jansen
94359599516SKenneth E. Jansen                  if (numpe > 1) then
94459599516SKenneth E. Jansen                     do jj = 1, ntspts
94559599516SKenneth E. Jansen                        vartssoln((jj-1)*ndof+1:jj*ndof)=varts(jj,:)
94659599516SKenneth E. Jansen                        ivarts=zero
94759599516SKenneth E. Jansen                     enddo
94859599516SKenneth E. Jansen                     do k=1,ndof*ntspts
94959599516SKenneth E. Jansen                        if(vartssoln(k).ne.zero) ivarts(k)=1
95059599516SKenneth E. Jansen                     enddo
95159599516SKenneth E. Jansen
95259599516SKenneth E. Jansen!                     call MPI_REDUCE(vartssoln, vartssolng, ndof*ntspts,
95359599516SKenneth E. Jansen!     &                    MPI_DOUBLE_PRECISION, MPI_SUM, master,
95459599516SKenneth E. Jansen!     &                    MPI_COMM_WORLD, ierr)
95559599516SKenneth E. Jansen
95659599516SKenneth E. Jansen                     call MPI_BARRIER(MPI_COMM_WORLD, ierr)
95759599516SKenneth E. Jansen                     call MPI_ALLREDUCE(vartssoln, vartssolng,
95859599516SKenneth E. Jansen     &                    ndof*ntspts,
95959599516SKenneth E. Jansen     &                    MPI_DOUBLE_PRECISION, MPI_SUM,
96059599516SKenneth E. Jansen     &                    MPI_COMM_WORLD, ierr)
96159599516SKenneth E. Jansen
96259599516SKenneth E. Jansen!                     call MPI_REDUCE(ivarts, ivartsg, ndof*ntspts,
96359599516SKenneth E. Jansen!     &                    MPI_INTEGER, MPI_SUM, master,
96459599516SKenneth E. Jansen!     &                    MPI_COMM_WORLD, ierr)
96559599516SKenneth E. Jansen
96659599516SKenneth E. Jansen                     call MPI_BARRIER(MPI_COMM_WORLD, ierr)
96759599516SKenneth E. Jansen                     call MPI_ALLREDUCE(ivarts, ivartsg, ndof*ntspts,
96859599516SKenneth E. Jansen     &                    MPI_INTEGER, MPI_SUM,
96959599516SKenneth E. Jansen     &                    MPI_COMM_WORLD, ierr)
97059599516SKenneth E. Jansen
97159599516SKenneth E. Jansen!                     if (myrank.eq.zero) then
97259599516SKenneth E. Jansen                     do jj = 1, ntspts
97359599516SKenneth E. Jansen
97459599516SKenneth E. Jansen                        if(myrank .eq. iv_rank(jj)) then
97559599516SKenneth E. Jansen                           ! No need to update all varts components, only the one treated by the expected rank
97659599516SKenneth E. Jansen                           ! Note: keep varts as a vector, as multiple probes could be treated by one rank
97759599516SKenneth E. Jansen                           indxvarts = (jj-1)*ndof
97859599516SKenneth E. Jansen                           do k=1,ndof
97959599516SKenneth E. Jansen                              if(ivartsg(indxvarts+k).ne.0) then ! none of the vartssoln(parts) were non zero
98059599516SKenneth E. Jansen                                 varts(jj,k)=vartssolng(indxvarts+k)/
98159599516SKenneth E. Jansen     &                                             ivartsg(indxvarts+k)
98259599516SKenneth E. Jansen                              endif
98359599516SKenneth E. Jansen                           enddo
98459599516SKenneth E. Jansen                       endif !only if myrank eq iv_rank(jj)
98559599516SKenneth E. Jansen                     enddo
98659599516SKenneth E. Jansen!                     endif !only on master
98759599516SKenneth E. Jansen                  endif !only if numpe > 1
98859599516SKenneth E. Jansen
98959599516SKenneth E. Jansen!                  if (myrank.eq.zero) then
99059599516SKenneth E. Jansen                  do jj = 1, ntspts
99159599516SKenneth E. Jansen                     if(myrank .eq. iv_rank(jj)) then
99259599516SKenneth E. Jansen                        ifile = 1000+jj
99359599516SKenneth E. Jansen                        write(ifile,555) lstep, (varts(jj,k),k=1,ndof) !Beware of format 555 - check ndof
99459599516SKenneth E. Jansenc                        call flush(ifile)
99559599516SKenneth E. Jansen                        if (((irs .ge. 1) .and.
99659599516SKenneth E. Jansen     &                       (mod(lstep, ntout) .eq. 0))) then
99759599516SKenneth E. Jansen                           close(ifile)
99859599516SKenneth E. Jansen                           fvarts='varts/varts'
99959599516SKenneth E. Jansen                           fvarts=trim(fvarts)//trim(cname2(jj))
100059599516SKenneth E. Jansen                           fvarts=trim(fvarts)//trim(cname2(lskeep))
100159599516SKenneth E. Jansen                           fvarts=trim(fvarts)//'.dat'
100259599516SKenneth E. Jansen                           fvarts=trim(fvarts)
100359599516SKenneth E. Jansen                           open(unit=ifile, file=fvarts,
100459599516SKenneth E. Jansen     &                          position='append')
100559599516SKenneth E. Jansen                        endif !only when dumping restart
100659599516SKenneth E. Jansen                     endif
100759599516SKenneth E. Jansen                  enddo
100859599516SKenneth E. Jansen!                  endif !only on master
100959599516SKenneth E. Jansen
101059599516SKenneth E. Jansen                  varts(:,:) = zero ! reset the array for next step
101159599516SKenneth E. Jansen
101259599516SKenneth E. Jansen
101359599516SKenneth E. Jansen!555              format(i6,5(2x,E12.5e2))
101459599516SKenneth E. Jansen555               format(i6,6(2x,E20.12e2)) !assuming ndof = 6 here
101559599516SKenneth E. Jansen
101659599516SKenneth E. Jansen               endif
101759599516SKenneth E. Jansen            endif
101859599516SKenneth E. Jansen
101959599516SKenneth E. Jansenc
102059599516SKenneth E. Jansenc.... update and the aerodynamic forces
102159599516SKenneth E. Jansenc
102259599516SKenneth E. Jansen            call forces ( yold,  ilwork )
102359599516SKenneth E. Jansen
102459599516SKenneth E. Jansen            if((irscale.ge.0).or.(itwmod.gt.0))
102559599516SKenneth E. Jansen     &           call getvel (yold,     ilwork, iBC,
102659599516SKenneth E. Jansen     &                        nsons,    ifath, velbar)
102759599516SKenneth E. Jansen
102859599516SKenneth E. Jansen            if((irscale.ge.0).and.(myrank.eq.master)) then
102959599516SKenneth E. Jansen               call genscale(yold,       x,       iper,
103059599516SKenneth E. Jansen     &                       iBC,     ifath,   velbar,
103159599516SKenneth E. Jansen     &                       nsons)
103259599516SKenneth E. Jansen            endif
103359599516SKenneth E. Jansenc
103459599516SKenneth E. Jansenc....  print out results.
103559599516SKenneth E. Jansenc
103659599516SKenneth E. Jansen            ntoutv=max(ntout,100)   ! velb is not needed so often
103759599516SKenneth E. Jansen            if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then
103859599516SKenneth E. Jansen               if( (mod(lstep, ntoutv) .eq. 0) .and.
103959599516SKenneth E. Jansen     &              ((irscale.ge.0).or.(itwmod.gt.0) .or.
104059599516SKenneth E. Jansen     &              ((nsonmax.eq.1).and.(iLES.gt.0))))
104159599516SKenneth E. Jansen     &              call rwvelb  ('out ',  velbar  ,ifail)
104259599516SKenneth E. Jansen            endif
104359599516SKenneth E. Jansenc
104459599516SKenneth E. Jansenc.... end of the NSTEP and NTSEQ loops
104559599516SKenneth E. Jansenc
104659599516SKenneth E. Jansen
104759599516SKenneth E. Jansen
104859599516SKenneth E. Jansenc
104959599516SKenneth E. Jansenc.... -------------------> error calculation  <-----------------
105059599516SKenneth E. Jansenc
105159599516SKenneth E. Jansen            if(ierrcalc.eq.1 .or. ioybar.eq.1) then
105259599516SKenneth E. Jansenc$$$c
105359599516SKenneth E. Jansenc$$$c compute average
105459599516SKenneth E. Jansenc$$$c
105559599516SKenneth E. Jansenc$$$               tfact=one/istep
105659599516SKenneth E. Jansenc$$$               ybar =tfact*yold + (one-tfact)*ybar
105759599516SKenneth E. Jansen
105859599516SKenneth E. Jansenc compute average
105959599516SKenneth E. Jansenc ybar(:,1:3) are average velocity components
106059599516SKenneth E. Jansenc ybar(:,4) is average pressure
106159599516SKenneth E. Jansenc ybar(:,5) is average speed
106259599516SKenneth E. Jansenc ybar(:,6:8) is average of sq. of each vel. component
106359599516SKenneth E. Jansenc ybar(:,9) is average of sq. of pressure
106459599516SKenneth E. Jansenc ybar(:,10:12) is average of cross vel. components : uv, uw and vw
106559599516SKenneth E. Jansenc averaging procedure justified only for identical time step sizes
106659599516SKenneth E. Jansenc ybar(:,13) is average of eddy viscosity
106759599516SKenneth E. Jansenc ybar(:,14:16) is average vorticity components
106859599516SKenneth E. Jansenc ybar(:,17) is average vorticity magnitude
106959599516SKenneth E. Jansenc istep is number of time step
107059599516SKenneth E. Jansenc
107159599516SKenneth E. Jansen               icollectybar = 0
107259599516SKenneth E. Jansen          if(nphasesincycle.eq.0 .or.
107359599516SKenneth E. Jansen     &            istep.gt.ncycles_startphaseavg*nstepsincycle) then
107459599516SKenneth E. Jansen                 icollectybar = 1
107559599516SKenneth E. Jansen                  if((istep-1).eq.ncycles_startphaseavg*nstepsincycle)
107659599516SKenneth E. Jansen     &               istepsinybar = 0 ! init. to zero in first cycle in avg.
107759599516SKenneth E. Jansen               endif
107859599516SKenneth E. Jansen
107959599516SKenneth E. Jansen               if(icollectybar.eq.1) then
108059599516SKenneth E. Jansen                  istepsinybar = istepsinybar+1
108159599516SKenneth E. Jansen                  tfact=one/istepsinybar
108259599516SKenneth E. Jansen
108359599516SKenneth E. Jansen                  if(myrank.eq.master .and. nphasesincycle.ne.0 .and.
108459599516SKenneth E. Jansen     &               mod((istep-1),nstepsincycle).eq.0)
108559599516SKenneth E. Jansen     &               write(*,*)'nsamples in phase average:',istepsinybar
108659599516SKenneth E. Jansen
108759599516SKenneth E. Jansenc ybar to contain the averaged ((u,v,w),p)-fields
108859599516SKenneth E. Jansenc and speed average, i.e., sqrt(u^2+v^2+w^2)
108959599516SKenneth E. Jansenc and avg. of sq. terms including
109059599516SKenneth E. Jansenc u^2, v^2, w^2, p^2 and cross terms of uv, uw and vw
109159599516SKenneth E. Jansen
109259599516SKenneth E. Jansen                  ybar(:,1) = tfact*yold(:,1) + (one-tfact)*ybar(:,1)
109359599516SKenneth E. Jansen                  ybar(:,2) = tfact*yold(:,2) + (one-tfact)*ybar(:,2)
109459599516SKenneth E. Jansen                  ybar(:,3) = tfact*yold(:,3) + (one-tfact)*ybar(:,3)
109559599516SKenneth E. Jansen                  ybar(:,4) = tfact*yold(:,4) + (one-tfact)*ybar(:,4)
109659599516SKenneth E. Jansen                  ybar(:,5) = tfact*sqrt(yold(:,1)**2+yold(:,2)**2+
109759599516SKenneth E. Jansen     &                        yold(:,3)**2) + (one-tfact)*ybar(:,5)
109859599516SKenneth E. Jansen                  ybar(:,6) = tfact*yold(:,1)**2 +
109959599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,6)
110059599516SKenneth E. Jansen                  ybar(:,7) = tfact*yold(:,2)**2 +
110159599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,7)
110259599516SKenneth E. Jansen                  ybar(:,8) = tfact*yold(:,3)**2 +
110359599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,8)
110459599516SKenneth E. Jansen                  ybar(:,9) = tfact*yold(:,4)**2 +
110559599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,9)
110659599516SKenneth E. Jansen                  ybar(:,10) = tfact*yold(:,1)*yold(:,2) + !uv
110759599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,10)
110859599516SKenneth E. Jansen                  ybar(:,11) = tfact*yold(:,1)*yold(:,3) + !uw
110959599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,11)
111059599516SKenneth E. Jansen                  ybar(:,12) = tfact*yold(:,2)*yold(:,3) + !vw
111159599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,12)
111259599516SKenneth E. Jansen!MR CHANGE
111359599516SKenneth E. Jansen                  if(nsclr.gt.0) !nut
111459599516SKenneth E. Jansen     &             ybar(:,13) = tfact*yold(:,6) + (one-tfact)*ybar(:,13)
111559599516SKenneth E. Jansen
111659599516SKenneth E. Jansen                  if(ivort == 1) then !vorticity
111759599516SKenneth E. Jansen                    ybar(:,14) = tfact*vorticity(:,1) +
111859599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,14)
111959599516SKenneth E. Jansen                    ybar(:,15) = tfact*vorticity(:,2) +
112059599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,15)
112159599516SKenneth E. Jansen                    ybar(:,16) = tfact*vorticity(:,3) +
112259599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,16)
112359599516SKenneth E. Jansen                    ybar(:,17) = tfact*vorticity(:,4) +
112459599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,17)
112559599516SKenneth E. Jansen                  endif
112659599516SKenneth E. Jansen
112759599516SKenneth E. Jansen                  if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
112859599516SKenneth E. Jansen                    wallssVecBar(:,1) = tfact*wallssVec(:,1)
112959599516SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,1)
113059599516SKenneth E. Jansen                    wallssVecBar(:,2) = tfact*wallssVec(:,2)
113159599516SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,2)
113259599516SKenneth E. Jansen                    wallssVecBar(:,3) = tfact*wallssVec(:,3)
113359599516SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,3)
113459599516SKenneth E. Jansen                  endif
113559599516SKenneth E. Jansen!MR CHANGE END
113659599516SKenneth E. Jansen               endif
113759599516SKenneth E. Jansenc
113859599516SKenneth E. Jansenc compute phase average
113959599516SKenneth E. Jansenc
114059599516SKenneth E. Jansen               if(nphasesincycle.ne.0 .and.
114159599516SKenneth E. Jansen     &            istep.gt.ncycles_startphaseavg*nstepsincycle) then
114259599516SKenneth E. Jansen
114359599516SKenneth E. Jansenc beginning of cycle is considered as ncycles_startphaseavg*nstepsincycle+1
114459599516SKenneth E. Jansen                  if((istep-1).eq.ncycles_startphaseavg*nstepsincycle)
114559599516SKenneth E. Jansen     &               icyclesinavg = 0 ! init. to zero in first cycle in avg.
114659599516SKenneth E. Jansen
114759599516SKenneth E. Jansen                  ! find number of steps between phases
114859599516SKenneth E. Jansen                  nstepsbtwphase = nstepsincycle/nphasesincycle ! integer value
114959599516SKenneth E. Jansen                  if(mod(istep-1,nstepsincycle).eq.0) then
115059599516SKenneth E. Jansen                     iphase = 1 ! init. to one in beginning of every cycle
115159599516SKenneth E. Jansen                     icyclesinavg = icyclesinavg + 1
115259599516SKenneth E. Jansen                  endif
115359599516SKenneth E. Jansen
115459599516SKenneth E. Jansen                  icollectphase = 0
115559599516SKenneth E. Jansen                  istepincycle = mod(istep,nstepsincycle)
115659599516SKenneth E. Jansen                  if(istepincycle.eq.0) istepincycle=nstepsincycle
115759599516SKenneth E. Jansen                  if(istepincycle.eq.iphase*nstepsbtwphase) then
115859599516SKenneth E. Jansen                     icollectphase = 1
115959599516SKenneth E. Jansen                     iphase = iphase+1 ! use 'iphase-1' below
116059599516SKenneth E. Jansen                  endif
116159599516SKenneth E. Jansen
116259599516SKenneth E. Jansen                  if(icollectphase.eq.1) then
116359599516SKenneth E. Jansen                     tfactphase = one/icyclesinavg
116459599516SKenneth E. Jansen
116559599516SKenneth E. Jansen                     if(myrank.eq.master) then
116659599516SKenneth E. Jansen                       write(*,*) 'nsamples in phase ',iphase-1,': ',
116759599516SKenneth E. Jansen     &                             icyclesinavg
116859599516SKenneth E. Jansen                     endif
116959599516SKenneth E. Jansen
117059599516SKenneth E. Jansen                     yphbar(:,1,iphase-1) = tfactphase*yold(:,1) +
117159599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,1,iphase-1)
117259599516SKenneth E. Jansen                     yphbar(:,2,iphase-1) = tfactphase*yold(:,2) +
117359599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,2,iphase-1)
117459599516SKenneth E. Jansen                     yphbar(:,3,iphase-1) = tfactphase*yold(:,3) +
117559599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,3,iphase-1)
117659599516SKenneth E. Jansen                     yphbar(:,4,iphase-1) = tfactphase*yold(:,4) +
117759599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,4,iphase-1)
117859599516SKenneth E. Jansen                     yphbar(:,5,iphase-1) = tfactphase*sqrt(yold(:,1)**2
117959599516SKenneth E. Jansen     &                          +yold(:,2)**2+yold(:,3)**2) +
118059599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,5,iphase-1)
118159599516SKenneth E. Jansen!MR CHANGE
118259599516SKenneth E. Jansen                     yphbar(:,6,iphase-1) =
118359599516SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,1)
118459599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,6,iphase-1)
118559599516SKenneth E. Jansen
118659599516SKenneth E. Jansen                     yphbar(:,7,iphase-1) =
118759599516SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,2)
118859599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,7,iphase-1)
118959599516SKenneth E. Jansen
119059599516SKenneth E. Jansen                     yphbar(:,8,iphase-1) =
119159599516SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,3)
119259599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,8,iphase-1)
119359599516SKenneth E. Jansen
119459599516SKenneth E. Jansen                     yphbar(:,9,iphase-1) =
119559599516SKenneth E. Jansen     &                              tfactphase*yold(:,2)*yold(:,2)
119659599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,9,iphase-1)
119759599516SKenneth E. Jansen
119859599516SKenneth E. Jansen                     yphbar(:,10,iphase-1) =
119959599516SKenneth E. Jansen     &                              tfactphase*yold(:,2)*yold(:,3)
120059599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,10,iphase-1)
120159599516SKenneth E. Jansen
120259599516SKenneth E. Jansen                     yphbar(:,11,iphase-1) =
120359599516SKenneth E. Jansen     &                              tfactphase*yold(:,3)*yold(:,3)
120459599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,11,iphase-1)
120559599516SKenneth E. Jansen
120659599516SKenneth E. Jansen                     if(ivort == 1) then
120759599516SKenneth E. Jansen                       yphbar(:,12,iphase-1) =
120859599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,1)
120959599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,12,iphase-1)
121059599516SKenneth E. Jansen                       yphbar(:,13,iphase-1) =
121159599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,2)
121259599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,13,iphase-1)
121359599516SKenneth E. Jansen                       yphbar(:,14,iphase-1) =
121459599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,3)
121559599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,14,iphase-1)
121659599516SKenneth E. Jansen                       yphbar(:,15,iphase-1) =
121759599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,4)
121859599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,15,iphase-1)
121959599516SKenneth E. Jansen                    endif
122059599516SKenneth E. Jansen!MR CHANGE END
122159599516SKenneth E. Jansen                  endif
122259599516SKenneth E. Jansen               endif
122359599516SKenneth E. Jansenc
122459599516SKenneth E. Jansenc compute rms
122559599516SKenneth E. Jansenc
122659599516SKenneth E. Jansen               if(icollectybar.eq.1) then
122759599516SKenneth E. Jansen                  rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2
122859599516SKenneth E. Jansen                  rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2
122959599516SKenneth E. Jansen                  rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2
123059599516SKenneth E. Jansen                  rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2
123159599516SKenneth E. Jansen               endif
123259599516SKenneth E. Jansen            endif
123332eed141SKenneth E. Jansen 2003       continue ! we get here if stopjob equals lstep and this jumped over
123432eed141SKenneth E. Jansen!           the statistics computation because we have no new data to average in
123532eed141SKenneth E. Jansen!           rather we are just trying to output the last state that was not already
123632eed141SKenneth E. Jansen!           written
123732eed141SKenneth E. Jansenc
123832eed141SKenneth E. Jansenc.... ---------------------->  Complete Restart  Processing  <----------------------
123932eed141SKenneth E. Jansenc
124032eed141SKenneth E. Jansen!   for now it is the same frequency but need to change this
124132eed141SKenneth E. Jansen!   soon.... but don't forget to change the field counter in
124232eed141SKenneth E. Jansen!  new_interface.cc
124332eed141SKenneth E. Jansen!
124432eed141SKenneth E. Jansen        if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or.
124532eed141SKenneth E. Jansen     &      istep.eq.nstep(itseq)) then
124632eed141SKenneth E. Jansen          if ((irs .ge. 1) .and. ((mod(lstep, ntout) .ne. 0) .or.
124732eed141SKenneth E. Jansen     &         (nstp .eq. 0))) then
124832eed141SKenneth E. Jansen             if(
124932eed141SKenneth E. Jansen     &          ((irscale.ge.0).or.(itwmod.gt.0) .or.
125032eed141SKenneth E. Jansen     &          ((nsonmax.eq.1).and.iLES.gt.0)))
125132eed141SKenneth E. Jansen     &          call rwvelb  ('out ',  velbar  ,ifail)
125232eed141SKenneth E. Jansen          endif
125359599516SKenneth E. Jansen
125432eed141SKenneth E. Jansen          lesId   = numeqns(1)
125532eed141SKenneth E. Jansen          if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
125632eed141SKenneth E. Jansen          if(myrank.eq.0)  then
125732eed141SKenneth E. Jansen            tcormr1 = TMRC()
125832eed141SKenneth E. Jansen          endif
1259*efb88323SKenneth E. Jansen          if((nsolflow.eq.1).and.(ipresPrjFlag.eq.1)) then
126032eed141SKenneth E. Jansen           call saveLesRestart( lesId,  aperm , nshg, myrank, lstep,
126132eed141SKenneth E. Jansen     &                    nPermDims )
126232eed141SKenneth E. Jansen           if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
126332eed141SKenneth E. Jansen           if(myrank.eq.0)  then
126432eed141SKenneth E. Jansen            tcormr2 = TMRC()
126532eed141SKenneth E. Jansen            write(6,*) 'call saveLesRestart for projection and'//
126632eed141SKenneth E. Jansen     &           'pressure projection vectors', tcormr2-tcormr1
126732eed141SKenneth E. Jansen           endif
1268c9a96f21SKenneth E. Jansen          endif
126932eed141SKenneth E. Jansen
127032eed141SKenneth E. Jansen          if(ierrcalc.eq.1) then
127132eed141SKenneth E. Jansenc
127232eed141SKenneth E. Jansenc.....smooth the error indicators
127332eed141SKenneth E. Jansenc
127432eed141SKenneth E. Jansen            do i=1,ierrsmooth
127532eed141SKenneth E. Jansen              call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC )
127632eed141SKenneth E. Jansen            end do
127732eed141SKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
127832eed141SKenneth E. Jansen            if(myrank.eq.0)  then
127932eed141SKenneth E. Jansen              tcormr1 = TMRC()
128032eed141SKenneth E. Jansen            endif
128132eed141SKenneth E. Jansen            call write_error(myrank, lstep, nshg, 10, rerr )
128232eed141SKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
128332eed141SKenneth E. Jansen            if(myrank.eq.0)  then
128432eed141SKenneth E. Jansen              tcormr2 = TMRC()
128532eed141SKenneth E. Jansen              write(6,*) 'Time to write the error fields to the disks',
128632eed141SKenneth E. Jansen     &            tcormr2-tcormr1
128732eed141SKenneth E. Jansen            endif
128832eed141SKenneth E. Jansen          endif ! ierrcalc
128932eed141SKenneth E. Jansen
129032eed141SKenneth E. Jansen          if(ioybar.eq.1) then
129132eed141SKenneth E. Jansen            if(ivort == 1) then
129232eed141SKenneth E. Jansen              call write_field(myrank,'a','ybar',4,
129332eed141SKenneth E. Jansen     &                  ybar,'d',nshg,17,lstep)
129432eed141SKenneth E. Jansen            else
129532eed141SKenneth E. Jansen              call write_field(myrank,'a','ybar',4,
129632eed141SKenneth E. Jansen     &                ybar,'d',nshg,13,lstep)
129732eed141SKenneth E. Jansen            endif
129832eed141SKenneth E. Jansen
129932eed141SKenneth E. Jansen            if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
130032eed141SKenneth E. Jansen              call write_field(myrank,'a','wssbar',6,
130132eed141SKenneth E. Jansen     &             wallssVecBar,'d',nshg,3,lstep)
130232eed141SKenneth E. Jansen            endif
130332eed141SKenneth E. Jansen
130432eed141SKenneth E. Jansen            if(nphasesincycle .gt. 0) then
130532eed141SKenneth E. Jansen              if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
130632eed141SKenneth E. Jansen              if(myrank.eq.0)  then
130732eed141SKenneth E. Jansen                tcormr1 = TMRC()
130832eed141SKenneth E. Jansen              endif
130932eed141SKenneth E. Jansen              do iphase=1,nphasesincycle
131032eed141SKenneth E. Jansen                if(ivort == 1) then
131132eed141SKenneth E. Jansen                 call write_phavg2(myrank,'a','phase_average',13,iphase,
131232eed141SKenneth E. Jansen     &              nphasesincycle,yphbar(:,:,iphase),'d',nshg,15,lstep)
131332eed141SKenneth E. Jansen                else
131432eed141SKenneth E. Jansen                 call write_phavg2(myrank,'a','phase_average',13,iphase,
131532eed141SKenneth E. Jansen     &              nphasesincycle,yphbar(:,:,iphase),'d',nshg,11,lstep)
131632eed141SKenneth E. Jansen                endif
131732eed141SKenneth E. Jansen              end do
131832eed141SKenneth E. Jansen              if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
131932eed141SKenneth E. Jansen              if(myrank.eq.0)  then
132032eed141SKenneth E. Jansen                tcormr2 = TMRC()
132132eed141SKenneth E. Jansen                write(6,*) 'write all phase avg to the disks = ',
132232eed141SKenneth E. Jansen     &                tcormr2-tcormr1
132332eed141SKenneth E. Jansen              endif
132432eed141SKenneth E. Jansen            endif !nphasesincyle
132532eed141SKenneth E. Jansen          endif !ioybar
132632eed141SKenneth E. Jansen
132732eed141SKenneth E. Jansen          if ( ( ihessian .eq. 1 ) .and. ( numpe < 2 )  )then
132832eed141SKenneth E. Jansen            uhess = zero
132932eed141SKenneth E. Jansen            gradu = zero
133032eed141SKenneth E. Jansen            tf = zero
133132eed141SKenneth E. Jansen
133232eed141SKenneth E. Jansen            do ku=1,nshg
133332eed141SKenneth E. Jansen              tf(ku,1) = x(ku,1)**3
133432eed141SKenneth E. Jansen            end do
133532eed141SKenneth E. Jansen            call hessian( yold, x,     shp,  shgl,   iBC,
133632eed141SKenneth E. Jansen     &              shpb, shglb, iper, ilwork, uhess, gradu )
133732eed141SKenneth E. Jansen
133832eed141SKenneth E. Jansen            call write_hessian( uhess, gradu, nshg )
133932eed141SKenneth E. Jansen          endif
134032eed141SKenneth E. Jansen
134132eed141SKenneth E. Jansen          if(iRANS.lt.0) then
134232eed141SKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
134332eed141SKenneth E. Jansen            if(myrank.eq.0)  then
134432eed141SKenneth E. Jansen              tcormr1 = TMRC()
134532eed141SKenneth E. Jansen            endif
134632eed141SKenneth E. Jansen            call write_field(myrank,'a','dwal',4,d2wall,'d',
134732eed141SKenneth E. Jansen     &                       nshg,1,lstep)
134832eed141SKenneth E. Jansen            if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
134932eed141SKenneth E. Jansen            if(myrank.eq.0)  then
135032eed141SKenneth E. Jansen              tcormr2 = TMRC()
135132eed141SKenneth E. Jansen              write(6,*) 'Time to write dwal to the disks = ',
135232eed141SKenneth E. Jansen     &        tcormr2-tcormr1
135332eed141SKenneth E. Jansen            endif
135432eed141SKenneth E. Jansen          endif !iRANS
135532eed141SKenneth E. Jansen
135632eed141SKenneth E. Jansen        endif ! write out complete restart state
135732eed141SKenneth E. Jansen        !next 2 lines are two ways to end early
135832eed141SKenneth E. Jansen        if(stopjob.eq.-2) goto 2002
135932eed141SKenneth E. Jansen        if(istop.eq.1000) goto 2002 ! stop when delta small (see rstatic)
136059599516SKenneth E. Jansen 2000 continue
136132eed141SKenneth E. Jansen 2002 continue
136232eed141SKenneth E. Jansen
1363f32d06b0SKenneth E. Jansen! done with time stepping so deallocate fields already written
136432eed141SKenneth E. Jansen!
136532eed141SKenneth E. Jansen          if(ioybar.eq.1) then
136632eed141SKenneth E. Jansen            deallocate(ybar)
136732eed141SKenneth E. Jansen            if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
136832eed141SKenneth E. Jansen              deallocate(wallssVecbar)
136932eed141SKenneth E. Jansen            endif
137032eed141SKenneth E. Jansen            if(nphasesincycle .gt. 0) then
137132eed141SKenneth E. Jansen              deallocate(yphbar)
137232eed141SKenneth E. Jansen            endif !nphasesincyle
137332eed141SKenneth E. Jansen          endif !ioybar
137432eed141SKenneth E. Jansen          if(ivort == 1) then
137532eed141SKenneth E. Jansen            deallocate(strain,vorticity)
137632eed141SKenneth E. Jansen          endif
137732eed141SKenneth E. Jansen          if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
137832eed141SKenneth E. Jansen            deallocate(wallssVec)
137932eed141SKenneth E. Jansen          endif
138032eed141SKenneth E. Jansen          if(iRANS.lt.0) then
138132eed141SKenneth E. Jansen            deallocate(d2wall)
138232eed141SKenneth E. Jansen          endif
138359599516SKenneth E. Jansen
138459599516SKenneth E. Jansen
138559599516SKenneth E. JansenCAD         tcorecp2 = second(0)
138659599516SKenneth E. JansenCAD         tcorewc2 = second(-1)
138759599516SKenneth E. Jansen
138859599516SKenneth E. JansenCAD         write(6,*) 'T(core) cpu-wallclock = ',tcorecp2-tcorecp1,
138959599516SKenneth E. JansenCAD     &                                        tcorewc2-tcorewc1
139059599516SKenneth E. Jansen
139159599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
139259599516SKenneth E. Jansen         if(myrank.eq.0)  then
139359599516SKenneth E. Jansen            tcorecp2 = TMRC()
139459599516SKenneth E. Jansen             write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1
139559599516SKenneth E. Jansen             write(6,*) '(Elm. form.',tcorecp(1),
139659599516SKenneth E. Jansen     &                    ',Lin. alg. sol.',tcorecp(2),')'
139759599516SKenneth E. Jansen             write(6,*) '(Elm. form. Scal.',tcorecpscal(1),
139859599516SKenneth E. Jansen     &                   ',Lin. alg. sol. Scal.',tcorecpscal(2),')'
139959599516SKenneth E. Jansen             write(6,*) ''
140059599516SKenneth E. Jansen
140159599516SKenneth E. Jansen         endif
140259599516SKenneth E. Jansen
140359599516SKenneth E. Jansen         call print_system_stats(tcorecp, tcorecpscal)
140459599516SKenneth E. Jansen         call print_mesh_stats()
140559599516SKenneth E. Jansen         call print_mpi_stats()
140659599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
140759599516SKenneth E. Jansen!         return
140859599516SKenneth E. Jansenc         call MPI_Finalize()
140959599516SKenneth E. Jansenc         call MPI_ABORT(MPI_COMM_WORLD, ierr)
141059599516SKenneth E. Jansen
141159599516SKenneth E. Jansen 3000 continue
141259599516SKenneth E. Jansen
141359599516SKenneth E. Jansen
141459599516SKenneth E. Jansenc
141559599516SKenneth E. Jansenc.... close history and aerodynamic forces files
141659599516SKenneth E. Jansenc
141759599516SKenneth E. Jansen      if (myrank .eq. master) then
141859599516SKenneth E. Jansen!         close (ihist)
141959599516SKenneth E. Jansen         close (iforce)
142059599516SKenneth E. Jansen         close(76)
142159599516SKenneth E. Jansen         if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then
142259599516SKenneth E. Jansen            close (8177)
142359599516SKenneth E. Jansen         endif
142459599516SKenneth E. Jansen      endif
142559599516SKenneth E. Jansenc
142659599516SKenneth E. Jansenc.... close varts file for probes
142759599516SKenneth E. Jansenc
142859599516SKenneth E. Jansen      if(exts) then
142959599516SKenneth E. Jansen        do jj=1,ntspts
143059599516SKenneth E. Jansen          if (myrank == iv_rank(jj)) then
143159599516SKenneth E. Jansen            close(1000+jj)
143259599516SKenneth E. Jansen          endif
143359599516SKenneth E. Jansen        enddo
143459599516SKenneth E. Jansen        deallocate (ivarts)
143559599516SKenneth E. Jansen        deallocate (ivartsg)
143659599516SKenneth E. Jansen        deallocate (iv_rank)
143759599516SKenneth E. Jansen        deallocate (vartssoln)
143859599516SKenneth E. Jansen        deallocate (vartssolng)
143959599516SKenneth E. Jansen      endif
144059599516SKenneth E. Jansen
144159599516SKenneth E. Jansen!MR CHANGE
144259599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
144359599516SKenneth E. Jansen      if(myrank.eq.0)  then
144459599516SKenneth E. Jansen          write(*,*) 'itrdrv - done with aerodynamic forces'
144559599516SKenneth E. Jansen      endif
144659599516SKenneth E. Jansen!MR CHANGE
144759599516SKenneth E. Jansen
144859599516SKenneth E. Jansen      do isrf = 0,MAXSURF
144959599516SKenneth E. Jansen!        if ( nsrflist(isrf).ne.0 ) then
145059599516SKenneth E. Jansen        if ( nsrflist(isrf).ne.0 .and.
145159599516SKenneth E. Jansen     &                     myrank.eq.irankfilesforce(isrf)) then
145259599516SKenneth E. Jansen          iunit=60+isrf
145359599516SKenneth E. Jansen          close(iunit)
145459599516SKenneth E. Jansen        endif
145559599516SKenneth E. Jansen      enddo
145659599516SKenneth E. Jansen
145759599516SKenneth E. Jansen!MR CHANGE
145859599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
145959599516SKenneth E. Jansen      if(myrank.eq.0)  then
146059599516SKenneth E. Jansen          write(*,*) 'itrdrv - done with MAXSURF'
146159599516SKenneth E. Jansen      endif
146259599516SKenneth E. Jansen!MR CHANGE
146359599516SKenneth E. Jansen
146459599516SKenneth E. Jansen
146559599516SKenneth E. Jansen 5    format(1X,F15.10,3X,F15.10,3X,F15.10,3X,F15.10)
146659599516SKenneth E. Jansen 444  format(6(2x,e14.7))
146759599516SKenneth E. Jansenc
146859599516SKenneth E. Jansenc.... end
146959599516SKenneth E. Jansenc
147059599516SKenneth E. Jansen      if(nsolflow.eq.1) then
147159599516SKenneth E. Jansen         deallocate (lhsK)
147259599516SKenneth E. Jansen         deallocate (lhsP)
1473ae8d68e4SKenneth E. Jansen         IF (svLSFlag .NE. 1) THEN
147459599516SKenneth E. Jansen         deallocate (aperm)
147559599516SKenneth E. Jansen         deallocate (atemp)
1476ae8d68e4SKenneth E. Jansen         ENDIF
147759599516SKenneth E. Jansen      endif
147859599516SKenneth E. Jansen      if(nsclrsol.gt.0) then
147959599516SKenneth E. Jansen         deallocate (lhsS)
148059599516SKenneth E. Jansen         deallocate (apermS)
148159599516SKenneth E. Jansen         deallocate (atempS)
148259599516SKenneth E. Jansen      endif
148359599516SKenneth E. Jansen
148459599516SKenneth E. Jansen      if(iabc==1) deallocate(acs)
148559599516SKenneth E. Jansen
148659599516SKenneth E. Jansen!MR CHANGE
148759599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
148859599516SKenneth E. Jansen      if(myrank.eq.0)  then
148959599516SKenneth E. Jansen          write(*,*) 'itrdrv - done - BACK TO process.f'
149059599516SKenneth E. Jansen      endif
149159599516SKenneth E. Jansen!MR CHANGE
149259599516SKenneth E. Jansen
149359599516SKenneth E. Jansen
149459599516SKenneth E. Jansen
149559599516SKenneth E. Jansen      return
149659599516SKenneth E. Jansen      end
149759599516SKenneth E. Jansen
149859599516SKenneth E. Jansen      subroutine lesmodels(y,     ac,        shgl,      shp,
149959599516SKenneth E. Jansen     &                     iper,  ilwork,    rowp,      colm,
150059599516SKenneth E. Jansen     &                     nsons, ifath,     x,
150159599516SKenneth E. Jansen     &                     iBC,   BC)
150259599516SKenneth E. Jansen
150359599516SKenneth E. Jansen      include "common.h"
150459599516SKenneth E. Jansen
150559599516SKenneth E. Jansen      real*8    y(nshg,ndof),              ac(nshg,ndof),
150659599516SKenneth E. Jansen     &            x(numnp,nsd),
150759599516SKenneth E. Jansen     &            BC(nshg,ndofBC)
150859599516SKenneth E. Jansen      real*8    shp(MAXTOP,maxsh,MAXQPT),
150959599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT)
151059599516SKenneth E. Jansen
151159599516SKenneth E. Jansenc
151259599516SKenneth E. Jansen      integer   rowp(nshg,nnz),         colm(nshg+1),
151359599516SKenneth E. Jansen     &            iBC(nshg),
151459599516SKenneth E. Jansen     &            ilwork(nlwork),
151559599516SKenneth E. Jansen     &            iper(nshg)
151659599516SKenneth E. Jansen      dimension ifath(numnp),    nsons(nfath)
151759599516SKenneth E. Jansen
151859599516SKenneth E. Jansen      real*8, allocatable, dimension(:) :: fwr2,fwr3,fwr4
151959599516SKenneth E. Jansen      real*8, allocatable, dimension(:) :: stabdis,cdelsq1
152059599516SKenneth E. Jansen      real*8, allocatable, dimension(:,:) :: xavegt, xavegt2,xavegt3
152159599516SKenneth E. Jansen
152259599516SKenneth E. Jansen      if( (iLES.gt.1) )   then ! Allocate Stuff for advanced LES models
152359599516SKenneth E. Jansen         allocate (fwr2(nshg))
152459599516SKenneth E. Jansen         allocate (fwr3(nshg))
152559599516SKenneth E. Jansen         allocate (fwr4(nshg))
152659599516SKenneth E. Jansen         allocate (xavegt(nfath,12))
152759599516SKenneth E. Jansen         allocate (xavegt2(nfath,12))
152859599516SKenneth E. Jansen         allocate (xavegt3(nfath,12))
152959599516SKenneth E. Jansen         allocate (stabdis(nfath))
153059599516SKenneth E. Jansen      endif
153159599516SKenneth E. Jansen
153259599516SKenneth E. Jansenc.... get dynamic model coefficient
153359599516SKenneth E. Jansenc
153459599516SKenneth E. Jansen      ilesmod=iLES/10
153559599516SKenneth E. Jansenc
153659599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model
153759599516SKenneth E. Jansenc
153859599516SKenneth E. Jansen      if (ilesmod.eq.0) then    ! 0 < iLES< 10 => dyn. model calculated
153959599516SKenneth E. Jansen                                ! at nodes based on discrete filtering
154059599516SKenneth E. Jansen
154159599516SKenneth E. Jansen
154259599516SKenneth E. Jansen         if(isubmod.eq.2) then
154359599516SKenneth E. Jansen            call SUPGdis(y,      ac,        shgl,      shp,
154459599516SKenneth E. Jansen     &                   iper,   ilwork,
154559599516SKenneth E. Jansen     &                   nsons,  ifath,     x,
154659599516SKenneth E. Jansen     &                   iBC,    BC, stabdis, xavegt3)
154759599516SKenneth E. Jansen         endif
154859599516SKenneth E. Jansen
154959599516SKenneth E. Jansen         if( ((isubmod.eq.0).or.(isubmod.eq.2)))then ! If no
155059599516SKenneth E. Jansen                                                     ! sub-model
155159599516SKenneth E. Jansen                                                     ! or SUPG
155259599516SKenneth E. Jansen                                                     ! model wanted
155359599516SKenneth E. Jansen
155459599516SKenneth E. Jansen            if(i2filt.eq.0)then ! If simple filter
155559599516SKenneth E. Jansen
155659599516SKenneth E. Jansen               if(modlstats .eq. 0) then ! If no model stats wanted
155759599516SKenneth E. Jansen                  call getdmc (y,       shgl,      shp,
155859599516SKenneth E. Jansen     &                         iper,       ilwork,    nsons,
155959599516SKenneth E. Jansen     &                         ifath,      x)
156059599516SKenneth E. Jansen               else             ! else get model stats
156159599516SKenneth E. Jansen                  call stdfdmc (y,       shgl,      shp,
156259599516SKenneth E. Jansen     &                          iper,       ilwork,    nsons,
156359599516SKenneth E. Jansen     &                          ifath,      x)
156459599516SKenneth E. Jansen               endif            ! end of stats if statement
156559599516SKenneth E. Jansen
156659599516SKenneth E. Jansen            else                ! else if twice filtering
156759599516SKenneth E. Jansen
156859599516SKenneth E. Jansen               call widefdmc(y,       shgl,      shp,
156959599516SKenneth E. Jansen     &                       iper,       ilwork,    nsons,
157059599516SKenneth E. Jansen     &                       ifath,      x)
157159599516SKenneth E. Jansen
157259599516SKenneth E. Jansen
157359599516SKenneth E. Jansen            endif               ! end of simple filter if statement
157459599516SKenneth E. Jansen
157559599516SKenneth E. Jansen         endif                  ! end of SUPG or no sub-model if statement
157659599516SKenneth E. Jansen
157759599516SKenneth E. Jansen
157859599516SKenneth E. Jansen         if( (isubmod.eq.1) ) then ! If DFWR sub-model wanted
157959599516SKenneth E. Jansen            call cdelBHsq (y,       shgl,      shp,
158059599516SKenneth E. Jansen     &                     iper,       ilwork,    nsons,
158159599516SKenneth E. Jansen     &                     ifath,      x,         cdelsq1)
158259599516SKenneth E. Jansen            call FiltRat (y,       shgl,      shp,
158359599516SKenneth E. Jansen     &                    iper,       ilwork,    nsons,
158459599516SKenneth E. Jansen     &                    ifath,      x,         cdelsq1,
158559599516SKenneth E. Jansen     &                    fwr4,       fwr3)
158659599516SKenneth E. Jansen
158759599516SKenneth E. Jansen
158859599516SKenneth E. Jansen            if (i2filt.eq.0) then ! If simple filter wanted
158959599516SKenneth E. Jansen               call DFWRsfdmc(y,       shgl,      shp,
159059599516SKenneth E. Jansen     &                        iper,       ilwork,    nsons,
159159599516SKenneth E. Jansen     &                        ifath,      x,         fwr2, fwr3)
159259599516SKenneth E. Jansen            else                ! else if twice filtering wanted
159359599516SKenneth E. Jansen               call DFWRwfdmc(y,       shgl,      shp,
159459599516SKenneth E. Jansen     &                        iper,       ilwork,    nsons,
159559599516SKenneth E. Jansen     &                        ifath,      x,         fwr4, fwr4)
159659599516SKenneth E. Jansen            endif               ! end of simple filter if statement
159759599516SKenneth E. Jansen
159859599516SKenneth E. Jansen         endif                  ! end of DFWR sub-model if statement
159959599516SKenneth E. Jansen
160059599516SKenneth E. Jansen         if( (isubmod.eq.2) )then ! If SUPG sub-model wanted
160159599516SKenneth E. Jansen            call dmcSUPG (y,           ac,         shgl,
160259599516SKenneth E. Jansen     &                    shp,         iper,       ilwork,
160359599516SKenneth E. Jansen     &                    nsons,       ifath,      x,
160459599516SKenneth E. Jansen     &                    iBC,    BC,  rowp,       colm,
160559599516SKenneth E. Jansen     &                    xavegt2,    stabdis)
160659599516SKenneth E. Jansen         endif
160759599516SKenneth E. Jansen
160859599516SKenneth E. Jansen         if(idis.eq.1)then      ! If SUPG/Model dissipation wanted
160959599516SKenneth E. Jansen            call ediss (y,        ac,      shgl,
161059599516SKenneth E. Jansen     &                  shp,      iper,       ilwork,
161159599516SKenneth E. Jansen     &                  nsons,    ifath,      x,
161259599516SKenneth E. Jansen     &                  iBC,      BC,  xavegt)
161359599516SKenneth E. Jansen         endif
161459599516SKenneth E. Jansen
161559599516SKenneth E. Jansen      endif                     ! end of ilesmod
161659599516SKenneth E. Jansen
161759599516SKenneth E. Jansen      if (ilesmod .eq. 1) then  ! 10 < iLES < 20 => dynamic-mixed
161859599516SKenneth E. Jansen                                ! at nodes based on discrete filtering
161959599516SKenneth E. Jansen         call bardmc (y,       shgl,      shp,
162059599516SKenneth E. Jansen     &                iper,    ilwork,
162159599516SKenneth E. Jansen     &                nsons,   ifath,     x)
162259599516SKenneth E. Jansen      endif
162359599516SKenneth E. Jansen
162459599516SKenneth E. Jansen      if (ilesmod .eq. 2) then  ! 20 < iLES < 30 => dynamic at quad
162559599516SKenneth E. Jansen                                ! pts based on lumped projection filt.
162659599516SKenneth E. Jansen
162759599516SKenneth E. Jansen         if(isubmod.eq.0)then
162859599516SKenneth E. Jansen            call projdmc (y,       shgl,      shp,
162959599516SKenneth E. Jansen     &                    iper,       ilwork,    x)
163059599516SKenneth E. Jansen         else
163159599516SKenneth E. Jansen            call cpjdmcnoi (y,      shgl,      shp,
163259599516SKenneth E. Jansen     &                      iper,   ilwork,       x,
163359599516SKenneth E. Jansen     &                      rowp,   colm,
163459599516SKenneth E. Jansen     &                      iBC,    BC)
163559599516SKenneth E. Jansen         endif
163659599516SKenneth E. Jansen
163759599516SKenneth E. Jansen      endif
163859599516SKenneth E. Jansen
163959599516SKenneth E. Jansen      if( (iLES.gt.1) )   then ! Deallocate Stuff for advanced LES models
164059599516SKenneth E. Jansen         deallocate (fwr2)
164159599516SKenneth E. Jansen         deallocate (fwr3)
164259599516SKenneth E. Jansen         deallocate (fwr4)
164359599516SKenneth E. Jansen         deallocate (xavegt)
164459599516SKenneth E. Jansen         deallocate (xavegt2)
164559599516SKenneth E. Jansen         deallocate (xavegt3)
164659599516SKenneth E. Jansen         deallocate (stabdis)
164759599516SKenneth E. Jansen      endif
164859599516SKenneth E. Jansen      return
164959599516SKenneth E. Jansen      end
165059599516SKenneth E. Jansen
165159599516SKenneth E. Jansenc
165259599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution
165359599516SKenneth E. Jansenc
165459599516SKenneth E. Jansen      subroutine CalcImpConvCoef (numISrfs, numTpoints)
165559599516SKenneth E. Jansen
165659599516SKenneth E. Jansen      use convolImpFlow !uses flow history and impedance for convolution
165759599516SKenneth E. Jansen
165859599516SKenneth E. Jansen      include "common.h" !for alfi
165959599516SKenneth E. Jansen
166059599516SKenneth E. Jansen      integer numISrfs, numTpoints
166159599516SKenneth E. Jansen
166259599516SKenneth E. Jansen      allocate (ConvCoef(numTpoints+2,3)) !same time discret. for all imp. BC
166359599516SKenneth E. Jansen      do j=1,numTpoints+2
166459599516SKenneth E. Jansen         ConvCoef(j,:)=0.5/numTpoints !dt/2 divided by period T=N*dt
166559599516SKenneth E. Jansen         ConvCoef(j,1)=ConvCoef(j,1)*(1.0-alfi)*(1.0-alfi)
166659599516SKenneth E. Jansen         ConvCoef(j,2)=ConvCoef(j,2)*(1.0+2*alfi*(1.0-alfi))
166759599516SKenneth E. Jansen         ConvCoef(j,3)=ConvCoef(j,3)*alfi*alfi
166859599516SKenneth E. Jansen      enddo
166959599516SKenneth E. Jansen      ConvCoef(1,2)=zero
167059599516SKenneth E. Jansen      ConvCoef(1,3)=zero
167159599516SKenneth E. Jansen      ConvCoef(2,3)=zero
167259599516SKenneth E. Jansen      ConvCoef(numTpoints+1,1)=zero
167359599516SKenneth E. Jansen      ConvCoef(numTpoints+2,2)=zero
167459599516SKenneth E. Jansen      ConvCoef(numTpoints+2,1)=zero
167559599516SKenneth E. Jansenc
167659599516SKenneth E. Jansenc...calculate the coefficients for the impedance convolution
167759599516SKenneth E. Jansenc
167859599516SKenneth E. Jansen      allocate (ImpConvCoef(numTpoints+2,numISrfs))
167959599516SKenneth E. Jansen
168059599516SKenneth E. Jansenc..coefficients below assume Q linear in time step, Z constant
168159599516SKenneth E. Jansenc            do j=3,numTpoints
168259599516SKenneth E. Jansenc                ImpConvCoef(j,:) = ValueListImp(j-1,:)*ConvCoef(j,3)
168359599516SKenneth E. Jansenc     &                             + ValueListImp(j,:)*ConvCoef(j,2)
168459599516SKenneth E. Jansenc     &                             + ValueListImp(j+1,:)*ConvCoef(j,1)
168559599516SKenneth E. Jansenc            enddo
168659599516SKenneth E. Jansenc            ImpConvCoef(1,:) = ValueListImp(2,:)*ConvCoef(1,1)
168759599516SKenneth E. Jansenc            ImpConvCoef(2,:) = ValueListImp(2,:)*ConvCoef(2,2)
168859599516SKenneth E. Jansenc     &                       + ValueListImp(3,:)*ConvCoef(2,1)
168959599516SKenneth E. Jansenc            ImpConvCoef(numTpoints+1,:) =
169059599516SKenneth E. Jansenc     &           ValueListImp(numTpoints,:)*ConvCoef(numTpoints+1,3)
169159599516SKenneth E. Jansenc     &         + ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+1,2)
169259599516SKenneth E. Jansenc            ImpConvCoef(numTpoints+2,:) =
169359599516SKenneth E. Jansenc     &           ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+2,3)
169459599516SKenneth E. Jansen
169559599516SKenneth E. Jansenc..try easiest convolution Q and Z constant per time step
169659599516SKenneth E. Jansen      do j=3,numTpoints+1
169759599516SKenneth E. Jansen         ImpConvCoef(j,:) = ValueListImp(j-1,:)/numTpoints
169859599516SKenneth E. Jansen      enddo
169959599516SKenneth E. Jansen      ImpConvCoef(1,:) =zero
170059599516SKenneth E. Jansen      ImpConvCoef(2,:) =zero
170159599516SKenneth E. Jansen      ImpConvCoef(numTpoints+2,:) =
170259599516SKenneth E. Jansen     &           ValueListImp(numTpoints+1,:)/numTpoints
170359599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr()
170459599516SKenneth E. Jansen      ImpConvCoef(numTpoints+1,:)= ImpConvCoef(numTpoints+1,:)
170559599516SKenneth E. Jansen     &                  - ImpConvCoef(numTpoints+2,:)*(1.0-alfi)/alfi
170659599516SKenneth E. Jansen      ImpConvCoef(numTpoints+2,:)= ImpConvCoef(numTpoints+2,:)/alfi
170759599516SKenneth E. Jansen      return
170859599516SKenneth E. Jansen      end
170959599516SKenneth E. Jansen
171059599516SKenneth E. Jansenc
171159599516SKenneth E. Jansenc ... update the flow rate history for the impedance convolution, filter it and write it out
171259599516SKenneth E. Jansenc
171359599516SKenneth E. Jansen      subroutine UpdHistConv(y,nsrfIdList,numSrfs)
171459599516SKenneth E. Jansen
171559599516SKenneth E. Jansen      use convolImpFlow !brings ntimeptpT, QHistImp, QHistTry, QHistTryF, numImpSrfs
171659599516SKenneth E. Jansen      use convolRCRFlow !brings QHistRCR, numRCRSrfs
171759599516SKenneth E. Jansen
171859599516SKenneth E. Jansen      include "common.h"
171959599516SKenneth E. Jansen
172059599516SKenneth E. Jansen      integer   nsrfIdList(0:MAXSURF), numSrfs
172159599516SKenneth E. Jansen      character*20 fname1
172259599516SKenneth E. Jansen      character*10 cname2
172359599516SKenneth E. Jansen      character*5 cname
172459599516SKenneth E. Jansen      real*8    y(nshg,3) !velocity at time n+1
172559599516SKenneth E. Jansen      real*8    NewQ(0:MAXSURF) !temporary unknown for the flow rate
172659599516SKenneth E. Jansen                        !that needs to be added to the flow history
172759599516SKenneth E. Jansen
172859599516SKenneth E. Jansen      call GetFlowQ(NewQ,y,nsrfIdList,numSrfs) !new flow at time n+1
172959599516SKenneth E. Jansenc
173059599516SKenneth E. Jansenc... for imp BC: shift QHist, add new constribution, filter and write out
173159599516SKenneth E. Jansenc
173259599516SKenneth E. Jansen      if(numImpSrfs.gt.zero) then
173359599516SKenneth E. Jansen         do j=1, ntimeptpT
173459599516SKenneth E. Jansen            QHistImp(j,1:numSrfs)=QHistImp(j+1,1:numSrfs)
173559599516SKenneth E. Jansen         enddo
173659599516SKenneth E. Jansen         QHistImp(ntimeptpT+1,1:numSrfs) = NewQ(1:numSrfs)
173759599516SKenneth E. Jansen
173859599516SKenneth E. Jansenc
173959599516SKenneth E. Jansenc....filter the flow rate history
174059599516SKenneth E. Jansenc
174159599516SKenneth E. Jansen         cutfreq = 10           !hardcoded cutting frequency of the filter
174259599516SKenneth E. Jansen         do j=1, ntimeptpT
174359599516SKenneth E. Jansen            QHistTry(j,:)=QHistImp(j+1,:)
174459599516SKenneth E. Jansen         enddo
174559599516SKenneth E. Jansen         call Filter(QHistTryF,QHistTry,ntimeptpT,Delt(1),cutfreq)
174659599516SKenneth E. Jansenc.... if no filter applied then uncomment next three lines
174759599516SKenneth E. Jansenc         do j=1, ntimeptpT
174859599516SKenneth E. Jansenc            QHistTryF(j,:)=QHistTry(j,:)
174959599516SKenneth E. Jansenc         enddo
175059599516SKenneth E. Jansen
175159599516SKenneth E. Jansenc         QHistImp(1,:)=zero ! why do we do this? for beta(1,:) = zero it does not really matters
175259599516SKenneth E. Jansen         do j=1, ntimeptpT
175359599516SKenneth E. Jansen            QHistImp(j+1,:)=QHistTryF(j,:)
175459599516SKenneth E. Jansen         enddo
175559599516SKenneth E. Jansenc
175659599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat
175759599516SKenneth E. Jansenc
175859599516SKenneth E. Jansen         if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or.
175959599516SKenneth E. Jansen     &        (istep .eq. nstep(1)))) .and.
176059599516SKenneth E. Jansen     &        (myrank .eq. master)) then
176159599516SKenneth E. Jansen            open(unit=816, file='Qhistor.dat',status='replace')
176259599516SKenneth E. Jansen            write(816,*) ntimeptpT
176359599516SKenneth E. Jansen            do j=1,ntimeptpT+1
176459599516SKenneth E. Jansen               write(816,*) (QHistImp(j,n),n=1, numSrfs)
176559599516SKenneth E. Jansen            enddo
176659599516SKenneth E. Jansen            close(816)
176759599516SKenneth E. Jansenc... write out a copy with step number to be able to restart
176859599516SKenneth E. Jansen            fname1 = 'Qhistor'
176959599516SKenneth E. Jansen            fname1 = trim(fname1)//trim(cname2(lstep))//'.dat'
177059599516SKenneth E. Jansen            open(unit=8166,file=trim(fname1),status='unknown')
177159599516SKenneth E. Jansen            write(8166,*) ntimeptpT
177259599516SKenneth E. Jansen            do j=1,ntimeptpT+1
177359599516SKenneth E. Jansen               write(8166,*) (QHistImp(j,n),n=1, numSrfs)
177459599516SKenneth E. Jansen            enddo
177559599516SKenneth E. Jansen            close(8166)
177659599516SKenneth E. Jansen         endif
177759599516SKenneth E. Jansen      endif
177859599516SKenneth E. Jansen
177959599516SKenneth E. Jansenc
178059599516SKenneth E. Jansenc... for RCR bc just add the new contribution
178159599516SKenneth E. Jansenc
178259599516SKenneth E. Jansen      if(numRCRSrfs.gt.zero) then
178359599516SKenneth E. Jansen         QHistRCR(lstep+1,1:numSrfs) = NewQ(1:numSrfs)
178459599516SKenneth E. Jansenc
178559599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat
178659599516SKenneth E. Jansenc
178759599516SKenneth E. Jansen         if ((irs .ge. 1) .and. (myrank .eq. master)) then
178859599516SKenneth E. Jansen            if(istep.eq.1) then
178959599516SKenneth E. Jansen               open(unit=816,file='Qhistor.dat',status='unknown')
179059599516SKenneth E. Jansen            else
179159599516SKenneth E. Jansen               open(unit=816,file='Qhistor.dat',position='append')
179259599516SKenneth E. Jansen            endif
179359599516SKenneth E. Jansen            if(istep.eq.1) then
179459599516SKenneth E. Jansen               do j=1,lstep
179559599516SKenneth E. Jansen                  write(816,*) j, (QHistRCR(j,n),n=1,numSrfs) ! read from file of previous run
179659599516SKenneth E. Jansen               enddo
179759599516SKenneth E. Jansen            endif
179859599516SKenneth E. Jansen            write(816,*) lstep+1, (QHistRCR(lstep+1,n),n=1, numSrfs)
179959599516SKenneth E. Jansen            close(816)
180059599516SKenneth E. Jansenc... write out a copy with step number to be able to restart
180159599516SKenneth E. Jansen            if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or.
180259599516SKenneth E. Jansen     &           (istep .eq. nstep(1)))) .and.
180359599516SKenneth E. Jansen     &           (myrank .eq. master)) then
180459599516SKenneth E. Jansen               fname1 = 'Qhistor'
180559599516SKenneth E. Jansen               fname1 = trim(fname1)//trim(cname2(lstep))//'.dat'
180659599516SKenneth E. Jansen               open(unit=8166,file=trim(fname1),status='unknown')
180759599516SKenneth E. Jansen               write(8166,*) lstep+1
180859599516SKenneth E. Jansen               do j=1,lstep+1
180959599516SKenneth E. Jansen                  write(8166,*) (QHistRCR(j,n),n=1, numSrfs)
181059599516SKenneth E. Jansen               enddo
181159599516SKenneth E. Jansen               close(8166)
181259599516SKenneth E. Jansen            endif
181359599516SKenneth E. Jansen         endif
181459599516SKenneth E. Jansen      endif
181559599516SKenneth E. Jansen
181659599516SKenneth E. Jansen      return
181759599516SKenneth E. Jansen      end
181859599516SKenneth E. Jansen
181959599516SKenneth E. Jansenc
182059599516SKenneth E. Jansenc...calculate the time varying coefficients for the RCR convolution
182159599516SKenneth E. Jansenc
182259599516SKenneth E. Jansen      subroutine CalcRCRConvCoef (stepn, numSrfs)
182359599516SKenneth E. Jansen
182459599516SKenneth E. Jansen      use convolRCRFlow !brings in ValueListRCR, dtRCR
182559599516SKenneth E. Jansen
182659599516SKenneth E. Jansen      include "common.h" !brings alfi
182759599516SKenneth E. Jansen
182859599516SKenneth E. Jansen      integer numSrfs, stepn
182959599516SKenneth E. Jansen
183059599516SKenneth E. Jansen      RCRConvCoef = zero
183159599516SKenneth E. Jansen      if (stepn .eq. 0) then
183259599516SKenneth E. Jansen        RCRConvCoef(1,:) = ValueListRCR(1,:)*(1.0-alfi) +
183359599516SKenneth E. Jansen     &   ValueListRCR(3,:)*(-alfi + 1.0 + 1/dtRCR(:)
183459599516SKenneth E. Jansen     &     - exp(-alfi*dtRCR(:))*(1 + 1/dtRCR(:)))
183559599516SKenneth E. Jansen        RCRConvCoef(2,:) = ValueListRCR(1,:)*alfi
183659599516SKenneth E. Jansen     &     + ValueListRCR(3,:)
183759599516SKenneth E. Jansen     &     *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:))
183859599516SKenneth E. Jansen      endif
183959599516SKenneth E. Jansen      if (stepn .ge. 1) then
184059599516SKenneth E. Jansen        RCRConvCoef(1,:) =-ValueListRCR(3,:)*exp(-dtRCR(:)*(stepn+alfi))
184159599516SKenneth E. Jansen     &        *(1 + (1 - exp(dtRCR(:)))/dtRCR(:))
184259599516SKenneth E. Jansen        RCRConvCoef(stepn+1,:) = ValueListRCR(1,:)*(1-alfi)
184359599516SKenneth E. Jansen     &     - ValueListRCR(3,:)*(alfi - 1 - 1/dtRCR(:)
184459599516SKenneth E. Jansen     &     + exp(-alfi*dtRCR(:))/dtRCR(:)*(2 - exp(-dtRCR(:))))
184559599516SKenneth E. Jansen        RCRConvCoef(stepn+2,:) = ValueListRCR(1,:)*alfi
184659599516SKenneth E. Jansen     &     + ValueListRCR(3,:)
184759599516SKenneth E. Jansen     &     *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:))
184859599516SKenneth E. Jansen      endif
184959599516SKenneth E. Jansen      if (stepn .ge. 2) then
185059599516SKenneth E. Jansen        do j=2,stepn
185159599516SKenneth E. Jansen         RCRConvCoef(j,:) = ValueListRCR(3,:)/dtRCR(:)*
185259599516SKenneth E. Jansen     &        exp(-dtRCR(:)*(stepn + alfi + 2 - j))*
185359599516SKenneth E. Jansen     &        (1 - exp(dtRCR(:)))**2
185459599516SKenneth E. Jansen        enddo
185559599516SKenneth E. Jansen      endif
185659599516SKenneth E. Jansen
185759599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr()
185859599516SKenneth E. Jansen      RCRConvCoef(stepn+1,:)= RCRConvCoef(stepn+1,:)
185959599516SKenneth E. Jansen     &                  - RCRConvCoef(stepn+2,:)*(1.0-alfi)/alfi
186059599516SKenneth E. Jansen      RCRConvCoef(stepn+2,:)= RCRConvCoef(stepn+2,:)/alfi
186159599516SKenneth E. Jansen
186259599516SKenneth E. Jansen      return
186359599516SKenneth E. Jansen      end
186459599516SKenneth E. Jansen
186559599516SKenneth E. Jansenc
186659599516SKenneth E. Jansenc...calculate the time dependent H operator for the RCR convolution
186759599516SKenneth E. Jansenc
186859599516SKenneth E. Jansen      subroutine CalcHopRCR (timestepRCR, stepn, numSrfs)
186959599516SKenneth E. Jansen
187059599516SKenneth E. Jansen      use convolRCRFlow !brings in HopRCR, dtRCR
187159599516SKenneth E. Jansen
187259599516SKenneth E. Jansen      include "common.h"
187359599516SKenneth E. Jansen
187459599516SKenneth E. Jansen      integer numSrfs, stepn
187559599516SKenneth E. Jansen      real*8  PdistCur(0:MAXSURF), timestepRCR
187659599516SKenneth E. Jansen
187759599516SKenneth E. Jansen      HopRCR=zero
187859599516SKenneth E. Jansen      call RCRint(timestepRCR*(stepn + alfi),PdistCur)
187959599516SKenneth E. Jansen      HopRCR(1:numSrfs) = RCRic(1:numSrfs)
188059599516SKenneth E. Jansen     &     *exp(-dtRCR(1:numSrfs)*(stepn + alfi)) + PdistCur(1:numSrfs)
188159599516SKenneth E. Jansen      return
188259599516SKenneth E. Jansen      end
188359599516SKenneth E. Jansenc
188459599516SKenneth E. Jansenc ... initialize the influence of the initial conditions for the RCR BC
188559599516SKenneth E. Jansenc
188659599516SKenneth E. Jansen      subroutine calcRCRic(y,srfIdList,numSrfs)
188759599516SKenneth E. Jansen
188859599516SKenneth E. Jansen      use convolRCRFlow    !brings RCRic, ValueListRCR, ValuePdist
188959599516SKenneth E. Jansen
189059599516SKenneth E. Jansen      include "common.h"
189159599516SKenneth E. Jansen
189259599516SKenneth E. Jansen      integer   srfIdList(0:MAXSURF), numSrfs, irankCoupled
189359599516SKenneth E. Jansen      real*8    y(nshg,4) !need velocity and pressure
189459599516SKenneth E. Jansen      real*8    Qini(0:MAXSURF) !initial flow rate
189559599516SKenneth E. Jansen      real*8    PdistIni(0:MAXSURF) !initial distal pressure
189659599516SKenneth E. Jansen      real*8    Pini(0:MAXSURF),CoupleArea(0:MAXSURF) ! initial pressure
189759599516SKenneth E. Jansen      real*8    VelOnly(nshg,3), POnly(nshg)
189859599516SKenneth E. Jansen
189959599516SKenneth E. Jansen      allocate (RCRic(0:MAXSURF))
190059599516SKenneth E. Jansen
190159599516SKenneth E. Jansen      if(lstep.eq.0) then
190259599516SKenneth E. Jansen         VelOnly(:,1:3)=y(:,1:3)
190359599516SKenneth E. Jansen         call GetFlowQ(Qini,VelOnly,srfIdList,numSrfs) !get initial flow
190459599516SKenneth E. Jansen         QHistRCR(1,1:numSrfs)=Qini(1:numSrfs) !initialize QHistRCR
190559599516SKenneth E. Jansen         POnly(:)=y(:,4)        ! pressure
190659599516SKenneth E. Jansen         call integrScalar(Pini,POnly,srfIdList,numSrfs) !get initial pressure integral
190759599516SKenneth E. Jansen         POnly(:)=one           ! one to get area
190859599516SKenneth E. Jansen         call integrScalar(CoupleArea,POnly,srfIdList,numSrfs) !get surf area
190959599516SKenneth E. Jansen         Pini(1:numSrfs) = Pini(1:numSrfs)/CoupleArea(1:numSrfs)
191059599516SKenneth E. Jansen      else
191159599516SKenneth E. Jansen         Qini(1:numSrfs)=QHistRCR(1,1:numSrfs)
191259599516SKenneth E. Jansen         Pini(1:numSrfs)=zero    ! hack
191359599516SKenneth E. Jansen      endif
191459599516SKenneth E. Jansen      call RCRint(istep,PdistIni) !get initial distal P (use istep)
191559599516SKenneth E. Jansen      RCRic(1:numSrfs) = Pini(1:numSrfs)
191659599516SKenneth E. Jansen     &          - ValueListRCR(1,:)*Qini(1:numSrfs)-PdistIni(1:numSrfs)
191759599516SKenneth E. Jansen      return
191859599516SKenneth E. Jansen      end
191959599516SKenneth E. Jansen
192059599516SKenneth E. Jansenc.........function that integrates a scalar over a boundary
192159599516SKenneth E. Jansen      subroutine integrScalar(scalInt,scal,srfIdList,numSrfs)
192259599516SKenneth E. Jansen
192359599516SKenneth E. Jansen      use pvsQbi !brings ndsurf, NASC
192459599516SKenneth E. Jansen
192559599516SKenneth E. Jansen      include "common.h"
192659599516SKenneth E. Jansen      include "mpif.h"
192759599516SKenneth E. Jansen
192859599516SKenneth E. Jansen      integer   srfIdList(0:MAXSURF), numSrfs, irankCoupled, i, k
192959599516SKenneth E. Jansen      real*8    scal(nshg), scalInt(0:MAXSURF), scalIntProc(0:MAXSURF)
193059599516SKenneth E. Jansen
193159599516SKenneth E. Jansen      scalIntProc = zero
193259599516SKenneth E. Jansen      do i = 1,nshg
193359599516SKenneth E. Jansen        if(numSrfs.gt.zero) then
193459599516SKenneth E. Jansen          do k = 1,numSrfs
193559599516SKenneth E. Jansen            irankCoupled = 0
193659599516SKenneth E. Jansen            if (srfIdList(k).eq.ndsurf(i)) then
193759599516SKenneth E. Jansen              irankCoupled=k
193859599516SKenneth E. Jansen              scalIntProc(irankCoupled) = scalIntProc(irankCoupled)
193959599516SKenneth E. Jansen     &                            + NASC(i)*scal(i)
194059599516SKenneth E. Jansen              exit
194159599516SKenneth E. Jansen            endif
194259599516SKenneth E. Jansen          enddo
194359599516SKenneth E. Jansen        endif
194459599516SKenneth E. Jansen      enddo
194559599516SKenneth E. Jansenc
194659599516SKenneth E. Jansenc     at this point, each scalint has its "nodes" contributions to the scalar
194759599516SKenneth E. Jansenc     accumulated into scalIntProc. Note, because NASC is on processor this
194859599516SKenneth E. Jansenc     will NOT be the scalar for the surface yet
194959599516SKenneth E. Jansenc
195059599516SKenneth E. Jansenc.... reduce integrated scalar for each surface, push on scalInt
195159599516SKenneth E. Jansenc
195259599516SKenneth E. Jansen        npars=MAXSURF+1
195359599516SKenneth E. Jansen       call MPI_ALLREDUCE (scalIntProc, scalInt(:), npars,
195459599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
195559599516SKenneth E. Jansen
195659599516SKenneth E. Jansen      return
195759599516SKenneth E. Jansen      end
195859599516SKenneth E. Jansen
19599071d3baSCameron Smith      subroutine writeTimingMessage(key,iomode,timing)
19609071d3baSCameron Smith      use iso_c_binding
19619071d3baSCameron Smith      use phstr
19629071d3baSCameron Smith      implicit none
196359599516SKenneth E. Jansen
19649071d3baSCameron Smith      character(len=*) :: key
19659071d3baSCameron Smith      integer :: iomode
19669071d3baSCameron Smith      real*8 :: timing
1967da7d5714SCameron Smith      character(len=1024) :: timing_msg
196889625e43SCameron Smith      character(len=*), parameter ::
196989625e43SCameron Smith     &  streamModeString = c_char_"stream"//c_null_char,
197089625e43SCameron Smith     &  fileModeString = c_char_"disk"//c_null_char
197159599516SKenneth E. Jansen
1972da7d5714SCameron Smith      timing_msg = c_char_"Time to write "//c_null_char
19739071d3baSCameron Smith      call phstr_appendStr(timing_msg,key)
19749071d3baSCameron Smith      if ( iomode .eq. -1 ) then
19759071d3baSCameron Smith        call phstr_appendStr(timing_msg, streamModeString)
19769071d3baSCameron Smith      else
19779071d3baSCameron Smith        call phstr_appendStr(timing_msg, fileModeString)
19789071d3baSCameron Smith      endif
19799071d3baSCameron Smith      call phstr_appendStr(timing_msg, c_char_' = '//c_null_char)
19809071d3baSCameron Smith      call phstr_appendDbl(timing_msg, timing)
1981da7d5714SCameron Smith      write(6,*) trim(timing_msg)
19829071d3baSCameron Smith      return
19839071d3baSCameron Smith      end subroutine
198459599516SKenneth E. Jansen
1985