[yt-users] basic question

Matthew Turk matthewturk at gmail.com
Tue Nov 8 04:56:52 PST 2011


Hi Elizabeth,

On Tue, Nov 8, 2011 at 3:33 AM, Elizabeth Tasker
<tasker at astro1.sci.hokudai.ac.jp> wrote:
> Hi,
>
> I have a basic question about the way yt handles data (or maybe the way python functions handle data).
>
> If I have a function of the form:
>
>
> def _MyFunction(field, data):
>
>        new_data = na.zeros(data["x"].shape, dtype='float64')
>
>        ..... find xpos, ypos and zpos values of cells to be flagged as part of new_data
>
>        for n in range(nflaggedcells):
>            new_data[[data["x"] == xpos and data["y"] == ypos and data["z"] == zpos]] = 1.0
>
>        return new_data
>
> add_field("MyFunction", function=_MyFunction, validators=[ValidateSpatial(1, ["x", "y", "z"])])
>
> pf = load('data')
> dd = pf.h.all_data()
> regions = dd["MyFunction"]
>
>
>
>
>
> Does yt call _MyFunction for each grid? So it runs through that routine many times, once per grid?

When you mandate ValidateSpatial, with a single ghost zone, it
actually doesn't exactly call it for every grid.  It calls it for
every *covering* grid.  So it's worse than that: it fills in a buffer
zone of one cell through cascading interpolation, then it calculates
your data field, then it returns that portion to the grid.  It then
masks them, concatenates them, and sets dd.field_data["MyFunction"] to
the resulting flattened array; the dd["MyFunction"] call then returns
this.

>
> If so, is there an alternative? One sweep through the function will --using Sam's KD tree-- find the positions on every grid that I want to mark. The only reason to put it in a function, as opposed to the main body, is so I can then use yt's slice and projection tools on the data set.

Yes, you should do this then.  The problem will be taking the values
and turning them back into grid values, as they'll be vertex-centered
and in partitioned grids.  Sam can likely describe how to do that.

>
> I'd really like to create a new field I can use with add_slice that only is looped over a single time. I appreciate this line:
>
> for n in range(nflaggedcells):
>            new_data[[data["x"] == xpos and data["y"] == ypos and data["z"] == zpos]] = 1.0
>
> then won't work, but I can just store a list of the grids and cell numbers and mark up new_data using those instead.

Hm, slices also have "x","y","z" values.  If you don't mandate
ValidateSpatial, accessing a slice field should only read the field
dependencies from disk (as slices) and then calcualte.  For instance,
if you ask for H2I_Fraction from a slice, it will only read
H2I_Density and Density in that slice (not in each grid, but in the
appropriate subselection of a grid that intersects a slice) and then
do the derived field function on the field_data values, not on the
grid values.

-Matt

>
> Does that make sense?
>
>
>
>
> Thanks!
>
> Elizabeth
> _______________________________________________
> yt-users mailing list
> yt-users at lists.spacepope.org
> http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org
>



More information about the yt-users mailing list