Understanding the Direct Air Capture (DAC) Module

Direct Air Capture (DAC) module simulates energy consumption, emissions, and carbon sequestration of direct air capture devices for each modeled year. Demand and emission values from this module can be found in the "Direct Air Capture" economic sector in the model results. Reduction in carbon emissions from running DAC devices can be also be seen in the overall GHG inventory totals. 

Multiple DAC technologies are simulated, allowing for each technology to have its own characteristics. A DACTech set stores the different types of DAC technologies which are listed in the table below.

No.

DACTech Descriptor

DACTech Key

1

KOH-Ca Looping

KOHLoop

2

KOH BPMED

KOHBPMED

3

Solid Sorbent

SSorbent

4

MgO Ambient Weathering

AmbientW

5

Liquid H2

LiquidH2

6

Liquid NG

LiquidNG

7

Solid H2

SolidH2

8

Solid NG

SolidNG

Code for the DAC module is contained in Engine\DirectAirCapture.jl. Input data required for operating the DAC module is input through a Julia script file, Calibration\CarbonRemoval.jl. Inputs vary by type of DAC technology and include the following: 

  • Device lifetimes and construction delay 
  • Capital, variable, and O&M costs by technology 
  • Utilization factors 
  • Energy usage fractions and energy efficiency by technology 
  • Default available technologies (DACMSM0 = 0.0
  • Sequestration fractions and energy penalties by technology 
  • Capture carbon transportation prices 


Several options are available for the user to indicate which DAC methodology to use, indicated by a model switch (DACSw). Depending on which option (DACSw) the user selects, additional input data (beyond the default data entered in CarbonRemoval.jl) are required to activate the DAC equations. 

The table below summarizes the various DAC options and the inputs required for each:

Options for DAC Methodology

Value of DACSw

Additional Input Data Required

Exogenous DAC

DACSw = 0

  • xDACDem[Area,Year]-Exogenous demand for DAC

DAC used to meet emissions goal

DACSw = 1

  • xPolGoal[Area,Year] – Emissions goal

DAC used to meet emissions goal or produce to an exogenous level (whichever is higher)

DACSw = 2

  • xDACDem[Area,Year]  - Exogenous demand for DAC 
  • xPolGoal[Area,Year] – Emissions goal

DAC meets national Goal, with production split by exogenous weights

DACSw = 3

  • DACDemNation[Nation,Year] – National DAC demands
  • xGoalPolNation[Nation,Year] – National emissions goal
  • DACWeight[Area,Year] - Share of area DAC demands of national total

DAC response to Carbon Price

DACSw = 4

  • eCO2Price[Area,Year] – Carbon price
  • DACWeight[Area,Year] - Share of area DAC demands of national total
  • DACPriceDiffMax[Area,Year] – Price difference fraction for building DAC

DAC devices are then initiated for each modeled year as needed specified by the options above. The technologies are selected using consumer choice theory given the cost related inputs, fuel prices, and the technologies available for use (indicated by a non-price factor of 0 DACMSM0 = 0.0 in CarbonRemoval.jl). Devices are initiated and constructed after a specified construction delay. 

Annual energy usage, emissions produced and amount of carbon captured is estimated by the model. Outputs for the sector energy usage, emissions, investments, and other data are written to the DirectAirCapture supply sector for output and review. Total GHG inventories in the model output are adjusted by the net emissions from DirectAirCapture. 

Enabling Direct Air Capture

To enable Direct Air Capture (DAC) in ENERGY 2100, create a policy file that:

  1. Sets the value of DACSw to indicate which DAC methodology you want to initiate; and
  2. Adds the input data required for that option (see table above).

To modify available technologies:

  1. Use Select statements to select the technologies to activate, and set the DAC market share non-price factor equal to 0 (DACMSM0 = 0)
  2. Use Select statements to select the technologies to deactivate, and set the DAC market share non-price factor equal to -10 (DACTech = -10).


🕮

Example


#
# DAC_Exogenous_CA.jl - Direct Air Carbon Test Policy with Exogenous levels of DAC in California
#

using EnergyModel

module DAC_Exogenous_CA

import ...EnergyModel: ReadDisk,WriteDisk,Select
import ...EnergyModel: HisTime,ITime,MaxTime,First,Future,Final,Yr
import ...EnergyModel: @finite_math,finite_inverse,finite_divide,finite_power,finite_exp,finite_log
import ...EnergyModel: DB

const VariableArray{N} = Array{Float32,N} where {N}
const SetArray = Vector{String}

Base.@kwdef struct SControl
  db::String

  CalDB::String = "SCalDB"
  Input::String = "SInput"
  Outpt::String = "SOutput"

  Area::SetArray = ReadDisk(db,"MainDB/AreaKey")
  AreaDS::SetArray = ReadDisk(db,"MainDB/AreaDS")
  Areas::Vector{Int} = collect(Select(Area))
  DACTech::SetArray = ReadDisk(db,"$Input/DACTechKey")
  DACTechDS::SetArray = ReadDisk(db,"$Input/DACTechDS")
  DACTechs::Vector{Int} = collect(Select(DACTech))
  Year::SetArray = ReadDisk(db,"MainDB/YearKey")
  YearDS::SetArray = ReadDisk(db,"MainDB/YearDS")
  Years::Vector{Int} = collect(Select(Year))

  DACMSM0::VariableArray{3} = ReadDisk(db,"SpInput/DACMSM0") # [DACTech,Area,Year] DAC Market Share Non-Price Factor (Tonnes/Tonnes)
  DACSw::VariableArray{2} = ReadDisk(db,"SpInput/DACSw") # [Area,Year] Switch to Determine DAC Target
  xDACDem::VariableArray{2} = ReadDisk(db,"SpInput/xDACDem") # [Area,Year] Exogenous Demand for DAC (Tonnes/Yr)

end

function SupplyPolicy(db)
  data = SControl(; db)
  (; Area,DACTech) = data
  (; Years) = data
  (; DACMSM0,DACSw,xDACDem) = data

  CA = Select(Area,"CA")
  years = collect(Yr(2030):Final)
  for year in years
    DACSw[CA,year] = 0
  end
  
  WriteDisk(db,"SpInput/DACSw",DACSw)

  xDACDem[CA,Yr(2030)] = 6.8*1e6
  xDACDem[CA,Yr(2035)] = 35.1*1e6
  years = collect(Yr(2045):Final)
  for year in years
    xDACDem[CA,year] = 80.0*1e6
  end
  
  years = collect(Yr(2031):Yr(2034))
  for year in years
    xDACDem[CA,year] = xDACDem[CA,year-1]+(xDACDem[CA,Yr(2035)]-xDACDem[CA,Yr(2030)])/(2035-2030)
  end
  
  years = collect(Yr(2036):Yr(2044))
  for year in years
    xDACDem[CA,year] = xDACDem[CA,year-1]+(xDACDem[CA,Yr(2045)]-xDACDem[CA,Yr(2035)])/(2045-2035)
  end

  WriteDisk(db,"SpInput/xDACDem",xDACDem)

  #
  ########################
  #
  # DAC Market Share Non-Price Factor (mmBtu/mmBtu)
  #
  # Hydrogen only in California
  #
  dactechs = Select(DACTech)
  for year in Years, dactech in dactechs
    DACMSM0[dactech,CA,year] = -10.0
  end

  dactechs = Select(DACTech,"KOHLoop")
  for year in Years, dactech in dactechs
    DACMSM0[dactech,CA,year] =   0.0
  end

  WriteDisk(db,"SpInput/DACMSM0",DACMSM0)
end

function PolicyControl(db)
  @info ("DAC_Exogenous_CA.jl - PolicyControl")
  SupplyPolicy(db)
end

if abspath(PROGRAM_FILE) == @__FILE__
  PolicyControl(DB)
end 

end