def split_slices_dict(self, eh, slices): common.check_value('eh', eh, ('e', 'h')) common.check_type('slices', slices, (list, tuple), slice) overlap = lambda sl: \ common.intersection_two_slices(self.ns, slices, \ (sl, slice(None, None), slice(None, None)) ) if eh == 'e': slices_dict = { \ '': slices, \ 'pre': overlap( slice(-2, None) ), \ 'mid': overlap( slice(1, -2) ), \ 'post': overlap( slice(None, 1) ) } elif eh == 'h': slices_dict = { \ '': slices, \ 'pre': overlap( slice(None, 2) ), \ 'mid': overlap( slice(2, -1) ), \ 'post': overlap( slice(-1, None) ) } return slices_dict
def __init__(self, fields, str_f, pt0, pt1, tfunc, spatial_value=1., is_overwrite=False): """ """ common.check_type('fields', fields, Fields) common.check_value('str_f', str_f, ('ex', 'ey', 'ez', 'hx', 'hy', 'hz')) common.check_type('pt0', pt0, (list, tuple), int) common.check_type('pt1', pt1, (list, tuple), int) common.check_type('tfunc', tfunc, types.FunctionType) common.check_type('spatial_value', spatial_value, \ (np.ndarray, np.number, types.FloatType, types.IntType) ) common.check_type('is_overwrite', is_overwrite, bool) # local variables e_or_h = str_f[0] dtype = fields.dtype is_array = True if isinstance(spatial_value, np.ndarray) else False for axis, n, p0, p1 in zip(['x', 'y', 'z'], fields.ns, pt0, pt1): common.check_value('pt0 %s' % axis, p0, range(n)) common.check_value('pt1 %s' % axis, p1, range(n)) if is_array: shape = common.shape_two_points(pt0, pt1) assert shape == spatial_value.shape, \ 'shape mismatch : %s, %s' % (shape, spatial_value.shape) assert dtype == spatial_value.dtype, \ 'dtype mismatch : %s, %s' % (dtype, spatial_value.dtype) else: spatial_value = dtype(spatial_value) # create the SetFields instance func_dict = {} pts_dict = fields.split_points_dict(e_or_h, pt0, pt1) for part, pts in pts_dict.items(): if pts == None: func_dict[part] = lambda a='': None else: func_dict[part] = SetFields(fields, str_f, \ pts[0], pts[1], is_array, is_overwrite).set_fields if is_array: spatial_array_dict = {} for part, pts in pts_dict.items(): if pts == None: spatial_array_dict[part] = 0 else: slices0 = [slice(p0, p1+1) for p0, p1 in zip(pt0, pt1)] slices1 = [slice(p0, p1+1) for p0, p1 in zip(pts[0], pts[1])] overlap_slices = common.intersection_two_slices(fields.ns, slices0, slices1) shift_slices = [] for sl, p0 in zip(overlap_slices, pt0): s0, s1 = sl.start, sl.stop shift_slices.append( slice(s0-p0, s1-p0) ) dummied_shape = common.shape_two_points(pt0, pt1, is_dummy=True) reshaped_value = spatial_value.reshape(dummied_shape) dummied_array = reshaped_value[shift_slices] overlap_shape = common.shape_two_points(pts[0], pts[1]) spatial_array_dict[part] = dummied_array.reshape(overlap_shape) # global variables and functions self.mainf = fields self.dtype = dtype self.tfunc = tfunc self.func_dict = func_dict self.e_or_h = e_or_h self.tstep = 1 if is_array: self.spatial_array_dict = spatial_array_dict self.update = self.update_spatial_value else: self.spatial_value = spatial_value self.update = self.update_single_value # append to the update list self.priority_type = 'incident' fields.append_instance(self)