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 37*ec121c45SKenneth E. Jansen use fncorpmod 389071d3baSCameron Smith use iso_c_binding 3959599516SKenneth E. Jansen 4059599516SKenneth E. Jansenc use readarrays !reads in uold and acold 4159599516SKenneth E. Jansen 4259599516SKenneth E. Jansen include "common.h" 4359599516SKenneth E. Jansen include "mpif.h" 4459599516SKenneth E. Jansen include "auxmpi.h" 45ae8d68e4SKenneth E. Jansen include "svLS.h" 4659599516SKenneth E. Jansenc 4759599516SKenneth E. Jansen 4859599516SKenneth E. Jansen 4959599516SKenneth E. Jansen real*8 y(nshg,ndof), ac(nshg,ndof), 5059599516SKenneth E. Jansen & yold(nshg,ndof), acold(nshg,ndof), 5159599516SKenneth E. Jansen & u(nshg,nsd), uold(nshg,nsd), 5259599516SKenneth E. Jansen & x(numnp,nsd), solinc(nshg,ndof), 5359599516SKenneth E. Jansen & BC(nshg,ndofBC), tf(nshg,ndof), 5459599516SKenneth E. Jansen & GradV(nshg,nsdsq) 5559599516SKenneth E. Jansen 5659599516SKenneth E. Jansenc 5759599516SKenneth E. Jansen real*8 res(nshg,ndof) 5859599516SKenneth E. Jansenc 5959599516SKenneth E. Jansen real*8 shp(MAXTOP,maxsh,MAXQPT), 6059599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 6159599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 6259599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 6359599516SKenneth E. Jansenc 6459599516SKenneth E. Jansen integer rowp(nshg,nnz), colm(nshg+1), 6559599516SKenneth E. Jansen & iBC(nshg), 6659599516SKenneth E. Jansen & ilwork(nlwork), 6759599516SKenneth E. Jansen & iper(nshg), ifuncs(6) 6859599516SKenneth E. Jansen 6959599516SKenneth E. Jansen real*8 vbc_prof(nshg,3) 7059599516SKenneth E. Jansen 7159599516SKenneth E. Jansen integer stopjob 7259599516SKenneth E. Jansen character*10 cname2 7359599516SKenneth E. Jansen character*5 cname 7459599516SKenneth E. Jansenc 7559599516SKenneth E. Jansenc stuff for dynamic model s.w.avg and wall model 7659599516SKenneth E. Jansenc 7759599516SKenneth E. Jansen dimension ifath(numnp), velbar(nfath,ndof), nsons(nfath) 7859599516SKenneth E. Jansen 7959599516SKenneth E. Jansen dimension wallubar(2),walltot(2) 8059599516SKenneth E. Jansenc 81ae8d68e4SKenneth E. Jansenc.... For linear solver Library 8259599516SKenneth E. Jansenc 8359599516SKenneth E. Jansen integer eqnType, prjFlag, presPrjFlag, verbose 8459599516SKenneth E. Jansenc 8559599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: aperm, atemp, atempS 8659599516SKenneth E. Jansen real*8, allocatable, dimension(:,:,:) :: apermS 8759599516SKenneth E. Jansen 8859599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: lhsP, lhsK, lhsS 8959599516SKenneth E. Jansen real*8 almit, alfit, gamit 9059599516SKenneth E. Jansenc 9159599516SKenneth E. Jansen character*1024 servername 9259599516SKenneth E. Jansen character*20 fname1,fmt1 9359599516SKenneth E. Jansen character*20 fname2,fmt2 9459599516SKenneth E. Jansen character*60 fnamepold, fvarts 9559599516SKenneth E. Jansen character*4 fname4c ! 4 characters 9659599516SKenneth E. Jansen integer iarray(50) ! integers for headers 9759599516SKenneth E. Jansen integer isgn(ndof), isgng(ndof) 9859599516SKenneth E. Jansen 9959599516SKenneth E. Jansen!MR CHANGE 10059599516SKenneth E. Jansen! real*8 rerr(nshg,10), ybar(nshg,13) ! including 7 sq. terms with 3 cross terms of uv, uw and vw 10159599516SKenneth E. Jansen! real*8 rerr(nshg,10), ybar(nshg,12) ! including 7 sq. terms with 3 cross terms of uv, uw and vw 10259599516SKenneth E. Jansen real*8 rerr(nshg,10) 10359599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: ybar, strain, vorticity 10459599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: wallssVec, wallssVecbar 10559599516SKenneth E. Jansen!MR CHANGE 10659599516SKenneth E. Jansen 10759599516SKenneth E. Jansen real*8 tcorecp(2), tcorecpscal(2) 10859599516SKenneth E. Jansen 10959599516SKenneth E. Jansen integer, allocatable, dimension(:) :: ivarts 11059599516SKenneth E. Jansen integer, allocatable, dimension(:) :: ivartsg 11159599516SKenneth E. Jansen integer, allocatable, dimension(:) :: iv_rank 11259599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: vartssoln 11359599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: vartssolng 11459599516SKenneth E. Jansen real*8, allocatable, dimension(:,:,:) :: yphbar 11559599516SKenneth E. Jansen real*8 CFLworst(numel) 11659599516SKenneth E. Jansen 11759599516SKenneth E. Jansen!MR CHANGE 11859599516SKenneth E. Jansen integer :: iv_rankpernode, iv_totnodes, iv_totcores 11959599516SKenneth E. Jansen integer :: iv_node, iv_core, iv_thread 12059599516SKenneth E. Jansen!MR CHANGE 121ae8d68e4SKenneth E. Jansen!-------------------------------------------------------------------- 122ae8d68e4SKenneth E. Jansen! Setting up svLS 123ae8d68e4SKenneth E. Jansen INTEGER svLS_nFaces, gnNo, nNo, faIn, facenNo 124*ec121c45SKenneth E. Jansen INTEGER, ALLOCATABLE :: gNodes(:) 125ae8d68e4SKenneth E. Jansen REAL*8, ALLOCATABLE :: sV(:,:) 126ae8d68e4SKenneth E. Jansen 127ae8d68e4SKenneth E. Jansen TYPE(svLS_commuType) communicator 128ae8d68e4SKenneth E. Jansen TYPE(svLS_lhsType) svLS_lhs 129ae8d68e4SKenneth E. Jansen TYPE(svLS_lsType) svLS_ls 130*ec121c45SKenneth E. Jansen! repeat for scalar solves (up to 4 at this time which is consistent with rest of PHASTA) 131daa97cf2SKenneth E. Jansen TYPE(svLS_commuType) communicator_S(4) 132daa97cf2SKenneth E. Jansen TYPE(svLS_lhsType) svLS_lhs_S(4) 133daa97cf2SKenneth E. Jansen TYPE(svLS_lsType) svLS_ls_S(4) 13459599516SKenneth E. Jansen 13559599516SKenneth E. Jansen impistat = 0 13659599516SKenneth E. Jansen impistat2 = 0 13759599516SKenneth E. Jansen iISend = 0 13859599516SKenneth E. Jansen iISendScal = 0 13959599516SKenneth E. Jansen iIRecv = 0 14059599516SKenneth E. Jansen iIRecvScal = 0 14159599516SKenneth E. Jansen iWaitAll = 0 14259599516SKenneth E. Jansen iWaitAllScal = 0 14359599516SKenneth E. Jansen iAllR = 0 14459599516SKenneth E. Jansen iAllRScal = 0 14559599516SKenneth E. Jansen rISend = zero 14659599516SKenneth E. Jansen rISendScal = zero 14759599516SKenneth E. Jansen rIRecv = zero 14859599516SKenneth E. Jansen rIRecvScal = zero 14959599516SKenneth E. Jansen rWaitAll = zero 15059599516SKenneth E. Jansen rWaitAllScal = zero 15159599516SKenneth E. Jansen rAllR = zero 15259599516SKenneth E. Jansen rAllRScal = zero 15359599516SKenneth E. Jansen rCommu = zero 15459599516SKenneth E. Jansen rCommuScal = zero 15559599516SKenneth E. Jansen 15659599516SKenneth E. Jansen call initmemstat() 15759599516SKenneth E. Jansen 15859599516SKenneth E. Jansenc 15959599516SKenneth E. Jansenc hack SA variable 16059599516SKenneth E. Jansenc 16159599516SKenneth E. JansencHack BC(:,7)=BC(:,7)*0.001 16259599516SKenneth E. JansencHack if(lstep.eq.0) y(:,6)=y(:,6)*0.001 163ae8d68e4SKenneth E. Jansen!-------------------------------------------------------------------- 164436818eeSKenneth E. Jansen! Setting up svLS Moved down for better org 165ae8d68e4SKenneth E. Jansen 166436818eeSKenneth E. Jansen IF (svLSFlag .EQ. 0) THEN !When we get a PETSc option it also could block this or a positive leslib 16759599516SKenneth E. Jansen call SolverLicenseServer(servername) 168ae8d68e4SKenneth E. Jansen ENDIF 16959599516SKenneth E. Jansenc 17059599516SKenneth E. Jansenc only master should be verbose 17159599516SKenneth E. Jansenc 17259599516SKenneth E. Jansen 17359599516SKenneth E. Jansen if(numpe.gt.0 .and. myrank.ne.master)iverbose=0 17459599516SKenneth E. Jansenc 17559599516SKenneth E. Jansen 17659599516SKenneth E. Jansen lskeep=lstep 17759599516SKenneth E. Jansen 17859599516SKenneth E. Jansen inquire(file='xyzts.dat',exist=exts) 17959599516SKenneth E. Jansen if(exts) then 18059599516SKenneth E. Jansen 18159599516SKenneth E. Jansen open(unit=626,file='xyzts.dat',status='old') 18259599516SKenneth E. Jansen read(626,*) ntspts, freq, tolpt, iterat, varcod 18359599516SKenneth E. Jansen call sTD ! sets data structures 18459599516SKenneth E. Jansen 18559599516SKenneth E. Jansen do jj=1,ntspts ! read coordinate data where solution desired 18659599516SKenneth E. Jansen read(626,*) ptts(jj,1),ptts(jj,2),ptts(jj,3) 18759599516SKenneth E. Jansen enddo 18859599516SKenneth E. Jansen close(626) 18959599516SKenneth E. Jansen 19059599516SKenneth E. Jansen statptts(:,:) = 0 19159599516SKenneth E. Jansen parptts(:,:) = zero 19259599516SKenneth E. Jansen varts(:,:) = zero 19359599516SKenneth E. Jansen 19459599516SKenneth E. Jansen allocate (ivarts(ntspts*ndof)) 19559599516SKenneth E. Jansen allocate (ivartsg(ntspts*ndof)) 19659599516SKenneth E. Jansen allocate (iv_rank(ntspts)) 19759599516SKenneth E. Jansen allocate (vartssoln(ntspts*ndof)) 19859599516SKenneth E. Jansen allocate (vartssolng(ntspts*ndof)) 19959599516SKenneth E. Jansen 20059599516SKenneth E. Jansen iv_rankpernode = iv_rankpercore*iv_corepernode 20159599516SKenneth E. Jansen iv_totnodes = numpe/iv_rankpernode 20259599516SKenneth E. Jansen iv_totcores = iv_corepernode*iv_totnodes 20359599516SKenneth E. Jansen if (myrank .eq. 0) then 20459599516SKenneth E. Jansen write(*,*) 'Info for probes:' 20559599516SKenneth E. Jansen write(*,*) ' Ranks per core:',iv_rankpercore 20659599516SKenneth E. Jansen write(*,*) ' Cores per node:',iv_corepernode 20759599516SKenneth E. Jansen write(*,*) ' Ranks per node:',iv_rankpernode 20859599516SKenneth E. Jansen write(*,*) ' Total number of nodes:',iv_totnodes 20959599516SKenneth E. Jansen write(*,*) ' Total number of cores',iv_totcores 21059599516SKenneth E. Jansen endif 21159599516SKenneth E. Jansen 21259599516SKenneth E. Jansen! if (myrank .eq. numpe-1) then 21359599516SKenneth E. Jansen do jj=1,ntspts 21459599516SKenneth E. Jansen 21559599516SKenneth E. Jansen ! Compute the adequate rank which will take care of probe jj 21659599516SKenneth E. Jansen jjm1 = jj-1 21759599516SKenneth E. Jansen iv_node = (iv_totnodes-1)-mod(jjm1,iv_totnodes) 21859599516SKenneth E. Jansen iv_core = (iv_corepernode-1) - mod((jjm1 - 21959599516SKenneth E. Jansen & mod(jjm1,iv_totnodes))/iv_totnodes,iv_corepernode) 22059599516SKenneth E. Jansen iv_thread = (iv_rankpercore-1) - mod((jjm1- 22159599516SKenneth E. Jansen & (mod(jjm1,iv_totcores)))/iv_totcores,iv_rankpercore) 22259599516SKenneth E. Jansen iv_rank(jj) = iv_node*iv_rankpernode 22359599516SKenneth E. Jansen & + iv_core*iv_rankpercore 22459599516SKenneth E. Jansen & + iv_thread 22559599516SKenneth E. Jansen 22659599516SKenneth E. Jansen if(myrank == 0) then 22759599516SKenneth E. Jansen write(*,*) ' Probe', jj, 'handled by rank', 22859599516SKenneth E. Jansen & iv_rank(jj), ' on node', iv_node 22959599516SKenneth E. Jansen endif 23059599516SKenneth E. Jansen 23159599516SKenneth E. Jansen ! Verification just in case 23259599516SKenneth E. Jansen if(iv_rank(jj) .lt.0 .or. iv_rank(jj) .ge. numpe) then 23359599516SKenneth E. Jansen write(*,*) 'WARNING: iv_rank(',jj,') is ', iv_rank(jj), 23459599516SKenneth E. Jansen & ' and reset to numpe-1' 23559599516SKenneth E. Jansen iv_rank(jj) = numpe-1 23659599516SKenneth E. Jansen endif 23759599516SKenneth E. Jansen 23859599516SKenneth E. Jansen ! Open the varts files 23959599516SKenneth E. Jansen if(myrank == iv_rank(jj)) then 24059599516SKenneth E. Jansen fvarts='varts/varts' 24159599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(jj)) 24259599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(lstep)) 24359599516SKenneth E. Jansen fvarts=trim(fvarts)//'.dat' 24459599516SKenneth E. Jansen fvarts=trim(fvarts) 24559599516SKenneth E. Jansen open(unit=1000+jj, file=fvarts, status='unknown') 24659599516SKenneth E. Jansen endif 24759599516SKenneth E. Jansen enddo 24859599516SKenneth E. Jansen! endif 24959599516SKenneth E. Jansen 25059599516SKenneth E. Jansen endif 25159599516SKenneth E. Jansenc 25259599516SKenneth E. Jansenc.... open history and aerodynamic forces files 25359599516SKenneth E. Jansenc 25459599516SKenneth E. Jansen if (myrank .eq. master) then 255c9a96f21SKenneth E. Jansen open (unit=ihist, file=fhist, status='unknown') 25659599516SKenneth E. Jansen open (unit=iforce, file=fforce, status='unknown') 25759599516SKenneth E. Jansen open (unit=76, file="fort.76", status='unknown') 25859599516SKenneth E. Jansen if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then 25959599516SKenneth E. Jansen fnamepold = 'pold' 26059599516SKenneth E. Jansen fnamepold = trim(fnamepold)//trim(cname2(lstep)) 26159599516SKenneth E. Jansen fnamepold = trim(fnamepold)//'.dat' 26259599516SKenneth E. Jansen fnamepold = trim(fnamepold) 26359599516SKenneth E. Jansen open (unit=8177, file=fnamepold, status='unknown') 26459599516SKenneth E. Jansen endif 26559599516SKenneth E. Jansen endif 26659599516SKenneth E. Jansenc 26759599516SKenneth E. Jansenc.... initialize 26859599516SKenneth E. Jansenc 26959599516SKenneth E. Jansen ifuncs(:) = 0 ! func. evaluation counter 27059599516SKenneth E. Jansen istep = 0 27159599516SKenneth E. Jansen yold = y 27259599516SKenneth E. Jansen acold = ac 27359599516SKenneth E. Jansen 27459599516SKenneth E. Jansen rerr = zero 27559599516SKenneth E. Jansen 27659599516SKenneth E. Jansen if(ierrcalc.eq.1 .or. ioybar.eq.1) then ! we need ybar for error too 27759599516SKenneth E. Jansen if (ivort == 1) then 27859599516SKenneth E. Jansen allocate(ybar(nshg,17)) ! more space for vorticity if requested 27959599516SKenneth E. Jansen else 28059599516SKenneth E. Jansen allocate(ybar(nshg,13)) 28159599516SKenneth E. Jansen endif 28259599516SKenneth E. Jansen ybar = zero ! Initialize ybar to zero, which is essential 28359599516SKenneth E. Jansen endif 28459599516SKenneth E. Jansen 28559599516SKenneth E. Jansen if(ivort == 1) then 28659599516SKenneth E. Jansen allocate(strain(nshg,6)) 28759599516SKenneth E. Jansen allocate(vorticity(nshg,5)) 28859599516SKenneth E. Jansen endif 28959599516SKenneth E. Jansen 29059599516SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 29159599516SKenneth E. Jansen allocate(wallssVec(nshg,3)) 29259599516SKenneth E. Jansen if (ioybar .eq. 1) then 29359599516SKenneth E. Jansen allocate(wallssVecbar(nshg,3)) 29459599516SKenneth E. Jansen wallssVecbar = zero ! Initialization important if mean wss computed 29559599516SKenneth E. Jansen endif 29659599516SKenneth E. Jansen endif 29759599516SKenneth E. Jansen 29859599516SKenneth E. Jansen! both nstepsincycle and nphasesincycle needs to be set 29959599516SKenneth E. Jansen if(nstepsincycle.eq.0) nphasesincycle = 0 30059599516SKenneth E. Jansen if(nphasesincycle.ne.0) then 30159599516SKenneth E. Jansen! & allocate(yphbar(nshg,5,nphasesincycle)) 30259599516SKenneth E. Jansen if (ivort == 1) then 30359599516SKenneth E. Jansen allocate(yphbar(nshg,15,nphasesincycle)) ! more space for vorticity 30459599516SKenneth E. Jansen else 30559599516SKenneth E. Jansen allocate(yphbar(nshg,11,nphasesincycle)) 30659599516SKenneth E. Jansen endif 30759599516SKenneth E. Jansen yphbar = zero 30859599516SKenneth E. Jansen endif 30959599516SKenneth E. Jansen 31059599516SKenneth E. Jansen!MR CHANGE END 31159599516SKenneth E. Jansen 31259599516SKenneth E. Jansen vbc_prof(:,1:3) = BC(:,3:5) 31359599516SKenneth E. Jansen if(iramp.eq.1) then 31459599516SKenneth E. Jansen call BCprofileInit(vbc_prof,x) 31559599516SKenneth E. Jansen endif 31659599516SKenneth E. Jansen 31759599516SKenneth E. Jansenc 318ae8d68e4SKenneth E. Jansenc.... ---------------> initialize LesLib Library <--------------- 31959599516SKenneth E. Jansenc 32059599516SKenneth E. Jansenc.... assign parameter values 32159599516SKenneth E. Jansenc 32259599516SKenneth E. Jansen do i = 1, 100 32359599516SKenneth E. Jansen numeqns(i) = i 32459599516SKenneth E. Jansen enddo 32559599516SKenneth E. Jansen nKvecs = Kspace 32659599516SKenneth E. Jansen prjFlag = iprjFlag 32759599516SKenneth E. Jansen presPrjFlag = ipresPrjFlag 32859599516SKenneth E. Jansen verbose = iverbose 32959599516SKenneth E. Jansenc 33059599516SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve 33159599516SKenneth E. Jansenc 33259599516SKenneth E. Jansen nsolt=mod(impl(1),2) ! 1 if solving temperature 33359599516SKenneth E. Jansen nsclrsol=nsolt+nsclr ! total number of scalars solved At 33459599516SKenneth E. Jansen ! some point we probably want to create 33559599516SKenneth E. Jansen ! a map, considering stepseq(), to find 33659599516SKenneth E. Jansen ! what is actually solved and only 33759599516SKenneth E. Jansen ! dimension lhs to the appropriate 33859599516SKenneth E. Jansen ! size. (see 1.6.1 and earlier for a 33959599516SKenneth E. Jansen ! "failed" attempt at this). 34059599516SKenneth E. Jansen 34159599516SKenneth E. Jansen 34259599516SKenneth E. Jansen nsolflow=mod(impl(1),100)/10 ! 1 if solving flow 34359599516SKenneth E. Jansen 34459599516SKenneth E. Jansenc 345ae8d68e4SKenneth E. Jansenc.... Now, call lesNew routine to initialize 34659599516SKenneth E. Jansenc memory space 34759599516SKenneth E. Jansenc 34859599516SKenneth E. Jansen call genadj(colm, rowp, icnt ) ! preprocess the adjacency list 34959599516SKenneth E. Jansen 35059599516SKenneth E. Jansen nnz_tot=icnt ! this is exactly the number of non-zero blocks on 35159599516SKenneth E. Jansen ! this proc 35259599516SKenneth E. Jansen 35359599516SKenneth E. Jansen if (nsolflow.eq.1) then 35459599516SKenneth E. Jansen lesId = numeqns(1) 35559599516SKenneth E. Jansen eqnType = 1 35659599516SKenneth E. Jansen nDofs = 4 357ae8d68e4SKenneth E. Jansen 358ae8d68e4SKenneth E. Jansen!-------------------------------------------------------------------- 359ae8d68e4SKenneth E. Jansen! Rest of configuration of svLS is added here, where we have LHS 360ae8d68e4SKenneth E. Jansen! pointers 361ae8d68e4SKenneth E. Jansen 362ae8d68e4SKenneth E. Jansen nPermDims = 1 363ae8d68e4SKenneth E. Jansen nTmpDims = 1 364ae8d68e4SKenneth E. Jansen 365ae8d68e4SKenneth E. Jansen allocate (lhsP(4,nnz_tot)) 366ae8d68e4SKenneth E. Jansen allocate (lhsK(9,nnz_tot)) 367ae8d68e4SKenneth E. Jansen 368436818eeSKenneth E. Jansen! Setting up svLS or leslib for flow 369436818eeSKenneth E. Jansen 370ae8d68e4SKenneth E. Jansen IF (svLSFlag .EQ. 1) THEN 371436818eeSKenneth E. Jansen IF(nPrjs.eq.0) THEN 372436818eeSKenneth E. Jansen svLSType=2 !GMRES if borrowed ACUSIM projection vectors variable set to zero 373436818eeSKenneth E. Jansen ELSE 374436818eeSKenneth E. Jansen svLSType=3 !NS solver 375436818eeSKenneth E. Jansen ENDIF 376436818eeSKenneth E. Jansen! reltol for the NSSOLVE is the stop criterion on the outer loop 377436818eeSKenneth E. Jansen! reltolIn is (eps_GM, eps_CG) from the CompMech paper 378436818eeSKenneth E. Jansen! for now we are using 379436818eeSKenneth E. Jansen! Tolerance on ACUSIM Pressure Projection for CG and 380436818eeSKenneth E. Jansen! Tolerance on Momentum Equations for GMRES 381436818eeSKenneth E. Jansen! also using Kspaceand maxIters from setup for ACUSIM 382436818eeSKenneth E. Jansen! 383436818eeSKenneth E. Jansen eps_outer=40.0*epstol(1) !following papers soggestion for now 384436818eeSKenneth E. Jansen CALL svLS_LS_CREATE(svLS_ls, svLSType, dimKry=Kspace, 385436818eeSKenneth E. Jansen 2 relTol=eps_outer, relTolIn=(/epstol(1),prestol/), 386436818eeSKenneth E. Jansen 3 maxItr=maxIters, 387436818eeSKenneth E. Jansen 4 maxItrIn=(/maxIters,maxIters/)) 388436818eeSKenneth E. Jansen 389436818eeSKenneth E. Jansen CALL svLS_COMMU_CREATE(communicator, MPI_COMM_WORLD) 390436818eeSKenneth E. Jansen nNo=nshg 391*ec121c45SKenneth E. Jansen gnNo=nshgt 392ae8d68e4SKenneth E. Jansen IF (ipvsq .GE. 2) THEN 393ae8d68e4SKenneth E. Jansen 394ae8d68e4SKenneth E. Jansen#if((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 1)) 395ae8d68e4SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs 396ae8d68e4SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs + numCORSrfs 397ae8d68e4SKenneth E. Jansen#elif((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 0)) 398ae8d68e4SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs 399ae8d68e4SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs + numCORSrfs 400ae8d68e4SKenneth E. Jansen#elif((VER_CORONARY == 0)&&(VER_CLOSEDLOOP == 1)) 401ae8d68e4SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs 402ae8d68e4SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs 403ae8d68e4SKenneth E. Jansen#else 404ae8d68e4SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs 405ae8d68e4SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs 406ae8d68e4SKenneth E. Jansen#endif 407ae8d68e4SKenneth E. Jansen 408ae8d68e4SKenneth E. Jansen ELSE 409436818eeSKenneth E. Jansen svLS_nFaces = 1 !not sure about this...looks like 1 means 0 for array size issues 410ae8d68e4SKenneth E. Jansen END IF 411ae8d68e4SKenneth E. Jansen 412ae8d68e4SKenneth E. Jansen CALL svLS_LHS_CREATE(svLS_lhs, communicator, gnNo, nNo, 413ae8d68e4SKenneth E. Jansen 2 nnz_tot, ltg, colm, rowp, svLS_nFaces) 414ae8d68e4SKenneth E. Jansen 415ae8d68e4SKenneth E. Jansen faIn = 1 416ae8d68e4SKenneth E. Jansen facenNo = 0 417ae8d68e4SKenneth E. Jansen DO i=1, nshg 418ae8d68e4SKenneth E. Jansen IF (IBITS(iBC(i),3,3) .NE. 0) facenNo = facenNo + 1 419ae8d68e4SKenneth E. Jansen END DO 420ae8d68e4SKenneth E. Jansen ALLOCATE(gNodes(facenNo), sV(nsd,facenNo)) 421ae8d68e4SKenneth E. Jansen sV = 0D0 422ae8d68e4SKenneth E. Jansen j = 0 423ae8d68e4SKenneth E. Jansen DO i=1, nshg 424ae8d68e4SKenneth E. Jansen IF (IBITS(iBC(i),3,3) .NE. 0) THEN 425ae8d68e4SKenneth E. Jansen j = j + 1 426ae8d68e4SKenneth E. Jansen gNodes(j) = i 427ae8d68e4SKenneth E. Jansen IF (.NOT.BTEST(iBC(i),3)) sV(1,j) = 1D0 428ae8d68e4SKenneth E. Jansen IF (.NOT.BTEST(iBC(i),4)) sV(2,j) = 1D0 429ae8d68e4SKenneth E. Jansen IF (.NOT.BTEST(iBC(i),5)) sV(3,j) = 1D0 430ae8d68e4SKenneth E. Jansen END IF 431ae8d68e4SKenneth E. Jansen END DO 432ae8d68e4SKenneth E. Jansen CALL svLS_BC_CREATE(svLS_lhs, faIn, facenNo, 433ae8d68e4SKenneth E. Jansen 2 nsd, BC_TYPE_Dir, gNodes, sV) 434436818eeSKenneth E. Jansen DEALLOCATE(gNodes) 435436818eeSKenneth E. Jansen DEALLOCATE(sV) 436ae8d68e4SKenneth E. Jansen 437436818eeSKenneth E. Jansen ELSE ! leslib solve 438ae8d68e4SKenneth E. Jansen!-------------------------------------------------------------------- 43959599516SKenneth E. Jansen call myfLesNew( lesId, 41994, 44059599516SKenneth E. Jansen & eqnType, 44159599516SKenneth E. Jansen & nDofs, minIters, maxIters, 44259599516SKenneth E. Jansen & nKvecs, prjFlag, nPrjs, 44359599516SKenneth E. Jansen & presPrjFlag, nPresPrjs, epstol(1), 44459599516SKenneth E. Jansen & prestol, verbose, statsflow, 44559599516SKenneth E. Jansen & nPermDims, nTmpDims, servername ) 44659599516SKenneth E. Jansen 44759599516SKenneth E. Jansen allocate (aperm(nshg,nPermDims)) 44859599516SKenneth E. Jansen allocate (atemp(nshg,nTmpDims)) 44959599516SKenneth E. Jansen call readLesRestart( lesId, aperm, nshg, myrank, lstep, 45059599516SKenneth E. Jansen & nPermDims ) 451436818eeSKenneth E. Jansen ENDIF !flow solver selector 45259599516SKenneth E. Jansen 453436818eeSKenneth E. Jansen else ! not solving flow just scalar 45459599516SKenneth E. Jansen nPermDims = 0 45559599516SKenneth E. Jansen nTempDims = 0 45659599516SKenneth E. Jansen endif 45759599516SKenneth E. Jansen 45859599516SKenneth E. Jansen 45959599516SKenneth E. Jansen if(nsclrsol.gt.0) then 46059599516SKenneth E. Jansen do isolsc=1,nsclrsol 46159599516SKenneth E. Jansen lesId = numeqns(isolsc+1) 46259599516SKenneth E. Jansen eqnType = 2 46359599516SKenneth E. Jansen nDofs = 1 46459599516SKenneth E. Jansen presPrjflag = 0 46559599516SKenneth E. Jansen nPresPrjs = 0 46659599516SKenneth E. Jansen prjFlag = 1 46759599516SKenneth E. Jansen indx=isolsc+2-nsolt ! complicated to keep epstol(2) for 46859599516SKenneth E. Jansen ! temperature followed by scalars 469436818eeSKenneth E. Jansen! Setting up svLS or leslib for scalar 470436818eeSKenneth E. Jansen 471436818eeSKenneth E. Jansen IF (svLSFlag .EQ. 1) THEN 472436818eeSKenneth E. Jansen svLSType=2 !only option for scalars 473436818eeSKenneth E. Jansen! reltol for the GMRES is the stop criterion 474436818eeSKenneth E. Jansen! also using Kspaceand maxIters from setup for ACUSIM 475436818eeSKenneth E. Jansen! 476daa97cf2SKenneth E. Jansen CALL svLS_LS_CREATE(svLS_ls_S(isolsc), svLSType, dimKry=Kspace, 477436818eeSKenneth E. Jansen 2 relTol=epstol(indx), 478436818eeSKenneth E. Jansen 3 maxItr=maxIters 479436818eeSKenneth E. Jansen 4 ) 480436818eeSKenneth E. Jansen 481daa97cf2SKenneth E. Jansen CALL svLS_COMMU_CREATE(communicator_S(isolsc), MPI_COMM_WORLD) 482436818eeSKenneth E. Jansen 483436818eeSKenneth E. Jansen svLS_nFaces = 1 !not sure about this...should try it with zero 484436818eeSKenneth E. Jansen 485daa97cf2SKenneth E. Jansen CALL svLS_LHS_CREATE(svLS_lhs_S(isolsc), communicator_S(isolsc), gnNo, nNo, 486436818eeSKenneth E. Jansen 2 nnz_tot, ltg, colm, rowp, svLS_nFaces) 487436818eeSKenneth E. Jansen 488436818eeSKenneth E. Jansen faIn = 1 489436818eeSKenneth E. Jansen facenNo = 0 490436818eeSKenneth E. Jansen ib=5+isolsc 491436818eeSKenneth E. Jansen DO i=1, nshg 492436818eeSKenneth E. Jansen IF (btest(iBC(i),ib)) facenNo = facenNo + 1 493436818eeSKenneth E. Jansen END DO 494436818eeSKenneth E. Jansen ALLOCATE(gNodes(facenNo), sV(1,facenNo)) 495436818eeSKenneth E. Jansen sV = 0D0 496436818eeSKenneth E. Jansen j = 0 497436818eeSKenneth E. Jansen DO i=1, nshg 498436818eeSKenneth E. Jansen IF (btest(iBC(i),ib)) THEN 499436818eeSKenneth E. Jansen j = j + 1 500436818eeSKenneth E. Jansen gNodes(j) = i 501436818eeSKenneth E. Jansen END IF 502436818eeSKenneth E. Jansen END DO 503436818eeSKenneth E. Jansen 504daa97cf2SKenneth E. Jansen CALL svLS_BC_CREATE(svLS_lhs_S(isolsc), faIn, facenNo, 505436818eeSKenneth E. Jansen 2 1, BC_TYPE_Dir, gNodes, sV(1,:)) 506436818eeSKenneth E. Jansen DEALLOCATE(gNodes) 507436818eeSKenneth E. Jansen DEALLOCATE(sV) 508436818eeSKenneth E. Jansen 509436818eeSKenneth E. Jansen if( isolsc.eq.1) then ! if multiple scalars make sure done once 510436818eeSKenneth E. Jansen allocate (apermS(1,1,1)) 511436818eeSKenneth E. Jansen allocate (atempS(1,1)) !they can all share this 512436818eeSKenneth E. Jansen endif 513436818eeSKenneth E. Jansen 514436818eeSKenneth E. Jansen ELSE ! leslib solve of scalar 515436818eeSKenneth E. Jansen 51659599516SKenneth E. Jansen call myfLesNew( lesId, 41994, 51759599516SKenneth E. Jansen & eqnType, 51859599516SKenneth E. Jansen & nDofs, minIters, maxIters, 51959599516SKenneth E. Jansen & nKvecs, prjFlag, nPrjs, 52059599516SKenneth E. Jansen & presPrjFlag, nPresPrjs, epstol(indx), 52159599516SKenneth E. Jansen & prestol, verbose, statssclr, 52259599516SKenneth E. Jansen & nPermDimsS, nTmpDimsS, servername ) 523436818eeSKenneth E. Jansen ENDIF 524436818eeSKenneth E. Jansen enddo !loop over scalars to solve (not yet worked out for multiple svLS solves 525436818eeSKenneth E. Jansen allocate (lhsS(nnz_tot,nsclrsol)) 526436818eeSKenneth E. Jansen if(svLSFlag.eq.0) then ! we just prepped scalar solves for leslib so allocate arrays 52759599516SKenneth E. Jansenc 52859599516SKenneth E. Jansenc Assume all scalars have the same size needs 52959599516SKenneth E. Jansenc 53059599516SKenneth E. Jansen allocate (apermS(nshg,nPermDimsS,nsclrsol)) 53159599516SKenneth E. Jansen allocate (atempS(nshg,nTmpDimsS)) !they can all share this 532436818eeSKenneth E. Jansen endif 53359599516SKenneth E. Jansenc 53459599516SKenneth E. Jansenc actually they could even share with atemp but leave that for later 53559599516SKenneth E. Jansenc 536436818eeSKenneth E. Jansen else !no scalar solves at all so zero dims not used 53759599516SKenneth E. Jansen nPermDimsS = 0 53859599516SKenneth E. Jansen nTmpDimsS = 0 53959599516SKenneth E. Jansen endif 54059599516SKenneth E. Jansenc 54159599516SKenneth E. Jansenc... prepare lumped mass if needed 54259599516SKenneth E. Jansenc 54359599516SKenneth E. Jansen if((flmpr.ne.0).or.(flmpl.ne.0)) call genlmass(x, shp,shgl) 54459599516SKenneth E. Jansenc 54559599516SKenneth E. Jansenc.... -----------------> End of initialization <----------------- 54659599516SKenneth E. Jansenc 54759599516SKenneth E. Jansenc.....open the necessary files to gather time series 54859599516SKenneth E. Jansenc 54959599516SKenneth E. Jansen lstep0 = lstep+1 55059599516SKenneth E. Jansen nsteprcr = nstep(1)+lstep 55159599516SKenneth E. Jansenc 55259599516SKenneth E. Jansenc.... loop through the time sequences 55359599516SKenneth E. Jansenc 55459599516SKenneth E. Jansen 55559599516SKenneth E. Jansen 55659599516SKenneth E. Jansen do 3000 itsq = 1, ntseq 55759599516SKenneth E. Jansen itseq = itsq 55859599516SKenneth E. Jansen 55959599516SKenneth E. JansenCAD tcorecp1 = second(0) 56059599516SKenneth E. JansenCAD tcorewc1 = second(-1) 56159599516SKenneth E. Jansenc 56259599516SKenneth E. Jansenc.... set up the time integration parameters 56359599516SKenneth E. Jansenc 56459599516SKenneth E. Jansen nstp = nstep(itseq) 56559599516SKenneth E. Jansen nitr = niter(itseq) 56659599516SKenneth E. Jansen LCtime = loctim(itseq) 56759599516SKenneth E. Jansen dtol(:)= deltol(itseq,:) 56859599516SKenneth E. Jansen 56959599516SKenneth E. Jansen call itrSetup ( y, acold ) 57059599516SKenneth E. Jansenc 57159599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution, 57259599516SKenneth E. Jansenc which are functions of alphaf so need to do it after itrSetup 57359599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 57459599516SKenneth E. Jansen call calcImpConvCoef (numImpSrfs, ntimeptpT) 57559599516SKenneth E. Jansen endif 57659599516SKenneth E. Jansenc 57759599516SKenneth E. Jansenc...initialize the initial condition P(0)-RQ(0)-Pd(0) for RCR BC 57859599516SKenneth E. Jansenc need ndsurf so should be after initNABI 57959599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 58059599516SKenneth E. Jansen call calcRCRic(y,nsrflistRCR,numRCRSrfs) 58159599516SKenneth E. Jansen endif 58259599516SKenneth E. Jansenc 58359599516SKenneth E. Jansenc find the last solve of the flow in the step sequence so that we will 58459599516SKenneth E. Jansenc know when we are at/near end of step 58559599516SKenneth E. Jansenc 58659599516SKenneth E. Jansenc ilast=0 58759599516SKenneth E. Jansen nitr=0 ! count number of flow solves in a step (# of iterations) 58859599516SKenneth E. Jansen do i=1,seqsize 58959599516SKenneth E. Jansen if(stepseq(i).eq.0) nitr=nitr+1 59059599516SKenneth E. Jansen enddo 59159599516SKenneth E. Jansen 59259599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 59359599516SKenneth E. Jansen tcorecp(:) = zero ! used in solfar.f (solflow) 59459599516SKenneth E. Jansen tcorecpscal(:) = zero ! used in solfar.f (solflow) 59559599516SKenneth E. Jansen if(myrank.eq.0) then 59659599516SKenneth E. Jansen tcorecp1 = TMRC() 59759599516SKenneth E. Jansen endif 59859599516SKenneth E. Jansen 59959599516SKenneth E. Jansenc 60059599516SKenneth E. Jansenc.... loop through the time steps 60159599516SKenneth E. Jansenc 60259599516SKenneth E. Jansen istop=0 60359599516SKenneth E. Jansen rmub=datmat(1,2,1) 60459599516SKenneth E. Jansen if(rmutarget.gt.0) then 60559599516SKenneth E. Jansen rmue=rmutarget 60659599516SKenneth E. Jansen else 60759599516SKenneth E. Jansen rmue=datmat(1,2,1) ! keep constant 60859599516SKenneth E. Jansen endif 60959599516SKenneth E. Jansen 61059599516SKenneth E. Jansen if(iramp.eq.1) then 61159599516SKenneth E. Jansen call BCprofileScale(vbc_prof,BC,yold) ! fix the yold values to the reset BC 61259599516SKenneth E. Jansen isclr=1 ! fix scalar 61359599516SKenneth E. Jansen do isclr=1,nsclr 61459599516SKenneth E. Jansen call itrBCSclr(yold,ac,iBC,BC,iper,ilwork) 61559599516SKenneth E. Jansen enddo 61659599516SKenneth E. Jansen endif 61759599516SKenneth E. Jansen 61859599516SKenneth E. Jansen do 2000 istp = 1, nstp 61959599516SKenneth E. Jansen if(iramp.eq.1) 62059599516SKenneth E. Jansen & call BCprofileScale(vbc_prof,BC,yold) 62159599516SKenneth E. Jansen 62259599516SKenneth E. Jansen call rerun_check(stopjob) 62332eed141SKenneth E. Jansen if(myrank.eq.master) write(*,*) 62432eed141SKenneth E. Jansen & 'stopjob,lstep,istep', stopjob,lstep,istep 62532eed141SKenneth E. Jansen if(stopjob.eq.lstep) then 62632eed141SKenneth E. Jansen stopjob=-2 ! this is the code to finish 62732eed141SKenneth E. Jansen if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then 62832eed141SKenneth E. Jansen if(myrank.eq.master) write(*,*) 62932eed141SKenneth E. Jansen & 'line 473 says last step written so exit' 63032eed141SKenneth E. Jansen goto 2002 ! the step was written last step so just exit 63132eed141SKenneth E. Jansen else 63232eed141SKenneth E. Jansen if(myrank.eq.master) 63332eed141SKenneth E. Jansen & write(*,*) 'line 473 says last step not written' 63432eed141SKenneth E. Jansen istep=nstp ! have to do this so that solution will be written 63532eed141SKenneth E. Jansen goto 2001 63632eed141SKenneth E. Jansen endif 63732eed141SKenneth E. Jansen endif 63859599516SKenneth E. Jansen 63959599516SKenneth E. Jansen xi=istp*1.0/nstp 64059599516SKenneth E. Jansen datmat(1,2,1)=rmub*(1.0-xi)+xi*rmue 64159599516SKenneth E. Jansenc write(*,*) "current mol. visc = ", datmat(1,2,1) 64259599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC. 64359599516SKenneth E. Jansenc these will be for time step n+1 so use lstep+1 64459599516SKenneth E. Jansenc 64559599516SKenneth E. Jansen if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl, 64659599516SKenneth E. Jansen & shpb, shglb, x, BC, iBC) 64759599516SKenneth E. Jansen 64859599516SKenneth E. Jansenc 64959599516SKenneth E. Jansenc ... calculate the pressure contribution that depends on the history for the Imp. BC 65059599516SKenneth E. Jansenc 65159599516SKenneth E. Jansen if(numImpSrfs.gt.0) then 65259599516SKenneth E. Jansen call pHist(poldImp,QHistImp,ImpConvCoef, 65359599516SKenneth E. Jansen & ntimeptpT,numImpSrfs) 65459599516SKenneth E. Jansen if (myrank.eq.master) 65559599516SKenneth E. Jansen & write(8177,*) (poldImp(n), n=1,numImpSrfs) 65659599516SKenneth E. Jansen endif 65759599516SKenneth E. Jansenc 65859599516SKenneth E. Jansenc ... calc the pressure contribution that depends on the history for the RCR BC 65959599516SKenneth E. Jansenc 66059599516SKenneth E. Jansen if(numRCRSrfs.gt.0) then 66159599516SKenneth E. Jansen call CalcHopRCR (Delt(itseq), lstep, numRCRSrfs) 66259599516SKenneth E. Jansen call CalcRCRConvCoef(lstep,numRCRSrfs) 66359599516SKenneth E. Jansen call pHist(poldRCR,QHistRCR,RCRConvCoef,nsteprcr, 66459599516SKenneth E. Jansen & numRCRSrfs) 66559599516SKenneth E. Jansen if (myrank.eq.master) 66659599516SKenneth E. Jansen & write(8177,*) (poldRCR(n), n=1,numRCRSrfs) 66759599516SKenneth E. Jansen endif 66859599516SKenneth E. Jansenc 66959599516SKenneth E. Jansenc Decay of scalars 67059599516SKenneth E. Jansenc 67159599516SKenneth E. Jansen if(nsclr.gt.0 .and. tdecay.ne.1) then 67259599516SKenneth E. Jansen yold(:,6:ndof)=y(:,6:ndof)*tdecay 67359599516SKenneth E. Jansen BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*tdecay 67459599516SKenneth E. Jansen endif 67559599516SKenneth E. Jansen 67659599516SKenneth E. Jansen if(nosource.eq.1) BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*0.8 67759599516SKenneth E. Jansen 67859599516SKenneth E. Jansen 67959599516SKenneth E. Jansen if(iLES.gt.0) then !complicated stuff has moved to 68059599516SKenneth E. Jansen !routine below 68159599516SKenneth E. Jansen call lesmodels(yold, acold, shgl, shp, 68259599516SKenneth E. Jansen & iper, ilwork, rowp, colm, 68359599516SKenneth E. Jansen & nsons, ifath, x, 68459599516SKenneth E. Jansen & iBC, BC) 68559599516SKenneth E. Jansen 68659599516SKenneth E. Jansen 68759599516SKenneth E. Jansen endif 68859599516SKenneth E. Jansen 68959599516SKenneth E. Jansenc.... set traction BCs for modeled walls 69059599516SKenneth E. Jansenc 69159599516SKenneth E. Jansen if (itwmod.ne.0) then 69259599516SKenneth E. Jansen call asbwmod(yold, acold, x, BC, iBC, 69359599516SKenneth E. Jansen & iper, ilwork, ifath, velbar) 69459599516SKenneth E. Jansen endif 69559599516SKenneth E. Jansen 69659599516SKenneth E. Jansen!MR CHANGE 69759599516SKenneth E. Jansenc 69859599516SKenneth E. Jansenc.... Determine whether the vorticity field needs to be computed for this time step or not 69959599516SKenneth E. Jansenc 70059599516SKenneth E. Jansen icomputevort = 0 70159599516SKenneth E. Jansen if (ivort == 1) then ! Print vorticity = True in solver.inp 70259599516SKenneth E. Jansen ! We then compute the vorticity only if we 70359599516SKenneth E. Jansen ! 1) we write an intermediate checkpoint 70459599516SKenneth E. Jansen ! 2) we reach the last time step and write the last checkpoint 70559599516SKenneth E. Jansen ! 3) we accumulate statistics in ybar for every time step 70659599516SKenneth E. Jansen ! BEWARE: we need here lstep+1 and istep+1 because the lstep and 70759599516SKenneth E. Jansen ! istep gets incremened after the flowsolve, further below 70859599516SKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep+1, ntout) .eq. 0)) .or. 70959599516SKenneth E. Jansen & istep+1.eq.nstep(itseq) .or. ioybar == 1) then 71059599516SKenneth E. Jansen icomputevort = 1 71159599516SKenneth E. Jansen endif 71259599516SKenneth E. Jansen endif 71359599516SKenneth E. Jansen 71459599516SKenneth E. Jansen! write(*,*) 'icomputevort: ',icomputevort, ' - istep: ', 71559599516SKenneth E. Jansen! & istep,' - nstep(itseq):',nstep(itseq),'- lstep:', 71659599516SKenneth E. Jansen! & lstep, '- ntout:', ntout 71759599516SKenneth E. Jansen!MR CHANGE 71859599516SKenneth E. Jansen 71959599516SKenneth E. Jansenc 72059599516SKenneth E. Jansenc.... -----------------------> predictor phase <----------------------- 72159599516SKenneth E. Jansenc 72259599516SKenneth E. Jansen call itrPredict(yold, y, acold, ac , uold, u, iBC) 72359599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper,ilwork) 72459599516SKenneth E. Jansen 72559599516SKenneth E. Jansen if(nsolt.eq.1) then 72659599516SKenneth E. Jansen isclr=0 72759599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 72859599516SKenneth E. Jansen endif 72959599516SKenneth E. Jansen do isclr=1,nsclr 73059599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 73159599516SKenneth E. Jansen enddo 73259599516SKenneth E. Jansen iter=0 73359599516SKenneth E. Jansen ilss=0 ! this is a switch thrown on first solve of LS redistance 73459599516SKenneth E. Jansen do istepc=1,seqsize 73559599516SKenneth E. Jansen icode=stepseq(istepc) 73659599516SKenneth E. Jansen if(mod(icode,5).eq.0) then ! this is a solve 73759599516SKenneth E. Jansen isolve=icode/10 73859599516SKenneth E. Jansen if(icode.eq.0) then ! flow solve (encoded as 0) 73959599516SKenneth E. Jansenc 74059599516SKenneth E. Jansen iter = iter+1 74159599516SKenneth E. Jansen ifuncs(1) = ifuncs(1) + 1 74259599516SKenneth E. Jansenc 74359599516SKenneth E. Jansen Force(1) = zero 74459599516SKenneth E. Jansen Force(2) = zero 74559599516SKenneth E. Jansen Force(3) = zero 74659599516SKenneth E. Jansen HFlux = zero 74759599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1))) 74859599516SKenneth E. Jansen 74959599516SKenneth E. Jansen call SolFlow(y, ac, u, 75059599516SKenneth E. Jansen & yold, acold, uold, 75159599516SKenneth E. Jansen & x, iBC, 75259599516SKenneth E. Jansen & BC, res, 75359599516SKenneth E. Jansen & nPermDims, nTmpDims, aperm, 75459599516SKenneth E. Jansen & atemp, iper, 75559599516SKenneth E. Jansen & ilwork, shp, shgl, 75659599516SKenneth E. Jansen & shpb, shglb, rowp, 75759599516SKenneth E. Jansen & colm, lhsK, lhsP, 75859599516SKenneth E. Jansen & solinc, rerr, tcorecp, 759ae8d68e4SKenneth E. Jansen & GradV, sumtime, 760ae8d68e4SKenneth E. Jansen & svLS_lhs, svLS_ls, svLS_nFaces) 76159599516SKenneth E. Jansen 76259599516SKenneth E. Jansen else ! scalar type solve 76359599516SKenneth E. Jansen if (icode.eq.5) then ! Solve for Temperature 76459599516SKenneth E. Jansen ! (encoded as (nsclr+1)*10) 76559599516SKenneth E. Jansen isclr=0 76659599516SKenneth E. Jansen ifuncs(2) = ifuncs(2) + 1 76759599516SKenneth E. Jansen j=1 76859599516SKenneth E. Jansen else ! solve a scalar (encoded at isclr*10) 76959599516SKenneth E. Jansen isclr=isolve 77059599516SKenneth E. Jansen ifuncs(isclr+2) = ifuncs(isclr+2) + 1 77159599516SKenneth E. Jansen j=isclr+nsolt 77259599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.0) 77359599516SKenneth E. Jansen & .and.(isclr.eq.2)) then 77459599516SKenneth E. Jansen ilss=1 ! throw switch (once per step) 77559599516SKenneth E. Jansen y(:,7)=y(:,6) ! redistance field initialized 77659599516SKenneth E. Jansen ac(:,7) = zero 77759599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 77859599516SKenneth E. Jansen & ilwork) 77959599516SKenneth E. Jansenc 78059599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the 78159599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar 78259599516SKenneth E. Jansenc 78359599516SKenneth E. Jansen alfit=alfi 78459599516SKenneth E. Jansen gamit=gami 78559599516SKenneth E. Jansen almit=almi 78659599516SKenneth E. Jansen Deltt=Delt(1) 78759599516SKenneth E. Jansen Dtglt=Dtgl 78859599516SKenneth E. Jansen alfi = 1 78959599516SKenneth E. Jansen gami = 1 79059599516SKenneth E. Jansen almi = 1 79159599516SKenneth E. Jansenc Delt(1)= Deltt ! Give a pseudo time step 79259599516SKenneth E. Jansen Dtgl = one / Delt(1) 79359599516SKenneth E. Jansen endif ! level set eq. 2 79459599516SKenneth E. Jansen endif ! deciding between temperature and scalar 79559599516SKenneth E. Jansen 79659599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(isclr+2)-1, 79759599516SKenneth E. Jansen & LHSupd(isclr+2))) 79859599516SKenneth E. Jansen 79959599516SKenneth E. Jansen call SolSclr(y, ac, u, 80059599516SKenneth E. Jansen & yold, acold, uold, 80159599516SKenneth E. Jansen & x, iBC, 80259599516SKenneth E. Jansen & BC, nPermDimsS,nTmpDimsS, 80359599516SKenneth E. Jansen & apermS(1,1,j), atempS, iper, 80459599516SKenneth E. Jansen & ilwork, shp, shgl, 80559599516SKenneth E. Jansen & shpb, shglb, rowp, 80659599516SKenneth E. Jansen & colm, lhsS(1,j), 807436818eeSKenneth E. Jansen & solinc(1,isclr+5), tcorecpscal, 808daa97cf2SKenneth E. Jansen & svLS_lhs_S(isclr), svLS_ls_S(isclr), svls_nfaces) 80959599516SKenneth E. Jansen 81059599516SKenneth E. Jansen 81159599516SKenneth E. Jansen endif ! end of scalar type solve 81259599516SKenneth E. Jansen 81359599516SKenneth E. Jansen else ! this is an update (mod did not equal zero) 81459599516SKenneth E. Jansen iupdate=icode/10 ! what to update 81559599516SKenneth E. Jansen if(icode.eq.1) then !update flow 81659599516SKenneth E. Jansen call itrCorrect ( y, ac, u, solinc, iBC) 81759599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper, ilwork) 81859599516SKenneth E. Jansen else ! update scalar 81959599516SKenneth E. Jansen isclr=iupdate !unless 82059599516SKenneth E. Jansen if(icode.eq.6) isclr=0 82159599516SKenneth E. Jansen if(iRANS.lt.-100)then ! RANS 82259599516SKenneth E. Jansen call itrCorrectSclrPos(y,ac,solinc(1,isclr+5)) 82359599516SKenneth E. Jansen else 82459599516SKenneth E. Jansen call itrCorrectSclr (y, ac, solinc(1,isclr+5)) 82559599516SKenneth E. Jansen endif 82659599516SKenneth E. Jansen if (ilset.eq.2 .and. isclr.eq.2) then 82759599516SKenneth E. Jansen if (ivconstraint .eq. 1) then 82859599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 82959599516SKenneth E. Jansen & ilwork) 83059599516SKenneth E. Jansenc 83159599516SKenneth E. Jansenc ... applying the volume constraint on second level set scalar 83259599516SKenneth E. Jansenc 83359599516SKenneth E. Jansen call solvecon (y, x, iBC, BC, 83459599516SKenneth E. Jansen & iper, ilwork, shp, shgl) 83559599516SKenneth E. Jansenc 83659599516SKenneth E. Jansen endif ! end of volume constraint calculations 83759599516SKenneth E. Jansen endif ! end of redistance calculations 83859599516SKenneth E. Jansenc 83959599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 84059599516SKenneth E. Jansen & ilwork) 84159599516SKenneth E. Jansen endif ! end of flow or scalar update 84259599516SKenneth E. Jansen endif ! end of switch between solve or update 84359599516SKenneth E. Jansen enddo ! loop over sequence in step 84459599516SKenneth E. Jansenc 84559599516SKenneth E. Jansenc 84659599516SKenneth E. Jansenc.... obtain the time average statistics 84759599516SKenneth E. Jansenc 84859599516SKenneth E. Jansen if (ioform .eq. 2) then 84959599516SKenneth E. Jansen 85059599516SKenneth E. Jansen call stsGetStats( y, yold, ac, acold, 85159599516SKenneth E. Jansen & u, uold, x, 85259599516SKenneth E. Jansen & shp, shgl, shpb, shglb, 85359599516SKenneth E. Jansen & iBC, BC, iper, ilwork, 85459599516SKenneth E. Jansen & rowp, colm, lhsK, lhsP ) 85559599516SKenneth E. Jansen endif 85659599516SKenneth E. Jansen 85759599516SKenneth E. Jansenc 85859599516SKenneth E. Jansenc Find the solution at the end of the timestep and move it to old 85959599516SKenneth E. Jansenc 86059599516SKenneth E. Jansenc 86159599516SKenneth E. Jansenc ...First to reassign the parameters for the original time integrator scheme 86259599516SKenneth E. Jansenc 86359599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.1)) then 86459599516SKenneth E. Jansen alfi =alfit 86559599516SKenneth E. Jansen gami =gamit 86659599516SKenneth E. Jansen almi =almit 86759599516SKenneth E. Jansen Delt(1)=Deltt 86859599516SKenneth E. Jansen Dtgl =Dtglt 86959599516SKenneth E. Jansen endif 87059599516SKenneth E. Jansen call itrUpdate( yold, acold, uold, y, ac, u) 87159599516SKenneth E. Jansen call itrBC (yold, acold, iBC, BC, iper,ilwork) 87259599516SKenneth E. Jansen 87359599516SKenneth E. Jansen istep = istep + 1 87459599516SKenneth E. Jansen lstep = lstep + 1 87559599516SKenneth E. Jansenc 87659599516SKenneth E. Jansenc .. Print memory consumption on BGQ 87759599516SKenneth E. Jansenc 87859599516SKenneth E. Jansen call printmeminfo("itrdrv"//char(0)) 87959599516SKenneth E. Jansen 88059599516SKenneth E. Jansenc 88159599516SKenneth E. Jansenc .. Compute vorticity 88259599516SKenneth E. Jansenc 88359599516SKenneth E. Jansen if ( icomputevort == 1) then 88459599516SKenneth E. Jansen 88559599516SKenneth E. Jansen ! vorticity components and magnitude 88659599516SKenneth E. Jansen vorticity(:,1) = GradV(:,8)-GradV(:,6) !omega_x 88759599516SKenneth E. Jansen vorticity(:,2) = GradV(:,3)-GradV(:,7) !omega_y 88859599516SKenneth E. Jansen vorticity(:,3) = GradV(:,4)-GradV(:,2) !omega_z 88959599516SKenneth E. Jansen vorticity(:,4) = sqrt( vorticity(:,1)*vorticity(:,1) 89059599516SKenneth E. Jansen & + vorticity(:,2)*vorticity(:,2) 89159599516SKenneth E. Jansen & + vorticity(:,3)*vorticity(:,3) ) 89259599516SKenneth E. Jansen ! Q 89359599516SKenneth E. Jansen strain(:,1) = GradV(:,1) !S11 89459599516SKenneth E. Jansen strain(:,2) = 0.5*(GradV(:,2)+GradV(:,4)) !S12 89559599516SKenneth E. Jansen strain(:,3) = 0.5*(GradV(:,3)+GradV(:,7)) !S13 89659599516SKenneth E. Jansen strain(:,4) = GradV(:,5) !S22 89759599516SKenneth E. Jansen strain(:,5) = 0.5*(GradV(:,6)+GradV(:,8)) !S23 89859599516SKenneth E. Jansen strain(:,6) = GradV(:,9) !S33 89959599516SKenneth E. Jansen 90059599516SKenneth E. Jansen vorticity(:,5) = 0.25*( vorticity(:,4)*vorticity(:,4) !Q 90159599516SKenneth E. Jansen & - 2.0*( strain(:,1)*strain(:,1) 90259599516SKenneth E. Jansen & + 2* strain(:,2)*strain(:,2) 90359599516SKenneth E. Jansen & + 2* strain(:,3)*strain(:,3) 90459599516SKenneth E. Jansen & + strain(:,4)*strain(:,4) 90559599516SKenneth E. Jansen & + 2* strain(:,5)*strain(:,5) 90659599516SKenneth E. Jansen & + strain(:,6)*strain(:,6))) 90759599516SKenneth E. Jansen 90859599516SKenneth E. Jansen endif 90959599516SKenneth E. Jansenc 910f32d06b0SKenneth E. Jansenc .. write out the instantaneous solution 91159599516SKenneth E. Jansenc 91232eed141SKenneth E. Jansen2001 continue ! we could get here by 2001 label if user requested stop 91359599516SKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or. 91459599516SKenneth E. Jansen & istep.eq.nstep(itseq)) then 91532eed141SKenneth E. Jansen 91632eed141SKenneth E. Jansen!so that we can see progress in force file close it so that it flushes 91732eed141SKenneth E. Jansen!and then reopen in append mode 91832eed141SKenneth E. Jansen 91932eed141SKenneth E. Jansen close(iforce) 92032eed141SKenneth E. Jansen open (unit=iforce, file=fforce, position='append') 92159599516SKenneth E. Jansen 92259599516SKenneth E. Jansen! Call to restar() will open restart file in write mode (and not append mode) 92359599516SKenneth E. Jansen! that is needed as other fields are written in append mode 92432eed141SKenneth E. Jansen 92559599516SKenneth E. Jansen call restar ('out ', yold ,ac) 92659599516SKenneth E. Jansen if(ideformwall == 1) then 9274c3261e2SCameron Smith if(myrank.eq.master) then 9284c3261e2SCameron Smith write(*,*) 'ideformwall is 1 and is a dead code path... exiting' 9294c3261e2SCameron Smith endif 9304c3261e2SCameron Smith stop 93159599516SKenneth E. Jansen endif 93259599516SKenneth E. Jansen 93359599516SKenneth E. Jansen if(ivort == 1) then 93459599516SKenneth E. Jansen call write_field(myrank,'a','vorticity',9,vorticity, 93559599516SKenneth E. Jansen & 'd',nshg,5,lstep) 93659599516SKenneth E. Jansen endif 93759599516SKenneth E. Jansen 93859599516SKenneth E. Jansen call printmeminfo("itrdrv after checkpoint"//char(0)) 93932eed141SKenneth E. Jansen else if(stopjob.eq.-2) then 94032eed141SKenneth E. Jansen if(myrank.eq.master) then 94132eed141SKenneth E. Jansen write(*,*) 'line 755 says no write before stopping' 94232eed141SKenneth E. Jansen write(*,*) 'istep,nstep,irs',istep,nstep(itseq),irs 94359599516SKenneth E. Jansen endif 944f32d06b0SKenneth E. Jansen endif !just the instantaneous stuff for videos 94532eed141SKenneth E. Jansenc 94632eed141SKenneth E. Jansenc.... compute the consistent boundary flux 94732eed141SKenneth E. Jansenc 94832eed141SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 94932eed141SKenneth E. Jansen call Bflux ( yold, acold, uold, x, 95032eed141SKenneth E. Jansen & shp, shgl, shpb, 95132eed141SKenneth E. Jansen & shglb, ilwork, iBC, 95232eed141SKenneth E. Jansen & BC, iper, wallssVec) 95332eed141SKenneth E. Jansen endif 95432eed141SKenneth E. Jansen 95532eed141SKenneth E. Jansen if(stopjob.eq.-2) goto 2003 95632eed141SKenneth E. Jansen 95759599516SKenneth E. Jansen 95859599516SKenneth E. Jansenc 95959599516SKenneth E. Jansenc ... update the flow history for the impedance convolution, filter it and write it out 96059599516SKenneth E. Jansenc 96159599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 96259599516SKenneth E. Jansen call UpdHistConv(y,nsrflistImp,numImpSrfs) !uses Delt(1) 96359599516SKenneth E. Jansen endif 96459599516SKenneth E. Jansen 96559599516SKenneth E. Jansenc 96659599516SKenneth E. Jansenc ... update the flow history for the RCR convolution 96759599516SKenneth E. Jansenc 96859599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 96959599516SKenneth E. Jansen call UpdHistConv(y,nsrflistRCR,numRCRSrfs) !uses lstep 97059599516SKenneth E. Jansen endif 97159599516SKenneth E. Jansen 97259599516SKenneth E. Jansen 97359599516SKenneth E. Jansenc... dump TIME SERIES 97459599516SKenneth E. Jansen 97559599516SKenneth E. Jansen if (exts) then 97659599516SKenneth E. Jansen if (mod(lstep-1,freq).eq.0) then 97759599516SKenneth E. Jansen 97859599516SKenneth E. Jansen if (numpe > 1) then 97959599516SKenneth E. Jansen do jj = 1, ntspts 98059599516SKenneth E. Jansen vartssoln((jj-1)*ndof+1:jj*ndof)=varts(jj,:) 98159599516SKenneth E. Jansen ivarts=zero 98259599516SKenneth E. Jansen enddo 98359599516SKenneth E. Jansen do k=1,ndof*ntspts 98459599516SKenneth E. Jansen if(vartssoln(k).ne.zero) ivarts(k)=1 98559599516SKenneth E. Jansen enddo 98659599516SKenneth E. Jansen 98759599516SKenneth E. Jansen! call MPI_REDUCE(vartssoln, vartssolng, ndof*ntspts, 98859599516SKenneth E. Jansen! & MPI_DOUBLE_PRECISION, MPI_SUM, master, 98959599516SKenneth E. Jansen! & MPI_COMM_WORLD, ierr) 99059599516SKenneth E. Jansen 99159599516SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 99259599516SKenneth E. Jansen call MPI_ALLREDUCE(vartssoln, vartssolng, 99359599516SKenneth E. Jansen & ndof*ntspts, 99459599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION, MPI_SUM, 99559599516SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 99659599516SKenneth E. Jansen 99759599516SKenneth E. Jansen! call MPI_REDUCE(ivarts, ivartsg, ndof*ntspts, 99859599516SKenneth E. Jansen! & MPI_INTEGER, MPI_SUM, master, 99959599516SKenneth E. Jansen! & MPI_COMM_WORLD, ierr) 100059599516SKenneth E. Jansen 100159599516SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 100259599516SKenneth E. Jansen call MPI_ALLREDUCE(ivarts, ivartsg, ndof*ntspts, 100359599516SKenneth E. Jansen & MPI_INTEGER, MPI_SUM, 100459599516SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 100559599516SKenneth E. Jansen 100659599516SKenneth E. Jansen! if (myrank.eq.zero) then 100759599516SKenneth E. Jansen do jj = 1, ntspts 100859599516SKenneth E. Jansen 100959599516SKenneth E. Jansen if(myrank .eq. iv_rank(jj)) then 101059599516SKenneth E. Jansen ! No need to update all varts components, only the one treated by the expected rank 101159599516SKenneth E. Jansen ! Note: keep varts as a vector, as multiple probes could be treated by one rank 101259599516SKenneth E. Jansen indxvarts = (jj-1)*ndof 101359599516SKenneth E. Jansen do k=1,ndof 101459599516SKenneth E. Jansen if(ivartsg(indxvarts+k).ne.0) then ! none of the vartssoln(parts) were non zero 101559599516SKenneth E. Jansen varts(jj,k)=vartssolng(indxvarts+k)/ 101659599516SKenneth E. Jansen & ivartsg(indxvarts+k) 101759599516SKenneth E. Jansen endif 101859599516SKenneth E. Jansen enddo 101959599516SKenneth E. Jansen endif !only if myrank eq iv_rank(jj) 102059599516SKenneth E. Jansen enddo 102159599516SKenneth E. Jansen! endif !only on master 102259599516SKenneth E. Jansen endif !only if numpe > 1 102359599516SKenneth E. Jansen 102459599516SKenneth E. Jansen! if (myrank.eq.zero) then 102559599516SKenneth E. Jansen do jj = 1, ntspts 102659599516SKenneth E. Jansen if(myrank .eq. iv_rank(jj)) then 102759599516SKenneth E. Jansen ifile = 1000+jj 102859599516SKenneth E. Jansen write(ifile,555) lstep, (varts(jj,k),k=1,ndof) !Beware of format 555 - check ndof 102959599516SKenneth E. Jansenc call flush(ifile) 103059599516SKenneth E. Jansen if (((irs .ge. 1) .and. 103159599516SKenneth E. Jansen & (mod(lstep, ntout) .eq. 0))) then 103259599516SKenneth E. Jansen close(ifile) 103359599516SKenneth E. Jansen fvarts='varts/varts' 103459599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(jj)) 103559599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(lskeep)) 103659599516SKenneth E. Jansen fvarts=trim(fvarts)//'.dat' 103759599516SKenneth E. Jansen fvarts=trim(fvarts) 103859599516SKenneth E. Jansen open(unit=ifile, file=fvarts, 103959599516SKenneth E. Jansen & position='append') 104059599516SKenneth E. Jansen endif !only when dumping restart 104159599516SKenneth E. Jansen endif 104259599516SKenneth E. Jansen enddo 104359599516SKenneth E. Jansen! endif !only on master 104459599516SKenneth E. Jansen 104559599516SKenneth E. Jansen varts(:,:) = zero ! reset the array for next step 104659599516SKenneth E. Jansen 104759599516SKenneth E. Jansen 104859599516SKenneth E. Jansen!555 format(i6,5(2x,E12.5e2)) 104959599516SKenneth E. Jansen555 format(i6,6(2x,E20.12e2)) !assuming ndof = 6 here 105059599516SKenneth E. Jansen 105159599516SKenneth E. Jansen endif 105259599516SKenneth E. Jansen endif 105359599516SKenneth E. Jansen 105459599516SKenneth E. Jansenc 105559599516SKenneth E. Jansenc.... update and the aerodynamic forces 105659599516SKenneth E. Jansenc 105759599516SKenneth E. Jansen call forces ( yold, ilwork ) 105859599516SKenneth E. Jansen 105959599516SKenneth E. Jansen if((irscale.ge.0).or.(itwmod.gt.0)) 106059599516SKenneth E. Jansen & call getvel (yold, ilwork, iBC, 106159599516SKenneth E. Jansen & nsons, ifath, velbar) 106259599516SKenneth E. Jansen 106359599516SKenneth E. Jansen if((irscale.ge.0).and.(myrank.eq.master)) then 106459599516SKenneth E. Jansen call genscale(yold, x, iper, 106559599516SKenneth E. Jansen & iBC, ifath, velbar, 106659599516SKenneth E. Jansen & nsons) 106759599516SKenneth E. Jansen endif 106859599516SKenneth E. Jansenc 106959599516SKenneth E. Jansenc.... print out results. 107059599516SKenneth E. Jansenc 107159599516SKenneth E. Jansen ntoutv=max(ntout,100) ! velb is not needed so often 107259599516SKenneth E. Jansen if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then 107359599516SKenneth E. Jansen if( (mod(lstep, ntoutv) .eq. 0) .and. 107459599516SKenneth E. Jansen & ((irscale.ge.0).or.(itwmod.gt.0) .or. 107559599516SKenneth E. Jansen & ((nsonmax.eq.1).and.(iLES.gt.0)))) 107659599516SKenneth E. Jansen & call rwvelb ('out ', velbar ,ifail) 107759599516SKenneth E. Jansen endif 107859599516SKenneth E. Jansenc 107959599516SKenneth E. Jansenc.... end of the NSTEP and NTSEQ loops 108059599516SKenneth E. Jansenc 108159599516SKenneth E. Jansen 108259599516SKenneth E. Jansen 108359599516SKenneth E. Jansenc 108459599516SKenneth E. Jansenc.... -------------------> error calculation <----------------- 108559599516SKenneth E. Jansenc 108659599516SKenneth E. Jansen if(ierrcalc.eq.1 .or. ioybar.eq.1) then 108759599516SKenneth E. Jansenc$$$c 108859599516SKenneth E. Jansenc$$$c compute average 108959599516SKenneth E. Jansenc$$$c 109059599516SKenneth E. Jansenc$$$ tfact=one/istep 109159599516SKenneth E. Jansenc$$$ ybar =tfact*yold + (one-tfact)*ybar 109259599516SKenneth E. Jansen 109359599516SKenneth E. Jansenc compute average 109459599516SKenneth E. Jansenc ybar(:,1:3) are average velocity components 109559599516SKenneth E. Jansenc ybar(:,4) is average pressure 109659599516SKenneth E. Jansenc ybar(:,5) is average speed 109759599516SKenneth E. Jansenc ybar(:,6:8) is average of sq. of each vel. component 109859599516SKenneth E. Jansenc ybar(:,9) is average of sq. of pressure 109959599516SKenneth E. Jansenc ybar(:,10:12) is average of cross vel. components : uv, uw and vw 110059599516SKenneth E. Jansenc averaging procedure justified only for identical time step sizes 110159599516SKenneth E. Jansenc ybar(:,13) is average of eddy viscosity 110259599516SKenneth E. Jansenc ybar(:,14:16) is average vorticity components 110359599516SKenneth E. Jansenc ybar(:,17) is average vorticity magnitude 110459599516SKenneth E. Jansenc istep is number of time step 110559599516SKenneth E. Jansenc 110659599516SKenneth E. Jansen icollectybar = 0 110759599516SKenneth E. Jansen if(nphasesincycle.eq.0 .or. 110859599516SKenneth E. Jansen & istep.gt.ncycles_startphaseavg*nstepsincycle) then 110959599516SKenneth E. Jansen icollectybar = 1 111059599516SKenneth E. Jansen if((istep-1).eq.ncycles_startphaseavg*nstepsincycle) 111159599516SKenneth E. Jansen & istepsinybar = 0 ! init. to zero in first cycle in avg. 111259599516SKenneth E. Jansen endif 111359599516SKenneth E. Jansen 111459599516SKenneth E. Jansen if(icollectybar.eq.1) then 111559599516SKenneth E. Jansen istepsinybar = istepsinybar+1 111659599516SKenneth E. Jansen tfact=one/istepsinybar 111759599516SKenneth E. Jansen 111859599516SKenneth E. Jansen if(myrank.eq.master .and. nphasesincycle.ne.0 .and. 111959599516SKenneth E. Jansen & mod((istep-1),nstepsincycle).eq.0) 112059599516SKenneth E. Jansen & write(*,*)'nsamples in phase average:',istepsinybar 112159599516SKenneth E. Jansen 112259599516SKenneth E. Jansenc ybar to contain the averaged ((u,v,w),p)-fields 112359599516SKenneth E. Jansenc and speed average, i.e., sqrt(u^2+v^2+w^2) 112459599516SKenneth E. Jansenc and avg. of sq. terms including 112559599516SKenneth E. Jansenc u^2, v^2, w^2, p^2 and cross terms of uv, uw and vw 112659599516SKenneth E. Jansen 112759599516SKenneth E. Jansen ybar(:,1) = tfact*yold(:,1) + (one-tfact)*ybar(:,1) 112859599516SKenneth E. Jansen ybar(:,2) = tfact*yold(:,2) + (one-tfact)*ybar(:,2) 112959599516SKenneth E. Jansen ybar(:,3) = tfact*yold(:,3) + (one-tfact)*ybar(:,3) 113059599516SKenneth E. Jansen ybar(:,4) = tfact*yold(:,4) + (one-tfact)*ybar(:,4) 113159599516SKenneth E. Jansen ybar(:,5) = tfact*sqrt(yold(:,1)**2+yold(:,2)**2+ 113259599516SKenneth E. Jansen & yold(:,3)**2) + (one-tfact)*ybar(:,5) 113359599516SKenneth E. Jansen ybar(:,6) = tfact*yold(:,1)**2 + 113459599516SKenneth E. Jansen & (one-tfact)*ybar(:,6) 113559599516SKenneth E. Jansen ybar(:,7) = tfact*yold(:,2)**2 + 113659599516SKenneth E. Jansen & (one-tfact)*ybar(:,7) 113759599516SKenneth E. Jansen ybar(:,8) = tfact*yold(:,3)**2 + 113859599516SKenneth E. Jansen & (one-tfact)*ybar(:,8) 113959599516SKenneth E. Jansen ybar(:,9) = tfact*yold(:,4)**2 + 114059599516SKenneth E. Jansen & (one-tfact)*ybar(:,9) 114159599516SKenneth E. Jansen ybar(:,10) = tfact*yold(:,1)*yold(:,2) + !uv 114259599516SKenneth E. Jansen & (one-tfact)*ybar(:,10) 114359599516SKenneth E. Jansen ybar(:,11) = tfact*yold(:,1)*yold(:,3) + !uw 114459599516SKenneth E. Jansen & (one-tfact)*ybar(:,11) 114559599516SKenneth E. Jansen ybar(:,12) = tfact*yold(:,2)*yold(:,3) + !vw 114659599516SKenneth E. Jansen & (one-tfact)*ybar(:,12) 114759599516SKenneth E. Jansen!MR CHANGE 114859599516SKenneth E. Jansen if(nsclr.gt.0) !nut 114959599516SKenneth E. Jansen & ybar(:,13) = tfact*yold(:,6) + (one-tfact)*ybar(:,13) 115059599516SKenneth E. Jansen 115159599516SKenneth E. Jansen if(ivort == 1) then !vorticity 115259599516SKenneth E. Jansen ybar(:,14) = tfact*vorticity(:,1) + 115359599516SKenneth E. Jansen & (one-tfact)*ybar(:,14) 115459599516SKenneth E. Jansen ybar(:,15) = tfact*vorticity(:,2) + 115559599516SKenneth E. Jansen & (one-tfact)*ybar(:,15) 115659599516SKenneth E. Jansen ybar(:,16) = tfact*vorticity(:,3) + 115759599516SKenneth E. Jansen & (one-tfact)*ybar(:,16) 115859599516SKenneth E. Jansen ybar(:,17) = tfact*vorticity(:,4) + 115959599516SKenneth E. Jansen & (one-tfact)*ybar(:,17) 116059599516SKenneth E. Jansen endif 116159599516SKenneth E. Jansen 116259599516SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 116359599516SKenneth E. Jansen wallssVecBar(:,1) = tfact*wallssVec(:,1) 116459599516SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,1) 116559599516SKenneth E. Jansen wallssVecBar(:,2) = tfact*wallssVec(:,2) 116659599516SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,2) 116759599516SKenneth E. Jansen wallssVecBar(:,3) = tfact*wallssVec(:,3) 116859599516SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,3) 116959599516SKenneth E. Jansen endif 117059599516SKenneth E. Jansen!MR CHANGE END 117159599516SKenneth E. Jansen endif 117259599516SKenneth E. Jansenc 117359599516SKenneth E. Jansenc compute phase average 117459599516SKenneth E. Jansenc 117559599516SKenneth E. Jansen if(nphasesincycle.ne.0 .and. 117659599516SKenneth E. Jansen & istep.gt.ncycles_startphaseavg*nstepsincycle) then 117759599516SKenneth E. Jansen 117859599516SKenneth E. Jansenc beginning of cycle is considered as ncycles_startphaseavg*nstepsincycle+1 117959599516SKenneth E. Jansen if((istep-1).eq.ncycles_startphaseavg*nstepsincycle) 118059599516SKenneth E. Jansen & icyclesinavg = 0 ! init. to zero in first cycle in avg. 118159599516SKenneth E. Jansen 118259599516SKenneth E. Jansen ! find number of steps between phases 118359599516SKenneth E. Jansen nstepsbtwphase = nstepsincycle/nphasesincycle ! integer value 118459599516SKenneth E. Jansen if(mod(istep-1,nstepsincycle).eq.0) then 118559599516SKenneth E. Jansen iphase = 1 ! init. to one in beginning of every cycle 118659599516SKenneth E. Jansen icyclesinavg = icyclesinavg + 1 118759599516SKenneth E. Jansen endif 118859599516SKenneth E. Jansen 118959599516SKenneth E. Jansen icollectphase = 0 119059599516SKenneth E. Jansen istepincycle = mod(istep,nstepsincycle) 119159599516SKenneth E. Jansen if(istepincycle.eq.0) istepincycle=nstepsincycle 119259599516SKenneth E. Jansen if(istepincycle.eq.iphase*nstepsbtwphase) then 119359599516SKenneth E. Jansen icollectphase = 1 119459599516SKenneth E. Jansen iphase = iphase+1 ! use 'iphase-1' below 119559599516SKenneth E. Jansen endif 119659599516SKenneth E. Jansen 119759599516SKenneth E. Jansen if(icollectphase.eq.1) then 119859599516SKenneth E. Jansen tfactphase = one/icyclesinavg 119959599516SKenneth E. Jansen 120059599516SKenneth E. Jansen if(myrank.eq.master) then 120159599516SKenneth E. Jansen write(*,*) 'nsamples in phase ',iphase-1,': ', 120259599516SKenneth E. Jansen & icyclesinavg 120359599516SKenneth E. Jansen endif 120459599516SKenneth E. Jansen 120559599516SKenneth E. Jansen yphbar(:,1,iphase-1) = tfactphase*yold(:,1) + 120659599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,1,iphase-1) 120759599516SKenneth E. Jansen yphbar(:,2,iphase-1) = tfactphase*yold(:,2) + 120859599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,2,iphase-1) 120959599516SKenneth E. Jansen yphbar(:,3,iphase-1) = tfactphase*yold(:,3) + 121059599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,3,iphase-1) 121159599516SKenneth E. Jansen yphbar(:,4,iphase-1) = tfactphase*yold(:,4) + 121259599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,4,iphase-1) 121359599516SKenneth E. Jansen yphbar(:,5,iphase-1) = tfactphase*sqrt(yold(:,1)**2 121459599516SKenneth E. Jansen & +yold(:,2)**2+yold(:,3)**2) + 121559599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,5,iphase-1) 121659599516SKenneth E. Jansen!MR CHANGE 121759599516SKenneth E. Jansen yphbar(:,6,iphase-1) = 121859599516SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,1) 121959599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,6,iphase-1) 122059599516SKenneth E. Jansen 122159599516SKenneth E. Jansen yphbar(:,7,iphase-1) = 122259599516SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,2) 122359599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,7,iphase-1) 122459599516SKenneth E. Jansen 122559599516SKenneth E. Jansen yphbar(:,8,iphase-1) = 122659599516SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,3) 122759599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,8,iphase-1) 122859599516SKenneth E. Jansen 122959599516SKenneth E. Jansen yphbar(:,9,iphase-1) = 123059599516SKenneth E. Jansen & tfactphase*yold(:,2)*yold(:,2) 123159599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,9,iphase-1) 123259599516SKenneth E. Jansen 123359599516SKenneth E. Jansen yphbar(:,10,iphase-1) = 123459599516SKenneth E. Jansen & tfactphase*yold(:,2)*yold(:,3) 123559599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,10,iphase-1) 123659599516SKenneth E. Jansen 123759599516SKenneth E. Jansen yphbar(:,11,iphase-1) = 123859599516SKenneth E. Jansen & tfactphase*yold(:,3)*yold(:,3) 123959599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,11,iphase-1) 124059599516SKenneth E. Jansen 124159599516SKenneth E. Jansen if(ivort == 1) then 124259599516SKenneth E. Jansen yphbar(:,12,iphase-1) = 124359599516SKenneth E. Jansen & tfactphase*vorticity(:,1) 124459599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,12,iphase-1) 124559599516SKenneth E. Jansen yphbar(:,13,iphase-1) = 124659599516SKenneth E. Jansen & tfactphase*vorticity(:,2) 124759599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,13,iphase-1) 124859599516SKenneth E. Jansen yphbar(:,14,iphase-1) = 124959599516SKenneth E. Jansen & tfactphase*vorticity(:,3) 125059599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,14,iphase-1) 125159599516SKenneth E. Jansen yphbar(:,15,iphase-1) = 125259599516SKenneth E. Jansen & tfactphase*vorticity(:,4) 125359599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,15,iphase-1) 125459599516SKenneth E. Jansen endif 125559599516SKenneth E. Jansen!MR CHANGE END 125659599516SKenneth E. Jansen endif 125759599516SKenneth E. Jansen endif 125859599516SKenneth E. Jansenc 125959599516SKenneth E. Jansenc compute rms 126059599516SKenneth E. Jansenc 126159599516SKenneth E. Jansen if(icollectybar.eq.1) then 126259599516SKenneth E. Jansen rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2 126359599516SKenneth E. Jansen rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2 126459599516SKenneth E. Jansen rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2 126559599516SKenneth E. Jansen rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2 126659599516SKenneth E. Jansen endif 126759599516SKenneth E. Jansen endif 126832eed141SKenneth E. Jansen 2003 continue ! we get here if stopjob equals lstep and this jumped over 126932eed141SKenneth E. Jansen! the statistics computation because we have no new data to average in 127032eed141SKenneth E. Jansen! rather we are just trying to output the last state that was not already 127132eed141SKenneth E. Jansen! written 127232eed141SKenneth E. Jansenc 127332eed141SKenneth E. Jansenc.... ----------------------> Complete Restart Processing <---------------------- 127432eed141SKenneth E. Jansenc 127532eed141SKenneth E. Jansen! for now it is the same frequency but need to change this 127632eed141SKenneth E. Jansen! soon.... but don't forget to change the field counter in 127732eed141SKenneth E. Jansen! new_interface.cc 127832eed141SKenneth E. Jansen! 127932eed141SKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or. 128032eed141SKenneth E. Jansen & istep.eq.nstep(itseq)) then 128132eed141SKenneth E. Jansen if ((irs .ge. 1) .and. ((mod(lstep, ntout) .ne. 0) .or. 128232eed141SKenneth E. Jansen & (nstp .eq. 0))) then 128332eed141SKenneth E. Jansen if( 128432eed141SKenneth E. Jansen & ((irscale.ge.0).or.(itwmod.gt.0) .or. 128532eed141SKenneth E. Jansen & ((nsonmax.eq.1).and.iLES.gt.0))) 128632eed141SKenneth E. Jansen & call rwvelb ('out ', velbar ,ifail) 128732eed141SKenneth E. Jansen endif 128859599516SKenneth E. Jansen 128932eed141SKenneth E. Jansen lesId = numeqns(1) 129032eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 129132eed141SKenneth E. Jansen if(myrank.eq.0) then 129232eed141SKenneth E. Jansen tcormr1 = TMRC() 129332eed141SKenneth E. Jansen endif 1294efb88323SKenneth E. Jansen if((nsolflow.eq.1).and.(ipresPrjFlag.eq.1)) then 129532eed141SKenneth E. Jansen call saveLesRestart( lesId, aperm , nshg, myrank, lstep, 129632eed141SKenneth E. Jansen & nPermDims ) 129732eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 129832eed141SKenneth E. Jansen if(myrank.eq.0) then 129932eed141SKenneth E. Jansen tcormr2 = TMRC() 130032eed141SKenneth E. Jansen write(6,*) 'call saveLesRestart for projection and'// 130132eed141SKenneth E. Jansen & 'pressure projection vectors', tcormr2-tcormr1 130232eed141SKenneth E. Jansen endif 1303c9a96f21SKenneth E. Jansen endif 130432eed141SKenneth E. Jansen 130532eed141SKenneth E. Jansen if(ierrcalc.eq.1) then 130632eed141SKenneth E. Jansenc 130732eed141SKenneth E. Jansenc.....smooth the error indicators 130832eed141SKenneth E. Jansenc 130932eed141SKenneth E. Jansen do i=1,ierrsmooth 131032eed141SKenneth E. Jansen call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC ) 131132eed141SKenneth E. Jansen end do 131232eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 131332eed141SKenneth E. Jansen if(myrank.eq.0) then 131432eed141SKenneth E. Jansen tcormr1 = TMRC() 131532eed141SKenneth E. Jansen endif 131632eed141SKenneth E. Jansen call write_error(myrank, lstep, nshg, 10, rerr ) 131732eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 131832eed141SKenneth E. Jansen if(myrank.eq.0) then 131932eed141SKenneth E. Jansen tcormr2 = TMRC() 132032eed141SKenneth E. Jansen write(6,*) 'Time to write the error fields to the disks', 132132eed141SKenneth E. Jansen & tcormr2-tcormr1 132232eed141SKenneth E. Jansen endif 132332eed141SKenneth E. Jansen endif ! ierrcalc 132432eed141SKenneth E. Jansen 132532eed141SKenneth E. Jansen if(ioybar.eq.1) then 132632eed141SKenneth E. Jansen if(ivort == 1) then 132732eed141SKenneth E. Jansen call write_field(myrank,'a','ybar',4, 132832eed141SKenneth E. Jansen & ybar,'d',nshg,17,lstep) 132932eed141SKenneth E. Jansen else 133032eed141SKenneth E. Jansen call write_field(myrank,'a','ybar',4, 133132eed141SKenneth E. Jansen & ybar,'d',nshg,13,lstep) 133232eed141SKenneth E. Jansen endif 133332eed141SKenneth E. Jansen 133432eed141SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 133532eed141SKenneth E. Jansen call write_field(myrank,'a','wssbar',6, 133632eed141SKenneth E. Jansen & wallssVecBar,'d',nshg,3,lstep) 133732eed141SKenneth E. Jansen endif 133832eed141SKenneth E. Jansen 133932eed141SKenneth E. Jansen if(nphasesincycle .gt. 0) then 134032eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 134132eed141SKenneth E. Jansen if(myrank.eq.0) then 134232eed141SKenneth E. Jansen tcormr1 = TMRC() 134332eed141SKenneth E. Jansen endif 134432eed141SKenneth E. Jansen do iphase=1,nphasesincycle 134532eed141SKenneth E. Jansen if(ivort == 1) then 134632eed141SKenneth E. Jansen call write_phavg2(myrank,'a','phase_average',13,iphase, 134732eed141SKenneth E. Jansen & nphasesincycle,yphbar(:,:,iphase),'d',nshg,15,lstep) 134832eed141SKenneth E. Jansen else 134932eed141SKenneth E. Jansen call write_phavg2(myrank,'a','phase_average',13,iphase, 135032eed141SKenneth E. Jansen & nphasesincycle,yphbar(:,:,iphase),'d',nshg,11,lstep) 135132eed141SKenneth E. Jansen endif 135232eed141SKenneth E. Jansen end do 135332eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 135432eed141SKenneth E. Jansen if(myrank.eq.0) then 135532eed141SKenneth E. Jansen tcormr2 = TMRC() 135632eed141SKenneth E. Jansen write(6,*) 'write all phase avg to the disks = ', 135732eed141SKenneth E. Jansen & tcormr2-tcormr1 135832eed141SKenneth E. Jansen endif 135932eed141SKenneth E. Jansen endif !nphasesincyle 136032eed141SKenneth E. Jansen endif !ioybar 136132eed141SKenneth E. Jansen 136232eed141SKenneth E. Jansen if ( ( ihessian .eq. 1 ) .and. ( numpe < 2 ) )then 136332eed141SKenneth E. Jansen uhess = zero 136432eed141SKenneth E. Jansen gradu = zero 136532eed141SKenneth E. Jansen tf = zero 136632eed141SKenneth E. Jansen 136732eed141SKenneth E. Jansen do ku=1,nshg 136832eed141SKenneth E. Jansen tf(ku,1) = x(ku,1)**3 136932eed141SKenneth E. Jansen end do 137032eed141SKenneth E. Jansen call hessian( yold, x, shp, shgl, iBC, 137132eed141SKenneth E. Jansen & shpb, shglb, iper, ilwork, uhess, gradu ) 137232eed141SKenneth E. Jansen 137332eed141SKenneth E. Jansen call write_hessian( uhess, gradu, nshg ) 137432eed141SKenneth E. Jansen endif 137532eed141SKenneth E. Jansen 137632eed141SKenneth E. Jansen if(iRANS.lt.0) then 137732eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 137832eed141SKenneth E. Jansen if(myrank.eq.0) then 137932eed141SKenneth E. Jansen tcormr1 = TMRC() 138032eed141SKenneth E. Jansen endif 138132eed141SKenneth E. Jansen call write_field(myrank,'a','dwal',4,d2wall,'d', 138232eed141SKenneth E. Jansen & nshg,1,lstep) 138332eed141SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 138432eed141SKenneth E. Jansen if(myrank.eq.0) then 138532eed141SKenneth E. Jansen tcormr2 = TMRC() 138632eed141SKenneth E. Jansen write(6,*) 'Time to write dwal to the disks = ', 138732eed141SKenneth E. Jansen & tcormr2-tcormr1 138832eed141SKenneth E. Jansen endif 138932eed141SKenneth E. Jansen endif !iRANS 139032eed141SKenneth E. Jansen 139132eed141SKenneth E. Jansen endif ! write out complete restart state 139232eed141SKenneth E. Jansen !next 2 lines are two ways to end early 139332eed141SKenneth E. Jansen if(stopjob.eq.-2) goto 2002 139432eed141SKenneth E. Jansen if(istop.eq.1000) goto 2002 ! stop when delta small (see rstatic) 139559599516SKenneth E. Jansen 2000 continue 139632eed141SKenneth E. Jansen 2002 continue 139732eed141SKenneth E. Jansen 1398f32d06b0SKenneth E. Jansen! done with time stepping so deallocate fields already written 139932eed141SKenneth E. Jansen! 140032eed141SKenneth E. Jansen if(ioybar.eq.1) then 140132eed141SKenneth E. Jansen deallocate(ybar) 140232eed141SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 140332eed141SKenneth E. Jansen deallocate(wallssVecbar) 140432eed141SKenneth E. Jansen endif 140532eed141SKenneth E. Jansen if(nphasesincycle .gt. 0) then 140632eed141SKenneth E. Jansen deallocate(yphbar) 140732eed141SKenneth E. Jansen endif !nphasesincyle 140832eed141SKenneth E. Jansen endif !ioybar 140932eed141SKenneth E. Jansen if(ivort == 1) then 141032eed141SKenneth E. Jansen deallocate(strain,vorticity) 141132eed141SKenneth E. Jansen endif 141232eed141SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 141332eed141SKenneth E. Jansen deallocate(wallssVec) 141432eed141SKenneth E. Jansen endif 141532eed141SKenneth E. Jansen if(iRANS.lt.0) then 141632eed141SKenneth E. Jansen deallocate(d2wall) 141732eed141SKenneth E. Jansen endif 141859599516SKenneth E. Jansen 141959599516SKenneth E. Jansen 142059599516SKenneth E. JansenCAD tcorecp2 = second(0) 142159599516SKenneth E. JansenCAD tcorewc2 = second(-1) 142259599516SKenneth E. Jansen 142359599516SKenneth E. JansenCAD write(6,*) 'T(core) cpu-wallclock = ',tcorecp2-tcorecp1, 142459599516SKenneth E. JansenCAD & tcorewc2-tcorewc1 142559599516SKenneth E. Jansen 142659599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 142759599516SKenneth E. Jansen if(myrank.eq.0) then 142859599516SKenneth E. Jansen tcorecp2 = TMRC() 142959599516SKenneth E. Jansen write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1 143059599516SKenneth E. Jansen write(6,*) '(Elm. form.',tcorecp(1), 143159599516SKenneth E. Jansen & ',Lin. alg. sol.',tcorecp(2),')' 143259599516SKenneth E. Jansen write(6,*) '(Elm. form. Scal.',tcorecpscal(1), 143359599516SKenneth E. Jansen & ',Lin. alg. sol. Scal.',tcorecpscal(2),')' 143459599516SKenneth E. Jansen write(6,*) '' 143559599516SKenneth E. Jansen 143659599516SKenneth E. Jansen endif 143759599516SKenneth E. Jansen 143859599516SKenneth E. Jansen call print_system_stats(tcorecp, tcorecpscal) 143959599516SKenneth E. Jansen call print_mesh_stats() 144059599516SKenneth E. Jansen call print_mpi_stats() 144159599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 144259599516SKenneth E. Jansen! return 144359599516SKenneth E. Jansenc call MPI_Finalize() 144459599516SKenneth E. Jansenc call MPI_ABORT(MPI_COMM_WORLD, ierr) 144559599516SKenneth E. Jansen 144659599516SKenneth E. Jansen 3000 continue 144759599516SKenneth E. Jansen 144859599516SKenneth E. Jansen 144959599516SKenneth E. Jansenc 145059599516SKenneth E. Jansenc.... close history and aerodynamic forces files 145159599516SKenneth E. Jansenc 145259599516SKenneth E. Jansen if (myrank .eq. master) then 145359599516SKenneth E. Jansen! close (ihist) 145459599516SKenneth E. Jansen close (iforce) 145559599516SKenneth E. Jansen close(76) 145659599516SKenneth E. Jansen if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then 145759599516SKenneth E. Jansen close (8177) 145859599516SKenneth E. Jansen endif 145959599516SKenneth E. Jansen endif 146059599516SKenneth E. Jansenc 146159599516SKenneth E. Jansenc.... close varts file for probes 146259599516SKenneth E. Jansenc 146359599516SKenneth E. Jansen if(exts) then 146459599516SKenneth E. Jansen do jj=1,ntspts 146559599516SKenneth E. Jansen if (myrank == iv_rank(jj)) then 146659599516SKenneth E. Jansen close(1000+jj) 146759599516SKenneth E. Jansen endif 146859599516SKenneth E. Jansen enddo 146959599516SKenneth E. Jansen deallocate (ivarts) 147059599516SKenneth E. Jansen deallocate (ivartsg) 147159599516SKenneth E. Jansen deallocate (iv_rank) 147259599516SKenneth E. Jansen deallocate (vartssoln) 147359599516SKenneth E. Jansen deallocate (vartssolng) 147459599516SKenneth E. Jansen endif 147559599516SKenneth E. Jansen 147659599516SKenneth E. Jansen!MR CHANGE 147759599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 147859599516SKenneth E. Jansen if(myrank.eq.0) then 147959599516SKenneth E. Jansen write(*,*) 'itrdrv - done with aerodynamic forces' 148059599516SKenneth E. Jansen endif 148159599516SKenneth E. Jansen!MR CHANGE 148259599516SKenneth E. Jansen 148359599516SKenneth E. Jansen do isrf = 0,MAXSURF 148459599516SKenneth E. Jansen! if ( nsrflist(isrf).ne.0 ) then 148559599516SKenneth E. Jansen if ( nsrflist(isrf).ne.0 .and. 148659599516SKenneth E. Jansen & myrank.eq.irankfilesforce(isrf)) then 148759599516SKenneth E. Jansen iunit=60+isrf 148859599516SKenneth E. Jansen close(iunit) 148959599516SKenneth E. Jansen endif 149059599516SKenneth E. Jansen enddo 149159599516SKenneth E. Jansen 149259599516SKenneth E. Jansen!MR CHANGE 149359599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 149459599516SKenneth E. Jansen if(myrank.eq.0) then 149559599516SKenneth E. Jansen write(*,*) 'itrdrv - done with MAXSURF' 149659599516SKenneth E. Jansen endif 149759599516SKenneth E. Jansen!MR CHANGE 149859599516SKenneth E. Jansen 149959599516SKenneth E. Jansen 150059599516SKenneth E. Jansen 5 format(1X,F15.10,3X,F15.10,3X,F15.10,3X,F15.10) 150159599516SKenneth E. Jansen 444 format(6(2x,e14.7)) 150259599516SKenneth E. Jansenc 150359599516SKenneth E. Jansenc.... end 150459599516SKenneth E. Jansenc 150559599516SKenneth E. Jansen if(nsolflow.eq.1) then 150659599516SKenneth E. Jansen deallocate (lhsK) 150759599516SKenneth E. Jansen deallocate (lhsP) 1508ae8d68e4SKenneth E. Jansen IF (svLSFlag .NE. 1) THEN 150959599516SKenneth E. Jansen deallocate (aperm) 151059599516SKenneth E. Jansen deallocate (atemp) 1511ae8d68e4SKenneth E. Jansen ENDIF 151259599516SKenneth E. Jansen endif 151359599516SKenneth E. Jansen if(nsclrsol.gt.0) then 151459599516SKenneth E. Jansen deallocate (lhsS) 151559599516SKenneth E. Jansen deallocate (apermS) 151659599516SKenneth E. Jansen deallocate (atempS) 151759599516SKenneth E. Jansen endif 151859599516SKenneth E. Jansen 151959599516SKenneth E. Jansen if(iabc==1) deallocate(acs) 152059599516SKenneth E. Jansen 152159599516SKenneth E. Jansen!MR CHANGE 152259599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 152359599516SKenneth E. Jansen if(myrank.eq.0) then 152459599516SKenneth E. Jansen write(*,*) 'itrdrv - done - BACK TO process.f' 152559599516SKenneth E. Jansen endif 152659599516SKenneth E. Jansen!MR CHANGE 152759599516SKenneth E. Jansen 152859599516SKenneth E. Jansen 152959599516SKenneth E. Jansen 153059599516SKenneth E. Jansen return 153159599516SKenneth E. Jansen end 153259599516SKenneth E. Jansen 153359599516SKenneth E. Jansen subroutine lesmodels(y, ac, shgl, shp, 153459599516SKenneth E. Jansen & iper, ilwork, rowp, colm, 153559599516SKenneth E. Jansen & nsons, ifath, x, 153659599516SKenneth E. Jansen & iBC, BC) 153759599516SKenneth E. Jansen 153859599516SKenneth E. Jansen include "common.h" 153959599516SKenneth E. Jansen 154059599516SKenneth E. Jansen real*8 y(nshg,ndof), ac(nshg,ndof), 154159599516SKenneth E. Jansen & x(numnp,nsd), 154259599516SKenneth E. Jansen & BC(nshg,ndofBC) 154359599516SKenneth E. Jansen real*8 shp(MAXTOP,maxsh,MAXQPT), 154459599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT) 154559599516SKenneth E. Jansen 154659599516SKenneth E. Jansenc 154759599516SKenneth E. Jansen integer rowp(nshg,nnz), colm(nshg+1), 154859599516SKenneth E. Jansen & iBC(nshg), 154959599516SKenneth E. Jansen & ilwork(nlwork), 155059599516SKenneth E. Jansen & iper(nshg) 155159599516SKenneth E. Jansen dimension ifath(numnp), nsons(nfath) 155259599516SKenneth E. Jansen 155359599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: fwr2,fwr3,fwr4 155459599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: stabdis,cdelsq1 155559599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: xavegt, xavegt2,xavegt3 155659599516SKenneth E. Jansen 155759599516SKenneth E. Jansen if( (iLES.gt.1) ) then ! Allocate Stuff for advanced LES models 155859599516SKenneth E. Jansen allocate (fwr2(nshg)) 155959599516SKenneth E. Jansen allocate (fwr3(nshg)) 156059599516SKenneth E. Jansen allocate (fwr4(nshg)) 156159599516SKenneth E. Jansen allocate (xavegt(nfath,12)) 156259599516SKenneth E. Jansen allocate (xavegt2(nfath,12)) 156359599516SKenneth E. Jansen allocate (xavegt3(nfath,12)) 156459599516SKenneth E. Jansen allocate (stabdis(nfath)) 156559599516SKenneth E. Jansen endif 156659599516SKenneth E. Jansen 156759599516SKenneth E. Jansenc.... get dynamic model coefficient 156859599516SKenneth E. Jansenc 156959599516SKenneth E. Jansen ilesmod=iLES/10 157059599516SKenneth E. Jansenc 157159599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model 157259599516SKenneth E. Jansenc 157359599516SKenneth E. Jansen if (ilesmod.eq.0) then ! 0 < iLES< 10 => dyn. model calculated 157459599516SKenneth E. Jansen ! at nodes based on discrete filtering 157559599516SKenneth E. Jansen 157659599516SKenneth E. Jansen 157759599516SKenneth E. Jansen if(isubmod.eq.2) then 157859599516SKenneth E. Jansen call SUPGdis(y, ac, shgl, shp, 157959599516SKenneth E. Jansen & iper, ilwork, 158059599516SKenneth E. Jansen & nsons, ifath, x, 158159599516SKenneth E. Jansen & iBC, BC, stabdis, xavegt3) 158259599516SKenneth E. Jansen endif 158359599516SKenneth E. Jansen 158459599516SKenneth E. Jansen if( ((isubmod.eq.0).or.(isubmod.eq.2)))then ! If no 158559599516SKenneth E. Jansen ! sub-model 158659599516SKenneth E. Jansen ! or SUPG 158759599516SKenneth E. Jansen ! model wanted 158859599516SKenneth E. Jansen 158959599516SKenneth E. Jansen if(i2filt.eq.0)then ! If simple filter 159059599516SKenneth E. Jansen 159159599516SKenneth E. Jansen if(modlstats .eq. 0) then ! If no model stats wanted 159259599516SKenneth E. Jansen call getdmc (y, shgl, shp, 159359599516SKenneth E. Jansen & iper, ilwork, nsons, 159459599516SKenneth E. Jansen & ifath, x) 159559599516SKenneth E. Jansen else ! else get model stats 159659599516SKenneth E. Jansen call stdfdmc (y, shgl, shp, 159759599516SKenneth E. Jansen & iper, ilwork, nsons, 159859599516SKenneth E. Jansen & ifath, x) 159959599516SKenneth E. Jansen endif ! end of stats if statement 160059599516SKenneth E. Jansen 160159599516SKenneth E. Jansen else ! else if twice filtering 160259599516SKenneth E. Jansen 160359599516SKenneth E. Jansen call widefdmc(y, shgl, shp, 160459599516SKenneth E. Jansen & iper, ilwork, nsons, 160559599516SKenneth E. Jansen & ifath, x) 160659599516SKenneth E. Jansen 160759599516SKenneth E. Jansen 160859599516SKenneth E. Jansen endif ! end of simple filter if statement 160959599516SKenneth E. Jansen 161059599516SKenneth E. Jansen endif ! end of SUPG or no sub-model if statement 161159599516SKenneth E. Jansen 161259599516SKenneth E. Jansen 161359599516SKenneth E. Jansen if( (isubmod.eq.1) ) then ! If DFWR sub-model wanted 161459599516SKenneth E. Jansen call cdelBHsq (y, shgl, shp, 161559599516SKenneth E. Jansen & iper, ilwork, nsons, 161659599516SKenneth E. Jansen & ifath, x, cdelsq1) 161759599516SKenneth E. Jansen call FiltRat (y, shgl, shp, 161859599516SKenneth E. Jansen & iper, ilwork, nsons, 161959599516SKenneth E. Jansen & ifath, x, cdelsq1, 162059599516SKenneth E. Jansen & fwr4, fwr3) 162159599516SKenneth E. Jansen 162259599516SKenneth E. Jansen 162359599516SKenneth E. Jansen if (i2filt.eq.0) then ! If simple filter wanted 162459599516SKenneth E. Jansen call DFWRsfdmc(y, shgl, shp, 162559599516SKenneth E. Jansen & iper, ilwork, nsons, 162659599516SKenneth E. Jansen & ifath, x, fwr2, fwr3) 162759599516SKenneth E. Jansen else ! else if twice filtering wanted 162859599516SKenneth E. Jansen call DFWRwfdmc(y, shgl, shp, 162959599516SKenneth E. Jansen & iper, ilwork, nsons, 163059599516SKenneth E. Jansen & ifath, x, fwr4, fwr4) 163159599516SKenneth E. Jansen endif ! end of simple filter if statement 163259599516SKenneth E. Jansen 163359599516SKenneth E. Jansen endif ! end of DFWR sub-model if statement 163459599516SKenneth E. Jansen 163559599516SKenneth E. Jansen if( (isubmod.eq.2) )then ! If SUPG sub-model wanted 163659599516SKenneth E. Jansen call dmcSUPG (y, ac, shgl, 163759599516SKenneth E. Jansen & shp, iper, ilwork, 163859599516SKenneth E. Jansen & nsons, ifath, x, 163959599516SKenneth E. Jansen & iBC, BC, rowp, colm, 164059599516SKenneth E. Jansen & xavegt2, stabdis) 164159599516SKenneth E. Jansen endif 164259599516SKenneth E. Jansen 164359599516SKenneth E. Jansen if(idis.eq.1)then ! If SUPG/Model dissipation wanted 164459599516SKenneth E. Jansen call ediss (y, ac, shgl, 164559599516SKenneth E. Jansen & shp, iper, ilwork, 164659599516SKenneth E. Jansen & nsons, ifath, x, 164759599516SKenneth E. Jansen & iBC, BC, xavegt) 164859599516SKenneth E. Jansen endif 164959599516SKenneth E. Jansen 165059599516SKenneth E. Jansen endif ! end of ilesmod 165159599516SKenneth E. Jansen 165259599516SKenneth E. Jansen if (ilesmod .eq. 1) then ! 10 < iLES < 20 => dynamic-mixed 165359599516SKenneth E. Jansen ! at nodes based on discrete filtering 165459599516SKenneth E. Jansen call bardmc (y, shgl, shp, 165559599516SKenneth E. Jansen & iper, ilwork, 165659599516SKenneth E. Jansen & nsons, ifath, x) 165759599516SKenneth E. Jansen endif 165859599516SKenneth E. Jansen 165959599516SKenneth E. Jansen if (ilesmod .eq. 2) then ! 20 < iLES < 30 => dynamic at quad 166059599516SKenneth E. Jansen ! pts based on lumped projection filt. 166159599516SKenneth E. Jansen 166259599516SKenneth E. Jansen if(isubmod.eq.0)then 166359599516SKenneth E. Jansen call projdmc (y, shgl, shp, 166459599516SKenneth E. Jansen & iper, ilwork, x) 166559599516SKenneth E. Jansen else 166659599516SKenneth E. Jansen call cpjdmcnoi (y, shgl, shp, 166759599516SKenneth E. Jansen & iper, ilwork, x, 166859599516SKenneth E. Jansen & rowp, colm, 166959599516SKenneth E. Jansen & iBC, BC) 167059599516SKenneth E. Jansen endif 167159599516SKenneth E. Jansen 167259599516SKenneth E. Jansen endif 167359599516SKenneth E. Jansen 167459599516SKenneth E. Jansen if( (iLES.gt.1) ) then ! Deallocate Stuff for advanced LES models 167559599516SKenneth E. Jansen deallocate (fwr2) 167659599516SKenneth E. Jansen deallocate (fwr3) 167759599516SKenneth E. Jansen deallocate (fwr4) 167859599516SKenneth E. Jansen deallocate (xavegt) 167959599516SKenneth E. Jansen deallocate (xavegt2) 168059599516SKenneth E. Jansen deallocate (xavegt3) 168159599516SKenneth E. Jansen deallocate (stabdis) 168259599516SKenneth E. Jansen endif 168359599516SKenneth E. Jansen return 168459599516SKenneth E. Jansen end 168559599516SKenneth E. Jansen 168659599516SKenneth E. Jansenc 168759599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution 168859599516SKenneth E. Jansenc 168959599516SKenneth E. Jansen subroutine CalcImpConvCoef (numISrfs, numTpoints) 169059599516SKenneth E. Jansen 169159599516SKenneth E. Jansen use convolImpFlow !uses flow history and impedance for convolution 169259599516SKenneth E. Jansen 169359599516SKenneth E. Jansen include "common.h" !for alfi 169459599516SKenneth E. Jansen 169559599516SKenneth E. Jansen integer numISrfs, numTpoints 169659599516SKenneth E. Jansen 169759599516SKenneth E. Jansen allocate (ConvCoef(numTpoints+2,3)) !same time discret. for all imp. BC 169859599516SKenneth E. Jansen do j=1,numTpoints+2 169959599516SKenneth E. Jansen ConvCoef(j,:)=0.5/numTpoints !dt/2 divided by period T=N*dt 170059599516SKenneth E. Jansen ConvCoef(j,1)=ConvCoef(j,1)*(1.0-alfi)*(1.0-alfi) 170159599516SKenneth E. Jansen ConvCoef(j,2)=ConvCoef(j,2)*(1.0+2*alfi*(1.0-alfi)) 170259599516SKenneth E. Jansen ConvCoef(j,3)=ConvCoef(j,3)*alfi*alfi 170359599516SKenneth E. Jansen enddo 170459599516SKenneth E. Jansen ConvCoef(1,2)=zero 170559599516SKenneth E. Jansen ConvCoef(1,3)=zero 170659599516SKenneth E. Jansen ConvCoef(2,3)=zero 170759599516SKenneth E. Jansen ConvCoef(numTpoints+1,1)=zero 170859599516SKenneth E. Jansen ConvCoef(numTpoints+2,2)=zero 170959599516SKenneth E. Jansen ConvCoef(numTpoints+2,1)=zero 171059599516SKenneth E. Jansenc 171159599516SKenneth E. Jansenc...calculate the coefficients for the impedance convolution 171259599516SKenneth E. Jansenc 171359599516SKenneth E. Jansen allocate (ImpConvCoef(numTpoints+2,numISrfs)) 171459599516SKenneth E. Jansen 171559599516SKenneth E. Jansenc..coefficients below assume Q linear in time step, Z constant 171659599516SKenneth E. Jansenc do j=3,numTpoints 171759599516SKenneth E. Jansenc ImpConvCoef(j,:) = ValueListImp(j-1,:)*ConvCoef(j,3) 171859599516SKenneth E. Jansenc & + ValueListImp(j,:)*ConvCoef(j,2) 171959599516SKenneth E. Jansenc & + ValueListImp(j+1,:)*ConvCoef(j,1) 172059599516SKenneth E. Jansenc enddo 172159599516SKenneth E. Jansenc ImpConvCoef(1,:) = ValueListImp(2,:)*ConvCoef(1,1) 172259599516SKenneth E. Jansenc ImpConvCoef(2,:) = ValueListImp(2,:)*ConvCoef(2,2) 172359599516SKenneth E. Jansenc & + ValueListImp(3,:)*ConvCoef(2,1) 172459599516SKenneth E. Jansenc ImpConvCoef(numTpoints+1,:) = 172559599516SKenneth E. Jansenc & ValueListImp(numTpoints,:)*ConvCoef(numTpoints+1,3) 172659599516SKenneth E. Jansenc & + ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+1,2) 172759599516SKenneth E. Jansenc ImpConvCoef(numTpoints+2,:) = 172859599516SKenneth E. Jansenc & ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+2,3) 172959599516SKenneth E. Jansen 173059599516SKenneth E. Jansenc..try easiest convolution Q and Z constant per time step 173159599516SKenneth E. Jansen do j=3,numTpoints+1 173259599516SKenneth E. Jansen ImpConvCoef(j,:) = ValueListImp(j-1,:)/numTpoints 173359599516SKenneth E. Jansen enddo 173459599516SKenneth E. Jansen ImpConvCoef(1,:) =zero 173559599516SKenneth E. Jansen ImpConvCoef(2,:) =zero 173659599516SKenneth E. Jansen ImpConvCoef(numTpoints+2,:) = 173759599516SKenneth E. Jansen & ValueListImp(numTpoints+1,:)/numTpoints 173859599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr() 173959599516SKenneth E. Jansen ImpConvCoef(numTpoints+1,:)= ImpConvCoef(numTpoints+1,:) 174059599516SKenneth E. Jansen & - ImpConvCoef(numTpoints+2,:)*(1.0-alfi)/alfi 174159599516SKenneth E. Jansen ImpConvCoef(numTpoints+2,:)= ImpConvCoef(numTpoints+2,:)/alfi 174259599516SKenneth E. Jansen return 174359599516SKenneth E. Jansen end 174459599516SKenneth E. Jansen 174559599516SKenneth E. Jansenc 174659599516SKenneth E. Jansenc ... update the flow rate history for the impedance convolution, filter it and write it out 174759599516SKenneth E. Jansenc 174859599516SKenneth E. Jansen subroutine UpdHistConv(y,nsrfIdList,numSrfs) 174959599516SKenneth E. Jansen 175059599516SKenneth E. Jansen use convolImpFlow !brings ntimeptpT, QHistImp, QHistTry, QHistTryF, numImpSrfs 175159599516SKenneth E. Jansen use convolRCRFlow !brings QHistRCR, numRCRSrfs 175259599516SKenneth E. Jansen 175359599516SKenneth E. Jansen include "common.h" 175459599516SKenneth E. Jansen 175559599516SKenneth E. Jansen integer nsrfIdList(0:MAXSURF), numSrfs 175659599516SKenneth E. Jansen character*20 fname1 175759599516SKenneth E. Jansen character*10 cname2 175859599516SKenneth E. Jansen character*5 cname 175959599516SKenneth E. Jansen real*8 y(nshg,3) !velocity at time n+1 176059599516SKenneth E. Jansen real*8 NewQ(0:MAXSURF) !temporary unknown for the flow rate 176159599516SKenneth E. Jansen !that needs to be added to the flow history 176259599516SKenneth E. Jansen 176359599516SKenneth E. Jansen call GetFlowQ(NewQ,y,nsrfIdList,numSrfs) !new flow at time n+1 176459599516SKenneth E. Jansenc 176559599516SKenneth E. Jansenc... for imp BC: shift QHist, add new constribution, filter and write out 176659599516SKenneth E. Jansenc 176759599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 176859599516SKenneth E. Jansen do j=1, ntimeptpT 176959599516SKenneth E. Jansen QHistImp(j,1:numSrfs)=QHistImp(j+1,1:numSrfs) 177059599516SKenneth E. Jansen enddo 177159599516SKenneth E. Jansen QHistImp(ntimeptpT+1,1:numSrfs) = NewQ(1:numSrfs) 177259599516SKenneth E. Jansen 177359599516SKenneth E. Jansenc 177459599516SKenneth E. Jansenc....filter the flow rate history 177559599516SKenneth E. Jansenc 177659599516SKenneth E. Jansen cutfreq = 10 !hardcoded cutting frequency of the filter 177759599516SKenneth E. Jansen do j=1, ntimeptpT 177859599516SKenneth E. Jansen QHistTry(j,:)=QHistImp(j+1,:) 177959599516SKenneth E. Jansen enddo 178059599516SKenneth E. Jansen call Filter(QHistTryF,QHistTry,ntimeptpT,Delt(1),cutfreq) 178159599516SKenneth E. Jansenc.... if no filter applied then uncomment next three lines 178259599516SKenneth E. Jansenc do j=1, ntimeptpT 178359599516SKenneth E. Jansenc QHistTryF(j,:)=QHistTry(j,:) 178459599516SKenneth E. Jansenc enddo 178559599516SKenneth E. Jansen 178659599516SKenneth E. Jansenc QHistImp(1,:)=zero ! why do we do this? for beta(1,:) = zero it does not really matters 178759599516SKenneth E. Jansen do j=1, ntimeptpT 178859599516SKenneth E. Jansen QHistImp(j+1,:)=QHistTryF(j,:) 178959599516SKenneth E. Jansen enddo 179059599516SKenneth E. Jansenc 179159599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat 179259599516SKenneth E. Jansenc 179359599516SKenneth E. Jansen if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or. 179459599516SKenneth E. Jansen & (istep .eq. nstep(1)))) .and. 179559599516SKenneth E. Jansen & (myrank .eq. master)) then 179659599516SKenneth E. Jansen open(unit=816, file='Qhistor.dat',status='replace') 179759599516SKenneth E. Jansen write(816,*) ntimeptpT 179859599516SKenneth E. Jansen do j=1,ntimeptpT+1 179959599516SKenneth E. Jansen write(816,*) (QHistImp(j,n),n=1, numSrfs) 180059599516SKenneth E. Jansen enddo 180159599516SKenneth E. Jansen close(816) 180259599516SKenneth E. Jansenc... write out a copy with step number to be able to restart 180359599516SKenneth E. Jansen fname1 = 'Qhistor' 180459599516SKenneth E. Jansen fname1 = trim(fname1)//trim(cname2(lstep))//'.dat' 180559599516SKenneth E. Jansen open(unit=8166,file=trim(fname1),status='unknown') 180659599516SKenneth E. Jansen write(8166,*) ntimeptpT 180759599516SKenneth E. Jansen do j=1,ntimeptpT+1 180859599516SKenneth E. Jansen write(8166,*) (QHistImp(j,n),n=1, numSrfs) 180959599516SKenneth E. Jansen enddo 181059599516SKenneth E. Jansen close(8166) 181159599516SKenneth E. Jansen endif 181259599516SKenneth E. Jansen endif 181359599516SKenneth E. Jansen 181459599516SKenneth E. Jansenc 181559599516SKenneth E. Jansenc... for RCR bc just add the new contribution 181659599516SKenneth E. Jansenc 181759599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 181859599516SKenneth E. Jansen QHistRCR(lstep+1,1:numSrfs) = NewQ(1:numSrfs) 181959599516SKenneth E. Jansenc 182059599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat 182159599516SKenneth E. Jansenc 182259599516SKenneth E. Jansen if ((irs .ge. 1) .and. (myrank .eq. master)) then 182359599516SKenneth E. Jansen if(istep.eq.1) then 182459599516SKenneth E. Jansen open(unit=816,file='Qhistor.dat',status='unknown') 182559599516SKenneth E. Jansen else 182659599516SKenneth E. Jansen open(unit=816,file='Qhistor.dat',position='append') 182759599516SKenneth E. Jansen endif 182859599516SKenneth E. Jansen if(istep.eq.1) then 182959599516SKenneth E. Jansen do j=1,lstep 183059599516SKenneth E. Jansen write(816,*) j, (QHistRCR(j,n),n=1,numSrfs) ! read from file of previous run 183159599516SKenneth E. Jansen enddo 183259599516SKenneth E. Jansen endif 183359599516SKenneth E. Jansen write(816,*) lstep+1, (QHistRCR(lstep+1,n),n=1, numSrfs) 183459599516SKenneth E. Jansen close(816) 183559599516SKenneth E. Jansenc... write out a copy with step number to be able to restart 183659599516SKenneth E. Jansen if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or. 183759599516SKenneth E. Jansen & (istep .eq. nstep(1)))) .and. 183859599516SKenneth E. Jansen & (myrank .eq. master)) then 183959599516SKenneth E. Jansen fname1 = 'Qhistor' 184059599516SKenneth E. Jansen fname1 = trim(fname1)//trim(cname2(lstep))//'.dat' 184159599516SKenneth E. Jansen open(unit=8166,file=trim(fname1),status='unknown') 184259599516SKenneth E. Jansen write(8166,*) lstep+1 184359599516SKenneth E. Jansen do j=1,lstep+1 184459599516SKenneth E. Jansen write(8166,*) (QHistRCR(j,n),n=1, numSrfs) 184559599516SKenneth E. Jansen enddo 184659599516SKenneth E. Jansen close(8166) 184759599516SKenneth E. Jansen endif 184859599516SKenneth E. Jansen endif 184959599516SKenneth E. Jansen endif 185059599516SKenneth E. Jansen 185159599516SKenneth E. Jansen return 185259599516SKenneth E. Jansen end 185359599516SKenneth E. Jansen 185459599516SKenneth E. Jansenc 185559599516SKenneth E. Jansenc...calculate the time varying coefficients for the RCR convolution 185659599516SKenneth E. Jansenc 185759599516SKenneth E. Jansen subroutine CalcRCRConvCoef (stepn, numSrfs) 185859599516SKenneth E. Jansen 185959599516SKenneth E. Jansen use convolRCRFlow !brings in ValueListRCR, dtRCR 186059599516SKenneth E. Jansen 186159599516SKenneth E. Jansen include "common.h" !brings alfi 186259599516SKenneth E. Jansen 186359599516SKenneth E. Jansen integer numSrfs, stepn 186459599516SKenneth E. Jansen 186559599516SKenneth E. Jansen RCRConvCoef = zero 186659599516SKenneth E. Jansen if (stepn .eq. 0) then 186759599516SKenneth E. Jansen RCRConvCoef(1,:) = ValueListRCR(1,:)*(1.0-alfi) + 186859599516SKenneth E. Jansen & ValueListRCR(3,:)*(-alfi + 1.0 + 1/dtRCR(:) 186959599516SKenneth E. Jansen & - exp(-alfi*dtRCR(:))*(1 + 1/dtRCR(:))) 187059599516SKenneth E. Jansen RCRConvCoef(2,:) = ValueListRCR(1,:)*alfi 187159599516SKenneth E. Jansen & + ValueListRCR(3,:) 187259599516SKenneth E. Jansen & *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:)) 187359599516SKenneth E. Jansen endif 187459599516SKenneth E. Jansen if (stepn .ge. 1) then 187559599516SKenneth E. Jansen RCRConvCoef(1,:) =-ValueListRCR(3,:)*exp(-dtRCR(:)*(stepn+alfi)) 187659599516SKenneth E. Jansen & *(1 + (1 - exp(dtRCR(:)))/dtRCR(:)) 187759599516SKenneth E. Jansen RCRConvCoef(stepn+1,:) = ValueListRCR(1,:)*(1-alfi) 187859599516SKenneth E. Jansen & - ValueListRCR(3,:)*(alfi - 1 - 1/dtRCR(:) 187959599516SKenneth E. Jansen & + exp(-alfi*dtRCR(:))/dtRCR(:)*(2 - exp(-dtRCR(:)))) 188059599516SKenneth E. Jansen RCRConvCoef(stepn+2,:) = ValueListRCR(1,:)*alfi 188159599516SKenneth E. Jansen & + ValueListRCR(3,:) 188259599516SKenneth E. Jansen & *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:)) 188359599516SKenneth E. Jansen endif 188459599516SKenneth E. Jansen if (stepn .ge. 2) then 188559599516SKenneth E. Jansen do j=2,stepn 188659599516SKenneth E. Jansen RCRConvCoef(j,:) = ValueListRCR(3,:)/dtRCR(:)* 188759599516SKenneth E. Jansen & exp(-dtRCR(:)*(stepn + alfi + 2 - j))* 188859599516SKenneth E. Jansen & (1 - exp(dtRCR(:)))**2 188959599516SKenneth E. Jansen enddo 189059599516SKenneth E. Jansen endif 189159599516SKenneth E. Jansen 189259599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr() 189359599516SKenneth E. Jansen RCRConvCoef(stepn+1,:)= RCRConvCoef(stepn+1,:) 189459599516SKenneth E. Jansen & - RCRConvCoef(stepn+2,:)*(1.0-alfi)/alfi 189559599516SKenneth E. Jansen RCRConvCoef(stepn+2,:)= RCRConvCoef(stepn+2,:)/alfi 189659599516SKenneth E. Jansen 189759599516SKenneth E. Jansen return 189859599516SKenneth E. Jansen end 189959599516SKenneth E. Jansen 190059599516SKenneth E. Jansenc 190159599516SKenneth E. Jansenc...calculate the time dependent H operator for the RCR convolution 190259599516SKenneth E. Jansenc 190359599516SKenneth E. Jansen subroutine CalcHopRCR (timestepRCR, stepn, numSrfs) 190459599516SKenneth E. Jansen 190559599516SKenneth E. Jansen use convolRCRFlow !brings in HopRCR, dtRCR 190659599516SKenneth E. Jansen 190759599516SKenneth E. Jansen include "common.h" 190859599516SKenneth E. Jansen 190959599516SKenneth E. Jansen integer numSrfs, stepn 191059599516SKenneth E. Jansen real*8 PdistCur(0:MAXSURF), timestepRCR 191159599516SKenneth E. Jansen 191259599516SKenneth E. Jansen HopRCR=zero 191359599516SKenneth E. Jansen call RCRint(timestepRCR*(stepn + alfi),PdistCur) 191459599516SKenneth E. Jansen HopRCR(1:numSrfs) = RCRic(1:numSrfs) 191559599516SKenneth E. Jansen & *exp(-dtRCR(1:numSrfs)*(stepn + alfi)) + PdistCur(1:numSrfs) 191659599516SKenneth E. Jansen return 191759599516SKenneth E. Jansen end 191859599516SKenneth E. Jansenc 191959599516SKenneth E. Jansenc ... initialize the influence of the initial conditions for the RCR BC 192059599516SKenneth E. Jansenc 192159599516SKenneth E. Jansen subroutine calcRCRic(y,srfIdList,numSrfs) 192259599516SKenneth E. Jansen 192359599516SKenneth E. Jansen use convolRCRFlow !brings RCRic, ValueListRCR, ValuePdist 192459599516SKenneth E. Jansen 192559599516SKenneth E. Jansen include "common.h" 192659599516SKenneth E. Jansen 192759599516SKenneth E. Jansen integer srfIdList(0:MAXSURF), numSrfs, irankCoupled 192859599516SKenneth E. Jansen real*8 y(nshg,4) !need velocity and pressure 192959599516SKenneth E. Jansen real*8 Qini(0:MAXSURF) !initial flow rate 193059599516SKenneth E. Jansen real*8 PdistIni(0:MAXSURF) !initial distal pressure 193159599516SKenneth E. Jansen real*8 Pini(0:MAXSURF),CoupleArea(0:MAXSURF) ! initial pressure 193259599516SKenneth E. Jansen real*8 VelOnly(nshg,3), POnly(nshg) 193359599516SKenneth E. Jansen 193459599516SKenneth E. Jansen allocate (RCRic(0:MAXSURF)) 193559599516SKenneth E. Jansen 193659599516SKenneth E. Jansen if(lstep.eq.0) then 193759599516SKenneth E. Jansen VelOnly(:,1:3)=y(:,1:3) 193859599516SKenneth E. Jansen call GetFlowQ(Qini,VelOnly,srfIdList,numSrfs) !get initial flow 193959599516SKenneth E. Jansen QHistRCR(1,1:numSrfs)=Qini(1:numSrfs) !initialize QHistRCR 194059599516SKenneth E. Jansen POnly(:)=y(:,4) ! pressure 194159599516SKenneth E. Jansen call integrScalar(Pini,POnly,srfIdList,numSrfs) !get initial pressure integral 194259599516SKenneth E. Jansen POnly(:)=one ! one to get area 194359599516SKenneth E. Jansen call integrScalar(CoupleArea,POnly,srfIdList,numSrfs) !get surf area 194459599516SKenneth E. Jansen Pini(1:numSrfs) = Pini(1:numSrfs)/CoupleArea(1:numSrfs) 194559599516SKenneth E. Jansen else 194659599516SKenneth E. Jansen Qini(1:numSrfs)=QHistRCR(1,1:numSrfs) 194759599516SKenneth E. Jansen Pini(1:numSrfs)=zero ! hack 194859599516SKenneth E. Jansen endif 194959599516SKenneth E. Jansen call RCRint(istep,PdistIni) !get initial distal P (use istep) 195059599516SKenneth E. Jansen RCRic(1:numSrfs) = Pini(1:numSrfs) 195159599516SKenneth E. Jansen & - ValueListRCR(1,:)*Qini(1:numSrfs)-PdistIni(1:numSrfs) 195259599516SKenneth E. Jansen return 195359599516SKenneth E. Jansen end 195459599516SKenneth E. Jansen 195559599516SKenneth E. Jansenc.........function that integrates a scalar over a boundary 195659599516SKenneth E. Jansen subroutine integrScalar(scalInt,scal,srfIdList,numSrfs) 195759599516SKenneth E. Jansen 195859599516SKenneth E. Jansen use pvsQbi !brings ndsurf, NASC 195959599516SKenneth E. Jansen 196059599516SKenneth E. Jansen include "common.h" 196159599516SKenneth E. Jansen include "mpif.h" 196259599516SKenneth E. Jansen 196359599516SKenneth E. Jansen integer srfIdList(0:MAXSURF), numSrfs, irankCoupled, i, k 196459599516SKenneth E. Jansen real*8 scal(nshg), scalInt(0:MAXSURF), scalIntProc(0:MAXSURF) 196559599516SKenneth E. Jansen 196659599516SKenneth E. Jansen scalIntProc = zero 196759599516SKenneth E. Jansen do i = 1,nshg 196859599516SKenneth E. Jansen if(numSrfs.gt.zero) then 196959599516SKenneth E. Jansen do k = 1,numSrfs 197059599516SKenneth E. Jansen irankCoupled = 0 197159599516SKenneth E. Jansen if (srfIdList(k).eq.ndsurf(i)) then 197259599516SKenneth E. Jansen irankCoupled=k 197359599516SKenneth E. Jansen scalIntProc(irankCoupled) = scalIntProc(irankCoupled) 197459599516SKenneth E. Jansen & + NASC(i)*scal(i) 197559599516SKenneth E. Jansen exit 197659599516SKenneth E. Jansen endif 197759599516SKenneth E. Jansen enddo 197859599516SKenneth E. Jansen endif 197959599516SKenneth E. Jansen enddo 198059599516SKenneth E. Jansenc 198159599516SKenneth E. Jansenc at this point, each scalint has its "nodes" contributions to the scalar 198259599516SKenneth E. Jansenc accumulated into scalIntProc. Note, because NASC is on processor this 198359599516SKenneth E. Jansenc will NOT be the scalar for the surface yet 198459599516SKenneth E. Jansenc 198559599516SKenneth E. Jansenc.... reduce integrated scalar for each surface, push on scalInt 198659599516SKenneth E. Jansenc 198759599516SKenneth E. Jansen npars=MAXSURF+1 198859599516SKenneth E. Jansen call MPI_ALLREDUCE (scalIntProc, scalInt(:), npars, 198959599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 199059599516SKenneth E. Jansen 199159599516SKenneth E. Jansen return 199259599516SKenneth E. Jansen end 199359599516SKenneth E. Jansen 19949071d3baSCameron Smith subroutine writeTimingMessage(key,iomode,timing) 19959071d3baSCameron Smith use iso_c_binding 19969071d3baSCameron Smith use phstr 19979071d3baSCameron Smith implicit none 199859599516SKenneth E. Jansen 19999071d3baSCameron Smith character(len=*) :: key 20009071d3baSCameron Smith integer :: iomode 20019071d3baSCameron Smith real*8 :: timing 2002da7d5714SCameron Smith character(len=1024) :: timing_msg 200389625e43SCameron Smith character(len=*), parameter :: 200489625e43SCameron Smith & streamModeString = c_char_"stream"//c_null_char, 200589625e43SCameron Smith & fileModeString = c_char_"disk"//c_null_char 200659599516SKenneth E. Jansen 2007da7d5714SCameron Smith timing_msg = c_char_"Time to write "//c_null_char 20089071d3baSCameron Smith call phstr_appendStr(timing_msg,key) 20099071d3baSCameron Smith if ( iomode .eq. -1 ) then 20109071d3baSCameron Smith call phstr_appendStr(timing_msg, streamModeString) 20119071d3baSCameron Smith else 20129071d3baSCameron Smith call phstr_appendStr(timing_msg, fileModeString) 20139071d3baSCameron Smith endif 20149071d3baSCameron Smith call phstr_appendStr(timing_msg, c_char_' = '//c_null_char) 20159071d3baSCameron Smith call phstr_appendDbl(timing_msg, timing) 2016da7d5714SCameron Smith write(6,*) trim(timing_msg) 20179071d3baSCameron Smith return 20189071d3baSCameron Smith end subroutine 201959599516SKenneth E. Jansen 2020