HeatTransPlan / src /modules /pinch /pinch_plot.py
drzg15's picture
Initial code commit with LFS for binaries
c993983
import matplotlib.pyplot as plt
class PinchPlot:
def draw_temperature_interval(self, _temperatures, streams):
fig, ax = plt.subplots()
plt.title('Shifted Temperature Interval Diagram')
plt.ylabel('Shifted Temperature S (degC)')
ax.set_xticklabels([])
xOffset = 50
for temperature in _temperatures:
plt.plot([0, xOffset * (streams.numberOf + 1)], [temperature, temperature], ':k', alpha=0.8)
arrow_width = streams.numberOf * 0.05
head_width = arrow_width * 15
head_length = _temperatures[0] * 0.02
i = 1
for stream in streams:
if stream['type'] == 'HOT':
plt.text(xOffset, stream['ss'], str(i), bbox=dict(boxstyle='round', alpha=1, fc='tab:red', ec="k"))
plt.arrow(xOffset, stream['ss'], 0, stream['st'] - stream['ss'], color='tab:red', ec='k', alpha=1,
length_includes_head=True, width=arrow_width, head_width=head_width, head_length=head_length)
else:
plt.text(xOffset, stream['ss'], str(i), bbox=dict(boxstyle='round', alpha=1, fc='tab:blue', ec="k"))
plt.arrow(xOffset, stream['ss'], 0, stream['st'] - stream['ss'], color='tab:blue', ec='k', alpha=1,
length_includes_head=True, width=arrow_width, head_width=head_width, head_length=head_length)
xOffset = xOffset + 50
i = i + 1
def draw_problem_table(self, problem_table, _temperatures):
fig, ax = plt.subplots(figsize=(6, 6))
ax.axis('tight')
ax.axis('off')
ax.set_title('Problem Table')
colLabels = ['$Interval: S_i - S_{i+1}$', '$\\Delta T (\\degree C)$', '$\\Delta CP (kW / \\degree C)$', '$\\Delta H (kW)$', '']
cellText = []
i = 1
for interval in problem_table:
cellRow = []
cellRow.extend(['{}: {} - {}'.format(i, _temperatures[i - 1], _temperatures[i]),
interval['deltaS'], interval['deltaCP'], interval['deltaH']])
if interval['deltaH'] > 0:
cellRow.append('Surplus')
elif interval['deltaH'] == 0:
cellRow.append('-')
else:
cellRow.append('Deficit')
cellText.append(cellRow)
i = i + 1
table = ax.table(cellText=cellText, colLabels=colLabels, loc='center')
table.auto_set_column_width([0, 1, 2, 3, 4])
table.scale(1.3, 1.3)
def draw_heat_cascade(self, unfeasible_heat_cascade, heat_cascade, hot_utility):
fig, axs = plt.subplots(1, 2, figsize=(10, 6))
axs[0].axis('auto')
axs[0].axis('off')
axs[1].axis('auto')
axs[1].axis('off')
axs[0].set_title('Unfeasible Heat Cascade')
axs[1].set_title('Feasible Heat Cascade')
cellText = []
cellText.append(['', '', 'Hot Utility: 0'])
cellText.append(['Interval', '$\\Delta H (kW)$', 'Exit H (total kW)'])
i = 1
for interval in unfeasible_heat_cascade:
cellText.append([str(i), interval['deltaH'], interval['exitH']])
i = i + 1
cellText.append(['', '', 'Cold Utility: {}'.format(unfeasible_heat_cascade[-1]['exitH'])])
table = axs[0].table(cellText=cellText, loc='center')
table.auto_set_column_width([0, 1, 2])
table.scale(1.3, 1.3)
cellText = []
cellText.append(['', '', 'Hot Utility: {}'.format(hot_utility)])
cellText.append(['Interval', '$\\Delta H (kW)$', 'Exit H (total kW)'])
i = 1
for interval in heat_cascade:
cellText.append([str(i), interval['deltaH'], interval['exitH']])
i = i + 1
cellText.append(['', '', 'Cold Utility: {}'.format(heat_cascade[-1]['exitH'])])
table = axs[1].table(cellText=cellText, loc='center')
table.auto_set_column_width([0, 1, 2])
table.scale(1.3, 1.3)
def draw_shifted_composite_diagram(self, shifted_composite_diagram, cold_utility, _temperatures, hot_utility, pinch_temperature, process_designation, localisation):
fig = plt.figure()
plt.plot(shifted_composite_diagram['hot']['H'], shifted_composite_diagram['hot']['T'], 'tab:red')
plt.plot(shifted_composite_diagram['cold']['H'], shifted_composite_diagram['cold']['T'], 'tab:blue')
plt.plot(shifted_composite_diagram['hot']['H'], shifted_composite_diagram['hot']['T'], 'ro')
plt.plot(shifted_composite_diagram['cold']['H'], shifted_composite_diagram['cold']['T'], 'bo')
maxColdH = max(shifted_composite_diagram['cold']['H'])
try:
pinchIndex = shifted_composite_diagram['cold']['T'].index(pinch_temperature)
pinchH = shifted_composite_diagram['cold']['H'][pinchIndex]
plt.plot([pinchH, pinchH], [_temperatures[0], _temperatures[-1]], ':')
except ValueError:
pass
a = plt.fill_between([cold_utility, shifted_composite_diagram['cold']['H'][0]-hot_utility], [shifted_composite_diagram['cold']['T'][0]])
a.set_hatch('\\')
a.set_facecolor('w')
plt.grid(True)
if localisation == 'DE':
plt.title('Verschobene Verbundkurven ({})'.format(process_designation))#plt.title('Shifted Temperature-Enthalpy Composite Diagram')
plt.xlabel('Enthalpiestrom H in kW')
plt.ylabel('Verschobene Temperatur in °C')
elif localisation == 'EN':
plt.title('Shifted Composite Diagram')
plt.xlabel('Enthalpy H in kW')
plt.ylabel('Shifted Temperature T in °C')
def draw_composite_diagram(self, composite_diagram, shifted_composite_diagram, cold_utility,
_temperatures, tmin, hot_utility, pinch_temperature, process_designation, localisation):
fig = plt.figure()
plt.plot(composite_diagram['hot']['H'], composite_diagram['hot']['T'], 'tab:red')
plt.plot(composite_diagram['cold']['H'], composite_diagram['cold']['T'], 'tab:blue')
plt.plot(composite_diagram['hot']['H'], composite_diagram['hot']['T'], 'ro')
plt.plot(composite_diagram['cold']['H'], composite_diagram['cold']['T'], 'bo')
maxColdH = max(composite_diagram['cold']['H'])
try:
pinchIndex = shifted_composite_diagram['cold']['T'].index(pinch_temperature)
pinchH = shifted_composite_diagram['cold']['H'][pinchIndex]
plt.plot([pinchH, pinchH], [_temperatures[0], _temperatures[-1]], ':')
except ValueError:
pass
plt.grid(True)
if localisation == 'DE':
plt.title('Verbundkurven ({})'.format(process_designation))#plt.title('Shifted Temperature-Enthalpy Composite Diagram')
plt.xlabel('Enthalpiestrom H in kW')
plt.ylabel('Temperatur in °C')
elif localisation == 'EN':
plt.title('Composite Diagram ({})'.format(process_designation))
plt.xlabel('Enthalpy H in kW')
plt.ylabel('Temperature T in °C')
def draw_grand_composite_curve(self, process_designation, heat_cascade, grand_composite_curve, _temperatures, pinch_temperature, localisation):
fig = plt.figure(num='{}'.format(process_designation))
if heat_cascade[0]['deltaH'] > 0:
plt.plot([grand_composite_curve['H'][0],grand_composite_curve['H'][1]], [grand_composite_curve['T'][0],grand_composite_curve['T'][1]], 'tab:red')
plt.plot([grand_composite_curve['H'][0],grand_composite_curve['H'][1]], [grand_composite_curve['T'][0],grand_composite_curve['T'][1]], 'ro')
elif heat_cascade[0]['deltaH'] < 0:
plt.plot([grand_composite_curve['H'][0],grand_composite_curve['H'][1]], [grand_composite_curve['T'][0],grand_composite_curve['T'][1]], 'tab:blue')
plt.plot([grand_composite_curve['H'][0],grand_composite_curve['H'][1]], [grand_composite_curve['T'][0],grand_composite_curve['T'][1]], 'bo')
for i in range(1, len(_temperatures)-1):
if heat_cascade[i]['deltaH'] > 0:
plt.plot([grand_composite_curve['H'][i],grand_composite_curve['H'][i+1]], [grand_composite_curve['T'][i],grand_composite_curve['T'][i+1]], 'tab:red')
plt.plot([grand_composite_curve['H'][i],grand_composite_curve['H'][i+1]], [grand_composite_curve['T'][i],grand_composite_curve['T'][i+1]], 'ro')
elif heat_cascade[i]['deltaH'] < 0:
plt.plot([grand_composite_curve['H'][i],grand_composite_curve['H'][i+1]], [grand_composite_curve['T'][i],grand_composite_curve['T'][i+1]], 'tab:blue')
plt.plot([grand_composite_curve['H'][i],grand_composite_curve['H'][i+1]], [grand_composite_curve['T'][i],grand_composite_curve['T'][i+1]], 'bo')
elif heat_cascade[i]['deltaH'] == 0 and grand_composite_curve['H'][i]!=0:
plt.plot([grand_composite_curve['H'][i],grand_composite_curve['H'][i+1]], [grand_composite_curve['T'][i],grand_composite_curve['T'][i+1]], 'tab:blue')
plt.plot([grand_composite_curve['H'][i],grand_composite_curve['H'][i+1]], [grand_composite_curve['T'][i],grand_composite_curve['T'][i+1]], 'bo')
plt.plot([0, grand_composite_curve['H'][-1]], [pinch_temperature, pinch_temperature], ':')
plt.grid(True)
if localisation == 'DE':
plt.title('Großverbundkurve ({})'.format(process_designation))
plt.xlabel('Nettoenthalpiestromänderung ∆H [kW]')
plt.ylabel('Verschobene Temperatur [°C]')
elif localisation == 'EN':
plt.title('Grand Composite Diagram ({})'.format(process_designation))
plt.xlabel('Net Enthalpy Change ∆H in kW')
plt.ylabel('Shifted Temperature T in °C')
def show_plots():
plt.show()