webber-energy-group / HOwDI

https://howdi.readthedocs.io/en/develop/
GNU General Public License v3.0
0 stars 0 forks source link

Carbon Accounting #19

Closed embeagle closed 2 years ago

embeagle commented 2 years ago

Set up CHEC constraint to sum globally over the entire system such that $\sum CHEC\text{demand} \le \sum CHEC\text{produced}$

for each producer type, $CHEC_{produced}$ is based fractionally compared to the baseline emissions of a standard SMR unit

for each demand type $CHEC_\text{demand}$ is given by carbonSensitiveFraction Do we want to set all new hydrogen demand to be completely carbon sensitive? ie. carbonSensitiveFraction = 1 How much of the existing demand do we want to replace with low carbon hydrogen? iw. carbonSensitiveFraction = what fraction Currently carbonSensitiveFraction is set by demand type (ie. transportationFuel, industrialFuel, or existing and not by hub location, so we can't currently, for example, say that Austin would want a higher fraction of clean hydrogen for transportation than El Paso. Do we want to adjust this? If we decide to set all new hydrogen demand to be only clean hydrogen demand this won't matter

_What is breakevenCarbon_g_MJ?_ NOTE: the breakevenCarbon_g_MJ for existing demand in demand.csv is different from the carbon_g_MJ in production_existing.csv

Carbon accounting in the objective function variables

P_carbon: what producers will play for the carbon emissions from their hydrogen production U_carbon: added utility to the model based on the avoided cost of paying for carbon emissions for each consumer

U_carbon_capture_credit: the tax credit that producers (specifically SMR with CCS) get for capturing and storing carbon (45Q essentially)

Add clean hydrogen production tax credit to model

bradenpecora commented 2 years ago

U_carbon and breakevenCarbon_g_MJ

breakevenCarbon_g_MJ is the carbon rate of the non-hydrogen producers that currently meet that demand (before using hydrogen). The breakeven carbon is converted from g/MJ to tonCO2/tonH2 (?):

# unit conversion 120,000 MJ/tonH2, 1,000,000 g/tonCO2:
 self.carbon_g_MJ_to_t_tH2 = 120000.0 / 1000000.0
...
m.cons_breakevenCarbon = pe.Param(
        m.consumer_set,
        initialize=lambda m, i: g.nodes[i].get("breakevenCarbon_g_MJ", 0)
        * H.carbon_g_MJ_to_t_tH2,
    )

This is used to calculate the utility of a CHEC: $U\text{carbon} = \left ( \sum\text{nodes} CHEC_\text{demand} \text{(TonH2)} breakevenCarbon ( \frac{\text{TonCO2}}{\text{TonH2}} )\right ) carbon \textunderscore price (\frac{Dollar}{TonCO2})$.

I think this framework is intended to give more value to a CHEC when it is utilized by a sector that emits more CO2.

There is currently a constraint over consumer nodes in the model that is the only other instance of breakevenCarbon:

consumer_co2_rate = m.cons_breakevenCarbon[node]
consumption_not_satisfied_by_h2 = m.cons_size[node] - m.cons_h[node]

constraint = (
    m.co2_nonHydrogenConsumer[node]
    == consumption_not_satisfied_by_h2 * consumer_co2_rate
)

which seems to define the pyomo variable m.co2_nonHydrogenConsumer as the amount of carbon produced by demand that was unable to be met by the model. This is the only place this variable appears in the model. It is not in the objective nor in any other constraints. Removing the constraint has no impact on the model solve.