Zero Order Costing Package

The zero order costing module contains the costing package used for zero order models. Technoeconomic data used for zero order models is contained in the .yaml file for that model located in the data/techno_economic folder.


The ZeroOrderCosting class contains all the variables and constraints needed to cost a unit model derived from the Zero Order Unit Model Base Class.

The code below shows an outline of how the ZeroOrderCostingData class is intended to be used to cost zero-order type models.

from pyomo.environ import ConcreteModel

from idaes.core import FlowsheetBlock

from watertap.core.zero_order_costing import ZeroOrderCosting
from watertap.core.wt_database import Database
from watertap.core.zero_order_properties import WaterParameterBlock
from watertap.unit_models.zero_order import MyZOUnit

m = ConcreteModel()
m.db = Database()
m.fs = FlowsheetBlock(dynamic=False)
m.fs.params = WaterParameterBlock(solute_list=["comp_a", "comp_b", "comp_c"])
m.fs.costing = ZeroOrderCosting()
m.fs.unit = MyZOUnit(property_package=m.fs.params, database=m.db)

# Add necessary statements to fix component flows prior to solve

Costing Zero Order Models

The ZeroOrderCostingData class includes variables and constraints necessary to calculate process-wide costs:





Total capital cost



Total capital cost

Unit capital cost



Unit process capital cost

Total operating cost



Total operating cost for unit process

Total fixed operating cost



Total fixed operating cost for unit process

Total variable operating cost



Total variable operating cost for unit process

Land cost



Cost of land for unit process

Working capital cost



Working capital for unit process

Salary cost



Salary cost for unit process

Benefits cost



Benefits cost for unit process

Maintenance cost



Maintenance cost for unit process

Laboratory cost



Laboratory cost for unit process

Insurance & taxes cost



Insurance & taxes for unit process

Calculations for each of these costs are presented below.

Costing Index and Technoeconomic Factors

Costing indices are available in default_case_study.yaml located in the data/techno_economic folder.

WaterTAP uses the Consumer Price Index (CPI) to help account for the time-value of investments and are used in the capital and operating cost calculations. Unit process capital costs are adjusted to the year of the case study. The default year is 2018.

Other technoeconomic factors used to calculate various system metrics, capital, and operating costs are presented in the table below:

Cost factor



Default Value


Plant capacity utilization factor




Percentage of year plant is operating

Plant lifetime



30 yr

Expected lifetime of unit process

Electricity price




Electricity price in 2019 USD.

Land cost factor




Unit process land cost as percentage of capital cost

Working capital cost factor




Unit process working capital cost as percentage of capital cost

Salaries cost factor




Unit process salaries cost as percentage of capital cost

Maintenance cost factor




Unit process maintenance costs as percentage of capital cost

Lab cost factor




Unit process laboratory costs as percentage of capital cost

Insurance/taxes cost factor




Unit process insurance & taxes cost as percentage of capital cost

Benefits cost factor




Unit process benefits cost as percentage of salary costs

Weighted average cost of capital factor




Weighted average cost of capital over plant lifetime

Capital recovery factor




Calculated from default \(f_{WACC}\) and \(L\) values

The capital recovery factor is calculated with:

\[f_{crf} = \frac{ f_{wacc} (1 + f_{wacc}) ^ L}{ (1 + f_{wacc}) ^ L - 1}\]

Capital Cost Calculations

In general, unit process capital costs \(C_{ZO,u}\) for zero order unit models are a function of flow:

\[C_{ZO,u} = A \bigg( \frac{Q_{in}}{Q_{basis}} \bigg) ^ {B}\]

\(Q_{basis}\), \(A\), and \(B\) are specific to the unit model and can be found in the unit model .yaml file. The \(A\) value has units of USD for the costing reference year of the unit. For example, if the unit costing model is from a reference that used 2015 USD, the units for \(A\) are USD_2015. After calculating the costs in 2015 USD, WaterTAP adjusts the cost to the user-specified year via the Consumer Price Index.

The total capital cost of a zero order model \(C_{ZO,tot}\) includes the land cost \(C_{land}\) and working capital costs \(C_{work}\):

\[C_{ZO,tot} = C_{ZO,u} + C_{land} + C_{work}\]


\[\begin{split}& C_{land} = f_{land} C_{ZO,u} \\\\ & C_{work} = f_{work} C_{ZO,u}\end{split}\]

Custom Capital Cost Methods

There are several zero order models that have costing relationships that do not follow this general form. If that is the case, a custom costing method can be added to this base class to perform that calculation.

Zero order models that have custom capital costing methods include:

  • Brine concentrator - cost_brine_concentrator()

  • CANDOP - cost_CANDOP()

  • Chemical addition - cost_chemical_addition()

  • Chlorination - cost_chlorination()

  • Coagulation/Flocculation - cost_coag_and_floc()

  • Deep well injection - cost_deep_well_injection()

  • DMBR - cost_dmbr()

  • Electrochemical nutrient removal - cost_electrochemical_nutrient_removal()

  • Evaporation pond - cost_evaporation_pond()

  • Filter press - cost_filter_press()

  • Fixed bed - cost_fixed_bed()

  • GAC - cost_gac()

  • Landfill - cost_landfill()

  • MABR - cost_mabr()

  • Ion exchange - cost_ion_exchange()

  • Iron/Manganese removal - cost_iron_and_manganese_removal()

  • Metab - cost_metab()

  • Nanofiltration - cost_nanofiltration()

  • Ozone - cost_ozonation()

  • Ozone + AOP - cost_ozonation_aop()

  • Photothermal membrane - cost_photothermal_membrane()

  • Sedimentation - cost_sedimentation()

  • Storage tank - cost_storage_tank()

  • Surface discharge - cost_surface_discharge()

  • UV irradiation - cost_uv()

  • UV + AOP - cost_uv_aop()

  • Well field - cost_well_field()

To add a custom capital calculation method, the unit module class must be part of the import statement at the top of this file and there must be an entry in the unit_mapping dictionary that maps the unit model class to the costing method. Convention is to name the method cost_unit_class_name without the “ZO” at the end of the class. For example, if the unit model class is MyUnitZO, the custom cost method would be cost_my_unit and MyUnitZO: cost_my_unit would be an entry in the unit_mapping dictionary found in this file.

Operating Cost Calculations

Total operating costs for zero order models \(C_{op,tot}\) include fixed \(C_{op,fix}\) and variable operating costs \(C_{op,var}\):

\[C_{op,tot} = C_{op,fix} + C_{op,var}\]

The total fixed operating costs are calculated as:

\[C_{op,fix} = C_{sal} + C_{ben} + C_{maint} + C_{lab} + C_{ins}\]


\[\begin{split}& C_{sal} = f_{sal} C_{ZO,u} \\\\ & C_{ben} = f_{ben} C_{sal} \\\\ & C_{maint} = f_{maint} C_{ZO,u} \\\\ & C_{lab} = f_{lab} C_{ZO,u} \\\\ & C_{ins} = f_{ins} C_{ZO,u}\end{split}\]

Variable operating costs include any chemical additions, electricity costs, and other variable costs such as equipment replacements.

\[C_{op,var} = C_{chem} + C_{elec} + C_{other} + C_{op,tot}\]

Chemical costs are based on the chemical dosage for a given chemical addition. Default chemical costs are found in default_case_study.yaml. The annual chemical costs are calculated as:

\[C_{chem} = \sum_{k}^{n} D_k C_k Q_{in} f_{util}`\]

Where \(D\) is the dose of chemical \(k\) and \(C\) is the unit cost of chemical \(k\).

Electricity costs \(C_{elec}\) are based on the energy intensity \(E\) of the unit process (see individual unit model documentation for details). The annual electricity costs are calculated as:

\[C_{elec} = E Q_{in} f_{util} P\]

LCOW Calculation

The Levelized Cost Of Water (LCOW) [$/m3] is a metric used to assess the technoeconomics of a unit process:

\[LCOW = \frac{ f_{crf} C_{ZO,tot} + C_{op,tot} }{Q f_{util} }\]

Class Documentation