Inputs
======

``VSPEC`` can read in inputs in two ways:

#. From a YAML file
#. From a ``VSPEC.params.InternalParameters`` object

YAML is convenient because it is human-readable and can be easily ported between programs. Creating an ``InternalParameters``
instance directly in Python can also be convenient, especially when running many near-identical models.

The ``VSPEC.params`` YAML Format
---------------------------------

The most basic way to create an ``ObservationalModel`` object instance is through a YAML file:

.. code-block:: python

    import VSPEC
    model = VSPEC.ObservationModel.from_yaml('my_config.yaml')

The file ``my_config.yaml`` contains all the necessary information to run ``VSPEC``.
YAML files have a hierarchical structure, so for example the header section looks like this:

.. code-block:: yaml

    header:
        data_path: transit
        teff_min: 2300 K
        teff_max: 3900 K
        desc: This is a VSPEC example.
        verbose: 0

The sections of a ``VSPEC`` YAML configuration file are below.

.. note::

    Because the configuration file is parsed by a parameter object that knows
    what type to expect, it is possible to parse directly to an ``astropy.units.Quantity``
    object. Any parameter that expects a quantity will read in the user input as:
    
    .. code-block:: python
        
        u.Quantity(my_input)
    
    So encoding the quantity as a string is very easy. For example the ``teff_min``
    parameter can be set to ``2300 K``, and so after parsing it will be equivalent
    to having set it to ``2300 * u.K``.

``header``
~~~~~~~~~~

.. list-table::
   :widths: 25 25 50
   :header-rows: 1

   * - Key
     - Parses to
     - Description
   * - ``data_path``
     - ``str``
     - The name of the directory inside ``.vspec`` where outputs will be saved.
   * - ``teff_min``
     - ``astropy.units.Quantity``
     - The minimum effective temperature to include in the spectrum grid.
   * - ``teff_max``
     - ``astropy.units.Quantity``
     - The maximum effective temperature to include in the spectrum grid.
   * - ``desc``
     - ``str``
     - A description of the model.
   * - ``verbose``
     - ``int``
     - The level of verbosity.
   * - ``seed``
     - ``int``
     - The seed for the random number generator.
   * - ``spec_grid``
     - see :ref:`subsec_spec_grid`
     - Parameters that define the grid of spectral models.

.. _subsec_spec_grid:

``spec_grid``
+++++++++++++


.. list-table::
   :widths: 25 25 50
   :header-rows: 1

   * - Key
     - Parses to
     - Description
   * - ``name``
     - ``str``
     - The name of the spectral grid.
   * - 
     - 
     - Additional parameters (see below)

.. note::

    The ``name`` parameter determines how the rest of this section is parsed.

See below for additional parameters

``name="vspec"``
""""""""""""""""

This is the default spectral grid what was created for VSPEC. It is made from PHOENIX stellar models :cite:p:`2013A&A...553A...6H`.

.. list-table::
   :widths: 25 25 50
   :header-rows: 1

   * - Key
     - Parses to
     - Description
   * - ``max_teff``
     - ``astropy.units.Quantity``
     - The maximum effective temperature to include in the grid.
   * - ``min_teff``
     - ``astropy.units.Quantity``
     - The minimum effective temperature to include in the grid.
   * - ``impl_bin``, optional
     - ``str``
     - The implementation of the binning algorithm, either 'rust' or 'python'. Default is 'rust'.
   * - ``impl_interp``, optional
     - ``str``
     - The implementation of the interpolation algorithm, either 'scipy' or 'jax'. Default is 'scipy'.
   * - ``fail_on_missing``, optional
     - ``bool``
     - If ``True``, raise an error if a spectrum from the grid is not found. If ``False``, download the needed spectra. Default is ``False``.

``name="bb"``
"""""""""""""

This replaces the grid interpolator with a forward model that produces a pure blackbody spectrum.
This might be useful to use when testing variability as it is very fast.

.. note::

    There are no additional parameters for this spectral model.


``star``
~~~~~~~~

.. note::

    Available presets include ``static_proxima``, ``spotted_proxima``, ``flaring_proxima``, and ``proxima``.

.. list-table::
   :widths: 25 25 50
   :header-rows: 1

   * - Key
     - Parses to
     - Description
   * - ``psg_star_template``
     - ``str``
     - The template for the star. See the PSG Handbook for options.
   * - ``teff``
     - ``astropy.units.Quantity``
     - The effective temperature of the star.
   * - ``mass``
     - ``astropy.units.Quantity``
     - The mass of the star.
   * - ``radius``
     - ``astropy.units.Quantity``
     - The radius of the star.
   * - ``period``
     - ``astropy.units.Quantity``
     - The rotational period of the star.
   * - ``misalignment``
     - ``astropy.units.Quantity``
     - The misalignment between the stellar rotation axis and the orbital axis. This is the planet's "mutual inclination".
   * - ``misalignment_dir``
     - ``astropy.units.Quantity``
     - The direction of stellar rotation axis misalignment, relative to the argument of periapsis.
   * - ``ld``
     - See :ref:`subsec_ld`
     - The limb darkening parameters of the star.
   * - ``spots``
     - See :ref:`subsec_spots`
     - The parameters to create star spots.
   * - ``faculae``
     - See :ref:`subsec_faculae`
     - The parameters to create faculae.
   * - ``flares``
     - See :ref:`subsec_flares`
     - The parameters to create flares.
   * - ``granulation``
     - See :ref:`subsec_granulation`
     - The parameters to create granulation.
   * - ``grid_params``
     - ``int`` or ``tuple``
     - Stellar surface grid parameters. If ``tuple``, the number of points in the
       latitude and longitude directions. If ``int``, the number of total grid points
       for a Fibonacci spiral grid. In general the spiral grid is more efficient.
   * - ``spectral_grid``
     - ``str``
     - The spectral grid to use. Either ``default`` for the default stellar grid from
       ``Gridpolator``, or ``bb`` to use a blackbody forward model (very fast).

.. _subsec_ld:

``ld``
++++++

.. note::

    Available presets include ``lambertian``, ``proxima``, ``solar``, and ``trappist``.

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``u1``
      - ``float``
      - The first limb darkening coefficient.
    * - ``u2``
      - ``float``
      - The second limb darkening coefficient.

.. _subsec_spots:

``spots``
+++++++++

.. note::

    Available presets include ``none``, ``mdwarf``, and ``solar``.

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``distribution``
      - ``str``
      - The distribution of the spots. Either ``iso`` for an isotropic distribution or ``solar`` for two bands at :math:`\\pm 15^{\\circ}` latitude.
    * - ``initial_coverage``
      - ``float``
      - The spot coverage created initially by generating spots at random stages of life.
    * - ``equillibrium_coverage``
      - ``float``
      - The fractional coverage of the star's surface by spots. This is the value
        at growth-decay equilibrium.
    * - ``burn_in``
      - ``astropy.units.Quantity``
      - The duration of the burn-in period, during which the spot coverage approaches equilibrium.
    * - ``area_mean``
      - ``astropy.units.Quantity``
      - The mean area of a spot on the star's surface in MSH.
    * - ``area_logsigma``
      - ``float``
      - The standard deviation of the spot areas. This is a lognormal
        distribution, so the units of this value are dex.
    * - ``teff_umbra``
      - ``astropy.units.Quantity``
      - The effective temperature of the spot umbrae.
    * - ``teff_penumbra``
      - ``astropy.units.Quantity``
      - The effective temperature of the spot penumbrae.
    * - ``growth_rate``
      - ``astropy.units.Quantity``
      - The rate at which new spots grow. Spots grow exponentially, so this quantity has units of 1/time.
    * - ``decay_rate``
      - ``astropy.units.Quantity``
      - The rate at which existing spots decay [area/time].
    * - ``initial_area``
      - ``astropy.units.Quantity``
      - The area of a spot at birth.

.. _subsec_faculae:

``faculae``
++++++++++++

.. note::

    Available presets include ``none`` and ``std``.

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``distribution``
      - ``str``
      - The distribution of the spots. Currently only ``iso`` is supported.
    * - ``Equillibrium_coverage``
      - ``float``
      - The fractional coverage of the star's surface by spots. This is the value
        at growth-decay equilibrium.
    * - ``burn_in``
      - ``astropy.units.Quantity``
      - The duration of the burn-in period, during which the spot coverage approaches
        equilibrium.
    * - ``mean_radius``
      - ``astropy.units.Quantity``
      - The mean radius of the faculae.
    * - ``logsigma_radius``
      - ``float``
      - The standard deviation of the radius in dex.
    * - ``mean_timescale``
      - ``astropy.units.Quantity``
      - The mean faculae lifetime.
    * - ``logsigma_timescale``
      - ``float``
      - The standard deviation of the lifetime in dex.\
    * - ``depth``
      - ``float``
      - The depth of the facula depression.
    * - ``floor_teff_slope``
      - ``astropy.units.Quantity``
      - The slope of the radius-Teff relationship for the cool floor.
    * - ``floor_teff_min_rad``
      - ``astropy.units.Quantity``
      - The minimum radius at which the floor is visible. Otherwise the facula
        is a bright point -- even near disk center.
    * - ``floor_teff_base_dteff``
      - ``astropy.units.Quantity``
      - The Teff of the floor at the minimum radius.
    * - ``wall_teff_slope``
      - ``astropy.units.Quantity``
      - The slope of the radius-Teff relationship for the hot wall.
    * - ``wall_teff_intercept``
      - ``astropy.units.Quantity``
      - The intercept of the radius-Teff relationship for the hot wall.

.. note::

    The temperatures of a facula wall or floor are a function of the radius.
    See `the vspec-vsm source <https://github.com/VSPEC-collab/vspec-vsm/blob/main/vspec_vsm/faculae.py>`_
    for information on how these values are calculated.

.. _subsec_flares:

``flares``
++++++++++

.. note::

    Available presets include ``none`` and ``std``.

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``dist_teff_mean``
      - ``astropy.units.Quantity``
      - The mean temperature of the flares.
    * - ``dist_teff_sigma``
      - ``astropy.units.Quantity``
      - The standard deviation of the flare temperatures.
    * - ``dist_fwhm_mean``
      - ``astropy.units.Quantity``
      - The mean FWHM of the flare lightcurves [time].
    * - ``dist_fwhm_logsigma``
      - ``float``
      - The standard deviation of the FWHM in dex.
    * - ``alpha``
      - ``float``
      - The slope of the frequency-energy powerlaw.
    * - ``beta``
      - ``float``
      - The intercept of the frequency-energy powerlaw.
    * - ``min_energy``
      - ``astropy.units.Quantity``
      - The minimum energy of the flares. Set to infinity to disable.
    * - ``cluster_size``
      - ``int``
      - The typical number of flares in each cluster.

.. _subsec_granulation:

``granulation``
+++++++++++++++

.. note::

    Available presets include ``none`` and ``std``.

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``mean``
      - ``float``
      - The mean coverage of low-teff granulation.
    * - ``amp``
      - ``float``
      - The amplitude of granulation oscillations.
    * - ``period``
      - ``astropy.units.Quantity``
      - The period of granulation oscillations.
    * - ``dteff``
      - ``astropy.units.Quantity``
      - The difference between the quiet photosphere and the low-teff granulation region.

``planet``
~~~~~~~~~~

.. note::

    Available presets include ``proxcenb`` and ``std``.

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``name``
      - ``str``
      - The name of the planet.
    * - ``radius``
      - ``astropy.units.Quantity``
      - The radius of the planet.
    * - ``gravity``
      - see :ref:`subsec_gravity`
      - The mass/surface gravity/density of the planet.
    * - ``semimajor_axis``
      - ``astropy.units.Quantity``
      - The semi-major axis of the planet's orbit.
    * - ``orbit_period``
      - ``astropy.units.Quantity``
      - The period of the planet's orbit.
    * - ``rotation_period``
      - ``astropy.units.Quantity``
      - The rotation period of the planet.
    * - ``eccentricity``
      - ``float``
      - The eccentricity of the planet's orbit
    * - ``obliquity``
      - ``astropy.units.Quantity``
      - The obliquity (tilt) of the planet. Not currently implemented.
    * - ``obliquity_direction``
      - ``astropy.units.Quantity``
      - The direction of the planet's obliquity. The true anomaly
        at which the planet's north pole faces away from the star.
    * - ``init_phase``
      - ``astropy.units.Quantity``
      - The phase of the planet at the beginning of the simulation.
    * - ``init_substellar_lon``
      - ``astropy.units.Quantity``
      - The initial substellar longitude of the planet.

.. _subsec_gravity:

``gravity``
+++++++++++

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``mode``
      - ``str``
      - The mode of the gravity parameter. Valid options are 'g', 'rho', and 'kg'.
    * - ``value``
      - ``astropy.units.Quantity``
      - The value of the gravity parameter. Can be any unit so long as the physical type is correct.

``system``
~~~~~~~~~~

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``distance``
      - ``astropy.units.Quantity``
      - The distance to the system.
    * - ``inclination``
      - ``astropy.units.Quantity``
      - The inclination of the system. Transit occurs when :math:`i=90^{\circ}`.
    * - ``phase_of_periasteron``
      - ``astropy.units.Quantity``
      - The phase of the planet when it reaches periasteron. Only necessary for planets
        with non-zero obliquity or non-zero eccentricity.

``obs``
~~~~~~~

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``observation_time``
      - ``astropy.units.Quantity``
      - The total time of the observation.
    * - ``integration_time``
      - ``astropy.units.Quantity``
      - The integration time of each epoch of observation.

``inst``
~~~~~~~~

.. note::

    Available presets include ``mirecle``, ``miri_lrs``, and ``niriss_soss``.
  
.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``single`` | ``coronagraph``
      - see :ref:`subsec_single` or :ref:`subsec_coronagraph`
      - The type of telescope to use.
    * - ``bandpass``
      - see :ref:`subsec_bandpass`
      - The bandpass & resolution of the observation.
    * - ``detector``
      - see :ref:`subsec_detector`
      - The detector properties of the observation.


.. _subsec_single:

``single``
++++++++++

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``aperture``
      - ``astropy.units.Quantity``
      - The aperture size of the telescope.
    * - ``zodi``
      - ``float``
      - The level of the zodiacal background. See the PSG Handbook for details.

.. _subsec_coronagraph:

``coronagraph``
+++++++++++++++

.. warning::

    Use this instrument type with caution. It is not well tested and
    not fully implemented. Pull requests are welcome.

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``aperture``
      - ``astropy.units.Quantity``
      - The aperture size of the telescope.
    * - ``zodi``
      - ``float``
      - The level of the zodiacal background. See the PSG Handbook for details.
    * - ``contrast``
      - ``float``
      - The contrast of the coronagraphic system.
    * - ``iwa``
      - ``PSGtable``
      - The inner working angle of the coronagraph.

.. _subsec_bandpass:

``bandpass``
++++++++++++

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``wl_blue``
      - ``astropy.units.Quantity``
      - The minimum wavelength.
    * - ``wl_red``
      - ``astropy.units.Quantity``
      - The maximum wavelength.
    * - ``resolving_power``
      - ``int``
      - The resolving power of the observation.
    * - ``wavelength_unit``
      - ``astropy.units.Unit``
      - The unit to be used on the spectral axis.
    * - ``flux_unit``
      - ``astropy.units.Unit``
      - The unit to be used on the flux axis.

.. _subsec_detector:

``detector``
++++++++++++

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``beam_width``
      - ``astropy.units.Quantity``
      - The width of the field of view.
    * - ``integration_time``
      - ``astropy.units.Quantity``
      - The integration time on the detector for saturation purposes.
        This effects the read noise of the observation.
    * - ``ccd``
      - see :ref:`subsubsec_ccd`
      - The CCD used for the observation.

.. _subsubsec_ccd:

``ccd``
"""""""

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``pixel_sampling``
      - ``int``
      - The number of pixels comprising a resolution element.
    * - ``read_noise``
      - ``astropy.units.Quantity``
      - The read noise of the CCD in electrons.
    * - ``dark_current``
      - ``astropy.units.Quantity``
      - The dark current of the CCD in electrons/second.
    * - ``throughput``
      - ``float``
      - The throughput of the optical system.
    * - ``emissivity``
      - ``float``
      - The emissivity of the optical system.
    * - ``temperature``
      - ``astropy.units.Quantity``
      - The temperature of the optical system.

``psg``
~~~~~~~

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``gcm_binning``
      - ``int``
      - The number of GCM points to bin together.
        Use 200 for testing and 3 for science (depending on the native resolution of your gcm).
    * - ``phase_binning``
      - ``int``
      - Planetary epoch binning. Useful if your star changes on a shorter timescale than your planet.
        For example, if set to 4, a planet spectrum will be calculated for every fourth stellar spectrum
        and will be interpolated otherwise.
    * - ``use_molecular_signatures``
      - ``bool``
      - Whether to have PSG consider the planetary atmosphere. If False, PSG will return a blackbody spectrum.
        Useful for testing.
    * - ``use_continuum_stellar`` (optional)
      - ``bool``
      - Whether to have PSG use a stellar atmosphere model. Otherwise, the stellar spectrum is a blackbody.
        While not guaranteed, there is no expectation that this parameter has any effect on VSPEC outputs.
        Default is ``True``.
    * - ``nmax``
      - ``int``
      - The number of n-stream pairs for scattering aerosols calculations. See the PSG Handbook for details.
    * - ``lmax``
      - ``int``
      - The number of Legendre polynomials for scattering aerosols calculations. See the PSG Handbook for details.
    * - ``continuum``
      - ``list of str``
      - The continuum opacities to include in the radiative transfer calculation. Typically these include
        ``Rayleigh``, ``Refraction``, and ``CIA_all``.

``gcm``
~~~~~~~

.. note::

    In order to support many types of GCM input this section can be configured many ways.\
    Read the following carefully.

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``mean_molecular_weight``
      - ``float``
      - The mean molecular weight of the GCM in amu.
    * - ``binary`` | ``waccm`` | ``exocam`` | ``exoplasim`` | ``vspec``
      - see :ref:`subsec_binary`, :ref:`subsec_waccm`, :ref:`subsec_exocam`, :ref:`subsec_exoplasim`, :ref:`subsec_vspec`
      - The GCM type and parameters.

.. _subsec_binary:

``binary``
++++++++++

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``path``
      - ``pathlib.Path``
      - The path to the PSG-readable GCM file. The contents of this file are parsed
        by ``pypsg.globes.GCMdecoder`` into a ``pypsg.globes.PyGCM`` object.

.. _subsec_waccm:

``waccm``
++++++++++

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``path``
      - ``pathlib.Path``
      - The path to the WACCM netCDF file.
    * - ``itime`` (optional)
      - ``int``
      - The index of the time axis to use. If this is specified, then the GCM is static. Otherwise,
        it is assumed that the GCM changes as a function of time, and the ``tstart`` parameter must be specified.
    * - ``tstart`` (optional)
      - ``astropy.units.Quantity``
      - The start time of the GCM. Only used if ``itime`` is not specified.
    * - ``molecules``
      - ``list of str``
      - Which molecular species to look for in the GCM file. Use the same names as in PSG.
    * - ``aerosols`` (optional)
      - ``list of str``
      - Which aerosol species to look for in the GCM file. Use the same names as in PSG.
    * - ``background`` (optional)
      - ``str``
      - The background molecular species. The abundances in ``molecules`` will be subtracted from unity and the
        difference will be included as this background species. If this species is already in ``molecules``, then
        an error will be raised.
    * - ``lon_start`` (optional)
      - ``float``
      - The longitude of the first point on the longitudinal axis. Default is ``-180``.
    * - ``lat_start`` (optional)
      - ``float``
      - The latitude of the first point on the latitudinal axis. Default is ``-90``.

.. _subsec_exocam:

``exocam``
++++++++++

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``path``
      - ``pathlib.Path``
      - The path to the ExoCAM netCDF file.
    * - ``itime`` (optional)
      - ``int``
      - The index of the time axis to use. If this is specified, then the GCM is static. Otherwise,
        it is assumed that the GCM changes as a function of time, and the ``tstart`` parameter must be specified.
    * - ``tstart`` (optional)
      - ``astropy.units.Quantity``
      - The start time of the GCM. Only used if ``itime`` is not specified.
    * - ``molecules``
      - ``list of str``
      - Which molecular species to look for in the GCM file. Use the same names as in PSG.
    * - ``aerosols`` (optional)
      - ``list of str``
      - Which aerosol species to look for in the GCM file. Use the same names as in PSG.
    * - ``background`` (optional)
      - ``str``
      - The background molecular species. The abundances in ``molecules`` will be subtracted from unity and the
        difference will be included as this background species. If this species is already in ``molecules``, then
        an error will be raised.
    * - ``lon_start`` (optional)
      - ``float``
      - The longitude of the first point on the longitudinal axis. Default is ``-180``.
    * - ``lat_start`` (optional)
      - ``float``
      - The latitude of the first point on the latitudinal axis. Default is ``-90``.
    * - ``mean_molecular_mass`` (optional)
      - ``float``
      - The mean molecular mass of the GCM. Must be specified if ``H2O`` is in ``molecules``. This is 
        because ExoCAM treats water as humidity.

.. _subsec_exoplasim:

``exoplasim``
+++++++++++++

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``path``
      - ``pathlib.Path``
      - The path to the ExoPlasim netCDF file.
    * - ``itime``
      - ``int``
      - The index of the time axis to use.
    * - ``molecules``
      - ``list of str``
      - Which molecular species to look for in the GCM file. Use the same names as in PSG.
    * - ``aerosols`` (optional)
      - ``list of str``
      - Which aerosol species to look for in the GCM file. Use the same names as in PSG.
    * - ``background`` (optional)
      - ``str``
      - The background molecular species. The abundances in ``molecules`` will be subtracted from unity and the
        difference will be included as this background species. If this species is already in ``molecules``, then
        an error will be raised.
    * - ``lon_start`` (optional)
      - ``float``
      - The longitude of the first point on the longitudinal axis. Default is ``-180``.
    * - ``lat_start`` (optional)
      - ``float``
      - The latitude of the first point on the latitudinal axis. Default is ``-90``.
    * - ``mean_molecular_mass`` (optional)
      - ``float``
      - The mean molecular mass of the GCM. Must be specified if ``H2O`` is in ``molecules``. This is 
        because ExoPlasim treats water as humidity.

.. _subsec_vspec:

``vspec``
+++++++++++++

.. warning::

    This is a minimal atmosphere model. It is useful for testing or when a
    sophisticated model is not necessary.

.. list-table::
    :widths: 25 25 50
    :header-rows: 1

    * - Key
      - Parses to
      - Description
    * - ``nlayer``
      - ``int``
      - The number of layers in the GCM.
    * - ``nlon``
      - ``int``
      - The number of longitude points in the GCM.
    * - ``nlat``
      - ``int``
      - The number of latitude points in the GCM.
    * - ``epsilon``
      - ``float``
      - The thermal inertia of the GCM. See :cite:t:`2011ApJ...726...82C`.
    * - ``p_surf``
      - ``astropy.units.Quantity``
      - The surface pressure of the GCM.
    * - ``p_stop``
      - ``astropy.units.Quantity``
      - The pressure at the top of the atmosphere.
    * - ``wind_u``
      - ``astropy.units.Quantity``
      - The U component (west-to-east) of the GCM's wind.
    * - ``wind_v``
      - ``astropy.units.Quantity``
      - The V component (south-to-north) of the GCM's wind.
    * - ``gamma``
      - ``float``
      - The adiabatic index of the GCM atmosphere.
    * - ``albedo``
      - ``float``
      - The surface albedo of the GCM.
    * - ``emissivity``
      - ``float``
      - The surface emissivity of the GCM.
    * - ``molecules``
      - ``list of str``
      - The molecular species in the GCM.
    * - ``lat_redistribution`` (optional)
      - ``float``
      - The latitudinal redistribution factor of the GCM. If ``1``, the poles have the
        same temperature as the equator. If ``0``, then there is no heat redistribution.
        Default is ``0.0``.

.. automodapi:: VSPEC.params
    :headings: -~