payload_range_alternate.py 2.39 KB
Newer Older
Ben Brelje's avatar
Ben Brelje committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
import matplotlib.pyplot as plt
from matplotlib.mlab import griddata
import numpy as np
import os

#define problem-specific constants
MTOW = 2984 #kg
#max fuel 891 kg

f = 0.625 #empty weight fraction of TBM700
g = 9.81 #m/s^2
LoD = 13.2 #lift to drag ratio
eta_i = 0.99
eta_m = 0.93
eta_p = 0.90
eta_g = 0.98
c_b = 1444000 # battery specific energy (J/kg)
c_p = 0.408 / 1000 / 60 / 60 # PT6A SFC (kgfuel/W*s)

class nf(float):
    def __repr__(self):
        str = '%.1f' % (self.__float__(),)
        if str[-1] == '0':
            return '%.0f' % self.__float__()
        else:
            return '%.1f' % self.__float__()
	
def R_f(w_pay,eps):
	log_interior = (eps+(1-eps)*c_b*c_p)*MTOW/(eps*MTOW+(1-eps)*c_b*c_p*(w_pay+f*MTOW))
	r_f = LoD*eta_i*eta_m*eta_p*eta_g/c_p/g*np.log(log_interior)
	return r_f

def R_e(w_pay,eps):
	r_e = eps*c_b*LoD*eta_i*eta_m*eta_p/g*((1-f)*MTOW-w_pay)/(eps*MTOW+(1-eps)*c_b*c_p*(w_pay+f*MTOW))
	return r_e

def R_tot(w_pay,eps):
	r_tot = R_f(w_pay,eps)+R_e(w_pay,eps)
	return r_tot
	
def W_f(w_pay,eps):
	w_f = (1-eps)*c_b*c_p*((1-f)*MTOW-w_pay)/(eps+(1-eps)*c_b*c_p)
	return w_f

fmt = '%r'

epses = np.linspace(0,1.1,111)
payloads = np.linspace(0,891,101)

R_tots = []
eps_flat = []
pay_flat = []
w_fs = []

for i, eps in enumerate(epses):
	for j, payload in enumerate(payloads):
			R_tots.append(R_tot(payload,eps)/1000)
			eps_flat.append(eps)
			pay_flat.append(payload)
			w_fs.append(W_f(payload,eps))
			
			
xi = np.linspace(0,3800,200) #range
yi = np.linspace(0,800,200) #payload
z3 = griddata(R_tots,pay_flat,eps_flat,xi,yi,interp='linear')
levels_eps = [0.01,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.99]
c3 = plt.contour(xi,yi,z3,levels=levels_eps,linewidths=1.2,colors='k',label='eps')
c3.levels = [nf(val) for val in c3.levels]
plt.clabel(c3,c3.levels,inline=True,fmt=fmt,fontsize=10)

z4 = griddata(R_tots,pay_flat,w_fs,xi,yi,interp='linear')
levels_wf = [891]
c4 = plt.contour(xi,yi,z4,levels=levels_wf,linewidths=1.2,colors='r',label='fuel')
c4.levels = [nf(val) for val in c4.levels]
plt.clabel(c4,c4.levels,inline=True,fmt=fmt,fontsize=10)

plt.xlim(0,3800)
plt.ylim(0,800)
plt.xlabel(r'Range (km)')
plt.ylabel(r'Payload (kg)')
plt.annotate('$\epsilon$ - degree of hybridization',(2000,700),color='k')
plt.annotate('Fuel volume limit',(2000,650),color='r')

print max(w_fs)
print min(w_fs)

plt.title('Payload-Range Curve for Hybrid \n Turboelectric Aircraft Similar to TBM-700')
plt.show()