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