docs: def default_absorbers(Tatm,
                  ozone_file = 'apeozone_cam3_5_54.nc',
                  verbose = True,):
      '''Initialize a dictionary of well-mixed radiatively active gases
      All values are volumetric mixing ratios.
  
      Ozone is set to a climatology.
  
      All other gases are assumed well-mixed:
  
          - CO2
          - CH4
          - N2O
          - O2
          - CFC11
          - CFC12
          - CFC22
          - CCL4
  
      Specific values are based on the AquaPlanet Experiment protocols,
      except for O2 which is set the realistic value 0.21
      (affects the RRTMG scheme).
      '''
      absorber_vmr = {}
      absorber_vmr['CO2']   = 348. / 1E6
      absorber_vmr['CH4']   = 1650. / 1E9
      absorber_vmr['N2O']   = 306. / 1E9
      absorber_vmr['O2']    = 0.21
      absorber_vmr['CFC11'] = 0.
      absorber_vmr['CFC12'] = 0.
      absorber_vmr['CFC22'] = 0.
      absorber_vmr['CCL4']  = 0.
  
      # Ozone: start with all zeros, interpolate to data if we can
      xTatm = Tatm.to_xarray()
      O3 = 0. * xTatm
      if ozone_file is not None:
          ozonefilepath = os.path.join(os.path.dirname(__file__), 'data', 'ozone', ozone_file)
          remotepath_http = 'http://thredds.atmos.albany.edu:8080/thredds/fileServer/CLIMLAB/ozone/' + ozone_file
          remotepath_opendap = 'http://thredds.atmos.albany.edu:8080/thredds/dodsC/CLIMLAB/ozone/' + ozone_file
          ozonedata, path = load_data_source(local_path=ozonefilepath,
                                       remote_source_list=[remotepath_http, remotepath_opendap],
                                       open_method=xr.open_dataset,
                                       remote_kwargs={'engine':'pydap'},
                                       verbose=verbose,)
          ##  zonal and time average
          ozone_zon = ozonedata.OZONE.mean(dim=('time','lon')).transpose('lat','lev')
          if ('lat' in xTatm.dims):
              O3source = ozone_zon
          else:
              weight = np.cos(np.deg2rad(ozonedata.lat))
              ozone_global = (ozone_zon * weight).mean(dim='lat') / weight.mean(dim='lat')
              O3source = ozone_global
          try:
              O3 = O3source.interp_like(xTatm)
              # There will be NaNs for gridpoints outside the ozone file domain
              assert not np.any(np.isnan(O3))
          except:
              warnings.warn('Some grid points are beyond the bounds of the ozone file. Ozone values will be extrapolated.')
              try:
                  # passing fill_value=None to the underlying scipy interpolator
                  # will result in extrapolation instead of NaNs
                  O3 = O3source.interp_like(xTatm, kwargs={'fill_value':None})
                  assert not np.any(np.isnan(O3))
              except:
                  warnings.warn('Interpolation of ozone data failed. Setting O3 to zero instead.')
                  O3 = 0. * xTatm
      absorber_vmr['O3'] = O3.values
      return absorber_vmr