
    g              	           d dl mZ d dlmZmZmZmZ d dlmZ g dZ	ddZ
d Z G d d edd	d
g                    ZdS )    )sympify)PointDyadicReferenceFrameouter)
namedtuple)inertiainertia_of_point_massInertiac                    t          | t                    st          d          t          |          t          |          t          |          }}}t          |          t          |          t          |          }}}|t	          | j        | j                  z  |t	          | j        | j                  z  z   |t	          | j        | j                  z  z   |t	          | j        | j                  z  z   |t	          | j        | j                  z  z   |t	          | j        | j                  z  z   |t	          | j        | j                  z  z   |t	          | j        | j                  z  z   |t	          | j        | j                  z  z   S )a~  Simple way to create inertia Dyadic object.

    Explanation
    ===========

    Creates an inertia Dyadic based on the given tensor values and a body-fixed
    reference frame.

    Parameters
    ==========

    frame : ReferenceFrame
        The frame the inertia is defined in.
    ixx : Sympifyable
        The xx element in the inertia dyadic.
    iyy : Sympifyable
        The yy element in the inertia dyadic.
    izz : Sympifyable
        The zz element in the inertia dyadic.
    ixy : Sympifyable
        The xy element in the inertia dyadic.
    iyz : Sympifyable
        The yz element in the inertia dyadic.
    izx : Sympifyable
        The zx element in the inertia dyadic.

    Examples
    ========

    >>> from sympy.physics.mechanics import ReferenceFrame, inertia
    >>> N = ReferenceFrame('N')
    >>> inertia(N, 1, 2, 3)
    (N.x|N.x) + 2*(N.y|N.y) + 3*(N.z|N.z)

    z%Need to define the inertia in a frame)
isinstancer   	TypeErrorr   r   xyz)frameixxiyyizzixyiyzizxs          [/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/physics/mechanics/inertia.pyr	   r	      s^   J e^,, A?@@@CLL'#,,cCCLL'#,,cCeguw'''#eEGUW.E.E*EEeguw'''(*-eEGUW.E.E*EFeguw'''(*-eEGUW.E.E*EF eguw'''( +.eEGUW.E.E*EF eguw'''	( )    c                     | t          |j        |j                  t          |j        |j                  z   t          |j        |j                  z   |                    |          z  t          ||          z
  z  S )aO  Inertia dyadic of a point mass relative to point O.

    Parameters
    ==========

    mass : Sympifyable
        Mass of the point mass
    pos_vec : Vector
        Position from point O to point mass
    frame : ReferenceFrame
        Reference frame to express the dyadic in

    Examples
    ========

    >>> from sympy import symbols
    >>> from sympy.physics.mechanics import ReferenceFrame, inertia_of_point_mass
    >>> N = ReferenceFrame('N')
    >>> r, m = symbols('r m')
    >>> px = r * N.x
    >>> inertia_of_point_mass(m, px, N)
    m*r**2*(N.y|N.y) + m*r**2*(N.z|N.z)

    )r   r   r   r   dot)masspos_vecr   s      r   r
   r
   8   sx    4 	uw	 	 	uw	 	 
!	uw	 	 
! 
W			 "'w!8!8	9: :r   c                   R     e Zd ZdZ fdZe	 	 dd            Zd Zd ZeZ	eZ
 xZS )r   ay  Inertia object consisting of a Dyadic and a Point of reference.

    Explanation
    ===========

    This is a simple class to store the Point and Dyadic, belonging to an
    inertia.

    Attributes
    ==========

    dyadic : Dyadic
        The dyadic of the inertia.
    point : Point
        The reference point of the inertia.

    Examples
    ========

    >>> from sympy.physics.mechanics import ReferenceFrame, Point, Inertia
    >>> N = ReferenceFrame('N')
    >>> Po = Point('Po')
    >>> Inertia(N.x.outer(N.x) + N.y.outer(N.y) + N.z.outer(N.z), Po)
    ((N.x|N.x) + (N.y|N.y) + (N.z|N.z), Po)

    In the example above the Dyadic was created manually, one can however also
    use the ``inertia`` function for this or the class method ``from_tensor`` as
    shown below.

    >>> Inertia.from_inertia_scalars(Po, N, 1, 1, 1)
    ((N.x|N.x) + (N.y|N.y) + (N.z|N.z), Po)

    c                 6   t          |t                    rt          |t                    r||}}t          |t                    st          d          t          |t                    st          d          t	                                          | ||          S )Nz'Reference point should be of type Pointz-Inertia value should be expressed as a Dyadic)r   r   r   r   super__new__)clsdyadicpoint	__class__s      r   r"   zInertia.__new__{   s    fe$$ 	*E6)B)B 	*"E6E%'' 	GEFFF&&)) 	MKLLLwwsFE222r   r   c	                 @     | t          |||||||          |          S )a  Simple way to create an Inertia object based on the tensor values.

        Explanation
        ===========

        This class method uses the :func`~.inertia` to create the Dyadic based
        on the tensor values.

        Parameters
        ==========

        point : Point
            The reference point of the inertia.
        frame : ReferenceFrame
            The frame the inertia is defined in.
        ixx : Sympifyable
            The xx element in the inertia dyadic.
        iyy : Sympifyable
            The yy element in the inertia dyadic.
        izz : Sympifyable
            The zz element in the inertia dyadic.
        ixy : Sympifyable
            The xy element in the inertia dyadic.
        iyz : Sympifyable
            The yz element in the inertia dyadic.
        izx : Sympifyable
            The zx element in the inertia dyadic.

        Examples
        ========

        >>> from sympy import symbols
        >>> from sympy.physics.mechanics import ReferenceFrame, Point, Inertia
        >>> ixx, iyy, izz, ixy, iyz, izx = symbols('ixx iyy izz ixy iyz izx')
        >>> N = ReferenceFrame('N')
        >>> P = Point('P')
        >>> I = Inertia.from_inertia_scalars(P, N, ixx, iyy, izz, ixy, iyz, izx)

        The tensor values can easily be seen when converting the dyadic to a
        matrix.

        >>> I.dyadic.to_matrix(N)
        Matrix([
        [ixx, ixy, izx],
        [ixy, iyy, iyz],
        [izx, iyz, izz]])

        )r	   )	r#   r%   r   r   r   r   r   r   r   s	            r   from_inertia_scalarszInertia.from_inertia_scalars   s+    f s75#sCc3??GGGr   c                 V    t          d| j        j         d|j        j         d          )Nz$unsupported operand type(s) for +: '' and ''r   r&   __name__selfothers     r   __add__zInertia.__add__   B     8 N38 8!O48 8 8 9 9 	9r   c                 V    t          d| j        j         d|j        j         d          )Nz$unsupported operand type(s) for *: 'r*   r+   r,   r.   s     r   __mul__zInertia.__mul__   r2   r   r   r   r   )r-   
__module____qualname____doc__r"   classmethodr(   r1   r4   __radd____rmul____classcell__)r&   s   @r   r   r   Y   s           B3 3 3 3 3 JK!"2H 2H 2H [2Hh9 9 9
9 9 9
 HHHHHHr   r   r$   r%   Nr5   )sympyr   sympy.physics.vectorr   r   r   r   collectionsr   __all__r	   r
   r    r   r   <module>rB      s          E E E E E E E E E E E E " " " " " "
9
9
9-) -) -) -)`: : :Bl l l l ljjXw$788 l l l l lr   