def _specific_angular_momentum_z(field, data): xv, yv, zv = obtain_relative_velocity_vector(data) rv = obtain_position_vector(data) units = rv.units rv = np.rollaxis(rv, 0, len(rv.shape)) rv = data.ds.arr(rv, units=units) return rv[..., 0] * yv - rv[..., 1] * xv
def get_periodic_rvec(data): coords = obtain_position_vector(data).d if sum(data.ds.periodicity) == 0: return coords le = data.ds.domain_left_edge.in_units("code_length").d dw = data.ds.domain_width.in_units("code_length").d for i in range(coords.shape[0]): if not data.ds.periodicity[i]: continue coords[i, ...] -= le[i] #figure out which measure is less mins = np.argmin([ np.abs(np.mod(coords[i, ...], dw[i])), np.abs(np.mod(coords[i, ...], -dw[i])) ], axis=0) temp_coords = np.mod(coords[i, ...], dw[i]) #Where second measure is better, updating temporary coords ii = mins == 1 temp_coords[ii] = np.mod(coords[i, ...], -dw[i])[ii] # Putting the temporary coords into the actual storage coords[i, ...] = temp_coords coords[i, ...] + le[i] return coords
def _specific_angular_momentum_y(field, data): xv, yv, zv = obtain_relative_velocity_vector(data) rv = obtain_position_vector(data) units = rv.units rv = np.rollaxis(rv, 0, len(rv.shape)) rv = data.ds.arr(rv, input_units=units) return -(xv * rv[..., 2] - zv * rv[..., 0])
def _relative_particle_position(field, data): """The cartesian particle positions in a rotated reference frame Relative to the coordinate system defined by *center* field parameter. Note that the orientation of the x and y axes are arbitrary. """ field_names = [(ptype, f"particle_position_{ax}") for ax in "xyz"] return obtain_position_vector(data, field_names=field_names).T
def test_obtain_position_vector(): ds = fake_random_ds(64, nprocs=8, fields=_fields, negative=[False, True, True, True]) dd = ds.sphere((0.5, 0.5, 0.5), 0.2) coords = obtain_position_vector(dd) r = np.sqrt(np.sum(coords * coords, axis=0)) assert_array_less(r.max(), 0.2) assert_array_less(0.0, r.min())
def _specific_angular_momentum_z(field, data): xv, yv, zv = obtain_relative_velocity_vector(data) rv = obtain_position_vector(data) rv = np.rollaxis(rv, 0, len(rv.shape)) rv = data.ds.arr(rv, input_units=data["index", "x"].units) return xv * rv[..., 1] - yv * rv[..., 0]