def get_symops_by_generator_xyz(self, generator_xyz: str) -> Tuple[str]: r, b = self.r, self.b symop = [] W_g, w_g = transform_string_to_r_b(generator_xyz, labels=("x", "y", "z")) flag = True W_i = copy.deepcopy(r) w_i = copy.deepcopy(b) % 1 _symop = transform_r_b_to_string(W_i, w_i, labels=("x", "y", "z")) symop.append(_symop) i_stop = 1 while flag: i_stop += 1 w_i = (mult_matrix_vector(W_g, w_i) + w_g) % 1 # w3 = W2 x w1 + w2 W_i = mult_matrixes(W_g, W_i) # W3 = W2 x W1 _symop = transform_r_b_to_string(W_i, w_i, labels=("x", "y", "z")) if ((_symop in symop) | (i_stop > 100)): flag = False else: symop.append(_symop) res = [] gen_orig = "" if not (self.generator_xyz is None): gen_orig = f"{self.generator_xyz:}" res = [ SpaceGroupSymop(id=f"{_i+1:}", operation_xyz=_symop, generator_xyz=f"{gen_orig:}_{generator_xyz:}") for _i, _symop in enumerate(symop) ] return res
def form_object(self) -> NoReturn: coord_xyz = self.coord_xyz if coord_xyz is None: return False r, b = transform_string_to_r_b(coord_xyz, labels=("x", "y", "z")) self.__dict__["r"] = r self.__dict__["b"] = b it_coord_xyz = self.it_coord_xyz centring_type = self.centring_type shift = get_shift_by_centring_type(centring_type) if it_coord_xyz is not None: full_r, full_b = [], [] full_coord_xyz = [] for _coord_xyz in it_coord_xyz: r, b = transform_string_to_r_b(_coord_xyz, labels=("x", "y", "z")) for _shift in shift: b_new = numpy.mod(b + numpy.array(_shift, dtype=Fraction), 1) _symop = transform_r_b_to_string(r, b_new, labels=("x", "y", "z")) full_coord_xyz.append(_symop) full_r.append(r) full_b.append(b_new) self.__dict__["full_r"] = full_r self.__dict__["full_b"] = full_b self.__dict__["full_coord_xyz"] = full_coord_xyz
def get_symop_inversed(self, pcentr=numpy.zeros(3, float)): r, b = self.r, self.b r_new = -1 * r b_new = -1 * b + 2 * pcentr _symop = transform_r_b_to_string(r_new, b_new, labels=("x", "y", "z")) _item = SpaceGroupSymop(operation_xyz=_symop) return _item
def get_symops_by_centring_type(self, centring_type: str) -> Tuple[str]: r, b = self.r, self.b r_new = r shift = get_shift_by_centring_type(centring_type) symops = [] for _shift in shift: b_new = b + numpy.array(_shift, dtype=Fraction) _symop = transform_r_b_to_string(r_new, b_new, labels=("x", "y", "z")) symop = SpaceGroupSymop(operation_xyz=_symop) symops.append(symop) return symops
def define_by_el_symm(cls, el_symm): """Define object by element of symmetry (class method). Arguments --------- - el_symm is [b_1, r_11, r_12, r_13, b_2, r_21, r_22, r_23, b_3, r_31, r_32, r_33] """ [b_1, r_11, r_12, r_13, b_2, r_21, r_22, r_23, b_3, r_31, r_32, r_33] \ = el_symm r = numpy.array( [[r_11, r_12, r_13], [r_21, r_22, r_23], [r_31, r_32, r_33]], dtype=int) b = numpy.array([b_1, b_2, b_3], dtype=float) symop = transform_r_b_to_string(r, b, labels=("x", "y", "z")) obj = cls(operation_xyz=symop) return obj