# otto cycle
import math
import matplotlib.pyplot as plt
def engine_kinematics(bore,stroke,con_rod,cr,start_crank,end_crank):
a = stroke/2
R = con_rod/a
v_s = (math.pi/4)*pow(bore,2)*stroke
v_c = v_s/(cr-1)
v = v_c + v_s
num_values = 100
sc = math.radians(start_crank)
ec = math.radians(end_crank)
V = []
dtheta = (ec-sc)/(num_values - 1)
for i in range(0,num_values):
theta = (sc+i*(dtheta))
term1 = 0.5*(cr-1)
term2 = R + 1 - (math.cos(theta))
term3 = pow(R,2)-pow(math.sin(theta),2)
term3 = pow(term3,0.5)
V.append((1 + term1*(term2-term3))*v_c)
return(V)
# inputs
p1 = 101325
t1 = 500
gamma = 1.4
t3 = 2300
#engine parameter
bore= 0.1
cr = 8
con_rod = 0.1
stroke = 0.1
v_s = (math.pi/4)*pow(bore,2)*stroke
v_c = v_s/(cr - 1)
v1 = v_c + v_s
#state point 2
v2 = v_c
#p2*v2^gamma = p1*v1^gamma
p2 = p1*pow(v1,gamma)/pow(v2,gamma)
#p2*v2/t2 = p1*v1/t1
t2 = (p2*v2*t1)/(p1*v1)
v_compression = engine_kinematics(bore,stroke,con_rod,cr,180,0)
constant = p1*pow(v1,gamma)
p_compression = []
for j in v_compression:
p_compression.append(constant/pow(j,gamma))
#state point 3
v3 = v2
#p3*v3/t3 = p2*v2/t2
p3 = (p2*v2*t3)/(t2*v3)
v_expansion = engine_kinematics(bore,stroke,con_rod,cr,0,180)
constant = p3*pow(v3,gamma)
p_expansion = []
for j in v_expansion:
p_expansion.append(constant/pow(j,gamma))
#state point 4
v4 = v1
#p3*v3^gamma = p4*v4^gamma
p4 = p3*pow(v3,gamma)/pow(v4,gamma)
#p4*v4/t4 = p3*v3/t3
t4 = (p4*v4*t3)/(p3*v3)
plt.plot([v2,v3],[p2,p3])
plt.plot(v_compression,p_compression)
plt.plot(v_expansion,p_expansion)
plt.plot([v4,v1],[p4,p1])
plt.show()
explanations
1. for developing otto cycle diagram we calculate v1,v2,v3,v4,p1,p2,p3,p4,t1,t2,t3,t4
and we create a diagram using the plot command
2. but the diagram is not that correct because of insufficient inputs so that's why we use the 'function command' to calculate inputs and then plot the diagram of the otto cycle