119 double input_cost_per_unit = 0.0)
const {
126 double initial_investment;
127 double facility_lifetime;
128 double levelized_fixed_costs;
129 double levelized_variable_costs;
130 double property_and_insurance_rate;
131 double tax_modified_rate_of_return;
132 double income_tax_rate;
134 double bond_fraction;
135 double shareholder_rate;
136 double shareholder_fraction;
141 initial_investment = GetEconParameter(
"capital_cost");
142 facility_lifetime = GetEconParameter(
"facility_depreciation_lifetime");
150 levelized_fixed_costs = GetEconParameter(
"annual_operations_and_maintenance");
151 levelized_variable_costs = GetEconParameter(
"annual_labor_cost");
153 }
catch (
const std::exception& e) {
155 << prototype() <<
"failed to get facility financial_data_: " << e.what();
156 return kDefaultUnitCost;
161 income_tax_rate = parent()->GetEconParameter(
"corporate_income_tax_rate");
162 bond_rate = parent()->GetEconParameter(
"bond_holders_rate_of_return");
163 bond_fraction = parent()->GetEconParameter(
"fraction_bond_financing");
164 shareholder_rate = parent()->GetEconParameter(
"share_holders_rate_of_return");
165 shareholder_fraction = parent()->GetEconParameter(
"fraction_private_capital");
166 }
catch (
const std::exception& e) {
169 <<
"failed to get institution financial_data_: " << e.what();
170 return kDefaultUnitCost;
175 double property_tax_rate = parent()->parent()->GetEconParameter(
"property_tax_rate");
177 }
catch (
const std::exception& e) {
179 << prototype() <<
"failed to get region financial_data_: " << e.what();
180 return kDefaultUnitCost;
184 double timesteps_per_year =
cyclusYear / context()->dt();
185 double units_produced_annually = production_capacity * timesteps_per_year;
188 tax_modified_rate_of_return = (1 - income_tax_rate) * bond_rate * bond_fraction + shareholder_rate * shareholder_fraction;
191 double fixed_cost_per_unit = levelized_fixed_costs / units_produced_annually;
192 double capital_investment_per_unit = initial_investment / units_produced_annually;
194 double depreciation_tax_shield = income_tax_rate / (1.0 - income_tax_rate) / facility_lifetime;
195 double capital_recovery_factor = PMT(facility_lifetime, tax_modified_rate_of_return, 1.0, 0.0) / (1.0 - income_tax_rate);
196 double capital_cost_per_unit = capital_investment_per_unit * (property_and_insurance_rate + capital_recovery_factor - depreciation_tax_shield);
197 double production_cost = fixed_cost_per_unit + levelized_variable_costs + capital_cost_per_unit;
200 double unit_cost = production_cost + input_cost_per_unit;
203 return unit_cost != 0 ? unit_cost : kDefaultUnitCost;
const uint64_t cyclusYear
double CalculateUnitCost(double production_capacity, double units_to_produce, double input_cost_per_unit=0.0) const
Calculates the levelized unit cost of production, accounting for capital depreciation,...
#define LOG(level, prefix)
allows easy logging via the streaming operator similar to std::cout; this is the primary way to use t...