xref: /phasta/phSolver/incompressible/itrdrv.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen      subroutine itrdrv (y,         ac,
2*59599516SKenneth E. Jansen     &                   uold,      x,
3*59599516SKenneth E. Jansen     &                   iBC,       BC,
4*59599516SKenneth E. Jansen     &                   iper,      ilwork,     shp,
5*59599516SKenneth E. Jansen     &                   shgl,      shpb,       shglb,
6*59599516SKenneth E. Jansen     &                   ifath,     velbar,     nsons )
7*59599516SKenneth E. Jansenc
8*59599516SKenneth E. Jansenc----------------------------------------------------------------------
9*59599516SKenneth E. Jansenc
10*59599516SKenneth E. Jansenc This iterative driver is the semi-discrete, predictor multi-corrector
11*59599516SKenneth E. Jansenc algorithm. It contains the Hulbert Generalized Alpha method which
12*59599516SKenneth E. Jansenc is 2nd order accurate for Rho_inf from 0 to 1.  The method can be
13*59599516SKenneth E. Jansenc made  first-order accurate by setting Rho_inf=-1. It uses CGP and
14*59599516SKenneth E. Jansenc GMRES iterative solvers.
15*59599516SKenneth E. Jansenc
16*59599516SKenneth E. Jansenc working arrays:
17*59599516SKenneth E. Jansenc  y      (nshg,ndof)           : Y variables
18*59599516SKenneth E. Jansenc  x      (nshg,nsd)            : node coordinates
19*59599516SKenneth E. Jansenc  iBC    (nshg)                : BC codes
20*59599516SKenneth E. Jansenc  BC     (nshg,ndofBC)         : BC constraint parameters
21*59599516SKenneth E. Jansenc  iper   (nshg)                : periodicity table
22*59599516SKenneth E. Jansenc
23*59599516SKenneth E. Jansenc
24*59599516SKenneth E. Jansenc Zdenek Johan,  Winter 1991.  (Fortran 90)
25*59599516SKenneth E. Jansenc Alberto Figueroa, Winter 2004.  CMM-FSI
26*59599516SKenneth E. Jansenc Irene Vignon, Fall 2004. Impedance BC
27*59599516SKenneth E. Jansenc----------------------------------------------------------------------
28*59599516SKenneth E. Jansenc
29*59599516SKenneth E. Jansen      use pvsQbi     !gives us splag (the spmass at the end of this run
30*59599516SKenneth E. Jansen      use specialBC !gives us itvn
31*59599516SKenneth E. Jansen      use timedata   !allows collection of time series
32*59599516SKenneth E. Jansen      use convolImpFlow !for Imp bc
33*59599516SKenneth E. Jansen      use convolRCRFlow !for RCR bc
34*59599516SKenneth E. Jansen!MR CHANGE
35*59599516SKenneth E. Jansen      use turbsa          ! used to access d2wall
36*59599516SKenneth E. Jansen!MR CHANGE END
37*59599516SKenneth E. Jansen
38*59599516SKenneth E. Jansenc      use readarrays !reads in uold and acold
39*59599516SKenneth E. Jansen
40*59599516SKenneth E. Jansen        include "common.h"
41*59599516SKenneth E. Jansen        include "mpif.h"
42*59599516SKenneth E. Jansen        include "auxmpi.h"
43*59599516SKenneth E. Jansenc
44*59599516SKenneth E. Jansen
45*59599516SKenneth E. Jansen
46*59599516SKenneth E. Jansen        real*8    y(nshg,ndof),              ac(nshg,ndof),
47*59599516SKenneth E. Jansen     &            yold(nshg,ndof),           acold(nshg,ndof),
48*59599516SKenneth E. Jansen     &            u(nshg,nsd),               uold(nshg,nsd),
49*59599516SKenneth E. Jansen     &            x(numnp,nsd),              solinc(nshg,ndof),
50*59599516SKenneth E. Jansen     &            BC(nshg,ndofBC),           tf(nshg,ndof),
51*59599516SKenneth E. Jansen     &            GradV(nshg,nsdsq)
52*59599516SKenneth E. Jansen
53*59599516SKenneth E. Jansenc
54*59599516SKenneth E. Jansen        real*8    res(nshg,ndof)
55*59599516SKenneth E. Jansenc
56*59599516SKenneth E. Jansen        real*8    shp(MAXTOP,maxsh,MAXQPT),
57*59599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
58*59599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
59*59599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
60*59599516SKenneth E. Jansenc
61*59599516SKenneth E. Jansen        integer   rowp(nshg,nnz),         colm(nshg+1),
62*59599516SKenneth E. Jansen     &            iBC(nshg),
63*59599516SKenneth E. Jansen     &            ilwork(nlwork),
64*59599516SKenneth E. Jansen     &            iper(nshg),            ifuncs(6)
65*59599516SKenneth E. Jansen
66*59599516SKenneth E. Jansen        real*8 vbc_prof(nshg,3)
67*59599516SKenneth E. Jansen
68*59599516SKenneth E. Jansen        integer stopjob
69*59599516SKenneth E. Jansen        character*10 cname2
70*59599516SKenneth E. Jansen        character*5  cname
71*59599516SKenneth E. Jansenc
72*59599516SKenneth E. Jansenc  stuff for dynamic model s.w.avg and wall model
73*59599516SKenneth E. Jansenc
74*59599516SKenneth E. Jansen        dimension ifath(numnp),    velbar(nfath,ndof),  nsons(nfath)
75*59599516SKenneth E. Jansen
76*59599516SKenneth E. Jansen        dimension wallubar(2),walltot(2)
77*59599516SKenneth E. Jansenc
78*59599516SKenneth E. Jansenc.... For Farzin's Library
79*59599516SKenneth E. Jansenc
80*59599516SKenneth E. Jansen        integer eqnType, prjFlag, presPrjFlag, verbose
81*59599516SKenneth E. Jansenc
82*59599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: aperm,  atemp, atempS
83*59599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: apermS
84*59599516SKenneth E. Jansen
85*59599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: lhsP, lhsK, lhsS
86*59599516SKenneth E. Jansen        real*8   almit, alfit, gamit
87*59599516SKenneth E. Jansenc
88*59599516SKenneth E. Jansen        character*1024    servername
89*59599516SKenneth E. Jansen        character*20    fname1,fmt1
90*59599516SKenneth E. Jansen        character*20    fname2,fmt2
91*59599516SKenneth E. Jansen        character*60    fnamepold, fvarts
92*59599516SKenneth E. Jansen        character*4     fname4c ! 4 characters
93*59599516SKenneth E. Jansen        integer         iarray(50) ! integers for headers
94*59599516SKenneth E. Jansen        integer         isgn(ndof), isgng(ndof)
95*59599516SKenneth E. Jansen
96*59599516SKenneth E. Jansen!MR CHANGE
97*59599516SKenneth E. Jansen!        real*8 rerr(nshg,10), ybar(nshg,13) ! including 7 sq. terms with 3 cross terms of uv, uw and vw
98*59599516SKenneth E. Jansen!        real*8 rerr(nshg,10), ybar(nshg,12) ! including 7 sq. terms with 3 cross terms of uv, uw and vw
99*59599516SKenneth E. Jansen        real*8 rerr(nshg,10)
100*59599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: ybar, strain, vorticity
101*59599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:) :: wallssVec, wallssVecbar
102*59599516SKenneth E. Jansen!MR CHANGE
103*59599516SKenneth E. Jansen
104*59599516SKenneth E. Jansen        real*8 tcorecp(2), tcorecpscal(2)
105*59599516SKenneth E. Jansen
106*59599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: ivarts
107*59599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: ivartsg
108*59599516SKenneth E. Jansen        integer, allocatable, dimension(:) :: iv_rank
109*59599516SKenneth E. Jansen        real*8, allocatable, dimension(:) :: vartssoln
110*59599516SKenneth E. Jansen        real*8, allocatable, dimension(:) :: vartssolng
111*59599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: yphbar
112*59599516SKenneth E. Jansen        real*8 CFLworst(numel)
113*59599516SKenneth E. Jansen
114*59599516SKenneth E. Jansen!MR CHANGE
115*59599516SKenneth E. Jansen        integer :: iv_rankpernode, iv_totnodes, iv_totcores
116*59599516SKenneth E. Jansen        integer :: iv_node, iv_core, iv_thread
117*59599516SKenneth E. Jansen!MR CHANGE
118*59599516SKenneth E. Jansen
119*59599516SKenneth E. Jansen        impistat = 0
120*59599516SKenneth E. Jansen        impistat2 = 0
121*59599516SKenneth E. Jansen        iISend = 0
122*59599516SKenneth E. Jansen        iISendScal = 0
123*59599516SKenneth E. Jansen        iIRecv = 0
124*59599516SKenneth E. Jansen        iIRecvScal = 0
125*59599516SKenneth E. Jansen        iWaitAll = 0
126*59599516SKenneth E. Jansen        iWaitAllScal = 0
127*59599516SKenneth E. Jansen        iAllR = 0
128*59599516SKenneth E. Jansen        iAllRScal = 0
129*59599516SKenneth E. Jansen        rISend = zero
130*59599516SKenneth E. Jansen        rISendScal = zero
131*59599516SKenneth E. Jansen        rIRecv = zero
132*59599516SKenneth E. Jansen        rIRecvScal = zero
133*59599516SKenneth E. Jansen        rWaitAll = zero
134*59599516SKenneth E. Jansen        rWaitAllScal = zero
135*59599516SKenneth E. Jansen        rAllR = zero
136*59599516SKenneth E. Jansen        rAllRScal = zero
137*59599516SKenneth E. Jansen        rCommu = zero
138*59599516SKenneth E. Jansen        rCommuScal = zero
139*59599516SKenneth E. Jansen
140*59599516SKenneth E. Jansen        call initmemstat()
141*59599516SKenneth E. Jansen
142*59599516SKenneth E. Jansenc
143*59599516SKenneth E. Jansenc  hack SA variable
144*59599516SKenneth E. Jansenc
145*59599516SKenneth E. JansencHack        BC(:,7)=BC(:,7)*0.001
146*59599516SKenneth E. JansencHack        if(lstep.eq.0) y(:,6)=y(:,6)*0.001
147*59599516SKenneth E. Jansen        call SolverLicenseServer(servername)
148*59599516SKenneth E. Jansenc
149*59599516SKenneth E. Jansenc only master should be verbose
150*59599516SKenneth E. Jansenc
151*59599516SKenneth E. Jansen
152*59599516SKenneth E. Jansen        if(numpe.gt.0 .and. myrank.ne.master)iverbose=0
153*59599516SKenneth E. Jansenc
154*59599516SKenneth E. Jansen
155*59599516SKenneth E. Jansen        lskeep=lstep
156*59599516SKenneth E. Jansen
157*59599516SKenneth E. Jansen        inquire(file='xyzts.dat',exist=exts)
158*59599516SKenneth E. Jansen        if(exts) then
159*59599516SKenneth E. Jansen
160*59599516SKenneth E. Jansen           open(unit=626,file='xyzts.dat',status='old')
161*59599516SKenneth E. Jansen           read(626,*) ntspts, freq, tolpt, iterat, varcod
162*59599516SKenneth E. Jansen           call sTD             ! sets data structures
163*59599516SKenneth E. Jansen
164*59599516SKenneth E. Jansen           do jj=1,ntspts       ! read coordinate data where solution desired
165*59599516SKenneth E. Jansen              read(626,*) ptts(jj,1),ptts(jj,2),ptts(jj,3)
166*59599516SKenneth E. Jansen           enddo
167*59599516SKenneth E. Jansen           close(626)
168*59599516SKenneth E. Jansen
169*59599516SKenneth E. Jansen           statptts(:,:) = 0
170*59599516SKenneth E. Jansen           parptts(:,:) = zero
171*59599516SKenneth E. Jansen           varts(:,:) = zero
172*59599516SKenneth E. Jansen
173*59599516SKenneth E. Jansen           allocate (ivarts(ntspts*ndof))
174*59599516SKenneth E. Jansen           allocate (ivartsg(ntspts*ndof))
175*59599516SKenneth E. Jansen           allocate (iv_rank(ntspts))
176*59599516SKenneth E. Jansen           allocate (vartssoln(ntspts*ndof))
177*59599516SKenneth E. Jansen           allocate (vartssolng(ntspts*ndof))
178*59599516SKenneth E. Jansen
179*59599516SKenneth E. Jansen           iv_rankpernode = iv_rankpercore*iv_corepernode
180*59599516SKenneth E. Jansen           iv_totnodes = numpe/iv_rankpernode
181*59599516SKenneth E. Jansen           iv_totcores = iv_corepernode*iv_totnodes
182*59599516SKenneth E. Jansen           if (myrank .eq. 0) then
183*59599516SKenneth E. Jansen             write(*,*) 'Info for probes:'
184*59599516SKenneth E. Jansen             write(*,*) '  Ranks per core:',iv_rankpercore
185*59599516SKenneth E. Jansen             write(*,*) '  Cores per node:',iv_corepernode
186*59599516SKenneth E. Jansen             write(*,*) '  Ranks per node:',iv_rankpernode
187*59599516SKenneth E. Jansen             write(*,*) '  Total number of nodes:',iv_totnodes
188*59599516SKenneth E. Jansen             write(*,*) '  Total number of cores',iv_totcores
189*59599516SKenneth E. Jansen           endif
190*59599516SKenneth E. Jansen
191*59599516SKenneth E. Jansen!           if (myrank .eq. numpe-1) then
192*59599516SKenneth E. Jansen            do jj=1,ntspts
193*59599516SKenneth E. Jansen
194*59599516SKenneth E. Jansen               ! Compute the adequate rank which will take care of probe jj
195*59599516SKenneth E. Jansen               jjm1 = jj-1
196*59599516SKenneth E. Jansen               iv_node = (iv_totnodes-1)-mod(jjm1,iv_totnodes)
197*59599516SKenneth E. Jansen               iv_core = (iv_corepernode-1) - mod((jjm1 -
198*59599516SKenneth E. Jansen     &              mod(jjm1,iv_totnodes))/iv_totnodes,iv_corepernode)
199*59599516SKenneth E. Jansen               iv_thread = (iv_rankpercore-1) - mod((jjm1-
200*59599516SKenneth E. Jansen     &              (mod(jjm1,iv_totcores)))/iv_totcores,iv_rankpercore)
201*59599516SKenneth E. Jansen               iv_rank(jj) = iv_node*iv_rankpernode
202*59599516SKenneth E. Jansen     &                     + iv_core*iv_rankpercore
203*59599516SKenneth E. Jansen     &                     + iv_thread
204*59599516SKenneth E. Jansen
205*59599516SKenneth E. Jansen               if(myrank == 0) then
206*59599516SKenneth E. Jansen                 write(*,*) '  Probe', jj, 'handled by rank',
207*59599516SKenneth E. Jansen     &                         iv_rank(jj), ' on node', iv_node
208*59599516SKenneth E. Jansen               endif
209*59599516SKenneth E. Jansen
210*59599516SKenneth E. Jansen               ! Verification just in case
211*59599516SKenneth E. Jansen               if(iv_rank(jj) .lt.0 .or. iv_rank(jj) .ge. numpe) then
212*59599516SKenneth E. Jansen                 write(*,*) 'WARNING: iv_rank(',jj,') is ', iv_rank(jj),
213*59599516SKenneth E. Jansen     &                      ' and reset to numpe-1'
214*59599516SKenneth E. Jansen                 iv_rank(jj) = numpe-1
215*59599516SKenneth E. Jansen               endif
216*59599516SKenneth E. Jansen
217*59599516SKenneth E. Jansen               ! Open the varts files
218*59599516SKenneth E. Jansen               if(myrank == iv_rank(jj)) then
219*59599516SKenneth E. Jansen                 fvarts='varts/varts'
220*59599516SKenneth E. Jansen                 fvarts=trim(fvarts)//trim(cname2(jj))
221*59599516SKenneth E. Jansen                 fvarts=trim(fvarts)//trim(cname2(lstep))
222*59599516SKenneth E. Jansen                 fvarts=trim(fvarts)//'.dat'
223*59599516SKenneth E. Jansen                 fvarts=trim(fvarts)
224*59599516SKenneth E. Jansen                 open(unit=1000+jj, file=fvarts, status='unknown')
225*59599516SKenneth E. Jansen               endif
226*59599516SKenneth E. Jansen            enddo
227*59599516SKenneth E. Jansen!           endif
228*59599516SKenneth E. Jansen
229*59599516SKenneth E. Jansen        endif
230*59599516SKenneth E. Jansenc
231*59599516SKenneth E. Jansenc.... open history and aerodynamic forces files
232*59599516SKenneth E. Jansenc
233*59599516SKenneth E. Jansen        if (myrank .eq. master) then
234*59599516SKenneth E. Jansen!           open (unit=ihist,  file=fhist,  status='unknown')
235*59599516SKenneth E. Jansen           open (unit=iforce, file=fforce, status='unknown')
236*59599516SKenneth E. Jansen           open (unit=76, file="fort.76", status='unknown')
237*59599516SKenneth E. Jansen           if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then
238*59599516SKenneth E. Jansen              fnamepold = 'pold'
239*59599516SKenneth E. Jansen              fnamepold = trim(fnamepold)//trim(cname2(lstep))
240*59599516SKenneth E. Jansen              fnamepold = trim(fnamepold)//'.dat'
241*59599516SKenneth E. Jansen              fnamepold = trim(fnamepold)
242*59599516SKenneth E. Jansen              open (unit=8177, file=fnamepold, status='unknown')
243*59599516SKenneth E. Jansen           endif
244*59599516SKenneth E. Jansen        endif
245*59599516SKenneth E. Jansenc
246*59599516SKenneth E. Jansenc.... initialize
247*59599516SKenneth E. Jansenc
248*59599516SKenneth E. Jansen        ifuncs(:)  = 0              ! func. evaluation counter
249*59599516SKenneth E. Jansen        istep  = 0
250*59599516SKenneth E. Jansen        yold   = y
251*59599516SKenneth E. Jansen        acold  = ac
252*59599516SKenneth E. Jansen
253*59599516SKenneth E. Jansen        rerr = zero
254*59599516SKenneth E. Jansen
255*59599516SKenneth E. Jansen        if(ierrcalc.eq.1 .or. ioybar.eq.1) then ! we need ybar for error too
256*59599516SKenneth E. Jansen          if (ivort == 1) then
257*59599516SKenneth E. Jansen            allocate(ybar(nshg,17)) ! more space for vorticity if requested
258*59599516SKenneth E. Jansen          else
259*59599516SKenneth E. Jansen            allocate(ybar(nshg,13))
260*59599516SKenneth E. Jansen          endif
261*59599516SKenneth E. Jansen          ybar = zero ! Initialize ybar to zero, which is essential
262*59599516SKenneth E. Jansen        endif
263*59599516SKenneth E. Jansen
264*59599516SKenneth E. Jansen        if(ivort == 1) then
265*59599516SKenneth E. Jansen          allocate(strain(nshg,6))
266*59599516SKenneth E. Jansen          allocate(vorticity(nshg,5))
267*59599516SKenneth E. Jansen        endif
268*59599516SKenneth E. Jansen
269*59599516SKenneth E. Jansen        if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
270*59599516SKenneth E. Jansen          allocate(wallssVec(nshg,3))
271*59599516SKenneth E. Jansen          if (ioybar .eq. 1) then
272*59599516SKenneth E. Jansen            allocate(wallssVecbar(nshg,3))
273*59599516SKenneth E. Jansen            wallssVecbar = zero ! Initialization important if mean wss computed
274*59599516SKenneth E. Jansen          endif
275*59599516SKenneth E. Jansen        endif
276*59599516SKenneth E. Jansen
277*59599516SKenneth E. Jansen! both nstepsincycle and nphasesincycle needs to be set
278*59599516SKenneth E. Jansen        if(nstepsincycle.eq.0) nphasesincycle = 0
279*59599516SKenneth E. Jansen        if(nphasesincycle.ne.0) then
280*59599516SKenneth E. Jansen!     &     allocate(yphbar(nshg,5,nphasesincycle))
281*59599516SKenneth E. Jansen          if (ivort == 1) then
282*59599516SKenneth E. Jansen            allocate(yphbar(nshg,15,nphasesincycle)) ! more space for vorticity
283*59599516SKenneth E. Jansen          else
284*59599516SKenneth E. Jansen            allocate(yphbar(nshg,11,nphasesincycle))
285*59599516SKenneth E. Jansen          endif
286*59599516SKenneth E. Jansen          yphbar = zero
287*59599516SKenneth E. Jansen        endif
288*59599516SKenneth E. Jansen
289*59599516SKenneth E. Jansen!MR CHANGE END
290*59599516SKenneth E. Jansen
291*59599516SKenneth E. Jansen        vbc_prof(:,1:3) = BC(:,3:5)
292*59599516SKenneth E. Jansen        if(iramp.eq.1) then
293*59599516SKenneth E. Jansen          call BCprofileInit(vbc_prof,x)
294*59599516SKenneth E. Jansen        endif
295*59599516SKenneth E. Jansen
296*59599516SKenneth E. Jansenc
297*59599516SKenneth E. Jansenc.... ---------------> initialize Farzin's Library <---------------
298*59599516SKenneth E. Jansenc
299*59599516SKenneth E. Jansenc.... assign parameter values
300*59599516SKenneth E. Jansenc
301*59599516SKenneth E. Jansen        do i = 1, 100
302*59599516SKenneth E. Jansen           numeqns(i) = i
303*59599516SKenneth E. Jansen        enddo
304*59599516SKenneth E. Jansen        nKvecs       = Kspace
305*59599516SKenneth E. Jansen        prjFlag      = iprjFlag
306*59599516SKenneth E. Jansen        presPrjFlag  = ipresPrjFlag
307*59599516SKenneth E. Jansen        verbose      = iverbose
308*59599516SKenneth E. Jansenc
309*59599516SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve
310*59599516SKenneth E. Jansenc
311*59599516SKenneth E. Jansen      nsolt=mod(impl(1),2)      ! 1 if solving temperature
312*59599516SKenneth E. Jansen      nsclrsol=nsolt+nsclr      ! total number of scalars solved At
313*59599516SKenneth E. Jansen                                ! some point we probably want to create
314*59599516SKenneth E. Jansen                                ! a map, considering stepseq(), to find
315*59599516SKenneth E. Jansen                                ! what is actually solved and only
316*59599516SKenneth E. Jansen                                ! dimension lhs to the appropriate
317*59599516SKenneth E. Jansen                                ! size. (see 1.6.1 and earlier for a
318*59599516SKenneth E. Jansen                                ! "failed" attempt at this).
319*59599516SKenneth E. Jansen
320*59599516SKenneth E. Jansen
321*59599516SKenneth E. Jansen      nsolflow=mod(impl(1),100)/10  ! 1 if solving flow
322*59599516SKenneth E. Jansen
323*59599516SKenneth E. Jansenc
324*59599516SKenneth E. Jansenc.... Now, call Farzin's lesNew routine to initialize
325*59599516SKenneth E. Jansenc     memory space
326*59599516SKenneth E. Jansenc
327*59599516SKenneth E. Jansen      call genadj(colm, rowp, icnt )  ! preprocess the adjacency list
328*59599516SKenneth E. Jansen
329*59599516SKenneth E. Jansen      nnz_tot=icnt ! this is exactly the number of non-zero blocks on
330*59599516SKenneth E. Jansen                   ! this proc
331*59599516SKenneth E. Jansen
332*59599516SKenneth E. Jansen      if (nsolflow.eq.1) then
333*59599516SKenneth E. Jansen         lesId   = numeqns(1)
334*59599516SKenneth E. Jansen         eqnType = 1
335*59599516SKenneth E. Jansen         nDofs   = 4
336*59599516SKenneth E. Jansen         call myfLesNew( lesId,   41994,
337*59599516SKenneth E. Jansen     &                 eqnType,
338*59599516SKenneth E. Jansen     &                 nDofs,          minIters,       maxIters,
339*59599516SKenneth E. Jansen     &                 nKvecs,         prjFlag,        nPrjs,
340*59599516SKenneth E. Jansen     &                 presPrjFlag,    nPresPrjs,      epstol(1),
341*59599516SKenneth E. Jansen     &                 prestol,        verbose,        statsflow,
342*59599516SKenneth E. Jansen     &                 nPermDims,      nTmpDims,      servername  )
343*59599516SKenneth E. Jansen
344*59599516SKenneth E. Jansen         allocate (aperm(nshg,nPermDims))
345*59599516SKenneth E. Jansen         allocate (atemp(nshg,nTmpDims))
346*59599516SKenneth E. Jansen         allocate (lhsP(4,nnz_tot))
347*59599516SKenneth E. Jansen         allocate (lhsK(9,nnz_tot))
348*59599516SKenneth E. Jansen
349*59599516SKenneth E. Jansen         call readLesRestart( lesId,  aperm, nshg, myrank, lstep,
350*59599516SKenneth E. Jansen     &                        nPermDims )
351*59599516SKenneth E. Jansen
352*59599516SKenneth E. Jansen      else
353*59599516SKenneth E. Jansen         nPermDims = 0
354*59599516SKenneth E. Jansen         nTempDims = 0
355*59599516SKenneth E. Jansen      endif
356*59599516SKenneth E. Jansen
357*59599516SKenneth E. Jansen
358*59599516SKenneth E. Jansen      if(nsclrsol.gt.0) then
359*59599516SKenneth E. Jansen       do isolsc=1,nsclrsol
360*59599516SKenneth E. Jansen         lesId       = numeqns(isolsc+1)
361*59599516SKenneth E. Jansen         eqnType     = 2
362*59599516SKenneth E. Jansen         nDofs       = 1
363*59599516SKenneth E. Jansen         presPrjflag = 0
364*59599516SKenneth E. Jansen         nPresPrjs   = 0
365*59599516SKenneth E. Jansen         prjFlag     = 1
366*59599516SKenneth E. Jansen         indx=isolsc+2-nsolt ! complicated to keep epstol(2) for
367*59599516SKenneth E. Jansen                             ! temperature followed by scalars
368*59599516SKenneth E. Jansen         call myfLesNew( lesId,            41994,
369*59599516SKenneth E. Jansen     &                 eqnType,
370*59599516SKenneth E. Jansen     &                 nDofs,          minIters,       maxIters,
371*59599516SKenneth E. Jansen     &                 nKvecs,         prjFlag,        nPrjs,
372*59599516SKenneth E. Jansen     &                 presPrjFlag,    nPresPrjs,      epstol(indx),
373*59599516SKenneth E. Jansen     &                 prestol,        verbose,        statssclr,
374*59599516SKenneth E. Jansen     &                 nPermDimsS,     nTmpDimsS,   servername )
375*59599516SKenneth E. Jansen       enddo
376*59599516SKenneth E. Jansenc
377*59599516SKenneth E. Jansenc  Assume all scalars have the same size needs
378*59599516SKenneth E. Jansenc
379*59599516SKenneth E. Jansen       allocate (apermS(nshg,nPermDimsS,nsclrsol))
380*59599516SKenneth E. Jansen       allocate (atempS(nshg,nTmpDimsS))  !they can all share this
381*59599516SKenneth E. Jansen       allocate (lhsS(nnz_tot,nsclrsol))
382*59599516SKenneth E. Jansenc
383*59599516SKenneth E. Jansenc actually they could even share with atemp but leave that for later
384*59599516SKenneth E. Jansenc
385*59599516SKenneth E. Jansen      else
386*59599516SKenneth E. Jansen         nPermDimsS = 0
387*59599516SKenneth E. Jansen         nTmpDimsS  = 0
388*59599516SKenneth E. Jansen      endif
389*59599516SKenneth E. Jansenc
390*59599516SKenneth E. Jansenc...  prepare lumped mass if needed
391*59599516SKenneth E. Jansenc
392*59599516SKenneth E. Jansen      if((flmpr.ne.0).or.(flmpl.ne.0)) call genlmass(x, shp,shgl)
393*59599516SKenneth E. Jansenc
394*59599516SKenneth E. Jansenc.... -----------------> End of initialization <-----------------
395*59599516SKenneth E. Jansenc
396*59599516SKenneth E. Jansenc.....open the necessary files to gather time series
397*59599516SKenneth E. Jansenc
398*59599516SKenneth E. Jansen      lstep0 = lstep+1
399*59599516SKenneth E. Jansen      nsteprcr = nstep(1)+lstep
400*59599516SKenneth E. Jansenc
401*59599516SKenneth E. Jansenc.... loop through the time sequences
402*59599516SKenneth E. Jansenc
403*59599516SKenneth E. Jansen
404*59599516SKenneth E. Jansen
405*59599516SKenneth E. Jansen      do 3000 itsq = 1, ntseq
406*59599516SKenneth E. Jansen         itseq = itsq
407*59599516SKenneth E. Jansen
408*59599516SKenneth E. JansenCAD         tcorecp1 = second(0)
409*59599516SKenneth E. JansenCAD         tcorewc1 = second(-1)
410*59599516SKenneth E. Jansenc
411*59599516SKenneth E. Jansenc.... set up the time integration parameters
412*59599516SKenneth E. Jansenc
413*59599516SKenneth E. Jansen         nstp   = nstep(itseq)
414*59599516SKenneth E. Jansen         nitr   = niter(itseq)
415*59599516SKenneth E. Jansen         LCtime = loctim(itseq)
416*59599516SKenneth E. Jansen         dtol(:)= deltol(itseq,:)
417*59599516SKenneth E. Jansen
418*59599516SKenneth E. Jansen         call itrSetup ( y, acold )
419*59599516SKenneth E. Jansenc
420*59599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution,
421*59599516SKenneth E. Jansenc   which are functions of alphaf so need to do it after itrSetup
422*59599516SKenneth E. Jansen         if(numImpSrfs.gt.zero) then
423*59599516SKenneth E. Jansen            call calcImpConvCoef (numImpSrfs, ntimeptpT)
424*59599516SKenneth E. Jansen         endif
425*59599516SKenneth E. Jansenc
426*59599516SKenneth E. Jansenc...initialize the initial condition P(0)-RQ(0)-Pd(0) for RCR BC
427*59599516SKenneth E. Jansenc   need ndsurf so should be after initNABI
428*59599516SKenneth E. Jansen         if(numRCRSrfs.gt.zero) then
429*59599516SKenneth E. Jansen            call calcRCRic(y,nsrflistRCR,numRCRSrfs)
430*59599516SKenneth E. Jansen         endif
431*59599516SKenneth E. Jansenc
432*59599516SKenneth E. Jansenc  find the last solve of the flow in the step sequence so that we will
433*59599516SKenneth E. Jansenc         know when we are at/near end of step
434*59599516SKenneth E. Jansenc
435*59599516SKenneth E. Jansenc         ilast=0
436*59599516SKenneth E. Jansen         nitr=0  ! count number of flow solves in a step (# of iterations)
437*59599516SKenneth E. Jansen         do i=1,seqsize
438*59599516SKenneth E. Jansen            if(stepseq(i).eq.0) nitr=nitr+1
439*59599516SKenneth E. Jansen         enddo
440*59599516SKenneth E. Jansen
441*59599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
442*59599516SKenneth E. Jansen         tcorecp(:) = zero ! used in solfar.f (solflow)
443*59599516SKenneth E. Jansen         tcorecpscal(:) = zero ! used in solfar.f (solflow)
444*59599516SKenneth E. Jansen         if(myrank.eq.0)  then
445*59599516SKenneth E. Jansen            tcorecp1 = TMRC()
446*59599516SKenneth E. Jansen         endif
447*59599516SKenneth E. Jansen
448*59599516SKenneth E. Jansenc
449*59599516SKenneth E. Jansenc.... loop through the time steps
450*59599516SKenneth E. Jansenc
451*59599516SKenneth E. Jansen         istop=0
452*59599516SKenneth E. Jansen         rmub=datmat(1,2,1)
453*59599516SKenneth E. Jansen         if(rmutarget.gt.0) then
454*59599516SKenneth E. Jansen            rmue=rmutarget
455*59599516SKenneth E. Jansen         else
456*59599516SKenneth E. Jansen            rmue=datmat(1,2,1) ! keep constant
457*59599516SKenneth E. Jansen         endif
458*59599516SKenneth E. Jansen
459*59599516SKenneth E. Jansen        if(iramp.eq.1) then
460*59599516SKenneth E. Jansen            call BCprofileScale(vbc_prof,BC,yold) ! fix the yold values to the reset BC
461*59599516SKenneth E. Jansen            isclr=1 ! fix scalar
462*59599516SKenneth E. Jansen            do isclr=1,nsclr
463*59599516SKenneth E. Jansen               call itrBCSclr(yold,ac,iBC,BC,iper,ilwork)
464*59599516SKenneth E. Jansen            enddo
465*59599516SKenneth E. Jansen        endif
466*59599516SKenneth E. Jansen
467*59599516SKenneth E. Jansen!MR CHANGE
468*59599516SKenneth E. Jansen!        do irank=0,numpe-1
469*59599516SKenneth E. Jansen!          if(irank==myrank) then
470*59599516SKenneth E. Jansen!             write(*,*) 'NUMTASK - rank,numtask: ',myrank,ilwork(1)
471*59599516SKenneth E. Jansen!          endif
472*59599516SKenneth E. Jansen!          call MPI_Barrier(MPI_COMM_WORLD,ierr)
473*59599516SKenneth E. Jansen!        enddo
474*59599516SKenneth E. Jansen!MR CHANGE END
475*59599516SKenneth E. Jansen
476*59599516SKenneth E. Jansen         do 2000 istp = 1, nstp
477*59599516SKenneth E. Jansen           if(iramp.eq.1)
478*59599516SKenneth E. Jansen     &        call BCprofileScale(vbc_prof,BC,yold)
479*59599516SKenneth E. Jansen
480*59599516SKenneth E. Jansen           call rerun_check(stopjob)
481*59599516SKenneth E. Jansen           if(stopjob.ne.0) goto 2001
482*59599516SKenneth E. Jansen
483*59599516SKenneth E. Jansen            xi=istp*1.0/nstp
484*59599516SKenneth E. Jansen            datmat(1,2,1)=rmub*(1.0-xi)+xi*rmue
485*59599516SKenneth E. Jansenc            write(*,*) "current mol. visc = ", datmat(1,2,1)
486*59599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC.
487*59599516SKenneth E. Jansenc     these will be for time step n+1 so use lstep+1
488*59599516SKenneth E. Jansenc
489*59599516SKenneth E. Jansen            if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl,
490*59599516SKenneth E. Jansen     &                               shpb, shglb, x, BC, iBC)
491*59599516SKenneth E. Jansen
492*59599516SKenneth E. Jansenc
493*59599516SKenneth E. Jansenc ... calculate the pressure contribution that depends on the history for the Imp. BC
494*59599516SKenneth E. Jansenc
495*59599516SKenneth E. Jansen            if(numImpSrfs.gt.0) then
496*59599516SKenneth E. Jansen               call pHist(poldImp,QHistImp,ImpConvCoef,
497*59599516SKenneth E. Jansen     &                    ntimeptpT,numImpSrfs)
498*59599516SKenneth E. Jansen               if (myrank.eq.master)
499*59599516SKenneth E. Jansen     &             write(8177,*) (poldImp(n), n=1,numImpSrfs)
500*59599516SKenneth E. Jansen            endif
501*59599516SKenneth E. Jansenc
502*59599516SKenneth E. Jansenc ... calc the pressure contribution that depends on the history for the RCR BC
503*59599516SKenneth E. Jansenc
504*59599516SKenneth E. Jansen            if(numRCRSrfs.gt.0) then
505*59599516SKenneth E. Jansen               call CalcHopRCR (Delt(itseq), lstep, numRCRSrfs)
506*59599516SKenneth E. Jansen               call CalcRCRConvCoef(lstep,numRCRSrfs)
507*59599516SKenneth E. Jansen               call pHist(poldRCR,QHistRCR,RCRConvCoef,nsteprcr,
508*59599516SKenneth E. Jansen     &              numRCRSrfs)
509*59599516SKenneth E. Jansen               if (myrank.eq.master)
510*59599516SKenneth E. Jansen     &             write(8177,*) (poldRCR(n), n=1,numRCRSrfs)
511*59599516SKenneth E. Jansen            endif
512*59599516SKenneth E. Jansenc
513*59599516SKenneth E. Jansenc Decay of scalars
514*59599516SKenneth E. Jansenc
515*59599516SKenneth E. Jansen           if(nsclr.gt.0 .and. tdecay.ne.1) then
516*59599516SKenneth E. Jansen              yold(:,6:ndof)=y(:,6:ndof)*tdecay
517*59599516SKenneth E. Jansen              BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*tdecay
518*59599516SKenneth E. Jansen           endif
519*59599516SKenneth E. Jansen
520*59599516SKenneth E. Jansen           if(nosource.eq.1) BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*0.8
521*59599516SKenneth E. Jansen
522*59599516SKenneth E. Jansen
523*59599516SKenneth E. Jansen            if(iLES.gt.0) then  !complicated stuff has moved to
524*59599516SKenneth E. Jansen                                        !routine below
525*59599516SKenneth E. Jansen               call lesmodels(yold,  acold,     shgl,      shp,
526*59599516SKenneth E. Jansen     &                        iper,  ilwork,    rowp,      colm,
527*59599516SKenneth E. Jansen     &                        nsons, ifath,     x,
528*59599516SKenneth E. Jansen     &                        iBC,   BC)
529*59599516SKenneth E. Jansen
530*59599516SKenneth E. Jansen
531*59599516SKenneth E. Jansen            endif
532*59599516SKenneth E. Jansen
533*59599516SKenneth E. Jansenc.... set traction BCs for modeled walls
534*59599516SKenneth E. Jansenc
535*59599516SKenneth E. Jansen            if (itwmod.ne.0) then
536*59599516SKenneth E. Jansen               call asbwmod(yold,   acold,   x,      BC,     iBC,
537*59599516SKenneth E. Jansen     &                      iper,   ilwork,  ifath,  velbar)
538*59599516SKenneth E. Jansen            endif
539*59599516SKenneth E. Jansen
540*59599516SKenneth E. Jansen!MR CHANGE
541*59599516SKenneth E. Jansenc
542*59599516SKenneth E. Jansenc.... Determine whether the vorticity field needs to be computed for this time step or not
543*59599516SKenneth E. Jansenc
544*59599516SKenneth E. Jansen            icomputevort = 0
545*59599516SKenneth E. Jansen            if (ivort == 1) then ! Print vorticity = True in solver.inp
546*59599516SKenneth E. Jansen              ! We then compute the vorticity only if we
547*59599516SKenneth E. Jansen              ! 1) we write an intermediate checkpoint
548*59599516SKenneth E. Jansen              ! 2) we reach the last time step and write the last checkpoint
549*59599516SKenneth E. Jansen              ! 3) we accumulate statistics in ybar for every time step
550*59599516SKenneth E. Jansen              ! BEWARE: we need here lstep+1 and istep+1 because the lstep and
551*59599516SKenneth E. Jansen              ! istep gets incremened after the flowsolve, further below
552*59599516SKenneth E. Jansen              if (((irs .ge. 1) .and. (mod(lstep+1, ntout) .eq. 0)) .or.
553*59599516SKenneth E. Jansen     &                   istep+1.eq.nstep(itseq) .or. ioybar == 1) then
554*59599516SKenneth E. Jansen                icomputevort = 1
555*59599516SKenneth E. Jansen              endif
556*59599516SKenneth E. Jansen            endif
557*59599516SKenneth E. Jansen
558*59599516SKenneth E. Jansen!            write(*,*) 'icomputevort: ',icomputevort, ' - istep: ',
559*59599516SKenneth E. Jansen!     &                istep,' - nstep(itseq):',nstep(itseq),'- lstep:',
560*59599516SKenneth E. Jansen!     &                lstep, '- ntout:', ntout
561*59599516SKenneth E. Jansen!MR CHANGE
562*59599516SKenneth E. Jansen
563*59599516SKenneth E. Jansenc
564*59599516SKenneth E. Jansenc.... -----------------------> predictor phase <-----------------------
565*59599516SKenneth E. Jansenc
566*59599516SKenneth E. Jansen            call itrPredict(yold, y,   acold,  ac ,  uold,  u, iBC)
567*59599516SKenneth E. Jansen            call itrBC (y,  ac,  iBC,  BC,  iper,ilwork)
568*59599516SKenneth E. Jansen
569*59599516SKenneth E. Jansen            if(nsolt.eq.1) then
570*59599516SKenneth E. Jansen               isclr=0
571*59599516SKenneth E. Jansen               call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
572*59599516SKenneth E. Jansen            endif
573*59599516SKenneth E. Jansen            do isclr=1,nsclr
574*59599516SKenneth E. Jansen               call itrBCSclr (y, ac,  iBC, BC, iper, ilwork)
575*59599516SKenneth E. Jansen            enddo
576*59599516SKenneth E. Jansen            iter=0
577*59599516SKenneth E. Jansen            ilss=0  ! this is a switch thrown on first solve of LS redistance
578*59599516SKenneth E. Jansen            do istepc=1,seqsize
579*59599516SKenneth E. Jansen               icode=stepseq(istepc)
580*59599516SKenneth E. Jansen               if(mod(icode,5).eq.0) then ! this is a solve
581*59599516SKenneth E. Jansen                  isolve=icode/10
582*59599516SKenneth E. Jansen                  if(icode.eq.0) then ! flow solve (encoded as 0)
583*59599516SKenneth E. Jansenc
584*59599516SKenneth E. Jansen                     iter   = iter+1
585*59599516SKenneth E. Jansen                     ifuncs(1)  = ifuncs(1) + 1
586*59599516SKenneth E. Jansenc
587*59599516SKenneth E. Jansen                     Force(1) = zero
588*59599516SKenneth E. Jansen                     Force(2) = zero
589*59599516SKenneth E. Jansen                     Force(3) = zero
590*59599516SKenneth E. Jansen                     HFlux    = zero
591*59599516SKenneth E. Jansen                     lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1)))
592*59599516SKenneth E. Jansen
593*59599516SKenneth E. Jansen                     call SolFlow(y,          ac,        u,
594*59599516SKenneth E. Jansen     &                         yold,          acold,     uold,
595*59599516SKenneth E. Jansen     &                         x,             iBC,
596*59599516SKenneth E. Jansen     &                         BC,            res,
597*59599516SKenneth E. Jansen     &                         nPermDims,     nTmpDims,  aperm,
598*59599516SKenneth E. Jansen     &                         atemp,         iper,
599*59599516SKenneth E. Jansen     &                         ilwork,        shp,       shgl,
600*59599516SKenneth E. Jansen     &                         shpb,          shglb,     rowp,
601*59599516SKenneth E. Jansen     &                         colm,          lhsK,      lhsP,
602*59599516SKenneth E. Jansen     &                         solinc,        rerr,      tcorecp,
603*59599516SKenneth E. Jansen     &                         GradV)
604*59599516SKenneth E. Jansen
605*59599516SKenneth E. Jansen                  else          ! scalar type solve
606*59599516SKenneth E. Jansen                     if (icode.eq.5) then ! Solve for Temperature
607*59599516SKenneth E. Jansen                                ! (encoded as (nsclr+1)*10)
608*59599516SKenneth E. Jansen                        isclr=0
609*59599516SKenneth E. Jansen                        ifuncs(2)  = ifuncs(2) + 1
610*59599516SKenneth E. Jansen                        j=1
611*59599516SKenneth E. Jansen                     else       ! solve a scalar  (encoded at isclr*10)
612*59599516SKenneth E. Jansen                        isclr=isolve
613*59599516SKenneth E. Jansen                        ifuncs(isclr+2)  = ifuncs(isclr+2) + 1
614*59599516SKenneth E. Jansen                        j=isclr+nsolt
615*59599516SKenneth E. Jansen                        if((iLSet.eq.2).and.(ilss.eq.0)
616*59599516SKenneth E. Jansen     &                       .and.(isclr.eq.2)) then
617*59599516SKenneth E. Jansen                           ilss=1 ! throw switch (once per step)
618*59599516SKenneth E. Jansen                           y(:,7)=y(:,6) ! redistance field initialized
619*59599516SKenneth E. Jansen                           ac(:,7)   = zero
620*59599516SKenneth E. Jansen                           call itrBCSclr (  y,  ac,  iBC,  BC, iper,
621*59599516SKenneth E. Jansen     &                          ilwork)
622*59599516SKenneth E. Jansenc
623*59599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the
624*59599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar
625*59599516SKenneth E. Jansenc
626*59599516SKenneth E. Jansen                           alfit=alfi
627*59599516SKenneth E. Jansen                           gamit=gami
628*59599516SKenneth E. Jansen                           almit=almi
629*59599516SKenneth E. Jansen                           Deltt=Delt(1)
630*59599516SKenneth E. Jansen                           Dtglt=Dtgl
631*59599516SKenneth E. Jansen                           alfi = 1
632*59599516SKenneth E. Jansen                           gami = 1
633*59599516SKenneth E. Jansen                           almi = 1
634*59599516SKenneth E. Jansenc     Delt(1)= Deltt ! Give a pseudo time step
635*59599516SKenneth E. Jansen                           Dtgl = one / Delt(1)
636*59599516SKenneth E. Jansen                        endif  ! level set eq. 2
637*59599516SKenneth E. Jansen                     endif ! deciding between temperature and scalar
638*59599516SKenneth E. Jansen
639*59599516SKenneth E. Jansen                     lhs = 1 - min(1,mod(ifuncs(isclr+2)-1,
640*59599516SKenneth E. Jansen     &                                   LHSupd(isclr+2)))
641*59599516SKenneth E. Jansen
642*59599516SKenneth E. Jansen                     call SolSclr(y,          ac,        u,
643*59599516SKenneth E. Jansen     &                         yold,          acold,     uold,
644*59599516SKenneth E. Jansen     &                         x,             iBC,
645*59599516SKenneth E. Jansen     &                         BC,            nPermDimsS,nTmpDimsS,
646*59599516SKenneth E. Jansen     &                         apermS(1,1,j), atempS,    iper,
647*59599516SKenneth E. Jansen     &                         ilwork,        shp,       shgl,
648*59599516SKenneth E. Jansen     &                         shpb,          shglb,     rowp,
649*59599516SKenneth E. Jansen     &                         colm,          lhsS(1,j),
650*59599516SKenneth E. Jansen     &                         solinc(1,isclr+5), tcorecpscal)
651*59599516SKenneth E. Jansen
652*59599516SKenneth E. Jansen
653*59599516SKenneth E. Jansen                  endif         ! end of scalar type solve
654*59599516SKenneth E. Jansen
655*59599516SKenneth E. Jansen               else ! this is an update  (mod did not equal zero)
656*59599516SKenneth E. Jansen                  iupdate=icode/10  ! what to update
657*59599516SKenneth E. Jansen                  if(icode.eq.1) then !update flow
658*59599516SKenneth E. Jansen                     call itrCorrect ( y,    ac,    u,   solinc, iBC)
659*59599516SKenneth E. Jansen                     call itrBC (y,  ac,  iBC,  BC, iper, ilwork)
660*59599516SKenneth E. Jansen                  else  ! update scalar
661*59599516SKenneth E. Jansen                     isclr=iupdate  !unless
662*59599516SKenneth E. Jansen                     if(icode.eq.6) isclr=0
663*59599516SKenneth E. Jansen                     if(iRANS.lt.-100)then  ! RANS
664*59599516SKenneth E. Jansen                        call itrCorrectSclrPos(y,ac,solinc(1,isclr+5))
665*59599516SKenneth E. Jansen                     else
666*59599516SKenneth E. Jansen                        call itrCorrectSclr (y, ac, solinc(1,isclr+5))
667*59599516SKenneth E. Jansen                     endif
668*59599516SKenneth E. Jansen                     if (ilset.eq.2 .and. isclr.eq.2)  then
669*59599516SKenneth E. Jansen                        if (ivconstraint .eq. 1) then
670*59599516SKenneth E. Jansen                           call itrBCSclr (  y,  ac,  iBC,  BC, iper,
671*59599516SKenneth E. Jansen     &                          ilwork)
672*59599516SKenneth E. Jansenc
673*59599516SKenneth E. Jansenc ... applying the volume constraint on second level set scalar
674*59599516SKenneth E. Jansenc
675*59599516SKenneth E. Jansen                           call solvecon (y,    x,      iBC,  BC,
676*59599516SKenneth E. Jansen     &                          iper, ilwork, shp,  shgl)
677*59599516SKenneth E. Jansenc
678*59599516SKenneth E. Jansen                        endif   ! end of volume constraint calculations
679*59599516SKenneth E. Jansen                     endif      ! end of redistance calculations
680*59599516SKenneth E. Jansenc
681*59599516SKenneth E. Jansen                        call itrBCSclr (  y,  ac,  iBC,  BC, iper,
682*59599516SKenneth E. Jansen     &                       ilwork)
683*59599516SKenneth E. Jansen                     endif      ! end of flow or scalar update
684*59599516SKenneth E. Jansen                  endif         ! end of switch between solve or update
685*59599516SKenneth E. Jansen               enddo            ! loop over sequence in step
686*59599516SKenneth E. Jansenc
687*59599516SKenneth E. Jansenc
688*59599516SKenneth E. Jansenc.... obtain the time average statistics
689*59599516SKenneth E. Jansenc
690*59599516SKenneth E. Jansen            if (ioform .eq. 2) then
691*59599516SKenneth E. Jansen
692*59599516SKenneth E. Jansen               call stsGetStats( y,      yold,     ac,     acold,
693*59599516SKenneth E. Jansen     &                           u,      uold,     x,
694*59599516SKenneth E. Jansen     &                           shp,    shgl,     shpb,   shglb,
695*59599516SKenneth E. Jansen     &                           iBC,    BC,       iper,   ilwork,
696*59599516SKenneth E. Jansen     &                           rowp,   colm,     lhsK,   lhsP )
697*59599516SKenneth E. Jansen            endif
698*59599516SKenneth E. Jansen
699*59599516SKenneth E. Jansenc
700*59599516SKenneth E. Jansenc  Find the solution at the end of the timestep and move it to old
701*59599516SKenneth E. Jansenc
702*59599516SKenneth E. Jansenc
703*59599516SKenneth E. Jansenc ...First to reassign the parameters for the original time integrator scheme
704*59599516SKenneth E. Jansenc
705*59599516SKenneth E. Jansen            if((iLSet.eq.2).and.(ilss.eq.1)) then
706*59599516SKenneth E. Jansen               alfi =alfit
707*59599516SKenneth E. Jansen               gami =gamit
708*59599516SKenneth E. Jansen               almi =almit
709*59599516SKenneth E. Jansen               Delt(1)=Deltt
710*59599516SKenneth E. Jansen               Dtgl =Dtglt
711*59599516SKenneth E. Jansen            endif
712*59599516SKenneth E. Jansen            call itrUpdate( yold,  acold,   uold,  y,    ac,   u)
713*59599516SKenneth E. Jansen            call itrBC (yold, acold,  iBC,  BC,  iper,ilwork)
714*59599516SKenneth E. Jansen
715*59599516SKenneth E. Jansen            istep = istep + 1
716*59599516SKenneth E. Jansen            lstep = lstep + 1
717*59599516SKenneth E. Jansenc
718*59599516SKenneth E. Jansenc ..  Print memory consumption on BGQ
719*59599516SKenneth E. Jansenc
720*59599516SKenneth E. Jansen            call printmeminfo("itrdrv"//char(0))
721*59599516SKenneth E. Jansen
722*59599516SKenneth E. Jansenc
723*59599516SKenneth E. Jansenc ..  Compute vorticity
724*59599516SKenneth E. Jansenc
725*59599516SKenneth E. Jansen            if ( icomputevort == 1) then
726*59599516SKenneth E. Jansen
727*59599516SKenneth E. Jansen              ! vorticity components and magnitude
728*59599516SKenneth E. Jansen              vorticity(:,1) = GradV(:,8)-GradV(:,6) !omega_x
729*59599516SKenneth E. Jansen              vorticity(:,2) = GradV(:,3)-GradV(:,7) !omega_y
730*59599516SKenneth E. Jansen              vorticity(:,3) = GradV(:,4)-GradV(:,2) !omega_z
731*59599516SKenneth E. Jansen              vorticity(:,4) = sqrt(   vorticity(:,1)*vorticity(:,1)
732*59599516SKenneth E. Jansen     &                               + vorticity(:,2)*vorticity(:,2)
733*59599516SKenneth E. Jansen     &                               + vorticity(:,3)*vorticity(:,3) )
734*59599516SKenneth E. Jansen              ! Q
735*59599516SKenneth E. Jansen              strain(:,1) = GradV(:,1)                  !S11
736*59599516SKenneth E. Jansen              strain(:,2) = 0.5*(GradV(:,2)+GradV(:,4)) !S12
737*59599516SKenneth E. Jansen              strain(:,3) = 0.5*(GradV(:,3)+GradV(:,7)) !S13
738*59599516SKenneth E. Jansen              strain(:,4) = GradV(:,5)                  !S22
739*59599516SKenneth E. Jansen              strain(:,5) = 0.5*(GradV(:,6)+GradV(:,8)) !S23
740*59599516SKenneth E. Jansen              strain(:,6) = GradV(:,9)                  !S33
741*59599516SKenneth E. Jansen
742*59599516SKenneth E. Jansen              vorticity(:,5) = 0.25*( vorticity(:,4)*vorticity(:,4)  !Q
743*59599516SKenneth E. Jansen     &                            - 2.0*(      strain(:,1)*strain(:,1)
744*59599516SKenneth E. Jansen     &                                    + 2* strain(:,2)*strain(:,2)
745*59599516SKenneth E. Jansen     &                                    + 2* strain(:,3)*strain(:,3)
746*59599516SKenneth E. Jansen     &                                    +    strain(:,4)*strain(:,4)
747*59599516SKenneth E. Jansen     &                                    + 2* strain(:,5)*strain(:,5)
748*59599516SKenneth E. Jansen     &                                    +    strain(:,6)*strain(:,6)))
749*59599516SKenneth E. Jansen
750*59599516SKenneth E. Jansen            endif
751*59599516SKenneth E. Jansen
752*59599516SKenneth E. Jansenc
753*59599516SKenneth E. Jansenc .. write out the solution
754*59599516SKenneth E. Jansenc
755*59599516SKenneth E. Jansen!MR CHANGE
756*59599516SKenneth E. Jansen
757*59599516SKenneth E. Jansen!             if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or.
758*59599516SKenneth E. Jansen!      &          lstep.eq.nstep(itseq)) then
759*59599516SKenneth E. Jansen            if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or.
760*59599516SKenneth E. Jansen     &          istep.eq.nstep(itseq)) then
761*59599516SKenneth E. Jansen!MR CHANGE END
762*59599516SKenneth E. Jansen
763*59599516SKenneth E. Jansen!              Call to restar() will open restart file in write mode (and not append mode)
764*59599516SKenneth E. Jansen!              that is needed as other fields are written in append mode
765*59599516SKenneth E. Jansen               call restar ('out ',  yold  ,ac)
766*59599516SKenneth E. Jansen               if(ideformwall == 1) then
767*59599516SKenneth E. Jansen                  call write_displ(myrank, lstep, nshg, 3, uold )
768*59599516SKenneth E. Jansen               endif
769*59599516SKenneth E. Jansen
770*59599516SKenneth E. Jansen               if(ivort == 1) then
771*59599516SKenneth E. Jansen                 call write_field(myrank,'a','vorticity',9,vorticity,
772*59599516SKenneth E. Jansen     &                       'd',nshg,5,lstep)
773*59599516SKenneth E. Jansen               endif
774*59599516SKenneth E. Jansen!MR CHANGE
775*59599516SKenneth E. Jansen!               if(ioybar.eq.1) then
776*59599516SKenneth E. Jansen!                 call write_field(myrank,'a','ybar',4,
777*59599516SKenneth E. Jansen!     &                    ybar,'d',nshg,13,lstep)
778*59599516SKenneth E. Jansen!                 call write_field(myrank,'a','ybar',4,
779*59599516SKenneth E. Jansen!     &                    ybar,'d',nshg,12,lstep)
780*59599516SKenneth E. Jansen!               endif
781*59599516SKenneth E. Jansen
782*59599516SKenneth E. Jansen               call printmeminfo("itrdrv after checkpoint"//char(0))
783*59599516SKenneth E. Jansen!MR CHANGE END
784*59599516SKenneth E. Jansen
785*59599516SKenneth E. Jansen            endif
786*59599516SKenneth E. Jansen
787*59599516SKenneth E. Jansenc
788*59599516SKenneth E. Jansenc ... update the flow history for the impedance convolution, filter it and write it out
789*59599516SKenneth E. Jansenc
790*59599516SKenneth E. Jansen            if(numImpSrfs.gt.zero) then
791*59599516SKenneth E. Jansen               call UpdHistConv(y,nsrflistImp,numImpSrfs) !uses Delt(1)
792*59599516SKenneth E. Jansen            endif
793*59599516SKenneth E. Jansen
794*59599516SKenneth E. Jansenc
795*59599516SKenneth E. Jansenc ... update the flow history for the RCR convolution
796*59599516SKenneth E. Jansenc
797*59599516SKenneth E. Jansen            if(numRCRSrfs.gt.zero) then
798*59599516SKenneth E. Jansen               call UpdHistConv(y,nsrflistRCR,numRCRSrfs) !uses lstep
799*59599516SKenneth E. Jansen            endif
800*59599516SKenneth E. Jansen
801*59599516SKenneth E. Jansenc
802*59599516SKenneth E. Jansenc.... compute the consistent boundary flux
803*59599516SKenneth E. Jansenc
804*59599516SKenneth E. Jansen            if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
805*59599516SKenneth E. Jansen               call Bflux ( yold,      acold,      uold,    x,
806*59599516SKenneth E. Jansen     &                      shp,       shgl,       shpb,
807*59599516SKenneth E. Jansen     &                      shglb,     ilwork,     iBC,
808*59599516SKenneth E. Jansen     &                      BC,        iper,       wallssVec)
809*59599516SKenneth E. Jansen            endif
810*59599516SKenneth E. Jansen
811*59599516SKenneth E. Jansenc...  dump TIME SERIES
812*59599516SKenneth E. Jansen
813*59599516SKenneth E. Jansen            if (exts) then
814*59599516SKenneth E. Jansen               if (mod(lstep-1,freq).eq.0) then
815*59599516SKenneth E. Jansen
816*59599516SKenneth E. Jansen                  if (numpe > 1) then
817*59599516SKenneth E. Jansen                     do jj = 1, ntspts
818*59599516SKenneth E. Jansen                        vartssoln((jj-1)*ndof+1:jj*ndof)=varts(jj,:)
819*59599516SKenneth E. Jansen                        ivarts=zero
820*59599516SKenneth E. Jansen                     enddo
821*59599516SKenneth E. Jansen                     do k=1,ndof*ntspts
822*59599516SKenneth E. Jansen                        if(vartssoln(k).ne.zero) ivarts(k)=1
823*59599516SKenneth E. Jansen                     enddo
824*59599516SKenneth E. Jansen
825*59599516SKenneth E. Jansen!                     call MPI_REDUCE(vartssoln, vartssolng, ndof*ntspts,
826*59599516SKenneth E. Jansen!     &                    MPI_DOUBLE_PRECISION, MPI_SUM, master,
827*59599516SKenneth E. Jansen!     &                    MPI_COMM_WORLD, ierr)
828*59599516SKenneth E. Jansen
829*59599516SKenneth E. Jansen                     call MPI_BARRIER(MPI_COMM_WORLD, ierr)
830*59599516SKenneth E. Jansen                     call MPI_ALLREDUCE(vartssoln, vartssolng,
831*59599516SKenneth E. Jansen     &                    ndof*ntspts,
832*59599516SKenneth E. Jansen     &                    MPI_DOUBLE_PRECISION, MPI_SUM,
833*59599516SKenneth E. Jansen     &                    MPI_COMM_WORLD, ierr)
834*59599516SKenneth E. Jansen
835*59599516SKenneth E. Jansen!                     call MPI_REDUCE(ivarts, ivartsg, ndof*ntspts,
836*59599516SKenneth E. Jansen!     &                    MPI_INTEGER, MPI_SUM, master,
837*59599516SKenneth E. Jansen!     &                    MPI_COMM_WORLD, ierr)
838*59599516SKenneth E. Jansen
839*59599516SKenneth E. Jansen                     call MPI_BARRIER(MPI_COMM_WORLD, ierr)
840*59599516SKenneth E. Jansen                     call MPI_ALLREDUCE(ivarts, ivartsg, ndof*ntspts,
841*59599516SKenneth E. Jansen     &                    MPI_INTEGER, MPI_SUM,
842*59599516SKenneth E. Jansen     &                    MPI_COMM_WORLD, ierr)
843*59599516SKenneth E. Jansen
844*59599516SKenneth E. Jansen!                     if (myrank.eq.zero) then
845*59599516SKenneth E. Jansen                     do jj = 1, ntspts
846*59599516SKenneth E. Jansen
847*59599516SKenneth E. Jansen                        if(myrank .eq. iv_rank(jj)) then
848*59599516SKenneth E. Jansen                           ! No need to update all varts components, only the one treated by the expected rank
849*59599516SKenneth E. Jansen                           ! Note: keep varts as a vector, as multiple probes could be treated by one rank
850*59599516SKenneth E. Jansen                           indxvarts = (jj-1)*ndof
851*59599516SKenneth E. Jansen                           do k=1,ndof
852*59599516SKenneth E. Jansen                              if(ivartsg(indxvarts+k).ne.0) then ! none of the vartssoln(parts) were non zero
853*59599516SKenneth E. Jansen                                 varts(jj,k)=vartssolng(indxvarts+k)/
854*59599516SKenneth E. Jansen     &                                             ivartsg(indxvarts+k)
855*59599516SKenneth E. Jansen                              endif
856*59599516SKenneth E. Jansen                           enddo
857*59599516SKenneth E. Jansen                       endif !only if myrank eq iv_rank(jj)
858*59599516SKenneth E. Jansen                     enddo
859*59599516SKenneth E. Jansen!                     endif !only on master
860*59599516SKenneth E. Jansen                  endif !only if numpe > 1
861*59599516SKenneth E. Jansen
862*59599516SKenneth E. Jansen!                  if (myrank.eq.zero) then
863*59599516SKenneth E. Jansen                  do jj = 1, ntspts
864*59599516SKenneth E. Jansen                     if(myrank .eq. iv_rank(jj)) then
865*59599516SKenneth E. Jansen                        ifile = 1000+jj
866*59599516SKenneth E. Jansen                        write(ifile,555) lstep, (varts(jj,k),k=1,ndof) !Beware of format 555 - check ndof
867*59599516SKenneth E. Jansenc                        call flush(ifile)
868*59599516SKenneth E. Jansen                        if (((irs .ge. 1) .and.
869*59599516SKenneth E. Jansen     &                       (mod(lstep, ntout) .eq. 0))) then
870*59599516SKenneth E. Jansen                           close(ifile)
871*59599516SKenneth E. Jansen                           fvarts='varts/varts'
872*59599516SKenneth E. Jansen                           fvarts=trim(fvarts)//trim(cname2(jj))
873*59599516SKenneth E. Jansen                           fvarts=trim(fvarts)//trim(cname2(lskeep))
874*59599516SKenneth E. Jansen                           fvarts=trim(fvarts)//'.dat'
875*59599516SKenneth E. Jansen                           fvarts=trim(fvarts)
876*59599516SKenneth E. Jansen                           open(unit=ifile, file=fvarts,
877*59599516SKenneth E. Jansen     &                          position='append')
878*59599516SKenneth E. Jansen                        endif !only when dumping restart
879*59599516SKenneth E. Jansen                     endif
880*59599516SKenneth E. Jansen                  enddo
881*59599516SKenneth E. Jansen!                  endif !only on master
882*59599516SKenneth E. Jansen
883*59599516SKenneth E. Jansen                  varts(:,:) = zero ! reset the array for next step
884*59599516SKenneth E. Jansen
885*59599516SKenneth E. Jansen
886*59599516SKenneth E. Jansen!555              format(i6,5(2x,E12.5e2))
887*59599516SKenneth E. Jansen555               format(i6,6(2x,E20.12e2)) !assuming ndof = 6 here
888*59599516SKenneth E. Jansen
889*59599516SKenneth E. Jansen               endif
890*59599516SKenneth E. Jansen            endif
891*59599516SKenneth E. Jansen
892*59599516SKenneth E. Jansenc
893*59599516SKenneth E. Jansenc.... update and the aerodynamic forces
894*59599516SKenneth E. Jansenc
895*59599516SKenneth E. Jansen            call forces ( yold,  ilwork )
896*59599516SKenneth E. Jansen
897*59599516SKenneth E. Jansen            if((irscale.ge.0).or.(itwmod.gt.0))
898*59599516SKenneth E. Jansen     &           call getvel (yold,     ilwork, iBC,
899*59599516SKenneth E. Jansen     &                        nsons,    ifath, velbar)
900*59599516SKenneth E. Jansen
901*59599516SKenneth E. Jansen            if((irscale.ge.0).and.(myrank.eq.master)) then
902*59599516SKenneth E. Jansen               call genscale(yold,       x,       iper,
903*59599516SKenneth E. Jansen     &                       iBC,     ifath,   velbar,
904*59599516SKenneth E. Jansen     &                       nsons)
905*59599516SKenneth E. Jansen            endif
906*59599516SKenneth E. Jansenc
907*59599516SKenneth E. Jansenc....  print out results.
908*59599516SKenneth E. Jansenc
909*59599516SKenneth E. Jansen            ntoutv=max(ntout,100)   ! velb is not needed so often
910*59599516SKenneth E. Jansen            if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then
911*59599516SKenneth E. Jansen               if( (mod(lstep, ntoutv) .eq. 0) .and.
912*59599516SKenneth E. Jansen     &              ((irscale.ge.0).or.(itwmod.gt.0) .or.
913*59599516SKenneth E. Jansen     &              ((nsonmax.eq.1).and.(iLES.gt.0))))
914*59599516SKenneth E. Jansen     &              call rwvelb  ('out ',  velbar  ,ifail)
915*59599516SKenneth E. Jansen            endif
916*59599516SKenneth E. Jansenc
917*59599516SKenneth E. Jansenc.... end of the NSTEP and NTSEQ loops
918*59599516SKenneth E. Jansenc
919*59599516SKenneth E. Jansen
920*59599516SKenneth E. Jansen
921*59599516SKenneth E. Jansenc
922*59599516SKenneth E. Jansenc.... -------------------> error calculation  <-----------------
923*59599516SKenneth E. Jansenc
924*59599516SKenneth E. Jansen            if(ierrcalc.eq.1 .or. ioybar.eq.1) then
925*59599516SKenneth E. Jansenc$$$c
926*59599516SKenneth E. Jansenc$$$c compute average
927*59599516SKenneth E. Jansenc$$$c
928*59599516SKenneth E. Jansenc$$$               tfact=one/istep
929*59599516SKenneth E. Jansenc$$$               ybar =tfact*yold + (one-tfact)*ybar
930*59599516SKenneth E. Jansen
931*59599516SKenneth E. Jansenc compute average
932*59599516SKenneth E. Jansenc ybar(:,1:3) are average velocity components
933*59599516SKenneth E. Jansenc ybar(:,4) is average pressure
934*59599516SKenneth E. Jansenc ybar(:,5) is average speed
935*59599516SKenneth E. Jansenc ybar(:,6:8) is average of sq. of each vel. component
936*59599516SKenneth E. Jansenc ybar(:,9) is average of sq. of pressure
937*59599516SKenneth E. Jansenc ybar(:,10:12) is average of cross vel. components : uv, uw and vw
938*59599516SKenneth E. Jansenc averaging procedure justified only for identical time step sizes
939*59599516SKenneth E. Jansenc ybar(:,13) is average of eddy viscosity
940*59599516SKenneth E. Jansenc ybar(:,14:16) is average vorticity components
941*59599516SKenneth E. Jansenc ybar(:,17) is average vorticity magnitude
942*59599516SKenneth E. Jansenc istep is number of time step
943*59599516SKenneth E. Jansenc
944*59599516SKenneth E. Jansen               icollectybar = 0
945*59599516SKenneth E. Jansen          if(nphasesincycle.eq.0 .or.
946*59599516SKenneth E. Jansen     &            istep.gt.ncycles_startphaseavg*nstepsincycle) then
947*59599516SKenneth E. Jansen                 icollectybar = 1
948*59599516SKenneth E. Jansen                  if((istep-1).eq.ncycles_startphaseavg*nstepsincycle)
949*59599516SKenneth E. Jansen     &               istepsinybar = 0 ! init. to zero in first cycle in avg.
950*59599516SKenneth E. Jansen               endif
951*59599516SKenneth E. Jansen
952*59599516SKenneth E. Jansen               if(icollectybar.eq.1) then
953*59599516SKenneth E. Jansen                  istepsinybar = istepsinybar+1
954*59599516SKenneth E. Jansen                  tfact=one/istepsinybar
955*59599516SKenneth E. Jansen
956*59599516SKenneth E. Jansen                  if(myrank.eq.master .and. nphasesincycle.ne.0 .and.
957*59599516SKenneth E. Jansen     &               mod((istep-1),nstepsincycle).eq.0)
958*59599516SKenneth E. Jansen     &               write(*,*)'nsamples in phase average:',istepsinybar
959*59599516SKenneth E. Jansen
960*59599516SKenneth E. Jansenc ybar to contain the averaged ((u,v,w),p)-fields
961*59599516SKenneth E. Jansenc and speed average, i.e., sqrt(u^2+v^2+w^2)
962*59599516SKenneth E. Jansenc and avg. of sq. terms including
963*59599516SKenneth E. Jansenc u^2, v^2, w^2, p^2 and cross terms of uv, uw and vw
964*59599516SKenneth E. Jansen
965*59599516SKenneth E. Jansen                  ybar(:,1) = tfact*yold(:,1) + (one-tfact)*ybar(:,1)
966*59599516SKenneth E. Jansen                  ybar(:,2) = tfact*yold(:,2) + (one-tfact)*ybar(:,2)
967*59599516SKenneth E. Jansen                  ybar(:,3) = tfact*yold(:,3) + (one-tfact)*ybar(:,3)
968*59599516SKenneth E. Jansen                  ybar(:,4) = tfact*yold(:,4) + (one-tfact)*ybar(:,4)
969*59599516SKenneth E. Jansen                  ybar(:,5) = tfact*sqrt(yold(:,1)**2+yold(:,2)**2+
970*59599516SKenneth E. Jansen     &                        yold(:,3)**2) + (one-tfact)*ybar(:,5)
971*59599516SKenneth E. Jansen                  ybar(:,6) = tfact*yold(:,1)**2 +
972*59599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,6)
973*59599516SKenneth E. Jansen                  ybar(:,7) = tfact*yold(:,2)**2 +
974*59599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,7)
975*59599516SKenneth E. Jansen                  ybar(:,8) = tfact*yold(:,3)**2 +
976*59599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,8)
977*59599516SKenneth E. Jansen                  ybar(:,9) = tfact*yold(:,4)**2 +
978*59599516SKenneth E. Jansen     &                        (one-tfact)*ybar(:,9)
979*59599516SKenneth E. Jansen                  ybar(:,10) = tfact*yold(:,1)*yold(:,2) + !uv
980*59599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,10)
981*59599516SKenneth E. Jansen                  ybar(:,11) = tfact*yold(:,1)*yold(:,3) + !uw
982*59599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,11)
983*59599516SKenneth E. Jansen                  ybar(:,12) = tfact*yold(:,2)*yold(:,3) + !vw
984*59599516SKenneth E. Jansen     &                         (one-tfact)*ybar(:,12)
985*59599516SKenneth E. Jansen!MR CHANGE
986*59599516SKenneth E. Jansen                  if(nsclr.gt.0) !nut
987*59599516SKenneth E. Jansen     &             ybar(:,13) = tfact*yold(:,6) + (one-tfact)*ybar(:,13)
988*59599516SKenneth E. Jansen
989*59599516SKenneth E. Jansen                  if(ivort == 1) then !vorticity
990*59599516SKenneth E. Jansen                    ybar(:,14) = tfact*vorticity(:,1) +
991*59599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,14)
992*59599516SKenneth E. Jansen                    ybar(:,15) = tfact*vorticity(:,2) +
993*59599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,15)
994*59599516SKenneth E. Jansen                    ybar(:,16) = tfact*vorticity(:,3) +
995*59599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,16)
996*59599516SKenneth E. Jansen                    ybar(:,17) = tfact*vorticity(:,4) +
997*59599516SKenneth E. Jansen     &                           (one-tfact)*ybar(:,17)
998*59599516SKenneth E. Jansen                  endif
999*59599516SKenneth E. Jansen
1000*59599516SKenneth E. Jansen                  if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
1001*59599516SKenneth E. Jansen                    wallssVecBar(:,1) = tfact*wallssVec(:,1)
1002*59599516SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,1)
1003*59599516SKenneth E. Jansen                    wallssVecBar(:,2) = tfact*wallssVec(:,2)
1004*59599516SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,2)
1005*59599516SKenneth E. Jansen                    wallssVecBar(:,3) = tfact*wallssVec(:,3)
1006*59599516SKenneth E. Jansen     &                                  +(one-tfact)*wallssVecBar(:,3)
1007*59599516SKenneth E. Jansen                  endif
1008*59599516SKenneth E. Jansen!MR CHANGE END
1009*59599516SKenneth E. Jansen               endif
1010*59599516SKenneth E. Jansenc
1011*59599516SKenneth E. Jansenc compute phase average
1012*59599516SKenneth E. Jansenc
1013*59599516SKenneth E. Jansen               if(nphasesincycle.ne.0 .and.
1014*59599516SKenneth E. Jansen     &            istep.gt.ncycles_startphaseavg*nstepsincycle) then
1015*59599516SKenneth E. Jansen
1016*59599516SKenneth E. Jansenc beginning of cycle is considered as ncycles_startphaseavg*nstepsincycle+1
1017*59599516SKenneth E. Jansen                  if((istep-1).eq.ncycles_startphaseavg*nstepsincycle)
1018*59599516SKenneth E. Jansen     &               icyclesinavg = 0 ! init. to zero in first cycle in avg.
1019*59599516SKenneth E. Jansen
1020*59599516SKenneth E. Jansen                  ! find number of steps between phases
1021*59599516SKenneth E. Jansen                  nstepsbtwphase = nstepsincycle/nphasesincycle ! integer value
1022*59599516SKenneth E. Jansen                  if(mod(istep-1,nstepsincycle).eq.0) then
1023*59599516SKenneth E. Jansen                     iphase = 1 ! init. to one in beginning of every cycle
1024*59599516SKenneth E. Jansen                     icyclesinavg = icyclesinavg + 1
1025*59599516SKenneth E. Jansen                  endif
1026*59599516SKenneth E. Jansen
1027*59599516SKenneth E. Jansen                  icollectphase = 0
1028*59599516SKenneth E. Jansen                  istepincycle = mod(istep,nstepsincycle)
1029*59599516SKenneth E. Jansen                  if(istepincycle.eq.0) istepincycle=nstepsincycle
1030*59599516SKenneth E. Jansen                  if(istepincycle.eq.iphase*nstepsbtwphase) then
1031*59599516SKenneth E. Jansen                     icollectphase = 1
1032*59599516SKenneth E. Jansen                     iphase = iphase+1 ! use 'iphase-1' below
1033*59599516SKenneth E. Jansen                  endif
1034*59599516SKenneth E. Jansen
1035*59599516SKenneth E. Jansen                  if(icollectphase.eq.1) then
1036*59599516SKenneth E. Jansen                     tfactphase = one/icyclesinavg
1037*59599516SKenneth E. Jansen
1038*59599516SKenneth E. Jansen                     if(myrank.eq.master) then
1039*59599516SKenneth E. Jansen                       write(*,*) 'nsamples in phase ',iphase-1,': ',
1040*59599516SKenneth E. Jansen     &                             icyclesinavg
1041*59599516SKenneth E. Jansen                     endif
1042*59599516SKenneth E. Jansen
1043*59599516SKenneth E. Jansen                     yphbar(:,1,iphase-1) = tfactphase*yold(:,1) +
1044*59599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,1,iphase-1)
1045*59599516SKenneth E. Jansen                     yphbar(:,2,iphase-1) = tfactphase*yold(:,2) +
1046*59599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,2,iphase-1)
1047*59599516SKenneth E. Jansen                     yphbar(:,3,iphase-1) = tfactphase*yold(:,3) +
1048*59599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,3,iphase-1)
1049*59599516SKenneth E. Jansen                     yphbar(:,4,iphase-1) = tfactphase*yold(:,4) +
1050*59599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,4,iphase-1)
1051*59599516SKenneth E. Jansen                     yphbar(:,5,iphase-1) = tfactphase*sqrt(yold(:,1)**2
1052*59599516SKenneth E. Jansen     &                          +yold(:,2)**2+yold(:,3)**2) +
1053*59599516SKenneth E. Jansen     &                          (one-tfactphase)*yphbar(:,5,iphase-1)
1054*59599516SKenneth E. Jansen!MR CHANGE
1055*59599516SKenneth E. Jansen                     yphbar(:,6,iphase-1) =
1056*59599516SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,1)
1057*59599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,6,iphase-1)
1058*59599516SKenneth E. Jansen
1059*59599516SKenneth E. Jansen                     yphbar(:,7,iphase-1) =
1060*59599516SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,2)
1061*59599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,7,iphase-1)
1062*59599516SKenneth E. Jansen
1063*59599516SKenneth E. Jansen                     yphbar(:,8,iphase-1) =
1064*59599516SKenneth E. Jansen     &                              tfactphase*yold(:,1)*yold(:,3)
1065*59599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,8,iphase-1)
1066*59599516SKenneth E. Jansen
1067*59599516SKenneth E. Jansen                     yphbar(:,9,iphase-1) =
1068*59599516SKenneth E. Jansen     &                              tfactphase*yold(:,2)*yold(:,2)
1069*59599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,9,iphase-1)
1070*59599516SKenneth E. Jansen
1071*59599516SKenneth E. Jansen                     yphbar(:,10,iphase-1) =
1072*59599516SKenneth E. Jansen     &                              tfactphase*yold(:,2)*yold(:,3)
1073*59599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,10,iphase-1)
1074*59599516SKenneth E. Jansen
1075*59599516SKenneth E. Jansen                     yphbar(:,11,iphase-1) =
1076*59599516SKenneth E. Jansen     &                              tfactphase*yold(:,3)*yold(:,3)
1077*59599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,11,iphase-1)
1078*59599516SKenneth E. Jansen
1079*59599516SKenneth E. Jansen                     if(ivort == 1) then
1080*59599516SKenneth E. Jansen                       yphbar(:,12,iphase-1) =
1081*59599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,1)
1082*59599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,12,iphase-1)
1083*59599516SKenneth E. Jansen                       yphbar(:,13,iphase-1) =
1084*59599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,2)
1085*59599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,13,iphase-1)
1086*59599516SKenneth E. Jansen                       yphbar(:,14,iphase-1) =
1087*59599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,3)
1088*59599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,14,iphase-1)
1089*59599516SKenneth E. Jansen                       yphbar(:,15,iphase-1) =
1090*59599516SKenneth E. Jansen     &                              tfactphase*vorticity(:,4)
1091*59599516SKenneth E. Jansen     &                           +(one-tfactphase)*yphbar(:,15,iphase-1)
1092*59599516SKenneth E. Jansen                    endif
1093*59599516SKenneth E. Jansen!MR CHANGE END
1094*59599516SKenneth E. Jansen                  endif
1095*59599516SKenneth E. Jansen               endif
1096*59599516SKenneth E. Jansenc
1097*59599516SKenneth E. Jansenc compute rms
1098*59599516SKenneth E. Jansenc
1099*59599516SKenneth E. Jansen               if(icollectybar.eq.1) then
1100*59599516SKenneth E. Jansen                  rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2
1101*59599516SKenneth E. Jansen                  rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2
1102*59599516SKenneth E. Jansen                  rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2
1103*59599516SKenneth E. Jansen                  rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2
1104*59599516SKenneth E. Jansen               endif
1105*59599516SKenneth E. Jansen            endif
1106*59599516SKenneth E. Jansen
1107*59599516SKenneth E. Jansen            if(istop.eq.1000) exit ! stop when delta small (see rstatic)
1108*59599516SKenneth E. Jansen 2000    continue
1109*59599516SKenneth E. Jansen 2001    continue
1110*59599516SKenneth E. Jansen
1111*59599516SKenneth E. Jansen
1112*59599516SKenneth E. JansenCAD         tcorecp2 = second(0)
1113*59599516SKenneth E. JansenCAD         tcorewc2 = second(-1)
1114*59599516SKenneth E. Jansen
1115*59599516SKenneth E. JansenCAD         write(6,*) 'T(core) cpu-wallclock = ',tcorecp2-tcorecp1,
1116*59599516SKenneth E. JansenCAD     &                                        tcorewc2-tcorewc1
1117*59599516SKenneth E. Jansen
1118*59599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1119*59599516SKenneth E. Jansen         if(myrank.eq.0)  then
1120*59599516SKenneth E. Jansen            tcorecp2 = TMRC()
1121*59599516SKenneth E. Jansen             write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1
1122*59599516SKenneth E. Jansen             write(6,*) '(Elm. form.',tcorecp(1),
1123*59599516SKenneth E. Jansen     &                    ',Lin. alg. sol.',tcorecp(2),')'
1124*59599516SKenneth E. Jansen             write(6,*) '(Elm. form. Scal.',tcorecpscal(1),
1125*59599516SKenneth E. Jansen     &                   ',Lin. alg. sol. Scal.',tcorecpscal(2),')'
1126*59599516SKenneth E. Jansen             write(6,*) ''
1127*59599516SKenneth E. Jansen
1128*59599516SKenneth E. Jansen         endif
1129*59599516SKenneth E. Jansen
1130*59599516SKenneth E. Jansen         call print_system_stats(tcorecp, tcorecpscal)
1131*59599516SKenneth E. Jansen         call print_mesh_stats()
1132*59599516SKenneth E. Jansen         call print_mpi_stats()
1133*59599516SKenneth E. Jansen         if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1134*59599516SKenneth E. Jansen!         return
1135*59599516SKenneth E. Jansenc         call MPI_Finalize()
1136*59599516SKenneth E. Jansenc         call MPI_ABORT(MPI_COMM_WORLD, ierr)
1137*59599516SKenneth E. Jansen
1138*59599516SKenneth E. Jansen 3000 continue
1139*59599516SKenneth E. Jansen
1140*59599516SKenneth E. Jansenc
1141*59599516SKenneth E. Jansenc.... ---------------------->  Post Processing  <----------------------
1142*59599516SKenneth E. Jansenc
1143*59599516SKenneth E. Jansenc.... print out the last step
1144*59599516SKenneth E. Jansenc
1145*59599516SKenneth E. Jansen      if ((irs .ge. 1) .and. ((mod(lstep, ntout) .ne. 0) .or.
1146*59599516SKenneth E. Jansen     &     (nstp .eq. 0))) then
1147*59599516SKenneth E. Jansen         if(
1148*59599516SKenneth E. Jansen     &              ((irscale.ge.0).or.(itwmod.gt.0) .or.
1149*59599516SKenneth E. Jansen     &              ((nsonmax.eq.1).and.iLES.gt.0)))
1150*59599516SKenneth E. Jansen     &              call rwvelb  ('out ',  velbar  ,ifail)
1151*59599516SKenneth E. Jansen      endif
1152*59599516SKenneth E. Jansen
1153*59599516SKenneth E. Jansen
1154*59599516SKenneth E. Jansen         lesId   = numeqns(1)
1155*59599516SKenneth E. Jansen
1156*59599516SKenneth E. Jansen!MR CHANGE
1157*59599516SKenneth E. Jansen          if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1158*59599516SKenneth E. Jansen          if(myrank.eq.0)  then
1159*59599516SKenneth E. Jansen            tcormr1 = TMRC()
1160*59599516SKenneth E. Jansen          endif
1161*59599516SKenneth E. Jansen!MR CHANGE END
1162*59599516SKenneth E. Jansen
1163*59599516SKenneth E. Jansen         call saveLesRestart( lesId,  aperm , nshg, myrank, lstep,
1164*59599516SKenneth E. Jansen     &                        nPermDims )
1165*59599516SKenneth E. Jansen
1166*59599516SKenneth E. Jansen!MR CHANGE
1167*59599516SKenneth E. Jansen        if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1168*59599516SKenneth E. Jansen        if(myrank.eq.0)  then
1169*59599516SKenneth E. Jansen          tcormr2 = TMRC()
1170*59599516SKenneth E. Jansen          write(6,*) 'Time to call saveLesRestart for projection and'//
1171*59599516SKenneth E. Jansen     &               'pressure projection vectors', tcormr2-tcormr1
1172*59599516SKenneth E. Jansen        endif
1173*59599516SKenneth E. Jansen!MR CHANGE END
1174*59599516SKenneth E. Jansen
1175*59599516SKenneth E. Jansen
1176*59599516SKenneth E. Jansen      if(ierrcalc.eq.1) then
1177*59599516SKenneth E. Jansenc
1178*59599516SKenneth E. Jansenc.....smooth the error indicators
1179*59599516SKenneth E. Jansenc
1180*59599516SKenneth E. Jansen        do i=1,ierrsmooth
1181*59599516SKenneth E. Jansen            call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC )
1182*59599516SKenneth E. Jansen        end do
1183*59599516SKenneth E. Jansen
1184*59599516SKenneth E. Jansen!MR CHANGE
1185*59599516SKenneth E. Jansen        if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1186*59599516SKenneth E. Jansen        if(myrank.eq.0)  then
1187*59599516SKenneth E. Jansen          tcormr1 = TMRC()
1188*59599516SKenneth E. Jansen        endif
1189*59599516SKenneth E. Jansen!MR CHANGE END
1190*59599516SKenneth E. Jansen
1191*59599516SKenneth E. Jansen         call write_error(myrank, lstep, nshg, 10, rerr )
1192*59599516SKenneth E. Jansen
1193*59599516SKenneth E. Jansen!MR CHANGE
1194*59599516SKenneth E. Jansen        if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1195*59599516SKenneth E. Jansen        if(myrank.eq.0)  then
1196*59599516SKenneth E. Jansen          tcormr2 = TMRC()
1197*59599516SKenneth E. Jansen          write(6,*) 'Time to write the error fields to the disks',
1198*59599516SKenneth E. Jansen     &                tcormr2-tcormr1
1199*59599516SKenneth E. Jansen        endif
1200*59599516SKenneth E. Jansen!MR CHANGE END
1201*59599516SKenneth E. Jansen
1202*59599516SKenneth E. Jansen
1203*59599516SKenneth E. Jansen      endif
1204*59599516SKenneth E. Jansen
1205*59599516SKenneth E. Jansen      if(ioybar.eq.1) then
1206*59599516SKenneth E. Jansen
1207*59599516SKenneth E. Jansen!MR CHANGE
1208*59599516SKenneth E. Jansen!        call write_field(myrank,'a','ybar',4,
1209*59599516SKenneth E. Jansen!     &                    ybar,'d',nshg,12,lstep)
1210*59599516SKenneth E. Jansen         if(ivort == 1) then
1211*59599516SKenneth E. Jansen           call write_field(myrank,'a','ybar',4,
1212*59599516SKenneth E. Jansen     &                      ybar,'d',nshg,17,lstep)
1213*59599516SKenneth E. Jansen         else
1214*59599516SKenneth E. Jansen           call write_field(myrank,'a','ybar',4,
1215*59599516SKenneth E. Jansen     &                    ybar,'d',nshg,13,lstep)
1216*59599516SKenneth E. Jansen         endif
1217*59599516SKenneth E. Jansen         deallocate(ybar)
1218*59599516SKenneth E. Jansen
1219*59599516SKenneth E. Jansen
1220*59599516SKenneth E. Jansen         if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
1221*59599516SKenneth E. Jansen           call write_field(myrank,'a','wssbar',6,
1222*59599516SKenneth E. Jansen     &                 wallssVecBar,'d',nshg,3,lstep)
1223*59599516SKenneth E. Jansen           deallocate(wallssVecbar)
1224*59599516SKenneth E. Jansen         endif
1225*59599516SKenneth E. Jansen
1226*59599516SKenneth E. Jansen!MR CHANGE END
1227*59599516SKenneth E. Jansen        if(nphasesincycle .gt. 0) then
1228*59599516SKenneth E. Jansen
1229*59599516SKenneth E. Jansen          if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1230*59599516SKenneth E. Jansen          if(myrank.eq.0)  then
1231*59599516SKenneth E. Jansen            tcormr1 = TMRC()
1232*59599516SKenneth E. Jansen          endif
1233*59599516SKenneth E. Jansen
1234*59599516SKenneth E. Jansen          do iphase=1,nphasesincycle
1235*59599516SKenneth E. Jansen
1236*59599516SKenneth E. Jansen!           call write_phavg(myrank,'w','phase average',13,iphase,
1237*59599516SKenneth E. Jansen!     &                      yphbar(:,:,iphase),'d',nshg,5,lstep)
1238*59599516SKenneth E. Jansen!           ! ybar field is repeated in files for phase average
1239*59599516SKenneth E. Jansen!           call write_phavg(myrank,'a','ybar',4,iphase,
1240*59599516SKenneth E. Jansen!     &                      ybar(:,1:5),'d',nshg,5,lstep)
1241*59599516SKenneth E. Jansen            if(ivort == 1) then
1242*59599516SKenneth E. Jansen              call write_phavg2(myrank,'a','phase_average',13,iphase,
1243*59599516SKenneth E. Jansen     &             nphasesincycle,yphbar(:,:,iphase),'d',nshg,15,lstep)
1244*59599516SKenneth E. Jansen            else
1245*59599516SKenneth E. Jansen              call write_phavg2(myrank,'a','phase_average',13,iphase,
1246*59599516SKenneth E. Jansen     &             nphasesincycle,yphbar(:,:,iphase),'d',nshg,11,lstep)
1247*59599516SKenneth E. Jansen            endif
1248*59599516SKenneth E. Jansen
1249*59599516SKenneth E. Jansen          end do
1250*59599516SKenneth E. Jansen
1251*59599516SKenneth E. Jansen          if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1252*59599516SKenneth E. Jansen          if(myrank.eq.0)  then
1253*59599516SKenneth E. Jansen              tcormr2 = TMRC()
1254*59599516SKenneth E. Jansen              write(6,*) 'Time to write all phase avg to the disks = ',
1255*59599516SKenneth E. Jansen     &                        tcormr2-tcormr1
1256*59599516SKenneth E. Jansen          endif
1257*59599516SKenneth E. Jansen          deallocate(yphbar)
1258*59599516SKenneth E. Jansen        endif
1259*59599516SKenneth E. Jansen
1260*59599516SKenneth E. Jansen      endif
1261*59599516SKenneth E. Jansen
1262*59599516SKenneth E. Jansen      if(ivort == 1) then
1263*59599516SKenneth E. Jansen         deallocate(strain,vorticity)
1264*59599516SKenneth E. Jansen      endif
1265*59599516SKenneth E. Jansen
1266*59599516SKenneth E. Jansen      if(abs(itwmod).ne.1 .and. iowflux.eq.1) then
1267*59599516SKenneth E. Jansen        deallocate(wallssVec)
1268*59599516SKenneth E. Jansen      endif
1269*59599516SKenneth E. Jansen
1270*59599516SKenneth E. Jansen!MR CHANGE END
1271*59599516SKenneth E. Jansen
1272*59599516SKenneth E. Jansen      if ( ( ihessian .eq. 1 ) .and. ( numpe < 2 )  )then
1273*59599516SKenneth E. Jansen          uhess = zero
1274*59599516SKenneth E. Jansen          gradu = zero
1275*59599516SKenneth E. Jansen          tf = zero
1276*59599516SKenneth E. Jansen
1277*59599516SKenneth E. Jansen          do ku=1,nshg
1278*59599516SKenneth E. Jansenc           tf(ku,1) = x(ku,1)**2+2*x(ku,1)*x(ku,2)
1279*59599516SKenneth E. Jansen            tf(ku,1) = x(ku,1)**3
1280*59599516SKenneth E. Jansen          end do
1281*59599516SKenneth E. Jansen
1282*59599516SKenneth E. Jansen          call hessian( yold, x,     shp,  shgl,   iBC,
1283*59599516SKenneth E. Jansen     &                  shpb, shglb, iper, ilwork, uhess, gradu )
1284*59599516SKenneth E. Jansen
1285*59599516SKenneth E. Jansen          call write_hessian( uhess, gradu, nshg )
1286*59599516SKenneth E. Jansen      endif
1287*59599516SKenneth E. Jansen
1288*59599516SKenneth E. Jansenc      if(iRANS.lt.0 .and. idistcalc.eq.1) then
1289*59599516SKenneth E. Jansen      if(iRANS.lt.0) then
1290*59599516SKenneth E. Jansenc         call write_field(myrank,'a','DESd',4,
1291*59599516SKenneth E. Jansenc     &                    elDw,'d',numel,1,lstep)
1292*59599516SKenneth E. Jansen
1293*59599516SKenneth E. Jansen!MR CHANGE
1294*59599516SKenneth E. Jansen        if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1295*59599516SKenneth E. Jansen        if(myrank.eq.0)  then
1296*59599516SKenneth E. Jansen           tcormr1 = TMRC()
1297*59599516SKenneth E. Jansen        endif
1298*59599516SKenneth E. Jansen!MR CHANGE END
1299*59599516SKenneth E. Jansen
1300*59599516SKenneth E. Jansen        call write_field(myrank,'a','dwal',4,d2wall,'d',nshg,1,lstep)
1301*59599516SKenneth E. Jansen        deallocate(d2wall)
1302*59599516SKenneth E. Jansen
1303*59599516SKenneth E. Jansen!MR CHANGE
1304*59599516SKenneth E. Jansen        if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1305*59599516SKenneth E. Jansen        if(myrank.eq.0)  then
1306*59599516SKenneth E. Jansen          tcormr2 = TMRC()
1307*59599516SKenneth E. Jansen          write(6,*) 'Time to write dwal to the disks = ',
1308*59599516SKenneth E. Jansen     &                tcormr2-tcormr1
1309*59599516SKenneth E. Jansen        endif
1310*59599516SKenneth E. Jansen!MR CHANGE END
1311*59599516SKenneth E. Jansen
1312*59599516SKenneth E. Jansen
1313*59599516SKenneth E. Jansen      endif
1314*59599516SKenneth E. Jansen
1315*59599516SKenneth E. Jansenc
1316*59599516SKenneth E. Jansenc.... close history and aerodynamic forces files
1317*59599516SKenneth E. Jansenc
1318*59599516SKenneth E. Jansen      if (myrank .eq. master) then
1319*59599516SKenneth E. Jansen!         close (ihist)
1320*59599516SKenneth E. Jansen         close (iforce)
1321*59599516SKenneth E. Jansen         close(76)
1322*59599516SKenneth E. Jansen         if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then
1323*59599516SKenneth E. Jansen            close (8177)
1324*59599516SKenneth E. Jansen         endif
1325*59599516SKenneth E. Jansen      endif
1326*59599516SKenneth E. Jansenc
1327*59599516SKenneth E. Jansenc.... close varts file for probes
1328*59599516SKenneth E. Jansenc
1329*59599516SKenneth E. Jansen      if(exts) then
1330*59599516SKenneth E. Jansen        do jj=1,ntspts
1331*59599516SKenneth E. Jansen          if (myrank == iv_rank(jj)) then
1332*59599516SKenneth E. Jansen            close(1000+jj)
1333*59599516SKenneth E. Jansen          endif
1334*59599516SKenneth E. Jansen        enddo
1335*59599516SKenneth E. Jansen        deallocate (ivarts)
1336*59599516SKenneth E. Jansen        deallocate (ivartsg)
1337*59599516SKenneth E. Jansen        deallocate (iv_rank)
1338*59599516SKenneth E. Jansen        deallocate (vartssoln)
1339*59599516SKenneth E. Jansen        deallocate (vartssolng)
1340*59599516SKenneth E. Jansen      endif
1341*59599516SKenneth E. Jansen
1342*59599516SKenneth E. Jansen!MR CHANGE
1343*59599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1344*59599516SKenneth E. Jansen      if(myrank.eq.0)  then
1345*59599516SKenneth E. Jansen          write(*,*) 'itrdrv - done with aerodynamic forces'
1346*59599516SKenneth E. Jansen      endif
1347*59599516SKenneth E. Jansen!MR CHANGE
1348*59599516SKenneth E. Jansen
1349*59599516SKenneth E. Jansen      do isrf = 0,MAXSURF
1350*59599516SKenneth E. Jansen!        if ( nsrflist(isrf).ne.0 ) then
1351*59599516SKenneth E. Jansen        if ( nsrflist(isrf).ne.0 .and.
1352*59599516SKenneth E. Jansen     &                     myrank.eq.irankfilesforce(isrf)) then
1353*59599516SKenneth E. Jansen          iunit=60+isrf
1354*59599516SKenneth E. Jansen          close(iunit)
1355*59599516SKenneth E. Jansen        endif
1356*59599516SKenneth E. Jansen      enddo
1357*59599516SKenneth E. Jansen
1358*59599516SKenneth E. Jansen!MR CHANGE
1359*59599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1360*59599516SKenneth E. Jansen      if(myrank.eq.0)  then
1361*59599516SKenneth E. Jansen          write(*,*) 'itrdrv - done with MAXSURF'
1362*59599516SKenneth E. Jansen      endif
1363*59599516SKenneth E. Jansen!MR CHANGE
1364*59599516SKenneth E. Jansen
1365*59599516SKenneth E. Jansen
1366*59599516SKenneth E. Jansen 5    format(1X,F15.10,3X,F15.10,3X,F15.10,3X,F15.10)
1367*59599516SKenneth E. Jansen 444  format(6(2x,e14.7))
1368*59599516SKenneth E. Jansenc
1369*59599516SKenneth E. Jansenc.... end
1370*59599516SKenneth E. Jansenc
1371*59599516SKenneth E. Jansen      if(nsolflow.eq.1) then
1372*59599516SKenneth E. Jansen         deallocate (lhsK)
1373*59599516SKenneth E. Jansen         deallocate (lhsP)
1374*59599516SKenneth E. Jansen         deallocate (aperm)
1375*59599516SKenneth E. Jansen         deallocate (atemp)
1376*59599516SKenneth E. Jansen      endif
1377*59599516SKenneth E. Jansen      if(nsclrsol.gt.0) then
1378*59599516SKenneth E. Jansen         deallocate (lhsS)
1379*59599516SKenneth E. Jansen         deallocate (apermS)
1380*59599516SKenneth E. Jansen         deallocate (atempS)
1381*59599516SKenneth E. Jansen      endif
1382*59599516SKenneth E. Jansen
1383*59599516SKenneth E. Jansen      if(iabc==1) deallocate(acs)
1384*59599516SKenneth E. Jansen
1385*59599516SKenneth E. Jansen!MR CHANGE
1386*59599516SKenneth E. Jansen      if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
1387*59599516SKenneth E. Jansen      if(myrank.eq.0)  then
1388*59599516SKenneth E. Jansen          write(*,*) 'itrdrv - done - BACK TO process.f'
1389*59599516SKenneth E. Jansen      endif
1390*59599516SKenneth E. Jansen!MR CHANGE
1391*59599516SKenneth E. Jansen
1392*59599516SKenneth E. Jansen
1393*59599516SKenneth E. Jansen
1394*59599516SKenneth E. Jansen      return
1395*59599516SKenneth E. Jansen      end
1396*59599516SKenneth E. Jansen
1397*59599516SKenneth E. Jansen      subroutine lesmodels(y,     ac,        shgl,      shp,
1398*59599516SKenneth E. Jansen     &                     iper,  ilwork,    rowp,      colm,
1399*59599516SKenneth E. Jansen     &                     nsons, ifath,     x,
1400*59599516SKenneth E. Jansen     &                     iBC,   BC)
1401*59599516SKenneth E. Jansen
1402*59599516SKenneth E. Jansen      include "common.h"
1403*59599516SKenneth E. Jansen
1404*59599516SKenneth E. Jansen      real*8    y(nshg,ndof),              ac(nshg,ndof),
1405*59599516SKenneth E. Jansen     &            x(numnp,nsd),
1406*59599516SKenneth E. Jansen     &            BC(nshg,ndofBC)
1407*59599516SKenneth E. Jansen      real*8    shp(MAXTOP,maxsh,MAXQPT),
1408*59599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT)
1409*59599516SKenneth E. Jansen
1410*59599516SKenneth E. Jansenc
1411*59599516SKenneth E. Jansen      integer   rowp(nshg,nnz),         colm(nshg+1),
1412*59599516SKenneth E. Jansen     &            iBC(nshg),
1413*59599516SKenneth E. Jansen     &            ilwork(nlwork),
1414*59599516SKenneth E. Jansen     &            iper(nshg)
1415*59599516SKenneth E. Jansen      dimension ifath(numnp),    nsons(nfath)
1416*59599516SKenneth E. Jansen
1417*59599516SKenneth E. Jansen      real*8, allocatable, dimension(:) :: fwr2,fwr3,fwr4
1418*59599516SKenneth E. Jansen      real*8, allocatable, dimension(:) :: stabdis,cdelsq1
1419*59599516SKenneth E. Jansen      real*8, allocatable, dimension(:,:) :: xavegt, xavegt2,xavegt3
1420*59599516SKenneth E. Jansen
1421*59599516SKenneth E. Jansen      if( (iLES.gt.1) )   then ! Allocate Stuff for advanced LES models
1422*59599516SKenneth E. Jansen         allocate (fwr2(nshg))
1423*59599516SKenneth E. Jansen         allocate (fwr3(nshg))
1424*59599516SKenneth E. Jansen         allocate (fwr4(nshg))
1425*59599516SKenneth E. Jansen         allocate (xavegt(nfath,12))
1426*59599516SKenneth E. Jansen         allocate (xavegt2(nfath,12))
1427*59599516SKenneth E. Jansen         allocate (xavegt3(nfath,12))
1428*59599516SKenneth E. Jansen         allocate (stabdis(nfath))
1429*59599516SKenneth E. Jansen      endif
1430*59599516SKenneth E. Jansen
1431*59599516SKenneth E. Jansenc.... get dynamic model coefficient
1432*59599516SKenneth E. Jansenc
1433*59599516SKenneth E. Jansen      ilesmod=iLES/10
1434*59599516SKenneth E. Jansenc
1435*59599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model
1436*59599516SKenneth E. Jansenc
1437*59599516SKenneth E. Jansen      if (ilesmod.eq.0) then    ! 0 < iLES< 10 => dyn. model calculated
1438*59599516SKenneth E. Jansen                                ! at nodes based on discrete filtering
1439*59599516SKenneth E. Jansen
1440*59599516SKenneth E. Jansen
1441*59599516SKenneth E. Jansen         if(isubmod.eq.2) then
1442*59599516SKenneth E. Jansen            call SUPGdis(y,      ac,        shgl,      shp,
1443*59599516SKenneth E. Jansen     &                   iper,   ilwork,
1444*59599516SKenneth E. Jansen     &                   nsons,  ifath,     x,
1445*59599516SKenneth E. Jansen     &                   iBC,    BC, stabdis, xavegt3)
1446*59599516SKenneth E. Jansen         endif
1447*59599516SKenneth E. Jansen
1448*59599516SKenneth E. Jansen         if( ((isubmod.eq.0).or.(isubmod.eq.2)))then ! If no
1449*59599516SKenneth E. Jansen                                                     ! sub-model
1450*59599516SKenneth E. Jansen                                                     ! or SUPG
1451*59599516SKenneth E. Jansen                                                     ! model wanted
1452*59599516SKenneth E. Jansen
1453*59599516SKenneth E. Jansen            if(i2filt.eq.0)then ! If simple filter
1454*59599516SKenneth E. Jansen
1455*59599516SKenneth E. Jansen               if(modlstats .eq. 0) then ! If no model stats wanted
1456*59599516SKenneth E. Jansen                  call getdmc (y,       shgl,      shp,
1457*59599516SKenneth E. Jansen     &                         iper,       ilwork,    nsons,
1458*59599516SKenneth E. Jansen     &                         ifath,      x)
1459*59599516SKenneth E. Jansen               else             ! else get model stats
1460*59599516SKenneth E. Jansen                  call stdfdmc (y,       shgl,      shp,
1461*59599516SKenneth E. Jansen     &                          iper,       ilwork,    nsons,
1462*59599516SKenneth E. Jansen     &                          ifath,      x)
1463*59599516SKenneth E. Jansen               endif            ! end of stats if statement
1464*59599516SKenneth E. Jansen
1465*59599516SKenneth E. Jansen            else                ! else if twice filtering
1466*59599516SKenneth E. Jansen
1467*59599516SKenneth E. Jansen               call widefdmc(y,       shgl,      shp,
1468*59599516SKenneth E. Jansen     &                       iper,       ilwork,    nsons,
1469*59599516SKenneth E. Jansen     &                       ifath,      x)
1470*59599516SKenneth E. Jansen
1471*59599516SKenneth E. Jansen
1472*59599516SKenneth E. Jansen            endif               ! end of simple filter if statement
1473*59599516SKenneth E. Jansen
1474*59599516SKenneth E. Jansen         endif                  ! end of SUPG or no sub-model if statement
1475*59599516SKenneth E. Jansen
1476*59599516SKenneth E. Jansen
1477*59599516SKenneth E. Jansen         if( (isubmod.eq.1) ) then ! If DFWR sub-model wanted
1478*59599516SKenneth E. Jansen            call cdelBHsq (y,       shgl,      shp,
1479*59599516SKenneth E. Jansen     &                     iper,       ilwork,    nsons,
1480*59599516SKenneth E. Jansen     &                     ifath,      x,         cdelsq1)
1481*59599516SKenneth E. Jansen            call FiltRat (y,       shgl,      shp,
1482*59599516SKenneth E. Jansen     &                    iper,       ilwork,    nsons,
1483*59599516SKenneth E. Jansen     &                    ifath,      x,         cdelsq1,
1484*59599516SKenneth E. Jansen     &                    fwr4,       fwr3)
1485*59599516SKenneth E. Jansen
1486*59599516SKenneth E. Jansen
1487*59599516SKenneth E. Jansen            if (i2filt.eq.0) then ! If simple filter wanted
1488*59599516SKenneth E. Jansen               call DFWRsfdmc(y,       shgl,      shp,
1489*59599516SKenneth E. Jansen     &                        iper,       ilwork,    nsons,
1490*59599516SKenneth E. Jansen     &                        ifath,      x,         fwr2, fwr3)
1491*59599516SKenneth E. Jansen            else                ! else if twice filtering wanted
1492*59599516SKenneth E. Jansen               call DFWRwfdmc(y,       shgl,      shp,
1493*59599516SKenneth E. Jansen     &                        iper,       ilwork,    nsons,
1494*59599516SKenneth E. Jansen     &                        ifath,      x,         fwr4, fwr4)
1495*59599516SKenneth E. Jansen            endif               ! end of simple filter if statement
1496*59599516SKenneth E. Jansen
1497*59599516SKenneth E. Jansen         endif                  ! end of DFWR sub-model if statement
1498*59599516SKenneth E. Jansen
1499*59599516SKenneth E. Jansen         if( (isubmod.eq.2) )then ! If SUPG sub-model wanted
1500*59599516SKenneth E. Jansen            call dmcSUPG (y,           ac,         shgl,
1501*59599516SKenneth E. Jansen     &                    shp,         iper,       ilwork,
1502*59599516SKenneth E. Jansen     &                    nsons,       ifath,      x,
1503*59599516SKenneth E. Jansen     &                    iBC,    BC,  rowp,       colm,
1504*59599516SKenneth E. Jansen     &                    xavegt2,    stabdis)
1505*59599516SKenneth E. Jansen         endif
1506*59599516SKenneth E. Jansen
1507*59599516SKenneth E. Jansen         if(idis.eq.1)then      ! If SUPG/Model dissipation wanted
1508*59599516SKenneth E. Jansen            call ediss (y,        ac,      shgl,
1509*59599516SKenneth E. Jansen     &                  shp,      iper,       ilwork,
1510*59599516SKenneth E. Jansen     &                  nsons,    ifath,      x,
1511*59599516SKenneth E. Jansen     &                  iBC,      BC,  xavegt)
1512*59599516SKenneth E. Jansen         endif
1513*59599516SKenneth E. Jansen
1514*59599516SKenneth E. Jansen      endif                     ! end of ilesmod
1515*59599516SKenneth E. Jansen
1516*59599516SKenneth E. Jansen      if (ilesmod .eq. 1) then  ! 10 < iLES < 20 => dynamic-mixed
1517*59599516SKenneth E. Jansen                                ! at nodes based on discrete filtering
1518*59599516SKenneth E. Jansen         call bardmc (y,       shgl,      shp,
1519*59599516SKenneth E. Jansen     &                iper,    ilwork,
1520*59599516SKenneth E. Jansen     &                nsons,   ifath,     x)
1521*59599516SKenneth E. Jansen      endif
1522*59599516SKenneth E. Jansen
1523*59599516SKenneth E. Jansen      if (ilesmod .eq. 2) then  ! 20 < iLES < 30 => dynamic at quad
1524*59599516SKenneth E. Jansen                                ! pts based on lumped projection filt.
1525*59599516SKenneth E. Jansen
1526*59599516SKenneth E. Jansen         if(isubmod.eq.0)then
1527*59599516SKenneth E. Jansen            call projdmc (y,       shgl,      shp,
1528*59599516SKenneth E. Jansen     &                    iper,       ilwork,    x)
1529*59599516SKenneth E. Jansen         else
1530*59599516SKenneth E. Jansen            call cpjdmcnoi (y,      shgl,      shp,
1531*59599516SKenneth E. Jansen     &                      iper,   ilwork,       x,
1532*59599516SKenneth E. Jansen     &                      rowp,   colm,
1533*59599516SKenneth E. Jansen     &                      iBC,    BC)
1534*59599516SKenneth E. Jansen         endif
1535*59599516SKenneth E. Jansen
1536*59599516SKenneth E. Jansen      endif
1537*59599516SKenneth E. Jansen
1538*59599516SKenneth E. Jansen      if( (iLES.gt.1) )   then ! Deallocate Stuff for advanced LES models
1539*59599516SKenneth E. Jansen         deallocate (fwr2)
1540*59599516SKenneth E. Jansen         deallocate (fwr3)
1541*59599516SKenneth E. Jansen         deallocate (fwr4)
1542*59599516SKenneth E. Jansen         deallocate (xavegt)
1543*59599516SKenneth E. Jansen         deallocate (xavegt2)
1544*59599516SKenneth E. Jansen         deallocate (xavegt3)
1545*59599516SKenneth E. Jansen         deallocate (stabdis)
1546*59599516SKenneth E. Jansen      endif
1547*59599516SKenneth E. Jansen      return
1548*59599516SKenneth E. Jansen      end
1549*59599516SKenneth E. Jansen
1550*59599516SKenneth E. Jansenc
1551*59599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution
1552*59599516SKenneth E. Jansenc
1553*59599516SKenneth E. Jansen      subroutine CalcImpConvCoef (numISrfs, numTpoints)
1554*59599516SKenneth E. Jansen
1555*59599516SKenneth E. Jansen      use convolImpFlow !uses flow history and impedance for convolution
1556*59599516SKenneth E. Jansen
1557*59599516SKenneth E. Jansen      include "common.h" !for alfi
1558*59599516SKenneth E. Jansen
1559*59599516SKenneth E. Jansen      integer numISrfs, numTpoints
1560*59599516SKenneth E. Jansen
1561*59599516SKenneth E. Jansen      allocate (ConvCoef(numTpoints+2,3)) !same time discret. for all imp. BC
1562*59599516SKenneth E. Jansen      do j=1,numTpoints+2
1563*59599516SKenneth E. Jansen         ConvCoef(j,:)=0.5/numTpoints !dt/2 divided by period T=N*dt
1564*59599516SKenneth E. Jansen         ConvCoef(j,1)=ConvCoef(j,1)*(1.0-alfi)*(1.0-alfi)
1565*59599516SKenneth E. Jansen         ConvCoef(j,2)=ConvCoef(j,2)*(1.0+2*alfi*(1.0-alfi))
1566*59599516SKenneth E. Jansen         ConvCoef(j,3)=ConvCoef(j,3)*alfi*alfi
1567*59599516SKenneth E. Jansen      enddo
1568*59599516SKenneth E. Jansen      ConvCoef(1,2)=zero
1569*59599516SKenneth E. Jansen      ConvCoef(1,3)=zero
1570*59599516SKenneth E. Jansen      ConvCoef(2,3)=zero
1571*59599516SKenneth E. Jansen      ConvCoef(numTpoints+1,1)=zero
1572*59599516SKenneth E. Jansen      ConvCoef(numTpoints+2,2)=zero
1573*59599516SKenneth E. Jansen      ConvCoef(numTpoints+2,1)=zero
1574*59599516SKenneth E. Jansenc
1575*59599516SKenneth E. Jansenc...calculate the coefficients for the impedance convolution
1576*59599516SKenneth E. Jansenc
1577*59599516SKenneth E. Jansen      allocate (ImpConvCoef(numTpoints+2,numISrfs))
1578*59599516SKenneth E. Jansen
1579*59599516SKenneth E. Jansenc..coefficients below assume Q linear in time step, Z constant
1580*59599516SKenneth E. Jansenc            do j=3,numTpoints
1581*59599516SKenneth E. Jansenc                ImpConvCoef(j,:) = ValueListImp(j-1,:)*ConvCoef(j,3)
1582*59599516SKenneth E. Jansenc     &                             + ValueListImp(j,:)*ConvCoef(j,2)
1583*59599516SKenneth E. Jansenc     &                             + ValueListImp(j+1,:)*ConvCoef(j,1)
1584*59599516SKenneth E. Jansenc            enddo
1585*59599516SKenneth E. Jansenc            ImpConvCoef(1,:) = ValueListImp(2,:)*ConvCoef(1,1)
1586*59599516SKenneth E. Jansenc            ImpConvCoef(2,:) = ValueListImp(2,:)*ConvCoef(2,2)
1587*59599516SKenneth E. Jansenc     &                       + ValueListImp(3,:)*ConvCoef(2,1)
1588*59599516SKenneth E. Jansenc            ImpConvCoef(numTpoints+1,:) =
1589*59599516SKenneth E. Jansenc     &           ValueListImp(numTpoints,:)*ConvCoef(numTpoints+1,3)
1590*59599516SKenneth E. Jansenc     &         + ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+1,2)
1591*59599516SKenneth E. Jansenc            ImpConvCoef(numTpoints+2,:) =
1592*59599516SKenneth E. Jansenc     &           ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+2,3)
1593*59599516SKenneth E. Jansen
1594*59599516SKenneth E. Jansenc..try easiest convolution Q and Z constant per time step
1595*59599516SKenneth E. Jansen      do j=3,numTpoints+1
1596*59599516SKenneth E. Jansen         ImpConvCoef(j,:) = ValueListImp(j-1,:)/numTpoints
1597*59599516SKenneth E. Jansen      enddo
1598*59599516SKenneth E. Jansen      ImpConvCoef(1,:) =zero
1599*59599516SKenneth E. Jansen      ImpConvCoef(2,:) =zero
1600*59599516SKenneth E. Jansen      ImpConvCoef(numTpoints+2,:) =
1601*59599516SKenneth E. Jansen     &           ValueListImp(numTpoints+1,:)/numTpoints
1602*59599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr()
1603*59599516SKenneth E. Jansen      ImpConvCoef(numTpoints+1,:)= ImpConvCoef(numTpoints+1,:)
1604*59599516SKenneth E. Jansen     &                  - ImpConvCoef(numTpoints+2,:)*(1.0-alfi)/alfi
1605*59599516SKenneth E. Jansen      ImpConvCoef(numTpoints+2,:)= ImpConvCoef(numTpoints+2,:)/alfi
1606*59599516SKenneth E. Jansen      return
1607*59599516SKenneth E. Jansen      end
1608*59599516SKenneth E. Jansen
1609*59599516SKenneth E. Jansenc
1610*59599516SKenneth E. Jansenc ... update the flow rate history for the impedance convolution, filter it and write it out
1611*59599516SKenneth E. Jansenc
1612*59599516SKenneth E. Jansen      subroutine UpdHistConv(y,nsrfIdList,numSrfs)
1613*59599516SKenneth E. Jansen
1614*59599516SKenneth E. Jansen      use convolImpFlow !brings ntimeptpT, QHistImp, QHistTry, QHistTryF, numImpSrfs
1615*59599516SKenneth E. Jansen      use convolRCRFlow !brings QHistRCR, numRCRSrfs
1616*59599516SKenneth E. Jansen
1617*59599516SKenneth E. Jansen      include "common.h"
1618*59599516SKenneth E. Jansen
1619*59599516SKenneth E. Jansen      integer   nsrfIdList(0:MAXSURF), numSrfs
1620*59599516SKenneth E. Jansen      character*20 fname1
1621*59599516SKenneth E. Jansen      character*10 cname2
1622*59599516SKenneth E. Jansen      character*5 cname
1623*59599516SKenneth E. Jansen      real*8    y(nshg,3) !velocity at time n+1
1624*59599516SKenneth E. Jansen      real*8    NewQ(0:MAXSURF) !temporary unknown for the flow rate
1625*59599516SKenneth E. Jansen                        !that needs to be added to the flow history
1626*59599516SKenneth E. Jansen
1627*59599516SKenneth E. Jansen      call GetFlowQ(NewQ,y,nsrfIdList,numSrfs) !new flow at time n+1
1628*59599516SKenneth E. Jansenc
1629*59599516SKenneth E. Jansenc... for imp BC: shift QHist, add new constribution, filter and write out
1630*59599516SKenneth E. Jansenc
1631*59599516SKenneth E. Jansen      if(numImpSrfs.gt.zero) then
1632*59599516SKenneth E. Jansen         do j=1, ntimeptpT
1633*59599516SKenneth E. Jansen            QHistImp(j,1:numSrfs)=QHistImp(j+1,1:numSrfs)
1634*59599516SKenneth E. Jansen         enddo
1635*59599516SKenneth E. Jansen         QHistImp(ntimeptpT+1,1:numSrfs) = NewQ(1:numSrfs)
1636*59599516SKenneth E. Jansen
1637*59599516SKenneth E. Jansenc
1638*59599516SKenneth E. Jansenc....filter the flow rate history
1639*59599516SKenneth E. Jansenc
1640*59599516SKenneth E. Jansen         cutfreq = 10           !hardcoded cutting frequency of the filter
1641*59599516SKenneth E. Jansen         do j=1, ntimeptpT
1642*59599516SKenneth E. Jansen            QHistTry(j,:)=QHistImp(j+1,:)
1643*59599516SKenneth E. Jansen         enddo
1644*59599516SKenneth E. Jansen         call Filter(QHistTryF,QHistTry,ntimeptpT,Delt(1),cutfreq)
1645*59599516SKenneth E. Jansenc.... if no filter applied then uncomment next three lines
1646*59599516SKenneth E. Jansenc         do j=1, ntimeptpT
1647*59599516SKenneth E. Jansenc            QHistTryF(j,:)=QHistTry(j,:)
1648*59599516SKenneth E. Jansenc         enddo
1649*59599516SKenneth E. Jansen
1650*59599516SKenneth E. Jansenc         QHistImp(1,:)=zero ! why do we do this? for beta(1,:) = zero it does not really matters
1651*59599516SKenneth E. Jansen         do j=1, ntimeptpT
1652*59599516SKenneth E. Jansen            QHistImp(j+1,:)=QHistTryF(j,:)
1653*59599516SKenneth E. Jansen         enddo
1654*59599516SKenneth E. Jansenc
1655*59599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat
1656*59599516SKenneth E. Jansenc
1657*59599516SKenneth E. Jansen         if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or.
1658*59599516SKenneth E. Jansen     &        (istep .eq. nstep(1)))) .and.
1659*59599516SKenneth E. Jansen     &        (myrank .eq. master)) then
1660*59599516SKenneth E. Jansen            open(unit=816, file='Qhistor.dat',status='replace')
1661*59599516SKenneth E. Jansen            write(816,*) ntimeptpT
1662*59599516SKenneth E. Jansen            do j=1,ntimeptpT+1
1663*59599516SKenneth E. Jansen               write(816,*) (QHistImp(j,n),n=1, numSrfs)
1664*59599516SKenneth E. Jansen            enddo
1665*59599516SKenneth E. Jansen            close(816)
1666*59599516SKenneth E. Jansenc... write out a copy with step number to be able to restart
1667*59599516SKenneth E. Jansen            fname1 = 'Qhistor'
1668*59599516SKenneth E. Jansen            fname1 = trim(fname1)//trim(cname2(lstep))//'.dat'
1669*59599516SKenneth E. Jansen            open(unit=8166,file=trim(fname1),status='unknown')
1670*59599516SKenneth E. Jansen            write(8166,*) ntimeptpT
1671*59599516SKenneth E. Jansen            do j=1,ntimeptpT+1
1672*59599516SKenneth E. Jansen               write(8166,*) (QHistImp(j,n),n=1, numSrfs)
1673*59599516SKenneth E. Jansen            enddo
1674*59599516SKenneth E. Jansen            close(8166)
1675*59599516SKenneth E. Jansen         endif
1676*59599516SKenneth E. Jansen      endif
1677*59599516SKenneth E. Jansen
1678*59599516SKenneth E. Jansenc
1679*59599516SKenneth E. Jansenc... for RCR bc just add the new contribution
1680*59599516SKenneth E. Jansenc
1681*59599516SKenneth E. Jansen      if(numRCRSrfs.gt.zero) then
1682*59599516SKenneth E. Jansen         QHistRCR(lstep+1,1:numSrfs) = NewQ(1:numSrfs)
1683*59599516SKenneth E. Jansenc
1684*59599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat
1685*59599516SKenneth E. Jansenc
1686*59599516SKenneth E. Jansen         if ((irs .ge. 1) .and. (myrank .eq. master)) then
1687*59599516SKenneth E. Jansen            if(istep.eq.1) then
1688*59599516SKenneth E. Jansen               open(unit=816,file='Qhistor.dat',status='unknown')
1689*59599516SKenneth E. Jansen            else
1690*59599516SKenneth E. Jansen               open(unit=816,file='Qhistor.dat',position='append')
1691*59599516SKenneth E. Jansen            endif
1692*59599516SKenneth E. Jansen            if(istep.eq.1) then
1693*59599516SKenneth E. Jansen               do j=1,lstep
1694*59599516SKenneth E. Jansen                  write(816,*) j, (QHistRCR(j,n),n=1,numSrfs) ! read from file of previous run
1695*59599516SKenneth E. Jansen               enddo
1696*59599516SKenneth E. Jansen            endif
1697*59599516SKenneth E. Jansen            write(816,*) lstep+1, (QHistRCR(lstep+1,n),n=1, numSrfs)
1698*59599516SKenneth E. Jansen            close(816)
1699*59599516SKenneth E. Jansenc... write out a copy with step number to be able to restart
1700*59599516SKenneth E. Jansen            if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or.
1701*59599516SKenneth E. Jansen     &           (istep .eq. nstep(1)))) .and.
1702*59599516SKenneth E. Jansen     &           (myrank .eq. master)) then
1703*59599516SKenneth E. Jansen               fname1 = 'Qhistor'
1704*59599516SKenneth E. Jansen               fname1 = trim(fname1)//trim(cname2(lstep))//'.dat'
1705*59599516SKenneth E. Jansen               open(unit=8166,file=trim(fname1),status='unknown')
1706*59599516SKenneth E. Jansen               write(8166,*) lstep+1
1707*59599516SKenneth E. Jansen               do j=1,lstep+1
1708*59599516SKenneth E. Jansen                  write(8166,*) (QHistRCR(j,n),n=1, numSrfs)
1709*59599516SKenneth E. Jansen               enddo
1710*59599516SKenneth E. Jansen               close(8166)
1711*59599516SKenneth E. Jansen            endif
1712*59599516SKenneth E. Jansen         endif
1713*59599516SKenneth E. Jansen      endif
1714*59599516SKenneth E. Jansen
1715*59599516SKenneth E. Jansen      return
1716*59599516SKenneth E. Jansen      end
1717*59599516SKenneth E. Jansen
1718*59599516SKenneth E. Jansenc
1719*59599516SKenneth E. Jansenc...calculate the time varying coefficients for the RCR convolution
1720*59599516SKenneth E. Jansenc
1721*59599516SKenneth E. Jansen      subroutine CalcRCRConvCoef (stepn, numSrfs)
1722*59599516SKenneth E. Jansen
1723*59599516SKenneth E. Jansen      use convolRCRFlow !brings in ValueListRCR, dtRCR
1724*59599516SKenneth E. Jansen
1725*59599516SKenneth E. Jansen      include "common.h" !brings alfi
1726*59599516SKenneth E. Jansen
1727*59599516SKenneth E. Jansen      integer numSrfs, stepn
1728*59599516SKenneth E. Jansen
1729*59599516SKenneth E. Jansen      RCRConvCoef = zero
1730*59599516SKenneth E. Jansen      if (stepn .eq. 0) then
1731*59599516SKenneth E. Jansen        RCRConvCoef(1,:) = ValueListRCR(1,:)*(1.0-alfi) +
1732*59599516SKenneth E. Jansen     &   ValueListRCR(3,:)*(-alfi + 1.0 + 1/dtRCR(:)
1733*59599516SKenneth E. Jansen     &     - exp(-alfi*dtRCR(:))*(1 + 1/dtRCR(:)))
1734*59599516SKenneth E. Jansen        RCRConvCoef(2,:) = ValueListRCR(1,:)*alfi
1735*59599516SKenneth E. Jansen     &     + ValueListRCR(3,:)
1736*59599516SKenneth E. Jansen     &     *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:))
1737*59599516SKenneth E. Jansen      endif
1738*59599516SKenneth E. Jansen      if (stepn .ge. 1) then
1739*59599516SKenneth E. Jansen        RCRConvCoef(1,:) =-ValueListRCR(3,:)*exp(-dtRCR(:)*(stepn+alfi))
1740*59599516SKenneth E. Jansen     &        *(1 + (1 - exp(dtRCR(:)))/dtRCR(:))
1741*59599516SKenneth E. Jansen        RCRConvCoef(stepn+1,:) = ValueListRCR(1,:)*(1-alfi)
1742*59599516SKenneth E. Jansen     &     - ValueListRCR(3,:)*(alfi - 1 - 1/dtRCR(:)
1743*59599516SKenneth E. Jansen     &     + exp(-alfi*dtRCR(:))/dtRCR(:)*(2 - exp(-dtRCR(:))))
1744*59599516SKenneth E. Jansen        RCRConvCoef(stepn+2,:) = ValueListRCR(1,:)*alfi
1745*59599516SKenneth E. Jansen     &     + ValueListRCR(3,:)
1746*59599516SKenneth E. Jansen     &     *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:))
1747*59599516SKenneth E. Jansen      endif
1748*59599516SKenneth E. Jansen      if (stepn .ge. 2) then
1749*59599516SKenneth E. Jansen        do j=2,stepn
1750*59599516SKenneth E. Jansen         RCRConvCoef(j,:) = ValueListRCR(3,:)/dtRCR(:)*
1751*59599516SKenneth E. Jansen     &        exp(-dtRCR(:)*(stepn + alfi + 2 - j))*
1752*59599516SKenneth E. Jansen     &        (1 - exp(dtRCR(:)))**2
1753*59599516SKenneth E. Jansen        enddo
1754*59599516SKenneth E. Jansen      endif
1755*59599516SKenneth E. Jansen
1756*59599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr()
1757*59599516SKenneth E. Jansen      RCRConvCoef(stepn+1,:)= RCRConvCoef(stepn+1,:)
1758*59599516SKenneth E. Jansen     &                  - RCRConvCoef(stepn+2,:)*(1.0-alfi)/alfi
1759*59599516SKenneth E. Jansen      RCRConvCoef(stepn+2,:)= RCRConvCoef(stepn+2,:)/alfi
1760*59599516SKenneth E. Jansen
1761*59599516SKenneth E. Jansen      return
1762*59599516SKenneth E. Jansen      end
1763*59599516SKenneth E. Jansen
1764*59599516SKenneth E. Jansenc
1765*59599516SKenneth E. Jansenc...calculate the time dependent H operator for the RCR convolution
1766*59599516SKenneth E. Jansenc
1767*59599516SKenneth E. Jansen      subroutine CalcHopRCR (timestepRCR, stepn, numSrfs)
1768*59599516SKenneth E. Jansen
1769*59599516SKenneth E. Jansen      use convolRCRFlow !brings in HopRCR, dtRCR
1770*59599516SKenneth E. Jansen
1771*59599516SKenneth E. Jansen      include "common.h"
1772*59599516SKenneth E. Jansen
1773*59599516SKenneth E. Jansen      integer numSrfs, stepn
1774*59599516SKenneth E. Jansen      real*8  PdistCur(0:MAXSURF), timestepRCR
1775*59599516SKenneth E. Jansen
1776*59599516SKenneth E. Jansen      HopRCR=zero
1777*59599516SKenneth E. Jansen      call RCRint(timestepRCR*(stepn + alfi),PdistCur)
1778*59599516SKenneth E. Jansen      HopRCR(1:numSrfs) = RCRic(1:numSrfs)
1779*59599516SKenneth E. Jansen     &     *exp(-dtRCR(1:numSrfs)*(stepn + alfi)) + PdistCur(1:numSrfs)
1780*59599516SKenneth E. Jansen      return
1781*59599516SKenneth E. Jansen      end
1782*59599516SKenneth E. Jansenc
1783*59599516SKenneth E. Jansenc ... initialize the influence of the initial conditions for the RCR BC
1784*59599516SKenneth E. Jansenc
1785*59599516SKenneth E. Jansen      subroutine calcRCRic(y,srfIdList,numSrfs)
1786*59599516SKenneth E. Jansen
1787*59599516SKenneth E. Jansen      use convolRCRFlow    !brings RCRic, ValueListRCR, ValuePdist
1788*59599516SKenneth E. Jansen
1789*59599516SKenneth E. Jansen      include "common.h"
1790*59599516SKenneth E. Jansen
1791*59599516SKenneth E. Jansen      integer   srfIdList(0:MAXSURF), numSrfs, irankCoupled
1792*59599516SKenneth E. Jansen      real*8    y(nshg,4) !need velocity and pressure
1793*59599516SKenneth E. Jansen      real*8    Qini(0:MAXSURF) !initial flow rate
1794*59599516SKenneth E. Jansen      real*8    PdistIni(0:MAXSURF) !initial distal pressure
1795*59599516SKenneth E. Jansen      real*8    Pini(0:MAXSURF),CoupleArea(0:MAXSURF) ! initial pressure
1796*59599516SKenneth E. Jansen      real*8    VelOnly(nshg,3), POnly(nshg)
1797*59599516SKenneth E. Jansen
1798*59599516SKenneth E. Jansen      allocate (RCRic(0:MAXSURF))
1799*59599516SKenneth E. Jansen
1800*59599516SKenneth E. Jansen      if(lstep.eq.0) then
1801*59599516SKenneth E. Jansen         VelOnly(:,1:3)=y(:,1:3)
1802*59599516SKenneth E. Jansen         call GetFlowQ(Qini,VelOnly,srfIdList,numSrfs) !get initial flow
1803*59599516SKenneth E. Jansen         QHistRCR(1,1:numSrfs)=Qini(1:numSrfs) !initialize QHistRCR
1804*59599516SKenneth E. Jansen         POnly(:)=y(:,4)        ! pressure
1805*59599516SKenneth E. Jansen         call integrScalar(Pini,POnly,srfIdList,numSrfs) !get initial pressure integral
1806*59599516SKenneth E. Jansen         POnly(:)=one           ! one to get area
1807*59599516SKenneth E. Jansen         call integrScalar(CoupleArea,POnly,srfIdList,numSrfs) !get surf area
1808*59599516SKenneth E. Jansen         Pini(1:numSrfs) = Pini(1:numSrfs)/CoupleArea(1:numSrfs)
1809*59599516SKenneth E. Jansen      else
1810*59599516SKenneth E. Jansen         Qini(1:numSrfs)=QHistRCR(1,1:numSrfs)
1811*59599516SKenneth E. Jansen         Pini(1:numSrfs)=zero    ! hack
1812*59599516SKenneth E. Jansen      endif
1813*59599516SKenneth E. Jansen      call RCRint(istep,PdistIni) !get initial distal P (use istep)
1814*59599516SKenneth E. Jansen      RCRic(1:numSrfs) = Pini(1:numSrfs)
1815*59599516SKenneth E. Jansen     &          - ValueListRCR(1,:)*Qini(1:numSrfs)-PdistIni(1:numSrfs)
1816*59599516SKenneth E. Jansen      return
1817*59599516SKenneth E. Jansen      end
1818*59599516SKenneth E. Jansen
1819*59599516SKenneth E. Jansenc.........function that integrates a scalar over a boundary
1820*59599516SKenneth E. Jansen      subroutine integrScalar(scalInt,scal,srfIdList,numSrfs)
1821*59599516SKenneth E. Jansen
1822*59599516SKenneth E. Jansen      use pvsQbi !brings ndsurf, NASC
1823*59599516SKenneth E. Jansen
1824*59599516SKenneth E. Jansen      include "common.h"
1825*59599516SKenneth E. Jansen      include "mpif.h"
1826*59599516SKenneth E. Jansen
1827*59599516SKenneth E. Jansen      integer   srfIdList(0:MAXSURF), numSrfs, irankCoupled, i, k
1828*59599516SKenneth E. Jansen      real*8    scal(nshg), scalInt(0:MAXSURF), scalIntProc(0:MAXSURF)
1829*59599516SKenneth E. Jansen
1830*59599516SKenneth E. Jansen      scalIntProc = zero
1831*59599516SKenneth E. Jansen      do i = 1,nshg
1832*59599516SKenneth E. Jansen        if(numSrfs.gt.zero) then
1833*59599516SKenneth E. Jansen          do k = 1,numSrfs
1834*59599516SKenneth E. Jansen            irankCoupled = 0
1835*59599516SKenneth E. Jansen            if (srfIdList(k).eq.ndsurf(i)) then
1836*59599516SKenneth E. Jansen              irankCoupled=k
1837*59599516SKenneth E. Jansen              scalIntProc(irankCoupled) = scalIntProc(irankCoupled)
1838*59599516SKenneth E. Jansen     &                            + NASC(i)*scal(i)
1839*59599516SKenneth E. Jansen              exit
1840*59599516SKenneth E. Jansen            endif
1841*59599516SKenneth E. Jansen          enddo
1842*59599516SKenneth E. Jansen        endif
1843*59599516SKenneth E. Jansen      enddo
1844*59599516SKenneth E. Jansenc
1845*59599516SKenneth E. Jansenc     at this point, each scalint has its "nodes" contributions to the scalar
1846*59599516SKenneth E. Jansenc     accumulated into scalIntProc. Note, because NASC is on processor this
1847*59599516SKenneth E. Jansenc     will NOT be the scalar for the surface yet
1848*59599516SKenneth E. Jansenc
1849*59599516SKenneth E. Jansenc.... reduce integrated scalar for each surface, push on scalInt
1850*59599516SKenneth E. Jansenc
1851*59599516SKenneth E. Jansen        npars=MAXSURF+1
1852*59599516SKenneth E. Jansen       call MPI_ALLREDUCE (scalIntProc, scalInt(:), npars,
1853*59599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
1854*59599516SKenneth E. Jansen
1855*59599516SKenneth E. Jansen      return
1856*59599516SKenneth E. Jansen      end
1857*59599516SKenneth E. Jansen
1858*59599516SKenneth E. Jansen
1859*59599516SKenneth E. Jansen
1860*59599516SKenneth E. Jansen
1861*59599516SKenneth E. Jansen
1862