def calcGHGImpact(tl_array): jet_a_out = UF.returnPintQty(tl_array, [[UF.substance_name, 'Jet-A'], [UF.input_or_output, D.tl_output]]).magnitude diesel_out = UF.returnPintQty( tl_array, [[UF.substance_name, 'Diesel'], [UF.input_or_output, D.tl_output]]).magnitude gasoline_out = UF.returnPintQty( tl_array, [[UF.substance_name, 'Gasoline'], [UF.input_or_output, D.tl_output]]).magnitude transport_fuel_energy = 46.0 * (jet_a_out + diesel_out + gasoline_out) # note that excel formula has a few others. zero for grass so omitting. total_MJ = transport_fuel_energy + UF.returnPintQty( tl_array, [[UF.substance_name, 'Electricity'], [UF.input_or_output, D.tl_output]]).magnitude GHG_impact = 0 for i in range(len(tl_array)): row_vals = tl_array.loc[i] subst_name = row_vals[UF.substance_name] in_or_out = row_vals[UF.input_or_output] mag = row_vals[UF.magnitude] if in_or_out != D.zeroed: match_list = [[D.LCA_key_str, subst_name], [D.LCA_IO, in_or_out]] LCA_val = UF.returnLCANumber(D.LCA_inventory_df, match_list, D.LCA_GHG_impact) GHG_impact += (LCA_val * mag) return 75 + GHG_impact / total_MJ
def convertGrassBiomass(size, biomass_IO_array): return_array = UF.createEmptyFrame() forestry_vals = forestry_cited_values_dict forestry_out = forestry_out_vals in_list = conv_in_list out_list = conv_out_list match_list = [[UF.input_or_output, D.tl_output], [UF.substance_name, 'Woody Biomass']] grass_biomass_out_qty = UF.returnPintQty(biomass_IO_array, match_list) scaling_param = size.qty * (grass_biomass_out_qty/ (size.qty * D.forestry_woody_biomass_val.qty)) # special write of woody biomass return_array.loc[0] = UF.getWriteRow('Woody Biomass', D.conv, D.tl_input, grass_biomass_out_qty) row_count = 1 for substance in in_list: pint_qty = scaling_param*forestry_vals[substance].qty return_array.loc[row_count] = UF.getWriteRow(substance, D.conv, D.tl_input, pint_qty) row_count += 1 for substance in out_list: pint_qty = scaling_param*forestry_out[substance].qty return_array.loc[row_count] = UF.getWriteRow(substance, D.conv, D.tl_output, pint_qty) row_count += 1 return return_array
def upgradeGrassProducts(size, conv_IO_array): return_array = UF.createEmptyFrame() forestry_vals = forestry_upgr_in forestry_out = forestry_upgr_out in_list = upgr_in_list out_list = upgr_out_list match_list = [[UF.input_or_output, D.tl_output], [UF.substance_name, 'Woody Biomass']] grass_biomass_out_qty = UF.returnPintQty(conv_IO_array, match_list) scaling_param = size.qty * (grass_biomass_out_qty / (size.qty * D.forestry_woody_biomass_val.qty)) row_count = 0 for substance in in_list: pint_qty = scaling_param * forestry_vals[substance].qty return_array.loc[row_count] = UF.getWriteRow(substance, D.upgrading, D.tl_input, pint_qty) row_count += 1 for substance in out_list: pint_qty = scaling_param * forestry_out[substance].qty return_array.loc[row_count] = UF.getWriteRow(substance, D.upgrading, D.tl_output, pint_qty) row_count += 1 return return_array
def calc_MFSP(tl_array): capex_qty = UF.returnPintQty(tl_array, [[UF.substance_name, 'Capital Cost']]) land_cost_qty = UF.returnPintQty( tl_array, [[UF.substance_name, 'Land Capital Cost']]) capex = capex_qty.magnitude + land_cost_qty.magnitude #inputs ['capex'] labor = UF.returnPintQty(tl_array, [[UF.substance_name, 'Labor']]).magnitude #calculating total costs for inputs to the pathway (opex) opex = calcOPEX(tl_array) #Economic analysis variables ecovar = { 'disc rate': 0.1, 't': 0.2, 'equity': 0.4, 'interest': 0.08, 'loan term': 10, 'maint rate': 0.03, 'ins rate': 0.01, 'land lease': 0, 'dep capex': 0.85 } macrs = [0.143, 0.245, 0.175, 0.125, 0.089, 0.089, 0.089, 0.045] ###yrs = input('What is the project lifespan? ') landcapex = land_cost_qty.magnitude #Total depreciable investment depinv = capex_qty.magnitude * ecovar['dep capex'] #Investment-loan share invloanshare = capex * (1 - ecovar['equity']) #Loan annual payment loanannpay = capex * (1 - ecovar['equity']) * ecovar['interest'] * ( 1 + ecovar['interest'])**ecovar['loan term'] / ( (1 + ecovar['interest'])**ecovar['loan term'] - 1) #Investment-equity share invequityshare = capex * (ecovar['equity']) #Salvage value end of life salvage = landcapex #Annual insurance annins = depinv * ecovar['ins rate'] #Annual maintenance annmaint = depinv * ecovar['maint rate'] #Annual material and energy costs = opex, Annual labor costs = labor #Fixed operating costs in $/yr fopex = annins + annmaint + opex + labor #creating MACRS list with zeros at the end to match duration of project depyrs = len(macrs) dif = int(yrs) - depyrs if dif > 0: addzero = [0] * dif macrs.extend(addzero) depreciation = [] i = 0 #calculating depreciation of depreciable investment in each year while i < len(macrs): depreciation.append(depinv * macrs[i]) i += 1 i = 0 #calculating loan payment, interest, and principle for each time step loanpay = [] loanint = [] loanprin = [] while i < int(ecovar['loan term']): loanpay.append(loanannpay) if i == 0: loanint.append(invloanshare * ecovar['interest']) loanprin.append(invloanshare - loanpay[i] + loanint[i]) else: loanint.append(loanprin[i - 1] * ecovar['interest']) loanprin.append(loanprin[i - 1] - loanpay[i] + loanint[i]) i += 1 #adding zeros to the end of loan payment, interest, and principle for duration of project dif = int(yrs) - len(loanprin) if dif > 0: addzero = [0] * dif loanpay.extend(addzero) loanint.extend(addzero) loanprin.extend(addzero) result = s_opt.minimize_scalar(lambda price_per_MJ: NPV_goal( price_per_MJ, fopex, depreciation, loanint, ecovar, invequityshare, loanpay, tl_array)) return result.x * 152.79288
def NPV_goal(price_per_MJ, fopex, depreciation, loanint, ecovar, invequityshare, loanpay, tl_array): jet_a_out = UF.returnPintQty(tl_array, [[UF.substance_name, 'Jet-A'], [UF.input_or_output, D.tl_output]]).magnitude diesel_out = UF.returnPintQty( tl_array, [[UF.substance_name, 'Diesel'], [UF.input_or_output, D.tl_output]]).magnitude gasoline_out = UF.returnPintQty( tl_array, [[UF.substance_name, 'Gasoline'], [UF.input_or_output, D.tl_output]]).magnitude transport_fuel_energy = 46.0 * (jet_a_out + diesel_out + gasoline_out) nonfuel_value = calcNonFuelValue(tl_array) annrevenue = nonfuel_value + price_per_MJ * transport_fuel_energy #calculating total annual revenue from annual fuel revenue and co product revenue # for key in prodcost: # if key in prodcost and key in outputs: # annrevenue += prodcost [key] * outputs[key] #calculating net income netincome = [] years = int(yrs) i = 0 while i < years: netincome.append(annrevenue - fopex - depreciation[i] - loanint[i]) i += 1 #calculating losses forward and taxable income lossforward = [] taxincome = [0] i = 0 while i < years: if taxincome[i] < 0: lossforward.append(taxincome[i]) else: lossforward.append(0) taxincome.append(lossforward[i] + netincome[i]) i += 1 taxincome.pop(0) #calculating income tax i = 0 incometax = [] while i < years: if taxincome[i] < 0: incometax.append(0) else: incometax.append(taxincome[i] * ecovar['t']) i += 1 # calculating cash flow cashflow = [-invequityshare] i = 1 while i < years + 1: cashflow.append(annrevenue - fopex - loanpay[i - 1] - incometax[i - 1]) i += 1 # calculating discounted cash flow disccashflow = [] i = 0 while i < years + 1: disccashflow.append(cashflow[i] / (1 + ecovar['disc rate'])**i) i += 1 # calculating cumulative discounted cash flow cumdisccashflow = [disccashflow[0]] i = 1 while i < years + 1: cumdisccashflow.append(cumdisccashflow[i - 1] + disccashflow[i]) i += 1 # NPV retrieval from cumulative discounted cash flow npv = cumdisccashflow return abs(npv[-1])