Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions idaes/core/base/costing_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,14 @@
# This plays with some private attributes - most are necessary
# pylint: disable=protected-access

import json
import os

from functools import partial

import pyomo.environ as pyo
from pyomo.common.config import ConfigBlock, ConfigValue
from pyomo.common.fileutils import this_file_dir
from pyomo.util.calc_var_value import calculate_variable_from_constraint
from pyomo.contrib.fbbt.fbbt import compute_bounds_on_expr

Expand Down Expand Up @@ -98,6 +102,64 @@ def register_idaes_currency_units():
)


def load_location_factors():
"""
Estimate the cost of constructing the same plant in different geographic regions using location factors.

This method uses a location (or investment site) factor to adjust the total permanent investment (TPI)
based on regional differences in labor costs, workforce efficiency, local regulations and customs,
union status, and other local economic conditions.

Reference:
Seider, Warren D., et al. *Product and Process Design Principles: Synthesis, Analysis, and Evaluation.*
John Wiley & Sons, 2016.

The conversion equation is given by:

.. math::
C_{TPI, corrected} = F_{ISF} \times C_{TPI}

where:
- :math:`C` represents cost,
- :math:`F` represents a factor,
- :math:`TPI` is the total plant investment, and
- :math:`ISF` is the investment site factor (i.e., location factor).

Location factors for 139 countries are sourced from
Compass International, Inc. (2017). 2017 worldwide industrial [Sample edition].
https://www.compassinternational.net/wp-content/uploads/2017/01/Worldwide-Industrial.pdf
(Accessed March 25, 2025).

Location factors for U.S. regions are sourced from Table 16.13 in the Seider reference above. The values
are converted appropriately assuming the base factor of 1.0 corresponds to Washington D.C. and U.S. Northeast.

Note: For some countries, multiple city-specific location factors are provided.
The benchmark location is Washington, D.C., USA.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For clarification, does this imply that the benchmark for country factors, pulled from Compass International, is also Washington, D.C., USA? If not, we might be erroneously mixing factors with different benchmarks

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The factors from Compass International have a benchmark of 1.0 for Washington, D.C., USA and everything else is in relation to that. The regional US factors from Seider were scaled so that Northeast (which is assumed to be the same region as DC) is 1.0.

"""
directory = this_file_dir()
with open(os.path.join(directory, "location_factors.json"), "r") as file:
location_data = json.load(file)

# convert to a dictionary format
location_factors = {}
for item in location_data:
country = item["country"]
city = item["city"]

# create entry if new country, otherwise it already exists
if country not in location_factors:
location_factors[country] = {}

# create entry for city
location_factors[country][city] = {}

# populate min, max, average
for val in ["min", "max", "average"]:
location_factors[country][city][val] = item["location_factor"][val]

return location_factors


class DefaultCostingComponents(StrEnum):
"""
Costing components Enum
Expand Down
Loading
Loading