R/reportEmissions.R

Defines functions reportEmissions

Documented in reportEmissions

#' Read in GDX and calculate emissions, used in convGDX2MIF.R for the reporting
#'
#' Read in emissions data from GDX file, information used in convGDX2MIF.R
#' for the reporting
#'
#'
#' @param gdx a GDX object as created by readGDX, or the path to a gdx
#' @param output a magpie object containing all needed variables generated by other report*.R functions
#' @return MAgPIE object - contains the emission variables
#' @author Sebastian Osorio, Renato Rodrigues
#' @seealso \code{\link{convGDX2MIF}}
#' @examples
#'
#' \dontrun{reportEmissions(gdx)}
#'
#' @importFrom gdx readGDX
#' @importFrom magclass mbind setNames dimSums getSets getSets<- as.magpie
#' @export
#'
reportEmissions <- function(gdx, output=NULL) {

  if(is.null(output)){
    stop("please provide a file containing all needed information")
  }

  # read sets
  te <- readGDX(gdx,name = "te")
  teel <- readGDX(gdx,name = "teel")
  ter <- readGDX(gdx,name = "ter")
  tecoal <- readGDX(gdx,name = "tecoal")
  telig <- readGDX(gdx,name = "telig")
  tegas <- readGDX(gdx,name = "tegas")
  tengcc <- readGDX(gdx,name = "tengcc")
  tefossil <- readGDX(gdx,name = "tefossil") #set of fossil-based generation technologies
  teccs <- readGDX(gdx,name = "teccs") #set of generation technologies with CCS
  tebio <- readGDX(gdx,name = "tebio") #set of biomass generation technologies
  teoil <- readGDX(gdx,name = "teoil") #set of oil generation technologies
  teothers <- readGDX(gdx,name = "teothers") #set of other gases generation technologies
  tegas_el <- intersect(tegas,teel)
  tengcc_el <- intersect(tengcc,teel)
  sety <- readGDX(gdx,name = "sety") #set secondary energy
  tewaste <- readGDX(gdx, name = "tewaste", format = "first_found", react = 'silent') # set of waste generation technologies
  tau <- readGDX(gdx, name = "tau") # set of time slices
  if(is.null(tewaste)) {tewaste <- "waste"} #in old model versions this set was not defined and only the tech 'waste' existed

  # read parameters
  p_taulength <- readGDX(gdx, name = c("p_taulength", "pm_taulength"), field = "l", format = "first_found")[, , tau] # number of hours/year per tau
  s_c2co2 <- readGDX(gdx,name = "s_c2co2",field = "l",format = "first_found") #conversion factor C -> CO2
  c_LIMESversion <- readGDX(gdx,name = "c_LIMESversion",field = "l",format = "first_found")

  # read variables
  v_emi <- readGDX(gdx,name = c("vm_emi", "v_emi"),field = "l",format = "first_found",restore_zeros  =  FALSE)

  # create MagPie object of v_emi with iso3 regions
  v_emi <- limesMapping(v_emi)

  #take only the co2 and convert from GtC to MtCO2
  v_emi_ccs <- v_emi[,,"cco2"]*as.numeric(s_c2co2)*1000
  v_emi <- v_emi[,,"co2"]*as.numeric(s_c2co2)*1000
  v_emi_el <- v_emi

  #Check the version so to choose the electricity-related variables
  if(c_LIMESversion >=  2.28) {
    if("sehe" %in% sety) {
      v_emi_he <- v_emi[,,"sehe"]
    }

    v_emi_el <- v_emi[,,"seel"]

    heating <- .readHeatingCfg(gdx)

  }

  #annual emissions per primary energy type
  tmp1 <- NULL

  #annual emissions per country
  tmp2 <- NULL

  varList_el <- list(
    #Conventional
    "Emissions|CO2|Energy|Supply|Electricity (Mt CO2/yr)"                         = "seel",
    "Emissions|CO2|Energy|Supply|Electricity|Coal (Mt CO2/yr)"                    = intersect(teel,c(tecoal,telig)),
    "Emissions|CO2|Energy|Supply|Electricity|Coal|w/o CCS (Mt CO2/yr)"            = intersect(teel,setdiff(c(tecoal,telig),teccs)),
    "Emissions|CO2|Energy|Supply|Electricity|Coal|w/ CCS (Mt CO2/yr)"             = intersect(teel,intersect(c(tecoal,telig),teccs)),
    "Emissions|CO2|Energy|Supply|Electricity|Hard Coal (Mt CO2/yr)"               = intersect(teel,c(tecoal)),
    "Emissions|CO2|Energy|Supply|Electricity|Hard Coal|w/o CCS (Mt CO2/yr)"       = intersect(teel,setdiff(c(tecoal),teccs)),
    "Emissions|CO2|Energy|Supply|Electricity|Hard Coal|w/ CCS (Mt CO2/yr)"        = intersect(teel,intersect(c(tecoal),teccs)),
    "Emissions|CO2|Energy|Supply|Electricity|Lignite (Mt CO2/yr)"                 = intersect(teel,c(telig)),
    "Emissions|CO2|Energy|Supply|Electricity|Lignite|w/o CCS (Mt CO2/yr)"         = intersect(teel,setdiff(c(telig),teccs)),
    "Emissions|CO2|Energy|Supply|Electricity|Lignite|w/ CCS (Mt CO2/yr)"          = intersect(teel,intersect(c(telig),teccs)),
    "Emissions|CO2|Energy|Supply|Electricity|Oil (Mt CO2/yr)"                     = intersect(teel,c(teoil)),
    "Emissions|CO2|Energy|Supply|Electricity|Gas (Mt CO2/yr)"                     = intersect(teel,c(tegas)),
    "Emissions|CO2|Energy|Supply|Electricity|Gas|w/o CCS (Mt CO2/yr)"             = intersect(teel,setdiff(tegas_el,teccs)),
    "Emissions|CO2|Energy|Supply|Electricity|Gas|w/ CCS (Mt CO2/yr)"              = intersect(teel,intersect(tegas_el,teccs)),
    "Emissions|CO2|Energy|Supply|Electricity|Gas CC|w/o CCS (Mt CO2/yr)"          = intersect(teel,setdiff(tengcc_el,teccs)),
    "Emissions|CO2|Energy|Supply|Electricity|Gas CC|w/ CCS (Mt CO2/yr)"           = intersect(teel,intersect(tengcc_el,teccs)),
    "Emissions|CO2|Energy|Supply|Electricity|Gas CC (Mt CO2/yr)"                  = intersect(teel,c(tengcc_el)),
    "Emissions|CO2|Energy|Supply|Electricity|Gas OC (Mt CO2/yr)"                  = intersect(teel,setdiff(tegas_el,tengcc_el)),
    "Emissions|CO2|Energy|Supply|Electricity|Other (Mt CO2/yr)"                   = intersect(teel,c(teothers)),
    "Emissions|CO2|Energy|Supply|Electricity|Waste (Mt CO2/yr)"                   = intersect(teel,c(tewaste)),
    "Emissions|CO2|Energy|Supply|Electricity|Other Fossil (Mt CO2/yr)"            = intersect(teel,c(teothers,tewaste,teoil)),

    #general aggregation
    "Emissions|CO2|Energy|Supply|Electricity|Fossil (Mt CO2/yr)"                  = intersect(teel,c(tefossil)),
    "Emissions|CO2|Energy|Supply|Electricity|Fossil|w/o CCS (Mt CO2/yr)"          = intersect(teel,setdiff(tefossil,teccs)),
    "Emissions|CO2|Energy|Supply|Electricity|Fossil|w/ CCS (Mt CO2/yr)"           = intersect(teel,intersect(tefossil,teccs))
  )

  # helper function: checks if the given entity exists in one of ('any') the dimensions of var
  hasEnty <- function(enty, var){
    any(grepl(pattern = paste0("(^|\\.)",enty,"(\\.|$)"),getNames(var)))
    }


  for (var in names(varList_el)){
    enty <- varList_el[[var]]
    # execute only if all enties (e.g. "oil") exist in getNames(v_emi_el), skip otherwise
    # This is necessary, because there are enties in varList_el that are not in getNames(v_emi_el) (e.g. "oil")
    # which causes an error since non-existent elements cannot be selected via v_emi_el[,,enty]
    if (all(vapply(enty,hasEnty,v_emi_el, FUN.VALUE = logical(1)))) {
      tmp2 <- mbind(tmp2,setNames(dimSums(v_emi_el[,,enty],dim=3,na.rm = T),var))
    }
  }

  # concatenate vars
  tmp3 <- mbind(tmp1,tmp2)


  #annual emissions withdrawn from the EU ETS
  #If activate this, remember to activate the code in convGDX2MIF to erase the values for the countries for which this variable does not exist
  tmp4 <- NULL
  #tmp4 <- mbind(tmp4,setNames(dimSums(v_emifloor[,,]*s_c2co2*1000,3),"Emissions withdrawn ETS|CO2|Energy|Supply|Electricity (Mt CO2/yr)"))

  if(c_LIMESversion >=  2.33) {

    #Biomass related variables (because there are new biomass technologies from v2.33)
    #tmp4 <- mbind(tmp4,setNames(dimSums(v_emi_el[,,intersect(tebio,teccs)],3),"Emissions|CO2|Energy|Supply|Electricity|Biomass (Mt CO2/yr)")) #might be confusing the fact that is exactly the same as BECCS
    tmp4 <- mbind(tmp4,setNames(dimSums(v_emi_el[,,intersect(tebio,teccs)],dim = 3,na.rm  =  T),
                                "Emissions|CO2|Energy|Supply|Electricity|Biomass|w/ CCS (Mt CO2/yr)"))
    tmp4 <- mbind(tmp4,setNames(dimSums(v_emi_ccs[,,intersect(tebio,teccs)],dim = 3,na.rm  =  T),
                                "Carbon Sequestration|CCS|Electricity|Biomass (Mt CO2/yr)"))
    tmp4 <- mbind(tmp4,setNames(dimSums(v_emi_ccs[,,intersect(tebio,teccs)],dim = 3,na.rm  =  T),
                                "Emissions|Carbon removal|BECCS (Mt CO2/yr)"))


    if(heating == "fullDH") {
      #load heat-related sets
      techp <- readGDX(gdx,name = "techp")
      teoel <- readGDX(gdx,name = "teoel")
      teohecen <- readGDX(gdx,name = "teohecen")
      tedh <- readGDX(gdx,name = "tedh")
      tedhelec <- readGDX(gdx,name = "tedhelec")
      ternofluc <- readGDX(gdx,name = "ternofluc")
      tehgen <- readGDX(gdx,name = "tehgen") #set of hydrogen generation technologies


      #1) Emissions FROM DH: CHP AND Heat-only
      varList_he <- list(
        #1.b) CHP
        "Emissions|CO2|Energy|Supply|Heat|District Heating|CHP (Mt CO2/yr)"                          = setdiff(techp,c(ter,ternofluc,tedhelec,tehgen)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|CHP|Coal (Mt CO2/yr)"                     = intersect(techp,c(tecoal,telig)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|CHP|Hard Coal (Mt CO2/yr)"                = intersect(techp,c(tecoal)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|CHP|Lignite (Mt CO2/yr)"                  = intersect(techp,c(telig)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|CHP|Oil (Mt CO2/yr)"                      = intersect(techp,c(teoil)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|CHP|Gas (Mt CO2/yr)"                      = intersect(techp,c(tegas)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|CHP|Gas CC (Mt CO2/yr)"                   = intersect(techp,c(tengcc_el)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|CHP|Gas OC (Mt CO2/yr)"                   = intersect(techp,setdiff(tegas_el,tengcc_el)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|CHP|Other (Mt CO2/yr)"                    = intersect(techp,c(teothers)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|CHP|Other Fossil (Mt CO2/yr)"             = intersect(techp,c(teothers,tewaste,teoil)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|CHP|Fossil (Mt CO2/yr)"                   = intersect(techp,c(tefossil)),

        #1.c) Only-heat (centralized boilers)
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Heat-only (Mt CO2/yr)"                    = setdiff(teohecen,c(ter,ternofluc,tedhelec,tehgen)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Heat-only|Coal (Mt CO2/yr)"               = intersect(teohecen,c(tecoal,telig)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Heat-only|Hard Coal (Mt CO2/yr)"          = intersect(teohecen,c(tecoal)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Heat-only|Lignite (Mt CO2/yr)"            = intersect(teohecen,c(telig)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Heat-only|Oil (Mt CO2/yr)"                = intersect(teohecen,c(teoil)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Heat-only|Gas (Mt CO2/yr)"                = intersect(teohecen,c(tegas)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Heat-only|Other (Mt CO2/yr)"              = intersect(teohecen,c(teothers)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Heat-only|Waste (Mt CO2/yr)"              = intersect(teohecen,c(tewaste)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Heat-only|Other Fossil (Mt CO2/yr)"       = intersect(teohecen,c(teothers,tewaste,teoil)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Heat-only|Fossil (Mt CO2/yr)"             = intersect(teohecen,c(tefossil)),

        #1.d) District Heating
        "Emissions|CO2|Energy|Supply|Heat|District Heating (Mt CO2/yr)"                              = setdiff(tedh,c(ter,ternofluc,tedhelec,tehgen)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Coal (Mt CO2/yr)"                         = intersect(tedh,c(tecoal,telig)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Hard Coal (Mt CO2/yr)"                    = intersect(tedh,c(tecoal)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Lignite (Mt CO2/yr)"                      = intersect(tedh,c(telig)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Oil (Mt CO2/yr)"                          = intersect(tedh,c(teoil)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Gas (Mt CO2/yr)"                          = intersect(tedh,c(tegas)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Other (Mt CO2/yr)"                        = intersect(tedh,c(teothers)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Waste (Mt CO2/yr)"                        = intersect(tedh,c(tewaste)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Other Fossil (Mt CO2/yr)"                 = intersect(tedh,c(teothers,tewaste,teoil)),
        "Emissions|CO2|Energy|Supply|Heat|District Heating|Fossil (Mt CO2/yr)"                       = intersect(tedh,c(tefossil))
      )

      for (var in names(varList_he)) {
        enty <- varList_he[[var]]
        if (all(vapply(enty,hasEnty,v_emi_he, FUN.VALUE = logical(1)))) {
          tmp4 <- mbind(tmp4,setNames(dimSums(v_emi_he[,,enty],dim=3,na.rm = T),var))
        }
      }

      #Electricity and Heat
      varList <- list(
        #Conventional
        "Emissions|CO2|Energy|Supply|Electricity and Heat (Mt CO2/yr)"                   = c("seel","sehe"),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|Biomass (Mt CO2/yr)"           = intersect(te,intersect(tebio,teccs)),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|Coal (Mt CO2/yr)"              = intersect(te,c(tecoal,telig)),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|Hard Coal (Mt CO2/yr)"         = intersect(te,c(tecoal)),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|Lignite (Mt CO2/yr)"           = intersect(te,c(telig)),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|Oil (Mt CO2/yr)"               = intersect(te,c(teoil)),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|Gas (Mt CO2/yr)"               = intersect(te,c(tegas)),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|Other (Mt CO2/yr)"             = intersect(te,c(teothers)),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|Waste (Mt CO2/yr)"             = intersect(te,c(tewaste)),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|Other Fossil (Mt CO2/yr)"      = intersect(te,c(teothers,tewaste,teoil)),

        #general aggregation
        "Emissions|CO2|Energy|Supply|Electricity and Heat|Fossil (Mt CO2/yr)"            = intersect(te,c(tefossil))
      )

      for (var in names(varList)){
        enty <- varList[[var]]
        if (all(vapply(enty,hasEnty,v_emi, FUN.VALUE = logical(1)))) {
          tmp4 <- mbind(tmp4,setNames(dimSums(v_emi[,,enty],dim=3,na.rm = T),var))
        }
      }

      #Electricity emissions
      varList_el<- list(
        #1.b) CHP
        "Emissions|CO2|Energy|Supply|Electricity|CHP (Mt CO2/yr)"                          = setdiff(techp,c(ter,ternofluc,tedhelec,tehgen)),
        "Emissions|CO2|Energy|Supply|Electricity|CHP|Coal (Mt CO2/yr)"                     = intersect(techp,c(tecoal,telig)),
        "Emissions|CO2|Energy|Supply|Electricity|CHP|Hard Coal (Mt CO2/yr)"                = intersect(techp,c(tecoal)),
        "Emissions|CO2|Energy|Supply|Electricity|CHP|Lignite (Mt CO2/yr)"                  = intersect(techp,c(telig)),
        "Emissions|CO2|Energy|Supply|Electricity|CHP|Oil (Mt CO2/yr)"                      = intersect(techp,c(teoil)),
        "Emissions|CO2|Energy|Supply|Electricity|CHP|Gas (Mt CO2/yr)"                      = intersect(techp,c(tegas)),
        "Emissions|CO2|Energy|Supply|Electricity|CHP|Gas CC (Mt CO2/yr)"                   = intersect(techp,c(tengcc_el)),
        "Emissions|CO2|Energy|Supply|Electricity|CHP|Gas OC (Mt CO2/yr)"                   = intersect(techp,setdiff(tegas_el,tengcc_el)),
        "Emissions|CO2|Energy|Supply|Electricity|CHP|Other (Mt CO2/yr)"                    = intersect(techp,c(teothers)),
        "Emissions|CO2|Energy|Supply|Electricity|CHP|Other Fossil (Mt CO2/yr)"             = intersect(techp,c(teothers,tewaste,teoil)),
        "Emissions|CO2|Energy|Supply|Electricity|CHP|Fossil (Mt CO2/yr)"                   = intersect(techp,c(tefossil)),

        #Electricity-only
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only (Mt CO2/yr)"                         = intersect(teoel,c(tefossil,intersect(tebio,teccs))),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Coal (Mt CO2/yr)"                    = intersect(teoel,c(tecoal,telig)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Coal|w/o CCS (Mt CO2/yr)"            = intersect(teoel,setdiff(c(tecoal,telig),teccs)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Coal|w/ CCS (Mt CO2/yr)"             = intersect(teoel,intersect(c(tecoal,telig),teccs)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Hard Coal (Mt CO2/yr)"               = intersect(teoel,c(tecoal)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Hard Coal|w/o CCS (Mt CO2/yr)"       = intersect(teoel,setdiff(c(tecoal),teccs)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Hard Coal|w/ CCS (Mt CO2/yr)"        = intersect(teoel,intersect(c(tecoal),teccs)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Lignite (Mt CO2/yr)"                 = intersect(teoel,c(telig)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Lignite|w/o CCS (Mt CO2/yr)"         = intersect(teoel,setdiff(c(telig),teccs)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Lignite|w/ CCS (Mt CO2/yr)"          = intersect(teoel,intersect(c(telig),teccs)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Oil (Mt CO2/yr)"                     = intersect(teoel,c(teoil)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Gas (Mt CO2/yr)"                     = intersect(teoel,c(tegas)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Gas|w/o CCS (Mt CO2/yr)"             = intersect(teoel,setdiff(tegas_el,teccs)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Gas|w/ CCS (Mt CO2/yr)"              = intersect(teoel,intersect(tegas_el,teccs)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Gas CC|w/o CCS (Mt CO2/yr)"          = intersect(teoel,setdiff(tengcc_el,teccs)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Gas CC|w/ CCS (Mt CO2/yr)"           = intersect(teoel,intersect(tengcc_el,teccs)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Gas CC (Mt CO2/yr)"                  = intersect(teoel,c(tengcc_el)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Gas OC (Mt CO2/yr)"                  = intersect(teoel,setdiff(tegas_el,tengcc_el)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Other (Mt CO2/yr)"                   = intersect(teoel,c(teothers)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Waste (Mt CO2/yr)"                   = intersect(teoel,c(tewaste)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Other Fossil (Mt CO2/yr)"            = intersect(teoel,c(teothers,tewaste,teoil)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Fossil (Mt CO2/yr)"                  = intersect(teoel,c(tefossil)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Fossil|w/o CCS (Mt CO2/yr)"          = intersect(teoel,setdiff(tefossil,teccs)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Fossil|w/ CCS (Mt CO2/yr)"           = intersect(teoel,intersect(tefossil,teccs)),
        "Emissions|CO2|Energy|Supply|Electricity|Electricity-only|Biomass|w/ CCS (Mt CO2/yr)"          = intersect(teoel,intersect(tebio,teccs))
      )

      for (var in names(varList_el)) {
        enty <- varList_el[[var]]
        if (all(vapply(enty,hasEnty,v_emi_el, FUN.VALUE = logical(1)))) {
          tmp4 <- mbind(tmp4,setNames(dimSums(v_emi_el[,,enty],dim=3,na.rm = T),var))
        }
      }

      #CHP emissions
      varList<- list(
        #1.b) CHP
        "Emissions|CO2|Energy|Supply|Electricity and Heat|CHP (Mt CO2/yr)"                          = setdiff(techp,c(ter,ternofluc,tedhelec,tehgen)),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|CHP|Coal (Mt CO2/yr)"                     = intersect(techp,c(tecoal,telig)),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|CHP|Hard Coal (Mt CO2/yr)"                = intersect(techp,c(tecoal)),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|CHP|Lignite (Mt CO2/yr)"                  = intersect(techp,c(telig)),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|CHP|Oil (Mt CO2/yr)"                      = intersect(techp,c(teoil)),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|CHP|Gas (Mt CO2/yr)"                      = intersect(techp,c(tegas)),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|CHP|Gas CC (Mt CO2/yr)"                   = intersect(techp,c(tengcc_el)),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|CHP|Gas OC (Mt CO2/yr)"                   = intersect(techp,setdiff(tegas_el,tengcc_el)),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|CHP|Other (Mt CO2/yr)"                    = intersect(techp,c(teothers)),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|CHP|Other Fossil (Mt CO2/yr)"             = intersect(techp,c(teothers,tewaste,teoil)),
        "Emissions|CO2|Energy|Supply|Electricity and Heat|CHP|Fossil (Mt CO2/yr)"                   = intersect(techp,c(tefossil))
      )

      for (var in names(varList)) {
        enty <- varList[[var]]
        if (all(vapply(enty,hasEnty,v_emi, FUN.VALUE = logical(1)))) {
          tmp4 <- mbind(tmp4,setNames(dimSums(v_emi[,,enty],dim=3,na.rm = T),var))
        }
      }
    }
  }

  # concatenate data
  tmp5 <- mbind(tmp3,tmp4)

  #Carbon sequestration
  tmp6 <- NULL
  tmp6 <- mbind(tmp6,setNames(dimSums(v_emi_ccs,dim = 3,na.rm = T),
                              "Carbon Sequestration|CCS|Electricity (Mt CO2/yr)"))
  tmp6 <- mbind(tmp6,setNames(dimSums(v_emi_ccs[,,intersect(tefossil,teccs)],dim = 3,na.rm  =  T),
                              "Carbon Sequestration|CCS|Electricity|Fossil (Mt CO2/yr)"))
  tmp6 <- mbind(tmp6,setNames(dimSums(v_emi_ccs[,,intersect(c(tecoal,telig),teccs)],dim = 3,na.rm  =  T),
                              "Carbon Sequestration|CCS|Electricity|Coal (Mt CO2/yr)"))
  tmp6 <- mbind(tmp6,setNames(dimSums(v_emi_ccs[,,intersect(tecoal,teccs)],dim = 3,na.rm  =  T),
                              "Carbon Sequestration|CCS|Electricity|Hard Coal (Mt CO2/yr)"))
  tmp6 <- mbind(tmp6,setNames(dimSums(v_emi_ccs[,,intersect(telig,teccs)],dim = 3,na.rm  =  T),
                              "Carbon Sequestration|CCS|Electricity|Lignite (Mt CO2/yr)"))

  # concatenate data
  tmp <- mbind(tmp5,tmp6)

  ##Additional estimations related to emission intensity
  tmp7 <- NULL
  tmp7 <- mbind(tmp7,setNames(
    tmp[,,"Emissions|CO2|Energy|Supply|Electricity (Mt CO2/yr)"] * 1000 / output[,,"Secondary Energy|Electricity (TWh/yr)"],
    "Emissions|CO2|Energy|Supply|Electricity|Emission factor (gCO2/kWh)")) #from MtCO2/TWh to gCO2/kWh

  if(heating == "fullDH") {
    tmp7 <- mbind(tmp7,setNames(
      tmp[,,"Emissions|CO2|Energy|Supply|Heat|District Heating (Mt CO2/yr)"] * 1000 / output[,,"Secondary Energy|Gross|Heat|District Heating (TWh/yr)"],
      "Emissions|CO2|Energy|Supply|Heat|District Heating|Emission factor (gCO2/kWh)")) #from MtCO2/TWh to gCO2/kWh

    c_buildings <- readGDX(gdx, name = c("c_buildings", "report_c_buildings"),
                           field = "l", format = "first_found", react = 'silent') #switch on buildings module

    if (c_buildings == 1) {
      o_emiindheat <- readGDX(gdx, name = c("o_emiindheat"), field = "l", format = "first_found", react = 'silent') #heat indirect emissions
      if(!is.null(o_emiindheat)) { #this was just added in May 2023; other related variables
        o_emiindheat <- limesMapping(o_emiindheat)[,,"seel"]
        tmp7 <- mbind(tmp7,setNames(
          o_emiindheat, "Emissions|Indirect|CO2|Energy|Supply|Power to heat (Mt CO2/yr)"))

        tmp7 <- mbind(tmp7,setNames(o_emiindheat * 1000 / output[,,"Secondary Energy Input|Electricity|Heat (TWh/yr)"],
          "Emissions|Indirect|CO2|Energy|Supply|Emission factor|Power to heat (gCO2/kWh)")) #from MtCO2/TWh to gCO2/kWh
      }
    } #end buildings if

  }

  ##DACCS
  c_DACCS <- readGDX(gdx, name = c("c_DACCS"), field = "l", format = "first_found", react = 'silent') #heat peak demand in buildings
  if(!is.null(c_DACCS)) {
    if(c_DACCS >= 1) {
      #Load sets, parameters and variables
      tedaccs <- readGDX(gdx, name = "tedaccs")
      v_Removal_DACCS <- readGDX(gdx, name = c("v_Removal_DACCS"), field = "l", format = "first_found", restore_zeros = FALSE)[, , tau] # SE consumption from DACCS
      v_Emi_DACCS <- readGDX(gdx, name = c("v_Emi_DACCS"), field = "l", format = "first_found", restore_zeros = FALSE) # Emissions from DACCS

      # create MagPie object of demand with iso3 regions
      v_Removal_DACCS <- limesMapping(v_Removal_DACCS)
      v_Emi_DACCS <- limesMapping(v_Emi_DACCS)

      #Estimate annual removals, convert from MtC/h, convert to MtCO2/a
      o_Removal_DACCS_annual <- dimSums(v_Removal_DACCS * p_taulength,  dim = 3.1) * 44/12

      #Filter per source, convert from GtC/a, convert to MtCO2/a
      o_EmiGas_DACCS <- v_Emi_DACCS[,,"pegas"] * 1000 * 44/12

      #Removals
      varList_daccs <- list(
        "Emissions|Carbon removal|DACCS (Mt CO2/yr)"                           = c(tedaccs),
        "Emissions|Carbon removal|DACCS|Liquid solvent (Mt CO2/yr)"            = "liquid_daccs",
        "Emissions|Carbon removal|DACCS|Solid sorbent (Mt CO2/yr)"             = "solid_daccs",
        "Emissions|Carbon removal|DACCS|CaO ambient weathering (Mt CO2/yr)"    = "caow_daccs"
      )

      for (var in names(varList_daccs)){ #Data is in MtC/h, convert to MtCO2/a
        tmp7 <- mbind(tmp7, setNames(dimSums(o_Removal_DACCS_annual[, , varList_daccs[[var]]], dim = 3),  var))
      }

      #Emissions
      varList_daccs <- list(
        "Emissions|CO2|Gas|DACCS (Mt CO2/yr)"                           = c(tedaccs),
        "Emissions|CO2|Gas|DACCS|Liquid solvent (Mt CO2/yr)"            = "liquid_daccs",
        "Emissions|CO2|Gas|DACCS|Solid sorbent (Mt CO2/yr)"             = "solid_daccs",
        "Emissions|CO2|Gas|DACCS|CaO ambient weathering (TMt CO2/yr)"    = "caow_daccs"
      )

      for (var in names(varList_daccs)){ #Data is in GtC/a, convert to MtCO2/a
        tmp7 <- mbind(tmp7, setNames(dimSums(o_EmiGas_DACCS[, , varList_daccs[[var]]], dim = 3),  var))
      }

      #Net Removals
      varList_daccs <- list(
        "Emissions|Net carbon removal|DACCS (Mt CO2/yr)"                           = c(tedaccs),
        "Emissions|Net carbon removal|DACCS|Liquid solvent (Mt CO2/yr)"            = "liquid_daccs",
        "Emissions|Net carbon removal|DACCS|Solid sorbent (Mt CO2/yr)"             = "solid_daccs",
        "Emissions|Net carbon removal|DACCS|CaO ambient weathering (Mt CO2/yr)"    = "caow_daccs"
      )

      for (var in names(varList_daccs)){ #Data is in GtC/a, convert to MtCO2/a
        tmp7 <- mbind(tmp7, setNames(dimSums((o_Removal_DACCS_annual[, , varList_daccs[[var]]] - o_EmiGas_DACCS[, , varList_daccs[[var]]]), dim = 3),  var))
      }

      #Total removals
      dimSums(v_emi_ccs[,,intersect(tebio,teccs)],dim = 3,na.rm  =  T)
      tmp7 <- mbind(tmp7, setNames(
        tmp7[,,"Emissions|Carbon removal|DACCS (Mt CO2/yr)"] + tmp[,,"Emissions|Carbon removal|BECCS (Mt CO2/yr)"],
        "Emissions|Carbon removal (Mt CO2/yr)"))
      tmp7 <- mbind(tmp7, setNames(
        tmp7[,,"Emissions|Net carbon removal|DACCS (Mt CO2/yr)"] + tmp[,,"Emissions|Carbon removal|BECCS (Mt CO2/yr)"],
        "Emissions|Net carbon removal (Mt CO2/yr)"))

      ##Additional data related to DACCS
      #The following variables/parameters were added together

      #Load sets, parameters and variables
      o_ElecPriceDAC <- readGDX(gdx, name = c("o_ElecPriceDAC"), field = "l", format = "first_found", restore_zeros = FALSE, react = 'silent') # Price paid by DACCS

      if(!is.null(o_ElecPriceDAC)) {
        #Load sets, parameters and variables
        o_ElecTariffDAC <- readGDX(gdx, name = c("o_ElecTariffDAC"), field = "l", format = "first_found", restore_zeros = FALSE) # Price paid by DACCS
        o_LCOR <- readGDX(gdx, name = c("o_LCOR"), field = "l", format = "first_found", restore_zeros = FALSE) # Levelised cost of removals
        o_discRemoval <- readGDX(gdx, name = c("o_discRemoval"), field = "l", format = "first_found", restore_zeros = T)[,,c(tedaccs)] # Discounted removal volumes (for average LCOR)

        # create MagPie object of demand with iso3 regions
        o_ElecPriceDAC <- limesMapping(o_ElecPriceDAC)
        o_ElecTariffDAC <- limesMapping(o_ElecTariffDAC)
        o_LCOR <- limesMapping(o_LCOR)
        o_discRemoval <- limesMapping(o_discRemoval)

        #Electricity prices
        varList_daccs <- list(
          "Price|Secondary Energy Input|Electricity|DACCS|Liquid solvent (Eur2010/MWh)"            = "liquid_daccs",
          "Price|Secondary Energy Input|Electricity|DACCS|Solid sorbent (Eur2010/MWh)"             = "solid_daccs",
          "Price|Secondary Energy Input|Electricity|DACCS|CaO ambient weathering (Eur2010/MWh)"    = "caow_daccs"
        )

        for (var in names(varList_daccs)){ #Data is in MtC/h, convert to MtCO2/a
          tmp7 <- mbind(tmp7, setNames(o_ElecPriceDAC[, , varList_daccs[[var]]],  var))
        }
        tmp7 <- mbind(tmp7, setNames(
          dimSums(o_Removal_DACCS_annual * o_ElecPriceDAC, dim = 3, na.rm = T) /
            dimSums(o_Removal_DACCS_annual, dim = 3),
          "Price|Secondary Energy Input|Electricity|DACCS (Eur2010/MWh)"))

        #Electricity tariffs
        varList_daccs <- list(
          "Tariff|Secondary Energy Input|Electricity|DACCS|Liquid solvent (Eur2010/MWh)"            = "liquid_daccs",
          "Tariff|Secondary Energy Input|Electricity|DACCS|Solid sorbent (Eur2010/MWh)"             = "solid_daccs",
          "Tariff|Secondary Energy Input|Electricity|DACCS|CaO ambient weathering (Eur2010/MWh)"    = "caow_daccs"
        )

        for (var in names(varList_daccs)){ #Data is in MtC/h, convert to MtCO2/a
          tmp7 <- mbind(tmp7, setNames(o_ElecTariffDAC[, , varList_daccs[[var]]],  var))
        }
        tmp7 <- mbind(tmp7, setNames(
          dimSums(o_Removal_DACCS_annual * o_ElecTariffDAC, dim = 3, na.rm = T) /
            dimSums(o_Removal_DACCS_annual, dim = 3),
          "Tariff|Secondary Energy Input|Electricity|DACCS (Eur2010/MWh)"))

        #Levelised costs for plants built in t
        varList_daccs <- list(
          "Levelised cost of removals for plants built in t|DACCS|Liquid solvent (Eur2010/tCO2)"            = "liquid_daccs",
          "Levelised cost of removals for plants built in t|DACCS|Solid sorbent (Eur2010/tCO2)"             = "solid_daccs",
          "Levelised cost of removals for plants built in t|DACCS|CaO ambient weathering (Eur2010/tCO2)"    = "caow_daccs"
        )

        for (var in names(varList_daccs)){ #Data is in MtC/h, convert to MtCO2/a
          tmp7 <- mbind(tmp7, setNames(o_LCOR[, , varList_daccs[[var]]],  var))
        }
        tmp7 <- mbind(tmp7, setNames(
          dimSums(o_LCOR * o_discRemoval, dim = 3, na.rm = T) /
            dimSums(o_discRemoval, dim = 3),
          "Levelised cost of removals for plants built in t|DACCS (Eur2010/tCO2)"))

        #Discounted removal volumes for plants built in t
        varList_daccs <- list(
          "Discounted removal volumes for plants built in t|DACCS (Mt CO2/yr)"                           = c(tedaccs),
          "Discounted removal volumes for plants built in t|DACCS|Liquid solvent (Mt CO2/yr)"            = "liquid_daccs",
          "Discounted removal volumes for plants built in t|DACCS|Solid sorbent (Mt CO2/yr)"             = "solid_daccs",
          "Discounted removal volumes for plants built in t|DACCS|CaO ambient weathering (Mt CO2/yr)"    = "caow_daccs"
        )

        for (var in names(varList_daccs)){ #Data is in MtC/h, convert to Mt CO2/yr/a
          tmp7 <- mbind(tmp7, setNames(dimSums(o_discRemoval[, , varList_daccs[[var]]], dim = 3),  var))
        }

      }#End if checking if o_ElecPriceDAC exists


    }#End if checking if c_DACCS switch is on
  }#End if checking if c_DACCS exists

  # concatenate data
  tmp <- mbind(tmp,tmp7)


  return(tmp)
}
pik-piam/limes documentation built on April 12, 2025, 5:44 p.m.