Skip to content

Modifying emissions in runs #174

@lgloege

Description

@lgloege

Describe the problem

I am trying to change the emissions, but my change doesn't seem to take effect. Not sure what I am doing wrong.

What are you trying to achieve

Trying to change carbon dioxide removal in scenarios. I am doing this by subtracting from the emissions each year. For testing purposes, i'm subtracting 10 GtCO2 each year from SSP scenarios. Trying to modify the SSP example

Minimal working example

My code is below. I modify emissions in the "include CDR" section. Any help would be greatly appreciated. Thanks!

from pathlib import Path

from fair import FAIR
from fair.io import read_properties
from fair.interface import fill, initialise
from fair.earth_params import seconds_per_year

import matplotlib.pyplot as pl
import numpy as np
import pandas as pd

# ===================================
# 1. Define fair object
# ===================================

f = FAIR(ch4_method='thornhill2021')

# ===================================
# 2. Define the model
# ===================================

f.define_time(1750, 2100, 1)

# Define SSP scenarios
scenarios = ['ssp119', 'ssp126', 'ssp245', 'ssp370', 'ssp434', 'ssp460', 'ssp534-over', 'ssp585']
f.define_scenarios(scenarios)


fl = Path("../data/calibration/output/fair-2.1.3/v1.4/all-2022/calibrations/4xCO2_cummins_ebm3_cmip6.csv")
df = pd.read_csv(fl)
models = df['model'].unique()
configs = []

for imodel, model in enumerate(models):
    for run in df.loc[df['model']==model, 'run']:
        configs.append(f"{model}_{run}")
        
f.define_configs(configs)

species, properties = read_properties()
f.define_species(species, properties)

# ===================================
# 3. Create input output data
# ===================================

f.allocate()

# ===================================
#  4. Fill in the data
# ===================================

#f.species_configs["baseline_emissions"].sel(specie="CH4", config="MPI-ESM1-2-HR_r1i1p1f1")

# ===================================
## 4.1 default species configs
# ===================================

f.fill_species_configs()

fill(f.species_configs['unperturbed_lifetime'], 10.8537568, specie='CH4')
fill(f.species_configs['baseline_emissions'], 19.01978312, specie='CH4')
fill(f.species_configs['baseline_emissions'], 0.08602230754, specie='N2O')

# ===================================
## 4.2 fill emissions
# ===================================

fl = Path("../data/calibration/data/forcing/volcanic_ERF_monthly_-950001-201912.csv")
df_volcanic = pd.read_csv(fl, index_col='year')

# This function automatically selects the emissions, concentration or forcing 
# you want depending on the properties for each of the SSP scenarios defined.
f.fill_from_rcmip()

initialise(f.concentration, f.species_configs['baseline_concentration'])
#initialise(f.concentration, 278.3, specie='CO2')
initialise(f.forcing, 0)
initialise(f.temperature, 0)
initialise(f.cumulative_emissions, 0)
initialise(f.airborne_emissions, 0)

# ===================================
# include CDR
# ===================================

cdr_start_year = 1990
cdr_end_year = 2100
cdr_gtco2_per_year = 10.0
specie = "CO2"

f.emissions = f.emissions.copy()

# appy cdr to each scenario and config
for scenario in f.scenarios:
    for config in f.configs:
        f.emissions.loc[dict(timepoints=slice(cdr_start_year, cdr_end_year), scenario=scenario, config=config, specie=specie)] = \
            f.emissions.loc[dict(timepoints=slice(cdr_start_year, cdr_end_year), scenario=scenario, config=config, specie=specie)] - cdr_gtco2_per_year


# overwrite volcanic
volcanic_forcing = np.zeros(351)
volcanic_forcing[:271] = df_volcanic[1749:].groupby(np.ceil(df_volcanic[1749:].index) // 1).mean().squeeze().values
fill(f.forcing, volcanic_forcing[:, None, None], specie="Volcanic")  # sometimes need to expand the array


# ===================================
## 4.3 fill climate configs
# ===================================

fl = Path("../data/calibration/output/fair-2.1.3/v1.4/all-2022/calibrations/4xCO2_cummins_ebm3_cmip6.csv")

df = pd.read_csv(fl)
models = df['model'].unique()

df = pd.read_csv(fl)
models = df['model'].unique()

seed = 1355763

for config in configs:
    model, run = config.split('_')
    condition = (df['model']==model) & (df['run']==run)
    fill(f.climate_configs['ocean_heat_capacity'], df.loc[condition, 'C1':'C3'].values.squeeze(), config=config)
    fill(f.climate_configs['ocean_heat_transfer'], df.loc[condition, 'kappa1':'kappa3'].values.squeeze(), config=config)
    fill(f.climate_configs['deep_ocean_efficacy'], df.loc[condition, 'epsilon'].values[0], config=config)
    fill(f.climate_configs['gamma_autocorrelation'], df.loc[condition, 'gamma'].values[0], config=config)
    fill(f.climate_configs['sigma_eta'], df.loc[condition, 'sigma_eta'].values[0], config=config)
    fill(f.climate_configs['sigma_xi'], df.loc[condition, 'sigma_xi'].values[0], config=config)
    fill(f.climate_configs['stochastic_run'], True, config=config)
    fill(f.climate_configs['use_seed'], True, config=config)
    fill(f.climate_configs['seed'], seed, config=config)

    seed = seed + 399


# ===================================
# 5. run model
# ===================================
f.run()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions