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