
    G8c3                     Z    d Z ddlZddlmZ ddlmZ ddlZ G d d      Z G d de      Z	y)	z'
Mesh refinement for triangular grids.
    N)_api)Triangulationc                       e Zd ZdZd Zy)
TriRefinera{  
    Abstract base class for classes implementing mesh refinement.

    A TriRefiner encapsulates a Triangulation object and provides tools for
    mesh refinement and interpolation.

    Derived classes must implement:

    - ``refine_triangulation(return_tri_index=False, **kwargs)`` , where
      the optional keyword arguments *kwargs* are defined in each
      TriRefiner concrete implementation, and which returns:

      - a refined triangulation,
      - optionally (depending on *return_tri_index*), for each
        point of the refined triangulation: the index of
        the initial triangulation triangle to which it belongs.

    - ``refine_field(z, triinterpolator=None, **kwargs)``, where:

      - *z* array of field values (to refine) defined at the base
        triangulation nodes,
      - *triinterpolator* is an optional `~matplotlib.tri.TriInterpolator`,
      - the other optional keyword arguments *kwargs* are defined in
        each TriRefiner concrete implementation;

      and which returns (as a tuple) a refined triangular mesh and the
      interpolated values of the field at the refined triangulation nodes.
    c                 H    t        j                  t        |       || _        y )N)triangulation)r   check_isinstancer   _triangulation)selfr   s     :/usr/lib/python3/dist-packages/matplotlib/tri/trirefine.py__init__zTriRefiner.__init__*   s    m=I+    N)__name__
__module____qualname____doc__r    r   r   r   r      s    :,r   r   c                   D     e Zd ZdZ fdZddZddZedd       Z xZ	S )	UniformTriRefinerz
    Uniform mesh refinement by recursive subdivisions.

    Parameters
    ----------
    triangulation : `~matplotlib.tri.Triangulation`
        The encapsulated triangulation (to be refined)
    c                 $    t         |   |       y N)superr   )r   r   	__class__s     r   r   zUniformTriRefiner.__init__=   s    'r   c                    | j                   }|j                  j                  d   }t        j                  |t        j
                        }t        |      D ]  }| j                  ||      \  }} |j                  j                  d   }|j                  }|rt        j                  |dt        j
                        }	| j                   j                  }
|
-t        j                  |d      j                  dd      |	|<   ||	fS |
|   }t        j                  ||   d      j                  dd      |	||ddf   <   t        j                  ||    d      j                  dd      |	|| ddf   <   ||	fS |S )a  
        Compute an uniformly refined triangulation *refi_triangulation* of
        the encapsulated :attr:`triangulation`.

        This function refines the encapsulated triangulation by splitting each
        father triangle into 4 child sub-triangles built on the edges midside
        nodes, recursing *subdiv* times.  In the end, each triangle is hence
        divided into ``4**subdiv`` child triangles.

        Parameters
        ----------
        return_tri_index : bool, default: False
            Whether an index table indicating the father triangle index of each
            point is returned.
        subdiv : int, default: 3
            Recursion level for the subdivision.
            Each triangle is divided into ``4**subdiv`` child triangles;
            hence, the default results in 64 refined subtriangles for each
            triangle of the initial triangulation.

        Returns
        -------
        refi_triangulation : `~matplotlib.tri.Triangulation`
            The refined triangulation.
        found_index : int array
            Index of the initial triangulation containing triangle, for each
            point of *refi_triangulation*.
            Returned only if *return_tri_index* is set to True.
        r   dtypeN   )r
   	trianglesshapenparangeint32range_refine_triangulation_oncexfullmaskrepeatreshape)r   return_tri_indexsubdivrefi_triangulationntri	ancestors_	refi_nptsrefi_trianglesfound_indextri_maskancestor_masks               r   refine_triangulationz&UniformTriRefiner.refine_triangulation@   s   < "00!++11!4 IId"((3	v 	/A,0,K,K"I-/)		/ '((..q1	+55  '')Rrxx@K**//H.0ii	89/;;B72q> N+ &{22 !) 3 "		)M*B*+!--4WR^ N=!+;<  !#		)]N*C*+!--4WR^ NM>1+<=  &{22%%r   c                 H   |+t         j                  j                  | j                  |      }n1t	        j
                  t         j                  j                  |       |}| j                  |d      \  }}|j                  |j                  |j                  |      d   }||fS )a  
        Refine a field defined on the encapsulated triangulation.

        Parameters
        ----------
        z : (npoints,) array-like
            Values of the field to refine, defined at the nodes of the
            encapsulated triangulation. (``n_points`` is the number of points
            in the initial triangulation)
        triinterpolator : `~matplotlib.tri.TriInterpolator`, optional
            Interpolator used for field interpolation. If not specified,
            a `~matplotlib.tri.CubicTriInterpolator` will be used.
        subdiv : int, default: 3
            Recursion level for the subdivision.
            Each triangle is divided into ``4**subdiv`` child triangles.

        Returns
        -------
        refi_tri : `~matplotlib.tri.Triangulation`
             The returned refined triangulation.
        refi_z : 1D array of length: *refi_tri* node count.
             The returned interpolated field (at *refi_tri* nodes).
        )triinterpolatorT)r,   r+   )	tri_indexr   )
matplotlibtriCubicTriInterpolatorr
   r   r	   TriInterpolatorr6   _interpolate_multikeysr&   y)r   zr8   r,   interprefi_trir3   refi_zs           r   refine_fieldzUniformTriRefiner.refine_field   s    0 "^^88##Q(F !!*.."@"@2AC$F $ 9 9D !: !2+..JJ

k / ;;<>r   c           
      x	   | j                   }| j                  }| j                  }| j                  }t	        j
                  |      d   }t	        j
                  |      d   }|ot	        j                  |      }t	        j
                  |      |fk7  rAt        dj                  t	        j
                  |      t	        j
                  |                  t	        j                  |dk(        }d|z  |z   dz  }	||	z   }
t	        j                  |
      }t	        j                  |
      }||d| ||d| t	        j                  t	        j                  |t        j                        d      }t	        j                  t	        j                  dt        j                        |      }|||f   }||kD  }||   }||   }||||f      ||||dz   dz  f      z   d	z  }||||f      ||||dz   dz  f      z   d	z  }|||d |||d |}t	        j                  |dgt        j                        }|}t!        d      D ]X  }||k(  }t	        j                  |      }||   }t	        j                  |t        j                        |z   |dd|f   |<   ||z  }Z t	        j"                  |      }||   }||   }t	        j$                  ||ddf   t	        j&                  |t	        j(                  dt        j                              z
        }t	        j*                  |d
      } ||   }!||| f   |||!f<   t	        j                  |dz  dgt        j                        }"t	        j,                  |dddf   |dddf   |dddf   g      j.                  |"dddddf<   t	        j,                  |dddf   |dddf   |dddf   g      j.                  |"dddddf<   t	        j,                  |dddf   |dddf   |dddf   g      j.                  |"dddddf<   t	        j,                  |dddf   |dddf   |dddf   g      j.                  |"dddddf<   t1        |||"      }#| j2                  /|#j5                  t	        j                  | j2                  d             ||#S |#t	        j                  |d      fS )a  
        Refine a `.Triangulation` by splitting each triangle into 4
        child-masked_triangles built on the edges midside nodes.

        Masked triangles, if present, are also split, but their children
        returned masked.

        If *ancestors* is not provided, returns only a new triangulation:
        child_triangulation.

        If the array-like key table *ancestor* is given, it shall be of shape
        (ntri,) where ntri is the number of *triangulation* masked_triangles.
        In this case, the function returns
        (child_triangulation, child_ancestors)
        child_ancestors is defined so that the 4 child masked_triangles share
        the same index as their father: child_ancestors.shape = (4 * ntri,).
        r   NzYIncompatible shapes provide for triangulation.masked_triangles and ancestors: {0} and {1}r   r      r      g      ?)axis   )r&   r?   	neighborsr   r!   r    asarray
ValueErrorformatsumzerostiler"   r#   r)   emptyr$   logical_notabsouteronesargminvstackTr   r(   set_mask)$r   r/   r&   r?   rJ   r   nptsr.   borders	added_ptsr1   refi_xrefi_y
edge_elemsedge_apexesedge_neighborsmask_mastersmastersapex_mastersx_addy_addnew_pt_cornernew_pt_midsidecum_sumimidmask_st_locn_masters_locelem_masters_locmask_slavesslavesslaves_masters
diff_tableslave_masters_apexslaves_apexchild_triangleschild_triangulations$                                       r   r%   z,UniformTriRefiner._refine_triangulation_once   s   ( OOOO "++	!++	xx{1~xx	"1% 

9-Ixx	"tg- CCI6+RXXi-@DBC C &&b)tVg%!+	9$	)$)$ uu WWRYYt288<a@
ii		!288 <dC":{#:;"^3 \*"<09Wl2349W|A~&::;<=@CD9Wl2349W|A~&::;<=@CDtutu " 4)288<!H 	%D</KFF;/M&{38:		RXX9/1899N1d7#$45}$G	% nn\2K('4VVIna&78HHVRWWQbhh-GHI J
YYz:!+..<../0v{*+ ((DFA;bhh?#%99!Q$1!51a4 ." $##$1 	1a  $&99!Q$1!51a4 ." $##$1 	1a  $&99!Q$1!51a4 ." $##$1 	1a  $&991a4 .A"61a4 ." $##$1 	1a  ,FFOL )((=3E3Eq)IJ&&&		)Q(???r   )Fr   )Nr   r   )
r   r   r   r   r   r6   rD   staticmethodr%   __classcell__)r   s   @r   r   r   /   s2    (C&J$ L G@ G@r   r   )
r   numpyr!   r:   r   matplotlib.tri.triangulationr   matplotlib.tri.triinterpolater   r   r   r   r   <module>r{      s3      6 $ ,  ,FD@
 D@r   