costing_tools_diesel_tmp.py
# Import packages
import pandas as pd
import numpy as np
import scipy as scipy
from scipy import integrate
import os, io
import matplotlib.pyplot as plt
new_rc_params = {'text.usetex': False,
"svg.fonttype": 'none'
}
plt.rcParams.update(new_rc_params)
from google.colab import files
from scipy.optimize import curve_fit
from operator import add
VMT=np.array([108000,120000,114000,105000,92000,81000,74000,67000,59000,52000]) #Vehicle miles traveled per year. Source: Burnham, A et al. (2021)
discountrate=0.07 #discount rate
parameters = share_parameters(VMT, discountrate)
####***Passing input parameters to all classes****####
class share_parameters:
def __init__(self,VMT, discountrate):
self.VMT = VMT
self.discountrate=discountrate
class cost:
def __init__(self, parameters):
self.parameters = parameters
def get_capital(self, capital_cost_unit, discountfactor):
capital = capital_cost_unit['glider ($)'] + capital_cost_unit['aftertreatment ($)'] + capital_cost_unit['engine ($)'] + capital_cost_unit['transmission ($)'] + capital_cost_unit['fuel tank ($)'] + capital_cost_unit['WHR ($)']
total_CAPEX= capital/self.parameters.VMT.sum()
return total_CAPEX #in $ per mile
def get_operating(self, fuel_economy, operating_cost_unit, diesel_unit, total_CAPEX,discountfactor):
diesel = (diesel_unit/fuel_economy['Fuel economy (mpg)'])*np.sum(self.parameters.VMT* discountfactor)/self.parameters.VMT.sum()
labor = operating_cost_unit['labor ($/mi)']*np.sum(self.parameters.VMT* discountfactor)/self.parameters.VMT.sum()
others_opex = (operating_cost_unit['maintenance & repair ($/mi)']+ operating_cost_unit['misc ($/mi)'] + operating_cost_unit['insurance ($/mi)'])*np.sum(self.parameters.VMT* discountfactor)/self.parameters.VMT.sum()
total_OPEX= diesel + labor + others_opex
return total_OPEX, diesel, labor, others_opex #in $ per mile
def get_penalty_emissions(self, fuel_economy, GHG_emissions, SCC):
#Given that future SCC are quite uncertain and that SCC are already in present value, we did not apply discounted cash flow for this cost component
GHG_emissions['GHGs total (gCO2/mi)']= GHG_emissions['GHGs PTW (gCO2/gal)']/fuel_economy['Fuel economy (mpg)']+GHG_emissions['GHGs WTP (gCO2/mi)']
penalty_emissions= GHG_emissions['GHGs total (gCO2/mi)']*SCC/1000000 #convert ton CO2
print(GHG_emissions['GHGs total (gCO2/mi)'])
return penalty_emissions #in $ per mile
def get_TCS(self, capital_cost_unit, fuel_economy, operating_cost_unit, diesel_unit, GHG_emissions, SCC):
costs_total = pd.DataFrame(columns = ['Total capital ($/mi)', 'Total operating ($/mi)', 'Total fuel ($/mi)', 'Total labor ($/mi)', 'Other OPEXs ($/mi)', 'GHGs emissions penalty ($/mi)', 'TCS ($/mi)'])
discountfactor=1/np.power(1+self.parameters.discountrate,np.linspace(0,9,10)) #life time of trucks is 10 years
costs_total['Total capital ($/mi)']= cost(parameters).get_capital(capital_cost_unit,discountfactor)
costs_total[ 'Total operating ($/mi)'], costs_total['Total fuel ($/mi)'], costs_total['Total labor ($/mi)'], costs_total['Other OPEXs ($/mi)']= cost(parameters).get_operating(fuel_economy, operating_cost_unit, diesel_unit, costs_total['Total capital ($/mi)'], discountfactor)
costs_total['TCS ($/mi)'] = costs_total['Total capital ($/mi)'] + costs_total[ 'Total operating ($/mi)']
return costs_total #in $ per mile
####****Input parameters for capital and operating unit costs****####
capital_cost_unit= pd.DataFrame({'glider ($)': [95000, 95000, 95000], 'aftertreatment ($)': [5782.4, 7296.95, 9117.98], 'engine ($)': [12117.16, 16244.6, 17981.16],
'transmission ($)': [10250, 10250, 10250], 'fuel tank ($)': [2120, 2120, 2120], 'WHR ($)': [0, 5900, 5900]})
operating_cost_unit = pd.DataFrame({'maintenance & repair ($/mi)': [0.143, 0.143, 0.143], 'labor ($/mi)': [0.693, 0.693, 0.693],
'insurance ($/mi)': [0.068, 0.068,0.068], 'misc ($/mi)': [0.057,0.057,0.057]})
diesel_unit=[2.5, 2.73, 3.13]; #USD/gallon
SCC=[51, 62, 85] #social cost of carbon in $/ton CO2. Source: https://www.whitehouse.gov/wp-content/uploads/2021/02/TechnicalSupportDocument_SocialCostofCarbonMethaneNitrousOxide.pdf
fuel_economy = pd.DataFrame({'Fuel economy (mpg)': [7.5100, 9.5919, 10.4639]})
GHG_emissions = pd.DataFrame({'GHGs WTP (gCO2/mi)':[149.7, 117.2, 107.4], 'GHGs PTW (gCO2/gal)': [10190, 10190, 10190]})
TCS=cost(parameters).get_TCS(capital_cost_unit, fuel_economy, operating_cost_unit, diesel_unit, GHG_emissions, SCC)
TCS.head() #TCS in $/mi