1*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 2*59599516SKenneth E. Jansenc 3*59599516SKenneth E. Jansenc This module conveys ramped BC data. 4*59599516SKenneth E. Jansenc 5*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 6*59599516SKenneth E. Jansen module rampBC 7*59599516SKenneth E. Jansen integer kmaxinf, kmaxbot,kmaxtop,nfctop,nfcbot,ninflow 8*59599516SKenneth E. Jansen real*8 ctrl_a(3) 9*59599516SKenneth E. Jansen real*8 ctrl_factor(3) 10*59599516SKenneth E. Jansen end module 11*59599516SKenneth E. Jansen 12*59599516SKenneth E. Jansen subroutine initBCprofileScale(vbc_prof,BC,yold,x) 13*59599516SKenneth E. Jansen use rampBC 14*59599516SKenneth E. Jansen include "common.h" 15*59599516SKenneth E. Jansen include "mpif.h" 16*59599516SKenneth E. Jansen include "auxmpi.h" 17*59599516SKenneth E. Jansen 18*59599516SKenneth E. Jansen! assuming three profiles to control (inlet, bottom FC and top FC) 19*59599516SKenneth E. Jansen real*8 vbc_prof(nshg,3), loc_ctrl_pr(3), ctrl_pr(3) 20*59599516SKenneth E. Jansen real*8 BC(nshg,ndofBC),yold(nshg,ndof),x(nshg,3) 21*59599516SKenneth E. Jansen nstp=nstep(1) 22*59599516SKenneth E. Jansen! set constant factors for each profile ((V_peak/V_bar)*R*T/A) 23*59599516SKenneth E. Jansenc 24*59599516SKenneth E. Jansenc ALL COMPUTABLE WITH READ DATA BUT FOR NOW USER MUST COMPUTE FOR 25*59599516SKenneth E. Jansenc EACH GEOMETRY + PROFILE 26*59599516SKenneth E. JansenC 27*59599516SKenneth E. Jansen ctrl_factor(1) = 1.00*Rgas*293/((2*0.587375)**2) ! inlet 28*59599516SKenneth E. Jansenc ctrl_factor(1) = 1.00*Rgas*293/((0.0889*0.1143)) ! inlet 29*59599516SKenneth E. Jansenc no chamber ctrl_factor(2) = 2.25*Rgas*293/((0.02441024589128274-0.008949756886432915)*(2*0.0508)) ! bottom FC 30*59599516SKenneth E. Jansen ctrl_factor(2) = 2.25*Rgas*293/((0.0168910950375201 31*59599516SKenneth E. Jansen & -0.01054110785157094)*(2*0.041275)) ! bottom FC 32*59599516SKenneth E. Jansen ctrl_factor(3) = 2.25*Rgas*293/(((-0.126612) 33*59599516SKenneth E. Jansen & -(-0.156330))*(2*0.0508)) ! top FC 34*59599516SKenneth E. Jansenc ctrl_factor(2) = 2.25*Rgas*293/(lbot *wbot) 35*59599516SKenneth E. Jansenc ctrl_factor(1) = CfactInl ! inlet 36*59599516SKenneth E. Jansenc ctrl_factor(2) = CfactBot ! bottom FC 37*59599516SKenneth E. Jansenc ctrl_factor(3) = CfactTop ! top FC 38*59599516SKenneth E. Jansenc2D ctrl_factor(1) = 1.0*Rgas*273/0.046990500 ! inlet 39*59599516SKenneth E. Jansenc2D ctrl_factor(2) = 1.5*Rgas*273/0.000618413 ! bottom FC 40*59599516SKenneth E. Jansenc2D ctrl_factor(3) = 1.5*Rgas*273/0.001188690 ! top FC 41*59599516SKenneth E. Jansen 42*59599516SKenneth E. Jansen!set the first first step 43*59599516SKenneth E. Jansen ninflow=0 44*59599516SKenneth E. Jansen nfctop=0 45*59599516SKenneth E. Jansen nfcbot=0 46*59599516SKenneth E. Jansen!assuming max at center line 47*59599516SKenneth E. Jansen kmaxinf=0 48*59599516SKenneth E. Jansen kmaxbot=0 49*59599516SKenneth E. Jansen kmaxtop=0 50*59599516SKenneth E. Jansen rmaxvinflow=zero 51*59599516SKenneth E. Jansen rmaxvbot=zero 52*59599516SKenneth E. Jansen rmaxvtop=zero 53*59599516SKenneth E. Jansenc 54*59599516SKenneth E. Jansenc find the peak value (and node number) of each inlet 55*59599516SKenneth E. Jansenc SWITCH THIS TO USE SURFID's 56*59599516SKenneth E. Jansenc 57*59599516SKenneth E. Jansen do kk=1,numnp 58*59599516SKenneth E. Jansen if(vbc_prof(kk,1).ne.zero) then 59*59599516SKenneth E. Jansen if(vbc_prof(kk,2).ne.zero) then ! both of these true means top FC 60*59599516SKenneth E. Jansen if(abs(vbc_prof(kk,1)).gt.rmaxvtop) then 61*59599516SKenneth E. Jansen kmaxtop=kk 62*59599516SKenneth E. Jansen rmaxvtop=abs(vbc_prof(kk,1)) 63*59599516SKenneth E. Jansen endif 64*59599516SKenneth E. Jansen nfctop=nfctop+1 65*59599516SKenneth E. Jansen else ! only x true means inflow 66*59599516SKenneth E. Jansen if(vbc_prof(kk,1).gt.rmaxvinflow) then 67*59599516SKenneth E. Jansen kmaxinf=kk 68*59599516SKenneth E. Jansen rmaxvinflow=vbc_prof(kk,1) 69*59599516SKenneth E. Jansen endif 70*59599516SKenneth E. Jansen ninflow=ninflow+1 71*59599516SKenneth E. Jansen endif 72*59599516SKenneth E. Jansen else if(vbc_prof(kk,2).ne.zero) then ! y true means low FC 73*59599516SKenneth E. Jansen if(vbc_prof(kk,2).gt.rmaxvbot) then 74*59599516SKenneth E. Jansen kmaxbot=kk 75*59599516SKenneth E. Jansen rmaxvbot=vbc_prof(kk,2) 76*59599516SKenneth E. Jansen endif 77*59599516SKenneth E. Jansen nfcbot=nfcbot+1 78*59599516SKenneth E. Jansen endif 79*59599516SKenneth E. Jansen enddo 80*59599516SKenneth E. Jansenc 81*59599516SKenneth E. Jansenc call BCprofileScale. Since callled form init, this is going to be used to setc the yold value on the first step. Consequently, we will need to set istep toc -1 temporarily so that when it looks to the target value at the "end" of the c step it will actually be looking to time zero. Note we will reset it back toc zero after this call 82*59599516SKenneth E. Jansenc 83*59599516SKenneth E. Jansen istep=-1 !offset the istep+1 increment so that it gets t0 right 84*59599516SKenneth E. Jansen call BCprofileScale(vbc_prof,BC,yold) 85*59599516SKenneth E. Jansen istep=0 !set back to correct value 86*59599516SKenneth E. Jansen return 87*59599516SKenneth E. Jansen end 88*59599516SKenneth E. Jansen 89*59599516SKenneth E. Jansen subroutine BCprofileScale(vbc_prof,BC,yold) 90*59599516SKenneth E. Jansen use rampBC 91*59599516SKenneth E. Jansen use timedata 92*59599516SKenneth E. Jansen include "common.h" 93*59599516SKenneth E. Jansen include "mpif.h" 94*59599516SKenneth E. Jansen include "auxmpi.h" 95*59599516SKenneth E. Jansen! assuming three profiles to control (inlet, bottom FC and top FC) 96*59599516SKenneth E. Jansen real*8 vbc_prof(nshg,3), loc_ctrl_pr(3), ctrl_pr(3) 97*59599516SKenneth E. Jansen real*8 BC(nshg,ndofBC),yold(nshg,ndof),mdotNow(3) 98*59599516SKenneth E. Jansenc 99*59599516SKenneth E. Jansenc in some way find mdot for this way 100*59599516SKenneth E. Jansenc 101*59599516SKenneth E. Jansen call rampedMdot(mdotNow) 102*59599516SKenneth E. Jansenc call flowControl(mdotNow) 103*59599516SKenneth E. Jansen 104*59599516SKenneth E. Jansenc 105*59599516SKenneth E. Jansenc compute the pressure from the current solution at the peak of profile 106*59599516SKenneth E. Jansenc 107*59599516SKenneth E. Jansen 108*59599516SKenneth E. Jansen loc_ctrl_pr(1) = yold(kmaxinf,4) ! inlet 109*59599516SKenneth E. Jansen loc_ctrl_pr(2) = yold(kmaxbot,4) ! bottom FC 110*59599516SKenneth E. Jansen loc_ctrl_pr(3) = yold(kmaxtop,4) ! top FC 111*59599516SKenneth E. Jansenc 112*59599516SKenneth E. Jansenc communicate it so that we are sure all agree 113*59599516SKenneth E. Jansenc (in case the profile is split across procs) 114*59599516SKenneth E. Jansenc 115*59599516SKenneth E. Jansen if(numpe > 1) then 116*59599516SKenneth E. Jansen call MPI_ALLREDUCE ( loc_ctrl_pr, ctrl_pr, 3, 117*59599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr ) 118*59599516SKenneth E. Jansen else 119*59599516SKenneth E. Jansen ctrl_pr = loc_ctrl_pr 120*59599516SKenneth E. Jansen endif 121*59599516SKenneth E. Jansen 122*59599516SKenneth E. Jansen 123*59599516SKenneth E. Jansen ctrl_a(1) = ctrl_factor(1)*mdotNow(1)/ctrl_pr(1) ! inlet 124*59599516SKenneth E. Jansen ctrl_a(2) = ctrl_factor(2)*mdotNow(2)/ctrl_pr(2) ! bottom FC 125*59599516SKenneth E. Jansen ctrl_a(3) = ctrl_factor(3)*mdotNow(3)/ctrl_pr(3) ! top FC 126*59599516SKenneth E. Jansen if(max(ninflow,max(nfctop,nfcbot)).gt. 0) then 127*59599516SKenneth E. Jansen do kk=1,numnp 128*59599516SKenneth E. Jansen if(vbc_prof(kk,1).ne.zero) then 129*59599516SKenneth E. Jansen if(vbc_prof(kk,2).ne.zero) then ! both of these true means top FC 130*59599516SKenneth E. Jansen BC(kk,3)=ctrl_a(3)*vbc_prof(kk,1) 131*59599516SKenneth E. Jansen BC(kk,4)=ctrl_a(3)*vbc_prof(kk,2) 132*59599516SKenneth E. Jansen else ! only x true means inflow 133*59599516SKenneth E. Jansen BC(kk,3)=ctrl_a(1)*vbc_prof(kk,1) 134*59599516SKenneth E. Jansen endif 135*59599516SKenneth E. Jansen else if(vbc_prof(kk,2).ne.zero) then ! y true means low FC 136*59599516SKenneth E. Jansen BC(kk,4)=ctrl_a(2)*vbc_prof(kk,2) 137*59599516SKenneth E. Jansen endif 138*59599516SKenneth E. Jansen enddo 139*59599516SKenneth E. Jansen if(ninflow.gt.0) write(myrank+2000,2000) 140*59599516SKenneth E. Jansen & BC(kmaxinf,3),BC(kmaxinf,4),ctrl_a(1),ctrl_pr(1) 141*59599516SKenneth E. Jansen if(nfcbot .gt.0) write(myrank+2000,2000) 142*59599516SKenneth E. Jansen & BC(kmaxbot,3),BC(kmaxbot,4),ctrl_a(2),ctrl_pr(2) 143*59599516SKenneth E. Jansen if(nfctop .gt.0) write(myrank+2000,2000) 144*59599516SKenneth E. Jansen & BC(kmaxtop,3),BC(kmaxtop,4),ctrl_a(3),ctrl_pr(3) 145*59599516SKenneth E. Jansen endif 146*59599516SKenneth E. Jansen 2000 format(4(e14.7,2x)) 147*59599516SKenneth E. Jansen return 148*59599516SKenneth E. Jansen end 149*59599516SKenneth E. Jansen 150*59599516SKenneth E. Jansen 151*59599516SKenneth E. Jansen subroutine rampedMdot(mdotNow) 152*59599516SKenneth E. Jansen include "common.h" !gives us rampmndot and nstep 153*59599516SKenneth E. Jansen 154*59599516SKenneth E. Jansen! assuming three profiles to control (inlet, bottom FC and top FC) 155*59599516SKenneth E. Jansen real*8 mdotNow(3),xi,cstep,rnstep 156*59599516SKenneth E. Jansen 157*59599516SKenneth E. Jansen rnstep=nstep(1) 158*59599516SKenneth E. Jansen cstep=istep+1 159*59599516SKenneth E. Jansen xi=cstep/rnstep 160*59599516SKenneth E. Jansen 161*59599516SKenneth E. Jansen mdotNow(:)=rampmdot(1,:)+xi*(rampmdot(2,:)-rampmdot(1,:)) 162*59599516SKenneth E. Jansen return 163*59599516SKenneth E. Jansen end 164