You are on page 1of 10

Problem 3.

Predict Thrust

1) Case Study

Initial Reference
1000 psi (6894757.188 Pa)
Pressure
Cylindrical grain burning only one side
D_outer : 200 mm
Grain
D_inner : 100 mm
Length : 1000 mm
Chamber Gas Temp. : 4991 R (2772.8K)
Specific Heat Ratio(Cp/Cv) : 1.1971
Combustion Gas
Propellant Density : 0.06140 lbm/in3 (1699.546 kg/m3)
Characteristics
Average Mol. weight : 24.576 lbm/lbm-mole
Discharge Corection Factor : 1.00
Constant : 0.0274
Exponent : 0.33
Burning Rate
(St.Robert's law, US unit parameter)
Characteristics
PIKA : 0.366
PIKB : 0.000 (Temp Sensitivity)
Motor Coefficient : 0.98
Nozzle Nozzle Divergence Half Angle : 15 deg
Optimum expansion
Atmospere Pressure : 14.7 psia
Extra Information
Standard Value of Prop. Init. Temp. : 20deg

2)

. Case study
, .
,
.
x dx
.
Pc Runge-Kutta 4
.
START

Input
Parameter

Initialization P(x) Distribution

Nt=0 Performance
Calculation

Plot
Geometry
Update

Pc Calculation Pc <= Pe
(Using RK4)

END Program

Initialization



cos















, average burning area for cylindrical one way burning

Geometry Update




, total chamber volume

Pc Calculation



P(x) Distribution











Performance
or

3) Result

Pc . vs . Time
120

100

80
Pc (atm)

60

40

20

-1 0 1 2 3 4 5 6 7 8
Time (sec)
Thrust . vs . Time

20

15
Thrust (kN)

10

0
-1 0 1 2 3 4 5 6 7 8
Time (sec)

.
. 7.3
.

t=4 sec

69.76

69.74

69.72
Pc(i) , atm

69.70

69.68

69.66

69.64

69.62

0.0 0.2 0.4 0.6 0.8 1.0


X (m)

t=4 P(x)
.
, 0.13 atm(13172Pa) .
Appendix)) Program Source

Module para_mod

Implicit none

Integer,parameter :: dp =selected_real_kind(15,100)

Integer,parameter :: ncell = 1000


Integer :: nx
Integer :: nt, nstep

Real (dp) :: D_out, D_in, L, dx, dt, rt


Real (dp) :: Tc, Pc, Ta, Pa, Pe
Real (dp) :: burn_a, burn_b, pika, pikb
Real (dp) :: gm, rho_p, MW_avg, cstar, R, Cf, Isp, F
Real (dp) :: Gamma, Cp
Real (dp),parameter :: g0=9.81 ! m/s2
Real (dp),parameter :: Ru=8314.3 ! mks=8314.3 J/kg-mole-K
Real (dp) :: phi

Real (dp) :: C_dis, C_mot


Real (dp) :: mdot_ig, mdot_in
Real (dp) :: angle_dis, At, Ae, lambda
Real (dp) :: Ab_avg, Volc
Real(dp) :: mdot_avg, rdot_avg

Real (dp) :: Ap(ncell), Ab(ncell), D(ncell), peri(ncell), web(ncell)


Real (dp) :: rdot(ncell), m(ncell), m_tot
Real (dp) :: P(ncell), T(ncell), V(ncell),rho(ncell)

End Module para_mod


!********************************************************************
!
! Solidrocket Performance Calculate Program
!
!
Programed by kim jong-chan
!
2008.05
!
!********************************************************************
!====================================================================
Program SRMP

use para_mod

Implicit none
Integer :: I,K,N
Real (dp) :: Pcnew ! rt : real time
EXTERNAL CalcPc

call Input
call Init

nt=0
rt=0.

Do

call geo_update
! call BC

call RK4th(rt,Pc,dt,Pcnew,CalcPc)
Pc=Pcnew

call PxDist

call perfor
call plot

nt=nt+1
call step

! if(nstep==0) exit
if(pc <= 1.1*pe) exit

END DO

End Program SRMP


!====================================================================
!********************************************************************
Subroutine Input

use para_mod

namelist/input1/D_out,D_in,L,Tc,Pc,Ta,Pa,burn_a,burn_b,pika,pikb, &
gm,rho_p,MW_avg,C_dis,C_mot,angle_dis,dx,dt

open (1,file='input.dat',status='old')
read (1,input1)

phi=4.*atan(1.)

write(*,input1)

close (1)

end subroutine input


!********************************************************************
Subroutine Init

use para_mod

Implicit none
Integer :: I

! Initialize Geometry value, x step, average burning area of cylinder type

nx=Int(L/dx)+1 ! Total node number


Ab_avg=phi*(D_out+D_in)*L/2. ! cylinder type , one-way burning

! middle-Area

! Calculate Thermodynamic Variables

R=Ru/MW_avg
Cp=R*gm/(gm-1)
Pe=Pa
cstar=sqrt(gm*R*Tc)/(gm*sqrt((2./(gm+1.))**((gm+1)/(gm-1))))
lambda=(1.+cos(angle_dis*phi/180.))/2.
Cf=lambda*sqrt(2.*gm**2/(gm-1)*(2./(gm+1))**((gm+1)/(gm-1))*(1-(Pe/Pc)**((gm-1)/gm)))
! +(Pe-Pa)/Pc*Ae/At ! if Pe=Pa, -> 0
Isp=cstar*Cf/g0
Gamma=sqrt(gm)*(2/(gm+1))**((gm+1)/(2*(gm-1)))

write(*,100) R,Cp,cstar,lambda,cf,isp,gamma
100 format(1x,'R=',f10.4,' Cp=',f10.4,' c*=',f10.4,' lambda=', &
f7.4,' Cf=',f7.4,' isp=',f8.4,' Gamma=',f7.4)

! Calculate Nozzle Geometry

! rdot_avg=burn_a*Pc**burn_b
rdot_avg=burn_a*(Pc/101325.*14.7)**burn_b*0.0254 ! burn_a,b : USCS Unit
mdot_avg=Ab_avg*rho_p*rdot_avg

At=mdot_avg*cstar/Pc
Ae=At/(((gm+1)/2)**(1/(gm-1))*(pe/pc)**(1/gm) & ! eq 3.25
*sqrt((gm+1)/(gm-1)*(1-(pe/pc)**((gm-1)/gm))))

write(*,110) rdot_avg, mdot_avg


110 format(1x,'rdot_int=',f10.5,' mdot_int=',f10.5)
write(*,120) At,Ae,sqrt(At*4/phi),sqrt(Ae*4/phi)
120 format(1x,'At=',f10.6,' Ae=',f10.6,' Dt=',f5.3,' De=',f5.3)

Print *,'Init Thrust(N)=',C_mot*Pc*Cf*At

! Initial Value Setting

Do i=1,nx
P(i)=101325.*1.
T(i)=Tc
! V(i)=0.0
rho(i)=p(i)/(R*T(i))
end do

End subroutine Init


!********************************************************************
Subroutine geo_update

use para_mod

Implicit none
Integer :: i

volc=0.0
mdot_ig=0.0
mdot_in=0.0

do i=1,nx
call burnrate(i)

if (nt==0) then
d(i)=D_in
else
d(i)=d(i)+2.*rdot(i)*dt
If (D(i) >= D_out) then
D(i)=D_out
end if
end if

peri(i)=phi*D(i)
Ap(i)=1./4.*phi*d(i)**2. ! Port area (m2)
Ab(i)=peri(i)*dx ! Burning area (m2)
web(i)=d_out/2.-d(i)/2. ! web thickness (m)

if (web(i)<=0.0) then
web(i)=0.0
rdot(i)=0.0
end if

volc=volc+Ap(i)*dx
mdot_in=mdot_in+rdot(i)*rho_p*Ab(i)
end do

End subroutine geo_update


!********************************************************************
Subroutine BC

use para_mod

Implicit none

V(1)=0.0
T(1)=Tc
P(1)=Pc

End subroutine BC
!********************************************************************
Subroutine burnrate(i)

use para_mod
Implicit none
Integer :: i

rdot(i)=burn_a*(P(i)*14.7/101325.)**burn_b*0.0254
! ** a, b parameters are USCS Unit values

End subroutine burnrate

!********************************************************************
subroutine step

use Para_mod

Implicit none
Integer :: i
real(dp) :: web_max

web_max=0.0

Do i=1,nx
web(i)=web(i)-rdot(i)*dt
web_max=max(web(i),web_max)
If( web_max > 0.0 ) then ! all web thickness = 0, program stop
nstep=1
else
nstep=0 ! 0, stop calculate ; 1, continue
end if
End do

End subroutine step


!********************************************************************
Subroutine PxDist
! Using P(x) model
!********************************************************************
use para_mod

Implicit none
Integer :: I

P(1)=Pc*(1+0.5*Gamma**2/(Ap(1)/At)**2)

Do i=2,nx
P(i)=P(1)*(1-(Gamma*(At/Ap(i))*((i-1)*dx/L))**2)
End do

End subroutine PxDist


!********************************************************************
Subroutine perfor

use para_mod

Implicit none
Integer :: i
Real (dp) :: Ve

Cf=lambda*sqrt(2.*gm**2/(gm-1)*(2./(gm+1))**((gm+1)/(gm-1)) &
*(1-(Pe/Pc)**((gm-1)/gm)))+(Pe-Pa)/Pc*Ae/At
Isp=cstar*Cf/g0

if(mdot_in > mdot_avg.or.mdot_in.eq.0.0) then


F=C_mot*Cf*Pc*At
else
F=C_mot*mdot_in*isp*g0
end if

End subroutine perfor


!********************************************************************
Subroutine Plot

use para_mod

Implicit none
Integer :: i
namelist/input1/D_out,D_in,L,Tc,Pc,Ta,Pa,burn_a,burn_b,pika,pikb, &
gm,rho_p,MW_avg,C_dis,C_mot,angle_dis,dx,dt

Open(1,file='performance.txt')
Open(2,file='Geometry.txt')

If (nt==0) then
write(1,100)
write(*,100)
write(2,input1)
write(2,200)
! Geo. information of Grain
write(2,210) D_out,D_in,L
! Geo. information of Nozzle
write(2,220) At,sqrt(At*4/phi),Ae,sqrt(Ae*4/phi) &
,(sqrt(Ae*4/phi)-sqrt(At*4/phi))/2./dtan(angle_dis/180.*phi)

100 format(1x,'***** Performance Prediction Result **********'// &


1x,'time(sec) Pc(atm) Cf Isp(sec) F(kN) mdot_gen')
200 format(1x,'***** Geometry Information *****************************'/)
210 format(1x,'Grain,','Outer_Dia=',f6.4,' Inner_Dia=',f6.4,' Length=',f6.4/)
220 format(1x,'Nozzle,','At=',f8.6,' Dt=',f8.6,' Ae=',f8.6,' De=',f8.6, &
' Dt-De-L=',f8.6//)
end if

write(1,110) rt,Pc/101325.,Cf,Isp,F/1000.,mdot_in
write(*,110) rt,Pc/101325.,Cf,Isp,F/1000.,mdot_in
110 format(1x,6f10.5)

write(2,*) nt*dt,(P(i),i=1,nx)
230 format(1x,51f10.8)

End Subroutine plot

!********************************************************************
! Runge-kutta 4th Order Method ======================================
!********************************************************************
SUBROUTINE RK4th (x,y,h,ynew,f_sys)

Use para_mod

IMPLICIT NONE

REAL(dp) :: x, y, h
REAL(dp) :: ym, ye, ynew, slope
REAL(dp) :: k1, k2, k3, k4
EXTERNAL F_SYS

Call F_sys(x,y,k1)
ym=y+k1*h/2.

Call F_sys(x+h/2.,ym,k2)
ym=y+k2*h/2.

Call F_sys(x+h/2.,ym,k3)
ye=y+k3*h

Call F_sys(x+h,ye,k4)
slope=(k1+2.*(k2+k3)+k4)/6.
ynew=y+slope*h
x=x+h

END SUBROUTINE Rk4th

!===============================================================
!
!===============================================================
SUBROUTINE CalcPc(X,Y,DYDX)

Use para_mod
IMPLICIT NONE
REAL(dp) :: X,Y,DYDX

DYDX=(mdot_ig+mdot_in-Y*At/Cstar)*R*Tc/Volc ! Y=Pc

END SUBROUTINE CalcPc

You might also like