OMS-NetZero / FAIR

Finite-amplitude Impulse Response simple climate model
https://docs.fairmodel.net
Apache License 2.0
125 stars 63 forks source link

r0 default value #19

Closed rgieseke closed 1 year ago

rgieseke commented 6 years ago

Hi, a question on the current default value for r0: It is 32.40, in the Disucssion paper, p4 it says

[...] in contrast to Millar et al. (2017b) a pre-industrial r0 = 35 years is used rather than their 32.4 years. This facilitates better agreement with present-day CO2 atmospheric concentrations when spun up from 1765 with historical CO2 and non-CO2 emissions.

Is this for compatibility reasons?

chrisroadmap commented 6 years ago

Yes, for compatibility with v1.0 the default values were left as is so that anyone who has used FAIR in the past doesn't get any surprises when they try to run the latest version. r0=35 gives an ensemble median CO2 in 2017 of 403 ppm, i.e. consistent with observations (of course, the influence of the recent El Nino has affected this, and FAIR only responds to forced variability, but we're probably within 1-2ppm of the long-term trend). Addition of the non-CO2 forcing and use of a different TCR/ECS prior to Millar et al will have changed the results slightly relative to that paper. CO2 concentration wasn't a formal constraint on the ensemble but could (arguably should) be used as such. I can't remember what the median CO2 concentration was for r0=32.4, but I'm sure it wasn't much different to 403.

rgieseke commented 6 years ago

Thanks for the explanation!

This makes a small difference, e.g. for RCP6

396.7 vs 403.8 ppm in 2017

1.5 degrees reached 5 years later and about 0.08 deg. difference in 2100.

r0_value

It's understandable (and great) not wanting to break backwards compatibility but here users coming from the 1.1 are going to get the surprise (if they don't read the paper carefully), aren't they?

Some ideas:

run_co2_only(...)

run_multi_gas(...)

I think the current function call and if clauses could make it sometimes difficult to reason about the code.

Code for plot:

scen = rcp6

C, F, T = fair.forward.fair_scm(
    emissions=scen.Emissions.emissions,
    F_volcanic=scen.Forcing.volcanic,
    F_solar=scen.Forcing.solar,
    natural=natural.Emissions.emissions,
    useMultigas=True,
    r0=32.40
)
C2, F2, T2 = fair.forward.fair_scm(
    emissions=scen.Emissions.emissions,
    F_volcanic=scen.Forcing.volcanic,
    F_solar=scen.Forcing.solar,
    natural=natural.Emissions.emissions,
    useMultigas=True,
    r0=35
)
_, (ax1, ax2) = plt.subplots(1, 2, sharex=True)
ax1.plot(scen.Emissions.year, C[:, 0], color='black')
ax1.plot(scen.Emissions.year, C2[:, 0], color='blue')
ax1.set_title("Concentration [ppm]")
ax1.set_xlim(1750, 2300)
ax1.legend(["r0=32.4", "r0=35.0"])

ax2.plot(scen.Emissions.year, T, color='black')
ax2.plot(scen.Emissions.year, T2, color='blue')
ax2.set_title("Temperature anomaly (K)")
ax2.legend(["r0=32.4", "r0=35.0"])
plt.savefig("r0_value.png")
print(C[scen.Emissions.year == 2017, 0][0])
print(C2[scen.Emissions.year == 2017, 0][0])

print(scen.Emissions.year[T > 1.5][0])
print(scen.Emissions.year[T2 > 1.5][0])
print(scen.Emissions.year[T > 2][0])
print(scen.Emissions.year[T2 > 2][0])

print(T[scen.Emissions.year == 2100])
print(T2[scen.Emissions.year == 2100])
print(T2[scen.Emissions.year == 2100][0] - T[scen.Emissions.year == 2100][0])
richardcode commented 6 years ago

Don't have a problem in changing the default parameters to what ends up in your GMD @chrisroadmap . Maybe would be best to wait for the completion of the paper revisions in case any changes that are required/implemented in response end up shifting this around slightly?

richardcode commented 6 years ago

The value choice is a bit "horses for courses". In Millar et al 2017 we never explicitly constrained against the historical and the value was chosen to be indicative of the response to more idealised pulse experiments with the ESMs/EMICs. Changing this value will give small differences in projections as you have shown @rgieseke .

chrisroadmap commented 6 years ago

I think some of the difference also may come from use of a historical volcanic forcing in the large ensemble that I set up in the GMD paper. This will dampen the historical temperature response and hence the carbon uptake will be more efficient over the historical period with a volcanic forcing switched on. In my ensemble I am trying to match the historical as best as possible through a variety of metrics (GHG concentrations as well as observed temperature) and then project forward using the RCPs. I found this to be much better when using r0=35 and best estimates of other parameters. We vary this in the large ensemble, so there may be a posterior preference for higher or lower values.

chrisroadmap commented 6 years ago

I also agree about having different functions for the carbon cycle and multi-gas models. I'll work on this in the future alongside some proper documentation.

chrisroadmap commented 1 year ago

I think the emphasis on calibration probably renders this discussion redundant now, so closing.