B
    d+                 @   st   d Z ddlmZ yddlmZ W n ek
r4   Y nX dd Zdd Zd	d
 Z	dd Z
dddZdd Zdd ZdS )z Convert NumPy and MPI datatypes.   )MPI    )dtypec             C   s   t j| jS )N)r   Z	_typedictgetchar)r    r   ^/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/mpi4py/util/dtlib.py_get_datatype   s    r	   c             C   s
   t | S )N)r   Z	_typecode)datatyper   r   r   _get_typecode   s    r   c       	      C   s2  dd l }| dkr8| dkrdnd}||j}d||} | dkrH|  } t| dkr|jf|j|j|j	|j
f|j|j|j|jf|j|j|jfd	}| d t| dd   }}|d
krd|d  }}x$|| D ]}|||kr|j} qW |j}td|ft| d}d|jfd|fg}td|jft|d}|jjS )Nr   )pnPN)r   r   iuz{}{:d})FDG   )br   r   fcr   r   c_type)_type_baseS)Z_fields_)ctypesZsizeofZc_void_pformatlowerlenZc_boolZc_int8Zc_int16Zc_int32Zc_int64Zc_uint8Zc_uint16Zc_uint32Zc_uint64Zc_floatZc_doubleZc_longdoubleintr   Z_SimpleCDatatypedictZc_charZ	Structurer   offset)	typecodectkindsizemappingr   Zc_type_basefieldsstructr   r   r   _get_alignment_ctypes   s.    
r,   c             C   s   t | }|d krP| j}tjtjtjf}||krP|  }d|| }d||}|d krddl	m
} |  }ttd||dS y
t|jS  tk
r   t|S X d S )Nifcz{0}{1:d}r   )calcsizer   r   )r   combinerr   COMBINER_F90_INTEGERCOMBINER_F90_REALCOMBINER_F90_COMPLEXGet_sizeindexr   r+   r.   minmax	_np_dtype	alignment	NameErrorr,   )r
   r%   r/   combiner_f90typesizeZtypekindr.   r8   r   r   r   _get_alignment9   s$    
r<   c       
   	      s   | j r& dkrdS t| } | dkS | j}|  \}}}|gdg }}z|tjkr^|d g}|tjkrx|d }|d }|tjkr|d dkr|d ndg}|tjkr|d }|tj	kr|d }t
 fd	d
t||D S x|D ]}	|	j s|	  qW X dS )z+Dermine whether an MPI datatype is aligned.r   Textent	datatypesdisplacementscountr   stridec             3   s    | ]\}}t | | V  qd S )N)_is_aligned).0td)r$   r   r   	<genexpr>i   s   z_is_aligned.<locals>.<genexpr>N)is_predefinedr<   r/   decoder   COMBINER_RESIZEDCOMBINER_STRUCTCOMBINER_HVECTORCOMBINER_HINDEXEDCOMBINER_HINDEXED_BLOCKallzipFree)
r
   r$   r8   r/   basetype_infotypesZdisps_tpr   )r$   r   rB   Q   s4    







rB   c          	   C   sb  yt | } W n tk
r(   tdY nX | jr8td| jsFtd| j}|rg }g }g }zRx<| jD ]2}|| \}}|d || |t	| qfW t
j|||}W dx|D ]}	|	  qW X z|d| jS |  X | j}
|
r@|
\}}t	|}z6t|dkr||d S dt| }||||S |  X t| }|dkrZtd| S )	z'Convert NumPy datatype to MPI datatype.zNumPy is not availablez"NumPy datatype with object entriesz(NumPy datatype with non-native byteorderr   Nr   )r   z$cannot convert NumPy datatype to MPI)r7   r9   RuntimeErrorZ	hasobject
ValueErrorZisnativer*   namesappendfrom_numpy_dtyper   ZDatatypeZCreate_structrP   ZCreate_resizeditemsizesubdtyper    ZCreate_contiguousZCreate_subarrayr	   ZDup)r   r*   blocklengthsr?   r>   nameZftypeZfdispr
   Zmtpr\   r   shapestartsr   r   r   rZ   r   sP    





rZ   c          	      sV  dd }dd }| t jkr"td| j}|t jkrRt| }|dk	rJ||S td|  \ }} g}z|t jkr|t S |t j	krt |d }||ffS |t j
kr4t |d	 }	|d
 }
|d }|d }|
|	kstt|t|  krdks
n t|t jkr$|	ddd }	|t|	fS d}|t jkr jt jkrt |d }t j}  \}}}|   |t jkr|d }|d }|d }ttdjtt|}tt|||}|}| j}|ttt||M }||||||dS t jt jf}||krt |d }|d }|d |t jkrR j9 t }|t jkrz|dkrlndt }ttdjt|}|ffg| }fddt|D }| j}||||||dS t jt jt j t j!f}||krt dt }|d }||dd kr"|d }||dd krF|d gt| }||ddd kr` j||ddd kr|t fdd|D M }ttdjtt|}fdd|D }fd d|D }|||||d!S t j"t j#t j$f}||kr$|  | % }d"|&| }|d#||S tdW dx|D ]}|j's6|  q6W X dS )$z'Convert MPI datatype to NumPy datatype.c             S   s   t | }|dkr|S ||fS )Nr   )to_numpy_dtype)r
   r@   r   r   r   r   mpi2npy   s    zto_numpy_dtype.<locals>.mpi2npyc             S   s"   yt | S  tk
r   | S X d S )N)r7   r9   )specr   r   r   np_dtype   s    z to_numpy_dtype.<locals>.np_dtypez)cannot convert null MPI datatype to NumPyNz$cannot convert MPI datatype to NumPyr@   sizessubsizesr`   orderr   Tr=   r>   r]   r?   zf{})rX   formatsoffsetsr[   alignedblocklengthrA   r   zf{0}c                s   g | ]} | qS r   r   )rC   r   )rA   r   r   
<listcomp>  s    z"to_numpy_dtype.<locals>.<listcomp>r   c             3   s   | ]}t  |V  qd S )N)rB   )rC   rE   )rQ   r   r   rF   *  s    z!to_numpy_dtype.<locals>.<genexpr>c                s   g | ]} |ffqS r   r   )rC   blen)r   r   r   rm   ,  s    c                s   g | ]}|  qS r   r   )rC   Zdisp)rA   r   r   rm   -  s    )rX   ri   rj   rk   r-   z{0}{1:d})(r   ZDATATYPE_NULLrW   r/   ZCOMBINER_NAMEDr   rH   ZCOMBINER_DUPra   ZCOMBINER_CONTIGUOUSZCOMBINER_SUBARRAYAssertionErrorr5   r6   ZORDER_FORTRANtuplerI   rJ   rB   poprP   listmapr   ranger    r=   rN   ZCOMBINER_VECTORrK   ZCOMBINER_INDEXEDrL   ZCOMBINER_INDEXED_BLOCKrM   r0   r1   r2   r3   r4   rG   )r
   rb   rd   r/   r%   rR   rS   r>   r@   re   rf   r`   rg   rk   r]   r?   rX   ri   rj   r[   Zcombiner_vectorrl   Zcombiner_indexedr:   r;   rU   r   )rQ   r   rA   r   ra      s    



&








ra   N)r   )__doc__ r   numpyr   r7   ImportErrorr	   r   r,   r<   rB   rZ   ra   r   r   r   r   <module>   s   
!8