Skip to content
Open
6 changes: 3 additions & 3 deletions core/datainput.gms
Original file line number Diff line number Diff line change
Expand Up @@ -290,9 +290,9 @@ fm_dataglob("inco0", "oae_ng") = fm_dataglob("inco0", "oae_ng") / (cm_33_OAE_eff
fm_dataglob("inco0", "oae_el") = fm_dataglob("inco0", "oae_el") / (cm_33_OAE_eff / sm_c_2_co2);

*** convert inco0, floorcost and omv to REMIND units by applying a factor 0.001
*** category energy technology ccs technology process-based industry
*** input data unit $/kW $/(tC/a) $/(t/a)
*** REMIND unit T$/TW T$/(GtC/a) T$/(Gt/a)
*** category energy technology ccs technology process-based industry weathering
*** input data unit $/kW $/(tC/a) $/(t/a) $/(t rock/a)
*** REMIND unit T$/TW T$/(GtC/a) T$/(Gt/a) T$/(Gt rock/a)
fm_dataglob("inco0",te) = s_DpKW_2_TDpTW * fm_dataglob("inco0",te);
fm_dataglob("floorcost",te) = s_DpKW_2_TDpTW * fm_dataglob("floorcost",te);
fm_dataglob("omv",te) = s_DpKWa_2_TDpTWa * fm_dataglob("omv",te);
Expand Down
2 changes: 1 addition & 1 deletion core/equations.gms
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ q_costOM(t,regi)..
vm_costTeCapital(t,regi,te) * vm_cap(t,regi,te,rlf)
)
)
+ vm_omcosts_cdr(t,regi)
+ vm_EW_transport_costs(t,regi)
;

***---------------------------------------------------------------------------
Expand Down
16 changes: 12 additions & 4 deletions core/input/generisdata_tech.prn
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
*** SOF ./core/input/generisdata_tech.prn
$ontext
tech_stat technology status: how close a technology is to market readiness. Scale: 0-3, with 0 'I can go out and build a GW plant today' to 3 'Still some research necessary'
inco0 Initial investment costs given in $[2015] / kW[output] capacity; for dac/prc cc: $[2015] / (tC[captured]/a); for other indutry prc: $[2015]/(t[output]/a)
inco0 Initial investment costs given in $[2015] / kW[output] capacity; for dac/prc cc: $[2015] / (tC[captured]/a); for other industry prc: $[2015]/(t[output]/a); for weathering: $[2015]/(t rock/a)
floorcost Floor investment costs, given in $[2015] / kW[output]; for dac: $[2015] / (tC[captured]/a)
constrTme Construction time in years, needed to calculate turn-key cost premium compared to overnight costs
lifetime Average lifetime of a technology, given in years. Effective maximum lifetime is longer than that.
Expand Down Expand Up @@ -155,14 +155,14 @@ lifetime 30 30 45 45 45

*** carbon management
+ ccsinjeon ccsinjeoff weathering dac oae_ng oae_el
tech_stat 0 0 4
inco0 350 525 0.01 18800 200 400
tech_stat 0 0 1 4
inco0 350 525 43 18800 200 400
floorcost 4800
constrTme 3 5
lifetime 40 40 20 20 25 25
mix0 1.00 1.00
eta 1.00 1.00 1.00 1.00 1.00 1.00
omf 0.06 0.12 0.84 0.025 0.35 0.17
omf 0.06 0.12 0.59 0.025 0.35 0.17
ccap0 0.0008
learn 0.15

Expand Down Expand Up @@ -303,6 +303,14 @@ Ocean Liming - oae
Costs per tC removed is calculated in the code as it depends on the efficiency (tCO2/tCaO; exogenous):
cost (USD/tC) = inco0 (USD/tCaO) / ( efficiency (tCO2/tCaO) / 3.66 (tCO2/tC) )

Enhanced Rock Weathering - weathering
Parameterization based on Strefler et al (2018) doi.org/10.1088/1748-9326/aaa9c4
annuity factor = 0.08 for lifetime of 20 years and r = 0.05; capacity factor = 0.69
inco0: 5 (USD/t rock) * 0.69 / 0.08 = 43 USD/t rock/a for mining and production
Comment thread
tabeado marked this conversation as resolved.
omf: O&M cost from rock mining & production (25 USD/t rock) and spreading on fields (12 USD/t rock), i.e. 37/(43/0.69) = 0.59
Additional transport cost from mine to field are accounted separately in 33_carbonRemoval depending on distance grade.
To use the upper Capital Cost estimate from Strefler et al, 15 USD/t rock, set inco0 = 129 and omf = 0.2

Gas to Liquids (GtL) Fischer-Tropsch Process - gasftrec/gasftcrec
efficiency eta = 0.60 (0.57 with capture), estimation at higher end of efficiency spectrum
Details in Issue 518/PR 2034
Expand Down
16 changes: 9 additions & 7 deletions main.gms
Original file line number Diff line number Diff line change
Expand Up @@ -1081,15 +1081,17 @@ parameter
*' 5 Gt CO2/yr uptake limit corresponds roughly to CaO being distributed in the upper 2m of the entire (!) EEZ
*' up to the precipitation avoiding concentration limit, assuming average uptake efficiency.
*'

parameter
cm_gs_ew "grain size (for enhanced weathering, CDR module) [micrometre]"
;
cm_gs_ew = 20; !! def = 20 !! regexp = is.numeric
*'
parameter
cm_LimRock "limit amount of rock spread each year [Gt]"
cm_33_EW_rockRemPot "Maximum CO2 removal potential per ton of rock (t CO2 / t rock)."
;
cm_LimRock = 1000; !! def = 1000
cm_33_EW_rockRemPot = 0.3; !! def = 0.3 t CO2 / t basalt
*' Theoretical potential is influenced by the chemical composition of the rock, in particular calcium and magnesium content.
*' * (0.3): 0.3 t CO2 / t basalt is the commonly used average, see e.g. Strefler et al 2018 (SI-A Table A-1)
*' * (0.2-0.4): 0.2 and 0.4 t CO2 / t basalt are a lower and upper bound in Strefler et al 2018 (SI-A Table A-1)
*' The theoretical potential may not be reached due to different loss pathways (dissolution through strong acids;
*' secondary mineral formation (esp. clays); secondary carbonate formation (where carbon retention is only temporary)) which
*' strongly depend on the local soil conditions. Reduction below 50% of the theoretical potential is well possible.
*'
parameter
cm_33_EW_upScalingRateLimit "Annual growth rate limit on upscaling of mining & spreading rocks on fields"
Expand Down
4 changes: 2 additions & 2 deletions modules/33_carbonRemoval/portfolio/bounds.gms
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ vm_co2emi_cdrFE_beforeCapture.fx(t,regi,te_all33)$(not te_ccs33(te_all33)) = 0;
vm_emiCdrTeDetail.fx(t,regi,te_used33)$(t.val lt 2025) = 0.0;
v33_FEdemand.fx(t,regi,entyFe,entyFe2,te_used33)$(fe2cdr(entyFe,entyFe2,te_used33) AND (t.val lt 2025)) = 0.0;
vm_emiCdr.fx(t,regi,"co2")$(t.val lt 2025) = 0;
vm_omcosts_cdr.fx(t,regi)$((t.val lt 2025)) = 0;
vm_EW_transport_costs.fx(t,regi)$((t.val lt 2025)) = 0;
vm_cap.fx(t,regi,"weathering",rlf)$(t.val lt 2025) = 0;
vm_co2emi_cdrFE_beforeCapture.fx(t,regi,te_used33)$(t.val lt 2025) = 0;
v33_co2emi_non_atm_calcination.fx(t,regi,te_oae33)$(t.val lt 2025) = 0;
Expand Down Expand Up @@ -61,7 +61,7 @@ if(te_used33("weathering"),
v33_EW_onfield_tot.fx(ttot,regi,rlf_cz33,rlf)$(ttot.val lt max(2025,cm_startyear)) = 0.0; !!
vm_emiCdrTeDetail.up(ttot,regi,"weathering")$(ttot.val gt 2040) = - sm_eps; !! force some minimum amount of EW to help the solver see it
else
vm_omcosts_cdr.fx(t,regi) = 0;
vm_EW_transport_costs.fx(t,regi) = 0;
vm_cap.fx(t,regi,"weathering",rlf) = 0;
);

Expand Down
25 changes: 10 additions & 15 deletions modules/33_carbonRemoval/portfolio/datainput.gms
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,14 @@ p33_fedem("dac", "fehes") = 21.12; !! FE demand heat for material recovery
*' #### EW input data
*------------------------------------------------------------------------------------
*' @stop
table f33_maxProdGradeRegiWeathering(all_regi,rlf) "regional maximum potentials for enhanced weathering in Gt of grinded stone/a for different grades"
table f33_maxProdGradeRegiWeathering(all_regi,rlf) "regional maximum potentials for enhanced weathering in Gt of ground rock/a for different grades"
$ondelim
$include "./modules/33_carbonRemoval/portfolio/input/f33_maxProdGradeRegiWeathering.cs3r"
$offdelim
;
display f33_maxProdGradeRegiWeathering;

parameter p33_EW_transport_costs(all_regi,rlf,rlf) "transport costs [T$/Gt stone]"
parameter p33_EW_transport_costs(all_regi,rlf,rlf) "transport costs [T$/Gt rock]"
/
$ondelim
$include "./modules/33_carbonRemoval/portfolio/input/p33_transportCostsWeathering.cs4r"
Expand All @@ -34,28 +34,23 @@ $offdelim
;
display p33_EW_transport_costs;

s33_step = 2.5;

*' @code
*' fix costs [T$/Gt stone]. Data from strefler et al. in $/t stone: mining, crushing, grinding (5.0 investment costs, 25.1 O&M costs), spreading (12.1 O&M costs)
s33_costs_fix = 0.0422;
s33_co2_rem_pot = 0.3 * 12/44; !! default for basalt, for Olivine 1.1
s33_rockRemPot = cm_33_EW_rockRemPot / sm_c_2_co2; !! default for basalt is 0.3 t CO2/t rock, for Olivine 1.1 t CO2/t rock. Converted to t C/t rock.
*' Sources for loss pathways that would reduce the total removal potential per ton rock:
*' https://www.carbon-drawdown.de/blog/2026-7-18-where-does-the-co-removal-potential-of-enhanced-weathering-actually-go; https://cdrxiv.org/preprint/417

*' rock weathering rate (i.e. fraction of rock weathering per year) at ambient temperature (25 degree C), based on
*' eq 2 in strefler, amann et al. (2018):
*' wr = grain surface area based weathering rate (10^-10.53 mol m^-2 s^-1) * molar weight of basalt/forsterite (140.7 g/mol)
*' * 3.155^7 s/a * specific surface area(depending on grain size cm_gs_ew)
s33_rock_weath_rate_ambientT = 10**(-10.53) * 125 * 3.155*10**7 * 69.18*(cm_gs_ew**(-1.24));
*' * 3.155^7 s/a * specific surface area(depending on grain size s33_rockGrainSize)
s33_rock_weath_rate_ambientT = 10**(-10.53) * 125 * 3.155*10**7 * 69.18*(s33_rockGrainSize**(-1.24));
*' rock weathering rate for different climate grades: SI Tab F-1 of strefler, amann et al. (2018)
p33_rock_weath_rate("1") = s33_rock_weath_rate_ambientT * 0.94;
p33_rock_weath_rate("2") = s33_rock_weath_rate_ambientT * 0.29;

*' JeS FE demand fit from Thorben: SI D in strefler, amann et al. (2018)
p33_fedem("weathering", "feels") = 6.62 * cm_gs_ew**(-1.16);
p33_fedem("weathering", "fedie") = 0.3;

*' Factor distributing the global rock limit across regions according to population
p33_LimRock(regi) = pm_pop("2005",regi) / sum(regi2,pm_pop("2005",regi2));
p33_fedem("weathering", "feels") = 6.62 * s33_rockGrainSize**(-1.16); !! electricity for grinding of rocks, depends on the grain size.
p33_fedem("weathering", "fedie") = 0.3; !! diesel for spreading rocks on fields using tractors

*' Annual growth rate limit on upscaling of mining & spreading rocks on fields
p33_EW_upScalingLimit(ttot) = cm_33_EW_upScalingRateLimit;
Expand All @@ -64,7 +59,7 @@ p33_EW_upScalingLimit(ttot) = cm_33_EW_upScalingRateLimit;
p33_EW_shortTermEW_Limit(regi) = cm_33_EW_shortTermLimit * sum(rlf, f33_maxProdGradeRegiWeathering(regi, rlf));

*' Narrative switch: what share of cropland can be used for EW?
parameter f33_EW_maxShareOfCropland(ext_regi) "Maximum share of cropland available for enhanced weathering by region" / %cm_33_EW_maxShareOfCropland% /;
parameter f33_EW_maxShareOfCropland(ext_regi) "Maximum share of suitable cropland available for enhanced weathering by region" / %cm_33_EW_maxShareOfCropland% /;
p33_EW_maxShareOfCropland(regi) = 1; !! if no value is assigned to GLO, the default share is set to 100%
p33_EW_maxShareOfCropland(regi) = f33_EW_maxShareOfCropland("GLO"); !! if a value is assigned to GLO, this value is set for all regions
loop(ext_regi$f33_EW_maxShareOfCropland(ext_regi),
Expand Down
16 changes: 7 additions & 9 deletions modules/33_carbonRemoval/portfolio/declarations.gms
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ scalars
*** Multiple options
sm_capture_rate_cdrmodule "CO2 capture rate for CDR energy and process emissions, i.e. fegas use in OAE and DAC and for calcination emissions in oae" / 0.9 /
*** EW
s33_co2_rem_pot "specific carbon removal potential [Gt C per Gt ground rock]"
s33_rockGrainSize "grain size of ground rock, influences electricity demand and weathering rate. By default 20 micrometer based on Strefler et al. (2018) [micrometre]" /20/
s33_rockRemPot "specific carbon removal potential [t C / t rock]"
s33_rock_weath_rate_ambientT "fraction of stone weathering per year at ambient temperature (25 degree C)"
s33_costs_fix "fixed costs for mining, grinding, spreading [T$/Gt stone]"
s33_step "size of bins in v33_weathering_onfield [Gt stone]"
s33_step "size of bins in v33_EW_onfield_tot [Gt rock]" / 2.5 /
*JeS* GJ/tCO2 = EJ/Gt CO2 = 44/12 EJ/Gt C.
*** OAE
s33_OAE_efficiency "the amount of rock required to sequester 1GtC [Gt rock / GtC]"
Expand All @@ -22,9 +22,8 @@ s33_OAE_glo_limit "global limit for OAE [tC / a]"

parameters
*** Multiple options
p33_fedem(all_te,all_enty) "final energy demand of each technology [EJ/GtC] (for EW the unit is [EJ/Gt stone])"
p33_fedem(all_te,all_enty) "final energy demand of each technology [EJ/GtC] (for EW the unit is [EJ/Gt rock])"
*** EW
p33_LimRock(all_regi) "regional share of EW limit [fraction], calculated ex ante for a maximal annual amount of 8 Gt rock in D:\projects\CEMICS\paper_technical\supply_curve_transport_remind_regions.m"
Comment thread
tabeado marked this conversation as resolved.
p33_rock_weath_rate(rlf) "fraction of stone weathering per year depending on climate grade (warm or temperate)"
p33_EW_upScalingLimit(ttot) "Annual growth rate limit on upscaling of mining & spreading rocks on fields"
p33_EW_shortTermEW_Limit(all_regi) "Limit on 2030 potential for enhanced weathering, defined in Gt rocks, based on % of land on which EW is applied"
Expand All @@ -42,7 +41,7 @@ p33_GDP_NetNeg_share(all_regi) "Upper bound on share of expen
;

variables
vm_omcosts_cdr(tall,all_regi) "O&M costs for spreading grinded rocks on fields [T$]"
vm_EW_transport_costs(tall,all_regi) "O&M costs for transporting ground rocks from mines to fields [T$]"
;

positive variables
Expand Down Expand Up @@ -85,11 +84,10 @@ q33_DAC_FEdemand(ttot,all_regi,all_enty) "calculates final energy demand from D
*** EW
q33_EW_capconst(ttot,all_regi) "calculates amount of ground rock spread on fields"
q33_EW_onfield_tot(ttot,all_regi,rlf,rlf) "total amount of ground rock on fields"
q33_EW_omcosts(ttot,all_regi) "calculates O&M costs for spreading ground rocks on fields"
q33_EW_FEdemand(ttot,all_regi,all_enty) "calculates final energy demand from enhanced weathering"
q33_EW_transportCosts(ttot,all_regi) "calculates transport costs for transporting ground rocks from mines to fields"
q33_EW_FEdemand(ttot,all_regi,all_enty) "calculates final energy demand from enhanced weathering for grinding and spreading rocks on fields"
q33_EW_potential(ttot,all_regi,rlf) "limits the total potential of EW per region and grade"
q33_EW_emi(ttot,all_regi) "calculates amount of carbon captured by EW"
q33_EW_LimEmi(ttot,all_regi) "limits EW to a maximal annual amount of ground rock of cm_LimRock"
q33_EW_upscaling_rate(ttot, all_regi) "limits spreading of rock to a steep but credible upscaling rate"
q33_EW_ShortTermBound(ttot,all_regi) "Limits short term potential for enhanced weathering"

Expand Down
22 changes: 6 additions & 16 deletions modules/33_carbonRemoval/portfolio/equations.gms
Original file line number Diff line number Diff line change
Expand Up @@ -154,13 +154,13 @@ q33_EW_emi(t,regi)..
vm_emiCdrTeDetail(t,regi, "weathering")
=e=
sum((rlf_cz33, rlf),
- v33_EW_onfield_tot(t,regi,rlf_cz33,rlf) * s33_co2_rem_pot * p33_rock_weath_rate(rlf_cz33)
- v33_EW_onfield_tot(t,regi,rlf_cz33,rlf) * s33_rockRemPot * p33_rock_weath_rate(rlf_cz33)
)
;

***---------------------------------------------------------------------------
*' Calculation of FE demand for enhanced weathering, i.e., electricity demand for grinding,
*' and the diesel demand for transportation and spreading on crop fields.
*' and the diesel demand for spreading rocks on crop fields.
***---------------------------------------------------------------------------
q33_EW_FEdemand(t,regi,entyFe2)$sum(entyFe, fe2cdr(entyFe,entyFe2,"weathering"))..
sum(fe2cdr(entyFe,entyFe2,"weathering"), v33_FEdemand(t,regi,entyFe,entyFe2,"weathering"))
Expand All @@ -169,13 +169,13 @@ q33_EW_FEdemand(t,regi,entyFe2)$sum(entyFe, fe2cdr(entyFe,entyFe2,"weathering"))
;

***---------------------------------------------------------------------------
*' O&M costs of EW, consisting of fix costs for mining, grinding and spreading, and transportation costs.
*' Transport cost for rocks from mine to field
***---------------------------------------------------------------------------
q33_EW_omcosts(t,regi)..
vm_omcosts_cdr(t,regi)
q33_EW_transportCosts(t,regi)..
vm_EW_transport_costs(t,regi)
=e=
sum((rlf_cz33, rlf),
(s33_costs_fix + p33_EW_transport_costs(regi,rlf_cz33,rlf)) * v33_EW_onfield(t,regi,rlf_cz33,rlf)
(p33_EW_transport_costs(regi,rlf_cz33,rlf)) * v33_EW_onfield(t,regi,rlf_cz33,rlf)
)
;

Expand All @@ -189,16 +189,6 @@ q33_EW_potential(t,regi,rlf_cz33)..
;


***---------------------------------------------------------------------------
*' An annual limit for the maximum global amount of rocks spread [Gt] can be set via cm_LimRock,
*' e.g. due to sustainability concerns.
***---------------------------------------------------------------------------
q33_EW_LimEmi(t,regi)..
sum((rlf_cz33, rlf), v33_EW_onfield(t,regi,rlf_cz33,rlf))
=l=
cm_LimRock * p33_LimRock(regi)
;

***---------------------------------------------------------------------------
*' Short term bound on spreading of rock
***---------------------------------------------------------------------------
Expand Down
17 changes: 12 additions & 5 deletions modules/33_carbonRemoval/portfolio/realization.gms
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,15 @@
*' low-temperature heat demand. The heat can be provided via district heat, electricity, gas, or H2. If gas is used,
*' the resulting CO2 is captured with a capture rate of 90%.
*'
*' (EW) Basalt is mined and ground to fine grain sizes (specified in cm_gs_ew, by default 20 µm), and then spread
*' (EW) Basalt is mined and ground to fine grain sizes (default 20 µm), and then spread
*' on crop fields where it weathers in reaction with water and atmospheric CO2. Electricity is needed to grind the
*' rocks and diesel is needed for transportation and spreading on crop fields. The weathering process leads to an exponential
*' rocks and diesel is needed for spreading on crop fields. Transport costs from mine to fields depend on distance grades.
*' In addition, capital cost for mining and production, and O&M cost for mining and distribution on fields are added.
*' The amount of rock that can be spread on fields is limited by the maximum potential for enhanced weathering,
*' which depends on the region and climate grade. The weathering process leads to an exponential
*' decay over time of the spread rocks. There is an upper limit on the amount of rock that can be on the fields, so that
*' in equilibrium only the part that decays in one timestep can be replaced in the next. In addition, an arbitrary
*' limit of the amount of rock spread each year can be set in cm_LimRock. Costs consist of costs for capital, O&M,
*' distribution and transport (grades depend on region specific transport distance from mine to fields).
*' in equilibrium only the part that decays in one timestep can be replaced in the next. The share of suitable fields that can be
*' used for spreading rocks can be adjusted via cm_33_EW_maxShareOfCropland.
*'
*' (OAE) Ocean alkalinity enhancement via ocean liming draws down CO2 from the atmosphere by adding (hydrated) lime
*' to the coastal or open ocean. Calcination process, which involves heating limestone to typically around 900-1000°C,
Expand All @@ -35,6 +37,11 @@
*' material).
*'
*' Equations for each option determine the capacity, emissions, energy demand, costs and limits.

*' (Overarching) This module further limits the amount of final energy that can be used for CDR technologies (via cm_33_maxFeShare),
*' and the share of GDP that can be spent on net negative emissions (via cm_33_GDP_netNegCDR_maxShare). It also contains
*' the biochar material value price assumption and revenue calculation.

***----------------------------------------------------

*####################### R SECTION START (PHASES) ##############################
Expand Down
Loading