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