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