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