159599516SKenneth E. Jansenc----------------------------------------------------------------------- 259599516SKenneth E. Jansenc 359599516SKenneth E. Jansenc This module conveys ramped BC data. 459599516SKenneth E. Jansenc 559599516SKenneth E. Jansenc----------------------------------------------------------------------- 659599516SKenneth E. Jansen module rampBC 759599516SKenneth E. Jansen integer kmaxinf, kmaxbot,kmaxtop,nfctop,nfcbot,ninflow 859599516SKenneth E. Jansen real*8 ctrl_a(3) 959599516SKenneth E. Jansen real*8 ctrl_factor(3) 1059599516SKenneth E. Jansen end module 1159599516SKenneth E. Jansen 1259599516SKenneth E. Jansen subroutine initBCprofileScale(vbc_prof,BC,yold,x) 1359599516SKenneth E. Jansen use rampBC 1459599516SKenneth E. Jansen include "common.h" 1559599516SKenneth E. Jansen include "mpif.h" 1659599516SKenneth E. Jansen include "auxmpi.h" 1759599516SKenneth E. Jansen 1859599516SKenneth E. Jansen! assuming three profiles to control (inlet, bottom FC and top FC) 1959599516SKenneth E. Jansen real*8 vbc_prof(nshg,3), loc_ctrl_pr(3), ctrl_pr(3) 2059599516SKenneth E. Jansen real*8 BC(nshg,ndofBC),yold(nshg,ndof),x(nshg,3) 2159599516SKenneth E. Jansen nstp=nstep(1) 2259599516SKenneth E. Jansen! set constant factors for each profile ((V_peak/V_bar)*R*T/A) 2359599516SKenneth E. Jansenc 2459599516SKenneth E. Jansenc ALL COMPUTABLE WITH READ DATA BUT FOR NOW USER MUST COMPUTE FOR 2559599516SKenneth E. Jansenc EACH GEOMETRY + PROFILE 2659599516SKenneth E. JansenC 27*513954efSKenneth E. Jansen ctrl_factor(1) = 1.00*Rgas*330.578/((2*0.587375)**2) ! inlet 2859599516SKenneth E. Jansenc ctrl_factor(1) = 1.00*Rgas*293/((0.0889*0.1143)) ! inlet 2959599516SKenneth E. Jansenc no chamber ctrl_factor(2) = 2.25*Rgas*293/((0.02441024589128274-0.008949756886432915)*(2*0.0508)) ! bottom FC 30*513954efSKenneth E. Jansen ctrl_factor(2) = 2.25*Rgas*317/((0.0168910950375201 3159599516SKenneth E. Jansen & -0.01054110785157094)*(2*0.041275)) ! bottom FC 32*513954efSKenneth E. Jansen ctrl_factor(3) = 2.25*Rgas*317/(((-0.126612) 3359599516SKenneth E. Jansen & -(-0.156330))*(2*0.0508)) ! top FC 3459599516SKenneth E. Jansenc ctrl_factor(2) = 2.25*Rgas*293/(lbot *wbot) 3559599516SKenneth E. Jansenc ctrl_factor(1) = CfactInl ! inlet 3659599516SKenneth E. Jansenc ctrl_factor(2) = CfactBot ! bottom FC 3759599516SKenneth E. Jansenc ctrl_factor(3) = CfactTop ! top FC 3859599516SKenneth E. Jansenc2D ctrl_factor(1) = 1.0*Rgas*273/0.046990500 ! inlet 3959599516SKenneth E. Jansenc2D ctrl_factor(2) = 1.5*Rgas*273/0.000618413 ! bottom FC 4059599516SKenneth E. Jansenc2D ctrl_factor(3) = 1.5*Rgas*273/0.001188690 ! top FC 4159599516SKenneth E. Jansen 4259599516SKenneth E. Jansen!set the first first step 4359599516SKenneth E. Jansen ninflow=0 4459599516SKenneth E. Jansen nfctop=0 4559599516SKenneth E. Jansen nfcbot=0 4659599516SKenneth E. Jansen!assuming max at center line 4759599516SKenneth E. Jansen kmaxinf=0 4859599516SKenneth E. Jansen kmaxbot=0 4959599516SKenneth E. Jansen kmaxtop=0 50*513954efSKenneth E. Jansen rmaxvinflow=-one 51*513954efSKenneth E. Jansen rmaxvbot=-one 52*513954efSKenneth E. Jansen rmaxvtop=-one 5359599516SKenneth E. Jansenc 5459599516SKenneth E. Jansenc find the peak value (and node number) of each inlet 5559599516SKenneth E. Jansenc SWITCH THIS TO USE SURFID's 5659599516SKenneth E. Jansenc 5759599516SKenneth E. Jansen do kk=1,numnp 5859599516SKenneth E. Jansen if(vbc_prof(kk,1).ne.zero) then 5959599516SKenneth E. Jansen if(vbc_prof(kk,2).ne.zero) then ! both of these true means top FC 6059599516SKenneth E. Jansen if(abs(vbc_prof(kk,1)).gt.rmaxvtop) then 6159599516SKenneth E. Jansen kmaxtop=kk 6259599516SKenneth E. Jansen rmaxvtop=abs(vbc_prof(kk,1)) 6359599516SKenneth E. Jansen endif 6459599516SKenneth E. Jansen nfctop=nfctop+1 6559599516SKenneth E. Jansen else ! only x true means inflow 6659599516SKenneth E. Jansen if(vbc_prof(kk,1).gt.rmaxvinflow) then 6759599516SKenneth E. Jansen kmaxinf=kk 6859599516SKenneth E. Jansen rmaxvinflow=vbc_prof(kk,1) 6959599516SKenneth E. Jansen endif 7059599516SKenneth E. Jansen ninflow=ninflow+1 7159599516SKenneth E. Jansen endif 7259599516SKenneth E. Jansen else if(vbc_prof(kk,2).ne.zero) then ! y true means low FC 7359599516SKenneth E. Jansen if(vbc_prof(kk,2).gt.rmaxvbot) then 7459599516SKenneth E. Jansen kmaxbot=kk 7559599516SKenneth E. Jansen rmaxvbot=vbc_prof(kk,2) 7659599516SKenneth E. Jansen endif 7759599516SKenneth E. Jansen nfcbot=nfcbot+1 7859599516SKenneth E. Jansen endif 7959599516SKenneth E. Jansen enddo 8059599516SKenneth E. Jansenc 81*513954efSKenneth E. Jansenc call BCprofileScale. Since called form init, this is going to be used to set 82*513954efSKenneth E. Jansenc the yold value on the first step. Consequently, we will need to set istep to 83*513954efSKenneth E. Jansenc -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 to 84*513954efSKenneth E. Jansenc zero after this call 8559599516SKenneth E. Jansenc 8659599516SKenneth E. Jansen istep=-1 !offset the istep+1 increment so that it gets t0 right 8759599516SKenneth E. Jansen call BCprofileScale(vbc_prof,BC,yold) 8859599516SKenneth E. Jansen istep=0 !set back to correct value 8959599516SKenneth E. Jansen return 9059599516SKenneth E. Jansen end 9159599516SKenneth E. Jansen 9259599516SKenneth E. Jansen subroutine BCprofileScale(vbc_prof,BC,yold) 9359599516SKenneth E. Jansen use rampBC 9459599516SKenneth E. Jansen use timedata 9559599516SKenneth E. Jansen include "common.h" 9659599516SKenneth E. Jansen include "mpif.h" 9759599516SKenneth E. Jansen include "auxmpi.h" 9859599516SKenneth E. Jansen! assuming three profiles to control (inlet, bottom FC and top FC) 9959599516SKenneth E. Jansen real*8 vbc_prof(nshg,3), loc_ctrl_pr(3), ctrl_pr(3) 10059599516SKenneth E. Jansen real*8 BC(nshg,ndofBC),yold(nshg,ndof),mdotNow(3) 10159599516SKenneth E. Jansenc 10259599516SKenneth E. Jansenc in some way find mdot for this way 10359599516SKenneth E. Jansenc 10459599516SKenneth E. Jansen call rampedMdot(mdotNow) 10559599516SKenneth E. Jansenc call flowControl(mdotNow) 10659599516SKenneth E. Jansen 10759599516SKenneth E. Jansenc 10859599516SKenneth E. Jansenc compute the pressure from the current solution at the peak of profile 10959599516SKenneth E. Jansenc 11059599516SKenneth E. Jansen 11159599516SKenneth E. Jansen loc_ctrl_pr(1) = yold(kmaxinf,4) ! inlet 11259599516SKenneth E. Jansen loc_ctrl_pr(2) = yold(kmaxbot,4) ! bottom FC 11359599516SKenneth E. Jansen loc_ctrl_pr(3) = yold(kmaxtop,4) ! top FC 11459599516SKenneth E. Jansenc 11559599516SKenneth E. Jansenc communicate it so that we are sure all agree 11659599516SKenneth E. Jansenc (in case the profile is split across procs) 11759599516SKenneth E. Jansenc 11859599516SKenneth E. Jansen if(numpe > 1) then 11959599516SKenneth E. Jansen call MPI_ALLREDUCE ( loc_ctrl_pr, ctrl_pr, 3, 12059599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, ierr ) 12159599516SKenneth E. Jansen else 12259599516SKenneth E. Jansen ctrl_pr = loc_ctrl_pr 12359599516SKenneth E. Jansen endif 12459599516SKenneth E. Jansen 12559599516SKenneth E. Jansen 12659599516SKenneth E. Jansen ctrl_a(1) = ctrl_factor(1)*mdotNow(1)/ctrl_pr(1) ! inlet 12759599516SKenneth E. Jansen ctrl_a(2) = ctrl_factor(2)*mdotNow(2)/ctrl_pr(2) ! bottom FC 12859599516SKenneth E. Jansen ctrl_a(3) = ctrl_factor(3)*mdotNow(3)/ctrl_pr(3) ! top FC 12959599516SKenneth E. Jansen if(max(ninflow,max(nfctop,nfcbot)).gt. 0) then 13059599516SKenneth E. Jansen do kk=1,numnp 13159599516SKenneth E. Jansen if(vbc_prof(kk,1).ne.zero) then 13259599516SKenneth E. Jansen if(vbc_prof(kk,2).ne.zero) then ! both of these true means top FC 133*513954efSKenneth E. Jansen if(ctrl_a(3).ge.zero) then 13459599516SKenneth E. Jansen BC(kk,3)=ctrl_a(3)*vbc_prof(kk,1) 13559599516SKenneth E. Jansen BC(kk,4)=ctrl_a(3)*vbc_prof(kk,2) 136*513954efSKenneth E. Jansen endif 13759599516SKenneth E. Jansen else ! only x true means inflow 138*513954efSKenneth E. Jansen if(ctrl_a(1).ge.zero) then 13959599516SKenneth E. Jansen BC(kk,3)=ctrl_a(1)*vbc_prof(kk,1) 14059599516SKenneth E. Jansen endif 141*513954efSKenneth E. Jansen if(ctrl_a(1).eq.zero) then 142*513954efSKenneth E. Jansen BC(kk,7) = 0.0d0 ! scalar_1 set to zero for zero flow 143*513954efSKenneth E. Jansen endif 144*513954efSKenneth E. Jansen endif 14559599516SKenneth E. Jansen else if(vbc_prof(kk,2).ne.zero) then ! y true means low FC 146*513954efSKenneth E. Jansen if(ctrl_a(2).ge.zero) then 14759599516SKenneth E. Jansen BC(kk,4)=ctrl_a(2)*vbc_prof(kk,2) 14859599516SKenneth E. Jansen endif 149*513954efSKenneth E. Jansen if(ctrl_a(2).eq.zero) then 150*513954efSKenneth E. Jansen BC(kk,7) = 0.0d0 ! scalar_1 set to zero for zero flow 15159599516SKenneth E. Jansen endif 152*513954efSKenneth E. Jansen endif 153*513954efSKenneth E. Jansen enddo 154*513954efSKenneth E. Jansenc if(ninflow.gt.0) write(myrank+2000,2000), lstep,kmaxinf,one, 155*513954efSKenneth E. Jansenc & BC(kmaxinf,3),BC(kmaxinf,4),ctrl_a(1),ctrl_pr(1) 156*513954efSKenneth E. Jansenc if(nfcbot .gt.0) write(myrank+2000,2000), lstep,kmaxbot,two, 157*513954efSKenneth E. Jansenc & BC(kmaxbot,3),BC(kmaxbot,4),ctrl_a(2),ctrl_pr(2) 158*513954efSKenneth E. Jansenc if(nfctop .gt.0) write(myrank+2000,2000), lstep,kmaxtop,three, 159*513954efSKenneth E. Jansenc & BC(kmaxtop,3),BC(kmaxtop,4),ctrl_a(3),ctrl_pr(3) 160*513954efSKenneth E. Jansen endif 161*513954efSKenneth E. Jansen 2000 format(i6,i6,5(e14.7,2x)) 16259599516SKenneth E. Jansen return 16359599516SKenneth E. Jansen end 16459599516SKenneth E. Jansen 16559599516SKenneth E. Jansen 16659599516SKenneth E. Jansen subroutine rampedMdot(mdotNow) 16759599516SKenneth E. Jansen include "common.h" !gives us rampmndot and nstep 16859599516SKenneth E. Jansen 16959599516SKenneth E. Jansen! assuming three profiles to control (inlet, bottom FC and top FC) 17059599516SKenneth E. Jansen real*8 mdotNow(3),xi,cstep,rnstep 17159599516SKenneth E. Jansen 17259599516SKenneth E. Jansen rnstep=nstep(1) 17359599516SKenneth E. Jansen cstep=istep+1 17459599516SKenneth E. Jansen xi=cstep/rnstep 17559599516SKenneth E. Jansen 17659599516SKenneth E. Jansen mdotNow(:)=rampmdot(1,:)+xi*(rampmdot(2,:)-rampmdot(1,:)) 17759599516SKenneth E. Jansen return 17859599516SKenneth E. Jansen end 179