CO₂ Capture, Utilization & Storage
E4ST.CCUS
— Typestruct CCUS <: Modification
CCUS(;file, groupby, co2_scalar=1e5, co2_step_quantity_limit=1e9)
This is a Modification
that sets up markets for carbon captured by generators.
Keyword Arguments
file
- a file to the table containing markets/prices for buying/selling carbon dioxide. See theccus_paths
table below, orsummarize_table(::Val{:ccus_paths})
groupby
- aString
indicating how markets are grouped. I.e. "state".co2_scalar
- aFloat64
for how much to scale the co2 variables by. This helps with numerical instability, given that some CO₂ steps can be very large and could bloat the RHS and bounds range of the model. A good rule of thumb is that this should be no less than1e4
times smaller thanco2_step_quantity_limit
.co2_step_quantity_limit
- AFloat64
for the maximum quantity of CO₂ that can be stored in any step.
Tables Added
ccus_paths
- contains all the pathways to selling CO₂. The table includes the producing region, the sequstering region and the type of storage, market steps, the quantity available for storage, and the costs of storage and transport.
Table Columns Added
(:ccus_paths, :path_idx)
- the index of this path.(:ccus_paths, :price_total)
- the cost of transporting and storing a short ton of CO₂ in this storage pathway.(:ccus_paths, :stored_co2)
- the amount of CO₂ stored via this storage path, measured in short tons.(:ccus_paths, :storer_cost)
- total storage cost of CCUS via this pathway, from the perspective of the sequesterer.(:ccus_paths, :storer_revenue)
- total revenue earned from storage for CCUS via this pathway. This is the amount paid by the EGU's to the sequesterer, equal to the clearing price minus the transport cost.(:ccus_paths, :storer_profit)
- total profit earned by storing carbon via this pathway, equal to the revenue minus the cost.(:gen, :capt_co2)
- the rate of capture of CO2 (calculated fromemis_co2
andcapt_co2_percent
).(:gen, :ccus_type)
- the type of the step the CO₂ will be sent to (eor
orsaline
).(:gen, :price_capt_co2)
- region-wide clearing price for the generator to pay for the transport and storage of a short ton of captured CO2.(:gen, :price_capt_co2_store)
- region-wide clearing price for the generator to pay for the storage of a short ton of captured CO2.(:gen, :price_capt_co2_trans)
- region-wide clearing price for the generator to pay for the transport of a short ton of captured CO2.
Creates the following tables in data
:
ccus_paths
- contains all pathways possible to sell CO₂.producing_region
- The producing regionstoring_region
- The storing region of the pathwayccus_type
- the type of ccus (eor
orsaline
)step_id
- the number of the step (not very important other than for book-keeping)step_quantity
- the quantity of CO₂ that can be stored in this stepprice_trans
- the cost to transport 1 short ton of CO₂ fromproducing_region
tostoring_region
price_store
- the cost to store 1 short ton of CO₂ in the step
ccus_storers
- contains all the storersstoring_region
- the storing regionstep_id
- the number of the step for the regionccus_type
- whether the step iseor,
saline,
orna
step_quantity
- the number of short tons that may be stored in the stepprice_store
- the price to store a short ton of CO₂.path_idxs
- A list of indices representing the transportation paths to store carbon in this step. Indexes intoccus_paths
table.
ccus_producers
- contains all the producers, grouped byccus_type
andproducing_region
. This contains the following columns:producing_region
- the region the CO₂ will be sent fromccus_type
- the type of the step the CO₂ will be sent to (eor
orsaline
)path_idxs
- A list of indices representing the transportation paths to send carbon from this step. Indexes intoccus_paths
table.gen_idxs
- A list of generator indices that produce CO₂ in this region.
Model Modification:
- Variables
co2_trans[1:nrow(ccus_paths), 1:nyear]
- the amount of captured CO₂ transported to each step along the producer-producer pathway. It is measured in MMT and bounded by [0,max_co2_storage
* 1.1].
- Expressions
cost_ccus_obj[1:nyear]
- the total cost of ccus, as added to the objective function.co2_stor[1:nrow(ccus_storers), 1:nyear]
- the amount of CO₂ stored by each storer (expression ofco2_trans
).co2_sent[1:nrow(ccus_producers), 1:nyear]
- the amount of CO₂ sent out from each sending region (expression ofco2_trans
). This includes CO₂ sent within the same region.co2_prod[1:nrow(ccus_producers), 1:nyear]
- the amount of CO₂ produced by each sending region (expression of electricity generation).
- Constraints
cons_co2_stor[1:nrow(ccus_storers), 1:nyear]
- the CO₂ stored at each injection site must not exceedstep_quantity
cons_co2_bal[1:nrow(ccus_producers), 1:nyear]
- the CO₂ balancing equation for each region, i.e.co2_prod == co2_sent
.
Results Formulas
(:ccus_paths, :stored_co2_total)
- amount of CO₂ stored for the year, measured in short tons.(:ccus_paths, :storer_cost_total)
- the total annual storage cost of CCUS via this pathway, from the perspective of the sequesterer.(:ccus_paths, :storer_revenue_total)
- the total annual revenue earned from CCUS via this pathway. It is the amount paid by the EGUs to the sequesterer, which equals the clearing price minus the transport cost.(:ccus_paths, :storer_profit_total)
- the total annual profit earned by storing carbon via this pathway.(:ccus_paths, :storer_cost_per_short_ton)
- the total storage cost of CCUS per short ton via this pathway, from the perspective of the sequesterer.(:ccus_paths, :storer_revenue_per_short_ton)
- the total revenue earned from CCUS per short ton via this pathway. It is the amount paid by the EGUs to the sequesterer, which equals the clearing price minus the transport cost.(:ccus_paths, :storer_profit_per_short_ton)
- the total profit earned by storing a short ton of CO₂ via this pathway.(:gen, :<name>_cost_capt_co2)
- the total cost paid by generators to transport and store a short ton of captured CO2, computed with the clearing price(:gen, :<name>_price_capt_co2_per_short_ton)
- the average price paid by generators to transport and store a short ton of captured CO2, computed with the clearing price
Example Result Queries
compute_result(data, :gen, :stored_co2_total, :ccus_type=>"eor", "y2030")
compute_result(data, :gen, :cost_capt_co2, :ccus_type=>"eor", yr_idx)
compute_result(data, :gen, :cost_capt_co2_store, :gentype=>"coalccs", yr_idx)
compute_result(data, :gen, :cost_capt_co2_trans, :, yr_idx)
compute_result(data, :ccus_paths, :storer_cost_total, :storing_region=>"narnia")
compute_result(data, :ccus_paths, :storer_revenue_total, :producing_region=>"narnia")
compute_result(data, :ccus_paths, :storer_profit_total, :ccus_type=>"eor")
See also:
E4ST.modify_raw_data!
— Methodmodify_raw_data!(mod::CCUS, config, data) -> nothing
Loads mod.file
into data[:ccus_paths]
. See summarize_table(::Val{:ccus_paths})
for more info.
E4ST.modify_setup_data!
— Methodmodify_setup_data!(mod::CCUS, config, data) -> nothing
Does the following:
- Adds a column for carbon captured,
capt_co2
, based onemis_co2
, andcapt_co2_percent
- reduces
emis_co2
bycapt_co2
- Splits up carbon capturing generators into 2 separate generators - one for "saline" and one for "eor", and adjusts the eor emissions by
config[eor_leakage_rate]
- Add a column for
ccus_type
- either "eor", "saline", or "na" - Adds sets of indices to
data[:ccus_gen_sets]::Vector{Vector{Int64}}
E4ST.modify_model!
— Methodmodify_model!(mod::Modification, config, data, model)
Apply mod to the model, called in setup_model
E4ST.modify_results!
— Methodmodify_results!(mod::CCUS, config, data)
E4ST.summarize_table
— Methodsummarize_table(::Val{:ccus_paths})
column_name | data_type | unit | required | description |
---|---|---|---|---|
producing_region | String | E4ST.NA | true | The name of the producing region (type of regions specified by groupby kwarg of CCUS mod |
storing_region | String | E4ST.NA | true | The name of the sequestering region (type of regions specified by groupby kwarg of CCUS mod |
step_id | Int64 | E4ST.NA | true | The number of this particular market step |
ccus_type | String | E4ST.NA | true | The type of storage. Can be "eor" or "saline" |
step_quantity | Float64 | E4ST.ShortTonsPerYear | true | The annual quantity of CO2 that can be stored in the step |
price_trans | Float64 | E4ST.DollarsPerShortTon | true | The cost of transporting a short ton of CO2 for this producer-storing_region pair |
price_store | Float64 | E4ST.DollarsPerShortTon | true | The cost to store a short ton of CO2 in this storage step |