1. Earth’s radiation budget#
Introduction#
The “General Circulation of the Atmosphere” is the science of understanding the mean flow on scales from synoptic to global
What does it do?
What does it look like?
How do all the pieces fit together?
The circulation is fundamentally driven by two factors:
Differential heating via radiation
Rotation
In these notes we will begin exploring the first of those two factors: radiation and the energy budget of the Earth.
import numpy as np
import matplotlib.pyplot as plt
import xarray as xr
Earth’s Radiation Budget#
Incoming solar radiation#
Computing the incident sunlight hitting the Earth is a geometrical problem with a known solution so long as we know the details of the Earth’s orbit. For details, see this lecture in Brian Rose’s The Climate Laboratory
fsize = (10,6)
import climlab
lat = np.linspace( -90., 90., 500)
days = np.linspace(0, climlab.utils.constants.days_per_year, 365 )
Q = climlab.solar.insolation.daily_insolation( lat, days )
fig, ax = plt.subplots(figsize=fsize)
CS = ax.contour( days, lat, Q , levels = np.arange(0., 600., 50.) )
ax.clabel(CS, CS.levels, inline=True, fmt='%r', fontsize=10)
ax.set_xlabel('Days since January 1', fontsize=16 )
ax.set_ylabel('Latitude', fontsize=16 )
ax.set_title('Daily average insolation', fontsize=24 )
ax.contourf ( days, lat, Q, levels=[-1000., 0.], colors='k' );
CERES EBAF data#
The CERES-EBAF product is described by Kato et al. [2018].
ceres_path = '/nfs/roselab_rit/data/CERES_EBAF/'
ceres_filename_prefix = 'CERES_EBAF_Ed4.1_Subset_'
ceres_files = [ceres_path + ceres_filename_prefix + '200003-201412.nc',
ceres_path + ceres_filename_prefix + '201501-202202.nc',]
ceres = xr.open_mfdataset(ceres_files)
ceres
<xarray.Dataset> Dimensions: (lon: 360, lat: 180, time: 264) Coordinates: * lon (lon) float32 0.5 1.5 2.5 ... 357.5 358.5 359.5 * lat (lat) float32 -89.5 -88.5 -87.5 ... 88.5 89.5 * time (time) datetime64[ns] 2000-03-15 ... 2022-02-15 Data variables: (12/41) toa_sw_all_mon (time, lat, lon) float32 dask.array<chunksize=(178, 180, 360), meta=np.ndarray> toa_lw_all_mon (time, lat, lon) float32 dask.array<chunksize=(178, 180, 360), meta=np.ndarray> toa_net_all_mon (time, lat, lon) float32 dask.array<chunksize=(178, 180, 360), meta=np.ndarray> toa_sw_clr_c_mon (time, lat, lon) float32 dask.array<chunksize=(178, 180, 360), meta=np.ndarray> toa_lw_clr_c_mon (time, lat, lon) float32 dask.array<chunksize=(178, 180, 360), meta=np.ndarray> toa_net_clr_c_mon (time, lat, lon) float32 dask.array<chunksize=(178, 180, 360), meta=np.ndarray> ... ... sfc_net_tot_all_mon (time, lat, lon) float32 dask.array<chunksize=(178, 180, 360), meta=np.ndarray> sfc_net_tot_clr_c_mon (time, lat, lon) float32 dask.array<chunksize=(178, 180, 360), meta=np.ndarray> sfc_net_tot_clr_t_mon (time, lat, lon) float32 dask.array<chunksize=(178, 180, 360), meta=np.ndarray> sfc_cre_net_sw_mon (time, lat, lon) float32 dask.array<chunksize=(178, 180, 360), meta=np.ndarray> sfc_cre_net_lw_mon (time, lat, lon) float32 dask.array<chunksize=(178, 180, 360), meta=np.ndarray> sfc_cre_net_tot_mon (time, lat, lon) float32 dask.array<chunksize=(178, 180, 360), meta=np.ndarray> Attributes: title: CERES EBAF TOA and Surface Fluxes. Monthly Averages and 07/... institution: NASA Langley Research Center Conventions: CF-1.4 comment: Climatology from 07/2005 to 06/2015 version: Edition 4.1; Release Date June 8, 2021 DOI: 10.5067/TERRA-AQUA/CERES/EBAF_L3B004.1
- lon: 360
- lat: 180
- time: 264
- lon(lon)float320.5 1.5 2.5 ... 357.5 358.5 359.5
- long_name :
- longitude
- standard_name :
- longitude
- units :
- degrees_east
- valid_range :
- [-180. 360.]
array([ 0.5, 1.5, 2.5, ..., 357.5, 358.5, 359.5], dtype=float32)
- lat(lat)float32-89.5 -88.5 -87.5 ... 88.5 89.5
- long_name :
- latitude
- standard_name :
- latitude
- units :
- degrees_north
- valid_range :
- [-90. 90.]
array([-89.5, -88.5, -87.5, -86.5, -85.5, -84.5, -83.5, -82.5, -81.5, -80.5, -79.5, -78.5, -77.5, -76.5, -75.5, -74.5, -73.5, -72.5, -71.5, -70.5, -69.5, -68.5, -67.5, -66.5, -65.5, -64.5, -63.5, -62.5, -61.5, -60.5, -59.5, -58.5, -57.5, -56.5, -55.5, -54.5, -53.5, -52.5, -51.5, -50.5, -49.5, -48.5, -47.5, -46.5, -45.5, -44.5, -43.5, -42.5, -41.5, -40.5, -39.5, -38.5, -37.5, -36.5, -35.5, -34.5, -33.5, -32.5, -31.5, -30.5, -29.5, -28.5, -27.5, -26.5, -25.5, -24.5, -23.5, -22.5, -21.5, -20.5, -19.5, -18.5, -17.5, -16.5, -15.5, -14.5, -13.5, -12.5, -11.5, -10.5, -9.5, -8.5, -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 21.5, 22.5, 23.5, 24.5, 25.5, 26.5, 27.5, 28.5, 29.5, 30.5, 31.5, 32.5, 33.5, 34.5, 35.5, 36.5, 37.5, 38.5, 39.5, 40.5, 41.5, 42.5, 43.5, 44.5, 45.5, 46.5, 47.5, 48.5, 49.5, 50.5, 51.5, 52.5, 53.5, 54.5, 55.5, 56.5, 57.5, 58.5, 59.5, 60.5, 61.5, 62.5, 63.5, 64.5, 65.5, 66.5, 67.5, 68.5, 69.5, 70.5, 71.5, 72.5, 73.5, 74.5, 75.5, 76.5, 77.5, 78.5, 79.5, 80.5, 81.5, 82.5, 83.5, 84.5, 85.5, 86.5, 87.5, 88.5, 89.5], dtype=float32)
- time(time)datetime64[ns]2000-03-15 ... 2022-02-15
- long_name :
- time
- delta_t :
- 0000-00-01 00:00:00
array(['2000-03-15T00:00:00.000000000', '2000-04-15T00:00:00.000000000', '2000-05-15T00:00:00.000000000', ..., '2021-12-15T00:00:00.000000000', '2022-01-15T00:00:00.000000000', '2022-02-15T00:00:00.000000000'], dtype='datetime64[ns]')
- toa_sw_all_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Top of The Atmosphere Shortwave Flux, All-Sky conditions, Monthly Means
- standard_name :
- TOA Shortwave Flux - All-Sky
- CF_name :
- toa_outgoing_shortwave_flux
- comment :
- none
- units :
- W m-2
- valid_min :
- 0.00000
- valid_max :
- 600.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - toa_lw_all_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Top of The Atmosphere Longwave Flux, All-Sky conditions, Monthly Means
- standard_name :
- TOA Longwave Flux - All-Sky
- CF_name :
- toa_outgoing_longwave_flux
- comment :
- none
- units :
- W m-2
- valid_min :
- 0.00000
- valid_max :
- 400.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - toa_net_all_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Top of The Atmosphere Net Flux, All-Sky conditions, Monthly Means
- standard_name :
- TOA Net Flux - All-Sky
- CF_name :
- toa_net_downward_flux
- comment :
- none
- units :
- W m-2
- valid_min :
- -400.000
- valid_max :
- 400.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - toa_sw_clr_c_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Top of The Atmosphere Shortwave Flux, Clear-Sky (for cloud-free areas of region) conditions, Monthly Means
- standard_name :
- TOA Shortwave Flux - Clear-Sky (for cloud-free areas of region)
- CF_name :
- none
- comment :
- none
- units :
- W m-2
- valid_min :
- 0.00000
- valid_max :
- 600.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - toa_lw_clr_c_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Top of The Atmosphere Longwave Flux, Clear-Sky (for cloud-free areas of region) conditions, Monthly Means
- standard_name :
- TOA Longwave Flux - Clear-Sky (for cloud-free areas of region)
- CF_name :
- none
- comment :
- none
- units :
- W m-2
- valid_min :
- 0.00000
- valid_max :
- 400.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - toa_net_clr_c_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Top of The Atmosphere Net Flux, Clear-Sky (for cloud-free areas of region) conditions, Monthly Means
- standard_name :
- TOA Net Flux - Clear-Sky (for cloud-free areas of region)
- CF_name :
- none
- comment :
- none
- units :
- W m-2
- valid_min :
- -400.000
- valid_max :
- 400.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - toa_sw_clr_t_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Top of The Atmosphere Shortwave Flux, Clear-Sky (for total region) conditions, Monthly Means
- standard_name :
- TOA Shortwave Flux - Clear-Sky (for total region)
- CF_name :
- none
- comment :
- Clear-sky flux computed by radiative transfer model where clouds are removed from the atmospheric column, which is more consistent with the way in which climate models define clear-sky flux.
- units :
- W m-2
- valid_min :
- 0.00000
- valid_max :
- 600.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - toa_lw_clr_t_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Top of The Atmosphere Longwave Flux, Clear-Sky (for total region) conditions, Monthly Means
- standard_name :
- TOA Longwave Flux - Clear-Sky (for total region)
- CF_name :
- none
- comment :
- Clear-sky flux computed by radiative transfer model where clouds are removed from the atmospheric column, which is more consistent with the way in which climate models define clear-sky flux.
- units :
- W m-2
- valid_min :
- 0.00000
- valid_max :
- 400.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - toa_net_clr_t_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Top of The Atmosphere Net Flux, Clear-Sky (for total region) conditions, Monthly Means
- standard_name :
- TOA Net Flux - Clear-Sky (for total region)
- CF_name :
- none
- comment :
- Clear-sky flux computed by radiative transfer model where clouds are removed from the atmospheric column, which is more consistent with the way in which climate models define clear-sky flux.
- units :
- W m-2
- valid_min :
- -400.000
- valid_max :
- 400.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - toa_cre_sw_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Top of The Atmosphere Cloud Radiative Effects Shortwave Flux, (uses Clear-Sky for total region), Monthly Means
- standard_name :
- TOA CRE Shortwave Flux
- CF_name :
- toa_shortwave_cloud_radiative_effect
- comment :
- Calculated as all-sky flux minus clear-sky (for total region) flux.
- units :
- W m-2
- valid_min :
- -400.000
- valid_max :
- 100.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - toa_cre_lw_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Top of The Atmosphere Cloud Radiative Effects Longwave Flux, (uses Clear-Sky for total region), Monthly Means
- standard_name :
- TOA CRE Longwave Flux
- CF_name :
- toa_longwave_cloud_radiative_effect
- comment :
- Calculated as all-sky flux minus clear-sky (for total region) flux.
- units :
- W m-2
- valid_min :
- -100.000
- valid_max :
- 300.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - toa_cre_net_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Top of The Atmosphere Cloud Radiative Effects Net Flux, (uses Clear-Sky for total region), Monthly Means
- standard_name :
- TOA CRE Net Flux
- CF_name :
- toa_net_cloud_radiative_effect
- comment :
- Calculated as all-sky flux minus clear-sky (for total region) flux.
- units :
- W m-2
- valid_min :
- -400.000
- valid_max :
- 400.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - solar_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Incoming Solar Flux, Monthly Means
- standard_name :
- Incoming Solar Flux
- CF_name :
- toa_incoming_shortwave_flux
- comment :
- none
- units :
- W m-2
- valid_min :
- 0.00000
- valid_max :
- 800.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - cldarea_total_daynight_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Cloud Area Fraction, Daytime-and-Nighttime conditions, Monthly Means
- standard_name :
- Cloud Area Fraction - Daytime-and-Nighttime
- CF_name :
- cloud_area_fraction
- comment :
- none
- units :
- percent
- valid_min :
- 0.00000
- valid_max :
- 100.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - cldpress_total_daynight_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Cloud Effective Pressure, Daytime-and-Nighttime conditions, Monthly Means
- standard_name :
- Cloud Effective Pressure - Daytime-and-Nighttime
- CF_name :
- none
- comment :
- none
- units :
- hPa
- valid_min :
- 0.00000
- valid_max :
- 1050.00
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - cldtemp_total_daynight_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Cloud Effective Temperature, Daytime-and-Nighttime conditions, Monthly Means
- standard_name :
- Cloud Effective Temperature - Daytime-and-Nighttime
- CF_name :
- none
- comment :
- none
- units :
- K
- valid_min :
- 150.000
- valid_max :
- 350.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - cldtau_total_day_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Cloud Visible Optical Depth, Daytime conditions, Monthly Means
- standard_name :
- Cloud Visible Optical Depth - Daytime
- CF_name :
- none
- comment :
- none
- units :
- dimensionless
- valid_min :
- 0.00000
- valid_max :
- 250.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_sw_down_all_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Shortwave Flux Down, All-Sky conditions, Monthly Means
- standard_name :
- Surface Shortwave Flux Down - All-Sky
- CF_name :
- surface_downwelling_shortwave_flux_in_air
- comment :
- none
- units :
- W m-2
- valid_min :
- 0.00000
- valid_max :
- 520.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_sw_down_clr_c_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Shortwave Flux Down, Clear-Sky (for cloud-free areas of region) conditions, Monthly Means
- standard_name :
- Surface Shortwave Flux Down - Clear-Sky (for cloud-free areas of region)
- CF_name :
- surface_downwelling_shortwave_flux_in_air_assuming_clear_sky
- comment :
- none
- units :
- W m-2
- valid_min :
- 0.00000
- valid_max :
- 520.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_sw_down_clr_t_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Shortwave Flux Down, Clear-Sky (for total region) conditions, Monthly Means
- standard_name :
- Surface Shortwave Flux Down - Clear-Sky (for total region)
- CF_name :
- none
- comment :
- Clear-sky flux computed by radiative transfer model where clouds are removed from the atmospheric column, which is more consistent with the way in which climate models define clear-sky flux.
- units :
- W m-2
- valid_min :
- 0.00000
- valid_max :
- 520.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_sw_up_all_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Shortwave Flux Up, All-Sky conditions, Monthly Means
- standard_name :
- Surface Shortwave Flux Up - All-Sky
- CF_name :
- surface_upwelling_shortwave_flux_in_air
- comment :
- none
- units :
- W m-2
- valid_min :
- 0.00000
- valid_max :
- 420.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_sw_up_clr_c_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Shortwave Flux Up, Clear-Sky (for cloud-free areas of region) conditions, Monthly Means
- standard_name :
- Surface Shortwave Flux Up - Clear-Sky (for cloud-free areas of region)
- CF_name :
- surface_upwelling_shortwave_flux_in_air_assuming_clear_sky
- comment :
- none
- units :
- W m-2
- valid_min :
- 0.00000
- valid_max :
- 420.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_sw_up_clr_t_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Shortwave Flux Up, Clear-Sky (for total region) conditions, Monthly Means
- standard_name :
- Surface Shortwave Flux Up - Clear-Sky (for total region)
- CF_name :
- none
- comment :
- Clear-sky flux computed by radiative transfer model where clouds are removed from the atmospheric column, which is more consistent with the way in which climate models define clear-sky flux.
- units :
- W m-2
- valid_min :
- 0.00000
- valid_max :
- 420.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_lw_down_all_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Longwave Flux Down, All-Sky conditions, Monthly Means
- standard_name :
- Surface Longwave Flux Down - All-Sky
- CF_name :
- surface_downwelling_longwave_flux_in_air
- comment :
- none
- units :
- W m-2
- valid_min :
- 40.0000
- valid_max :
- 500.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_lw_down_clr_c_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Longwave Flux Down, Clear-Sky (for cloud-free areas of region) conditions, Monthly Means
- standard_name :
- Surface Longwave Flux Down - Clear-Sky (for cloud-free areas of region)
- CF_name :
- surface_downwelling_longwave_flux_in_air_assuming_clear_sky
- comment :
- none
- units :
- W m-2
- valid_min :
- 40.0000
- valid_max :
- 500.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_lw_down_clr_t_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Longwave Flux Down, Clear-Sky (for total region) conditions, Monthly Means
- standard_name :
- Surface Longwave Flux Down - Clear-Sky (for total region)
- CF_name :
- none
- comment :
- Clear-sky flux computed by radiative transfer model where clouds are removed from the atmospheric column, which is more consistent with the way in which climate models define clear-sky flux.
- units :
- W m-2
- valid_min :
- 40.0000
- valid_max :
- 500.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_lw_up_all_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Longwave Flux Up, All-Sky conditions, Monthly Means
- standard_name :
- Surface Longwave Flux Up - All-Sky
- CF_name :
- surface_upwelling_longwave_flux_in_air
- comment :
- none
- units :
- W m-2
- valid_min :
- 50.0000
- valid_max :
- 650.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_lw_up_clr_c_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Longwave Flux Up, Clear-Sky (for cloud-free areas of region) conditions, Monthly Means
- standard_name :
- Surface Longwave Flux Up - Clear-Sky (for cloud-free areas of region)
- CF_name :
- surface_upwelling_longwave_flux_in_air_assuming_clear_sky
- comment :
- none
- units :
- W m-2
- valid_min :
- 50.0000
- valid_max :
- 650.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_lw_up_clr_t_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Longwave Flux Up, Clear-Sky (for total region) conditions, Monthly Means
- standard_name :
- Surface Longwave Flux Up - Clear-Sky (for total region)
- CF_name :
- none
- comment :
- Clear-sky flux computed by radiative transfer model where clouds are removed from the atmospheric column, which is more consistent with the way in which climate models define clear-sky flux.
- units :
- W m-2
- valid_min :
- 50.0000
- valid_max :
- 650.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_net_sw_all_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Net Shortwave Flux, All-Sky conditions, Monthly Means
- standard_name :
- Surface Net Shortwave Flux - All-Sky
- CF_name :
- surface_net_downward_shortwave_flux
- comment :
- none
- units :
- W m-2
- valid_min :
- 0.00000
- valid_max :
- 600.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_net_sw_clr_c_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Net Shortwave Flux, Clear-Sky (for cloud-free areas of region) conditions, Monthly Means
- standard_name :
- Surface Net Shortwave Flux - Clear-Sky (for cloud-free areas of region)
- CF_name :
- surface_net_downward_shortwave_flux_assuming_clear_sky
- comment :
- none
- units :
- W m-2
- valid_min :
- 0.00000
- valid_max :
- 600.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_net_sw_clr_t_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Net Shortwave Flux, Clear-Sky (for total region) conditions, Monthly Means
- standard_name :
- Surface Net Shortwave Flux - Clear-Sky (for total region)
- CF_name :
- none
- comment :
- Clear-sky flux computed by radiative transfer model where clouds are removed from the atmospheric column, which is more consistent with the way in which climate models define clear-sky flux.
- units :
- W m-2
- valid_min :
- 0.00000
- valid_max :
- 600.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_net_lw_all_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Net Longwave Flux, All-Sky conditions, Monthly Means
- standard_name :
- Surface Net Longwave Flux - All-Sky
- CF_name :
- surface_net_downward_longwave_flux
- comment :
- none
- units :
- W m-2
- valid_min :
- -300.000
- valid_max :
- 100.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_net_lw_clr_c_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Net Longwave Flux, Clear-Sky (for cloud-free areas of region) conditions, Monthly Means
- standard_name :
- Surface Net Longwave Flux - Clear-Sky (for cloud-free areas of region)
- CF_name :
- surface_net_downward_longwave_flux_assuming_clear_sky
- comment :
- none
- units :
- W m-2
- valid_min :
- -300.000
- valid_max :
- 100.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_net_lw_clr_t_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Net Longwave Flux, Clear-Sky (for total region) conditions, Monthly Means
- standard_name :
- Surface Net Longwave Flux - Clear-Sky (for total region)
- CF_name :
- none
- comment :
- Clear-sky flux computed by radiative transfer model where clouds are removed from the atmospheric column, which is more consistent with the way in which climate models define clear-sky flux.
- units :
- W m-2
- valid_min :
- -300.000
- valid_max :
- 100.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_net_tot_all_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Net Total Flux, All-Sky conditions, Monthly Means
- standard_name :
- Surface Net Total Flux - All-Sky
- CF_name :
- surface_net_downward_radiative_flux
- comment :
- none
- units :
- W m-2
- valid_min :
- -300.000
- valid_max :
- 500.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_net_tot_clr_c_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Net Total Flux, Clear-Sky (for cloud-free areas of region) conditions, Monthly Means
- standard_name :
- Surface Net Total Flux - Clear-Sky (for cloud-free areas of region)
- CF_name :
- surface_net_downward_radiative_flux_assuming_clear_sky
- comment :
- none
- units :
- W m-2
- valid_min :
- -300.000
- valid_max :
- 500.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_net_tot_clr_t_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Net Total Flux, Clear-Sky (for total region) conditions, Monthly Means
- standard_name :
- Surface Net Total Flux - Clear-Sky (for total region)
- CF_name :
- none
- comment :
- Clear-sky flux computed by radiative transfer model where clouds are removed from the atmospheric column, which is more consistent with the way in which climate models define clear-sky flux.
- units :
- W m-2
- valid_min :
- -300.000
- valid_max :
- 500.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_cre_net_sw_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Cloud Radiative Effects Net Shortwave Flux, (uses Clear-Sky for total region), Monthly Means
- standard_name :
- Surface CRE Net Shortwave Flux
- CF_name :
- none
- comment :
- Calculated as all-sky flux minus clear-sky (for total region) flux.
- units :
- W m-2
- valid_min :
- -300.000
- valid_max :
- 100.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_cre_net_lw_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Cloud Radiative Effects Net Longwave Flux, (uses Clear-Sky for total region), Monthly Means
- standard_name :
- Surface CRE Net Longwave Flux
- CF_name :
- none
- comment :
- Calculated as all-sky flux minus clear-sky (for total region) flux.
- units :
- W m-2
- valid_min :
- -100.000
- valid_max :
- 300.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray - sfc_cre_net_tot_mon(time, lat, lon)float32dask.array<chunksize=(178, 180, 360), meta=np.ndarray>
- long_name :
- Surface Cloud Radiative Effects Net Total Flux, (uses Clear-Sky for total region), Monthly Means
- standard_name :
- Surface CRE Net Total Flux
- CF_name :
- none
- comment :
- Calculated as all-sky flux minus clear-sky (for total region) flux.
- units :
- W m-2
- valid_min :
- -100.000
- valid_max :
- 300.000
Array Chunk Bytes 65.26 MiB 44.00 MiB Shape (264, 180, 360) (178, 180, 360) Count 5 Graph Layers 2 Chunks Type float32 numpy.ndarray
- title :
- CERES EBAF TOA and Surface Fluxes. Monthly Averages and 07/2005 to 06/2015 Climatology.
- institution :
- NASA Langley Research Center
- Conventions :
- CF-1.4
- comment :
- Climatology from 07/2005 to 06/2015
- version :
- Edition 4.1; Release Date June 8, 2021
- DOI :
- 10.5067/TERRA-AQUA/CERES/EBAF_L3B004.1
# ceres_URL = '/nfs/roselab_rit/data/CERES_EBAF_Ed4.1_200003-202202.nc'
# ceres = xr.open_dataset(ceres_URL)
# ceres
Computing monthly climatologies of CERES data#
We can use Xarray’s groupby
method to easily applying averaging operators over each calendar month.
solar_clim = ceres.solar_mon.mean(dim='lon').groupby("time.month").mean()
solar_clim
<xarray.DataArray 'solar_mon' (month: 12, lat: 180)> dask.array<transpose, shape=(12, 180), dtype=float32, chunksize=(1, 180), chunktype=numpy.ndarray> Coordinates: * lat (lat) float32 -89.5 -88.5 -87.5 -86.5 -85.5 ... 86.5 87.5 88.5 89.5 * month (month) int64 1 2 3 4 5 6 7 8 9 10 11 12
- month: 12
- lat: 180
- dask.array<chunksize=(1, 180), meta=np.ndarray>
Array Chunk Bytes 8.44 kiB 720 B Shape (12, 180) (1, 180) Count 71 Graph Layers 12 Chunks Type float32 numpy.ndarray - lat(lat)float32-89.5 -88.5 -87.5 ... 88.5 89.5
array([-89.5, -88.5, -87.5, -86.5, -85.5, -84.5, -83.5, -82.5, -81.5, -80.5, -79.5, -78.5, -77.5, -76.5, -75.5, -74.5, -73.5, -72.5, -71.5, -70.5, -69.5, -68.5, -67.5, -66.5, -65.5, -64.5, -63.5, -62.5, -61.5, -60.5, -59.5, -58.5, -57.5, -56.5, -55.5, -54.5, -53.5, -52.5, -51.5, -50.5, -49.5, -48.5, -47.5, -46.5, -45.5, -44.5, -43.5, -42.5, -41.5, -40.5, -39.5, -38.5, -37.5, -36.5, -35.5, -34.5, -33.5, -32.5, -31.5, -30.5, -29.5, -28.5, -27.5, -26.5, -25.5, -24.5, -23.5, -22.5, -21.5, -20.5, -19.5, -18.5, -17.5, -16.5, -15.5, -14.5, -13.5, -12.5, -11.5, -10.5, -9.5, -8.5, -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 21.5, 22.5, 23.5, 24.5, 25.5, 26.5, 27.5, 28.5, 29.5, 30.5, 31.5, 32.5, 33.5, 34.5, 35.5, 36.5, 37.5, 38.5, 39.5, 40.5, 41.5, 42.5, 43.5, 44.5, 45.5, 46.5, 47.5, 48.5, 49.5, 50.5, 51.5, 52.5, 53.5, 54.5, 55.5, 56.5, 57.5, 58.5, 59.5, 60.5, 61.5, 62.5, 63.5, 64.5, 65.5, 66.5, 67.5, 68.5, 69.5, 70.5, 71.5, 72.5, 73.5, 74.5, 75.5, 76.5, 77.5, 78.5, 79.5, 80.5, 81.5, 82.5, 83.5, 84.5, 85.5, 86.5, 87.5, 88.5, 89.5], dtype=float32)
- month(month)int641 2 3 4 5 6 7 8 9 10 11 12
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
The monthly mean insolation as represented in CERES data#
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
fig, ax = plt.subplots(figsize=fsize)
levels = np.arange(0., 600., 50.)
CS = ax.contour(months, ceres.lat, solar_clim.transpose(), levels=levels)
ax.clabel(CS, CS.levels, inline=True, fontsize=10)
<a list of 32 text.Text objects>
def annual_line_plot(da, title=''):
'''A little helper function to make some nice line plots of annual means compared to January and July'''
fig = plt.figure(figsize=fsize)
da.mean(dim='month').plot(label='Annual', linewidth=3)
for month_index in [0,6]:
da.isel(month=month_index).plot(label=months[month_index])
plt.legend()
plt.xlim([-90,90])
plt.grid()
plt.title(title, fontsize=18);
annual_line_plot(solar_clim, title='Incoming solar radiation')
Albedo#
The ratio of outgoing to incoming SW radiation:
# masking out points where the insolation is near zero
ztoa_sw_all_clim = ceres.toa_sw_all_mon.mean(dim='lon').groupby("time.month").mean()
albedo = ztoa_sw_all_clim / solar_clim.where(solar_clim > 10.)
annual_line_plot(albedo, title='TOA albedo')
plt.ylabel('Albedo');
Absorbed shortwave radiation#
The residual between what comes in and what goes out:
absorbedSW = solar_clim - ztoa_sw_all_clim
annual_line_plot(absorbedSW, title='Absorbed shortwave flux')
plt.ylabel('flux (W m$^{-2}$)')
Text(0, 0.5, 'flux (W m$^{-2}$)')
Outgoing longwave radiation#
ztoa_lw_all_clim = ceres.toa_lw_all_mon.mean(dim='lon').groupby("time.month").mean()
annual_line_plot(ztoa_lw_all_clim, title='Outgoing longwave radiation')
Net radiation at TOA#
The net radiation is the difference between Absorbed Solar Radiation (ASR) and the Outgoing Longwave Radiation (OLR):
ztoa_net_all_clim = ceres.toa_net_all_mon.mean(dim="lon").groupby("time.month").mean()
annual_line_plot(ztoa_net_all_clim, title='TOA net radiative flux')
ylim = [-200, 200]
plt.plot([-90,90], [0,0], color='black')
plt.fill_between([-90,90], [ylim[0], ylim[0]], alpha=0.3, color='lightskyblue')
plt.text(-80, 160, 'net warming', fontsize=14)
plt.fill_between([-90,90], [ylim[1], ylim[1]], alpha=0.3, color='salmon')
plt.text(0, -140, 'net cooling', fontsize=14)
plt.ylim(ylim);
Hemispheric energy balance#
Energy storage by latitude and season#
A published version#
And our own version based on the full CERES-EBAF dataset#
fig, ax = plt.subplots(figsize=fsize)
CS = ax.contour(months, ceres.lat, ztoa_net_all_clim.transpose())
ax.clabel(CS, CS.levels, inline=True, fmt='%r', fontsize=10)
ax.set_xlabel('Month', fontsize=16 )
ax.set_ylabel('Latitude', fontsize=16 )
ax.set_title('Heat storage of the climate system', fontsize=18 )
Text(0.5, 1.0, 'Heat storage of the climate system')
Meridional energy transport#
Precipitation and the ITCZ#
Inferring energy transport from net radiation#
Consider the energy budget of a column:
where
\(E\) is the energy per unit area stored in the column
\(F_{net}^{\downarrow}\) is the net downward flux of energy at TOA
\(\vec{v} E\) is the total flux of the energy by the fluid atmosphere and ocean
Averaging over a long period of time, the left hand side is negligible so that
And we can expand the flux divergence in spherical coordinates as … (unfinished)