xref: /phasta/phSolver/compressible/itrdrv.f (revision e72fd12c594cc8086a288cc076d93493a5509e33)
159599516SKenneth E. Jansen              subroutine itrdrv (y,         ac,   uold, x,
259599516SKenneth E. Jansen     &                   iBC,       BC,
359599516SKenneth E. Jansen     &                   iper,      ilwork,     shp,
459599516SKenneth E. Jansen     &                   shgl,      shpb,       shglb,
559599516SKenneth E. Jansen     &                   ifath,     velbar,     nsons )
659599516SKenneth E. Jansenc
759599516SKenneth E. Jansenc----------------------------------------------------------------------
859599516SKenneth E. Jansenc
959599516SKenneth E. Jansenc This iterative driver is the semi-discrete, predictor multi-corrector
1059599516SKenneth E. Jansenc algorithm. It contains the Hulbert Generalized Alpha method which
1159599516SKenneth E. Jansenc is 2nd order accurate for Rho_inf from 0 to 1.  The method can be
1259599516SKenneth E. Jansenc made  first-order accurate by setting Rho_inf=-1. It uses a
1359599516SKenneth E. Jansenc GMRES iterative solver.
1459599516SKenneth E. Jansenc
1559599516SKenneth E. Jansenc working arrays:
1659599516SKenneth E. Jansenc  y      (nshg,ndof)           : Y variables
1759599516SKenneth E. Jansenc  x      (nshg,nsd)            : node coordinates
1859599516SKenneth E. Jansenc  iBC    (nshg)                : BC codes
1959599516SKenneth E. Jansenc  BC     (nshg,ndofBC)         : BC constraint parameters
2059599516SKenneth E. Jansenc  iper   (nshg)                : periodicity table
2159599516SKenneth E. Jansenc
2259599516SKenneth E. Jansenc shape functions:
2359599516SKenneth E. Jansenc  shp    (nshape,ngauss)        : interior element shape functions
2459599516SKenneth E. Jansenc  shgl   (nsd,nshape,ngauss)    : local shape function gradients
2559599516SKenneth E. Jansenc  shpb   (nshapeb,ngaussb)      : boundary element shape functions
2659599516SKenneth E. Jansenc  shglb  (nsd,nshapeb,ngaussb)  : bdry. elt. shape gradients
2759599516SKenneth E. Jansenc
2859599516SKenneth E. Jansenc Zdenek Johan,  Winter 1991.  (Fortran 90)
2959599516SKenneth E. Jansenc----------------------------------------------------------------------
3059599516SKenneth E. Jansenc
3159599516SKenneth E. Jansen      use pvsQbi     !gives us splag (the spmass at the end of this run
3259599516SKenneth E. Jansen      use specialBC  !gives us itvn
3359599516SKenneth E. Jansen      use timedata   !allows collection of time series
3459599516SKenneth E. Jansen      use turbSA
3559599516SKenneth E. Jansen
3659599516SKenneth E. Jansen        include "common.h"
3759599516SKenneth E. Jansen        include "mpif.h"
3859599516SKenneth E. Jansen        include "auxmpi.h"
3959599516SKenneth E. Jansen
4059599516SKenneth E. Jansenc
4159599516SKenneth E. Jansen        dimension y(nshg,ndof),            ac(nshg,ndof),
4259599516SKenneth E. Jansen     &		  yold(nshg,ndof),         acold(nshg,ndof),
4359599516SKenneth E. Jansen     &            x(numnp,nsd),            iBC(nshg),
4459599516SKenneth E. Jansen     &            BC(nshg,ndofBC),         ilwork(nlwork),
4559599516SKenneth E. Jansen     &            iper(nshg),              uold(nshg,nsd)
4659599516SKenneth E. Jansenc
4759599516SKenneth E. Jansen        dimension res(nshg,nflow),         BDiag(nshg,nflow,nflow),
4859599516SKenneth E. Jansen     &            rest(nshg),              solinc(nshg,ndof)
4959599516SKenneth E. Jansenc
5059599516SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
5159599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
5259599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
5359599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
5459599516SKenneth E. Jansen        real*8   almit, alfit, gamit
5559599516SKenneth E. Jansen        dimension ifath(numnp),    velbar(nfath,ndof),  nsons(nfath)
5659599516SKenneth E. Jansen        real*8 rerr(nshg,10),ybar(nshg,ndof+8) ! 8 is for avg. of square as uu, vv, ww, pp, TT, uv, uw, and vw
5759599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: ivarts
5859599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: ivartsg
5959599516SKenneth E. Jansen        real*8, allocatable, dimension(:) :: vartssoln
6059599516SKenneth E. Jansen        real*8, allocatable, dimension(:) :: vartssolng
6159599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: vartsbuff
6259599516SKenneth E. Jansen! assuming three profiles to control (inlet, bottom FC and top FC)
6359599516SKenneth E. Jansen! store velocity profile set via BC
6459599516SKenneth E. Jansen        real*8 vbc_prof(nshg,3)
6559599516SKenneth E. Jansen        character*20 fname1, fmt1, fname2, fmt2
6659599516SKenneth E. Jansen        character*4 fname4c ! 4 characters
6759599516SKenneth E. Jansen        character*60 fvarts
6859599516SKenneth E. Jansen        character*5  cname
6959599516SKenneth E. Jansen        character*10  cname2
7059599516SKenneth E. Jansen        integer ifuncs(6), iarray(10)
7159599516SKenneth E. Jansen
7259599516SKenneth E. Jansen        real*8 elDw(numel) ! element average of DES d variable
73*e72fd12cSBen Matthews
74*e72fd12cSBen Matthews        real*8, allocatable, dimension(:,:) :: HBrg
75*e72fd12cSBen Matthews        real*8, allocatable, dimension(:) :: eBrg
76*e72fd12cSBen Matthews        real*8, allocatable, dimension(:) :: yBrg
77*e72fd12cSBen Matthews        real*8, allocatable, dimension(:) :: Rcos, Rsin
7859599516SKenneth E. Jansenc
7959599516SKenneth E. Jansenc  Here are the data structures for sparse matrix GMRES
8059599516SKenneth E. Jansenc
8159599516SKenneth E. Jansen       integer, allocatable, dimension(:,:) :: rowp
8259599516SKenneth E. Jansen       integer, allocatable, dimension(:) :: colm
8359599516SKenneth E. Jansen       real*8, allocatable, dimension(:,:) :: lhsK
8459599516SKenneth E. Jansen       real*8, allocatable, dimension(:,:) :: EGmass
8559599516SKenneth E. Jansen       real*8, allocatable, dimension(:,:) :: EGmasst
8659599516SKenneth E. Jansen
8759599516SKenneth E. Jansen       inquire(file='xyzts.dat',exist=exts)
8859599516SKenneth E. Jansen       lskeep=lstep
8959599516SKenneth E. Jansen       if(exts) then
9059599516SKenneth E. Jansen
9159599516SKenneth E. Jansen          open(unit=626,file='xyzts.dat',status='old')
9259599516SKenneth E. Jansen          read(626,*) ntspts, freq, tolpt, iterat, varcod
9359599516SKenneth E. Jansen          call sTD              ! sets data structures
9459599516SKenneth E. Jansen          do jj=1,ntspts        ! read coordinate data where solution desired
9559599516SKenneth E. Jansen             read(626,*) ptts(jj,1),ptts(jj,2),ptts(jj,3)
9659599516SKenneth E. Jansen          enddo
9759599516SKenneth E. Jansen          close(626)
9859599516SKenneth E. Jansen
9959599516SKenneth E. Jansen           statptts(:,:) = 0
10059599516SKenneth E. Jansen           parptts(:,:) = zero
10159599516SKenneth E. Jansen           varts(:,:) = zero
10259599516SKenneth E. Jansen
10359599516SKenneth E. Jansen           allocate (ivarts(ntspts*ndof))
10459599516SKenneth E. Jansen           allocate (ivartsg(ntspts*ndof))
10559599516SKenneth E. Jansen           allocate (vartssoln(ntspts*ndof))
10659599516SKenneth E. Jansen           allocate (vartssolng(ntspts*ndof))
10759599516SKenneth E. Jansen
10859599516SKenneth E. Jansen           nbuff=ntout
10959599516SKenneth E. Jansen           allocate (vartsbuff(ntspts,ndof,nbuff))
11059599516SKenneth E. Jansen
11159599516SKenneth E. Jansen           if (myrank .eq. master) then
11259599516SKenneth E. Jansen              do jj=1,ntspts
11359599516SKenneth E. Jansen                 fvarts='varts/varts'
11459599516SKenneth E. Jansen                 fvarts=trim(fvarts)//trim(cname2(jj))
11559599516SKenneth E. Jansen                 fvarts=trim(fvarts)//trim(cname2(lstep))
11659599516SKenneth E. Jansen                 fvarts=trim(fvarts)//'.dat'
11759599516SKenneth E. Jansen                 fvarts=trim(fvarts)
11859599516SKenneth E. Jansen                 open(unit=1000+jj, file=fvarts, status='unknown')
11959599516SKenneth E. Jansen              enddo
12059599516SKenneth E. Jansen           endif
12159599516SKenneth E. Jansen
12259599516SKenneth E. Jansen       endif
12359599516SKenneth E. Jansen
12459599516SKenneth E. Jansenc
12559599516SKenneth E. Jansenc
12659599516SKenneth E. Jansenc.... open history and aerodynamic forces files
12759599516SKenneth E. Jansenc
12859599516SKenneth E. Jansen        if (myrank .eq. master) then
12959599516SKenneth E. Jansen          open (unit=ihist,  file=fhist,  status='unknown')
13059599516SKenneth E. Jansen          open (unit=iforce, file=fforce, status='unknown')
13159599516SKenneth E. Jansen        endif
13259599516SKenneth E. Jansenc
13359599516SKenneth E. Jansenc
13459599516SKenneth E. Jansenc.... initialize
13559599516SKenneth E. Jansenc
13659599516SKenneth E. Jansen        ifuncs  = 0                      ! func. evaluation counter
13759599516SKenneth E. Jansen        istep  = 0
13859599516SKenneth E. Jansen        ntotGM = 0                      ! number of GMRES iterations
13959599516SKenneth E. Jansen        time   = 0
14059599516SKenneth E. Jansen        yold   = y
14159599516SKenneth E. Jansen        acold  = ac
142*e72fd12cSBen Matthews
143*e72fd12cSBen Matthews        allocate(HBrg(Kspace+1,Kspace))
144*e72fd12cSBen Matthews        allocate(eBrg(Kspace+1))
145*e72fd12cSBen Matthews        allocate(yBrg(Kspace))
146*e72fd12cSBen Matthews        allocate(Rcos(Kspace))
147*e72fd12cSBen Matthews        allocate(Rsin(Kspace))
148*e72fd12cSBen Matthews
14959599516SKenneth E. Jansen        if (mod(impl(1),100)/10 .eq. 1) then
15059599516SKenneth E. Jansenc
15159599516SKenneth E. Jansenc     generate the sparse data fill vectors
15259599516SKenneth E. Jansenc
15359599516SKenneth E. Jansen           allocate  (rowp(nshg,nnz))
15459599516SKenneth E. Jansen           allocate  (colm(nshg+1))
15559599516SKenneth E. Jansen           call genadj(colm, rowp, icnt ) ! preprocess the adjacency list
15659599516SKenneth E. Jansen
15759599516SKenneth E. Jansen           nnz_tot=icnt         ! this is exactly the number of non-zero
15859599516SKenneth E. Jansen                                ! blocks on this proc
15959599516SKenneth E. Jansen           allocate (lhsK(nflow*nflow,nnz_tot))
16059599516SKenneth E. Jansen        endif
16159599516SKenneth E. Jansen        if (mod(impl(1),100)/10 .eq. 3) then
16259599516SKenneth E. Jansenc
16359599516SKenneth E. Jansenc     generate the ebe data fill vectors
16459599516SKenneth E. Jansenc
16559599516SKenneth E. Jansen           nedof=nflow*nshape
16659599516SKenneth E. Jansen           allocate  (EGmass(numel,nedof*nedof))
16759599516SKenneth E. Jansen        endif
16859599516SKenneth E. Jansencc
16959599516SKenneth E. Jansen
17059599516SKenneth E. Jansenc..........................................
17159599516SKenneth E. Jansen        rerr = zero
17259599516SKenneth E. Jansen        ybar(:,1:ndof) = y(:,1:ndof)
17359599516SKenneth E. Jansen        do idof=1,5
17459599516SKenneth E. Jansen           ybar(:,ndof+idof) = y(:,idof)*y(:,idof)
17559599516SKenneth E. Jansen        enddo
17659599516SKenneth E. Jansen        ybar(:,ndof+6) = y(:,1)*y(:,2)
17759599516SKenneth E. Jansen        ybar(:,ndof+7) = y(:,1)*y(:,3)
17859599516SKenneth E. Jansen        ybar(:,ndof+8) = y(:,2)*y(:,3)
17959599516SKenneth E. Jansenc.........................................
18059599516SKenneth E. Jansen
18159599516SKenneth E. Jansen
18259599516SKenneth E. Jansen        vbc_prof(:,1:3) = BC(:,3:5)
18359599516SKenneth E. Jansen
18459599516SKenneth E. Jansenc
18559599516SKenneth E. Jansenc.... loop through the time sequences
18659599516SKenneth E. Jansenc
18759599516SKenneth E. Jansen        do 3000 itsq = 1, ntseq
18859599516SKenneth E. Jansen        itseq = itsq
18959599516SKenneth E. Jansenc
19059599516SKenneth E. Jansenc.... set up the current parameters
19159599516SKenneth E. Jansenc
19259599516SKenneth E. Jansen        nstp   = nstep(itseq)
19359599516SKenneth E. Jansen        nitr   = niter(itseq)
19459599516SKenneth E. Jansen        LCtime = loctim(itseq)
19559599516SKenneth E. Jansenc
19659599516SKenneth E. Jansen        call itrSetup ( y,  acold)
19759599516SKenneth E. Jansen        isclr=0
19859599516SKenneth E. Jansen
19959599516SKenneth E. Jansen        niter(itseq)=0          ! count number of flow solves in a step
20059599516SKenneth E. Jansen                                !  (# of iterations)
20159599516SKenneth E. Jansen        do i=1,seqsize
20259599516SKenneth E. Jansen           if(stepseq(i).eq.0) niter(itseq)=niter(itseq)+1
20359599516SKenneth E. Jansen        enddo
20459599516SKenneth E. Jansen        nitr = niter(itseq)
20559599516SKenneth E. Jansenc
20659599516SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve
20759599516SKenneth E. Jansenc
20859599516SKenneth E. Jansen        nsclrsol=nsclr          ! total number of scalars solved. At
20959599516SKenneth E. Jansen                                ! some point we probably want to create
21059599516SKenneth E. Jansen                                ! a map, considering stepseq(), to find
21159599516SKenneth E. Jansen                                ! what is actually solved and only
21259599516SKenneth E. Jansen                                ! dimension EGmasst to the appropriate
21359599516SKenneth E. Jansen                                ! size.
21459599516SKenneth E. Jansen
21559599516SKenneth E. Jansen        if(nsclrsol.gt.0)allocate  (EGmasst(numel*nshape*nshape
21659599516SKenneth E. Jansen     &                              ,nsclrsol))
21759599516SKenneth E. Jansen
21859599516SKenneth E. Jansenc
21959599516SKenneth E. Jansenc.... loop through the time steps
22059599516SKenneth E. Jansenc
22159599516SKenneth E. Jansen        ttim(1) = REAL(secs(0.0)) / 100.
22259599516SKenneth E. Jansen        ttim(2) = secs(0.0)
22359599516SKenneth E. Jansen
22459599516SKenneth E. Jansenc        tcorecp1 = REAL(secs(0.0)) / 100.
22559599516SKenneth E. Jansenc        tcorewc1 = secs(0.0)
22659599516SKenneth E. Jansen        if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
22759599516SKenneth E. Jansen        if(myrank.eq.0)  then
22859599516SKenneth E. Jansen           tcorecp1 = TMRC()
22959599516SKenneth E. Jansen        endif
23059599516SKenneth E. Jansen
23159599516SKenneth E. Jansen        rmub=datmat(1,2,1)
23259599516SKenneth E. Jansen        if(rmutarget.gt.0) then
23359599516SKenneth E. Jansen           rmue=rmutarget
23459599516SKenneth E. Jansen           xmulfact=(rmue/rmub)**(1.0/nstp)
23559599516SKenneth E. Jansen           if(myrank.eq.0) then
23659599516SKenneth E. Jansen              write(*,*) 'viscosity will by multiplied by ', xmulfact
23759599516SKenneth E. Jansen              write(*,*) 'to bring it from ', rmub,' down to ', rmue
23859599516SKenneth E. Jansen           endif
23959599516SKenneth E. Jansen           datmat(1,2,1)=datmat(1,2,1)/xmulfact ! make first step right
24059599516SKenneth E. Jansen        else
24159599516SKenneth E. Jansen           rmue=datmat(1,2,1)   ! keep constant
24259599516SKenneth E. Jansen           xmulfact=one
24359599516SKenneth E. Jansen        endif
24459599516SKenneth E. Jansen        if(iramp.eq.1) then
24559599516SKenneth E. Jansen                call initBCprofileScale(vbc_prof,BC,yold,x)
24659599516SKenneth E. Jansen! fix the yold values to the reset BC
24759599516SKenneth E. Jansen                call itrBC (yold,  ac,  iBC,  BC,  iper, ilwork)
24859599516SKenneth E. Jansen                isclr=1 ! fix scalar
24959599516SKenneth E. Jansen                call itrBCsclr(yold,ac,iBC,BC,iper,ilwork)
25059599516SKenneth E. Jansen        endif
25159599516SKenneth E. Jansen
25259599516SKenneth E. Jansen867     continue
25359599516SKenneth E. Jansen        do 2000 istp = 1, nstp
25459599516SKenneth E. Jansen        if(iramp.eq.1)
25559599516SKenneth E. Jansen     &        call BCprofileScale(vbc_prof,BC,yold)
25659599516SKenneth E. Jansen
25759599516SKenneth E. Jansenc           call rerun_check(stopjob)
25859599516SKenneth E. Jansencc          if(stopjob.ne.0) goto 2001
25959599516SKenneth E. Jansenc
26059599516SKenneth E. Jansenc Decay of scalars
26159599516SKenneth E. Jansenc
26259599516SKenneth E. Jansen           if(nsclr.gt.0 .and. tdecay.ne.1) then
26359599516SKenneth E. Jansen              yold(:,6:ndof)=y(:,6:ndof)*tdecay
26459599516SKenneth E. Jansen              BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*tdecay
26559599516SKenneth E. Jansen           endif
26659599516SKenneth E. Jansen
26759599516SKenneth E. Jansen           if(nosource.eq.1) BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*0.8
26859599516SKenneth E. Jansen
26959599516SKenneth E. Jansen
27059599516SKenneth E. Jansenc           xi=istp*one/nstp
27159599516SKenneth E. Jansenc           datmat(1,2,1)=rmub*(1.0-xi)+xi*rmue
27259599516SKenneth E. Jansen           datmat(1,2,1)=xmulfact*datmat(1,2,1)
27359599516SKenneth E. Jansen
27459599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC.
27559599516SKenneth E. Jansenc     these will be for time step n+1 so use lstep+1
27659599516SKenneth E. Jansenc
27759599516SKenneth E. Jansen           if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl,
27859599516SKenneth E. Jansen     &                              shpb, shglb, x, BC, iBC)
27959599516SKenneth E. Jansen
28059599516SKenneth E. Jansen            if(iLES.gt.0) then
28159599516SKenneth E. Jansenc
28259599516SKenneth E. Jansenc.... get dynamic model coefficient
28359599516SKenneth E. Jansenc
28459599516SKenneth E. Jansen            ilesmod=iLES/10
28559599516SKenneth E. Jansenc
28659599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model
28759599516SKenneth E. Jansenc
28859599516SKenneth E. Jansen            if (ilesmod.eq.0) then ! 0 < iLES < 10 => dyn. model calculated
28959599516SKenneth E. Jansen                                   ! at nodes based on discrete filtering
29059599516SKenneth E. Jansen               call getdmc (yold,       shgl,      shp,
29159599516SKenneth E. Jansen     &                      iper,       ilwork,    nsons,
29259599516SKenneth E. Jansen     &                      ifath,      x)
29359599516SKenneth E. Jansen            endif
29459599516SKenneth E. Jansen            if (ilesmod .eq. 1) then ! 10 < iLES < 20 => dynamic-mixed
29559599516SKenneth E. Jansen                                     ! at nodes based on discrete filtering
29659599516SKenneth E. Jansen               call bardmc (yold,       shgl,      shp,
29759599516SKenneth E. Jansen     &                      iper,       ilwork,
29859599516SKenneth E. Jansen     &                      nsons,      ifath,     x)
29959599516SKenneth E. Jansen            endif
30059599516SKenneth E. Jansen            if (ilesmod .eq. 2) then ! 20 < iLES < 30 => dynamic at quad
30159599516SKenneth E. Jansen                                     ! pts based on lumped projection filt.
30259599516SKenneth E. Jansen               call projdmc (yold,       shgl,      shp,
30359599516SKenneth E. Jansen     &                       iper,       ilwork,    x)
30459599516SKenneth E. Jansen            endif
30559599516SKenneth E. Jansenc
30659599516SKenneth E. Jansen            endif
30759599516SKenneth E. Jansen
30859599516SKenneth E. Jansen
30959599516SKenneth E. Jansenc
31059599516SKenneth E. Jansenc.... set traction BCs for modeled walls
31159599516SKenneth E. Jansenc
31259599516SKenneth E. Jansen            if (itwmod.ne.0) then   !wallfn check
31359599516SKenneth E. Jansen               call asbwmod(yold,   acold,   x,      BC,     iBC,
31459599516SKenneth E. Jansen     &                      iper,   ilwork,  ifath,  velbar)
31559599516SKenneth E. Jansen            endif
31659599516SKenneth E. Jansenc
31759599516SKenneth E. Jansenc.... -----------------------> predictor phase <-----------------------
31859599516SKenneth E. Jansenc
31959599516SKenneth E. Jansen            call itrPredict(   yold,    acold,    y,   ac )
32059599516SKenneth E. Jansen            call itrBC (y,  ac,  iBC,  BC,  iper, ilwork)
32159599516SKenneth E. Jansen            isclr = zero
32259599516SKenneth E. Jansen            if (nsclr.gt.zero) then
32359599516SKenneth E. Jansen            do isclr=1,nsclr
32459599516SKenneth E. Jansen               call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
32559599516SKenneth E. Jansen            enddo
32659599516SKenneth E. Jansen            endif
32759599516SKenneth E. Jansenc
32859599516SKenneth E. Jansenc.... --------------------> multi-corrector phase <--------------------
32959599516SKenneth E. Jansenc
33059599516SKenneth E. Jansen           iter=0
33159599516SKenneth E. Jansen            ilss=0  ! this is a switch thrown on first solve of LS redistance
33259599516SKenneth E. Jansenc
33359599516SKenneth E. JansencHACK to make it keep solving RANS until tolerance is reached
33459599516SKenneth E. Jansenc
33559599516SKenneth E. Jansen       istop=0
33659599516SKenneth E. Jansen       iMoreRANS=0
33759599516SKenneth E. Jansenc
33859599516SKenneth E. Jansenc find the the RANS portion of the sequence
33959599516SKenneth E. Jansenc
34059599516SKenneth E. Jansen	do istepc=1,seqsize
34159599516SKenneth E. Jansen		if(stepseq(istepc).eq.10) iLastRANS=istepc
34259599516SKenneth E. Jansen	enddo
34359599516SKenneth E. Jansen
34459599516SKenneth E. Jansen	iseqStart=	1
34559599516SKenneth E. Jansen9876	continue
34659599516SKenneth E. Jansenc
34759599516SKenneth E. Jansen            do istepc=iseqStart,seqsize
34859599516SKenneth E. Jansen               icode=stepseq(istepc)
34959599516SKenneth E. Jansen               if(mod(icode,10).eq.0) then ! this is a solve
35059599516SKenneth E. Jansen                  isolve=icode/10
35159599516SKenneth E. Jansen                  if(isolve.eq.0) then   ! flow solve (encoded as 0)
35259599516SKenneth E. Jansenc
35359599516SKenneth E. Jansen                     etol=epstol(1)
35459599516SKenneth E. Jansen                     iter   = iter+1
35559599516SKenneth E. Jansen                     ifuncs(1)  = ifuncs(1) + 1
35659599516SKenneth E. Jansenc
35759599516SKenneth E. Jansenc.... reset the aerodynamic forces
35859599516SKenneth E. Jansenc
35959599516SKenneth E. Jansen                     Force(1) = zero
36059599516SKenneth E. Jansen                     Force(2) = zero
36159599516SKenneth E. Jansen                     Force(3) = zero
36259599516SKenneth E. Jansen                     HFlux    = zero
36359599516SKenneth E. Jansenc
36459599516SKenneth E. Jansenc.... form the element data and solve the matrix problem
36559599516SKenneth E. Jansenc
36659599516SKenneth E. Jansenc.... explicit solver
36759599516SKenneth E. Jansenc
36859599516SKenneth E. Jansen                     if (impl(itseq) .eq. 0) then
36959599516SKenneth E. Jansen                        if (myrank .eq. master)
37059599516SKenneth E. Jansen     &                       call error('itrdrv  ','impl ',impl(itseq))
37159599516SKenneth E. Jansen                     endif
37259599516SKenneth E. Jansen                     if (mod(impl(1),100)/10 .eq. 1) then  ! sparse solve
37359599516SKenneth E. Jansenc
37459599516SKenneth E. Jansenc.... preconditioned sparse matrix GMRES solver
37559599516SKenneth E. Jansenc
37659599516SKenneth E. Jansen                        lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
37759599516SKenneth E. Jansen                        iprec=lhs
37859599516SKenneth E. Jansen                        nedof = nflow*nshape
37959599516SKenneth E. Jansenc                        write(*,*) 'lhs=',lhs
38059599516SKenneth E. Jansen                      call SolGMRs (y,             ac,            yold,
38159599516SKenneth E. Jansen     &                       acold,         x,
38259599516SKenneth E. Jansen     &                       iBC,           BC,
38359599516SKenneth E. Jansen     &                       colm,          rowp,          lhsk,
38459599516SKenneth E. Jansen     &                       res,
385*e72fd12cSBen Matthews     &                       BDiag,         hBrg,          eBrg,
386*e72fd12cSBen Matthews     &                       yBrg,          Rcos,          Rsin,
38759599516SKenneth E. Jansen     &                       iper,          ilwork,
38859599516SKenneth E. Jansen     &                       shp,           shgl,
38959599516SKenneth E. Jansen     &                       shpb,          shglb,         solinc,
39059599516SKenneth E. Jansen     &                       rerr)
39159599516SKenneth E. Jansen                      else if (mod(impl(1),100)/10 .eq. 2) then ! mfg solve
39259599516SKenneth E. Jansenc
39359599516SKenneth E. Jansenc.... preconditioned matrix-free GMRES solver
39459599516SKenneth E. Jansenc
39559599516SKenneth E. Jansen                        lhs=0
39659599516SKenneth E. Jansen                        iprec = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
39759599516SKenneth E. Jansen                        nedof = 0
39859599516SKenneth E. Jansen                        call SolMFG (y,             ac,            yold,
39959599516SKenneth E. Jansen     &                       acold,         x,
40059599516SKenneth E. Jansen     &                       iBC,           BC,
40159599516SKenneth E. Jansen     &                       res,
402*e72fd12cSBen Matthews     &                       BDiag,         HBrg,          eBrg,
403*e72fd12cSBen Matthews     &                       yBrg,          Rcos,          Rsin,
40459599516SKenneth E. Jansen     &                       iper,          ilwork,
40559599516SKenneth E. Jansen     &                       shp,           shgl,
40659599516SKenneth E. Jansen     &                       shpb,          shglb,         solinc,
40759599516SKenneth E. Jansen     &                       rerr)
40859599516SKenneth E. Jansenc
40959599516SKenneth E. Jansen                     else if (mod(impl(1),100)/10 .eq. 3) then ! ebe solve
41059599516SKenneth E. Jansenc.... preconditioned ebe matrix GMRES solver
41159599516SKenneth E. Jansenc
41259599516SKenneth E. Jansen
41359599516SKenneth E. Jansen                        lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
41459599516SKenneth E. Jansen                        iprec = lhs
41559599516SKenneth E. Jansen                        nedof = nflow*nshape
41659599516SKenneth E. Jansenc                        write(*,*) 'lhs=',lhs
41759599516SKenneth E. Jansen                      call SolGMRe (y,             ac,            yold,
41859599516SKenneth E. Jansen     &                       acold,         x,
41959599516SKenneth E. Jansen     &                       iBC,           BC,
42059599516SKenneth E. Jansen     &                       EGmass,        res,
421*e72fd12cSBen Matthews     &                       BDiag,         HBrg,          eBrg,
422*e72fd12cSBen Matthews     &                       yBrg,          Rcos,          Rsin,
42359599516SKenneth E. Jansen     &                       iper,          ilwork,
42459599516SKenneth E. Jansen     &                       shp,           shgl,
42559599516SKenneth E. Jansen     &                       shpb,          shglb,         solinc,
42659599516SKenneth E. Jansen     &                       rerr)
42759599516SKenneth E. Jansen                     endif
42859599516SKenneth E. Jansenc
42959599516SKenneth E. Jansen                else          ! solve a scalar  (encoded at isclr*10)
43059599516SKenneth E. Jansen                     ifuncs(isclr+2)  = ifuncs(isclr+2) + 1
43159599516SKenneth E. Jansen                     etol=epstol(isclr+1)
43259599516SKenneth E. Jansen                     isclr=isolve
43359599516SKenneth E. Jansen                     if((iLSet.eq.2).and.(ilss.eq.0)
43459599516SKenneth E. Jansen     &                    .and.(isclr.eq.2)) then
43559599516SKenneth E. Jansen                        ilss=1  ! throw switch (once per step)
43659599516SKenneth E. Jansenc
43759599516SKenneth E. Jansenc... copy the first scalar at t=n+1 into the second scalar of the
43859599516SKenneth E. Jansenc... level sets
43959599516SKenneth E. Jansenc
44059599516SKenneth E. Jansen                     y(:,6)    = yold(:,6)  + (y(:,6)-yold(:,6))/alfi
44159599516SKenneth E. Jansen                     y(:,7)    =  y(:,6)
44259599516SKenneth E. Jansen                     yold(:,7) = y(:,7)
44359599516SKenneth E. Jansen                     ac(:,7)   = zero
44459599516SKenneth E. Jansenc
44559599516SKenneth E. Jansen                     call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
44659599516SKenneth E. Jansenc
44759599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the
44859599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar
44959599516SKenneth E. Jansenc
45059599516SKenneth E. Jansen                        alfit=alfi
45159599516SKenneth E. Jansen                        gamit=gami
45259599516SKenneth E. Jansen                        almit=almi
45359599516SKenneth E. Jansen                        alfi = 1
45459599516SKenneth E. Jansen                        gami = 1
45559599516SKenneth E. Jansen                        almi = 1
45659599516SKenneth E. Jansen                     endif
45759599516SKenneth E. Jansenc
45859599516SKenneth E. Jansen                     lhs = 1 - min(1,mod(ifuncs(isclr+2)-1,
45959599516SKenneth E. Jansen     &                                       LHSupd(isclr+2)))
46059599516SKenneth E. Jansen                     iprec = lhs
46159599516SKenneth E. Jansen                     istop=0
46259599516SKenneth E. Jansen                     call SolGMRSclr(y,             ac,         yold,
46359599516SKenneth E. Jansen     &		          acold,         EGmasst(1,isclr),
46459599516SKenneth E. Jansen     &                    x,             elDw,
46559599516SKenneth E. Jansen     &                    iBC,           BC,
46659599516SKenneth E. Jansen     &                    rest,
467*e72fd12cSBen Matthews     &                    HBrg,          eBrg,
468*e72fd12cSBen Matthews     &                    yBrg,          Rcos,      Rsin,
46959599516SKenneth E. Jansen     &                    iper,          ilwork,
47059599516SKenneth E. Jansen     &                    shp,           shgl,
47159599516SKenneth E. Jansen     &                    shpb,          shglb, solinc(1,isclr+5))
47259599516SKenneth E. Jansenc
47359599516SKenneth E. Jansen                  endif         ! end of scalar type solve
47459599516SKenneth E. Jansenc
47559599516SKenneth E. Jansenc
47659599516SKenneth E. Jansenc.... end of the multi-corrector loop
47759599516SKenneth E. Jansenc
47859599516SKenneth E. Jansen 1000             continue      !check this
47959599516SKenneth E. Jansen
48059599516SKenneth E. Jansen               else             ! this is an update  (mod did not equal zero)
48159599516SKenneth E. Jansen                  iupdate=icode/10 ! what to update
48259599516SKenneth E. Jansen                  if(iupdate.eq.0) then !update flow
48359599516SKenneth E. Jansen                     call itrCorrect ( y, ac, yold, acold, solinc)
48459599516SKenneth E. Jansen                     call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
48559599516SKenneth E. Jansen                     call tnanq(y, 5, 'y_updbc')
48659599516SKenneth E. Jansenc Elaine-SPEBC
48759599516SKenneth E. Jansen                     if((irscale.ge.0).and.(myrank.eq.master)) then
48859599516SKenneth E. Jansen                        call genscale(y, x, iBC)
48959599516SKenneth E. Jansenc                       call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
49059599516SKenneth E. Jansen                     endif
49159599516SKenneth E. Jansen                  else          ! update scalar
49259599516SKenneth E. Jansen                     isclr=iupdate !unless
49359599516SKenneth E. Jansen                     if(iupdate.eq.nsclr+1) isclr=0
49459599516SKenneth E. Jansen                     call itrCorrectSclr ( y, ac, yold, acold,
49559599516SKenneth E. Jansen     &                                     solinc(1,isclr+5))
49659599516SKenneth E. Jansen                     if (ilset.eq.2 .and. isclr.eq.2)  then
49759599516SKenneth E. Jansen                        fct2=one/almi
49859599516SKenneth E. Jansen                        fct3=one/alfi
49959599516SKenneth E. Jansen                        acold(:,7) = acold(:,7)
50059599516SKenneth E. Jansen     &                             + (ac(:,7)-acold(:,7))*fct2
50159599516SKenneth E. Jansen                        yold(:,7)  = yold(:,7)
50259599516SKenneth E. Jansen     &                             + (y(:,7)-yold(:,7))*fct3
50359599516SKenneth E. Jansen                        call itrBCSclr (  yold,  acold,  iBC,  BC,
50459599516SKenneth E. Jansen     &                                    iper,  ilwork)
50559599516SKenneth E. Jansen                        ac(:,7) = acold(:,7)*(one-almi/gami)
50659599516SKenneth E. Jansen                        y(:,7)  = yold(:,7)
50759599516SKenneth E. Jansen                        ac(:,7) = zero
50859599516SKenneth E. Jansen                        if (ivconstraint .eq. 1) then
50959599516SKenneth E. Jansen     &
51059599516SKenneth E. Jansenc ... applying the volume constraint
51159599516SKenneth E. Jansenc
51259599516SKenneth E. Jansen                           call solvecon (y,    x,      iBC,  BC,
51359599516SKenneth E. Jansen     &                                    iper, ilwork, shp,  shgl)
51459599516SKenneth E. Jansenc
51559599516SKenneth E. Jansen                        endif   ! end of volume constraint calculations
51659599516SKenneth E. Jansen                     endif
51759599516SKenneth E. Jansen                     call itrBCSclr (  y,  ac,  iBC,  BC, iper, ilwork)
51859599516SKenneth E. Jansen                  endif
51959599516SKenneth E. Jansen               endif            !end of switch between solve or update
52059599516SKenneth E. Jansen            enddo               ! loop over sequence in step
52159599516SKenneth E. Jansen	if((istop.lt.0).and.(iMoreRANS.lt.5)) then
52259599516SKenneth E. Jansen            iMoreRANS=iMoreRANS+1
52359599516SKenneth E. Jansen            if(myrank.eq.0) write(*,*) 'istop =', istop
52459599516SKenneth E. Jansen	  iseqStart=iLastRANS
52559599516SKenneth E. Jansen	  goto 9876
52659599516SKenneth E. Jansen	endif
52759599516SKenneth E. Jansenc
52859599516SKenneth E. Jansenc     Find the solution at the end of the timestep and move it to old
52959599516SKenneth E. Jansenc
53059599516SKenneth E. Jansenc.... First to reassign the parameters for the original time integrator scheme
53159599516SKenneth E. Jansenc
53259599516SKenneth E. Jansen            if((iLSet.eq.2).and.(ilss.eq.1)) then
53359599516SKenneth E. Jansen               alfi =alfit
53459599516SKenneth E. Jansen               gami =gamit
53559599516SKenneth E. Jansen               almi =almit
53659599516SKenneth E. Jansen            endif
53759599516SKenneth E. Jansen            call itrUpdate( yold,  acold,   y,    ac)
53859599516SKenneth E. Jansen            call itrBC (yold, acold,  iBC,  BC, iper,ilwork)
53959599516SKenneth E. Jansenc Elaine-SPEBC
54059599516SKenneth E. Jansen            if((irscale.ge.0).and.(myrank.eq.master)) then
54159599516SKenneth E. Jansen                call genscale(yold, x, iBC)
54259599516SKenneth E. Jansenc               call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
54359599516SKenneth E. Jansen            endif
54459599516SKenneth E. Jansen            do isclr=1,nsclr
54559599516SKenneth E. Jansen               call itrBCSclr (yold, acold,  iBC, BC, iper, ilwork)
54659599516SKenneth E. Jansen            enddo
54759599516SKenneth E. Jansenc
54859599516SKenneth E. Jansen            istep = istep + 1
54959599516SKenneth E. Jansenc
55059599516SKenneth E. Jansenc.... compute boundary fluxes and print out
55159599516SKenneth E. Jansenc
55259599516SKenneth E. Jansen            lstep = lstep + 1
55359599516SKenneth E. Jansen            ntoutv=max(ntout,100)
55459599516SKenneth E. Jansen            if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then
55559599516SKenneth E. Jansenc
55659599516SKenneth E. Jansenc here is where we save our averaged field.  In some cases we want to
55759599516SKenneth E. Jansenc write it less frequently
55859599516SKenneth E. Jansen               if( (mod(lstep, ntoutv) .eq. 0) .and.
55959599516SKenneth E. Jansen     &              ((irscale.ge.0).or.(itwmod.gt.0) .or.
56059599516SKenneth E. Jansen     &              ((nsonmax.eq.1).and.(iLES.gt.0))))
56159599516SKenneth E. Jansen     &              call rwvelb  ('out ',  velbar  ,ifail)
56259599516SKenneth E. Jansen
56359599516SKenneth E. Jansen               call Bflux  (yold,          acold,     x,
56459599516SKenneth E. Jansen     &              shp,           shgl,      shpb,
56559599516SKenneth E. Jansen     &              shglb,         nodflx,    ilwork)
56659599516SKenneth E. Jansen            endif
56759599516SKenneth E. Jansenc
56859599516SKenneth E. Jansenc.... end of the NSTEP and NTSEQ loops
56959599516SKenneth E. Jansenc
57059599516SKenneth E. Jansen
57159599516SKenneth E. Jansenc...  dump TIME SERIES
57259599516SKenneth E. Jansen
57359599516SKenneth E. Jansen            if (exts) then
57459599516SKenneth E. Jansen               if (mod(lstep-1,freq).eq.0) then
57559599516SKenneth E. Jansen
57659599516SKenneth E. Jansen                  if (numpe > 1) then
57759599516SKenneth E. Jansen                     do jj = 1, ntspts
57859599516SKenneth E. Jansen                        vartssoln((jj-1)*ndof+1:jj*ndof)=varts(jj,:)
57959599516SKenneth E. Jansen                        ivarts=zero
58059599516SKenneth E. Jansen                     enddo
58159599516SKenneth E. Jansen                     do k=1,ndof*ntspts
58259599516SKenneth E. Jansen                        if(vartssoln(k).ne.zero) ivarts(k)=1
58359599516SKenneth E. Jansen                     enddo
58459599516SKenneth E. Jansen                     call MPI_REDUCE(vartssoln, vartssolng, ndof*ntspts,
58559599516SKenneth E. Jansen     &                    MPI_DOUBLE_PRECISION, MPI_SUM, master,
58659599516SKenneth E. Jansen     &                    MPI_COMM_WORLD, ierr)
58759599516SKenneth E. Jansen
58859599516SKenneth E. Jansen                     call MPI_REDUCE(ivarts, ivartsg, ndof*ntspts,
58959599516SKenneth E. Jansen     &                    MPI_INTEGER, MPI_SUM, master,
59059599516SKenneth E. Jansen     &                    MPI_COMM_WORLD, ierr)
59159599516SKenneth E. Jansen
59259599516SKenneth E. Jansen                     if (myrank.eq.zero) then
59359599516SKenneth E. Jansen                        do jj = 1, ntspts
59459599516SKenneth E. Jansen
59559599516SKenneth E. Jansen                           indxvarts = (jj-1)*ndof
59659599516SKenneth E. Jansen                           do k=1,ndof
59759599516SKenneth E. Jansen                              if(ivartsg(indxvarts+k).ne.0) then ! none of the vartssoln(parts) were non zero
59859599516SKenneth E. Jansen                                 varts(jj,k)=vartssolng(indxvarts+k)/
59959599516SKenneth E. Jansen     &                                ivartsg(indxvarts+k)
60059599516SKenneth E. Jansen                              endif
60159599516SKenneth E. Jansen                           enddo
60259599516SKenneth E. Jansen                        enddo
60359599516SKenneth E. Jansen                     endif !only on master
60459599516SKenneth E. Jansen                  endif !only if numpe > 1
60559599516SKenneth E. Jansen
60659599516SKenneth E. Jansen                 if( istp.eq. nstp) then !make sure incomplete buffers get purged.
60759599516SKenneth E. Jansen		    icheck=mod(nstp,nbuff)
60859599516SKenneth E. Jansen                    if(icheck.ne.0) nbuff=icheck
60959599516SKenneth E. Jansen		 endif
61059599516SKenneth E. Jansen
61159599516SKenneth E. Jansen                  if (myrank.eq.zero) then
61259599516SKenneth E. Jansen	             k=mod(lstep,nbuff)
61359599516SKenneth E. Jansen		     if(k.eq.0) k=nbuff
61459599516SKenneth E. Jansen                     do jj = 1, ntspts
61559599516SKenneth E. Jansen			vartsbuff(jj,1:5,k)=varts(jj,1:5)
61659599516SKenneth E. Jansen		     enddo
61759599516SKenneth E. Jansen                     if(k.eq. nbuff) then
61859599516SKenneth E. Jansen                       do jj = 1, ntspts
61959599516SKenneth E. Jansen                        ifile = 1000+jj
62059599516SKenneth E. Jansen			do ibuf=1,nbuff
62159599516SKenneth E. Jansen                        write(ifile,555) lstep-1 -nbuff+ibuf,
62259599516SKenneth E. Jansen     &                  (vartsbuff(jj,k,ibuf), k=1,5) ! assuming ndof to be 5
62359599516SKenneth E. Jansen                        enddo ! buff empty
62459599516SKenneth E. Jansen
62559599516SKenneth E. Jansenc                        call flush(ifile)
62659599516SKenneth E. Jansen                       enddo ! jj ntspts
62759599516SKenneth E. Jansen                        endif !only dump when buffer full
62859599516SKenneth E. Jansen                  endif !only on master
62959599516SKenneth E. Jansen
63059599516SKenneth E. Jansen                  varts(:,:) = zero ! reset the array for next step
63159599516SKenneth E. Jansen
63259599516SKenneth E. Jansen 555              format(i6,5(2x,E12.5e2))
63359599516SKenneth E. Jansen
63459599516SKenneth E. Jansen               endif
63559599516SKenneth E. Jansen            endif
63659599516SKenneth E. Jansen
63759599516SKenneth E. Jansenc
63859599516SKenneth E. Jansenc.... -------------------> error calculation  <-----------------
63959599516SKenneth E. Jansen            if(ierrcalc.eq.1.or.ioybar.eq.1) then
64059599516SKenneth E. Jansen               tfact=one/istep
64159599516SKenneth E. Jansen               do idof=1,ndof
64259599516SKenneth E. Jansen                 ybar(:,idof) =tfact*yold(:,idof) +
64359599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,idof)
64459599516SKenneth E. Jansen               enddo
64559599516SKenneth E. Jansenc....compute average
64659599516SKenneth E. Jansenc...  ybar(:,ndof+1:ndof+8) is for avg. of square as uu, vv, ww, pp, TT, uv, uw, and vw
64759599516SKenneth E. Jansen               do idof=1,5 ! avg. of square for 5 flow variables
64859599516SKenneth E. Jansen                   ybar(:,ndof+idof) = tfact*yold(:,idof)**2 +
64959599516SKenneth E. Jansen     &                             (one-tfact)*ybar(:,ndof+idof)
65059599516SKenneth E. Jansen               enddo
65159599516SKenneth E. Jansen               ybar(:,ndof+6) = tfact*yold(:,1)*yold(:,2) + !uv
65259599516SKenneth E. Jansen     &                          (one-tfact)*ybar(:,ndof+6)
65359599516SKenneth E. Jansen               ybar(:,ndof+7) = tfact*yold(:,1)*yold(:,3) + !uw
65459599516SKenneth E. Jansen     &                          (one-tfact)*ybar(:,ndof+7)
65559599516SKenneth E. Jansen               ybar(:,ndof+8) = tfact*yold(:,2)*yold(:,3) + !vw
65659599516SKenneth E. Jansen     &                          (one-tfact)*ybar(:,ndof+8)
65759599516SKenneth E. Jansenc... compute err
65859599516SKenneth E. Jansenc               rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2
65959599516SKenneth E. Jansenc               rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2
66059599516SKenneth E. Jansenc               rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2
66159599516SKenneth E. Jansenc               rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2
66259599516SKenneth E. Jansen            endif
66359599516SKenneth E. Jansenc...........................................................................
66459599516SKenneth E. Jansen 2000    continue
66559599516SKenneth E. Jansen 2001    continue
66659599516SKenneth E. Jansen
66759599516SKenneth E. Jansen         ttim(1) = REAL(secs(0.0)) / 100. - ttim(1)
66859599516SKenneth E. Jansen         ttim(2) = secs(0.0)                 - ttim(2)
66959599516SKenneth E. Jansen
67059599516SKenneth E. Jansenc         tcorecp2 = REAL(secs(0.0)) / 100.
67159599516SKenneth E. Jansenc         tcorewc2 = secs(0.0)
67259599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
67359599516SKenneth E. Jansen         if(myrank.eq.0)  then
67459599516SKenneth E. Jansen            tcorecp2 = TMRC()
67559599516SKenneth E. Jansen            write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1
67659599516SKenneth E. Jansen         endif
67759599516SKenneth E. Jansen
67859599516SKenneth E. Jansenc     call wtime
67959599516SKenneth E. Jansen
68059599516SKenneth E. Jansen 3000 continue
68159599516SKenneth E. Jansenc
68259599516SKenneth E. Jansenc.... ---------------------->  Post Processing  <----------------------
68359599516SKenneth E. Jansenc
68459599516SKenneth E. Jansenc.... print out the last step
68559599516SKenneth E. Jansenc
68659599516SKenneth E. Jansen      if ((irs .ge. 1) .and. ((mod(lstep, ntout) .ne. 0) .or.
68759599516SKenneth E. Jansen     &     (nstp .eq. 0))) then
68859599516SKenneth E. Jansen         if( (mod(lstep, ntoutv) .eq. 0) .and.
68959599516SKenneth E. Jansen     &        ((irscale.ge.0).or.(itwmod.gt.0) .or.
69059599516SKenneth E. Jansen     &        ((nsonmax.eq.1).and.(iLES.gt.0))))
69159599516SKenneth E. Jansen     &        call rwvelb  ('out ',  velbar  ,ifail)
69259599516SKenneth E. Jansen
69359599516SKenneth E. Jansen         call Bflux  (yold,  acold,     x,
69459599516SKenneth E. Jansen     &        shp,           shgl,      shpb,
69559599516SKenneth E. Jansen     &        shglb,         nodflx,    ilwork)
69659599516SKenneth E. Jansen      endif
69759599516SKenneth E. Jansenc
69859599516SKenneth E. Jansen      if(ierrcalc.eq.1) then
69959599516SKenneth E. Jansenc
70059599516SKenneth E. Jansenc.....smooth the error indicators
70159599516SKenneth E. Jansenc
70259599516SKenneth E. Jansenc ! errsmooth is currently available only for incompressible code
70359599516SKenneth E. Jansenc        do i=1,ierrsmooth
70459599516SKenneth E. Jansenc            call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC )
70559599516SKenneth E. Jansenc        end do
70659599516SKenneth E. Jansen
70759599516SKenneth E. Jansen         call write_error(myrank, lstep, nshg, 10, rerr )
70859599516SKenneth E. Jansen      endif
70959599516SKenneth E. Jansen
71059599516SKenneth E. Jansen      if(ioybar.eq.1) then
71159599516SKenneth E. Jansen         call write_field(myrank,'a','ybar',4,
71259599516SKenneth E. Jansen     &                    ybar,'d',nshg,ndof+8,lstep)
71359599516SKenneth E. Jansen      endif
71459599516SKenneth E. Jansen
71559599516SKenneth E. Jansen      if(iRANS.lt.0 .and. idistcalc.eq.1) then
71659599516SKenneth E. Jansen         call write_field(myrank,'a','DESd',4,
71759599516SKenneth E. Jansen     &                    elDw,'d',numel,1,lstep)
71859599516SKenneth E. Jansen
71959599516SKenneth E. Jansen         call write_field(myrank,'a','dwal',4,
72059599516SKenneth E. Jansen     &                    d2wall,'d',nshg,1,lstep)
72159599516SKenneth E. Jansen      endif
72259599516SKenneth E. Jansen
72359599516SKenneth E. Jansenc
72459599516SKenneth E. Jansenc.... close history and aerodynamic forces files
72559599516SKenneth E. Jansenc
72659599516SKenneth E. Jansen      if (myrank .eq. master) then
72759599516SKenneth E. Jansen         close (ihist)
72859599516SKenneth E. Jansen         close (iforce)
72959599516SKenneth E. Jansen         if(exts) then
73059599516SKenneth E. Jansen            deallocate(ivarts)
73159599516SKenneth E. Jansen            deallocate(ivartsg)
73259599516SKenneth E. Jansen            deallocate(vartssoln)
73359599516SKenneth E. Jansen            deallocate(vartssolng)
73459599516SKenneth E. Jansen            do jj=1,ntspts
73559599516SKenneth E. Jansen               close(1000+jj)
73659599516SKenneth E. Jansen            enddo
73759599516SKenneth E. Jansen         endif
73859599516SKenneth E. Jansen      endif
73959599516SKenneth E. Jansen      close (iecho)
74059599516SKenneth E. Jansen      if(iabc==1) deallocate(acs)
74159599516SKenneth E. Jansenc
74259599516SKenneth E. Jansenc.... end
74359599516SKenneth E. Jansenc
74459599516SKenneth E. Jansen        return
74559599516SKenneth E. Jansen        end
746