xref: /phasta/phSolver/compressible/BCprofile.f (revision 712d3df0b59ebebaaeaea358162c8d2c043c6e08)
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