Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
def main():
    land_area_val = D.TEA_LCA_Qty('Land Area', 100, 'hectare')
    biomass_output = D.TEA_LCA_Qty('Woody Biomass', 8960, 'kg/yr/ha')
    biomass_IO_array = UF.createEmptyFrame()
    biomass_IO_array.loc[0] = UF.getWriteRow('Woody Biomass', D.biomass_production, 
                                      D.tl_output, biomass_output.qty*land_area_val.qty)
    return convertGrassBiomass(land_area_val, biomass_IO_array)
Ejemplo n.º 3
0
def growGrassForOneYear(size, biomass_output):
    return_array = UF.createEmptyFrame()

    crop_inputs = grass_inputs_dict
    crop_outputs = grass_outputs_dict

    # Calculate Atmospheric CO2 based on biomass output
    return_array.loc[0] = UF.getWriteRow(
        'Atmospheric CO2', D.biomass_production, D.tl_input,
        biomass_output.qty * size.qty * D.CO2_fixing_proportion_grass.qty)

    # special write of woody biomass
    return_array.loc[1] = UF.getWriteRow('Woody Biomass', D.biomass_production,
                                         D.tl_output,
                                         biomass_output.qty * size.qty)

    row_count = 2
    # Scale crop inputs
    for key in crop_inputs:
        pint_qty = size.qty * crop_inputs[key].qty
        return_array.loc[row_count] = UF.getWriteRow(key, D.biomass_production,
                                                     D.tl_input, pint_qty)
        row_count += 1

    # Scale crop outputs
    for key in crop_outputs:
        pint_qty = size.qty * crop_outputs[key].qty
        return_array.loc[row_count] = UF.getWriteRow(key, D.biomass_production,
                                                     D.tl_output, pint_qty)
        row_count += 1

    return return_array
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
def calcOPEX(tl_array):
    inputs_cost = 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_cost)
            if in_or_out == D.tl_input:
                inputs_cost += (LCA_val * mag)

    return inputs_cost
Ejemplo n.º 7
0
def calcNonFuelValue(tl_array):
    outputs_value = 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_cost)
            if in_or_out == D.tl_output and (subst_name != 'Jet-A'
                                             and subst_name != 'Diesel'
                                             and subst_name != 'Gasoline'):
                outputs_value += (LCA_val * mag)

    return outputs_value
Ejemplo n.º 8
0
def calcEROI(tl_array):
    energy_investment = 0
    energy_return = 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_energy_impact)
            if in_or_out == D.tl_input:
                energy_investment += (LCA_val * mag)
            else:
                energy_return += (LCA_val * mag)

    eroi = 0
    try:
        eroi += energy_return / energy_investment
    except:
        print('Divide by zero error')
    return eroi
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
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])
Ejemplo n.º 11
0
# Data and Universal Functions
import TEA_LCA_Data as D
import UnivFunc as UF

# Bolt on TEA and LCA
import TEA
import LCA

# Process steps
import Grow_Grass as GG
import GasFT as GFT
import Hydroprocessing as H

# Initialize empty Process Model output table
results_array = UF.createEmptyFrame()

# Scaling Value
land_area_val = D.TEA_LCA_Qty(D.substance_dict['Land Area'], 100, 'hectare')

biomass_output = D.TEA_LCA_Qty(D.substance_dict['Woody Biomass'], 8960,
                               'kg/yr/ha')

# Biomass Production
biomass_IO = GG.growGrassForOneYear(land_area_val, biomass_output)
results_array = results_array.append(biomass_IO, ignore_index=True)

# Extraction/Conversion
conversion_IO = GFT.convertGrassBiomass(land_area_val, results_array)
results_array = results_array.append(conversion_IO, ignore_index=True)

# Upgrading