
    g!                         d dl mZ d dlmZ d dlmZ d dlmZmZ d dl	m
Z
 d dlmZ g dZd Zd	 Zd
 Zd Zd Zd Zd ZdS )    )diff)S)	integrate)Vectorexpress)_check_frame)_check_vector)curl
divergencegradientis_conservativeis_solenoidalscalar_potentialscalar_potential_differencec                 |   t          |            | dk    rt          d          S t          | |d          } |                     |j                  }|                     |j                  }|                     |j                  }t          d          }|t          ||d                   t          ||d                   z
  |j        z  z  }|t          ||d                   t          ||d                   z
  |j        z  z  }|t          ||d                   t          ||d                   z
  |j        z  z  }|S )aP  
    Returns the curl of a vector field computed wrt the coordinate
    symbols of the given frame.

    Parameters
    ==========

    vect : Vector
        The vector operand

    frame : ReferenceFrame
        The reference frame to calculate the curl in

    Examples
    ========

    >>> from sympy.physics.vector import ReferenceFrame
    >>> from sympy.physics.vector import curl
    >>> R = ReferenceFrame('R')
    >>> v1 = R[1]*R[2]*R.x + R[0]*R[2]*R.y + R[0]*R[1]*R.z
    >>> curl(v1, R)
    0
    >>> v2 = R[0]*R[1]*R[2]*R.x
    >>> curl(v2, R)
    R_x*R_y*R.y - R_x*R_z*R.z

    r   T	variables      )r	   r   r   dotxyzr   )vectframevectxvectyvectzoutvecs         _/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/physics/vector/fieldfunctions.pyr
   r
      s   : $qyyayy4$///DHHUWEHHUWEHHUWEAYYF
tE58$$tE58'<'<<GGF
tE58$$tE58'<'<<GGF
tE58$$tE58'<'<<GGFM    c                    t          |            | dk    rt          j        S t          | |d          } |                     |j                  }|                     |j                  }|                     |j                  }t          j        }|t          ||d                   z  }|t          ||d                   z  }|t          ||d                   z  }|S )ab  
    Returns the divergence of a vector field computed wrt the coordinate
    symbols of the given frame.

    Parameters
    ==========

    vect : Vector
        The vector operand

    frame : ReferenceFrame
        The reference frame to calculate the divergence in

    Examples
    ========

    >>> from sympy.physics.vector import ReferenceFrame
    >>> from sympy.physics.vector import divergence
    >>> R = ReferenceFrame('R')
    >>> v1 = R[0]*R[1]*R[2] * (R.x+R.y+R.z)
    >>> divergence(v1, R)
    R_x*R_y + R_x*R_z + R_y*R_z
    >>> v2 = 2*R[1]*R[2]*R.y
    >>> divergence(v2, R)
    2*R_z

    r   Tr   r   r   )	r	   r   Zeror   r   r   r   r   r   )r   r   r   r   r   outs         r    r   r   :   s    : $qyyv4$///DHHUWEHHUWEHHUWE
&C4uQx   C4uQx   C4uQx   CJr!   c                     t          |           t          d          }t          | |d          } t          |          D ]!\  }}|t	          | ||                   |z  z  }"|S )a  
    Returns the vector gradient of a scalar field computed wrt the
    coordinate symbols of the given frame.

    Parameters
    ==========

    scalar : sympifiable
        The scalar field to take the gradient of

    frame : ReferenceFrame
        The frame to calculate the gradient in

    Examples
    ========

    >>> from sympy.physics.vector import ReferenceFrame
    >>> from sympy.physics.vector import gradient
    >>> R = ReferenceFrame('R')
    >>> s1 = R[0]*R[1]*R[2]
    >>> gradient(s1, R)
    R_y*R_z*R.x + R_x*R_z*R.y + R_x*R_y*R.z
    >>> s2 = 5*R[0]**2*R[2]
    >>> gradient(s2, R)
    10*R_x*R_z*R.x + 5*R_x**2*R.z

    r   Tr   )r   r   r   	enumerater   )scalarr   r   ir   s        r    r   r   e   sp    : AYYFVUd333F%   - -1$vuQx((1,,Mr!   c                     | t          d          k    rdS t          |                                           d         }t          | |                                          t          d          k    S )a  
    Checks if a field is conservative.

    Parameters
    ==========

    field : Vector
        The field to check for conservative property

    Examples
    ========

    >>> from sympy.physics.vector import ReferenceFrame
    >>> from sympy.physics.vector import is_conservative
    >>> R = ReferenceFrame('R')
    >>> is_conservative(R[1]*R[2]*R.x + R[0]*R[2]*R.y + R[0]*R[1]*R.z)
    True
    >>> is_conservative(R[2] * R.y)
    False

    r   T)r   listseparater
   simplifyfieldr   s     r    r   r      s]    2 q		t!!""1%Eu&&((F1II55r!   c                     | t          d          k    rdS t          |                                           d         }t          | |                                          t
          j        u S )a  
    Checks if a field is solenoidal.

    Parameters
    ==========

    field : Vector
        The field to check for solenoidal property

    Examples
    ========

    >>> from sympy.physics.vector import ReferenceFrame
    >>> from sympy.physics.vector import is_solenoidal
    >>> R = ReferenceFrame('R')
    >>> is_solenoidal(R[1]*R[2]*R.x + R[0]*R[2]*R.y + R[0]*R[1]*R.z)
    True
    >>> is_solenoidal(R[1] * R.y)
    False

    r   T)r   r*   r+   r   r,   r   r#   r-   s     r    r   r      sY    2 q		t!!""1%EeU##,,..!&88r!   c                    t          |           st          d          | t          d          k    rt          j        S t          |           t          | |d          } t          |          }t          | 	                    |d                   |d                   }t          |dd                   D ]R\  }}t          |||dz                      }| 	                    |          |z
  }|t          |||dz                      z  }S|S )a  
    Returns the scalar potential function of a field in a given frame
    (without the added integration constant).

    Parameters
    ==========

    field : Vector
        The vector field whose scalar potential function is to be
        calculated

    frame : ReferenceFrame
        The frame to do the calculation in

    Examples
    ========

    >>> from sympy.physics.vector import ReferenceFrame
    >>> from sympy.physics.vector import scalar_potential, gradient
    >>> R = ReferenceFrame('R')
    >>> scalar_potential(R.z, R) == R[2]
    True
    >>> scalar_field = 2*R[0]**2*R[1]*R[2]
    >>> grad_field = gradient(scalar_field, R)
    >>> scalar_potential(grad_field, R)
    2*R_x**2*R_y*R_z

    zField is not conservativer   Tr   r   N)r   
ValueErrorr   r   r#   r   r   r*   r   r   r&   r   )r.   r   
dimensionstemp_functionr(   dimpartial_diffs          r    r   r      s    > 5!! 64555q		v E5D111EeJeii
166aAAMJqrrN++ ? ?3M5Q<88yy~~4<q1u>>>r!   c                    t          |           t          | t                    rt          | |          }n| }t	          |                    |          |d          }t	          |                    |          |d          }i }i }	t          |          D ]A\  }
}|                    |          |||
         <   |                    |          |	||
         <   B|                    |	          |                    |          z
  S )a*  
    Returns the scalar potential difference between two points in a
    certain frame, wrt a given field.

    If a scalar field is provided, its values at the two points are
    considered. If a conservative vector field is provided, the values
    of its scalar potential function at the two points are used.

    Returns (potential at position 2) - (potential at position 1)

    Parameters
    ==========

    field : Vector/sympyfiable
        The field to calculate wrt

    frame : ReferenceFrame
        The frame to do the calculations in

    point1 : Point
        The initial Point in given frame

    position2 : Point
        The second Point in the given frame

    origin : Point
        The Point to use as reference point for position vector
        calculation

    Examples
    ========

    >>> from sympy.physics.vector import ReferenceFrame, Point
    >>> from sympy.physics.vector import scalar_potential_difference
    >>> R = ReferenceFrame('R')
    >>> O = Point('O')
    >>> P = O.locatenew('P', R[0]*R.x + R[1]*R.y + R[2]*R.z)
    >>> vectfield = 4*R[0]*R[1]*R.x + 2*R[0]**2*R.y
    >>> scalar_potential_difference(vectfield, R, O, P, O)
    2*R_x**2*R_y
    >>> Q = O.locatenew('O', 3*R.x + R.y + 2*R.z)
    >>> scalar_potential_difference(vectfield, R, P, Q, O)
    -2*R_x**2*R_y + 18

    Tr   )	r   
isinstancer   r   r   pos_fromr&   r   subs)r.   r   point1point2origin	scalar_fn	position1	position2
subs_dict1
subs_dict2r(   r   s               r    r   r      s    ^ %   $UE22		 	//$GGGI//$GGGIJJ%   0 01 uuY//
58 uuY//
58>>*%%	z(B(BBBr!   N)sympy.core.functionr   sympy.core.singletonr   sympy.integrals.integralsr   sympy.physics.vectorr   r   sympy.physics.vector.framer   sympy.physics.vector.vectorr	   __all__r
   r   r   r   r   r   r    r!   r    <module>rJ      s   $ $ $ $ $ $ " " " " " " / / / / / / 0 0 0 0 0 0 0 0 3 3 3 3 3 3 5 5 5 5 5 5* * *
) ) )X( ( (V" " "J6 6 6>9 9 9>/ / /d?C ?C ?C ?C ?Cr!   