Python
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()
Hasil Perhitungan:
DP aktual: 5.00 kPa
Flow aktual tanpa kompensasi: 4000.00 Nm³/h
Flow terkoreksi untuk kondisi operasi: 2460.81 Nm³/h