xref: /phasta/phSolver/common/blowerControl.f90 (revision 712d3df0b59ebebaaeaea358162c8d2c043c6e08)
1*10167291SKenneth E. Jansen      module blowerControl
2*10167291SKenneth E. Jansen        logical :: BC_enable
3*10167291SKenneth E. Jansen        integer :: nBlower
4*10167291SKenneth E. Jansen        real*8  :: BC_dt
5*10167291SKenneth E. Jansen        real*8  :: BC_istep0
6*10167291SKenneth E. Jansen        real*8  :: BC_t
7*10167291SKenneth E. Jansen
8*10167291SKenneth E. Jansen        type :: blowerData
9*10167291SKenneth E. Jansen          integer :: surfID,                !surface ID to use for blower inlet
10*10167291SKenneth E. Jansen     &               nmap,                  !number of inlet nodes
11*10167291SKenneth E. Jansen     &               mode                   !constant = 0, trapezoid = 1, sinusoid = 2
12*10167291SKenneth E. Jansen          integer, allocatable :: map(:)    !mapping to the inlet nodes
13*10167291SKenneth E. Jansen          real*8,  allocatable :: vscale(:) !scalling map used to create an inlet boundary layer
14*10167291SKenneth E. Jansen          logical :: updateBC, !true if the BC dynamically updated
15*10167291SKenneth E. Jansen     &               enable    !true to enable blower on with the particular surface ID
16*10167291SKenneth E. Jansen
17*10167291SKenneth E. Jansen          !The wave form is expected to look something like:
18*10167291SKenneth E. Jansen          !      |--------- (a) ---------|
19*10167291SKenneth E. Jansen          !       ________                _______    _ vmax
20*10167291SKenneth E. Jansen          !      /        \              /          |
21*10167291SKenneth E. Jansen          !     /          \            /           |
22*10167291SKenneth E. Jansen          !____/            \__________/            |_ vmin
23*10167291SKenneth E. Jansen          !    |-|--------|-|
24*10167291SKenneth E. Jansen          !    (b)   (c)  (d)
25*10167291SKenneth E. Jansen
26*10167291SKenneth E. Jansen          !Temporal parameters
27*10167291SKenneth E. Jansen          real*8 :: t_cycle                 !period of the cycle (a)
28*10167291SKenneth E. Jansen          real*8 :: t_riseTime, t_fallTime  !time of rising edge (b), falling edge (d)
29*10167291SKenneth E. Jansen          real*8 :: t_fullOn                !duration pulse is on full (c)
30*10167291SKenneth E. Jansen          real*8 :: t0                      !t = 0 reference for wave form
31*10167291SKenneth E. Jansen
32*10167291SKenneth E. Jansen          !State values
33*10167291SKenneth E. Jansen          real*8 :: vmax, vmin              !maximum, minimum blower velocity
34*10167291SKenneth E. Jansen          real*8 :: T                       !uniform temperature at blower inlet
35*10167291SKenneth E. Jansen          real*8 :: nu                      !uniform eddy viscosity at blower inlet
36*10167291SKenneth E. Jansen          real*8 :: deltaBL                 !Boundary layer thickness
37*10167291SKenneth E. Jansen          real*8 :: deltaBLsclr             !Boundary layer thickness for scalar
38*10167291SKenneth E. Jansen
39*10167291SKenneth E. Jansen        end type blowerData
40*10167291SKenneth E. Jansen
41*10167291SKenneth E. Jansen        type(blowerData), allocatable :: blower(:)
42*10167291SKenneth E. Jansen
43*10167291SKenneth E. Jansen      contains
44*10167291SKenneth E. Jansen        subroutine BC_setVars(nBlowers,     blowerMode,
45*10167291SKenneth E. Jansen     &                        surfID,       enable,
46*10167291SKenneth E. Jansen     &                        t_cycle,      t_fullOn,
47*10167291SKenneth E. Jansen     &                        t_riseTime,   t_fallTime,
48*10167291SKenneth E. Jansen     &                        vmax,         vmin,
49*10167291SKenneth E. Jansen     &                        T,            nu,
50*10167291SKenneth E. Jansen     &                        deltaBL,      deltaBLsclr )
51*10167291SKenneth E. Jansen
52*10167291SKenneth E. Jansen          integer :: nBlowers
53*10167291SKenneth E. Jansen          integer :: blowerMode(nBlowers),
54*10167291SKenneth E. Jansen     &               surfID(    nBlowers),  enable(      nBlowers)
55*10167291SKenneth E. Jansen          real*8  :: t_cycle(   nBlowers),  t_fullOn(    nBlowers),
56*10167291SKenneth E. Jansen     &               t_riseTime(nBlowers),  t_fallTime(  nBlowers),
57*10167291SKenneth E. Jansen     &               vmax(      nBlowers),  vmin(        nBlowers),
58*10167291SKenneth E. Jansen     &               T(         nBlowers),  nu(          nblowers),
59*10167291SKenneth E. Jansen     &               deltaBL(   nBlowers),  deltaBLsclr(nBlowers)
60*10167291SKenneth E. Jansen
61*10167291SKenneth E. Jansen          nBlower = nBlowers
62*10167291SKenneth E. Jansen
63*10167291SKenneth E. Jansen          if(.not. allocated(blower)) then
64*10167291SKenneth E. Jansen            allocate(blower(nBlower))
65*10167291SKenneth E. Jansen          endif
66*10167291SKenneth E. Jansen
67*10167291SKenneth E. Jansen          do i = 1, nBlower
68*10167291SKenneth E. Jansen            blower(i)%mode        = blowerMode(i)
69*10167291SKenneth E. Jansen            blower(i)%surfID      = surfID(i)
70*10167291SKenneth E. Jansen            blower(i)%enable      = (enable(i) == 1)
71*10167291SKenneth E. Jansen            blower(i)%t_cycle     = t_cycle(i)
72*10167291SKenneth E. Jansen            blower(i)%t_fullOn    = t_fullOn(i)
73*10167291SKenneth E. Jansen            blower(i)%t_riseTime  = t_riseTime(i)
74*10167291SKenneth E. Jansen            blower(i)%t_fallTime  = t_fallTime(i)
75*10167291SKenneth E. Jansen            blower(i)%vmax        = vmax(i)
76*10167291SKenneth E. Jansen            blower(i)%vmin        = vmin(i)
77*10167291SKenneth E. Jansen            blower(i)%T           = T(i)
78*10167291SKenneth E. Jansen            blower(i)%nu          = nu(i)
79*10167291SKenneth E. Jansen            blower(i)%deltaBL     = deltaBL(i)
80*10167291SKenneth E. Jansen            blower(i)%deltaBLsclr = deltaBLsclr(i)
81*10167291SKenneth E. Jansen          enddo
82*10167291SKenneth E. Jansen
83*10167291SKenneth E. Jansen        end subroutine
84*10167291SKenneth E. Jansen
85*10167291SKenneth E. Jansen
86*10167291SKenneth E. Jansen        subroutine BC_iter(BC)
87*10167291SKenneth E. Jansen        !Updates BC with the correct velocities for the blower.
88*10167291SKenneth E. Jansen        !Note: itrBC still needs to be called after blowerIter to update
89*10167291SKenneth E. Jansen        !      values in yold.
90*10167291SKenneth E. Jansen
91*10167291SKenneth E. Jansen!         use blowerControl
92*10167291SKenneth E. Jansen          use wallData
93*10167291SKenneth E. Jansen          include "common.h"
94*10167291SKenneth E. Jansen
95*10167291SKenneth E. Jansen          integer :: i, iBlower, nNodeMap
96*10167291SKenneth E. Jansen          real*8  :: vmagref, vmag
97*10167291SKenneth E. Jansen          real*8  :: t
98*10167291SKenneth E. Jansen          real*8  :: BC(nshg, ndofBC)
99*10167291SKenneth E. Jansen
100*10167291SKenneth E. Jansen          !local variables to make the code shorter
101*10167291SKenneth E. Jansen          real*8  :: t0, t1, t2, t3, t4, vmax, vmin
102*10167291SKenneth E. Jansen
103*10167291SKenneth E. Jansen          if(.not. BC_enable) return
104*10167291SKenneth E. Jansen
105*10167291SKenneth E. Jansen          BC_t = BC_dt*(istep - BC_istep0)  !Update time
106*10167291SKenneth E. Jansen
107*10167291SKenneth E. Jansen          do iBlower = 1, nBlower
108*10167291SKenneth E. Jansen            if(.not. blower(iBlower)%enable .or.
109*10167291SKenneth E. Jansen     &         .not. blower(iBlower)%updateBC ) cycle
110*10167291SKenneth E. Jansen
111*10167291SKenneth E. Jansen            !------------------------
112*10167291SKenneth E. Jansen            !Setup usefull variables
113*10167291SKenneth E. Jansen            !------------------------
114*10167291SKenneth E. Jansen            vmax = blower(iBlower)%vmax
115*10167291SKenneth E. Jansen            vmin = blower(iBlower)%vmin
116*10167291SKenneth E. Jansen
117*10167291SKenneth E. Jansen            if(blower(iBlower)%mode == 1) then !Trapezoid
118*10167291SKenneth E. Jansen              !The wave form is expected to look something like:
119*10167291SKenneth E. Jansen              !       ________                _______    _ vmax
120*10167291SKenneth E. Jansen              !      /        \              /          |
121*10167291SKenneth E. Jansen              !     /          \            /           |
122*10167291SKenneth E. Jansen              !____/            \__________/            |_ vmin
123*10167291SKenneth E. Jansen              !    | |        | |          |
124*10167291SKenneth E. Jansen              !   t0 t1      t2 t3         t4
125*10167291SKenneth E. Jansen
126*10167291SKenneth E. Jansen              t0 = 0.0d00
127*10167291SKenneth E. Jansen              t1 = t0 + blower(iBlower)%t_riseTime
128*10167291SKenneth E. Jansen              t2 = t1 + blower(iBlower)%t_fullOn
129*10167291SKenneth E. Jansen              t3 = t2 + blower(iBlower)%t_fallTime
130*10167291SKenneth E. Jansen              t4 = blower(iBlower)%t_cycle
131*10167291SKenneth E. Jansen
132*10167291SKenneth E. Jansen              !Calculate the velocity magnitude
133*10167291SKenneth E. Jansen              !t = mod(BC_dt*istep + blower(iBlower)%t0, t4)
134*10167291SKenneth E. Jansen              t = mod(BC_t - blower(iBlower)%t0, t4)
135*10167291SKenneth E. Jansen
136*10167291SKenneth E. Jansen              if(t0 <= t .and. t < t1) then     !rising edge
137*10167291SKenneth E. Jansen                vmagref = (vmax - vmin)*(t - t0)/(t1 - t0) + vmin
138*10167291SKenneth E. Jansen              elseif(t1 <= t .and. t < t2) then !high
139*10167291SKenneth E. Jansen                vmagref = vmax
140*10167291SKenneth E. Jansen              elseif(t2 <= t .and. t < t3) then !falling edge
141*10167291SKenneth E. Jansen                vmagref = (vmax - vmin)*(t - t3)/(t2 - t3) + vmin
142*10167291SKenneth E. Jansen              elseif(t3 <= t .and. t < t4) then !low
143*10167291SKenneth E. Jansen                vmagref = vmin
144*10167291SKenneth E. Jansen              endif
145*10167291SKenneth E. Jansen            elseif(blower(iBlower)%mode == 2) then !sinusoid
146*10167291SKenneth E. Jansen              !         _.--._                _.--._   |- vmax
147*10167291SKenneth E. Jansen              !      _-'      '-_          _-'      '  |
148*10167291SKenneth E. Jansen              !__..-'            '-..__..-'            |- vmin
149*10167291SKenneth E. Jansen              !                                        |
150*10167291SKenneth E. Jansen              !      |     |------ t_cycle ------|
151*10167291SKenneth E. Jansen              !      t0
152*10167291SKenneth E. Jansen
153*10167291SKenneth E. Jansen              !t is number of waves since t0
154*10167291SKenneth E. Jansen              t = (BC_t - blower(iBlower)%t0)/blower(iBlower)%t_cycle
155*10167291SKenneth E. Jansen              vmagref = 0.5*(vmax - vmin)*sin(2*pi*t) + 0.5*(vmax + vmin)
156*10167291SKenneth E. Jansen            elseif(blower(iBlower)%mode == 0) then !Constant
157*10167291SKenneth E. Jansen              vmagref = max(vmax, vmin)
158*10167291SKenneth E. Jansen            endif
159*10167291SKenneth E. Jansen
160*10167291SKenneth E. Jansen            !----------
161*10167291SKenneth E. Jansen            !update BC
162*10167291SKenneth E. Jansen            !----------
163*10167291SKenneth E. Jansen            do i = 1,blower(iBlower)%nmap
164*10167291SKenneth E. Jansen              imapped =      blower(iBlower)%map(i)
165*10167291SKenneth E. Jansen              vmag = vmagref*blower(iBlower)%vscale(i) !scale the reference
166*10167291SKenneth E. Jansen                                                       !to create a BL
167*10167291SKenneth E. Jansen              BC(imapped, 3) = -vmag*wnorm(imapped, 1)  !x velocity
168*10167291SKenneth E. Jansen              BC(imapped, 4) = -vmag*wnorm(imapped, 2)  !y velocity
169*10167291SKenneth E. Jansen              BC(imapped, 5) = -vmag*wnorm(imapped, 3)  !z velocity
170*10167291SKenneth E. Jansen            enddo  !end loop over blower surface nodes
171*10167291SKenneth E. Jansen          enddo
172*10167291SKenneth E. Jansen
173*10167291SKenneth E. Jansen        end subroutine
174*10167291SKenneth E. Jansen
175*10167291SKenneth E. Jansen
176*10167291SKenneth E. Jansen        subroutine BC_Finalize()
177*10167291SKenneth E. Jansen        !Deallocates allocatable variables in blower and then deallocates blower.
178*10167291SKenneth E. Jansen
179*10167291SKenneth E. Jansen          integer :: iBlower
180*10167291SKenneth E. Jansen
181*10167291SKenneth E. Jansen          if(BC_enable) then
182*10167291SKenneth E. Jansen            do iBlower = 1,nBlower
183*10167291SKenneth E. Jansen              deallocate(blower(iBlower)%map)
184*10167291SKenneth E. Jansen              deallocate(blower(iBlower)%vscale)
185*10167291SKenneth E. Jansen            enddo
186*10167291SKenneth E. Jansen          endif
187*10167291SKenneth E. Jansen
188*10167291SKenneth E. Jansen          deallocate(blower) !note that blower gets allocated regardless
189*10167291SKenneth E. Jansen                             !of whether BC_enable is true
190*10167291SKenneth E. Jansen        end subroutine
191*10167291SKenneth E. Jansen
192*10167291SKenneth E. Jansen
193*10167291SKenneth E. Jansen        subroutine BC_ReadPhase(tstep)
194*10167291SKenneth E. Jansen          include "common.h"
195*10167291SKenneth E. Jansen          include "mpif.h"
196*10167291SKenneth E. Jansen
197*10167291SKenneth E. Jansen          integer :: tstep
198*10167291SKenneth E. Jansen          integer :: i, nBlowerIn, surfIDin
199*10167291SKenneth E. Jansen          character(len=128) :: fname
200*10167291SKenneth E. Jansen          logical :: existFname
201*10167291SKenneth E. Jansen          real*8  :: phi
202*10167291SKenneth E. Jansen
203*10167291SKenneth E. Jansen          if(.not. BC_enable) return  !nothing needs to be written
204*10167291SKenneth E. Jansen
205*10167291SKenneth E. Jansen          BC_t = BC_dt*(istep - istep0)  !Update time
206*10167291SKenneth E. Jansen          if(myrank == master) then
207*10167291SKenneth E. Jansen            !Even if blowerPhase.%i.dat exists, it may not have the same
208*10167291SKenneth E. Jansen            !number of blowers; zero all t0 in blower before proceeding.
209*10167291SKenneth E. Jansen            do i = 1,nBlower
210*10167291SKenneth E. Jansen              blower(i)%t0 = 0.0d00
211*10167291SKenneth E. Jansen            enddo
212*10167291SKenneth E. Jansen
213*10167291SKenneth E. Jansen            !Assemble the file name and test if it exists.
214*10167291SKenneth E. Jansen            write(fname, "('blowerPhase.', I0, '.dat')") tstep
215*10167291SKenneth E. Jansen            inquire(file=fname, exist=existFname)
216*10167291SKenneth E. Jansen
217*10167291SKenneth E. Jansen            if(existFname) then
218*10167291SKenneth E. Jansen              open(unit=1003, file=fname, status='old')
219*10167291SKenneth E. Jansen
220*10167291SKenneth E. Jansen              read(1003, *) nBlowerIn
221*10167291SKenneth E. Jansen
222*10167291SKenneth E. Jansen              !In the future, the values should probably be matched by
223*10167291SKenneth E. Jansen              !surface ID, but I don't have time for that now.
224*10167291SKenneth E. Jansen              do i = 1,nBlowerIn
225*10167291SKenneth E. Jansen                read(1003, *) surfIDin, phi
226*10167291SKenneth E. Jansen                blower(i)%t0 = -phi*blower(i)%t_cycle
227*10167291SKenneth E. Jansen                !Note the negative sign; t0 is the reference starting
228*10167291SKenneth E. Jansen                !time. For positive phase, the cycle started sometime in
229*10167291SKenneth E. Jansen                !the past.
230*10167291SKenneth E. Jansen              enddo
231*10167291SKenneth E. Jansen
232*10167291SKenneth E. Jansen              close(1003)
233*10167291SKenneth E. Jansen            endif !existFname
234*10167291SKenneth E. Jansen          endif !myrank == master
235*10167291SKenneth E. Jansen
236*10167291SKenneth E. Jansen          !At this point, t0 on rank 0 should be correct;
237*10167291SKenneth E. Jansen          !broadcast the contents of the file
238*10167291SKenneth E. Jansen          if(numpe > 1) then
239*10167291SKenneth E. Jansen            do i = 1,nBlower
240*10167291SKenneth E. Jansen              call MPI_BCAST(blower(i)%t0, 1, MPI_DOUBLE_PRECISION,
241*10167291SKenneth E. Jansen     &                              master, MPI_COMM_WORLD, ierr)
242*10167291SKenneth E. Jansen            enddo
243*10167291SKenneth E. Jansen          endif
244*10167291SKenneth E. Jansen        end subroutine
245*10167291SKenneth E. Jansen
246*10167291SKenneth E. Jansen
247*10167291SKenneth E. Jansen        subroutine BC_writePhase(tstep)
248*10167291SKenneth E. Jansen          include "common.h"
249*10167291SKenneth E. Jansen
250*10167291SKenneth E. Jansen          integer :: tstep    !time step to use in the file name
251*10167291SKenneth E. Jansen
252*10167291SKenneth E. Jansen          character(len=128) :: fname
253*10167291SKenneth E. Jansen          integer :: i
254*10167291SKenneth E. Jansen          real*8  :: phi
255*10167291SKenneth E. Jansen
256*10167291SKenneth E. Jansen          if(.not. BC_enable) return  !nothing needs to be written
257*10167291SKenneth E. Jansen
258*10167291SKenneth E. Jansen          BC_t = BC_dt*(istep - BC_istep0)  !Update time
259*10167291SKenneth E. Jansen
260*10167291SKenneth E. Jansen          if(myrank == master) then
261*10167291SKenneth E. Jansen            write(fname, "('blowerPhase.', I0, '.dat')") tstep
262*10167291SKenneth E. Jansen            open(unit=1003, file=fname, status='unknown')
263*10167291SKenneth E. Jansen
264*10167291SKenneth E. Jansen            write(1003, "(i9)") nBlower
265*10167291SKenneth E. Jansen            do i = 1,nBlower
266*10167291SKenneth E. Jansen              !Calculate the present possition in the blowing cycle
267*10167291SKenneth E. Jansen              if(blower(i)%updateBC) then
268*10167291SKenneth E. Jansen                phi = mod((BC_t - blower(i)%t0)/blower(i)%t_cycle,1.0d0)
269*10167291SKenneth E. Jansen              else
270*10167291SKenneth E. Jansen                phi = 0.0d00
271*10167291SKenneth E. Jansen              endif
272*10167291SKenneth E. Jansen
273*10167291SKenneth E. Jansen              write(1003, "(i9, F18.14)") blower(i)%surfID, phi
274*10167291SKenneth E. Jansen            enddo
275*10167291SKenneth E. Jansen
276*10167291SKenneth E. Jansen            close(1003)
277*10167291SKenneth E. Jansen          endif
278*10167291SKenneth E. Jansen        end subroutine
279*10167291SKenneth E. Jansen
280*10167291SKenneth E. Jansen!        subroutine BC_setNBlower(nBlowers)
281*10167291SKenneth E. Jansen!          integer :: nBlowers
282*10167291SKenneth E. Jansen!          nBlower = nBlowers
283*10167291SKenneth E. Jansen!        end subroutine
284*10167291SKenneth E. Jansen!
285*10167291SKenneth E. Jansen!        subroutine BC_setSurfID(surfID)
286*10167291SKenneth E. Jansen!          integer :: surfID(nBlower)
287*10167291SKenneth E. Jansen!          do i = 1, nBlower
288*10167291SKenneth E. Jansen!            blower(i)%surfID = surfID(i)
289*10167291SKenneth E. Jansen!          enddo
290*10167291SKenneth E. Jansen!        end subroutine
291*10167291SKenneth E. Jansen!
292*10167291SKenneth E. Jansen!        subroutine BC_setEnable(enable)
293*10167291SKenneth E. Jansen!          integer :: enable(nBlower)
294*10167291SKenneth E. Jansen!          do i = 1, nBlower
295*10167291SKenneth E. Jansen!            blower(i)%enable = enable(i)
296*10167291SKenneth E. Jansen!          enddo
297*10167291SKenneth E. Jansen!        end subroutine
298*10167291SKenneth E. Jansen!
299*10167291SKenneth E. Jansen!        subroutine BC_setSurfID(surfID)
300*10167291SKenneth E. Jansen!          real*8 :: surfID(nBlower)
301*10167291SKenneth E. Jansen!          do i = 1, nBlower
302*10167291SKenneth E. Jansen!            blower(i)%surfID = surfID(i)
303*10167291SKenneth E. Jansen!          enddo
304*10167291SKenneth E. Jansen!        end subroutine
305*10167291SKenneth E. Jansen!
306*10167291SKenneth E. Jansen!        subroutine BC_setSurfID(surfID)
307*10167291SKenneth E. Jansen!          integer :: surfID(nBlower)
308*10167291SKenneth E. Jansen!          do i = 1, nBlower
309*10167291SKenneth E. Jansen!            blower(i)%surfID = surfID(i)
310*10167291SKenneth E. Jansen!          enddo
311*10167291SKenneth E. Jansen!        end subroutine
312*10167291SKenneth E. Jansen
313*10167291SKenneth E. Jansen
314*10167291SKenneth E. Jansen      end module
315*10167291SKenneth E. Jansen
316*10167291SKenneth E. Jansen       subroutine BC_init(dt, tstep, BC)
317*10167291SKenneth E. Jansen          use blowerControl
318*10167291SKenneth E. Jansen          use wallData !wnorm,
319*10167291SKenneth E. Jansen          use turbSA !d2wall
320*10167291SKenneth E. Jansen          include "common.h"
321*10167291SKenneth E. Jansen
322*10167291SKenneth E. Jansen          real*8 :: BC(nshg, ndofBC)
323*10167291SKenneth E. Jansen
324*10167291SKenneth E. Jansen          integer :: i, iBlower, imapped, tstep
325*10167291SKenneth E. Jansen          real*8  :: deltaBLinv, vmag, dt
326*10167291SKenneth E. Jansen
327*10167291SKenneth E. Jansen          !local variables to shorten the code a bit
328*10167291SKenneth E. Jansen          integer :: nNodeMap
329*10167291SKenneth E. Jansen          real*8  :: vmax !T, nu
330*10167291SKenneth E. Jansen
331*10167291SKenneth E. Jansen          !variables that should be set in solver.inp:
332*10167291SKenneth E. Jansen          !nBlower + surfID, t_cycle, t_riseTime, t_fallTime, t_fullOn, vmax, vmin, T, nu, deltaBL, enable
333*10167291SKenneth E. Jansen
334*10167291SKenneth E. Jansen          !Test if any of the blowers are enabled. If not, then set
335*10167291SKenneth E. Jansen          !BC_enable to false and exit.
336*10167291SKenneth E. Jansen          BC_enable = .false.
337*10167291SKenneth E. Jansen          do iBlower = 1, nBlower
338*10167291SKenneth E. Jansen            if(blower(iBlower)%enable) then
339*10167291SKenneth E. Jansen              BC_enable = .true.
340*10167291SKenneth E. Jansen              exit
341*10167291SKenneth E. Jansen            endif
342*10167291SKenneth E. Jansen          enddo
343*10167291SKenneth E. Jansen          if(.not. BC_enable) return
344*10167291SKenneth E. Jansen
345*10167291SKenneth E. Jansen          BC_istep0 = istep
346*10167291SKenneth E. Jansen          BC_dt = dt
347*10167291SKenneth E. Jansen
348*10167291SKenneth E. Jansen          !check to see if a blowerControl.dat has been written with phase data
349*10167291SKenneth E. Jansen          call BC_ReadPhase(tstep)  !t0 is updated in the call.
350*10167291SKenneth E. Jansen
351*10167291SKenneth E. Jansen          do iBlower = 1, nBlower
352*10167291SKenneth E. Jansen            !------------------------------------
353*10167291SKenneth E. Jansen            !Nodal Mapping and Referrence Arrays
354*10167291SKenneth E. Jansen            !------------------------------------
355*10167291SKenneth E. Jansen
356*10167291SKenneth E. Jansen            !create the nodal mapping
357*10167291SKenneth E. Jansen            allocate(blower(iBlower)%map(nshg))
358*10167291SKenneth E. Jansen            call sfID2np(blower(iBlower)%surfID, !analog to sfID2np, except
359*10167291SKenneth E. Jansen     &                   blower(iBlower)%nmap,   !that map is allocated in
360*10167291SKenneth E. Jansen     &                   blower(iBlower)%map)    !the subroutine call.
361*10167291SKenneth E. Jansen!            call asfID2np(blower(iBlower)%surfID, !analog to sfID2np, except
362*10167291SKenneth E. Jansen!     &                   blower(iBlower)%nmap,   !that map is allocated in
363*10167291SKenneth E. Jansen!     &                   blower(iBlower)%map)    !the subroutine call.
364*10167291SKenneth E. Jansen            nNodeMap = blower(iBlower)%nmap
365*10167291SKenneth E. Jansen
366*10167291SKenneth E. Jansen            !Calculate the boundary layer scalling
367*10167291SKenneth E. Jansen            allocate(blower(iBlower)%vscale(nNodeMap))
368*10167291SKenneth E. Jansen
369*10167291SKenneth E. Jansen            if(blower(iBlower)%deltaBL > 0.0) then   !use the provided BL
370*10167291SKenneth E. Jansen              deltaBLinv = 1/blower(iBlower)%deltaBL
371*10167291SKenneth E. Jansen            else                     !use a default of essentially zero thickness
372*10167291SKenneth E. Jansen              deltaBLinv = 1e16
373*10167291SKenneth E. Jansen            endif
374*10167291SKenneth E. Jansen
375*10167291SKenneth E. Jansen            do i = 1, nNodeMap
376*10167291SKenneth E. Jansen              !loop over each surface node and calculate vscale with a
377*10167291SKenneth E. Jansen              !linear ramp. Add more options in the future.
378*10167291SKenneth E. Jansen              imapped = blower(iBlower)%map(i)
379*10167291SKenneth E. Jansen              blower(iBlower)%vscale(i) =
380*10167291SKenneth E. Jansen     &                          min(1.0d0, d2wall(imapped)*deltaBLinv)
381*10167291SKenneth E. Jansen            enddo
382*10167291SKenneth E. Jansen
383*10167291SKenneth E. Jansen            !-------------------------------------
384*10167291SKenneth E. Jansen            !Apply persistent boundary conditions
385*10167291SKenneth E. Jansen            !-------------------------------------
386*10167291SKenneth E. Jansen
387*10167291SKenneth E. Jansen            !temperature
388*10167291SKenneth E. Jansen            if(blower(iBlower)%T > 0.0) then
389*10167291SKenneth E. Jansen              do i = 1, nNodeMap
390*10167291SKenneth E. Jansen                imapped = blower(iBlower)%map(i)
391*10167291SKenneth E. Jansen                BC(imapped, 2) = blower(iBlower)%T
392*10167291SKenneth E. Jansen              enddo
393*10167291SKenneth E. Jansen            endif
394*10167291SKenneth E. Jansen
395*10167291SKenneth E. Jansen            !eddy viscosity
396*10167291SKenneth E. Jansen            if(blower(iBlower)%nu >= 0.0) then
397*10167291SKenneth E. Jansen              if(blower(iBlower)%deltaBLsclr > 0.0) then   !use the provided BL
398*10167291SKenneth E. Jansen                deltaBLinv = 1/blower(iBlower)%deltaBLsclr
399*10167291SKenneth E. Jansen              else                     !use a default of essentially zero thickness
400*10167291SKenneth E. Jansen                deltaBLinv = 1e16
401*10167291SKenneth E. Jansen              endif
402*10167291SKenneth E. Jansen
403*10167291SKenneth E. Jansen              do i = 1, nNodeMap
404*10167291SKenneth E. Jansen                imapped = blower(iBlower)%map(i)
405*10167291SKenneth E. Jansen                BC(imapped, 7) = blower(iBlower)%nu *
406*10167291SKenneth E. Jansen     &                           min(1.0d0, d2wall(imapped)*deltaBLinv)
407*10167291SKenneth E. Jansen              enddo
408*10167291SKenneth E. Jansen            endif
409*10167291SKenneth E. Jansen
410*10167291SKenneth E. Jansen            !velocity
411*10167291SKenneth E. Jansen            blower(iBlower)%updateBC = .true.  !update velocity later with a call to BC_iter.
412*10167291SKenneth E. Jansen          enddo !loop over blower surfaces
413*10167291SKenneth E. Jansen
414*10167291SKenneth E. Jansen          call BC_iter(BC)
415*10167291SKenneth E. Jansen
416*10167291SKenneth E. Jansen          do iBlower = 1, nBlower
417*10167291SKenneth E. Jansen            if(blower(iBlower)%t_cycle >= 1.0 .or.  !Unreasonable cycle
418*10167291SKenneth E. Jansen     &         blower(iBlower)%t_cycle <= 0.0 .or.  !periods are provided,
419*10167291SKenneth E. Jansen     &         blower(iBlower)%mode == 0) then      !so assume const.
420*10167291SKenneth E. Jansen              blower(iBlower)%updateBC = .false.
421*10167291SKenneth E. Jansen            else
422*10167291SKenneth E. Jansen              blower(iBlower)%updateBC = .true.
423*10167291SKenneth E. Jansen            endif
424*10167291SKenneth E. Jansen          enddo
425*10167291SKenneth E. Jansen
426*10167291SKenneth E. Jansen        end subroutine
427*10167291SKenneth E. Jansen
428*10167291SKenneth E. Jansen
429