xref: /phasta/phSolver/common/bctint.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
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