159599516SKenneth E. Jansen subroutine itrdrv (y, ac, 259599516SKenneth E. Jansen & uold, x, 359599516SKenneth E. Jansen & iBC, BC, 459599516SKenneth E. Jansen & iper, ilwork, shp, 559599516SKenneth E. Jansen & shgl, shpb, shglb, 659599516SKenneth E. Jansen & ifath, velbar, nsons ) 759599516SKenneth E. Jansenc 859599516SKenneth E. Jansenc---------------------------------------------------------------------- 959599516SKenneth E. Jansenc 1059599516SKenneth E. Jansenc This iterative driver is the semi-discrete, predictor multi-corrector 1159599516SKenneth E. Jansenc algorithm. It contains the Hulbert Generalized Alpha method which 1259599516SKenneth E. Jansenc is 2nd order accurate for Rho_inf from 0 to 1. The method can be 1359599516SKenneth E. Jansenc made first-order accurate by setting Rho_inf=-1. It uses CGP and 1459599516SKenneth E. Jansenc GMRES iterative solvers. 1559599516SKenneth E. Jansenc 1659599516SKenneth E. Jansenc working arrays: 1759599516SKenneth E. Jansenc y (nshg,ndof) : Y variables 1859599516SKenneth E. Jansenc x (nshg,nsd) : node coordinates 1959599516SKenneth E. Jansenc iBC (nshg) : BC codes 2059599516SKenneth E. Jansenc BC (nshg,ndofBC) : BC constraint parameters 2159599516SKenneth E. Jansenc iper (nshg) : periodicity table 2259599516SKenneth E. Jansenc 2359599516SKenneth E. Jansenc 2459599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 2559599516SKenneth E. Jansenc Alberto Figueroa, Winter 2004. CMM-FSI 2659599516SKenneth E. Jansenc Irene Vignon, Fall 2004. Impedance BC 2759599516SKenneth E. Jansenc---------------------------------------------------------------------- 2859599516SKenneth E. Jansenc 2959599516SKenneth E. Jansen use pvsQbi !gives us splag (the spmass at the end of this run 3059599516SKenneth E. Jansen use specialBC !gives us itvn 3159599516SKenneth E. Jansen use timedata !allows collection of time series 3259599516SKenneth E. Jansen use convolImpFlow !for Imp bc 3359599516SKenneth E. Jansen use convolRCRFlow !for RCR bc 3459599516SKenneth E. Jansen!MR CHANGE 3559599516SKenneth E. Jansen use turbsa ! used to access d2wall 3659599516SKenneth E. Jansen!MR CHANGE END 3759599516SKenneth E. Jansen 3859599516SKenneth E. Jansenc use readarrays !reads in uold and acold 3959599516SKenneth E. Jansen 4059599516SKenneth E. Jansen include "common.h" 4159599516SKenneth E. Jansen include "mpif.h" 4259599516SKenneth E. Jansen include "auxmpi.h" 4359599516SKenneth E. Jansenc 4459599516SKenneth E. Jansen 4559599516SKenneth E. Jansen 4659599516SKenneth E. Jansen real*8 y(nshg,ndof), ac(nshg,ndof), 4759599516SKenneth E. Jansen & yold(nshg,ndof), acold(nshg,ndof), 4859599516SKenneth E. Jansen & u(nshg,nsd), uold(nshg,nsd), 4959599516SKenneth E. Jansen & x(numnp,nsd), solinc(nshg,ndof), 5059599516SKenneth E. Jansen & BC(nshg,ndofBC), tf(nshg,ndof), 5159599516SKenneth E. Jansen & GradV(nshg,nsdsq) 5259599516SKenneth E. Jansen 5359599516SKenneth E. Jansenc 5459599516SKenneth E. Jansen real*8 res(nshg,ndof) 5559599516SKenneth E. Jansenc 5659599516SKenneth E. Jansen real*8 shp(MAXTOP,maxsh,MAXQPT), 5759599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 5859599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 5959599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 6059599516SKenneth E. Jansenc 6159599516SKenneth E. Jansen integer rowp(nshg,nnz), colm(nshg+1), 6259599516SKenneth E. Jansen & iBC(nshg), 6359599516SKenneth E. Jansen & ilwork(nlwork), 6459599516SKenneth E. Jansen & iper(nshg), ifuncs(6) 6559599516SKenneth E. Jansen 6659599516SKenneth E. Jansen real*8 vbc_prof(nshg,3) 6759599516SKenneth E. Jansen 6859599516SKenneth E. Jansen integer stopjob 6959599516SKenneth E. Jansen character*10 cname2 7059599516SKenneth E. Jansen character*5 cname 7159599516SKenneth E. Jansenc 7259599516SKenneth E. Jansenc stuff for dynamic model s.w.avg and wall model 7359599516SKenneth E. Jansenc 7459599516SKenneth E. Jansen dimension ifath(numnp), velbar(nfath,ndof), nsons(nfath) 7559599516SKenneth E. Jansen 7659599516SKenneth E. Jansen dimension wallubar(2),walltot(2) 7759599516SKenneth E. Jansenc 7859599516SKenneth E. Jansenc.... For Farzin's Library 7959599516SKenneth E. Jansenc 8059599516SKenneth E. Jansen integer eqnType, prjFlag, presPrjFlag, verbose 8159599516SKenneth E. Jansenc 8259599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: aperm, atemp, atempS 8359599516SKenneth E. Jansen real*8, allocatable, dimension(:,:,:) :: apermS 8459599516SKenneth E. Jansen 8559599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: lhsP, lhsK, lhsS 8659599516SKenneth E. Jansen real*8 almit, alfit, gamit 8759599516SKenneth E. Jansenc 8859599516SKenneth E. Jansen character*1024 servername 8959599516SKenneth E. Jansen character*20 fname1,fmt1 9059599516SKenneth E. Jansen character*20 fname2,fmt2 9159599516SKenneth E. Jansen character*60 fnamepold, fvarts 9259599516SKenneth E. Jansen character*4 fname4c ! 4 characters 9359599516SKenneth E. Jansen integer iarray(50) ! integers for headers 9459599516SKenneth E. Jansen integer isgn(ndof), isgng(ndof) 9559599516SKenneth E. Jansen 9659599516SKenneth E. Jansen!MR CHANGE 9759599516SKenneth E. Jansen! real*8 rerr(nshg,10), ybar(nshg,13) ! including 7 sq. terms with 3 cross terms of uv, uw and vw 9859599516SKenneth E. Jansen! real*8 rerr(nshg,10), ybar(nshg,12) ! including 7 sq. terms with 3 cross terms of uv, uw and vw 9959599516SKenneth E. Jansen real*8 rerr(nshg,10) 10059599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: ybar, strain, vorticity 10159599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: wallssVec, wallssVecbar 10259599516SKenneth E. Jansen!MR CHANGE 10359599516SKenneth E. Jansen 10459599516SKenneth E. Jansen real*8 tcorecp(2), tcorecpscal(2) 10559599516SKenneth E. Jansen 10659599516SKenneth E. Jansen integer, allocatable, dimension(:) :: ivarts 10759599516SKenneth E. Jansen integer, allocatable, dimension(:) :: ivartsg 10859599516SKenneth E. Jansen integer, allocatable, dimension(:) :: iv_rank 10959599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: vartssoln 11059599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: vartssolng 11159599516SKenneth E. Jansen real*8, allocatable, dimension(:,:,:) :: yphbar 11259599516SKenneth E. Jansen real*8 CFLworst(numel) 11359599516SKenneth E. Jansen 11459599516SKenneth E. Jansen!MR CHANGE 11559599516SKenneth E. Jansen integer :: iv_rankpernode, iv_totnodes, iv_totcores 11659599516SKenneth E. Jansen integer :: iv_node, iv_core, iv_thread 11759599516SKenneth E. Jansen!MR CHANGE 11859599516SKenneth E. Jansen 11959599516SKenneth E. Jansen impistat = 0 12059599516SKenneth E. Jansen impistat2 = 0 12159599516SKenneth E. Jansen iISend = 0 12259599516SKenneth E. Jansen iISendScal = 0 12359599516SKenneth E. Jansen iIRecv = 0 12459599516SKenneth E. Jansen iIRecvScal = 0 12559599516SKenneth E. Jansen iWaitAll = 0 12659599516SKenneth E. Jansen iWaitAllScal = 0 12759599516SKenneth E. Jansen iAllR = 0 12859599516SKenneth E. Jansen iAllRScal = 0 12959599516SKenneth E. Jansen rISend = zero 13059599516SKenneth E. Jansen rISendScal = zero 13159599516SKenneth E. Jansen rIRecv = zero 13259599516SKenneth E. Jansen rIRecvScal = zero 13359599516SKenneth E. Jansen rWaitAll = zero 13459599516SKenneth E. Jansen rWaitAllScal = zero 13559599516SKenneth E. Jansen rAllR = zero 13659599516SKenneth E. Jansen rAllRScal = zero 13759599516SKenneth E. Jansen rCommu = zero 13859599516SKenneth E. Jansen rCommuScal = zero 13959599516SKenneth E. Jansen 14059599516SKenneth E. Jansen call initmemstat() 14159599516SKenneth E. Jansen 14259599516SKenneth E. Jansenc 14359599516SKenneth E. Jansenc hack SA variable 14459599516SKenneth E. Jansenc 14559599516SKenneth E. JansencHack BC(:,7)=BC(:,7)*0.001 14659599516SKenneth E. JansencHack if(lstep.eq.0) y(:,6)=y(:,6)*0.001 14759599516SKenneth E. Jansen call SolverLicenseServer(servername) 14859599516SKenneth E. Jansenc 14959599516SKenneth E. Jansenc only master should be verbose 15059599516SKenneth E. Jansenc 15159599516SKenneth E. Jansen 15259599516SKenneth E. Jansen if(numpe.gt.0 .and. myrank.ne.master)iverbose=0 15359599516SKenneth E. Jansenc 15459599516SKenneth E. Jansen 15559599516SKenneth E. Jansen lskeep=lstep 15659599516SKenneth E. Jansen 15759599516SKenneth E. Jansen inquire(file='xyzts.dat',exist=exts) 15859599516SKenneth E. Jansen if(exts) then 15959599516SKenneth E. Jansen 16059599516SKenneth E. Jansen open(unit=626,file='xyzts.dat',status='old') 16159599516SKenneth E. Jansen read(626,*) ntspts, freq, tolpt, iterat, varcod 16259599516SKenneth E. Jansen call sTD ! sets data structures 16359599516SKenneth E. Jansen 16459599516SKenneth E. Jansen do jj=1,ntspts ! read coordinate data where solution desired 16559599516SKenneth E. Jansen read(626,*) ptts(jj,1),ptts(jj,2),ptts(jj,3) 16659599516SKenneth E. Jansen enddo 16759599516SKenneth E. Jansen close(626) 16859599516SKenneth E. Jansen 16959599516SKenneth E. Jansen statptts(:,:) = 0 17059599516SKenneth E. Jansen parptts(:,:) = zero 17159599516SKenneth E. Jansen varts(:,:) = zero 17259599516SKenneth E. Jansen 17359599516SKenneth E. Jansen allocate (ivarts(ntspts*ndof)) 17459599516SKenneth E. Jansen allocate (ivartsg(ntspts*ndof)) 17559599516SKenneth E. Jansen allocate (iv_rank(ntspts)) 17659599516SKenneth E. Jansen allocate (vartssoln(ntspts*ndof)) 17759599516SKenneth E. Jansen allocate (vartssolng(ntspts*ndof)) 17859599516SKenneth E. Jansen 17959599516SKenneth E. Jansen iv_rankpernode = iv_rankpercore*iv_corepernode 18059599516SKenneth E. Jansen iv_totnodes = numpe/iv_rankpernode 18159599516SKenneth E. Jansen iv_totcores = iv_corepernode*iv_totnodes 18259599516SKenneth E. Jansen if (myrank .eq. 0) then 18359599516SKenneth E. Jansen write(*,*) 'Info for probes:' 18459599516SKenneth E. Jansen write(*,*) ' Ranks per core:',iv_rankpercore 18559599516SKenneth E. Jansen write(*,*) ' Cores per node:',iv_corepernode 18659599516SKenneth E. Jansen write(*,*) ' Ranks per node:',iv_rankpernode 18759599516SKenneth E. Jansen write(*,*) ' Total number of nodes:',iv_totnodes 18859599516SKenneth E. Jansen write(*,*) ' Total number of cores',iv_totcores 18959599516SKenneth E. Jansen endif 19059599516SKenneth E. Jansen 19159599516SKenneth E. Jansen! if (myrank .eq. numpe-1) then 19259599516SKenneth E. Jansen do jj=1,ntspts 19359599516SKenneth E. Jansen 19459599516SKenneth E. Jansen ! Compute the adequate rank which will take care of probe jj 19559599516SKenneth E. Jansen jjm1 = jj-1 19659599516SKenneth E. Jansen iv_node = (iv_totnodes-1)-mod(jjm1,iv_totnodes) 19759599516SKenneth E. Jansen iv_core = (iv_corepernode-1) - mod((jjm1 - 19859599516SKenneth E. Jansen & mod(jjm1,iv_totnodes))/iv_totnodes,iv_corepernode) 19959599516SKenneth E. Jansen iv_thread = (iv_rankpercore-1) - mod((jjm1- 20059599516SKenneth E. Jansen & (mod(jjm1,iv_totcores)))/iv_totcores,iv_rankpercore) 20159599516SKenneth E. Jansen iv_rank(jj) = iv_node*iv_rankpernode 20259599516SKenneth E. Jansen & + iv_core*iv_rankpercore 20359599516SKenneth E. Jansen & + iv_thread 20459599516SKenneth E. Jansen 20559599516SKenneth E. Jansen if(myrank == 0) then 20659599516SKenneth E. Jansen write(*,*) ' Probe', jj, 'handled by rank', 20759599516SKenneth E. Jansen & iv_rank(jj), ' on node', iv_node 20859599516SKenneth E. Jansen endif 20959599516SKenneth E. Jansen 21059599516SKenneth E. Jansen ! Verification just in case 21159599516SKenneth E. Jansen if(iv_rank(jj) .lt.0 .or. iv_rank(jj) .ge. numpe) then 21259599516SKenneth E. Jansen write(*,*) 'WARNING: iv_rank(',jj,') is ', iv_rank(jj), 21359599516SKenneth E. Jansen & ' and reset to numpe-1' 21459599516SKenneth E. Jansen iv_rank(jj) = numpe-1 21559599516SKenneth E. Jansen endif 21659599516SKenneth E. Jansen 21759599516SKenneth E. Jansen ! Open the varts files 21859599516SKenneth E. Jansen if(myrank == iv_rank(jj)) then 21959599516SKenneth E. Jansen fvarts='varts/varts' 22059599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(jj)) 22159599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(lstep)) 22259599516SKenneth E. Jansen fvarts=trim(fvarts)//'.dat' 22359599516SKenneth E. Jansen fvarts=trim(fvarts) 22459599516SKenneth E. Jansen open(unit=1000+jj, file=fvarts, status='unknown') 22559599516SKenneth E. Jansen endif 22659599516SKenneth E. Jansen enddo 22759599516SKenneth E. Jansen! endif 22859599516SKenneth E. Jansen 22959599516SKenneth E. Jansen endif 23059599516SKenneth E. Jansenc 23159599516SKenneth E. Jansenc.... open history and aerodynamic forces files 23259599516SKenneth E. Jansenc 23359599516SKenneth E. Jansen if (myrank .eq. master) then 23459599516SKenneth E. Jansen! open (unit=ihist, file=fhist, status='unknown') 23559599516SKenneth E. Jansen open (unit=iforce, file=fforce, status='unknown') 23659599516SKenneth E. Jansen open (unit=76, file="fort.76", status='unknown') 23759599516SKenneth E. Jansen if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then 23859599516SKenneth E. Jansen fnamepold = 'pold' 23959599516SKenneth E. Jansen fnamepold = trim(fnamepold)//trim(cname2(lstep)) 24059599516SKenneth E. Jansen fnamepold = trim(fnamepold)//'.dat' 24159599516SKenneth E. Jansen fnamepold = trim(fnamepold) 24259599516SKenneth E. Jansen open (unit=8177, file=fnamepold, status='unknown') 24359599516SKenneth E. Jansen endif 24459599516SKenneth E. Jansen endif 24559599516SKenneth E. Jansenc 24659599516SKenneth E. Jansenc.... initialize 24759599516SKenneth E. Jansenc 24859599516SKenneth E. Jansen ifuncs(:) = 0 ! func. evaluation counter 24959599516SKenneth E. Jansen istep = 0 25059599516SKenneth E. Jansen yold = y 25159599516SKenneth E. Jansen acold = ac 25259599516SKenneth E. Jansen 25359599516SKenneth E. Jansen rerr = zero 25459599516SKenneth E. Jansen 25559599516SKenneth E. Jansen if(ierrcalc.eq.1 .or. ioybar.eq.1) then ! we need ybar for error too 25659599516SKenneth E. Jansen if (ivort == 1) then 25759599516SKenneth E. Jansen allocate(ybar(nshg,17)) ! more space for vorticity if requested 25859599516SKenneth E. Jansen else 25959599516SKenneth E. Jansen allocate(ybar(nshg,13)) 26059599516SKenneth E. Jansen endif 26159599516SKenneth E. Jansen ybar = zero ! Initialize ybar to zero, which is essential 26259599516SKenneth E. Jansen endif 26359599516SKenneth E. Jansen 26459599516SKenneth E. Jansen if(ivort == 1) then 26559599516SKenneth E. Jansen allocate(strain(nshg,6)) 26659599516SKenneth E. Jansen allocate(vorticity(nshg,5)) 26759599516SKenneth E. Jansen endif 26859599516SKenneth E. Jansen 26959599516SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 27059599516SKenneth E. Jansen allocate(wallssVec(nshg,3)) 27159599516SKenneth E. Jansen if (ioybar .eq. 1) then 27259599516SKenneth E. Jansen allocate(wallssVecbar(nshg,3)) 27359599516SKenneth E. Jansen wallssVecbar = zero ! Initialization important if mean wss computed 27459599516SKenneth E. Jansen endif 27559599516SKenneth E. Jansen endif 27659599516SKenneth E. Jansen 27759599516SKenneth E. Jansen! both nstepsincycle and nphasesincycle needs to be set 27859599516SKenneth E. Jansen if(nstepsincycle.eq.0) nphasesincycle = 0 27959599516SKenneth E. Jansen if(nphasesincycle.ne.0) then 28059599516SKenneth E. Jansen! & allocate(yphbar(nshg,5,nphasesincycle)) 28159599516SKenneth E. Jansen if (ivort == 1) then 28259599516SKenneth E. Jansen allocate(yphbar(nshg,15,nphasesincycle)) ! more space for vorticity 28359599516SKenneth E. Jansen else 28459599516SKenneth E. Jansen allocate(yphbar(nshg,11,nphasesincycle)) 28559599516SKenneth E. Jansen endif 28659599516SKenneth E. Jansen yphbar = zero 28759599516SKenneth E. Jansen endif 28859599516SKenneth E. Jansen 28959599516SKenneth E. Jansen!MR CHANGE END 29059599516SKenneth E. Jansen 29159599516SKenneth E. Jansen vbc_prof(:,1:3) = BC(:,3:5) 29259599516SKenneth E. Jansen if(iramp.eq.1) then 29359599516SKenneth E. Jansen call BCprofileInit(vbc_prof,x) 29459599516SKenneth E. Jansen endif 29559599516SKenneth E. Jansen 29659599516SKenneth E. Jansenc 29759599516SKenneth E. Jansenc.... ---------------> initialize Farzin's Library <--------------- 29859599516SKenneth E. Jansenc 29959599516SKenneth E. Jansenc.... assign parameter values 30059599516SKenneth E. Jansenc 30159599516SKenneth E. Jansen do i = 1, 100 30259599516SKenneth E. Jansen numeqns(i) = i 30359599516SKenneth E. Jansen enddo 30459599516SKenneth E. Jansen nKvecs = Kspace 30559599516SKenneth E. Jansen prjFlag = iprjFlag 30659599516SKenneth E. Jansen presPrjFlag = ipresPrjFlag 30759599516SKenneth E. Jansen verbose = iverbose 30859599516SKenneth E. Jansenc 30959599516SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve 31059599516SKenneth E. Jansenc 31159599516SKenneth E. Jansen nsolt=mod(impl(1),2) ! 1 if solving temperature 31259599516SKenneth E. Jansen nsclrsol=nsolt+nsclr ! total number of scalars solved At 31359599516SKenneth E. Jansen ! some point we probably want to create 31459599516SKenneth E. Jansen ! a map, considering stepseq(), to find 31559599516SKenneth E. Jansen ! what is actually solved and only 31659599516SKenneth E. Jansen ! dimension lhs to the appropriate 31759599516SKenneth E. Jansen ! size. (see 1.6.1 and earlier for a 31859599516SKenneth E. Jansen ! "failed" attempt at this). 31959599516SKenneth E. Jansen 32059599516SKenneth E. Jansen 32159599516SKenneth E. Jansen nsolflow=mod(impl(1),100)/10 ! 1 if solving flow 32259599516SKenneth E. Jansen 32359599516SKenneth E. Jansenc 32459599516SKenneth E. Jansenc.... Now, call Farzin's lesNew routine to initialize 32559599516SKenneth E. Jansenc memory space 32659599516SKenneth E. Jansenc 32759599516SKenneth E. Jansen call genadj(colm, rowp, icnt ) ! preprocess the adjacency list 32859599516SKenneth E. Jansen 32959599516SKenneth E. Jansen nnz_tot=icnt ! this is exactly the number of non-zero blocks on 33059599516SKenneth E. Jansen ! this proc 33159599516SKenneth E. Jansen 33259599516SKenneth E. Jansen if (nsolflow.eq.1) then 33359599516SKenneth E. Jansen lesId = numeqns(1) 33459599516SKenneth E. Jansen eqnType = 1 33559599516SKenneth E. Jansen nDofs = 4 33659599516SKenneth E. Jansen call myfLesNew( lesId, 41994, 33759599516SKenneth E. Jansen & eqnType, 33859599516SKenneth E. Jansen & nDofs, minIters, maxIters, 33959599516SKenneth E. Jansen & nKvecs, prjFlag, nPrjs, 34059599516SKenneth E. Jansen & presPrjFlag, nPresPrjs, epstol(1), 34159599516SKenneth E. Jansen & prestol, verbose, statsflow, 34259599516SKenneth E. Jansen & nPermDims, nTmpDims, servername ) 34359599516SKenneth E. Jansen 34459599516SKenneth E. Jansen allocate (aperm(nshg,nPermDims)) 34559599516SKenneth E. Jansen allocate (atemp(nshg,nTmpDims)) 34659599516SKenneth E. Jansen allocate (lhsP(4,nnz_tot)) 34759599516SKenneth E. Jansen allocate (lhsK(9,nnz_tot)) 34859599516SKenneth E. Jansen 34959599516SKenneth E. Jansen call readLesRestart( lesId, aperm, nshg, myrank, lstep, 35059599516SKenneth E. Jansen & nPermDims ) 35159599516SKenneth E. Jansen 35259599516SKenneth E. Jansen else 35359599516SKenneth E. Jansen nPermDims = 0 35459599516SKenneth E. Jansen nTempDims = 0 35559599516SKenneth E. Jansen endif 35659599516SKenneth E. Jansen 35759599516SKenneth E. Jansen 35859599516SKenneth E. Jansen if(nsclrsol.gt.0) then 35959599516SKenneth E. Jansen do isolsc=1,nsclrsol 36059599516SKenneth E. Jansen lesId = numeqns(isolsc+1) 36159599516SKenneth E. Jansen eqnType = 2 36259599516SKenneth E. Jansen nDofs = 1 36359599516SKenneth E. Jansen presPrjflag = 0 36459599516SKenneth E. Jansen nPresPrjs = 0 36559599516SKenneth E. Jansen prjFlag = 1 36659599516SKenneth E. Jansen indx=isolsc+2-nsolt ! complicated to keep epstol(2) for 36759599516SKenneth E. Jansen ! temperature followed by scalars 36859599516SKenneth E. Jansen call myfLesNew( lesId, 41994, 36959599516SKenneth E. Jansen & eqnType, 37059599516SKenneth E. Jansen & nDofs, minIters, maxIters, 37159599516SKenneth E. Jansen & nKvecs, prjFlag, nPrjs, 37259599516SKenneth E. Jansen & presPrjFlag, nPresPrjs, epstol(indx), 37359599516SKenneth E. Jansen & prestol, verbose, statssclr, 37459599516SKenneth E. Jansen & nPermDimsS, nTmpDimsS, servername ) 37559599516SKenneth E. Jansen enddo 37659599516SKenneth E. Jansenc 37759599516SKenneth E. Jansenc Assume all scalars have the same size needs 37859599516SKenneth E. Jansenc 37959599516SKenneth E. Jansen allocate (apermS(nshg,nPermDimsS,nsclrsol)) 38059599516SKenneth E. Jansen allocate (atempS(nshg,nTmpDimsS)) !they can all share this 38159599516SKenneth E. Jansen allocate (lhsS(nnz_tot,nsclrsol)) 38259599516SKenneth E. Jansenc 38359599516SKenneth E. Jansenc actually they could even share with atemp but leave that for later 38459599516SKenneth E. Jansenc 38559599516SKenneth E. Jansen else 38659599516SKenneth E. Jansen nPermDimsS = 0 38759599516SKenneth E. Jansen nTmpDimsS = 0 38859599516SKenneth E. Jansen endif 38959599516SKenneth E. Jansenc 39059599516SKenneth E. Jansenc... prepare lumped mass if needed 39159599516SKenneth E. Jansenc 39259599516SKenneth E. Jansen if((flmpr.ne.0).or.(flmpl.ne.0)) call genlmass(x, shp,shgl) 39359599516SKenneth E. Jansenc 39459599516SKenneth E. Jansenc.... -----------------> End of initialization <----------------- 39559599516SKenneth E. Jansenc 39659599516SKenneth E. Jansenc.....open the necessary files to gather time series 39759599516SKenneth E. Jansenc 39859599516SKenneth E. Jansen lstep0 = lstep+1 39959599516SKenneth E. Jansen nsteprcr = nstep(1)+lstep 40059599516SKenneth E. Jansenc 40159599516SKenneth E. Jansenc.... loop through the time sequences 40259599516SKenneth E. Jansenc 40359599516SKenneth E. Jansen 40459599516SKenneth E. Jansen 40559599516SKenneth E. Jansen do 3000 itsq = 1, ntseq 40659599516SKenneth E. Jansen itseq = itsq 40759599516SKenneth E. Jansen 40859599516SKenneth E. JansenCAD tcorecp1 = second(0) 40959599516SKenneth E. JansenCAD tcorewc1 = second(-1) 41059599516SKenneth E. Jansenc 41159599516SKenneth E. Jansenc.... set up the time integration parameters 41259599516SKenneth E. Jansenc 41359599516SKenneth E. Jansen nstp = nstep(itseq) 41459599516SKenneth E. Jansen nitr = niter(itseq) 41559599516SKenneth E. Jansen LCtime = loctim(itseq) 41659599516SKenneth E. Jansen dtol(:)= deltol(itseq,:) 41759599516SKenneth E. Jansen 41859599516SKenneth E. Jansen call itrSetup ( y, acold ) 41959599516SKenneth E. Jansenc 42059599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution, 42159599516SKenneth E. Jansenc which are functions of alphaf so need to do it after itrSetup 42259599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 42359599516SKenneth E. Jansen call calcImpConvCoef (numImpSrfs, ntimeptpT) 42459599516SKenneth E. Jansen endif 42559599516SKenneth E. Jansenc 42659599516SKenneth E. Jansenc...initialize the initial condition P(0)-RQ(0)-Pd(0) for RCR BC 42759599516SKenneth E. Jansenc need ndsurf so should be after initNABI 42859599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 42959599516SKenneth E. Jansen call calcRCRic(y,nsrflistRCR,numRCRSrfs) 43059599516SKenneth E. Jansen endif 43159599516SKenneth E. Jansenc 43259599516SKenneth E. Jansenc find the last solve of the flow in the step sequence so that we will 43359599516SKenneth E. Jansenc know when we are at/near end of step 43459599516SKenneth E. Jansenc 43559599516SKenneth E. Jansenc ilast=0 43659599516SKenneth E. Jansen nitr=0 ! count number of flow solves in a step (# of iterations) 43759599516SKenneth E. Jansen do i=1,seqsize 43859599516SKenneth E. Jansen if(stepseq(i).eq.0) nitr=nitr+1 43959599516SKenneth E. Jansen enddo 44059599516SKenneth E. Jansen 44159599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 44259599516SKenneth E. Jansen tcorecp(:) = zero ! used in solfar.f (solflow) 44359599516SKenneth E. Jansen tcorecpscal(:) = zero ! used in solfar.f (solflow) 44459599516SKenneth E. Jansen if(myrank.eq.0) then 44559599516SKenneth E. Jansen tcorecp1 = TMRC() 44659599516SKenneth E. Jansen endif 44759599516SKenneth E. Jansen 44859599516SKenneth E. Jansenc 44959599516SKenneth E. Jansenc.... loop through the time steps 45059599516SKenneth E. Jansenc 45159599516SKenneth E. Jansen istop=0 45259599516SKenneth E. Jansen rmub=datmat(1,2,1) 45359599516SKenneth E. Jansen if(rmutarget.gt.0) then 45459599516SKenneth E. Jansen rmue=rmutarget 45559599516SKenneth E. Jansen else 45659599516SKenneth E. Jansen rmue=datmat(1,2,1) ! keep constant 45759599516SKenneth E. Jansen endif 45859599516SKenneth E. Jansen 45959599516SKenneth E. Jansen if(iramp.eq.1) then 46059599516SKenneth E. Jansen call BCprofileScale(vbc_prof,BC,yold) ! fix the yold values to the reset BC 46159599516SKenneth E. Jansen isclr=1 ! fix scalar 46259599516SKenneth E. Jansen do isclr=1,nsclr 46359599516SKenneth E. Jansen call itrBCSclr(yold,ac,iBC,BC,iper,ilwork) 46459599516SKenneth E. Jansen enddo 46559599516SKenneth E. Jansen endif 46659599516SKenneth E. Jansen 46759599516SKenneth E. Jansen do 2000 istp = 1, nstp 46859599516SKenneth E. Jansen if(iramp.eq.1) 46959599516SKenneth E. Jansen & call BCprofileScale(vbc_prof,BC,yold) 47059599516SKenneth E. Jansen 47159599516SKenneth E. Jansen call rerun_check(stopjob) 472*32eed141SKenneth E. Jansen if(myrank.eq.master) write(*,*) 473*32eed141SKenneth E. Jansen & 'stopjob,lstep,istep', stopjob,lstep,istep 474*32eed141SKenneth E. Jansen if(stopjob.eq.lstep) then 475*32eed141SKenneth E. Jansen stopjob=-2 ! this is the code to finish 476*32eed141SKenneth E. Jansen if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then 477*32eed141SKenneth E. Jansen if(myrank.eq.master) write(*,*) 478*32eed141SKenneth E. Jansen & 'line 473 says last step written so exit' 479*32eed141SKenneth E. Jansen goto 2002 ! the step was written last step so just exit 480*32eed141SKenneth E. Jansen else 481*32eed141SKenneth E. Jansen if(myrank.eq.master) 482*32eed141SKenneth E. Jansen & write(*,*) 'line 473 says last step not written' 483*32eed141SKenneth E. Jansen istep=nstp ! have to do this so that solution will be written 484*32eed141SKenneth E. Jansen goto 2001 485*32eed141SKenneth E. Jansen endif 486*32eed141SKenneth E. Jansen endif 48759599516SKenneth E. Jansen 48859599516SKenneth E. Jansen xi=istp*1.0/nstp 48959599516SKenneth E. Jansen datmat(1,2,1)=rmub*(1.0-xi)+xi*rmue 49059599516SKenneth E. Jansenc write(*,*) "current mol. visc = ", datmat(1,2,1) 49159599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC. 49259599516SKenneth E. Jansenc these will be for time step n+1 so use lstep+1 49359599516SKenneth E. Jansenc 49459599516SKenneth E. Jansen if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl, 49559599516SKenneth E. Jansen & shpb, shglb, x, BC, iBC) 49659599516SKenneth E. Jansen 49759599516SKenneth E. Jansenc 49859599516SKenneth E. Jansenc ... calculate the pressure contribution that depends on the history for the Imp. BC 49959599516SKenneth E. Jansenc 50059599516SKenneth E. Jansen if(numImpSrfs.gt.0) then 50159599516SKenneth E. Jansen call pHist(poldImp,QHistImp,ImpConvCoef, 50259599516SKenneth E. Jansen & ntimeptpT,numImpSrfs) 50359599516SKenneth E. Jansen if (myrank.eq.master) 50459599516SKenneth E. Jansen & write(8177,*) (poldImp(n), n=1,numImpSrfs) 50559599516SKenneth E. Jansen endif 50659599516SKenneth E. Jansenc 50759599516SKenneth E. Jansenc ... calc the pressure contribution that depends on the history for the RCR BC 50859599516SKenneth E. Jansenc 50959599516SKenneth E. Jansen if(numRCRSrfs.gt.0) then 51059599516SKenneth E. Jansen call CalcHopRCR (Delt(itseq), lstep, numRCRSrfs) 51159599516SKenneth E. Jansen call CalcRCRConvCoef(lstep,numRCRSrfs) 51259599516SKenneth E. Jansen call pHist(poldRCR,QHistRCR,RCRConvCoef,nsteprcr, 51359599516SKenneth E. Jansen & numRCRSrfs) 51459599516SKenneth E. Jansen if (myrank.eq.master) 51559599516SKenneth E. Jansen & write(8177,*) (poldRCR(n), n=1,numRCRSrfs) 51659599516SKenneth E. Jansen endif 51759599516SKenneth E. Jansenc 51859599516SKenneth E. Jansenc Decay of scalars 51959599516SKenneth E. Jansenc 52059599516SKenneth E. Jansen if(nsclr.gt.0 .and. tdecay.ne.1) then 52159599516SKenneth E. Jansen yold(:,6:ndof)=y(:,6:ndof)*tdecay 52259599516SKenneth E. Jansen BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*tdecay 52359599516SKenneth E. Jansen endif 52459599516SKenneth E. Jansen 52559599516SKenneth E. Jansen if(nosource.eq.1) BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*0.8 52659599516SKenneth E. Jansen 52759599516SKenneth E. Jansen 52859599516SKenneth E. Jansen if(iLES.gt.0) then !complicated stuff has moved to 52959599516SKenneth E. Jansen !routine below 53059599516SKenneth E. Jansen call lesmodels(yold, acold, shgl, shp, 53159599516SKenneth E. Jansen & iper, ilwork, rowp, colm, 53259599516SKenneth E. Jansen & nsons, ifath, x, 53359599516SKenneth E. Jansen & iBC, BC) 53459599516SKenneth E. Jansen 53559599516SKenneth E. Jansen 53659599516SKenneth E. Jansen endif 53759599516SKenneth E. Jansen 53859599516SKenneth E. Jansenc.... set traction BCs for modeled walls 53959599516SKenneth E. Jansenc 54059599516SKenneth E. Jansen if (itwmod.ne.0) then 54159599516SKenneth E. Jansen call asbwmod(yold, acold, x, BC, iBC, 54259599516SKenneth E. Jansen & iper, ilwork, ifath, velbar) 54359599516SKenneth E. Jansen endif 54459599516SKenneth E. Jansen 54559599516SKenneth E. Jansen!MR CHANGE 54659599516SKenneth E. Jansenc 54759599516SKenneth E. Jansenc.... Determine whether the vorticity field needs to be computed for this time step or not 54859599516SKenneth E. Jansenc 54959599516SKenneth E. Jansen icomputevort = 0 55059599516SKenneth E. Jansen if (ivort == 1) then ! Print vorticity = True in solver.inp 55159599516SKenneth E. Jansen ! We then compute the vorticity only if we 55259599516SKenneth E. Jansen ! 1) we write an intermediate checkpoint 55359599516SKenneth E. Jansen ! 2) we reach the last time step and write the last checkpoint 55459599516SKenneth E. Jansen ! 3) we accumulate statistics in ybar for every time step 55559599516SKenneth E. Jansen ! BEWARE: we need here lstep+1 and istep+1 because the lstep and 55659599516SKenneth E. Jansen ! istep gets incremened after the flowsolve, further below 55759599516SKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep+1, ntout) .eq. 0)) .or. 55859599516SKenneth E. Jansen & istep+1.eq.nstep(itseq) .or. ioybar == 1) then 55959599516SKenneth E. Jansen icomputevort = 1 56059599516SKenneth E. Jansen endif 56159599516SKenneth E. Jansen endif 56259599516SKenneth E. Jansen 56359599516SKenneth E. Jansen! write(*,*) 'icomputevort: ',icomputevort, ' - istep: ', 56459599516SKenneth E. Jansen! & istep,' - nstep(itseq):',nstep(itseq),'- lstep:', 56559599516SKenneth E. Jansen! & lstep, '- ntout:', ntout 56659599516SKenneth E. Jansen!MR CHANGE 56759599516SKenneth E. Jansen 56859599516SKenneth E. Jansenc 56959599516SKenneth E. Jansenc.... -----------------------> predictor phase <----------------------- 57059599516SKenneth E. Jansenc 57159599516SKenneth E. Jansen call itrPredict(yold, y, acold, ac , uold, u, iBC) 57259599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper,ilwork) 57359599516SKenneth E. Jansen 57459599516SKenneth E. Jansen if(nsolt.eq.1) then 57559599516SKenneth E. Jansen isclr=0 57659599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 57759599516SKenneth E. Jansen endif 57859599516SKenneth E. Jansen do isclr=1,nsclr 57959599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 58059599516SKenneth E. Jansen enddo 58159599516SKenneth E. Jansen iter=0 58259599516SKenneth E. Jansen ilss=0 ! this is a switch thrown on first solve of LS redistance 58359599516SKenneth E. Jansen do istepc=1,seqsize 58459599516SKenneth E. Jansen icode=stepseq(istepc) 58559599516SKenneth E. Jansen if(mod(icode,5).eq.0) then ! this is a solve 58659599516SKenneth E. Jansen isolve=icode/10 58759599516SKenneth E. Jansen if(icode.eq.0) then ! flow solve (encoded as 0) 58859599516SKenneth E. Jansenc 58959599516SKenneth E. Jansen iter = iter+1 59059599516SKenneth E. Jansen ifuncs(1) = ifuncs(1) + 1 59159599516SKenneth E. Jansenc 59259599516SKenneth E. Jansen Force(1) = zero 59359599516SKenneth E. Jansen Force(2) = zero 59459599516SKenneth E. Jansen Force(3) = zero 59559599516SKenneth E. Jansen HFlux = zero 59659599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1))) 59759599516SKenneth E. Jansen 59859599516SKenneth E. Jansen call SolFlow(y, ac, u, 59959599516SKenneth E. Jansen & yold, acold, uold, 60059599516SKenneth E. Jansen & x, iBC, 60159599516SKenneth E. Jansen & BC, res, 60259599516SKenneth E. Jansen & nPermDims, nTmpDims, aperm, 60359599516SKenneth E. Jansen & atemp, iper, 60459599516SKenneth E. Jansen & ilwork, shp, shgl, 60559599516SKenneth E. Jansen & shpb, shglb, rowp, 60659599516SKenneth E. Jansen & colm, lhsK, lhsP, 60759599516SKenneth E. Jansen & solinc, rerr, tcorecp, 60859599516SKenneth E. Jansen & GradV) 60959599516SKenneth E. Jansen 61059599516SKenneth E. Jansen else ! scalar type solve 61159599516SKenneth E. Jansen if (icode.eq.5) then ! Solve for Temperature 61259599516SKenneth E. Jansen ! (encoded as (nsclr+1)*10) 61359599516SKenneth E. Jansen isclr=0 61459599516SKenneth E. Jansen ifuncs(2) = ifuncs(2) + 1 61559599516SKenneth E. Jansen j=1 61659599516SKenneth E. Jansen else ! solve a scalar (encoded at isclr*10) 61759599516SKenneth E. Jansen isclr=isolve 61859599516SKenneth E. Jansen ifuncs(isclr+2) = ifuncs(isclr+2) + 1 61959599516SKenneth E. Jansen j=isclr+nsolt 62059599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.0) 62159599516SKenneth E. Jansen & .and.(isclr.eq.2)) then 62259599516SKenneth E. Jansen ilss=1 ! throw switch (once per step) 62359599516SKenneth E. Jansen y(:,7)=y(:,6) ! redistance field initialized 62459599516SKenneth E. Jansen ac(:,7) = zero 62559599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 62659599516SKenneth E. Jansen & ilwork) 62759599516SKenneth E. Jansenc 62859599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the 62959599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar 63059599516SKenneth E. Jansenc 63159599516SKenneth E. Jansen alfit=alfi 63259599516SKenneth E. Jansen gamit=gami 63359599516SKenneth E. Jansen almit=almi 63459599516SKenneth E. Jansen Deltt=Delt(1) 63559599516SKenneth E. Jansen Dtglt=Dtgl 63659599516SKenneth E. Jansen alfi = 1 63759599516SKenneth E. Jansen gami = 1 63859599516SKenneth E. Jansen almi = 1 63959599516SKenneth E. Jansenc Delt(1)= Deltt ! Give a pseudo time step 64059599516SKenneth E. Jansen Dtgl = one / Delt(1) 64159599516SKenneth E. Jansen endif ! level set eq. 2 64259599516SKenneth E. Jansen endif ! deciding between temperature and scalar 64359599516SKenneth E. Jansen 64459599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(isclr+2)-1, 64559599516SKenneth E. Jansen & LHSupd(isclr+2))) 64659599516SKenneth E. Jansen 64759599516SKenneth E. Jansen call SolSclr(y, ac, u, 64859599516SKenneth E. Jansen & yold, acold, uold, 64959599516SKenneth E. Jansen & x, iBC, 65059599516SKenneth E. Jansen & BC, nPermDimsS,nTmpDimsS, 65159599516SKenneth E. Jansen & apermS(1,1,j), atempS, iper, 65259599516SKenneth E. Jansen & ilwork, shp, shgl, 65359599516SKenneth E. Jansen & shpb, shglb, rowp, 65459599516SKenneth E. Jansen & colm, lhsS(1,j), 65559599516SKenneth E. Jansen & solinc(1,isclr+5), tcorecpscal) 65659599516SKenneth E. Jansen 65759599516SKenneth E. Jansen 65859599516SKenneth E. Jansen endif ! end of scalar type solve 65959599516SKenneth E. Jansen 66059599516SKenneth E. Jansen else ! this is an update (mod did not equal zero) 66159599516SKenneth E. Jansen iupdate=icode/10 ! what to update 66259599516SKenneth E. Jansen if(icode.eq.1) then !update flow 66359599516SKenneth E. Jansen call itrCorrect ( y, ac, u, solinc, iBC) 66459599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper, ilwork) 66559599516SKenneth E. Jansen else ! update scalar 66659599516SKenneth E. Jansen isclr=iupdate !unless 66759599516SKenneth E. Jansen if(icode.eq.6) isclr=0 66859599516SKenneth E. Jansen if(iRANS.lt.-100)then ! RANS 66959599516SKenneth E. Jansen call itrCorrectSclrPos(y,ac,solinc(1,isclr+5)) 67059599516SKenneth E. Jansen else 67159599516SKenneth E. Jansen call itrCorrectSclr (y, ac, solinc(1,isclr+5)) 67259599516SKenneth E. Jansen endif 67359599516SKenneth E. Jansen if (ilset.eq.2 .and. isclr.eq.2) then 67459599516SKenneth E. Jansen if (ivconstraint .eq. 1) then 67559599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 67659599516SKenneth E. Jansen & ilwork) 67759599516SKenneth E. Jansenc 67859599516SKenneth E. Jansenc ... applying the volume constraint on second level set scalar 67959599516SKenneth E. Jansenc 68059599516SKenneth E. Jansen call solvecon (y, x, iBC, BC, 68159599516SKenneth E. Jansen & iper, ilwork, shp, shgl) 68259599516SKenneth E. Jansenc 68359599516SKenneth E. Jansen endif ! end of volume constraint calculations 68459599516SKenneth E. Jansen endif ! end of redistance calculations 68559599516SKenneth E. Jansenc 68659599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 68759599516SKenneth E. Jansen & ilwork) 68859599516SKenneth E. Jansen endif ! end of flow or scalar update 68959599516SKenneth E. Jansen endif ! end of switch between solve or update 69059599516SKenneth E. Jansen enddo ! loop over sequence in step 69159599516SKenneth E. Jansenc 69259599516SKenneth E. Jansenc 69359599516SKenneth E. Jansenc.... obtain the time average statistics 69459599516SKenneth E. Jansenc 69559599516SKenneth E. Jansen if (ioform .eq. 2) then 69659599516SKenneth E. Jansen 69759599516SKenneth E. Jansen call stsGetStats( y, yold, ac, acold, 69859599516SKenneth E. Jansen & u, uold, x, 69959599516SKenneth E. Jansen & shp, shgl, shpb, shglb, 70059599516SKenneth E. Jansen & iBC, BC, iper, ilwork, 70159599516SKenneth E. Jansen & rowp, colm, lhsK, lhsP ) 70259599516SKenneth E. Jansen endif 70359599516SKenneth E. Jansen 70459599516SKenneth E. Jansenc 70559599516SKenneth E. Jansenc Find the solution at the end of the timestep and move it to old 70659599516SKenneth E. Jansenc 70759599516SKenneth E. Jansenc 70859599516SKenneth E. Jansenc ...First to reassign the parameters for the original time integrator scheme 70959599516SKenneth E. Jansenc 71059599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.1)) then 71159599516SKenneth E. Jansen alfi =alfit 71259599516SKenneth E. Jansen gami =gamit 71359599516SKenneth E. Jansen almi =almit 71459599516SKenneth E. Jansen Delt(1)=Deltt 71559599516SKenneth E. Jansen Dtgl =Dtglt 71659599516SKenneth E. Jansen endif 71759599516SKenneth E. Jansen call itrUpdate( yold, acold, uold, y, ac, u) 71859599516SKenneth E. Jansen call itrBC (yold, acold, iBC, BC, iper,ilwork) 71959599516SKenneth E. Jansen 72059599516SKenneth E. Jansen istep = istep + 1 72159599516SKenneth E. Jansen lstep = lstep + 1 72259599516SKenneth E. Jansenc 72359599516SKenneth E. Jansenc .. Print memory consumption on BGQ 72459599516SKenneth E. Jansenc 72559599516SKenneth E. Jansen call printmeminfo("itrdrv"//char(0)) 72659599516SKenneth E. Jansen 72759599516SKenneth E. Jansenc 72859599516SKenneth E. Jansenc .. Compute vorticity 72959599516SKenneth E. Jansenc 73059599516SKenneth E. Jansen if ( icomputevort == 1) then 73159599516SKenneth E. Jansen 73259599516SKenneth E. Jansen ! vorticity components and magnitude 73359599516SKenneth E. Jansen vorticity(:,1) = GradV(:,8)-GradV(:,6) !omega_x 73459599516SKenneth E. Jansen vorticity(:,2) = GradV(:,3)-GradV(:,7) !omega_y 73559599516SKenneth E. Jansen vorticity(:,3) = GradV(:,4)-GradV(:,2) !omega_z 73659599516SKenneth E. Jansen vorticity(:,4) = sqrt( vorticity(:,1)*vorticity(:,1) 73759599516SKenneth E. Jansen & + vorticity(:,2)*vorticity(:,2) 73859599516SKenneth E. Jansen & + vorticity(:,3)*vorticity(:,3) ) 73959599516SKenneth E. Jansen ! Q 74059599516SKenneth E. Jansen strain(:,1) = GradV(:,1) !S11 74159599516SKenneth E. Jansen strain(:,2) = 0.5*(GradV(:,2)+GradV(:,4)) !S12 74259599516SKenneth E. Jansen strain(:,3) = 0.5*(GradV(:,3)+GradV(:,7)) !S13 74359599516SKenneth E. Jansen strain(:,4) = GradV(:,5) !S22 74459599516SKenneth E. Jansen strain(:,5) = 0.5*(GradV(:,6)+GradV(:,8)) !S23 74559599516SKenneth E. Jansen strain(:,6) = GradV(:,9) !S33 74659599516SKenneth E. Jansen 74759599516SKenneth E. Jansen vorticity(:,5) = 0.25*( vorticity(:,4)*vorticity(:,4) !Q 74859599516SKenneth E. Jansen & - 2.0*( strain(:,1)*strain(:,1) 74959599516SKenneth E. Jansen & + 2* strain(:,2)*strain(:,2) 75059599516SKenneth E. Jansen & + 2* strain(:,3)*strain(:,3) 75159599516SKenneth E. Jansen & + strain(:,4)*strain(:,4) 75259599516SKenneth E. Jansen & + 2* strain(:,5)*strain(:,5) 75359599516SKenneth E. Jansen & + strain(:,6)*strain(:,6))) 75459599516SKenneth E. Jansen 75559599516SKenneth E. Jansen endif 75659599516SKenneth E. Jansenc 757*32eed141SKenneth E. Jansenc .. write out the instantaneoud solution 75859599516SKenneth E. Jansenc 759*32eed141SKenneth E. Jansen2001 continue ! we could get here by 2001 label if user requested stop 76059599516SKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or. 76159599516SKenneth E. Jansen & istep.eq.nstep(itseq)) then 762*32eed141SKenneth E. Jansen 763*32eed141SKenneth E. Jansen!so that we can see progress in force file close it so that it flushes 764*32eed141SKenneth E. Jansen!and then reopen in append mode 765*32eed141SKenneth E. Jansen 766*32eed141SKenneth E. Jansen close(iforce) 767*32eed141SKenneth E. Jansen open (unit=iforce, file=fforce, position='append') 76859599516SKenneth E. Jansen 76959599516SKenneth E. Jansen! Call to restar() will open restart file in write mode (and not append mode) 77059599516SKenneth E. Jansen! that is needed as other fields are written in append mode 771*32eed141SKenneth E. Jansen 77259599516SKenneth E. Jansen call restar ('out ', yold ,ac) 77359599516SKenneth E. Jansen if(ideformwall == 1) then 77459599516SKenneth E. Jansen call write_displ(myrank, lstep, nshg, 3, uold ) 77559599516SKenneth E. Jansen endif 77659599516SKenneth E. Jansen 77759599516SKenneth E. Jansen if(ivort == 1) then 77859599516SKenneth E. Jansen call write_field(myrank,'a','vorticity',9,vorticity, 77959599516SKenneth E. Jansen & 'd',nshg,5,lstep) 78059599516SKenneth E. Jansen endif 78159599516SKenneth E. Jansen 78259599516SKenneth E. Jansen call printmeminfo("itrdrv after checkpoint"//char(0)) 783*32eed141SKenneth E. Jansen else if(stopjob.eq.-2) then 784*32eed141SKenneth E. Jansen if(myrank.eq.master) then 785*32eed141SKenneth E. Jansen write(*,*) 'line 755 says no write before stopping' 786*32eed141SKenneth E. Jansen write(*,*) 'istep,nstep,irs',istep,nstep(itseq),irs 78759599516SKenneth E. Jansen endif 788*32eed141SKenneth E. Jansen endif !just the instantaneous stuff for vidos 789*32eed141SKenneth E. Jansenc 790*32eed141SKenneth E. Jansenc.... compute the consistent boundary flux 791*32eed141SKenneth E. Jansenc 792*32eed141SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 793*32eed141SKenneth E. Jansen call Bflux ( yold, acold, uold, x, 794*32eed141SKenneth E. Jansen & shp, shgl, shpb, 795*32eed141SKenneth E. Jansen & shglb, ilwork, iBC, 796*32eed141SKenneth E. Jansen & BC, iper, wallssVec) 797*32eed141SKenneth E. Jansen endif 798*32eed141SKenneth E. Jansen 799*32eed141SKenneth E. Jansen if(stopjob.eq.-2) goto 2003 800*32eed141SKenneth E. Jansen 80159599516SKenneth E. Jansen 80259599516SKenneth E. Jansenc 80359599516SKenneth E. Jansenc ... update the flow history for the impedance convolution, filter it and write it out 80459599516SKenneth E. Jansenc 80559599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 80659599516SKenneth E. Jansen call UpdHistConv(y,nsrflistImp,numImpSrfs) !uses Delt(1) 80759599516SKenneth E. Jansen endif 80859599516SKenneth E. Jansen 80959599516SKenneth E. Jansenc 81059599516SKenneth E. Jansenc ... update the flow history for the RCR convolution 81159599516SKenneth E. Jansenc 81259599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 81359599516SKenneth E. Jansen call UpdHistConv(y,nsrflistRCR,numRCRSrfs) !uses lstep 81459599516SKenneth E. Jansen endif 81559599516SKenneth E. Jansen 81659599516SKenneth E. Jansen 81759599516SKenneth E. Jansenc... dump TIME SERIES 81859599516SKenneth E. Jansen 81959599516SKenneth E. Jansen if (exts) then 82059599516SKenneth E. Jansen if (mod(lstep-1,freq).eq.0) then 82159599516SKenneth E. Jansen 82259599516SKenneth E. Jansen if (numpe > 1) then 82359599516SKenneth E. Jansen do jj = 1, ntspts 82459599516SKenneth E. Jansen vartssoln((jj-1)*ndof+1:jj*ndof)=varts(jj,:) 82559599516SKenneth E. Jansen ivarts=zero 82659599516SKenneth E. Jansen enddo 82759599516SKenneth E. Jansen do k=1,ndof*ntspts 82859599516SKenneth E. Jansen if(vartssoln(k).ne.zero) ivarts(k)=1 82959599516SKenneth E. Jansen enddo 83059599516SKenneth E. Jansen 83159599516SKenneth E. Jansen! call MPI_REDUCE(vartssoln, vartssolng, ndof*ntspts, 83259599516SKenneth E. Jansen! & MPI_DOUBLE_PRECISION, MPI_SUM, master, 83359599516SKenneth E. Jansen! & MPI_COMM_WORLD, ierr) 83459599516SKenneth E. Jansen 83559599516SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 83659599516SKenneth E. Jansen call MPI_ALLREDUCE(vartssoln, vartssolng, 83759599516SKenneth E. Jansen & ndof*ntspts, 83859599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION, MPI_SUM, 83959599516SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 84059599516SKenneth E. Jansen 84159599516SKenneth E. Jansen! call MPI_REDUCE(ivarts, ivartsg, ndof*ntspts, 84259599516SKenneth E. Jansen! & MPI_INTEGER, MPI_SUM, master, 84359599516SKenneth E. Jansen! & MPI_COMM_WORLD, ierr) 84459599516SKenneth E. Jansen 84559599516SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 84659599516SKenneth E. Jansen call MPI_ALLREDUCE(ivarts, ivartsg, ndof*ntspts, 84759599516SKenneth E. Jansen & MPI_INTEGER, MPI_SUM, 84859599516SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 84959599516SKenneth E. Jansen 85059599516SKenneth E. Jansen! if (myrank.eq.zero) then 85159599516SKenneth E. Jansen do jj = 1, ntspts 85259599516SKenneth E. Jansen 85359599516SKenneth E. Jansen if(myrank .eq. iv_rank(jj)) then 85459599516SKenneth E. Jansen ! No need to update all varts components, only the one treated by the expected rank 85559599516SKenneth E. Jansen ! Note: keep varts as a vector, as multiple probes could be treated by one rank 85659599516SKenneth E. Jansen indxvarts = (jj-1)*ndof 85759599516SKenneth E. Jansen do k=1,ndof 85859599516SKenneth E. Jansen if(ivartsg(indxvarts+k).ne.0) then ! none of the vartssoln(parts) were non zero 85959599516SKenneth E. Jansen varts(jj,k)=vartssolng(indxvarts+k)/ 86059599516SKenneth E. Jansen & ivartsg(indxvarts+k) 86159599516SKenneth E. Jansen endif 86259599516SKenneth E. Jansen enddo 86359599516SKenneth E. Jansen endif !only if myrank eq iv_rank(jj) 86459599516SKenneth E. Jansen enddo 86559599516SKenneth E. Jansen! endif !only on master 86659599516SKenneth E. Jansen endif !only if numpe > 1 86759599516SKenneth E. Jansen 86859599516SKenneth E. Jansen! if (myrank.eq.zero) then 86959599516SKenneth E. Jansen do jj = 1, ntspts 87059599516SKenneth E. Jansen if(myrank .eq. iv_rank(jj)) then 87159599516SKenneth E. Jansen ifile = 1000+jj 87259599516SKenneth E. Jansen write(ifile,555) lstep, (varts(jj,k),k=1,ndof) !Beware of format 555 - check ndof 87359599516SKenneth E. Jansenc call flush(ifile) 87459599516SKenneth E. Jansen if (((irs .ge. 1) .and. 87559599516SKenneth E. Jansen & (mod(lstep, ntout) .eq. 0))) then 87659599516SKenneth E. Jansen close(ifile) 87759599516SKenneth E. Jansen fvarts='varts/varts' 87859599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(jj)) 87959599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(lskeep)) 88059599516SKenneth E. Jansen fvarts=trim(fvarts)//'.dat' 88159599516SKenneth E. Jansen fvarts=trim(fvarts) 88259599516SKenneth E. Jansen open(unit=ifile, file=fvarts, 88359599516SKenneth E. Jansen & position='append') 88459599516SKenneth E. Jansen endif !only when dumping restart 88559599516SKenneth E. Jansen endif 88659599516SKenneth E. Jansen enddo 88759599516SKenneth E. Jansen! endif !only on master 88859599516SKenneth E. Jansen 88959599516SKenneth E. Jansen varts(:,:) = zero ! reset the array for next step 89059599516SKenneth E. Jansen 89159599516SKenneth E. Jansen 89259599516SKenneth E. Jansen!555 format(i6,5(2x,E12.5e2)) 89359599516SKenneth E. Jansen555 format(i6,6(2x,E20.12e2)) !assuming ndof = 6 here 89459599516SKenneth E. Jansen 89559599516SKenneth E. Jansen endif 89659599516SKenneth E. Jansen endif 89759599516SKenneth E. Jansen 89859599516SKenneth E. Jansenc 89959599516SKenneth E. Jansenc.... update and the aerodynamic forces 90059599516SKenneth E. Jansenc 90159599516SKenneth E. Jansen call forces ( yold, ilwork ) 90259599516SKenneth E. Jansen 90359599516SKenneth E. Jansen if((irscale.ge.0).or.(itwmod.gt.0)) 90459599516SKenneth E. Jansen & call getvel (yold, ilwork, iBC, 90559599516SKenneth E. Jansen & nsons, ifath, velbar) 90659599516SKenneth E. Jansen 90759599516SKenneth E. Jansen if((irscale.ge.0).and.(myrank.eq.master)) then 90859599516SKenneth E. Jansen call genscale(yold, x, iper, 90959599516SKenneth E. Jansen & iBC, ifath, velbar, 91059599516SKenneth E. Jansen & nsons) 91159599516SKenneth E. Jansen endif 91259599516SKenneth E. Jansenc 91359599516SKenneth E. Jansenc.... print out results. 91459599516SKenneth E. Jansenc 91559599516SKenneth E. Jansen ntoutv=max(ntout,100) ! velb is not needed so often 91659599516SKenneth E. Jansen if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then 91759599516SKenneth E. Jansen if( (mod(lstep, ntoutv) .eq. 0) .and. 91859599516SKenneth E. Jansen & ((irscale.ge.0).or.(itwmod.gt.0) .or. 91959599516SKenneth E. Jansen & ((nsonmax.eq.1).and.(iLES.gt.0)))) 92059599516SKenneth E. Jansen & call rwvelb ('out ', velbar ,ifail) 92159599516SKenneth E. Jansen endif 92259599516SKenneth E. Jansenc 92359599516SKenneth E. Jansenc.... end of the NSTEP and NTSEQ loops 92459599516SKenneth E. Jansenc 92559599516SKenneth E. Jansen 92659599516SKenneth E. Jansen 92759599516SKenneth E. Jansenc 92859599516SKenneth E. Jansenc.... -------------------> error calculation <----------------- 92959599516SKenneth E. Jansenc 93059599516SKenneth E. Jansen if(ierrcalc.eq.1 .or. ioybar.eq.1) then 93159599516SKenneth E. Jansenc$$$c 93259599516SKenneth E. Jansenc$$$c compute average 93359599516SKenneth E. Jansenc$$$c 93459599516SKenneth E. Jansenc$$$ tfact=one/istep 93559599516SKenneth E. Jansenc$$$ ybar =tfact*yold + (one-tfact)*ybar 93659599516SKenneth E. Jansen 93759599516SKenneth E. Jansenc compute average 93859599516SKenneth E. Jansenc ybar(:,1:3) are average velocity components 93959599516SKenneth E. Jansenc ybar(:,4) is average pressure 94059599516SKenneth E. Jansenc ybar(:,5) is average speed 94159599516SKenneth E. Jansenc ybar(:,6:8) is average of sq. of each vel. component 94259599516SKenneth E. Jansenc ybar(:,9) is average of sq. of pressure 94359599516SKenneth E. Jansenc ybar(:,10:12) is average of cross vel. components : uv, uw and vw 94459599516SKenneth E. Jansenc averaging procedure justified only for identical time step sizes 94559599516SKenneth E. Jansenc ybar(:,13) is average of eddy viscosity 94659599516SKenneth E. Jansenc ybar(:,14:16) is average vorticity components 94759599516SKenneth E. Jansenc ybar(:,17) is average vorticity magnitude 94859599516SKenneth E. Jansenc istep is number of time step 94959599516SKenneth E. Jansenc 95059599516SKenneth E. Jansen icollectybar = 0 95159599516SKenneth E. Jansen if(nphasesincycle.eq.0 .or. 95259599516SKenneth E. Jansen & istep.gt.ncycles_startphaseavg*nstepsincycle) then 95359599516SKenneth E. Jansen icollectybar = 1 95459599516SKenneth E. Jansen if((istep-1).eq.ncycles_startphaseavg*nstepsincycle) 95559599516SKenneth E. Jansen & istepsinybar = 0 ! init. to zero in first cycle in avg. 95659599516SKenneth E. Jansen endif 95759599516SKenneth E. Jansen 95859599516SKenneth E. Jansen if(icollectybar.eq.1) then 95959599516SKenneth E. Jansen istepsinybar = istepsinybar+1 96059599516SKenneth E. Jansen tfact=one/istepsinybar 96159599516SKenneth E. Jansen 96259599516SKenneth E. Jansen if(myrank.eq.master .and. nphasesincycle.ne.0 .and. 96359599516SKenneth E. Jansen & mod((istep-1),nstepsincycle).eq.0) 96459599516SKenneth E. Jansen & write(*,*)'nsamples in phase average:',istepsinybar 96559599516SKenneth E. Jansen 96659599516SKenneth E. Jansenc ybar to contain the averaged ((u,v,w),p)-fields 96759599516SKenneth E. Jansenc and speed average, i.e., sqrt(u^2+v^2+w^2) 96859599516SKenneth E. Jansenc and avg. of sq. terms including 96959599516SKenneth E. Jansenc u^2, v^2, w^2, p^2 and cross terms of uv, uw and vw 97059599516SKenneth E. Jansen 97159599516SKenneth E. Jansen ybar(:,1) = tfact*yold(:,1) + (one-tfact)*ybar(:,1) 97259599516SKenneth E. Jansen ybar(:,2) = tfact*yold(:,2) + (one-tfact)*ybar(:,2) 97359599516SKenneth E. Jansen ybar(:,3) = tfact*yold(:,3) + (one-tfact)*ybar(:,3) 97459599516SKenneth E. Jansen ybar(:,4) = tfact*yold(:,4) + (one-tfact)*ybar(:,4) 97559599516SKenneth E. Jansen ybar(:,5) = tfact*sqrt(yold(:,1)**2+yold(:,2)**2+ 97659599516SKenneth E. Jansen & yold(:,3)**2) + (one-tfact)*ybar(:,5) 97759599516SKenneth E. Jansen ybar(:,6) = tfact*yold(:,1)**2 + 97859599516SKenneth E. Jansen & (one-tfact)*ybar(:,6) 97959599516SKenneth E. Jansen ybar(:,7) = tfact*yold(:,2)**2 + 98059599516SKenneth E. Jansen & (one-tfact)*ybar(:,7) 98159599516SKenneth E. Jansen ybar(:,8) = tfact*yold(:,3)**2 + 98259599516SKenneth E. Jansen & (one-tfact)*ybar(:,8) 98359599516SKenneth E. Jansen ybar(:,9) = tfact*yold(:,4)**2 + 98459599516SKenneth E. Jansen & (one-tfact)*ybar(:,9) 98559599516SKenneth E. Jansen ybar(:,10) = tfact*yold(:,1)*yold(:,2) + !uv 98659599516SKenneth E. Jansen & (one-tfact)*ybar(:,10) 98759599516SKenneth E. Jansen ybar(:,11) = tfact*yold(:,1)*yold(:,3) + !uw 98859599516SKenneth E. Jansen & (one-tfact)*ybar(:,11) 98959599516SKenneth E. Jansen ybar(:,12) = tfact*yold(:,2)*yold(:,3) + !vw 99059599516SKenneth E. Jansen & (one-tfact)*ybar(:,12) 99159599516SKenneth E. Jansen!MR CHANGE 99259599516SKenneth E. Jansen if(nsclr.gt.0) !nut 99359599516SKenneth E. Jansen & ybar(:,13) = tfact*yold(:,6) + (one-tfact)*ybar(:,13) 99459599516SKenneth E. Jansen 99559599516SKenneth E. Jansen if(ivort == 1) then !vorticity 99659599516SKenneth E. Jansen ybar(:,14) = tfact*vorticity(:,1) + 99759599516SKenneth E. Jansen & (one-tfact)*ybar(:,14) 99859599516SKenneth E. Jansen ybar(:,15) = tfact*vorticity(:,2) + 99959599516SKenneth E. Jansen & (one-tfact)*ybar(:,15) 100059599516SKenneth E. Jansen ybar(:,16) = tfact*vorticity(:,3) + 100159599516SKenneth E. Jansen & (one-tfact)*ybar(:,16) 100259599516SKenneth E. Jansen ybar(:,17) = tfact*vorticity(:,4) + 100359599516SKenneth E. Jansen & (one-tfact)*ybar(:,17) 100459599516SKenneth E. Jansen endif 100559599516SKenneth E. Jansen 100659599516SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 100759599516SKenneth E. Jansen wallssVecBar(:,1) = tfact*wallssVec(:,1) 100859599516SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,1) 100959599516SKenneth E. Jansen wallssVecBar(:,2) = tfact*wallssVec(:,2) 101059599516SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,2) 101159599516SKenneth E. Jansen wallssVecBar(:,3) = tfact*wallssVec(:,3) 101259599516SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,3) 101359599516SKenneth E. Jansen endif 101459599516SKenneth E. Jansen!MR CHANGE END 101559599516SKenneth E. Jansen endif 101659599516SKenneth E. Jansenc 101759599516SKenneth E. Jansenc compute phase average 101859599516SKenneth E. Jansenc 101959599516SKenneth E. Jansen if(nphasesincycle.ne.0 .and. 102059599516SKenneth E. Jansen & istep.gt.ncycles_startphaseavg*nstepsincycle) then 102159599516SKenneth E. Jansen 102259599516SKenneth E. Jansenc beginning of cycle is considered as ncycles_startphaseavg*nstepsincycle+1 102359599516SKenneth E. Jansen if((istep-1).eq.ncycles_startphaseavg*nstepsincycle) 102459599516SKenneth E. Jansen & icyclesinavg = 0 ! init. to zero in first cycle in avg. 102559599516SKenneth E. Jansen 102659599516SKenneth E. Jansen ! find number of steps between phases 102759599516SKenneth E. Jansen nstepsbtwphase = nstepsincycle/nphasesincycle ! integer value 102859599516SKenneth E. Jansen if(mod(istep-1,nstepsincycle).eq.0) then 102959599516SKenneth E. Jansen iphase = 1 ! init. to one in beginning of every cycle 103059599516SKenneth E. Jansen icyclesinavg = icyclesinavg + 1 103159599516SKenneth E. Jansen endif 103259599516SKenneth E. Jansen 103359599516SKenneth E. Jansen icollectphase = 0 103459599516SKenneth E. Jansen istepincycle = mod(istep,nstepsincycle) 103559599516SKenneth E. Jansen if(istepincycle.eq.0) istepincycle=nstepsincycle 103659599516SKenneth E. Jansen if(istepincycle.eq.iphase*nstepsbtwphase) then 103759599516SKenneth E. Jansen icollectphase = 1 103859599516SKenneth E. Jansen iphase = iphase+1 ! use 'iphase-1' below 103959599516SKenneth E. Jansen endif 104059599516SKenneth E. Jansen 104159599516SKenneth E. Jansen if(icollectphase.eq.1) then 104259599516SKenneth E. Jansen tfactphase = one/icyclesinavg 104359599516SKenneth E. Jansen 104459599516SKenneth E. Jansen if(myrank.eq.master) then 104559599516SKenneth E. Jansen write(*,*) 'nsamples in phase ',iphase-1,': ', 104659599516SKenneth E. Jansen & icyclesinavg 104759599516SKenneth E. Jansen endif 104859599516SKenneth E. Jansen 104959599516SKenneth E. Jansen yphbar(:,1,iphase-1) = tfactphase*yold(:,1) + 105059599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,1,iphase-1) 105159599516SKenneth E. Jansen yphbar(:,2,iphase-1) = tfactphase*yold(:,2) + 105259599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,2,iphase-1) 105359599516SKenneth E. Jansen yphbar(:,3,iphase-1) = tfactphase*yold(:,3) + 105459599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,3,iphase-1) 105559599516SKenneth E. Jansen yphbar(:,4,iphase-1) = tfactphase*yold(:,4) + 105659599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,4,iphase-1) 105759599516SKenneth E. Jansen yphbar(:,5,iphase-1) = tfactphase*sqrt(yold(:,1)**2 105859599516SKenneth E. Jansen & +yold(:,2)**2+yold(:,3)**2) + 105959599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,5,iphase-1) 106059599516SKenneth E. Jansen!MR CHANGE 106159599516SKenneth E. Jansen yphbar(:,6,iphase-1) = 106259599516SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,1) 106359599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,6,iphase-1) 106459599516SKenneth E. Jansen 106559599516SKenneth E. Jansen yphbar(:,7,iphase-1) = 106659599516SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,2) 106759599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,7,iphase-1) 106859599516SKenneth E. Jansen 106959599516SKenneth E. Jansen yphbar(:,8,iphase-1) = 107059599516SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,3) 107159599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,8,iphase-1) 107259599516SKenneth E. Jansen 107359599516SKenneth E. Jansen yphbar(:,9,iphase-1) = 107459599516SKenneth E. Jansen & tfactphase*yold(:,2)*yold(:,2) 107559599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,9,iphase-1) 107659599516SKenneth E. Jansen 107759599516SKenneth E. Jansen yphbar(:,10,iphase-1) = 107859599516SKenneth E. Jansen & tfactphase*yold(:,2)*yold(:,3) 107959599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,10,iphase-1) 108059599516SKenneth E. Jansen 108159599516SKenneth E. Jansen yphbar(:,11,iphase-1) = 108259599516SKenneth E. Jansen & tfactphase*yold(:,3)*yold(:,3) 108359599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,11,iphase-1) 108459599516SKenneth E. Jansen 108559599516SKenneth E. Jansen if(ivort == 1) then 108659599516SKenneth E. Jansen yphbar(:,12,iphase-1) = 108759599516SKenneth E. Jansen & tfactphase*vorticity(:,1) 108859599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,12,iphase-1) 108959599516SKenneth E. Jansen yphbar(:,13,iphase-1) = 109059599516SKenneth E. Jansen & tfactphase*vorticity(:,2) 109159599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,13,iphase-1) 109259599516SKenneth E. Jansen yphbar(:,14,iphase-1) = 109359599516SKenneth E. Jansen & tfactphase*vorticity(:,3) 109459599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,14,iphase-1) 109559599516SKenneth E. Jansen yphbar(:,15,iphase-1) = 109659599516SKenneth E. Jansen & tfactphase*vorticity(:,4) 109759599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,15,iphase-1) 109859599516SKenneth E. Jansen endif 109959599516SKenneth E. Jansen!MR CHANGE END 110059599516SKenneth E. Jansen endif 110159599516SKenneth E. Jansen endif 110259599516SKenneth E. Jansenc 110359599516SKenneth E. Jansenc compute rms 110459599516SKenneth E. Jansenc 110559599516SKenneth E. Jansen if(icollectybar.eq.1) then 110659599516SKenneth E. Jansen rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2 110759599516SKenneth E. Jansen rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2 110859599516SKenneth E. Jansen rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2 110959599516SKenneth E. Jansen rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2 111059599516SKenneth E. Jansen endif 111159599516SKenneth E. Jansen endif 1112*32eed141SKenneth E. Jansen 2003 continue ! we get here if stopjob equals lstep and this jumped over 1113*32eed141SKenneth E. Jansen! the statistics computation because we have no new data to average in 1114*32eed141SKenneth E. Jansen! rather we are just trying to output the last state that was not already 1115*32eed141SKenneth E. Jansen! written 1116*32eed141SKenneth E. Jansenc 1117*32eed141SKenneth E. Jansenc.... ----------------------> Complete Restart Processing <---------------------- 1118*32eed141SKenneth E. Jansenc 1119*32eed141SKenneth E. Jansen! for now it is the same frequency but need to change this 1120*32eed141SKenneth E. Jansen! soon.... but don't forget to change the field counter in 1121*32eed141SKenneth E. Jansen! new_interface.cc 1122*32eed141SKenneth E. Jansen! 1123*32eed141SKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or. 1124*32eed141SKenneth E. Jansen & istep.eq.nstep(itseq)) then 1125*32eed141SKenneth E. Jansen if ((irs .ge. 1) .and. ((mod(lstep, ntout) .ne. 0) .or. 1126*32eed141SKenneth E. Jansen & (nstp .eq. 0))) then 1127*32eed141SKenneth E. Jansen if( 1128*32eed141SKenneth E. Jansen & ((irscale.ge.0).or.(itwmod.gt.0) .or. 1129*32eed141SKenneth E. Jansen & ((nsonmax.eq.1).and.iLES.gt.0))) 1130*32eed141SKenneth E. Jansen & call rwvelb ('out ', velbar ,ifail) 1131*32eed141SKenneth E. Jansen endif 113259599516SKenneth E. Jansen 1133*32eed141SKenneth E. Jansen lesId = numeqns(1) 1134*32eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1135*32eed141SKenneth E. Jansen if(myrank.eq.0) then 1136*32eed141SKenneth E. Jansen tcormr1 = TMRC() 1137*32eed141SKenneth E. Jansen endif 1138*32eed141SKenneth E. Jansen call saveLesRestart( lesId, aperm , nshg, myrank, lstep, 1139*32eed141SKenneth E. Jansen & nPermDims ) 1140*32eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1141*32eed141SKenneth E. Jansen if(myrank.eq.0) then 1142*32eed141SKenneth E. Jansen tcormr2 = TMRC() 1143*32eed141SKenneth E. Jansen write(6,*) 'call saveLesRestart for projection and'// 1144*32eed141SKenneth E. Jansen & 'pressure projection vectors', tcormr2-tcormr1 1145*32eed141SKenneth E. Jansen endif 1146*32eed141SKenneth E. Jansen 1147*32eed141SKenneth E. Jansen if(ierrcalc.eq.1) then 1148*32eed141SKenneth E. Jansenc 1149*32eed141SKenneth E. Jansenc.....smooth the error indicators 1150*32eed141SKenneth E. Jansenc 1151*32eed141SKenneth E. Jansen do i=1,ierrsmooth 1152*32eed141SKenneth E. Jansen call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC ) 1153*32eed141SKenneth E. Jansen end do 1154*32eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1155*32eed141SKenneth E. Jansen if(myrank.eq.0) then 1156*32eed141SKenneth E. Jansen tcormr1 = TMRC() 1157*32eed141SKenneth E. Jansen endif 1158*32eed141SKenneth E. Jansen call write_error(myrank, lstep, nshg, 10, rerr ) 1159*32eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1160*32eed141SKenneth E. Jansen if(myrank.eq.0) then 1161*32eed141SKenneth E. Jansen tcormr2 = TMRC() 1162*32eed141SKenneth E. Jansen write(6,*) 'Time to write the error fields to the disks', 1163*32eed141SKenneth E. Jansen & tcormr2-tcormr1 1164*32eed141SKenneth E. Jansen endif 1165*32eed141SKenneth E. Jansen endif ! ierrcalc 1166*32eed141SKenneth E. Jansen 1167*32eed141SKenneth E. Jansen if(ioybar.eq.1) then 1168*32eed141SKenneth E. Jansen if(ivort == 1) then 1169*32eed141SKenneth E. Jansen call write_field(myrank,'a','ybar',4, 1170*32eed141SKenneth E. Jansen & ybar,'d',nshg,17,lstep) 1171*32eed141SKenneth E. Jansen else 1172*32eed141SKenneth E. Jansen call write_field(myrank,'a','ybar',4, 1173*32eed141SKenneth E. Jansen & ybar,'d',nshg,13,lstep) 1174*32eed141SKenneth E. Jansen endif 1175*32eed141SKenneth E. Jansen 1176*32eed141SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 1177*32eed141SKenneth E. Jansen call write_field(myrank,'a','wssbar',6, 1178*32eed141SKenneth E. Jansen & wallssVecBar,'d',nshg,3,lstep) 1179*32eed141SKenneth E. Jansen endif 1180*32eed141SKenneth E. Jansen 1181*32eed141SKenneth E. Jansen if(nphasesincycle .gt. 0) then 1182*32eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1183*32eed141SKenneth E. Jansen if(myrank.eq.0) then 1184*32eed141SKenneth E. Jansen tcormr1 = TMRC() 1185*32eed141SKenneth E. Jansen endif 1186*32eed141SKenneth E. Jansen do iphase=1,nphasesincycle 1187*32eed141SKenneth E. Jansen if(ivort == 1) then 1188*32eed141SKenneth E. Jansen call write_phavg2(myrank,'a','phase_average',13,iphase, 1189*32eed141SKenneth E. Jansen & nphasesincycle,yphbar(:,:,iphase),'d',nshg,15,lstep) 1190*32eed141SKenneth E. Jansen else 1191*32eed141SKenneth E. Jansen call write_phavg2(myrank,'a','phase_average',13,iphase, 1192*32eed141SKenneth E. Jansen & nphasesincycle,yphbar(:,:,iphase),'d',nshg,11,lstep) 1193*32eed141SKenneth E. Jansen endif 1194*32eed141SKenneth E. Jansen end do 1195*32eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1196*32eed141SKenneth E. Jansen if(myrank.eq.0) then 1197*32eed141SKenneth E. Jansen tcormr2 = TMRC() 1198*32eed141SKenneth E. Jansen write(6,*) 'write all phase avg to the disks = ', 1199*32eed141SKenneth E. Jansen & tcormr2-tcormr1 1200*32eed141SKenneth E. Jansen endif 1201*32eed141SKenneth E. Jansen endif !nphasesincyle 1202*32eed141SKenneth E. Jansen endif !ioybar 1203*32eed141SKenneth E. Jansen 1204*32eed141SKenneth E. Jansen if ( ( ihessian .eq. 1 ) .and. ( numpe < 2 ) )then 1205*32eed141SKenneth E. Jansen uhess = zero 1206*32eed141SKenneth E. Jansen gradu = zero 1207*32eed141SKenneth E. Jansen tf = zero 1208*32eed141SKenneth E. Jansen 1209*32eed141SKenneth E. Jansen do ku=1,nshg 1210*32eed141SKenneth E. Jansen tf(ku,1) = x(ku,1)**3 1211*32eed141SKenneth E. Jansen end do 1212*32eed141SKenneth E. Jansen call hessian( yold, x, shp, shgl, iBC, 1213*32eed141SKenneth E. Jansen & shpb, shglb, iper, ilwork, uhess, gradu ) 1214*32eed141SKenneth E. Jansen 1215*32eed141SKenneth E. Jansen call write_hessian( uhess, gradu, nshg ) 1216*32eed141SKenneth E. Jansen endif 1217*32eed141SKenneth E. Jansen 1218*32eed141SKenneth E. Jansen if(iRANS.lt.0) then 1219*32eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1220*32eed141SKenneth E. Jansen if(myrank.eq.0) then 1221*32eed141SKenneth E. Jansen tcormr1 = TMRC() 1222*32eed141SKenneth E. Jansen endif 1223*32eed141SKenneth E. Jansen call write_field(myrank,'a','dwal',4,d2wall,'d', 1224*32eed141SKenneth E. Jansen & nshg,1,lstep) 1225*32eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1226*32eed141SKenneth E. Jansen if(myrank.eq.0) then 1227*32eed141SKenneth E. Jansen tcormr2 = TMRC() 1228*32eed141SKenneth E. Jansen write(6,*) 'Time to write dwal to the disks = ', 1229*32eed141SKenneth E. Jansen & tcormr2-tcormr1 1230*32eed141SKenneth E. Jansen endif 1231*32eed141SKenneth E. Jansen endif !iRANS 1232*32eed141SKenneth E. Jansen 1233*32eed141SKenneth E. Jansen endif ! write out complete restart state 1234*32eed141SKenneth E. Jansen !next 2 lines are two ways to end early 1235*32eed141SKenneth E. Jansen if(stopjob.eq.-2) goto 2002 1236*32eed141SKenneth E. Jansen if(istop.eq.1000) goto 2002 ! stop when delta small (see rstatic) 123759599516SKenneth E. Jansen 2000 continue 1238*32eed141SKenneth E. Jansen 2002 continue 1239*32eed141SKenneth E. Jansen 1240*32eed141SKenneth E. Jansen! dnoe with time stepping so deallocate fields alfready written 1241*32eed141SKenneth E. Jansen! 1242*32eed141SKenneth E. Jansen if(ioybar.eq.1) then 1243*32eed141SKenneth E. Jansen deallocate(ybar) 1244*32eed141SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 1245*32eed141SKenneth E. Jansen deallocate(wallssVecbar) 1246*32eed141SKenneth E. Jansen endif 1247*32eed141SKenneth E. Jansen if(nphasesincycle .gt. 0) then 1248*32eed141SKenneth E. Jansen deallocate(yphbar) 1249*32eed141SKenneth E. Jansen endif !nphasesincyle 1250*32eed141SKenneth E. Jansen endif !ioybar 1251*32eed141SKenneth E. Jansen if(ivort == 1) then 1252*32eed141SKenneth E. Jansen deallocate(strain,vorticity) 1253*32eed141SKenneth E. Jansen endif 1254*32eed141SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 1255*32eed141SKenneth E. Jansen deallocate(wallssVec) 1256*32eed141SKenneth E. Jansen endif 1257*32eed141SKenneth E. Jansen if(iRANS.lt.0) then 1258*32eed141SKenneth E. Jansen deallocate(d2wall) 1259*32eed141SKenneth E. Jansen endif 126059599516SKenneth E. Jansen 126159599516SKenneth E. Jansen 126259599516SKenneth E. JansenCAD tcorecp2 = second(0) 126359599516SKenneth E. JansenCAD tcorewc2 = second(-1) 126459599516SKenneth E. Jansen 126559599516SKenneth E. JansenCAD write(6,*) 'T(core) cpu-wallclock = ',tcorecp2-tcorecp1, 126659599516SKenneth E. JansenCAD & tcorewc2-tcorewc1 126759599516SKenneth E. Jansen 126859599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 126959599516SKenneth E. Jansen if(myrank.eq.0) then 127059599516SKenneth E. Jansen tcorecp2 = TMRC() 127159599516SKenneth E. Jansen write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1 127259599516SKenneth E. Jansen write(6,*) '(Elm. form.',tcorecp(1), 127359599516SKenneth E. Jansen & ',Lin. alg. sol.',tcorecp(2),')' 127459599516SKenneth E. Jansen write(6,*) '(Elm. form. Scal.',tcorecpscal(1), 127559599516SKenneth E. Jansen & ',Lin. alg. sol. Scal.',tcorecpscal(2),')' 127659599516SKenneth E. Jansen write(6,*) '' 127759599516SKenneth E. Jansen 127859599516SKenneth E. Jansen endif 127959599516SKenneth E. Jansen 128059599516SKenneth E. Jansen call print_system_stats(tcorecp, tcorecpscal) 128159599516SKenneth E. Jansen call print_mesh_stats() 128259599516SKenneth E. Jansen call print_mpi_stats() 128359599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 128459599516SKenneth E. Jansen! return 128559599516SKenneth E. Jansenc call MPI_Finalize() 128659599516SKenneth E. Jansenc call MPI_ABORT(MPI_COMM_WORLD, ierr) 128759599516SKenneth E. Jansen 128859599516SKenneth E. Jansen 3000 continue 128959599516SKenneth E. Jansen 129059599516SKenneth E. Jansen 129159599516SKenneth E. Jansenc 129259599516SKenneth E. Jansenc.... close history and aerodynamic forces files 129359599516SKenneth E. Jansenc 129459599516SKenneth E. Jansen if (myrank .eq. master) then 129559599516SKenneth E. Jansen! close (ihist) 129659599516SKenneth E. Jansen close (iforce) 129759599516SKenneth E. Jansen close(76) 129859599516SKenneth E. Jansen if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then 129959599516SKenneth E. Jansen close (8177) 130059599516SKenneth E. Jansen endif 130159599516SKenneth E. Jansen endif 130259599516SKenneth E. Jansenc 130359599516SKenneth E. Jansenc.... close varts file for probes 130459599516SKenneth E. Jansenc 130559599516SKenneth E. Jansen if(exts) then 130659599516SKenneth E. Jansen do jj=1,ntspts 130759599516SKenneth E. Jansen if (myrank == iv_rank(jj)) then 130859599516SKenneth E. Jansen close(1000+jj) 130959599516SKenneth E. Jansen endif 131059599516SKenneth E. Jansen enddo 131159599516SKenneth E. Jansen deallocate (ivarts) 131259599516SKenneth E. Jansen deallocate (ivartsg) 131359599516SKenneth E. Jansen deallocate (iv_rank) 131459599516SKenneth E. Jansen deallocate (vartssoln) 131559599516SKenneth E. Jansen deallocate (vartssolng) 131659599516SKenneth E. Jansen endif 131759599516SKenneth E. Jansen 131859599516SKenneth E. Jansen!MR CHANGE 131959599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 132059599516SKenneth E. Jansen if(myrank.eq.0) then 132159599516SKenneth E. Jansen write(*,*) 'itrdrv - done with aerodynamic forces' 132259599516SKenneth E. Jansen endif 132359599516SKenneth E. Jansen!MR CHANGE 132459599516SKenneth E. Jansen 132559599516SKenneth E. Jansen do isrf = 0,MAXSURF 132659599516SKenneth E. Jansen! if ( nsrflist(isrf).ne.0 ) then 132759599516SKenneth E. Jansen if ( nsrflist(isrf).ne.0 .and. 132859599516SKenneth E. Jansen & myrank.eq.irankfilesforce(isrf)) then 132959599516SKenneth E. Jansen iunit=60+isrf 133059599516SKenneth E. Jansen close(iunit) 133159599516SKenneth E. Jansen endif 133259599516SKenneth E. Jansen enddo 133359599516SKenneth E. Jansen 133459599516SKenneth E. Jansen!MR CHANGE 133559599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 133659599516SKenneth E. Jansen if(myrank.eq.0) then 133759599516SKenneth E. Jansen write(*,*) 'itrdrv - done with MAXSURF' 133859599516SKenneth E. Jansen endif 133959599516SKenneth E. Jansen!MR CHANGE 134059599516SKenneth E. Jansen 134159599516SKenneth E. Jansen 134259599516SKenneth E. Jansen 5 format(1X,F15.10,3X,F15.10,3X,F15.10,3X,F15.10) 134359599516SKenneth E. Jansen 444 format(6(2x,e14.7)) 134459599516SKenneth E. Jansenc 134559599516SKenneth E. Jansenc.... end 134659599516SKenneth E. Jansenc 134759599516SKenneth E. Jansen if(nsolflow.eq.1) then 134859599516SKenneth E. Jansen deallocate (lhsK) 134959599516SKenneth E. Jansen deallocate (lhsP) 135059599516SKenneth E. Jansen deallocate (aperm) 135159599516SKenneth E. Jansen deallocate (atemp) 135259599516SKenneth E. Jansen endif 135359599516SKenneth E. Jansen if(nsclrsol.gt.0) then 135459599516SKenneth E. Jansen deallocate (lhsS) 135559599516SKenneth E. Jansen deallocate (apermS) 135659599516SKenneth E. Jansen deallocate (atempS) 135759599516SKenneth E. Jansen endif 135859599516SKenneth E. Jansen 135959599516SKenneth E. Jansen if(iabc==1) deallocate(acs) 136059599516SKenneth E. Jansen 136159599516SKenneth E. Jansen!MR CHANGE 136259599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 136359599516SKenneth E. Jansen if(myrank.eq.0) then 136459599516SKenneth E. Jansen write(*,*) 'itrdrv - done - BACK TO process.f' 136559599516SKenneth E. Jansen endif 136659599516SKenneth E. Jansen!MR CHANGE 136759599516SKenneth E. Jansen 136859599516SKenneth E. Jansen 136959599516SKenneth E. Jansen 137059599516SKenneth E. Jansen return 137159599516SKenneth E. Jansen end 137259599516SKenneth E. Jansen 137359599516SKenneth E. Jansen subroutine lesmodels(y, ac, shgl, shp, 137459599516SKenneth E. Jansen & iper, ilwork, rowp, colm, 137559599516SKenneth E. Jansen & nsons, ifath, x, 137659599516SKenneth E. Jansen & iBC, BC) 137759599516SKenneth E. Jansen 137859599516SKenneth E. Jansen include "common.h" 137959599516SKenneth E. Jansen 138059599516SKenneth E. Jansen real*8 y(nshg,ndof), ac(nshg,ndof), 138159599516SKenneth E. Jansen & x(numnp,nsd), 138259599516SKenneth E. Jansen & BC(nshg,ndofBC) 138359599516SKenneth E. Jansen real*8 shp(MAXTOP,maxsh,MAXQPT), 138459599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT) 138559599516SKenneth E. Jansen 138659599516SKenneth E. Jansenc 138759599516SKenneth E. Jansen integer rowp(nshg,nnz), colm(nshg+1), 138859599516SKenneth E. Jansen & iBC(nshg), 138959599516SKenneth E. Jansen & ilwork(nlwork), 139059599516SKenneth E. Jansen & iper(nshg) 139159599516SKenneth E. Jansen dimension ifath(numnp), nsons(nfath) 139259599516SKenneth E. Jansen 139359599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: fwr2,fwr3,fwr4 139459599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: stabdis,cdelsq1 139559599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: xavegt, xavegt2,xavegt3 139659599516SKenneth E. Jansen 139759599516SKenneth E. Jansen if( (iLES.gt.1) ) then ! Allocate Stuff for advanced LES models 139859599516SKenneth E. Jansen allocate (fwr2(nshg)) 139959599516SKenneth E. Jansen allocate (fwr3(nshg)) 140059599516SKenneth E. Jansen allocate (fwr4(nshg)) 140159599516SKenneth E. Jansen allocate (xavegt(nfath,12)) 140259599516SKenneth E. Jansen allocate (xavegt2(nfath,12)) 140359599516SKenneth E. Jansen allocate (xavegt3(nfath,12)) 140459599516SKenneth E. Jansen allocate (stabdis(nfath)) 140559599516SKenneth E. Jansen endif 140659599516SKenneth E. Jansen 140759599516SKenneth E. Jansenc.... get dynamic model coefficient 140859599516SKenneth E. Jansenc 140959599516SKenneth E. Jansen ilesmod=iLES/10 141059599516SKenneth E. Jansenc 141159599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model 141259599516SKenneth E. Jansenc 141359599516SKenneth E. Jansen if (ilesmod.eq.0) then ! 0 < iLES< 10 => dyn. model calculated 141459599516SKenneth E. Jansen ! at nodes based on discrete filtering 141559599516SKenneth E. Jansen 141659599516SKenneth E. Jansen 141759599516SKenneth E. Jansen if(isubmod.eq.2) then 141859599516SKenneth E. Jansen call SUPGdis(y, ac, shgl, shp, 141959599516SKenneth E. Jansen & iper, ilwork, 142059599516SKenneth E. Jansen & nsons, ifath, x, 142159599516SKenneth E. Jansen & iBC, BC, stabdis, xavegt3) 142259599516SKenneth E. Jansen endif 142359599516SKenneth E. Jansen 142459599516SKenneth E. Jansen if( ((isubmod.eq.0).or.(isubmod.eq.2)))then ! If no 142559599516SKenneth E. Jansen ! sub-model 142659599516SKenneth E. Jansen ! or SUPG 142759599516SKenneth E. Jansen ! model wanted 142859599516SKenneth E. Jansen 142959599516SKenneth E. Jansen if(i2filt.eq.0)then ! If simple filter 143059599516SKenneth E. Jansen 143159599516SKenneth E. Jansen if(modlstats .eq. 0) then ! If no model stats wanted 143259599516SKenneth E. Jansen call getdmc (y, shgl, shp, 143359599516SKenneth E. Jansen & iper, ilwork, nsons, 143459599516SKenneth E. Jansen & ifath, x) 143559599516SKenneth E. Jansen else ! else get model stats 143659599516SKenneth E. Jansen call stdfdmc (y, shgl, shp, 143759599516SKenneth E. Jansen & iper, ilwork, nsons, 143859599516SKenneth E. Jansen & ifath, x) 143959599516SKenneth E. Jansen endif ! end of stats if statement 144059599516SKenneth E. Jansen 144159599516SKenneth E. Jansen else ! else if twice filtering 144259599516SKenneth E. Jansen 144359599516SKenneth E. Jansen call widefdmc(y, shgl, shp, 144459599516SKenneth E. Jansen & iper, ilwork, nsons, 144559599516SKenneth E. Jansen & ifath, x) 144659599516SKenneth E. Jansen 144759599516SKenneth E. Jansen 144859599516SKenneth E. Jansen endif ! end of simple filter if statement 144959599516SKenneth E. Jansen 145059599516SKenneth E. Jansen endif ! end of SUPG or no sub-model if statement 145159599516SKenneth E. Jansen 145259599516SKenneth E. Jansen 145359599516SKenneth E. Jansen if( (isubmod.eq.1) ) then ! If DFWR sub-model wanted 145459599516SKenneth E. Jansen call cdelBHsq (y, shgl, shp, 145559599516SKenneth E. Jansen & iper, ilwork, nsons, 145659599516SKenneth E. Jansen & ifath, x, cdelsq1) 145759599516SKenneth E. Jansen call FiltRat (y, shgl, shp, 145859599516SKenneth E. Jansen & iper, ilwork, nsons, 145959599516SKenneth E. Jansen & ifath, x, cdelsq1, 146059599516SKenneth E. Jansen & fwr4, fwr3) 146159599516SKenneth E. Jansen 146259599516SKenneth E. Jansen 146359599516SKenneth E. Jansen if (i2filt.eq.0) then ! If simple filter wanted 146459599516SKenneth E. Jansen call DFWRsfdmc(y, shgl, shp, 146559599516SKenneth E. Jansen & iper, ilwork, nsons, 146659599516SKenneth E. Jansen & ifath, x, fwr2, fwr3) 146759599516SKenneth E. Jansen else ! else if twice filtering wanted 146859599516SKenneth E. Jansen call DFWRwfdmc(y, shgl, shp, 146959599516SKenneth E. Jansen & iper, ilwork, nsons, 147059599516SKenneth E. Jansen & ifath, x, fwr4, fwr4) 147159599516SKenneth E. Jansen endif ! end of simple filter if statement 147259599516SKenneth E. Jansen 147359599516SKenneth E. Jansen endif ! end of DFWR sub-model if statement 147459599516SKenneth E. Jansen 147559599516SKenneth E. Jansen if( (isubmod.eq.2) )then ! If SUPG sub-model wanted 147659599516SKenneth E. Jansen call dmcSUPG (y, ac, shgl, 147759599516SKenneth E. Jansen & shp, iper, ilwork, 147859599516SKenneth E. Jansen & nsons, ifath, x, 147959599516SKenneth E. Jansen & iBC, BC, rowp, colm, 148059599516SKenneth E. Jansen & xavegt2, stabdis) 148159599516SKenneth E. Jansen endif 148259599516SKenneth E. Jansen 148359599516SKenneth E. Jansen if(idis.eq.1)then ! If SUPG/Model dissipation wanted 148459599516SKenneth E. Jansen call ediss (y, ac, shgl, 148559599516SKenneth E. Jansen & shp, iper, ilwork, 148659599516SKenneth E. Jansen & nsons, ifath, x, 148759599516SKenneth E. Jansen & iBC, BC, xavegt) 148859599516SKenneth E. Jansen endif 148959599516SKenneth E. Jansen 149059599516SKenneth E. Jansen endif ! end of ilesmod 149159599516SKenneth E. Jansen 149259599516SKenneth E. Jansen if (ilesmod .eq. 1) then ! 10 < iLES < 20 => dynamic-mixed 149359599516SKenneth E. Jansen ! at nodes based on discrete filtering 149459599516SKenneth E. Jansen call bardmc (y, shgl, shp, 149559599516SKenneth E. Jansen & iper, ilwork, 149659599516SKenneth E. Jansen & nsons, ifath, x) 149759599516SKenneth E. Jansen endif 149859599516SKenneth E. Jansen 149959599516SKenneth E. Jansen if (ilesmod .eq. 2) then ! 20 < iLES < 30 => dynamic at quad 150059599516SKenneth E. Jansen ! pts based on lumped projection filt. 150159599516SKenneth E. Jansen 150259599516SKenneth E. Jansen if(isubmod.eq.0)then 150359599516SKenneth E. Jansen call projdmc (y, shgl, shp, 150459599516SKenneth E. Jansen & iper, ilwork, x) 150559599516SKenneth E. Jansen else 150659599516SKenneth E. Jansen call cpjdmcnoi (y, shgl, shp, 150759599516SKenneth E. Jansen & iper, ilwork, x, 150859599516SKenneth E. Jansen & rowp, colm, 150959599516SKenneth E. Jansen & iBC, BC) 151059599516SKenneth E. Jansen endif 151159599516SKenneth E. Jansen 151259599516SKenneth E. Jansen endif 151359599516SKenneth E. Jansen 151459599516SKenneth E. Jansen if( (iLES.gt.1) ) then ! Deallocate Stuff for advanced LES models 151559599516SKenneth E. Jansen deallocate (fwr2) 151659599516SKenneth E. Jansen deallocate (fwr3) 151759599516SKenneth E. Jansen deallocate (fwr4) 151859599516SKenneth E. Jansen deallocate (xavegt) 151959599516SKenneth E. Jansen deallocate (xavegt2) 152059599516SKenneth E. Jansen deallocate (xavegt3) 152159599516SKenneth E. Jansen deallocate (stabdis) 152259599516SKenneth E. Jansen endif 152359599516SKenneth E. Jansen return 152459599516SKenneth E. Jansen end 152559599516SKenneth E. Jansen 152659599516SKenneth E. Jansenc 152759599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution 152859599516SKenneth E. Jansenc 152959599516SKenneth E. Jansen subroutine CalcImpConvCoef (numISrfs, numTpoints) 153059599516SKenneth E. Jansen 153159599516SKenneth E. Jansen use convolImpFlow !uses flow history and impedance for convolution 153259599516SKenneth E. Jansen 153359599516SKenneth E. Jansen include "common.h" !for alfi 153459599516SKenneth E. Jansen 153559599516SKenneth E. Jansen integer numISrfs, numTpoints 153659599516SKenneth E. Jansen 153759599516SKenneth E. Jansen allocate (ConvCoef(numTpoints+2,3)) !same time discret. for all imp. BC 153859599516SKenneth E. Jansen do j=1,numTpoints+2 153959599516SKenneth E. Jansen ConvCoef(j,:)=0.5/numTpoints !dt/2 divided by period T=N*dt 154059599516SKenneth E. Jansen ConvCoef(j,1)=ConvCoef(j,1)*(1.0-alfi)*(1.0-alfi) 154159599516SKenneth E. Jansen ConvCoef(j,2)=ConvCoef(j,2)*(1.0+2*alfi*(1.0-alfi)) 154259599516SKenneth E. Jansen ConvCoef(j,3)=ConvCoef(j,3)*alfi*alfi 154359599516SKenneth E. Jansen enddo 154459599516SKenneth E. Jansen ConvCoef(1,2)=zero 154559599516SKenneth E. Jansen ConvCoef(1,3)=zero 154659599516SKenneth E. Jansen ConvCoef(2,3)=zero 154759599516SKenneth E. Jansen ConvCoef(numTpoints+1,1)=zero 154859599516SKenneth E. Jansen ConvCoef(numTpoints+2,2)=zero 154959599516SKenneth E. Jansen ConvCoef(numTpoints+2,1)=zero 155059599516SKenneth E. Jansenc 155159599516SKenneth E. Jansenc...calculate the coefficients for the impedance convolution 155259599516SKenneth E. Jansenc 155359599516SKenneth E. Jansen allocate (ImpConvCoef(numTpoints+2,numISrfs)) 155459599516SKenneth E. Jansen 155559599516SKenneth E. Jansenc..coefficients below assume Q linear in time step, Z constant 155659599516SKenneth E. Jansenc do j=3,numTpoints 155759599516SKenneth E. Jansenc ImpConvCoef(j,:) = ValueListImp(j-1,:)*ConvCoef(j,3) 155859599516SKenneth E. Jansenc & + ValueListImp(j,:)*ConvCoef(j,2) 155959599516SKenneth E. Jansenc & + ValueListImp(j+1,:)*ConvCoef(j,1) 156059599516SKenneth E. Jansenc enddo 156159599516SKenneth E. Jansenc ImpConvCoef(1,:) = ValueListImp(2,:)*ConvCoef(1,1) 156259599516SKenneth E. Jansenc ImpConvCoef(2,:) = ValueListImp(2,:)*ConvCoef(2,2) 156359599516SKenneth E. Jansenc & + ValueListImp(3,:)*ConvCoef(2,1) 156459599516SKenneth E. Jansenc ImpConvCoef(numTpoints+1,:) = 156559599516SKenneth E. Jansenc & ValueListImp(numTpoints,:)*ConvCoef(numTpoints+1,3) 156659599516SKenneth E. Jansenc & + ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+1,2) 156759599516SKenneth E. Jansenc ImpConvCoef(numTpoints+2,:) = 156859599516SKenneth E. Jansenc & ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+2,3) 156959599516SKenneth E. Jansen 157059599516SKenneth E. Jansenc..try easiest convolution Q and Z constant per time step 157159599516SKenneth E. Jansen do j=3,numTpoints+1 157259599516SKenneth E. Jansen ImpConvCoef(j,:) = ValueListImp(j-1,:)/numTpoints 157359599516SKenneth E. Jansen enddo 157459599516SKenneth E. Jansen ImpConvCoef(1,:) =zero 157559599516SKenneth E. Jansen ImpConvCoef(2,:) =zero 157659599516SKenneth E. Jansen ImpConvCoef(numTpoints+2,:) = 157759599516SKenneth E. Jansen & ValueListImp(numTpoints+1,:)/numTpoints 157859599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr() 157959599516SKenneth E. Jansen ImpConvCoef(numTpoints+1,:)= ImpConvCoef(numTpoints+1,:) 158059599516SKenneth E. Jansen & - ImpConvCoef(numTpoints+2,:)*(1.0-alfi)/alfi 158159599516SKenneth E. Jansen ImpConvCoef(numTpoints+2,:)= ImpConvCoef(numTpoints+2,:)/alfi 158259599516SKenneth E. Jansen return 158359599516SKenneth E. Jansen end 158459599516SKenneth E. Jansen 158559599516SKenneth E. Jansenc 158659599516SKenneth E. Jansenc ... update the flow rate history for the impedance convolution, filter it and write it out 158759599516SKenneth E. Jansenc 158859599516SKenneth E. Jansen subroutine UpdHistConv(y,nsrfIdList,numSrfs) 158959599516SKenneth E. Jansen 159059599516SKenneth E. Jansen use convolImpFlow !brings ntimeptpT, QHistImp, QHistTry, QHistTryF, numImpSrfs 159159599516SKenneth E. Jansen use convolRCRFlow !brings QHistRCR, numRCRSrfs 159259599516SKenneth E. Jansen 159359599516SKenneth E. Jansen include "common.h" 159459599516SKenneth E. Jansen 159559599516SKenneth E. Jansen integer nsrfIdList(0:MAXSURF), numSrfs 159659599516SKenneth E. Jansen character*20 fname1 159759599516SKenneth E. Jansen character*10 cname2 159859599516SKenneth E. Jansen character*5 cname 159959599516SKenneth E. Jansen real*8 y(nshg,3) !velocity at time n+1 160059599516SKenneth E. Jansen real*8 NewQ(0:MAXSURF) !temporary unknown for the flow rate 160159599516SKenneth E. Jansen !that needs to be added to the flow history 160259599516SKenneth E. Jansen 160359599516SKenneth E. Jansen call GetFlowQ(NewQ,y,nsrfIdList,numSrfs) !new flow at time n+1 160459599516SKenneth E. Jansenc 160559599516SKenneth E. Jansenc... for imp BC: shift QHist, add new constribution, filter and write out 160659599516SKenneth E. Jansenc 160759599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 160859599516SKenneth E. Jansen do j=1, ntimeptpT 160959599516SKenneth E. Jansen QHistImp(j,1:numSrfs)=QHistImp(j+1,1:numSrfs) 161059599516SKenneth E. Jansen enddo 161159599516SKenneth E. Jansen QHistImp(ntimeptpT+1,1:numSrfs) = NewQ(1:numSrfs) 161259599516SKenneth E. Jansen 161359599516SKenneth E. Jansenc 161459599516SKenneth E. Jansenc....filter the flow rate history 161559599516SKenneth E. Jansenc 161659599516SKenneth E. Jansen cutfreq = 10 !hardcoded cutting frequency of the filter 161759599516SKenneth E. Jansen do j=1, ntimeptpT 161859599516SKenneth E. Jansen QHistTry(j,:)=QHistImp(j+1,:) 161959599516SKenneth E. Jansen enddo 162059599516SKenneth E. Jansen call Filter(QHistTryF,QHistTry,ntimeptpT,Delt(1),cutfreq) 162159599516SKenneth E. Jansenc.... if no filter applied then uncomment next three lines 162259599516SKenneth E. Jansenc do j=1, ntimeptpT 162359599516SKenneth E. Jansenc QHistTryF(j,:)=QHistTry(j,:) 162459599516SKenneth E. Jansenc enddo 162559599516SKenneth E. Jansen 162659599516SKenneth E. Jansenc QHistImp(1,:)=zero ! why do we do this? for beta(1,:) = zero it does not really matters 162759599516SKenneth E. Jansen do j=1, ntimeptpT 162859599516SKenneth E. Jansen QHistImp(j+1,:)=QHistTryF(j,:) 162959599516SKenneth E. Jansen enddo 163059599516SKenneth E. Jansenc 163159599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat 163259599516SKenneth E. Jansenc 163359599516SKenneth E. Jansen if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or. 163459599516SKenneth E. Jansen & (istep .eq. nstep(1)))) .and. 163559599516SKenneth E. Jansen & (myrank .eq. master)) then 163659599516SKenneth E. Jansen open(unit=816, file='Qhistor.dat',status='replace') 163759599516SKenneth E. Jansen write(816,*) ntimeptpT 163859599516SKenneth E. Jansen do j=1,ntimeptpT+1 163959599516SKenneth E. Jansen write(816,*) (QHistImp(j,n),n=1, numSrfs) 164059599516SKenneth E. Jansen enddo 164159599516SKenneth E. Jansen close(816) 164259599516SKenneth E. Jansenc... write out a copy with step number to be able to restart 164359599516SKenneth E. Jansen fname1 = 'Qhistor' 164459599516SKenneth E. Jansen fname1 = trim(fname1)//trim(cname2(lstep))//'.dat' 164559599516SKenneth E. Jansen open(unit=8166,file=trim(fname1),status='unknown') 164659599516SKenneth E. Jansen write(8166,*) ntimeptpT 164759599516SKenneth E. Jansen do j=1,ntimeptpT+1 164859599516SKenneth E. Jansen write(8166,*) (QHistImp(j,n),n=1, numSrfs) 164959599516SKenneth E. Jansen enddo 165059599516SKenneth E. Jansen close(8166) 165159599516SKenneth E. Jansen endif 165259599516SKenneth E. Jansen endif 165359599516SKenneth E. Jansen 165459599516SKenneth E. Jansenc 165559599516SKenneth E. Jansenc... for RCR bc just add the new contribution 165659599516SKenneth E. Jansenc 165759599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 165859599516SKenneth E. Jansen QHistRCR(lstep+1,1:numSrfs) = NewQ(1:numSrfs) 165959599516SKenneth E. Jansenc 166059599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat 166159599516SKenneth E. Jansenc 166259599516SKenneth E. Jansen if ((irs .ge. 1) .and. (myrank .eq. master)) then 166359599516SKenneth E. Jansen if(istep.eq.1) then 166459599516SKenneth E. Jansen open(unit=816,file='Qhistor.dat',status='unknown') 166559599516SKenneth E. Jansen else 166659599516SKenneth E. Jansen open(unit=816,file='Qhistor.dat',position='append') 166759599516SKenneth E. Jansen endif 166859599516SKenneth E. Jansen if(istep.eq.1) then 166959599516SKenneth E. Jansen do j=1,lstep 167059599516SKenneth E. Jansen write(816,*) j, (QHistRCR(j,n),n=1,numSrfs) ! read from file of previous run 167159599516SKenneth E. Jansen enddo 167259599516SKenneth E. Jansen endif 167359599516SKenneth E. Jansen write(816,*) lstep+1, (QHistRCR(lstep+1,n),n=1, numSrfs) 167459599516SKenneth E. Jansen close(816) 167559599516SKenneth E. Jansenc... write out a copy with step number to be able to restart 167659599516SKenneth E. Jansen if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or. 167759599516SKenneth E. Jansen & (istep .eq. nstep(1)))) .and. 167859599516SKenneth E. Jansen & (myrank .eq. master)) then 167959599516SKenneth E. Jansen fname1 = 'Qhistor' 168059599516SKenneth E. Jansen fname1 = trim(fname1)//trim(cname2(lstep))//'.dat' 168159599516SKenneth E. Jansen open(unit=8166,file=trim(fname1),status='unknown') 168259599516SKenneth E. Jansen write(8166,*) lstep+1 168359599516SKenneth E. Jansen do j=1,lstep+1 168459599516SKenneth E. Jansen write(8166,*) (QHistRCR(j,n),n=1, numSrfs) 168559599516SKenneth E. Jansen enddo 168659599516SKenneth E. Jansen close(8166) 168759599516SKenneth E. Jansen endif 168859599516SKenneth E. Jansen endif 168959599516SKenneth E. Jansen endif 169059599516SKenneth E. Jansen 169159599516SKenneth E. Jansen return 169259599516SKenneth E. Jansen end 169359599516SKenneth E. Jansen 169459599516SKenneth E. Jansenc 169559599516SKenneth E. Jansenc...calculate the time varying coefficients for the RCR convolution 169659599516SKenneth E. Jansenc 169759599516SKenneth E. Jansen subroutine CalcRCRConvCoef (stepn, numSrfs) 169859599516SKenneth E. Jansen 169959599516SKenneth E. Jansen use convolRCRFlow !brings in ValueListRCR, dtRCR 170059599516SKenneth E. Jansen 170159599516SKenneth E. Jansen include "common.h" !brings alfi 170259599516SKenneth E. Jansen 170359599516SKenneth E. Jansen integer numSrfs, stepn 170459599516SKenneth E. Jansen 170559599516SKenneth E. Jansen RCRConvCoef = zero 170659599516SKenneth E. Jansen if (stepn .eq. 0) then 170759599516SKenneth E. Jansen RCRConvCoef(1,:) = ValueListRCR(1,:)*(1.0-alfi) + 170859599516SKenneth E. Jansen & ValueListRCR(3,:)*(-alfi + 1.0 + 1/dtRCR(:) 170959599516SKenneth E. Jansen & - exp(-alfi*dtRCR(:))*(1 + 1/dtRCR(:))) 171059599516SKenneth E. Jansen RCRConvCoef(2,:) = ValueListRCR(1,:)*alfi 171159599516SKenneth E. Jansen & + ValueListRCR(3,:) 171259599516SKenneth E. Jansen & *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:)) 171359599516SKenneth E. Jansen endif 171459599516SKenneth E. Jansen if (stepn .ge. 1) then 171559599516SKenneth E. Jansen RCRConvCoef(1,:) =-ValueListRCR(3,:)*exp(-dtRCR(:)*(stepn+alfi)) 171659599516SKenneth E. Jansen & *(1 + (1 - exp(dtRCR(:)))/dtRCR(:)) 171759599516SKenneth E. Jansen RCRConvCoef(stepn+1,:) = ValueListRCR(1,:)*(1-alfi) 171859599516SKenneth E. Jansen & - ValueListRCR(3,:)*(alfi - 1 - 1/dtRCR(:) 171959599516SKenneth E. Jansen & + exp(-alfi*dtRCR(:))/dtRCR(:)*(2 - exp(-dtRCR(:)))) 172059599516SKenneth E. Jansen RCRConvCoef(stepn+2,:) = ValueListRCR(1,:)*alfi 172159599516SKenneth E. Jansen & + ValueListRCR(3,:) 172259599516SKenneth E. Jansen & *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:)) 172359599516SKenneth E. Jansen endif 172459599516SKenneth E. Jansen if (stepn .ge. 2) then 172559599516SKenneth E. Jansen do j=2,stepn 172659599516SKenneth E. Jansen RCRConvCoef(j,:) = ValueListRCR(3,:)/dtRCR(:)* 172759599516SKenneth E. Jansen & exp(-dtRCR(:)*(stepn + alfi + 2 - j))* 172859599516SKenneth E. Jansen & (1 - exp(dtRCR(:)))**2 172959599516SKenneth E. Jansen enddo 173059599516SKenneth E. Jansen endif 173159599516SKenneth E. Jansen 173259599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr() 173359599516SKenneth E. Jansen RCRConvCoef(stepn+1,:)= RCRConvCoef(stepn+1,:) 173459599516SKenneth E. Jansen & - RCRConvCoef(stepn+2,:)*(1.0-alfi)/alfi 173559599516SKenneth E. Jansen RCRConvCoef(stepn+2,:)= RCRConvCoef(stepn+2,:)/alfi 173659599516SKenneth E. Jansen 173759599516SKenneth E. Jansen return 173859599516SKenneth E. Jansen end 173959599516SKenneth E. Jansen 174059599516SKenneth E. Jansenc 174159599516SKenneth E. Jansenc...calculate the time dependent H operator for the RCR convolution 174259599516SKenneth E. Jansenc 174359599516SKenneth E. Jansen subroutine CalcHopRCR (timestepRCR, stepn, numSrfs) 174459599516SKenneth E. Jansen 174559599516SKenneth E. Jansen use convolRCRFlow !brings in HopRCR, dtRCR 174659599516SKenneth E. Jansen 174759599516SKenneth E. Jansen include "common.h" 174859599516SKenneth E. Jansen 174959599516SKenneth E. Jansen integer numSrfs, stepn 175059599516SKenneth E. Jansen real*8 PdistCur(0:MAXSURF), timestepRCR 175159599516SKenneth E. Jansen 175259599516SKenneth E. Jansen HopRCR=zero 175359599516SKenneth E. Jansen call RCRint(timestepRCR*(stepn + alfi),PdistCur) 175459599516SKenneth E. Jansen HopRCR(1:numSrfs) = RCRic(1:numSrfs) 175559599516SKenneth E. Jansen & *exp(-dtRCR(1:numSrfs)*(stepn + alfi)) + PdistCur(1:numSrfs) 175659599516SKenneth E. Jansen return 175759599516SKenneth E. Jansen end 175859599516SKenneth E. Jansenc 175959599516SKenneth E. Jansenc ... initialize the influence of the initial conditions for the RCR BC 176059599516SKenneth E. Jansenc 176159599516SKenneth E. Jansen subroutine calcRCRic(y,srfIdList,numSrfs) 176259599516SKenneth E. Jansen 176359599516SKenneth E. Jansen use convolRCRFlow !brings RCRic, ValueListRCR, ValuePdist 176459599516SKenneth E. Jansen 176559599516SKenneth E. Jansen include "common.h" 176659599516SKenneth E. Jansen 176759599516SKenneth E. Jansen integer srfIdList(0:MAXSURF), numSrfs, irankCoupled 176859599516SKenneth E. Jansen real*8 y(nshg,4) !need velocity and pressure 176959599516SKenneth E. Jansen real*8 Qini(0:MAXSURF) !initial flow rate 177059599516SKenneth E. Jansen real*8 PdistIni(0:MAXSURF) !initial distal pressure 177159599516SKenneth E. Jansen real*8 Pini(0:MAXSURF),CoupleArea(0:MAXSURF) ! initial pressure 177259599516SKenneth E. Jansen real*8 VelOnly(nshg,3), POnly(nshg) 177359599516SKenneth E. Jansen 177459599516SKenneth E. Jansen allocate (RCRic(0:MAXSURF)) 177559599516SKenneth E. Jansen 177659599516SKenneth E. Jansen if(lstep.eq.0) then 177759599516SKenneth E. Jansen VelOnly(:,1:3)=y(:,1:3) 177859599516SKenneth E. Jansen call GetFlowQ(Qini,VelOnly,srfIdList,numSrfs) !get initial flow 177959599516SKenneth E. Jansen QHistRCR(1,1:numSrfs)=Qini(1:numSrfs) !initialize QHistRCR 178059599516SKenneth E. Jansen POnly(:)=y(:,4) ! pressure 178159599516SKenneth E. Jansen call integrScalar(Pini,POnly,srfIdList,numSrfs) !get initial pressure integral 178259599516SKenneth E. Jansen POnly(:)=one ! one to get area 178359599516SKenneth E. Jansen call integrScalar(CoupleArea,POnly,srfIdList,numSrfs) !get surf area 178459599516SKenneth E. Jansen Pini(1:numSrfs) = Pini(1:numSrfs)/CoupleArea(1:numSrfs) 178559599516SKenneth E. Jansen else 178659599516SKenneth E. Jansen Qini(1:numSrfs)=QHistRCR(1,1:numSrfs) 178759599516SKenneth E. Jansen Pini(1:numSrfs)=zero ! hack 178859599516SKenneth E. Jansen endif 178959599516SKenneth E. Jansen call RCRint(istep,PdistIni) !get initial distal P (use istep) 179059599516SKenneth E. Jansen RCRic(1:numSrfs) = Pini(1:numSrfs) 179159599516SKenneth E. Jansen & - ValueListRCR(1,:)*Qini(1:numSrfs)-PdistIni(1:numSrfs) 179259599516SKenneth E. Jansen return 179359599516SKenneth E. Jansen end 179459599516SKenneth E. Jansen 179559599516SKenneth E. Jansenc.........function that integrates a scalar over a boundary 179659599516SKenneth E. Jansen subroutine integrScalar(scalInt,scal,srfIdList,numSrfs) 179759599516SKenneth E. Jansen 179859599516SKenneth E. Jansen use pvsQbi !brings ndsurf, NASC 179959599516SKenneth E. Jansen 180059599516SKenneth E. Jansen include "common.h" 180159599516SKenneth E. Jansen include "mpif.h" 180259599516SKenneth E. Jansen 180359599516SKenneth E. Jansen integer srfIdList(0:MAXSURF), numSrfs, irankCoupled, i, k 180459599516SKenneth E. Jansen real*8 scal(nshg), scalInt(0:MAXSURF), scalIntProc(0:MAXSURF) 180559599516SKenneth E. Jansen 180659599516SKenneth E. Jansen scalIntProc = zero 180759599516SKenneth E. Jansen do i = 1,nshg 180859599516SKenneth E. Jansen if(numSrfs.gt.zero) then 180959599516SKenneth E. Jansen do k = 1,numSrfs 181059599516SKenneth E. Jansen irankCoupled = 0 181159599516SKenneth E. Jansen if (srfIdList(k).eq.ndsurf(i)) then 181259599516SKenneth E. Jansen irankCoupled=k 181359599516SKenneth E. Jansen scalIntProc(irankCoupled) = scalIntProc(irankCoupled) 181459599516SKenneth E. Jansen & + NASC(i)*scal(i) 181559599516SKenneth E. Jansen exit 181659599516SKenneth E. Jansen endif 181759599516SKenneth E. Jansen enddo 181859599516SKenneth E. Jansen endif 181959599516SKenneth E. Jansen enddo 182059599516SKenneth E. Jansenc 182159599516SKenneth E. Jansenc at this point, each scalint has its "nodes" contributions to the scalar 182259599516SKenneth E. Jansenc accumulated into scalIntProc. Note, because NASC is on processor this 182359599516SKenneth E. Jansenc will NOT be the scalar for the surface yet 182459599516SKenneth E. Jansenc 182559599516SKenneth E. Jansenc.... reduce integrated scalar for each surface, push on scalInt 182659599516SKenneth E. Jansenc 182759599516SKenneth E. Jansen npars=MAXSURF+1 182859599516SKenneth E. Jansen call MPI_ALLREDUCE (scalIntProc, scalInt(:), npars, 182959599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 183059599516SKenneth E. Jansen 183159599516SKenneth E. Jansen return 183259599516SKenneth E. Jansen end 183359599516SKenneth E. Jansen 183459599516SKenneth E. Jansen 183559599516SKenneth E. Jansen 183659599516SKenneth E. Jansen 183759599516SKenneth E. Jansen 1838