[yt-dev] Issue #1055: RAMSES units error with boxlen != 1 (yt_analysis/yt)

Ji-hoon Kim issues-reply at bitbucket.org
Thu Jul 30 23:40:24 PDT 2015


New issue 1055: RAMSES units error with boxlen != 1
https://bitbucket.org/yt_analysis/yt/issues/1055/ramses-units-error-with-boxlen-1

Ji-hoon Kim:

Dear All,

The current way of assigning lengh_unit and density_unit doesn't seem to properly work for a RAMSES dataset with boxlen != 1.  FYI, I am testing yt-3.2 on the Ramses entry for the AGORA isolated disk comparison (no RT).  As I understand, yt-dev has been working fine for this particular dataset until PR #1610 is merged. I think part of the problem -- though maybe not the entirety of the problem -- is that "unit_l" gets multiplied by boxlen twice (frontend/ramses/data_structures.py; first in line 498, then in 521).  I think this alone may warrant a reinvestigation of the RAMSES units in yt.  

```
#!python
       length_unit = self.parameters['unit_l'] * boxlen
       density_unit = self.parameters['unit_d']/ boxlen**3
       mass_unit = density_unit * length_unit**3 
...
       self.density_unit = self.quan(density_unit, 'g/cm**3')
       self.length_unit = self.quan(length_unit * boxlen, "cm")
       self.mass_unit = self.quan(mass_unit, "g")
```

I tried seemingly the most obvious fix of removing the second boxlen multiplication, but it fails again with too low density (off by boxlen**3).  

```
#!python
>>> pf.all_data()["density"]()
YTArray([  2.87245413e-38,   2.87426855e-38,   2.87426181e-38, ...,
        3.07532664e-38,   3.07330200e-38,   3.07943311e-38]) g/cm**3
>>> pf.all_data()["density"].median()
3.09606619982e-33 g/cm**3
```

FWIW, I did learn about the history behind the data_structures.py by reading through previous conversations dating back last year -- among Ricarda, Nathan, Desika, Ben, Sam, Matt, and others.  Especially after going through its lengthy history and multiple changes and reverts, I wasn't certain that I could *find and verify* the correct way of setting units for all Ramses users and datasets out there.  But, once Ricarda and a broader yt-Ramses user base come up with the **most general** way of assigning units, I will be more than happy to test the fix on the dataset I have.    

Many thanks as always to the yt community!

Best wishes,

Ji-hoon

* * *

PS.  Below are just my two cents.  

IMHO, *as far as length_unit and density_unit are concerned*, I think pre-PR#1610-era solution is more consistent with pymses (snippet in https://bitbucket.org/yt_analysis/yt/issues/939/units-error-in-ramses-frontend).  Please see below for comparison.   

However, there is one important outstanding issue.  Judging from the comments in the pymses snippet, the “unit_mass” in pymses seems *only* for DM particles, and boxlen renormalization is *only* applied to “unit_mass".  (Am I correct here?)   In contrast, “mass_unit” in yt could be for any entity including star particles.  This might explain the issue Desika originally reported with stellar masses in another AGORA-disk run (http://lists.spacepope.org/pipermail/yt-dev-spacepope.org/2015-June/019345.html).  Unfortunately, however, this is a pure speculation based *not* on extensive exposures to various Ramses datasets, *but* only on my reading of the pymses snippet.  

[A]  Pre-PR#1610-era length_unit and density_unit (e.g. changeset 242b9f739613):  

```
#!python
       length_unit = self.parameters['unit_l']
       density_unit = self.parameters['unit_d']
       mass_unit = density_unit * (length_unit * boxlen)**3
...
       self.density_unit = self.quan(density_unit, 'g/cm**3')
       self.length_unit = self.quan(length_unit * boxlen, "cm")
       self.mass_unit = self.quan(mass_unit, "g")
```

[B]  Compare with the pymses code snippet:

```
#!python
   info_dict["unit_length"] = float(par_dict["unit_l"])*C.cm
   info_dict["unit_density"] = float(par_dict["unit_d"])*C.g/C.cm**3
...
   # Boxlen renormalisation : used only for dark matter particles,
   # so we do this just before computing the mass unit
   info_dict["unit_length"] = info_dict["unit_length"] * info_dict["boxlen"]
   info_dict["unit_mass"] = info_dict["unit_density"] \
                   * info_dict["unit_length"]**3
```


I am sure that Ricarda and other experienced Ramses users will be better positioned to suggest the *most general* solution.  I look forward to hearing their insights.  (Questions I couldn't quite answer for myself: Would any suggested changes cause troubles in other units such as velocity, pressure, or B-field?  If my reading of the pymses code is correct, how could yt possibly assign two mass_units?)   







More information about the yt-dev mailing list