[yt-users] Defining a new field, including IF statement

Britton Smith brittonsmith at gmail.com
Thu Nov 2 06:01:56 PDT 2017


Hi again,

There's a small typo.  This line:
field_data[np.invert(threshold] = 0
is missing the closing bracket:
field_data[np.invert(threshold]] = 0

On Thu, Nov 2, 2017 at 6:00 AM, Britton Smith <brittonsmith at gmail.com>
wrote:

> Hi Yusuke,
>
> This error comes from the fact that your field function is being evaluated
> for an array of elements all at once.  You will likely have portions of the
> array that satisfy both criteria.  You'll need to first define a field
> array and then set the values for the portions above the density threshold
> and then below.  I recommend doing something like the following:
>
> def _SFR_Density(field, data):
>    f_sf = 0.01
>    rho_thresh = 57.5 * Mu * hydrogen_mass
>    # make field array
>    field_data = data["density"].copy()
>    # density threshold
>    threshold = data["density"] > rho_thresh
>    # set values above threshold
>    field_data[threshold] *= f_sf * / (3*pi/32/Grav/data["density"])**(0.5)
>    # set values below
>    field_data[np.invert(threshold] = 0
>    return field_data
>
> The threshold array is a boolean array that can be used to access all the
> values satisfying your criteria all at once.  Then, the np.invert gives you
> all the values not satisfying it.  Hope that helps!
>
> Britton
>
> On Wed, Nov 1, 2017 at 10:46 PM, Yusuke Fujimoto <
> yusuke.fujimoto.jp at gmail.com> wrote:
>
>> Dear yt-users,
>>
>> I am trying to define a new field, SFR_Density, which includes if
>> statements.
>> That is defined by,
>> f_sf * rho / t_ff  if rho > rho_threshold
>> 0                      if rho < rho_threshold
>> (f_sf is star formation efficiency, rho is gas density, and t_ff is free
>> fall time)
>>
>> Here is my definition I tried.
>>
>> def _SFR_Density(field, data):
>>
>>    f_sf = 0.01
>>
>>    rho_thresh = 57.5 * Mu * hydrogen_mass
>>
>>    if data["density"] > rho_thresh:
>>
>>       return f_sf * data["density"] / (3*pi/32/Grav/data["density"])**(
>> 0.5)
>>
>>    else:
>>
>>       return 0.0 * f_sf * data["density"] / (3*pi/32/Grav/data["density"
>> ])**(0.5)
>>
>> add_field("SFR_Density", function=_SFR_Density)
>>
>> But it fails with an error message of "ValueError: The truth value of an
>> array with more than one element is ambiguous. Use a.any() or a.all()"
>> I am sure this is because data["density"] is a list, so I need to specify
>> the exact index number of elements at the if statement. I have tried many
>> tests, but now I am in stuck.
>>
>> Any help would be very appreciated.
>>
>> Thanks,
>> Yusuke
>>
>> _______________________________________________
>> yt-users mailing list
>> yt-users at lists.spacepope.org
>> http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.spacepope.org/pipermail/yt-users-spacepope.org/attachments/20171102/e2474779/attachment-0001.html>


More information about the yt-users mailing list