1*59599516SKenneth E. Jansen subroutine itrdrv (y, ac, uold, x, 2*59599516SKenneth E. Jansen & iBC, BC, 3*59599516SKenneth E. Jansen & iper, ilwork, shp, 4*59599516SKenneth E. Jansen & shgl, shpb, shglb, 5*59599516SKenneth E. Jansen & ifath, velbar, nsons ) 6*59599516SKenneth E. Jansenc 7*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 8*59599516SKenneth E. Jansenc 9*59599516SKenneth E. Jansenc This iterative driver is the semi-discrete, predictor multi-corrector 10*59599516SKenneth E. Jansenc algorithm. It contains the Hulbert Generalized Alpha method which 11*59599516SKenneth E. Jansenc is 2nd order accurate for Rho_inf from 0 to 1. The method can be 12*59599516SKenneth E. Jansenc made first-order accurate by setting Rho_inf=-1. It uses a 13*59599516SKenneth E. Jansenc GMRES iterative solver. 14*59599516SKenneth E. Jansenc 15*59599516SKenneth E. Jansenc working arrays: 16*59599516SKenneth E. Jansenc y (nshg,ndof) : Y variables 17*59599516SKenneth E. Jansenc x (nshg,nsd) : node coordinates 18*59599516SKenneth E. Jansenc iBC (nshg) : BC codes 19*59599516SKenneth E. Jansenc BC (nshg,ndofBC) : BC constraint parameters 20*59599516SKenneth E. Jansenc iper (nshg) : periodicity table 21*59599516SKenneth E. Jansenc 22*59599516SKenneth E. Jansenc shape functions: 23*59599516SKenneth E. Jansenc shp (nshape,ngauss) : interior element shape functions 24*59599516SKenneth E. Jansenc shgl (nsd,nshape,ngauss) : local shape function gradients 25*59599516SKenneth E. Jansenc shpb (nshapeb,ngaussb) : boundary element shape functions 26*59599516SKenneth E. Jansenc shglb (nsd,nshapeb,ngaussb) : bdry. elt. shape gradients 27*59599516SKenneth E. Jansenc 28*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 29*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 30*59599516SKenneth E. Jansenc 31*59599516SKenneth E. Jansen use pvsQbi !gives us splag (the spmass at the end of this run 32*59599516SKenneth E. Jansen use specialBC !gives us itvn 33*59599516SKenneth E. Jansen use timedata !allows collection of time series 34*59599516SKenneth E. Jansen use turbSA 35*59599516SKenneth E. Jansen 36*59599516SKenneth E. Jansen include "common.h" 37*59599516SKenneth E. Jansen include "mpif.h" 38*59599516SKenneth E. Jansen include "auxmpi.h" 39*59599516SKenneth E. Jansen 40*59599516SKenneth E. Jansenc 41*59599516SKenneth E. Jansen dimension y(nshg,ndof), ac(nshg,ndof), 42*59599516SKenneth E. Jansen & yold(nshg,ndof), acold(nshg,ndof), 43*59599516SKenneth E. Jansen & x(numnp,nsd), iBC(nshg), 44*59599516SKenneth E. Jansen & BC(nshg,ndofBC), ilwork(nlwork), 45*59599516SKenneth E. Jansen & iper(nshg), uold(nshg,nsd) 46*59599516SKenneth E. Jansenc 47*59599516SKenneth E. Jansen dimension res(nshg,nflow), BDiag(nshg,nflow,nflow), 48*59599516SKenneth E. Jansen & rest(nshg), solinc(nshg,ndof) 49*59599516SKenneth E. Jansenc 50*59599516SKenneth E. Jansen dimension shp(MAXTOP,maxsh,MAXQPT), 51*59599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 52*59599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 53*59599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 54*59599516SKenneth E. Jansen real*8 almit, alfit, gamit 55*59599516SKenneth E. Jansen dimension ifath(numnp), velbar(nfath,ndof), nsons(nfath) 56*59599516SKenneth E. Jansen real*8 rerr(nshg,10),ybar(nshg,ndof+8) ! 8 is for avg. of square as uu, vv, ww, pp, TT, uv, uw, and vw 57*59599516SKenneth E. Jansen integer, allocatable, dimension(:) :: ivarts 58*59599516SKenneth E. Jansen integer, allocatable, dimension(:) :: ivartsg 59*59599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: vartssoln 60*59599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: vartssolng 61*59599516SKenneth E. Jansen real*8, allocatable, dimension(:,:,:) :: vartsbuff 62*59599516SKenneth E. Jansen! assuming three profiles to control (inlet, bottom FC and top FC) 63*59599516SKenneth E. Jansen! store velocity profile set via BC 64*59599516SKenneth E. Jansen real*8 vbc_prof(nshg,3) 65*59599516SKenneth E. Jansen character*20 fname1, fmt1, fname2, fmt2 66*59599516SKenneth E. Jansen character*4 fname4c ! 4 characters 67*59599516SKenneth E. Jansen character*60 fvarts 68*59599516SKenneth E. Jansen character*5 cname 69*59599516SKenneth E. Jansen character*10 cname2 70*59599516SKenneth E. Jansen integer ifuncs(6), iarray(10) 71*59599516SKenneth E. Jansen 72*59599516SKenneth E. Jansen real*8 elDw(numel) ! element average of DES d variable 73*59599516SKenneth E. Jansenc 74*59599516SKenneth E. Jansenc Here are the data structures for sparse matrix GMRES 75*59599516SKenneth E. Jansenc 76*59599516SKenneth E. Jansen integer, allocatable, dimension(:,:) :: rowp 77*59599516SKenneth E. Jansen integer, allocatable, dimension(:) :: colm 78*59599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: lhsK 79*59599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: EGmass 80*59599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: EGmasst 81*59599516SKenneth E. Jansen 82*59599516SKenneth E. Jansen inquire(file='xyzts.dat',exist=exts) 83*59599516SKenneth E. Jansen lskeep=lstep 84*59599516SKenneth E. Jansen if(exts) then 85*59599516SKenneth E. Jansen 86*59599516SKenneth E. Jansen open(unit=626,file='xyzts.dat',status='old') 87*59599516SKenneth E. Jansen read(626,*) ntspts, freq, tolpt, iterat, varcod 88*59599516SKenneth E. Jansen call sTD ! sets data structures 89*59599516SKenneth E. Jansen do jj=1,ntspts ! read coordinate data where solution desired 90*59599516SKenneth E. Jansen read(626,*) ptts(jj,1),ptts(jj,2),ptts(jj,3) 91*59599516SKenneth E. Jansen enddo 92*59599516SKenneth E. Jansen close(626) 93*59599516SKenneth E. Jansen 94*59599516SKenneth E. Jansen statptts(:,:) = 0 95*59599516SKenneth E. Jansen parptts(:,:) = zero 96*59599516SKenneth E. Jansen varts(:,:) = zero 97*59599516SKenneth E. Jansen 98*59599516SKenneth E. Jansen allocate (ivarts(ntspts*ndof)) 99*59599516SKenneth E. Jansen allocate (ivartsg(ntspts*ndof)) 100*59599516SKenneth E. Jansen allocate (vartssoln(ntspts*ndof)) 101*59599516SKenneth E. Jansen allocate (vartssolng(ntspts*ndof)) 102*59599516SKenneth E. Jansen 103*59599516SKenneth E. Jansen nbuff=ntout 104*59599516SKenneth E. Jansen allocate (vartsbuff(ntspts,ndof,nbuff)) 105*59599516SKenneth E. Jansen 106*59599516SKenneth E. Jansen if (myrank .eq. master) then 107*59599516SKenneth E. Jansen do jj=1,ntspts 108*59599516SKenneth E. Jansen fvarts='varts/varts' 109*59599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(jj)) 110*59599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(lstep)) 111*59599516SKenneth E. Jansen fvarts=trim(fvarts)//'.dat' 112*59599516SKenneth E. Jansen fvarts=trim(fvarts) 113*59599516SKenneth E. Jansen open(unit=1000+jj, file=fvarts, status='unknown') 114*59599516SKenneth E. Jansen enddo 115*59599516SKenneth E. Jansen endif 116*59599516SKenneth E. Jansen 117*59599516SKenneth E. Jansen endif 118*59599516SKenneth E. Jansen 119*59599516SKenneth E. Jansenc 120*59599516SKenneth E. Jansenc 121*59599516SKenneth E. Jansenc.... open history and aerodynamic forces files 122*59599516SKenneth E. Jansenc 123*59599516SKenneth E. Jansen if (myrank .eq. master) then 124*59599516SKenneth E. Jansen open (unit=ihist, file=fhist, status='unknown') 125*59599516SKenneth E. Jansen open (unit=iforce, file=fforce, status='unknown') 126*59599516SKenneth E. Jansen endif 127*59599516SKenneth E. Jansenc 128*59599516SKenneth E. Jansenc 129*59599516SKenneth E. Jansenc.... initialize 130*59599516SKenneth E. Jansenc 131*59599516SKenneth E. Jansen ifuncs = 0 ! func. evaluation counter 132*59599516SKenneth E. Jansen istep = 0 133*59599516SKenneth E. Jansen ntotGM = 0 ! number of GMRES iterations 134*59599516SKenneth E. Jansen time = 0 135*59599516SKenneth E. Jansen yold = y 136*59599516SKenneth E. Jansen acold = ac 137*59599516SKenneth E. Jansen if (mod(impl(1),100)/10 .eq. 1) then 138*59599516SKenneth E. Jansenc 139*59599516SKenneth E. Jansenc generate the sparse data fill vectors 140*59599516SKenneth E. Jansenc 141*59599516SKenneth E. Jansen allocate (rowp(nshg,nnz)) 142*59599516SKenneth E. Jansen allocate (colm(nshg+1)) 143*59599516SKenneth E. Jansen call genadj(colm, rowp, icnt ) ! preprocess the adjacency list 144*59599516SKenneth E. Jansen 145*59599516SKenneth E. Jansen nnz_tot=icnt ! this is exactly the number of non-zero 146*59599516SKenneth E. Jansen ! blocks on this proc 147*59599516SKenneth E. Jansen allocate (lhsK(nflow*nflow,nnz_tot)) 148*59599516SKenneth E. Jansen endif 149*59599516SKenneth E. Jansen if (mod(impl(1),100)/10 .eq. 3) then 150*59599516SKenneth E. Jansenc 151*59599516SKenneth E. Jansenc generate the ebe data fill vectors 152*59599516SKenneth E. Jansenc 153*59599516SKenneth E. Jansen nedof=nflow*nshape 154*59599516SKenneth E. Jansen allocate (EGmass(numel,nedof*nedof)) 155*59599516SKenneth E. Jansen endif 156*59599516SKenneth E. Jansencc 157*59599516SKenneth E. Jansen 158*59599516SKenneth E. Jansenc.......................................... 159*59599516SKenneth E. Jansen rerr = zero 160*59599516SKenneth E. Jansen ybar(:,1:ndof) = y(:,1:ndof) 161*59599516SKenneth E. Jansen do idof=1,5 162*59599516SKenneth E. Jansen ybar(:,ndof+idof) = y(:,idof)*y(:,idof) 163*59599516SKenneth E. Jansen enddo 164*59599516SKenneth E. Jansen ybar(:,ndof+6) = y(:,1)*y(:,2) 165*59599516SKenneth E. Jansen ybar(:,ndof+7) = y(:,1)*y(:,3) 166*59599516SKenneth E. Jansen ybar(:,ndof+8) = y(:,2)*y(:,3) 167*59599516SKenneth E. Jansenc......................................... 168*59599516SKenneth E. Jansen 169*59599516SKenneth E. Jansen 170*59599516SKenneth E. Jansen vbc_prof(:,1:3) = BC(:,3:5) 171*59599516SKenneth E. Jansen 172*59599516SKenneth E. Jansenc 173*59599516SKenneth E. Jansenc.... loop through the time sequences 174*59599516SKenneth E. Jansenc 175*59599516SKenneth E. Jansen do 3000 itsq = 1, ntseq 176*59599516SKenneth E. Jansen itseq = itsq 177*59599516SKenneth E. Jansenc 178*59599516SKenneth E. Jansenc.... set up the current parameters 179*59599516SKenneth E. Jansenc 180*59599516SKenneth E. Jansen nstp = nstep(itseq) 181*59599516SKenneth E. Jansen nitr = niter(itseq) 182*59599516SKenneth E. Jansen LCtime = loctim(itseq) 183*59599516SKenneth E. Jansenc 184*59599516SKenneth E. Jansen call itrSetup ( y, acold) 185*59599516SKenneth E. Jansen isclr=0 186*59599516SKenneth E. Jansen 187*59599516SKenneth E. Jansen niter(itseq)=0 ! count number of flow solves in a step 188*59599516SKenneth E. Jansen ! (# of iterations) 189*59599516SKenneth E. Jansen do i=1,seqsize 190*59599516SKenneth E. Jansen if(stepseq(i).eq.0) niter(itseq)=niter(itseq)+1 191*59599516SKenneth E. Jansen enddo 192*59599516SKenneth E. Jansen nitr = niter(itseq) 193*59599516SKenneth E. Jansenc 194*59599516SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve 195*59599516SKenneth E. Jansenc 196*59599516SKenneth E. Jansen nsclrsol=nsclr ! total number of scalars solved. At 197*59599516SKenneth E. Jansen ! some point we probably want to create 198*59599516SKenneth E. Jansen ! a map, considering stepseq(), to find 199*59599516SKenneth E. Jansen ! what is actually solved and only 200*59599516SKenneth E. Jansen ! dimension EGmasst to the appropriate 201*59599516SKenneth E. Jansen ! size. 202*59599516SKenneth E. Jansen 203*59599516SKenneth E. Jansen if(nsclrsol.gt.0)allocate (EGmasst(numel*nshape*nshape 204*59599516SKenneth E. Jansen & ,nsclrsol)) 205*59599516SKenneth E. Jansen 206*59599516SKenneth E. Jansenc 207*59599516SKenneth E. Jansenc.... loop through the time steps 208*59599516SKenneth E. Jansenc 209*59599516SKenneth E. Jansen ttim(1) = REAL(secs(0.0)) / 100. 210*59599516SKenneth E. Jansen ttim(2) = secs(0.0) 211*59599516SKenneth E. Jansen 212*59599516SKenneth E. Jansenc tcorecp1 = REAL(secs(0.0)) / 100. 213*59599516SKenneth E. Jansenc tcorewc1 = secs(0.0) 214*59599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 215*59599516SKenneth E. Jansen if(myrank.eq.0) then 216*59599516SKenneth E. Jansen tcorecp1 = TMRC() 217*59599516SKenneth E. Jansen endif 218*59599516SKenneth E. Jansen 219*59599516SKenneth E. Jansen rmub=datmat(1,2,1) 220*59599516SKenneth E. Jansen if(rmutarget.gt.0) then 221*59599516SKenneth E. Jansen rmue=rmutarget 222*59599516SKenneth E. Jansen xmulfact=(rmue/rmub)**(1.0/nstp) 223*59599516SKenneth E. Jansen if(myrank.eq.0) then 224*59599516SKenneth E. Jansen write(*,*) 'viscosity will by multiplied by ', xmulfact 225*59599516SKenneth E. Jansen write(*,*) 'to bring it from ', rmub,' down to ', rmue 226*59599516SKenneth E. Jansen endif 227*59599516SKenneth E. Jansen datmat(1,2,1)=datmat(1,2,1)/xmulfact ! make first step right 228*59599516SKenneth E. Jansen else 229*59599516SKenneth E. Jansen rmue=datmat(1,2,1) ! keep constant 230*59599516SKenneth E. Jansen xmulfact=one 231*59599516SKenneth E. Jansen endif 232*59599516SKenneth E. Jansen if(iramp.eq.1) then 233*59599516SKenneth E. Jansen call initBCprofileScale(vbc_prof,BC,yold,x) 234*59599516SKenneth E. Jansen! fix the yold values to the reset BC 235*59599516SKenneth E. Jansen call itrBC (yold, ac, iBC, BC, iper, ilwork) 236*59599516SKenneth E. Jansen isclr=1 ! fix scalar 237*59599516SKenneth E. Jansen call itrBCsclr(yold,ac,iBC,BC,iper,ilwork) 238*59599516SKenneth E. Jansen endif 239*59599516SKenneth E. Jansen 240*59599516SKenneth E. Jansen867 continue 241*59599516SKenneth E. Jansen do 2000 istp = 1, nstp 242*59599516SKenneth E. Jansen if(iramp.eq.1) 243*59599516SKenneth E. Jansen & call BCprofileScale(vbc_prof,BC,yold) 244*59599516SKenneth E. Jansen 245*59599516SKenneth E. Jansenc call rerun_check(stopjob) 246*59599516SKenneth E. Jansencc if(stopjob.ne.0) goto 2001 247*59599516SKenneth E. Jansenc 248*59599516SKenneth E. Jansenc Decay of scalars 249*59599516SKenneth E. Jansenc 250*59599516SKenneth E. Jansen if(nsclr.gt.0 .and. tdecay.ne.1) then 251*59599516SKenneth E. Jansen yold(:,6:ndof)=y(:,6:ndof)*tdecay 252*59599516SKenneth E. Jansen BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*tdecay 253*59599516SKenneth E. Jansen endif 254*59599516SKenneth E. Jansen 255*59599516SKenneth E. Jansen if(nosource.eq.1) BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*0.8 256*59599516SKenneth E. Jansen 257*59599516SKenneth E. Jansen 258*59599516SKenneth E. Jansenc xi=istp*one/nstp 259*59599516SKenneth E. Jansenc datmat(1,2,1)=rmub*(1.0-xi)+xi*rmue 260*59599516SKenneth E. Jansen datmat(1,2,1)=xmulfact*datmat(1,2,1) 261*59599516SKenneth E. Jansen 262*59599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC. 263*59599516SKenneth E. Jansenc these will be for time step n+1 so use lstep+1 264*59599516SKenneth E. Jansenc 265*59599516SKenneth E. Jansen if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl, 266*59599516SKenneth E. Jansen & shpb, shglb, x, BC, iBC) 267*59599516SKenneth E. Jansen 268*59599516SKenneth E. Jansen if(iLES.gt.0) then 269*59599516SKenneth E. Jansenc 270*59599516SKenneth E. Jansenc.... get dynamic model coefficient 271*59599516SKenneth E. Jansenc 272*59599516SKenneth E. Jansen ilesmod=iLES/10 273*59599516SKenneth E. Jansenc 274*59599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model 275*59599516SKenneth E. Jansenc 276*59599516SKenneth E. Jansen if (ilesmod.eq.0) then ! 0 < iLES < 10 => dyn. model calculated 277*59599516SKenneth E. Jansen ! at nodes based on discrete filtering 278*59599516SKenneth E. Jansen call getdmc (yold, shgl, shp, 279*59599516SKenneth E. Jansen & iper, ilwork, nsons, 280*59599516SKenneth E. Jansen & ifath, x) 281*59599516SKenneth E. Jansen endif 282*59599516SKenneth E. Jansen if (ilesmod .eq. 1) then ! 10 < iLES < 20 => dynamic-mixed 283*59599516SKenneth E. Jansen ! at nodes based on discrete filtering 284*59599516SKenneth E. Jansen call bardmc (yold, shgl, shp, 285*59599516SKenneth E. Jansen & iper, ilwork, 286*59599516SKenneth E. Jansen & nsons, ifath, x) 287*59599516SKenneth E. Jansen endif 288*59599516SKenneth E. Jansen if (ilesmod .eq. 2) then ! 20 < iLES < 30 => dynamic at quad 289*59599516SKenneth E. Jansen ! pts based on lumped projection filt. 290*59599516SKenneth E. Jansen call projdmc (yold, shgl, shp, 291*59599516SKenneth E. Jansen & iper, ilwork, x) 292*59599516SKenneth E. Jansen endif 293*59599516SKenneth E. Jansenc 294*59599516SKenneth E. Jansen endif 295*59599516SKenneth E. Jansen 296*59599516SKenneth E. Jansen 297*59599516SKenneth E. Jansenc 298*59599516SKenneth E. Jansenc.... set traction BCs for modeled walls 299*59599516SKenneth E. Jansenc 300*59599516SKenneth E. Jansen if (itwmod.ne.0) then !wallfn check 301*59599516SKenneth E. Jansen call asbwmod(yold, acold, x, BC, iBC, 302*59599516SKenneth E. Jansen & iper, ilwork, ifath, velbar) 303*59599516SKenneth E. Jansen endif 304*59599516SKenneth E. Jansenc 305*59599516SKenneth E. Jansenc.... -----------------------> predictor phase <----------------------- 306*59599516SKenneth E. Jansenc 307*59599516SKenneth E. Jansen call itrPredict( yold, acold, y, ac ) 308*59599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper, ilwork) 309*59599516SKenneth E. Jansen isclr = zero 310*59599516SKenneth E. Jansen if (nsclr.gt.zero) then 311*59599516SKenneth E. Jansen do isclr=1,nsclr 312*59599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 313*59599516SKenneth E. Jansen enddo 314*59599516SKenneth E. Jansen endif 315*59599516SKenneth E. Jansenc 316*59599516SKenneth E. Jansenc.... --------------------> multi-corrector phase <-------------------- 317*59599516SKenneth E. Jansenc 318*59599516SKenneth E. Jansen iter=0 319*59599516SKenneth E. Jansen ilss=0 ! this is a switch thrown on first solve of LS redistance 320*59599516SKenneth E. Jansenc 321*59599516SKenneth E. JansencHACK to make it keep solving RANS until tolerance is reached 322*59599516SKenneth E. Jansenc 323*59599516SKenneth E. Jansen istop=0 324*59599516SKenneth E. Jansen iMoreRANS=0 325*59599516SKenneth E. Jansenc 326*59599516SKenneth E. Jansenc find the the RANS portion of the sequence 327*59599516SKenneth E. Jansenc 328*59599516SKenneth E. Jansen do istepc=1,seqsize 329*59599516SKenneth E. Jansen if(stepseq(istepc).eq.10) iLastRANS=istepc 330*59599516SKenneth E. Jansen enddo 331*59599516SKenneth E. Jansen 332*59599516SKenneth E. Jansen iseqStart= 1 333*59599516SKenneth E. Jansen9876 continue 334*59599516SKenneth E. Jansenc 335*59599516SKenneth E. Jansen do istepc=iseqStart,seqsize 336*59599516SKenneth E. Jansen icode=stepseq(istepc) 337*59599516SKenneth E. Jansen if(mod(icode,10).eq.0) then ! this is a solve 338*59599516SKenneth E. Jansen isolve=icode/10 339*59599516SKenneth E. Jansen if(isolve.eq.0) then ! flow solve (encoded as 0) 340*59599516SKenneth E. Jansenc 341*59599516SKenneth E. Jansen etol=epstol(1) 342*59599516SKenneth E. Jansen iter = iter+1 343*59599516SKenneth E. Jansen ifuncs(1) = ifuncs(1) + 1 344*59599516SKenneth E. Jansenc 345*59599516SKenneth E. Jansenc.... reset the aerodynamic forces 346*59599516SKenneth E. Jansenc 347*59599516SKenneth E. Jansen Force(1) = zero 348*59599516SKenneth E. Jansen Force(2) = zero 349*59599516SKenneth E. Jansen Force(3) = zero 350*59599516SKenneth E. Jansen HFlux = zero 351*59599516SKenneth E. Jansenc 352*59599516SKenneth E. Jansenc.... form the element data and solve the matrix problem 353*59599516SKenneth E. Jansenc 354*59599516SKenneth E. Jansenc.... explicit solver 355*59599516SKenneth E. Jansenc 356*59599516SKenneth E. Jansen if (impl(itseq) .eq. 0) then 357*59599516SKenneth E. Jansen if (myrank .eq. master) 358*59599516SKenneth E. Jansen & call error('itrdrv ','impl ',impl(itseq)) 359*59599516SKenneth E. Jansen endif 360*59599516SKenneth E. Jansen if (mod(impl(1),100)/10 .eq. 1) then ! sparse solve 361*59599516SKenneth E. Jansenc 362*59599516SKenneth E. Jansenc.... preconditioned sparse matrix GMRES solver 363*59599516SKenneth E. Jansenc 364*59599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1))) 365*59599516SKenneth E. Jansen iprec=lhs 366*59599516SKenneth E. Jansen nedof = nflow*nshape 367*59599516SKenneth E. Jansenc write(*,*) 'lhs=',lhs 368*59599516SKenneth E. Jansen call SolGMRs (y, ac, yold, 369*59599516SKenneth E. Jansen & acold, x, 370*59599516SKenneth E. Jansen & iBC, BC, 371*59599516SKenneth E. Jansen & colm, rowp, lhsk, 372*59599516SKenneth E. Jansen & res, 373*59599516SKenneth E. Jansen & BDiag, a(mHBrg), a(meBrg), 374*59599516SKenneth E. Jansen & a(myBrg), a(mRcos), a(mRsin), 375*59599516SKenneth E. Jansen & iper, ilwork, 376*59599516SKenneth E. Jansen & shp, shgl, 377*59599516SKenneth E. Jansen & shpb, shglb, solinc, 378*59599516SKenneth E. Jansen & rerr) 379*59599516SKenneth E. Jansen else if (mod(impl(1),100)/10 .eq. 2) then ! mfg solve 380*59599516SKenneth E. Jansenc 381*59599516SKenneth E. Jansenc.... preconditioned matrix-free GMRES solver 382*59599516SKenneth E. Jansenc 383*59599516SKenneth E. Jansen lhs=0 384*59599516SKenneth E. Jansen iprec = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1))) 385*59599516SKenneth E. Jansen nedof = 0 386*59599516SKenneth E. Jansen call SolMFG (y, ac, yold, 387*59599516SKenneth E. Jansen & acold, x, 388*59599516SKenneth E. Jansen & iBC, BC, 389*59599516SKenneth E. Jansen & res, 390*59599516SKenneth E. Jansen & BDiag, a(mHBrg), a(meBrg), 391*59599516SKenneth E. Jansen & a(myBrg), a(mRcos), a(mRsin), 392*59599516SKenneth E. Jansen & iper, ilwork, 393*59599516SKenneth E. Jansen & shp, shgl, 394*59599516SKenneth E. Jansen & shpb, shglb, solinc, 395*59599516SKenneth E. Jansen & rerr) 396*59599516SKenneth E. Jansenc 397*59599516SKenneth E. Jansen else if (mod(impl(1),100)/10 .eq. 3) then ! ebe solve 398*59599516SKenneth E. Jansenc.... preconditioned ebe matrix GMRES solver 399*59599516SKenneth E. Jansenc 400*59599516SKenneth E. Jansen 401*59599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1))) 402*59599516SKenneth E. Jansen iprec = lhs 403*59599516SKenneth E. Jansen nedof = nflow*nshape 404*59599516SKenneth E. Jansenc write(*,*) 'lhs=',lhs 405*59599516SKenneth E. Jansen call SolGMRe (y, ac, yold, 406*59599516SKenneth E. Jansen & acold, x, 407*59599516SKenneth E. Jansen & iBC, BC, 408*59599516SKenneth E. Jansen & EGmass, res, 409*59599516SKenneth E. Jansen & BDiag, a(mHBrg), a(meBrg), 410*59599516SKenneth E. Jansen & a(myBrg), a(mRcos), a(mRsin), 411*59599516SKenneth E. Jansen & iper, ilwork, 412*59599516SKenneth E. Jansen & shp, shgl, 413*59599516SKenneth E. Jansen & shpb, shglb, solinc, 414*59599516SKenneth E. Jansen & rerr) 415*59599516SKenneth E. Jansen endif 416*59599516SKenneth E. Jansenc 417*59599516SKenneth E. Jansen else ! solve a scalar (encoded at isclr*10) 418*59599516SKenneth E. Jansen ifuncs(isclr+2) = ifuncs(isclr+2) + 1 419*59599516SKenneth E. Jansen etol=epstol(isclr+1) 420*59599516SKenneth E. Jansen isclr=isolve 421*59599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.0) 422*59599516SKenneth E. Jansen & .and.(isclr.eq.2)) then 423*59599516SKenneth E. Jansen ilss=1 ! throw switch (once per step) 424*59599516SKenneth E. Jansenc 425*59599516SKenneth E. Jansenc... copy the first scalar at t=n+1 into the second scalar of the 426*59599516SKenneth E. Jansenc... level sets 427*59599516SKenneth E. Jansenc 428*59599516SKenneth E. Jansen y(:,6) = yold(:,6) + (y(:,6)-yold(:,6))/alfi 429*59599516SKenneth E. Jansen y(:,7) = y(:,6) 430*59599516SKenneth E. Jansen yold(:,7) = y(:,7) 431*59599516SKenneth E. Jansen ac(:,7) = zero 432*59599516SKenneth E. Jansenc 433*59599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 434*59599516SKenneth E. Jansenc 435*59599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the 436*59599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar 437*59599516SKenneth E. Jansenc 438*59599516SKenneth E. Jansen alfit=alfi 439*59599516SKenneth E. Jansen gamit=gami 440*59599516SKenneth E. Jansen almit=almi 441*59599516SKenneth E. Jansen alfi = 1 442*59599516SKenneth E. Jansen gami = 1 443*59599516SKenneth E. Jansen almi = 1 444*59599516SKenneth E. Jansen endif 445*59599516SKenneth E. Jansenc 446*59599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(isclr+2)-1, 447*59599516SKenneth E. Jansen & LHSupd(isclr+2))) 448*59599516SKenneth E. Jansen iprec = lhs 449*59599516SKenneth E. Jansen istop=0 450*59599516SKenneth E. Jansen call SolGMRSclr(y, ac, yold, 451*59599516SKenneth E. Jansen & acold, EGmasst(1,isclr), 452*59599516SKenneth E. Jansen & x, elDw, 453*59599516SKenneth E. Jansen & iBC, BC, 454*59599516SKenneth E. Jansen & rest, 455*59599516SKenneth E. Jansen & a(mHBrg), a(meBrg), 456*59599516SKenneth E. Jansen & a(myBrg), a(mRcos), a(mRsin), 457*59599516SKenneth E. Jansen & iper, ilwork, 458*59599516SKenneth E. Jansen & shp, shgl, 459*59599516SKenneth E. Jansen & shpb, shglb, solinc(1,isclr+5)) 460*59599516SKenneth E. Jansenc 461*59599516SKenneth E. Jansen endif ! end of scalar type solve 462*59599516SKenneth E. Jansenc 463*59599516SKenneth E. Jansenc 464*59599516SKenneth E. Jansenc.... end of the multi-corrector loop 465*59599516SKenneth E. Jansenc 466*59599516SKenneth E. Jansen 1000 continue !check this 467*59599516SKenneth E. Jansen 468*59599516SKenneth E. Jansen else ! this is an update (mod did not equal zero) 469*59599516SKenneth E. Jansen iupdate=icode/10 ! what to update 470*59599516SKenneth E. Jansen if(iupdate.eq.0) then !update flow 471*59599516SKenneth E. Jansen call itrCorrect ( y, ac, yold, acold, solinc) 472*59599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper, ilwork) 473*59599516SKenneth E. Jansen call tnanq(y, 5, 'y_updbc') 474*59599516SKenneth E. Jansenc Elaine-SPEBC 475*59599516SKenneth E. Jansen if((irscale.ge.0).and.(myrank.eq.master)) then 476*59599516SKenneth E. Jansen call genscale(y, x, iBC) 477*59599516SKenneth E. Jansenc call itrBC (y, ac, iBC, BC, iper, ilwork) 478*59599516SKenneth E. Jansen endif 479*59599516SKenneth E. Jansen else ! update scalar 480*59599516SKenneth E. Jansen isclr=iupdate !unless 481*59599516SKenneth E. Jansen if(iupdate.eq.nsclr+1) isclr=0 482*59599516SKenneth E. Jansen call itrCorrectSclr ( y, ac, yold, acold, 483*59599516SKenneth E. Jansen & solinc(1,isclr+5)) 484*59599516SKenneth E. Jansen if (ilset.eq.2 .and. isclr.eq.2) then 485*59599516SKenneth E. Jansen fct2=one/almi 486*59599516SKenneth E. Jansen fct3=one/alfi 487*59599516SKenneth E. Jansen acold(:,7) = acold(:,7) 488*59599516SKenneth E. Jansen & + (ac(:,7)-acold(:,7))*fct2 489*59599516SKenneth E. Jansen yold(:,7) = yold(:,7) 490*59599516SKenneth E. Jansen & + (y(:,7)-yold(:,7))*fct3 491*59599516SKenneth E. Jansen call itrBCSclr ( yold, acold, iBC, BC, 492*59599516SKenneth E. Jansen & iper, ilwork) 493*59599516SKenneth E. Jansen ac(:,7) = acold(:,7)*(one-almi/gami) 494*59599516SKenneth E. Jansen y(:,7) = yold(:,7) 495*59599516SKenneth E. Jansen ac(:,7) = zero 496*59599516SKenneth E. Jansen if (ivconstraint .eq. 1) then 497*59599516SKenneth E. Jansen & 498*59599516SKenneth E. Jansenc ... applying the volume constraint 499*59599516SKenneth E. Jansenc 500*59599516SKenneth E. Jansen call solvecon (y, x, iBC, BC, 501*59599516SKenneth E. Jansen & iper, ilwork, shp, shgl) 502*59599516SKenneth E. Jansenc 503*59599516SKenneth E. Jansen endif ! end of volume constraint calculations 504*59599516SKenneth E. Jansen endif 505*59599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, ilwork) 506*59599516SKenneth E. Jansen endif 507*59599516SKenneth E. Jansen endif !end of switch between solve or update 508*59599516SKenneth E. Jansen enddo ! loop over sequence in step 509*59599516SKenneth E. Jansen if((istop.lt.0).and.(iMoreRANS.lt.5)) then 510*59599516SKenneth E. Jansen iMoreRANS=iMoreRANS+1 511*59599516SKenneth E. Jansen if(myrank.eq.0) write(*,*) 'istop =', istop 512*59599516SKenneth E. Jansen iseqStart=iLastRANS 513*59599516SKenneth E. Jansen goto 9876 514*59599516SKenneth E. Jansen endif 515*59599516SKenneth E. Jansenc 516*59599516SKenneth E. Jansenc Find the solution at the end of the timestep and move it to old 517*59599516SKenneth E. Jansenc 518*59599516SKenneth E. Jansenc.... First to reassign the parameters for the original time integrator scheme 519*59599516SKenneth E. Jansenc 520*59599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.1)) then 521*59599516SKenneth E. Jansen alfi =alfit 522*59599516SKenneth E. Jansen gami =gamit 523*59599516SKenneth E. Jansen almi =almit 524*59599516SKenneth E. Jansen endif 525*59599516SKenneth E. Jansen call itrUpdate( yold, acold, y, ac) 526*59599516SKenneth E. Jansen call itrBC (yold, acold, iBC, BC, iper,ilwork) 527*59599516SKenneth E. Jansenc Elaine-SPEBC 528*59599516SKenneth E. Jansen if((irscale.ge.0).and.(myrank.eq.master)) then 529*59599516SKenneth E. Jansen call genscale(yold, x, iBC) 530*59599516SKenneth E. Jansenc call itrBC (y, ac, iBC, BC, iper, ilwork) 531*59599516SKenneth E. Jansen endif 532*59599516SKenneth E. Jansen do isclr=1,nsclr 533*59599516SKenneth E. Jansen call itrBCSclr (yold, acold, iBC, BC, iper, ilwork) 534*59599516SKenneth E. Jansen enddo 535*59599516SKenneth E. Jansenc 536*59599516SKenneth E. Jansen istep = istep + 1 537*59599516SKenneth E. Jansenc 538*59599516SKenneth E. Jansenc.... compute boundary fluxes and print out 539*59599516SKenneth E. Jansenc 540*59599516SKenneth E. Jansen lstep = lstep + 1 541*59599516SKenneth E. Jansen ntoutv=max(ntout,100) 542*59599516SKenneth E. Jansen if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then 543*59599516SKenneth E. Jansenc 544*59599516SKenneth E. Jansenc here is where we save our averaged field. In some cases we want to 545*59599516SKenneth E. Jansenc write it less frequently 546*59599516SKenneth E. Jansen if( (mod(lstep, ntoutv) .eq. 0) .and. 547*59599516SKenneth E. Jansen & ((irscale.ge.0).or.(itwmod.gt.0) .or. 548*59599516SKenneth E. Jansen & ((nsonmax.eq.1).and.(iLES.gt.0)))) 549*59599516SKenneth E. Jansen & call rwvelb ('out ', velbar ,ifail) 550*59599516SKenneth E. Jansen 551*59599516SKenneth E. Jansen call Bflux (yold, acold, x, 552*59599516SKenneth E. Jansen & shp, shgl, shpb, 553*59599516SKenneth E. Jansen & shglb, nodflx, ilwork) 554*59599516SKenneth E. Jansen endif 555*59599516SKenneth E. Jansenc 556*59599516SKenneth E. Jansenc.... end of the NSTEP and NTSEQ loops 557*59599516SKenneth E. Jansenc 558*59599516SKenneth E. Jansen 559*59599516SKenneth E. Jansenc... dump TIME SERIES 560*59599516SKenneth E. Jansen 561*59599516SKenneth E. Jansen if (exts) then 562*59599516SKenneth E. Jansen if (mod(lstep-1,freq).eq.0) then 563*59599516SKenneth E. Jansen 564*59599516SKenneth E. Jansen if (numpe > 1) then 565*59599516SKenneth E. Jansen do jj = 1, ntspts 566*59599516SKenneth E. Jansen vartssoln((jj-1)*ndof+1:jj*ndof)=varts(jj,:) 567*59599516SKenneth E. Jansen ivarts=zero 568*59599516SKenneth E. Jansen enddo 569*59599516SKenneth E. Jansen do k=1,ndof*ntspts 570*59599516SKenneth E. Jansen if(vartssoln(k).ne.zero) ivarts(k)=1 571*59599516SKenneth E. Jansen enddo 572*59599516SKenneth E. Jansen call MPI_REDUCE(vartssoln, vartssolng, ndof*ntspts, 573*59599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION, MPI_SUM, master, 574*59599516SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 575*59599516SKenneth E. Jansen 576*59599516SKenneth E. Jansen call MPI_REDUCE(ivarts, ivartsg, ndof*ntspts, 577*59599516SKenneth E. Jansen & MPI_INTEGER, MPI_SUM, master, 578*59599516SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 579*59599516SKenneth E. Jansen 580*59599516SKenneth E. Jansen if (myrank.eq.zero) then 581*59599516SKenneth E. Jansen do jj = 1, ntspts 582*59599516SKenneth E. Jansen 583*59599516SKenneth E. Jansen indxvarts = (jj-1)*ndof 584*59599516SKenneth E. Jansen do k=1,ndof 585*59599516SKenneth E. Jansen if(ivartsg(indxvarts+k).ne.0) then ! none of the vartssoln(parts) were non zero 586*59599516SKenneth E. Jansen varts(jj,k)=vartssolng(indxvarts+k)/ 587*59599516SKenneth E. Jansen & ivartsg(indxvarts+k) 588*59599516SKenneth E. Jansen endif 589*59599516SKenneth E. Jansen enddo 590*59599516SKenneth E. Jansen enddo 591*59599516SKenneth E. Jansen endif !only on master 592*59599516SKenneth E. Jansen endif !only if numpe > 1 593*59599516SKenneth E. Jansen 594*59599516SKenneth E. Jansen if( istp.eq. nstp) then !make sure incomplete buffers get purged. 595*59599516SKenneth E. Jansen icheck=mod(nstp,nbuff) 596*59599516SKenneth E. Jansen if(icheck.ne.0) nbuff=icheck 597*59599516SKenneth E. Jansen endif 598*59599516SKenneth E. Jansen 599*59599516SKenneth E. Jansen if (myrank.eq.zero) then 600*59599516SKenneth E. Jansen k=mod(lstep,nbuff) 601*59599516SKenneth E. Jansen if(k.eq.0) k=nbuff 602*59599516SKenneth E. Jansen do jj = 1, ntspts 603*59599516SKenneth E. Jansen vartsbuff(jj,1:5,k)=varts(jj,1:5) 604*59599516SKenneth E. Jansen enddo 605*59599516SKenneth E. Jansen if(k.eq. nbuff) then 606*59599516SKenneth E. Jansen do jj = 1, ntspts 607*59599516SKenneth E. Jansen ifile = 1000+jj 608*59599516SKenneth E. Jansen do ibuf=1,nbuff 609*59599516SKenneth E. Jansen write(ifile,555) lstep-1 -nbuff+ibuf, 610*59599516SKenneth E. Jansen & (vartsbuff(jj,k,ibuf), k=1,5) ! assuming ndof to be 5 611*59599516SKenneth E. Jansen enddo ! buff empty 612*59599516SKenneth E. Jansen 613*59599516SKenneth E. Jansenc call flush(ifile) 614*59599516SKenneth E. Jansen enddo ! jj ntspts 615*59599516SKenneth E. Jansen endif !only dump when buffer full 616*59599516SKenneth E. Jansen endif !only on master 617*59599516SKenneth E. Jansen 618*59599516SKenneth E. Jansen varts(:,:) = zero ! reset the array for next step 619*59599516SKenneth E. Jansen 620*59599516SKenneth E. Jansen 555 format(i6,5(2x,E12.5e2)) 621*59599516SKenneth E. Jansen 622*59599516SKenneth E. Jansen endif 623*59599516SKenneth E. Jansen endif 624*59599516SKenneth E. Jansen 625*59599516SKenneth E. Jansenc 626*59599516SKenneth E. Jansenc.... -------------------> error calculation <----------------- 627*59599516SKenneth E. Jansen if(ierrcalc.eq.1.or.ioybar.eq.1) then 628*59599516SKenneth E. Jansen tfact=one/istep 629*59599516SKenneth E. Jansen do idof=1,ndof 630*59599516SKenneth E. Jansen ybar(:,idof) =tfact*yold(:,idof) + 631*59599516SKenneth E. Jansen & (one-tfact)*ybar(:,idof) 632*59599516SKenneth E. Jansen enddo 633*59599516SKenneth E. Jansenc....compute average 634*59599516SKenneth E. Jansenc... ybar(:,ndof+1:ndof+8) is for avg. of square as uu, vv, ww, pp, TT, uv, uw, and vw 635*59599516SKenneth E. Jansen do idof=1,5 ! avg. of square for 5 flow variables 636*59599516SKenneth E. Jansen ybar(:,ndof+idof) = tfact*yold(:,idof)**2 + 637*59599516SKenneth E. Jansen & (one-tfact)*ybar(:,ndof+idof) 638*59599516SKenneth E. Jansen enddo 639*59599516SKenneth E. Jansen ybar(:,ndof+6) = tfact*yold(:,1)*yold(:,2) + !uv 640*59599516SKenneth E. Jansen & (one-tfact)*ybar(:,ndof+6) 641*59599516SKenneth E. Jansen ybar(:,ndof+7) = tfact*yold(:,1)*yold(:,3) + !uw 642*59599516SKenneth E. Jansen & (one-tfact)*ybar(:,ndof+7) 643*59599516SKenneth E. Jansen ybar(:,ndof+8) = tfact*yold(:,2)*yold(:,3) + !vw 644*59599516SKenneth E. Jansen & (one-tfact)*ybar(:,ndof+8) 645*59599516SKenneth E. Jansenc... compute err 646*59599516SKenneth E. Jansenc rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2 647*59599516SKenneth E. Jansenc rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2 648*59599516SKenneth E. Jansenc rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2 649*59599516SKenneth E. Jansenc rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2 650*59599516SKenneth E. Jansen endif 651*59599516SKenneth E. Jansenc........................................................................... 652*59599516SKenneth E. Jansen 2000 continue 653*59599516SKenneth E. Jansen 2001 continue 654*59599516SKenneth E. Jansen 655*59599516SKenneth E. Jansen ttim(1) = REAL(secs(0.0)) / 100. - ttim(1) 656*59599516SKenneth E. Jansen ttim(2) = secs(0.0) - ttim(2) 657*59599516SKenneth E. Jansen 658*59599516SKenneth E. Jansenc tcorecp2 = REAL(secs(0.0)) / 100. 659*59599516SKenneth E. Jansenc tcorewc2 = secs(0.0) 660*59599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 661*59599516SKenneth E. Jansen if(myrank.eq.0) then 662*59599516SKenneth E. Jansen tcorecp2 = TMRC() 663*59599516SKenneth E. Jansen write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1 664*59599516SKenneth E. Jansen endif 665*59599516SKenneth E. Jansen 666*59599516SKenneth E. Jansenc call wtime 667*59599516SKenneth E. Jansen 668*59599516SKenneth E. Jansen 3000 continue 669*59599516SKenneth E. Jansenc 670*59599516SKenneth E. Jansenc.... ----------------------> Post Processing <---------------------- 671*59599516SKenneth E. Jansenc 672*59599516SKenneth E. Jansenc.... print out the last step 673*59599516SKenneth E. Jansenc 674*59599516SKenneth E. Jansen if ((irs .ge. 1) .and. ((mod(lstep, ntout) .ne. 0) .or. 675*59599516SKenneth E. Jansen & (nstp .eq. 0))) then 676*59599516SKenneth E. Jansen if( (mod(lstep, ntoutv) .eq. 0) .and. 677*59599516SKenneth E. Jansen & ((irscale.ge.0).or.(itwmod.gt.0) .or. 678*59599516SKenneth E. Jansen & ((nsonmax.eq.1).and.(iLES.gt.0)))) 679*59599516SKenneth E. Jansen & call rwvelb ('out ', velbar ,ifail) 680*59599516SKenneth E. Jansen 681*59599516SKenneth E. Jansen call Bflux (yold, acold, x, 682*59599516SKenneth E. Jansen & shp, shgl, shpb, 683*59599516SKenneth E. Jansen & shglb, nodflx, ilwork) 684*59599516SKenneth E. Jansen endif 685*59599516SKenneth E. Jansenc 686*59599516SKenneth E. Jansen if(ierrcalc.eq.1) then 687*59599516SKenneth E. Jansenc 688*59599516SKenneth E. Jansenc.....smooth the error indicators 689*59599516SKenneth E. Jansenc 690*59599516SKenneth E. Jansenc ! errsmooth is currently available only for incompressible code 691*59599516SKenneth E. Jansenc do i=1,ierrsmooth 692*59599516SKenneth E. Jansenc call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC ) 693*59599516SKenneth E. Jansenc end do 694*59599516SKenneth E. Jansen 695*59599516SKenneth E. Jansen call write_error(myrank, lstep, nshg, 10, rerr ) 696*59599516SKenneth E. Jansen endif 697*59599516SKenneth E. Jansen 698*59599516SKenneth E. Jansen if(ioybar.eq.1) then 699*59599516SKenneth E. Jansen call write_field(myrank,'a','ybar',4, 700*59599516SKenneth E. Jansen & ybar,'d',nshg,ndof+8,lstep) 701*59599516SKenneth E. Jansen endif 702*59599516SKenneth E. Jansen 703*59599516SKenneth E. Jansen if(iRANS.lt.0 .and. idistcalc.eq.1) then 704*59599516SKenneth E. Jansen call write_field(myrank,'a','DESd',4, 705*59599516SKenneth E. Jansen & elDw,'d',numel,1,lstep) 706*59599516SKenneth E. Jansen 707*59599516SKenneth E. Jansen call write_field(myrank,'a','dwal',4, 708*59599516SKenneth E. Jansen & d2wall,'d',nshg,1,lstep) 709*59599516SKenneth E. Jansen endif 710*59599516SKenneth E. Jansen 711*59599516SKenneth E. Jansenc 712*59599516SKenneth E. Jansenc.... close history and aerodynamic forces files 713*59599516SKenneth E. Jansenc 714*59599516SKenneth E. Jansen if (myrank .eq. master) then 715*59599516SKenneth E. Jansen close (ihist) 716*59599516SKenneth E. Jansen close (iforce) 717*59599516SKenneth E. Jansen if(exts) then 718*59599516SKenneth E. Jansen deallocate(ivarts) 719*59599516SKenneth E. Jansen deallocate(ivartsg) 720*59599516SKenneth E. Jansen deallocate(vartssoln) 721*59599516SKenneth E. Jansen deallocate(vartssolng) 722*59599516SKenneth E. Jansen do jj=1,ntspts 723*59599516SKenneth E. Jansen close(1000+jj) 724*59599516SKenneth E. Jansen enddo 725*59599516SKenneth E. Jansen endif 726*59599516SKenneth E. Jansen endif 727*59599516SKenneth E. Jansen close (iecho) 728*59599516SKenneth E. Jansen if(iabc==1) deallocate(acs) 729*59599516SKenneth E. Jansenc 730*59599516SKenneth E. Jansenc.... end 731*59599516SKenneth E. Jansenc 732*59599516SKenneth E. Jansen return 733*59599516SKenneth E. Jansen end 734