ó
¡¼™\c           @  s”   d  d l  m Z m Z d  d l m Z m Z m Z m Z m Z m	 Z	 d  d l
 m Z d d „ Z d d „ Z d d „ Z e d e	 d ƒ d	 „ Z d
 S(   iÿÿÿÿ(   t   print_functiont   division(   t	   factorialt   sqrtt   expt   St   assoc_laguerret   Float(   t   Ynmi   c         C  s×   t  |  ƒ t  | ƒ t  | ƒ t  | ƒ f \ }  } } } |  | d } d | } d | |  | } t t  d ƒ |  | d t | ƒ d |  t |  | ƒ ƒ } | | | t | d | d | ƒ j ƒ  t | d ƒ S(   s!  
    Returns the Hydrogen radial wavefunction R_{nl}.

    n, l
        quantum numbers 'n' and 'l'
    r
        radial coordinate
    Z
        atomic number (1 for Hydrogen, 2 for Helium, ...)

    Everything is in Hartree atomic units.

    Examples
    ========

    >>> from sympy.physics.hydrogen import R_nl
    >>> from sympy import var
    >>> var("r Z")
    (r, Z)
    >>> R_nl(1, 0, r, Z)
    2*sqrt(Z**3)*exp(-Z*r)
    >>> R_nl(2, 0, r, Z)
    sqrt(2)*(-Z*r + 2)*sqrt(Z**3)*exp(-Z*r/2)/4
    >>> R_nl(2, 1, r, Z)
    sqrt(6)*Z*r*sqrt(Z**3)*exp(-Z*r/2)/12

    For Hydrogen atom, you can just use the default value of Z=1:

    >>> R_nl(1, 0, r)
    2*exp(-r)
    >>> R_nl(2, 0, r)
    sqrt(2)*(2 - r)*exp(-r/2)/4
    >>> R_nl(3, 0, r)
    2*sqrt(3)*(2*r**2/9 - 2*r + 3)*exp(-r/3)/27

    For Silver atom, you would use Z=47:

    >>> R_nl(1, 0, r, Z=47)
    94*sqrt(47)*exp(-47*r)
    >>> R_nl(2, 0, r, Z=47)
    47*sqrt(94)*(2 - 47*r)*exp(-47*r/2)/4
    >>> R_nl(3, 0, r, Z=47)
    94*sqrt(141)*(4418*r**2/9 - 94*r + 3)*exp(-47*r/3)/27

    The normalization of the radial wavefunction is:

    >>> from sympy import integrate, oo
    >>> integrate(R_nl(1, 0, r)**2 * r**2, (r, 0, oo))
    1
    >>> integrate(R_nl(2, 0, r)**2 * r**2, (r, 0, oo))
    1
    >>> integrate(R_nl(2, 1, r)**2 * r**2, (r, 0, oo))
    1

    It holds for any atomic number:

    >>> integrate(R_nl(1, 0, r, Z=2)**2 * r**2, (r, 0, oo))
    1
    >>> integrate(R_nl(2, 0, r, Z=3)**2 * r**2, (r, 0, oo))
    1
    >>> integrate(R_nl(2, 1, r, Z=4)**2 * r**2, (r, 0, oo))
    1

    i   i   i   (   R   R   R   R   t   expandR   (   t   nt   lt   rt   Zt   n_rt   at   r0t   C(    (    s5   lib/python2.7/site-packages/sympy/physics/hydrogen.pyt   R_nl   s    B6
>c         C  s   t  |  ƒ t  | ƒ t  | ƒ t  | ƒ t  | ƒ t  | ƒ t  | ƒ f \ }  } } } } } } |  j r~ |  d k  r~ t d ƒ ‚ n  | j r£ |  | k r£ t d ƒ ‚ n  | j rÎ t | ƒ | k rÎ t d ƒ ‚ n  t |  | | | ƒ t | | | | ƒ j d t ƒ S(   s  
    Returns the Hydrogen wave function psi_{nlm}. It's the product of
    the radial wavefunction R_{nl} and the spherical harmonic Y_{l}^{m}.

    n, l, m
        quantum numbers 'n', 'l' and 'm'
    r
        radial coordinate
    phi
        azimuthal angle
    theta
        polar angle
    Z
        atomic number (1 for Hydrogen, 2 for Helium, ...)

    Everything is in Hartree atomic units.

    Examples
    ========

    >>> from sympy.physics.hydrogen import Psi_nlm
    >>> from sympy import Symbol
    >>> r=Symbol("r", real=True, positive=True)
    >>> phi=Symbol("phi", real=True)
    >>> theta=Symbol("theta", real=True)
    >>> Z=Symbol("Z", positive=True, integer=True, nonzero=True)
    >>> Psi_nlm(1,0,0,r,phi,theta,Z)
    Z**(3/2)*exp(-Z*r)/sqrt(pi)
    >>> Psi_nlm(2,1,1,r,phi,theta,Z)
    -Z**(5/2)*r*exp(I*phi)*exp(-Z*r/2)*sin(theta)/(8*sqrt(pi))

    Integrating the absolute square of a hydrogen wavefunction psi_{nlm}
    over the whole space leads 1.

    The normalization of the hydrogen wavefunctions Psi_nlm is:

    >>> from sympy import integrate, conjugate, pi, oo, sin
    >>> wf=Psi_nlm(2,1,1,r,phi,theta,Z)
    >>> abs_sqrd=wf*conjugate(wf)
    >>> jacobi=r**2*sin(theta)
    >>> integrate(abs_sqrd*jacobi, (r,0,oo), (phi,0,2*pi), (theta,0,pi))
    1
    i   s   'n' must be positive integers   'n' must be greater than 'l's   |'m'| must be less or equal 'l't   func(   R   t
   is_integert
   ValueErrort   absR   R   R	   t   True(   R
   R   t   mR   t   phit   thetaR   (    (    s5   lib/python2.7/site-packages/sympy/physics/hydrogen.pyt   Psi_nlmV   s    .Zc         C  sR   t  |  ƒ t  | ƒ }  } |  j r= |  d k  r= t d ƒ ‚ n  | d d |  d S(   sŒ  
    Returns the energy of the state (n, l) in Hartree atomic units.

    The energy doesn't depend on "l".

    Examples
    ========

    >>> from sympy import var
    >>> from sympy.physics.hydrogen import E_nl
    >>> var("n Z")
    (n, Z)
    >>> E_nl(n, Z)
    -Z**2/(2*n**2)
    >>> E_nl(1)
    -1/2
    >>> E_nl(2)
    -1/8
    >>> E_nl(3)
    -1/18
    >>> E_nl(3, 47)
    -2209/18

    i   s   'n' must be positive integeri   (   R   R   R   (   R
   R   (    (    s5   lib/python2.7/site-packages/sympy/physics/hydrogen.pyt   E_nl‘   s    s   137.035999037c         C  sÞ   | d k s t  d ƒ ‚ n  |  | k s6 t  d ƒ ‚ n  | d k r] | t k r] t  d ƒ ‚ n  | rq | d } n | } t | ƒ } t | d | d | d ƒ } | d t d | d |  | | d | d ƒ | d S(   s  
    Returns the relativistic energy of the state (n, l, spin) in Hartree atomic
    units.

    The energy is calculated from the Dirac equation. The rest mass energy is
    *not* included.

    n, l
        quantum numbers 'n' and 'l'
    spin_up
        True if the electron spin is up (default), otherwise down
    Z
        atomic number (1 for Hydrogen, 2 for Helium, ...)
    c
        speed of light in atomic units. Default value is 137.035999037,
        taken from: http://arxiv.org/abs/1012.3627

    Examples
    ========

    >>> from sympy.physics.hydrogen import E_nl_dirac
    >>> E_nl_dirac(1, 0)
    -0.500006656595360

    >>> E_nl_dirac(2, 0)
    -0.125002080189006
    >>> E_nl_dirac(2, 1)
    -0.125000416028342
    >>> E_nl_dirac(2, 1, False)
    -0.125002080189006

    >>> E_nl_dirac(3, 0)
    -0.0555562951740285
    >>> E_nl_dirac(3, 1)
    -0.0555558020932949
    >>> E_nl_dirac(3, 1, False)
    -0.0555562951740285
    >>> E_nl_dirac(3, 2)
    -0.0555556377366884
    >>> E_nl_dirac(3, 2, False)
    -0.0555558020932949

    i    s   'l' must be positive or zeros   'n' must be greater than 'l's   Spin must be up for l==0.i   i   (   R   t   FalseR   R   (   R
   R   t   spin_upR   t   ct   skappat   beta(    (    s5   lib/python2.7/site-packages/sympy/physics/hydrogen.pyt
   E_nl_dirac°   s    , N(   t
   __future__R    R   t   sympyR   R   R   R   R   R   t+   sympy.functions.special.spherical_harmonicsR   R   R   R   R   R"   (    (    (    s5   lib/python2.7/site-packages/sympy/physics/hydrogen.pyt   <module>   s   .O;