ó
9­\c           @   sl  d  d l  Z  d  d l m Z d  d l m Z m Z m Z d  d l m Z d  d l	 m
 Z
 m Z m Z m Z m Z m Z d  d l m Z d  d l m Z d  d l m Z d  d	 l m Z m Z d
 „  Z d d „ Z d „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e  d „ Z! d e  d „ Z" d e  d „ Z# d e f d „  ƒ  YZ$ d „  Z% d S(   iÿÿÿÿN(   t   Expr(   t   sympifyt   St   preorder_traversal(   t
   CoordSys3D(   t   Vectort	   VectorMult	   VectorAddt   Crosst   Dott   dot(   t
   BaseScalar(   t   SymPyDeprecationWarning(   t
   Derivative(   t   Addt   Mulc         C   s\   t  |  ƒ } t g  ƒ } x7 | D]/ } t | t ƒ r | j | ƒ | j ƒ  q q Wt | ƒ S(   N(   R   t   sett
   isinstanceR   t   addt   skipt	   frozenset(   t   exprt   gt   rett   i(    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pyt   _get_coord_systems   s    c      	   C   s>   | d	 k	 r4 t d d d d d d d d ƒ j ƒ  n  t |  ƒ S(
   s[   
    expr : expression
        The coordinate system is extracted from this parameter.
    t   features   coord_sys parametert
   useinsteads   do not use itt   deprecated_since_versions   1.1t   issueiT2  N(   t   NoneR   t   warnR   (   R   t	   coord_sys(    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pyt   _get_coord_sys_from_expr   s    c         C   sL   t  j d „  ƒ } x' |  j D] } | t | ƒ c | 9<q Wt | j ƒ  ƒ S(   Nc           S   s   t  j S(   N(   R   t   One(    (    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pyt   <lambda>)   t    (   t   collectionst   defaultdictt   argsR   t   listt   values(   R   t   dR   (    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pyt   _split_mul_args_wrt_coordsys(   s    t   Gradientc           B   s    e  Z d  Z d „  Z d „  Z RS(   sß   
    Represents unevaluated Gradient.

    Examples
    ========

    >>> from sympy.vector import CoordSys3D, Gradient
    >>> R = CoordSys3D('R')
    >>> s = R.x*R.y*R.z
    >>> Gradient(s)
    Gradient(R.x*R.y*R.z)

    c         C   s+   t  | ƒ } t j |  | ƒ } | | _ | S(   N(   R   R    t   __new__t   _expr(   t   clsR   t   obj(    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pyR-   >   s    	c         K   s   t  |  j d t ƒS(   Nt   doit(   t   gradientR.   t   True(   t   selft   kwargs(    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pyR1   D   s    (   t   __name__t
   __module__t   __doc__R-   R1   (    (    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pyR,   /   s   	t
   Divergencec           B   s    e  Z d  Z d „  Z d „  Z RS(   s  
    Represents unevaluated Divergence.

    Examples
    ========

    >>> from sympy.vector import CoordSys3D, Divergence
    >>> R = CoordSys3D('R')
    >>> v = R.y*R.z*R.i + R.x*R.z*R.j + R.x*R.y*R.k
    >>> Divergence(v)
    Divergence(R.y*R.z*R.i + R.x*R.z*R.j + R.x*R.y*R.k)

    c         C   s+   t  | ƒ } t j |  | ƒ } | | _ | S(   N(   R   R    R-   R.   (   R/   R   R0   (    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pyR-   W   s    	c         K   s   t  |  j d t ƒS(   NR1   (   t
   divergenceR.   R3   (   R4   R5   (    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pyR1   ]   s    (   R6   R7   R8   R-   R1   (    (    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pyR9   H   s   	t   Curlc           B   s    e  Z d  Z d „  Z d „  Z RS(   s  
    Represents unevaluated Curl.

    Examples
    ========

    >>> from sympy.vector import CoordSys3D, Curl
    >>> R = CoordSys3D('R')
    >>> v = R.y*R.z*R.i + R.x*R.z*R.j + R.x*R.y*R.k
    >>> Curl(v)
    Curl(R.y*R.z*R.i + R.x*R.z*R.j + R.x*R.y*R.k)

    c         C   s+   t  | ƒ } t j |  | ƒ } | | _ | S(   N(   R   R    R-   R.   (   R/   R   R0   (    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pyR-   p   s    	c         K   s   t  |  j d t ƒS(   NR1   (   t   curlR.   R3   (   R4   R5   (    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pyR1   v   s    (   R6   R7   R8   R-   R1   (    (    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pyR;   a   s   	c            sï  t  |  | ƒ } t | ƒ d k r( t j St | ƒ d k rqt t | ƒ ƒ } | j ƒ  \ } } } | j ƒ  \ } } } | j ƒ  \ }	 }
 } |  j	 | ƒ } |  j	 | ƒ } |  j	 | ƒ } t j } | t
 | | | ƒ t
 | |
 | ƒ | |
 | 7} | t
 | |	 | ƒ t
 | | | ƒ | |	 | 7} | t
 | |
 | ƒ t
 | |	 | ƒ | |
 |	 7} ˆ  rm| j ƒ  S| St |  t t f ƒ rd d l m } yA t t | ƒ ƒ } g  |  j D] } | | | d t ƒ^ qµ} Wn t k
 ró|  j } n Xt j ‡  f d †  | Dƒ ƒ St |  t t f ƒ r½g  |  j D]$ } t | t t t f ƒ r0| ^ q0d } t j d „  |  j Dƒ ƒ } t t | ƒ | ƒ j ƒ  | t | d ˆ  ƒ} ˆ  r¹| j ƒ  S| St |  t t t f ƒ rßt |  ƒ St |  ƒ ‚ d	 S(
   sì  
    Returns the curl of a vector field computed wrt the base scalars
    of the given coordinate system.

    Parameters
    ==========

    vect : Vector
        The vector operand

    coord_sys : CoordSys3D
        The coordinate system to calculate the gradient in.
        Deprecated since version 1.1

    doit : bool
        If True, the result is returned after calling .doit() on
        each component. Else, the returned expression contains
        Derivative instances

    Examples
    ========

    >>> from sympy.vector import CoordSys3D, curl
    >>> R = CoordSys3D('R')
    >>> v1 = R.y*R.z*R.i + R.x*R.z*R.j + R.x*R.y*R.k
    >>> curl(v1)
    0
    >>> v2 = R.x*R.y*R.z*R.i
    >>> curl(v2)
    R.x*R.y*R.j + (-R.x*R.z)*R.k

    i    i   iÿÿÿÿ(   t   expresst	   variablesc         3   s!   |  ] } t  | d  ˆ  ƒVq d S(   R1   N(   R<   (   t   .0R   (   R1   (    s5   lib/python2.7/site-packages/sympy/vector/operators.pys	   <genexpr>»   s    c         s   s-   |  ]# } t  | t t t f ƒ s | Vq d  S(   N(   R   R   R   R,   (   R?   R   (    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pys	   <genexpr>¾   s    R1   N(   R!   t   lenR   t   zerot   nextt   itert   base_vectorst   base_scalarst   lame_coefficientsR
   R   R1   R   R   R   t   sympy.vectorR=   R'   R3   t
   ValueErrort   fromiterR   R   R   R,   R2   R<   R;   (   t   vectR    R1   R   t   jt   kt   xt   yt   zt   h1t   h2t   h3t   vectxt   vectyt   vectzt   outvecR=   t   csR'   t   vectort   scalart   res(    (   R1   s5   lib/python2.7/site-packages/sympy/vector/operators.pyR<   z   sN    "	111
/8/

c            sZ  t  |  | ƒ } t | ƒ d k r( t j St | ƒ d k rMt |  t t t f ƒ r\ t |  ƒ St	 t
 | ƒ ƒ } | j ƒ  \ } } } | j ƒ  \ } } } | j ƒ  \ }	 }
 } t |  j | ƒ | |
 | ƒ |	 |
 | } t |  j | ƒ | | |	 ƒ |	 |
 | } t |  j | ƒ | |	 |
 ƒ |	 |
 | } | | | } ˆ  rI| j ƒ  S| St |  t t f ƒ r‚t j ‡  f d †  |  j Dƒ ƒ St |  t t f ƒ r(g  |  j D]$ } t | t t t f ƒ r¡| ^ q¡d } t j d „  |  j Dƒ ƒ } t | t | ƒ ƒ | t | d ˆ  ƒ} ˆ  r$| j ƒ  S| St |  t t t f ƒ rJt |  ƒ St |  ƒ ‚ d S(   sû  
    Returns the divergence of a vector field computed wrt the base
    scalars of the given coordinate system.

    Parameters
    ==========

    vector : Vector
        The vector operand

    coord_sys : CoordSys3D
        The coordinate system to calculate the gradient in
        Deprecated since version 1.1

    doit : bool
        If True, the result is returned after calling .doit() on
        each component. Else, the returned expression contains
        Derivative instances

    Examples
    ========

    >>> from sympy.vector import CoordSys3D, divergence
    >>> R = CoordSys3D('R')
    >>> v1 = R.x*R.y*R.z * (R.i+R.j+R.k)

    >>> divergence(v1)
    R.x*R.y + R.x*R.z + R.y*R.z
    >>> v2 = 2*R.y*R.z*R.j
    >>> divergence(v2)
    2*R.z

    i    i   c         3   s!   |  ] } t  | d  ˆ  ƒVq d S(   R1   N(   R:   (   R?   R   (   R1   (    s5   lib/python2.7/site-packages/sympy/vector/operators.pys	   <genexpr>  s    c         s   s-   |  ]# } t  | t t t f ƒ s | Vq d  S(   N(   R   R   R   R,   (   R?   R   (    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pys	   <genexpr>  s    R1   N(   R!   R@   R   t   ZeroR   R   R;   R,   R9   RB   RC   RD   RE   RF   t   _diff_conditionalR
   R1   R   R   RI   R'   R   R   R   R	   R2   R:   (   RJ   R    R1   R   RK   RL   RM   RN   RO   RP   RQ   RR   t   vxt   vyt   vzRZ   RX   RY   (    (   R1   s5   lib/python2.7/site-packages/sympy/vector/operators.pyR:   É   s@    "

 8)

c            s{  t  ˆ  | ƒ } t | ƒ d k r( t j St | ƒ d k r t t | ƒ ƒ } | j ƒ  \ } } } | j ƒ  \ } } } | j ƒ  \ }	 }
 } t	 ˆ  |	 ƒ | } t	 ˆ  |
 ƒ | } t	 ˆ  | ƒ | } | rè | | | | | | j
 ƒ  S| | | | | | St ˆ  t t f ƒ r/t j d „  ˆ  j Dƒ ƒ St ˆ  t t f ƒ rmt ˆ  ƒ } t j ‡  f d †  | Dƒ ƒ St ˆ  ƒ Sd S(   s/  
    Returns the vector gradient of a scalar field computed wrt the
    base scalars of the given coordinate system.

    Parameters
    ==========

    scalar_field : SymPy Expr
        The scalar field to compute the gradient of

    coord_sys : CoordSys3D
        The coordinate system to calculate the gradient in
        Deprecated since version 1.1

    doit : bool
        If True, the result is returned after calling .doit() on
        each component. Else, the returned expression contains
        Derivative instances

    Examples
    ========

    >>> from sympy.vector import CoordSys3D, gradient
    >>> R = CoordSys3D('R')
    >>> s1 = R.x*R.y*R.z
    >>> gradient(s1)
    R.y*R.z*R.i + R.x*R.z*R.j + R.x*R.y*R.k
    >>> s2 = 5*R.x**2*R.z
    >>> gradient(s2)
    10*R.x*R.z*R.i + 5*R.x**2*R.k

    i    i   c         s   s   |  ] } t  | ƒ Vq d  S(   N(   R2   (   R?   R   (    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pys	   <genexpr>C  s    c         3   s#   |  ] } ˆ  | t  | ƒ Vq d  S(   N(   R2   (   R?   R   (   t   scalar_field(    s5   lib/python2.7/site-packages/sympy/vector/operators.pys	   <genexpr>F  s    N(   R!   R@   R   RA   RB   RC   RF   RD   RE   R   R1   R   R   R   RI   R'   R   R   R+   R,   (   R`   R    R1   RP   RQ   RR   R   RK   RL   RM   RN   RO   R]   R^   R_   t   s(    (   R`   s5   lib/python2.7/site-packages/sympy/vector/operators.pyR2     s(    !t	   Laplacianc           B   s    e  Z d  Z d „  Z d „  Z RS(   sù   
    Represents unevaluated Laplacian.

    Examples
    ========

    >>> from sympy.vector import CoordSys3D, Laplacian
    >>> R = CoordSys3D('R')
    >>> v = 3*R.x**3*R.y**2*R.z**3
    >>> Laplacian(v)
    Laplacian(3*R.x**3*R.y**2*R.z**3)

    c         C   s+   t  | ƒ } t j |  | ƒ } | | _ | S(   N(   R   R    R-   R.   (   R/   R   R0   (    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pyR-   Y  s    	c         K   s   d d l  m } | |  j ƒ S(   Niÿÿÿÿ(   t	   laplacian(   t   sympy.vector.functionsRc   R.   (   R4   R5   Rc   (    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pyR1   _  s    (   R6   R7   R8   R-   R1   (    (    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pyRb   J  s   	c         C   s\   d d l  m } | |  | j d t ƒ} | | j t ƒ k rR t | | | | ƒ St d ƒ S(   s¿   
    First re-expresses expr in the system that base_scalar belongs to.
    If base_scalar appears in the re-expressed form, differentiates
    it wrt base_scalar.
    Else, returns S(0)
    iÿÿÿÿ(   R=   R>   i    (   Rd   R=   t   systemR3   t   atomsR   R   R   (   R   t   base_scalart   coeff_1t   coeff_2R=   t   new_expr(    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pyR\   d  s
    (&   R%   t   sympy.core.exprR    t
   sympy.coreR   R   R   t   sympy.vector.coordsysrectR   t   sympy.vector.vectorR   R   R   R   R	   R
   t   sympy.vector.scalarR   t   sympy.utilities.exceptionsR   t   sympy.core.functionR   t   sympyR   R   R   R   R!   R+   R,   R9   R;   R3   R<   R:   R2   Rb   R\   (    (    (    s5   lib/python2.7/site-packages/sympy/vector/operators.pyt   <module>   s&   .	
	OG: