write python code that can solve an otto cycle and make plots for it.
Objective
write python code that can solve an otto cycle and make plots for it.
Problem Statement
1. Your code should create a PV diagram
2. You should output the thermal efficiency of the engine.
Theory
An Otto cycle is an idealized thermodynamic cycle that describes the functioning of a typical spark ignition piston engine. It is the thermodynamic cycle most commonly found in automobile engines.
Code
#otto cycle
import math
import matplotlib.pyplot as plt
import numpy as np
def engine_kinamatics(bore,stroke,con_rod,cr,start_crank,end_crank):
#goeometric input
sc=math.radians(start_crank)
ec=math.radians(end_crank)
num_value=50
dtheta=(ec-sc)/(num_value-1)
v=[]
for i in range(0,num_value):
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
#goeometric input
bore=0.1
stroke=0.1
con_rod=0.15
cr=12
a=stroke/2
R=con_rod/a
#volume computation
v_s=(math.pi/4)*pow(bore,2)*stroke
v_c=v_s/(cr-1)
v1=v_s+v_c
#state2
v2=v_c
p2=p1*pow(v1,gamma)/pow(v2,gamma);
rhs=p1*v1/t1
t2=p2*v2/rhs
v_compression=engine_kinamatics(bore,stroke,con_rod,cr,180,0)
constant=p1*pow(v1,gamma)
p_compression=[]
for v in v_compression:
p_compression.append(constant/pow(v,gamma))
#state 3
v3=v2
rhs=p2*v2/t2
p3=rhs*t3/v3
v_expansion=engine_kinamatics(bore,stroke,con_rod,cr,0,180)
constant=p3*pow(v3,gamma)
p_exapansion=[]
for v in v_expansion:
p_exapansion.append(constant/pow(v,gamma))
#state4
v4=v1
p4=p3*pow(v3,gamma)/pow(v4,gamma)
t4=p4*v4/rhs;
efficiency=1-1/(pow(cr,(gamma-1)));
print(efficiency)
plt.plot([v2,v3 ],[p2,p3])
plt.plot(v_compression,p_compression )
plt.plot(v_expansion,p_exapansion )
plt.plot([v4,v1 ],[p4,p1])
plt.show()
Code explanation
#otto cycle
import math # required libraries are imported to the program, here math is imported.
import matplotlib.pyplot as plt
import numpy as np
def engine_kinamatics(bore,stroke,con_rod,cr,start_crank,end_crank): #function definition
#goeometric input
sc=math.radians(start_crank) #crank angle input
ec=math.radians(end_crank)
num_value=50 #number of angles
dtheta=(ec-sc)/(num_value-1)
v=[] #empty array v
for i in range(0,num_value): #for loop 0 to num_value
theta=sc + i*dtheta #theta calculation
term1=0.5*(cr-1); #exact volume trace calculation
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) #return volume v
#inputs
p1=101325
t1=500
gamma=1.4
t3=2300
#goeometric input
bore=0.1
stroke=0.1
con_rod=0.15
cr=12
a=stroke/2
R=con_rod/a
#volume computation
v_s=(math.pi/4)*pow(bore,2)*stroke #stroke volume calcution
v_c=v_s/(cr-1) #clarance volume calcution
v1=v_s+v_c #total volume aas v1
#state2
v2=v_c
p2=p1*pow(v1,gamma)/pow(v2,gamma); #p2 from p1v1^gamma=p2v2^gamma
rhs=p1*v1/t1
t2=p2*v2/rhs
v_compression=engine_kinamatics(bore,stroke,con_rod,cr,180,0) #calling function with proving start and end angle
constant=p1*pow(v1,gamma)
p_compression=[] #empty array as p_compression
for v in v_compression: #loop from intial v to final v and appending p_compression
p_compression.append(constant/pow(v,gamma))
#state 3 #p3 from (p2v2)/t2=p3v3/t3
v3=v2
rhs=p2*v2/t2
p3=rhs*t3/v3
v_expansion=engine_kinamatics(bore,stroke,con_rod,cr,0,180) #calling function with proving start and end angle
constant=p3*pow(v3,gamma)
p_exapansion=[] #empty array as p_expansion
for v in v_expansion: #loop from intial v to final v and appending p_expansion
p_exapansion.append(constant/pow(v,gamma))
#state4
v4=v1
p4=p3*pow(v3,gamma)/pow(v4,gamma) ##p4 from p3v3^gamma=p4v4^gamma
t4=p4*v4/rhs;
efficiency=1-1/(pow(cr,(gamma-1)));
print(efficiency)
plt.plot([v2,v3 ],[p2,p3]) #requiredd plots
plt.plot(v_compression,p_compression )
plt.plot(v_expansion,p_exapansion )
plt.plot([v4,v1 ],[p4,p1])
plt.show()
OUTPUT
0.6298928275128466