import math
import numpy as np
import matplotlib.pyplot as plt
# Parameter desain dari dokumen orifice FE-106
DP_design = 10 # kPa
Flow_design = 5656.85 # Nm³/h
P_design_gauge = 700 # kPa
T_design = 37 + 273.15 # K
# Parameter operasi
P_actual_gauge = 200 # kPa
T_actual = 35 + 273.15 # K
# Konversi ke tekanan absolut (dalam kPa)
P_design_abs = P_design_gauge + 101.325 # kPa (700 kPa gauge + 101.325 kPa atmosfer)
P_actual_abs = P_actual_gauge + 101.325 # kPa (200 kPa gauge + 101.325 kPa atmosfer)
# Formula dalam format LaTeX
formula_dp = r"$DP = \left(\frac{Q}{Q_{\text{design}}}\right)^2 \times DP_{\text{design}}$"
formula_flow = r"$Q = Q_{\text{design}} \times \sqrt{\frac{DP}{DP_{\text{design}}}}$"
formula_corrected_flow = r"$Q_{\text{corrected}} = Q \times \sqrt{\frac{P}{P_{\text{design}}} \times \frac{T_{\text{design}}}{T}}$"
# Fungsi untuk perhitungan utama
def calculate_dp(flow, flow_design, dp_design):
return (flow / flow_design) ** 2 * dp_design
def calculate_flow(dp, flow_design, dp_design):
return flow_design * np.sqrt(dp / dp_design)
def calculate_corrected_flow(flow, p_actual_abs, p_design_abs, t_actual, t_design):
return flow * np.sqrt((p_actual_abs / p_design_abs) * (t_design / t_actual))
# Meminta input dari pengguna
mode = input("Masukkan mode (flow/DP): ").strip().lower()
if mode == "flow":
Flow_actual = float(input("Masukkan flow aktual (Nm³/h): "))
DP_actual = calculate_dp(Flow_actual, Flow_design, DP_design)
elif mode == "dp":
DP_actual = float(input("Masukkan DP aktual (kPa): "))
Flow_actual = calculate_flow(DP_actual, Flow_design, DP_design)
else:
print("Mode tidak dikenali. Pilih 'flow' atau 'DP'.")
exit()
# Koreksi flow untuk kondisi operasi
Flow_corrected = calculate_corrected_flow(Flow_actual, P_actual_abs, P_design_abs, T_actual, T_design)
# Menampilkan hasil perhitungan
print("\nHasil Perhitungan:")
print(f"DP aktual: {DP_actual:.2f} kPa")
print(f"Flow aktual tanpa kompensasi: {Flow_actual:.2f} Nm³/h")
print(f"Flow terkoreksi untuk kondisi operasi: {Flow_corrected:.2f} Nm³/h\n")
# Plotting dengan numpy untuk visualisasi lebih halus
dp_values = np.linspace(0, DP_design, 500)
flow_values = calculate_flow(dp_values, Flow_design, DP_design)
flow_corrected_values = calculate_corrected_flow(flow_values, P_actual_abs, P_design_abs, T_actual, T_design)
plt.figure(figsize=(10, 6))
# Plot imajiner transparan untuk formula
plt.plot(dp_values, dp_values, label=rf'{formula_dp}', color='white', alpha=0, zorder=-1)
# Plot utama
plt.plot(dp_values, flow_values, label=f'{formula_flow}', color='blue')
plt.plot(dp_values, flow_corrected_values, label=f'{formula_corrected_flow}', color='green')
plt.legend(fontsize=10, loc="best", frameon=True, framealpha=0.8, bbox_to_anchor=(1.05, 1))
# Titik data aktual
plt.scatter(DP_actual, Flow_actual, color='red')
plt.scatter(DP_actual, Flow_corrected, color='purple')
# Garis referensi
plt.axhline(y=Flow_actual, color='gray', linestyle='--', alpha=0.7)
plt.axhline(y=Flow_corrected, color='gray', linestyle='--', alpha=0.7)
plt.axvline(x=DP_actual, color='gray', linestyle='--', alpha=0.7)
# Fungsi anotasi dinamis
def place_annotation(x, y, text, color, x_offset):
y_offset = 500 if y < (Flow_design * 0.85) else -500 # Penyesuaian posisi
plt.annotate(
text,
xy=(x, y),
xytext=(x + x_offset, y + y_offset),
arrowprops=dict(facecolor=color, arrowstyle="->"),
fontsize=10,
color=color,
bbox=dict(facecolor="white", edgecolor=color, alpha=0.8, boxstyle="round,pad=0.3"),
)
# Anotasi dengan posisi dinamis
design_text = r"${_{\text{design}}}$"
corrected_text = r"${_{\text{corrected}}}$"
place_annotation(
DP_actual, Flow_actual,
f'DP{design_text}: {DP_design:.2f} kPa\nQ{design_text}: {Flow_design:.2f} Nm³/h\nDP: {DP_actual:.2f} kPa\nQ: {Flow_actual:.2f} Nm³/h',
'red', x_offset=-2
)
place_annotation(
DP_actual, Flow_corrected,
f'P{design_text}: {P_design_gauge:.2f} kPa\nT{design_text}: {T_design:.2f} K\nP: {P_actual_gauge:.2f} kPa\nT: {T_actual:.2f} K\nQ{corrected_text}: {Flow_corrected:.2f} Nm³/h',
'purple', x_offset=0.5
)
# Pengaturan tampilan plot
plt.title('Flow vs Differential Pressure Dengan dan Tanpa Kompensasi')
plt.xlabel('Differential Pressure (kPa)')
plt.ylabel('Flow (Nm³/h)')
plt.grid(True, linestyle='--', alpha=0.6)
plt.legend()
plt.tight_layout()
# Simpan grafik jika diperlukan
# plt.savefig('dp_vs_flow_interactive.svg', dpi=300)
# Tampilkan grafik
plt.show()
Click Run or press shift + ENTER to run code