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" 44*ae8d68e4SKenneth E. Jansen include "svLS.h" 4559599516SKenneth E. Jansenc 4659599516SKenneth E. Jansen 4759599516SKenneth E. Jansen 4859599516SKenneth E. Jansen real*8 y(nshg,ndof), ac(nshg,ndof), 4959599516SKenneth E. Jansen & yold(nshg,ndof), acold(nshg,ndof), 5059599516SKenneth E. Jansen & u(nshg,nsd), uold(nshg,nsd), 5159599516SKenneth E. Jansen & x(numnp,nsd), solinc(nshg,ndof), 5259599516SKenneth E. Jansen & BC(nshg,ndofBC), tf(nshg,ndof), 5359599516SKenneth E. Jansen & GradV(nshg,nsdsq) 5459599516SKenneth E. Jansen 5559599516SKenneth E. Jansenc 5659599516SKenneth E. Jansen real*8 res(nshg,ndof) 5759599516SKenneth E. Jansenc 5859599516SKenneth E. Jansen real*8 shp(MAXTOP,maxsh,MAXQPT), 5959599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 6059599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 6159599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 6259599516SKenneth E. Jansenc 6359599516SKenneth E. Jansen integer rowp(nshg,nnz), colm(nshg+1), 6459599516SKenneth E. Jansen & iBC(nshg), 6559599516SKenneth E. Jansen & ilwork(nlwork), 6659599516SKenneth E. Jansen & iper(nshg), ifuncs(6) 6759599516SKenneth E. Jansen 6859599516SKenneth E. Jansen real*8 vbc_prof(nshg,3) 6959599516SKenneth E. Jansen 7059599516SKenneth E. Jansen integer stopjob 7159599516SKenneth E. Jansen character*10 cname2 7259599516SKenneth E. Jansen character*5 cname 7359599516SKenneth E. Jansenc 7459599516SKenneth E. Jansenc stuff for dynamic model s.w.avg and wall model 7559599516SKenneth E. Jansenc 7659599516SKenneth E. Jansen dimension ifath(numnp), velbar(nfath,ndof), nsons(nfath) 7759599516SKenneth E. Jansen 7859599516SKenneth E. Jansen dimension wallubar(2),walltot(2) 7959599516SKenneth E. Jansenc 80*ae8d68e4SKenneth E. Jansenc.... For linear solver Library 8159599516SKenneth E. Jansenc 8259599516SKenneth E. Jansen integer eqnType, prjFlag, presPrjFlag, verbose 8359599516SKenneth E. Jansenc 8459599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: aperm, atemp, atempS 8559599516SKenneth E. Jansen real*8, allocatable, dimension(:,:,:) :: apermS 8659599516SKenneth E. Jansen 8759599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: lhsP, lhsK, lhsS 8859599516SKenneth E. Jansen real*8 almit, alfit, gamit 8959599516SKenneth E. Jansenc 9059599516SKenneth E. Jansen character*1024 servername 9159599516SKenneth E. Jansen character*20 fname1,fmt1 9259599516SKenneth E. Jansen character*20 fname2,fmt2 9359599516SKenneth E. Jansen character*60 fnamepold, fvarts 9459599516SKenneth E. Jansen character*4 fname4c ! 4 characters 9559599516SKenneth E. Jansen integer iarray(50) ! integers for headers 9659599516SKenneth E. Jansen integer isgn(ndof), isgng(ndof) 9759599516SKenneth E. Jansen 9859599516SKenneth E. Jansen!MR CHANGE 9959599516SKenneth E. Jansen! real*8 rerr(nshg,10), ybar(nshg,13) ! including 7 sq. terms with 3 cross terms of uv, uw and vw 10059599516SKenneth E. Jansen! real*8 rerr(nshg,10), ybar(nshg,12) ! including 7 sq. terms with 3 cross terms of uv, uw and vw 10159599516SKenneth E. Jansen real*8 rerr(nshg,10) 10259599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: ybar, strain, vorticity 10359599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: wallssVec, wallssVecbar 10459599516SKenneth E. Jansen!MR CHANGE 10559599516SKenneth E. Jansen 10659599516SKenneth E. Jansen real*8 tcorecp(2), tcorecpscal(2) 10759599516SKenneth E. Jansen 10859599516SKenneth E. Jansen integer, allocatable, dimension(:) :: ivarts 10959599516SKenneth E. Jansen integer, allocatable, dimension(:) :: ivartsg 11059599516SKenneth E. Jansen integer, allocatable, dimension(:) :: iv_rank 11159599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: vartssoln 11259599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: vartssolng 11359599516SKenneth E. Jansen real*8, allocatable, dimension(:,:,:) :: yphbar 11459599516SKenneth E. Jansen real*8 CFLworst(numel) 11559599516SKenneth E. Jansen 11659599516SKenneth E. Jansen!MR CHANGE 11759599516SKenneth E. Jansen integer :: iv_rankpernode, iv_totnodes, iv_totcores 11859599516SKenneth E. Jansen integer :: iv_node, iv_core, iv_thread 11959599516SKenneth E. Jansen!MR CHANGE 120*ae8d68e4SKenneth E. Jansen!-------------------------------------------------------------------- 121*ae8d68e4SKenneth E. Jansen! Setting up svLS 122*ae8d68e4SKenneth E. Jansen INTEGER svLS_nFaces, gnNo, nNo, faIn, facenNo 123*ae8d68e4SKenneth E. Jansen INTEGER, ALLOCATABLE :: ltg(:), gNodes(:) 124*ae8d68e4SKenneth E. Jansen REAL*8, ALLOCATABLE :: sV(:,:) 125*ae8d68e4SKenneth E. Jansen 126*ae8d68e4SKenneth E. Jansen CHARACTER*128 fileName 127*ae8d68e4SKenneth E. Jansen TYPE(svLS_commuType) communicator 128*ae8d68e4SKenneth E. Jansen TYPE(svLS_lhsType) svLS_lhs 129*ae8d68e4SKenneth E. Jansen TYPE(svLS_lsType) svLS_ls 13059599516SKenneth E. Jansen 13159599516SKenneth E. Jansen impistat = 0 13259599516SKenneth E. Jansen impistat2 = 0 13359599516SKenneth E. Jansen iISend = 0 13459599516SKenneth E. Jansen iISendScal = 0 13559599516SKenneth E. Jansen iIRecv = 0 13659599516SKenneth E. Jansen iIRecvScal = 0 13759599516SKenneth E. Jansen iWaitAll = 0 13859599516SKenneth E. Jansen iWaitAllScal = 0 13959599516SKenneth E. Jansen iAllR = 0 14059599516SKenneth E. Jansen iAllRScal = 0 14159599516SKenneth E. Jansen rISend = zero 14259599516SKenneth E. Jansen rISendScal = zero 14359599516SKenneth E. Jansen rIRecv = zero 14459599516SKenneth E. Jansen rIRecvScal = zero 14559599516SKenneth E. Jansen rWaitAll = zero 14659599516SKenneth E. Jansen rWaitAllScal = zero 14759599516SKenneth E. Jansen rAllR = zero 14859599516SKenneth E. Jansen rAllRScal = zero 14959599516SKenneth E. Jansen rCommu = zero 15059599516SKenneth E. Jansen rCommuScal = zero 15159599516SKenneth E. Jansen 15259599516SKenneth E. Jansen call initmemstat() 15359599516SKenneth E. Jansen 15459599516SKenneth E. Jansenc 15559599516SKenneth E. Jansenc hack SA variable 15659599516SKenneth E. Jansenc 15759599516SKenneth E. JansencHack BC(:,7)=BC(:,7)*0.001 15859599516SKenneth E. JansencHack if(lstep.eq.0) y(:,6)=y(:,6)*0.001 159*ae8d68e4SKenneth E. Jansen!-------------------------------------------------------------------- 160*ae8d68e4SKenneth E. Jansen! Setting up svLS 161*ae8d68e4SKenneth E. Jansen 162*ae8d68e4SKenneth E. Jansen 163*ae8d68e4SKenneth E. Jansen IF (svLSFlag .EQ. 1) THEN 164*ae8d68e4SKenneth E. Jansen CALL svLS_LS_CREATE(svLS_ls, svLSType, dimKry=Kspace, 165*ae8d68e4SKenneth E. Jansen 2 relTol=epstol(8), relTolIn=(/epstol(1),epstol(7)/), 166*ae8d68e4SKenneth E. Jansen 3 maxItr=maxNSIters, 167*ae8d68e4SKenneth E. Jansen 4 maxItrIn=(/maxMomentumIters,maxContinuityIters/)) 168*ae8d68e4SKenneth E. Jansen 169*ae8d68e4SKenneth E. Jansen CALL svLS_COMMU_CREATE(communicator, MPI_COMM_WORLD) 170*ae8d68e4SKenneth E. Jansen 171*ae8d68e4SKenneth E. Jansen IF (numpe .GT. 1) THEN 172*ae8d68e4SKenneth E. Jansen WRITE(fileName,*) myrank 173*ae8d68e4SKenneth E. Jansen fileName = "ltg.dat."//ADJUSTL(TRIM(fileName)) 174*ae8d68e4SKenneth E. Jansen OPEN(1,FILE=fileName) 175*ae8d68e4SKenneth E. Jansen READ(1,*) gnNo 176*ae8d68e4SKenneth E. Jansen READ(1,*) nNo 177*ae8d68e4SKenneth E. Jansen ALLOCATE(ltg(nNo)) 178*ae8d68e4SKenneth E. Jansen READ(1,*) ltg 179*ae8d68e4SKenneth E. Jansen CLOSE(1) 180*ae8d68e4SKenneth E. Jansen ELSE 181*ae8d68e4SKenneth E. Jansen gnNo = nshg 182*ae8d68e4SKenneth E. Jansen nNo = nshg 183*ae8d68e4SKenneth E. Jansen ALLOCATE(ltg(nNo)) 184*ae8d68e4SKenneth E. Jansen DO i=1, nNo 185*ae8d68e4SKenneth E. Jansen ltg(i) = i 186*ae8d68e4SKenneth E. Jansen END DO 187*ae8d68e4SKenneth E. Jansen END IF 188*ae8d68e4SKenneth E. Jansen ELSE 189*ae8d68e4SKenneth E. Jansen!-------------------------------------------------------------------- 19059599516SKenneth E. Jansen call SolverLicenseServer(servername) 191*ae8d68e4SKenneth E. Jansen ENDIF 19259599516SKenneth E. Jansenc 19359599516SKenneth E. Jansenc only master should be verbose 19459599516SKenneth E. Jansenc 19559599516SKenneth E. Jansen 19659599516SKenneth E. Jansen if(numpe.gt.0 .and. myrank.ne.master)iverbose=0 19759599516SKenneth E. Jansenc 19859599516SKenneth E. Jansen 19959599516SKenneth E. Jansen lskeep=lstep 20059599516SKenneth E. Jansen 20159599516SKenneth E. Jansen inquire(file='xyzts.dat',exist=exts) 20259599516SKenneth E. Jansen if(exts) then 20359599516SKenneth E. Jansen 20459599516SKenneth E. Jansen open(unit=626,file='xyzts.dat',status='old') 20559599516SKenneth E. Jansen read(626,*) ntspts, freq, tolpt, iterat, varcod 20659599516SKenneth E. Jansen call sTD ! sets data structures 20759599516SKenneth E. Jansen 20859599516SKenneth E. Jansen do jj=1,ntspts ! read coordinate data where solution desired 20959599516SKenneth E. Jansen read(626,*) ptts(jj,1),ptts(jj,2),ptts(jj,3) 21059599516SKenneth E. Jansen enddo 21159599516SKenneth E. Jansen close(626) 21259599516SKenneth E. Jansen 21359599516SKenneth E. Jansen statptts(:,:) = 0 21459599516SKenneth E. Jansen parptts(:,:) = zero 21559599516SKenneth E. Jansen varts(:,:) = zero 21659599516SKenneth E. Jansen 21759599516SKenneth E. Jansen allocate (ivarts(ntspts*ndof)) 21859599516SKenneth E. Jansen allocate (ivartsg(ntspts*ndof)) 21959599516SKenneth E. Jansen allocate (iv_rank(ntspts)) 22059599516SKenneth E. Jansen allocate (vartssoln(ntspts*ndof)) 22159599516SKenneth E. Jansen allocate (vartssolng(ntspts*ndof)) 22259599516SKenneth E. Jansen 22359599516SKenneth E. Jansen iv_rankpernode = iv_rankpercore*iv_corepernode 22459599516SKenneth E. Jansen iv_totnodes = numpe/iv_rankpernode 22559599516SKenneth E. Jansen iv_totcores = iv_corepernode*iv_totnodes 22659599516SKenneth E. Jansen if (myrank .eq. 0) then 22759599516SKenneth E. Jansen write(*,*) 'Info for probes:' 22859599516SKenneth E. Jansen write(*,*) ' Ranks per core:',iv_rankpercore 22959599516SKenneth E. Jansen write(*,*) ' Cores per node:',iv_corepernode 23059599516SKenneth E. Jansen write(*,*) ' Ranks per node:',iv_rankpernode 23159599516SKenneth E. Jansen write(*,*) ' Total number of nodes:',iv_totnodes 23259599516SKenneth E. Jansen write(*,*) ' Total number of cores',iv_totcores 23359599516SKenneth E. Jansen endif 23459599516SKenneth E. Jansen 23559599516SKenneth E. Jansen! if (myrank .eq. numpe-1) then 23659599516SKenneth E. Jansen do jj=1,ntspts 23759599516SKenneth E. Jansen 23859599516SKenneth E. Jansen ! Compute the adequate rank which will take care of probe jj 23959599516SKenneth E. Jansen jjm1 = jj-1 24059599516SKenneth E. Jansen iv_node = (iv_totnodes-1)-mod(jjm1,iv_totnodes) 24159599516SKenneth E. Jansen iv_core = (iv_corepernode-1) - mod((jjm1 - 24259599516SKenneth E. Jansen & mod(jjm1,iv_totnodes))/iv_totnodes,iv_corepernode) 24359599516SKenneth E. Jansen iv_thread = (iv_rankpercore-1) - mod((jjm1- 24459599516SKenneth E. Jansen & (mod(jjm1,iv_totcores)))/iv_totcores,iv_rankpercore) 24559599516SKenneth E. Jansen iv_rank(jj) = iv_node*iv_rankpernode 24659599516SKenneth E. Jansen & + iv_core*iv_rankpercore 24759599516SKenneth E. Jansen & + iv_thread 24859599516SKenneth E. Jansen 24959599516SKenneth E. Jansen if(myrank == 0) then 25059599516SKenneth E. Jansen write(*,*) ' Probe', jj, 'handled by rank', 25159599516SKenneth E. Jansen & iv_rank(jj), ' on node', iv_node 25259599516SKenneth E. Jansen endif 25359599516SKenneth E. Jansen 25459599516SKenneth E. Jansen ! Verification just in case 25559599516SKenneth E. Jansen if(iv_rank(jj) .lt.0 .or. iv_rank(jj) .ge. numpe) then 25659599516SKenneth E. Jansen write(*,*) 'WARNING: iv_rank(',jj,') is ', iv_rank(jj), 25759599516SKenneth E. Jansen & ' and reset to numpe-1' 25859599516SKenneth E. Jansen iv_rank(jj) = numpe-1 25959599516SKenneth E. Jansen endif 26059599516SKenneth E. Jansen 26159599516SKenneth E. Jansen ! Open the varts files 26259599516SKenneth E. Jansen if(myrank == iv_rank(jj)) then 26359599516SKenneth E. Jansen fvarts='varts/varts' 26459599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(jj)) 26559599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(lstep)) 26659599516SKenneth E. Jansen fvarts=trim(fvarts)//'.dat' 26759599516SKenneth E. Jansen fvarts=trim(fvarts) 26859599516SKenneth E. Jansen open(unit=1000+jj, file=fvarts, status='unknown') 26959599516SKenneth E. Jansen endif 27059599516SKenneth E. Jansen enddo 27159599516SKenneth E. Jansen! endif 27259599516SKenneth E. Jansen 27359599516SKenneth E. Jansen endif 27459599516SKenneth E. Jansenc 27559599516SKenneth E. Jansenc.... open history and aerodynamic forces files 27659599516SKenneth E. Jansenc 27759599516SKenneth E. Jansen if (myrank .eq. master) then 278c9a96f21SKenneth E. Jansen open (unit=ihist, file=fhist, status='unknown') 27959599516SKenneth E. Jansen open (unit=iforce, file=fforce, status='unknown') 28059599516SKenneth E. Jansen open (unit=76, file="fort.76", status='unknown') 28159599516SKenneth E. Jansen if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then 28259599516SKenneth E. Jansen fnamepold = 'pold' 28359599516SKenneth E. Jansen fnamepold = trim(fnamepold)//trim(cname2(lstep)) 28459599516SKenneth E. Jansen fnamepold = trim(fnamepold)//'.dat' 28559599516SKenneth E. Jansen fnamepold = trim(fnamepold) 28659599516SKenneth E. Jansen open (unit=8177, file=fnamepold, status='unknown') 28759599516SKenneth E. Jansen endif 28859599516SKenneth E. Jansen endif 28959599516SKenneth E. Jansenc 29059599516SKenneth E. Jansenc.... initialize 29159599516SKenneth E. Jansenc 29259599516SKenneth E. Jansen ifuncs(:) = 0 ! func. evaluation counter 29359599516SKenneth E. Jansen istep = 0 29459599516SKenneth E. Jansen yold = y 29559599516SKenneth E. Jansen acold = ac 29659599516SKenneth E. Jansen 29759599516SKenneth E. Jansen rerr = zero 29859599516SKenneth E. Jansen 29959599516SKenneth E. Jansen if(ierrcalc.eq.1 .or. ioybar.eq.1) then ! we need ybar for error too 30059599516SKenneth E. Jansen if (ivort == 1) then 30159599516SKenneth E. Jansen allocate(ybar(nshg,17)) ! more space for vorticity if requested 30259599516SKenneth E. Jansen else 30359599516SKenneth E. Jansen allocate(ybar(nshg,13)) 30459599516SKenneth E. Jansen endif 30559599516SKenneth E. Jansen ybar = zero ! Initialize ybar to zero, which is essential 30659599516SKenneth E. Jansen endif 30759599516SKenneth E. Jansen 30859599516SKenneth E. Jansen if(ivort == 1) then 30959599516SKenneth E. Jansen allocate(strain(nshg,6)) 31059599516SKenneth E. Jansen allocate(vorticity(nshg,5)) 31159599516SKenneth E. Jansen endif 31259599516SKenneth E. Jansen 31359599516SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 31459599516SKenneth E. Jansen allocate(wallssVec(nshg,3)) 31559599516SKenneth E. Jansen if (ioybar .eq. 1) then 31659599516SKenneth E. Jansen allocate(wallssVecbar(nshg,3)) 31759599516SKenneth E. Jansen wallssVecbar = zero ! Initialization important if mean wss computed 31859599516SKenneth E. Jansen endif 31959599516SKenneth E. Jansen endif 32059599516SKenneth E. Jansen 32159599516SKenneth E. Jansen! both nstepsincycle and nphasesincycle needs to be set 32259599516SKenneth E. Jansen if(nstepsincycle.eq.0) nphasesincycle = 0 32359599516SKenneth E. Jansen if(nphasesincycle.ne.0) then 32459599516SKenneth E. Jansen! & allocate(yphbar(nshg,5,nphasesincycle)) 32559599516SKenneth E. Jansen if (ivort == 1) then 32659599516SKenneth E. Jansen allocate(yphbar(nshg,15,nphasesincycle)) ! more space for vorticity 32759599516SKenneth E. Jansen else 32859599516SKenneth E. Jansen allocate(yphbar(nshg,11,nphasesincycle)) 32959599516SKenneth E. Jansen endif 33059599516SKenneth E. Jansen yphbar = zero 33159599516SKenneth E. Jansen endif 33259599516SKenneth E. Jansen 33359599516SKenneth E. Jansen!MR CHANGE END 33459599516SKenneth E. Jansen 33559599516SKenneth E. Jansen vbc_prof(:,1:3) = BC(:,3:5) 33659599516SKenneth E. Jansen if(iramp.eq.1) then 33759599516SKenneth E. Jansen call BCprofileInit(vbc_prof,x) 33859599516SKenneth E. Jansen endif 33959599516SKenneth E. Jansen 34059599516SKenneth E. Jansenc 341*ae8d68e4SKenneth E. Jansenc.... ---------------> initialize LesLib Library <--------------- 34259599516SKenneth E. Jansenc 34359599516SKenneth E. Jansenc.... assign parameter values 34459599516SKenneth E. Jansenc 34559599516SKenneth E. Jansen do i = 1, 100 34659599516SKenneth E. Jansen numeqns(i) = i 34759599516SKenneth E. Jansen enddo 34859599516SKenneth E. Jansen nKvecs = Kspace 34959599516SKenneth E. Jansen prjFlag = iprjFlag 35059599516SKenneth E. Jansen presPrjFlag = ipresPrjFlag 35159599516SKenneth E. Jansen verbose = iverbose 35259599516SKenneth E. Jansenc 35359599516SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve 35459599516SKenneth E. Jansenc 35559599516SKenneth E. Jansen nsolt=mod(impl(1),2) ! 1 if solving temperature 35659599516SKenneth E. Jansen nsclrsol=nsolt+nsclr ! total number of scalars solved At 35759599516SKenneth E. Jansen ! some point we probably want to create 35859599516SKenneth E. Jansen ! a map, considering stepseq(), to find 35959599516SKenneth E. Jansen ! what is actually solved and only 36059599516SKenneth E. Jansen ! dimension lhs to the appropriate 36159599516SKenneth E. Jansen ! size. (see 1.6.1 and earlier for a 36259599516SKenneth E. Jansen ! "failed" attempt at this). 36359599516SKenneth E. Jansen 36459599516SKenneth E. Jansen 36559599516SKenneth E. Jansen nsolflow=mod(impl(1),100)/10 ! 1 if solving flow 36659599516SKenneth E. Jansen 36759599516SKenneth E. Jansenc 368*ae8d68e4SKenneth E. Jansenc.... Now, call lesNew routine to initialize 36959599516SKenneth E. Jansenc memory space 37059599516SKenneth E. Jansenc 37159599516SKenneth E. Jansen call genadj(colm, rowp, icnt ) ! preprocess the adjacency list 37259599516SKenneth E. Jansen 37359599516SKenneth E. Jansen nnz_tot=icnt ! this is exactly the number of non-zero blocks on 37459599516SKenneth E. Jansen ! this proc 37559599516SKenneth E. Jansen 37659599516SKenneth E. Jansen if (nsolflow.eq.1) then 37759599516SKenneth E. Jansen lesId = numeqns(1) 37859599516SKenneth E. Jansen eqnType = 1 37959599516SKenneth E. Jansen nDofs = 4 380*ae8d68e4SKenneth E. Jansen 381*ae8d68e4SKenneth E. Jansen!-------------------------------------------------------------------- 382*ae8d68e4SKenneth E. Jansen! Rest of configuration of svLS is added here, where we have LHS 383*ae8d68e4SKenneth E. Jansen! pointers 384*ae8d68e4SKenneth E. Jansen 385*ae8d68e4SKenneth E. Jansen nPermDims = 1 386*ae8d68e4SKenneth E. Jansen nTmpDims = 1 387*ae8d68e4SKenneth E. Jansen 388*ae8d68e4SKenneth E. Jansen allocate (lhsP(4,nnz_tot)) 389*ae8d68e4SKenneth E. Jansen allocate (lhsK(9,nnz_tot)) 390*ae8d68e4SKenneth E. Jansen 391*ae8d68e4SKenneth E. Jansen IF (svLSFlag .EQ. 1) THEN 392*ae8d68e4SKenneth E. Jansen IF (ipvsq .GE. 2) THEN 393*ae8d68e4SKenneth E. Jansen 394*ae8d68e4SKenneth E. Jansen#if((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 1)) 395*ae8d68e4SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs 396*ae8d68e4SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs + numCORSrfs 397*ae8d68e4SKenneth E. Jansen#elif((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 0)) 398*ae8d68e4SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs 399*ae8d68e4SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs + numCORSrfs 400*ae8d68e4SKenneth E. Jansen#elif((VER_CORONARY == 0)&&(VER_CLOSEDLOOP == 1)) 401*ae8d68e4SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs 402*ae8d68e4SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs 403*ae8d68e4SKenneth E. Jansen#else 404*ae8d68e4SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs 405*ae8d68e4SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs 406*ae8d68e4SKenneth E. Jansen#endif 407*ae8d68e4SKenneth E. Jansen 408*ae8d68e4SKenneth E. Jansen ELSE 409*ae8d68e4SKenneth E. Jansen svLS_nFaces = 1 410*ae8d68e4SKenneth E. Jansen END IF 411*ae8d68e4SKenneth E. Jansen 412*ae8d68e4SKenneth E. Jansen CALL svLS_LHS_CREATE(svLS_lhs, communicator, gnNo, nNo, 413*ae8d68e4SKenneth E. Jansen 2 nnz_tot, ltg, colm, rowp, svLS_nFaces) 414*ae8d68e4SKenneth E. Jansen 415*ae8d68e4SKenneth E. Jansen faIn = 1 416*ae8d68e4SKenneth E. Jansen facenNo = 0 417*ae8d68e4SKenneth E. Jansen DO i=1, nshg 418*ae8d68e4SKenneth E. Jansen IF (IBITS(iBC(i),3,3) .NE. 0) facenNo = facenNo + 1 419*ae8d68e4SKenneth E. Jansen END DO 420*ae8d68e4SKenneth E. Jansen ALLOCATE(gNodes(facenNo), sV(nsd,facenNo)) 421*ae8d68e4SKenneth E. Jansen sV = 0D0 422*ae8d68e4SKenneth E. Jansen j = 0 423*ae8d68e4SKenneth E. Jansen DO i=1, nshg 424*ae8d68e4SKenneth E. Jansen IF (IBITS(iBC(i),3,3) .NE. 0) THEN 425*ae8d68e4SKenneth E. Jansen j = j + 1 426*ae8d68e4SKenneth E. Jansen gNodes(j) = i 427*ae8d68e4SKenneth E. Jansen IF (.NOT.BTEST(iBC(i),3)) sV(1,j) = 1D0 428*ae8d68e4SKenneth E. Jansen IF (.NOT.BTEST(iBC(i),4)) sV(2,j) = 1D0 429*ae8d68e4SKenneth E. Jansen IF (.NOT.BTEST(iBC(i),5)) sV(3,j) = 1D0 430*ae8d68e4SKenneth E. Jansen END IF 431*ae8d68e4SKenneth E. Jansen END DO 432*ae8d68e4SKenneth E. Jansen CALL svLS_BC_CREATE(svLS_lhs, faIn, facenNo, 433*ae8d68e4SKenneth E. Jansen 2 nsd, BC_TYPE_Dir, gNodes, sV) 434*ae8d68e4SKenneth E. Jansen 435*ae8d68e4SKenneth E. Jansen IF (ipvsq .GE. 2) THEN 436*ae8d68e4SKenneth E. Jansen DO k = 1, numResistSrfs 437*ae8d68e4SKenneth E. Jansen faIn = faIn + 1 438*ae8d68e4SKenneth E. Jansen CALL AddNeumannBCTosvLS(nsrflistResist(k), faIn) 439*ae8d68e4SKenneth E. Jansen END DO 440*ae8d68e4SKenneth E. Jansen 441*ae8d68e4SKenneth E. Jansen#if(VER_CLOSEDLOOP == 1) 442*ae8d68e4SKenneth E. Jansen DO k = numDirichletSrfs+1, numCoupledSrfs 443*ae8d68e4SKenneth E. Jansen faIn = faIn + 1 444*ae8d68e4SKenneth E. Jansen CALL AddNeumannBCTosvLS(nsrflistCoupled(k), faIn) 445*ae8d68e4SKenneth E. Jansen END DO 446*ae8d68e4SKenneth E. Jansen#endif 447*ae8d68e4SKenneth E. Jansen DO k = 1, numImpSrfs 448*ae8d68e4SKenneth E. Jansen faIn = faIn + 1 449*ae8d68e4SKenneth E. Jansen CALL AddNeumannBCTosvLS(nsrflistImp(k), faIn) 450*ae8d68e4SKenneth E. Jansen END DO 451*ae8d68e4SKenneth E. Jansen DO k = 1, numRCRSrfs 452*ae8d68e4SKenneth E. Jansen faIn = faIn + 1 453*ae8d68e4SKenneth E. Jansen CALL AddNeumannBCTosvLS(nsrflistRCR(k), faIn) 454*ae8d68e4SKenneth E. Jansen END DO 455*ae8d68e4SKenneth E. Jansen#if(VER_CORONARY == 1) 456*ae8d68e4SKenneth E. Jansen DO k = 1, numCORSrfs 457*ae8d68e4SKenneth E. Jansen faIn = faIn + 1 458*ae8d68e4SKenneth E. Jansen CALL AddNeumannBCTosvLS(nsrflistCOR(k), faIn) 459*ae8d68e4SKenneth E. Jansen END DO 460*ae8d68e4SKenneth E. Jansen#endif 461*ae8d68e4SKenneth E. Jansen END IF 462*ae8d68e4SKenneth E. Jansen ELSE 463*ae8d68e4SKenneth E. Jansen!-------------------------------------------------------------------- 46459599516SKenneth E. Jansen call myfLesNew( lesId, 41994, 46559599516SKenneth E. Jansen & eqnType, 46659599516SKenneth E. Jansen & nDofs, minIters, maxIters, 46759599516SKenneth E. Jansen & nKvecs, prjFlag, nPrjs, 46859599516SKenneth E. Jansen & presPrjFlag, nPresPrjs, epstol(1), 46959599516SKenneth E. Jansen & prestol, verbose, statsflow, 47059599516SKenneth E. Jansen & nPermDims, nTmpDims, servername ) 47159599516SKenneth E. Jansen 472*ae8d68e4SKenneth E. Jansen END IF 47359599516SKenneth E. Jansen allocate (aperm(nshg,nPermDims)) 47459599516SKenneth E. Jansen allocate (atemp(nshg,nTmpDims)) 475*ae8d68e4SKenneth E. Jansen IF (svLSFlag .NE. 1) THEN 47659599516SKenneth E. Jansen call readLesRestart( lesId, aperm, nshg, myrank, lstep, 47759599516SKenneth E. Jansen & nPermDims ) 478*ae8d68e4SKenneth E. Jansen ENDIF 47959599516SKenneth E. Jansen 48059599516SKenneth E. Jansen else 48159599516SKenneth E. Jansen nPermDims = 0 48259599516SKenneth E. Jansen nTempDims = 0 48359599516SKenneth E. Jansen endif 48459599516SKenneth E. Jansen 48559599516SKenneth E. Jansen 48659599516SKenneth E. Jansen if(nsclrsol.gt.0) then 48759599516SKenneth E. Jansen do isolsc=1,nsclrsol 48859599516SKenneth E. Jansen lesId = numeqns(isolsc+1) 48959599516SKenneth E. Jansen eqnType = 2 49059599516SKenneth E. Jansen nDofs = 1 49159599516SKenneth E. Jansen presPrjflag = 0 49259599516SKenneth E. Jansen nPresPrjs = 0 49359599516SKenneth E. Jansen prjFlag = 1 49459599516SKenneth E. Jansen indx=isolsc+2-nsolt ! complicated to keep epstol(2) for 49559599516SKenneth E. Jansen ! temperature followed by scalars 49659599516SKenneth E. Jansen call myfLesNew( lesId, 41994, 49759599516SKenneth E. Jansen & eqnType, 49859599516SKenneth E. Jansen & nDofs, minIters, maxIters, 49959599516SKenneth E. Jansen & nKvecs, prjFlag, nPrjs, 50059599516SKenneth E. Jansen & presPrjFlag, nPresPrjs, epstol(indx), 50159599516SKenneth E. Jansen & prestol, verbose, statssclr, 50259599516SKenneth E. Jansen & nPermDimsS, nTmpDimsS, servername ) 50359599516SKenneth E. Jansen enddo 50459599516SKenneth E. Jansenc 50559599516SKenneth E. Jansenc Assume all scalars have the same size needs 50659599516SKenneth E. Jansenc 50759599516SKenneth E. Jansen allocate (apermS(nshg,nPermDimsS,nsclrsol)) 50859599516SKenneth E. Jansen allocate (atempS(nshg,nTmpDimsS)) !they can all share this 50959599516SKenneth E. Jansen allocate (lhsS(nnz_tot,nsclrsol)) 51059599516SKenneth E. Jansenc 51159599516SKenneth E. Jansenc actually they could even share with atemp but leave that for later 51259599516SKenneth E. Jansenc 51359599516SKenneth E. Jansen else 51459599516SKenneth E. Jansen nPermDimsS = 0 51559599516SKenneth E. Jansen nTmpDimsS = 0 51659599516SKenneth E. Jansen endif 51759599516SKenneth E. Jansenc 51859599516SKenneth E. Jansenc... prepare lumped mass if needed 51959599516SKenneth E. Jansenc 52059599516SKenneth E. Jansen if((flmpr.ne.0).or.(flmpl.ne.0)) call genlmass(x, shp,shgl) 52159599516SKenneth E. Jansenc 52259599516SKenneth E. Jansenc.... -----------------> End of initialization <----------------- 52359599516SKenneth E. Jansenc 52459599516SKenneth E. Jansenc.....open the necessary files to gather time series 52559599516SKenneth E. Jansenc 52659599516SKenneth E. Jansen lstep0 = lstep+1 52759599516SKenneth E. Jansen nsteprcr = nstep(1)+lstep 52859599516SKenneth E. Jansenc 52959599516SKenneth E. Jansenc.... loop through the time sequences 53059599516SKenneth E. Jansenc 53159599516SKenneth E. Jansen 53259599516SKenneth E. Jansen 53359599516SKenneth E. Jansen do 3000 itsq = 1, ntseq 53459599516SKenneth E. Jansen itseq = itsq 53559599516SKenneth E. Jansen 53659599516SKenneth E. JansenCAD tcorecp1 = second(0) 53759599516SKenneth E. JansenCAD tcorewc1 = second(-1) 53859599516SKenneth E. Jansenc 53959599516SKenneth E. Jansenc.... set up the time integration parameters 54059599516SKenneth E. Jansenc 54159599516SKenneth E. Jansen nstp = nstep(itseq) 54259599516SKenneth E. Jansen nitr = niter(itseq) 54359599516SKenneth E. Jansen LCtime = loctim(itseq) 54459599516SKenneth E. Jansen dtol(:)= deltol(itseq,:) 54559599516SKenneth E. Jansen 54659599516SKenneth E. Jansen call itrSetup ( y, acold ) 54759599516SKenneth E. Jansenc 54859599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution, 54959599516SKenneth E. Jansenc which are functions of alphaf so need to do it after itrSetup 55059599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 55159599516SKenneth E. Jansen call calcImpConvCoef (numImpSrfs, ntimeptpT) 55259599516SKenneth E. Jansen endif 55359599516SKenneth E. Jansenc 55459599516SKenneth E. Jansenc...initialize the initial condition P(0)-RQ(0)-Pd(0) for RCR BC 55559599516SKenneth E. Jansenc need ndsurf so should be after initNABI 55659599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 55759599516SKenneth E. Jansen call calcRCRic(y,nsrflistRCR,numRCRSrfs) 55859599516SKenneth E. Jansen endif 55959599516SKenneth E. Jansenc 56059599516SKenneth E. Jansenc find the last solve of the flow in the step sequence so that we will 56159599516SKenneth E. Jansenc know when we are at/near end of step 56259599516SKenneth E. Jansenc 56359599516SKenneth E. Jansenc ilast=0 56459599516SKenneth E. Jansen nitr=0 ! count number of flow solves in a step (# of iterations) 56559599516SKenneth E. Jansen do i=1,seqsize 56659599516SKenneth E. Jansen if(stepseq(i).eq.0) nitr=nitr+1 56759599516SKenneth E. Jansen enddo 56859599516SKenneth E. Jansen 56959599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 57059599516SKenneth E. Jansen tcorecp(:) = zero ! used in solfar.f (solflow) 57159599516SKenneth E. Jansen tcorecpscal(:) = zero ! used in solfar.f (solflow) 57259599516SKenneth E. Jansen if(myrank.eq.0) then 57359599516SKenneth E. Jansen tcorecp1 = TMRC() 57459599516SKenneth E. Jansen endif 57559599516SKenneth E. Jansen 57659599516SKenneth E. Jansenc 57759599516SKenneth E. Jansenc.... loop through the time steps 57859599516SKenneth E. Jansenc 57959599516SKenneth E. Jansen istop=0 58059599516SKenneth E. Jansen rmub=datmat(1,2,1) 58159599516SKenneth E. Jansen if(rmutarget.gt.0) then 58259599516SKenneth E. Jansen rmue=rmutarget 58359599516SKenneth E. Jansen else 58459599516SKenneth E. Jansen rmue=datmat(1,2,1) ! keep constant 58559599516SKenneth E. Jansen endif 58659599516SKenneth E. Jansen 58759599516SKenneth E. Jansen if(iramp.eq.1) then 58859599516SKenneth E. Jansen call BCprofileScale(vbc_prof,BC,yold) ! fix the yold values to the reset BC 58959599516SKenneth E. Jansen isclr=1 ! fix scalar 59059599516SKenneth E. Jansen do isclr=1,nsclr 59159599516SKenneth E. Jansen call itrBCSclr(yold,ac,iBC,BC,iper,ilwork) 59259599516SKenneth E. Jansen enddo 59359599516SKenneth E. Jansen endif 59459599516SKenneth E. Jansen 59559599516SKenneth E. Jansen do 2000 istp = 1, nstp 59659599516SKenneth E. Jansen if(iramp.eq.1) 59759599516SKenneth E. Jansen & call BCprofileScale(vbc_prof,BC,yold) 59859599516SKenneth E. Jansen 59959599516SKenneth E. Jansen call rerun_check(stopjob) 60032eed141SKenneth E. Jansen if(myrank.eq.master) write(*,*) 60132eed141SKenneth E. Jansen & 'stopjob,lstep,istep', stopjob,lstep,istep 60232eed141SKenneth E. Jansen if(stopjob.eq.lstep) then 60332eed141SKenneth E. Jansen stopjob=-2 ! this is the code to finish 60432eed141SKenneth E. Jansen if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then 60532eed141SKenneth E. Jansen if(myrank.eq.master) write(*,*) 60632eed141SKenneth E. Jansen & 'line 473 says last step written so exit' 60732eed141SKenneth E. Jansen goto 2002 ! the step was written last step so just exit 60832eed141SKenneth E. Jansen else 60932eed141SKenneth E. Jansen if(myrank.eq.master) 61032eed141SKenneth E. Jansen & write(*,*) 'line 473 says last step not written' 61132eed141SKenneth E. Jansen istep=nstp ! have to do this so that solution will be written 61232eed141SKenneth E. Jansen goto 2001 61332eed141SKenneth E. Jansen endif 61432eed141SKenneth E. Jansen endif 61559599516SKenneth E. Jansen 61659599516SKenneth E. Jansen xi=istp*1.0/nstp 61759599516SKenneth E. Jansen datmat(1,2,1)=rmub*(1.0-xi)+xi*rmue 61859599516SKenneth E. Jansenc write(*,*) "current mol. visc = ", datmat(1,2,1) 61959599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC. 62059599516SKenneth E. Jansenc these will be for time step n+1 so use lstep+1 62159599516SKenneth E. Jansenc 62259599516SKenneth E. Jansen if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl, 62359599516SKenneth E. Jansen & shpb, shglb, x, BC, iBC) 62459599516SKenneth E. Jansen 62559599516SKenneth E. Jansenc 62659599516SKenneth E. Jansenc ... calculate the pressure contribution that depends on the history for the Imp. BC 62759599516SKenneth E. Jansenc 62859599516SKenneth E. Jansen if(numImpSrfs.gt.0) then 62959599516SKenneth E. Jansen call pHist(poldImp,QHistImp,ImpConvCoef, 63059599516SKenneth E. Jansen & ntimeptpT,numImpSrfs) 63159599516SKenneth E. Jansen if (myrank.eq.master) 63259599516SKenneth E. Jansen & write(8177,*) (poldImp(n), n=1,numImpSrfs) 63359599516SKenneth E. Jansen endif 63459599516SKenneth E. Jansenc 63559599516SKenneth E. Jansenc ... calc the pressure contribution that depends on the history for the RCR BC 63659599516SKenneth E. Jansenc 63759599516SKenneth E. Jansen if(numRCRSrfs.gt.0) then 63859599516SKenneth E. Jansen call CalcHopRCR (Delt(itseq), lstep, numRCRSrfs) 63959599516SKenneth E. Jansen call CalcRCRConvCoef(lstep,numRCRSrfs) 64059599516SKenneth E. Jansen call pHist(poldRCR,QHistRCR,RCRConvCoef,nsteprcr, 64159599516SKenneth E. Jansen & numRCRSrfs) 64259599516SKenneth E. Jansen if (myrank.eq.master) 64359599516SKenneth E. Jansen & write(8177,*) (poldRCR(n), n=1,numRCRSrfs) 64459599516SKenneth E. Jansen endif 64559599516SKenneth E. Jansenc 64659599516SKenneth E. Jansenc Decay of scalars 64759599516SKenneth E. Jansenc 64859599516SKenneth E. Jansen if(nsclr.gt.0 .and. tdecay.ne.1) then 64959599516SKenneth E. Jansen yold(:,6:ndof)=y(:,6:ndof)*tdecay 65059599516SKenneth E. Jansen BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*tdecay 65159599516SKenneth E. Jansen endif 65259599516SKenneth E. Jansen 65359599516SKenneth E. Jansen if(nosource.eq.1) BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*0.8 65459599516SKenneth E. Jansen 65559599516SKenneth E. Jansen 65659599516SKenneth E. Jansen if(iLES.gt.0) then !complicated stuff has moved to 65759599516SKenneth E. Jansen !routine below 65859599516SKenneth E. Jansen call lesmodels(yold, acold, shgl, shp, 65959599516SKenneth E. Jansen & iper, ilwork, rowp, colm, 66059599516SKenneth E. Jansen & nsons, ifath, x, 66159599516SKenneth E. Jansen & iBC, BC) 66259599516SKenneth E. Jansen 66359599516SKenneth E. Jansen 66459599516SKenneth E. Jansen endif 66559599516SKenneth E. Jansen 66659599516SKenneth E. Jansenc.... set traction BCs for modeled walls 66759599516SKenneth E. Jansenc 66859599516SKenneth E. Jansen if (itwmod.ne.0) then 66959599516SKenneth E. Jansen call asbwmod(yold, acold, x, BC, iBC, 67059599516SKenneth E. Jansen & iper, ilwork, ifath, velbar) 67159599516SKenneth E. Jansen endif 67259599516SKenneth E. Jansen 67359599516SKenneth E. Jansen!MR CHANGE 67459599516SKenneth E. Jansenc 67559599516SKenneth E. Jansenc.... Determine whether the vorticity field needs to be computed for this time step or not 67659599516SKenneth E. Jansenc 67759599516SKenneth E. Jansen icomputevort = 0 67859599516SKenneth E. Jansen if (ivort == 1) then ! Print vorticity = True in solver.inp 67959599516SKenneth E. Jansen ! We then compute the vorticity only if we 68059599516SKenneth E. Jansen ! 1) we write an intermediate checkpoint 68159599516SKenneth E. Jansen ! 2) we reach the last time step and write the last checkpoint 68259599516SKenneth E. Jansen ! 3) we accumulate statistics in ybar for every time step 68359599516SKenneth E. Jansen ! BEWARE: we need here lstep+1 and istep+1 because the lstep and 68459599516SKenneth E. Jansen ! istep gets incremened after the flowsolve, further below 68559599516SKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep+1, ntout) .eq. 0)) .or. 68659599516SKenneth E. Jansen & istep+1.eq.nstep(itseq) .or. ioybar == 1) then 68759599516SKenneth E. Jansen icomputevort = 1 68859599516SKenneth E. Jansen endif 68959599516SKenneth E. Jansen endif 69059599516SKenneth E. Jansen 69159599516SKenneth E. Jansen! write(*,*) 'icomputevort: ',icomputevort, ' - istep: ', 69259599516SKenneth E. Jansen! & istep,' - nstep(itseq):',nstep(itseq),'- lstep:', 69359599516SKenneth E. Jansen! & lstep, '- ntout:', ntout 69459599516SKenneth E. Jansen!MR CHANGE 69559599516SKenneth E. Jansen 69659599516SKenneth E. Jansenc 69759599516SKenneth E. Jansenc.... -----------------------> predictor phase <----------------------- 69859599516SKenneth E. Jansenc 69959599516SKenneth E. Jansen call itrPredict(yold, y, acold, ac , uold, u, iBC) 70059599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper,ilwork) 70159599516SKenneth E. Jansen 70259599516SKenneth E. Jansen if(nsolt.eq.1) then 70359599516SKenneth E. Jansen isclr=0 70459599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 70559599516SKenneth E. Jansen endif 70659599516SKenneth E. Jansen do isclr=1,nsclr 70759599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 70859599516SKenneth E. Jansen enddo 70959599516SKenneth E. Jansen iter=0 71059599516SKenneth E. Jansen ilss=0 ! this is a switch thrown on first solve of LS redistance 71159599516SKenneth E. Jansen do istepc=1,seqsize 71259599516SKenneth E. Jansen icode=stepseq(istepc) 71359599516SKenneth E. Jansen if(mod(icode,5).eq.0) then ! this is a solve 71459599516SKenneth E. Jansen isolve=icode/10 71559599516SKenneth E. Jansen if(icode.eq.0) then ! flow solve (encoded as 0) 71659599516SKenneth E. Jansenc 71759599516SKenneth E. Jansen iter = iter+1 71859599516SKenneth E. Jansen ifuncs(1) = ifuncs(1) + 1 71959599516SKenneth E. Jansenc 72059599516SKenneth E. Jansen Force(1) = zero 72159599516SKenneth E. Jansen Force(2) = zero 72259599516SKenneth E. Jansen Force(3) = zero 72359599516SKenneth E. Jansen HFlux = zero 72459599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1))) 72559599516SKenneth E. Jansen 72659599516SKenneth E. Jansen call SolFlow(y, ac, u, 72759599516SKenneth E. Jansen & yold, acold, uold, 72859599516SKenneth E. Jansen & x, iBC, 72959599516SKenneth E. Jansen & BC, res, 73059599516SKenneth E. Jansen & nPermDims, nTmpDims, aperm, 73159599516SKenneth E. Jansen & atemp, iper, 73259599516SKenneth E. Jansen & ilwork, shp, shgl, 73359599516SKenneth E. Jansen & shpb, shglb, rowp, 73459599516SKenneth E. Jansen & colm, lhsK, lhsP, 73559599516SKenneth E. Jansen & solinc, rerr, tcorecp, 736*ae8d68e4SKenneth E. Jansen & GradV, sumtime, 737*ae8d68e4SKenneth E. Jansen & svLS_lhs, svLS_ls, svLS_nFaces) 73859599516SKenneth E. Jansen 73959599516SKenneth E. Jansen else ! scalar type solve 74059599516SKenneth E. Jansen if (icode.eq.5) then ! Solve for Temperature 74159599516SKenneth E. Jansen ! (encoded as (nsclr+1)*10) 74259599516SKenneth E. Jansen isclr=0 74359599516SKenneth E. Jansen ifuncs(2) = ifuncs(2) + 1 74459599516SKenneth E. Jansen j=1 74559599516SKenneth E. Jansen else ! solve a scalar (encoded at isclr*10) 74659599516SKenneth E. Jansen isclr=isolve 74759599516SKenneth E. Jansen ifuncs(isclr+2) = ifuncs(isclr+2) + 1 74859599516SKenneth E. Jansen j=isclr+nsolt 74959599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.0) 75059599516SKenneth E. Jansen & .and.(isclr.eq.2)) then 75159599516SKenneth E. Jansen ilss=1 ! throw switch (once per step) 75259599516SKenneth E. Jansen y(:,7)=y(:,6) ! redistance field initialized 75359599516SKenneth E. Jansen ac(:,7) = zero 75459599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 75559599516SKenneth E. Jansen & ilwork) 75659599516SKenneth E. Jansenc 75759599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the 75859599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar 75959599516SKenneth E. Jansenc 76059599516SKenneth E. Jansen alfit=alfi 76159599516SKenneth E. Jansen gamit=gami 76259599516SKenneth E. Jansen almit=almi 76359599516SKenneth E. Jansen Deltt=Delt(1) 76459599516SKenneth E. Jansen Dtglt=Dtgl 76559599516SKenneth E. Jansen alfi = 1 76659599516SKenneth E. Jansen gami = 1 76759599516SKenneth E. Jansen almi = 1 76859599516SKenneth E. Jansenc Delt(1)= Deltt ! Give a pseudo time step 76959599516SKenneth E. Jansen Dtgl = one / Delt(1) 77059599516SKenneth E. Jansen endif ! level set eq. 2 77159599516SKenneth E. Jansen endif ! deciding between temperature and scalar 77259599516SKenneth E. Jansen 77359599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(isclr+2)-1, 77459599516SKenneth E. Jansen & LHSupd(isclr+2))) 77559599516SKenneth E. Jansen 77659599516SKenneth E. Jansen call SolSclr(y, ac, u, 77759599516SKenneth E. Jansen & yold, acold, uold, 77859599516SKenneth E. Jansen & x, iBC, 77959599516SKenneth E. Jansen & BC, nPermDimsS,nTmpDimsS, 78059599516SKenneth E. Jansen & apermS(1,1,j), atempS, iper, 78159599516SKenneth E. Jansen & ilwork, shp, shgl, 78259599516SKenneth E. Jansen & shpb, shglb, rowp, 78359599516SKenneth E. Jansen & colm, lhsS(1,j), 78459599516SKenneth E. Jansen & solinc(1,isclr+5), tcorecpscal) 78559599516SKenneth E. Jansen 78659599516SKenneth E. Jansen 78759599516SKenneth E. Jansen endif ! end of scalar type solve 78859599516SKenneth E. Jansen 78959599516SKenneth E. Jansen else ! this is an update (mod did not equal zero) 79059599516SKenneth E. Jansen iupdate=icode/10 ! what to update 79159599516SKenneth E. Jansen if(icode.eq.1) then !update flow 79259599516SKenneth E. Jansen call itrCorrect ( y, ac, u, solinc, iBC) 79359599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper, ilwork) 79459599516SKenneth E. Jansen else ! update scalar 79559599516SKenneth E. Jansen isclr=iupdate !unless 79659599516SKenneth E. Jansen if(icode.eq.6) isclr=0 79759599516SKenneth E. Jansen if(iRANS.lt.-100)then ! RANS 79859599516SKenneth E. Jansen call itrCorrectSclrPos(y,ac,solinc(1,isclr+5)) 79959599516SKenneth E. Jansen else 80059599516SKenneth E. Jansen call itrCorrectSclr (y, ac, solinc(1,isclr+5)) 80159599516SKenneth E. Jansen endif 80259599516SKenneth E. Jansen if (ilset.eq.2 .and. isclr.eq.2) then 80359599516SKenneth E. Jansen if (ivconstraint .eq. 1) then 80459599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 80559599516SKenneth E. Jansen & ilwork) 80659599516SKenneth E. Jansenc 80759599516SKenneth E. Jansenc ... applying the volume constraint on second level set scalar 80859599516SKenneth E. Jansenc 80959599516SKenneth E. Jansen call solvecon (y, x, iBC, BC, 81059599516SKenneth E. Jansen & iper, ilwork, shp, shgl) 81159599516SKenneth E. Jansenc 81259599516SKenneth E. Jansen endif ! end of volume constraint calculations 81359599516SKenneth E. Jansen endif ! end of redistance calculations 81459599516SKenneth E. Jansenc 81559599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 81659599516SKenneth E. Jansen & ilwork) 81759599516SKenneth E. Jansen endif ! end of flow or scalar update 81859599516SKenneth E. Jansen endif ! end of switch between solve or update 81959599516SKenneth E. Jansen enddo ! loop over sequence in step 82059599516SKenneth E. Jansenc 82159599516SKenneth E. Jansenc 82259599516SKenneth E. Jansenc.... obtain the time average statistics 82359599516SKenneth E. Jansenc 82459599516SKenneth E. Jansen if (ioform .eq. 2) then 82559599516SKenneth E. Jansen 82659599516SKenneth E. Jansen call stsGetStats( y, yold, ac, acold, 82759599516SKenneth E. Jansen & u, uold, x, 82859599516SKenneth E. Jansen & shp, shgl, shpb, shglb, 82959599516SKenneth E. Jansen & iBC, BC, iper, ilwork, 83059599516SKenneth E. Jansen & rowp, colm, lhsK, lhsP ) 83159599516SKenneth E. Jansen endif 83259599516SKenneth E. Jansen 83359599516SKenneth E. Jansenc 83459599516SKenneth E. Jansenc Find the solution at the end of the timestep and move it to old 83559599516SKenneth E. Jansenc 83659599516SKenneth E. Jansenc 83759599516SKenneth E. Jansenc ...First to reassign the parameters for the original time integrator scheme 83859599516SKenneth E. Jansenc 83959599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.1)) then 84059599516SKenneth E. Jansen alfi =alfit 84159599516SKenneth E. Jansen gami =gamit 84259599516SKenneth E. Jansen almi =almit 84359599516SKenneth E. Jansen Delt(1)=Deltt 84459599516SKenneth E. Jansen Dtgl =Dtglt 84559599516SKenneth E. Jansen endif 84659599516SKenneth E. Jansen call itrUpdate( yold, acold, uold, y, ac, u) 84759599516SKenneth E. Jansen call itrBC (yold, acold, iBC, BC, iper,ilwork) 84859599516SKenneth E. Jansen 84959599516SKenneth E. Jansen istep = istep + 1 85059599516SKenneth E. Jansen lstep = lstep + 1 85159599516SKenneth E. Jansenc 85259599516SKenneth E. Jansenc .. Print memory consumption on BGQ 85359599516SKenneth E. Jansenc 85459599516SKenneth E. Jansen call printmeminfo("itrdrv"//char(0)) 85559599516SKenneth E. Jansen 85659599516SKenneth E. Jansenc 85759599516SKenneth E. Jansenc .. Compute vorticity 85859599516SKenneth E. Jansenc 85959599516SKenneth E. Jansen if ( icomputevort == 1) then 86059599516SKenneth E. Jansen 86159599516SKenneth E. Jansen ! vorticity components and magnitude 86259599516SKenneth E. Jansen vorticity(:,1) = GradV(:,8)-GradV(:,6) !omega_x 86359599516SKenneth E. Jansen vorticity(:,2) = GradV(:,3)-GradV(:,7) !omega_y 86459599516SKenneth E. Jansen vorticity(:,3) = GradV(:,4)-GradV(:,2) !omega_z 86559599516SKenneth E. Jansen vorticity(:,4) = sqrt( vorticity(:,1)*vorticity(:,1) 86659599516SKenneth E. Jansen & + vorticity(:,2)*vorticity(:,2) 86759599516SKenneth E. Jansen & + vorticity(:,3)*vorticity(:,3) ) 86859599516SKenneth E. Jansen ! Q 86959599516SKenneth E. Jansen strain(:,1) = GradV(:,1) !S11 87059599516SKenneth E. Jansen strain(:,2) = 0.5*(GradV(:,2)+GradV(:,4)) !S12 87159599516SKenneth E. Jansen strain(:,3) = 0.5*(GradV(:,3)+GradV(:,7)) !S13 87259599516SKenneth E. Jansen strain(:,4) = GradV(:,5) !S22 87359599516SKenneth E. Jansen strain(:,5) = 0.5*(GradV(:,6)+GradV(:,8)) !S23 87459599516SKenneth E. Jansen strain(:,6) = GradV(:,9) !S33 87559599516SKenneth E. Jansen 87659599516SKenneth E. Jansen vorticity(:,5) = 0.25*( vorticity(:,4)*vorticity(:,4) !Q 87759599516SKenneth E. Jansen & - 2.0*( strain(:,1)*strain(:,1) 87859599516SKenneth E. Jansen & + 2* strain(:,2)*strain(:,2) 87959599516SKenneth E. Jansen & + 2* strain(:,3)*strain(:,3) 88059599516SKenneth E. Jansen & + strain(:,4)*strain(:,4) 88159599516SKenneth E. Jansen & + 2* strain(:,5)*strain(:,5) 88259599516SKenneth E. Jansen & + strain(:,6)*strain(:,6))) 88359599516SKenneth E. Jansen 88459599516SKenneth E. Jansen endif 88559599516SKenneth E. Jansenc 886f32d06b0SKenneth E. Jansenc .. write out the instantaneous solution 88759599516SKenneth E. Jansenc 88832eed141SKenneth E. Jansen2001 continue ! we could get here by 2001 label if user requested stop 88959599516SKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or. 89059599516SKenneth E. Jansen & istep.eq.nstep(itseq)) then 89132eed141SKenneth E. Jansen 89232eed141SKenneth E. Jansen!so that we can see progress in force file close it so that it flushes 89332eed141SKenneth E. Jansen!and then reopen in append mode 89432eed141SKenneth E. Jansen 89532eed141SKenneth E. Jansen close(iforce) 89632eed141SKenneth E. Jansen open (unit=iforce, file=fforce, position='append') 89759599516SKenneth E. Jansen 89859599516SKenneth E. Jansen! Call to restar() will open restart file in write mode (and not append mode) 89959599516SKenneth E. Jansen! that is needed as other fields are written in append mode 90032eed141SKenneth E. Jansen 90159599516SKenneth E. Jansen call restar ('out ', yold ,ac) 90259599516SKenneth E. Jansen if(ideformwall == 1) then 9034c3261e2SCameron Smith if(myrank.eq.master) then 9044c3261e2SCameron Smith write(*,*) 'ideformwall is 1 and is a dead code path... exiting' 9054c3261e2SCameron Smith endif 9064c3261e2SCameron Smith stop 90759599516SKenneth E. Jansen endif 90859599516SKenneth E. Jansen 90959599516SKenneth E. Jansen if(ivort == 1) then 91059599516SKenneth E. Jansen call write_field(myrank,'a','vorticity',9,vorticity, 91159599516SKenneth E. Jansen & 'd',nshg,5,lstep) 91259599516SKenneth E. Jansen endif 91359599516SKenneth E. Jansen 91459599516SKenneth E. Jansen call printmeminfo("itrdrv after checkpoint"//char(0)) 91532eed141SKenneth E. Jansen else if(stopjob.eq.-2) then 91632eed141SKenneth E. Jansen if(myrank.eq.master) then 91732eed141SKenneth E. Jansen write(*,*) 'line 755 says no write before stopping' 91832eed141SKenneth E. Jansen write(*,*) 'istep,nstep,irs',istep,nstep(itseq),irs 91959599516SKenneth E. Jansen endif 920f32d06b0SKenneth E. Jansen endif !just the instantaneous stuff for videos 92132eed141SKenneth E. Jansenc 92232eed141SKenneth E. Jansenc.... compute the consistent boundary flux 92332eed141SKenneth E. Jansenc 92432eed141SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 92532eed141SKenneth E. Jansen call Bflux ( yold, acold, uold, x, 92632eed141SKenneth E. Jansen & shp, shgl, shpb, 92732eed141SKenneth E. Jansen & shglb, ilwork, iBC, 92832eed141SKenneth E. Jansen & BC, iper, wallssVec) 92932eed141SKenneth E. Jansen endif 93032eed141SKenneth E. Jansen 93132eed141SKenneth E. Jansen if(stopjob.eq.-2) goto 2003 93232eed141SKenneth E. Jansen 93359599516SKenneth E. Jansen 93459599516SKenneth E. Jansenc 93559599516SKenneth E. Jansenc ... update the flow history for the impedance convolution, filter it and write it out 93659599516SKenneth E. Jansenc 93759599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 93859599516SKenneth E. Jansen call UpdHistConv(y,nsrflistImp,numImpSrfs) !uses Delt(1) 93959599516SKenneth E. Jansen endif 94059599516SKenneth E. Jansen 94159599516SKenneth E. Jansenc 94259599516SKenneth E. Jansenc ... update the flow history for the RCR convolution 94359599516SKenneth E. Jansenc 94459599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 94559599516SKenneth E. Jansen call UpdHistConv(y,nsrflistRCR,numRCRSrfs) !uses lstep 94659599516SKenneth E. Jansen endif 94759599516SKenneth E. Jansen 94859599516SKenneth E. Jansen 94959599516SKenneth E. Jansenc... dump TIME SERIES 95059599516SKenneth E. Jansen 95159599516SKenneth E. Jansen if (exts) then 95259599516SKenneth E. Jansen if (mod(lstep-1,freq).eq.0) then 95359599516SKenneth E. Jansen 95459599516SKenneth E. Jansen if (numpe > 1) then 95559599516SKenneth E. Jansen do jj = 1, ntspts 95659599516SKenneth E. Jansen vartssoln((jj-1)*ndof+1:jj*ndof)=varts(jj,:) 95759599516SKenneth E. Jansen ivarts=zero 95859599516SKenneth E. Jansen enddo 95959599516SKenneth E. Jansen do k=1,ndof*ntspts 96059599516SKenneth E. Jansen if(vartssoln(k).ne.zero) ivarts(k)=1 96159599516SKenneth E. Jansen enddo 96259599516SKenneth E. Jansen 96359599516SKenneth E. Jansen! call MPI_REDUCE(vartssoln, vartssolng, ndof*ntspts, 96459599516SKenneth E. Jansen! & MPI_DOUBLE_PRECISION, MPI_SUM, master, 96559599516SKenneth E. Jansen! & MPI_COMM_WORLD, ierr) 96659599516SKenneth E. Jansen 96759599516SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 96859599516SKenneth E. Jansen call MPI_ALLREDUCE(vartssoln, vartssolng, 96959599516SKenneth E. Jansen & ndof*ntspts, 97059599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION, MPI_SUM, 97159599516SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 97259599516SKenneth E. Jansen 97359599516SKenneth E. Jansen! call MPI_REDUCE(ivarts, ivartsg, ndof*ntspts, 97459599516SKenneth E. Jansen! & MPI_INTEGER, MPI_SUM, master, 97559599516SKenneth E. Jansen! & MPI_COMM_WORLD, ierr) 97659599516SKenneth E. Jansen 97759599516SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 97859599516SKenneth E. Jansen call MPI_ALLREDUCE(ivarts, ivartsg, ndof*ntspts, 97959599516SKenneth E. Jansen & MPI_INTEGER, MPI_SUM, 98059599516SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 98159599516SKenneth E. Jansen 98259599516SKenneth E. Jansen! if (myrank.eq.zero) then 98359599516SKenneth E. Jansen do jj = 1, ntspts 98459599516SKenneth E. Jansen 98559599516SKenneth E. Jansen if(myrank .eq. iv_rank(jj)) then 98659599516SKenneth E. Jansen ! No need to update all varts components, only the one treated by the expected rank 98759599516SKenneth E. Jansen ! Note: keep varts as a vector, as multiple probes could be treated by one rank 98859599516SKenneth E. Jansen indxvarts = (jj-1)*ndof 98959599516SKenneth E. Jansen do k=1,ndof 99059599516SKenneth E. Jansen if(ivartsg(indxvarts+k).ne.0) then ! none of the vartssoln(parts) were non zero 99159599516SKenneth E. Jansen varts(jj,k)=vartssolng(indxvarts+k)/ 99259599516SKenneth E. Jansen & ivartsg(indxvarts+k) 99359599516SKenneth E. Jansen endif 99459599516SKenneth E. Jansen enddo 99559599516SKenneth E. Jansen endif !only if myrank eq iv_rank(jj) 99659599516SKenneth E. Jansen enddo 99759599516SKenneth E. Jansen! endif !only on master 99859599516SKenneth E. Jansen endif !only if numpe > 1 99959599516SKenneth E. Jansen 100059599516SKenneth E. Jansen! if (myrank.eq.zero) then 100159599516SKenneth E. Jansen do jj = 1, ntspts 100259599516SKenneth E. Jansen if(myrank .eq. iv_rank(jj)) then 100359599516SKenneth E. Jansen ifile = 1000+jj 100459599516SKenneth E. Jansen write(ifile,555) lstep, (varts(jj,k),k=1,ndof) !Beware of format 555 - check ndof 100559599516SKenneth E. Jansenc call flush(ifile) 100659599516SKenneth E. Jansen if (((irs .ge. 1) .and. 100759599516SKenneth E. Jansen & (mod(lstep, ntout) .eq. 0))) then 100859599516SKenneth E. Jansen close(ifile) 100959599516SKenneth E. Jansen fvarts='varts/varts' 101059599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(jj)) 101159599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(lskeep)) 101259599516SKenneth E. Jansen fvarts=trim(fvarts)//'.dat' 101359599516SKenneth E. Jansen fvarts=trim(fvarts) 101459599516SKenneth E. Jansen open(unit=ifile, file=fvarts, 101559599516SKenneth E. Jansen & position='append') 101659599516SKenneth E. Jansen endif !only when dumping restart 101759599516SKenneth E. Jansen endif 101859599516SKenneth E. Jansen enddo 101959599516SKenneth E. Jansen! endif !only on master 102059599516SKenneth E. Jansen 102159599516SKenneth E. Jansen varts(:,:) = zero ! reset the array for next step 102259599516SKenneth E. Jansen 102359599516SKenneth E. Jansen 102459599516SKenneth E. Jansen!555 format(i6,5(2x,E12.5e2)) 102559599516SKenneth E. Jansen555 format(i6,6(2x,E20.12e2)) !assuming ndof = 6 here 102659599516SKenneth E. Jansen 102759599516SKenneth E. Jansen endif 102859599516SKenneth E. Jansen endif 102959599516SKenneth E. Jansen 103059599516SKenneth E. Jansenc 103159599516SKenneth E. Jansenc.... update and the aerodynamic forces 103259599516SKenneth E. Jansenc 103359599516SKenneth E. Jansen call forces ( yold, ilwork ) 103459599516SKenneth E. Jansen 103559599516SKenneth E. Jansen if((irscale.ge.0).or.(itwmod.gt.0)) 103659599516SKenneth E. Jansen & call getvel (yold, ilwork, iBC, 103759599516SKenneth E. Jansen & nsons, ifath, velbar) 103859599516SKenneth E. Jansen 103959599516SKenneth E. Jansen if((irscale.ge.0).and.(myrank.eq.master)) then 104059599516SKenneth E. Jansen call genscale(yold, x, iper, 104159599516SKenneth E. Jansen & iBC, ifath, velbar, 104259599516SKenneth E. Jansen & nsons) 104359599516SKenneth E. Jansen endif 104459599516SKenneth E. Jansenc 104559599516SKenneth E. Jansenc.... print out results. 104659599516SKenneth E. Jansenc 104759599516SKenneth E. Jansen ntoutv=max(ntout,100) ! velb is not needed so often 104859599516SKenneth E. Jansen if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then 104959599516SKenneth E. Jansen if( (mod(lstep, ntoutv) .eq. 0) .and. 105059599516SKenneth E. Jansen & ((irscale.ge.0).or.(itwmod.gt.0) .or. 105159599516SKenneth E. Jansen & ((nsonmax.eq.1).and.(iLES.gt.0)))) 105259599516SKenneth E. Jansen & call rwvelb ('out ', velbar ,ifail) 105359599516SKenneth E. Jansen endif 105459599516SKenneth E. Jansenc 105559599516SKenneth E. Jansenc.... end of the NSTEP and NTSEQ loops 105659599516SKenneth E. Jansenc 105759599516SKenneth E. Jansen 105859599516SKenneth E. Jansen 105959599516SKenneth E. Jansenc 106059599516SKenneth E. Jansenc.... -------------------> error calculation <----------------- 106159599516SKenneth E. Jansenc 106259599516SKenneth E. Jansen if(ierrcalc.eq.1 .or. ioybar.eq.1) then 106359599516SKenneth E. Jansenc$$$c 106459599516SKenneth E. Jansenc$$$c compute average 106559599516SKenneth E. Jansenc$$$c 106659599516SKenneth E. Jansenc$$$ tfact=one/istep 106759599516SKenneth E. Jansenc$$$ ybar =tfact*yold + (one-tfact)*ybar 106859599516SKenneth E. Jansen 106959599516SKenneth E. Jansenc compute average 107059599516SKenneth E. Jansenc ybar(:,1:3) are average velocity components 107159599516SKenneth E. Jansenc ybar(:,4) is average pressure 107259599516SKenneth E. Jansenc ybar(:,5) is average speed 107359599516SKenneth E. Jansenc ybar(:,6:8) is average of sq. of each vel. component 107459599516SKenneth E. Jansenc ybar(:,9) is average of sq. of pressure 107559599516SKenneth E. Jansenc ybar(:,10:12) is average of cross vel. components : uv, uw and vw 107659599516SKenneth E. Jansenc averaging procedure justified only for identical time step sizes 107759599516SKenneth E. Jansenc ybar(:,13) is average of eddy viscosity 107859599516SKenneth E. Jansenc ybar(:,14:16) is average vorticity components 107959599516SKenneth E. Jansenc ybar(:,17) is average vorticity magnitude 108059599516SKenneth E. Jansenc istep is number of time step 108159599516SKenneth E. Jansenc 108259599516SKenneth E. Jansen icollectybar = 0 108359599516SKenneth E. Jansen if(nphasesincycle.eq.0 .or. 108459599516SKenneth E. Jansen & istep.gt.ncycles_startphaseavg*nstepsincycle) then 108559599516SKenneth E. Jansen icollectybar = 1 108659599516SKenneth E. Jansen if((istep-1).eq.ncycles_startphaseavg*nstepsincycle) 108759599516SKenneth E. Jansen & istepsinybar = 0 ! init. to zero in first cycle in avg. 108859599516SKenneth E. Jansen endif 108959599516SKenneth E. Jansen 109059599516SKenneth E. Jansen if(icollectybar.eq.1) then 109159599516SKenneth E. Jansen istepsinybar = istepsinybar+1 109259599516SKenneth E. Jansen tfact=one/istepsinybar 109359599516SKenneth E. Jansen 109459599516SKenneth E. Jansen if(myrank.eq.master .and. nphasesincycle.ne.0 .and. 109559599516SKenneth E. Jansen & mod((istep-1),nstepsincycle).eq.0) 109659599516SKenneth E. Jansen & write(*,*)'nsamples in phase average:',istepsinybar 109759599516SKenneth E. Jansen 109859599516SKenneth E. Jansenc ybar to contain the averaged ((u,v,w),p)-fields 109959599516SKenneth E. Jansenc and speed average, i.e., sqrt(u^2+v^2+w^2) 110059599516SKenneth E. Jansenc and avg. of sq. terms including 110159599516SKenneth E. Jansenc u^2, v^2, w^2, p^2 and cross terms of uv, uw and vw 110259599516SKenneth E. Jansen 110359599516SKenneth E. Jansen ybar(:,1) = tfact*yold(:,1) + (one-tfact)*ybar(:,1) 110459599516SKenneth E. Jansen ybar(:,2) = tfact*yold(:,2) + (one-tfact)*ybar(:,2) 110559599516SKenneth E. Jansen ybar(:,3) = tfact*yold(:,3) + (one-tfact)*ybar(:,3) 110659599516SKenneth E. Jansen ybar(:,4) = tfact*yold(:,4) + (one-tfact)*ybar(:,4) 110759599516SKenneth E. Jansen ybar(:,5) = tfact*sqrt(yold(:,1)**2+yold(:,2)**2+ 110859599516SKenneth E. Jansen & yold(:,3)**2) + (one-tfact)*ybar(:,5) 110959599516SKenneth E. Jansen ybar(:,6) = tfact*yold(:,1)**2 + 111059599516SKenneth E. Jansen & (one-tfact)*ybar(:,6) 111159599516SKenneth E. Jansen ybar(:,7) = tfact*yold(:,2)**2 + 111259599516SKenneth E. Jansen & (one-tfact)*ybar(:,7) 111359599516SKenneth E. Jansen ybar(:,8) = tfact*yold(:,3)**2 + 111459599516SKenneth E. Jansen & (one-tfact)*ybar(:,8) 111559599516SKenneth E. Jansen ybar(:,9) = tfact*yold(:,4)**2 + 111659599516SKenneth E. Jansen & (one-tfact)*ybar(:,9) 111759599516SKenneth E. Jansen ybar(:,10) = tfact*yold(:,1)*yold(:,2) + !uv 111859599516SKenneth E. Jansen & (one-tfact)*ybar(:,10) 111959599516SKenneth E. Jansen ybar(:,11) = tfact*yold(:,1)*yold(:,3) + !uw 112059599516SKenneth E. Jansen & (one-tfact)*ybar(:,11) 112159599516SKenneth E. Jansen ybar(:,12) = tfact*yold(:,2)*yold(:,3) + !vw 112259599516SKenneth E. Jansen & (one-tfact)*ybar(:,12) 112359599516SKenneth E. Jansen!MR CHANGE 112459599516SKenneth E. Jansen if(nsclr.gt.0) !nut 112559599516SKenneth E. Jansen & ybar(:,13) = tfact*yold(:,6) + (one-tfact)*ybar(:,13) 112659599516SKenneth E. Jansen 112759599516SKenneth E. Jansen if(ivort == 1) then !vorticity 112859599516SKenneth E. Jansen ybar(:,14) = tfact*vorticity(:,1) + 112959599516SKenneth E. Jansen & (one-tfact)*ybar(:,14) 113059599516SKenneth E. Jansen ybar(:,15) = tfact*vorticity(:,2) + 113159599516SKenneth E. Jansen & (one-tfact)*ybar(:,15) 113259599516SKenneth E. Jansen ybar(:,16) = tfact*vorticity(:,3) + 113359599516SKenneth E. Jansen & (one-tfact)*ybar(:,16) 113459599516SKenneth E. Jansen ybar(:,17) = tfact*vorticity(:,4) + 113559599516SKenneth E. Jansen & (one-tfact)*ybar(:,17) 113659599516SKenneth E. Jansen endif 113759599516SKenneth E. Jansen 113859599516SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 113959599516SKenneth E. Jansen wallssVecBar(:,1) = tfact*wallssVec(:,1) 114059599516SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,1) 114159599516SKenneth E. Jansen wallssVecBar(:,2) = tfact*wallssVec(:,2) 114259599516SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,2) 114359599516SKenneth E. Jansen wallssVecBar(:,3) = tfact*wallssVec(:,3) 114459599516SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,3) 114559599516SKenneth E. Jansen endif 114659599516SKenneth E. Jansen!MR CHANGE END 114759599516SKenneth E. Jansen endif 114859599516SKenneth E. Jansenc 114959599516SKenneth E. Jansenc compute phase average 115059599516SKenneth E. Jansenc 115159599516SKenneth E. Jansen if(nphasesincycle.ne.0 .and. 115259599516SKenneth E. Jansen & istep.gt.ncycles_startphaseavg*nstepsincycle) then 115359599516SKenneth E. Jansen 115459599516SKenneth E. Jansenc beginning of cycle is considered as ncycles_startphaseavg*nstepsincycle+1 115559599516SKenneth E. Jansen if((istep-1).eq.ncycles_startphaseavg*nstepsincycle) 115659599516SKenneth E. Jansen & icyclesinavg = 0 ! init. to zero in first cycle in avg. 115759599516SKenneth E. Jansen 115859599516SKenneth E. Jansen ! find number of steps between phases 115959599516SKenneth E. Jansen nstepsbtwphase = nstepsincycle/nphasesincycle ! integer value 116059599516SKenneth E. Jansen if(mod(istep-1,nstepsincycle).eq.0) then 116159599516SKenneth E. Jansen iphase = 1 ! init. to one in beginning of every cycle 116259599516SKenneth E. Jansen icyclesinavg = icyclesinavg + 1 116359599516SKenneth E. Jansen endif 116459599516SKenneth E. Jansen 116559599516SKenneth E. Jansen icollectphase = 0 116659599516SKenneth E. Jansen istepincycle = mod(istep,nstepsincycle) 116759599516SKenneth E. Jansen if(istepincycle.eq.0) istepincycle=nstepsincycle 116859599516SKenneth E. Jansen if(istepincycle.eq.iphase*nstepsbtwphase) then 116959599516SKenneth E. Jansen icollectphase = 1 117059599516SKenneth E. Jansen iphase = iphase+1 ! use 'iphase-1' below 117159599516SKenneth E. Jansen endif 117259599516SKenneth E. Jansen 117359599516SKenneth E. Jansen if(icollectphase.eq.1) then 117459599516SKenneth E. Jansen tfactphase = one/icyclesinavg 117559599516SKenneth E. Jansen 117659599516SKenneth E. Jansen if(myrank.eq.master) then 117759599516SKenneth E. Jansen write(*,*) 'nsamples in phase ',iphase-1,': ', 117859599516SKenneth E. Jansen & icyclesinavg 117959599516SKenneth E. Jansen endif 118059599516SKenneth E. Jansen 118159599516SKenneth E. Jansen yphbar(:,1,iphase-1) = tfactphase*yold(:,1) + 118259599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,1,iphase-1) 118359599516SKenneth E. Jansen yphbar(:,2,iphase-1) = tfactphase*yold(:,2) + 118459599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,2,iphase-1) 118559599516SKenneth E. Jansen yphbar(:,3,iphase-1) = tfactphase*yold(:,3) + 118659599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,3,iphase-1) 118759599516SKenneth E. Jansen yphbar(:,4,iphase-1) = tfactphase*yold(:,4) + 118859599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,4,iphase-1) 118959599516SKenneth E. Jansen yphbar(:,5,iphase-1) = tfactphase*sqrt(yold(:,1)**2 119059599516SKenneth E. Jansen & +yold(:,2)**2+yold(:,3)**2) + 119159599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,5,iphase-1) 119259599516SKenneth E. Jansen!MR CHANGE 119359599516SKenneth E. Jansen yphbar(:,6,iphase-1) = 119459599516SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,1) 119559599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,6,iphase-1) 119659599516SKenneth E. Jansen 119759599516SKenneth E. Jansen yphbar(:,7,iphase-1) = 119859599516SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,2) 119959599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,7,iphase-1) 120059599516SKenneth E. Jansen 120159599516SKenneth E. Jansen yphbar(:,8,iphase-1) = 120259599516SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,3) 120359599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,8,iphase-1) 120459599516SKenneth E. Jansen 120559599516SKenneth E. Jansen yphbar(:,9,iphase-1) = 120659599516SKenneth E. Jansen & tfactphase*yold(:,2)*yold(:,2) 120759599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,9,iphase-1) 120859599516SKenneth E. Jansen 120959599516SKenneth E. Jansen yphbar(:,10,iphase-1) = 121059599516SKenneth E. Jansen & tfactphase*yold(:,2)*yold(:,3) 121159599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,10,iphase-1) 121259599516SKenneth E. Jansen 121359599516SKenneth E. Jansen yphbar(:,11,iphase-1) = 121459599516SKenneth E. Jansen & tfactphase*yold(:,3)*yold(:,3) 121559599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,11,iphase-1) 121659599516SKenneth E. Jansen 121759599516SKenneth E. Jansen if(ivort == 1) then 121859599516SKenneth E. Jansen yphbar(:,12,iphase-1) = 121959599516SKenneth E. Jansen & tfactphase*vorticity(:,1) 122059599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,12,iphase-1) 122159599516SKenneth E. Jansen yphbar(:,13,iphase-1) = 122259599516SKenneth E. Jansen & tfactphase*vorticity(:,2) 122359599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,13,iphase-1) 122459599516SKenneth E. Jansen yphbar(:,14,iphase-1) = 122559599516SKenneth E. Jansen & tfactphase*vorticity(:,3) 122659599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,14,iphase-1) 122759599516SKenneth E. Jansen yphbar(:,15,iphase-1) = 122859599516SKenneth E. Jansen & tfactphase*vorticity(:,4) 122959599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,15,iphase-1) 123059599516SKenneth E. Jansen endif 123159599516SKenneth E. Jansen!MR CHANGE END 123259599516SKenneth E. Jansen endif 123359599516SKenneth E. Jansen endif 123459599516SKenneth E. Jansenc 123559599516SKenneth E. Jansenc compute rms 123659599516SKenneth E. Jansenc 123759599516SKenneth E. Jansen if(icollectybar.eq.1) then 123859599516SKenneth E. Jansen rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2 123959599516SKenneth E. Jansen rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2 124059599516SKenneth E. Jansen rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2 124159599516SKenneth E. Jansen rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2 124259599516SKenneth E. Jansen endif 124359599516SKenneth E. Jansen endif 124432eed141SKenneth E. Jansen 2003 continue ! we get here if stopjob equals lstep and this jumped over 124532eed141SKenneth E. Jansen! the statistics computation because we have no new data to average in 124632eed141SKenneth E. Jansen! rather we are just trying to output the last state that was not already 124732eed141SKenneth E. Jansen! written 124832eed141SKenneth E. Jansenc 124932eed141SKenneth E. Jansenc.... ----------------------> Complete Restart Processing <---------------------- 125032eed141SKenneth E. Jansenc 125132eed141SKenneth E. Jansen! for now it is the same frequency but need to change this 125232eed141SKenneth E. Jansen! soon.... but don't forget to change the field counter in 125332eed141SKenneth E. Jansen! new_interface.cc 125432eed141SKenneth E. Jansen! 125532eed141SKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or. 125632eed141SKenneth E. Jansen & istep.eq.nstep(itseq)) then 125732eed141SKenneth E. Jansen if ((irs .ge. 1) .and. ((mod(lstep, ntout) .ne. 0) .or. 125832eed141SKenneth E. Jansen & (nstp .eq. 0))) then 125932eed141SKenneth E. Jansen if( 126032eed141SKenneth E. Jansen & ((irscale.ge.0).or.(itwmod.gt.0) .or. 126132eed141SKenneth E. Jansen & ((nsonmax.eq.1).and.iLES.gt.0))) 126232eed141SKenneth E. Jansen & call rwvelb ('out ', velbar ,ifail) 126332eed141SKenneth E. Jansen endif 126459599516SKenneth E. Jansen 126532eed141SKenneth E. Jansen lesId = numeqns(1) 126632eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 126732eed141SKenneth E. Jansen if(myrank.eq.0) then 126832eed141SKenneth E. Jansen tcormr1 = TMRC() 126932eed141SKenneth E. Jansen endif 1270c9a96f21SKenneth E. Jansen if(nsolflow.eq.1) then 127132eed141SKenneth E. Jansen call saveLesRestart( lesId, aperm , nshg, myrank, lstep, 127232eed141SKenneth E. Jansen & nPermDims ) 127332eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 127432eed141SKenneth E. Jansen if(myrank.eq.0) then 127532eed141SKenneth E. Jansen tcormr2 = TMRC() 127632eed141SKenneth E. Jansen write(6,*) 'call saveLesRestart for projection and'// 127732eed141SKenneth E. Jansen & 'pressure projection vectors', tcormr2-tcormr1 127832eed141SKenneth E. Jansen endif 1279c9a96f21SKenneth E. Jansen endif 128032eed141SKenneth E. Jansen 128132eed141SKenneth E. Jansen if(ierrcalc.eq.1) then 128232eed141SKenneth E. Jansenc 128332eed141SKenneth E. Jansenc.....smooth the error indicators 128432eed141SKenneth E. Jansenc 128532eed141SKenneth E. Jansen do i=1,ierrsmooth 128632eed141SKenneth E. Jansen call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC ) 128732eed141SKenneth E. Jansen end do 128832eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 128932eed141SKenneth E. Jansen if(myrank.eq.0) then 129032eed141SKenneth E. Jansen tcormr1 = TMRC() 129132eed141SKenneth E. Jansen endif 129232eed141SKenneth E. Jansen call write_error(myrank, lstep, nshg, 10, rerr ) 129332eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 129432eed141SKenneth E. Jansen if(myrank.eq.0) then 129532eed141SKenneth E. Jansen tcormr2 = TMRC() 129632eed141SKenneth E. Jansen write(6,*) 'Time to write the error fields to the disks', 129732eed141SKenneth E. Jansen & tcormr2-tcormr1 129832eed141SKenneth E. Jansen endif 129932eed141SKenneth E. Jansen endif ! ierrcalc 130032eed141SKenneth E. Jansen 130132eed141SKenneth E. Jansen if(ioybar.eq.1) then 130232eed141SKenneth E. Jansen if(ivort == 1) then 130332eed141SKenneth E. Jansen call write_field(myrank,'a','ybar',4, 130432eed141SKenneth E. Jansen & ybar,'d',nshg,17,lstep) 130532eed141SKenneth E. Jansen else 130632eed141SKenneth E. Jansen call write_field(myrank,'a','ybar',4, 130732eed141SKenneth E. Jansen & ybar,'d',nshg,13,lstep) 130832eed141SKenneth E. Jansen endif 130932eed141SKenneth E. Jansen 131032eed141SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 131132eed141SKenneth E. Jansen call write_field(myrank,'a','wssbar',6, 131232eed141SKenneth E. Jansen & wallssVecBar,'d',nshg,3,lstep) 131332eed141SKenneth E. Jansen endif 131432eed141SKenneth E. Jansen 131532eed141SKenneth E. Jansen if(nphasesincycle .gt. 0) then 131632eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 131732eed141SKenneth E. Jansen if(myrank.eq.0) then 131832eed141SKenneth E. Jansen tcormr1 = TMRC() 131932eed141SKenneth E. Jansen endif 132032eed141SKenneth E. Jansen do iphase=1,nphasesincycle 132132eed141SKenneth E. Jansen if(ivort == 1) then 132232eed141SKenneth E. Jansen call write_phavg2(myrank,'a','phase_average',13,iphase, 132332eed141SKenneth E. Jansen & nphasesincycle,yphbar(:,:,iphase),'d',nshg,15,lstep) 132432eed141SKenneth E. Jansen else 132532eed141SKenneth E. Jansen call write_phavg2(myrank,'a','phase_average',13,iphase, 132632eed141SKenneth E. Jansen & nphasesincycle,yphbar(:,:,iphase),'d',nshg,11,lstep) 132732eed141SKenneth E. Jansen endif 132832eed141SKenneth E. Jansen end do 132932eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 133032eed141SKenneth E. Jansen if(myrank.eq.0) then 133132eed141SKenneth E. Jansen tcormr2 = TMRC() 133232eed141SKenneth E. Jansen write(6,*) 'write all phase avg to the disks = ', 133332eed141SKenneth E. Jansen & tcormr2-tcormr1 133432eed141SKenneth E. Jansen endif 133532eed141SKenneth E. Jansen endif !nphasesincyle 133632eed141SKenneth E. Jansen endif !ioybar 133732eed141SKenneth E. Jansen 133832eed141SKenneth E. Jansen if ( ( ihessian .eq. 1 ) .and. ( numpe < 2 ) )then 133932eed141SKenneth E. Jansen uhess = zero 134032eed141SKenneth E. Jansen gradu = zero 134132eed141SKenneth E. Jansen tf = zero 134232eed141SKenneth E. Jansen 134332eed141SKenneth E. Jansen do ku=1,nshg 134432eed141SKenneth E. Jansen tf(ku,1) = x(ku,1)**3 134532eed141SKenneth E. Jansen end do 134632eed141SKenneth E. Jansen call hessian( yold, x, shp, shgl, iBC, 134732eed141SKenneth E. Jansen & shpb, shglb, iper, ilwork, uhess, gradu ) 134832eed141SKenneth E. Jansen 134932eed141SKenneth E. Jansen call write_hessian( uhess, gradu, nshg ) 135032eed141SKenneth E. Jansen endif 135132eed141SKenneth E. Jansen 135232eed141SKenneth E. Jansen if(iRANS.lt.0) then 135332eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 135432eed141SKenneth E. Jansen if(myrank.eq.0) then 135532eed141SKenneth E. Jansen tcormr1 = TMRC() 135632eed141SKenneth E. Jansen endif 135732eed141SKenneth E. Jansen call write_field(myrank,'a','dwal',4,d2wall,'d', 135832eed141SKenneth E. Jansen & nshg,1,lstep) 135932eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 136032eed141SKenneth E. Jansen if(myrank.eq.0) then 136132eed141SKenneth E. Jansen tcormr2 = TMRC() 136232eed141SKenneth E. Jansen write(6,*) 'Time to write dwal to the disks = ', 136332eed141SKenneth E. Jansen & tcormr2-tcormr1 136432eed141SKenneth E. Jansen endif 136532eed141SKenneth E. Jansen endif !iRANS 136632eed141SKenneth E. Jansen 136732eed141SKenneth E. Jansen endif ! write out complete restart state 136832eed141SKenneth E. Jansen !next 2 lines are two ways to end early 136932eed141SKenneth E. Jansen if(stopjob.eq.-2) goto 2002 137032eed141SKenneth E. Jansen if(istop.eq.1000) goto 2002 ! stop when delta small (see rstatic) 137159599516SKenneth E. Jansen 2000 continue 137232eed141SKenneth E. Jansen 2002 continue 137332eed141SKenneth E. Jansen 1374f32d06b0SKenneth E. Jansen! done with time stepping so deallocate fields already written 137532eed141SKenneth E. Jansen! 137632eed141SKenneth E. Jansen if(ioybar.eq.1) then 137732eed141SKenneth E. Jansen deallocate(ybar) 137832eed141SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 137932eed141SKenneth E. Jansen deallocate(wallssVecbar) 138032eed141SKenneth E. Jansen endif 138132eed141SKenneth E. Jansen if(nphasesincycle .gt. 0) then 138232eed141SKenneth E. Jansen deallocate(yphbar) 138332eed141SKenneth E. Jansen endif !nphasesincyle 138432eed141SKenneth E. Jansen endif !ioybar 138532eed141SKenneth E. Jansen if(ivort == 1) then 138632eed141SKenneth E. Jansen deallocate(strain,vorticity) 138732eed141SKenneth E. Jansen endif 138832eed141SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 138932eed141SKenneth E. Jansen deallocate(wallssVec) 139032eed141SKenneth E. Jansen endif 139132eed141SKenneth E. Jansen if(iRANS.lt.0) then 139232eed141SKenneth E. Jansen deallocate(d2wall) 139332eed141SKenneth E. Jansen endif 139459599516SKenneth E. Jansen 139559599516SKenneth E. Jansen 139659599516SKenneth E. JansenCAD tcorecp2 = second(0) 139759599516SKenneth E. JansenCAD tcorewc2 = second(-1) 139859599516SKenneth E. Jansen 139959599516SKenneth E. JansenCAD write(6,*) 'T(core) cpu-wallclock = ',tcorecp2-tcorecp1, 140059599516SKenneth E. JansenCAD & tcorewc2-tcorewc1 140159599516SKenneth E. Jansen 140259599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 140359599516SKenneth E. Jansen if(myrank.eq.0) then 140459599516SKenneth E. Jansen tcorecp2 = TMRC() 140559599516SKenneth E. Jansen write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1 140659599516SKenneth E. Jansen write(6,*) '(Elm. form.',tcorecp(1), 140759599516SKenneth E. Jansen & ',Lin. alg. sol.',tcorecp(2),')' 140859599516SKenneth E. Jansen write(6,*) '(Elm. form. Scal.',tcorecpscal(1), 140959599516SKenneth E. Jansen & ',Lin. alg. sol. Scal.',tcorecpscal(2),')' 141059599516SKenneth E. Jansen write(6,*) '' 141159599516SKenneth E. Jansen 141259599516SKenneth E. Jansen endif 141359599516SKenneth E. Jansen 141459599516SKenneth E. Jansen call print_system_stats(tcorecp, tcorecpscal) 141559599516SKenneth E. Jansen call print_mesh_stats() 141659599516SKenneth E. Jansen call print_mpi_stats() 141759599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 141859599516SKenneth E. Jansen! return 141959599516SKenneth E. Jansenc call MPI_Finalize() 142059599516SKenneth E. Jansenc call MPI_ABORT(MPI_COMM_WORLD, ierr) 142159599516SKenneth E. Jansen 142259599516SKenneth E. Jansen 3000 continue 142359599516SKenneth E. Jansen 142459599516SKenneth E. Jansen 142559599516SKenneth E. Jansenc 142659599516SKenneth E. Jansenc.... close history and aerodynamic forces files 142759599516SKenneth E. Jansenc 142859599516SKenneth E. Jansen if (myrank .eq. master) then 142959599516SKenneth E. Jansen! close (ihist) 143059599516SKenneth E. Jansen close (iforce) 143159599516SKenneth E. Jansen close(76) 143259599516SKenneth E. Jansen if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then 143359599516SKenneth E. Jansen close (8177) 143459599516SKenneth E. Jansen endif 143559599516SKenneth E. Jansen endif 143659599516SKenneth E. Jansenc 143759599516SKenneth E. Jansenc.... close varts file for probes 143859599516SKenneth E. Jansenc 143959599516SKenneth E. Jansen if(exts) then 144059599516SKenneth E. Jansen do jj=1,ntspts 144159599516SKenneth E. Jansen if (myrank == iv_rank(jj)) then 144259599516SKenneth E. Jansen close(1000+jj) 144359599516SKenneth E. Jansen endif 144459599516SKenneth E. Jansen enddo 144559599516SKenneth E. Jansen deallocate (ivarts) 144659599516SKenneth E. Jansen deallocate (ivartsg) 144759599516SKenneth E. Jansen deallocate (iv_rank) 144859599516SKenneth E. Jansen deallocate (vartssoln) 144959599516SKenneth E. Jansen deallocate (vartssolng) 145059599516SKenneth E. Jansen endif 145159599516SKenneth E. Jansen 145259599516SKenneth E. Jansen!MR CHANGE 145359599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 145459599516SKenneth E. Jansen if(myrank.eq.0) then 145559599516SKenneth E. Jansen write(*,*) 'itrdrv - done with aerodynamic forces' 145659599516SKenneth E. Jansen endif 145759599516SKenneth E. Jansen!MR CHANGE 145859599516SKenneth E. Jansen 145959599516SKenneth E. Jansen do isrf = 0,MAXSURF 146059599516SKenneth E. Jansen! if ( nsrflist(isrf).ne.0 ) then 146159599516SKenneth E. Jansen if ( nsrflist(isrf).ne.0 .and. 146259599516SKenneth E. Jansen & myrank.eq.irankfilesforce(isrf)) then 146359599516SKenneth E. Jansen iunit=60+isrf 146459599516SKenneth E. Jansen close(iunit) 146559599516SKenneth E. Jansen endif 146659599516SKenneth E. Jansen enddo 146759599516SKenneth E. Jansen 146859599516SKenneth E. Jansen!MR CHANGE 146959599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 147059599516SKenneth E. Jansen if(myrank.eq.0) then 147159599516SKenneth E. Jansen write(*,*) 'itrdrv - done with MAXSURF' 147259599516SKenneth E. Jansen endif 147359599516SKenneth E. Jansen!MR CHANGE 147459599516SKenneth E. Jansen 147559599516SKenneth E. Jansen 147659599516SKenneth E. Jansen 5 format(1X,F15.10,3X,F15.10,3X,F15.10,3X,F15.10) 147759599516SKenneth E. Jansen 444 format(6(2x,e14.7)) 147859599516SKenneth E. Jansenc 147959599516SKenneth E. Jansenc.... end 148059599516SKenneth E. Jansenc 148159599516SKenneth E. Jansen if(nsolflow.eq.1) then 148259599516SKenneth E. Jansen deallocate (lhsK) 148359599516SKenneth E. Jansen deallocate (lhsP) 1484*ae8d68e4SKenneth E. Jansen IF (svLSFlag .NE. 1) THEN 148559599516SKenneth E. Jansen deallocate (aperm) 148659599516SKenneth E. Jansen deallocate (atemp) 1487*ae8d68e4SKenneth E. Jansen ENDIF 148859599516SKenneth E. Jansen endif 148959599516SKenneth E. Jansen if(nsclrsol.gt.0) then 149059599516SKenneth E. Jansen deallocate (lhsS) 149159599516SKenneth E. Jansen deallocate (apermS) 149259599516SKenneth E. Jansen deallocate (atempS) 149359599516SKenneth E. Jansen endif 149459599516SKenneth E. Jansen 149559599516SKenneth E. Jansen if(iabc==1) deallocate(acs) 149659599516SKenneth E. Jansen 149759599516SKenneth E. Jansen!MR CHANGE 149859599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 149959599516SKenneth E. Jansen if(myrank.eq.0) then 150059599516SKenneth E. Jansen write(*,*) 'itrdrv - done - BACK TO process.f' 150159599516SKenneth E. Jansen endif 150259599516SKenneth E. Jansen!MR CHANGE 150359599516SKenneth E. Jansen 150459599516SKenneth E. Jansen 150559599516SKenneth E. Jansen 150659599516SKenneth E. Jansen return 150759599516SKenneth E. Jansen end 150859599516SKenneth E. Jansen 150959599516SKenneth E. Jansen subroutine lesmodels(y, ac, shgl, shp, 151059599516SKenneth E. Jansen & iper, ilwork, rowp, colm, 151159599516SKenneth E. Jansen & nsons, ifath, x, 151259599516SKenneth E. Jansen & iBC, BC) 151359599516SKenneth E. Jansen 151459599516SKenneth E. Jansen include "common.h" 151559599516SKenneth E. Jansen 151659599516SKenneth E. Jansen real*8 y(nshg,ndof), ac(nshg,ndof), 151759599516SKenneth E. Jansen & x(numnp,nsd), 151859599516SKenneth E. Jansen & BC(nshg,ndofBC) 151959599516SKenneth E. Jansen real*8 shp(MAXTOP,maxsh,MAXQPT), 152059599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT) 152159599516SKenneth E. Jansen 152259599516SKenneth E. Jansenc 152359599516SKenneth E. Jansen integer rowp(nshg,nnz), colm(nshg+1), 152459599516SKenneth E. Jansen & iBC(nshg), 152559599516SKenneth E. Jansen & ilwork(nlwork), 152659599516SKenneth E. Jansen & iper(nshg) 152759599516SKenneth E. Jansen dimension ifath(numnp), nsons(nfath) 152859599516SKenneth E. Jansen 152959599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: fwr2,fwr3,fwr4 153059599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: stabdis,cdelsq1 153159599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: xavegt, xavegt2,xavegt3 153259599516SKenneth E. Jansen 153359599516SKenneth E. Jansen if( (iLES.gt.1) ) then ! Allocate Stuff for advanced LES models 153459599516SKenneth E. Jansen allocate (fwr2(nshg)) 153559599516SKenneth E. Jansen allocate (fwr3(nshg)) 153659599516SKenneth E. Jansen allocate (fwr4(nshg)) 153759599516SKenneth E. Jansen allocate (xavegt(nfath,12)) 153859599516SKenneth E. Jansen allocate (xavegt2(nfath,12)) 153959599516SKenneth E. Jansen allocate (xavegt3(nfath,12)) 154059599516SKenneth E. Jansen allocate (stabdis(nfath)) 154159599516SKenneth E. Jansen endif 154259599516SKenneth E. Jansen 154359599516SKenneth E. Jansenc.... get dynamic model coefficient 154459599516SKenneth E. Jansenc 154559599516SKenneth E. Jansen ilesmod=iLES/10 154659599516SKenneth E. Jansenc 154759599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model 154859599516SKenneth E. Jansenc 154959599516SKenneth E. Jansen if (ilesmod.eq.0) then ! 0 < iLES< 10 => dyn. model calculated 155059599516SKenneth E. Jansen ! at nodes based on discrete filtering 155159599516SKenneth E. Jansen 155259599516SKenneth E. Jansen 155359599516SKenneth E. Jansen if(isubmod.eq.2) then 155459599516SKenneth E. Jansen call SUPGdis(y, ac, shgl, shp, 155559599516SKenneth E. Jansen & iper, ilwork, 155659599516SKenneth E. Jansen & nsons, ifath, x, 155759599516SKenneth E. Jansen & iBC, BC, stabdis, xavegt3) 155859599516SKenneth E. Jansen endif 155959599516SKenneth E. Jansen 156059599516SKenneth E. Jansen if( ((isubmod.eq.0).or.(isubmod.eq.2)))then ! If no 156159599516SKenneth E. Jansen ! sub-model 156259599516SKenneth E. Jansen ! or SUPG 156359599516SKenneth E. Jansen ! model wanted 156459599516SKenneth E. Jansen 156559599516SKenneth E. Jansen if(i2filt.eq.0)then ! If simple filter 156659599516SKenneth E. Jansen 156759599516SKenneth E. Jansen if(modlstats .eq. 0) then ! If no model stats wanted 156859599516SKenneth E. Jansen call getdmc (y, shgl, shp, 156959599516SKenneth E. Jansen & iper, ilwork, nsons, 157059599516SKenneth E. Jansen & ifath, x) 157159599516SKenneth E. Jansen else ! else get model stats 157259599516SKenneth E. Jansen call stdfdmc (y, shgl, shp, 157359599516SKenneth E. Jansen & iper, ilwork, nsons, 157459599516SKenneth E. Jansen & ifath, x) 157559599516SKenneth E. Jansen endif ! end of stats if statement 157659599516SKenneth E. Jansen 157759599516SKenneth E. Jansen else ! else if twice filtering 157859599516SKenneth E. Jansen 157959599516SKenneth E. Jansen call widefdmc(y, shgl, shp, 158059599516SKenneth E. Jansen & iper, ilwork, nsons, 158159599516SKenneth E. Jansen & ifath, x) 158259599516SKenneth E. Jansen 158359599516SKenneth E. Jansen 158459599516SKenneth E. Jansen endif ! end of simple filter if statement 158559599516SKenneth E. Jansen 158659599516SKenneth E. Jansen endif ! end of SUPG or no sub-model if statement 158759599516SKenneth E. Jansen 158859599516SKenneth E. Jansen 158959599516SKenneth E. Jansen if( (isubmod.eq.1) ) then ! If DFWR sub-model wanted 159059599516SKenneth E. Jansen call cdelBHsq (y, shgl, shp, 159159599516SKenneth E. Jansen & iper, ilwork, nsons, 159259599516SKenneth E. Jansen & ifath, x, cdelsq1) 159359599516SKenneth E. Jansen call FiltRat (y, shgl, shp, 159459599516SKenneth E. Jansen & iper, ilwork, nsons, 159559599516SKenneth E. Jansen & ifath, x, cdelsq1, 159659599516SKenneth E. Jansen & fwr4, fwr3) 159759599516SKenneth E. Jansen 159859599516SKenneth E. Jansen 159959599516SKenneth E. Jansen if (i2filt.eq.0) then ! If simple filter wanted 160059599516SKenneth E. Jansen call DFWRsfdmc(y, shgl, shp, 160159599516SKenneth E. Jansen & iper, ilwork, nsons, 160259599516SKenneth E. Jansen & ifath, x, fwr2, fwr3) 160359599516SKenneth E. Jansen else ! else if twice filtering wanted 160459599516SKenneth E. Jansen call DFWRwfdmc(y, shgl, shp, 160559599516SKenneth E. Jansen & iper, ilwork, nsons, 160659599516SKenneth E. Jansen & ifath, x, fwr4, fwr4) 160759599516SKenneth E. Jansen endif ! end of simple filter if statement 160859599516SKenneth E. Jansen 160959599516SKenneth E. Jansen endif ! end of DFWR sub-model if statement 161059599516SKenneth E. Jansen 161159599516SKenneth E. Jansen if( (isubmod.eq.2) )then ! If SUPG sub-model wanted 161259599516SKenneth E. Jansen call dmcSUPG (y, ac, shgl, 161359599516SKenneth E. Jansen & shp, iper, ilwork, 161459599516SKenneth E. Jansen & nsons, ifath, x, 161559599516SKenneth E. Jansen & iBC, BC, rowp, colm, 161659599516SKenneth E. Jansen & xavegt2, stabdis) 161759599516SKenneth E. Jansen endif 161859599516SKenneth E. Jansen 161959599516SKenneth E. Jansen if(idis.eq.1)then ! If SUPG/Model dissipation wanted 162059599516SKenneth E. Jansen call ediss (y, ac, shgl, 162159599516SKenneth E. Jansen & shp, iper, ilwork, 162259599516SKenneth E. Jansen & nsons, ifath, x, 162359599516SKenneth E. Jansen & iBC, BC, xavegt) 162459599516SKenneth E. Jansen endif 162559599516SKenneth E. Jansen 162659599516SKenneth E. Jansen endif ! end of ilesmod 162759599516SKenneth E. Jansen 162859599516SKenneth E. Jansen if (ilesmod .eq. 1) then ! 10 < iLES < 20 => dynamic-mixed 162959599516SKenneth E. Jansen ! at nodes based on discrete filtering 163059599516SKenneth E. Jansen call bardmc (y, shgl, shp, 163159599516SKenneth E. Jansen & iper, ilwork, 163259599516SKenneth E. Jansen & nsons, ifath, x) 163359599516SKenneth E. Jansen endif 163459599516SKenneth E. Jansen 163559599516SKenneth E. Jansen if (ilesmod .eq. 2) then ! 20 < iLES < 30 => dynamic at quad 163659599516SKenneth E. Jansen ! pts based on lumped projection filt. 163759599516SKenneth E. Jansen 163859599516SKenneth E. Jansen if(isubmod.eq.0)then 163959599516SKenneth E. Jansen call projdmc (y, shgl, shp, 164059599516SKenneth E. Jansen & iper, ilwork, x) 164159599516SKenneth E. Jansen else 164259599516SKenneth E. Jansen call cpjdmcnoi (y, shgl, shp, 164359599516SKenneth E. Jansen & iper, ilwork, x, 164459599516SKenneth E. Jansen & rowp, colm, 164559599516SKenneth E. Jansen & iBC, BC) 164659599516SKenneth E. Jansen endif 164759599516SKenneth E. Jansen 164859599516SKenneth E. Jansen endif 164959599516SKenneth E. Jansen 165059599516SKenneth E. Jansen if( (iLES.gt.1) ) then ! Deallocate Stuff for advanced LES models 165159599516SKenneth E. Jansen deallocate (fwr2) 165259599516SKenneth E. Jansen deallocate (fwr3) 165359599516SKenneth E. Jansen deallocate (fwr4) 165459599516SKenneth E. Jansen deallocate (xavegt) 165559599516SKenneth E. Jansen deallocate (xavegt2) 165659599516SKenneth E. Jansen deallocate (xavegt3) 165759599516SKenneth E. Jansen deallocate (stabdis) 165859599516SKenneth E. Jansen endif 165959599516SKenneth E. Jansen return 166059599516SKenneth E. Jansen end 166159599516SKenneth E. Jansen 166259599516SKenneth E. Jansenc 166359599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution 166459599516SKenneth E. Jansenc 166559599516SKenneth E. Jansen subroutine CalcImpConvCoef (numISrfs, numTpoints) 166659599516SKenneth E. Jansen 166759599516SKenneth E. Jansen use convolImpFlow !uses flow history and impedance for convolution 166859599516SKenneth E. Jansen 166959599516SKenneth E. Jansen include "common.h" !for alfi 167059599516SKenneth E. Jansen 167159599516SKenneth E. Jansen integer numISrfs, numTpoints 167259599516SKenneth E. Jansen 167359599516SKenneth E. Jansen allocate (ConvCoef(numTpoints+2,3)) !same time discret. for all imp. BC 167459599516SKenneth E. Jansen do j=1,numTpoints+2 167559599516SKenneth E. Jansen ConvCoef(j,:)=0.5/numTpoints !dt/2 divided by period T=N*dt 167659599516SKenneth E. Jansen ConvCoef(j,1)=ConvCoef(j,1)*(1.0-alfi)*(1.0-alfi) 167759599516SKenneth E. Jansen ConvCoef(j,2)=ConvCoef(j,2)*(1.0+2*alfi*(1.0-alfi)) 167859599516SKenneth E. Jansen ConvCoef(j,3)=ConvCoef(j,3)*alfi*alfi 167959599516SKenneth E. Jansen enddo 168059599516SKenneth E. Jansen ConvCoef(1,2)=zero 168159599516SKenneth E. Jansen ConvCoef(1,3)=zero 168259599516SKenneth E. Jansen ConvCoef(2,3)=zero 168359599516SKenneth E. Jansen ConvCoef(numTpoints+1,1)=zero 168459599516SKenneth E. Jansen ConvCoef(numTpoints+2,2)=zero 168559599516SKenneth E. Jansen ConvCoef(numTpoints+2,1)=zero 168659599516SKenneth E. Jansenc 168759599516SKenneth E. Jansenc...calculate the coefficients for the impedance convolution 168859599516SKenneth E. Jansenc 168959599516SKenneth E. Jansen allocate (ImpConvCoef(numTpoints+2,numISrfs)) 169059599516SKenneth E. Jansen 169159599516SKenneth E. Jansenc..coefficients below assume Q linear in time step, Z constant 169259599516SKenneth E. Jansenc do j=3,numTpoints 169359599516SKenneth E. Jansenc ImpConvCoef(j,:) = ValueListImp(j-1,:)*ConvCoef(j,3) 169459599516SKenneth E. Jansenc & + ValueListImp(j,:)*ConvCoef(j,2) 169559599516SKenneth E. Jansenc & + ValueListImp(j+1,:)*ConvCoef(j,1) 169659599516SKenneth E. Jansenc enddo 169759599516SKenneth E. Jansenc ImpConvCoef(1,:) = ValueListImp(2,:)*ConvCoef(1,1) 169859599516SKenneth E. Jansenc ImpConvCoef(2,:) = ValueListImp(2,:)*ConvCoef(2,2) 169959599516SKenneth E. Jansenc & + ValueListImp(3,:)*ConvCoef(2,1) 170059599516SKenneth E. Jansenc ImpConvCoef(numTpoints+1,:) = 170159599516SKenneth E. Jansenc & ValueListImp(numTpoints,:)*ConvCoef(numTpoints+1,3) 170259599516SKenneth E. Jansenc & + ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+1,2) 170359599516SKenneth E. Jansenc ImpConvCoef(numTpoints+2,:) = 170459599516SKenneth E. Jansenc & ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+2,3) 170559599516SKenneth E. Jansen 170659599516SKenneth E. Jansenc..try easiest convolution Q and Z constant per time step 170759599516SKenneth E. Jansen do j=3,numTpoints+1 170859599516SKenneth E. Jansen ImpConvCoef(j,:) = ValueListImp(j-1,:)/numTpoints 170959599516SKenneth E. Jansen enddo 171059599516SKenneth E. Jansen ImpConvCoef(1,:) =zero 171159599516SKenneth E. Jansen ImpConvCoef(2,:) =zero 171259599516SKenneth E. Jansen ImpConvCoef(numTpoints+2,:) = 171359599516SKenneth E. Jansen & ValueListImp(numTpoints+1,:)/numTpoints 171459599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr() 171559599516SKenneth E. Jansen ImpConvCoef(numTpoints+1,:)= ImpConvCoef(numTpoints+1,:) 171659599516SKenneth E. Jansen & - ImpConvCoef(numTpoints+2,:)*(1.0-alfi)/alfi 171759599516SKenneth E. Jansen ImpConvCoef(numTpoints+2,:)= ImpConvCoef(numTpoints+2,:)/alfi 171859599516SKenneth E. Jansen return 171959599516SKenneth E. Jansen end 172059599516SKenneth E. Jansen 172159599516SKenneth E. Jansenc 172259599516SKenneth E. Jansenc ... update the flow rate history for the impedance convolution, filter it and write it out 172359599516SKenneth E. Jansenc 172459599516SKenneth E. Jansen subroutine UpdHistConv(y,nsrfIdList,numSrfs) 172559599516SKenneth E. Jansen 172659599516SKenneth E. Jansen use convolImpFlow !brings ntimeptpT, QHistImp, QHistTry, QHistTryF, numImpSrfs 172759599516SKenneth E. Jansen use convolRCRFlow !brings QHistRCR, numRCRSrfs 172859599516SKenneth E. Jansen 172959599516SKenneth E. Jansen include "common.h" 173059599516SKenneth E. Jansen 173159599516SKenneth E. Jansen integer nsrfIdList(0:MAXSURF), numSrfs 173259599516SKenneth E. Jansen character*20 fname1 173359599516SKenneth E. Jansen character*10 cname2 173459599516SKenneth E. Jansen character*5 cname 173559599516SKenneth E. Jansen real*8 y(nshg,3) !velocity at time n+1 173659599516SKenneth E. Jansen real*8 NewQ(0:MAXSURF) !temporary unknown for the flow rate 173759599516SKenneth E. Jansen !that needs to be added to the flow history 173859599516SKenneth E. Jansen 173959599516SKenneth E. Jansen call GetFlowQ(NewQ,y,nsrfIdList,numSrfs) !new flow at time n+1 174059599516SKenneth E. Jansenc 174159599516SKenneth E. Jansenc... for imp BC: shift QHist, add new constribution, filter and write out 174259599516SKenneth E. Jansenc 174359599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 174459599516SKenneth E. Jansen do j=1, ntimeptpT 174559599516SKenneth E. Jansen QHistImp(j,1:numSrfs)=QHistImp(j+1,1:numSrfs) 174659599516SKenneth E. Jansen enddo 174759599516SKenneth E. Jansen QHistImp(ntimeptpT+1,1:numSrfs) = NewQ(1:numSrfs) 174859599516SKenneth E. Jansen 174959599516SKenneth E. Jansenc 175059599516SKenneth E. Jansenc....filter the flow rate history 175159599516SKenneth E. Jansenc 175259599516SKenneth E. Jansen cutfreq = 10 !hardcoded cutting frequency of the filter 175359599516SKenneth E. Jansen do j=1, ntimeptpT 175459599516SKenneth E. Jansen QHistTry(j,:)=QHistImp(j+1,:) 175559599516SKenneth E. Jansen enddo 175659599516SKenneth E. Jansen call Filter(QHistTryF,QHistTry,ntimeptpT,Delt(1),cutfreq) 175759599516SKenneth E. Jansenc.... if no filter applied then uncomment next three lines 175859599516SKenneth E. Jansenc do j=1, ntimeptpT 175959599516SKenneth E. Jansenc QHistTryF(j,:)=QHistTry(j,:) 176059599516SKenneth E. Jansenc enddo 176159599516SKenneth E. Jansen 176259599516SKenneth E. Jansenc QHistImp(1,:)=zero ! why do we do this? for beta(1,:) = zero it does not really matters 176359599516SKenneth E. Jansen do j=1, ntimeptpT 176459599516SKenneth E. Jansen QHistImp(j+1,:)=QHistTryF(j,:) 176559599516SKenneth E. Jansen enddo 176659599516SKenneth E. Jansenc 176759599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat 176859599516SKenneth E. Jansenc 176959599516SKenneth E. Jansen if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or. 177059599516SKenneth E. Jansen & (istep .eq. nstep(1)))) .and. 177159599516SKenneth E. Jansen & (myrank .eq. master)) then 177259599516SKenneth E. Jansen open(unit=816, file='Qhistor.dat',status='replace') 177359599516SKenneth E. Jansen write(816,*) ntimeptpT 177459599516SKenneth E. Jansen do j=1,ntimeptpT+1 177559599516SKenneth E. Jansen write(816,*) (QHistImp(j,n),n=1, numSrfs) 177659599516SKenneth E. Jansen enddo 177759599516SKenneth E. Jansen close(816) 177859599516SKenneth E. Jansenc... write out a copy with step number to be able to restart 177959599516SKenneth E. Jansen fname1 = 'Qhistor' 178059599516SKenneth E. Jansen fname1 = trim(fname1)//trim(cname2(lstep))//'.dat' 178159599516SKenneth E. Jansen open(unit=8166,file=trim(fname1),status='unknown') 178259599516SKenneth E. Jansen write(8166,*) ntimeptpT 178359599516SKenneth E. Jansen do j=1,ntimeptpT+1 178459599516SKenneth E. Jansen write(8166,*) (QHistImp(j,n),n=1, numSrfs) 178559599516SKenneth E. Jansen enddo 178659599516SKenneth E. Jansen close(8166) 178759599516SKenneth E. Jansen endif 178859599516SKenneth E. Jansen endif 178959599516SKenneth E. Jansen 179059599516SKenneth E. Jansenc 179159599516SKenneth E. Jansenc... for RCR bc just add the new contribution 179259599516SKenneth E. Jansenc 179359599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 179459599516SKenneth E. Jansen QHistRCR(lstep+1,1:numSrfs) = NewQ(1:numSrfs) 179559599516SKenneth E. Jansenc 179659599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat 179759599516SKenneth E. Jansenc 179859599516SKenneth E. Jansen if ((irs .ge. 1) .and. (myrank .eq. master)) then 179959599516SKenneth E. Jansen if(istep.eq.1) then 180059599516SKenneth E. Jansen open(unit=816,file='Qhistor.dat',status='unknown') 180159599516SKenneth E. Jansen else 180259599516SKenneth E. Jansen open(unit=816,file='Qhistor.dat',position='append') 180359599516SKenneth E. Jansen endif 180459599516SKenneth E. Jansen if(istep.eq.1) then 180559599516SKenneth E. Jansen do j=1,lstep 180659599516SKenneth E. Jansen write(816,*) j, (QHistRCR(j,n),n=1,numSrfs) ! read from file of previous run 180759599516SKenneth E. Jansen enddo 180859599516SKenneth E. Jansen endif 180959599516SKenneth E. Jansen write(816,*) lstep+1, (QHistRCR(lstep+1,n),n=1, numSrfs) 181059599516SKenneth E. Jansen close(816) 181159599516SKenneth E. Jansenc... write out a copy with step number to be able to restart 181259599516SKenneth E. Jansen if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or. 181359599516SKenneth E. Jansen & (istep .eq. nstep(1)))) .and. 181459599516SKenneth E. Jansen & (myrank .eq. master)) then 181559599516SKenneth E. Jansen fname1 = 'Qhistor' 181659599516SKenneth E. Jansen fname1 = trim(fname1)//trim(cname2(lstep))//'.dat' 181759599516SKenneth E. Jansen open(unit=8166,file=trim(fname1),status='unknown') 181859599516SKenneth E. Jansen write(8166,*) lstep+1 181959599516SKenneth E. Jansen do j=1,lstep+1 182059599516SKenneth E. Jansen write(8166,*) (QHistRCR(j,n),n=1, numSrfs) 182159599516SKenneth E. Jansen enddo 182259599516SKenneth E. Jansen close(8166) 182359599516SKenneth E. Jansen endif 182459599516SKenneth E. Jansen endif 182559599516SKenneth E. Jansen endif 182659599516SKenneth E. Jansen 182759599516SKenneth E. Jansen return 182859599516SKenneth E. Jansen end 182959599516SKenneth E. Jansen 183059599516SKenneth E. Jansenc 183159599516SKenneth E. Jansenc...calculate the time varying coefficients for the RCR convolution 183259599516SKenneth E. Jansenc 183359599516SKenneth E. Jansen subroutine CalcRCRConvCoef (stepn, numSrfs) 183459599516SKenneth E. Jansen 183559599516SKenneth E. Jansen use convolRCRFlow !brings in ValueListRCR, dtRCR 183659599516SKenneth E. Jansen 183759599516SKenneth E. Jansen include "common.h" !brings alfi 183859599516SKenneth E. Jansen 183959599516SKenneth E. Jansen integer numSrfs, stepn 184059599516SKenneth E. Jansen 184159599516SKenneth E. Jansen RCRConvCoef = zero 184259599516SKenneth E. Jansen if (stepn .eq. 0) then 184359599516SKenneth E. Jansen RCRConvCoef(1,:) = ValueListRCR(1,:)*(1.0-alfi) + 184459599516SKenneth E. Jansen & ValueListRCR(3,:)*(-alfi + 1.0 + 1/dtRCR(:) 184559599516SKenneth E. Jansen & - exp(-alfi*dtRCR(:))*(1 + 1/dtRCR(:))) 184659599516SKenneth E. Jansen RCRConvCoef(2,:) = ValueListRCR(1,:)*alfi 184759599516SKenneth E. Jansen & + ValueListRCR(3,:) 184859599516SKenneth E. Jansen & *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:)) 184959599516SKenneth E. Jansen endif 185059599516SKenneth E. Jansen if (stepn .ge. 1) then 185159599516SKenneth E. Jansen RCRConvCoef(1,:) =-ValueListRCR(3,:)*exp(-dtRCR(:)*(stepn+alfi)) 185259599516SKenneth E. Jansen & *(1 + (1 - exp(dtRCR(:)))/dtRCR(:)) 185359599516SKenneth E. Jansen RCRConvCoef(stepn+1,:) = ValueListRCR(1,:)*(1-alfi) 185459599516SKenneth E. Jansen & - ValueListRCR(3,:)*(alfi - 1 - 1/dtRCR(:) 185559599516SKenneth E. Jansen & + exp(-alfi*dtRCR(:))/dtRCR(:)*(2 - exp(-dtRCR(:)))) 185659599516SKenneth E. Jansen RCRConvCoef(stepn+2,:) = ValueListRCR(1,:)*alfi 185759599516SKenneth E. Jansen & + ValueListRCR(3,:) 185859599516SKenneth E. Jansen & *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:)) 185959599516SKenneth E. Jansen endif 186059599516SKenneth E. Jansen if (stepn .ge. 2) then 186159599516SKenneth E. Jansen do j=2,stepn 186259599516SKenneth E. Jansen RCRConvCoef(j,:) = ValueListRCR(3,:)/dtRCR(:)* 186359599516SKenneth E. Jansen & exp(-dtRCR(:)*(stepn + alfi + 2 - j))* 186459599516SKenneth E. Jansen & (1 - exp(dtRCR(:)))**2 186559599516SKenneth E. Jansen enddo 186659599516SKenneth E. Jansen endif 186759599516SKenneth E. Jansen 186859599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr() 186959599516SKenneth E. Jansen RCRConvCoef(stepn+1,:)= RCRConvCoef(stepn+1,:) 187059599516SKenneth E. Jansen & - RCRConvCoef(stepn+2,:)*(1.0-alfi)/alfi 187159599516SKenneth E. Jansen RCRConvCoef(stepn+2,:)= RCRConvCoef(stepn+2,:)/alfi 187259599516SKenneth E. Jansen 187359599516SKenneth E. Jansen return 187459599516SKenneth E. Jansen end 187559599516SKenneth E. Jansen 187659599516SKenneth E. Jansenc 187759599516SKenneth E. Jansenc...calculate the time dependent H operator for the RCR convolution 187859599516SKenneth E. Jansenc 187959599516SKenneth E. Jansen subroutine CalcHopRCR (timestepRCR, stepn, numSrfs) 188059599516SKenneth E. Jansen 188159599516SKenneth E. Jansen use convolRCRFlow !brings in HopRCR, dtRCR 188259599516SKenneth E. Jansen 188359599516SKenneth E. Jansen include "common.h" 188459599516SKenneth E. Jansen 188559599516SKenneth E. Jansen integer numSrfs, stepn 188659599516SKenneth E. Jansen real*8 PdistCur(0:MAXSURF), timestepRCR 188759599516SKenneth E. Jansen 188859599516SKenneth E. Jansen HopRCR=zero 188959599516SKenneth E. Jansen call RCRint(timestepRCR*(stepn + alfi),PdistCur) 189059599516SKenneth E. Jansen HopRCR(1:numSrfs) = RCRic(1:numSrfs) 189159599516SKenneth E. Jansen & *exp(-dtRCR(1:numSrfs)*(stepn + alfi)) + PdistCur(1:numSrfs) 189259599516SKenneth E. Jansen return 189359599516SKenneth E. Jansen end 189459599516SKenneth E. Jansenc 189559599516SKenneth E. Jansenc ... initialize the influence of the initial conditions for the RCR BC 189659599516SKenneth E. Jansenc 189759599516SKenneth E. Jansen subroutine calcRCRic(y,srfIdList,numSrfs) 189859599516SKenneth E. Jansen 189959599516SKenneth E. Jansen use convolRCRFlow !brings RCRic, ValueListRCR, ValuePdist 190059599516SKenneth E. Jansen 190159599516SKenneth E. Jansen include "common.h" 190259599516SKenneth E. Jansen 190359599516SKenneth E. Jansen integer srfIdList(0:MAXSURF), numSrfs, irankCoupled 190459599516SKenneth E. Jansen real*8 y(nshg,4) !need velocity and pressure 190559599516SKenneth E. Jansen real*8 Qini(0:MAXSURF) !initial flow rate 190659599516SKenneth E. Jansen real*8 PdistIni(0:MAXSURF) !initial distal pressure 190759599516SKenneth E. Jansen real*8 Pini(0:MAXSURF),CoupleArea(0:MAXSURF) ! initial pressure 190859599516SKenneth E. Jansen real*8 VelOnly(nshg,3), POnly(nshg) 190959599516SKenneth E. Jansen 191059599516SKenneth E. Jansen allocate (RCRic(0:MAXSURF)) 191159599516SKenneth E. Jansen 191259599516SKenneth E. Jansen if(lstep.eq.0) then 191359599516SKenneth E. Jansen VelOnly(:,1:3)=y(:,1:3) 191459599516SKenneth E. Jansen call GetFlowQ(Qini,VelOnly,srfIdList,numSrfs) !get initial flow 191559599516SKenneth E. Jansen QHistRCR(1,1:numSrfs)=Qini(1:numSrfs) !initialize QHistRCR 191659599516SKenneth E. Jansen POnly(:)=y(:,4) ! pressure 191759599516SKenneth E. Jansen call integrScalar(Pini,POnly,srfIdList,numSrfs) !get initial pressure integral 191859599516SKenneth E. Jansen POnly(:)=one ! one to get area 191959599516SKenneth E. Jansen call integrScalar(CoupleArea,POnly,srfIdList,numSrfs) !get surf area 192059599516SKenneth E. Jansen Pini(1:numSrfs) = Pini(1:numSrfs)/CoupleArea(1:numSrfs) 192159599516SKenneth E. Jansen else 192259599516SKenneth E. Jansen Qini(1:numSrfs)=QHistRCR(1,1:numSrfs) 192359599516SKenneth E. Jansen Pini(1:numSrfs)=zero ! hack 192459599516SKenneth E. Jansen endif 192559599516SKenneth E. Jansen call RCRint(istep,PdistIni) !get initial distal P (use istep) 192659599516SKenneth E. Jansen RCRic(1:numSrfs) = Pini(1:numSrfs) 192759599516SKenneth E. Jansen & - ValueListRCR(1,:)*Qini(1:numSrfs)-PdistIni(1:numSrfs) 192859599516SKenneth E. Jansen return 192959599516SKenneth E. Jansen end 193059599516SKenneth E. Jansen 193159599516SKenneth E. Jansenc.........function that integrates a scalar over a boundary 193259599516SKenneth E. Jansen subroutine integrScalar(scalInt,scal,srfIdList,numSrfs) 193359599516SKenneth E. Jansen 193459599516SKenneth E. Jansen use pvsQbi !brings ndsurf, NASC 193559599516SKenneth E. Jansen 193659599516SKenneth E. Jansen include "common.h" 193759599516SKenneth E. Jansen include "mpif.h" 193859599516SKenneth E. Jansen 193959599516SKenneth E. Jansen integer srfIdList(0:MAXSURF), numSrfs, irankCoupled, i, k 194059599516SKenneth E. Jansen real*8 scal(nshg), scalInt(0:MAXSURF), scalIntProc(0:MAXSURF) 194159599516SKenneth E. Jansen 194259599516SKenneth E. Jansen scalIntProc = zero 194359599516SKenneth E. Jansen do i = 1,nshg 194459599516SKenneth E. Jansen if(numSrfs.gt.zero) then 194559599516SKenneth E. Jansen do k = 1,numSrfs 194659599516SKenneth E. Jansen irankCoupled = 0 194759599516SKenneth E. Jansen if (srfIdList(k).eq.ndsurf(i)) then 194859599516SKenneth E. Jansen irankCoupled=k 194959599516SKenneth E. Jansen scalIntProc(irankCoupled) = scalIntProc(irankCoupled) 195059599516SKenneth E. Jansen & + NASC(i)*scal(i) 195159599516SKenneth E. Jansen exit 195259599516SKenneth E. Jansen endif 195359599516SKenneth E. Jansen enddo 195459599516SKenneth E. Jansen endif 195559599516SKenneth E. Jansen enddo 195659599516SKenneth E. Jansenc 195759599516SKenneth E. Jansenc at this point, each scalint has its "nodes" contributions to the scalar 195859599516SKenneth E. Jansenc accumulated into scalIntProc. Note, because NASC is on processor this 195959599516SKenneth E. Jansenc will NOT be the scalar for the surface yet 196059599516SKenneth E. Jansenc 196159599516SKenneth E. Jansenc.... reduce integrated scalar for each surface, push on scalInt 196259599516SKenneth E. Jansenc 196359599516SKenneth E. Jansen npars=MAXSURF+1 196459599516SKenneth E. Jansen call MPI_ALLREDUCE (scalIntProc, scalInt(:), npars, 196559599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 196659599516SKenneth E. Jansen 196759599516SKenneth E. Jansen return 196859599516SKenneth E. Jansen end 196959599516SKenneth E. Jansen 19709071d3baSCameron Smith subroutine writeTimingMessage(key,iomode,timing) 19719071d3baSCameron Smith use iso_c_binding 19729071d3baSCameron Smith use phstr 19739071d3baSCameron Smith implicit none 197459599516SKenneth E. Jansen 19759071d3baSCameron Smith character(len=*) :: key 19769071d3baSCameron Smith integer :: iomode 19779071d3baSCameron Smith real*8 :: timing 1978da7d5714SCameron Smith character(len=1024) :: timing_msg 197989625e43SCameron Smith character(len=*), parameter :: 198089625e43SCameron Smith & streamModeString = c_char_"stream"//c_null_char, 198189625e43SCameron Smith & fileModeString = c_char_"disk"//c_null_char 198259599516SKenneth E. Jansen 1983da7d5714SCameron Smith timing_msg = c_char_"Time to write "//c_null_char 19849071d3baSCameron Smith call phstr_appendStr(timing_msg,key) 19859071d3baSCameron Smith if ( iomode .eq. -1 ) then 19869071d3baSCameron Smith call phstr_appendStr(timing_msg, streamModeString) 19879071d3baSCameron Smith else 19889071d3baSCameron Smith call phstr_appendStr(timing_msg, fileModeString) 19899071d3baSCameron Smith endif 19909071d3baSCameron Smith call phstr_appendStr(timing_msg, c_char_' = '//c_null_char) 19919071d3baSCameron Smith call phstr_appendDbl(timing_msg, timing) 1992da7d5714SCameron Smith write(6,*) trim(timing_msg) 19939071d3baSCameron Smith return 19949071d3baSCameron Smith end subroutine 199559599516SKenneth E. Jansen 1996