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 27513954efSKenneth 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 30513954efSKenneth E. Jansen ctrl_factor(2) = 2.25*Rgas*317/((0.0168910950375201 3159599516SKenneth E. Jansen & -0.01054110785157094)*(2*0.041275)) ! bottom FC 32513954efSKenneth 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 50513954efSKenneth E. Jansen rmaxvinflow=-one 51513954efSKenneth E. Jansen rmaxvbot=-one 52513954efSKenneth 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 81513954efSKenneth E. Jansenc call BCprofileScale. Since called form init, this is going to be used to set 82513954efSKenneth E. Jansenc the yold value on the first step. Consequently, we will need to set istep to 83513954efSKenneth 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 84513954efSKenneth 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 94*0d32f9a8SKenneth E. Jansen use timedataC 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 133513954efSKenneth 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) 136513954efSKenneth E. Jansen endif 13759599516SKenneth E. Jansen else ! only x true means inflow 138513954efSKenneth 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 141513954efSKenneth E. Jansen if(ctrl_a(1).eq.zero) then 142513954efSKenneth E. Jansen BC(kk,7) = 0.0d0 ! scalar_1 set to zero for zero flow 143513954efSKenneth E. Jansen endif 144513954efSKenneth E. Jansen endif 14559599516SKenneth E. Jansen else if(vbc_prof(kk,2).ne.zero) then ! y true means low FC 146513954efSKenneth 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 149513954efSKenneth E. Jansen if(ctrl_a(2).eq.zero) then 150513954efSKenneth E. Jansen BC(kk,7) = 0.0d0 ! scalar_1 set to zero for zero flow 15159599516SKenneth E. Jansen endif 152513954efSKenneth E. Jansen endif 153513954efSKenneth E. Jansen enddo 154513954efSKenneth E. Jansenc if(ninflow.gt.0) write(myrank+2000,2000), lstep,kmaxinf,one, 155513954efSKenneth E. Jansenc & BC(kmaxinf,3),BC(kmaxinf,4),ctrl_a(1),ctrl_pr(1) 156513954efSKenneth E. Jansenc if(nfcbot .gt.0) write(myrank+2000,2000), lstep,kmaxbot,two, 157513954efSKenneth E. Jansenc & BC(kmaxbot,3),BC(kmaxbot,4),ctrl_a(2),ctrl_pr(2) 158513954efSKenneth E. Jansenc if(nfctop .gt.0) write(myrank+2000,2000), lstep,kmaxtop,three, 159513954efSKenneth E. Jansenc & BC(kmaxtop,3),BC(kmaxtop,4),ctrl_a(3),ctrl_pr(3) 160513954efSKenneth E. Jansen endif 161513954efSKenneth 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