§
    ‚¬äj¢
  ã                   óˆ   — d Z ddlZddlmZ d„ Z	 ddlZ ej        d¬¦  «        d„ ¦   «         Zn# e	$ r dZY nw xY wi Z
d„ ZdS )	a   Volume from the stored atoms in one contraction. The height atoms are orthonormal on a part's layer centres
(Q, _parts.orth_basis), so the sum over the layers of a ring's area pi sum_k k (ax_k by_k - bx_k ay_k) is the same
expression in the atom vectors: V = dz * prod(scale) * pi * sum_parts sign_p |sum_k k (<ax_k, by_k> - <bx_k, ay_k>)|.
A part's rings all run one way, but not always the way its sign says (the last parts of mug ace, shoe, jogger run
reversed): hence sign_p |.| per part. Equal to the layer-centre sum of volume.py (sub=1).é    N)Úcentresc                 ó  — | j         | j        }}t          j        t	          | j        ¦  «        dz  |z  |dz   z  ¦  «        }| j        \  }}|||<   |                     t	          | j        ¦  «        d||dz   ¦  «        }t          j        d|dz
  dz  dz   ¦  «        }t          j	        d|d d …ddd d…f         |d d …ddd d…f         ¦  «        t          j	        d|d d …ddd d…f         |d d …ddd d…f         ¦  «        z
  }t          j
        d„ | j        D ¦   «         t          ¦  «        }dt          t          | j        ¦  «        d         ¦  «        z  | j        dz
  z  }	t          t          j        |t          j        ||z                       d¦  «        ¦  «        z                       ¦   «         z  |	z  t          j        t          j        t          j        | j        j        t          ¦  «        d¦  «        ¦  «        z  ¦  «        S )Né   é   zpkm,pkm->pkr   c                 ó   — g | ]
}|d          ‘ŒS ©r   © ©Ú.0Úps     úA/home/joao/code/data/meshes/fcp_3010_hull/scripts/volume_atoms.pyú
<listcomp>z volume_atoms.<locals>.<listcomp>   s   € Ð+Ð+Ð+˜a�Q�q”TÐ+Ð+Ð+ó    éÿÿÿÿ©é   )ÚKÚMÚnpÚzerosÚlenÚpartsÚatomsÚreshapeÚarangeÚeinsumÚarrayÚfloatr   ÚlayersÚpiÚabsÚsumÚprodÚbroadcast_toÚasarrayÚposeÚscale)
Údr   r   ÚAÚiÚvÚkÚsÚsignÚdzs
             r   Úvolume_atomsr0      sý  € ØŒ3�”€q€AÝ
Œ•�Q”W‘” Ñ! AÑ%¨¨Q©Ñ/Ñ0Ô0€AØŒ7�D€A€qØ€A€a�DØ	�	Š	•#�a”g‘,”,  1 a¨!¡eÑ,Ô,€AÝ
Œ	�!�a˜!‘e ‘\ AÑ%Ñ&Ô&€AÝ
Œ	�-  1 1 1 a¨¨¨A¨ :¤°°!°!°!°Q¸¸¸1¸°*´Ñ>Ô>ÅÄÈ=ÐZ[Ð\]Ð\]Ð\]Ð_`ÐbcÐbfÐefÐbfÐ\fÔZgÐijÐklÐklÐklÐnoÐqrÐquÐtuÐquÐkuÔivÑAwÔAwÑw€AÝŒ8Ð+Ð+ 1¤7Ð+Ñ+Ô+­UÑ3Ô3€DØ	
�U•7˜1œ8Ñ$Ô$ RÔ(Ñ)Ô)Ñ	)¨Q¬X¸©\Ñ	:€BÝ•”˜$¥¤¨¨Q©¯ª°A©¬Ñ!7Ô!7Ñ7×<Ò<Ñ>Ô>Ñ>ÀÑCÅbÄgÍbÌoÕ^`Ô^hÐijÔioÔiuÕw|Ñ^}Ô^}ð  @Dñ  OEô  OEñ  GFô  GFñ  Fñ  Gô  Gð  Gr   T)Úcachec           	      óT  — t          t          | ¦  «        ¦  «        D ]}||         || |         <   Œd}t          |¦  «        D ]»}	|	dz  |z  |z  }
|
||z  z   }d}t          d|dz
  dz  dz   ¦  «        D ]o}d|z  dz
  |z  d|z  |z  }}d}t          |¦  «        D ]@}|||
|z   |z            |||z   |z            z  ||
|z   |z            |||z   |z            z  z
  z  }ŒA|||z  z  }Œp|||	         t          |¦  «        z  z  }Œ¼t          t          | ¦  «        ¦  «        D ]}d|| |         <   Œ|S )zÑsum_k k (<ax_k, by_k> - <bx_k, ay_k>): the atoms scattered into A (a zeroed scratch, zeroed again on exit),
        then nested loops over part, k and height atom (no integer division: 3 per atom cost 100 us).g        r   r   )Úranger   r!   )r*   r+   r)   r.   ÚPr   ÚM1Újr-   r   ÚxÚyÚspr,   ÚcÚsnÚtÚms                     r   Ú_pairsr>      st  € õ •s˜1‘v”v‘”ð 	ð 	ˆAØ˜”dˆAˆa�Œd‰GˆGØˆÝ�q‘”ð 
	#ð 
	#ˆAØ�A‘˜‘	˜B‘ˆAØ�A˜‘F‘
ˆAØˆBÝ˜1˜q 1™u¨™l¨QÑ.Ñ/Ô/ð ð �Ø˜Q™ ™ bÑ(¨!¨a©%°"©*�2�Ø�Ý˜r™œð Uð U�AØ˜˜1˜q™5 1™9œ¨¨!¨b©&°1©*¬Ñ5¸¸!¸b¹&À1¹*¼ÈÈ!ÈaÉ%ÐRSÉ)ÌÑ8TÑTÑT�A�AØ�a˜!‘e‘��Ø��a”�3˜r™7œ7Ñ"Ñ"ˆAˆAÝ•s˜1‘v”v‘”ð 	ð 	ˆAØˆAˆa�Œd‰GˆGØˆr   c                 ó  — | j         \  }}t          | j        ¦  «        | j        | j        dz   }}}t
                               |dz  |z  |z  ¦  «        }|€0t          j        |dz  |z  |z  ¦  «        x}t
          |dz  |z  |z  <   t          || 
                    t          j        ¦  «        |t          j        d„ | j        D ¦   «         t          j        ¦  «        |||¦  «        }dt          t          | j        ¦  «        d         ¦  «        z  | j        dz
  z  }t          t          j        |z  |z  t          j        t          j        t          j        | j        j        t          ¦  «        d¦  «        ¦  «        z  ¦  «        S )zCvolume_atoms in one numba kernel (a scratch array reused per size).r   r   Nc                 ó   — g | ]
}|d          ‘ŒS r   r	   r
   s     r   r   z%volume_atoms_fast.<locals>.<listcomp>=   s   € Ð4KÐ4KÐ4K¸a°Q°q´TÐ4KÐ4KÐ4Kr   r   r   )r   r   r   r   r   Ú_SCRATCHÚgetr   r   r>   ÚastypeÚfloat64r   r   r   r   r    r#   r$   r%   r&   r'   )	r(   r*   r+   r4   r   r5   r)   r-   r/   s	            r   Úvolume_atoms_fastrE   6   s7  € àŒ7�D€A€qÝ�1”7‰|Œ|˜QœS !¤#¨¡'ˆ"€q€AÝ�Š�Q˜‘U˜Q‘Y ‘^Ñ$Ô$€AØ€yÝ')¤x°°A±¸±	¸B±Ñ'?Ô'?Ð?ˆ�H�Q˜‘U˜Q‘Y ‘^Ñ$Ýˆq�!—(’(�2œ:Ñ&Ô&¨­2¬8Ð4KÐ4KÀ1Ä7Ð4KÑ4KÔ4KÍRÌZÑ+XÔ+XÐZ[Ð]^Ð`bÑcÔc€AØ	
�U•7˜1œ8Ñ$Ô$ RÔ(Ñ)Ô)Ñ	)¨Q¬X¸©\Ñ	:€BÝ•”˜‘˜R‘¥"¤'­"¬/½"¼*ÀQÄVÄ\ÕSXÑ:YÔ:YÐ[_Ñ*`Ô*`Ñ"aÔ"aÑaÑbÔbÐbr   )Ú__doc__Únumpyr   Ú
fcp._slicer   r0   ÚnumbaÚnjitr>   ÚImportErrorrA   rE   r	   r   r   ú<module>rL      sÊ   ðð]ð ]ð
 Ð Ð Ð à Ð Ð Ð Ð Ð ð
Gð 
Gð 
GðØ€L€L€Là€U„Z�dÐÑÔðð ñ Ôðð øð( ð ð ð Ø€F€F€Fðøøøð €ð	cð 	cð 	cð 	cð 	cs   ‘0 °:¹: