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 use turbsa ! used to access d2wall 35*75f1c48cSCameron Smith use wallData 36ec121c45SKenneth E. Jansen use fncorpmod 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" 44bd36043dSBen Matthews#ifdef HAVE_SVLS 45ae8d68e4SKenneth E. Jansen include "svLS.h" 46bd36043dSBen Matthews#endif 4779f1763eSKenneth E. Jansen#if !defined(HAVE_SVLS) && !defined(HAVE_LESLIB) 4879f1763eSKenneth E. Jansen#error "You must enable a linear solver during cmake setup" 49bd36043dSBen Matthews#endif 50bd36043dSBen Matthews 5159599516SKenneth E. Jansenc 5259599516SKenneth E. Jansen 5359599516SKenneth E. Jansen 5459599516SKenneth E. Jansen real*8 y(nshg,ndof), ac(nshg,ndof), 5559599516SKenneth E. Jansen & yold(nshg,ndof), acold(nshg,ndof), 5659599516SKenneth E. Jansen & u(nshg,nsd), uold(nshg,nsd), 5759599516SKenneth E. Jansen & x(numnp,nsd), solinc(nshg,ndof), 5859599516SKenneth E. Jansen & BC(nshg,ndofBC), tf(nshg,ndof), 5959599516SKenneth E. Jansen & GradV(nshg,nsdsq) 6059599516SKenneth E. Jansen 6159599516SKenneth E. Jansenc 6259599516SKenneth E. Jansen real*8 res(nshg,ndof) 6359599516SKenneth E. Jansenc 6459599516SKenneth E. Jansen real*8 shp(MAXTOP,maxsh,MAXQPT), 6559599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 6659599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 6759599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 6859599516SKenneth E. Jansenc 6959599516SKenneth E. Jansen integer rowp(nshg,nnz), colm(nshg+1), 7059599516SKenneth E. Jansen & iBC(nshg), 7159599516SKenneth E. Jansen & ilwork(nlwork), 7259599516SKenneth E. Jansen & iper(nshg), ifuncs(6) 7359599516SKenneth E. Jansen 7459599516SKenneth E. Jansen real*8 vbc_prof(nshg,3) 7559599516SKenneth E. Jansen 7659599516SKenneth E. Jansen integer stopjob 7759599516SKenneth E. Jansen character*10 cname2 7859599516SKenneth E. Jansen character*5 cname 7959599516SKenneth E. Jansenc 8059599516SKenneth E. Jansenc stuff for dynamic model s.w.avg and wall model 8159599516SKenneth E. Jansenc 8259599516SKenneth E. Jansen dimension ifath(numnp), velbar(nfath,ndof), nsons(nfath) 8359599516SKenneth E. Jansen 8459599516SKenneth E. Jansen dimension wallubar(2),walltot(2) 8559599516SKenneth E. Jansenc 86ae8d68e4SKenneth E. Jansenc.... For linear solver Library 8759599516SKenneth E. Jansenc 8859599516SKenneth E. Jansen integer eqnType, prjFlag, presPrjFlag, verbose 8959599516SKenneth E. Jansenc 9059599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: aperm, atemp, atempS 9159599516SKenneth E. Jansen real*8, allocatable, dimension(:,:,:) :: apermS 9259599516SKenneth E. Jansen 9359599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: lhsP, lhsK, lhsS 9459599516SKenneth E. Jansen real*8 almit, alfit, gamit 9559599516SKenneth E. Jansenc 9659599516SKenneth E. Jansen character*1024 servername 9759599516SKenneth E. Jansen character*20 fname1,fmt1 9859599516SKenneth E. Jansen character*20 fname2,fmt2 9959599516SKenneth E. Jansen character*60 fnamepold, fvarts 10059599516SKenneth E. Jansen character*4 fname4c ! 4 characters 10159599516SKenneth E. Jansen integer iarray(50) ! integers for headers 10259599516SKenneth E. Jansen integer isgn(ndof), isgng(ndof) 10359599516SKenneth E. Jansen 10459599516SKenneth E. Jansen!MR CHANGE 10559599516SKenneth E. Jansen! real*8 rerr(nshg,10), ybar(nshg,13) ! including 7 sq. terms with 3 cross terms of uv, uw and vw 10659599516SKenneth E. Jansen! real*8 rerr(nshg,10), ybar(nshg,12) ! including 7 sq. terms with 3 cross terms of uv, uw and vw 10759599516SKenneth E. Jansen real*8 rerr(nshg,10) 10859599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: ybar, strain, vorticity 10959599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: wallssVec, wallssVecbar 11059599516SKenneth E. Jansen!MR CHANGE 11159599516SKenneth E. Jansen 11259599516SKenneth E. Jansen real*8 tcorecp(2), tcorecpscal(2) 11359599516SKenneth E. Jansen 11459599516SKenneth E. Jansen integer, allocatable, dimension(:) :: ivarts 11559599516SKenneth E. Jansen integer, allocatable, dimension(:) :: ivartsg 11659599516SKenneth E. Jansen integer, allocatable, dimension(:) :: iv_rank 11759599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: vartssoln 11859599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: vartssolng 11959599516SKenneth E. Jansen real*8, allocatable, dimension(:,:,:) :: yphbar 12059599516SKenneth E. Jansen real*8 CFLworst(numel) 12159599516SKenneth E. Jansen 12259599516SKenneth E. Jansen!MR CHANGE 12359599516SKenneth E. Jansen integer :: iv_rankpernode, iv_totnodes, iv_totcores 12459599516SKenneth E. Jansen integer :: iv_node, iv_core, iv_thread 12559599516SKenneth E. Jansen!MR CHANGE 126ae8d68e4SKenneth E. Jansen!-------------------------------------------------------------------- 127ae8d68e4SKenneth E. Jansen! Setting up svLS 128bd36043dSBen Matthews#ifdef HAVE_SVLS 129ae8d68e4SKenneth E. Jansen INTEGER svLS_nFaces, gnNo, nNo, faIn, facenNo 130ec121c45SKenneth E. Jansen INTEGER, ALLOCATABLE :: gNodes(:) 131ae8d68e4SKenneth E. Jansen REAL*8, ALLOCATABLE :: sV(:,:) 132ae8d68e4SKenneth E. Jansen 133ae8d68e4SKenneth E. Jansen TYPE(svLS_commuType) communicator 134ae8d68e4SKenneth E. Jansen TYPE(svLS_lhsType) svLS_lhs 135ae8d68e4SKenneth E. Jansen TYPE(svLS_lsType) svLS_ls 136ec121c45SKenneth E. Jansen! repeat for scalar solves (up to 4 at this time which is consistent with rest of PHASTA) 137daa97cf2SKenneth E. Jansen TYPE(svLS_commuType) communicator_S(4) 138daa97cf2SKenneth E. Jansen TYPE(svLS_lhsType) svLS_lhs_S(4) 139daa97cf2SKenneth E. Jansen TYPE(svLS_lsType) svLS_ls_S(4) 140bd36043dSBen Matthews#endif 14159599516SKenneth E. Jansen 14259599516SKenneth E. Jansen impistat = 0 14359599516SKenneth E. Jansen impistat2 = 0 14459599516SKenneth E. Jansen iISend = 0 14559599516SKenneth E. Jansen iISendScal = 0 14659599516SKenneth E. Jansen iIRecv = 0 14759599516SKenneth E. Jansen iIRecvScal = 0 14859599516SKenneth E. Jansen iWaitAll = 0 14959599516SKenneth E. Jansen iWaitAllScal = 0 15059599516SKenneth E. Jansen iAllR = 0 15159599516SKenneth E. Jansen iAllRScal = 0 15259599516SKenneth E. Jansen rISend = zero 15359599516SKenneth E. Jansen rISendScal = zero 15459599516SKenneth E. Jansen rIRecv = zero 15559599516SKenneth E. Jansen rIRecvScal = zero 15659599516SKenneth E. Jansen rWaitAll = zero 15759599516SKenneth E. Jansen rWaitAllScal = zero 15859599516SKenneth E. Jansen rAllR = zero 15959599516SKenneth E. Jansen rAllRScal = zero 16059599516SKenneth E. Jansen rCommu = zero 16159599516SKenneth E. Jansen rCommuScal = zero 16259599516SKenneth E. Jansen 16359599516SKenneth E. Jansen call initmemstat() 16459599516SKenneth E. Jansen 16559599516SKenneth E. Jansenc 16659599516SKenneth E. Jansenc hack SA variable 16759599516SKenneth E. Jansenc 16859599516SKenneth E. JansencHack BC(:,7)=BC(:,7)*0.001 16959599516SKenneth E. JansencHack if(lstep.eq.0) y(:,6)=y(:,6)*0.001 170ae8d68e4SKenneth E. Jansen!-------------------------------------------------------------------- 171436818eeSKenneth E. Jansen! Setting up svLS Moved down for better org 172ae8d68e4SKenneth E. Jansen 17379f1763eSKenneth E. Jansen#ifdef HAVE_LESLIB 17479f1763eSKenneth E. Jansen! IF (svLSFlag .EQ. 0) THEN !When we get a PETSc option it also could block this or a positive leslib 17559599516SKenneth E. Jansen call SolverLicenseServer(servername) 17679f1763eSKenneth E. Jansen! ENDIF 177bd36043dSBen Matthews#endif 17859599516SKenneth E. Jansenc 17959599516SKenneth E. Jansenc only master should be verbose 18059599516SKenneth E. Jansenc 18159599516SKenneth E. Jansen 18259599516SKenneth E. Jansen if(numpe.gt.0 .and. myrank.ne.master)iverbose=0 18359599516SKenneth E. Jansenc 18459599516SKenneth E. Jansen 18559599516SKenneth E. Jansen lskeep=lstep 18659599516SKenneth E. Jansen 18759599516SKenneth E. Jansen inquire(file='xyzts.dat',exist=exts) 18859599516SKenneth E. Jansen if(exts) then 18959599516SKenneth E. Jansen 19059599516SKenneth E. Jansen open(unit=626,file='xyzts.dat',status='old') 19159599516SKenneth E. Jansen read(626,*) ntspts, freq, tolpt, iterat, varcod 19259599516SKenneth E. Jansen call sTD ! sets data structures 19359599516SKenneth E. Jansen 19459599516SKenneth E. Jansen do jj=1,ntspts ! read coordinate data where solution desired 19559599516SKenneth E. Jansen read(626,*) ptts(jj,1),ptts(jj,2),ptts(jj,3) 19659599516SKenneth E. Jansen enddo 19759599516SKenneth E. Jansen close(626) 19859599516SKenneth E. Jansen 19959599516SKenneth E. Jansen statptts(:,:) = 0 20059599516SKenneth E. Jansen parptts(:,:) = zero 20159599516SKenneth E. Jansen varts(:,:) = zero 20259599516SKenneth E. Jansen 20359599516SKenneth E. Jansen allocate (ivarts(ntspts*ndof)) 20459599516SKenneth E. Jansen allocate (ivartsg(ntspts*ndof)) 20559599516SKenneth E. Jansen allocate (iv_rank(ntspts)) 20659599516SKenneth E. Jansen allocate (vartssoln(ntspts*ndof)) 20759599516SKenneth E. Jansen allocate (vartssolng(ntspts*ndof)) 20859599516SKenneth E. Jansen 20959599516SKenneth E. Jansen iv_rankpernode = iv_rankpercore*iv_corepernode 21059599516SKenneth E. Jansen iv_totnodes = numpe/iv_rankpernode 21159599516SKenneth E. Jansen iv_totcores = iv_corepernode*iv_totnodes 21259599516SKenneth E. Jansen if (myrank .eq. 0) then 21359599516SKenneth E. Jansen write(*,*) 'Info for probes:' 21459599516SKenneth E. Jansen write(*,*) ' Ranks per core:',iv_rankpercore 21559599516SKenneth E. Jansen write(*,*) ' Cores per node:',iv_corepernode 21659599516SKenneth E. Jansen write(*,*) ' Ranks per node:',iv_rankpernode 21759599516SKenneth E. Jansen write(*,*) ' Total number of nodes:',iv_totnodes 21859599516SKenneth E. Jansen write(*,*) ' Total number of cores',iv_totcores 21959599516SKenneth E. Jansen endif 22059599516SKenneth E. Jansen 22159599516SKenneth E. Jansen! if (myrank .eq. numpe-1) then 22259599516SKenneth E. Jansen do jj=1,ntspts 22359599516SKenneth E. Jansen 22459599516SKenneth E. Jansen ! Compute the adequate rank which will take care of probe jj 22559599516SKenneth E. Jansen jjm1 = jj-1 22659599516SKenneth E. Jansen iv_node = (iv_totnodes-1)-mod(jjm1,iv_totnodes) 22759599516SKenneth E. Jansen iv_core = (iv_corepernode-1) - mod((jjm1 - 22859599516SKenneth E. Jansen & mod(jjm1,iv_totnodes))/iv_totnodes,iv_corepernode) 22959599516SKenneth E. Jansen iv_thread = (iv_rankpercore-1) - mod((jjm1- 23059599516SKenneth E. Jansen & (mod(jjm1,iv_totcores)))/iv_totcores,iv_rankpercore) 23159599516SKenneth E. Jansen iv_rank(jj) = iv_node*iv_rankpernode 23259599516SKenneth E. Jansen & + iv_core*iv_rankpercore 23359599516SKenneth E. Jansen & + iv_thread 23459599516SKenneth E. Jansen 23559599516SKenneth E. Jansen if(myrank == 0) then 23659599516SKenneth E. Jansen write(*,*) ' Probe', jj, 'handled by rank', 23759599516SKenneth E. Jansen & iv_rank(jj), ' on node', iv_node 23859599516SKenneth E. Jansen endif 23959599516SKenneth E. Jansen 24059599516SKenneth E. Jansen ! Verification just in case 24159599516SKenneth E. Jansen if(iv_rank(jj) .lt.0 .or. iv_rank(jj) .ge. numpe) then 24259599516SKenneth E. Jansen write(*,*) 'WARNING: iv_rank(',jj,') is ', iv_rank(jj), 24359599516SKenneth E. Jansen & ' and reset to numpe-1' 24459599516SKenneth E. Jansen iv_rank(jj) = numpe-1 24559599516SKenneth E. Jansen endif 24659599516SKenneth E. Jansen 24759599516SKenneth E. Jansen ! Open the varts files 24859599516SKenneth E. Jansen if(myrank == iv_rank(jj)) then 24959599516SKenneth E. Jansen fvarts='varts/varts' 25059599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(jj)) 25159599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(lstep)) 25259599516SKenneth E. Jansen fvarts=trim(fvarts)//'.dat' 25359599516SKenneth E. Jansen fvarts=trim(fvarts) 25459599516SKenneth E. Jansen open(unit=1000+jj, file=fvarts, status='unknown') 25559599516SKenneth E. Jansen endif 25659599516SKenneth E. Jansen enddo 25759599516SKenneth E. Jansen! endif 25859599516SKenneth E. Jansen 25959599516SKenneth E. Jansen endif 26059599516SKenneth E. Jansenc 26159599516SKenneth E. Jansenc.... open history and aerodynamic forces files 26259599516SKenneth E. Jansenc 26359599516SKenneth E. Jansen if (myrank .eq. master) then 264c9a96f21SKenneth E. Jansen open (unit=ihist, file=fhist, status='unknown') 26559599516SKenneth E. Jansen open (unit=iforce, file=fforce, status='unknown') 26659599516SKenneth E. Jansen open (unit=76, file="fort.76", status='unknown') 26759599516SKenneth E. Jansen if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then 26859599516SKenneth E. Jansen fnamepold = 'pold' 26959599516SKenneth E. Jansen fnamepold = trim(fnamepold)//trim(cname2(lstep)) 27059599516SKenneth E. Jansen fnamepold = trim(fnamepold)//'.dat' 27159599516SKenneth E. Jansen fnamepold = trim(fnamepold) 27259599516SKenneth E. Jansen open (unit=8177, file=fnamepold, status='unknown') 27359599516SKenneth E. Jansen endif 27459599516SKenneth E. Jansen endif 27559599516SKenneth E. Jansenc 27659599516SKenneth E. Jansenc.... initialize 27759599516SKenneth E. Jansenc 27859599516SKenneth E. Jansen ifuncs(:) = 0 ! func. evaluation counter 27959599516SKenneth E. Jansen istep = 0 28059599516SKenneth E. Jansen yold = y 28159599516SKenneth E. Jansen acold = ac 28259599516SKenneth E. Jansen 28359599516SKenneth E. Jansen rerr = zero 28459599516SKenneth E. Jansen 28559599516SKenneth E. Jansen if(ierrcalc.eq.1 .or. ioybar.eq.1) then ! we need ybar for error too 28659599516SKenneth E. Jansen if (ivort == 1) then 28759599516SKenneth E. Jansen allocate(ybar(nshg,17)) ! more space for vorticity if requested 28859599516SKenneth E. Jansen else 28959599516SKenneth E. Jansen allocate(ybar(nshg,13)) 29059599516SKenneth E. Jansen endif 29159599516SKenneth E. Jansen ybar = zero ! Initialize ybar to zero, which is essential 29259599516SKenneth E. Jansen endif 29359599516SKenneth E. Jansen 29459599516SKenneth E. Jansen if(ivort == 1) then 29559599516SKenneth E. Jansen allocate(strain(nshg,6)) 29659599516SKenneth E. Jansen allocate(vorticity(nshg,5)) 29759599516SKenneth E. Jansen endif 29859599516SKenneth E. Jansen 29959599516SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 30059599516SKenneth E. Jansen allocate(wallssVec(nshg,3)) 30159599516SKenneth E. Jansen if (ioybar .eq. 1) then 30259599516SKenneth E. Jansen allocate(wallssVecbar(nshg,3)) 30359599516SKenneth E. Jansen wallssVecbar = zero ! Initialization important if mean wss computed 30459599516SKenneth E. Jansen endif 30559599516SKenneth E. Jansen endif 30659599516SKenneth E. Jansen 30759599516SKenneth E. Jansen! both nstepsincycle and nphasesincycle needs to be set 30859599516SKenneth E. Jansen if(nstepsincycle.eq.0) nphasesincycle = 0 30959599516SKenneth E. Jansen if(nphasesincycle.ne.0) then 31059599516SKenneth E. Jansen! & allocate(yphbar(nshg,5,nphasesincycle)) 31159599516SKenneth E. Jansen if (ivort == 1) then 31259599516SKenneth E. Jansen allocate(yphbar(nshg,15,nphasesincycle)) ! more space for vorticity 31359599516SKenneth E. Jansen else 31459599516SKenneth E. Jansen allocate(yphbar(nshg,11,nphasesincycle)) 31559599516SKenneth E. Jansen endif 31659599516SKenneth E. Jansen yphbar = zero 31759599516SKenneth E. Jansen endif 31859599516SKenneth E. Jansen 31959599516SKenneth E. Jansen!MR CHANGE END 32059599516SKenneth E. Jansen 32159599516SKenneth E. Jansen vbc_prof(:,1:3) = BC(:,3:5) 32259599516SKenneth E. Jansen if(iramp.eq.1) then 32359599516SKenneth E. Jansen call BCprofileInit(vbc_prof,x) 32459599516SKenneth E. Jansen endif 32559599516SKenneth E. Jansen 32659599516SKenneth E. Jansenc 327ae8d68e4SKenneth E. Jansenc.... ---------------> initialize LesLib Library <--------------- 32859599516SKenneth E. Jansenc 32959599516SKenneth E. Jansenc.... assign parameter values 33059599516SKenneth E. Jansenc 33159599516SKenneth E. Jansen do i = 1, 100 33259599516SKenneth E. Jansen numeqns(i) = i 33359599516SKenneth E. Jansen enddo 33459599516SKenneth E. Jansen nKvecs = Kspace 33559599516SKenneth E. Jansen prjFlag = iprjFlag 33659599516SKenneth E. Jansen presPrjFlag = ipresPrjFlag 33759599516SKenneth E. Jansen verbose = iverbose 33859599516SKenneth E. Jansenc 33959599516SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve 34059599516SKenneth E. Jansenc 34159599516SKenneth E. Jansen nsolt=mod(impl(1),2) ! 1 if solving temperature 34259599516SKenneth E. Jansen nsclrsol=nsolt+nsclr ! total number of scalars solved At 34359599516SKenneth E. Jansen ! some point we probably want to create 34459599516SKenneth E. Jansen ! a map, considering stepseq(), to find 34559599516SKenneth E. Jansen ! what is actually solved and only 34659599516SKenneth E. Jansen ! dimension lhs to the appropriate 34759599516SKenneth E. Jansen ! size. (see 1.6.1 and earlier for a 34859599516SKenneth E. Jansen ! "failed" attempt at this). 34959599516SKenneth E. Jansen 35059599516SKenneth E. Jansen 35159599516SKenneth E. Jansen nsolflow=mod(impl(1),100)/10 ! 1 if solving flow 35259599516SKenneth E. Jansen 35359599516SKenneth E. Jansenc 354ae8d68e4SKenneth E. Jansenc.... Now, call lesNew routine to initialize 35559599516SKenneth E. Jansenc memory space 35659599516SKenneth E. Jansenc 35759599516SKenneth E. Jansen call genadj(colm, rowp, icnt ) ! preprocess the adjacency list 35859599516SKenneth E. Jansen 35959599516SKenneth E. Jansen nnz_tot=icnt ! this is exactly the number of non-zero blocks on 36059599516SKenneth E. Jansen ! this proc 36159599516SKenneth E. Jansen 36279f1763eSKenneth E. Jansen if (nsolflow.eq.1) then ! start of setup for the flow 36359599516SKenneth E. Jansen lesId = numeqns(1) 36459599516SKenneth E. Jansen eqnType = 1 36559599516SKenneth E. Jansen nDofs = 4 366ae8d68e4SKenneth E. Jansen 367ae8d68e4SKenneth E. Jansen!-------------------------------------------------------------------- 368ae8d68e4SKenneth E. Jansen! Rest of configuration of svLS is added here, where we have LHS 369ae8d68e4SKenneth E. Jansen! pointers 370ae8d68e4SKenneth E. Jansen 371ae8d68e4SKenneth E. Jansen nPermDims = 1 372ae8d68e4SKenneth E. Jansen nTmpDims = 1 373ae8d68e4SKenneth E. Jansen 374ae8d68e4SKenneth E. Jansen allocate (lhsP(4,nnz_tot)) 375ae8d68e4SKenneth E. Jansen allocate (lhsK(9,nnz_tot)) 376ae8d68e4SKenneth E. Jansen 377436818eeSKenneth E. Jansen! Setting up svLS or leslib for flow 37879f1763eSKenneth E. Jansen 379ae8d68e4SKenneth E. Jansen IF (svLSFlag .EQ. 1) THEN 38079f1763eSKenneth E. Jansen#ifdef HAVE_SVLS 381436818eeSKenneth E. Jansen IF(nPrjs.eq.0) THEN 382436818eeSKenneth E. Jansen svLSType=2 !GMRES if borrowed ACUSIM projection vectors variable set to zero 383436818eeSKenneth E. Jansen ELSE 384436818eeSKenneth E. Jansen svLSType=3 !NS solver 385436818eeSKenneth E. Jansen ENDIF 386436818eeSKenneth E. Jansen! reltol for the NSSOLVE is the stop criterion on the outer loop 387436818eeSKenneth E. Jansen! reltolIn is (eps_GM, eps_CG) from the CompMech paper 388436818eeSKenneth E. Jansen! for now we are using 389436818eeSKenneth E. Jansen! Tolerance on ACUSIM Pressure Projection for CG and 390436818eeSKenneth E. Jansen! Tolerance on Momentum Equations for GMRES 391436818eeSKenneth E. Jansen! also using Kspaceand maxIters from setup for ACUSIM 392436818eeSKenneth E. Jansen! 393436818eeSKenneth E. Jansen eps_outer=40.0*epstol(1) !following papers soggestion for now 394436818eeSKenneth E. Jansen CALL svLS_LS_CREATE(svLS_ls, svLSType, dimKry=Kspace, 395436818eeSKenneth E. Jansen 2 relTol=eps_outer, relTolIn=(/epstol(1),prestol/), 396436818eeSKenneth E. Jansen 3 maxItr=maxIters, 397436818eeSKenneth E. Jansen 4 maxItrIn=(/maxIters,maxIters/)) 398436818eeSKenneth E. Jansen 399436818eeSKenneth E. Jansen CALL svLS_COMMU_CREATE(communicator, MPI_COMM_WORLD) 400436818eeSKenneth E. Jansen nNo=nshg 401ec121c45SKenneth E. Jansen gnNo=nshgt 402ae8d68e4SKenneth E. Jansen IF (ipvsq .GE. 2) THEN 403ae8d68e4SKenneth E. Jansen 404ae8d68e4SKenneth E. Jansen#if((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 1)) 405ae8d68e4SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs 406ae8d68e4SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs + numCORSrfs 407ae8d68e4SKenneth E. Jansen#elif((VER_CORONARY == 1)&&(VER_CLOSEDLOOP == 0)) 408ae8d68e4SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs 409ae8d68e4SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs + numCORSrfs 410ae8d68e4SKenneth E. Jansen#elif((VER_CORONARY == 0)&&(VER_CLOSEDLOOP == 1)) 411ae8d68e4SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs + numNeumannSrfs 412ae8d68e4SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs 413ae8d68e4SKenneth E. Jansen#else 414ae8d68e4SKenneth E. Jansen svLS_nFaces = 1 + numResistSrfs 415ae8d68e4SKenneth E. Jansen 2 + numImpSrfs + numRCRSrfs 416ae8d68e4SKenneth E. Jansen#endif 417ae8d68e4SKenneth E. Jansen 418ae8d68e4SKenneth E. Jansen ELSE 419436818eeSKenneth E. Jansen svLS_nFaces = 1 !not sure about this...looks like 1 means 0 for array size issues 420ae8d68e4SKenneth E. Jansen END IF 421ae8d68e4SKenneth E. Jansen 422ae8d68e4SKenneth E. Jansen CALL svLS_LHS_CREATE(svLS_lhs, communicator, gnNo, nNo, 423ae8d68e4SKenneth E. Jansen 2 nnz_tot, ltg, colm, rowp, svLS_nFaces) 424ae8d68e4SKenneth E. Jansen 425ae8d68e4SKenneth E. Jansen faIn = 1 426ae8d68e4SKenneth E. Jansen facenNo = 0 427ae8d68e4SKenneth E. Jansen DO i=1, nshg 428ae8d68e4SKenneth E. Jansen IF (IBITS(iBC(i),3,3) .NE. 0) facenNo = facenNo + 1 429ae8d68e4SKenneth E. Jansen END DO 430ae8d68e4SKenneth E. Jansen ALLOCATE(gNodes(facenNo), sV(nsd,facenNo)) 431ae8d68e4SKenneth E. Jansen sV = 0D0 432ae8d68e4SKenneth E. Jansen j = 0 433ae8d68e4SKenneth E. Jansen DO i=1, nshg 434ae8d68e4SKenneth E. Jansen IF (IBITS(iBC(i),3,3) .NE. 0) THEN 435ae8d68e4SKenneth E. Jansen j = j + 1 436ae8d68e4SKenneth E. Jansen gNodes(j) = i 437ae8d68e4SKenneth E. Jansen IF (.NOT.BTEST(iBC(i),3)) sV(1,j) = 1D0 438ae8d68e4SKenneth E. Jansen IF (.NOT.BTEST(iBC(i),4)) sV(2,j) = 1D0 439ae8d68e4SKenneth E. Jansen IF (.NOT.BTEST(iBC(i),5)) sV(3,j) = 1D0 440ae8d68e4SKenneth E. Jansen END IF 441ae8d68e4SKenneth E. Jansen END DO 442ae8d68e4SKenneth E. Jansen CALL svLS_BC_CREATE(svLS_lhs, faIn, facenNo, 443ae8d68e4SKenneth E. Jansen 2 nsd, BC_TYPE_Dir, gNodes, sV) 444436818eeSKenneth E. Jansen DEALLOCATE(gNodes) 445436818eeSKenneth E. Jansen DEALLOCATE(sV) 44679f1763eSKenneth E. Jansen#else 44779f1763eSKenneth E. Jansen if(myrank.eq.0) write(*,*) 'your input requests svLS but your cmake did not build for it' 44879f1763eSKenneth E. Jansen call error('itrdrv ','nosVLS',svLSFlag) 449bd36043dSBen Matthews#endif 450bd36043dSBen Matthews ENDIF 45179f1763eSKenneth E. Jansen 45279f1763eSKenneth E. Jansen if(leslib.eq.1) then 45379f1763eSKenneth E. Jansen#ifdef HAVE_LESLIB 454ae8d68e4SKenneth E. Jansen!-------------------------------------------------------------------- 45559599516SKenneth E. Jansen call myfLesNew( lesId, 41994, 45659599516SKenneth E. Jansen & eqnType, 45759599516SKenneth E. Jansen & nDofs, minIters, maxIters, 45859599516SKenneth E. Jansen & nKvecs, prjFlag, nPrjs, 45959599516SKenneth E. Jansen & presPrjFlag, nPresPrjs, epstol(1), 46059599516SKenneth E. Jansen & prestol, verbose, statsflow, 46159599516SKenneth E. Jansen & nPermDims, nTmpDims, servername ) 46259599516SKenneth E. Jansen 46359599516SKenneth E. Jansen allocate (aperm(nshg,nPermDims)) 46459599516SKenneth E. Jansen allocate (atemp(nshg,nTmpDims)) 46559599516SKenneth E. Jansen call readLesRestart( lesId, aperm, nshg, myrank, lstep, 46659599516SKenneth E. Jansen & nPermDims ) 46779f1763eSKenneth E. Jansen#else 46879f1763eSKenneth E. Jansen if(myrank.eq.0) write(*,*) 'your input requests leslib but your cmake did not build for it' 46979f1763eSKenneth E. Jansen call error('itrdrv ','nolslb',leslib) 470bd36043dSBen Matthews#endif 47179f1763eSKenneth E. Jansen endif !leslib=1 47259599516SKenneth E. Jansen 473436818eeSKenneth E. Jansen else ! not solving flow just scalar 47459599516SKenneth E. Jansen nPermDims = 0 47559599516SKenneth E. Jansen nTempDims = 0 47659599516SKenneth E. Jansen endif 47759599516SKenneth E. Jansen 47859599516SKenneth E. Jansen 47959599516SKenneth E. Jansen if(nsclrsol.gt.0) then 48059599516SKenneth E. Jansen do isolsc=1,nsclrsol 48159599516SKenneth E. Jansen lesId = numeqns(isolsc+1) 48259599516SKenneth E. Jansen eqnType = 2 48359599516SKenneth E. Jansen nDofs = 1 48459599516SKenneth E. Jansen presPrjflag = 0 48559599516SKenneth E. Jansen nPresPrjs = 0 48659599516SKenneth E. Jansen prjFlag = 1 48759599516SKenneth E. Jansen indx=isolsc+2-nsolt ! complicated to keep epstol(2) for 48859599516SKenneth E. Jansen ! temperature followed by scalars 489436818eeSKenneth E. Jansen! Setting up svLS or leslib for scalar 490bd36043dSBen Matthews#ifdef HAVE_SVLS 491436818eeSKenneth E. Jansen IF (svLSFlag .EQ. 1) THEN 492436818eeSKenneth E. Jansen svLSType=2 !only option for scalars 493436818eeSKenneth E. Jansen! reltol for the GMRES is the stop criterion 494436818eeSKenneth E. Jansen! also using Kspaceand maxIters from setup for ACUSIM 495436818eeSKenneth E. Jansen! 496daa97cf2SKenneth E. Jansen CALL svLS_LS_CREATE(svLS_ls_S(isolsc), svLSType, dimKry=Kspace, 497436818eeSKenneth E. Jansen 2 relTol=epstol(indx), 498436818eeSKenneth E. Jansen 3 maxItr=maxIters 499436818eeSKenneth E. Jansen 4 ) 500436818eeSKenneth E. Jansen 501daa97cf2SKenneth E. Jansen CALL svLS_COMMU_CREATE(communicator_S(isolsc), MPI_COMM_WORLD) 502436818eeSKenneth E. Jansen 503436818eeSKenneth E. Jansen svLS_nFaces = 1 !not sure about this...should try it with zero 504436818eeSKenneth E. Jansen 505daa97cf2SKenneth E. Jansen CALL svLS_LHS_CREATE(svLS_lhs_S(isolsc), communicator_S(isolsc), gnNo, nNo, 506436818eeSKenneth E. Jansen 2 nnz_tot, ltg, colm, rowp, svLS_nFaces) 507436818eeSKenneth E. Jansen 508436818eeSKenneth E. Jansen faIn = 1 509436818eeSKenneth E. Jansen facenNo = 0 510436818eeSKenneth E. Jansen ib=5+isolsc 511436818eeSKenneth E. Jansen DO i=1, nshg 512436818eeSKenneth E. Jansen IF (btest(iBC(i),ib)) facenNo = facenNo + 1 513436818eeSKenneth E. Jansen END DO 514436818eeSKenneth E. Jansen ALLOCATE(gNodes(facenNo), sV(1,facenNo)) 515436818eeSKenneth E. Jansen sV = 0D0 516436818eeSKenneth E. Jansen j = 0 517436818eeSKenneth E. Jansen DO i=1, nshg 518436818eeSKenneth E. Jansen IF (btest(iBC(i),ib)) THEN 519436818eeSKenneth E. Jansen j = j + 1 520436818eeSKenneth E. Jansen gNodes(j) = i 521436818eeSKenneth E. Jansen END IF 522436818eeSKenneth E. Jansen END DO 523436818eeSKenneth E. Jansen 524daa97cf2SKenneth E. Jansen CALL svLS_BC_CREATE(svLS_lhs_S(isolsc), faIn, facenNo, 525436818eeSKenneth E. Jansen 2 1, BC_TYPE_Dir, gNodes, sV(1,:)) 526436818eeSKenneth E. Jansen DEALLOCATE(gNodes) 527436818eeSKenneth E. Jansen DEALLOCATE(sV) 528436818eeSKenneth E. Jansen 529436818eeSKenneth E. Jansen if( isolsc.eq.1) then ! if multiple scalars make sure done once 530436818eeSKenneth E. Jansen allocate (apermS(1,1,1)) 531436818eeSKenneth E. Jansen allocate (atempS(1,1)) !they can all share this 532436818eeSKenneth E. Jansen endif 53379f1763eSKenneth E. Jansen ENDIF !svLS handing scalar solve 534bd36043dSBen Matthews#endif 53579f1763eSKenneth E. Jansen 53679f1763eSKenneth E. Jansen 53779f1763eSKenneth E. Jansen#ifdef HAVE_LESLIB 53879f1763eSKenneth E. Jansen if (leslib.eq.1) then 53959599516SKenneth E. Jansen call myfLesNew( lesId, 41994, 54059599516SKenneth E. Jansen & eqnType, 54159599516SKenneth E. Jansen & nDofs, minIters, maxIters, 54259599516SKenneth E. Jansen & nKvecs, prjFlag, nPrjs, 54359599516SKenneth E. Jansen & presPrjFlag, nPresPrjs, epstol(indx), 54459599516SKenneth E. Jansen & prestol, verbose, statssclr, 54559599516SKenneth E. Jansen & nPermDimsS, nTmpDimsS, servername ) 54679f1763eSKenneth E. Jansen endif 547bd36043dSBen Matthews#endif 548436818eeSKenneth E. Jansen enddo !loop over scalars to solve (not yet worked out for multiple svLS solves 549436818eeSKenneth E. Jansen allocate (lhsS(nnz_tot,nsclrsol)) 55079f1763eSKenneth E. Jansen#ifdef HAVE_LESLIB 55179f1763eSKenneth E. Jansen if(leslib.eq.1) then ! we just prepped scalar solves for leslib so allocate arrays 55259599516SKenneth E. Jansenc 55359599516SKenneth E. Jansenc Assume all scalars have the same size needs 55459599516SKenneth E. Jansenc 55559599516SKenneth E. Jansen allocate (apermS(nshg,nPermDimsS,nsclrsol)) 55659599516SKenneth E. Jansen allocate (atempS(nshg,nTmpDimsS)) !they can all share this 557436818eeSKenneth E. Jansen endif 558bd36043dSBen Matthews#endif 55959599516SKenneth E. Jansenc 56059599516SKenneth E. Jansenc actually they could even share with atemp but leave that for later 56159599516SKenneth E. Jansenc 562436818eeSKenneth E. Jansen else !no scalar solves at all so zero dims not used 56359599516SKenneth E. Jansen nPermDimsS = 0 56459599516SKenneth E. Jansen nTmpDimsS = 0 56559599516SKenneth E. Jansen endif 56659599516SKenneth E. Jansenc 56759599516SKenneth E. Jansenc... prepare lumped mass if needed 56859599516SKenneth E. Jansenc 56959599516SKenneth E. Jansen if((flmpr.ne.0).or.(flmpl.ne.0)) call genlmass(x, shp,shgl) 57059599516SKenneth E. Jansenc 57159599516SKenneth E. Jansenc.... -----------------> End of initialization <----------------- 57259599516SKenneth E. Jansenc 57359599516SKenneth E. Jansenc.....open the necessary files to gather time series 57459599516SKenneth E. Jansenc 57559599516SKenneth E. Jansen lstep0 = lstep+1 57659599516SKenneth E. Jansen nsteprcr = nstep(1)+lstep 57759599516SKenneth E. Jansenc 57859599516SKenneth E. Jansenc.... loop through the time sequences 57959599516SKenneth E. Jansenc 58059599516SKenneth E. Jansen 58159599516SKenneth E. Jansen 58259599516SKenneth E. Jansen do 3000 itsq = 1, ntseq 58359599516SKenneth E. Jansen itseq = itsq 58459599516SKenneth E. Jansen 58559599516SKenneth E. JansenCAD tcorecp1 = second(0) 58659599516SKenneth E. JansenCAD tcorewc1 = second(-1) 58759599516SKenneth E. Jansenc 58859599516SKenneth E. Jansenc.... set up the time integration parameters 58959599516SKenneth E. Jansenc 59059599516SKenneth E. Jansen nstp = nstep(itseq) 59159599516SKenneth E. Jansen nitr = niter(itseq) 59259599516SKenneth E. Jansen LCtime = loctim(itseq) 59359599516SKenneth E. Jansen dtol(:)= deltol(itseq,:) 59459599516SKenneth E. Jansen 59559599516SKenneth E. Jansen call itrSetup ( y, acold ) 59659599516SKenneth E. Jansenc 59759599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution, 59859599516SKenneth E. Jansenc which are functions of alphaf so need to do it after itrSetup 59959599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 60059599516SKenneth E. Jansen call calcImpConvCoef (numImpSrfs, ntimeptpT) 60159599516SKenneth E. Jansen endif 60259599516SKenneth E. Jansenc 60359599516SKenneth E. Jansenc...initialize the initial condition P(0)-RQ(0)-Pd(0) for RCR BC 60459599516SKenneth E. Jansenc need ndsurf so should be after initNABI 60559599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 60659599516SKenneth E. Jansen call calcRCRic(y,nsrflistRCR,numRCRSrfs) 60759599516SKenneth E. Jansen endif 60859599516SKenneth E. Jansenc 60959599516SKenneth E. Jansenc find the last solve of the flow in the step sequence so that we will 61059599516SKenneth E. Jansenc know when we are at/near end of step 61159599516SKenneth E. Jansenc 61259599516SKenneth E. Jansenc ilast=0 61359599516SKenneth E. Jansen nitr=0 ! count number of flow solves in a step (# of iterations) 61459599516SKenneth E. Jansen do i=1,seqsize 61559599516SKenneth E. Jansen if(stepseq(i).eq.0) nitr=nitr+1 61659599516SKenneth E. Jansen enddo 61759599516SKenneth E. Jansen 61859599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 61959599516SKenneth E. Jansen tcorecp(:) = zero ! used in solfar.f (solflow) 62059599516SKenneth E. Jansen tcorecpscal(:) = zero ! used in solfar.f (solflow) 62159599516SKenneth E. Jansen if(myrank.eq.0) then 62259599516SKenneth E. Jansen tcorecp1 = TMRC() 62359599516SKenneth E. Jansen endif 62459599516SKenneth E. Jansen 62559599516SKenneth E. Jansenc 62659599516SKenneth E. Jansenc.... loop through the time steps 62759599516SKenneth E. Jansenc 62859599516SKenneth E. Jansen istop=0 62959599516SKenneth E. Jansen rmub=datmat(1,2,1) 63059599516SKenneth E. Jansen if(rmutarget.gt.0) then 63159599516SKenneth E. Jansen rmue=rmutarget 63259599516SKenneth E. Jansen else 63359599516SKenneth E. Jansen rmue=datmat(1,2,1) ! keep constant 63459599516SKenneth E. Jansen endif 63559599516SKenneth E. Jansen 63659599516SKenneth E. Jansen if(iramp.eq.1) then 63759599516SKenneth E. Jansen call BCprofileScale(vbc_prof,BC,yold) ! fix the yold values to the reset BC 63859599516SKenneth E. Jansen isclr=1 ! fix scalar 63959599516SKenneth E. Jansen do isclr=1,nsclr 64059599516SKenneth E. Jansen call itrBCSclr(yold,ac,iBC,BC,iper,ilwork) 64159599516SKenneth E. Jansen enddo 64259599516SKenneth E. Jansen endif 64359599516SKenneth E. Jansen 64459599516SKenneth E. Jansen do 2000 istp = 1, nstp 64559599516SKenneth E. Jansen if(iramp.eq.1) 64659599516SKenneth E. Jansen & call BCprofileScale(vbc_prof,BC,yold) 64759599516SKenneth E. Jansen 64859599516SKenneth E. Jansen call rerun_check(stopjob) 649c89b8efeSKenneth E. Jansen if(myrank.eq.master) write(*,*) 650c89b8efeSKenneth E. Jansen & 'stopjob,lstep,istep', stopjob,lstep,istep 651c89b8efeSKenneth E. Jansen if(stopjob.eq.lstep) then 652c89b8efeSKenneth E. Jansen stopjob=-2 ! this is the code to finish 653c89b8efeSKenneth E. Jansen if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then 654c89b8efeSKenneth E. Jansen if(myrank.eq.master) write(*,*) 655c89b8efeSKenneth E. Jansen & 'line 473 says last step written so exit' 656c89b8efeSKenneth E. Jansen goto 2002 ! the step was written last step so just exit 657c89b8efeSKenneth E. Jansen else 658c89b8efeSKenneth E. Jansen if(myrank.eq.master) 659c89b8efeSKenneth E. Jansen & write(*,*) 'line 473 says last step not written' 660c89b8efeSKenneth E. Jansen istep=nstp ! have to do this so that solution will be written 661c89b8efeSKenneth E. Jansen goto 2001 662c89b8efeSKenneth E. Jansen endif 663c89b8efeSKenneth E. Jansen endif 66459599516SKenneth E. Jansen 66559599516SKenneth E. Jansen xi=istp*1.0/nstp 66659599516SKenneth E. Jansen datmat(1,2,1)=rmub*(1.0-xi)+xi*rmue 66759599516SKenneth E. Jansenc write(*,*) "current mol. visc = ", datmat(1,2,1) 66859599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC. 66959599516SKenneth E. Jansenc these will be for time step n+1 so use lstep+1 67059599516SKenneth E. Jansenc 67159599516SKenneth E. Jansen if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl, 67259599516SKenneth E. Jansen & shpb, shglb, x, BC, iBC) 67359599516SKenneth E. Jansen 67459599516SKenneth E. Jansenc 67559599516SKenneth E. Jansenc ... calculate the pressure contribution that depends on the history for the Imp. BC 67659599516SKenneth E. Jansenc 67759599516SKenneth E. Jansen if(numImpSrfs.gt.0) then 67859599516SKenneth E. Jansen call pHist(poldImp,QHistImp,ImpConvCoef, 67959599516SKenneth E. Jansen & ntimeptpT,numImpSrfs) 68059599516SKenneth E. Jansen if (myrank.eq.master) 68159599516SKenneth E. Jansen & write(8177,*) (poldImp(n), n=1,numImpSrfs) 68259599516SKenneth E. Jansen endif 68359599516SKenneth E. Jansenc 68459599516SKenneth E. Jansenc ... calc the pressure contribution that depends on the history for the RCR BC 68559599516SKenneth E. Jansenc 68659599516SKenneth E. Jansen if(numRCRSrfs.gt.0) then 68759599516SKenneth E. Jansen call CalcHopRCR (Delt(itseq), lstep, numRCRSrfs) 68859599516SKenneth E. Jansen call CalcRCRConvCoef(lstep,numRCRSrfs) 68959599516SKenneth E. Jansen call pHist(poldRCR,QHistRCR,RCRConvCoef,nsteprcr, 69059599516SKenneth E. Jansen & numRCRSrfs) 69159599516SKenneth E. Jansen if (myrank.eq.master) 69259599516SKenneth E. Jansen & write(8177,*) (poldRCR(n), n=1,numRCRSrfs) 69359599516SKenneth E. Jansen endif 69459599516SKenneth E. Jansenc 69559599516SKenneth E. Jansenc Decay of scalars 69659599516SKenneth E. Jansenc 69759599516SKenneth E. Jansen if(nsclr.gt.0 .and. tdecay.ne.1) then 69859599516SKenneth E. Jansen yold(:,6:ndof)=y(:,6:ndof)*tdecay 69959599516SKenneth E. Jansen BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*tdecay 70059599516SKenneth E. Jansen endif 70159599516SKenneth E. Jansen 70259599516SKenneth E. Jansen if(nosource.eq.1) BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*0.8 70359599516SKenneth E. Jansen 70459599516SKenneth E. Jansen 70559599516SKenneth E. Jansen if(iLES.gt.0) then !complicated stuff has moved to 70659599516SKenneth E. Jansen !routine below 70759599516SKenneth E. Jansen call lesmodels(yold, acold, shgl, shp, 70859599516SKenneth E. Jansen & iper, ilwork, rowp, colm, 70959599516SKenneth E. Jansen & nsons, ifath, x, 71059599516SKenneth E. Jansen & iBC, BC) 71159599516SKenneth E. Jansen 71259599516SKenneth E. Jansen 71359599516SKenneth E. Jansen endif 71459599516SKenneth E. Jansen 71559599516SKenneth E. Jansenc.... set traction BCs for modeled walls 71659599516SKenneth E. Jansenc 71759599516SKenneth E. Jansen if (itwmod.ne.0) then 71859599516SKenneth E. Jansen call asbwmod(yold, acold, x, BC, iBC, 71959599516SKenneth E. Jansen & iper, ilwork, ifath, velbar) 72059599516SKenneth E. Jansen endif 72159599516SKenneth E. Jansen 72259599516SKenneth E. Jansen!MR CHANGE 72359599516SKenneth E. Jansenc 72459599516SKenneth E. Jansenc.... Determine whether the vorticity field needs to be computed for this time step or not 72559599516SKenneth E. Jansenc 72659599516SKenneth E. Jansen icomputevort = 0 72759599516SKenneth E. Jansen if (ivort == 1) then ! Print vorticity = True in solver.inp 72859599516SKenneth E. Jansen ! We then compute the vorticity only if we 72959599516SKenneth E. Jansen ! 1) we write an intermediate checkpoint 73059599516SKenneth E. Jansen ! 2) we reach the last time step and write the last checkpoint 73159599516SKenneth E. Jansen ! 3) we accumulate statistics in ybar for every time step 73259599516SKenneth E. Jansen ! BEWARE: we need here lstep+1 and istep+1 because the lstep and 73359599516SKenneth E. Jansen ! istep gets incremened after the flowsolve, further below 73459599516SKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep+1, ntout) .eq. 0)) .or. 73559599516SKenneth E. Jansen & istep+1.eq.nstep(itseq) .or. ioybar == 1) then 73659599516SKenneth E. Jansen icomputevort = 1 73759599516SKenneth E. Jansen endif 73859599516SKenneth E. Jansen endif 73959599516SKenneth E. Jansen 74059599516SKenneth E. Jansen! write(*,*) 'icomputevort: ',icomputevort, ' - istep: ', 74159599516SKenneth E. Jansen! & istep,' - nstep(itseq):',nstep(itseq),'- lstep:', 74259599516SKenneth E. Jansen! & lstep, '- ntout:', ntout 74359599516SKenneth E. Jansen!MR CHANGE 74459599516SKenneth E. Jansen 74559599516SKenneth E. Jansenc 74659599516SKenneth E. Jansenc.... -----------------------> predictor phase <----------------------- 74759599516SKenneth E. Jansenc 74859599516SKenneth E. Jansen call itrPredict(yold, y, acold, ac , uold, u, iBC) 74959599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper,ilwork) 75059599516SKenneth E. Jansen 75159599516SKenneth E. Jansen if(nsolt.eq.1) then 75259599516SKenneth E. Jansen isclr=0 75359599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 75459599516SKenneth E. Jansen endif 75559599516SKenneth E. Jansen do isclr=1,nsclr 75659599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 75759599516SKenneth E. Jansen enddo 75859599516SKenneth E. Jansen iter=0 75959599516SKenneth E. Jansen ilss=0 ! this is a switch thrown on first solve of LS redistance 76059599516SKenneth E. Jansen do istepc=1,seqsize 76159599516SKenneth E. Jansen icode=stepseq(istepc) 76259599516SKenneth E. Jansen if(mod(icode,5).eq.0) then ! this is a solve 76359599516SKenneth E. Jansen isolve=icode/10 76459599516SKenneth E. Jansen if(icode.eq.0) then ! flow solve (encoded as 0) 76559599516SKenneth E. Jansenc 76659599516SKenneth E. Jansen iter = iter+1 76759599516SKenneth E. Jansen ifuncs(1) = ifuncs(1) + 1 76859599516SKenneth E. Jansenc 76959599516SKenneth E. Jansen Force(1) = zero 77059599516SKenneth E. Jansen Force(2) = zero 77159599516SKenneth E. Jansen Force(3) = zero 77259599516SKenneth E. Jansen HFlux = zero 77359599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1))) 77459599516SKenneth E. Jansen 77559599516SKenneth E. Jansen call SolFlow(y, ac, u, 77659599516SKenneth E. Jansen & yold, acold, uold, 77759599516SKenneth E. Jansen & x, iBC, 77859599516SKenneth E. Jansen & BC, res, 77959599516SKenneth E. Jansen & nPermDims, nTmpDims, aperm, 78059599516SKenneth E. Jansen & atemp, iper, 78159599516SKenneth E. Jansen & ilwork, shp, shgl, 78259599516SKenneth E. Jansen & shpb, shglb, rowp, 78359599516SKenneth E. Jansen & colm, lhsK, lhsP, 78459599516SKenneth E. Jansen & solinc, rerr, tcorecp, 785bd36043dSBen Matthews & GradV, sumtime 786bd36043dSBen Matthews#ifdef HAVE_SVLS 787bd36043dSBen Matthews & ,svLS_lhs, svLS_ls, svLS_nFaces) 788bd36043dSBen Matthews#else 789bd36043dSBen Matthews & ) 790bd36043dSBen Matthews#endif 79159599516SKenneth E. Jansen 79259599516SKenneth E. Jansen else ! scalar type solve 79359599516SKenneth E. Jansen if (icode.eq.5) then ! Solve for Temperature 79459599516SKenneth E. Jansen ! (encoded as (nsclr+1)*10) 79559599516SKenneth E. Jansen isclr=0 79659599516SKenneth E. Jansen ifuncs(2) = ifuncs(2) + 1 79759599516SKenneth E. Jansen j=1 79859599516SKenneth E. Jansen else ! solve a scalar (encoded at isclr*10) 79959599516SKenneth E. Jansen isclr=isolve 80059599516SKenneth E. Jansen ifuncs(isclr+2) = ifuncs(isclr+2) + 1 80159599516SKenneth E. Jansen j=isclr+nsolt 80259599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.0) 80359599516SKenneth E. Jansen & .and.(isclr.eq.2)) then 80459599516SKenneth E. Jansen ilss=1 ! throw switch (once per step) 80559599516SKenneth E. Jansen y(:,7)=y(:,6) ! redistance field initialized 80659599516SKenneth E. Jansen ac(:,7) = zero 80759599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 80859599516SKenneth E. Jansen & ilwork) 80959599516SKenneth E. Jansenc 81059599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the 81159599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar 81259599516SKenneth E. Jansenc 81359599516SKenneth E. Jansen alfit=alfi 81459599516SKenneth E. Jansen gamit=gami 81559599516SKenneth E. Jansen almit=almi 81659599516SKenneth E. Jansen Deltt=Delt(1) 81759599516SKenneth E. Jansen Dtglt=Dtgl 81859599516SKenneth E. Jansen alfi = 1 81959599516SKenneth E. Jansen gami = 1 82059599516SKenneth E. Jansen almi = 1 82159599516SKenneth E. Jansenc Delt(1)= Deltt ! Give a pseudo time step 82259599516SKenneth E. Jansen Dtgl = one / Delt(1) 82359599516SKenneth E. Jansen endif ! level set eq. 2 82459599516SKenneth E. Jansen endif ! deciding between temperature and scalar 82559599516SKenneth E. Jansen 82659599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(isclr+2)-1, 82759599516SKenneth E. Jansen & LHSupd(isclr+2))) 82859599516SKenneth E. Jansen 82959599516SKenneth E. Jansen call SolSclr(y, ac, u, 83059599516SKenneth E. Jansen & yold, acold, uold, 83159599516SKenneth E. Jansen & x, iBC, 83259599516SKenneth E. Jansen & BC, nPermDimsS,nTmpDimsS, 83359599516SKenneth E. Jansen & apermS(1,1,j), atempS, iper, 83459599516SKenneth E. Jansen & ilwork, shp, shgl, 83559599516SKenneth E. Jansen & shpb, shglb, rowp, 83659599516SKenneth E. Jansen & colm, lhsS(1,j), 837bd36043dSBen Matthews & solinc(1,isclr+5), tcorecpscal 838bd36043dSBen Matthews#ifdef HAVE_SVLS 839bd36043dSBen Matthews & ,svLS_lhs_S(isclr), svLS_ls_S(isclr), svls_nfaces) 840bd36043dSBen Matthews#else 841bd36043dSBen Matthews & ) 842bd36043dSBen Matthews#endif 84359599516SKenneth E. Jansen 84459599516SKenneth E. Jansen 84559599516SKenneth E. Jansen endif ! end of scalar type solve 84659599516SKenneth E. Jansen 84759599516SKenneth E. Jansen else ! this is an update (mod did not equal zero) 84859599516SKenneth E. Jansen iupdate=icode/10 ! what to update 84959599516SKenneth E. Jansen if(icode.eq.1) then !update flow 85059599516SKenneth E. Jansen call itrCorrect ( y, ac, u, solinc, iBC) 85159599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper, ilwork) 85259599516SKenneth E. Jansen else ! update scalar 85359599516SKenneth E. Jansen isclr=iupdate !unless 85459599516SKenneth E. Jansen if(icode.eq.6) isclr=0 85559599516SKenneth E. Jansen if(iRANS.lt.-100)then ! RANS 85659599516SKenneth E. Jansen call itrCorrectSclrPos(y,ac,solinc(1,isclr+5)) 85759599516SKenneth E. Jansen else 85859599516SKenneth E. Jansen call itrCorrectSclr (y, ac, solinc(1,isclr+5)) 85959599516SKenneth E. Jansen endif 86059599516SKenneth E. Jansen if (ilset.eq.2 .and. isclr.eq.2) then 86159599516SKenneth E. Jansen if (ivconstraint .eq. 1) then 86259599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 86359599516SKenneth E. Jansen & ilwork) 86459599516SKenneth E. Jansenc 86559599516SKenneth E. Jansenc ... applying the volume constraint on second level set scalar 86659599516SKenneth E. Jansenc 86759599516SKenneth E. Jansen call solvecon (y, x, iBC, BC, 86859599516SKenneth E. Jansen & iper, ilwork, shp, shgl) 86959599516SKenneth E. Jansenc 87059599516SKenneth E. Jansen endif ! end of volume constraint calculations 87159599516SKenneth E. Jansen endif ! end of redistance calculations 87259599516SKenneth E. Jansenc 87359599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 87459599516SKenneth E. Jansen & ilwork) 87559599516SKenneth E. Jansen endif ! end of flow or scalar update 87659599516SKenneth E. Jansen endif ! end of switch between solve or update 87759599516SKenneth E. Jansen enddo ! loop over sequence in step 87859599516SKenneth E. Jansenc 87959599516SKenneth E. Jansenc 88059599516SKenneth E. Jansenc.... obtain the time average statistics 88159599516SKenneth E. Jansenc 88259599516SKenneth E. Jansen if (ioform .eq. 2) then 88359599516SKenneth E. Jansen 88459599516SKenneth E. Jansen call stsGetStats( y, yold, ac, acold, 88559599516SKenneth E. Jansen & u, uold, x, 88659599516SKenneth E. Jansen & shp, shgl, shpb, shglb, 88759599516SKenneth E. Jansen & iBC, BC, iper, ilwork, 88859599516SKenneth E. Jansen & rowp, colm, lhsK, lhsP ) 88959599516SKenneth E. Jansen endif 89059599516SKenneth E. Jansen 89159599516SKenneth E. Jansenc 89259599516SKenneth E. Jansenc Find the solution at the end of the timestep and move it to old 89359599516SKenneth E. Jansenc 89459599516SKenneth E. Jansenc 89559599516SKenneth E. Jansenc ...First to reassign the parameters for the original time integrator scheme 89659599516SKenneth E. Jansenc 89759599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.1)) then 89859599516SKenneth E. Jansen alfi =alfit 89959599516SKenneth E. Jansen gami =gamit 90059599516SKenneth E. Jansen almi =almit 90159599516SKenneth E. Jansen Delt(1)=Deltt 90259599516SKenneth E. Jansen Dtgl =Dtglt 90359599516SKenneth E. Jansen endif 90459599516SKenneth E. Jansen call itrUpdate( yold, acold, uold, y, ac, u) 90559599516SKenneth E. Jansen call itrBC (yold, acold, iBC, BC, iper,ilwork) 90659599516SKenneth E. Jansen 90759599516SKenneth E. Jansen istep = istep + 1 90859599516SKenneth E. Jansen lstep = lstep + 1 90959599516SKenneth E. Jansenc 91059599516SKenneth E. Jansenc .. Print memory consumption on BGQ 91159599516SKenneth E. Jansenc 91259599516SKenneth E. Jansen call printmeminfo("itrdrv"//char(0)) 91359599516SKenneth E. Jansen 91459599516SKenneth E. Jansenc 91559599516SKenneth E. Jansenc .. Compute vorticity 91659599516SKenneth E. Jansenc 91759599516SKenneth E. Jansen if ( icomputevort == 1) then 91859599516SKenneth E. Jansen 91959599516SKenneth E. Jansen ! vorticity components and magnitude 92059599516SKenneth E. Jansen vorticity(:,1) = GradV(:,8)-GradV(:,6) !omega_x 92159599516SKenneth E. Jansen vorticity(:,2) = GradV(:,3)-GradV(:,7) !omega_y 92259599516SKenneth E. Jansen vorticity(:,3) = GradV(:,4)-GradV(:,2) !omega_z 92359599516SKenneth E. Jansen vorticity(:,4) = sqrt( vorticity(:,1)*vorticity(:,1) 92459599516SKenneth E. Jansen & + vorticity(:,2)*vorticity(:,2) 92559599516SKenneth E. Jansen & + vorticity(:,3)*vorticity(:,3) ) 92659599516SKenneth E. Jansen ! Q 92759599516SKenneth E. Jansen strain(:,1) = GradV(:,1) !S11 92859599516SKenneth E. Jansen strain(:,2) = 0.5*(GradV(:,2)+GradV(:,4)) !S12 92959599516SKenneth E. Jansen strain(:,3) = 0.5*(GradV(:,3)+GradV(:,7)) !S13 93059599516SKenneth E. Jansen strain(:,4) = GradV(:,5) !S22 93159599516SKenneth E. Jansen strain(:,5) = 0.5*(GradV(:,6)+GradV(:,8)) !S23 93259599516SKenneth E. Jansen strain(:,6) = GradV(:,9) !S33 93359599516SKenneth E. Jansen 93459599516SKenneth E. Jansen vorticity(:,5) = 0.25*( vorticity(:,4)*vorticity(:,4) !Q 93559599516SKenneth E. Jansen & - 2.0*( strain(:,1)*strain(:,1) 93659599516SKenneth E. Jansen & + 2* strain(:,2)*strain(:,2) 93759599516SKenneth E. Jansen & + 2* strain(:,3)*strain(:,3) 93859599516SKenneth E. Jansen & + strain(:,4)*strain(:,4) 93959599516SKenneth E. Jansen & + 2* strain(:,5)*strain(:,5) 94059599516SKenneth E. Jansen & + strain(:,6)*strain(:,6))) 94159599516SKenneth E. Jansen 94259599516SKenneth E. Jansen endif 94359599516SKenneth E. Jansenc 9449dcf5646SKenneth E. Jansenc.... update and the aerodynamic forces 9459dcf5646SKenneth E. Jansenc 9469dcf5646SKenneth E. Jansen call forces ( yold, ilwork ) 9479dcf5646SKenneth E. Jansen 9489dcf5646SKenneth E. Jansenc 949c89b8efeSKenneth E. Jansenc .. write out the instantaneous solution 95059599516SKenneth E. Jansenc 951c89b8efeSKenneth E. Jansen2001 continue ! we could get here by 2001 label if user requested stop 95259599516SKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or. 95359599516SKenneth E. Jansen & istep.eq.nstep(itseq)) then 954c89b8efeSKenneth E. Jansen 955c89b8efeSKenneth E. Jansen!so that we can see progress in force file close it so that it flushes 956c89b8efeSKenneth E. Jansen!and then reopen in append mode 957c89b8efeSKenneth E. Jansen 958c89b8efeSKenneth E. Jansen close(iforce) 959c89b8efeSKenneth E. Jansen open (unit=iforce, file=fforce, position='append') 96059599516SKenneth E. Jansen 96159599516SKenneth E. Jansen! Call to restar() will open restart file in write mode (and not append mode) 96259599516SKenneth E. Jansen! that is needed as other fields are written in append mode 963c89b8efeSKenneth E. Jansen 96459599516SKenneth E. Jansen call restar ('out ', yold ,ac) 96559599516SKenneth E. Jansen if(ideformwall == 1) then 9669dcf5646SKenneth E. Jansen! call write_displ(myrank, lstep, nshg, 3, uold ) 9674c3261e2SCameron Smith if(myrank.eq.master) then 9684c3261e2SCameron Smith write(*,*) 'ideformwall is 1 and is a dead code path... exiting' 9694c3261e2SCameron Smith endif 9704c3261e2SCameron Smith stop 97159599516SKenneth E. Jansen endif 97259599516SKenneth E. Jansen 97359599516SKenneth E. Jansen if(ivort == 1) then 97459599516SKenneth E. Jansen call write_field(myrank,'a','vorticity',9,vorticity, 97559599516SKenneth E. Jansen & 'd',nshg,5,lstep) 97659599516SKenneth E. Jansen endif 97759599516SKenneth E. Jansen 97859599516SKenneth E. Jansen call printmeminfo("itrdrv after checkpoint"//char(0)) 979c89b8efeSKenneth E. Jansen else if(stopjob.eq.-2) then 980c89b8efeSKenneth E. Jansen if(myrank.eq.master) then 981c89b8efeSKenneth E. Jansen write(*,*) 'line 755 says no write before stopping' 982c89b8efeSKenneth E. Jansen write(*,*) 'istep,nstep,irs',istep,nstep(itseq),irs 98359599516SKenneth E. Jansen endif 984c89b8efeSKenneth E. Jansen endif !just the instantaneous stuff for videos 985c89b8efeSKenneth E. Jansenc 986c89b8efeSKenneth E. Jansenc.... compute the consistent boundary flux 987c89b8efeSKenneth E. Jansenc 988c89b8efeSKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 989c89b8efeSKenneth E. Jansen call Bflux ( yold, acold, uold, x, 990c89b8efeSKenneth E. Jansen & shp, shgl, shpb, 991c89b8efeSKenneth E. Jansen & shglb, ilwork, iBC, 992c89b8efeSKenneth E. Jansen & BC, iper, wallssVec) 993c89b8efeSKenneth E. Jansen endif 994c89b8efeSKenneth E. Jansen 995c89b8efeSKenneth E. Jansen if(stopjob.eq.-2) goto 2003 996c89b8efeSKenneth E. Jansen 99759599516SKenneth E. Jansen 99859599516SKenneth E. Jansenc 99959599516SKenneth E. Jansenc ... update the flow history for the impedance convolution, filter it and write it out 100059599516SKenneth E. Jansenc 100159599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 100259599516SKenneth E. Jansen call UpdHistConv(y,nsrflistImp,numImpSrfs) !uses Delt(1) 100359599516SKenneth E. Jansen endif 100459599516SKenneth E. Jansen 100559599516SKenneth E. Jansenc 100659599516SKenneth E. Jansenc ... update the flow history for the RCR convolution 100759599516SKenneth E. Jansenc 100859599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 100959599516SKenneth E. Jansen call UpdHistConv(y,nsrflistRCR,numRCRSrfs) !uses lstep 101059599516SKenneth E. Jansen endif 101159599516SKenneth E. Jansen 101259599516SKenneth E. Jansen 101359599516SKenneth E. Jansenc... dump TIME SERIES 101459599516SKenneth E. Jansen 101559599516SKenneth E. Jansen if (exts) then 101659599516SKenneth E. Jansen if (mod(lstep-1,freq).eq.0) then 101759599516SKenneth E. Jansen 101859599516SKenneth E. Jansen if (numpe > 1) then 101959599516SKenneth E. Jansen do jj = 1, ntspts 102059599516SKenneth E. Jansen vartssoln((jj-1)*ndof+1:jj*ndof)=varts(jj,:) 102159599516SKenneth E. Jansen ivarts=zero 102259599516SKenneth E. Jansen enddo 102359599516SKenneth E. Jansen do k=1,ndof*ntspts 102459599516SKenneth E. Jansen if(vartssoln(k).ne.zero) ivarts(k)=1 102559599516SKenneth E. Jansen enddo 102659599516SKenneth E. Jansen 102759599516SKenneth E. Jansen! call MPI_REDUCE(vartssoln, vartssolng, ndof*ntspts, 102859599516SKenneth E. Jansen! & MPI_DOUBLE_PRECISION, MPI_SUM, master, 102959599516SKenneth E. Jansen! & MPI_COMM_WORLD, ierr) 103059599516SKenneth E. Jansen 103159599516SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 103259599516SKenneth E. Jansen call MPI_ALLREDUCE(vartssoln, vartssolng, 103359599516SKenneth E. Jansen & ndof*ntspts, 103459599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION, MPI_SUM, 103559599516SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 103659599516SKenneth E. Jansen 103759599516SKenneth E. Jansen! call MPI_REDUCE(ivarts, ivartsg, ndof*ntspts, 103859599516SKenneth E. Jansen! & MPI_INTEGER, MPI_SUM, master, 103959599516SKenneth E. Jansen! & MPI_COMM_WORLD, ierr) 104059599516SKenneth E. Jansen 104159599516SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 104259599516SKenneth E. Jansen call MPI_ALLREDUCE(ivarts, ivartsg, ndof*ntspts, 104359599516SKenneth E. Jansen & MPI_INTEGER, MPI_SUM, 104459599516SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 104559599516SKenneth E. Jansen 104659599516SKenneth E. Jansen! if (myrank.eq.zero) then 104759599516SKenneth E. Jansen do jj = 1, ntspts 104859599516SKenneth E. Jansen 104959599516SKenneth E. Jansen if(myrank .eq. iv_rank(jj)) then 105059599516SKenneth E. Jansen ! No need to update all varts components, only the one treated by the expected rank 105159599516SKenneth E. Jansen ! Note: keep varts as a vector, as multiple probes could be treated by one rank 105259599516SKenneth E. Jansen indxvarts = (jj-1)*ndof 105359599516SKenneth E. Jansen do k=1,ndof 105459599516SKenneth E. Jansen if(ivartsg(indxvarts+k).ne.0) then ! none of the vartssoln(parts) were non zero 105559599516SKenneth E. Jansen varts(jj,k)=vartssolng(indxvarts+k)/ 105659599516SKenneth E. Jansen & ivartsg(indxvarts+k) 105759599516SKenneth E. Jansen endif 105859599516SKenneth E. Jansen enddo 105959599516SKenneth E. Jansen endif !only if myrank eq iv_rank(jj) 106059599516SKenneth E. Jansen enddo 106159599516SKenneth E. Jansen! endif !only on master 106259599516SKenneth E. Jansen endif !only if numpe > 1 106359599516SKenneth E. Jansen 106459599516SKenneth E. Jansen! if (myrank.eq.zero) then 106559599516SKenneth E. Jansen do jj = 1, ntspts 106659599516SKenneth E. Jansen if(myrank .eq. iv_rank(jj)) then 106759599516SKenneth E. Jansen ifile = 1000+jj 106859599516SKenneth E. Jansen write(ifile,555) lstep, (varts(jj,k),k=1,ndof) !Beware of format 555 - check ndof 106959599516SKenneth E. Jansenc call flush(ifile) 107059599516SKenneth E. Jansen if (((irs .ge. 1) .and. 107159599516SKenneth E. Jansen & (mod(lstep, ntout) .eq. 0))) then 107259599516SKenneth E. Jansen close(ifile) 107359599516SKenneth E. Jansen fvarts='varts/varts' 107459599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(jj)) 107559599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(lskeep)) 107659599516SKenneth E. Jansen fvarts=trim(fvarts)//'.dat' 107759599516SKenneth E. Jansen fvarts=trim(fvarts) 107859599516SKenneth E. Jansen open(unit=ifile, file=fvarts, 107959599516SKenneth E. Jansen & position='append') 108059599516SKenneth E. Jansen endif !only when dumping restart 108159599516SKenneth E. Jansen endif 108259599516SKenneth E. Jansen enddo 108359599516SKenneth E. Jansen! endif !only on master 108459599516SKenneth E. Jansen 108559599516SKenneth E. Jansen varts(:,:) = zero ! reset the array for next step 108659599516SKenneth E. Jansen 108759599516SKenneth E. Jansen 108859599516SKenneth E. Jansen!555 format(i6,5(2x,E12.5e2)) 108959599516SKenneth E. Jansen555 format(i6,6(2x,E20.12e2)) !assuming ndof = 6 here 109059599516SKenneth E. Jansen 109159599516SKenneth E. Jansen endif 109259599516SKenneth E. Jansen endif 109359599516SKenneth E. Jansen 109459599516SKenneth E. Jansen if((irscale.ge.0).or.(itwmod.gt.0)) 109559599516SKenneth E. Jansen & call getvel (yold, ilwork, iBC, 109659599516SKenneth E. Jansen & nsons, ifath, velbar) 109759599516SKenneth E. Jansen 109859599516SKenneth E. Jansen if((irscale.ge.0).and.(myrank.eq.master)) then 109959599516SKenneth E. Jansen call genscale(yold, x, iper, 110059599516SKenneth E. Jansen & iBC, ifath, velbar, 110159599516SKenneth E. Jansen & nsons) 110259599516SKenneth E. Jansen endif 110359599516SKenneth E. Jansenc 110459599516SKenneth E. Jansenc.... print out results. 110559599516SKenneth E. Jansenc 110659599516SKenneth E. Jansen ntoutv=max(ntout,100) ! velb is not needed so often 110759599516SKenneth E. Jansen if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then 110859599516SKenneth E. Jansen if( (mod(lstep, ntoutv) .eq. 0) .and. 110959599516SKenneth E. Jansen & ((irscale.ge.0).or.(itwmod.gt.0) .or. 111059599516SKenneth E. Jansen & ((nsonmax.eq.1).and.(iLES.gt.0)))) 111159599516SKenneth E. Jansen & call rwvelb ('out ', velbar ,ifail) 111259599516SKenneth E. Jansen endif 111359599516SKenneth E. Jansenc 111459599516SKenneth E. Jansenc.... end of the NSTEP and NTSEQ loops 111559599516SKenneth E. Jansenc 111659599516SKenneth E. Jansen 111759599516SKenneth E. Jansen 111859599516SKenneth E. Jansenc 111959599516SKenneth E. Jansenc.... -------------------> error calculation <----------------- 112059599516SKenneth E. Jansenc 112159599516SKenneth E. Jansen if(ierrcalc.eq.1 .or. ioybar.eq.1) then 112259599516SKenneth E. Jansenc$$$c 112359599516SKenneth E. Jansenc$$$c compute average 112459599516SKenneth E. Jansenc$$$c 112559599516SKenneth E. Jansenc$$$ tfact=one/istep 112659599516SKenneth E. Jansenc$$$ ybar =tfact*yold + (one-tfact)*ybar 112759599516SKenneth E. Jansen 112859599516SKenneth E. Jansenc compute average 112959599516SKenneth E. Jansenc ybar(:,1:3) are average velocity components 113059599516SKenneth E. Jansenc ybar(:,4) is average pressure 113159599516SKenneth E. Jansenc ybar(:,5) is average speed 113259599516SKenneth E. Jansenc ybar(:,6:8) is average of sq. of each vel. component 113359599516SKenneth E. Jansenc ybar(:,9) is average of sq. of pressure 113459599516SKenneth E. Jansenc ybar(:,10:12) is average of cross vel. components : uv, uw and vw 113559599516SKenneth E. Jansenc averaging procedure justified only for identical time step sizes 113659599516SKenneth E. Jansenc ybar(:,13) is average of eddy viscosity 113759599516SKenneth E. Jansenc ybar(:,14:16) is average vorticity components 113859599516SKenneth E. Jansenc ybar(:,17) is average vorticity magnitude 113959599516SKenneth E. Jansenc istep is number of time step 114059599516SKenneth E. Jansenc 114159599516SKenneth E. Jansen icollectybar = 0 114259599516SKenneth E. Jansen if(nphasesincycle.eq.0 .or. 114359599516SKenneth E. Jansen & istep.gt.ncycles_startphaseavg*nstepsincycle) then 114459599516SKenneth E. Jansen icollectybar = 1 114559599516SKenneth E. Jansen if((istep-1).eq.ncycles_startphaseavg*nstepsincycle) 114659599516SKenneth E. Jansen & istepsinybar = 0 ! init. to zero in first cycle in avg. 114759599516SKenneth E. Jansen endif 114859599516SKenneth E. Jansen 114959599516SKenneth E. Jansen if(icollectybar.eq.1) then 115059599516SKenneth E. Jansen istepsinybar = istepsinybar+1 115159599516SKenneth E. Jansen tfact=one/istepsinybar 115259599516SKenneth E. Jansen 115359599516SKenneth E. Jansen if(myrank.eq.master .and. nphasesincycle.ne.0 .and. 115459599516SKenneth E. Jansen & mod((istep-1),nstepsincycle).eq.0) 115559599516SKenneth E. Jansen & write(*,*)'nsamples in phase average:',istepsinybar 115659599516SKenneth E. Jansen 115759599516SKenneth E. Jansenc ybar to contain the averaged ((u,v,w),p)-fields 115859599516SKenneth E. Jansenc and speed average, i.e., sqrt(u^2+v^2+w^2) 115959599516SKenneth E. Jansenc and avg. of sq. terms including 116059599516SKenneth E. Jansenc u^2, v^2, w^2, p^2 and cross terms of uv, uw and vw 116159599516SKenneth E. Jansen 116259599516SKenneth E. Jansen ybar(:,1) = tfact*yold(:,1) + (one-tfact)*ybar(:,1) 116359599516SKenneth E. Jansen ybar(:,2) = tfact*yold(:,2) + (one-tfact)*ybar(:,2) 116459599516SKenneth E. Jansen ybar(:,3) = tfact*yold(:,3) + (one-tfact)*ybar(:,3) 116559599516SKenneth E. Jansen ybar(:,4) = tfact*yold(:,4) + (one-tfact)*ybar(:,4) 116659599516SKenneth E. Jansen ybar(:,5) = tfact*sqrt(yold(:,1)**2+yold(:,2)**2+ 116759599516SKenneth E. Jansen & yold(:,3)**2) + (one-tfact)*ybar(:,5) 116859599516SKenneth E. Jansen ybar(:,6) = tfact*yold(:,1)**2 + 116959599516SKenneth E. Jansen & (one-tfact)*ybar(:,6) 117059599516SKenneth E. Jansen ybar(:,7) = tfact*yold(:,2)**2 + 117159599516SKenneth E. Jansen & (one-tfact)*ybar(:,7) 117259599516SKenneth E. Jansen ybar(:,8) = tfact*yold(:,3)**2 + 117359599516SKenneth E. Jansen & (one-tfact)*ybar(:,8) 117459599516SKenneth E. Jansen ybar(:,9) = tfact*yold(:,4)**2 + 117559599516SKenneth E. Jansen & (one-tfact)*ybar(:,9) 117659599516SKenneth E. Jansen ybar(:,10) = tfact*yold(:,1)*yold(:,2) + !uv 117759599516SKenneth E. Jansen & (one-tfact)*ybar(:,10) 117859599516SKenneth E. Jansen ybar(:,11) = tfact*yold(:,1)*yold(:,3) + !uw 117959599516SKenneth E. Jansen & (one-tfact)*ybar(:,11) 118059599516SKenneth E. Jansen ybar(:,12) = tfact*yold(:,2)*yold(:,3) + !vw 118159599516SKenneth E. Jansen & (one-tfact)*ybar(:,12) 118259599516SKenneth E. Jansen!MR CHANGE 118359599516SKenneth E. Jansen if(nsclr.gt.0) !nut 118459599516SKenneth E. Jansen & ybar(:,13) = tfact*yold(:,6) + (one-tfact)*ybar(:,13) 118559599516SKenneth E. Jansen 118659599516SKenneth E. Jansen if(ivort == 1) then !vorticity 118759599516SKenneth E. Jansen ybar(:,14) = tfact*vorticity(:,1) + 118859599516SKenneth E. Jansen & (one-tfact)*ybar(:,14) 118959599516SKenneth E. Jansen ybar(:,15) = tfact*vorticity(:,2) + 119059599516SKenneth E. Jansen & (one-tfact)*ybar(:,15) 119159599516SKenneth E. Jansen ybar(:,16) = tfact*vorticity(:,3) + 119259599516SKenneth E. Jansen & (one-tfact)*ybar(:,16) 119359599516SKenneth E. Jansen ybar(:,17) = tfact*vorticity(:,4) + 119459599516SKenneth E. Jansen & (one-tfact)*ybar(:,17) 119559599516SKenneth E. Jansen endif 119659599516SKenneth E. Jansen 119759599516SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 119859599516SKenneth E. Jansen wallssVecBar(:,1) = tfact*wallssVec(:,1) 119959599516SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,1) 120059599516SKenneth E. Jansen wallssVecBar(:,2) = tfact*wallssVec(:,2) 120159599516SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,2) 120259599516SKenneth E. Jansen wallssVecBar(:,3) = tfact*wallssVec(:,3) 120359599516SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,3) 120459599516SKenneth E. Jansen endif 120559599516SKenneth E. Jansen!MR CHANGE END 120659599516SKenneth E. Jansen endif 120759599516SKenneth E. Jansenc 120859599516SKenneth E. Jansenc compute phase average 120959599516SKenneth E. Jansenc 121059599516SKenneth E. Jansen if(nphasesincycle.ne.0 .and. 121159599516SKenneth E. Jansen & istep.gt.ncycles_startphaseavg*nstepsincycle) then 121259599516SKenneth E. Jansen 121359599516SKenneth E. Jansenc beginning of cycle is considered as ncycles_startphaseavg*nstepsincycle+1 121459599516SKenneth E. Jansen if((istep-1).eq.ncycles_startphaseavg*nstepsincycle) 121559599516SKenneth E. Jansen & icyclesinavg = 0 ! init. to zero in first cycle in avg. 121659599516SKenneth E. Jansen 121759599516SKenneth E. Jansen ! find number of steps between phases 121859599516SKenneth E. Jansen nstepsbtwphase = nstepsincycle/nphasesincycle ! integer value 121959599516SKenneth E. Jansen if(mod(istep-1,nstepsincycle).eq.0) then 122059599516SKenneth E. Jansen iphase = 1 ! init. to one in beginning of every cycle 122159599516SKenneth E. Jansen icyclesinavg = icyclesinavg + 1 122259599516SKenneth E. Jansen endif 122359599516SKenneth E. Jansen 122459599516SKenneth E. Jansen icollectphase = 0 122559599516SKenneth E. Jansen istepincycle = mod(istep,nstepsincycle) 122659599516SKenneth E. Jansen if(istepincycle.eq.0) istepincycle=nstepsincycle 122759599516SKenneth E. Jansen if(istepincycle.eq.iphase*nstepsbtwphase) then 122859599516SKenneth E. Jansen icollectphase = 1 122959599516SKenneth E. Jansen iphase = iphase+1 ! use 'iphase-1' below 123059599516SKenneth E. Jansen endif 123159599516SKenneth E. Jansen 123259599516SKenneth E. Jansen if(icollectphase.eq.1) then 123359599516SKenneth E. Jansen tfactphase = one/icyclesinavg 123459599516SKenneth E. Jansen 123559599516SKenneth E. Jansen if(myrank.eq.master) then 123659599516SKenneth E. Jansen write(*,*) 'nsamples in phase ',iphase-1,': ', 123759599516SKenneth E. Jansen & icyclesinavg 123859599516SKenneth E. Jansen endif 123959599516SKenneth E. Jansen 124059599516SKenneth E. Jansen yphbar(:,1,iphase-1) = tfactphase*yold(:,1) + 124159599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,1,iphase-1) 124259599516SKenneth E. Jansen yphbar(:,2,iphase-1) = tfactphase*yold(:,2) + 124359599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,2,iphase-1) 124459599516SKenneth E. Jansen yphbar(:,3,iphase-1) = tfactphase*yold(:,3) + 124559599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,3,iphase-1) 124659599516SKenneth E. Jansen yphbar(:,4,iphase-1) = tfactphase*yold(:,4) + 124759599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,4,iphase-1) 124859599516SKenneth E. Jansen yphbar(:,5,iphase-1) = tfactphase*sqrt(yold(:,1)**2 124959599516SKenneth E. Jansen & +yold(:,2)**2+yold(:,3)**2) + 125059599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,5,iphase-1) 125159599516SKenneth E. Jansen!MR CHANGE 125259599516SKenneth E. Jansen yphbar(:,6,iphase-1) = 125359599516SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,1) 125459599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,6,iphase-1) 125559599516SKenneth E. Jansen 125659599516SKenneth E. Jansen yphbar(:,7,iphase-1) = 125759599516SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,2) 125859599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,7,iphase-1) 125959599516SKenneth E. Jansen 126059599516SKenneth E. Jansen yphbar(:,8,iphase-1) = 126159599516SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,3) 126259599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,8,iphase-1) 126359599516SKenneth E. Jansen 126459599516SKenneth E. Jansen yphbar(:,9,iphase-1) = 126559599516SKenneth E. Jansen & tfactphase*yold(:,2)*yold(:,2) 126659599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,9,iphase-1) 126759599516SKenneth E. Jansen 126859599516SKenneth E. Jansen yphbar(:,10,iphase-1) = 126959599516SKenneth E. Jansen & tfactphase*yold(:,2)*yold(:,3) 127059599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,10,iphase-1) 127159599516SKenneth E. Jansen 127259599516SKenneth E. Jansen yphbar(:,11,iphase-1) = 127359599516SKenneth E. Jansen & tfactphase*yold(:,3)*yold(:,3) 127459599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,11,iphase-1) 127559599516SKenneth E. Jansen 127659599516SKenneth E. Jansen if(ivort == 1) then 127759599516SKenneth E. Jansen yphbar(:,12,iphase-1) = 127859599516SKenneth E. Jansen & tfactphase*vorticity(:,1) 127959599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,12,iphase-1) 128059599516SKenneth E. Jansen yphbar(:,13,iphase-1) = 128159599516SKenneth E. Jansen & tfactphase*vorticity(:,2) 128259599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,13,iphase-1) 128359599516SKenneth E. Jansen yphbar(:,14,iphase-1) = 128459599516SKenneth E. Jansen & tfactphase*vorticity(:,3) 128559599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,14,iphase-1) 128659599516SKenneth E. Jansen yphbar(:,15,iphase-1) = 128759599516SKenneth E. Jansen & tfactphase*vorticity(:,4) 128859599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,15,iphase-1) 128959599516SKenneth E. Jansen endif 129059599516SKenneth E. Jansen!MR CHANGE END 129159599516SKenneth E. Jansen endif 129259599516SKenneth E. Jansen endif 129359599516SKenneth E. Jansenc 129459599516SKenneth E. Jansenc compute rms 129559599516SKenneth E. Jansenc 129659599516SKenneth E. Jansen if(icollectybar.eq.1) then 129759599516SKenneth E. Jansen rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2 129859599516SKenneth E. Jansen rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2 129959599516SKenneth E. Jansen rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2 130059599516SKenneth E. Jansen rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2 130159599516SKenneth E. Jansen endif 130259599516SKenneth E. Jansen endif 1303c89b8efeSKenneth E. Jansen 2003 continue ! we get here if stopjob equals lstep and this jumped over 1304c89b8efeSKenneth E. Jansen! the statistics computation because we have no new data to average in 1305c89b8efeSKenneth E. Jansen! rather we are just trying to output the last state that was not already 1306c89b8efeSKenneth E. Jansen! written 1307c89b8efeSKenneth E. Jansenc 1308c89b8efeSKenneth E. Jansenc.... ----------------------> Complete Restart Processing <---------------------- 1309c89b8efeSKenneth E. Jansenc 1310c89b8efeSKenneth E. Jansen! for now it is the same frequency but need to change this 1311c89b8efeSKenneth E. Jansen! soon.... but don't forget to change the field counter in 1312c89b8efeSKenneth E. Jansen! new_interface.cc 1313c89b8efeSKenneth E. Jansen! 1314c89b8efeSKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or. 1315c89b8efeSKenneth E. Jansen & istep.eq.nstep(itseq)) then 1316c89b8efeSKenneth E. Jansen if ((irs .ge. 1) .and. ((mod(lstep, ntout) .ne. 0) .or. 1317c89b8efeSKenneth E. Jansen & (nstp .eq. 0))) then 1318c89b8efeSKenneth E. Jansen if( 1319c89b8efeSKenneth E. Jansen & ((irscale.ge.0).or.(itwmod.gt.0) .or. 1320c89b8efeSKenneth E. Jansen & ((nsonmax.eq.1).and.iLES.gt.0))) 1321c89b8efeSKenneth E. Jansen & call rwvelb ('out ', velbar ,ifail) 1322c89b8efeSKenneth E. Jansen endif 132359599516SKenneth E. Jansen 1324c89b8efeSKenneth E. Jansen lesId = numeqns(1) 1325c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1326c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 1327c89b8efeSKenneth E. Jansen tcormr1 = TMRC() 1328c89b8efeSKenneth E. Jansen endif 1329efb88323SKenneth E. Jansen if((nsolflow.eq.1).and.(ipresPrjFlag.eq.1)) then 133079f1763eSKenneth E. Jansen#ifdef HAVE_LESLIB 1331c89b8efeSKenneth E. Jansen call saveLesRestart( lesId, aperm , nshg, myrank, lstep, 1332c89b8efeSKenneth E. Jansen & nPermDims ) 1333c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1334c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 1335c89b8efeSKenneth E. Jansen tcormr2 = TMRC() 1336c89b8efeSKenneth E. Jansen write(6,*) 'call saveLesRestart for projection and'// 1337c89b8efeSKenneth E. Jansen & 'pressure projection vectors', tcormr2-tcormr1 1338c89b8efeSKenneth E. Jansen endif 133979f1763eSKenneth E. Jansen#endif 1340c9a96f21SKenneth E. Jansen endif 1341c89b8efeSKenneth E. Jansen 1342c89b8efeSKenneth E. Jansen if(ierrcalc.eq.1) then 1343c89b8efeSKenneth E. Jansenc 1344c89b8efeSKenneth E. Jansenc.....smooth the error indicators 1345c89b8efeSKenneth E. Jansenc 1346c89b8efeSKenneth E. Jansen do i=1,ierrsmooth 1347c89b8efeSKenneth E. Jansen call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC ) 1348c89b8efeSKenneth E. Jansen end do 1349c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1350c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 1351c89b8efeSKenneth E. Jansen tcormr1 = TMRC() 1352c89b8efeSKenneth E. Jansen endif 1353c89b8efeSKenneth E. Jansen call write_error(myrank, lstep, nshg, 10, rerr ) 1354c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1355c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 1356c89b8efeSKenneth E. Jansen tcormr2 = TMRC() 1357c89b8efeSKenneth E. Jansen write(6,*) 'Time to write the error fields to the disks', 1358c89b8efeSKenneth E. Jansen & tcormr2-tcormr1 1359c89b8efeSKenneth E. Jansen endif 1360c89b8efeSKenneth E. Jansen endif ! ierrcalc 1361c89b8efeSKenneth E. Jansen 1362c89b8efeSKenneth E. Jansen if(ioybar.eq.1) then 1363c89b8efeSKenneth E. Jansen if(ivort == 1) then 1364c89b8efeSKenneth E. Jansen call write_field(myrank,'a','ybar',4, 1365c89b8efeSKenneth E. Jansen & ybar,'d',nshg,17,lstep) 1366c89b8efeSKenneth E. Jansen else 1367c89b8efeSKenneth E. Jansen call write_field(myrank,'a','ybar',4, 1368c89b8efeSKenneth E. Jansen & ybar,'d',nshg,13,lstep) 1369c89b8efeSKenneth E. Jansen endif 1370c89b8efeSKenneth E. Jansen 1371c89b8efeSKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 1372c89b8efeSKenneth E. Jansen call write_field(myrank,'a','wssbar',6, 1373c89b8efeSKenneth E. Jansen & wallssVecBar,'d',nshg,3,lstep) 1374c89b8efeSKenneth E. Jansen endif 1375c89b8efeSKenneth E. Jansen 1376c89b8efeSKenneth E. Jansen if(nphasesincycle .gt. 0) then 1377c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1378c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 1379c89b8efeSKenneth E. Jansen tcormr1 = TMRC() 1380c89b8efeSKenneth E. Jansen endif 1381c89b8efeSKenneth E. Jansen do iphase=1,nphasesincycle 1382c89b8efeSKenneth E. Jansen if(ivort == 1) then 1383c89b8efeSKenneth E. Jansen call write_phavg2(myrank,'a','phase_average',13,iphase, 1384c89b8efeSKenneth E. Jansen & nphasesincycle,yphbar(:,:,iphase),'d',nshg,15,lstep) 1385c89b8efeSKenneth E. Jansen else 1386c89b8efeSKenneth E. Jansen call write_phavg2(myrank,'a','phase_average',13,iphase, 1387c89b8efeSKenneth E. Jansen & nphasesincycle,yphbar(:,:,iphase),'d',nshg,11,lstep) 1388c89b8efeSKenneth E. Jansen endif 1389c89b8efeSKenneth E. Jansen end do 1390c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1391c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 1392c89b8efeSKenneth E. Jansen tcormr2 = TMRC() 1393c89b8efeSKenneth E. Jansen write(6,*) 'write all phase avg to the disks = ', 1394c89b8efeSKenneth E. Jansen & tcormr2-tcormr1 1395c89b8efeSKenneth E. Jansen endif 1396c89b8efeSKenneth E. Jansen endif !nphasesincyle 1397c89b8efeSKenneth E. Jansen endif !ioybar 1398c89b8efeSKenneth E. Jansen 1399c89b8efeSKenneth E. Jansen if ( ( ihessian .eq. 1 ) .and. ( numpe < 2 ) )then 1400c89b8efeSKenneth E. Jansen uhess = zero 1401c89b8efeSKenneth E. Jansen gradu = zero 1402c89b8efeSKenneth E. Jansen tf = zero 1403c89b8efeSKenneth E. Jansen 1404c89b8efeSKenneth E. Jansen do ku=1,nshg 1405c89b8efeSKenneth E. Jansen tf(ku,1) = x(ku,1)**3 1406c89b8efeSKenneth E. Jansen end do 1407c89b8efeSKenneth E. Jansen call hessian( yold, x, shp, shgl, iBC, 1408c89b8efeSKenneth E. Jansen & shpb, shglb, iper, ilwork, uhess, gradu ) 1409c89b8efeSKenneth E. Jansen 1410c89b8efeSKenneth E. Jansen call write_hessian( uhess, gradu, nshg ) 1411c89b8efeSKenneth E. Jansen endif 1412c89b8efeSKenneth E. Jansen 1413c89b8efeSKenneth E. Jansen if(iRANS.lt.0) then 1414c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1415c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 1416c89b8efeSKenneth E. Jansen tcormr1 = TMRC() 1417c89b8efeSKenneth E. Jansen endif 1418c89b8efeSKenneth E. Jansen call write_field(myrank,'a','dwal',4,d2wall,'d', 1419c89b8efeSKenneth E. Jansen & nshg,1,lstep) 1420c89b8efeSKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1421c89b8efeSKenneth E. Jansen if(myrank.eq.0) then 1422c89b8efeSKenneth E. Jansen tcormr2 = TMRC() 1423c89b8efeSKenneth E. Jansen write(6,*) 'Time to write dwal to the disks = ', 1424c89b8efeSKenneth E. Jansen & tcormr2-tcormr1 1425c89b8efeSKenneth E. Jansen endif 1426c89b8efeSKenneth E. Jansen endif !iRANS 1427c89b8efeSKenneth E. Jansen 1428c89b8efeSKenneth E. Jansen endif ! write out complete restart state 1429c89b8efeSKenneth E. Jansen !next 2 lines are two ways to end early 1430c89b8efeSKenneth E. Jansen if(stopjob.eq.-2) goto 2002 1431c89b8efeSKenneth E. Jansen if(istop.eq.1000) goto 2002 ! stop when delta small (see rstatic) 143259599516SKenneth E. Jansen 2000 continue 1433c89b8efeSKenneth E. Jansen 2002 continue 1434c89b8efeSKenneth E. Jansen 1435c89b8efeSKenneth E. Jansen! done with time stepping so deallocate fields already written 1436c89b8efeSKenneth E. Jansen! 1437c89b8efeSKenneth E. Jansen if(ioybar.eq.1) then 1438c89b8efeSKenneth E. Jansen deallocate(ybar) 1439c89b8efeSKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 1440c89b8efeSKenneth E. Jansen deallocate(wallssVecbar) 1441c89b8efeSKenneth E. Jansen endif 1442c89b8efeSKenneth E. Jansen if(nphasesincycle .gt. 0) then 1443c89b8efeSKenneth E. Jansen deallocate(yphbar) 1444c89b8efeSKenneth E. Jansen endif !nphasesincyle 1445c89b8efeSKenneth E. Jansen endif !ioybar 1446c89b8efeSKenneth E. Jansen if(ivort == 1) then 1447c89b8efeSKenneth E. Jansen deallocate(strain,vorticity) 1448c89b8efeSKenneth E. Jansen endif 1449c89b8efeSKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 1450c89b8efeSKenneth E. Jansen deallocate(wallssVec) 1451c89b8efeSKenneth E. Jansen endif 1452c89b8efeSKenneth E. Jansen if(iRANS.lt.0) then 1453c89b8efeSKenneth E. Jansen deallocate(d2wall) 1454c89b8efeSKenneth E. Jansen endif 145559599516SKenneth E. Jansen 145659599516SKenneth E. Jansen 145759599516SKenneth E. JansenCAD tcorecp2 = second(0) 145859599516SKenneth E. JansenCAD tcorewc2 = second(-1) 145959599516SKenneth E. Jansen 146059599516SKenneth E. JansenCAD write(6,*) 'T(core) cpu-wallclock = ',tcorecp2-tcorecp1, 146159599516SKenneth E. JansenCAD & tcorewc2-tcorewc1 146259599516SKenneth E. Jansen 146359599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 146459599516SKenneth E. Jansen if(myrank.eq.0) then 146559599516SKenneth E. Jansen tcorecp2 = TMRC() 146659599516SKenneth E. Jansen write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1 146759599516SKenneth E. Jansen write(6,*) '(Elm. form.',tcorecp(1), 146859599516SKenneth E. Jansen & ',Lin. alg. sol.',tcorecp(2),')' 146959599516SKenneth E. Jansen write(6,*) '(Elm. form. Scal.',tcorecpscal(1), 147059599516SKenneth E. Jansen & ',Lin. alg. sol. Scal.',tcorecpscal(2),')' 147159599516SKenneth E. Jansen write(6,*) '' 147259599516SKenneth E. Jansen 147359599516SKenneth E. Jansen endif 147459599516SKenneth E. Jansen 147559599516SKenneth E. Jansen call print_system_stats(tcorecp, tcorecpscal) 147659599516SKenneth E. Jansen call print_mesh_stats() 147759599516SKenneth E. Jansen call print_mpi_stats() 147859599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 147959599516SKenneth E. Jansen! return 148059599516SKenneth E. Jansenc call MPI_Finalize() 148159599516SKenneth E. Jansenc call MPI_ABORT(MPI_COMM_WORLD, ierr) 148259599516SKenneth E. Jansen 1483*75f1c48cSCameron Smith call destroyWallData 1484*75f1c48cSCameron Smith 148559599516SKenneth E. Jansen 3000 continue 148659599516SKenneth E. Jansen 148759599516SKenneth E. Jansen 148859599516SKenneth E. Jansenc 148959599516SKenneth E. Jansenc.... close history and aerodynamic forces files 149059599516SKenneth E. Jansenc 149159599516SKenneth E. Jansen if (myrank .eq. master) then 149259599516SKenneth E. Jansen! close (ihist) 149359599516SKenneth E. Jansen close (iforce) 149459599516SKenneth E. Jansen close(76) 149559599516SKenneth E. Jansen if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then 149659599516SKenneth E. Jansen close (8177) 149759599516SKenneth E. Jansen endif 149859599516SKenneth E. Jansen endif 149959599516SKenneth E. Jansenc 150059599516SKenneth E. Jansenc.... close varts file for probes 150159599516SKenneth E. Jansenc 150259599516SKenneth E. Jansen if(exts) then 150359599516SKenneth E. Jansen do jj=1,ntspts 150459599516SKenneth E. Jansen if (myrank == iv_rank(jj)) then 150559599516SKenneth E. Jansen close(1000+jj) 150659599516SKenneth E. Jansen endif 150759599516SKenneth E. Jansen enddo 150859599516SKenneth E. Jansen deallocate (ivarts) 150959599516SKenneth E. Jansen deallocate (ivartsg) 151059599516SKenneth E. Jansen deallocate (iv_rank) 151159599516SKenneth E. Jansen deallocate (vartssoln) 151259599516SKenneth E. Jansen deallocate (vartssolng) 151359599516SKenneth E. Jansen endif 151459599516SKenneth E. Jansen 151559599516SKenneth E. Jansen!MR CHANGE 151659599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 151759599516SKenneth E. Jansen if(myrank.eq.0) then 151859599516SKenneth E. Jansen write(*,*) 'itrdrv - done with aerodynamic forces' 151959599516SKenneth E. Jansen endif 152059599516SKenneth E. Jansen!MR CHANGE 152159599516SKenneth E. Jansen 152259599516SKenneth E. Jansen do isrf = 0,MAXSURF 152359599516SKenneth E. Jansen! if ( nsrflist(isrf).ne.0 ) then 152459599516SKenneth E. Jansen if ( nsrflist(isrf).ne.0 .and. 152559599516SKenneth E. Jansen & myrank.eq.irankfilesforce(isrf)) then 152659599516SKenneth E. Jansen iunit=60+isrf 152759599516SKenneth E. Jansen close(iunit) 152859599516SKenneth E. Jansen endif 152959599516SKenneth E. Jansen enddo 153059599516SKenneth E. Jansen 153159599516SKenneth E. Jansen!MR CHANGE 153259599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 153359599516SKenneth E. Jansen if(myrank.eq.0) then 153459599516SKenneth E. Jansen write(*,*) 'itrdrv - done with MAXSURF' 153559599516SKenneth E. Jansen endif 153659599516SKenneth E. Jansen!MR CHANGE 153759599516SKenneth E. Jansen 153859599516SKenneth E. Jansen 153959599516SKenneth E. Jansen 5 format(1X,F15.10,3X,F15.10,3X,F15.10,3X,F15.10) 154059599516SKenneth E. Jansen 444 format(6(2x,e14.7)) 154159599516SKenneth E. Jansenc 154259599516SKenneth E. Jansenc.... end 154359599516SKenneth E. Jansenc 154459599516SKenneth E. Jansen if(nsolflow.eq.1) then 154559599516SKenneth E. Jansen deallocate (lhsK) 154659599516SKenneth E. Jansen deallocate (lhsP) 1547ae8d68e4SKenneth E. Jansen IF (svLSFlag .NE. 1) THEN 154859599516SKenneth E. Jansen deallocate (aperm) 154959599516SKenneth E. Jansen deallocate (atemp) 1550ae8d68e4SKenneth E. Jansen ENDIF 155159599516SKenneth E. Jansen endif 155259599516SKenneth E. Jansen if(nsclrsol.gt.0) then 155359599516SKenneth E. Jansen deallocate (lhsS) 155459599516SKenneth E. Jansen deallocate (apermS) 155559599516SKenneth E. Jansen deallocate (atempS) 155659599516SKenneth E. Jansen endif 155759599516SKenneth E. Jansen 155859599516SKenneth E. Jansen if(iabc==1) deallocate(acs) 155959599516SKenneth E. Jansen 156059599516SKenneth E. Jansen!MR CHANGE 156159599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 156259599516SKenneth E. Jansen if(myrank.eq.0) then 156359599516SKenneth E. Jansen write(*,*) 'itrdrv - done - BACK TO process.f' 156459599516SKenneth E. Jansen endif 156559599516SKenneth E. Jansen!MR CHANGE 156659599516SKenneth E. Jansen 156759599516SKenneth E. Jansen 156859599516SKenneth E. Jansen 156959599516SKenneth E. Jansen return 157059599516SKenneth E. Jansen end 157159599516SKenneth E. Jansen 157259599516SKenneth E. Jansen subroutine lesmodels(y, ac, shgl, shp, 157359599516SKenneth E. Jansen & iper, ilwork, rowp, colm, 157459599516SKenneth E. Jansen & nsons, ifath, x, 157559599516SKenneth E. Jansen & iBC, BC) 157659599516SKenneth E. Jansen 157759599516SKenneth E. Jansen include "common.h" 157859599516SKenneth E. Jansen 157959599516SKenneth E. Jansen real*8 y(nshg,ndof), ac(nshg,ndof), 158059599516SKenneth E. Jansen & x(numnp,nsd), 158159599516SKenneth E. Jansen & BC(nshg,ndofBC) 158259599516SKenneth E. Jansen real*8 shp(MAXTOP,maxsh,MAXQPT), 158359599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT) 158459599516SKenneth E. Jansen 158559599516SKenneth E. Jansenc 158659599516SKenneth E. Jansen integer rowp(nshg,nnz), colm(nshg+1), 158759599516SKenneth E. Jansen & iBC(nshg), 158859599516SKenneth E. Jansen & ilwork(nlwork), 158959599516SKenneth E. Jansen & iper(nshg) 159059599516SKenneth E. Jansen dimension ifath(numnp), nsons(nfath) 159159599516SKenneth E. Jansen 159259599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: fwr2,fwr3,fwr4 159359599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: stabdis,cdelsq1 159459599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: xavegt, xavegt2,xavegt3 159559599516SKenneth E. Jansen 159659599516SKenneth E. Jansen if( (iLES.gt.1) ) then ! Allocate Stuff for advanced LES models 159759599516SKenneth E. Jansen allocate (fwr2(nshg)) 159859599516SKenneth E. Jansen allocate (fwr3(nshg)) 159959599516SKenneth E. Jansen allocate (fwr4(nshg)) 160059599516SKenneth E. Jansen allocate (xavegt(nfath,12)) 160159599516SKenneth E. Jansen allocate (xavegt2(nfath,12)) 160259599516SKenneth E. Jansen allocate (xavegt3(nfath,12)) 160359599516SKenneth E. Jansen allocate (stabdis(nfath)) 160459599516SKenneth E. Jansen endif 160559599516SKenneth E. Jansen 160659599516SKenneth E. Jansenc.... get dynamic model coefficient 160759599516SKenneth E. Jansenc 160859599516SKenneth E. Jansen ilesmod=iLES/10 160959599516SKenneth E. Jansenc 161059599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model 161159599516SKenneth E. Jansenc 161259599516SKenneth E. Jansen if (ilesmod.eq.0) then ! 0 < iLES< 10 => dyn. model calculated 161359599516SKenneth E. Jansen ! at nodes based on discrete filtering 161459599516SKenneth E. Jansen 161559599516SKenneth E. Jansen 161659599516SKenneth E. Jansen if(isubmod.eq.2) then 161759599516SKenneth E. Jansen call SUPGdis(y, ac, shgl, shp, 161859599516SKenneth E. Jansen & iper, ilwork, 161959599516SKenneth E. Jansen & nsons, ifath, x, 162059599516SKenneth E. Jansen & iBC, BC, stabdis, xavegt3) 162159599516SKenneth E. Jansen endif 162259599516SKenneth E. Jansen 162359599516SKenneth E. Jansen if( ((isubmod.eq.0).or.(isubmod.eq.2)))then ! If no 162459599516SKenneth E. Jansen ! sub-model 162559599516SKenneth E. Jansen ! or SUPG 162659599516SKenneth E. Jansen ! model wanted 162759599516SKenneth E. Jansen 162859599516SKenneth E. Jansen if(i2filt.eq.0)then ! If simple filter 162959599516SKenneth E. Jansen 163059599516SKenneth E. Jansen if(modlstats .eq. 0) then ! If no model stats wanted 163159599516SKenneth E. Jansen call getdmc (y, shgl, shp, 163259599516SKenneth E. Jansen & iper, ilwork, nsons, 163359599516SKenneth E. Jansen & ifath, x) 163459599516SKenneth E. Jansen else ! else get model stats 163559599516SKenneth E. Jansen call stdfdmc (y, shgl, shp, 163659599516SKenneth E. Jansen & iper, ilwork, nsons, 163759599516SKenneth E. Jansen & ifath, x) 163859599516SKenneth E. Jansen endif ! end of stats if statement 163959599516SKenneth E. Jansen 164059599516SKenneth E. Jansen else ! else if twice filtering 164159599516SKenneth E. Jansen 164259599516SKenneth E. Jansen call widefdmc(y, shgl, shp, 164359599516SKenneth E. Jansen & iper, ilwork, nsons, 164459599516SKenneth E. Jansen & ifath, x) 164559599516SKenneth E. Jansen 164659599516SKenneth E. Jansen 164759599516SKenneth E. Jansen endif ! end of simple filter if statement 164859599516SKenneth E. Jansen 164959599516SKenneth E. Jansen endif ! end of SUPG or no sub-model if statement 165059599516SKenneth E. Jansen 165159599516SKenneth E. Jansen 165259599516SKenneth E. Jansen if( (isubmod.eq.1) ) then ! If DFWR sub-model wanted 165359599516SKenneth E. Jansen call cdelBHsq (y, shgl, shp, 165459599516SKenneth E. Jansen & iper, ilwork, nsons, 165559599516SKenneth E. Jansen & ifath, x, cdelsq1) 165659599516SKenneth E. Jansen call FiltRat (y, shgl, shp, 165759599516SKenneth E. Jansen & iper, ilwork, nsons, 165859599516SKenneth E. Jansen & ifath, x, cdelsq1, 165959599516SKenneth E. Jansen & fwr4, fwr3) 166059599516SKenneth E. Jansen 166159599516SKenneth E. Jansen 166259599516SKenneth E. Jansen if (i2filt.eq.0) then ! If simple filter wanted 166359599516SKenneth E. Jansen call DFWRsfdmc(y, shgl, shp, 166459599516SKenneth E. Jansen & iper, ilwork, nsons, 166559599516SKenneth E. Jansen & ifath, x, fwr2, fwr3) 166659599516SKenneth E. Jansen else ! else if twice filtering wanted 166759599516SKenneth E. Jansen call DFWRwfdmc(y, shgl, shp, 166859599516SKenneth E. Jansen & iper, ilwork, nsons, 166959599516SKenneth E. Jansen & ifath, x, fwr4, fwr4) 167059599516SKenneth E. Jansen endif ! end of simple filter if statement 167159599516SKenneth E. Jansen 167259599516SKenneth E. Jansen endif ! end of DFWR sub-model if statement 167359599516SKenneth E. Jansen 167459599516SKenneth E. Jansen if( (isubmod.eq.2) )then ! If SUPG sub-model wanted 167559599516SKenneth E. Jansen call dmcSUPG (y, ac, shgl, 167659599516SKenneth E. Jansen & shp, iper, ilwork, 167759599516SKenneth E. Jansen & nsons, ifath, x, 167859599516SKenneth E. Jansen & iBC, BC, rowp, colm, 167959599516SKenneth E. Jansen & xavegt2, stabdis) 168059599516SKenneth E. Jansen endif 168159599516SKenneth E. Jansen 168259599516SKenneth E. Jansen if(idis.eq.1)then ! If SUPG/Model dissipation wanted 168359599516SKenneth E. Jansen call ediss (y, ac, shgl, 168459599516SKenneth E. Jansen & shp, iper, ilwork, 168559599516SKenneth E. Jansen & nsons, ifath, x, 168659599516SKenneth E. Jansen & iBC, BC, xavegt) 168759599516SKenneth E. Jansen endif 168859599516SKenneth E. Jansen 168959599516SKenneth E. Jansen endif ! end of ilesmod 169059599516SKenneth E. Jansen 169159599516SKenneth E. Jansen if (ilesmod .eq. 1) then ! 10 < iLES < 20 => dynamic-mixed 169259599516SKenneth E. Jansen ! at nodes based on discrete filtering 169359599516SKenneth E. Jansen call bardmc (y, shgl, shp, 169459599516SKenneth E. Jansen & iper, ilwork, 169559599516SKenneth E. Jansen & nsons, ifath, x) 169659599516SKenneth E. Jansen endif 169759599516SKenneth E. Jansen 169859599516SKenneth E. Jansen if (ilesmod .eq. 2) then ! 20 < iLES < 30 => dynamic at quad 169959599516SKenneth E. Jansen ! pts based on lumped projection filt. 170059599516SKenneth E. Jansen 170159599516SKenneth E. Jansen if(isubmod.eq.0)then 170259599516SKenneth E. Jansen call projdmc (y, shgl, shp, 170359599516SKenneth E. Jansen & iper, ilwork, x) 170459599516SKenneth E. Jansen else 170559599516SKenneth E. Jansen call cpjdmcnoi (y, shgl, shp, 170659599516SKenneth E. Jansen & iper, ilwork, x, 170759599516SKenneth E. Jansen & rowp, colm, 170859599516SKenneth E. Jansen & iBC, BC) 170959599516SKenneth E. Jansen endif 171059599516SKenneth E. Jansen 171159599516SKenneth E. Jansen endif 171259599516SKenneth E. Jansen 171359599516SKenneth E. Jansen if( (iLES.gt.1) ) then ! Deallocate Stuff for advanced LES models 171459599516SKenneth E. Jansen deallocate (fwr2) 171559599516SKenneth E. Jansen deallocate (fwr3) 171659599516SKenneth E. Jansen deallocate (fwr4) 171759599516SKenneth E. Jansen deallocate (xavegt) 171859599516SKenneth E. Jansen deallocate (xavegt2) 171959599516SKenneth E. Jansen deallocate (xavegt3) 172059599516SKenneth E. Jansen deallocate (stabdis) 172159599516SKenneth E. Jansen endif 172259599516SKenneth E. Jansen return 172359599516SKenneth E. Jansen end 172459599516SKenneth E. Jansen 172559599516SKenneth E. Jansenc 172659599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution 172759599516SKenneth E. Jansenc 172859599516SKenneth E. Jansen subroutine CalcImpConvCoef (numISrfs, numTpoints) 172959599516SKenneth E. Jansen 173059599516SKenneth E. Jansen use convolImpFlow !uses flow history and impedance for convolution 173159599516SKenneth E. Jansen 173259599516SKenneth E. Jansen include "common.h" !for alfi 173359599516SKenneth E. Jansen 173459599516SKenneth E. Jansen integer numISrfs, numTpoints 173559599516SKenneth E. Jansen 173659599516SKenneth E. Jansen allocate (ConvCoef(numTpoints+2,3)) !same time discret. for all imp. BC 173759599516SKenneth E. Jansen do j=1,numTpoints+2 173859599516SKenneth E. Jansen ConvCoef(j,:)=0.5/numTpoints !dt/2 divided by period T=N*dt 173959599516SKenneth E. Jansen ConvCoef(j,1)=ConvCoef(j,1)*(1.0-alfi)*(1.0-alfi) 174059599516SKenneth E. Jansen ConvCoef(j,2)=ConvCoef(j,2)*(1.0+2*alfi*(1.0-alfi)) 174159599516SKenneth E. Jansen ConvCoef(j,3)=ConvCoef(j,3)*alfi*alfi 174259599516SKenneth E. Jansen enddo 174359599516SKenneth E. Jansen ConvCoef(1,2)=zero 174459599516SKenneth E. Jansen ConvCoef(1,3)=zero 174559599516SKenneth E. Jansen ConvCoef(2,3)=zero 174659599516SKenneth E. Jansen ConvCoef(numTpoints+1,1)=zero 174759599516SKenneth E. Jansen ConvCoef(numTpoints+2,2)=zero 174859599516SKenneth E. Jansen ConvCoef(numTpoints+2,1)=zero 174959599516SKenneth E. Jansenc 175059599516SKenneth E. Jansenc...calculate the coefficients for the impedance convolution 175159599516SKenneth E. Jansenc 175259599516SKenneth E. Jansen allocate (ImpConvCoef(numTpoints+2,numISrfs)) 175359599516SKenneth E. Jansen 175459599516SKenneth E. Jansenc..coefficients below assume Q linear in time step, Z constant 175559599516SKenneth E. Jansenc do j=3,numTpoints 175659599516SKenneth E. Jansenc ImpConvCoef(j,:) = ValueListImp(j-1,:)*ConvCoef(j,3) 175759599516SKenneth E. Jansenc & + ValueListImp(j,:)*ConvCoef(j,2) 175859599516SKenneth E. Jansenc & + ValueListImp(j+1,:)*ConvCoef(j,1) 175959599516SKenneth E. Jansenc enddo 176059599516SKenneth E. Jansenc ImpConvCoef(1,:) = ValueListImp(2,:)*ConvCoef(1,1) 176159599516SKenneth E. Jansenc ImpConvCoef(2,:) = ValueListImp(2,:)*ConvCoef(2,2) 176259599516SKenneth E. Jansenc & + ValueListImp(3,:)*ConvCoef(2,1) 176359599516SKenneth E. Jansenc ImpConvCoef(numTpoints+1,:) = 176459599516SKenneth E. Jansenc & ValueListImp(numTpoints,:)*ConvCoef(numTpoints+1,3) 176559599516SKenneth E. Jansenc & + ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+1,2) 176659599516SKenneth E. Jansenc ImpConvCoef(numTpoints+2,:) = 176759599516SKenneth E. Jansenc & ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+2,3) 176859599516SKenneth E. Jansen 176959599516SKenneth E. Jansenc..try easiest convolution Q and Z constant per time step 177059599516SKenneth E. Jansen do j=3,numTpoints+1 177159599516SKenneth E. Jansen ImpConvCoef(j,:) = ValueListImp(j-1,:)/numTpoints 177259599516SKenneth E. Jansen enddo 177359599516SKenneth E. Jansen ImpConvCoef(1,:) =zero 177459599516SKenneth E. Jansen ImpConvCoef(2,:) =zero 177559599516SKenneth E. Jansen ImpConvCoef(numTpoints+2,:) = 177659599516SKenneth E. Jansen & ValueListImp(numTpoints+1,:)/numTpoints 177759599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr() 177859599516SKenneth E. Jansen ImpConvCoef(numTpoints+1,:)= ImpConvCoef(numTpoints+1,:) 177959599516SKenneth E. Jansen & - ImpConvCoef(numTpoints+2,:)*(1.0-alfi)/alfi 178059599516SKenneth E. Jansen ImpConvCoef(numTpoints+2,:)= ImpConvCoef(numTpoints+2,:)/alfi 178159599516SKenneth E. Jansen return 178259599516SKenneth E. Jansen end 178359599516SKenneth E. Jansen 178459599516SKenneth E. Jansenc 178559599516SKenneth E. Jansenc ... update the flow rate history for the impedance convolution, filter it and write it out 178659599516SKenneth E. Jansenc 178759599516SKenneth E. Jansen subroutine UpdHistConv(y,nsrfIdList,numSrfs) 178859599516SKenneth E. Jansen 178959599516SKenneth E. Jansen use convolImpFlow !brings ntimeptpT, QHistImp, QHistTry, QHistTryF, numImpSrfs 179059599516SKenneth E. Jansen use convolRCRFlow !brings QHistRCR, numRCRSrfs 179159599516SKenneth E. Jansen 179259599516SKenneth E. Jansen include "common.h" 179359599516SKenneth E. Jansen 179459599516SKenneth E. Jansen integer nsrfIdList(0:MAXSURF), numSrfs 179559599516SKenneth E. Jansen character*20 fname1 179659599516SKenneth E. Jansen character*10 cname2 179759599516SKenneth E. Jansen character*5 cname 179859599516SKenneth E. Jansen real*8 y(nshg,3) !velocity at time n+1 179959599516SKenneth E. Jansen real*8 NewQ(0:MAXSURF) !temporary unknown for the flow rate 180059599516SKenneth E. Jansen !that needs to be added to the flow history 180159599516SKenneth E. Jansen 180259599516SKenneth E. Jansen call GetFlowQ(NewQ,y,nsrfIdList,numSrfs) !new flow at time n+1 180359599516SKenneth E. Jansenc 180459599516SKenneth E. Jansenc... for imp BC: shift QHist, add new constribution, filter and write out 180559599516SKenneth E. Jansenc 180659599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 180759599516SKenneth E. Jansen do j=1, ntimeptpT 180859599516SKenneth E. Jansen QHistImp(j,1:numSrfs)=QHistImp(j+1,1:numSrfs) 180959599516SKenneth E. Jansen enddo 181059599516SKenneth E. Jansen QHistImp(ntimeptpT+1,1:numSrfs) = NewQ(1:numSrfs) 181159599516SKenneth E. Jansen 181259599516SKenneth E. Jansenc 181359599516SKenneth E. Jansenc....filter the flow rate history 181459599516SKenneth E. Jansenc 181559599516SKenneth E. Jansen cutfreq = 10 !hardcoded cutting frequency of the filter 181659599516SKenneth E. Jansen do j=1, ntimeptpT 181759599516SKenneth E. Jansen QHistTry(j,:)=QHistImp(j+1,:) 181859599516SKenneth E. Jansen enddo 181959599516SKenneth E. Jansen call Filter(QHistTryF,QHistTry,ntimeptpT,Delt(1),cutfreq) 182059599516SKenneth E. Jansenc.... if no filter applied then uncomment next three lines 182159599516SKenneth E. Jansenc do j=1, ntimeptpT 182259599516SKenneth E. Jansenc QHistTryF(j,:)=QHistTry(j,:) 182359599516SKenneth E. Jansenc enddo 182459599516SKenneth E. Jansen 182559599516SKenneth E. Jansenc QHistImp(1,:)=zero ! why do we do this? for beta(1,:) = zero it does not really matters 182659599516SKenneth E. Jansen do j=1, ntimeptpT 182759599516SKenneth E. Jansen QHistImp(j+1,:)=QHistTryF(j,:) 182859599516SKenneth E. Jansen enddo 182959599516SKenneth E. Jansenc 183059599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat 183159599516SKenneth E. Jansenc 183259599516SKenneth E. Jansen if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or. 183359599516SKenneth E. Jansen & (istep .eq. nstep(1)))) .and. 183459599516SKenneth E. Jansen & (myrank .eq. master)) then 183559599516SKenneth E. Jansen open(unit=816, file='Qhistor.dat',status='replace') 183659599516SKenneth E. Jansen write(816,*) ntimeptpT 183759599516SKenneth E. Jansen do j=1,ntimeptpT+1 183859599516SKenneth E. Jansen write(816,*) (QHistImp(j,n),n=1, numSrfs) 183959599516SKenneth E. Jansen enddo 184059599516SKenneth E. Jansen close(816) 184159599516SKenneth E. Jansenc... write out a copy with step number to be able to restart 184259599516SKenneth E. Jansen fname1 = 'Qhistor' 184359599516SKenneth E. Jansen fname1 = trim(fname1)//trim(cname2(lstep))//'.dat' 184459599516SKenneth E. Jansen open(unit=8166,file=trim(fname1),status='unknown') 184559599516SKenneth E. Jansen write(8166,*) ntimeptpT 184659599516SKenneth E. Jansen do j=1,ntimeptpT+1 184759599516SKenneth E. Jansen write(8166,*) (QHistImp(j,n),n=1, numSrfs) 184859599516SKenneth E. Jansen enddo 184959599516SKenneth E. Jansen close(8166) 185059599516SKenneth E. Jansen endif 185159599516SKenneth E. Jansen endif 185259599516SKenneth E. Jansen 185359599516SKenneth E. Jansenc 185459599516SKenneth E. Jansenc... for RCR bc just add the new contribution 185559599516SKenneth E. Jansenc 185659599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 185759599516SKenneth E. Jansen QHistRCR(lstep+1,1:numSrfs) = NewQ(1:numSrfs) 185859599516SKenneth E. Jansenc 185959599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat 186059599516SKenneth E. Jansenc 186159599516SKenneth E. Jansen if ((irs .ge. 1) .and. (myrank .eq. master)) then 186259599516SKenneth E. Jansen if(istep.eq.1) then 186359599516SKenneth E. Jansen open(unit=816,file='Qhistor.dat',status='unknown') 186459599516SKenneth E. Jansen else 186559599516SKenneth E. Jansen open(unit=816,file='Qhistor.dat',position='append') 186659599516SKenneth E. Jansen endif 186759599516SKenneth E. Jansen if(istep.eq.1) then 186859599516SKenneth E. Jansen do j=1,lstep 186959599516SKenneth E. Jansen write(816,*) j, (QHistRCR(j,n),n=1,numSrfs) ! read from file of previous run 187059599516SKenneth E. Jansen enddo 187159599516SKenneth E. Jansen endif 187259599516SKenneth E. Jansen write(816,*) lstep+1, (QHistRCR(lstep+1,n),n=1, numSrfs) 187359599516SKenneth E. Jansen close(816) 187459599516SKenneth E. Jansenc... write out a copy with step number to be able to restart 187559599516SKenneth E. Jansen if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or. 187659599516SKenneth E. Jansen & (istep .eq. nstep(1)))) .and. 187759599516SKenneth E. Jansen & (myrank .eq. master)) then 187859599516SKenneth E. Jansen fname1 = 'Qhistor' 187959599516SKenneth E. Jansen fname1 = trim(fname1)//trim(cname2(lstep))//'.dat' 188059599516SKenneth E. Jansen open(unit=8166,file=trim(fname1),status='unknown') 188159599516SKenneth E. Jansen write(8166,*) lstep+1 188259599516SKenneth E. Jansen do j=1,lstep+1 188359599516SKenneth E. Jansen write(8166,*) (QHistRCR(j,n),n=1, numSrfs) 188459599516SKenneth E. Jansen enddo 188559599516SKenneth E. Jansen close(8166) 188659599516SKenneth E. Jansen endif 188759599516SKenneth E. Jansen endif 188859599516SKenneth E. Jansen endif 188959599516SKenneth E. Jansen 189059599516SKenneth E. Jansen return 189159599516SKenneth E. Jansen end 189259599516SKenneth E. Jansen 189359599516SKenneth E. Jansenc 189459599516SKenneth E. Jansenc...calculate the time varying coefficients for the RCR convolution 189559599516SKenneth E. Jansenc 189659599516SKenneth E. Jansen subroutine CalcRCRConvCoef (stepn, numSrfs) 189759599516SKenneth E. Jansen 189859599516SKenneth E. Jansen use convolRCRFlow !brings in ValueListRCR, dtRCR 189959599516SKenneth E. Jansen 190059599516SKenneth E. Jansen include "common.h" !brings alfi 190159599516SKenneth E. Jansen 190259599516SKenneth E. Jansen integer numSrfs, stepn 190359599516SKenneth E. Jansen 190459599516SKenneth E. Jansen RCRConvCoef = zero 190559599516SKenneth E. Jansen if (stepn .eq. 0) then 190659599516SKenneth E. Jansen RCRConvCoef(1,:) = ValueListRCR(1,:)*(1.0-alfi) + 190759599516SKenneth E. Jansen & ValueListRCR(3,:)*(-alfi + 1.0 + 1/dtRCR(:) 190859599516SKenneth E. Jansen & - exp(-alfi*dtRCR(:))*(1 + 1/dtRCR(:))) 190959599516SKenneth E. Jansen RCRConvCoef(2,:) = ValueListRCR(1,:)*alfi 191059599516SKenneth E. Jansen & + ValueListRCR(3,:) 191159599516SKenneth E. Jansen & *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:)) 191259599516SKenneth E. Jansen endif 191359599516SKenneth E. Jansen if (stepn .ge. 1) then 191459599516SKenneth E. Jansen RCRConvCoef(1,:) =-ValueListRCR(3,:)*exp(-dtRCR(:)*(stepn+alfi)) 191559599516SKenneth E. Jansen & *(1 + (1 - exp(dtRCR(:)))/dtRCR(:)) 191659599516SKenneth E. Jansen RCRConvCoef(stepn+1,:) = ValueListRCR(1,:)*(1-alfi) 191759599516SKenneth E. Jansen & - ValueListRCR(3,:)*(alfi - 1 - 1/dtRCR(:) 191859599516SKenneth E. Jansen & + exp(-alfi*dtRCR(:))/dtRCR(:)*(2 - exp(-dtRCR(:)))) 191959599516SKenneth E. Jansen RCRConvCoef(stepn+2,:) = ValueListRCR(1,:)*alfi 192059599516SKenneth E. Jansen & + ValueListRCR(3,:) 192159599516SKenneth E. Jansen & *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:)) 192259599516SKenneth E. Jansen endif 192359599516SKenneth E. Jansen if (stepn .ge. 2) then 192459599516SKenneth E. Jansen do j=2,stepn 192559599516SKenneth E. Jansen RCRConvCoef(j,:) = ValueListRCR(3,:)/dtRCR(:)* 192659599516SKenneth E. Jansen & exp(-dtRCR(:)*(stepn + alfi + 2 - j))* 192759599516SKenneth E. Jansen & (1 - exp(dtRCR(:)))**2 192859599516SKenneth E. Jansen enddo 192959599516SKenneth E. Jansen endif 193059599516SKenneth E. Jansen 193159599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr() 193259599516SKenneth E. Jansen RCRConvCoef(stepn+1,:)= RCRConvCoef(stepn+1,:) 193359599516SKenneth E. Jansen & - RCRConvCoef(stepn+2,:)*(1.0-alfi)/alfi 193459599516SKenneth E. Jansen RCRConvCoef(stepn+2,:)= RCRConvCoef(stepn+2,:)/alfi 193559599516SKenneth E. Jansen 193659599516SKenneth E. Jansen return 193759599516SKenneth E. Jansen end 193859599516SKenneth E. Jansen 193959599516SKenneth E. Jansenc 194059599516SKenneth E. Jansenc...calculate the time dependent H operator for the RCR convolution 194159599516SKenneth E. Jansenc 194259599516SKenneth E. Jansen subroutine CalcHopRCR (timestepRCR, stepn, numSrfs) 194359599516SKenneth E. Jansen 194459599516SKenneth E. Jansen use convolRCRFlow !brings in HopRCR, dtRCR 194559599516SKenneth E. Jansen 194659599516SKenneth E. Jansen include "common.h" 194759599516SKenneth E. Jansen 194859599516SKenneth E. Jansen integer numSrfs, stepn 194959599516SKenneth E. Jansen real*8 PdistCur(0:MAXSURF), timestepRCR 195059599516SKenneth E. Jansen 195159599516SKenneth E. Jansen HopRCR=zero 195259599516SKenneth E. Jansen call RCRint(timestepRCR*(stepn + alfi),PdistCur) 195359599516SKenneth E. Jansen HopRCR(1:numSrfs) = RCRic(1:numSrfs) 195459599516SKenneth E. Jansen & *exp(-dtRCR(1:numSrfs)*(stepn + alfi)) + PdistCur(1:numSrfs) 195559599516SKenneth E. Jansen return 195659599516SKenneth E. Jansen end 195759599516SKenneth E. Jansenc 195859599516SKenneth E. Jansenc ... initialize the influence of the initial conditions for the RCR BC 195959599516SKenneth E. Jansenc 196059599516SKenneth E. Jansen subroutine calcRCRic(y,srfIdList,numSrfs) 196159599516SKenneth E. Jansen 196259599516SKenneth E. Jansen use convolRCRFlow !brings RCRic, ValueListRCR, ValuePdist 196359599516SKenneth E. Jansen 196459599516SKenneth E. Jansen include "common.h" 196559599516SKenneth E. Jansen 196659599516SKenneth E. Jansen integer srfIdList(0:MAXSURF), numSrfs, irankCoupled 196759599516SKenneth E. Jansen real*8 y(nshg,4) !need velocity and pressure 196859599516SKenneth E. Jansen real*8 Qini(0:MAXSURF) !initial flow rate 196959599516SKenneth E. Jansen real*8 PdistIni(0:MAXSURF) !initial distal pressure 197059599516SKenneth E. Jansen real*8 Pini(0:MAXSURF),CoupleArea(0:MAXSURF) ! initial pressure 197159599516SKenneth E. Jansen real*8 VelOnly(nshg,3), POnly(nshg) 197259599516SKenneth E. Jansen 197359599516SKenneth E. Jansen allocate (RCRic(0:MAXSURF)) 197459599516SKenneth E. Jansen 197559599516SKenneth E. Jansen if(lstep.eq.0) then 197659599516SKenneth E. Jansen VelOnly(:,1:3)=y(:,1:3) 197759599516SKenneth E. Jansen call GetFlowQ(Qini,VelOnly,srfIdList,numSrfs) !get initial flow 197859599516SKenneth E. Jansen QHistRCR(1,1:numSrfs)=Qini(1:numSrfs) !initialize QHistRCR 197959599516SKenneth E. Jansen POnly(:)=y(:,4) ! pressure 198059599516SKenneth E. Jansen call integrScalar(Pini,POnly,srfIdList,numSrfs) !get initial pressure integral 198159599516SKenneth E. Jansen POnly(:)=one ! one to get area 198259599516SKenneth E. Jansen call integrScalar(CoupleArea,POnly,srfIdList,numSrfs) !get surf area 198359599516SKenneth E. Jansen Pini(1:numSrfs) = Pini(1:numSrfs)/CoupleArea(1:numSrfs) 198459599516SKenneth E. Jansen else 198559599516SKenneth E. Jansen Qini(1:numSrfs)=QHistRCR(1,1:numSrfs) 198659599516SKenneth E. Jansen Pini(1:numSrfs)=zero ! hack 198759599516SKenneth E. Jansen endif 198859599516SKenneth E. Jansen call RCRint(istep,PdistIni) !get initial distal P (use istep) 198959599516SKenneth E. Jansen RCRic(1:numSrfs) = Pini(1:numSrfs) 199059599516SKenneth E. Jansen & - ValueListRCR(1,:)*Qini(1:numSrfs)-PdistIni(1:numSrfs) 199159599516SKenneth E. Jansen return 199259599516SKenneth E. Jansen end 199359599516SKenneth E. Jansen 199459599516SKenneth E. Jansenc.........function that integrates a scalar over a boundary 199559599516SKenneth E. Jansen subroutine integrScalar(scalInt,scal,srfIdList,numSrfs) 199659599516SKenneth E. Jansen 199759599516SKenneth E. Jansen use pvsQbi !brings ndsurf, NASC 199859599516SKenneth E. Jansen 199959599516SKenneth E. Jansen include "common.h" 200059599516SKenneth E. Jansen include "mpif.h" 200159599516SKenneth E. Jansen 200259599516SKenneth E. Jansen integer srfIdList(0:MAXSURF), numSrfs, irankCoupled, i, k 200359599516SKenneth E. Jansen real*8 scal(nshg), scalInt(0:MAXSURF), scalIntProc(0:MAXSURF) 200459599516SKenneth E. Jansen 200559599516SKenneth E. Jansen scalIntProc = zero 200659599516SKenneth E. Jansen do i = 1,nshg 200759599516SKenneth E. Jansen if(numSrfs.gt.zero) then 200859599516SKenneth E. Jansen do k = 1,numSrfs 200959599516SKenneth E. Jansen irankCoupled = 0 201059599516SKenneth E. Jansen if (srfIdList(k).eq.ndsurf(i)) then 201159599516SKenneth E. Jansen irankCoupled=k 201259599516SKenneth E. Jansen scalIntProc(irankCoupled) = scalIntProc(irankCoupled) 201359599516SKenneth E. Jansen & + NASC(i)*scal(i) 201459599516SKenneth E. Jansen exit 201559599516SKenneth E. Jansen endif 201659599516SKenneth E. Jansen enddo 201759599516SKenneth E. Jansen endif 201859599516SKenneth E. Jansen enddo 201959599516SKenneth E. Jansenc 202059599516SKenneth E. Jansenc at this point, each scalint has its "nodes" contributions to the scalar 202159599516SKenneth E. Jansenc accumulated into scalIntProc. Note, because NASC is on processor this 202259599516SKenneth E. Jansenc will NOT be the scalar for the surface yet 202359599516SKenneth E. Jansenc 202459599516SKenneth E. Jansenc.... reduce integrated scalar for each surface, push on scalInt 202559599516SKenneth E. Jansenc 202659599516SKenneth E. Jansen npars=MAXSURF+1 202759599516SKenneth E. Jansen call MPI_ALLREDUCE (scalIntProc, scalInt(:), npars, 202859599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 202959599516SKenneth E. Jansen 203059599516SKenneth E. Jansen return 203159599516SKenneth E. Jansen end 203259599516SKenneth E. Jansen 20339071d3baSCameron Smith subroutine writeTimingMessage(key,iomode,timing) 20349071d3baSCameron Smith use iso_c_binding 20359071d3baSCameron Smith use phstr 20369071d3baSCameron Smith implicit none 203759599516SKenneth E. Jansen 20389071d3baSCameron Smith character(len=*) :: key 20399071d3baSCameron Smith integer :: iomode 20409071d3baSCameron Smith real*8 :: timing 2041da7d5714SCameron Smith character(len=1024) :: timing_msg 204289625e43SCameron Smith character(len=*), parameter :: 204389625e43SCameron Smith & streamModeString = c_char_"stream"//c_null_char, 204489625e43SCameron Smith & fileModeString = c_char_"disk"//c_null_char 204559599516SKenneth E. Jansen 2046da7d5714SCameron Smith timing_msg = c_char_"Time to write "//c_null_char 20479071d3baSCameron Smith call phstr_appendStr(timing_msg,key) 20489071d3baSCameron Smith if ( iomode .eq. -1 ) then 20499071d3baSCameron Smith call phstr_appendStr(timing_msg, streamModeString) 20509071d3baSCameron Smith else 20519071d3baSCameron Smith call phstr_appendStr(timing_msg, fileModeString) 20529071d3baSCameron Smith endif 20539071d3baSCameron Smith call phstr_appendStr(timing_msg, c_char_' = '//c_null_char) 20549071d3baSCameron Smith call phstr_appendDbl(timing_msg, timing) 2055da7d5714SCameron Smith write(6,*) trim(timing_msg) 20569071d3baSCameron Smith return 20579071d3baSCameron Smith end subroutine 205859599516SKenneth E. Jansen 2059