示例#1
0
    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
示例#3
0
 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
示例#4
0
 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
示例#5
0
 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