Spaces:
Sleeping
Sleeping
| 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() | |