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