+
diff --git a/docs/source/_templates/sidebarintro.html b/docs/source/_templates/sidebarintro.html
new file mode 100644
index 00000000..cec7240a
--- /dev/null
+++ b/docs/source/_templates/sidebarintro.html
@@ -0,0 +1,6 @@
+
About babelizer
+
+ The babelizer wraps libraries
+ that expose a Basic Model Interface (BMI)
+ so they can imported as Python packages.
+
diff --git a/docs/source/api/babelizer.rst b/docs/source/api/babelizer.rst
new file mode 100644
index 00000000..3ee00f59
--- /dev/null
+++ b/docs/source/api/babelizer.rst
@@ -0,0 +1,61 @@
+babelizer package
+=================
+
+Submodules
+----------
+
+babelizer.cli module
+--------------------
+
+.. automodule:: babelizer.cli
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+babelizer.errors module
+-----------------------
+
+.. automodule:: babelizer.errors
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+babelizer.metadata module
+-------------------------
+
+.. automodule:: babelizer.metadata
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+babelizer.render module
+-----------------------
+
+.. automodule:: babelizer.render
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+babelizer.utils module
+----------------------
+
+.. automodule:: babelizer.utils
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+babelizer.wrap module
+---------------------
+
+.. automodule:: babelizer.wrap
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: babelizer
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/api/index.rst b/docs/source/api/index.rst
new file mode 100644
index 00000000..5fbee2fd
--- /dev/null
+++ b/docs/source/api/index.rst
@@ -0,0 +1,7 @@
+Developer Documentation
+-----------------------
+
+.. toctree::
+ :maxdepth: 2
+
+ modules
diff --git a/docs/source/api/modules.rst b/docs/source/api/modules.rst
new file mode 100644
index 00000000..811ffbe8
--- /dev/null
+++ b/docs/source/api/modules.rst
@@ -0,0 +1,7 @@
+babelizer
+=========
+
+.. toctree::
+ :maxdepth: 4
+
+ babelizer
diff --git a/docs/source/authors.rst b/docs/source/authors.rst
new file mode 100644
index 00000000..e2f0e1c0
--- /dev/null
+++ b/docs/source/authors.rst
@@ -0,0 +1 @@
+.. include:: ../../CREDITS.rst
diff --git a/docs/source/babel_heatc.toml b/docs/source/babel_heatc.toml
new file mode 100644
index 00000000..c5ff2e55
--- /dev/null
+++ b/docs/source/babel_heatc.toml
@@ -0,0 +1,23 @@
+[library]
+language = "c"
+entry_point = ["HeatModel=bmiheatc:register_bmi_heat"]
+
+[build]
+undef_macros = []
+define_macros = []
+libraries = []
+library_dirs = []
+include_dirs = []
+extra_compile_args = []
+
+[plugin]
+name = "heatc"
+requirements = [""]
+
+[info]
+plugin_author = "csdms"
+plugin_author_email = "csdms@colorado.edu"
+github_username = "pymt-lab"
+plugin_license = "MIT"
+summary = "PyMT plugin for heat model"
+
diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst
new file mode 100644
index 00000000..d76c92b6
--- /dev/null
+++ b/docs/source/changelog.rst
@@ -0,0 +1 @@
+.. include:: ../../CHANGES.rst
diff --git a/docs/source/conf.py b/docs/source/conf.py
new file mode 100644
index 00000000..f8eb2330
--- /dev/null
+++ b/docs/source/conf.py
@@ -0,0 +1,77 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+# import os
+# import sys
+# sys.path.insert(0, os.path.abspath('.'))
+
+
+# The master toctree document.
+master_doc = 'index'
+
+# -- Project information -----------------------------------------------------
+
+project = 'babelizer'
+copyright = '2020, Community Surface Dynamics Modeling System'
+author = 'Community Surface Dynamics Modeling System'
+
+# The full version, including alpha/beta/rc tags
+release = '0.2'
+
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = ['sphinx.ext.autodoc', 'sphinx.ext.napoleon']
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = []
+
+
+# -- Options for HTML output -------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+#
+html_theme = 'alabaster'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+html_logo = "_static/powered-by-logo-header.png"
+
+# Custom sidebar templates, maps document names to template names.
+html_sidebars = {
+ "index": [
+ "sidebarintro.html",
+ "links.html",
+ "sourcelink.html",
+ "searchbox.html",
+ ],
+ "**": [
+ "sidebarintro.html",
+ "links.html",
+ "sourcelink.html",
+ "searchbox.html",
+ ]
+}
diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst
new file mode 100644
index 00000000..ac7b6bcf
--- /dev/null
+++ b/docs/source/contributing.rst
@@ -0,0 +1 @@
+.. include:: ../../CONTRIBUTING.rst
diff --git a/docs/source/environment.yml b/docs/source/environment.yml
new file mode 100644
index 00000000..e8851d0a
--- /dev/null
+++ b/docs/source/environment.yml
@@ -0,0 +1,11 @@
+# A conda environment file for the babelizer example
+name: wrap
+channels:
+ - conda-forge
+dependencies:
+- python=3
+- cmake
+- pkg-config
+- c-compiler
+- bmi-c
+- babelizer
diff --git a/docs/source/example.rst b/docs/source/example.rst
new file mode 100644
index 00000000..f8a461ba
--- /dev/null
+++ b/docs/source/example.rst
@@ -0,0 +1,347 @@
+Example: Wrapping a C model
+===========================
+
+In this example, we'll use the *babelizer*
+to wrap the *heat* model from the `bmi-example-c`_ repository,
+allowing it to be run in Python.
+The model and its BMI are written in C.
+To simplify package management in the example,
+we'll use :term:`conda`.
+We'll also use :term:`git` to obtain the model source code.
+
+This is a somewhat long example.
+To break it up,
+here are the steps we'll take:
+
+#. Create a :term:`conda environment` that includes software to compile the
+ model and wrap it with the *babelizer*
+#. Clone the `bmi-example-c`_ repository from GitHub and build the
+ *heat* model from source
+#. Create a *babelizer* input file describing the *heat* model
+#. Run the *babelizer* to generate Python bindings, then build the bindings
+#. Show the *heat* model running in Python through *pymt*
+
+Before we begin,
+create a directory to hold our work:
+
+.. code:: bash
+
+ $ mkdir build
+ $ cd build
+
+
+Set up a conda environment
+--------------------------
+
+Start by setting up a :term:`conda environment` that includes the *babelizer*,
+as well as a toolchain to build and install the model.
+The necessary packages are listed in the conda environment file
+:download:`environment.yml`:
+
+.. include:: environment.yml
+ :literal:
+
+:download:`Download ` this file
+and create the new environment with:
+
+.. code:: bash
+
+ $ conda env create --file=environment.yml
+
+When this command completes,
+activate the environment:
+
+.. code:: bash
+
+ $ conda activate wrap
+
+The *wrap* environment now contains all the dependencies needed
+to build, install, and wrap the *heat* model.
+
+
+Build the *heat* model from source
+----------------------------------
+
+Clone the `bmi-example-c`_ repository from GitHub:
+
+.. code:: bash
+
+ $ git clone https://github.com/csdms/bmi-example-c
+
+There are general `instructions`_ in the repository for building and installing
+this package on Linux, macOS, and Windows.
+We'll augment those instructions
+with the note that we're installing into the *wrap* conda environment,
+so the ``CONDA_PREFIX`` environment variable
+should be used to specify the install path.
+
+Linux and macOS
+...............
+
+On Linux and macOS,
+use these commands to build and install the *heat* model:
+
+.. code:: bash
+
+ $ cd bmi-example-c
+ $ mkdir _build && cd _build
+ $ cmake .. -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX
+ $ make
+ $ make install
+
+Verify the install by testing for the existence of the header
+of the library containing the compiled *heat* model:
+
+.. code:: bash
+
+ $ test -f $CONDA_PREFIX/include/bmi_heat.h
+
+Windows
+.......
+
+Building on Windows requires
+Microsoft Visual Studio 2017 or Microsoft Build Tools for Visual Studio 2017.
+To build and install the *heat* model,
+the following commands must be run in a `Developer Command Prompt`_:
+
+.. code::
+
+ > cd bmi-example-c
+ > mkdir _build && cd _build
+ > cmake .. ^
+ -G "NMake Makefiles" ^
+ -DCMAKE_INSTALL_PREFIX=%CONDA_PREFIX% ^
+ -DCMAKE_BUILD_TYPE=Release
+ > cmake --build . --target install --config Release
+
+Verify the install by testing for the existence of the header
+of the library containing the compiled *heat* model:
+
+.. code::
+
+ > if not exist %LIBRARY_INC%\\bmi_heat.h exit 1
+
+Create the *babelizer* input file
+---------------------------------
+
+The *babelizer* input file provides information to the *babelizer*
+about the model to be wrapped.
+The input file is created with the ``babelize generate`` subcommand.
+
+Return to our initial ``build`` directory and call ``babelize generate`` with:
+
+.. code:: bash
+
+ $ cd ~/build
+ $ babelize generate babel_heatc.toml \
+ --language=c \
+ --summary="PyMT plugin for heat model" \
+ --entry-point=HeatModel=bmiheatc:register_bmi_heat \
+ --name=heatc \
+ --requirement=""
+
+In this call,
+the *babelizer* will also interactively prompt for author name, author email,
+GitHub username, and license.
+These can be optionally be filled in, or the defaults can be used.
+
+The resulting file, ``babel_heatc.toml``,
+will look something like this:
+
+.. include:: babel_heatc.toml
+ :literal:
+
+For more information on the entries and sections of the *babelizer* input file,
+see `Input file <./readme.html#input-file>`_.
+
+
+Wrap the model with the *babelizer*
+-----------------------------------
+
+Generate Python bindings for the model with the ``babelize init`` subcommand:
+
+.. code:: bash
+
+ $ babelize init babel_heatc.toml .
+
+The results are placed in a new directory, ``pymt_heatc``,
+under the current directory.
+
+.. code:: bash
+
+ $ ls -aF pymt_heatc
+ ./ MANIFEST.in recipe/
+ ../ Makefile requirements-library.txt
+ .git/ README.rst requirements-testing.txt
+ .gitignore babel.toml requirements.txt
+ .travis.yml docs/ setup.cfg
+ CHANGES.rst meta/ setup.py
+ CREDITS.rst pymt_heatc/
+ LICENSE pyproject.toml
+
+Before we can build the Python bindings,
+we must ensure that the dependencies required by the toolchain,
+as well as any required by the model,
+as specified in the *babelizer* input file (none in this case),
+are satisfied.
+
+Change to the ``pymt_heatc`` directory and install dependencies
+into the conda environment:
+
+.. code:: bash
+
+ $ cd pymt_heatc
+ $ conda install -c conda-forge --file=requirements.txt --file=requirements-library.txt
+
+
+Now build the Python bindings with:
+
+.. code:: bash
+
+ $ make install
+
+This command sets off a long list of messages,
+at the end of which you'll hopefully see:
+
+.. code:: bash
+
+ Successfully installed pymt-heatc
+
+Pause a moment to see what we've done.
+Start a Python session and try the following commands:
+
+.. code:: python
+
+ >>> from pymt_heatc import HeatModel
+ >>> m = HeatModel()
+ >>> print(m.get_component_name())
+ The 2D Heat Equation
+
+We've imported the *heat* model,
+written in C,
+into Python!
+
+At this point,
+it's a good idea to run the *bmi-tester* (`GitHub repo `_)
+over the model.
+The *bmi-tester* exercises each BMI method exposed through Python,
+ensuring it works correctly.
+
+Install *bmi-tester* with:
+
+.. code:: bash
+
+ $ conda install -c conda-forge bmi-tester
+
+Before running the *bmi-tester*, one last piece is needed.
+Like all models equipped with a BMI,
+*heat* uses a :term:`configuration file` to specify initial parameter values.
+Download the file :download:`config.txt ` for use here.
+
+Run the *bmi-tester* with:
+
+.. code:: bash
+
+ $ bmi-test pymt_heatc:HeatModel --config-file=config.txt --root-dir=. -vvv
+
+This command sets off a long list of messages,
+ending with
+
+.. code:: bash
+
+ 🎉 All tests passed!
+
+if everything has been built correctly.
+
+
+Add metadata to make a *pymt* component
+---------------------------------------
+
+The final step in wrapping the *heat* model
+is to add metadata used by the `Python Modeling Tool`_, *pymt*.
+CSDMS develops a set of standards,
+the `CSDMS Model Metadata`_,
+that provides a detailed and formalized description of a model.
+The metadata allow *heat* to be run and and :term:`coupled `
+with other models that expose a BMI and have been similarly wrapped
+with the *babelizer*.
+
+Recall the *babelizer* outputs the wrapped *heat* model
+to the directory ``pymt_heatc``.
+Under this directory,
+the *babelizer* created a directory for *heat* model metadata,
+``meta/HeatModel``.
+The contents of this directory are currently:
+
+.. code:: bash
+
+ $ ls meta/HeatModel/
+ api.yaml
+
+The file ``api.yaml`` is automatically generated by the *babelizer*.
+To complete the description of the *heat* model,
+other metadata files are needed, including:
+
+* :download:`info.yaml `
+* :download:`run.yaml `
+* a :download:`templated model configuration file `
+* :download:`parameters.yaml `
+
+`Descriptions`_ of these files and their roles
+are given in the CSDMS Model Metadata repository.
+Download each of the files using the links in the list above
+and place them in the ``pymt_heatc/meta/HeatModel`` directory
+alongside ``api.yaml``.
+
+Next, install *pymt*:
+
+.. code:: bash
+
+ $ conda install -c conda-forge pymt
+
+Then start a Python session and show that the *heat* model
+can be called through *pymt*:
+
+.. code:: python
+
+ >>> from pymt.models import HeatModel
+ >>> m = HeatModel()
+ >>> print(m.name)
+ The 2D Heat Equation
+
+A longer example,
+:download:`pymt_heatc_ex.py `,
+is included in the documentation.
+For easy viewing, it's reproduced here verbatim:
+
+.. include:: examples/pymt_heatc_ex.py
+ :literal:
+
+:download:`Download ` this Python script,
+then run it with:
+
+.. code:: bash
+
+ $ python pymt_heatc_ex.py
+
+
+Summary
+-------
+
+Using the *babelizer*, we wrapped the *heat* model, which is written in C.
+It can now be called as a *pymt* component in Python.
+
+The steps for wrapping a model with the *babelizer* outlined in this example
+can also be applied to models written in C++ and Fortran.
+
+
+..
+ Links
+
+.. _bmi-example-c: https://github.com/csdms/bmi-example-c
+.. _instructions: https://github.com/csdms/bmi-example-c/blob/master/README.md
+.. _Developer Command Prompt: https://docs.microsoft.com/en-us/dotnet/framework/tools/developer-command-prompt-for-vs
+.. _bmi-tester: https://github.com/csdms/bmi-tester
+.. _Python Modeling Tool: https://pymt.readthedocs.io
+.. _CSDMS Model Metadata: https://github.com/csdms/model_metadata
+.. _Descriptions: https://github.com/csdms/model_metadata/blob/develop/README.rst
diff --git a/docs/source/examples/config.txt b/docs/source/examples/config.txt
new file mode 100644
index 00000000..fe07de38
--- /dev/null
+++ b/docs/source/examples/config.txt
@@ -0,0 +1 @@
+1.5, 8.0, 6, 5
diff --git a/docs/source/examples/heat.txt b/docs/source/examples/heat.txt
new file mode 100644
index 00000000..7ea565ae
--- /dev/null
+++ b/docs/source/examples/heat.txt
@@ -0,0 +1 @@
+{{thermal_diffusivity}}, {{run_duration}}, {{number_of_columns}}, {{number_of_rows}}
diff --git a/docs/source/examples/heatc_ex.py b/docs/source/examples/heatc_ex.py
new file mode 100644
index 00000000..08d12a30
--- /dev/null
+++ b/docs/source/examples/heatc_ex.py
@@ -0,0 +1,67 @@
+"""An example of running the heatc model through its BMI."""
+import numpy as np
+from pymt_heatc import HeatModel
+
+
+config_file = 'config.txt'
+np.set_printoptions(formatter={'float': '{: 6.1f}'.format})
+
+
+# Instatiate an initialize the model.
+m = HeatModel()
+print(m.get_component_name())
+m.initialize(config_file)
+
+# List the model's exchange items.
+print('Input vars:', m.get_input_var_names())
+print('Output vars:', m.get_output_var_names())
+
+# Get the grid_id for the plate_surface__temperature variable.
+var_name = 'plate_surface__temperature'
+print('Variable {}'.format(var_name))
+grid_id = m.get_var_grid(var_name)
+print(' - grid id:', grid_id)
+
+# Get grid and variable info for plate_surface__temperature.
+print(' - grid type:', m.get_grid_type(grid_id))
+grid_rank = m.get_grid_rank(grid_id)
+print(' - rank:', grid_rank)
+grid_shape = np.empty(grid_rank, dtype=np.int32)
+m.get_grid_shape(grid_id, grid_shape)
+print(' - shape:', grid_shape)
+grid_size = m.get_grid_size(grid_id)
+print(' - size:', grid_size)
+grid_spacing = np.empty(grid_rank, dtype=np.float)
+m.get_grid_spacing(grid_id, grid_spacing)
+print(' - spacing:', grid_spacing)
+grid_origin = np.empty(grid_rank, dtype=np.float)
+m.get_grid_origin(grid_id, grid_origin)
+print(' - origin:', grid_origin)
+print(' - variable type:', m.get_var_type(var_name))
+print(' - units:', m.get_var_units(var_name))
+print(' - itemsize:', m.get_var_itemsize(var_name))
+print(' - nbytes:', m.get_var_nbytes(var_name))
+
+# Get the initial temperature values.
+val = np.empty(grid_shape, dtype=np.float)
+m.get_value(var_name, val)
+print(' - initial values (gridded):')
+print(val.reshape(np.roll(grid_shape, 1)))
+
+# Get time information from the model.
+print('Start time:', m.get_start_time())
+print('End time:', m.get_end_time())
+print('Current time:', m.get_current_time())
+print('Time step:', m.get_time_step())
+print('Time units:', m.get_time_units())
+
+# Advance the model by one time step.
+m.update()
+print('Updated time:', m.get_current_time())
+
+# Advance the model until a later time.
+m.update_until(5.0)
+print('Later time:', m.get_current_time())
+
+# Finalize the model.
+m.finalize()
diff --git a/docs/source/examples/info.yaml b/docs/source/examples/info.yaml
new file mode 100644
index 00000000..a1397b57
--- /dev/null
+++ b/docs/source/examples/info.yaml
@@ -0,0 +1,8 @@
+summary: |
+ This model solves the two-dimensional heat equation on a uniform
+ rectilinear grid.
+url: https://github.com/csdms/bmi-example-c
+author: CSDMS
+email: csdms@colorado.edu
+version: 0.2
+license: MIT
diff --git a/docs/source/examples/parameters.yaml b/docs/source/examples/parameters.yaml
new file mode 100644
index 00000000..3c1c5f2b
--- /dev/null
+++ b/docs/source/examples/parameters.yaml
@@ -0,0 +1,42 @@
+run_duration:
+ description: Simulation run time
+ value:
+ type: float
+ default: 1.0
+ units: s
+ range:
+ min: 0.0
+ max: 1000000.0
+
+thermal_diffusivity:
+ name: Thermal diffusivity
+ description: Thermal diffusivity
+ value:
+ type: float
+ default: 1.0
+ range:
+ min: 0.0
+ max: 10.0
+ units: 'm2 s-1'
+
+number_of_rows:
+ name: Number of rows
+ description: Number of grid rows
+ value:
+ type: int
+ default: 10
+ range:
+ min: 0
+ max: 10000
+ units: '1'
+
+number_of_columns:
+ name: Number of columns
+ description: Number of grid columns
+ value:
+ type: int
+ default: 10
+ range:
+ min: 0
+ max: 10000
+ units: '1'
diff --git a/docs/source/examples/pymt_heatc_ex.py b/docs/source/examples/pymt_heatc_ex.py
new file mode 100644
index 00000000..e4bc023b
--- /dev/null
+++ b/docs/source/examples/pymt_heatc_ex.py
@@ -0,0 +1,62 @@
+"""Run the heat model in pymt."""
+import numpy as np
+from pymt.models import HeatModel
+
+
+# Instantiate the component and get its name.
+m = HeatModel()
+print(m.name)
+
+# Call setup, then initialize the model.
+args = m.setup('.')
+m.initialize(*args)
+
+# List the model's exchange items.
+print('Number of input vars:', len(m.input_var_names))
+for var in m.input_var_names:
+ print(' - {}'.format(var))
+print('Number of output vars:', len(m.output_var_names))
+for var in m.output_var_names:
+ print(' - {}'.format(var))
+
+# Get variable info.
+var_name = m.output_var_names[0]
+print('Variable {}'.format(var_name))
+print(' - variable type:', m.var_type(var_name))
+print(' - units:', m.var_units(var_name))
+print(' - itemsize:', m.var_itemsize(var_name))
+print(' - nbytes:', m.var_nbytes(var_name))
+print(' - location:', m.var_location(var_name))
+
+# Get grid info for variable.
+grid_id = m.var_grid(var_name)
+print(' - grid id:', grid_id)
+print(' - grid type:', m.grid_type(grid_id))
+print(' - rank:', m.grid_ndim(grid_id))
+print(' - size:', m.grid_node_count(grid_id))
+print(' - shape:', m.grid_shape(grid_id))
+
+# Get time information from the model.
+print('Start time:', m.start_time)
+print('End time:', m.end_time)
+print('Current time:', m.time)
+print('Time step:', m.time_step)
+print('Time units:', m.time_units)
+
+# Get the initial values of the variable.
+print('Get values of {}...'.format(var_name))
+val = m.var[var_name].data
+print(' - values at time {}:'.format(m.time))
+print(val)
+
+# Advance the model by one time step.
+m.update()
+print('Update: current time:', m.time)
+
+# Advance the model until a later time.
+m.update_until(5.0)
+print('Update: current time:', m.time)
+
+# Finalize the model.
+m.finalize()
+print('Done.')
diff --git a/docs/source/examples/run.yaml b/docs/source/examples/run.yaml
new file mode 100644
index 00000000..3b0457ff
--- /dev/null
+++ b/docs/source/examples/run.yaml
@@ -0,0 +1 @@
+config_file: heat.txt
diff --git a/docs/source/glossary.rst b/docs/source/glossary.rst
new file mode 100644
index 00000000..f2f15391
--- /dev/null
+++ b/docs/source/glossary.rst
@@ -0,0 +1,118 @@
+Glossary
+========
+
+A glossary of terms used with the *babelizer*.
+
+
+.. glossary::
+
+ $
+
+ The default shell prompt.
+
+ Anaconda
+
+ A Python distribution that includes libraries for scientific
+ computing and a package manager. See
+ https://www.anaconda.com/distribution for more information.
+
+ Basic Model Interface
+
+ A set a functions that are used to interact with and control a
+ model. See https://bmi.readthedocs.io for more information.
+
+ BMI
+
+ See :term:`Basic Model Interface`.
+
+ Community Surface Dynamics Modeling System
+
+ CSDMS is an NSF-funded program that seeks to transform the
+ science and practice of earth-surface dynamics modeling. For
+ more information, visit https://csdms.colorado.edu.
+
+ class
+
+ A program that acts as a template for creating
+ :term:`objects