Source code for OpenPinch.analysis.economics

"""Utility helpers for equipment costing."""

from __future__ import annotations

from typing import Any

from ..domain.configuration import tol
from ..domain.value import Value

__all__ = [
    "compute_capital_recovery_factor",
    "compute_capital_cost",
    "compute_annual_capital_cost",
    "compute_annual_energy_cost",
]


################################################################################
# Public API
################################################################################


[docs] def compute_capital_recovery_factor(interest_rate: float, years: int) -> float: """Calculate the capital recovery factor, also called annualisation.""" i = interest_rate n = years return i * (1 + i) ** n / ((1 + i) ** n - 1)
[docs] def compute_capital_cost( area: float, num_units: int, fixed_cost_factor: float, variable_cost_factor: float, n_exp_factor: float, ) -> Value: """Determine capital cost from installed capacity and unit-count assumptions.""" capacity = max(float(area), 0.0) if capacity <= tol: return Value(0.0, "$") num_units = max(int(num_units), 1) fixed_cost_factor = max(float(fixed_cost_factor), 0.0) variable_cost_factor = max(float(variable_cost_factor), 0.0) n_exp_factor = max(float(n_exp_factor), 0.0) return Value( num_units * fixed_cost_factor + num_units * variable_cost_factor * (capacity / num_units) ** n_exp_factor, "$", )
[docs] def compute_annual_energy_cost( power_kw: float, price_per_mwh: float, annual_hours: float, ) -> Value: """Determine annual energy cost from power, price, and operating hours.""" power_mw = Value(max(float(power_kw), 0.0), "kW").to("MW").value price = Value(max(float(price_per_mwh), 0.0), "$/MW/h").to("$/MW/h").value hours = max(float(annual_hours), 0.0) return Value(power_mw * price * hours, "$/y")
[docs] def compute_annual_capital_cost( capital_cost: Any, discount_rate: float, service_life: float, ) -> Value: """Determine the annualised capital cost.""" capital = Value(capital_cost, "$").to("$").value if capital <= tol: return Value(0.0, "$/y") discount_rate = max(float(discount_rate), tol) service_life = max(float(service_life), 1.0) return Value( capital * compute_capital_recovery_factor(discount_rate, service_life), "$/y", )