Coverage for rocketcea\Isp.py : 0%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
from math import sqrt from rocketcea.Goal import Goal
def CalcPCoPE(gam,eps):
Pc = 100.0 #! just for reference pick a value for Pc Pthrt = Pc * (2./(gam+1.))**(gam/(gam-1.)) PeMax = Pthrt PeMin = 1.0E-20
g1=((gam+1.0)/2.0) ** (1.0/(gam-1.0)) g2=(gam+1.0)/(gam-1.0) g3=(1.0/gam) g4=((gam-1.0)/gam)
for _I in range(54): # in FORTRAN use 25 for single precision
Pe = (PeMax + PeMin) / 2.0 PCoPE = Pc / Pe PEoPC = Pe / Pc #print( 'trying Pe=',Pe)
p1=PEoPC**g3 p2=1.0-PEoPC**g4
epsCalc=1.0/(g1*p1*(g2*p2)**0.5)
if epsCalc <= eps: PeMax = Pe else: PeMin = Pe
Pe = (PeMax + PeMin) / 2.0 PCoPE = Pc / Pe if abs((epsCalc-eps)/eps) > 0.0001 : print('================= WARNING ==========================') print( ' Bad Solution in CalcPCoPE') print( ' (desired Area Ratio=',eps,' actual=',epsCalc,')') print( ' input gam=',gam,' eps=',eps) print('================= WARNING ==========================')
return PCoPE
def CalcEps(gam,PCoPE):
#PEoPC=1.0/PCoPE
if(PCoPE > 1.0): g1=((gam+1.0)/2.0) ** (1.0/(gam-1.0)) p1=PCoPE**(-1.0/gam) g2=(gam+1.0)/(gam-1.0) p2=1.0-PCoPE**(-(gam-1.0)/gam)
eps=1.0/(g1*p1*(g2*p2)**0.5) else: eps=1.0
return eps
def solvePCoPE(gam, eps):
def getEpsForPEoPC( _PEoPC ): return CalcEps(gam,1./_PEoPC)-eps
PToPC = (2./(gam+1.))**(gam/(gam-1.)) G = Goal(goalVal=0.0, minX=1.0E-12, maxX=PToPC, funcOfX=getEpsForPEoPC, tolerance=1.0E-12, maxLoops=40, failValue=None) PEoPC, ierror = G() return 1./PEoPC
def CalcCFvac(GamInp,PCoPE):
#c calculate separation pressure for nozzle if (GamInp < 1.0001): gam = 1.0001 else: gam = GamInp
eps = CalcEps(gam,PCoPE)
g1=2*gam**2/(gam-1.0) g2=(2.0/(gam+1.0))**((gam+1.0)/(gam-1.0))
g3=1.0-(1.0/PCoPE)**((gam-1.0)/gam) CFvac=0.0 if(g3 > 0.0):CFvac=sqrt(g1*g2*g3) + eps/PCoPE if(g3 <= 0.0 or CFvac<0.001):CFvac=0.001
return CFvac
def CalcCstar(Gam,Temp,WtMol):
bot=Gam*((2.0/(Gam+1.0))**((Gam+1.0)/(Gam-1.0)))**0.5 top= ( Gam * 1545.0 * 32.174 * Temp / WtMol ) ** 0.5 cstar=top/bot
return cstar
def CalcIdealIsVac(Gam,Temp,WtMol,eps):
cstar = CalcCstar(Gam,Temp,WtMol) pcope = CalcPCoPE(Gam,eps) Cfvac = CalcCFvac(Gam,pcope)
IspVac=cstar * Cfvac / 32.174
return IspVac
if __name__ == "__main__":
def testme(): gam=1.25 eps=2.0 Temp=5000.0 WtMol=20.0 Pc=250.0 Pamb=0.0 print( 'for gam=%g and eps=%g'%(gam,eps)) print( ) pcope = solvePCoPE(gam, eps) print( 'solvePCoPE(%g,%g)='%(gam,eps),pcope) print( 'CalcEps(gam,PCoPE)=',CalcEps(gam,pcope)) print( ) pcope = CalcPCoPE(gam,eps)
print( 'CalcPCoPE(%g,%g)='%(gam,eps),pcope,' Pe/Pc=',1./pcope) print( 'CalcEps(gam,PCoPE)=',CalcEps(gam,pcope)) print( 'CalcCFvac(gam,PCoPE)',CalcCFvac(gam,pcope))
print( 'for T=%g degR and WtMol=%g lbm/lbmole'%(Temp, WtMol)) print( 'CalcCstar(Gam,Temp,WtMol)',CalcCstar(gam,Temp,WtMol))
print( 'for Pc=%g and Pamb=%g'%(Pc,Pamb)) print( 'CalcIdealIsVac(Gam,Temp,WtMol,eps)',CalcIdealIsVac(gam,Temp,WtMol,eps))
print( )
grayLambda = 0.985 #cos(10.*pi/180.) print( 'CalcCFvac(gam,PCoPE)',CalcCFvac(gam,pcope),' in gray book=',grayLambda*CalcCFvac(gam,pcope)) print( 'CalcCstar(Gam,Temp,WtMol)',CalcCstar(gam,Temp,WtMol)) testme() |