Пример #1
0
    def fundamental_sector(self):
        from orix.vector.neo_euler import AxAngle
        from orix.vector.spherical_region import SphericalRegion
        symmetry = self.antipodal
        symmetry = symmetry[symmetry.angle > 0]
        axes, order = symmetry.get_highest_order_axis()
        if order > 6:
            return Vector3d.empty()
        axis = Vector3d.zvector().get_nearest(axes, inclusive=True)
        r = Rotation.from_neo_euler(
            AxAngle.from_axes_angles(axis, 2 * np.pi / order))

        diads = symmetry.diads
        nearest_diad = axis.get_nearest(diads)
        if nearest_diad.size == 0:
            nearest_diad = axis.perpendicular

        n1 = axis.cross(nearest_diad).unit
        n2 = -(r * n1)
        next_diad = r * nearest_diad
        n = Vector3d.stack((n1, n2)).flatten()
        sr = SphericalRegion(n.unique())
        inside = symmetry[symmetry.axis < sr]
        if inside.size == 0:
            return sr
        axes, order = inside.get_highest_order_axis()
        axis = axis.get_nearest(axes)
        r = Rotation.from_neo_euler(
            AxAngle.from_axes_angles(axis, 2 * np.pi / order))
        nearest_diad = next_diad
        n1 = axis.cross(nearest_diad).unit
        n2 = -(r * n1)
        n = Vector3d(np.concatenate((n.data, n1.data, n2.data)))
        sr = SphericalRegion(n.unique())
        return sr
Пример #2
0
 def get_highest_order_axis(self):
     axis_orders = self.get_axis_orders()
     if len(axis_orders) == 0:
         return Vector3d.zvector(), np.infty
     highest_order = max(axis_orders.values())
     axes = Vector3d.stack([ao for ao in axis_orders if
                            axis_orders[ao] == highest_order]).flatten()
     return axes, highest_order
Пример #3
0
 def diads(self):
     axis_orders = self.get_axis_orders()
     diads = [ao for ao in axis_orders if axis_orders[ao] == 2]
     if len(diads) == 0:
         return Vector3d.empty()
     return Vector3d.stack(diads).flatten()