o
    oh!                     @   s   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d	 Zd
d Zdd Zdd Zdd Zdd Zd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                 C   s   t |  | dkrtdS t| |dd} | |j}| |j}| |j}td}|t||d t||d  |j 7 }|t||d t||d  |j 7 }|t||d t||d  |j 7 }|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outvec r   w/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/sympy/physics/vector/fieldfunctions.pyr	      s   &&&r	   c                 C   s   t |  | dkrtjS t| |dd} | |j}| |j}| |j}tj}|t||d 7 }|t||d 7 }|t||d 7 }|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   outr   r   r   r
   :   s   r
   c                 C   sJ   t | td}t| |dd} t|D ]\}}|t| || | 7 }q|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   r   r   r   r   e   s   r   c                 C   s6   | 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   r   r   r   r      s   r   c                 C   s4   | 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(   r   r   r   r      s   r   c                 C   s   t | std| tdkrtjS t| t| |dd} t|}t| 	|d |d }t
|dd D ]\}}t|||d  }| 	|| }|t|||d  7 }q4|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_diffr   r   r   r      s   r   c                 C   s   t | t| trt| |}n| }t|||dd}t|||dd}i }i }	t|D ]\}
}|||||
 < |||	||
 < q-||	|| 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   r   r   r   r      s   /
r   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   r   r   <module>   s    ,+%2