1*59599516SKenneth E. Jansen subroutine itrdrv (y, ac, 2*59599516SKenneth E. Jansen & uold, x, 3*59599516SKenneth E. Jansen & iBC, BC, 4*59599516SKenneth E. Jansen & iper, ilwork, shp, 5*59599516SKenneth E. Jansen & shgl, shpb, shglb, 6*59599516SKenneth E. Jansen & ifath, velbar, nsons ) 7*59599516SKenneth E. Jansenc 8*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 9*59599516SKenneth E. Jansenc 10*59599516SKenneth E. Jansenc This iterative driver is the semi-discrete, predictor multi-corrector 11*59599516SKenneth E. Jansenc algorithm. It contains the Hulbert Generalized Alpha method which 12*59599516SKenneth E. Jansenc is 2nd order accurate for Rho_inf from 0 to 1. The method can be 13*59599516SKenneth E. Jansenc made first-order accurate by setting Rho_inf=-1. It uses CGP and 14*59599516SKenneth E. Jansenc GMRES iterative solvers. 15*59599516SKenneth E. Jansenc 16*59599516SKenneth E. Jansenc working arrays: 17*59599516SKenneth E. Jansenc y (nshg,ndof) : Y variables 18*59599516SKenneth E. Jansenc x (nshg,nsd) : node coordinates 19*59599516SKenneth E. Jansenc iBC (nshg) : BC codes 20*59599516SKenneth E. Jansenc BC (nshg,ndofBC) : BC constraint parameters 21*59599516SKenneth E. Jansenc iper (nshg) : periodicity table 22*59599516SKenneth E. Jansenc 23*59599516SKenneth E. Jansenc 24*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 25*59599516SKenneth E. Jansenc Alberto Figueroa, Winter 2004. CMM-FSI 26*59599516SKenneth E. Jansenc Irene Vignon, Fall 2004. Impedance BC 27*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 28*59599516SKenneth E. Jansenc 29*59599516SKenneth E. Jansen use pvsQbi !gives us splag (the spmass at the end of this run 30*59599516SKenneth E. Jansen use specialBC !gives us itvn 31*59599516SKenneth E. Jansen use timedata !allows collection of time series 32*59599516SKenneth E. Jansen use convolImpFlow !for Imp bc 33*59599516SKenneth E. Jansen use convolRCRFlow !for RCR bc 34*59599516SKenneth E. Jansen!MR CHANGE 35*59599516SKenneth E. Jansen use turbsa ! used to access d2wall 36*59599516SKenneth E. Jansen!MR CHANGE END 37*59599516SKenneth E. Jansen 38*59599516SKenneth E. Jansenc use readarrays !reads in uold and acold 39*59599516SKenneth E. Jansen 40*59599516SKenneth E. Jansen include "common.h" 41*59599516SKenneth E. Jansen include "mpif.h" 42*59599516SKenneth E. Jansen include "auxmpi.h" 43*59599516SKenneth E. Jansenc 44*59599516SKenneth E. Jansen 45*59599516SKenneth E. Jansen 46*59599516SKenneth E. Jansen real*8 y(nshg,ndof), ac(nshg,ndof), 47*59599516SKenneth E. Jansen & yold(nshg,ndof), acold(nshg,ndof), 48*59599516SKenneth E. Jansen & u(nshg,nsd), uold(nshg,nsd), 49*59599516SKenneth E. Jansen & x(numnp,nsd), solinc(nshg,ndof), 50*59599516SKenneth E. Jansen & BC(nshg,ndofBC), tf(nshg,ndof), 51*59599516SKenneth E. Jansen & GradV(nshg,nsdsq) 52*59599516SKenneth E. Jansen 53*59599516SKenneth E. Jansenc 54*59599516SKenneth E. Jansen real*8 res(nshg,ndof) 55*59599516SKenneth E. Jansenc 56*59599516SKenneth E. Jansen real*8 shp(MAXTOP,maxsh,MAXQPT), 57*59599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 58*59599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 59*59599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 60*59599516SKenneth E. Jansenc 61*59599516SKenneth E. Jansen integer rowp(nshg,nnz), colm(nshg+1), 62*59599516SKenneth E. Jansen & iBC(nshg), 63*59599516SKenneth E. Jansen & ilwork(nlwork), 64*59599516SKenneth E. Jansen & iper(nshg), ifuncs(6) 65*59599516SKenneth E. Jansen 66*59599516SKenneth E. Jansen real*8 vbc_prof(nshg,3) 67*59599516SKenneth E. Jansen 68*59599516SKenneth E. Jansen integer stopjob 69*59599516SKenneth E. Jansen character*10 cname2 70*59599516SKenneth E. Jansen character*5 cname 71*59599516SKenneth E. Jansenc 72*59599516SKenneth E. Jansenc stuff for dynamic model s.w.avg and wall model 73*59599516SKenneth E. Jansenc 74*59599516SKenneth E. Jansen dimension ifath(numnp), velbar(nfath,ndof), nsons(nfath) 75*59599516SKenneth E. Jansen 76*59599516SKenneth E. Jansen dimension wallubar(2),walltot(2) 77*59599516SKenneth E. Jansenc 78*59599516SKenneth E. Jansenc.... For Farzin's Library 79*59599516SKenneth E. Jansenc 80*59599516SKenneth E. Jansen integer eqnType, prjFlag, presPrjFlag, verbose 81*59599516SKenneth E. Jansenc 82*59599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: aperm, atemp, atempS 83*59599516SKenneth E. Jansen real*8, allocatable, dimension(:,:,:) :: apermS 84*59599516SKenneth E. Jansen 85*59599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: lhsP, lhsK, lhsS 86*59599516SKenneth E. Jansen real*8 almit, alfit, gamit 87*59599516SKenneth E. Jansenc 88*59599516SKenneth E. Jansen character*1024 servername 89*59599516SKenneth E. Jansen character*20 fname1,fmt1 90*59599516SKenneth E. Jansen character*20 fname2,fmt2 91*59599516SKenneth E. Jansen character*60 fnamepold, fvarts 92*59599516SKenneth E. Jansen character*4 fname4c ! 4 characters 93*59599516SKenneth E. Jansen integer iarray(50) ! integers for headers 94*59599516SKenneth E. Jansen integer isgn(ndof), isgng(ndof) 95*59599516SKenneth E. Jansen 96*59599516SKenneth E. Jansen!MR CHANGE 97*59599516SKenneth E. Jansen! real*8 rerr(nshg,10), ybar(nshg,13) ! including 7 sq. terms with 3 cross terms of uv, uw and vw 98*59599516SKenneth E. Jansen! real*8 rerr(nshg,10), ybar(nshg,12) ! including 7 sq. terms with 3 cross terms of uv, uw and vw 99*59599516SKenneth E. Jansen real*8 rerr(nshg,10) 100*59599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: ybar, strain, vorticity 101*59599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: wallssVec, wallssVecbar 102*59599516SKenneth E. Jansen!MR CHANGE 103*59599516SKenneth E. Jansen 104*59599516SKenneth E. Jansen real*8 tcorecp(2), tcorecpscal(2) 105*59599516SKenneth E. Jansen 106*59599516SKenneth E. Jansen integer, allocatable, dimension(:) :: ivarts 107*59599516SKenneth E. Jansen integer, allocatable, dimension(:) :: ivartsg 108*59599516SKenneth E. Jansen integer, allocatable, dimension(:) :: iv_rank 109*59599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: vartssoln 110*59599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: vartssolng 111*59599516SKenneth E. Jansen real*8, allocatable, dimension(:,:,:) :: yphbar 112*59599516SKenneth E. Jansen real*8 CFLworst(numel) 113*59599516SKenneth E. Jansen 114*59599516SKenneth E. Jansen!MR CHANGE 115*59599516SKenneth E. Jansen integer :: iv_rankpernode, iv_totnodes, iv_totcores 116*59599516SKenneth E. Jansen integer :: iv_node, iv_core, iv_thread 117*59599516SKenneth E. Jansen!MR CHANGE 118*59599516SKenneth E. Jansen 119*59599516SKenneth E. Jansen impistat = 0 120*59599516SKenneth E. Jansen impistat2 = 0 121*59599516SKenneth E. Jansen iISend = 0 122*59599516SKenneth E. Jansen iISendScal = 0 123*59599516SKenneth E. Jansen iIRecv = 0 124*59599516SKenneth E. Jansen iIRecvScal = 0 125*59599516SKenneth E. Jansen iWaitAll = 0 126*59599516SKenneth E. Jansen iWaitAllScal = 0 127*59599516SKenneth E. Jansen iAllR = 0 128*59599516SKenneth E. Jansen iAllRScal = 0 129*59599516SKenneth E. Jansen rISend = zero 130*59599516SKenneth E. Jansen rISendScal = zero 131*59599516SKenneth E. Jansen rIRecv = zero 132*59599516SKenneth E. Jansen rIRecvScal = zero 133*59599516SKenneth E. Jansen rWaitAll = zero 134*59599516SKenneth E. Jansen rWaitAllScal = zero 135*59599516SKenneth E. Jansen rAllR = zero 136*59599516SKenneth E. Jansen rAllRScal = zero 137*59599516SKenneth E. Jansen rCommu = zero 138*59599516SKenneth E. Jansen rCommuScal = zero 139*59599516SKenneth E. Jansen 140*59599516SKenneth E. Jansen call initmemstat() 141*59599516SKenneth E. Jansen 142*59599516SKenneth E. Jansenc 143*59599516SKenneth E. Jansenc hack SA variable 144*59599516SKenneth E. Jansenc 145*59599516SKenneth E. JansencHack BC(:,7)=BC(:,7)*0.001 146*59599516SKenneth E. JansencHack if(lstep.eq.0) y(:,6)=y(:,6)*0.001 147*59599516SKenneth E. Jansen call SolverLicenseServer(servername) 148*59599516SKenneth E. Jansenc 149*59599516SKenneth E. Jansenc only master should be verbose 150*59599516SKenneth E. Jansenc 151*59599516SKenneth E. Jansen 152*59599516SKenneth E. Jansen if(numpe.gt.0 .and. myrank.ne.master)iverbose=0 153*59599516SKenneth E. Jansenc 154*59599516SKenneth E. Jansen 155*59599516SKenneth E. Jansen lskeep=lstep 156*59599516SKenneth E. Jansen 157*59599516SKenneth E. Jansen inquire(file='xyzts.dat',exist=exts) 158*59599516SKenneth E. Jansen if(exts) then 159*59599516SKenneth E. Jansen 160*59599516SKenneth E. Jansen open(unit=626,file='xyzts.dat',status='old') 161*59599516SKenneth E. Jansen read(626,*) ntspts, freq, tolpt, iterat, varcod 162*59599516SKenneth E. Jansen call sTD ! sets data structures 163*59599516SKenneth E. Jansen 164*59599516SKenneth E. Jansen do jj=1,ntspts ! read coordinate data where solution desired 165*59599516SKenneth E. Jansen read(626,*) ptts(jj,1),ptts(jj,2),ptts(jj,3) 166*59599516SKenneth E. Jansen enddo 167*59599516SKenneth E. Jansen close(626) 168*59599516SKenneth E. Jansen 169*59599516SKenneth E. Jansen statptts(:,:) = 0 170*59599516SKenneth E. Jansen parptts(:,:) = zero 171*59599516SKenneth E. Jansen varts(:,:) = zero 172*59599516SKenneth E. Jansen 173*59599516SKenneth E. Jansen allocate (ivarts(ntspts*ndof)) 174*59599516SKenneth E. Jansen allocate (ivartsg(ntspts*ndof)) 175*59599516SKenneth E. Jansen allocate (iv_rank(ntspts)) 176*59599516SKenneth E. Jansen allocate (vartssoln(ntspts*ndof)) 177*59599516SKenneth E. Jansen allocate (vartssolng(ntspts*ndof)) 178*59599516SKenneth E. Jansen 179*59599516SKenneth E. Jansen iv_rankpernode = iv_rankpercore*iv_corepernode 180*59599516SKenneth E. Jansen iv_totnodes = numpe/iv_rankpernode 181*59599516SKenneth E. Jansen iv_totcores = iv_corepernode*iv_totnodes 182*59599516SKenneth E. Jansen if (myrank .eq. 0) then 183*59599516SKenneth E. Jansen write(*,*) 'Info for probes:' 184*59599516SKenneth E. Jansen write(*,*) ' Ranks per core:',iv_rankpercore 185*59599516SKenneth E. Jansen write(*,*) ' Cores per node:',iv_corepernode 186*59599516SKenneth E. Jansen write(*,*) ' Ranks per node:',iv_rankpernode 187*59599516SKenneth E. Jansen write(*,*) ' Total number of nodes:',iv_totnodes 188*59599516SKenneth E. Jansen write(*,*) ' Total number of cores',iv_totcores 189*59599516SKenneth E. Jansen endif 190*59599516SKenneth E. Jansen 191*59599516SKenneth E. Jansen! if (myrank .eq. numpe-1) then 192*59599516SKenneth E. Jansen do jj=1,ntspts 193*59599516SKenneth E. Jansen 194*59599516SKenneth E. Jansen ! Compute the adequate rank which will take care of probe jj 195*59599516SKenneth E. Jansen jjm1 = jj-1 196*59599516SKenneth E. Jansen iv_node = (iv_totnodes-1)-mod(jjm1,iv_totnodes) 197*59599516SKenneth E. Jansen iv_core = (iv_corepernode-1) - mod((jjm1 - 198*59599516SKenneth E. Jansen & mod(jjm1,iv_totnodes))/iv_totnodes,iv_corepernode) 199*59599516SKenneth E. Jansen iv_thread = (iv_rankpercore-1) - mod((jjm1- 200*59599516SKenneth E. Jansen & (mod(jjm1,iv_totcores)))/iv_totcores,iv_rankpercore) 201*59599516SKenneth E. Jansen iv_rank(jj) = iv_node*iv_rankpernode 202*59599516SKenneth E. Jansen & + iv_core*iv_rankpercore 203*59599516SKenneth E. Jansen & + iv_thread 204*59599516SKenneth E. Jansen 205*59599516SKenneth E. Jansen if(myrank == 0) then 206*59599516SKenneth E. Jansen write(*,*) ' Probe', jj, 'handled by rank', 207*59599516SKenneth E. Jansen & iv_rank(jj), ' on node', iv_node 208*59599516SKenneth E. Jansen endif 209*59599516SKenneth E. Jansen 210*59599516SKenneth E. Jansen ! Verification just in case 211*59599516SKenneth E. Jansen if(iv_rank(jj) .lt.0 .or. iv_rank(jj) .ge. numpe) then 212*59599516SKenneth E. Jansen write(*,*) 'WARNING: iv_rank(',jj,') is ', iv_rank(jj), 213*59599516SKenneth E. Jansen & ' and reset to numpe-1' 214*59599516SKenneth E. Jansen iv_rank(jj) = numpe-1 215*59599516SKenneth E. Jansen endif 216*59599516SKenneth E. Jansen 217*59599516SKenneth E. Jansen ! Open the varts files 218*59599516SKenneth E. Jansen if(myrank == iv_rank(jj)) then 219*59599516SKenneth E. Jansen fvarts='varts/varts' 220*59599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(jj)) 221*59599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(lstep)) 222*59599516SKenneth E. Jansen fvarts=trim(fvarts)//'.dat' 223*59599516SKenneth E. Jansen fvarts=trim(fvarts) 224*59599516SKenneth E. Jansen open(unit=1000+jj, file=fvarts, status='unknown') 225*59599516SKenneth E. Jansen endif 226*59599516SKenneth E. Jansen enddo 227*59599516SKenneth E. Jansen! endif 228*59599516SKenneth E. Jansen 229*59599516SKenneth E. Jansen endif 230*59599516SKenneth E. Jansenc 231*59599516SKenneth E. Jansenc.... open history and aerodynamic forces files 232*59599516SKenneth E. Jansenc 233*59599516SKenneth E. Jansen if (myrank .eq. master) then 234*59599516SKenneth E. Jansen! open (unit=ihist, file=fhist, status='unknown') 235*59599516SKenneth E. Jansen open (unit=iforce, file=fforce, status='unknown') 236*59599516SKenneth E. Jansen open (unit=76, file="fort.76", status='unknown') 237*59599516SKenneth E. Jansen if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then 238*59599516SKenneth E. Jansen fnamepold = 'pold' 239*59599516SKenneth E. Jansen fnamepold = trim(fnamepold)//trim(cname2(lstep)) 240*59599516SKenneth E. Jansen fnamepold = trim(fnamepold)//'.dat' 241*59599516SKenneth E. Jansen fnamepold = trim(fnamepold) 242*59599516SKenneth E. Jansen open (unit=8177, file=fnamepold, status='unknown') 243*59599516SKenneth E. Jansen endif 244*59599516SKenneth E. Jansen endif 245*59599516SKenneth E. Jansenc 246*59599516SKenneth E. Jansenc.... initialize 247*59599516SKenneth E. Jansenc 248*59599516SKenneth E. Jansen ifuncs(:) = 0 ! func. evaluation counter 249*59599516SKenneth E. Jansen istep = 0 250*59599516SKenneth E. Jansen yold = y 251*59599516SKenneth E. Jansen acold = ac 252*59599516SKenneth E. Jansen 253*59599516SKenneth E. Jansen rerr = zero 254*59599516SKenneth E. Jansen 255*59599516SKenneth E. Jansen if(ierrcalc.eq.1 .or. ioybar.eq.1) then ! we need ybar for error too 256*59599516SKenneth E. Jansen if (ivort == 1) then 257*59599516SKenneth E. Jansen allocate(ybar(nshg,17)) ! more space for vorticity if requested 258*59599516SKenneth E. Jansen else 259*59599516SKenneth E. Jansen allocate(ybar(nshg,13)) 260*59599516SKenneth E. Jansen endif 261*59599516SKenneth E. Jansen ybar = zero ! Initialize ybar to zero, which is essential 262*59599516SKenneth E. Jansen endif 263*59599516SKenneth E. Jansen 264*59599516SKenneth E. Jansen if(ivort == 1) then 265*59599516SKenneth E. Jansen allocate(strain(nshg,6)) 266*59599516SKenneth E. Jansen allocate(vorticity(nshg,5)) 267*59599516SKenneth E. Jansen endif 268*59599516SKenneth E. Jansen 269*59599516SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 270*59599516SKenneth E. Jansen allocate(wallssVec(nshg,3)) 271*59599516SKenneth E. Jansen if (ioybar .eq. 1) then 272*59599516SKenneth E. Jansen allocate(wallssVecbar(nshg,3)) 273*59599516SKenneth E. Jansen wallssVecbar = zero ! Initialization important if mean wss computed 274*59599516SKenneth E. Jansen endif 275*59599516SKenneth E. Jansen endif 276*59599516SKenneth E. Jansen 277*59599516SKenneth E. Jansen! both nstepsincycle and nphasesincycle needs to be set 278*59599516SKenneth E. Jansen if(nstepsincycle.eq.0) nphasesincycle = 0 279*59599516SKenneth E. Jansen if(nphasesincycle.ne.0) then 280*59599516SKenneth E. Jansen! & allocate(yphbar(nshg,5,nphasesincycle)) 281*59599516SKenneth E. Jansen if (ivort == 1) then 282*59599516SKenneth E. Jansen allocate(yphbar(nshg,15,nphasesincycle)) ! more space for vorticity 283*59599516SKenneth E. Jansen else 284*59599516SKenneth E. Jansen allocate(yphbar(nshg,11,nphasesincycle)) 285*59599516SKenneth E. Jansen endif 286*59599516SKenneth E. Jansen yphbar = zero 287*59599516SKenneth E. Jansen endif 288*59599516SKenneth E. Jansen 289*59599516SKenneth E. Jansen!MR CHANGE END 290*59599516SKenneth E. Jansen 291*59599516SKenneth E. Jansen vbc_prof(:,1:3) = BC(:,3:5) 292*59599516SKenneth E. Jansen if(iramp.eq.1) then 293*59599516SKenneth E. Jansen call BCprofileInit(vbc_prof,x) 294*59599516SKenneth E. Jansen endif 295*59599516SKenneth E. Jansen 296*59599516SKenneth E. Jansenc 297*59599516SKenneth E. Jansenc.... ---------------> initialize Farzin's Library <--------------- 298*59599516SKenneth E. Jansenc 299*59599516SKenneth E. Jansenc.... assign parameter values 300*59599516SKenneth E. Jansenc 301*59599516SKenneth E. Jansen do i = 1, 100 302*59599516SKenneth E. Jansen numeqns(i) = i 303*59599516SKenneth E. Jansen enddo 304*59599516SKenneth E. Jansen nKvecs = Kspace 305*59599516SKenneth E. Jansen prjFlag = iprjFlag 306*59599516SKenneth E. Jansen presPrjFlag = ipresPrjFlag 307*59599516SKenneth E. Jansen verbose = iverbose 308*59599516SKenneth E. Jansenc 309*59599516SKenneth E. Jansenc.... determine how many scalar equations we are going to need to solve 310*59599516SKenneth E. Jansenc 311*59599516SKenneth E. Jansen nsolt=mod(impl(1),2) ! 1 if solving temperature 312*59599516SKenneth E. Jansen nsclrsol=nsolt+nsclr ! total number of scalars solved At 313*59599516SKenneth E. Jansen ! some point we probably want to create 314*59599516SKenneth E. Jansen ! a map, considering stepseq(), to find 315*59599516SKenneth E. Jansen ! what is actually solved and only 316*59599516SKenneth E. Jansen ! dimension lhs to the appropriate 317*59599516SKenneth E. Jansen ! size. (see 1.6.1 and earlier for a 318*59599516SKenneth E. Jansen ! "failed" attempt at this). 319*59599516SKenneth E. Jansen 320*59599516SKenneth E. Jansen 321*59599516SKenneth E. Jansen nsolflow=mod(impl(1),100)/10 ! 1 if solving flow 322*59599516SKenneth E. Jansen 323*59599516SKenneth E. Jansenc 324*59599516SKenneth E. Jansenc.... Now, call Farzin's lesNew routine to initialize 325*59599516SKenneth E. Jansenc memory space 326*59599516SKenneth E. Jansenc 327*59599516SKenneth E. Jansen call genadj(colm, rowp, icnt ) ! preprocess the adjacency list 328*59599516SKenneth E. Jansen 329*59599516SKenneth E. Jansen nnz_tot=icnt ! this is exactly the number of non-zero blocks on 330*59599516SKenneth E. Jansen ! this proc 331*59599516SKenneth E. Jansen 332*59599516SKenneth E. Jansen if (nsolflow.eq.1) then 333*59599516SKenneth E. Jansen lesId = numeqns(1) 334*59599516SKenneth E. Jansen eqnType = 1 335*59599516SKenneth E. Jansen nDofs = 4 336*59599516SKenneth E. Jansen call myfLesNew( lesId, 41994, 337*59599516SKenneth E. Jansen & eqnType, 338*59599516SKenneth E. Jansen & nDofs, minIters, maxIters, 339*59599516SKenneth E. Jansen & nKvecs, prjFlag, nPrjs, 340*59599516SKenneth E. Jansen & presPrjFlag, nPresPrjs, epstol(1), 341*59599516SKenneth E. Jansen & prestol, verbose, statsflow, 342*59599516SKenneth E. Jansen & nPermDims, nTmpDims, servername ) 343*59599516SKenneth E. Jansen 344*59599516SKenneth E. Jansen allocate (aperm(nshg,nPermDims)) 345*59599516SKenneth E. Jansen allocate (atemp(nshg,nTmpDims)) 346*59599516SKenneth E. Jansen allocate (lhsP(4,nnz_tot)) 347*59599516SKenneth E. Jansen allocate (lhsK(9,nnz_tot)) 348*59599516SKenneth E. Jansen 349*59599516SKenneth E. Jansen call readLesRestart( lesId, aperm, nshg, myrank, lstep, 350*59599516SKenneth E. Jansen & nPermDims ) 351*59599516SKenneth E. Jansen 352*59599516SKenneth E. Jansen else 353*59599516SKenneth E. Jansen nPermDims = 0 354*59599516SKenneth E. Jansen nTempDims = 0 355*59599516SKenneth E. Jansen endif 356*59599516SKenneth E. Jansen 357*59599516SKenneth E. Jansen 358*59599516SKenneth E. Jansen if(nsclrsol.gt.0) then 359*59599516SKenneth E. Jansen do isolsc=1,nsclrsol 360*59599516SKenneth E. Jansen lesId = numeqns(isolsc+1) 361*59599516SKenneth E. Jansen eqnType = 2 362*59599516SKenneth E. Jansen nDofs = 1 363*59599516SKenneth E. Jansen presPrjflag = 0 364*59599516SKenneth E. Jansen nPresPrjs = 0 365*59599516SKenneth E. Jansen prjFlag = 1 366*59599516SKenneth E. Jansen indx=isolsc+2-nsolt ! complicated to keep epstol(2) for 367*59599516SKenneth E. Jansen ! temperature followed by scalars 368*59599516SKenneth E. Jansen call myfLesNew( lesId, 41994, 369*59599516SKenneth E. Jansen & eqnType, 370*59599516SKenneth E. Jansen & nDofs, minIters, maxIters, 371*59599516SKenneth E. Jansen & nKvecs, prjFlag, nPrjs, 372*59599516SKenneth E. Jansen & presPrjFlag, nPresPrjs, epstol(indx), 373*59599516SKenneth E. Jansen & prestol, verbose, statssclr, 374*59599516SKenneth E. Jansen & nPermDimsS, nTmpDimsS, servername ) 375*59599516SKenneth E. Jansen enddo 376*59599516SKenneth E. Jansenc 377*59599516SKenneth E. Jansenc Assume all scalars have the same size needs 378*59599516SKenneth E. Jansenc 379*59599516SKenneth E. Jansen allocate (apermS(nshg,nPermDimsS,nsclrsol)) 380*59599516SKenneth E. Jansen allocate (atempS(nshg,nTmpDimsS)) !they can all share this 381*59599516SKenneth E. Jansen allocate (lhsS(nnz_tot,nsclrsol)) 382*59599516SKenneth E. Jansenc 383*59599516SKenneth E. Jansenc actually they could even share with atemp but leave that for later 384*59599516SKenneth E. Jansenc 385*59599516SKenneth E. Jansen else 386*59599516SKenneth E. Jansen nPermDimsS = 0 387*59599516SKenneth E. Jansen nTmpDimsS = 0 388*59599516SKenneth E. Jansen endif 389*59599516SKenneth E. Jansenc 390*59599516SKenneth E. Jansenc... prepare lumped mass if needed 391*59599516SKenneth E. Jansenc 392*59599516SKenneth E. Jansen if((flmpr.ne.0).or.(flmpl.ne.0)) call genlmass(x, shp,shgl) 393*59599516SKenneth E. Jansenc 394*59599516SKenneth E. Jansenc.... -----------------> End of initialization <----------------- 395*59599516SKenneth E. Jansenc 396*59599516SKenneth E. Jansenc.....open the necessary files to gather time series 397*59599516SKenneth E. Jansenc 398*59599516SKenneth E. Jansen lstep0 = lstep+1 399*59599516SKenneth E. Jansen nsteprcr = nstep(1)+lstep 400*59599516SKenneth E. Jansenc 401*59599516SKenneth E. Jansenc.... loop through the time sequences 402*59599516SKenneth E. Jansenc 403*59599516SKenneth E. Jansen 404*59599516SKenneth E. Jansen 405*59599516SKenneth E. Jansen do 3000 itsq = 1, ntseq 406*59599516SKenneth E. Jansen itseq = itsq 407*59599516SKenneth E. Jansen 408*59599516SKenneth E. JansenCAD tcorecp1 = second(0) 409*59599516SKenneth E. JansenCAD tcorewc1 = second(-1) 410*59599516SKenneth E. Jansenc 411*59599516SKenneth E. Jansenc.... set up the time integration parameters 412*59599516SKenneth E. Jansenc 413*59599516SKenneth E. Jansen nstp = nstep(itseq) 414*59599516SKenneth E. Jansen nitr = niter(itseq) 415*59599516SKenneth E. Jansen LCtime = loctim(itseq) 416*59599516SKenneth E. Jansen dtol(:)= deltol(itseq,:) 417*59599516SKenneth E. Jansen 418*59599516SKenneth E. Jansen call itrSetup ( y, acold ) 419*59599516SKenneth E. Jansenc 420*59599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution, 421*59599516SKenneth E. Jansenc which are functions of alphaf so need to do it after itrSetup 422*59599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 423*59599516SKenneth E. Jansen call calcImpConvCoef (numImpSrfs, ntimeptpT) 424*59599516SKenneth E. Jansen endif 425*59599516SKenneth E. Jansenc 426*59599516SKenneth E. Jansenc...initialize the initial condition P(0)-RQ(0)-Pd(0) for RCR BC 427*59599516SKenneth E. Jansenc need ndsurf so should be after initNABI 428*59599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 429*59599516SKenneth E. Jansen call calcRCRic(y,nsrflistRCR,numRCRSrfs) 430*59599516SKenneth E. Jansen endif 431*59599516SKenneth E. Jansenc 432*59599516SKenneth E. Jansenc find the last solve of the flow in the step sequence so that we will 433*59599516SKenneth E. Jansenc know when we are at/near end of step 434*59599516SKenneth E. Jansenc 435*59599516SKenneth E. Jansenc ilast=0 436*59599516SKenneth E. Jansen nitr=0 ! count number of flow solves in a step (# of iterations) 437*59599516SKenneth E. Jansen do i=1,seqsize 438*59599516SKenneth E. Jansen if(stepseq(i).eq.0) nitr=nitr+1 439*59599516SKenneth E. Jansen enddo 440*59599516SKenneth E. Jansen 441*59599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 442*59599516SKenneth E. Jansen tcorecp(:) = zero ! used in solfar.f (solflow) 443*59599516SKenneth E. Jansen tcorecpscal(:) = zero ! used in solfar.f (solflow) 444*59599516SKenneth E. Jansen if(myrank.eq.0) then 445*59599516SKenneth E. Jansen tcorecp1 = TMRC() 446*59599516SKenneth E. Jansen endif 447*59599516SKenneth E. Jansen 448*59599516SKenneth E. Jansenc 449*59599516SKenneth E. Jansenc.... loop through the time steps 450*59599516SKenneth E. Jansenc 451*59599516SKenneth E. Jansen istop=0 452*59599516SKenneth E. Jansen rmub=datmat(1,2,1) 453*59599516SKenneth E. Jansen if(rmutarget.gt.0) then 454*59599516SKenneth E. Jansen rmue=rmutarget 455*59599516SKenneth E. Jansen else 456*59599516SKenneth E. Jansen rmue=datmat(1,2,1) ! keep constant 457*59599516SKenneth E. Jansen endif 458*59599516SKenneth E. Jansen 459*59599516SKenneth E. Jansen if(iramp.eq.1) then 460*59599516SKenneth E. Jansen call BCprofileScale(vbc_prof,BC,yold) ! fix the yold values to the reset BC 461*59599516SKenneth E. Jansen isclr=1 ! fix scalar 462*59599516SKenneth E. Jansen do isclr=1,nsclr 463*59599516SKenneth E. Jansen call itrBCSclr(yold,ac,iBC,BC,iper,ilwork) 464*59599516SKenneth E. Jansen enddo 465*59599516SKenneth E. Jansen endif 466*59599516SKenneth E. Jansen 467*59599516SKenneth E. Jansen!MR CHANGE 468*59599516SKenneth E. Jansen! do irank=0,numpe-1 469*59599516SKenneth E. Jansen! if(irank==myrank) then 470*59599516SKenneth E. Jansen! write(*,*) 'NUMTASK - rank,numtask: ',myrank,ilwork(1) 471*59599516SKenneth E. Jansen! endif 472*59599516SKenneth E. Jansen! call MPI_Barrier(MPI_COMM_WORLD,ierr) 473*59599516SKenneth E. Jansen! enddo 474*59599516SKenneth E. Jansen!MR CHANGE END 475*59599516SKenneth E. Jansen 476*59599516SKenneth E. Jansen do 2000 istp = 1, nstp 477*59599516SKenneth E. Jansen if(iramp.eq.1) 478*59599516SKenneth E. Jansen & call BCprofileScale(vbc_prof,BC,yold) 479*59599516SKenneth E. Jansen 480*59599516SKenneth E. Jansen call rerun_check(stopjob) 481*59599516SKenneth E. Jansen if(stopjob.ne.0) goto 2001 482*59599516SKenneth E. Jansen 483*59599516SKenneth E. Jansen xi=istp*1.0/nstp 484*59599516SKenneth E. Jansen datmat(1,2,1)=rmub*(1.0-xi)+xi*rmue 485*59599516SKenneth E. Jansenc write(*,*) "current mol. visc = ", datmat(1,2,1) 486*59599516SKenneth E. Jansenc.... if we have time varying boundary conditions update the values of BC. 487*59599516SKenneth E. Jansenc these will be for time step n+1 so use lstep+1 488*59599516SKenneth E. Jansenc 489*59599516SKenneth E. Jansen if(itvn.gt.0) call BCint((lstep+1)*Delt(1), shp, shgl, 490*59599516SKenneth E. Jansen & shpb, shglb, x, BC, iBC) 491*59599516SKenneth E. Jansen 492*59599516SKenneth E. Jansenc 493*59599516SKenneth E. Jansenc ... calculate the pressure contribution that depends on the history for the Imp. BC 494*59599516SKenneth E. Jansenc 495*59599516SKenneth E. Jansen if(numImpSrfs.gt.0) then 496*59599516SKenneth E. Jansen call pHist(poldImp,QHistImp,ImpConvCoef, 497*59599516SKenneth E. Jansen & ntimeptpT,numImpSrfs) 498*59599516SKenneth E. Jansen if (myrank.eq.master) 499*59599516SKenneth E. Jansen & write(8177,*) (poldImp(n), n=1,numImpSrfs) 500*59599516SKenneth E. Jansen endif 501*59599516SKenneth E. Jansenc 502*59599516SKenneth E. Jansenc ... calc the pressure contribution that depends on the history for the RCR BC 503*59599516SKenneth E. Jansenc 504*59599516SKenneth E. Jansen if(numRCRSrfs.gt.0) then 505*59599516SKenneth E. Jansen call CalcHopRCR (Delt(itseq), lstep, numRCRSrfs) 506*59599516SKenneth E. Jansen call CalcRCRConvCoef(lstep,numRCRSrfs) 507*59599516SKenneth E. Jansen call pHist(poldRCR,QHistRCR,RCRConvCoef,nsteprcr, 508*59599516SKenneth E. Jansen & numRCRSrfs) 509*59599516SKenneth E. Jansen if (myrank.eq.master) 510*59599516SKenneth E. Jansen & write(8177,*) (poldRCR(n), n=1,numRCRSrfs) 511*59599516SKenneth E. Jansen endif 512*59599516SKenneth E. Jansenc 513*59599516SKenneth E. Jansenc Decay of scalars 514*59599516SKenneth E. Jansenc 515*59599516SKenneth E. Jansen if(nsclr.gt.0 .and. tdecay.ne.1) then 516*59599516SKenneth E. Jansen yold(:,6:ndof)=y(:,6:ndof)*tdecay 517*59599516SKenneth E. Jansen BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*tdecay 518*59599516SKenneth E. Jansen endif 519*59599516SKenneth E. Jansen 520*59599516SKenneth E. Jansen if(nosource.eq.1) BC(:,7:6+nsclr)= BC(:,7:6+nsclr)*0.8 521*59599516SKenneth E. Jansen 522*59599516SKenneth E. Jansen 523*59599516SKenneth E. Jansen if(iLES.gt.0) then !complicated stuff has moved to 524*59599516SKenneth E. Jansen !routine below 525*59599516SKenneth E. Jansen call lesmodels(yold, acold, shgl, shp, 526*59599516SKenneth E. Jansen & iper, ilwork, rowp, colm, 527*59599516SKenneth E. Jansen & nsons, ifath, x, 528*59599516SKenneth E. Jansen & iBC, BC) 529*59599516SKenneth E. Jansen 530*59599516SKenneth E. Jansen 531*59599516SKenneth E. Jansen endif 532*59599516SKenneth E. Jansen 533*59599516SKenneth E. Jansenc.... set traction BCs for modeled walls 534*59599516SKenneth E. Jansenc 535*59599516SKenneth E. Jansen if (itwmod.ne.0) then 536*59599516SKenneth E. Jansen call asbwmod(yold, acold, x, BC, iBC, 537*59599516SKenneth E. Jansen & iper, ilwork, ifath, velbar) 538*59599516SKenneth E. Jansen endif 539*59599516SKenneth E. Jansen 540*59599516SKenneth E. Jansen!MR CHANGE 541*59599516SKenneth E. Jansenc 542*59599516SKenneth E. Jansenc.... Determine whether the vorticity field needs to be computed for this time step or not 543*59599516SKenneth E. Jansenc 544*59599516SKenneth E. Jansen icomputevort = 0 545*59599516SKenneth E. Jansen if (ivort == 1) then ! Print vorticity = True in solver.inp 546*59599516SKenneth E. Jansen ! We then compute the vorticity only if we 547*59599516SKenneth E. Jansen ! 1) we write an intermediate checkpoint 548*59599516SKenneth E. Jansen ! 2) we reach the last time step and write the last checkpoint 549*59599516SKenneth E. Jansen ! 3) we accumulate statistics in ybar for every time step 550*59599516SKenneth E. Jansen ! BEWARE: we need here lstep+1 and istep+1 because the lstep and 551*59599516SKenneth E. Jansen ! istep gets incremened after the flowsolve, further below 552*59599516SKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep+1, ntout) .eq. 0)) .or. 553*59599516SKenneth E. Jansen & istep+1.eq.nstep(itseq) .or. ioybar == 1) then 554*59599516SKenneth E. Jansen icomputevort = 1 555*59599516SKenneth E. Jansen endif 556*59599516SKenneth E. Jansen endif 557*59599516SKenneth E. Jansen 558*59599516SKenneth E. Jansen! write(*,*) 'icomputevort: ',icomputevort, ' - istep: ', 559*59599516SKenneth E. Jansen! & istep,' - nstep(itseq):',nstep(itseq),'- lstep:', 560*59599516SKenneth E. Jansen! & lstep, '- ntout:', ntout 561*59599516SKenneth E. Jansen!MR CHANGE 562*59599516SKenneth E. Jansen 563*59599516SKenneth E. Jansenc 564*59599516SKenneth E. Jansenc.... -----------------------> predictor phase <----------------------- 565*59599516SKenneth E. Jansenc 566*59599516SKenneth E. Jansen call itrPredict(yold, y, acold, ac , uold, u, iBC) 567*59599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper,ilwork) 568*59599516SKenneth E. Jansen 569*59599516SKenneth E. Jansen if(nsolt.eq.1) then 570*59599516SKenneth E. Jansen isclr=0 571*59599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 572*59599516SKenneth E. Jansen endif 573*59599516SKenneth E. Jansen do isclr=1,nsclr 574*59599516SKenneth E. Jansen call itrBCSclr (y, ac, iBC, BC, iper, ilwork) 575*59599516SKenneth E. Jansen enddo 576*59599516SKenneth E. Jansen iter=0 577*59599516SKenneth E. Jansen ilss=0 ! this is a switch thrown on first solve of LS redistance 578*59599516SKenneth E. Jansen do istepc=1,seqsize 579*59599516SKenneth E. Jansen icode=stepseq(istepc) 580*59599516SKenneth E. Jansen if(mod(icode,5).eq.0) then ! this is a solve 581*59599516SKenneth E. Jansen isolve=icode/10 582*59599516SKenneth E. Jansen if(icode.eq.0) then ! flow solve (encoded as 0) 583*59599516SKenneth E. Jansenc 584*59599516SKenneth E. Jansen iter = iter+1 585*59599516SKenneth E. Jansen ifuncs(1) = ifuncs(1) + 1 586*59599516SKenneth E. Jansenc 587*59599516SKenneth E. Jansen Force(1) = zero 588*59599516SKenneth E. Jansen Force(2) = zero 589*59599516SKenneth E. Jansen Force(3) = zero 590*59599516SKenneth E. Jansen HFlux = zero 591*59599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(1)-1,LHSupd(1))) 592*59599516SKenneth E. Jansen 593*59599516SKenneth E. Jansen call SolFlow(y, ac, u, 594*59599516SKenneth E. Jansen & yold, acold, uold, 595*59599516SKenneth E. Jansen & x, iBC, 596*59599516SKenneth E. Jansen & BC, res, 597*59599516SKenneth E. Jansen & nPermDims, nTmpDims, aperm, 598*59599516SKenneth E. Jansen & atemp, iper, 599*59599516SKenneth E. Jansen & ilwork, shp, shgl, 600*59599516SKenneth E. Jansen & shpb, shglb, rowp, 601*59599516SKenneth E. Jansen & colm, lhsK, lhsP, 602*59599516SKenneth E. Jansen & solinc, rerr, tcorecp, 603*59599516SKenneth E. Jansen & GradV) 604*59599516SKenneth E. Jansen 605*59599516SKenneth E. Jansen else ! scalar type solve 606*59599516SKenneth E. Jansen if (icode.eq.5) then ! Solve for Temperature 607*59599516SKenneth E. Jansen ! (encoded as (nsclr+1)*10) 608*59599516SKenneth E. Jansen isclr=0 609*59599516SKenneth E. Jansen ifuncs(2) = ifuncs(2) + 1 610*59599516SKenneth E. Jansen j=1 611*59599516SKenneth E. Jansen else ! solve a scalar (encoded at isclr*10) 612*59599516SKenneth E. Jansen isclr=isolve 613*59599516SKenneth E. Jansen ifuncs(isclr+2) = ifuncs(isclr+2) + 1 614*59599516SKenneth E. Jansen j=isclr+nsolt 615*59599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.0) 616*59599516SKenneth E. Jansen & .and.(isclr.eq.2)) then 617*59599516SKenneth E. Jansen ilss=1 ! throw switch (once per step) 618*59599516SKenneth E. Jansen y(:,7)=y(:,6) ! redistance field initialized 619*59599516SKenneth E. Jansen ac(:,7) = zero 620*59599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 621*59599516SKenneth E. Jansen & ilwork) 622*59599516SKenneth E. Jansenc 623*59599516SKenneth E. Jansenc....store the flow alpha, gamma parameter values and assigm them the 624*59599516SKenneth E. Jansenc....Backward Euler parameters to solve the second levelset scalar 625*59599516SKenneth E. Jansenc 626*59599516SKenneth E. Jansen alfit=alfi 627*59599516SKenneth E. Jansen gamit=gami 628*59599516SKenneth E. Jansen almit=almi 629*59599516SKenneth E. Jansen Deltt=Delt(1) 630*59599516SKenneth E. Jansen Dtglt=Dtgl 631*59599516SKenneth E. Jansen alfi = 1 632*59599516SKenneth E. Jansen gami = 1 633*59599516SKenneth E. Jansen almi = 1 634*59599516SKenneth E. Jansenc Delt(1)= Deltt ! Give a pseudo time step 635*59599516SKenneth E. Jansen Dtgl = one / Delt(1) 636*59599516SKenneth E. Jansen endif ! level set eq. 2 637*59599516SKenneth E. Jansen endif ! deciding between temperature and scalar 638*59599516SKenneth E. Jansen 639*59599516SKenneth E. Jansen lhs = 1 - min(1,mod(ifuncs(isclr+2)-1, 640*59599516SKenneth E. Jansen & LHSupd(isclr+2))) 641*59599516SKenneth E. Jansen 642*59599516SKenneth E. Jansen call SolSclr(y, ac, u, 643*59599516SKenneth E. Jansen & yold, acold, uold, 644*59599516SKenneth E. Jansen & x, iBC, 645*59599516SKenneth E. Jansen & BC, nPermDimsS,nTmpDimsS, 646*59599516SKenneth E. Jansen & apermS(1,1,j), atempS, iper, 647*59599516SKenneth E. Jansen & ilwork, shp, shgl, 648*59599516SKenneth E. Jansen & shpb, shglb, rowp, 649*59599516SKenneth E. Jansen & colm, lhsS(1,j), 650*59599516SKenneth E. Jansen & solinc(1,isclr+5), tcorecpscal) 651*59599516SKenneth E. Jansen 652*59599516SKenneth E. Jansen 653*59599516SKenneth E. Jansen endif ! end of scalar type solve 654*59599516SKenneth E. Jansen 655*59599516SKenneth E. Jansen else ! this is an update (mod did not equal zero) 656*59599516SKenneth E. Jansen iupdate=icode/10 ! what to update 657*59599516SKenneth E. Jansen if(icode.eq.1) then !update flow 658*59599516SKenneth E. Jansen call itrCorrect ( y, ac, u, solinc, iBC) 659*59599516SKenneth E. Jansen call itrBC (y, ac, iBC, BC, iper, ilwork) 660*59599516SKenneth E. Jansen else ! update scalar 661*59599516SKenneth E. Jansen isclr=iupdate !unless 662*59599516SKenneth E. Jansen if(icode.eq.6) isclr=0 663*59599516SKenneth E. Jansen if(iRANS.lt.-100)then ! RANS 664*59599516SKenneth E. Jansen call itrCorrectSclrPos(y,ac,solinc(1,isclr+5)) 665*59599516SKenneth E. Jansen else 666*59599516SKenneth E. Jansen call itrCorrectSclr (y, ac, solinc(1,isclr+5)) 667*59599516SKenneth E. Jansen endif 668*59599516SKenneth E. Jansen if (ilset.eq.2 .and. isclr.eq.2) then 669*59599516SKenneth E. Jansen if (ivconstraint .eq. 1) then 670*59599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 671*59599516SKenneth E. Jansen & ilwork) 672*59599516SKenneth E. Jansenc 673*59599516SKenneth E. Jansenc ... applying the volume constraint on second level set scalar 674*59599516SKenneth E. Jansenc 675*59599516SKenneth E. Jansen call solvecon (y, x, iBC, BC, 676*59599516SKenneth E. Jansen & iper, ilwork, shp, shgl) 677*59599516SKenneth E. Jansenc 678*59599516SKenneth E. Jansen endif ! end of volume constraint calculations 679*59599516SKenneth E. Jansen endif ! end of redistance calculations 680*59599516SKenneth E. Jansenc 681*59599516SKenneth E. Jansen call itrBCSclr ( y, ac, iBC, BC, iper, 682*59599516SKenneth E. Jansen & ilwork) 683*59599516SKenneth E. Jansen endif ! end of flow or scalar update 684*59599516SKenneth E. Jansen endif ! end of switch between solve or update 685*59599516SKenneth E. Jansen enddo ! loop over sequence in step 686*59599516SKenneth E. Jansenc 687*59599516SKenneth E. Jansenc 688*59599516SKenneth E. Jansenc.... obtain the time average statistics 689*59599516SKenneth E. Jansenc 690*59599516SKenneth E. Jansen if (ioform .eq. 2) then 691*59599516SKenneth E. Jansen 692*59599516SKenneth E. Jansen call stsGetStats( y, yold, ac, acold, 693*59599516SKenneth E. Jansen & u, uold, x, 694*59599516SKenneth E. Jansen & shp, shgl, shpb, shglb, 695*59599516SKenneth E. Jansen & iBC, BC, iper, ilwork, 696*59599516SKenneth E. Jansen & rowp, colm, lhsK, lhsP ) 697*59599516SKenneth E. Jansen endif 698*59599516SKenneth E. Jansen 699*59599516SKenneth E. Jansenc 700*59599516SKenneth E. Jansenc Find the solution at the end of the timestep and move it to old 701*59599516SKenneth E. Jansenc 702*59599516SKenneth E. Jansenc 703*59599516SKenneth E. Jansenc ...First to reassign the parameters for the original time integrator scheme 704*59599516SKenneth E. Jansenc 705*59599516SKenneth E. Jansen if((iLSet.eq.2).and.(ilss.eq.1)) then 706*59599516SKenneth E. Jansen alfi =alfit 707*59599516SKenneth E. Jansen gami =gamit 708*59599516SKenneth E. Jansen almi =almit 709*59599516SKenneth E. Jansen Delt(1)=Deltt 710*59599516SKenneth E. Jansen Dtgl =Dtglt 711*59599516SKenneth E. Jansen endif 712*59599516SKenneth E. Jansen call itrUpdate( yold, acold, uold, y, ac, u) 713*59599516SKenneth E. Jansen call itrBC (yold, acold, iBC, BC, iper,ilwork) 714*59599516SKenneth E. Jansen 715*59599516SKenneth E. Jansen istep = istep + 1 716*59599516SKenneth E. Jansen lstep = lstep + 1 717*59599516SKenneth E. Jansenc 718*59599516SKenneth E. Jansenc .. Print memory consumption on BGQ 719*59599516SKenneth E. Jansenc 720*59599516SKenneth E. Jansen call printmeminfo("itrdrv"//char(0)) 721*59599516SKenneth E. Jansen 722*59599516SKenneth E. Jansenc 723*59599516SKenneth E. Jansenc .. Compute vorticity 724*59599516SKenneth E. Jansenc 725*59599516SKenneth E. Jansen if ( icomputevort == 1) then 726*59599516SKenneth E. Jansen 727*59599516SKenneth E. Jansen ! vorticity components and magnitude 728*59599516SKenneth E. Jansen vorticity(:,1) = GradV(:,8)-GradV(:,6) !omega_x 729*59599516SKenneth E. Jansen vorticity(:,2) = GradV(:,3)-GradV(:,7) !omega_y 730*59599516SKenneth E. Jansen vorticity(:,3) = GradV(:,4)-GradV(:,2) !omega_z 731*59599516SKenneth E. Jansen vorticity(:,4) = sqrt( vorticity(:,1)*vorticity(:,1) 732*59599516SKenneth E. Jansen & + vorticity(:,2)*vorticity(:,2) 733*59599516SKenneth E. Jansen & + vorticity(:,3)*vorticity(:,3) ) 734*59599516SKenneth E. Jansen ! Q 735*59599516SKenneth E. Jansen strain(:,1) = GradV(:,1) !S11 736*59599516SKenneth E. Jansen strain(:,2) = 0.5*(GradV(:,2)+GradV(:,4)) !S12 737*59599516SKenneth E. Jansen strain(:,3) = 0.5*(GradV(:,3)+GradV(:,7)) !S13 738*59599516SKenneth E. Jansen strain(:,4) = GradV(:,5) !S22 739*59599516SKenneth E. Jansen strain(:,5) = 0.5*(GradV(:,6)+GradV(:,8)) !S23 740*59599516SKenneth E. Jansen strain(:,6) = GradV(:,9) !S33 741*59599516SKenneth E. Jansen 742*59599516SKenneth E. Jansen vorticity(:,5) = 0.25*( vorticity(:,4)*vorticity(:,4) !Q 743*59599516SKenneth E. Jansen & - 2.0*( strain(:,1)*strain(:,1) 744*59599516SKenneth E. Jansen & + 2* strain(:,2)*strain(:,2) 745*59599516SKenneth E. Jansen & + 2* strain(:,3)*strain(:,3) 746*59599516SKenneth E. Jansen & + strain(:,4)*strain(:,4) 747*59599516SKenneth E. Jansen & + 2* strain(:,5)*strain(:,5) 748*59599516SKenneth E. Jansen & + strain(:,6)*strain(:,6))) 749*59599516SKenneth E. Jansen 750*59599516SKenneth E. Jansen endif 751*59599516SKenneth E. Jansen 752*59599516SKenneth E. Jansenc 753*59599516SKenneth E. Jansenc .. write out the solution 754*59599516SKenneth E. Jansenc 755*59599516SKenneth E. Jansen!MR CHANGE 756*59599516SKenneth E. Jansen 757*59599516SKenneth E. Jansen! if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or. 758*59599516SKenneth E. Jansen! & lstep.eq.nstep(itseq)) then 759*59599516SKenneth E. Jansen if (((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) .or. 760*59599516SKenneth E. Jansen & istep.eq.nstep(itseq)) then 761*59599516SKenneth E. Jansen!MR CHANGE END 762*59599516SKenneth E. Jansen 763*59599516SKenneth E. Jansen! Call to restar() will open restart file in write mode (and not append mode) 764*59599516SKenneth E. Jansen! that is needed as other fields are written in append mode 765*59599516SKenneth E. Jansen call restar ('out ', yold ,ac) 766*59599516SKenneth E. Jansen if(ideformwall == 1) then 767*59599516SKenneth E. Jansen call write_displ(myrank, lstep, nshg, 3, uold ) 768*59599516SKenneth E. Jansen endif 769*59599516SKenneth E. Jansen 770*59599516SKenneth E. Jansen if(ivort == 1) then 771*59599516SKenneth E. Jansen call write_field(myrank,'a','vorticity',9,vorticity, 772*59599516SKenneth E. Jansen & 'd',nshg,5,lstep) 773*59599516SKenneth E. Jansen endif 774*59599516SKenneth E. Jansen!MR CHANGE 775*59599516SKenneth E. Jansen! if(ioybar.eq.1) then 776*59599516SKenneth E. Jansen! call write_field(myrank,'a','ybar',4, 777*59599516SKenneth E. Jansen! & ybar,'d',nshg,13,lstep) 778*59599516SKenneth E. Jansen! call write_field(myrank,'a','ybar',4, 779*59599516SKenneth E. Jansen! & ybar,'d',nshg,12,lstep) 780*59599516SKenneth E. Jansen! endif 781*59599516SKenneth E. Jansen 782*59599516SKenneth E. Jansen call printmeminfo("itrdrv after checkpoint"//char(0)) 783*59599516SKenneth E. Jansen!MR CHANGE END 784*59599516SKenneth E. Jansen 785*59599516SKenneth E. Jansen endif 786*59599516SKenneth E. Jansen 787*59599516SKenneth E. Jansenc 788*59599516SKenneth E. Jansenc ... update the flow history for the impedance convolution, filter it and write it out 789*59599516SKenneth E. Jansenc 790*59599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 791*59599516SKenneth E. Jansen call UpdHistConv(y,nsrflistImp,numImpSrfs) !uses Delt(1) 792*59599516SKenneth E. Jansen endif 793*59599516SKenneth E. Jansen 794*59599516SKenneth E. Jansenc 795*59599516SKenneth E. Jansenc ... update the flow history for the RCR convolution 796*59599516SKenneth E. Jansenc 797*59599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 798*59599516SKenneth E. Jansen call UpdHistConv(y,nsrflistRCR,numRCRSrfs) !uses lstep 799*59599516SKenneth E. Jansen endif 800*59599516SKenneth E. Jansen 801*59599516SKenneth E. Jansenc 802*59599516SKenneth E. Jansenc.... compute the consistent boundary flux 803*59599516SKenneth E. Jansenc 804*59599516SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 805*59599516SKenneth E. Jansen call Bflux ( yold, acold, uold, x, 806*59599516SKenneth E. Jansen & shp, shgl, shpb, 807*59599516SKenneth E. Jansen & shglb, ilwork, iBC, 808*59599516SKenneth E. Jansen & BC, iper, wallssVec) 809*59599516SKenneth E. Jansen endif 810*59599516SKenneth E. Jansen 811*59599516SKenneth E. Jansenc... dump TIME SERIES 812*59599516SKenneth E. Jansen 813*59599516SKenneth E. Jansen if (exts) then 814*59599516SKenneth E. Jansen if (mod(lstep-1,freq).eq.0) then 815*59599516SKenneth E. Jansen 816*59599516SKenneth E. Jansen if (numpe > 1) then 817*59599516SKenneth E. Jansen do jj = 1, ntspts 818*59599516SKenneth E. Jansen vartssoln((jj-1)*ndof+1:jj*ndof)=varts(jj,:) 819*59599516SKenneth E. Jansen ivarts=zero 820*59599516SKenneth E. Jansen enddo 821*59599516SKenneth E. Jansen do k=1,ndof*ntspts 822*59599516SKenneth E. Jansen if(vartssoln(k).ne.zero) ivarts(k)=1 823*59599516SKenneth E. Jansen enddo 824*59599516SKenneth E. Jansen 825*59599516SKenneth E. Jansen! call MPI_REDUCE(vartssoln, vartssolng, ndof*ntspts, 826*59599516SKenneth E. Jansen! & MPI_DOUBLE_PRECISION, MPI_SUM, master, 827*59599516SKenneth E. Jansen! & MPI_COMM_WORLD, ierr) 828*59599516SKenneth E. Jansen 829*59599516SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 830*59599516SKenneth E. Jansen call MPI_ALLREDUCE(vartssoln, vartssolng, 831*59599516SKenneth E. Jansen & ndof*ntspts, 832*59599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION, MPI_SUM, 833*59599516SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 834*59599516SKenneth E. Jansen 835*59599516SKenneth E. Jansen! call MPI_REDUCE(ivarts, ivartsg, ndof*ntspts, 836*59599516SKenneth E. Jansen! & MPI_INTEGER, MPI_SUM, master, 837*59599516SKenneth E. Jansen! & MPI_COMM_WORLD, ierr) 838*59599516SKenneth E. Jansen 839*59599516SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 840*59599516SKenneth E. Jansen call MPI_ALLREDUCE(ivarts, ivartsg, ndof*ntspts, 841*59599516SKenneth E. Jansen & MPI_INTEGER, MPI_SUM, 842*59599516SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 843*59599516SKenneth E. Jansen 844*59599516SKenneth E. Jansen! if (myrank.eq.zero) then 845*59599516SKenneth E. Jansen do jj = 1, ntspts 846*59599516SKenneth E. Jansen 847*59599516SKenneth E. Jansen if(myrank .eq. iv_rank(jj)) then 848*59599516SKenneth E. Jansen ! No need to update all varts components, only the one treated by the expected rank 849*59599516SKenneth E. Jansen ! Note: keep varts as a vector, as multiple probes could be treated by one rank 850*59599516SKenneth E. Jansen indxvarts = (jj-1)*ndof 851*59599516SKenneth E. Jansen do k=1,ndof 852*59599516SKenneth E. Jansen if(ivartsg(indxvarts+k).ne.0) then ! none of the vartssoln(parts) were non zero 853*59599516SKenneth E. Jansen varts(jj,k)=vartssolng(indxvarts+k)/ 854*59599516SKenneth E. Jansen & ivartsg(indxvarts+k) 855*59599516SKenneth E. Jansen endif 856*59599516SKenneth E. Jansen enddo 857*59599516SKenneth E. Jansen endif !only if myrank eq iv_rank(jj) 858*59599516SKenneth E. Jansen enddo 859*59599516SKenneth E. Jansen! endif !only on master 860*59599516SKenneth E. Jansen endif !only if numpe > 1 861*59599516SKenneth E. Jansen 862*59599516SKenneth E. Jansen! if (myrank.eq.zero) then 863*59599516SKenneth E. Jansen do jj = 1, ntspts 864*59599516SKenneth E. Jansen if(myrank .eq. iv_rank(jj)) then 865*59599516SKenneth E. Jansen ifile = 1000+jj 866*59599516SKenneth E. Jansen write(ifile,555) lstep, (varts(jj,k),k=1,ndof) !Beware of format 555 - check ndof 867*59599516SKenneth E. Jansenc call flush(ifile) 868*59599516SKenneth E. Jansen if (((irs .ge. 1) .and. 869*59599516SKenneth E. Jansen & (mod(lstep, ntout) .eq. 0))) then 870*59599516SKenneth E. Jansen close(ifile) 871*59599516SKenneth E. Jansen fvarts='varts/varts' 872*59599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(jj)) 873*59599516SKenneth E. Jansen fvarts=trim(fvarts)//trim(cname2(lskeep)) 874*59599516SKenneth E. Jansen fvarts=trim(fvarts)//'.dat' 875*59599516SKenneth E. Jansen fvarts=trim(fvarts) 876*59599516SKenneth E. Jansen open(unit=ifile, file=fvarts, 877*59599516SKenneth E. Jansen & position='append') 878*59599516SKenneth E. Jansen endif !only when dumping restart 879*59599516SKenneth E. Jansen endif 880*59599516SKenneth E. Jansen enddo 881*59599516SKenneth E. Jansen! endif !only on master 882*59599516SKenneth E. Jansen 883*59599516SKenneth E. Jansen varts(:,:) = zero ! reset the array for next step 884*59599516SKenneth E. Jansen 885*59599516SKenneth E. Jansen 886*59599516SKenneth E. Jansen!555 format(i6,5(2x,E12.5e2)) 887*59599516SKenneth E. Jansen555 format(i6,6(2x,E20.12e2)) !assuming ndof = 6 here 888*59599516SKenneth E. Jansen 889*59599516SKenneth E. Jansen endif 890*59599516SKenneth E. Jansen endif 891*59599516SKenneth E. Jansen 892*59599516SKenneth E. Jansenc 893*59599516SKenneth E. Jansenc.... update and the aerodynamic forces 894*59599516SKenneth E. Jansenc 895*59599516SKenneth E. Jansen call forces ( yold, ilwork ) 896*59599516SKenneth E. Jansen 897*59599516SKenneth E. Jansen if((irscale.ge.0).or.(itwmod.gt.0)) 898*59599516SKenneth E. Jansen & call getvel (yold, ilwork, iBC, 899*59599516SKenneth E. Jansen & nsons, ifath, velbar) 900*59599516SKenneth E. Jansen 901*59599516SKenneth E. Jansen if((irscale.ge.0).and.(myrank.eq.master)) then 902*59599516SKenneth E. Jansen call genscale(yold, x, iper, 903*59599516SKenneth E. Jansen & iBC, ifath, velbar, 904*59599516SKenneth E. Jansen & nsons) 905*59599516SKenneth E. Jansen endif 906*59599516SKenneth E. Jansenc 907*59599516SKenneth E. Jansenc.... print out results. 908*59599516SKenneth E. Jansenc 909*59599516SKenneth E. Jansen ntoutv=max(ntout,100) ! velb is not needed so often 910*59599516SKenneth E. Jansen if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then 911*59599516SKenneth E. Jansen if( (mod(lstep, ntoutv) .eq. 0) .and. 912*59599516SKenneth E. Jansen & ((irscale.ge.0).or.(itwmod.gt.0) .or. 913*59599516SKenneth E. Jansen & ((nsonmax.eq.1).and.(iLES.gt.0)))) 914*59599516SKenneth E. Jansen & call rwvelb ('out ', velbar ,ifail) 915*59599516SKenneth E. Jansen endif 916*59599516SKenneth E. Jansenc 917*59599516SKenneth E. Jansenc.... end of the NSTEP and NTSEQ loops 918*59599516SKenneth E. Jansenc 919*59599516SKenneth E. Jansen 920*59599516SKenneth E. Jansen 921*59599516SKenneth E. Jansenc 922*59599516SKenneth E. Jansenc.... -------------------> error calculation <----------------- 923*59599516SKenneth E. Jansenc 924*59599516SKenneth E. Jansen if(ierrcalc.eq.1 .or. ioybar.eq.1) then 925*59599516SKenneth E. Jansenc$$$c 926*59599516SKenneth E. Jansenc$$$c compute average 927*59599516SKenneth E. Jansenc$$$c 928*59599516SKenneth E. Jansenc$$$ tfact=one/istep 929*59599516SKenneth E. Jansenc$$$ ybar =tfact*yold + (one-tfact)*ybar 930*59599516SKenneth E. Jansen 931*59599516SKenneth E. Jansenc compute average 932*59599516SKenneth E. Jansenc ybar(:,1:3) are average velocity components 933*59599516SKenneth E. Jansenc ybar(:,4) is average pressure 934*59599516SKenneth E. Jansenc ybar(:,5) is average speed 935*59599516SKenneth E. Jansenc ybar(:,6:8) is average of sq. of each vel. component 936*59599516SKenneth E. Jansenc ybar(:,9) is average of sq. of pressure 937*59599516SKenneth E. Jansenc ybar(:,10:12) is average of cross vel. components : uv, uw and vw 938*59599516SKenneth E. Jansenc averaging procedure justified only for identical time step sizes 939*59599516SKenneth E. Jansenc ybar(:,13) is average of eddy viscosity 940*59599516SKenneth E. Jansenc ybar(:,14:16) is average vorticity components 941*59599516SKenneth E. Jansenc ybar(:,17) is average vorticity magnitude 942*59599516SKenneth E. Jansenc istep is number of time step 943*59599516SKenneth E. Jansenc 944*59599516SKenneth E. Jansen icollectybar = 0 945*59599516SKenneth E. Jansen if(nphasesincycle.eq.0 .or. 946*59599516SKenneth E. Jansen & istep.gt.ncycles_startphaseavg*nstepsincycle) then 947*59599516SKenneth E. Jansen icollectybar = 1 948*59599516SKenneth E. Jansen if((istep-1).eq.ncycles_startphaseavg*nstepsincycle) 949*59599516SKenneth E. Jansen & istepsinybar = 0 ! init. to zero in first cycle in avg. 950*59599516SKenneth E. Jansen endif 951*59599516SKenneth E. Jansen 952*59599516SKenneth E. Jansen if(icollectybar.eq.1) then 953*59599516SKenneth E. Jansen istepsinybar = istepsinybar+1 954*59599516SKenneth E. Jansen tfact=one/istepsinybar 955*59599516SKenneth E. Jansen 956*59599516SKenneth E. Jansen if(myrank.eq.master .and. nphasesincycle.ne.0 .and. 957*59599516SKenneth E. Jansen & mod((istep-1),nstepsincycle).eq.0) 958*59599516SKenneth E. Jansen & write(*,*)'nsamples in phase average:',istepsinybar 959*59599516SKenneth E. Jansen 960*59599516SKenneth E. Jansenc ybar to contain the averaged ((u,v,w),p)-fields 961*59599516SKenneth E. Jansenc and speed average, i.e., sqrt(u^2+v^2+w^2) 962*59599516SKenneth E. Jansenc and avg. of sq. terms including 963*59599516SKenneth E. Jansenc u^2, v^2, w^2, p^2 and cross terms of uv, uw and vw 964*59599516SKenneth E. Jansen 965*59599516SKenneth E. Jansen ybar(:,1) = tfact*yold(:,1) + (one-tfact)*ybar(:,1) 966*59599516SKenneth E. Jansen ybar(:,2) = tfact*yold(:,2) + (one-tfact)*ybar(:,2) 967*59599516SKenneth E. Jansen ybar(:,3) = tfact*yold(:,3) + (one-tfact)*ybar(:,3) 968*59599516SKenneth E. Jansen ybar(:,4) = tfact*yold(:,4) + (one-tfact)*ybar(:,4) 969*59599516SKenneth E. Jansen ybar(:,5) = tfact*sqrt(yold(:,1)**2+yold(:,2)**2+ 970*59599516SKenneth E. Jansen & yold(:,3)**2) + (one-tfact)*ybar(:,5) 971*59599516SKenneth E. Jansen ybar(:,6) = tfact*yold(:,1)**2 + 972*59599516SKenneth E. Jansen & (one-tfact)*ybar(:,6) 973*59599516SKenneth E. Jansen ybar(:,7) = tfact*yold(:,2)**2 + 974*59599516SKenneth E. Jansen & (one-tfact)*ybar(:,7) 975*59599516SKenneth E. Jansen ybar(:,8) = tfact*yold(:,3)**2 + 976*59599516SKenneth E. Jansen & (one-tfact)*ybar(:,8) 977*59599516SKenneth E. Jansen ybar(:,9) = tfact*yold(:,4)**2 + 978*59599516SKenneth E. Jansen & (one-tfact)*ybar(:,9) 979*59599516SKenneth E. Jansen ybar(:,10) = tfact*yold(:,1)*yold(:,2) + !uv 980*59599516SKenneth E. Jansen & (one-tfact)*ybar(:,10) 981*59599516SKenneth E. Jansen ybar(:,11) = tfact*yold(:,1)*yold(:,3) + !uw 982*59599516SKenneth E. Jansen & (one-tfact)*ybar(:,11) 983*59599516SKenneth E. Jansen ybar(:,12) = tfact*yold(:,2)*yold(:,3) + !vw 984*59599516SKenneth E. Jansen & (one-tfact)*ybar(:,12) 985*59599516SKenneth E. Jansen!MR CHANGE 986*59599516SKenneth E. Jansen if(nsclr.gt.0) !nut 987*59599516SKenneth E. Jansen & ybar(:,13) = tfact*yold(:,6) + (one-tfact)*ybar(:,13) 988*59599516SKenneth E. Jansen 989*59599516SKenneth E. Jansen if(ivort == 1) then !vorticity 990*59599516SKenneth E. Jansen ybar(:,14) = tfact*vorticity(:,1) + 991*59599516SKenneth E. Jansen & (one-tfact)*ybar(:,14) 992*59599516SKenneth E. Jansen ybar(:,15) = tfact*vorticity(:,2) + 993*59599516SKenneth E. Jansen & (one-tfact)*ybar(:,15) 994*59599516SKenneth E. Jansen ybar(:,16) = tfact*vorticity(:,3) + 995*59599516SKenneth E. Jansen & (one-tfact)*ybar(:,16) 996*59599516SKenneth E. Jansen ybar(:,17) = tfact*vorticity(:,4) + 997*59599516SKenneth E. Jansen & (one-tfact)*ybar(:,17) 998*59599516SKenneth E. Jansen endif 999*59599516SKenneth E. Jansen 1000*59599516SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 1001*59599516SKenneth E. Jansen wallssVecBar(:,1) = tfact*wallssVec(:,1) 1002*59599516SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,1) 1003*59599516SKenneth E. Jansen wallssVecBar(:,2) = tfact*wallssVec(:,2) 1004*59599516SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,2) 1005*59599516SKenneth E. Jansen wallssVecBar(:,3) = tfact*wallssVec(:,3) 1006*59599516SKenneth E. Jansen & +(one-tfact)*wallssVecBar(:,3) 1007*59599516SKenneth E. Jansen endif 1008*59599516SKenneth E. Jansen!MR CHANGE END 1009*59599516SKenneth E. Jansen endif 1010*59599516SKenneth E. Jansenc 1011*59599516SKenneth E. Jansenc compute phase average 1012*59599516SKenneth E. Jansenc 1013*59599516SKenneth E. Jansen if(nphasesincycle.ne.0 .and. 1014*59599516SKenneth E. Jansen & istep.gt.ncycles_startphaseavg*nstepsincycle) then 1015*59599516SKenneth E. Jansen 1016*59599516SKenneth E. Jansenc beginning of cycle is considered as ncycles_startphaseavg*nstepsincycle+1 1017*59599516SKenneth E. Jansen if((istep-1).eq.ncycles_startphaseavg*nstepsincycle) 1018*59599516SKenneth E. Jansen & icyclesinavg = 0 ! init. to zero in first cycle in avg. 1019*59599516SKenneth E. Jansen 1020*59599516SKenneth E. Jansen ! find number of steps between phases 1021*59599516SKenneth E. Jansen nstepsbtwphase = nstepsincycle/nphasesincycle ! integer value 1022*59599516SKenneth E. Jansen if(mod(istep-1,nstepsincycle).eq.0) then 1023*59599516SKenneth E. Jansen iphase = 1 ! init. to one in beginning of every cycle 1024*59599516SKenneth E. Jansen icyclesinavg = icyclesinavg + 1 1025*59599516SKenneth E. Jansen endif 1026*59599516SKenneth E. Jansen 1027*59599516SKenneth E. Jansen icollectphase = 0 1028*59599516SKenneth E. Jansen istepincycle = mod(istep,nstepsincycle) 1029*59599516SKenneth E. Jansen if(istepincycle.eq.0) istepincycle=nstepsincycle 1030*59599516SKenneth E. Jansen if(istepincycle.eq.iphase*nstepsbtwphase) then 1031*59599516SKenneth E. Jansen icollectphase = 1 1032*59599516SKenneth E. Jansen iphase = iphase+1 ! use 'iphase-1' below 1033*59599516SKenneth E. Jansen endif 1034*59599516SKenneth E. Jansen 1035*59599516SKenneth E. Jansen if(icollectphase.eq.1) then 1036*59599516SKenneth E. Jansen tfactphase = one/icyclesinavg 1037*59599516SKenneth E. Jansen 1038*59599516SKenneth E. Jansen if(myrank.eq.master) then 1039*59599516SKenneth E. Jansen write(*,*) 'nsamples in phase ',iphase-1,': ', 1040*59599516SKenneth E. Jansen & icyclesinavg 1041*59599516SKenneth E. Jansen endif 1042*59599516SKenneth E. Jansen 1043*59599516SKenneth E. Jansen yphbar(:,1,iphase-1) = tfactphase*yold(:,1) + 1044*59599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,1,iphase-1) 1045*59599516SKenneth E. Jansen yphbar(:,2,iphase-1) = tfactphase*yold(:,2) + 1046*59599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,2,iphase-1) 1047*59599516SKenneth E. Jansen yphbar(:,3,iphase-1) = tfactphase*yold(:,3) + 1048*59599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,3,iphase-1) 1049*59599516SKenneth E. Jansen yphbar(:,4,iphase-1) = tfactphase*yold(:,4) + 1050*59599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,4,iphase-1) 1051*59599516SKenneth E. Jansen yphbar(:,5,iphase-1) = tfactphase*sqrt(yold(:,1)**2 1052*59599516SKenneth E. Jansen & +yold(:,2)**2+yold(:,3)**2) + 1053*59599516SKenneth E. Jansen & (one-tfactphase)*yphbar(:,5,iphase-1) 1054*59599516SKenneth E. Jansen!MR CHANGE 1055*59599516SKenneth E. Jansen yphbar(:,6,iphase-1) = 1056*59599516SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,1) 1057*59599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,6,iphase-1) 1058*59599516SKenneth E. Jansen 1059*59599516SKenneth E. Jansen yphbar(:,7,iphase-1) = 1060*59599516SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,2) 1061*59599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,7,iphase-1) 1062*59599516SKenneth E. Jansen 1063*59599516SKenneth E. Jansen yphbar(:,8,iphase-1) = 1064*59599516SKenneth E. Jansen & tfactphase*yold(:,1)*yold(:,3) 1065*59599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,8,iphase-1) 1066*59599516SKenneth E. Jansen 1067*59599516SKenneth E. Jansen yphbar(:,9,iphase-1) = 1068*59599516SKenneth E. Jansen & tfactphase*yold(:,2)*yold(:,2) 1069*59599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,9,iphase-1) 1070*59599516SKenneth E. Jansen 1071*59599516SKenneth E. Jansen yphbar(:,10,iphase-1) = 1072*59599516SKenneth E. Jansen & tfactphase*yold(:,2)*yold(:,3) 1073*59599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,10,iphase-1) 1074*59599516SKenneth E. Jansen 1075*59599516SKenneth E. Jansen yphbar(:,11,iphase-1) = 1076*59599516SKenneth E. Jansen & tfactphase*yold(:,3)*yold(:,3) 1077*59599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,11,iphase-1) 1078*59599516SKenneth E. Jansen 1079*59599516SKenneth E. Jansen if(ivort == 1) then 1080*59599516SKenneth E. Jansen yphbar(:,12,iphase-1) = 1081*59599516SKenneth E. Jansen & tfactphase*vorticity(:,1) 1082*59599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,12,iphase-1) 1083*59599516SKenneth E. Jansen yphbar(:,13,iphase-1) = 1084*59599516SKenneth E. Jansen & tfactphase*vorticity(:,2) 1085*59599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,13,iphase-1) 1086*59599516SKenneth E. Jansen yphbar(:,14,iphase-1) = 1087*59599516SKenneth E. Jansen & tfactphase*vorticity(:,3) 1088*59599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,14,iphase-1) 1089*59599516SKenneth E. Jansen yphbar(:,15,iphase-1) = 1090*59599516SKenneth E. Jansen & tfactphase*vorticity(:,4) 1091*59599516SKenneth E. Jansen & +(one-tfactphase)*yphbar(:,15,iphase-1) 1092*59599516SKenneth E. Jansen endif 1093*59599516SKenneth E. Jansen!MR CHANGE END 1094*59599516SKenneth E. Jansen endif 1095*59599516SKenneth E. Jansen endif 1096*59599516SKenneth E. Jansenc 1097*59599516SKenneth E. Jansenc compute rms 1098*59599516SKenneth E. Jansenc 1099*59599516SKenneth E. Jansen if(icollectybar.eq.1) then 1100*59599516SKenneth E. Jansen rerr(:, 7)=rerr(:, 7)+(yold(:,1)-ybar(:,1))**2 1101*59599516SKenneth E. Jansen rerr(:, 8)=rerr(:, 8)+(yold(:,2)-ybar(:,2))**2 1102*59599516SKenneth E. Jansen rerr(:, 9)=rerr(:, 9)+(yold(:,3)-ybar(:,3))**2 1103*59599516SKenneth E. Jansen rerr(:,10)=rerr(:,10)+(yold(:,4)-ybar(:,4))**2 1104*59599516SKenneth E. Jansen endif 1105*59599516SKenneth E. Jansen endif 1106*59599516SKenneth E. Jansen 1107*59599516SKenneth E. Jansen if(istop.eq.1000) exit ! stop when delta small (see rstatic) 1108*59599516SKenneth E. Jansen 2000 continue 1109*59599516SKenneth E. Jansen 2001 continue 1110*59599516SKenneth E. Jansen 1111*59599516SKenneth E. Jansen 1112*59599516SKenneth E. JansenCAD tcorecp2 = second(0) 1113*59599516SKenneth E. JansenCAD tcorewc2 = second(-1) 1114*59599516SKenneth E. Jansen 1115*59599516SKenneth E. JansenCAD write(6,*) 'T(core) cpu-wallclock = ',tcorecp2-tcorecp1, 1116*59599516SKenneth E. JansenCAD & tcorewc2-tcorewc1 1117*59599516SKenneth E. Jansen 1118*59599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1119*59599516SKenneth E. Jansen if(myrank.eq.0) then 1120*59599516SKenneth E. Jansen tcorecp2 = TMRC() 1121*59599516SKenneth E. Jansen write(6,*) 'T(core) cpu = ',tcorecp2-tcorecp1 1122*59599516SKenneth E. Jansen write(6,*) '(Elm. form.',tcorecp(1), 1123*59599516SKenneth E. Jansen & ',Lin. alg. sol.',tcorecp(2),')' 1124*59599516SKenneth E. Jansen write(6,*) '(Elm. form. Scal.',tcorecpscal(1), 1125*59599516SKenneth E. Jansen & ',Lin. alg. sol. Scal.',tcorecpscal(2),')' 1126*59599516SKenneth E. Jansen write(6,*) '' 1127*59599516SKenneth E. Jansen 1128*59599516SKenneth E. Jansen endif 1129*59599516SKenneth E. Jansen 1130*59599516SKenneth E. Jansen call print_system_stats(tcorecp, tcorecpscal) 1131*59599516SKenneth E. Jansen call print_mesh_stats() 1132*59599516SKenneth E. Jansen call print_mpi_stats() 1133*59599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1134*59599516SKenneth E. Jansen! return 1135*59599516SKenneth E. Jansenc call MPI_Finalize() 1136*59599516SKenneth E. Jansenc call MPI_ABORT(MPI_COMM_WORLD, ierr) 1137*59599516SKenneth E. Jansen 1138*59599516SKenneth E. Jansen 3000 continue 1139*59599516SKenneth E. Jansen 1140*59599516SKenneth E. Jansenc 1141*59599516SKenneth E. Jansenc.... ----------------------> Post Processing <---------------------- 1142*59599516SKenneth E. Jansenc 1143*59599516SKenneth E. Jansenc.... print out the last step 1144*59599516SKenneth E. Jansenc 1145*59599516SKenneth E. Jansen if ((irs .ge. 1) .and. ((mod(lstep, ntout) .ne. 0) .or. 1146*59599516SKenneth E. Jansen & (nstp .eq. 0))) then 1147*59599516SKenneth E. Jansen if( 1148*59599516SKenneth E. Jansen & ((irscale.ge.0).or.(itwmod.gt.0) .or. 1149*59599516SKenneth E. Jansen & ((nsonmax.eq.1).and.iLES.gt.0))) 1150*59599516SKenneth E. Jansen & call rwvelb ('out ', velbar ,ifail) 1151*59599516SKenneth E. Jansen endif 1152*59599516SKenneth E. Jansen 1153*59599516SKenneth E. Jansen 1154*59599516SKenneth E. Jansen lesId = numeqns(1) 1155*59599516SKenneth E. Jansen 1156*59599516SKenneth E. Jansen!MR CHANGE 1157*59599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1158*59599516SKenneth E. Jansen if(myrank.eq.0) then 1159*59599516SKenneth E. Jansen tcormr1 = TMRC() 1160*59599516SKenneth E. Jansen endif 1161*59599516SKenneth E. Jansen!MR CHANGE END 1162*59599516SKenneth E. Jansen 1163*59599516SKenneth E. Jansen call saveLesRestart( lesId, aperm , nshg, myrank, lstep, 1164*59599516SKenneth E. Jansen & nPermDims ) 1165*59599516SKenneth E. Jansen 1166*59599516SKenneth E. Jansen!MR CHANGE 1167*59599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1168*59599516SKenneth E. Jansen if(myrank.eq.0) then 1169*59599516SKenneth E. Jansen tcormr2 = TMRC() 1170*59599516SKenneth E. Jansen write(6,*) 'Time to call saveLesRestart for projection and'// 1171*59599516SKenneth E. Jansen & 'pressure projection vectors', tcormr2-tcormr1 1172*59599516SKenneth E. Jansen endif 1173*59599516SKenneth E. Jansen!MR CHANGE END 1174*59599516SKenneth E. Jansen 1175*59599516SKenneth E. Jansen 1176*59599516SKenneth E. Jansen if(ierrcalc.eq.1) then 1177*59599516SKenneth E. Jansenc 1178*59599516SKenneth E. Jansenc.....smooth the error indicators 1179*59599516SKenneth E. Jansenc 1180*59599516SKenneth E. Jansen do i=1,ierrsmooth 1181*59599516SKenneth E. Jansen call errsmooth( rerr, x, iper, ilwork, shp, shgl, iBC ) 1182*59599516SKenneth E. Jansen end do 1183*59599516SKenneth E. Jansen 1184*59599516SKenneth E. Jansen!MR CHANGE 1185*59599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1186*59599516SKenneth E. Jansen if(myrank.eq.0) then 1187*59599516SKenneth E. Jansen tcormr1 = TMRC() 1188*59599516SKenneth E. Jansen endif 1189*59599516SKenneth E. Jansen!MR CHANGE END 1190*59599516SKenneth E. Jansen 1191*59599516SKenneth E. Jansen call write_error(myrank, lstep, nshg, 10, rerr ) 1192*59599516SKenneth E. Jansen 1193*59599516SKenneth E. Jansen!MR CHANGE 1194*59599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1195*59599516SKenneth E. Jansen if(myrank.eq.0) then 1196*59599516SKenneth E. Jansen tcormr2 = TMRC() 1197*59599516SKenneth E. Jansen write(6,*) 'Time to write the error fields to the disks', 1198*59599516SKenneth E. Jansen & tcormr2-tcormr1 1199*59599516SKenneth E. Jansen endif 1200*59599516SKenneth E. Jansen!MR CHANGE END 1201*59599516SKenneth E. Jansen 1202*59599516SKenneth E. Jansen 1203*59599516SKenneth E. Jansen endif 1204*59599516SKenneth E. Jansen 1205*59599516SKenneth E. Jansen if(ioybar.eq.1) then 1206*59599516SKenneth E. Jansen 1207*59599516SKenneth E. Jansen!MR CHANGE 1208*59599516SKenneth E. Jansen! call write_field(myrank,'a','ybar',4, 1209*59599516SKenneth E. Jansen! & ybar,'d',nshg,12,lstep) 1210*59599516SKenneth E. Jansen if(ivort == 1) then 1211*59599516SKenneth E. Jansen call write_field(myrank,'a','ybar',4, 1212*59599516SKenneth E. Jansen & ybar,'d',nshg,17,lstep) 1213*59599516SKenneth E. Jansen else 1214*59599516SKenneth E. Jansen call write_field(myrank,'a','ybar',4, 1215*59599516SKenneth E. Jansen & ybar,'d',nshg,13,lstep) 1216*59599516SKenneth E. Jansen endif 1217*59599516SKenneth E. Jansen deallocate(ybar) 1218*59599516SKenneth E. Jansen 1219*59599516SKenneth E. Jansen 1220*59599516SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 1221*59599516SKenneth E. Jansen call write_field(myrank,'a','wssbar',6, 1222*59599516SKenneth E. Jansen & wallssVecBar,'d',nshg,3,lstep) 1223*59599516SKenneth E. Jansen deallocate(wallssVecbar) 1224*59599516SKenneth E. Jansen endif 1225*59599516SKenneth E. Jansen 1226*59599516SKenneth E. Jansen!MR CHANGE END 1227*59599516SKenneth E. Jansen if(nphasesincycle .gt. 0) then 1228*59599516SKenneth E. Jansen 1229*59599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1230*59599516SKenneth E. Jansen if(myrank.eq.0) then 1231*59599516SKenneth E. Jansen tcormr1 = TMRC() 1232*59599516SKenneth E. Jansen endif 1233*59599516SKenneth E. Jansen 1234*59599516SKenneth E. Jansen do iphase=1,nphasesincycle 1235*59599516SKenneth E. Jansen 1236*59599516SKenneth E. Jansen! call write_phavg(myrank,'w','phase average',13,iphase, 1237*59599516SKenneth E. Jansen! & yphbar(:,:,iphase),'d',nshg,5,lstep) 1238*59599516SKenneth E. Jansen! ! ybar field is repeated in files for phase average 1239*59599516SKenneth E. Jansen! call write_phavg(myrank,'a','ybar',4,iphase, 1240*59599516SKenneth E. Jansen! & ybar(:,1:5),'d',nshg,5,lstep) 1241*59599516SKenneth E. Jansen if(ivort == 1) then 1242*59599516SKenneth E. Jansen call write_phavg2(myrank,'a','phase_average',13,iphase, 1243*59599516SKenneth E. Jansen & nphasesincycle,yphbar(:,:,iphase),'d',nshg,15,lstep) 1244*59599516SKenneth E. Jansen else 1245*59599516SKenneth E. Jansen call write_phavg2(myrank,'a','phase_average',13,iphase, 1246*59599516SKenneth E. Jansen & nphasesincycle,yphbar(:,:,iphase),'d',nshg,11,lstep) 1247*59599516SKenneth E. Jansen endif 1248*59599516SKenneth E. Jansen 1249*59599516SKenneth E. Jansen end do 1250*59599516SKenneth E. Jansen 1251*59599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1252*59599516SKenneth E. Jansen if(myrank.eq.0) then 1253*59599516SKenneth E. Jansen tcormr2 = TMRC() 1254*59599516SKenneth E. Jansen write(6,*) 'Time to write all phase avg to the disks = ', 1255*59599516SKenneth E. Jansen & tcormr2-tcormr1 1256*59599516SKenneth E. Jansen endif 1257*59599516SKenneth E. Jansen deallocate(yphbar) 1258*59599516SKenneth E. Jansen endif 1259*59599516SKenneth E. Jansen 1260*59599516SKenneth E. Jansen endif 1261*59599516SKenneth E. Jansen 1262*59599516SKenneth E. Jansen if(ivort == 1) then 1263*59599516SKenneth E. Jansen deallocate(strain,vorticity) 1264*59599516SKenneth E. Jansen endif 1265*59599516SKenneth E. Jansen 1266*59599516SKenneth E. Jansen if(abs(itwmod).ne.1 .and. iowflux.eq.1) then 1267*59599516SKenneth E. Jansen deallocate(wallssVec) 1268*59599516SKenneth E. Jansen endif 1269*59599516SKenneth E. Jansen 1270*59599516SKenneth E. Jansen!MR CHANGE END 1271*59599516SKenneth E. Jansen 1272*59599516SKenneth E. Jansen if ( ( ihessian .eq. 1 ) .and. ( numpe < 2 ) )then 1273*59599516SKenneth E. Jansen uhess = zero 1274*59599516SKenneth E. Jansen gradu = zero 1275*59599516SKenneth E. Jansen tf = zero 1276*59599516SKenneth E. Jansen 1277*59599516SKenneth E. Jansen do ku=1,nshg 1278*59599516SKenneth E. Jansenc tf(ku,1) = x(ku,1)**2+2*x(ku,1)*x(ku,2) 1279*59599516SKenneth E. Jansen tf(ku,1) = x(ku,1)**3 1280*59599516SKenneth E. Jansen end do 1281*59599516SKenneth E. Jansen 1282*59599516SKenneth E. Jansen call hessian( yold, x, shp, shgl, iBC, 1283*59599516SKenneth E. Jansen & shpb, shglb, iper, ilwork, uhess, gradu ) 1284*59599516SKenneth E. Jansen 1285*59599516SKenneth E. Jansen call write_hessian( uhess, gradu, nshg ) 1286*59599516SKenneth E. Jansen endif 1287*59599516SKenneth E. Jansen 1288*59599516SKenneth E. Jansenc if(iRANS.lt.0 .and. idistcalc.eq.1) then 1289*59599516SKenneth E. Jansen if(iRANS.lt.0) then 1290*59599516SKenneth E. Jansenc call write_field(myrank,'a','DESd',4, 1291*59599516SKenneth E. Jansenc & elDw,'d',numel,1,lstep) 1292*59599516SKenneth E. Jansen 1293*59599516SKenneth E. Jansen!MR CHANGE 1294*59599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1295*59599516SKenneth E. Jansen if(myrank.eq.0) then 1296*59599516SKenneth E. Jansen tcormr1 = TMRC() 1297*59599516SKenneth E. Jansen endif 1298*59599516SKenneth E. Jansen!MR CHANGE END 1299*59599516SKenneth E. Jansen 1300*59599516SKenneth E. Jansen call write_field(myrank,'a','dwal',4,d2wall,'d',nshg,1,lstep) 1301*59599516SKenneth E. Jansen deallocate(d2wall) 1302*59599516SKenneth E. Jansen 1303*59599516SKenneth E. Jansen!MR CHANGE 1304*59599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1305*59599516SKenneth E. Jansen if(myrank.eq.0) then 1306*59599516SKenneth E. Jansen tcormr2 = TMRC() 1307*59599516SKenneth E. Jansen write(6,*) 'Time to write dwal to the disks = ', 1308*59599516SKenneth E. Jansen & tcormr2-tcormr1 1309*59599516SKenneth E. Jansen endif 1310*59599516SKenneth E. Jansen!MR CHANGE END 1311*59599516SKenneth E. Jansen 1312*59599516SKenneth E. Jansen 1313*59599516SKenneth E. Jansen endif 1314*59599516SKenneth E. Jansen 1315*59599516SKenneth E. Jansenc 1316*59599516SKenneth E. Jansenc.... close history and aerodynamic forces files 1317*59599516SKenneth E. Jansenc 1318*59599516SKenneth E. Jansen if (myrank .eq. master) then 1319*59599516SKenneth E. Jansen! close (ihist) 1320*59599516SKenneth E. Jansen close (iforce) 1321*59599516SKenneth E. Jansen close(76) 1322*59599516SKenneth E. Jansen if(numImpSrfs.gt.0 .or. numRCRSrfs.gt.0) then 1323*59599516SKenneth E. Jansen close (8177) 1324*59599516SKenneth E. Jansen endif 1325*59599516SKenneth E. Jansen endif 1326*59599516SKenneth E. Jansenc 1327*59599516SKenneth E. Jansenc.... close varts file for probes 1328*59599516SKenneth E. Jansenc 1329*59599516SKenneth E. Jansen if(exts) then 1330*59599516SKenneth E. Jansen do jj=1,ntspts 1331*59599516SKenneth E. Jansen if (myrank == iv_rank(jj)) then 1332*59599516SKenneth E. Jansen close(1000+jj) 1333*59599516SKenneth E. Jansen endif 1334*59599516SKenneth E. Jansen enddo 1335*59599516SKenneth E. Jansen deallocate (ivarts) 1336*59599516SKenneth E. Jansen deallocate (ivartsg) 1337*59599516SKenneth E. Jansen deallocate (iv_rank) 1338*59599516SKenneth E. Jansen deallocate (vartssoln) 1339*59599516SKenneth E. Jansen deallocate (vartssolng) 1340*59599516SKenneth E. Jansen endif 1341*59599516SKenneth E. Jansen 1342*59599516SKenneth E. Jansen!MR CHANGE 1343*59599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1344*59599516SKenneth E. Jansen if(myrank.eq.0) then 1345*59599516SKenneth E. Jansen write(*,*) 'itrdrv - done with aerodynamic forces' 1346*59599516SKenneth E. Jansen endif 1347*59599516SKenneth E. Jansen!MR CHANGE 1348*59599516SKenneth E. Jansen 1349*59599516SKenneth E. Jansen do isrf = 0,MAXSURF 1350*59599516SKenneth E. Jansen! if ( nsrflist(isrf).ne.0 ) then 1351*59599516SKenneth E. Jansen if ( nsrflist(isrf).ne.0 .and. 1352*59599516SKenneth E. Jansen & myrank.eq.irankfilesforce(isrf)) then 1353*59599516SKenneth E. Jansen iunit=60+isrf 1354*59599516SKenneth E. Jansen close(iunit) 1355*59599516SKenneth E. Jansen endif 1356*59599516SKenneth E. Jansen enddo 1357*59599516SKenneth E. Jansen 1358*59599516SKenneth E. Jansen!MR CHANGE 1359*59599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1360*59599516SKenneth E. Jansen if(myrank.eq.0) then 1361*59599516SKenneth E. Jansen write(*,*) 'itrdrv - done with MAXSURF' 1362*59599516SKenneth E. Jansen endif 1363*59599516SKenneth E. Jansen!MR CHANGE 1364*59599516SKenneth E. Jansen 1365*59599516SKenneth E. Jansen 1366*59599516SKenneth E. Jansen 5 format(1X,F15.10,3X,F15.10,3X,F15.10,3X,F15.10) 1367*59599516SKenneth E. Jansen 444 format(6(2x,e14.7)) 1368*59599516SKenneth E. Jansenc 1369*59599516SKenneth E. Jansenc.... end 1370*59599516SKenneth E. Jansenc 1371*59599516SKenneth E. Jansen if(nsolflow.eq.1) then 1372*59599516SKenneth E. Jansen deallocate (lhsK) 1373*59599516SKenneth E. Jansen deallocate (lhsP) 1374*59599516SKenneth E. Jansen deallocate (aperm) 1375*59599516SKenneth E. Jansen deallocate (atemp) 1376*59599516SKenneth E. Jansen endif 1377*59599516SKenneth E. Jansen if(nsclrsol.gt.0) then 1378*59599516SKenneth E. Jansen deallocate (lhsS) 1379*59599516SKenneth E. Jansen deallocate (apermS) 1380*59599516SKenneth E. Jansen deallocate (atempS) 1381*59599516SKenneth E. Jansen endif 1382*59599516SKenneth E. Jansen 1383*59599516SKenneth E. Jansen if(iabc==1) deallocate(acs) 1384*59599516SKenneth E. Jansen 1385*59599516SKenneth E. Jansen!MR CHANGE 1386*59599516SKenneth E. Jansen if (numpe > 1) call MPI_BARRIER(MPI_COMM_WORLD, ierr) 1387*59599516SKenneth E. Jansen if(myrank.eq.0) then 1388*59599516SKenneth E. Jansen write(*,*) 'itrdrv - done - BACK TO process.f' 1389*59599516SKenneth E. Jansen endif 1390*59599516SKenneth E. Jansen!MR CHANGE 1391*59599516SKenneth E. Jansen 1392*59599516SKenneth E. Jansen 1393*59599516SKenneth E. Jansen 1394*59599516SKenneth E. Jansen return 1395*59599516SKenneth E. Jansen end 1396*59599516SKenneth E. Jansen 1397*59599516SKenneth E. Jansen subroutine lesmodels(y, ac, shgl, shp, 1398*59599516SKenneth E. Jansen & iper, ilwork, rowp, colm, 1399*59599516SKenneth E. Jansen & nsons, ifath, x, 1400*59599516SKenneth E. Jansen & iBC, BC) 1401*59599516SKenneth E. Jansen 1402*59599516SKenneth E. Jansen include "common.h" 1403*59599516SKenneth E. Jansen 1404*59599516SKenneth E. Jansen real*8 y(nshg,ndof), ac(nshg,ndof), 1405*59599516SKenneth E. Jansen & x(numnp,nsd), 1406*59599516SKenneth E. Jansen & BC(nshg,ndofBC) 1407*59599516SKenneth E. Jansen real*8 shp(MAXTOP,maxsh,MAXQPT), 1408*59599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT) 1409*59599516SKenneth E. Jansen 1410*59599516SKenneth E. Jansenc 1411*59599516SKenneth E. Jansen integer rowp(nshg,nnz), colm(nshg+1), 1412*59599516SKenneth E. Jansen & iBC(nshg), 1413*59599516SKenneth E. Jansen & ilwork(nlwork), 1414*59599516SKenneth E. Jansen & iper(nshg) 1415*59599516SKenneth E. Jansen dimension ifath(numnp), nsons(nfath) 1416*59599516SKenneth E. Jansen 1417*59599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: fwr2,fwr3,fwr4 1418*59599516SKenneth E. Jansen real*8, allocatable, dimension(:) :: stabdis,cdelsq1 1419*59599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: xavegt, xavegt2,xavegt3 1420*59599516SKenneth E. Jansen 1421*59599516SKenneth E. Jansen if( (iLES.gt.1) ) then ! Allocate Stuff for advanced LES models 1422*59599516SKenneth E. Jansen allocate (fwr2(nshg)) 1423*59599516SKenneth E. Jansen allocate (fwr3(nshg)) 1424*59599516SKenneth E. Jansen allocate (fwr4(nshg)) 1425*59599516SKenneth E. Jansen allocate (xavegt(nfath,12)) 1426*59599516SKenneth E. Jansen allocate (xavegt2(nfath,12)) 1427*59599516SKenneth E. Jansen allocate (xavegt3(nfath,12)) 1428*59599516SKenneth E. Jansen allocate (stabdis(nfath)) 1429*59599516SKenneth E. Jansen endif 1430*59599516SKenneth E. Jansen 1431*59599516SKenneth E. Jansenc.... get dynamic model coefficient 1432*59599516SKenneth E. Jansenc 1433*59599516SKenneth E. Jansen ilesmod=iLES/10 1434*59599516SKenneth E. Jansenc 1435*59599516SKenneth E. Jansenc digit bit set filter rule, 10 bit set model 1436*59599516SKenneth E. Jansenc 1437*59599516SKenneth E. Jansen if (ilesmod.eq.0) then ! 0 < iLES< 10 => dyn. model calculated 1438*59599516SKenneth E. Jansen ! at nodes based on discrete filtering 1439*59599516SKenneth E. Jansen 1440*59599516SKenneth E. Jansen 1441*59599516SKenneth E. Jansen if(isubmod.eq.2) then 1442*59599516SKenneth E. Jansen call SUPGdis(y, ac, shgl, shp, 1443*59599516SKenneth E. Jansen & iper, ilwork, 1444*59599516SKenneth E. Jansen & nsons, ifath, x, 1445*59599516SKenneth E. Jansen & iBC, BC, stabdis, xavegt3) 1446*59599516SKenneth E. Jansen endif 1447*59599516SKenneth E. Jansen 1448*59599516SKenneth E. Jansen if( ((isubmod.eq.0).or.(isubmod.eq.2)))then ! If no 1449*59599516SKenneth E. Jansen ! sub-model 1450*59599516SKenneth E. Jansen ! or SUPG 1451*59599516SKenneth E. Jansen ! model wanted 1452*59599516SKenneth E. Jansen 1453*59599516SKenneth E. Jansen if(i2filt.eq.0)then ! If simple filter 1454*59599516SKenneth E. Jansen 1455*59599516SKenneth E. Jansen if(modlstats .eq. 0) then ! If no model stats wanted 1456*59599516SKenneth E. Jansen call getdmc (y, shgl, shp, 1457*59599516SKenneth E. Jansen & iper, ilwork, nsons, 1458*59599516SKenneth E. Jansen & ifath, x) 1459*59599516SKenneth E. Jansen else ! else get model stats 1460*59599516SKenneth E. Jansen call stdfdmc (y, shgl, shp, 1461*59599516SKenneth E. Jansen & iper, ilwork, nsons, 1462*59599516SKenneth E. Jansen & ifath, x) 1463*59599516SKenneth E. Jansen endif ! end of stats if statement 1464*59599516SKenneth E. Jansen 1465*59599516SKenneth E. Jansen else ! else if twice filtering 1466*59599516SKenneth E. Jansen 1467*59599516SKenneth E. Jansen call widefdmc(y, shgl, shp, 1468*59599516SKenneth E. Jansen & iper, ilwork, nsons, 1469*59599516SKenneth E. Jansen & ifath, x) 1470*59599516SKenneth E. Jansen 1471*59599516SKenneth E. Jansen 1472*59599516SKenneth E. Jansen endif ! end of simple filter if statement 1473*59599516SKenneth E. Jansen 1474*59599516SKenneth E. Jansen endif ! end of SUPG or no sub-model if statement 1475*59599516SKenneth E. Jansen 1476*59599516SKenneth E. Jansen 1477*59599516SKenneth E. Jansen if( (isubmod.eq.1) ) then ! If DFWR sub-model wanted 1478*59599516SKenneth E. Jansen call cdelBHsq (y, shgl, shp, 1479*59599516SKenneth E. Jansen & iper, ilwork, nsons, 1480*59599516SKenneth E. Jansen & ifath, x, cdelsq1) 1481*59599516SKenneth E. Jansen call FiltRat (y, shgl, shp, 1482*59599516SKenneth E. Jansen & iper, ilwork, nsons, 1483*59599516SKenneth E. Jansen & ifath, x, cdelsq1, 1484*59599516SKenneth E. Jansen & fwr4, fwr3) 1485*59599516SKenneth E. Jansen 1486*59599516SKenneth E. Jansen 1487*59599516SKenneth E. Jansen if (i2filt.eq.0) then ! If simple filter wanted 1488*59599516SKenneth E. Jansen call DFWRsfdmc(y, shgl, shp, 1489*59599516SKenneth E. Jansen & iper, ilwork, nsons, 1490*59599516SKenneth E. Jansen & ifath, x, fwr2, fwr3) 1491*59599516SKenneth E. Jansen else ! else if twice filtering wanted 1492*59599516SKenneth E. Jansen call DFWRwfdmc(y, shgl, shp, 1493*59599516SKenneth E. Jansen & iper, ilwork, nsons, 1494*59599516SKenneth E. Jansen & ifath, x, fwr4, fwr4) 1495*59599516SKenneth E. Jansen endif ! end of simple filter if statement 1496*59599516SKenneth E. Jansen 1497*59599516SKenneth E. Jansen endif ! end of DFWR sub-model if statement 1498*59599516SKenneth E. Jansen 1499*59599516SKenneth E. Jansen if( (isubmod.eq.2) )then ! If SUPG sub-model wanted 1500*59599516SKenneth E. Jansen call dmcSUPG (y, ac, shgl, 1501*59599516SKenneth E. Jansen & shp, iper, ilwork, 1502*59599516SKenneth E. Jansen & nsons, ifath, x, 1503*59599516SKenneth E. Jansen & iBC, BC, rowp, colm, 1504*59599516SKenneth E. Jansen & xavegt2, stabdis) 1505*59599516SKenneth E. Jansen endif 1506*59599516SKenneth E. Jansen 1507*59599516SKenneth E. Jansen if(idis.eq.1)then ! If SUPG/Model dissipation wanted 1508*59599516SKenneth E. Jansen call ediss (y, ac, shgl, 1509*59599516SKenneth E. Jansen & shp, iper, ilwork, 1510*59599516SKenneth E. Jansen & nsons, ifath, x, 1511*59599516SKenneth E. Jansen & iBC, BC, xavegt) 1512*59599516SKenneth E. Jansen endif 1513*59599516SKenneth E. Jansen 1514*59599516SKenneth E. Jansen endif ! end of ilesmod 1515*59599516SKenneth E. Jansen 1516*59599516SKenneth E. Jansen if (ilesmod .eq. 1) then ! 10 < iLES < 20 => dynamic-mixed 1517*59599516SKenneth E. Jansen ! at nodes based on discrete filtering 1518*59599516SKenneth E. Jansen call bardmc (y, shgl, shp, 1519*59599516SKenneth E. Jansen & iper, ilwork, 1520*59599516SKenneth E. Jansen & nsons, ifath, x) 1521*59599516SKenneth E. Jansen endif 1522*59599516SKenneth E. Jansen 1523*59599516SKenneth E. Jansen if (ilesmod .eq. 2) then ! 20 < iLES < 30 => dynamic at quad 1524*59599516SKenneth E. Jansen ! pts based on lumped projection filt. 1525*59599516SKenneth E. Jansen 1526*59599516SKenneth E. Jansen if(isubmod.eq.0)then 1527*59599516SKenneth E. Jansen call projdmc (y, shgl, shp, 1528*59599516SKenneth E. Jansen & iper, ilwork, x) 1529*59599516SKenneth E. Jansen else 1530*59599516SKenneth E. Jansen call cpjdmcnoi (y, shgl, shp, 1531*59599516SKenneth E. Jansen & iper, ilwork, x, 1532*59599516SKenneth E. Jansen & rowp, colm, 1533*59599516SKenneth E. Jansen & iBC, BC) 1534*59599516SKenneth E. Jansen endif 1535*59599516SKenneth E. Jansen 1536*59599516SKenneth E. Jansen endif 1537*59599516SKenneth E. Jansen 1538*59599516SKenneth E. Jansen if( (iLES.gt.1) ) then ! Deallocate Stuff for advanced LES models 1539*59599516SKenneth E. Jansen deallocate (fwr2) 1540*59599516SKenneth E. Jansen deallocate (fwr3) 1541*59599516SKenneth E. Jansen deallocate (fwr4) 1542*59599516SKenneth E. Jansen deallocate (xavegt) 1543*59599516SKenneth E. Jansen deallocate (xavegt2) 1544*59599516SKenneth E. Jansen deallocate (xavegt3) 1545*59599516SKenneth E. Jansen deallocate (stabdis) 1546*59599516SKenneth E. Jansen endif 1547*59599516SKenneth E. Jansen return 1548*59599516SKenneth E. Jansen end 1549*59599516SKenneth E. Jansen 1550*59599516SKenneth E. Jansenc 1551*59599516SKenneth E. Jansenc...initialize the coefficients for the impedance convolution 1552*59599516SKenneth E. Jansenc 1553*59599516SKenneth E. Jansen subroutine CalcImpConvCoef (numISrfs, numTpoints) 1554*59599516SKenneth E. Jansen 1555*59599516SKenneth E. Jansen use convolImpFlow !uses flow history and impedance for convolution 1556*59599516SKenneth E. Jansen 1557*59599516SKenneth E. Jansen include "common.h" !for alfi 1558*59599516SKenneth E. Jansen 1559*59599516SKenneth E. Jansen integer numISrfs, numTpoints 1560*59599516SKenneth E. Jansen 1561*59599516SKenneth E. Jansen allocate (ConvCoef(numTpoints+2,3)) !same time discret. for all imp. BC 1562*59599516SKenneth E. Jansen do j=1,numTpoints+2 1563*59599516SKenneth E. Jansen ConvCoef(j,:)=0.5/numTpoints !dt/2 divided by period T=N*dt 1564*59599516SKenneth E. Jansen ConvCoef(j,1)=ConvCoef(j,1)*(1.0-alfi)*(1.0-alfi) 1565*59599516SKenneth E. Jansen ConvCoef(j,2)=ConvCoef(j,2)*(1.0+2*alfi*(1.0-alfi)) 1566*59599516SKenneth E. Jansen ConvCoef(j,3)=ConvCoef(j,3)*alfi*alfi 1567*59599516SKenneth E. Jansen enddo 1568*59599516SKenneth E. Jansen ConvCoef(1,2)=zero 1569*59599516SKenneth E. Jansen ConvCoef(1,3)=zero 1570*59599516SKenneth E. Jansen ConvCoef(2,3)=zero 1571*59599516SKenneth E. Jansen ConvCoef(numTpoints+1,1)=zero 1572*59599516SKenneth E. Jansen ConvCoef(numTpoints+2,2)=zero 1573*59599516SKenneth E. Jansen ConvCoef(numTpoints+2,1)=zero 1574*59599516SKenneth E. Jansenc 1575*59599516SKenneth E. Jansenc...calculate the coefficients for the impedance convolution 1576*59599516SKenneth E. Jansenc 1577*59599516SKenneth E. Jansen allocate (ImpConvCoef(numTpoints+2,numISrfs)) 1578*59599516SKenneth E. Jansen 1579*59599516SKenneth E. Jansenc..coefficients below assume Q linear in time step, Z constant 1580*59599516SKenneth E. Jansenc do j=3,numTpoints 1581*59599516SKenneth E. Jansenc ImpConvCoef(j,:) = ValueListImp(j-1,:)*ConvCoef(j,3) 1582*59599516SKenneth E. Jansenc & + ValueListImp(j,:)*ConvCoef(j,2) 1583*59599516SKenneth E. Jansenc & + ValueListImp(j+1,:)*ConvCoef(j,1) 1584*59599516SKenneth E. Jansenc enddo 1585*59599516SKenneth E. Jansenc ImpConvCoef(1,:) = ValueListImp(2,:)*ConvCoef(1,1) 1586*59599516SKenneth E. Jansenc ImpConvCoef(2,:) = ValueListImp(2,:)*ConvCoef(2,2) 1587*59599516SKenneth E. Jansenc & + ValueListImp(3,:)*ConvCoef(2,1) 1588*59599516SKenneth E. Jansenc ImpConvCoef(numTpoints+1,:) = 1589*59599516SKenneth E. Jansenc & ValueListImp(numTpoints,:)*ConvCoef(numTpoints+1,3) 1590*59599516SKenneth E. Jansenc & + ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+1,2) 1591*59599516SKenneth E. Jansenc ImpConvCoef(numTpoints+2,:) = 1592*59599516SKenneth E. Jansenc & ValueListImp(numTpoints+1,:)*ConvCoef(numTpoints+2,3) 1593*59599516SKenneth E. Jansen 1594*59599516SKenneth E. Jansenc..try easiest convolution Q and Z constant per time step 1595*59599516SKenneth E. Jansen do j=3,numTpoints+1 1596*59599516SKenneth E. Jansen ImpConvCoef(j,:) = ValueListImp(j-1,:)/numTpoints 1597*59599516SKenneth E. Jansen enddo 1598*59599516SKenneth E. Jansen ImpConvCoef(1,:) =zero 1599*59599516SKenneth E. Jansen ImpConvCoef(2,:) =zero 1600*59599516SKenneth E. Jansen ImpConvCoef(numTpoints+2,:) = 1601*59599516SKenneth E. Jansen & ValueListImp(numTpoints+1,:)/numTpoints 1602*59599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr() 1603*59599516SKenneth E. Jansen ImpConvCoef(numTpoints+1,:)= ImpConvCoef(numTpoints+1,:) 1604*59599516SKenneth E. Jansen & - ImpConvCoef(numTpoints+2,:)*(1.0-alfi)/alfi 1605*59599516SKenneth E. Jansen ImpConvCoef(numTpoints+2,:)= ImpConvCoef(numTpoints+2,:)/alfi 1606*59599516SKenneth E. Jansen return 1607*59599516SKenneth E. Jansen end 1608*59599516SKenneth E. Jansen 1609*59599516SKenneth E. Jansenc 1610*59599516SKenneth E. Jansenc ... update the flow rate history for the impedance convolution, filter it and write it out 1611*59599516SKenneth E. Jansenc 1612*59599516SKenneth E. Jansen subroutine UpdHistConv(y,nsrfIdList,numSrfs) 1613*59599516SKenneth E. Jansen 1614*59599516SKenneth E. Jansen use convolImpFlow !brings ntimeptpT, QHistImp, QHistTry, QHistTryF, numImpSrfs 1615*59599516SKenneth E. Jansen use convolRCRFlow !brings QHistRCR, numRCRSrfs 1616*59599516SKenneth E. Jansen 1617*59599516SKenneth E. Jansen include "common.h" 1618*59599516SKenneth E. Jansen 1619*59599516SKenneth E. Jansen integer nsrfIdList(0:MAXSURF), numSrfs 1620*59599516SKenneth E. Jansen character*20 fname1 1621*59599516SKenneth E. Jansen character*10 cname2 1622*59599516SKenneth E. Jansen character*5 cname 1623*59599516SKenneth E. Jansen real*8 y(nshg,3) !velocity at time n+1 1624*59599516SKenneth E. Jansen real*8 NewQ(0:MAXSURF) !temporary unknown for the flow rate 1625*59599516SKenneth E. Jansen !that needs to be added to the flow history 1626*59599516SKenneth E. Jansen 1627*59599516SKenneth E. Jansen call GetFlowQ(NewQ,y,nsrfIdList,numSrfs) !new flow at time n+1 1628*59599516SKenneth E. Jansenc 1629*59599516SKenneth E. Jansenc... for imp BC: shift QHist, add new constribution, filter and write out 1630*59599516SKenneth E. Jansenc 1631*59599516SKenneth E. Jansen if(numImpSrfs.gt.zero) then 1632*59599516SKenneth E. Jansen do j=1, ntimeptpT 1633*59599516SKenneth E. Jansen QHistImp(j,1:numSrfs)=QHistImp(j+1,1:numSrfs) 1634*59599516SKenneth E. Jansen enddo 1635*59599516SKenneth E. Jansen QHistImp(ntimeptpT+1,1:numSrfs) = NewQ(1:numSrfs) 1636*59599516SKenneth E. Jansen 1637*59599516SKenneth E. Jansenc 1638*59599516SKenneth E. Jansenc....filter the flow rate history 1639*59599516SKenneth E. Jansenc 1640*59599516SKenneth E. Jansen cutfreq = 10 !hardcoded cutting frequency of the filter 1641*59599516SKenneth E. Jansen do j=1, ntimeptpT 1642*59599516SKenneth E. Jansen QHistTry(j,:)=QHistImp(j+1,:) 1643*59599516SKenneth E. Jansen enddo 1644*59599516SKenneth E. Jansen call Filter(QHistTryF,QHistTry,ntimeptpT,Delt(1),cutfreq) 1645*59599516SKenneth E. Jansenc.... if no filter applied then uncomment next three lines 1646*59599516SKenneth E. Jansenc do j=1, ntimeptpT 1647*59599516SKenneth E. Jansenc QHistTryF(j,:)=QHistTry(j,:) 1648*59599516SKenneth E. Jansenc enddo 1649*59599516SKenneth E. Jansen 1650*59599516SKenneth E. Jansenc QHistImp(1,:)=zero ! why do we do this? for beta(1,:) = zero it does not really matters 1651*59599516SKenneth E. Jansen do j=1, ntimeptpT 1652*59599516SKenneth E. Jansen QHistImp(j+1,:)=QHistTryF(j,:) 1653*59599516SKenneth E. Jansen enddo 1654*59599516SKenneth E. Jansenc 1655*59599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat 1656*59599516SKenneth E. Jansenc 1657*59599516SKenneth E. Jansen if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or. 1658*59599516SKenneth E. Jansen & (istep .eq. nstep(1)))) .and. 1659*59599516SKenneth E. Jansen & (myrank .eq. master)) then 1660*59599516SKenneth E. Jansen open(unit=816, file='Qhistor.dat',status='replace') 1661*59599516SKenneth E. Jansen write(816,*) ntimeptpT 1662*59599516SKenneth E. Jansen do j=1,ntimeptpT+1 1663*59599516SKenneth E. Jansen write(816,*) (QHistImp(j,n),n=1, numSrfs) 1664*59599516SKenneth E. Jansen enddo 1665*59599516SKenneth E. Jansen close(816) 1666*59599516SKenneth E. Jansenc... write out a copy with step number to be able to restart 1667*59599516SKenneth E. Jansen fname1 = 'Qhistor' 1668*59599516SKenneth E. Jansen fname1 = trim(fname1)//trim(cname2(lstep))//'.dat' 1669*59599516SKenneth E. Jansen open(unit=8166,file=trim(fname1),status='unknown') 1670*59599516SKenneth E. Jansen write(8166,*) ntimeptpT 1671*59599516SKenneth E. Jansen do j=1,ntimeptpT+1 1672*59599516SKenneth E. Jansen write(8166,*) (QHistImp(j,n),n=1, numSrfs) 1673*59599516SKenneth E. Jansen enddo 1674*59599516SKenneth E. Jansen close(8166) 1675*59599516SKenneth E. Jansen endif 1676*59599516SKenneth E. Jansen endif 1677*59599516SKenneth E. Jansen 1678*59599516SKenneth E. Jansenc 1679*59599516SKenneth E. Jansenc... for RCR bc just add the new contribution 1680*59599516SKenneth E. Jansenc 1681*59599516SKenneth E. Jansen if(numRCRSrfs.gt.zero) then 1682*59599516SKenneth E. Jansen QHistRCR(lstep+1,1:numSrfs) = NewQ(1:numSrfs) 1683*59599516SKenneth E. Jansenc 1684*59599516SKenneth E. Jansenc.... write out the new history of flow rates to Qhistor.dat 1685*59599516SKenneth E. Jansenc 1686*59599516SKenneth E. Jansen if ((irs .ge. 1) .and. (myrank .eq. master)) then 1687*59599516SKenneth E. Jansen if(istep.eq.1) then 1688*59599516SKenneth E. Jansen open(unit=816,file='Qhistor.dat',status='unknown') 1689*59599516SKenneth E. Jansen else 1690*59599516SKenneth E. Jansen open(unit=816,file='Qhistor.dat',position='append') 1691*59599516SKenneth E. Jansen endif 1692*59599516SKenneth E. Jansen if(istep.eq.1) then 1693*59599516SKenneth E. Jansen do j=1,lstep 1694*59599516SKenneth E. Jansen write(816,*) j, (QHistRCR(j,n),n=1,numSrfs) ! read from file of previous run 1695*59599516SKenneth E. Jansen enddo 1696*59599516SKenneth E. Jansen endif 1697*59599516SKenneth E. Jansen write(816,*) lstep+1, (QHistRCR(lstep+1,n),n=1, numSrfs) 1698*59599516SKenneth E. Jansen close(816) 1699*59599516SKenneth E. Jansenc... write out a copy with step number to be able to restart 1700*59599516SKenneth E. Jansen if (((irs .ge. 1) .and. ((mod(lstep, ntout) .eq. 0) .or. 1701*59599516SKenneth E. Jansen & (istep .eq. nstep(1)))) .and. 1702*59599516SKenneth E. Jansen & (myrank .eq. master)) then 1703*59599516SKenneth E. Jansen fname1 = 'Qhistor' 1704*59599516SKenneth E. Jansen fname1 = trim(fname1)//trim(cname2(lstep))//'.dat' 1705*59599516SKenneth E. Jansen open(unit=8166,file=trim(fname1),status='unknown') 1706*59599516SKenneth E. Jansen write(8166,*) lstep+1 1707*59599516SKenneth E. Jansen do j=1,lstep+1 1708*59599516SKenneth E. Jansen write(8166,*) (QHistRCR(j,n),n=1, numSrfs) 1709*59599516SKenneth E. Jansen enddo 1710*59599516SKenneth E. Jansen close(8166) 1711*59599516SKenneth E. Jansen endif 1712*59599516SKenneth E. Jansen endif 1713*59599516SKenneth E. Jansen endif 1714*59599516SKenneth E. Jansen 1715*59599516SKenneth E. Jansen return 1716*59599516SKenneth E. Jansen end 1717*59599516SKenneth E. Jansen 1718*59599516SKenneth E. Jansenc 1719*59599516SKenneth E. Jansenc...calculate the time varying coefficients for the RCR convolution 1720*59599516SKenneth E. Jansenc 1721*59599516SKenneth E. Jansen subroutine CalcRCRConvCoef (stepn, numSrfs) 1722*59599516SKenneth E. Jansen 1723*59599516SKenneth E. Jansen use convolRCRFlow !brings in ValueListRCR, dtRCR 1724*59599516SKenneth E. Jansen 1725*59599516SKenneth E. Jansen include "common.h" !brings alfi 1726*59599516SKenneth E. Jansen 1727*59599516SKenneth E. Jansen integer numSrfs, stepn 1728*59599516SKenneth E. Jansen 1729*59599516SKenneth E. Jansen RCRConvCoef = zero 1730*59599516SKenneth E. Jansen if (stepn .eq. 0) then 1731*59599516SKenneth E. Jansen RCRConvCoef(1,:) = ValueListRCR(1,:)*(1.0-alfi) + 1732*59599516SKenneth E. Jansen & ValueListRCR(3,:)*(-alfi + 1.0 + 1/dtRCR(:) 1733*59599516SKenneth E. Jansen & - exp(-alfi*dtRCR(:))*(1 + 1/dtRCR(:))) 1734*59599516SKenneth E. Jansen RCRConvCoef(2,:) = ValueListRCR(1,:)*alfi 1735*59599516SKenneth E. Jansen & + ValueListRCR(3,:) 1736*59599516SKenneth E. Jansen & *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:)) 1737*59599516SKenneth E. Jansen endif 1738*59599516SKenneth E. Jansen if (stepn .ge. 1) then 1739*59599516SKenneth E. Jansen RCRConvCoef(1,:) =-ValueListRCR(3,:)*exp(-dtRCR(:)*(stepn+alfi)) 1740*59599516SKenneth E. Jansen & *(1 + (1 - exp(dtRCR(:)))/dtRCR(:)) 1741*59599516SKenneth E. Jansen RCRConvCoef(stepn+1,:) = ValueListRCR(1,:)*(1-alfi) 1742*59599516SKenneth E. Jansen & - ValueListRCR(3,:)*(alfi - 1 - 1/dtRCR(:) 1743*59599516SKenneth E. Jansen & + exp(-alfi*dtRCR(:))/dtRCR(:)*(2 - exp(-dtRCR(:)))) 1744*59599516SKenneth E. Jansen RCRConvCoef(stepn+2,:) = ValueListRCR(1,:)*alfi 1745*59599516SKenneth E. Jansen & + ValueListRCR(3,:) 1746*59599516SKenneth E. Jansen & *(alfi - 1/dtRCR(:) + exp(-alfi*dtRCR(:))/dtRCR(:)) 1747*59599516SKenneth E. Jansen endif 1748*59599516SKenneth E. Jansen if (stepn .ge. 2) then 1749*59599516SKenneth E. Jansen do j=2,stepn 1750*59599516SKenneth E. Jansen RCRConvCoef(j,:) = ValueListRCR(3,:)/dtRCR(:)* 1751*59599516SKenneth E. Jansen & exp(-dtRCR(:)*(stepn + alfi + 2 - j))* 1752*59599516SKenneth E. Jansen & (1 - exp(dtRCR(:)))**2 1753*59599516SKenneth E. Jansen enddo 1754*59599516SKenneth E. Jansen endif 1755*59599516SKenneth E. Jansen 1756*59599516SKenneth E. Jansenc compensate for yalpha passed not y in Elmgmr() 1757*59599516SKenneth E. Jansen RCRConvCoef(stepn+1,:)= RCRConvCoef(stepn+1,:) 1758*59599516SKenneth E. Jansen & - RCRConvCoef(stepn+2,:)*(1.0-alfi)/alfi 1759*59599516SKenneth E. Jansen RCRConvCoef(stepn+2,:)= RCRConvCoef(stepn+2,:)/alfi 1760*59599516SKenneth E. Jansen 1761*59599516SKenneth E. Jansen return 1762*59599516SKenneth E. Jansen end 1763*59599516SKenneth E. Jansen 1764*59599516SKenneth E. Jansenc 1765*59599516SKenneth E. Jansenc...calculate the time dependent H operator for the RCR convolution 1766*59599516SKenneth E. Jansenc 1767*59599516SKenneth E. Jansen subroutine CalcHopRCR (timestepRCR, stepn, numSrfs) 1768*59599516SKenneth E. Jansen 1769*59599516SKenneth E. Jansen use convolRCRFlow !brings in HopRCR, dtRCR 1770*59599516SKenneth E. Jansen 1771*59599516SKenneth E. Jansen include "common.h" 1772*59599516SKenneth E. Jansen 1773*59599516SKenneth E. Jansen integer numSrfs, stepn 1774*59599516SKenneth E. Jansen real*8 PdistCur(0:MAXSURF), timestepRCR 1775*59599516SKenneth E. Jansen 1776*59599516SKenneth E. Jansen HopRCR=zero 1777*59599516SKenneth E. Jansen call RCRint(timestepRCR*(stepn + alfi),PdistCur) 1778*59599516SKenneth E. Jansen HopRCR(1:numSrfs) = RCRic(1:numSrfs) 1779*59599516SKenneth E. Jansen & *exp(-dtRCR(1:numSrfs)*(stepn + alfi)) + PdistCur(1:numSrfs) 1780*59599516SKenneth E. Jansen return 1781*59599516SKenneth E. Jansen end 1782*59599516SKenneth E. Jansenc 1783*59599516SKenneth E. Jansenc ... initialize the influence of the initial conditions for the RCR BC 1784*59599516SKenneth E. Jansenc 1785*59599516SKenneth E. Jansen subroutine calcRCRic(y,srfIdList,numSrfs) 1786*59599516SKenneth E. Jansen 1787*59599516SKenneth E. Jansen use convolRCRFlow !brings RCRic, ValueListRCR, ValuePdist 1788*59599516SKenneth E. Jansen 1789*59599516SKenneth E. Jansen include "common.h" 1790*59599516SKenneth E. Jansen 1791*59599516SKenneth E. Jansen integer srfIdList(0:MAXSURF), numSrfs, irankCoupled 1792*59599516SKenneth E. Jansen real*8 y(nshg,4) !need velocity and pressure 1793*59599516SKenneth E. Jansen real*8 Qini(0:MAXSURF) !initial flow rate 1794*59599516SKenneth E. Jansen real*8 PdistIni(0:MAXSURF) !initial distal pressure 1795*59599516SKenneth E. Jansen real*8 Pini(0:MAXSURF),CoupleArea(0:MAXSURF) ! initial pressure 1796*59599516SKenneth E. Jansen real*8 VelOnly(nshg,3), POnly(nshg) 1797*59599516SKenneth E. Jansen 1798*59599516SKenneth E. Jansen allocate (RCRic(0:MAXSURF)) 1799*59599516SKenneth E. Jansen 1800*59599516SKenneth E. Jansen if(lstep.eq.0) then 1801*59599516SKenneth E. Jansen VelOnly(:,1:3)=y(:,1:3) 1802*59599516SKenneth E. Jansen call GetFlowQ(Qini,VelOnly,srfIdList,numSrfs) !get initial flow 1803*59599516SKenneth E. Jansen QHistRCR(1,1:numSrfs)=Qini(1:numSrfs) !initialize QHistRCR 1804*59599516SKenneth E. Jansen POnly(:)=y(:,4) ! pressure 1805*59599516SKenneth E. Jansen call integrScalar(Pini,POnly,srfIdList,numSrfs) !get initial pressure integral 1806*59599516SKenneth E. Jansen POnly(:)=one ! one to get area 1807*59599516SKenneth E. Jansen call integrScalar(CoupleArea,POnly,srfIdList,numSrfs) !get surf area 1808*59599516SKenneth E. Jansen Pini(1:numSrfs) = Pini(1:numSrfs)/CoupleArea(1:numSrfs) 1809*59599516SKenneth E. Jansen else 1810*59599516SKenneth E. Jansen Qini(1:numSrfs)=QHistRCR(1,1:numSrfs) 1811*59599516SKenneth E. Jansen Pini(1:numSrfs)=zero ! hack 1812*59599516SKenneth E. Jansen endif 1813*59599516SKenneth E. Jansen call RCRint(istep,PdistIni) !get initial distal P (use istep) 1814*59599516SKenneth E. Jansen RCRic(1:numSrfs) = Pini(1:numSrfs) 1815*59599516SKenneth E. Jansen & - ValueListRCR(1,:)*Qini(1:numSrfs)-PdistIni(1:numSrfs) 1816*59599516SKenneth E. Jansen return 1817*59599516SKenneth E. Jansen end 1818*59599516SKenneth E. Jansen 1819*59599516SKenneth E. Jansenc.........function that integrates a scalar over a boundary 1820*59599516SKenneth E. Jansen subroutine integrScalar(scalInt,scal,srfIdList,numSrfs) 1821*59599516SKenneth E. Jansen 1822*59599516SKenneth E. Jansen use pvsQbi !brings ndsurf, NASC 1823*59599516SKenneth E. Jansen 1824*59599516SKenneth E. Jansen include "common.h" 1825*59599516SKenneth E. Jansen include "mpif.h" 1826*59599516SKenneth E. Jansen 1827*59599516SKenneth E. Jansen integer srfIdList(0:MAXSURF), numSrfs, irankCoupled, i, k 1828*59599516SKenneth E. Jansen real*8 scal(nshg), scalInt(0:MAXSURF), scalIntProc(0:MAXSURF) 1829*59599516SKenneth E. Jansen 1830*59599516SKenneth E. Jansen scalIntProc = zero 1831*59599516SKenneth E. Jansen do i = 1,nshg 1832*59599516SKenneth E. Jansen if(numSrfs.gt.zero) then 1833*59599516SKenneth E. Jansen do k = 1,numSrfs 1834*59599516SKenneth E. Jansen irankCoupled = 0 1835*59599516SKenneth E. Jansen if (srfIdList(k).eq.ndsurf(i)) then 1836*59599516SKenneth E. Jansen irankCoupled=k 1837*59599516SKenneth E. Jansen scalIntProc(irankCoupled) = scalIntProc(irankCoupled) 1838*59599516SKenneth E. Jansen & + NASC(i)*scal(i) 1839*59599516SKenneth E. Jansen exit 1840*59599516SKenneth E. Jansen endif 1841*59599516SKenneth E. Jansen enddo 1842*59599516SKenneth E. Jansen endif 1843*59599516SKenneth E. Jansen enddo 1844*59599516SKenneth E. Jansenc 1845*59599516SKenneth E. Jansenc at this point, each scalint has its "nodes" contributions to the scalar 1846*59599516SKenneth E. Jansenc accumulated into scalIntProc. Note, because NASC is on processor this 1847*59599516SKenneth E. Jansenc will NOT be the scalar for the surface yet 1848*59599516SKenneth E. Jansenc 1849*59599516SKenneth E. Jansenc.... reduce integrated scalar for each surface, push on scalInt 1850*59599516SKenneth E. Jansenc 1851*59599516SKenneth E. Jansen npars=MAXSURF+1 1852*59599516SKenneth E. Jansen call MPI_ALLREDUCE (scalIntProc, scalInt(:), npars, 1853*59599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr) 1854*59599516SKenneth E. Jansen 1855*59599516SKenneth E. Jansen return 1856*59599516SKenneth E. Jansen end 1857*59599516SKenneth E. Jansen 1858*59599516SKenneth E. Jansen 1859*59599516SKenneth E. Jansen 1860*59599516SKenneth E. Jansen 1861*59599516SKenneth E. Jansen 1862