1*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 2*59599516SKenneth E. Jansenc 3*59599516SKenneth E. Jansenc This module conveys temporal BC data. Below functions read in the data 4*59599516SKenneth E. Jansenc and interpolate it to the current time level. 5*59599516SKenneth E. Jansenc 6*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 7*59599516SKenneth E. Jansen module specialBC 8*59599516SKenneth E. Jansen use pointer_data 9*59599516SKenneth E. Jansen 10*59599516SKenneth E. Jansen real*8, allocatable :: BCt(:,:), acs(:,:), spamp(:) 11*59599516SKenneth E. Jansen real*8, allocatable :: ytarget(:,:) 12*59599516SKenneth E. Jansen real*8, allocatable :: BCperiod(:) 13*59599516SKenneth E. Jansen integer, allocatable :: nBCt(:), numBCt(:) 14*59599516SKenneth E. Jansen 15*59599516SKenneth E. Jansen type(r2d),dimension(:),allocatable :: BCtptr 16*59599516SKenneth E. Jansen ! BCtptr%p(:,:) is to replace BCt(ic,:,:), in which 17*59599516SKenneth E. Jansen ! the second index is dynamically decided in 18*59599516SKenneth E. Jansen ! the setup stage. 19*59599516SKenneth E. Jansen 20*59599516SKenneth E. Jansen integer ntv,nptsmax 21*59599516SKenneth E. Jansenc$$$ integer itvn 22*59599516SKenneth E. Jansen end module 23*59599516SKenneth E. Jansen 24*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 25*59599516SKenneth E. Jansenc 26*59599516SKenneth E. Jansenc This module conveys flow rate history for the different impedance outlets 27*59599516SKenneth E. Jansenc over one period. Below functions read in the data and store it for the 28*59599516SKenneth E. Jansenc current time level. 29*59599516SKenneth E. Jansenc 30*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 31*59599516SKenneth E. Jansen module convolImpFlow 32*59599516SKenneth E. Jansen 33*59599516SKenneth E. Jansen real*8, allocatable :: QHistImp(:,:), ValueImpt(:,:,:) 34*59599516SKenneth E. Jansen real*8, allocatable :: ValueListImp(:,:), ConvCoef(:,:) 35*59599516SKenneth E. Jansen real*8, allocatable :: ImpConvCoef(:,:), poldImp(:) 36*59599516SKenneth E. Jansen integer ntimeptpT,numDataImp 37*59599516SKenneth E. Jansen integer, allocatable :: nImpt(:), numImpt(:) 38*59599516SKenneth E. Jansen integer nptsImpmax 39*59599516SKenneth E. Jansen real*8, allocatable :: QHistTry(:,:), QHistTryF(:,:) !filter 40*59599516SKenneth E. Jansen integer cutfreq !filter 41*59599516SKenneth E. Jansen end module 42*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 43*59599516SKenneth E. Jansenc 44*59599516SKenneth E. Jansenc This module conveys the parameters for the different RCR outlets. 45*59599516SKenneth E. Jansenc Below functions read in the inputs (proximal resistance, capacitance, 46*59599516SKenneth E. Jansenc distal resistance and distal pressure) and store it for the 47*59599516SKenneth E. Jansenc current time level. 48*59599516SKenneth E. Jansenc 49*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 50*59599516SKenneth E. Jansen module convolRCRFlow 51*59599516SKenneth E. Jansen 52*59599516SKenneth E. Jansen real*8, allocatable :: ValueListRCR(:,:), ValuePdist(:,:,:) !inputs 53*59599516SKenneth E. Jansen real*8, allocatable :: QHistRCR(:,:), HopRCR(:) !calc 54*59599516SKenneth E. Jansen real*8, allocatable :: RCRConvCoef(:,:), poldRCR(:) !calc 55*59599516SKenneth E. Jansen real*8, allocatable :: dtRCR(:) !scaled timestep: deltat/RdC 56*59599516SKenneth E. Jansen real*8, allocatable :: RCRic(:) !(P(0)-RQ(0)-Pd(0)) 57*59599516SKenneth E. Jansen integer nptsRCRmax,numDataRCR !to read inputs 58*59599516SKenneth E. Jansen integer, allocatable :: numRCRt(:) !to read inputs 59*59599516SKenneth E. Jansen end module 60*59599516SKenneth E. Jansen 61*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 62*59599516SKenneth E. Jansenc 63*59599516SKenneth E. Jansenc Initialize: 64*59599516SKenneth E. Jansenc 65*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 66*59599516SKenneth E. Jansen subroutine initSponge( y,x) 67*59599516SKenneth E. Jansen 68*59599516SKenneth E. Jansen use specialBC 69*59599516SKenneth E. Jansen include "common.h" 70*59599516SKenneth E. Jansen 71*59599516SKenneth E. Jansen real*8 y(nshg,nflow), x(numnp,3) 72*59599516SKenneth E. Jansen allocate (ytarget(nshg,nflow)) 73*59599516SKenneth E. Jansen 74*59599516SKenneth E. Jansen if(matflg(5,1).eq.5) then 75*59599516SKenneth E. Jansen write(*,*) 'calculating IC sponge' 76*59599516SKenneth E. Jansen ytarget = y 77*59599516SKenneth E. Jansen else 78*59599516SKenneth E. Jansen write(*,*) 'calculating Analytic sponge' 79*59599516SKenneth E. Jansen 80*59599516SKenneth E. Jansenc 81*59599516SKenneth E. Jansenc OLD style sponge pushed onto target. You need to be sure that your 82*59599516SKenneth E. Jansenc solver.inp entries for start and stop of sponge match as well as the 83*59599516SKenneth E. Jansenc growth rates 84*59599516SKenneth E. Jansenc 85*59599516SKenneth E. Jansen vcl=datmat(1,5,1) ! velocity on centerline 86*59599516SKenneth E. Jansen rslc=datmat(2,5,1) ! shear layer center radius 87*59599516SKenneth E. Jansen bfz=datmat(3,5,1) 88*59599516SKenneth E. Jansen we=3.0*29./682. 89*59599516SKenneth E. Jansen rsteep=3.0 90*59599516SKenneth E. Jansen zstart=30.0 91*59599516SKenneth E. Jansen radst=10.0 92*59599516SKenneth E. Jansen radsts=radst*radst 93*59599516SKenneth E. Jansen do id=1,numnp 94*59599516SKenneth E. Jansen radsqr=x(id,2)**2+x(id,1)**2 95*59599516SKenneth E. Jansenc if((x(id,3).gt. zstart) .or. (radsqr.gt.radsts)) then 96*59599516SKenneth E. Jansen rad=sqrt(radsqr) 97*59599516SKenneth E. Jansen radc=max(rad,radst) 98*59599516SKenneth E. Jansen zval=max(x(id,3),zstart) 99*59599516SKenneth E. Jansen utarget=(tanh(rsteep*(rslc-rad))+one)/two* 100*59599516SKenneth E. Jansen & (vcl-we) + we 101*59599516SKenneth E. Jansen Ttarget = press/(ro*Rgas) 102*59599516SKenneth E. Jansen ptarget= press 103*59599516SKenneth E. Jansen ytarget(id,1) = zero 104*59599516SKenneth E. Jansen ytarget(id,2) = zero 105*59599516SKenneth E. Jansen ytarget(id,3) = utarget 106*59599516SKenneth E. Jansen ytarget(id,4) = ptarget 107*59599516SKenneth E. Jansen ytarget(id,5) = Ttarget 108*59599516SKenneth E. Jansenc endif 109*59599516SKenneth E. Jansen enddo 110*59599516SKenneth E. Jansen endif 111*59599516SKenneth E. Jansen return 112*59599516SKenneth E. Jansen end 113*59599516SKenneth E. Jansen 114*59599516SKenneth E. Jansen 115*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 116*59599516SKenneth E. Jansenc 117*59599516SKenneth E. Jansenc Initialize:time varying boundary condition 118*59599516SKenneth E. Jansenc 119*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 120*59599516SKenneth E. Jansen subroutine initBCt( x, iBC, BC ) 121*59599516SKenneth E. Jansen 122*59599516SKenneth E. Jansen use specialBC 123*59599516SKenneth E. Jansen include "common.h" 124*59599516SKenneth E. Jansen 125*59599516SKenneth E. Jansen real*8 x(numnp,nsd), BC(nshg,ndofBC), rj1,rj2,rj3,rj4,distd,epsd 126*59599516SKenneth E. Jansen integer iBC(nshg) 127*59599516SKenneth E. Jansen character*80 card 128*59599516SKenneth E. Jansen real*8 distds 129*59599516SKenneth E. Jansen real*8 dd 130*59599516SKenneth E. Jansen 131*59599516SKenneth E. Jansen integer irstart 132*59599516SKenneth E. Jansen real(kind=8),allocatable,dimension(:) :: bcttest 133*59599516SKenneth E. Jansen 134*59599516SKenneth E. Jansen real*8 t0,tlen,t1,tstart,tend 135*59599516SKenneth E. Jansen integer i0,ilen,i1,nper,istart,iend 136*59599516SKenneth E. Jansenc 137*59599516SKenneth E. Jansenc This one should be used for boundary layer meshes where bct.dat must 138*59599516SKenneth E. Jansenc be given to greater precision than is currently being generated. 139*59599516SKenneth E. Jansenc 140*59599516SKenneth E. Jansenc epsd=1.0d-12 ! this is distance SQUARED to save square root 141*59599516SKenneth E. Jansen 142*59599516SKenneth E. Jansen epsd=1.0d-8 ! this is distance SQUARED to save square root 143*59599516SKenneth E. Jansen 144*59599516SKenneth E. Jansen ic=0 !count the number on this processor 145*59599516SKenneth E. Jansen 146*59599516SKenneth E. Jansen! ************ Chun Sun: limit the memory use if required time steps 147*59599516SKenneth E. Jansen! ************ is smaller than total bct.dat length. 148*59599516SKenneth E. Jansen 149*59599516SKenneth E. Jansen ! readin the start timestep 150*59599516SKenneth E. Jansen 151*59599516SKenneth E. Jansen open(unit=72,file='numstart.dat',status='old') 152*59599516SKenneth E. Jansen read(72,*) irstart 153*59599516SKenneth E. Jansen close(72) 154*59599516SKenneth E. Jansen 155*59599516SKenneth E. Jansen ! use irstart-1 and nstep+1 to avoid machine tolerance issues 156*59599516SKenneth E. Jansen t0 = max(zero,(irstart-1)*Delt(1)) 157*59599516SKenneth E. Jansen tlen = (nstep(1)+1)*Delt(1) 158*59599516SKenneth E. Jansen ! Assumption: constant time step in one run. If you use variable 159*59599516SKenneth E. Jansen ! time step in one run, this should be modified. 160*59599516SKenneth E. Jansen t1 = t0 + tlen 161*59599516SKenneth E. Jansen 162*59599516SKenneth E. Jansen if(myrank.eq.master) 163*59599516SKenneth E. Jansen & write(*,*) 'necessary bct timing: from ',t0,' to ',t1 164*59599516SKenneth E. Jansen 165*59599516SKenneth E. Jansen! ************************************************************** 166*59599516SKenneth E. Jansen 167*59599516SKenneth E. Jansen 168*59599516SKenneth E. Jansen if(any(ibits(iBC,3,3).eq.7)) then 169*59599516SKenneth E. Jansen if(myrank.eq.master) write(*,*) 'opening bct.dat' 170*59599516SKenneth E. Jansenc open(unit=567, file='bct.dat',status='old') 171*59599516SKenneth E. Jansen open(unit=567, file='bct.dat',ACTION='READ',STATUS='old') 172*59599516SKenneth E. Jansen read (567,'(a80)') card 173*59599516SKenneth E. Jansen read (card,*) ntv, nptsmax 174*59599516SKenneth E. Jansenc read(567,*) ntv,nptsmax 175*59599516SKenneth E. Jansen allocate (nBCt(numnp)) 176*59599516SKenneth E. Jansen allocate (numBCt(ntv)) 177*59599516SKenneth E. Jansen allocate (BCt(nptsmax,4)) 178*59599516SKenneth E. Jansen allocate (BCperiod(ntv)) 179*59599516SKenneth E. Jansen allocate (BCtptr(ntv)) ! dynamic bct allocation 180*59599516SKenneth E. Jansen do k=1,ntv 181*59599516SKenneth E. Jansen read(567,*) x1,x2,x3,ntpts 182*59599516SKenneth E. Jansenc 183*59599516SKenneth E. Jansenc Find the point on the boundary (if it is on this processor) 184*59599516SKenneth E. Jansenc that matches this point 185*59599516SKenneth E. Jansenc 186*59599516SKenneth E. Jansen do i=1,numnp 187*59599516SKenneth E. Jansen if(ibits(ibc(i),3,3) .eq.7) then 188*59599516SKenneth E. Jansen dd= distds(x1,x2,x3,x(i,1),x(i,2),x(i,3)) 189*59599516SKenneth E. Jansen if(dd.lt.epsd) then 190*59599516SKenneth E. Jansen ic=ic+1 191*59599516SKenneth E. Jansen nBCt(ic)=i ! the pointer to this point 192*59599516SKenneth E. Jansen! numBCt(ic)=ntpts ! the number of time series 193*59599516SKenneth E. Jansen do j=1,ntpts 194*59599516SKenneth E. Jansenc read(567,*) BCt(ic,j,4),(BCt(ic,j,n),n=1,3) 195*59599516SKenneth E. Jansen read(567,*) (BCt(j,n),n=1,4) 196*59599516SKenneth E. Jansen enddo 197*59599516SKenneth E. Jansen ! at this point we have all bc data of spacial point 198*59599516SKenneth E. Jansen ! ic/i in all time domain. now we figure out which subset 199*59599516SKenneth E. Jansen ! is necessary. 200*59599516SKenneth E. Jansen if (tlen.ge.BCt(ntpts,4)) then 201*59599516SKenneth E. Jansen ! whole run is larger than whole period 202*59599516SKenneth E. Jansen ! should take all data 203*59599516SKenneth E. Jansen ilen = ntpts 204*59599516SKenneth E. Jansen allocate(BCtptr(ic)%p(ilen,4)) 205*59599516SKenneth E. Jansen BCtptr(ic)%p = BCt(1:ilen,:) 206*59599516SKenneth E. Jansen else 207*59599516SKenneth E. Jansen nper = t0/BCt(ntpts,4) 208*59599516SKenneth E. Jansen tstart = t0-nper*BCt(ntpts,4) 209*59599516SKenneth E. Jansen nper = t1/BCt(ntpts,4) 210*59599516SKenneth E. Jansen tend = t1-nper*BCt(ntpts,4) 211*59599516SKenneth E. Jansen istart = iBfind(BCt(:,4),ntpts,tstart) 212*59599516SKenneth E. Jansen iend = iBfind(BCt(:,4),ntpts,tend) 213*59599516SKenneth E. Jansen if (istart>1) istart=istart-1 214*59599516SKenneth E. Jansen if (iend<ntpts) iend=iend+1 215*59599516SKenneth E. Jansen !write(*,*)'bcstart:',BCt(istart,4),tstart 216*59599516SKenneth E. Jansen !write(*,*)'bcend:',BCt(iend,4),tend 217*59599516SKenneth E. Jansen if (tstart.lt.tend) then ! does not loop 218*59599516SKenneth E. Jansen ilen = iend-istart+1 219*59599516SKenneth E. Jansen allocate(BCtptr(ic)%p(ilen,4)) 220*59599516SKenneth E. Jansen BCtptr(ic)%p = BCt(istart:iend,:) 221*59599516SKenneth E. Jansen else ! loop within two consequetive time period 222*59599516SKenneth E. Jansen i0 = (ntpts-istart+1) ! first segment 223*59599516SKenneth E. Jansen ilen = iend + i0 224*59599516SKenneth E. Jansen allocate(BCtptr(ic)%p(ilen,4)) 225*59599516SKenneth E. Jansen BCtptr(ic)%p(1:i0,:) = BCt(istart:ntpts,:) 226*59599516SKenneth E. Jansen BCtptr(ic)%p(i0+1:ilen,:) = BCt(1:iend,:) 227*59599516SKenneth E. Jansen BCtptr(ic)%p(i0+1:ilen,4) = 228*59599516SKenneth E. Jansen & BCtptr(ic)%p(i0+1:ilen,4) + BCt(ntpts,4) 229*59599516SKenneth E. Jansen endif 230*59599516SKenneth E. Jansen endif 231*59599516SKenneth E. Jansen numBCt(ic) = ilen 232*59599516SKenneth E. Jansen BCtptr(ic)%p(:,4) = BCtptr(ic)%p(:,4)*bcttimescale 233*59599516SKenneth E. Jansen BCperiod(ic) = BCt(ntpts,4)*bcttimescale 234*59599516SKenneth E. Jansen exit 235*59599516SKenneth E. Jansen endif 236*59599516SKenneth E. Jansen endif 237*59599516SKenneth E. Jansen enddo 238*59599516SKenneth E. Jansen if(i.eq.numnp+1) then 239*59599516SKenneth E. Jansenc 240*59599516SKenneth E. Jansenc if we get here the point was not found. It must be on another 241*59599516SKenneth E. Jansenc processor so we read past this record and move on 242*59599516SKenneth E. Jansenc 243*59599516SKenneth E. Jansen do j=1,ntpts 244*59599516SKenneth E. Jansen read(567,*) rj1,rj2,rj3,rj4 245*59599516SKenneth E. Jansen enddo 246*59599516SKenneth E. Jansen endif 247*59599516SKenneth E. Jansen enddo ! end of the loop over ntv 248*59599516SKenneth E. Jansen !BCt(:,:,4)=BCt(:,:,4)*bcttimescale 249*59599516SKenneth E. Jansen deallocate(BCt) 250*59599516SKenneth E. Jansen endif ! any 3 component nodes 251*59599516SKenneth E. Jansen itvn=ic 252*59599516SKenneth E. Jansen close(567) 253*59599516SKenneth E. Jansen if (ic.gt.0) then 254*59599516SKenneth E. Jansen write(*,*)'myrank=',myrank,' and I found ',ic,' nodes.' 255*59599516SKenneth E. Jansenc else 256*59599516SKenneth E. Jansenc deallocate(nBCt) 257*59599516SKenneth E. Jansenc deallocate(numBCt) 258*59599516SKenneth E. Jansenc deallocate(BCt) 259*59599516SKenneth E. Jansen endif 260*59599516SKenneth E. Jansen 261*59599516SKenneth E. Jansen return 262*59599516SKenneth E. Jansen end 263*59599516SKenneth E. Jansen 264*59599516SKenneth E. Jansen!*************************************************************** 265*59599516SKenneth E. Jansen! A Binary search return an index of a real array. 266*59599516SKenneth E. Jansen! This array should be an ascending sorted array. 267*59599516SKenneth E. Jansen!*************************************************************** 268*59599516SKenneth E. Jansen function iBfind(bArray,bLen,bVal) 269*59599516SKenneth E. Jansen integer,intent(in) :: bLen 270*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(bLen) :: bArray 271*59599516SKenneth E. Jansen real(kind=8),intent(in) :: bVal 272*59599516SKenneth E. Jansen integer mlen,indx,bstart,bend 273*59599516SKenneth E. Jansen bstart = 1 274*59599516SKenneth E. Jansen bend = bLen 275*59599516SKenneth E. Jansen indx = (bLen+1)/2 276*59599516SKenneth E. Jansen do while ((bstart+1).lt.bend) 277*59599516SKenneth E. Jansen if (bVal.gt.bArray(indx)) then 278*59599516SKenneth E. Jansen bstart = indx 279*59599516SKenneth E. Jansen else 280*59599516SKenneth E. Jansen bend = indx 281*59599516SKenneth E. Jansen endif 282*59599516SKenneth E. Jansen indx = (bstart+bend)/2 283*59599516SKenneth E. Jansen enddo 284*59599516SKenneth E. Jansen iBfind = indx 285*59599516SKenneth E. Jansen return 286*59599516SKenneth E. Jansen end function 287*59599516SKenneth E. Jansen 288*59599516SKenneth E. Jansen 289*59599516SKenneth E. Jansen subroutine BCint(timel,shp,shgl,shpb,shglb,x,BC,iBC) 290*59599516SKenneth E. Jansen 291*59599516SKenneth E. Jansen use specialBC ! brings in itvn,nbct, bct, numbct, nptsmax 292*59599516SKenneth E. Jansen 293*59599516SKenneth E. Jansen include "common.h" 294*59599516SKenneth E. Jansen 295*59599516SKenneth E. Jansen real*8 BC(nshg,ndofBC), timel,t 296*59599516SKenneth E. Jansen real*8 x(numnp,nsd), 297*59599516SKenneth E. Jansen & shp(MAXTOP,maxsh,MAXQPT), 298*59599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 299*59599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 300*59599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 301*59599516SKenneth E. Jansen 302*59599516SKenneth E. Jansen integer iBC(numnp),nlast,i,j,nper 303*59599516SKenneth E. Jansen 304*59599516SKenneth E. Jansen do i =1,itvn ! itvn is the number of varying nodes on this proc 305*59599516SKenneth E. Jansen 306*59599516SKenneth E. Jansen nlast=numBCt(i) ! number of time series to interpolate from 307*59599516SKenneth E. Jansen nper=timel/BCperiod(i) 308*59599516SKenneth E. Jansen ! number of periods completed to shift off 309*59599516SKenneth E. Jansen 310*59599516SKenneth E. Jansen 311*59599516SKenneth E. Jansen t=timel-nper*BCperiod(i) ! now time in periodic domain 312*59599516SKenneth E. Jansen 313*59599516SKenneth E. Jansen do j=2,nlast !loop to find the interval that we are in 314*59599516SKenneth E. Jansen 315*59599516SKenneth E. Jansen if(BCtptr(i)%p(j,4).gt.t) then 316*59599516SKenneth E. Jansen ! this is upper bound, j-1 is lower 317*59599516SKenneth E. Jansen 318*59599516SKenneth E. Jansen wr=(t-BCtptr(i)%p(j-1,4))/(BCtptr(i)%p(j,4)-BCtptr(i)%p(j-1,4)) 319*59599516SKenneth E. Jansen BC(nbct(i),3:5)= BCtptr(i)%p(j-1,1:3)*(one-wr) 320*59599516SKenneth E. Jansen & + BCtptr(i)%p(j,1:3)*wr 321*59599516SKenneth E. Jansen exit 322*59599516SKenneth E. Jansen 323*59599516SKenneth E. Jansen endif 324*59599516SKenneth E. Jansen enddo 325*59599516SKenneth E. Jansen enddo 326*59599516SKenneth E. Jansen return 327*59599516SKenneth E. Jansen end 328*59599516SKenneth E. Jansen 329*59599516SKenneth E. Jansen function distds(x1,y1,z1,x2,y2,z2) 330*59599516SKenneth E. Jansen real*8 distds 331*59599516SKenneth E. Jansen real*8 x1,y1,z1,x2,y2,z2,x,y,z 332*59599516SKenneth E. Jansen x=x1-x2 333*59599516SKenneth E. Jansen y=y1-y2 334*59599516SKenneth E. Jansen z=z1-z2 335*59599516SKenneth E. Jansen distds=x*x+y*y+z*z 336*59599516SKenneth E. Jansen return 337*59599516SKenneth E. Jansen end 338*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 339*59599516SKenneth E. Jansenc initialize the impedance boundary condition: 340*59599516SKenneth E. Jansenc read the data in initImpt 341*59599516SKenneth E. Jansenc interpolate the data to match the process time step in Impint 342*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 343*59599516SKenneth E. Jansen subroutine initImpt() 344*59599516SKenneth E. Jansen 345*59599516SKenneth E. Jansen use convolImpFlow 346*59599516SKenneth E. Jansen include "common.h" 347*59599516SKenneth E. Jansen 348*59599516SKenneth E. Jansen open(unit=817, file='impt.dat',status='old') 349*59599516SKenneth E. Jansen read (817,*) nptsImpmax 350*59599516SKenneth E. Jansen allocate (numImpt(numImpSrfs)) 351*59599516SKenneth E. Jansen allocate (ValueImpt(nptsImpmax,2,numImpSrfs)) 352*59599516SKenneth E. Jansen ValueImpt=0 353*59599516SKenneth E. Jansen do k=1,numImpSrfs 354*59599516SKenneth E. Jansen read (817,*) numDataImp 355*59599516SKenneth E. Jansen numImpt(k) = numDataImp 356*59599516SKenneth E. Jansen do j=1,numDataImp 357*59599516SKenneth E. Jansen read(817,*) (ValueImpt(j,n,k),n=1,2) ! n=1 time, 2 value 358*59599516SKenneth E. Jansen enddo 359*59599516SKenneth E. Jansen enddo 360*59599516SKenneth E. Jansen close(817) 361*59599516SKenneth E. Jansen 362*59599516SKenneth E. Jansen allocate (ValueListImp(ntimeptpT+1,numImpSrfs)) 363*59599516SKenneth E. Jansen ValueListImp = zero 364*59599516SKenneth E. Jansen ValueListImp(ntimeptpT+1,:) = ValueImpt(1,2,:) !Z(time=0), last entry 365*59599516SKenneth E. Jansen ValueListImp(1,:) = ValueImpt(1,2,:) !Z(time=0)=Z(time=T) 366*59599516SKenneth E. Jansen return 367*59599516SKenneth E. Jansen end 368*59599516SKenneth E. Jansen 369*59599516SKenneth E. Jansen 370*59599516SKenneth E. Jansen 371*59599516SKenneth E. Jansen subroutine Impint(ctime,jstep) 372*59599516SKenneth E. Jansen 373*59599516SKenneth E. Jansen use convolImpFlow 374*59599516SKenneth E. Jansen include "common.h" 375*59599516SKenneth E. Jansen 376*59599516SKenneth E. Jansen real*8 ctime, ptime 377*59599516SKenneth E. Jansen integer nlast, nper, k, j , jstep 378*59599516SKenneth E. Jansen 379*59599516SKenneth E. Jansen 380*59599516SKenneth E. Jansen do k =1,numImpSrfs 381*59599516SKenneth E. Jansen nlast=numImpt(k) ! number of time series to interpolate from 382*59599516SKenneth E. Jansen nper=ctime/ValueImpt(nlast,1,k)!number of periods completed to shift off 383*59599516SKenneth E. Jansen ptime = ctime-nper*ValueImpt(nlast,1,k) ! now time in periodic domain 384*59599516SKenneth E. Jansen 385*59599516SKenneth E. Jansen do j=2,nlast !loop to find the interval that we are in 386*59599516SKenneth E. Jansen 387*59599516SKenneth E. Jansen if(ValueImpt(j,1,k).gt.ptime) then ! this is upper bound, j-1 is lower 388*59599516SKenneth E. Jansen wr=(ptime-ValueImpt(j-1,1,k)) 389*59599516SKenneth E. Jansen & / ( ValueImpt(j,1,k)-ValueImpt(j-1,1,k) ) 390*59599516SKenneth E. Jansen ValueListImp(jstep,k)= ValueImpt(j-1,2,k)*(one-wr) 391*59599516SKenneth E. Jansen & + ValueImpt(j,2,k)*wr 392*59599516SKenneth E. Jansen exit 393*59599516SKenneth E. Jansen endif 394*59599516SKenneth E. Jansen 395*59599516SKenneth E. Jansen enddo 396*59599516SKenneth E. Jansen enddo 397*59599516SKenneth E. Jansen return 398*59599516SKenneth E. Jansen end 399*59599516SKenneth E. Jansen 400*59599516SKenneth E. Jansenc----------------------------------------------------------------------------- 401*59599516SKenneth E. Jansenc time filter for a periodic function (sin cardinal + window function) 402*59599516SKenneth E. Jansenc is used for the impedance and the flow rate history 403*59599516SKenneth E. Jansenc----------------------------------------------------------------------------- 404*59599516SKenneth E. Jansen subroutine Filter(Filtered,DataHist,nptf,timestep,cutfreq) 405*59599516SKenneth E. Jansen 406*59599516SKenneth E. Jansen include "common.h" 407*59599516SKenneth E. Jansen 408*59599516SKenneth E. Jansen integer nptf, cutfreq, j, k, m, s, Filtime(nptf) 409*59599516SKenneth E. Jansen real*8 DataHist(nptf,numImpSrfs), Window(nptf) 410*59599516SKenneth E. Jansen real*8 Sinc(nptf), FilterSW(nptf), Filtered(nptf,numImpSrfs) 411*59599516SKenneth E. Jansen real*8 windK, timestep 412*59599516SKenneth E. Jansen 413*59599516SKenneth E. Jansen windK = cutfreq*2 + 1 414*59599516SKenneth E. Jansen do j=1,nptf 415*59599516SKenneth E. Jansen Filtime(j) = j-1 416*59599516SKenneth E. Jansen Window(j) = 0.42+0.5*cos(2*pi*Filtime(j)/nptf) 417*59599516SKenneth E. Jansen & +0.08*cos(4*pi*Filtime(j)/nptf) 418*59599516SKenneth E. Jansen Sinc(j) = sin(pi*Filtime(j)*windK/nptf)/sin(pi*Filtime(j)/nptf) 419*59599516SKenneth E. Jansen enddo 420*59599516SKenneth E. Jansen Sinc(1) = windK 421*59599516SKenneth E. Jansen 422*59599516SKenneth E. Jansen do j=1,nptf 423*59599516SKenneth E. Jansen FilterSW(j) = Window(nptf+1-j)*Sinc(nptf+1-j) !filter for convolution 424*59599516SKenneth E. Jansen enddo 425*59599516SKenneth E. Jansen 426*59599516SKenneth E. Jansen Filtered = zero 427*59599516SKenneth E. Jansen do m=1,nptf 428*59599516SKenneth E. Jansen do j=1,nptf 429*59599516SKenneth E. Jansen s=modulo(m-nptf+j,nptf) 430*59599516SKenneth E. Jansen if(s.eq.zero) then 431*59599516SKenneth E. Jansen s=nptf 432*59599516SKenneth E. Jansen endif 433*59599516SKenneth E. Jansen Filtered(m,:) = Filtered(m,:) 434*59599516SKenneth E. Jansen & +FilterSW(j)*DataHist(s,:)/nptf !filter convolution 435*59599516SKenneth E. Jansen enddo 436*59599516SKenneth E. Jansen enddo 437*59599516SKenneth E. Jansen 438*59599516SKenneth E. Jansen return 439*59599516SKenneth E. Jansen end 440*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 441*59599516SKenneth E. Jansenc initialize the RCR boundary condition: 442*59599516SKenneth E. Jansenc read the data in initRCRt 443*59599516SKenneth E. Jansenc interpolate the data to match the process time step in RCRint 444*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 445*59599516SKenneth E. Jansen subroutine initRCRt() 446*59599516SKenneth E. Jansen 447*59599516SKenneth E. Jansen use convolRCRFlow 448*59599516SKenneth E. Jansen include "common.h" 449*59599516SKenneth E. Jansen 450*59599516SKenneth E. Jansen open(unit=818, file='rcrt.dat',status='old') 451*59599516SKenneth E. Jansen read (818,*) nptsRCRmax 452*59599516SKenneth E. Jansen allocate (numRCRt(numRCRSrfs)) 453*59599516SKenneth E. Jansen allocate (ValuePdist(nptsRCRmax,2,numRCRSrfs)) 454*59599516SKenneth E. Jansen allocate (ValueListRCR(3,numRCRSrfs)) 455*59599516SKenneth E. Jansen ValuePdist=0 456*59599516SKenneth E. Jansen ValueListRCR=0 457*59599516SKenneth E. Jansen do k=1,numRCRSrfs 458*59599516SKenneth E. Jansen read (818,*) numDataRCR 459*59599516SKenneth E. Jansen numRCRt(k) = numDataRCR 460*59599516SKenneth E. Jansen do j=1,3 461*59599516SKenneth E. Jansen read(818,*) ValueListRCR(j,k) ! reads Rp,C,Rd 462*59599516SKenneth E. Jansen enddo 463*59599516SKenneth E. Jansen do j=1,numDataRCR 464*59599516SKenneth E. Jansen read(818,*) (ValuePdist(j,n,k),n=1,2) ! n=1 time, 2 value 465*59599516SKenneth E. Jansen enddo 466*59599516SKenneth E. Jansen enddo 467*59599516SKenneth E. Jansen close(818) 468*59599516SKenneth E. Jansen 469*59599516SKenneth E. Jansen allocate (dtRCR(numRCRSrfs)) 470*59599516SKenneth E. Jansen 471*59599516SKenneth E. Jansen return 472*59599516SKenneth E. Jansen end 473*59599516SKenneth E. Jansen 474*59599516SKenneth E. Jansen 475*59599516SKenneth E. Jansen subroutine RCRint(ctime,Pdist) 476*59599516SKenneth E. Jansen 477*59599516SKenneth E. Jansen use convolRCRFlow ! brings numRCRSrfs, ValuePdist 478*59599516SKenneth E. Jansen include "common.h" 479*59599516SKenneth E. Jansen 480*59599516SKenneth E. Jansen real*8 ctime, ptime 481*59599516SKenneth E. Jansen integer nlast, nper, k, j 482*59599516SKenneth E. Jansen real*8 Pdist(0:MAXSURF) 483*59599516SKenneth E. Jansen 484*59599516SKenneth E. Jansen do k =1,numRCRSrfs 485*59599516SKenneth E. Jansen nlast=numRCRt(k) ! number of time series to interpolate from 486*59599516SKenneth E. Jansen nper=ctime/ValuePdist(nlast,1,k)!number of periods completed to shift off 487*59599516SKenneth E. Jansen ptime = ctime-nper*ValuePdist(nlast,1,k) ! now time in periodic domain 488*59599516SKenneth E. Jansen 489*59599516SKenneth E. Jansen do j=2,nlast !loop to find the interval that we are in 490*59599516SKenneth E. Jansen 491*59599516SKenneth E. Jansen if(ValuePdist(j,1,k).gt.ptime) then ! this is upper bound, j-1 is lower 492*59599516SKenneth E. Jansen wr=(ptime-ValuePdist(j-1,1,k)) 493*59599516SKenneth E. Jansen & / ( ValuePdist(j,1,k)-ValuePdist(j-1,1,k) ) 494*59599516SKenneth E. Jansen Pdist(k)= ValuePdist(j-1,2,k)*(one-wr) 495*59599516SKenneth E. Jansen & + ValuePdist(j,2,k)*wr 496*59599516SKenneth E. Jansen exit 497*59599516SKenneth E. Jansen endif 498*59599516SKenneth E. Jansen 499*59599516SKenneth E. Jansen enddo 500*59599516SKenneth E. Jansen enddo 501*59599516SKenneth E. Jansen return 502*59599516SKenneth E. Jansen end 503*59599516SKenneth E. Jansen 504*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 505*59599516SKenneth E. Jansenc returns in pold the history dependent part of the pressure in the 506*59599516SKenneth E. Jansenc impedance/flow rate convolution for the impedance and RCR BC 507*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 508*59599516SKenneth E. Jansen subroutine pHist(pressHist,QHist,betas,nTimePoint,nSrfs) 509*59599516SKenneth E. Jansen 510*59599516SKenneth E. Jansen include "common.h" 511*59599516SKenneth E. Jansen 512*59599516SKenneth E. Jansen integer nTimePoint,nSrfs 513*59599516SKenneth E. Jansen real*8 pressHist(0:MAXSURF) 514*59599516SKenneth E. Jansen real*8 QHist(nTimePoint+1,nSrfs),betas(nTimePoint+2,nSrfs) 515*59599516SKenneth E. Jansen !don't need here betas(ntimePoint+2) 516*59599516SKenneth E. Jansen !but pb of array passing if cut at nTimePoint+1 517*59599516SKenneth E. Jansen pressHist=zero 518*59599516SKenneth E. Jansen do k=1,nSrfs 519*59599516SKenneth E. Jansen do j=1,nTimePoint+1 520*59599516SKenneth E. Jansen pressHist(k) = pressHist(k) + QHist(j,k)*betas(j,k) 521*59599516SKenneth E. Jansen enddo 522*59599516SKenneth E. Jansen enddo 523*59599516SKenneth E. Jansen return 524*59599516SKenneth E. Jansen end 525