homework 9, version 0
Submission by: Jazzy Doe (jazz@mit.edu)
Homework 9: Climate modeling I
18.S191, fall 2020
"Jazzy Doe"
"jazz"
Let's create a package environment:
Package dependencies
Activating new project at `/tmp/jl_4MXcLy` Updating registry at `~/.julia/registries/General.toml` Resolving package versions... Updating `/tmp/jl_4MXcLy/Project.toml` [31c24e10] + Distributions v0.25.118 [b964fa9f] + LaTeXStrings v1.4.0 [91a5bcdd] + Plots v1.40.14 [7f904dfe] + PlutoUI v0.7.64 [9a3f8284] + Random Updating `/tmp/jl_4MXcLy/Manifest.toml` [6e696c72] + AbstractPlutoDingetjes v1.3.2 [66dad0bd] + AliasTables v1.1.3 [d1d4a3ce] + BitFlags v0.1.9 [d360d2e6] + ChainRulesCore v1.25.1 [9e997f8a] + ChangesOfVariables v0.1.10 [944b1d66] + CodecZlib v0.7.8 [35d6a980] + ColorSchemes v3.29.0 [3da002f7] + ColorTypes v0.12.1 [c3611d14] + ColorVectorSpace v0.11.0 [5ae59095] + Colors v0.13.1 [34da2185] + Compat v4.16.0 [f0e56b4a] + ConcurrentUtilities v2.5.0 [187b0558] + ConstructionBase v1.5.8 [d38c429a] + Contour v0.6.3 [9a962f9c] + DataAPI v1.16.0 [864edb3b] + DataStructures v0.18.22 [b429d917] + DensityInterface v0.4.0 [31c24e10] + Distributions v0.25.118 [ffbed154] + DocStringExtensions v0.9.5 [460bff9d] + ExceptionUnwrapping v0.1.11 [c87230d0] + FFMPEG v0.4.2 [1a297f60] + FillArrays v1.13.0 [53c48c17] + FixedPointNumbers v0.8.5 [1fa38f19] + Format v1.3.7 [28b8d3ca] + GR v0.73.6 [42e2da0e] + Grisu v1.0.2 [cd3eb016] + HTTP v1.10.16 [34004b35] + HypergeometricFunctions v0.3.28 [47d2ed2b] + Hyperscript v0.0.5 [ac1192a8] + HypertextLiteral v0.9.5 [b5f81e59] + IOCapture v0.2.5 [3587e190] + InverseFunctions v0.1.17 [92d709cd] + IrrationalConstants v0.2.4 [1019f520] + JLFzf v0.1.11 [692b3bcd] + JLLWrappers v1.7.0 [682c06a0] + JSON v0.21.4 [b964fa9f] + LaTeXStrings v1.4.0 [23fbe1c1] + Latexify v0.16.8 [2ab3a3ac] + LogExpFunctions v0.3.28 [e6f89c97] + LoggingExtras v1.1.0 [6c6e2e6c] + MIMEs v1.1.0 [1914dd2f] + MacroTools v0.5.16 [739be429] + MbedTLS v1.1.9 [442fdcdd] + Measures v0.3.2 [e1d29d7a] + Missings v1.2.0 [77ba4419] + NaNMath v1.0.3 [4d8831e6] + OpenSSL v1.5.0 [bac558e1] + OrderedCollections v1.8.1 [90014a1f] + PDMats v0.11.31 [69de0a69] + Parsers v2.8.3 [ccf2f8ad] + PlotThemes v3.3.0 [995b91a9] + PlotUtils v1.4.3 [91a5bcdd] + Plots v1.40.14 [7f904dfe] + PlutoUI v0.7.64 [aea7be01] + PrecompileTools v1.2.1 [21216c6a] + Preferences v1.4.3 [43287f4e] + PtrArrays v1.3.0 [1fd47b50] + QuadGK v2.11.2 [3cdcf5f2] + RecipesBase v1.3.4 [01d81517] + RecipesPipeline v0.6.12 [189a3867] + Reexport v1.2.2 [05181044] + RelocatableFolders v1.0.1 [ae029012] + Requires v1.3.1 [79098fc4] + Rmath v0.8.0 [6c6a2e73] + Scratch v1.2.1 [992d4aef] + Showoff v1.0.3 [777ac1f9] + SimpleBufferStream v1.2.0 [a2af1166] + SortingAlgorithms v1.2.1 [276daf66] + SpecialFunctions v2.5.1 [860ef19b] + StableRNGs v1.0.3 [82ae8749] + StatsAPI v1.7.1 [2913bbd2] + StatsBase v0.34.4 [4c63d2b9] + StatsFuns v1.4.0 [62fd8b95] + TensorCore v0.1.1 [3bb67fe8] + TranscodingStreams v0.11.3 [410a4b4d] + Tricks v0.1.10 [5c2747f8] + URIs v1.5.2 [1cfade01] + UnicodeFun v0.4.1 [1986cc42] + Unitful v1.23.1 [45397f5d] + UnitfulLatexify v1.7.0 [41fe7b60] + Unzip v0.2.0 [6e34b625] + Bzip2_jll v1.0.9+0 [83423d85] + Cairo_jll v1.18.5+0 [ee1fde0b] + Dbus_jll v1.16.2+0 [2702e6a9] + EpollShim_jll v0.0.20230411+1 [2e619515] + Expat_jll v2.6.5+0 [b22a6f82] + FFMPEG_jll v4.4.4+1 [a3f928ae] + Fontconfig_jll v2.16.0+0 [d7e528f0] + FreeType2_jll v2.13.4+0 [559328eb] + FriBidi_jll v1.0.17+0 [0656b61e] + GLFW_jll v3.4.0+2 [d2c73de3] + GR_jll v0.73.6+0 [78b55507] + Gettext_jll v0.21.0+0 [7746bdde] + Glib_jll v2.84.0+0 [3b182d85] + Graphite2_jll v1.3.15+0 [2e76f6c2] + HarfBuzz_jll v8.5.1+0 [aacddb02] + JpegTurbo_jll v3.1.1+0 [c1c5ebd0] + LAME_jll v3.100.2+0 [88015f11] + LERC_jll v3.0.0+1 [1d63c593] + LLVMOpenMP_jll v18.1.8+0 [dd4b983a] + LZO_jll v2.10.3+0 [e9f186c6] + Libffi_jll v3.4.7+0 [7e76a0d4] + Libglvnd_jll v1.7.1+1 [94ce4f54] + Libiconv_jll v1.18.0+0 [4b2f31a3] + Libmount_jll v2.41.0+0 [89763e89] + Libtiff_jll v4.5.1+1 [38a345b3] + Libuuid_jll v2.41.0+0 [e7412a2a] + Ogg_jll v1.3.5+1 [458c3c95] + OpenSSL_jll v3.5.0+0 [efe28fd5] + OpenSpecFun_jll v0.5.6+0 [91d4177d] + Opus_jll v1.3.3+0 [36c8627f] + Pango_jll v1.56.3+0 [30392449] + Pixman_jll v0.44.2+0 [c0090381] + Qt6Base_jll v6.7.1+1 [f50d1b31] + Rmath_jll v0.5.1+0 [a44049a8] + Vulkan_Loader_jll v1.3.243+0 [a2964d1f] + Wayland_jll v1.23.1+0 [2381bf8a] + Wayland_protocols_jll v1.44.0+0 [02c8fc9c] + XML2_jll v2.13.6+1 [ffd25f8a] + XZ_jll v5.8.1+0 [f67eecfb] + Xorg_libICE_jll v1.1.2+0 [c834827a] + Xorg_libSM_jll v1.2.6+0 [4f6342f7] + Xorg_libX11_jll v1.8.12+0 [0c0b7dd1] + Xorg_libXau_jll v1.0.13+0 [935fb764] + Xorg_libXcursor_jll v1.2.4+0 [a3789734] + Xorg_libXdmcp_jll v1.1.6+0 [1082639a] + Xorg_libXext_jll v1.3.7+0 [d091e8ba] + Xorg_libXfixes_jll v6.0.1+0 [a51aa0fd] + Xorg_libXi_jll v1.8.3+0 [d1454406] + Xorg_libXinerama_jll v1.1.6+0 [ec84b674] + Xorg_libXrandr_jll v1.5.5+0 [ea2f1a96] + Xorg_libXrender_jll v0.9.12+0 [c7cfdc94] + Xorg_libxcb_jll v1.17.1+0 [cc61e674] + Xorg_libxkbfile_jll v1.1.3+0 [e920d4aa] + Xorg_xcb_util_cursor_jll v0.1.4+0 [12413925] + Xorg_xcb_util_image_jll v0.4.1+0 [2def613f] + Xorg_xcb_util_jll v0.4.1+0 [975044d2] + Xorg_xcb_util_keysyms_jll v0.4.1+0 [0d47668e] + Xorg_xcb_util_renderutil_jll v0.3.10+0 [c22f9ab0] + Xorg_xcb_util_wm_jll v0.4.2+0 [35661453] + Xorg_xkbcomp_jll v1.4.7+0 [33bec58e] + Xorg_xkeyboard_config_jll v2.44.0+0 [c5fb5394] + Xorg_xtrans_jll v1.6.0+0 [3161d3a3] + Zstd_jll v1.5.7+1 [35ca27e7] + eudev_jll v3.2.14+0 [214eeab7] + fzf_jll v0.61.1+0 [a4ae2306] + libaom_jll v3.11.0+0 [0ac62f75] + libass_jll v0.15.2+0 [1183f4f0] + libdecor_jll v0.2.2+0 [2db6ffa8] + libevdev_jll v1.13.4+0 [f638f0a6] + libfdk_aac_jll v2.0.3+0 [36db933b] + libinput_jll v1.28.1+0 [b53b4c65] + libpng_jll v1.6.49+0 [f27f6e37] + libvorbis_jll v1.3.7+2 [009596ad] + mtdev_jll v1.1.7+0 [1270edf5] + x264_jll v2021.5.5+0 [dfaa095f] + x265_jll v3.5.0+0 [d8fb68d0] + xkbcommon_jll v1.8.1+0 [0dad84c5] + ArgTools [56f22d72] + Artifacts [2a0f44e3] + Base64 [ade2ca70] + Dates [8bb1440f] + DelimitedFiles [f43a241f] + Downloads [7b1f6079] + FileWatching [b77e0a4c] + InteractiveUtils [b27032c2] + LibCURL [76f85450] + LibGit2 [8f399da3] + Libdl [37e2e46d] + LinearAlgebra [56ddb016] + Logging [d6f4376e] + Markdown [a63ad114] + Mmap [ca575930] + NetworkOptions [44cfe95a] + Pkg [de0858da] + Printf [3fa0cd96] + REPL [9a3f8284] + Random [ea8e919c] + SHA [9e88b42a] + Serialization [6462fe0b] + Sockets [2f01184e] + SparseArrays [10745b16] + Statistics [4607b0f0] + SuiteSparse [fa267f1f] + TOML [a4e569a6] + Tar [8dfed614] + Test [cf7118a7] + UUIDs [4ec0a83e] + Unicode [e66e0078] + CompilerSupportLibraries_jll [deac9b47] + LibCURL_jll [29816b5a] + LibSSH2_jll [c8ffd9c3] + MbedTLS_jll [14a3606d] + MozillaCACerts_jll [4536629a] + OpenBLAS_jll [05823500] + OpenLibm_jll [efcefdf7] + PCRE2_jll [83775a58] + Zlib_jll [8e850b90] + libblastrampoline_jll [8e850ede] + nghttp2_jll [3f19e933] + p7zip_jll
Before working on the homework, make sure that you have watched the first lecture on climate modeling 👆. We have included the important functions from this lecture notebook in the next cell. Feel free to have a look!
221.2Main.workspace#3.ModelExercise 1 - policy goals under uncertainty
A recent ground-breaking review paper produced the most comprehensive and up-to-date estimate of the climate feedback parameter, which they find to be
i.e. our knowledge of the real value is normally distributed with a mean value
Definition: Equilibrium climate sensitivity (ECS) is defined as the amount of warming
At equilibrium, the energy balance model equation is:
From this, we subtract the preindustrial energy balance, which is given by:
The result of this subtraction, after rearranging, is our definition of
The plot below provides an example of an "abrupt 2xCO₂" experiment, a classic experimental treatment method in climate modelling which is used in practice to estimate ECS for a particular model. (Note: in complicated climate models the values of the parameters
The simulation begins at the preindustrial equilibrium, i.e. a temperature
Exercise 1.1 - Develop understanding for feedbacks and climate sensitivity
👉 Change the value of
Hello world!
👉 What happens when
Hello world!
Reveal answer:
👉 Create a graph to visualize ECS as a function of B.
Exercise 1.2 - Doubling CO₂
To compute ECS, we doubled the CO₂ in our atmosphere. This factor 2 is not entirely arbitrary: without substantial effort to reduce CO₂ emissions, we are expected to at least double the CO₂ in our atmosphere by 2100.
Right now, our CO₂ concentration is 415 ppm – 1.482 times the pre-industrial value of 280 ppm from 1850.
The CO₂ concentrations in the future depend on human action. There are several models for future concentrations, which are formed by assuming different policy scenarios. A baseline model is RCP8.5 - a "worst-case" high-emissions scenario. In our notebook, this model is given as a function of
👉 In what year are we expected to have doubled the CO₂ concentration, under policy scenario RCP8.5?
missingHint
The function findfirst might be helpful.
Exercise 1.3 - Uncertainty in B
The climate feedback parameter
A value of
0.4-1.66248
-0.680517
-1.45014
-0.782607
-0.793282
-1.55874
-2.26005
-1.07598
-1.20939
-1.4583
-2.16568
-1.41794
-1.78338
-1.40214
-1.25901
-0.750134
-1.62329
-2.20928
-1.3201
-0.52878
-1.26784
-1.60451
-1.18307
-1.03827
-1.16284
-1.84149
-1.33446
-1.47511
-1.62268
-1.22538
👉 Generate a probability distribution for the ECS based on the probability distribution function for
2.08467
5.0928
2.38992
4.42845
4.36886
2.22342
1.53348
3.221
2.86569
2.37656
1.6003
2.44421
1.94336
2.47175
2.75275
4.62015
2.13501
1.56871
2.62535
6.55421
2.73358
2.16
2.92945
3.338
2.98041
1.88202
2.5971
2.34947
2.13581
2.82829
Answer:
It looks like the ECS distribution is not normally distributed, even though
👉 How does
2.63932980916404823.01363453323253560.50110022004400880.34266853370674133👉 Does accounting for uncertainty in feedbacks make our expectation of global warming better (less implied warming) or worse (more implied warming)?
Hello world!
Exercise 1.5 - Running the model
In the lecture notebook we introduced a mutable struct EBM (energy balance model), which contains:
the parameters of our climate simulation (
C,a,A,B,CO2_PI,α,S, see details below)a function
CO2, which maps a timetto the concentrations at that year. For example, we use the functiont -> 280to simulate a model with concentrations fixed at 280 ppm.
EBM also contains the simulation results, in two arrays:
Tis the array of tempartures (°C,Float64).tis the array of timestamps (years,Float64), of the same size asT.
Properties of an EBM obect:
| Name | Description |
|---|---|
A | Linearized outgoing thermal radiation: offset |
B | Linearized outgoing thermal radiation: slope. or: climate feedback parameter |
α | Planet albedo, 0.0-1.0 |
S | Solar insulation |
C | Atmosphere and upper-ocean heat capacity |
a | CO₂ forcing effect |
CO2_PI | Pre-industrial CO₂ concentration |
You can set up an instance of EBM like so:
14.0
1850.0
1.0
#13 (generic function with 1 method)
51.0
5.0
221.2
-1.3
280.0
0.3
1368.0
Have look inside this object. We see that T and t are initialized to a 1-element array.
Let's run our model:
14.0
14.0
14.0
14.0
14.0
14.0
14.0
14.0
14.0
14.0
1850.0
1851.0
1852.0
1853.0
1854.0
1855.0
1856.0
1857.0
1858.0
2020.0
1.0
#15 (generic function with 1 method)
51.0
5.0
221.2
-1.3
280.0
0.3
1368.0
Again, look inside simulated_model and notice that T and t have accumulated the simulation results.
In this simulation, we used T0 = 14 and CO2 = t -> 280, which is why T is constant during our simulation. These parameters are the default, pre-industrial values, and our model is based on this equilibrium.
👉 Run a simulation with policy scenario RCP8.5, and plot the computed temperature graph. What is the global temperature at 2100?
missingAdditional parameters can be set using keyword arguments. For example:
Model.EBM(14, 1850, 1, t -> 280.0; B=-2.0)
Creates the same model as before, but with B = -2.0.
👉 Write a function temperature_response that takes a function CO2 and an optional value B as parameters, and returns the temperature at 2100 according to our model.
temperature_response (generic function with 2 methods)missingmissingmissingExercise 1.6 - Application to policy relevant questions
We talked about two emissions scenarios: RCP2.6 (strong mitigation - controlled CO2 concentrations) and RCP8.5 (no mitigation - high CO2 concentrations). These are given by the following functions:
280.0
280.0
1850:2100We are interested in how the uncertainty in our input
👉 What is the probability that we see more than 2°C of warming by 2100 under the low-emissions scenario RCP2.6? What about under the high-emissions scenario RCP8.5?
Exercise 2 - How did Snowball Earth melt?
In lecture 21 (see below), we discovered that increases in the brightness of the Sun are not sufficient to explain how Snowball Earth eventually melted.
We talked about a second theory – a large increase in CO₂ (by volcanoes) could have caused a strong enough greenhouse effect to melt the Snowball. If we imagine that the CO₂ then decreased (e.g. by getting sequestered by the now liquid ocean), we might be able to explain how we transitioned from a hostile Snowball Earth to today's habitable "Waterball" Earth.
In this exercise, you will estimate how much CO₂ would be needed to melt the Snowball and visualize a possible trajectory for Earth's climate over the past 700 million years by making an interactive bifurcation diagram.
Exercise 2.1
In the lecture notebook (video above), we had a bifurcation diagram of
Below we have an empty diagram, which is already set up with a CO₂ vs
We used two helper functions:
add_cold_hot_areas! (generic function with 1 method)add_reference_points! (generic function with 1 method)👉 Create a slider for CO2 between CO2min and CO2max. Just like the horizontal axis of our plot, we want the slider to be logarithmic.
281.8382931264455Hint
@bind log_CO2 Slider(❓)
CO2 = 10^log_CO2
-48.0
0.0
5.0
CO2_const (generic function with 1 method)
51.0
5.0
221.2
-1.3
280.0
0.3
1368.0
👉 Write a function step_model! that takes an existing ebm and new_CO2, which performs a step of our interactive process:
Reset the model by setting the
ebm.tandebm.Tarrays to a single element. Which value?Assign a new function to
ebm.CO2. What function?Run the model.
step_model! (generic function with 1 method)👉 Inside the plot cell, call the function step_model!.
Parameters
101000000-48The albedo feedback is implemented by the methods below:
α (generic function with 1 method)If you like, make the visualization more informative! Like in the lecture notebook, you could add a trail behind the black dot, or you could plot the stable and unstable branches. It's up to you!
Exercise 2.2
👉 Find the lowest CO₂ concentration necessary to melt the Snowball, programatically.
missingHint
Use a condition on the albedo or temperature to check whether the Snowball has melted.
Hint
Start by writing a function equilibrium_temperature(CO2) which creates a new EBM at the Snowball Earth temperature T = -48 and returns the final temperature for a given CO2 level.
Exercise XX: Lecture transcript
(MIT students only)
Please see the link for hw 9 transcript document on Canvas. We want each of you to correct about 500 lines, but don’t spend more than 20 minutes on it. See the the beginning of the document for more instructions. :point_right: Please mention the name of the video(s) and the line ranges you edited:
Abstraction, lines 1-219; Array Basics, lines 1-137; Course Intro, lines 1-144 (for example)
Before you submit
Remember to fill in your name and Kerberos ID at the top of this notebook.
Function library
Just some helper functions used in the notebook.
hint (generic function with 1 method)almost (generic function with 1 method)still_missing (generic function with 2 methods)keep_working (generic function with 2 methods)Fantastic!
Splendid!
Great!
Yay ❤
Great! 🎉
Well done!
Keep it up!
Good job!
Awesome!
You got the right answer!
Let's move on to the next section.
correct (generic function with 2 methods)not_defined (generic function with 1 method)