[yt-svn] commit/yt-doc: 3 new changesets

Bitbucket commits-noreply at bitbucket.org
Fri Apr 6 15:53:28 PDT 2012


3 new commits in yt-doc:


https://bitbucket.org/yt_analysis/yt-doc/changeset/bc352a8c7f62/
changeset:   bc352a8c7f62
user:        ngoldbaum
date:        2012-03-28 21:37:02
summary:     The enzo internal energy field is defined per mass rather than per volume.
affected #:  1 file

diff -r 6094f91885640079feac14823e9e12d277c31926 -r bc352a8c7f62d63ecc7ee75c0558e630e1be89b2 source/reference/field_list.rst
--- a/source/reference/field_list.rst
+++ b/source/reference/field_list.rst
@@ -3682,7 +3682,7 @@
 ThermalEnergy
 +++++++++++++
 
-   * Units: :math:`\rm{ergs}/\rm{cm^3}`
+   * Units: :math:`\rm{ergs}/\rm{g}`
    * Particle Type: False
 
 **Field Source**



https://bitbucket.org/yt_analysis/yt-doc/changeset/b4fcf6631d00/
changeset:   b4fcf6631d00
user:        ngoldbaum
date:        2012-04-06 23:15:40
summary:     Updates to the time series analysis docs to recognize that time series analysis
now works in parallel by default.
affected #:  2 files

diff -r bc352a8c7f62d63ecc7ee75c0558e630e1be89b2 -r b4fcf6631d00fe7f4e85553d0bc7461d140212e4 source/advanced/parallel_computation.rst
--- a/source/advanced/parallel_computation.rst
+++ b/source/advanced/parallel_computation.rst
@@ -192,15 +192,60 @@
 This example above can be modified to loop over anything that can be saved to
 a Python list: halos, data files, arrays, and more.
 
+Parallel Time Series Analysis
+-----------------------------
+
+The same :func:`parallel_objects` machinery discussed above is turned on by
+default when using a ``TimeSeries`` object (see :ref:`time-series-analysis`) to
+iterate over simulation outputs.  The syntax for this is very simple.  As an
+example, we can use the following script to find the angular momentum vector in
+a 1 pc sphere centered on the maximum density cell in a large number of
+simulation outputs:
+
+.. code-block:: python
+
+   from yt.mods import *
+   all_files = glob.glob("DD*/output_*")
+   all_files.sort()
+   ts = TimeSeries.from_filenames(all_files, Parallel = True)
+   sphere = ts.sphere("max", (1.0, "pc))
+   L_vecs = sphere.quantities["AngularMomentumVector"]()
+
+Note that this script can be run in serial or parallel with an arbitrary number
+of processors.  When running in parallel, each output is given to a different
+processor.  By default, Parallel is set to ``True``, so you do not have to
+explicitly set ``Parallel = True`` as in the above example. 
+
+You can also request a fixed number of processors to calculate each
+angular momenum vector.  For example, this script will calculate each angular
+momentum vector using a workgroup of four processors.
+
+.. code-block:: python
+
+   from yt.mods import *
+   all_files = glob.glob("DD*/output_*")
+   all_files.sort()
+   ts = TimeSeries.from_filenames(all_files, Parallel = 4)
+   sphere = ts.sphere("max", (1.0, "pc))
+   L_vecs = sphere.quantities["AngularMomentumVector"]()
+
+If you do not want to use ``parallel_objects`` parallelism when using a
+TimeSeries object, set ``Parallel = False``.  When running python in parallel,
+this will use all of the available processors to evaluate the requested
+operation on each simulation output.  Some care and possibly trial and error
+might be necessary to estimate the correct settings for your Simulation
+outputs.
+   
+
 Parallel Performance, Resources, and Tuning
 -------------------------------------------
 
-Optimizing parallel jobs in YT is difficult; there are many parameters
-that affect how well and quickly the job runs.
-In many cases, the only way to find out what the minimum (or optimal)
-number of processors is, or amount of memory needed, is through trial and error.
-However, this section will attempt to provide some insight into what are good
-starting values for a given parallel task.
+Optimizing parallel jobs in YT is difficult; there are many parameters that
+affect how well and quickly the job runs.  In many cases, the only way to find
+out what the minimum (or optimal) number of processors is, or amount of memory
+needed, is through trial and error.  However, this section will attempt to
+provide some insight into what are good starting values for a given parallel
+task.
 
 Grid Decomposition
 ++++++++++++++++++
@@ -394,4 +439,4 @@
     resources the task requires.
     
     
-  
\ No newline at end of file
+  


diff -r bc352a8c7f62d63ecc7ee75c0558e630e1be89b2 -r b4fcf6631d00fe7f4e85553d0bc7461d140212e4 source/analyzing/time_series_analysis.rst
--- a/source/analyzing/time_series_analysis.rst
+++ b/source/analyzing/time_series_analysis.rst
@@ -20,8 +20,13 @@
 But this is not really very nice.  This ends up requiring a lot of maintenance.
 The :class:`~yt.data_objects.time_series.TimeSeriesData` object has been
 designed to remove some of this clunkiness and present an easier, more unified
-approach to analyzing sets of data.  Furthermore, future versions of yt will
-automatically parallelize operations conducted on time series of data.
+approach to analyzing sets of data.  Even better,
+:class:`~yt.data_objects.time_series.TimeSeriesData` works in parallel by
+default (see :ref:`parallel-computation`), so you can use a ``TimeSeriesData``
+object to quickly and easily parallelize your analysis.  Since doing the same
+analysis task on many simulation outputs is 'embarrasingly' parallel, this
+naturally allows for almost arbitrary speedup - limited only by the number of
+available processors and the number of simulation outputs.
 
 The idea behind the current implementation of time series analysis is that
 the underlying data and the operators that act on that data can and should be
@@ -117,5 +122,5 @@
    print ms
 
 This allows you to create your own analysis tasks that will be then available
-to time series data objects.  In the future, this will allow for transparent
-parallelization.
+to time series data objects.  Since ``TimeSeriesData`` objects iterate over
+filenames in parallel by default, this allows for transparent parallelization. 



https://bitbucket.org/yt_analysis/yt-doc/changeset/4ee450af0387/
changeset:   4ee450af0387
user:        ngoldbaum
date:        2012-04-06 23:18:03
summary:     Merging in yt_analysis/yt_doc
affected #:  16 files

diff -r b4fcf6631d00fe7f4e85553d0bc7461d140212e4 -r 4ee450af03871363197501857fc865999d586711 .hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -1,1 +1,2 @@
 ae96e6783ef6fe12b9d9ffd2c370b26b5de183b1 2.2-build1
+67134a1d1c3fde038544147b0bc5f0319dd806eb 2.3-build1


diff -r b4fcf6631d00fe7f4e85553d0bc7461d140212e4 -r 4ee450af03871363197501857fc865999d586711 helper_scripts/show_fields.py
--- a/helper_scripts/show_fields.py
+++ b/helper_scripts/show_fields.py
@@ -1,6 +1,7 @@
 import inspect
 from yt.mods import *
 
+
 def islambda(f):
     return inspect.isfunction(f) and \
            f.__name__ == (lambda: True).__name__
@@ -14,7 +15,7 @@
 This is a list of all fields available in ``yt``.  It has been organized by the
 type of code that each field is supported by.  "Universal" fields are available
 everywhere, "Enzo" fields in Enzo datasets, "Orion" fields in Orion datasets,
-and so on.  
+and so on.
 
 .. note:: Universal fields will be overridden by a code-specific field.
 
@@ -28,17 +29,23 @@
 
 print header
 
+seen = []
+
+
 def print_all_fields(fl):
     for fn in sorted(fl):
         df = fl[fn]
         f = df._function
         cv = df._convert_function
+        if [f, cv] in seen:
+            continue
+        seen.append([f, cv])
         print "%s" % (df.name)
         print "+" * len(df.name)
         print
-        if len(df._units) > 0: 
+        if len(df._units) > 0:
             print "   * Units: :math:`%s`" % (df._units)
-        if len(df._projected_units) > 0: 
+        if len(df._projected_units) > 0:
             print "   * Projected Units: :math:`%s`" % (df._projected_units)
         print "   * Particle Type: %s" % (df.particle_type)
         print
@@ -71,19 +78,24 @@
 print "Universal Field List"
 print "--------------------"
 print
-print_all_fields(FieldInfo._universal_field_list)
+print_all_fields(FieldInfo)
 
-print "Enzo Field List"
-print "---------------"
+print "Enzo-Specific Field List"
+print "------------------------"
 print
-print_all_fields(EnzoFieldInfo._field_list)
+print_all_fields(EnzoFieldInfo)
 
-print "Orion Field List"
-print "----------------"
+print "Orion-Specific Field List"
+print "-------------------------"
 print
-print_all_fields(OrionFieldInfo._field_list)
+print_all_fields(OrionFieldInfo)
 
-print "FLASH Field List"
-print "----------------"
+print "FLASH-Specific Field List"
+print "-------------------------"
 print
-print_all_fields(FLASHFieldInfo._field_list)
+print_all_fields(FLASHFieldInfo)
+
+print "Nyx-Specific Field List"
+print "--------------------------"
+print
+print_all_fields(NyxFieldInfo)


diff -r b4fcf6631d00fe7f4e85553d0bc7461d140212e4 -r 4ee450af03871363197501857fc865999d586711 source/advanced/creating_frontend.rst
--- /dev/null
+++ b/source/advanced/creating_frontend.rst
@@ -0,0 +1,143 @@
+.. _creating_frontend:
+
+Creating A New Code Frontend
+============================
+
+``yt`` is designed to support analysis and visualization of data from multiple
+different simulation codes, although it has so far been most successfully
+applied to Adaptive Mesh Refinement (AMR) data. For a list of codes and the
+level of support they enjoy, we've created a handy [[CodeSupportLevels|table]].
+We'd like to support a broad range of codes, both AMR-based and otherwise. To
+add support for a new code, a few things need to be put into place. These
+necessary structures can be classified into a couple categories:
+
+ * Data meaning: This is the set of parameters that convert the data into
+   physically relevant units; things like spatial and mass conversions, time
+   units, and so on.
+ * Data localization: These are structures that help make a "first pass" at data
+   loading. Essentially, we need to be able to make a first pass at guessing
+   where data in a given physical region would be located on disk. With AMR
+   data, this is typically quite easy: the grid patches are the "first pass" at
+   localization.
+ * Data reading: This is the set of routines that actually perform a read of
+   either all data in a region or a subset of that data.
+
+Data Meaning Structures
+-----------------------
+
+If you are interested in adding a new code, be sure to drop us a line on
+`yt-dev <http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org>`_!
+
+To get started, make a new directory in ``yt/frontends`` with the name of your
+code -- you can start by copying into it the contents of the ``stream``
+directory, which is a pretty empty format. You'll then have to create a subclass
+of ``StaticOutput``. This subclass will need to handle conversion between the
+different physical units and the code units; for the most part, the examples of
+``OrionStaticOutput`` and ``EnzoStaticOutput`` should be followed, but
+``ChomboStaticOutput``, as a slightly newer addition, can also be used as an
+instructive example -- be sure to add an ``_is_valid`` classmethod that will
+verify if a filename is valid for that output type, as that is how "load" works.
+
+A new set of fields must be added in the file ``fields.py`` in that directory.
+For the most part this means subclassing ``CodeFieldInfoContainer`` and adding
+the necessary fields specific to that code. Here is the Chombo field container:
+
+.. code-block:: python
+
+    from UniversalFields import *
+    class ChomboFieldContainer(CodeFieldInfoContainer):
+        _shared_state = {}
+        _field_list = {}
+    ChomboFieldInfo = ChomboFieldContainer()
+    add_chombo_field = ChomboFieldInfo.add_field
+
+The field container is a shared state object, which is why we explicitly set
+``_shared_state`` equal to a mutable.
+
+Data Localization Structures
+----------------------------
+
+As of right now, the "grid patch" mechanism is going to remain in yt, however in
+the future that may change. As such, some other output formats -- like Gadget --
+may be shoe-horned in, slightly.
+
+Hierarchy
+^^^^^^^^^
+
+To set up data localization, an ``AMRHierarchy`` subclass must be added in the
+file ``data_structures.py``. The hierarchy object must override the following
+methods:
+
+ * ``_detect_fields``: ``self.field_list`` must be populated as a list of
+   strings corresponding to "native" fields in the data files.
+ * ``_setup_classes``: it's probably safe to crib this from one of the other
+   ``AMRHierarchy`` subclasses.
+ * ``_count_grids``: this must set self.num_grids to be the total number of
+   grids in the simulation.
+ * ``_parse_hierarchy``: this must fill in ``grid_left_edge``,
+   ``grid_right_edge``, ``grid_particle_count``, ``grid_dimensions`` and
+   ``grid_levels`` with the appropriate information. Additionally, ``grids``
+   must be an array of grid objects that already know their IDs.
+ * ``_populate_grid_objects``: this initializes the grids by calling
+   ``_prepare_grid`` and ``_setup_dx`` on all of them.  Additionally, it should
+     set up ``Children`` and ``Parent`` lists on each grid object.
+ * ``_setup_unknown_fields``: If a field is in the data file that yt doesn't
+   already know, this is where you make a guess at it.
+ * ``_setup_derived_fields``: ``self.derived_field_list`` needs to be made a
+   list of strings that correspond to all derived fields valid for this
+   hierarchy.
+
+For the most part, the ``ChomboHierarchy`` should be the first place to look for
+hints on how to do this; ``EnzoHierarchy`` is also instructive.
+
+Grids
+^^^^^
+
+A new grid object, subclassing ``AMRGridPatch``, will also have to be added.
+This should go in ``data_structures.py``. For the most part, this may be all
+that is needed:
+
+.. code-block:: python
+
+    class ChomboGrid(AMRGridPatch):
+        _id_offset = 0
+        __slots__ = ["_level_id"]
+        def __init__(self, id, hierarchy, level = -1):
+            AMRGridPatch.__init__(self, id, filename = hierarchy.hierarchy_filename,
+                                  hierarchy = hierarchy)
+            self.Parent = []
+            self.Children = []
+            self.Level = level
+
+
+Even the most complex grid object, ``OrionGrid``, is still relatively simple.
+
+Data Reading Functions
+----------------------
+
+In ``io.py``, there are a number of IO handlers that handle the mechanisms by
+which data is read off disk.  To implement a new data reader, you must subclass
+``BaseIOHandler`` and override the following methods:
+
+ * ``_read_field_names``: this routine accepts a grid object and must return all
+   the fields in the data file affiliated with that grid. It is used at the
+   initialization of the ``AMRHierarchy`` but likely not later.
+ * ``modify``: This accepts a field from a data file and returns it ready to be
+   used by yt. This is used in Enzo data for preloading.
+ * ``_read_data_set``: This accepts a grid object and a field name and must
+   return that field, ready to be used by yt as a NumPy array. Note that this
+   presupposes that any actions done in ``modify`` (above) have been executed.
+ * ``_read_data_slice``: This accepts a grid object, a field name, an axis and
+   an (integer) coordinate, and it must return a slice through the array at that
+   value.
+ * ``preload``: (optional) This accepts a list of grids and a list of datasets
+   and it populates ``self.queue`` (a dict keyed by grid id) with dicts of
+   datasets.
+ * ``_read_exception``: (property) This is a tuple of exceptions that can be
+   raised by the data reading to indicate a field does not exist in the file.
+
+
+And that just about covers it. Please feel free to email
+`yt-users <http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org>`_ or
+`yt-dev <http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org>`_ with
+any questions, or to let us know you're thinking about adding a new code to yt.


diff -r b4fcf6631d00fe7f4e85553d0bc7461d140212e4 -r 4ee450af03871363197501857fc865999d586711 source/advanced/developing.rst
--- a/source/advanced/developing.rst
+++ b/source/advanced/developing.rst
@@ -63,7 +63,7 @@
    ``yt/utilities/command_line.py`` in the function ``do_bootstrap``.
 
 Here is the list of items that the script will attempt to accomplish, along
-with a brief motivation of each.  
+with a brief motivation of each.
 
  #. **Ensure that the yt-supplemental repository is checked out into
     ``YT_DEST``**.  To make sure that the extensions we're going to use to
@@ -107,7 +107,7 @@
 start developing yt efficiently.
 
 .. _included-hg-extensions:
- 
+
 Included hg Extensions
 ^^^^^^^^^^^^^^^^^^^^^^
 
@@ -158,26 +158,99 @@
 How To Get The Source Code
 --------------------------
 
-yt is hosted on BitBucket, and you can see all of the yt repositories at
-http://hg.yt-project.org/ .  With the yt installation script you should have a
-copy of Mercurial.  You can clone the repository like so:
+If you just want to *look* at the source code, you already have it on your
+computer.  Go to the directory where you ran the install_script.sh, then
+go to ``$YT_DEST/src/yt-hg`` .  In this directory are a number of
+subdirectories with different components of the code, although most of them
+are in the yt subdirectory.  Feel free to explore here.  If you're looking
+for a specific file or function in the yt source code, use the unix find
+command:
 
 .. code-block:: bash
 
-   $ hg clone http://hg.yt-project.org/yt/
+   $ find <DIRECTORY_TREE_TO_SEARCH> -name '<FILENAME>'
 
-You can update to any branch or revision by executing the command:
+The above command will find the FILENAME in any subdirectory in the
+DIRECTORY_TREE_TO_SEARCH.  Alternatively, if you're looking for a function
+call or a keyword in an unknown file in a directory tree, try:
 
 .. code-block:: bash
 
-   $ hg up -C some_revision_specifier
+   $ grep -R <KEYWORD_TO_FIND><DIRECTORY_TREE_TO_SEARCH>
 
-Specifying a branch name in the revspec will update to the latest revision on
-that branch.  If you ran the installation script, you can tell Python to use a
-different version of the library by executing:
+This can be very useful for tracking down functions in the yt source.
+
+While you can edit this source code and execute it on your local machine,
+you will be unable to share your work with others in the community (or
+get feedback on your work).  If you want to submit your modifications to the
+yt project, follow the directions below.
+
+How To Get The Source Code For Editing
+--------------------------------------
+
+yt is hosted on BitBucket, and you can see all of the yt repositories at
+http://hg.yt-project.org/ .  With the yt installation script you should have a
+copy of Mercurial for checking out pieces of code.  Make sure you have followed
+the steps above for bootstrapping your development (to assure you have a
+bitbucket account, etc.)
+
+In order to access the source code for yt, we ask that you make a "fork" of
+the main yt repository on bitbucket.  A fork is simply an exact copy of the
+main repository (along with its history) that you will now own and can make
+modifications as you please.  You can create a personal fork by visiting the yt
+bitbucket webpage at https://bitbucket.org/yt_analysis/yt/wiki/Home .  After
+logging in, you should see an option near the top right labeled "fork".
+Click this option, and then click the fork repository button on the subsequent
+page.  You now have a forked copy of the yt repository for your own personal
+use.
+
+This forked copy exists on the bitbucket repository, so in order to access
+it locally, follow the instructions at the top of that webpage for that
+forked repository, namely run at a local command line:
 
 .. code-block:: bash
 
+   $ hg clone http://bitbucket.org/<USER>/<REPOSITORY_NAME>
+
+This downloads that new forked repository to your local machine, so that you
+can access it, read it, make modifications, etc.  It will put the repository in
+a local directory of the same name as the repository in the current working
+directory.  You can see any past state of the code by using the hg log command.
+For example, the following command would show you the last 5 changesets
+(modifications to the code) that were submitted to that repository.
+
+.. code-block:: bash
+
+   $ cd <REPOSITORY_NAME>
+   $ hg log -l 5
+
+Using the revision specifier (the number or hash identifier next to each
+changeset), you can update the local repository to any past state of the
+code (a previous changeset or version) by executing the command:
+
+.. code-block:: bash
+
+   $ hg up revision_specifier
+
+Lastly, if you want to use this new downloaded version of your yt repository
+as the *active* version of yt on your computer (i.e. the one which is executed
+when you run yt from the command line or ``from yt.mods import *``),
+then you must "activate" it using the following commands from within the
+repository directory.
+
+In order to do this for the first time with a new repository, you have to
+copy some config files over from your yt installation directory (where yt
+was initially installed from the install_script.sh).  Try this:
+
+.. code-block:: bash
+
+   $ cp $YT_DEST/src/yt-hg/*.cfg <REPOSITORY_NAME>
+
+and then every time you want to "activate" a different repository of yt.
+
+.. code-block:: bash
+
+   $ cd <REPOSITORY_NAME>
    $ python2.7 setup.py develop
 
 This will rebuild all C modules as well.
@@ -185,24 +258,81 @@
 How To Submit Changes
 ---------------------
 
-You can submit changes a couple different ways, but the easiest is to use the
-"fork" mechanism on BitBucket.  Just go to the "fork" page at:
+So now you've made some cool modifications to the yt source, and you want
+to share it with the rest of the community.  But wait, how can we trust
+that your modifications aren't going to break the rest of yt (after all, mine
+have several times!)  So we have you submit your code using the "pull request"
+mechanism on bitbucket.  A pull request basically submits your modifications
+to the repository, but they need to be reviewed/tested by other users of
+the code before they're pulled into the main repository.
 
-http://hg.yt-project.org/yt/fork
-
-and you're all set, ready to go.  You'll have to either clone a new copy of the
-repository or edit .hg/hgrc to point to the location of your new fork, first,
-though.
-
-When you're ready to submit them to the main repository, simply go to:
-
-http://hg.yt-project.org/yt/pull
+When you're ready to submit them to the main repository, simply go to the
+bitbucket page for your personal fork of the yt-analysis yt repository,
+and click the button to issue a pull request (at top right):
 
 Make sure you notify ``yt_analysis`` and put in a little description.  That'll
 notify the core developers that you've got something ready to submit, and we
-will review it an (hopefully!) merge it in.  If it goes well, you may end up
+will review it and (hopefully!) merge it in.  If it goes well, you may end up
 with push access to the main repository.
 
+How To Download/Test Someone Else's Pull Request
+------------------------------------------------
+
+Go to the bitbucket yt repository webpage.  Follow the instructions for
+cloning the repo.  You must clone a new version of yt on your local machine
+(for the purposes of testing) by running a command like:
+
+.. code-block:: bash
+
+   $ hg clone https://bitbucket.org/yt_analysis/yt yt-testing
+
+At the top of the webpage, click on the pull request tab, and click on
+the specific pull request you want to test.
+
+Click on the changeset hash (e.g. 3ec2c245c827) just below the name of
+the pull request and the name of the user who submitted the pull request.
+
+This page has the details of the changesets that were made in the pull
+request.  To view how these results are different from the existing
+repository (i.e. the one that you already cloned), click the "compare fork"
+button in the upper right of the page.
+
+This page has instructions on how to merge this pull request into your
+local cloned copy of yt (so that you can test it on your own machine).  In
+this case, it should give you these commands (because it recognizes that the
+pull request came from the submitter's forked branch of yt):
+
+.. code-block:: bash
+
+   $ hg pull -r yt https://bitbucket.org/<USERNAME>/<REPOSITORY_NAME>
+   $ hg update yt
+   $ hg merge yt
+
+After running these commands on your local testing copy of yt, you will
+want to use this testing yt as your default (at least temporarily) so that
+you can test how this version of yt behaves with whatever testing scripts.
+You can "activate" it by going into the new yt-testing directory and running:
+
+.. code-block:: bash
+
+   $ ``cp yt-old/src/yt-hg/*.cfg yt-testing``
+   $ cd yt-testing
+   $ python setup.py develop
+
+Now do whatever tests that you need to do on the pull-requested version
+of yt, using your normal ``from yt.mods import *`` or whatever.  When you are
+done testing this version of yt, just get rid of the yt-testing directory
+tree, and "reactivate" your old version of yt:
+
+.. code-block:: bash
+
+   $ rm -rf yt-testing
+   $ cd yt-old/src/yt-hg
+   $ python setup.py develop
+
+If you want to accept the changeset or reject it (if you have sufficient
+priveleges) or comment on it, you can do so from its pull request webpage.
+
 How To Read The Source Code
 ---------------------------
 
@@ -382,14 +512,13 @@
 
 ``yt`` strives to be a general-purpose analysis tool for astrophysical data.
 To that end, we'd like to short up our support for codes besides Enzo, as well
-as ensure that the other codes we support -- Orion, Tiger, etc -- are
+as ensure that the other codes we support -- Orion, Tiger, etc. -- are
 well-supported.
 
-`A page has been set up <http://yt-project.org/wiki/AddingSupportForANewCode>`_
-on the Trac site to describe the method of adding support for a new code to
-``yt``.  Please feel free to use it as a reference, but if you would like some
-assistance, drop a line to one of the mailing lists (see :ref:`mailing-list`)
-for more help.
+The :ref:`creating_frontend` page describes the process of adding support for a
+new code to ``yt``.  Please feel free to use it as a reference, but if you would
+like some assistance, drop a line to one of the mailing lists (see
+:ref:`mailing-list`) for more help.
 
 GUIs and Interactive Exploration
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


diff -r b4fcf6631d00fe7f4e85553d0bc7461d140212e4 -r 4ee450af03871363197501857fc865999d586711 source/advanced/installing.rst
--- a/source/advanced/installing.rst
+++ b/source/advanced/installing.rst
@@ -157,15 +157,50 @@
 
 This script will identify which repository you're using (stable, development, 
 etc.), connect to the yt-project.org server, download any recent changesets 
-for your version, and then recompile any new code that needs it (e.g. cython, 
-rebuild).  
+for your version and then recompile any new code that needs 
+it (e.g. cython, rebuild).  This same behavior is achieved manually by running:
+
+.. code-block:: bash
+
+   $ cd $YT_DEST/src/yt-hg 
+   $ hg pull
+   $ python setup.py develop
 
 Note that this automated update will fail if you have made modifications to
 the yt code base that you have not yet committed.  If this occurs, identify
 your modifications using 'hg status', and then commit them using 'hg commit',
 in order to bring the repository back to a state where you can automatically
-update the code as above.
-    
+update the code as above.  On the other hand, if you want to wipe out your
+uncommitted changes and just update to the latest version, you can type: 
+
+.. code-block:: bash
+
+   $ cd $YT_DEST/src/yt-hg 
+   $ hg pull
+   $ hg up -C      # N.B. This will wipe your uncommitted changes! 
+   $ python setup.py develop
+
 If you run into *any* problems with the update utility, it should be considered
 a bug, and we would love to hear about it so we can fix it.  Please inform us 
 through the bugsubmit utility or through the yt-users mailing list.
+
+Switching Between Branches in yt
+================================
+
+.. _switching-versions:
+
+If you are running the stable version of the code, and you want to switch 
+to using the development version of the code (or vice versa), you can merely
+follow a few steps (without reinstalling all of the source again):
+
+.. code-block:: bash
+
+   $ cd $YT_DEST/src/yt-hg 
+   $ hg pull
+   <commit all changes or they will be lost>
+   $ hg up -C <branch>     # N.B. This will wipe your uncommitted changes! 
+   $ python setup.py develop
+
+If you want to switch to using the development version of the code, use: 
+"yt" as <branch>, whereas if you want to switch to using the stable version
+of the code, use: "stable" as <branch>.


diff -r b4fcf6631d00fe7f4e85553d0bc7461d140212e4 -r 4ee450af03871363197501857fc865999d586711 source/advanced/parallel_computation.rst
--- a/source/advanced/parallel_computation.rst
+++ b/source/advanced/parallel_computation.rst
@@ -97,9 +97,6 @@
 
 The following operations use spatial decomposition:
 
-  * Projections
-  * Slices
-  * Cutting planes
   * Halo finding
   * Merger tree
   * Two point functions
@@ -115,6 +112,9 @@
 
 The following operations use grid decomposition:
 
+  * Projections
+  * Slices
+  * Cutting planes
   * Derived Quantities
   * 1-, 2-, and 3-D profiles
   * Isocontours & flux calculations
@@ -151,6 +151,11 @@
    
    # The number 4, below, is the number of processes to parallelize over, which
    # is generally equal to the number of MPI tasks the job is launched with.
+   # If num_procs is set to zero or a negative number, the for loop below
+   # will be run such that each iteration of the loop is done by a single MPI
+   # task. Put another way, setting it to zero means that no matter how many
+   # MPI tasks the job is run with, num_procs will default to the number of
+   # MPI tasks automatically.
    num_procs = 4
    
    # fns is a list of all Enzo hierarchy files in directories one level down.
@@ -378,7 +383,7 @@
     the job scheduler queue; it may be worth trying to find it.
 
   * If you are using object-based parallelism but doing CPU-intensive computations
-    on each object, you may find that setting :py:data:'num_procs' equal to the 
+    on each object, you may find that setting ``num_procs`` equal to the 
     number of processors per compute node can lead to significant speedups.
     By default, most mpi implimentations will assign tasks to processors on a
     'by-slot' basis, so this setting will tell yt to do computations on a single


diff -r b4fcf6631d00fe7f4e85553d0bc7461d140212e4 -r 4ee450af03871363197501857fc865999d586711 source/analysis_modules/merger_tree.rst
--- a/source/analysis_modules/merger_tree.rst
+++ b/source/analysis_modules/merger_tree.rst
@@ -31,6 +31,8 @@
 Clearly, another requirement is that Python has the
 `sqlite3 library <http://docs.python.org/library/sqlite3.html>`_
 installed.
+This should be built along with everything else yt needs
+if the ``install_script.sh`` was used.
 
 The merger tree can be calculated in parallel, and if necessary, it will run
 the halo finding in parallel as well. Please see the note below about the
@@ -77,18 +79,19 @@
 at the same time (`see more here <http://www.sqlite.org/lockingv3.html#how_to_corrupt>`_).
 NFS disks can store files on multiple physical hard drives, and it can take time
 for changes made by one task to appear to all the parallel tasks.
+Only one task of the merger tree ever interacts with the database,
+so these dangers are minimal,
+but in general it's a good idea to know something about the disk used to
+store the database.
 
-The Merger Tree takes extra caution to ensure that every task sees the exact
-same version of the database before writing to it, and only one task
-ever writes to the database at a time.
-This is accomplished by using MPI Barriers and md5 hashing of the database
-between writes.
 In general, it is recommended to keep the database on a 'real disk' 
-(/tmp for example, if all the tasks are on the same SMP node) if possible,
+(/tmp for example, if all the tasks are on the same SMP node,
+or RAM disk for extra speed) if possible,
 but it should work on a NFS disk as well.
-If the database must be stored on a NFS disk, the documentation for the NFS protocol
-should be consulted to see what settings are available that can minimize the potential for
-file replication problems of the database.
+If a temporary disk is used to store the database while it's being built,
+remember to copy the file to a permanent disk after the merger tree script
+is finished.
+
 
 Running and Using the Halo Merger Tree
 --------------------------------------
@@ -155,16 +158,18 @@
 If the halos are to be found during the course of building the merger tree,
 run with an appropriate number of tasks to the size of the dataset and the
 halo finder used.
-The merger tree itself, which compares halo membership in parallel very effectively,
-is almost completely constrained by the
-read/write times of the SQLite file.
+The speed of the merger tree itself,
+which compares halo membership in parallel very effectively,
+is almost completely constrained by the read/write times of the SQLite file.
 In tests with the halos pre-located, there is not much speedup beyond two MPI tasks.
 There is no negative effect with running the merger tree with more tasks (which is
 why if halos are to be found by the merger tree, the merger tree should be
-run with as many tasks as that step requires), but there is no benefit.
+run with as many tasks as that step requires), and indeed if the simulation
+is a large one, running in parallel does provide memory parallelism,
+which is important.
 
-How The Database Is Handled
----------------------------
+How The Database Is Handled In Analysis Restarts
+------------------------------------------------
 
 The Merger Tree is designed to allow the merger tree database to be built
 incrementally.
@@ -178,6 +183,12 @@
 referencing the same database as before.
 By referencing the same database as before, work does not need to be repeated.
 
+If the merger tree process is interrupted before completion (say, if the 
+jobs walltime is exceeded and the scheduler kills it), just run the exact
+same job again.
+The merger tree will check to see what work has already been completed, and
+resume where it left off.
+
 Additional Parameters
 ~~~~~~~~~~~~~~~~~~~~~
 
@@ -197,10 +208,6 @@
     rebuild the database regardless of whether or not the halo files or
     database exist on disk already.
     Default: False.
-  * ``sleep`` (float) - The amount of time in seconds tasks waits between
-    checks to make sure the SQLite database file is globally-identical.
-    This time is used to allow a parallel file system to synch up globally.
-    The value may not be negative or zero. Default: 1.
   * ``index`` (bool) - Whether to add an index to the SQLite file. True makes
     SQL searches faster at the cost of additional disk space. Default=True.
 


diff -r b4fcf6631d00fe7f4e85553d0bc7461d140212e4 -r 4ee450af03871363197501857fc865999d586711 source/analysis_modules/radial_column_density.rst
--- a/source/analysis_modules/radial_column_density.rst
+++ b/source/analysis_modules/radial_column_density.rst
@@ -11,7 +11,7 @@
 on the grid cells.
 
 Details
-------
+-------
 
 This module allows the calculation of column densities around a single point.
 For example, this is useful for looking at the gas around a radiating source.


diff -r b4fcf6631d00fe7f4e85553d0bc7461d140212e4 -r 4ee450af03871363197501857fc865999d586711 source/analyzing/creating_derived_fields.rst
--- a/source/analyzing/creating_derived_fields.rst
+++ b/source/analyzing/creating_derived_fields.rst
@@ -133,6 +133,59 @@
 ``bulk_velocity``, and returning a vector field that needs conversion by the
 function ``_convertSpecificAngularMomentum``.
 
+It is also possible to define fields that depend on spatial derivatives of 
+other fields.  Calculating the derivative for a single grid cell requires 
+information about neighboring grid cells.  Therefore, properly calculating 
+a derivative for a cell on the edge of the grid will require cell values from 
+neighboring grids.  Below is an example of a field that is the divergence of the 
+velocity.
+
+.. code-block:: python
+
+    def _DivV(field, data):
+        # We need to set up stencils
+        if data.pf["HydroMethod"] == 2:
+            sl_left = slice(None,-2,None)
+            sl_right = slice(1,-1,None)
+            div_fac = 1.0
+        else:
+            sl_left = slice(None,-2,None)
+            sl_right = slice(2,None,None)
+            div_fac = 2.0
+        ds = div_fac * data['dx'].flat[0]
+        f  = data["x-velocity"][sl_right,1:-1,1:-1]/ds
+        f -= data["x-velocity"][sl_left ,1:-1,1:-1]/ds
+        if data.pf.dimensionality > 1:
+            ds = div_fac * data['dy'].flat[0]
+            f += data["y-velocity"][1:-1,sl_right,1:-1]/ds
+            f -= data["y-velocity"][1:-1,sl_left ,1:-1]/ds
+        if data.pf.dimensionality > 2:
+            ds = div_fac * data['dz'].flat[0]
+            f += data["z-velocity"][1:-1,1:-1,sl_right]/ds
+            f -= data["z-velocity"][1:-1,1:-1,sl_left ]/ds
+        new_field = na.zeros(data["x-velocity"].shape, dtype='float64')
+        new_field[1:-1,1:-1,1:-1] = f
+        return new_field
+    def _convertDivV(data):
+        return data.convert("cm")**-1.0
+    add_field("DivV", function=_DivV,
+               validators=[ValidateSpatial(ghost_zone=1,
+	                   fields=["x-velocity","y-velocity","z-velocity"])],
+              units=r"\rm{s}^{-1}", take_log=False,
+              convert_function=_convertDivV)
+
+Note that *slice* is simply a native Python object used for taking slices of 
+arrays or lists.  Another :class:`FieldValidator` object, ``ValidateSpatial`` 
+is given in the list of *validators* in the call to ``add_field`` with 
+*ghost_zones* = 1, specifying that the original grid be padded with one additional 
+cell from the neighboring grids on all sides.  The *fields* keyword simply 
+mandates that the listed fields be present.  With one ghost zone added to all sides 
+of the grid, the data fields (data["x-velocity"], data["y-velocity"], and 
+data["z-velocity"]) will have a shape of (NX+2, NY+2, NZ+2) inside of this function, 
+where the original grid has dimension (NX, NY, NZ).  However, when the final field 
+data is returned, the ghost zones will be removed and the shape will again be 
+(NX, NY, NZ).
+
 .. _derived-field-options:
 
 Field Options


diff -r b4fcf6631d00fe7f4e85553d0bc7461d140212e4 -r 4ee450af03871363197501857fc865999d586711 source/analyzing/objects.rst
--- a/source/analyzing/objects.rst
+++ b/source/analyzing/objects.rst
@@ -68,7 +68,7 @@
 ---------------------------
 
 ``yt`` utilizes load-on-demand objects to represent physical regions in space.
-(See :ref:`philo-objects`.)  Data objects in ``yt`` all respect the following
+(see :ref:`how-yt-thinks-about-data`.)  Data objects in ``yt`` all respect the following
 protocol for accessing data:
 
 .. code-block:: python
@@ -101,9 +101,8 @@
 calculated every time the object is instantiated.  The full list of fields that
 have been identified in the output file, which need no processing (besides unit
 conversion) are in the property ``field_list`` and the full list of
-potentially-accessible derived fields (see :ref:`philo-derived-fields`) is
-available in the property ``derived_field_list``.  You can see these by
-examining the two properties:
+potentially-accessible derived fields is available in the property
+``derived_field_list``.  You can see these by examining the two properties:
 
 .. code-block:: python
 
@@ -188,9 +187,9 @@
 
 Derived quantities are a way of operating on a collection of cells and
 returning a set of values that is fewer in number than the number of cells --
-yt already knows about several.  Every 3D data object (see :ref:`using-objects`
-and :ref:`philo-objects`) provides a mechanism for access to derived
-quantities.  These can be accessed via the ``quantities`` interface, like so:
+yt already knows about several.  Every 3D data object (see
+:ref:`using-objects`) provides a mechanism for access to derived quantities.
+These can be accessed via the ``quantities`` interface, like so:
 
 .. code-block:: python
 


diff -r b4fcf6631d00fe7f4e85553d0bc7461d140212e4 -r 4ee450af03871363197501857fc865999d586711 source/conf.py
--- a/source/conf.py
+++ b/source/conf.py
@@ -53,7 +53,7 @@
 # The short X.Y version.
 version = '2.3'
 # The full version, including alpha/beta/rc tags.
-release = '2.3dev'
+release = '2.3'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.


diff -r b4fcf6631d00fe7f4e85553d0bc7461d140212e4 -r 4ee450af03871363197501857fc865999d586711 source/cookbook/index.rst
--- a/source/cookbook/index.rst
+++ b/source/cookbook/index.rst
@@ -35,6 +35,7 @@
 .. include:: velocity_vectors_on_slice.inc
 .. include:: average_value.inc
 .. include:: find_clumps.inc
+.. include:: boolean_data_objects.inc
 .. include:: global_phase_plots.inc
 .. include:: halo_mass_info.inc
 .. include:: multi_width_save.inc
@@ -42,6 +43,7 @@
 .. include:: overplot_particles.inc
 .. include:: multi_plot.inc
 .. include:: multi_plot_3x2.inc
+.. include:: multi_plot_3x2_FRB.inc
 .. include:: time_series_phase.inc
 .. include:: time_series_quantity.inc
 .. include:: extract_fixed_resolution_data.inc
@@ -54,3 +56,4 @@
 .. include:: simple_volume_rendering.inc
 .. include:: camera_movement.inc
 .. include:: offaxis_projection.inc
+.. include:: offaxis_projection_colorbar.inc


diff -r b4fcf6631d00fe7f4e85553d0bc7461d140212e4 -r 4ee450af03871363197501857fc865999d586711 source/faq/index.rst
--- a/source/faq/index.rst
+++ b/source/faq/index.rst
@@ -118,6 +118,17 @@
 build and install from source and specify the mpi-enabled c and c++ 
 compilers in the mpi.cfg file.  See the `mpi4py installation page <http://mpi4py.scipy.org/docs/usrman/install.html>`_ for details.
 
+``yt`` fails saying that it cannot import yt modules
+----------------------------------------------------
+
+This is likely because you need to rebuild the source.  You can do 
+this automatically by running:
+
+.. code-block:: bash
+
+    cd $YT_DEST/src/yt-hg
+    python setup.py develop
+
 How do I cite yt?
 -----------------
 


diff -r b4fcf6631d00fe7f4e85553d0bc7461d140212e4 -r 4ee450af03871363197501857fc865999d586711 source/interacting/command-line.rst
--- a/source/interacting/command-line.rst
+++ b/source/interacting/command-line.rst
@@ -14,41 +14,57 @@
 
    yt -h
 
-This yields all of the subcommands.  To execute any subcommand, simply run:
+This yields all of the subcommands.  To execute any such function, 
+simply run:
 
 .. code-block:: bash
 
    yt <subcommand>
 
+Finally, to identify the options associated with any of these subcommand, run:
+
+.. code-block:: bash
+
+   yt <subcommand> -h
+
 Let's go through each subcommand.
 
 .. code-block:: bash
 
-    bootstrap_dev     Bootstrap a yt development environment
-    bugreport         Report a bug in yt
-    halos             Run HaloProfiler on one dataset
-    help (?, h)       give detailed help on a specific sub-command
-    hop               Run HOP on one or more datasets
-    hubsubmit         Submit a mercurial repository to the yt Hub (http://h...
-    instinfo          Get some information about the yt installation
-    load              Load a single dataset into an IPython instance
-    mapserver         Serve a plot in a GMaps-style interface
-    pastebin          Post a script to an anonymous pastebin
-    pastebin_grab     Print an online pastebin to STDOUT for local use. Pas...
-    pasteboard        Place a file into your pasteboard.
-    pasteboard_grab   Download from your or another user's pasteboard
-    plot              Create a set of images
-    rpdb              Connect to a currently running (on localhost) rpd ses...
-    serve             Run the Web GUI Reason
-    stats             Print stats and maximum density for one or more datasets
-    update            Update the yt installation to the most recent version
-    upload_image      Upload an image to imgur.com.  Must be PNG.
+    help                Print help message
+    bootstrap_dev       Bootstrap a yt development environment
+    bugreport           Report a bug in yt
+    hop                 Run HOP on one or more datasets
+    hub_submit          Submit a mercurial repository to the yt Hub
+                        (http://hub.yt-project.org/), creating a BitBucket
+                        repo in the process if necessary.
+    instinfo            Get some information about the yt installation
+    load                Load a single dataset into an IPython instance
+    mapserver           Serve a plot in a GMaps-style interface
+    pastebin            Post a script to an anonymous pastebin
+    pastebin_grab       Print an online pastebin to STDOUT for local use.
+    plot                Create a set of images
+    reason              Run the Web GUI Reason
+    render              Create a simple volume rendering
+    rpdb                Connect to a currently running (on localhost) rpd
+                        session. Commands run with --rpdb will trigger an rpdb
+                        session with any uncaught exceptions.
+    serve               Run the Web GUI Reason
+    stats               Print stats and max density for one or more datasets
+    update              Update the yt installation to the most recent version
+    upload_image        Upload an image to imgur.com. Must be PNG.
+
+
+help
+++++
+
+Help lists all of the various command-line options in yt.
 
 bootstrap_dev
 +++++++++++++
 
 After you have installed yt and you want to do some development, there may 
-be a few more steps to complete.  This function automates building a 
+be a few more steps to complete.  This subcommand automates building a 
 development environment for you by setting up your hg preferences correctly,
 creating/linking to a bitbucket account for hosting and sharing your code, 
 and setting up a pasteboard for your code snippets.  A full description of 
@@ -64,25 +80,6 @@
 making a mistake (see :ref:`asking-for-help`), you can submit bug 
 reports using this nice utility.
 
-halos
-+++++
-
-You can easily run the HaloProfiler utility on a single dataset, in order 
-to analyze and visualize multiple halos in a simulation simultaneously and 
-homogeneously.  For more information about the HaloProfiler see 
-:ref:`halo_profiling`; for its command line flags, use the help command
-with the halos keyword.
-
-help
-++++
-
-Help behaves as you expect that it might.  You can use it with any other 
-command-line option to find out more details or if it has any flags:
-
-.. code-block:: bash
-
-   yt help <subcommand>
-
 hop               
 +++
 
@@ -147,23 +144,14 @@
    yt pastebin my_script.py
 
 By running the ``pastebin_grab`` subcommand with a pastebin number 
-(e.g. 1768), it will grab the contents of that pastebin and send it to 
+(e.g. 1768), it will grab the contents of that pastebin 
+(e.g. the website http://paste.yt-project.org/show/1768 ) and send it to 
 STDOUT for local use.  For more details see the :ref:`pastebin` section.
 
 .. code-block:: bash
 
    yt pastebin_grab 1768
 
-pasteboard and pasteboard_grab
-++++++++++++++++++++++++++++++
-
-The pasteboard is very similar to the pastebin, except that it is not
-anonymous.  It is a place you can put more polished code that you'd like
-to share with others.  It might be code that is a step down from what you
-might share on the `yt hub <http://hub.yt-project.org/>`_.  Of course, 
-you will only have a pasteboard if you've created a development environment
-using the bootstrap-dev subcommand.
-
 plot
 ++++
 
@@ -172,10 +160,16 @@
 details), you can create slices and projections easily at the 
 command-line.
 
+reason and serve
+++++++++++++++++
+
+The ``reason`` and ``serve`` subcommands have identical functionality in that
+they both initiate the Web GUI Reason. See :ref:`reason`.
+
 render
 ++++++
 
-This command generates a volume rendering for a single dataset.  By sepcifying
+This command generates a volume rendering for a single dataset.  By specifying
 the center, width, number of pixels, number and thickness of contours, etc.
 (run ``yt help render`` for details),  you can create high-quality volume
 renderings at the command-line before moving on to more involved volume
@@ -186,11 +180,6 @@
 
 Connect to a currently running (on localhost) rpd session.
 
-serve
-+++++
-
-The ``serve`` subcommand initiates the Web GUI Reason. See :ref:`reason`.
-
 stats
 +++++
 


diff -r b4fcf6631d00fe7f4e85553d0bc7461d140212e4 -r 4ee450af03871363197501857fc865999d586711 source/orientation/how_yt_thinks.rst
--- a/source/orientation/how_yt_thinks.rst
+++ b/source/orientation/how_yt_thinks.rst
@@ -1,3 +1,5 @@
+.. _how-yt-thinks-about-data:
+
 How yt Thinks About Data
 ------------------------
 


diff -r b4fcf6631d00fe7f4e85553d0bc7461d140212e4 -r 4ee450af03871363197501857fc865999d586711 source/reference/field_list.rst
--- a/source/reference/field_list.rst
+++ b/source/reference/field_list.rst
@@ -1,4 +1,3 @@
-
 .. _field-list:
 
 Field List
@@ -7,7 +6,7 @@
 This is a list of all fields available in ``yt``.  It has been organized by the
 type of code that each field is supported by.  "Universal" fields are available
 everywhere, "Enzo" fields in Enzo datasets, "Orion" fields in Orion datasets,
-and so on.  
+and so on.
 
 .. note:: Universal fields will be overridden by a code-specific field.
 
@@ -157,6 +156,29 @@
 
 No source available.
 
+Baryon_Overdensity
+++++++++++++++++++
+
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _Baryon_Overdensity(field, data):
+      if data.pf.has_key('omega_baryon_now'):
+          omega_baryon_now = data.pf['omega_baryon_now']
+      else:
+          omega_baryon_now = 0.0441
+      return data['Density'] / (omega_baryon_now * rho_crit_now * 
+                                (data.pf['CosmologyHubbleConstantNow']**2) * 
+                                ((1+data.pf['CosmologyCurrentRedshift'])**3))
+  
+
+**Convert Function Source**
+
+No source available.
+
 CellMass
 ++++++++
 
@@ -315,6 +337,25 @@
 
 No source available.
 
+ComovingDensity
++++++++++++++++
+
+   * Units: :math:`\rm{g}/\rm{cm}^3`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _ComovingDensity(field, data):
+      ef = (1.0 + data.pf.current_redshift)**3.0
+      return data["Density"]/ef
+  
+
+**Convert Function Source**
+
+No source available.
+
 Contours
 ++++++++
 
@@ -414,6 +455,26 @@
 
 No source available.
 
+DensityPerturbation
++++++++++++++++++++
+
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _DensityPerturbation(field, data):
+      rho_bar = rho_crit_now * data.pf.omega_matter * \
+          data.pf.hubble_constant**2 * \
+          (1.0 + data.pf.current_redshift)**3
+      return ((data['Matter_Density'] - rho_bar) / rho_bar)
+  
+
+**Convert Function Source**
+
+No source available.
+
 DiskAngle
 +++++++++
 
@@ -464,12 +525,14 @@
       ds = div_fac * data['dx'].flat[0]
       f  = data["x-velocity"][sl_right,1:-1,1:-1]/ds
       f -= data["x-velocity"][sl_left ,1:-1,1:-1]/ds
-      ds = div_fac * data['dy'].flat[0]
-      f += data["y-velocity"][1:-1,sl_right,1:-1]/ds
-      f -= data["y-velocity"][1:-1,sl_left ,1:-1]/ds
-      ds = div_fac * data['dz'].flat[0]
-      f += data["z-velocity"][1:-1,1:-1,sl_right]/ds
-      f -= data["z-velocity"][1:-1,1:-1,sl_left ]/ds
+      if data.pf.dimensionality > 1:
+          ds = div_fac * data['dy'].flat[0]
+          f += data["y-velocity"][1:-1,sl_right,1:-1]/ds
+          f -= data["y-velocity"][1:-1,sl_left ,1:-1]/ds
+      if data.pf.dimensionality > 2:
+          ds = div_fac * data['dz'].flat[0]
+          f += data["z-velocity"][1:-1,1:-1,sl_right]/ds
+          f -= data["z-velocity"][1:-1,1:-1,sl_left ]/ds
       new_field = na.zeros(data["x-velocity"].shape, dtype='float64')
       new_field[1:-1,1:-1,1:-1] = f
       return new_field
@@ -499,7 +562,7 @@
       M{sqrt(3pi/(16*G*rho))} or M{sqrt(3pi/(16G))*rho^-(1/2)}
       Note that we return in our natural units already
       """
-      return (3.0*pi/(16*G*data["Density"]))**(1./2.)
+      return (3.0*na.pi/(16*G*data["Density"]))**(1./2.)
   
 
 **Convert Function Source**
@@ -509,7 +572,7 @@
 Entropy
 +++++++
 
-   * Units: :math:`\rm{ergs}\/\rm{cm}^{2}`
+   * Units: :math:`\rm{ergs}\ \rm{cm}^{2}`
    * Particle Type: False
 
 **Field Source**
@@ -517,8 +580,8 @@
 .. code-block:: python
 
   def _Entropy(field, data):
-      return (kboltz/mh) * data["Temperature"] / \
-             (data["MeanMolecularWeight"] * data["Density"]**(2./3.))
+      return kboltz  * data["Temperature"] / \
+             (data["NumberDensity"]**(data.pf["Gamma"] - 1.0))
   
 
 **Convert Function Source**
@@ -678,10 +741,9 @@
 .. code-block:: python
 
   def _MagneticEnergy(field,data):
-      """WARNING WARNING WARNING: Units are not yet known to be
-      correct. Trust the magnitude of this quantity at your own
-      risk. However, it should just be a multiplicative offset from
-      reality...
+      """This assumes that your front end has provided Bx, By, Bz in
+      units of Gauss. If you use MKS, make sure to write your own
+      MagneticEnergy field to deal with non-unitary \mu_0.
       """
       return (data["Bx"]**2 + data["By"]**2 + data["Bz"]**2)/2.
   
@@ -760,26 +822,26 @@
 
 No source available.
 
-ParticleAge
+Overdensity
 +++++++++++
 
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-  def _ParticleAge(field, data):
-      current_time = data.pf.current_time
-      return (current_time - data["creation_time"])
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-  def _convertParticleAge(data):
-      return data.convert("years")
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _Matter_Density(field,data):
+      return (data['Density'] + data['Dark_Matter_Density'])
+  
+
+**Convert Function Source**
+
+.. code-block:: python
+
+  def _Convert_Overdensity(data):
+      return 1 / (rho_crit_now * data.pf.hubble_constant**2 * 
+                  (1+data.pf.current_redshift)**3)
   
 
 ParticleAngularMomentum
@@ -818,53 +880,59 @@
 
 No source available.
 
-ParticleMass
-++++++++++++
-
+ParticleAngularMomentumX
+++++++++++++++++++++++++
+
+   * Units: :math:`\rm{g}\/\rm{cm}^2/\rm{s}`
    * Particle Type: True
 
 **Field Source**
 
 .. code-block:: python
 
-  def _ParticleMass(field, data):
-      particles = data["particle_mass"].astype('float64') * \
-                  just_one(data["CellVolumeCode"].ravel())
-      # Note that we mandate grid-type here, so this is okay
-      return particles
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-  def _convertParticleMass(data):
-      return data.convert("Density")*(data.convert("cm")**3.0)
-  
-
-ParticleMassMsun
-++++++++++++++++
-
+  def _ParticleAngularMomentumX(field, data):
+      return data["CellMass"] * data["ParticleSpecificAngularMomentumX"]
+  
+
+**Convert Function Source**
+
+No source available.
+
+ParticleAngularMomentumY
+++++++++++++++++++++++++
+
+   * Units: :math:`\rm{g}\/\rm{cm}^2/\rm{s}`
    * Particle Type: True
 
 **Field Source**
 
 .. code-block:: python
 
-  def _ParticleMass(field, data):
-      particles = data["particle_mass"].astype('float64') * \
-                  just_one(data["CellVolumeCode"].ravel())
-      # Note that we mandate grid-type here, so this is okay
-      return particles
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-  def _convertParticleMassMsun(data):
-      return data.convert("Density")*((data.convert("cm")**3.0)/1.989e33)
-  
+  def _ParticleAngularMomentumY(field, data):
+      return data["CellMass"] * data["ParticleSpecificAngularMomentumY"]
+  
+
+**Convert Function Source**
+
+No source available.
+
+ParticleAngularMomentumZ
+++++++++++++++++++++++++
+
+   * Units: :math:`\rm{g}\/\rm{cm}^2/\rm{s}`
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+  def _ParticleAngularMomentumZ(field, data):
+      return data["CellMass"] * data["ParticleSpecificAngularMomentumZ"]
+  
+
+**Convert Function Source**
+
+No source available.
 
 ParticleRadius
 ++++++++++++++
@@ -1031,8 +1099,8 @@
 
 .. code-block:: python
 
-  def _ConvertRadiuskpc(data):
-      return data.convert("kpc")
+  def _ConvertRadiuskpch(data):
+      return data.convert("kpch")
   
 
 ParticleRadiuspc
@@ -1142,6 +1210,96 @@
       return data.convert("mpc")/1e5
   
 
+ParticleSpecificAngularMomentumX
+++++++++++++++++++++++++++++++++
+
+   * Units: :math:`\rm{cm}^2/\rm{s}`
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+  def _ParticleSpecificAngularMomentumX(field, data):
+      if data.has_field_parameter("bulk_velocity"):
+          bv = data.get_field_parameter("bulk_velocity")
+      else: bv = na.zeros(3, dtype='float64')
+      center = data.get_field_parameter('center')
+      y = data["particle_position_y"] - center[1]
+      z = data["particle_position_z"] - center[2]
+      yv = data["particle_velocity_y"] - bv[1]
+      zv = data["particle_velocity_z"] - bv[2]
+      return yv*z - zv*y
+  
+
+**Convert Function Source**
+
+.. code-block:: python
+
+  def _convertSpecificAngularMomentum(data):
+      return data.convert("cm")
+  
+
+ParticleSpecificAngularMomentumY
+++++++++++++++++++++++++++++++++
+
+   * Units: :math:`\rm{cm}^2/\rm{s}`
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+  def _ParticleSpecificAngularMomentumY(field, data):
+      if data.has_field_parameter("bulk_velocity"):
+          bv = data.get_field_parameter("bulk_velocity")
+      else: bv = na.zeros(3, dtype='float64')
+      center = data.get_field_parameter('center')
+      x = data["particle_position_x"] - center[0]
+      z = data["particle_position_z"] - center[2]
+      xv = data["particle_velocity_x"] - bv[0]
+      zv = data["particle_velocity_z"] - bv[2]
+      return -(xv*z - zv*x)
+  
+
+**Convert Function Source**
+
+.. code-block:: python
+
+  def _convertSpecificAngularMomentum(data):
+      return data.convert("cm")
+  
+
+ParticleSpecificAngularMomentumZ
+++++++++++++++++++++++++++++++++
+
+   * Units: :math:`\rm{cm}^2/\rm{s}`
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+  def _ParticleSpecificAngularMomentumZ(field, data):
+      if data.has_field_parameter("bulk_velocity"):
+          bv = data.get_field_parameter("bulk_velocity")
+      else: bv = na.zeros(3, dtype='float64')
+      center = data.get_field_parameter('center')
+      x = data["particle_position_x"] - center[0]
+      y = data["particle_position_y"] - center[1]
+      xv = data["particle_velocity_x"] - bv[0]
+      yv = data["particle_velocity_y"] - bv[1]
+      return xv*y - yv*x
+  
+
+**Convert Function Source**
+
+.. code-block:: python
+
+  def _convertSpecificAngularMomentum(data):
+      return data.convert("cm")
+  
+
 ParticleVelocityMagnitude
 +++++++++++++++++++++++++
 
@@ -1444,10 +1602,10 @@
       return data.convert("kpc")
   
 
-Radiuskpch
-++++++++++
-
-   * Units: :math:`\rm{kpc}/\rm{h}`
+Radiuspc
+++++++++
+
+   * Units: :math:`\rm{pc}`
    * Particle Type: False
 
 **Field Source**
@@ -1469,35 +1627,6 @@
 
 .. code-block:: python
 
-  def _ConvertRadiuskpc(data):
-      return data.convert("kpc")
-  
-
-Radiuspc
-++++++++
-
-   * Units: :math:`\rm{pc}`
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-  def _Radius(field, data):
-      center = data.get_field_parameter("center")
-      DW = data.pf.domain_right_edge - data.pf.domain_left_edge
-      radius = na.zeros(data["x"].shape, dtype='float64')
-      for i, ax in enumerate('xyz'):
-          r = na.abs(data[ax] - center[i])
-          radius += na.minimum(r, na.abs(DW[i]-r))**2.0
-      na.sqrt(radius, radius)
-      return radius
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
   def _ConvertRadiuspc(data):
       return data.convert("pc")
   
@@ -1757,6 +1886,24 @@
 
 No source available.
 
+TotalMass
++++++++++
+
+   * Units: :math:`\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _TotalMass(field,data):
+      return (data["Density"]+data["Dark_Matter_Density"]) * data["CellVolume"]
+  
+
+**Convert Function Source**
+
+No source available.
+
 TotalMassMsun
 +++++++++++++
 
@@ -1803,6 +1950,103 @@
 
 No source available.
 
+VorticitySquared
+++++++++++++++++
+
+   * Units: :math:`\rm{s}^{-2}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _VorticitySquared(field, data):
+      mylog.debug("Generating vorticity on %s", data)
+      # We need to set up stencils
+      if data.pf["HydroMethod"] == 2:
+          sl_left = slice(None,-2,None)
+          sl_right = slice(1,-1,None)
+          div_fac = 1.0
+      else:
+          sl_left = slice(None,-2,None)
+          sl_right = slice(2,None,None)
+          div_fac = 2.0
+      new_field = na.zeros(data["x-velocity"].shape)
+      dvzdy = (data["z-velocity"][1:-1,sl_right,1:-1] -
+               data["z-velocity"][1:-1,sl_left,1:-1]) \
+               / (div_fac*data["dy"].flat[0])
+      dvydz = (data["y-velocity"][1:-1,1:-1,sl_right] -
+               data["y-velocity"][1:-1,1:-1,sl_left]) \
+               / (div_fac*data["dz"].flat[0])
+      new_field[1:-1,1:-1,1:-1] += (dvzdy - dvydz)**2.0
+      del dvzdy, dvydz
+      dvxdz = (data["x-velocity"][1:-1,1:-1,sl_right] -
+               data["x-velocity"][1:-1,1:-1,sl_left]) \
+               / (div_fac*data["dz"].flat[0])
+      dvzdx = (data["z-velocity"][sl_right,1:-1,1:-1] -
+               data["z-velocity"][sl_left,1:-1,1:-1]) \
+               / (div_fac*data["dx"].flat[0])
+      new_field[1:-1,1:-1,1:-1] += (dvxdz - dvzdx)**2.0
+      del dvxdz, dvzdx
+      dvydx = (data["y-velocity"][sl_right,1:-1,1:-1] -
+               data["y-velocity"][sl_left,1:-1,1:-1]) \
+               / (div_fac*data["dx"].flat[0])
+      dvxdy = (data["x-velocity"][1:-1,sl_right,1:-1] -
+               data["x-velocity"][1:-1,sl_left,1:-1]) \
+               / (div_fac*data["dy"].flat[0])
+      new_field[1:-1,1:-1,1:-1] += (dvydx - dvxdy)**2.0
+      del dvydx, dvxdy
+      new_field = na.abs(new_field)
+      return new_field
+  
+
+**Convert Function Source**
+
+.. code-block:: python
+
+  def _convertVorticitySquared(data):
+      return data.convert("cm")**-2.0
+  
+
+WeakLensingConvergence
+++++++++++++++++++++++
+
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _DensityPerturbation(field, data):
+      rho_bar = rho_crit_now * data.pf.omega_matter * \
+          data.pf.hubble_constant**2 * \
+          (1.0 + data.pf.current_redshift)**3
+      return ((data['Matter_Density'] - rho_bar) / rho_bar)
+  
+
+**Convert Function Source**
+
+.. code-block:: python
+
+  def _convertConvergence(data):
+      if not data.pf.parameters.has_key('cosmology_calculator'):
+          data.pf.parameters['cosmology_calculator'] = Cosmology(
+              HubbleConstantNow=(100.*data.pf.hubble_constant),
+              OmegaMatterNow=data.pf.omega_matter, OmegaLambdaNow=data.pf.omega_lambda)
+      # observer to lens
+      DL = data.pf.parameters['cosmology_calculator'].AngularDiameterDistance(
+          data.pf.parameters['observer_redshift'], data.pf.current_redshift)
+      # observer to source
+      DS = data.pf.parameters['cosmology_calculator'].AngularDiameterDistance(
+          data.pf.parameters['observer_redshift'], data.pf.parameters['lensing_source_redshift'])
+      # lens to source
+      DLS = data.pf.parameters['cosmology_calculator'].AngularDiameterDistance(
+          data.pf.current_redshift, data.pf.parameters['lensing_source_redshift'])
+      return (((DL * DLS) / DS) * (1.5e14 * data.pf.omega_matter * 
+                                  (data.pf.hubble_constant / speed_of_light_cgs)**2 *
+                                  (1 + data.pf.current_redshift)))
+  
+
 XRayEmissivity
 ++++++++++++++
 
@@ -1825,31 +2069,6 @@
       return 2.168e60
   
 
-creation_time
-+++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _Particles(field, data):
-          io = data.hierarchy.io
-          if not data.NumberOfParticles > 0:
-              return na.array([], dtype=dtype)
-          try:
-              return io._read_data_set(data, p_field).astype(dtype)
-          except io._read_exception:
-              pass
-          # This is bad.  But it's the best idea I have right now.
-          return data._read_data(p_field.replace("_"," ")).astype(dtype)
-  
-
-**Convert Function Source**
-
-No source available.
-
 dx
 ++
 
@@ -1886,31 +2105,6 @@
 
 No source available.
 
-dynamical_time
-++++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _Particles(field, data):
-          io = data.hierarchy.io
-          if not data.NumberOfParticles > 0:
-              return na.array([], dtype=dtype)
-          try:
-              return io._read_data_set(data, p_field).astype(dtype)
-          except io._read_exception:
-              pass
-          # This is bad.  But it's the best idea I have right now.
-          return data._read_data(p_field.replace("_"," ")).astype(dtype)
-  
-
-**Convert Function Source**
-
-No source available.
-
 dz
 ++
 
@@ -1929,31 +2123,6 @@
 
 No source available.
 
-metallicity_fraction
-++++++++++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _Particles(field, data):
-          io = data.hierarchy.io
-          if not data.NumberOfParticles > 0:
-              return na.array([], dtype=dtype)
-          try:
-              return io._read_data_set(data, p_field).astype(dtype)
-          except io._read_exception:
-              pass
-          # This is bad.  But it's the best idea I have right now.
-          return data._read_data(p_field.replace("_"," ")).astype(dtype)
-  
-
-**Convert Function Source**
-
-No source available.
-
 particle_density
 ++++++++++++++++
 
@@ -1985,247 +2154,6 @@
       return data.convert("Density")
   
 
-particle_index
-++++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _Particles(field, data):
-          io = data.hierarchy.io
-          if not data.NumberOfParticles > 0:
-              return na.array([], dtype=dtype)
-          try:
-              return io._read_data_set(data, p_field).astype(dtype)
-          except io._read_exception:
-              pass
-          # This is bad.  But it's the best idea I have right now.
-          return data._read_data(p_field.replace("_"," ")).astype(dtype)
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-  def _convRetainInt(data):
-      return 1
-  
-
-particle_mass
-+++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _Particles(field, data):
-          io = data.hierarchy.io
-          if not data.NumberOfParticles > 0:
-              return na.array([], dtype=dtype)
-          try:
-              return io._read_data_set(data, p_field).astype(dtype)
-          except io._read_exception:
-              pass
-          # This is bad.  But it's the best idea I have right now.
-          return data._read_data(p_field.replace("_"," ")).astype(dtype)
-  
-
-**Convert Function Source**
-
-No source available.
-
-particle_position_x
-+++++++++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _Particles(field, data):
-          io = data.hierarchy.io
-          if not data.NumberOfParticles > 0:
-              return na.array([], dtype=dtype)
-          try:
-              return io._read_data_set(data, p_field).astype(dtype)
-          except io._read_exception:
-              pass
-          # This is bad.  But it's the best idea I have right now.
-          return data._read_data(p_field.replace("_"," ")).astype(dtype)
-  
-
-**Convert Function Source**
-
-No source available.
-
-particle_position_y
-+++++++++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _Particles(field, data):
-          io = data.hierarchy.io
-          if not data.NumberOfParticles > 0:
-              return na.array([], dtype=dtype)
-          try:
-              return io._read_data_set(data, p_field).astype(dtype)
-          except io._read_exception:
-              pass
-          # This is bad.  But it's the best idea I have right now.
-          return data._read_data(p_field.replace("_"," ")).astype(dtype)
-  
-
-**Convert Function Source**
-
-No source available.
-
-particle_position_z
-+++++++++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _Particles(field, data):
-          io = data.hierarchy.io
-          if not data.NumberOfParticles > 0:
-              return na.array([], dtype=dtype)
-          try:
-              return io._read_data_set(data, p_field).astype(dtype)
-          except io._read_exception:
-              pass
-          # This is bad.  But it's the best idea I have right now.
-          return data._read_data(p_field.replace("_"," ")).astype(dtype)
-  
-
-**Convert Function Source**
-
-No source available.
-
-particle_type
-+++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _Particles(field, data):
-          io = data.hierarchy.io
-          if not data.NumberOfParticles > 0:
-              return na.array([], dtype=dtype)
-          try:
-              return io._read_data_set(data, p_field).astype(dtype)
-          except io._read_exception:
-              pass
-          # This is bad.  But it's the best idea I have right now.
-          return data._read_data(p_field.replace("_"," ")).astype(dtype)
-  
-
-**Convert Function Source**
-
-No source available.
-
-particle_velocity_x
-+++++++++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _Particles(field, data):
-          io = data.hierarchy.io
-          if not data.NumberOfParticles > 0:
-              return na.array([], dtype=dtype)
-          try:
-              return io._read_data_set(data, p_field).astype(dtype)
-          except io._read_exception:
-              pass
-          # This is bad.  But it's the best idea I have right now.
-          return data._read_data(p_field.replace("_"," ")).astype(dtype)
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-      def _convert_p_vel(data):
-          return data.convert("%s-velocity" % ax)
-  
-
-particle_velocity_y
-+++++++++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _Particles(field, data):
-          io = data.hierarchy.io
-          if not data.NumberOfParticles > 0:
-              return na.array([], dtype=dtype)
-          try:
-              return io._read_data_set(data, p_field).astype(dtype)
-          except io._read_exception:
-              pass
-          # This is bad.  But it's the best idea I have right now.
-          return data._read_data(p_field.replace("_"," ")).astype(dtype)
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-      def _convert_p_vel(data):
-          return data.convert("%s-velocity" % ax)
-  
-
-particle_velocity_z
-+++++++++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _Particles(field, data):
-          io = data.hierarchy.io
-          if not data.NumberOfParticles > 0:
-              return na.array([], dtype=dtype)
-          try:
-              return io._read_data_set(data, p_field).astype(dtype)
-          except io._read_exception:
-              pass
-          # This is bad.  But it's the best idea I have right now.
-          return data._read_data(p_field.replace("_"," ")).astype(dtype)
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-      def _convert_p_vel(data):
-          return data.convert("%s-velocity" % ax)
-  
-
 tempContours
 ++++++++++++
 
@@ -2303,40 +2231,13 @@
 
 No source available.
 
-Enzo Field List
----------------
-
-Baryon_Overdensity
-++++++++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-  def _Baryon_Overdensity(field, data):
-      return data['Density']
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-  def _Convert_Baryon_Overdensity(data):
-      if data.pf.parameters.has_key('omega_baryon_now'):
-          omega_baryon_now = data.pf.parameters['omega_baryon_now']
-      else:
-          omega_baryon_now = 0.0441
-      return 1 / (omega_baryon_now * rho_crit_now * 
-                  (data.pf['CosmologyHubbleConstantNow']**2) * 
-                  ((1+data.pf['CosmologyCurrentRedshift'])**3))
-  
+Enzo-Specific Field List
+------------------------
 
 Bmag
 ++++
 
-   * Units: :math:`\mathrm{Gau\ss}`
+   * Units: :math:`\mathrm{Gauss}`
    * Particle Type: False
 
 **Field Source**
@@ -2353,55 +2254,6 @@
 
 No source available.
 
-Bx
-++
-
-   * Units: :math:`\mathrm{Gau\ss}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-By
-++
-
-   * Units: :math:`\mathrm{Gau\ss}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-Bz
-++
-
-   * Units: :math:`\mathrm{Gau\ss}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-ComovingDensity
-+++++++++++++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-  def _ComovingDensity(field,data):
-      ef = (1.0 + data.pf.current_redshift)**3.0
-      return data["Density"]/ef
-  
-
-**Convert Function Source**
-
-No source available.
-
 Comoving_DII_Density
 ++++++++++++++++++++
 
@@ -2414,7 +2266,7 @@
   def _SpeciesComovingDensity(field, data):
       sp = field.name.split("_")[0] + "_Density"
       ef = (1.0 + data.pf.current_redshift)**3.0
-      return data[sp]/ef
+      return data[sp] / ef
   
 
 **Convert Function Source**
@@ -2433,7 +2285,7 @@
   def _SpeciesComovingDensity(field, data):
       sp = field.name.split("_")[0] + "_Density"
       ef = (1.0 + data.pf.current_redshift)**3.0
-      return data[sp]/ef
+      return data[sp] / ef
   
 
 **Convert Function Source**
@@ -2452,7 +2304,7 @@
   def _SpeciesComovingDensity(field, data):
       sp = field.name.split("_")[0] + "_Density"
       ef = (1.0 + data.pf.current_redshift)**3.0
-      return data[sp]/ef
+      return data[sp] / ef
   
 
 **Convert Function Source**
@@ -2471,7 +2323,7 @@
   def _SpeciesComovingDensity(field, data):
       sp = field.name.split("_")[0] + "_Density"
       ef = (1.0 + data.pf.current_redshift)**3.0
-      return data[sp]/ef
+      return data[sp] / ef
   
 
 **Convert Function Source**
@@ -2490,7 +2342,7 @@
   def _SpeciesComovingDensity(field, data):
       sp = field.name.split("_")[0] + "_Density"
       ef = (1.0 + data.pf.current_redshift)**3.0
-      return data[sp]/ef
+      return data[sp] / ef
   
 
 **Convert Function Source**
@@ -2509,7 +2361,7 @@
   def _SpeciesComovingDensity(field, data):
       sp = field.name.split("_")[0] + "_Density"
       ef = (1.0 + data.pf.current_redshift)**3.0
-      return data[sp]/ef
+      return data[sp] / ef
   
 
 **Convert Function Source**
@@ -2528,7 +2380,7 @@
   def _SpeciesComovingDensity(field, data):
       sp = field.name.split("_")[0] + "_Density"
       ef = (1.0 + data.pf.current_redshift)**3.0
-      return data[sp]/ef
+      return data[sp] / ef
   
 
 **Convert Function Source**
@@ -2547,7 +2399,7 @@
   def _SpeciesComovingDensity(field, data):
       sp = field.name.split("_")[0] + "_Density"
       ef = (1.0 + data.pf.current_redshift)**3.0
-      return data[sp]/ef
+      return data[sp] / ef
   
 
 **Convert Function Source**
@@ -2566,7 +2418,7 @@
   def _SpeciesComovingDensity(field, data):
       sp = field.name.split("_")[0] + "_Density"
       ef = (1.0 + data.pf.current_redshift)**3.0
-      return data[sp]/ef
+      return data[sp] / ef
   
 
 **Convert Function Source**
@@ -2585,7 +2437,7 @@
   def _SpeciesComovingDensity(field, data):
       sp = field.name.split("_")[0] + "_Density"
       ef = (1.0 + data.pf.current_redshift)**3.0
-      return data[sp]/ef
+      return data[sp] / ef
   
 
 **Convert Function Source**
@@ -2604,7 +2456,7 @@
   def _SpeciesComovingDensity(field, data):
       sp = field.name.split("_")[0] + "_Density"
       ef = (1.0 + data.pf.current_redshift)**3.0
-      return data[sp]/ef
+      return data[sp] / ef
   
 
 **Convert Function Source**
@@ -2623,7 +2475,7 @@
   def _SpeciesComovingDensity(field, data):
       sp = field.name.split("_")[0] + "_Density"
       ef = (1.0 + data.pf.current_redshift)**3.0
-      return data[sp]/ef
+      return data[sp] / ef
   
 
 **Convert Function Source**
@@ -2642,7 +2494,7 @@
   def _SpeciesComovingDensity(field, data):
       sp = field.name.split("_")[0] + "_Density"
       ef = (1.0 + data.pf.current_redshift)**3.0
-      return data[sp]/ef
+      return data[sp] / ef
   
 
 **Convert Function Source**
@@ -2661,39 +2513,10 @@
   def _SpeciesComovingDensity(field, data):
       sp = field.name.split("_")[0] + "_Density"
       ef = (1.0 + data.pf.current_redshift)**3.0
-      return data[sp]/ef
-  
-
-**Convert Function Source**
-
-No source available.
-
-Cooling_Time
-++++++++++++
-
-   * Units: :math:`\rm{s}`
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-  def _Cooling_Time(field, data):
-      return data["Cooling_Time"]
-  
-
-**Convert Function Source**
-
-No source available.
-
-DII_Density
-+++++++++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Projected Units: :math:`\rm{g}/\rm{cm}^2`
-   * Particle Type: False
-
-**Field Source**
+      return data[sp] / ef
+  
+
+**Convert Function Source**
 
 No source available.
 
@@ -2708,13 +2531,55 @@
 
   def _SpeciesFraction(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/data["Density"]
+      return data[sp] / data["Density"]
   
 
 **Convert Function Source**
 
 No source available.
 
+DII_Mass
+++++++++
+
+   * Units: :math:`\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _SpeciesMass(field, data):
+      sp = field.name.split("_")[0] + "_Density"
+      return data[sp] * data["CellVolume"]
+  
+
+**Convert Function Source**
+
+No source available.
+
+DII_MassMsun
+++++++++++++
+
+   * Units: :math:`M_{\odot}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _SpeciesMass(field, data):
+      sp = field.name.split("_")[0] + "_Density"
+      return data[sp] * data["CellVolume"]
+  
+
+**Convert Function Source**
+
+.. code-block:: python
+
+  def _convertCellMassMsun(data):
+      return 5.027854e-34 # g^-1
+  
+
 DII_NumberDensity
 +++++++++++++++++
 
@@ -2727,7 +2592,7 @@
   def _SpeciesNumberDensity(field, data):
       species = field.name.split("_")[0]
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/_speciesMass[species]
+      return data[sp] / _speciesMass[species]
   
 
 **Convert Function Source**
@@ -2738,17 +2603,6 @@
       return 1.0/mh
   
 
-DI_Density
-++++++++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Projected Units: :math:`\rm{g}/\rm{cm}^2`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
 DI_Fraction
 +++++++++++
 
@@ -2760,66 +2614,71 @@
 
   def _SpeciesFraction(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/data["Density"]
+      return data[sp] / data["Density"]
   
 
 **Convert Function Source**
 
 No source available.
 
-DI_NumberDensity
+DI_Mass
++++++++
+
+   * Units: :math:`\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _SpeciesMass(field, data):
+      sp = field.name.split("_")[0] + "_Density"
+      return data[sp] * data["CellVolume"]
+  
+
+**Convert Function Source**
+
+No source available.
+
+Dark_Matter_Mass
 ++++++++++++++++
 
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-  def _SpeciesNumberDensity(field, data):
-      species = field.name.split("_")[0]
-      sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/_speciesMass[species]
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-  def _ConvertNumberDensity(data):
-      return 1.0/mh
-  
-
-Dark_Matter_Density
-+++++++++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
+   * Units: :math:`\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _Dark_Matter_Mass(field, data):
+      return data['Dark_Matter_Density'] * data["CellVolume"]
+  
+
+**Convert Function Source**
 
 No source available.
 
-Density
-+++++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Projected Units: :math:`\rm{g}/\rm{cm}^2`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-Electron_Density
-++++++++++++++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Projected Units: :math:`\rm{g}/\rm{cm}^2`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
+Dark_Matter_MassMsun
+++++++++++++++++++++
+
+   * Units: :math:`M_{\odot}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _Dark_Matter_Mass(field, data):
+      return data['Dark_Matter_Density'] * data["CellVolume"]
+  
+
+**Convert Function Source**
+
+.. code-block:: python
+
+  def _convertCellMassMsun(data):
+      return 5.027854e-34 # g^-1
+  
 
 Electron_Fraction
 +++++++++++++++++
@@ -2832,38 +2691,34 @@
 
   def _SpeciesFraction(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/data["Density"]
+      return data[sp] / data["Density"]
   
 
 **Convert Function Source**
 
 No source available.
 
-Electron_NumberDensity
-++++++++++++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-  def _SpeciesNumberDensity(field, data):
-      species = field.name.split("_")[0]
+Electron_Mass
++++++++++++++
+
+   * Units: :math:`\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _SpeciesMass(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/_speciesMass[species]
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-  def _ConvertNumberDensity(data):
-      return 1.0/mh
-  
-
-GasEnergy
-+++++++++
+      return data[sp] * data["CellVolume"]
+  
+
+**Convert Function Source**
+
+No source available.
+
+Gas_Energy
+++++++++++
 
    * Units: :math:`\rm{ergs}/\rm{g}`
    * Particle Type: False
@@ -2872,8 +2727,8 @@
 
 .. code-block:: python
 
-  def _GasEnergy(field, data):
-      return data["Gas_Energy"] / _convertEnergy(data)
+  def _Gas_Energy(field, data):
+      return data["GasEnergy"] / _convertEnergy(data)
   
 
 **Convert Function Source**
@@ -2884,39 +2739,6 @@
       return data.convert("x-velocity")**2.0
   
 
-Gas_Energy
-++++++++++
-
-   * Units: :math:`\rm{ergs}/\rm{g}`
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-  def _Gas_Energy(field, data):
-      return data["GasEnergy"] / _convertEnergy(data)
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-  def _convertEnergy(data):
-      return data.convert("x-velocity")**2.0
-  
-
-H2II_Density
-++++++++++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Projected Units: :math:`\rm{g}/\rm{cm}^2`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
 H2II_Fraction
 +++++++++++++
 
@@ -2928,44 +2750,29 @@
 
   def _SpeciesFraction(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/data["Density"]
+      return data[sp] / data["Density"]
   
 
 **Convert Function Source**
 
 No source available.
 
-H2II_NumberDensity
-++++++++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-  def _SpeciesNumberDensity(field, data):
-      species = field.name.split("_")[0]
+H2II_Mass
++++++++++
+
+   * Units: :math:`\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _SpeciesMass(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/_speciesMass[species]
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-  def _ConvertNumberDensity(data):
-      return 1.0/mh
-  
-
-H2I_Density
-+++++++++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Projected Units: :math:`\rm{g}/\rm{cm}^2`
-   * Particle Type: False
-
-**Field Source**
+      return data[sp] * data["CellVolume"]
+  
+
+**Convert Function Source**
 
 No source available.
 
@@ -2980,44 +2787,29 @@
 
   def _SpeciesFraction(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/data["Density"]
+      return data[sp] / data["Density"]
   
 
 **Convert Function Source**
 
 No source available.
 
-H2I_NumberDensity
-+++++++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-  def _SpeciesNumberDensity(field, data):
-      species = field.name.split("_")[0]
+H2I_Mass
+++++++++
+
+   * Units: :math:`\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _SpeciesMass(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/_speciesMass[species]
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-  def _ConvertNumberDensity(data):
-      return 1.0/mh
-  
-
-HDI_Density
-+++++++++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Projected Units: :math:`\rm{g}/\rm{cm}^2`
-   * Particle Type: False
-
-**Field Source**
+      return data[sp] * data["CellVolume"]
+  
+
+**Convert Function Source**
 
 No source available.
 
@@ -3032,44 +2824,29 @@
 
   def _SpeciesFraction(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/data["Density"]
+      return data[sp] / data["Density"]
   
 
 **Convert Function Source**
 
 No source available.
 
-HDI_NumberDensity
-+++++++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-  def _SpeciesNumberDensity(field, data):
-      species = field.name.split("_")[0]
+HDI_Mass
+++++++++
+
+   * Units: :math:`\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _SpeciesMass(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/_speciesMass[species]
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-  def _ConvertNumberDensity(data):
-      return 1.0/mh
-  
-
-HII_Density
-+++++++++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Projected Units: :math:`\rm{g}/\rm{cm}^2`
-   * Particle Type: False
-
-**Field Source**
+      return data[sp] * data["CellVolume"]
+  
+
+**Convert Function Source**
 
 No source available.
 
@@ -3084,44 +2861,29 @@
 
   def _SpeciesFraction(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/data["Density"]
+      return data[sp] / data["Density"]
   
 
 **Convert Function Source**
 
 No source available.
 
-HII_NumberDensity
-+++++++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-  def _SpeciesNumberDensity(field, data):
-      species = field.name.split("_")[0]
+HII_Mass
+++++++++
+
+   * Units: :math:`\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _SpeciesMass(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/_speciesMass[species]
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-  def _ConvertNumberDensity(data):
-      return 1.0/mh
-  
-
-HI_Density
-++++++++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Projected Units: :math:`\rm{g}/\rm{cm}^2`
-   * Particle Type: False
-
-**Field Source**
+      return data[sp] * data["CellVolume"]
+  
+
+**Convert Function Source**
 
 No source available.
 
@@ -3136,44 +2898,29 @@
 
   def _SpeciesFraction(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/data["Density"]
+      return data[sp] / data["Density"]
   
 
 **Convert Function Source**
 
 No source available.
 
-HI_NumberDensity
-++++++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-  def _SpeciesNumberDensity(field, data):
-      species = field.name.split("_")[0]
+HI_Mass
++++++++
+
+   * Units: :math:`\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _SpeciesMass(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/_speciesMass[species]
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-  def _ConvertNumberDensity(data):
-      return 1.0/mh
-  
-
-HM_Density
-++++++++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Projected Units: :math:`\rm{g}/\rm{cm}^2`
-   * Particle Type: False
-
-**Field Source**
+      return data[sp] * data["CellVolume"]
+  
+
+**Convert Function Source**
 
 No source available.
 
@@ -3188,44 +2935,29 @@
 
   def _SpeciesFraction(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/data["Density"]
+      return data[sp] / data["Density"]
   
 
 **Convert Function Source**
 
 No source available.
 
-HM_NumberDensity
-++++++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-  def _SpeciesNumberDensity(field, data):
-      species = field.name.split("_")[0]
+HM_Mass
++++++++
+
+   * Units: :math:`\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _SpeciesMass(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/_speciesMass[species]
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-  def _ConvertNumberDensity(data):
-      return 1.0/mh
-  
-
-HeIII_Density
-+++++++++++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Projected Units: :math:`\rm{g}/\rm{cm}^2`
-   * Particle Type: False
-
-**Field Source**
+      return data[sp] * data["CellVolume"]
+  
+
+**Convert Function Source**
 
 No source available.
 
@@ -3240,44 +2972,29 @@
 
   def _SpeciesFraction(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/data["Density"]
+      return data[sp] / data["Density"]
   
 
 **Convert Function Source**
 
 No source available.
 
-HeIII_NumberDensity
-+++++++++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-  def _SpeciesNumberDensity(field, data):
-      species = field.name.split("_")[0]
+HeIII_Mass
+++++++++++
+
+   * Units: :math:`\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _SpeciesMass(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/_speciesMass[species]
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-  def _ConvertNumberDensity(data):
-      return 1.0/mh
-  
-
-HeII_Density
-++++++++++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Projected Units: :math:`\rm{g}/\rm{cm}^2`
-   * Particle Type: False
-
-**Field Source**
+      return data[sp] * data["CellVolume"]
+  
+
+**Convert Function Source**
 
 No source available.
 
@@ -3292,44 +3009,29 @@
 
   def _SpeciesFraction(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/data["Density"]
+      return data[sp] / data["Density"]
   
 
 **Convert Function Source**
 
 No source available.
 
-HeII_NumberDensity
-++++++++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-  def _SpeciesNumberDensity(field, data):
-      species = field.name.split("_")[0]
+HeII_Mass
++++++++++
+
+   * Units: :math:`\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _SpeciesMass(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/_speciesMass[species]
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-  def _ConvertNumberDensity(data):
-      return 1.0/mh
-  
-
-HeI_Density
-+++++++++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Projected Units: :math:`\rm{g}/\rm{cm}^2`
-   * Particle Type: False
-
-**Field Source**
+      return data[sp] * data["CellVolume"]
+  
+
+**Convert Function Source**
 
 No source available.
 
@@ -3344,35 +3046,31 @@
 
   def _SpeciesFraction(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/data["Density"]
+      return data[sp] / data["Density"]
   
 
 **Convert Function Source**
 
 No source available.
 
-HeI_NumberDensity
-+++++++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-  def _SpeciesNumberDensity(field, data):
-      species = field.name.split("_")[0]
+HeI_Mass
+++++++++
+
+   * Units: :math:`\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _SpeciesMass(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/_speciesMass[species]
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-  def _ConvertNumberDensity(data):
-      return 1.0/mh
-  
+      return data[sp] * data["CellVolume"]
+  
+
+**Convert Function Source**
+
+No source available.
 
 IsStarParticle
 ++++++++++++++
@@ -3412,17 +3110,6 @@
 
 No source available.
 
-Metal_Density
-+++++++++++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Projected Units: :math:`\rm{g}/\rm{cm}^2`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
 Metal_Fraction
 ++++++++++++++
 
@@ -3434,7 +3121,26 @@
 
   def _SpeciesFraction(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/data["Density"]
+      return data[sp] / data["Density"]
+  
+
+**Convert Function Source**
+
+No source available.
+
+Metal_Mass
+++++++++++
+
+   * Units: :math:`\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _SpeciesMass(field, data):
+      sp = field.name.split("_")[0] + "_Density"
+      return data[sp] * data["CellVolume"]
   
 
 **Convert Function Source**
@@ -3533,34 +3239,75 @@
       return 1.0/mh
   
 
-Overdensity
+ParticleAge
 +++++++++++
 
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-  def Overdensity(field,data):
-      return (data['Density'] + data['Dark_Matter_Density']) / \
-          (rho_crit_now * (data.pf.hubble_constant**2) * ((1+data.pf.current_redshift)**3))
-  
-
-**Convert Function Source**
-
-No source available.
-
-PreShock_Density
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+  def _ParticleAge(field, data):
+      current_time = data.pf.current_time
+      return (current_time - data["creation_time"])
+  
+
+**Convert Function Source**
+
+.. code-block:: python
+
+  def _convertParticleAge(data):
+      return data.convert("years")
+  
+
+ParticleMass
+++++++++++++
+
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+  def _ParticleMass(field, data):
+      particles = data["particle_mass"].astype('float64') * \
+                  just_one(data["CellVolumeCode"].ravel())
+      # Note that we mandate grid-type here, so this is okay
+      return particles
+  
+
+**Convert Function Source**
+
+.. code-block:: python
+
+  def _convertParticleMass(data):
+      return data.convert("Density")*(data.convert("cm")**3.0)
+  
+
+ParticleMassMsun
 ++++++++++++++++
 
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Projected Units: :math:`\rm{g}/\rm{cm}^2`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+  def _ParticleMass(field, data):
+      particles = data["particle_mass"].astype('float64') * \
+                  just_one(data["CellVolumeCode"].ravel())
+      # Note that we mandate grid-type here, so this is okay
+      return particles
+  
+
+**Convert Function Source**
+
+.. code-block:: python
+
+  def _convertParticleMassMsun(data):
+      return data.convert("Density")*((data.convert("cm")**3.0)/1.989e33)
+  
 
 PreShock_Fraction
 +++++++++++++++++
@@ -3573,7 +3320,26 @@
 
   def _SpeciesFraction(field, data):
       sp = field.name.split("_")[0] + "_Density"
-      return data[sp]/data["Density"]
+      return data[sp] / data["Density"]
+  
+
+**Convert Function Source**
+
+No source available.
+
+PreShock_Mass
++++++++++++++
+
+   * Units: :math:`\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _SpeciesMass(field, data):
+      sp = field.name.split("_")[0] + "_Density"
+      return data[sp] * data["CellVolume"]
   
 
 **Convert Function Source**
@@ -3669,16 +3435,6 @@
       return 49.0196 # 1 / 0.0204
   
 
-Temperature
-+++++++++++
-
-   * Units: :math:`\rm{K}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
 ThermalEnergy
 +++++++++++++
 
@@ -3691,12 +3447,12 @@
 
   def _ThermalEnergy(field, data):
       if data.pf["HydroMethod"] == 2:
-          return data["Total_Energy"]
+          return data["TotalEnergy"]
       else:
           if data.pf["DualEnergyFormalism"]:
               return data["GasEnergy"]
           else:
-              return data["Total_Energy"] - 0.5*(
+              return data["TotalEnergy"] - 0.5*(
                      data["x-velocity"]**2.0
                    + data["y-velocity"]**2.0
                    + data["z-velocity"]**2.0 )
@@ -3706,8 +3462,8 @@
 
 No source available.
 
-TotalEnergy
-+++++++++++
+Total_Energy
+++++++++++++
 
    * Units: :math:`\rm{ergs}/\rm{g}`
    * Particle Type: False
@@ -3716,8 +3472,8 @@
 
 .. code-block:: python
 
-  def _TotalEnergy(field, data):
-      return data["Total_Energy"] / _convertEnergy(data)
+  def _Total_Energy(field, data):
+      return data["TotalEnergy"] / _convertEnergy(data)
   
 
 **Convert Function Source**
@@ -3728,27 +3484,146 @@
       return data.convert("x-velocity")**2.0
   
 
-Total_Energy
-++++++++++++
-
-   * Units: :math:`\rm{ergs}/\rm{g}`
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-  def _Total_Energy(field, data):
-      return data["TotalEnergy"] / _convertEnergy(data)
-  
-
-**Convert Function Source**
-
-.. code-block:: python
-
-  def _convertEnergy(data):
-      return data.convert("x-velocity")**2.0
-  
+cic_particle_velocity_x
++++++++++++++++++++++++
+
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _cic_particle_field(field, data):
+      """
+      Create a grid field for particle quantities weighted by particle mass, 
+      using cloud-in-cell deposit.
+      """
+      particle_field = field.name[4:]
+      top = na.zeros(data.ActiveDimensions, dtype='float32')
+      if data.NumberOfParticles == 0: return top
+      particle_field_data = data[particle_field] * data['particle_mass']
+      amr_utils.CICDeposit_3(data["particle_position_x"].astype(na.float64),
+                             data["particle_position_y"].astype(na.float64),
+                             data["particle_position_z"].astype(na.float64),
+                             particle_field_data.astype(na.float32),
+                             na.int64(data.NumberOfParticles),
+                             top, na.array(data.LeftEdge).astype(na.float64),
+                             na.array(data.ActiveDimensions).astype(na.int32), 
+                             na.float64(data['dx']))
+      del particle_field_data
+  
+      bottom = na.zeros(data.ActiveDimensions, dtype='float32')
+      amr_utils.CICDeposit_3(data["particle_position_x"].astype(na.float64),
+                             data["particle_position_y"].astype(na.float64),
+                             data["particle_position_z"].astype(na.float64),
+                             data["particle_mass"].astype(na.float32),
+                             na.int64(data.NumberOfParticles),
+                             bottom, na.array(data.LeftEdge).astype(na.float64),
+                             na.array(data.ActiveDimensions).astype(na.int32), 
+                             na.float64(data['dx']))
+      top[bottom == 0] = 0.0
+      bnz = bottom.nonzero()
+      top[bnz] /= bottom[bnz]
+      return top
+  
+
+**Convert Function Source**
+
+No source available.
+
+cic_particle_velocity_y
++++++++++++++++++++++++
+
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _cic_particle_field(field, data):
+      """
+      Create a grid field for particle quantities weighted by particle mass, 
+      using cloud-in-cell deposit.
+      """
+      particle_field = field.name[4:]
+      top = na.zeros(data.ActiveDimensions, dtype='float32')
+      if data.NumberOfParticles == 0: return top
+      particle_field_data = data[particle_field] * data['particle_mass']
+      amr_utils.CICDeposit_3(data["particle_position_x"].astype(na.float64),
+                             data["particle_position_y"].astype(na.float64),
+                             data["particle_position_z"].astype(na.float64),
+                             particle_field_data.astype(na.float32),
+                             na.int64(data.NumberOfParticles),
+                             top, na.array(data.LeftEdge).astype(na.float64),
+                             na.array(data.ActiveDimensions).astype(na.int32), 
+                             na.float64(data['dx']))
+      del particle_field_data
+  
+      bottom = na.zeros(data.ActiveDimensions, dtype='float32')
+      amr_utils.CICDeposit_3(data["particle_position_x"].astype(na.float64),
+                             data["particle_position_y"].astype(na.float64),
+                             data["particle_position_z"].astype(na.float64),
+                             data["particle_mass"].astype(na.float32),
+                             na.int64(data.NumberOfParticles),
+                             bottom, na.array(data.LeftEdge).astype(na.float64),
+                             na.array(data.ActiveDimensions).astype(na.int32), 
+                             na.float64(data['dx']))
+      top[bottom == 0] = 0.0
+      bnz = bottom.nonzero()
+      top[bnz] /= bottom[bnz]
+      return top
+  
+
+**Convert Function Source**
+
+No source available.
+
+cic_particle_velocity_z
++++++++++++++++++++++++
+
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _cic_particle_field(field, data):
+      """
+      Create a grid field for particle quantities weighted by particle mass, 
+      using cloud-in-cell deposit.
+      """
+      particle_field = field.name[4:]
+      top = na.zeros(data.ActiveDimensions, dtype='float32')
+      if data.NumberOfParticles == 0: return top
+      particle_field_data = data[particle_field] * data['particle_mass']
+      amr_utils.CICDeposit_3(data["particle_position_x"].astype(na.float64),
+                             data["particle_position_y"].astype(na.float64),
+                             data["particle_position_z"].astype(na.float64),
+                             particle_field_data.astype(na.float32),
+                             na.int64(data.NumberOfParticles),
+                             top, na.array(data.LeftEdge).astype(na.float64),
+                             na.array(data.ActiveDimensions).astype(na.int32), 
+                             na.float64(data['dx']))
+      del particle_field_data
+  
+      bottom = na.zeros(data.ActiveDimensions, dtype='float32')
+      amr_utils.CICDeposit_3(data["particle_position_x"].astype(na.float64),
+                             data["particle_position_y"].astype(na.float64),
+                             data["particle_position_z"].astype(na.float64),
+                             data["particle_mass"].astype(na.float32),
+                             na.int64(data.NumberOfParticles),
+                             bottom, na.array(data.LeftEdge).astype(na.float64),
+                             na.array(data.ActiveDimensions).astype(na.int32), 
+                             na.float64(data['dx']))
+      top[bottom == 0] = 0.0
+      bnz = bottom.nonzero()
+      top[bnz] /= bottom[bnz]
+      return top
+  
+
+**Convert Function Source**
+
+No source available.
 
 dm_density
 ++++++++++
@@ -3762,7 +3637,11 @@
   def _dmpdensity(field, data):
       blank = na.zeros(data.ActiveDimensions, dtype='float32')
       if data.NumberOfParticles == 0: return blank
-      filter = data['creation_time'] <= 0.0
+      if 'creation_time' in data.pf.field_info:
+          filter = data['creation_time'] <= 0.0
+          if not filter.any(): return blank
+      else:
+          filter = na.ones(data.NumberOfParticles, dtype='bool')
       if not filter.any(): return blank
       amr_utils.CICDeposit_3(data["particle_position_x"][filter].astype(na.float64),
                              data["particle_position_y"][filter].astype(na.float64),
@@ -3783,6 +3662,31 @@
       return data.convert("Density")
   
 
+particle_mass
++++++++++++++
+
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+      def _Particles(field, data):
+          io = data.hierarchy.io
+          if not data.NumberOfParticles > 0:
+              return na.array([], dtype=dtype)
+          try:
+              return io._read_data_set(data, p_field).astype(dtype)
+          except io._read_exception:
+              pass
+          # This is bad.  But it's the best idea I have right now.
+          return data._read_data(p_field.replace("_"," ")).astype(dtype)
+  
+
+**Convert Function Source**
+
+No source available.
+
 star_creation_time
 ++++++++++++++++++
 
@@ -3960,68 +3864,8 @@
 
 No source available.
 
-x-momentum
-++++++++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-x-velocity
-++++++++++
-
-   * Units: :math:`\rm{cm}/\rm{s}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-y-momentum
-++++++++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-y-velocity
-++++++++++
-
-   * Units: :math:`\rm{cm}/\rm{s}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-z-momentum
-++++++++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-z-velocity
-++++++++++
-
-   * Units: :math:`\rm{cm}/\rm{s}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-Orion Field List
-----------------
+Orion-Specific Field List
+-------------------------
 
 Density
 +++++++
@@ -4087,9 +3931,9 @@
           leave that commented out for now.
       """
       #if data.pf["DualEnergyFormalism"]:
-      #    return data["Gas_Energy"]
+      #    return data["GasEnergy"]
       #else:
-      return data["Total_Energy"] - 0.5 * data["density"] * (
+      return data["TotalEnergy"] - 0.5 * data["density"] * (
           data["x-velocity"]**2.0
           + data["y-velocity"]**2.0
           + data["z-velocity"]**2.0 )
@@ -4099,8 +3943,8 @@
 
 No source available.
 
-Total_Energy
-++++++++++++
+TotalEnergy
++++++++++++
 
    * Particle Type: False
 
@@ -4129,6 +3973,342 @@
 
 No source available.
 
+particle_angmomen_x
++++++++++++++++++++
+
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+      def _Particles(field, data):
+          io = data.hierarchy.io
+          if not data.NumberOfParticles > 0:
+              return na.array([], dtype=dtype)
+          else:
+              return io._read_particles(data, p_field).astype(dtype)
+  
+
+**Convert Function Source**
+
+No source available.
+
+particle_angmomen_y
++++++++++++++++++++
+
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+      def _Particles(field, data):
+          io = data.hierarchy.io
+          if not data.NumberOfParticles > 0:
+              return na.array([], dtype=dtype)
+          else:
+              return io._read_particles(data, p_field).astype(dtype)
+  
+
+**Convert Function Source**
+
+No source available.
+
+particle_angmomen_z
++++++++++++++++++++
+
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+      def _Particles(field, data):
+          io = data.hierarchy.io
+          if not data.NumberOfParticles > 0:
+              return na.array([], dtype=dtype)
+          else:
+              return io._read_particles(data, p_field).astype(dtype)
+  
+
+**Convert Function Source**
+
+No source available.
+
+particle_burnstate
+++++++++++++++++++
+
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+      def _Particles(field, data):
+          io = data.hierarchy.io
+          if not data.NumberOfParticles > 0:
+              return na.array([], dtype=dtype)
+          else:
+              return io._read_particles(data, p_field).astype(dtype)
+  
+
+**Convert Function Source**
+
+No source available.
+
+particle_id
++++++++++++
+
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+      def _Particles(field, data):
+          io = data.hierarchy.io
+          if not data.NumberOfParticles > 0:
+              return na.array([], dtype=dtype)
+          else:
+              return io._read_particles(data, p_field).astype(dtype)
+  
+
+**Convert Function Source**
+
+No source available.
+
+particle_mass
++++++++++++++
+
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+      def _Particles(field, data):
+          io = data.hierarchy.io
+          if not data.NumberOfParticles > 0:
+              return na.array([], dtype=dtype)
+          else:
+              return io._read_particles(data, p_field).astype(dtype)
+  
+
+**Convert Function Source**
+
+No source available.
+
+particle_mdeut
+++++++++++++++
+
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+      def _Particles(field, data):
+          io = data.hierarchy.io
+          if not data.NumberOfParticles > 0:
+              return na.array([], dtype=dtype)
+          else:
+              return io._read_particles(data, p_field).astype(dtype)
+  
+
+**Convert Function Source**
+
+No source available.
+
+particle_mdot
++++++++++++++
+
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+      def _Particles(field, data):
+          io = data.hierarchy.io
+          if not data.NumberOfParticles > 0:
+              return na.array([], dtype=dtype)
+          else:
+              return io._read_particles(data, p_field).astype(dtype)
+  
+
+**Convert Function Source**
+
+No source available.
+
+particle_mlast
+++++++++++++++
+
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+      def _Particles(field, data):
+          io = data.hierarchy.io
+          if not data.NumberOfParticles > 0:
+              return na.array([], dtype=dtype)
+          else:
+              return io._read_particles(data, p_field).astype(dtype)
+  
+
+**Convert Function Source**
+
+No source available.
+
+particle_momentum_x
++++++++++++++++++++
+
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+      def _Particles(field, data):
+          io = data.hierarchy.io
+          if not data.NumberOfParticles > 0:
+              return na.array([], dtype=dtype)
+          else:
+              return io._read_particles(data, p_field).astype(dtype)
+  
+
+**Convert Function Source**
+
+No source available.
+
+particle_momentum_y
++++++++++++++++++++
+
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+      def _Particles(field, data):
+          io = data.hierarchy.io
+          if not data.NumberOfParticles > 0:
+              return na.array([], dtype=dtype)
+          else:
+              return io._read_particles(data, p_field).astype(dtype)
+  
+
+**Convert Function Source**
+
+No source available.
+
+particle_momentum_z
++++++++++++++++++++
+
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+      def _Particles(field, data):
+          io = data.hierarchy.io
+          if not data.NumberOfParticles > 0:
+              return na.array([], dtype=dtype)
+          else:
+              return io._read_particles(data, p_field).astype(dtype)
+  
+
+**Convert Function Source**
+
+No source available.
+
+particle_n
+++++++++++
+
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+      def _Particles(field, data):
+          io = data.hierarchy.io
+          if not data.NumberOfParticles > 0:
+              return na.array([], dtype=dtype)
+          else:
+              return io._read_particles(data, p_field).astype(dtype)
+  
+
+**Convert Function Source**
+
+No source available.
+
+particle_position_x
++++++++++++++++++++
+
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+      def _Particles(field, data):
+          io = data.hierarchy.io
+          if not data.NumberOfParticles > 0:
+              return na.array([], dtype=dtype)
+          else:
+              return io._read_particles(data, p_field).astype(dtype)
+  
+
+**Convert Function Source**
+
+No source available.
+
+particle_position_y
++++++++++++++++++++
+
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+      def _Particles(field, data):
+          io = data.hierarchy.io
+          if not data.NumberOfParticles > 0:
+              return na.array([], dtype=dtype)
+          else:
+              return io._read_particles(data, p_field).astype(dtype)
+  
+
+**Convert Function Source**
+
+No source available.
+
+particle_position_z
++++++++++++++++++++
+
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+      def _Particles(field, data):
+          io = data.hierarchy.io
+          if not data.NumberOfParticles > 0:
+              return na.array([], dtype=dtype)
+          else:
+              return io._read_particles(data, p_field).astype(dtype)
+  
+
+**Convert Function Source**
+
+No source available.
+
 temperature
 +++++++++++
 
@@ -4288,8 +4468,8 @@
 
 No source available.
 
-FLASH Field List
-----------------
+FLASH-Specific Field List
+-------------------------
 
 DII_Density
 +++++++++++
@@ -4308,23 +4488,6 @@
 
 No source available.
 
-DII_Fraction
-++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
-  
-
-**Convert Function Source**
-
-No source available.
-
 DI_Density
 ++++++++++
 
@@ -4342,34 +4505,18 @@
 
 No source available.
 
-DI_Fraction
-+++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
-  
-
-**Convert Function Source**
-
-No source available.
-
 Density
 +++++++
 
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
+   * Units: :math:`\rm{g}/\rm{cm}^3`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+      def _TranslationFunc(field, data):
+          return data[field_name]
   
 
 **Convert Function Source**
@@ -4393,34 +4540,52 @@
 
 No source available.
 
-Electron_Fraction
-+++++++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
+Flame_Density
++++++++++++++
+
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+      def _dens(field, data):
+          return data[fname] * data['Density']
   
 
 **Convert Function Source**
 
 No source available.
 
-Gas_Energy
-++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
+Flame_Fraction
+++++++++++++++
+
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+      def _TranslationFunc(field, data):
+          return data[field_name]
+  
+
+**Convert Function Source**
+
+No source available.
+
+GasEnergy
++++++++++
+
+   * Units: :math:`\rm{erg}/\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+      def _TranslationFunc(field, data):
+          return data[field_name]
   
 
 **Convert Function Source**
@@ -4444,23 +4609,6 @@
 
 No source available.
 
-H2II_Fraction
-+++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
-  
-
-**Convert Function Source**
-
-No source available.
-
 H2I_Density
 +++++++++++
 
@@ -4478,23 +4626,6 @@
 
 No source available.
 
-H2I_Fraction
-++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
-  
-
-**Convert Function Source**
-
-No source available.
-
 HD_Density
 ++++++++++
 
@@ -4512,23 +4643,6 @@
 
 No source available.
 
-HD_Fraction
-+++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
-  
-
-**Convert Function Source**
-
-No source available.
-
 HII_Density
 +++++++++++
 
@@ -4546,23 +4660,6 @@
 
 No source available.
 
-HII_Fraction
-++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
-  
-
-**Convert Function Source**
-
-No source available.
-
 HI_Density
 ++++++++++
 
@@ -4580,23 +4677,6 @@
 
 No source available.
 
-HI_Fraction
-+++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
-  
-
-**Convert Function Source**
-
-No source available.
-
 HM_Density
 ++++++++++
 
@@ -4614,23 +4694,6 @@
 
 No source available.
 
-HM_Fraction
-+++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
-  
-
-**Convert Function Source**
-
-No source available.
-
 HeIII_Density
 +++++++++++++
 
@@ -4648,23 +4711,6 @@
 
 No source available.
 
-HeIII_Fraction
-++++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
-  
-
-**Convert Function Source**
-
-No source available.
-
 HeII_Density
 ++++++++++++
 
@@ -4682,23 +4728,6 @@
 
 No source available.
 
-HeII_Fraction
-+++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
-  
-
-**Convert Function Source**
-
-No source available.
-
 HeI_Density
 +++++++++++
 
@@ -4716,34 +4745,18 @@
 
 No source available.
 
-HeI_Fraction
-++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
-  
-
-**Convert Function Source**
-
-No source available.
-
 ParticleMass
 ++++++++++++
 
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
+   * Units: :math:`\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+      def _TranslationFunc(field, data):
+          return data[field_name]
   
 
 **Convert Function Source**
@@ -4774,284 +4787,50 @@
 Temperature
 +++++++++++
 
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
+   * Units: :math:`\rm{K}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+      def _TranslationFunc(field, data):
+          return data[field_name]
   
 
 **Convert Function Source**
 
 No source available.
 
-Total_Energy
-++++++++++++
-
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
-  
-
-**Convert Function Source**
-
-No source available.
-
-dens
-++++
-
-   * Units: :math:`\rm{g}/\rm{cm}^3`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-deut
-++++
-
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-divb
-++++
-
-   * Units: :math:`\rm{G}\/\rm{cm}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-dplu
-++++
-
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-eint
-++++
-
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-elec
-++++
-
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-ener
-++++
-
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-gamc
-++++
-
-   * Units: :math:`\rm{ratio\/of\/specific\/heats}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-game
-++++
-
-   * Units: :math:`\rm{ratio\/of\/specific\/heats}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-gpol
-++++
-
-   * Units: :math:`\rm{ergs\//\/g}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-gpot
-++++
-
-   * Units: :math:`\rm{ergs\//\/g}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-grac
-++++
-
-   * Units: :math:`\rm{cm\/s^{-2}}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-h   
-++++
-
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-hd  
-++++
-
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-hel 
-++++
-
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-hep 
-++++
-
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-hepp
-++++
-
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-hmin
-++++
-
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-hp  
-++++
-
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-htwo
-++++
-
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-htwp
-++++
-
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-magp
-++++
-
-   * Units: :math:`\rm{erg}\//\/\rm{cm}^{3}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-magx
-++++
-
-   * Units: :math:`\rm{G}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-magy
-++++
-
-   * Units: :math:`\rm{G}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-magz
-++++
-
-   * Units: :math:`\rm{G}`
-   * Particle Type: False
-
-**Field Source**
+TotalEnergy
++++++++++++
+
+   * Units: :math:`\rm{erg}/\rm{g}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+      def _TranslationFunc(field, data):
+          return data[field_name]
+  
+
+**Convert Function Source**
 
 No source available.
 
 particle_index
 ++++++++++++++
 
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+      def _TranslationFunc(field, data):
+          return data[field_name]
   
 
 **Convert Function Source**
@@ -5061,14 +4840,15 @@
 particle_position_x
 +++++++++++++++++++
 
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
+   * Units: :math:`\rm{cm}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+      def _TranslationFunc(field, data):
+          return data[field_name]
   
 
 **Convert Function Source**
@@ -5078,14 +4858,15 @@
 particle_position_y
 +++++++++++++++++++
 
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
+   * Units: :math:`\rm{cm}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+      def _TranslationFunc(field, data):
+          return data[field_name]
   
 
 **Convert Function Source**
@@ -5095,67 +4876,33 @@
 particle_position_z
 +++++++++++++++++++
 
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
-  
-
-**Convert Function Source**
-
-No source available.
-
-particle_posx
-+++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
-
-No source available.
-
-particle_posy
-+++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
-
-No source available.
-
-particle_posz
-+++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
-
-No source available.
-
-particle_tag
-++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
+   * Units: :math:`\rm{cm}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+      def _TranslationFunc(field, data):
+          return data[field_name]
+  
+
+**Convert Function Source**
 
 No source available.
 
 particle_velocity_x
 +++++++++++++++++++
 
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
+   * Units: :math:`\rm{cm}/\rm{s}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+      def _TranslationFunc(field, data):
+          return data[field_name]
   
 
 **Convert Function Source**
@@ -5165,14 +4912,15 @@
 particle_velocity_y
 +++++++++++++++++++
 
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
+   * Units: :math:`\rm{cm}/\rm{s}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+      def _TranslationFunc(field, data):
+          return data[field_name]
   
 
 **Convert Function Source**
@@ -5182,212 +4930,249 @@
 particle_velocity_z
 +++++++++++++++++++
 
-   * Particle Type: True
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
-  
-
-**Convert Function Source**
-
-No source available.
-
-particle_velx
-+++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
-
-No source available.
-
-particle_vely
-+++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
-
-No source available.
-
-particle_velz
-+++++++++++++
-
-   * Particle Type: True
-
-**Field Source**
-
-No source available.
-
-particle_xvel
-+++++++++++++
-
    * Units: :math:`\rm{cm}/\rm{s}`
    * Particle Type: False
 
 **Field Source**
 
-No source available.
-
-particle_yvel
-+++++++++++++
-
-   * Units: :math:`\rm{cm}/\rm{s}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-particle_zvel
-+++++++++++++
-
-   * Units: :math:`\rm{cm}/\rm{s}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-pden
-++++
-
-   * Units: :math:`\rm{g}\//\/\rm{cm}^{3}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-pres
-++++
-
-   * Units: :math:`\rm{erg}\//\/\rm{cm}^{3}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-temp
-++++
-
-   * Units: :math:`\rm{K}`
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-velx
-++++
-
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-vely
-++++
-
-   * Particle Type: False
-
-**Field Source**
-
-No source available.
-
-velz
-++++
-
-   * Particle Type: False
-
-**Field Source**
+.. code-block:: python
+
+      def _TranslationFunc(field, data):
+          return data[field_name]
+  
+
+**Convert Function Source**
 
 No source available.
 
 x-velocity
 ++++++++++
 
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
-  
-
-**Convert Function Source**
-
-No source available.
-
-xvel
-++++
-
    * Units: :math:`\rm{cm}/\rm{s}`
    * Particle Type: False
 
 **Field Source**
 
+.. code-block:: python
+
+      def _TranslationFunc(field, data):
+          return data[field_name]
+  
+
+**Convert Function Source**
+
 No source available.
 
 y-velocity
 ++++++++++
 
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
-  
-
-**Convert Function Source**
-
-No source available.
-
-yvel
-++++
-
    * Units: :math:`\rm{cm}/\rm{s}`
    * Particle Type: False
 
 **Field Source**
 
+.. code-block:: python
+
+      def _TranslationFunc(field, data):
+          return data[field_name]
+  
+
+**Convert Function Source**
+
 No source available.
 
 z-velocity
 ++++++++++
 
-   * Particle Type: False
-
-**Field Source**
-
-.. code-block:: python
-
-      def _alias(field, data):
-          return data[alias]
+   * Units: :math:`\rm{cm}/\rm{s}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+      def _TranslationFunc(field, data):
+          return data[field_name]
   
 
 **Convert Function Source**
 
 No source available.
 
-zvel
-++++
-
-   * Units: :math:`\rm{cm}/\rm{s}`
-   * Particle Type: False
-
-**Field Source**
+Nyx-Specific Field List
+--------------------------
+
+Density
++++++++
+
+   * Units: :math:`\rm{g}} / \rm{cm}^3`
+   * Projected Units: :math:`\rm{g}} / \rm{cm}^2`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+      def _TranslationFunc(field, data):
+          return data[field_name]
+  
+
+**Convert Function Source**
 
 No source available.
 
+ParticleMassMsun
+++++++++++++++++
+
+   * Units: :math:`\rm{M_{\odot}}`
+   * Particle Type: True
+
+**Field Source**
+
+.. code-block:: python
+
+  def _particle_mass_m_sun(field, data):
+      return data["particle_mass"]
+  
+
+**Convert Function Source**
+
+.. code-block:: python
+
+  def _convertParticleMassMsun(data):
+      return (1/1.989e33)
+  
+
+Pressure
+++++++++
+
+   * Units: :math:`\rm{M_{\odot}} (\rm{km} / \rm{s})^2 / \rm{Mpc}^3`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _pressure(field, data):
+      """
+      Computed using
+  
+      $$ pressure = (\gamma - 1.0) * e$$
+  
+      where e is thermal energy density. Note that this will need to be modified
+      when radiation is accounted for.
+  
+      """
+      return (data.pf["Gamma"] - 1.0) * data["ThermalEnergy"]
+  
+
+**Convert Function Source**
+
+No source available.
+
+Temperature
++++++++++++
+
+   * Units: :math:`\rm{Kelvin}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _temperature(field, data):
+      return ((data.pf["Gamma"] - 1.0) * data.pf["mu"] * mh *
+              data["ThermalEnergy"] / (kboltz * data["Density"]))
+  
+
+**Convert Function Source**
+
+No source available.
+
+ThermalEnergy
++++++++++++++
+
+   * Units: :math:`\rm{M_{\odot}} (\rm{km} / \rm{s})^2`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _thermal_energy(field, data):
+      """
+      Generate thermal (gas energy). Dual Energy Formalism was implemented by
+      Stella, but this isn't how it's called, so I'll leave that commented out for
+      now.
+  
+      """
+      #if data.pf["DualEnergyFormalism"]:
+      #    return data["Gas_Energy"]
+      #else:
+      return data["Total_Energy"] - 0.5 * data["density"] * (
+                                            data["x-velocity"]**2.0
+                                          + data["y-velocity"]**2.0
+                                          + data["z-velocity"]**2.0 )
+  
+
+**Convert Function Source**
+
+No source available.
+
+x-velocity
+++++++++++
+
+   * Units: :math:`\rm{km} / \rm{s}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _x_velocity(field, data):
+      """ Generate x-velocity from x-momentum and density. """
+      return data["x-momentum"] / data["density"]
+  
+
+**Convert Function Source**
+
+No source available.
+
+y-velocity
+++++++++++
+
+   * Units: :math:`\rm{km} / \rm{s}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _y_velocity(field, data):
+      """ Generate y-velocity from y-momentum and density. """
+      return data["y-momentum"] / data["density"]
+  
+
+**Convert Function Source**
+
+No source available.
+
+z-velocity
+++++++++++
+
+   * Units: :math:`\rm{km} / \rm{s}`
+   * Particle Type: False
+
+**Field Source**
+
+.. code-block:: python
+
+  def _z_velocity(field, data):
+      """ Generate z-velocity from z-momentum and density. """
+      return data["z-momentum"] / data["density"]
+  
+
+**Convert Function Source**
+
+No source available.
+

Repository URL: https://bitbucket.org/yt_analysis/yt-doc/

--

This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.



More information about the yt-svn mailing list