[yt-svn] commit/yt: ngoldbaum: Merged in brittonsmith/yt (pull request #2136)
commits-noreply at bitbucket.org
commits-noreply at bitbucket.org
Thu May 19 10:43:47 PDT 2016
1 new commit in yt:
https://bitbucket.org/yt_analysis/yt/commits/b3c23ff06040/
Changeset: b3c23ff06040
Branch: yt
User: ngoldbaum
Date: 2016-05-19 17:43:36+00:00
Summary: Merged in brittonsmith/yt (pull request #2136)
Adding Gizmo frontend
Affected #: 11 files
diff -r de4aaa4344b2ffd78d9e4411074b9b398f5e6ad4 -r b3c23ff06040ef967b7c9ac041d5ad3dc4edb79a doc/source/examining/loading_data.rst
--- a/doc/source/examining/loading_data.rst
+++ b/doc/source/examining/loading_data.rst
@@ -1319,6 +1319,31 @@
``bbox``
The bounding box for the particle positions.
+.. _loading-gizmo-data:
+
+Gizmo Data
+----------
+
+Gizmo datasets, including FIRE outputs, can be loaded into yt in the usual
+manner. Like other SPH data formats, yt loads Gizmo data as particle fields
+and then uses smoothing kernels to deposit those fields to an underlying
+grid structure as spatial fields as described in :ref:`loading-gadget-data`.
+To load Gizmo datasets using the standard HDF5 output format::
+
+.. code-block:: python
+
+ import yt
+ ds = yt.load("snapshot_600.hdf5")
+
+Because the Gizmo output format is similar to the Gadget format, yt
+may load Gizmo datasets as Gadget depending on the circumstances, but this
+should not pose a problem in most situations. FIRE outputs will be loaded
+accordingly due to the number of metallicity fields found (11 or 17).
+
+For Gizmo outputs written as raw binary outputs, you may have to specify
+a bounding box, field specification, and units as are done for standard
+Gadget outputs. See :ref:`loading-gadget-data` for more information.
+
.. _loading-pyne-data:
Halo Catalog Data
diff -r de4aaa4344b2ffd78d9e4411074b9b398f5e6ad4 -r b3c23ff06040ef967b7c9ac041d5ad3dc4edb79a doc/source/reference/code_support.rst
--- a/doc/source/reference/code_support.rst
+++ b/doc/source/reference/code_support.rst
@@ -28,16 +28,18 @@
+-----------------------+------------+-----------+------------+-------+----------+----------+------------+----------+
| Enzo | Y | Y | Y | Y | Y | Y | Y | Full |
+-----------------------+------------+-----------+------------+-------+----------+----------+------------+----------+
+| FITS | Y | N/A | Y | Y | Y | Y | Y | Full |
++-----------------------+------------+-----------+------------+-------+----------+----------+------------+----------+
| FLASH | Y | Y | Y | Y | Y | Y | Y | Full |
+-----------------------+------------+-----------+------------+-------+----------+----------+------------+----------+
-| FITS | Y | N/A | Y | Y | Y | Y | Y | Full |
-+-----------------------+------------+-----------+------------+-------+----------+----------+------------+----------+
| Gadget | Y | Y | Y | Y | Y [#f2]_ | Y | Y | Full |
+-----------------------+------------+-----------+------------+-------+----------+----------+------------+----------+
| GAMER | Y | N | Y | Y | Y | Y | Y | Full |
+-----------------------+------------+-----------+------------+-------+----------+----------+------------+----------+
| Gasoline | Y | Y | Y | Y | Y [#f2]_ | Y | Y | Full |
+-----------------------+------------+-----------+------------+-------+----------+----------+------------+----------+
+| Gizmo | Y | Y | Y | Y | Y [#f2]_ | Y | Y | Full |
++-----------------------+------------+-----------+------------+-------+----------+----------+------------+----------+
| Grid Data Format (GDF)| Y | N/A | Y | Y | Y | Y | Y | Full |
+-----------------------+------------+-----------+------------+-------+----------+----------+------------+----------+
| Maestro | Y [#f1]_ | N | Y | Y | Y | Y | N | Partial |
diff -r de4aaa4344b2ffd78d9e4411074b9b398f5e6ad4 -r b3c23ff06040ef967b7c9ac041d5ad3dc4edb79a tests/tests.yaml
--- a/tests/tests.yaml
+++ b/tests/tests.yaml
@@ -26,6 +26,9 @@
local_gdf_000:
- yt/frontends/gdf/tests/test_outputs.py
+ local_gizmo_000:
+ - yt/frontends/gizmo/tests/test_outputs.py
+
local_halos_000:
- yt/analysis_modules/halo_analysis/tests/test_halo_finders.py # [py2]
- yt/analysis_modules/halo_finding/tests/test_rockstar.py # [py2]
diff -r de4aaa4344b2ffd78d9e4411074b9b398f5e6ad4 -r b3c23ff06040ef967b7c9ac041d5ad3dc4edb79a yt/frontends/api.py
--- a/yt/frontends/api.py
+++ b/yt/frontends/api.py
@@ -31,6 +31,7 @@
'gadget_fof',
'gamer',
'gdf',
+ 'gizmo',
'halo_catalog',
'http_stream',
'moab',
diff -r de4aaa4344b2ffd78d9e4411074b9b398f5e6ad4 -r b3c23ff06040ef967b7c9ac041d5ad3dc4edb79a yt/frontends/gizmo/api.py
--- /dev/null
+++ b/yt/frontends/gizmo/api.py
@@ -0,0 +1,21 @@
+"""
+API for Gizmo frontend.
+
+
+
+
+"""
+
+#-----------------------------------------------------------------------------
+# Copyright (c) 2016, yt Development Team
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
+
+from .data_structures import \
+ GizmoDataset
+
+from .fields import \
+ GizmoFieldInfo
diff -r de4aaa4344b2ffd78d9e4411074b9b398f5e6ad4 -r b3c23ff06040ef967b7c9ac041d5ad3dc4edb79a yt/frontends/gizmo/data_structures.py
--- /dev/null
+++ b/yt/frontends/gizmo/data_structures.py
@@ -0,0 +1,44 @@
+"""
+Data structures for Gizmo frontend.
+
+
+
+
+"""
+
+#-----------------------------------------------------------------------------
+# Copyright (c) 2016, yt Development Team
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
+
+from yt.utilities.on_demand_imports import _h5py as h5py
+
+from yt.frontends.gadget.data_structures import \
+ GadgetHDF5Dataset
+
+from .fields import \
+ GizmoFieldInfo
+
+class GizmoDataset(GadgetHDF5Dataset):
+ _field_info_class = GizmoFieldInfo
+
+ @classmethod
+ def _is_valid(self, *args, **kwargs):
+ need_groups = ['Header']
+ veto_groups = ['FOF', 'Group', 'Subhalo']
+ valid = True
+ try:
+ fh = h5py.File(args[0], mode='r')
+ valid = all(ng in fh["/"] for ng in need_groups) and \
+ not any(vg in fh["/"] for vg in veto_groups)
+ dmetal = "/PartType0/Metallicity"
+ if dmetal not in fh or fh[dmetal].shape[1] not in (11, 17):
+ valid = False
+ fh.close()
+ except:
+ valid = False
+ pass
+ return valid
diff -r de4aaa4344b2ffd78d9e4411074b9b398f5e6ad4 -r b3c23ff06040ef967b7c9ac041d5ad3dc4edb79a yt/frontends/gizmo/fields.py
--- /dev/null
+++ b/yt/frontends/gizmo/fields.py
@@ -0,0 +1,116 @@
+"""
+Gizmo-specific fields
+
+
+
+
+"""
+
+#-----------------------------------------------------------------------------
+# Copyright (c) 2016, yt Development Team
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
+
+from yt.fields.particle_fields import \
+ add_volume_weighted_smoothed_field
+from yt.fields.species_fields import \
+ add_species_field_by_density
+from yt.frontends.gadget.fields import \
+ GadgetFieldInfo
+from yt.frontends.sph.fields import \
+ SPHFieldInfo
+
+class GizmoFieldInfo(GadgetFieldInfo):
+ known_particle_fields = (
+ ("Mass", ("code_mass", ["particle_mass"], None)),
+ ("Masses", ("code_mass", ["particle_mass"], None)),
+ ("Coordinates", ("code_length", ["particle_position"], None)),
+ ("Velocity", ("code_velocity", ["particle_velocity"], None)),
+ ("Velocities", ("code_velocity", ["particle_velocity"], None)),
+ ("ParticleIDs", ("", ["particle_index"], None)),
+ ("InternalEnergy", ("code_velocity ** 2", ["thermal_energy"], None)),
+ ("SmoothingLength", ("code_length", ["smoothing_length"], None)),
+ ("Density", ("code_mass / code_length**3", ["density"], None)),
+ ("MaximumTemperature", ("K", [], None)),
+ ("Temperature", ("K", ["temperature"], None)),
+ ("Epsilon", ("code_length", [], None)),
+ ("Metals", ("code_metallicity", ["metallicity"], None)),
+ ("Metallicity", ("code_metallicity", ["metallicity"], None)),
+ ("Phi", ("code_length", [], None)),
+ ("StarFormationRate", ("Msun / yr", [], None)),
+ ("FormationTime", ("code_time", ["creation_time"], None)),
+ ("Metallicity_00", ("", ["metallicity"], None)),
+ ("Metallicity_01", ("", ["He_metallicity"], None)),
+ ("Metallicity_02", ("", ["C_metallicity"], None)),
+ ("Metallicity_03", ("", ["N_metallicity"], None)),
+ ("Metallicity_04", ("", ["O_metallicity"], None)),
+ ("Metallicity_05", ("", ["Ne_metallicity"], None)),
+ ("Metallicity_06", ("", ["Mg_metallicity"], None)),
+ ("Metallicity_07", ("", ["Si_metallicity"], None)),
+ ("Metallicity_08", ("", ["S_metallicity"], None)),
+ ("Metallicity_09", ("", ["Ca_metallicity"], None)),
+ ("Metallicity_10", ("", ["Fe_metallicity"], None)),
+ )
+
+ def __init__(self, *args, **kwargs):
+ super(SPHFieldInfo, self).__init__(*args, **kwargs)
+ if ("PartType0", "Metallicity_00") in self.field_list:
+ self.nuclei_names = ["He", "C", "N", "O", "Ne", "Mg", "Si", "S",
+ "Ca", "Fe"]
+
+ def setup_gas_particle_fields(self, ptype):
+ super(GizmoFieldInfo, self).setup_gas_particle_fields(ptype)
+ self.alias((ptype, "temperature"), (ptype, "Temperature"))
+
+ def _h_density(field, data):
+ x_H = 1.0 - data[(ptype, "He_metallicity")] - \
+ data[(ptype, "metallicity")]
+ return x_H * data[(ptype, "density")] * \
+ data[(ptype, "NeutralHydrogenAbundance")]
+
+ self.add_field(
+ (ptype, "H_density"),
+ function=_h_density,
+ particle_type=True,
+ units=self.ds.unit_system["density"])
+ add_species_field_by_density(self, ptype, "H", particle_type=True)
+ for suffix in ["density", "fraction", "mass", "number_density"]:
+ self.alias((ptype, "H_p0_%s" % suffix), (ptype, "H_%s" % suffix))
+
+ def _h_p1_density(field, data):
+ x_H = 1.0 - data[(ptype, "He_metallicity")] - \
+ data[(ptype, "metallicity")]
+ return x_H * data[(ptype, "density")] * \
+ (1.0 - data[(ptype, "NeutralHydrogenAbundance")])
+
+ self.add_field(
+ (ptype, "H_p1_density"),
+ function=_h_p1_density,
+ particle_type=True,
+ units=self.ds.unit_system["density"])
+ add_species_field_by_density(self, ptype, "H_p1", particle_type=True)
+
+ def _nuclei_mass_density_field(field, data):
+ species = field.name[1][:field.name[1].find("_")]
+ return data[ptype, "density"] * \
+ data[ptype, "%s_metallicity" % species]
+
+ num_neighbors = 64
+ for species in self.nuclei_names:
+ self.add_field(
+ (ptype, "%s_nuclei_mass_density" % species),
+ function=_nuclei_mass_density_field,
+ particle_type=True,
+ units=self.ds.unit_system["density"])
+
+ for suf in ["_nuclei_mass_density", "_metallicity"]:
+ field = "%s%s" % (species, suf)
+ fn = add_volume_weighted_smoothed_field(
+ ptype, "particle_position", "particle_mass",
+ "smoothing_length", "density", field,
+ self, num_neighbors)
+
+ self.alias(("gas", field), fn[0])
diff -r de4aaa4344b2ffd78d9e4411074b9b398f5e6ad4 -r b3c23ff06040ef967b7c9ac041d5ad3dc4edb79a yt/frontends/gizmo/tests/test_outputs.py
--- /dev/null
+++ b/yt/frontends/gizmo/tests/test_outputs.py
@@ -0,0 +1,46 @@
+"""
+Gizmo frontend tests
+
+
+
+
+"""
+
+#-----------------------------------------------------------------------------
+# Copyright (c) 2015, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
+
+from collections import OrderedDict
+
+from yt.utilities.answer_testing.framework import \
+ data_dir_load, \
+ requires_ds, \
+ sph_answer
+from yt.frontends.gizmo.api import GizmoDataset
+
+FIRE_m12i = 'FIRE_M12i_ref11/snapshot_600.hdf5'
+
+# This maps from field names to weight field names to use for projections
+fields = OrderedDict(
+ [
+ (("gas", "density"), None),
+ (("gas", "temperature"), ('gas', 'density')),
+ (("gas", "metallicity"), ('gas', 'density')),
+ (("gas", "O_metallicity"), ('gas', 'density')),
+ (('gas', 'velocity_magnitude'), None),
+ (("deposit", "all_count"), None),
+ (("deposit", "all_cic"), None),
+ ]
+)
+
+ at requires_ds(FIRE_m12i)
+def test_GizmoDataset():
+ ds = data_dir_load(FIRE_m12i)
+ assert isinstance(ds, GizmoDataset)
+ for test in sph_answer(ds, 'snapshot_600', 4786950, fields):
+ test_GizmoDataset.__name__ = test.description
+ yield test
diff -r de4aaa4344b2ffd78d9e4411074b9b398f5e6ad4 -r b3c23ff06040ef967b7c9ac041d5ad3dc4edb79a yt/frontends/sph/fields.py
--- a/yt/frontends/sph/fields.py
+++ b/yt/frontends/sph/fields.py
@@ -41,27 +41,9 @@
("Phi", ("code_length", [], None)),
("StarFormationRate", ("Msun / yr", [], None)),
("FormationTime", ("code_time", ["creation_time"], None)),
- # These are metallicity fields that get discovered for FIRE simulations
("Metallicity_00", ("", ["metallicity"], None)),
- ("Metallicity_01", ("", ["He_fraction"], None)),
- ("Metallicity_02", ("", ["C_fraction"], None)),
- ("Metallicity_03", ("", ["N_fraction"], None)),
- ("Metallicity_04", ("", ["O_fraction"], None)),
- ("Metallicity_05", ("", ["Ne_fraction"], None)),
- ("Metallicity_06", ("", ["Mg_fraction"], None)),
- ("Metallicity_07", ("", ["Si_fraction"], None)),
- ("Metallicity_08", ("", ["S_fraction"], None)),
- ("Metallicity_09", ("", ["Ca_fraction"], None)),
- ("Metallicity_10", ("", ["Fe_fraction"], None)),
)
- def __init__(self, *args, **kwargs):
- super(SPHFieldInfo, self).__init__(*args, **kwargs)
- # Special case for FIRE
- if ("PartType0", "Metallicity_00") in self.field_list:
- self.species_names += ["He", "C", "N", "O", "Ne", "Mg", "Si", "S",
- "Ca", "Fe"]
-
def setup_particle_fields(self, ptype, *args, **kwargs):
super(SPHFieldInfo, self).setup_particle_fields(ptype, *args, **kwargs)
setup_species_fields(self, ptype)
Repository URL: https://bitbucket.org/yt_analysis/yt/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.spacepope.org/pipermail/yt-svn-spacepope.org/attachments/20160519/94ffeec5/attachment.html>
More information about the yt-svn
mailing list