o
    8Va                     @   s   d Z ddlmZmZmZmZ dgZddlmZm	Z	m
Z
 ddlmZmZmZ eee Zeed ed  eed   Zeee ed ed   ZG d	d deZd
S )z
**Contains**

* Medium
    )secondmeterkilogramampereMedium)Symbolsympifysqrt)speed_of_lightu0e0         c                       s   e Zd ZdZd fdd	Zedd Zedd Zed	d
 Zedd Z	edd Z
dd Zdd Zdd Zdd Zdd Z  ZS )r   aW  
    This class represents an optical medium. The prime reason to implement this is
    to facilitate refraction, Fermat's principle, etc.

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

    An optical medium is a material through which electromagnetic waves propagate.
    The permittivity and permeability of the medium define how electromagnetic
    waves propagate in it.


    Parameters
    ==========

    name: string
        The display name of the Medium.

    permittivity: Sympifyable
        Electric permittivity of the space.

    permeability: Sympifyable
        Magnetic permeability of the space.

    n: Sympifyable
        Index of refraction of the medium.


    Examples
    ========

    >>> from sympy.abc import epsilon, mu
    >>> from sympy.physics.optics import Medium
    >>> m1 = Medium('m1')
    >>> m2 = Medium('m2', epsilon, mu)
    >>> m1.intrinsic_impedance
    149896229*pi*kilogram*meter**2/(1250000*ampere**2*second**3)
    >>> m2.refractive_index
    299792458*meter*sqrt(epsilon*mu)/second


    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Optical_medium

    Nc                    s  t  | |}t||_t||_t||_|d ur`|d ur.|d u r.|d td |j  |_|d urB|d u rB|d td |j  |_|d ur^|d ur^t|tt|j|j   dkr^t	d|S |d urs|d urstt||  |_|S |d u r|d u rt
|_t|_|S )Nr   gư>zValues are not consistent.)super__new__r   _permittivity_permeability_ncabsr	   
ValueError_e0mksa_u0mksa)clsnamepermittivitypermeabilitynobj	__class__ =/usr/lib/python3/dist-packages/sympy/physics/optics/medium.pyr   E   s(   


 zMedium.__new__c                 C   s   t | j| j S )a  
        Returns intrinsic impedance of the medium.

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

        The intrinsic impedance of a medium is the ratio of the
        transverse components of the electric and magnetic fields
        of the electromagnetic wave travelling in the medium.
        In a region with no electrical conductivity it simplifies
        to the square root of ratio of magnetic permeability to
        electric permittivity.

        Examples
        ========

        >>> from sympy.physics.optics import Medium
        >>> m = Medium('m')
        >>> m.intrinsic_impedance
        149896229*pi*kilogram*meter**2/(1250000*ampere**2*second**3)

        )r	   r   r   selfr"   r"   r#   intrinsic_impedanceY   s   zMedium.intrinsic_impedancec                 C   s2   | j dur| jdurdt| j | j  S t| j S )aM  
        Returns speed of the electromagnetic wave travelling in the medium.

        Examples
        ========

        >>> from sympy.physics.optics import Medium
        >>> m = Medium('m')
        >>> m.speed
        299792458*meter/second
        >>> m2 = Medium('m2', n=1)
        >>> m.speed == m2.speed
        True

        N   )r   r   r	   r   r   r$   r"   r"   r#   speeds   s   
zMedium.speedc                 C   s
   t | j S )z
        Returns refractive index of the medium.

        Examples
        ========

        >>> from sympy.physics.optics import Medium
        >>> m = Medium('m')
        >>> m.refractive_index
        1

        )r   r(   r$   r"   r"   r#   refractive_index   s   
zMedium.refractive_indexc                 C      | j S )a  
        Returns electric permittivity of the medium.

        Examples
        ========

        >>> from sympy.physics.optics import Medium
        >>> m = Medium('m')
        >>> m.permittivity
        625000*ampere**2*second**4/(22468879468420441*pi*kilogram*meter**3)

        )r   r$   r"   r"   r#   r         zMedium.permittivityc                 C   r*   )a  
        Returns magnetic permeability of the medium.

        Examples
        ========

        >>> from sympy.physics.optics import Medium
        >>> m = Medium('m')
        >>> m.permeability
        pi*kilogram*meter/(2500000*ampere**2*second**2)

        )r   r$   r"   r"   r#   r      r+   zMedium.permeabilityc                 C   s.   ddl m} t| jd || j| j| jg S )Nr   )sstrz: )Zsympy.printingr,   type__name__r   r   r   )r%   r,   r"   r"   r#   __str__   s   zMedium.__str__c                 C   s   | j |j k S )zC
        Compares based on refractive index of the medium.
        r)   r%   otherr"   r"   r#   __lt__   s   zMedium.__lt__c                 C   s
   | |k  S Nr"   r1   r"   r"   r#   __gt__      
zMedium.__gt__c                 C   s   | j |j kS r4   r0   r1   r"   r"   r#   __eq__   s   zMedium.__eq__c                 C   s
   | |k S r4   r"   r1   r"   r"   r#   __ne__   r6   zMedium.__ne__)NNN)r.   
__module____qualname____doc__r   propertyr&   r(   r)   r   r   r/   r3   r5   r7   r8   __classcell__r"   r"   r    r#   r      s$    0




N)r;   Zsympy.physics.unitsr   r   r   r   __all__Zsympyr   r   r	   r
   r   r   Z
convert_tor   r   r   r   r"   r"   r"   r#   <module>   s    "