U
    »mœd¿N  ã                   @   s"  d dl Z zd dlmZ W n  ek
r8   d dlmZ Y nX d dlZd dlmZmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZ dd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z dd„ Z!dd„ Z"dd„ Z#dd„ Z$d d!„ Z%d"d#„ Z&d$d%„ Z'd&d'„ Z(d(d)„ Z)d*d+„ Z*d,d-„ Z+d.d/„ Z,d0d1„ Z-d2d3„ Z.d4d5„ Z/d6d7„ Z0d8d9„ Z1d:d;„ Z2d<d=„ Z3d>d?„ Z4d@dA„ Z5dBdC„ Z6dDdE„ Z7dFdG„ Z8dHdI„ Z9dJdK„ Z:dLdM„ Z;dNdO„ Z<dPdQ„ Z=dRdS„ Z>dTdU„ Z?dVdW„ Z@dXdY„ ZAdZd[„ ZBd\d]„ ZCd^d_„ ZDd`da„ ZEdbdc„ ZFddde„ ZGdfdg„ ZHdS )hé    N)ÚStringIO)Úassert_Úassert_array_equalÚassert_allcloseÚassert_equal)Úraises)Ú
coo_matrix)Úerf)Úmodify_meshÚestimate_fun_jacÚestimate_bc_jacÚcompute_jac_indicesÚconstruct_global_jacÚ	solve_bvpc                 C   s   t  |d |d f¡S ©Né   r   ©ÚnpÚvstack©ÚxÚy© r   úW/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/integrate/tests/test_bvp.pyÚexp_fun   s    r   c                 C   s:   t  dd| jd f¡}d|d< d|d< d|d< d|d< |S )Né   r   ©r   r   r   ©r   r   ©r   r   ©r   r   ©r   ÚemptyÚshape©r   r   Údf_dyr   r   r   Úexp_fun_jac   s    r%   c                 C   s   t  | d d |d f¡S ©Nr   r   ©r   Zhstack©ÚyaÚybr   r   r   Úexp_bc!   s    r+   c                 C   s   t  | d d d |d f¡S )Nr   r   y              ð?r'   r(   r   r   r   Úexp_bc_complex%   s    r,   c                 C   s4   t  ddgddgg¡}t  ddgddgg¡}||fS r   ©r   Úarray©r)   r*   Údbc_dyaÚdbc_dybr   r   r   Ú
exp_bc_jac)   s    þþr2   c                 C   s(   t  |  ¡t  | d ¡ dt  d¡  S )Nr   r   éþÿÿÿ)r   Úexp©r   r   r   r   Úexp_sol5   s    r6   c                 C   s$   t  |d |d d  |d  f¡S )Nr   r   r   r   ©r   r   Úpr   r   r   Úsl_fun9   s    r9   c                 C   s|   |j \}}t |d|f¡}d|d< d|d< |d d  |d< d|d< t |d|f¡}d|d< d|d  |d  |d< ||fS )	Nr   r   r   r   r   r   r   r3   )r"   r   r!   ©r   r   r8   ÚnÚmr$   Údf_dpr   r   r   Ú
sl_fun_jac=   s    
r>   c                 C   s$   t  | d |d | d |d  f¡S r&   r'   ©r)   r*   r8   r   r   r   Úsl_bcL   s    r@   c                 C   sH   t  d¡}d|d< d|d< t  d¡}d|d< t  d¡}d|d< |||fS )	N)é   r   r   r   )r   r   r   )rA   r   éÿÿÿÿ)r   r   ©r   Úzeros)r)   r*   r8   r0   r1   Údbc_dpr   r   r   Ú	sl_bc_jacP   s    


rF   c                 C   s   t  |d |  ¡S )Nr   )r   Úsin©r   r8   r   r   r   Úsl_sol^   s    rI   c                 C   s   t  |d |d d  f¡S )Nr   r   é   r   r   r   r   r   Ú	emden_funb   s    rK   c                 C   sF   t  dd| jd f¡}d|d< d|d< d|d d  |d< d|d	< |S )
Nr   r   r   r   r   éûÿÿÿé   r   r   r    r#   r   r   r   Úemden_fun_jacf   s    rN   c                 C   s   t  | d |d d g¡S )Nr   r   çªLXèz¶ë?r-   r(   r   r   r   Úemden_bco   s    rP   c                 C   s4   t  ddgddgg¡}t  ddgddgg¡}||fS r&   r-   r/   r   r   r   Úemden_bc_jacs   s    þþrQ   c                 C   s   d| d d  d S )Nr   r   rA   ç      à¿r   r5   r   r   r   Ú	emden_sol   s    rS   c                 C   s
   t  |¡S ©N©r   Ú
zeros_liker   r   r   r   Úundefined_funƒ   s    rW   c                 C   s   t  | d |d d g¡S r&   r-   r(   r   r   r   Úundefined_bc‡   s    rX   c                 C   s&   t  |¡}|dd d… |d d d…< |S )Nr   r   rU   )r   r   Úfr   r   r   Úbig_fun‹   s    
rZ   c                 C   s&   t  | d d d… |d d d… d f¡S )Nr   r   r'   r(   r   r   r   Úbig_bc‘   s    r[   c                 C   s&   t  d| | jf¡}| |d d d…< | S )Nr   )r   ÚonesÚsize)r   r;   r   r   r   r   Úbig_sol•   s    r^   c                 C   sr   t  |¡}|ddd… |ddd…< |d d  |ddd…  |ddd…< |d d  |ddd…  |ddd…< |S )aý   Big version of sl_fun, with two parameters.

    The two differential equations represented by sl_fun are broadcast to the
    number of rows of y, rotating between the parameters p[0] and p[1].
    Here are the differential equations:

        dy[0]/dt = y[1]
        dy[1]/dt = -p[0]**2 * y[0]
        dy[2]/dt = y[3]
        dy[3]/dt = -p[1]**2 * y[2]
        dy[4]/dt = y[5]
        dy[5]/dt = -p[0]**2 * y[4]
        dy[6]/dt = y[7]
        dy[7]/dt = -p[1]**2 * y[6]
        .
        .
        .

    r   Nr   r   rM   rA   rU   )r   r   r8   rY   r   r   r   Úbig_fun_with_parameters›   s
    
&&r_   c                 C   sò   |j \}}t |||f¡}d|td|dƒtd|dƒf< |d d  |td|dƒtd|dƒf< |d d  |td|dƒtd|dƒf< t |d|f¡}d|d  |td|dƒ  |td|dƒdf< d|d  |td|dƒ  |td|dƒdf< ||fS )Nr   r   r   rM   rA   r3   ©r"   r   rD   Úranger:   r   r   r   Úbig_fun_with_parameters_jac¶   s    
&&,,rb   c                 C   s>   t  | d d d… |d d d… | d |d  | d |d  f¡S )Nr   r   r   rA   r'   r?   r   r   r   Úbig_bc_with_parametersÅ   s    rc   c                 C   s¼   | j d }t |d |f¡}t |d |f¡}d|t|d ƒtd|dƒf< d|t|d |ƒtd|dƒf< t |d df¡}d||df< d||df< d||d df< d||d df< |||fS )Nr   r   r   rB   rA   r`   )r)   r*   r8   r;   r0   r1   rE   r   r   r   Úbig_bc_with_parameters_jacÊ   s    
rd   c                 C   s*   t  t  |d |  ¡t  |d |  ¡f¡S r&   )r   r   rG   rH   r   r   r   Úbig_sol_with_parametersÜ   s    re   c              	   C   s\   d}t  |d | |d  |t jd  t  t j|  ¡  t j|  t  t j|  ¡   | f¡S )Nçü©ñÒMbP?r   r   )r   r   ÚpiÚcosrG   )r   r   Úepsr   r   r   Ú	shock_funá   s    (ÿÿþrj   c                 C   s   t  | d d |d g¡S )Nr   r   r-   r(   r   r   r   Úshock_bcê   s    rk   c                 C   s:   d}t  d| ¡}t  t j|  ¡t| | ƒtd| ƒ  S )Nrf   r   r   )r   Úsqrtrh   rg   r	   )r   ri   Úkr   r   r   Ú	shock_solî   s    rn   c                 C   s   t  |d t  | ¡g¡S )Nr   )r   ÚstackrV   r   r   r   r   Únonlin_bc_funô   s    rp   c                 C   s    | \}}|\}}d\}}}}	}
d| d }|t  |
| ¡t  |
 | ¡  }|||  }|	| d }|t  |
| ¡t  |
 | ¡  }|||  }t  ||g¡S )N)g=
×£p=ú?ç{®Gáz„?ç-Cëâ6?ç      à?g33333sC@ç        ç      ð?)r   r4   r.   )r)   r*   ZphiAZphipAZphiCZphipCÚkappaZioAZioCÚVrY   ZhAZiAZres0ZhCZiCZres1r   r   r   Únonlin_bc_bcù   s    ""rx   c                 C   s   dd|   S )NgÝ“/Á¿g)ø·ò?r   r5   r   r   r   Únonlin_bc_sol  s    ry   c                  C   s²   t jddddgtd�} t| t  dg¡t  dg¡ƒ}t|t  dddddd	dg¡ƒ t jd
ddddgtd�} t| t jdgtd�t  dddg¡ƒ}t|d
dddddddddddgƒ d S )Nr   r   rA   é	   ©Zdtyper   rs   rJ   é   iúÿÿÿéýÿÿÿé   rL   éüÿÿÿg      ø¿rM   )r   r.   Úfloatr
   r   Úint)r   Zx_newr   r   r   Útest_modify_mesh  s    $r‚   c                  C   sj  t  ddd¡} t  d| jd f¡}d|d< d|d< t  g ¡}tdd„ | ||ƒ\}}t| |ƒ}t||ƒ t|d kƒ t  dt j	d¡} t  d| jd f¡}t  
| ¡|d< t  | ¡|d< t  d	g¡}tt| ||ƒ\}}t| ||ƒ\}}t||ƒ t||ƒ t  ddd
¡} t  d| jd f¡}d|d< d|d< t  g ¡}tdd„ | ||ƒ\}}t| |ƒ}t||ƒ t|d kƒ d S )Nr   r   rJ   r   rq   g{®Gáz”?c                 S   s
   t | |ƒS rT   ©r   r7   r   r   r   Ú<lambda>   ó    z&test_compute_fun_jac.<locals>.<lambda>ru   é
   rO   rr   c                 S   s
   t | |ƒS rT   )rK   r7   r   r   r   r„   4  r…   )r   Úlinspacer!   r"   r.   r   r%   r   r   rg   rG   rh   r9   r>   rN   )r   r   r8   r$   r=   Zdf_dy_anZdf_dp_anr   r   r   Útest_compute_fun_jac  s6    







rˆ   c            	      C   sH  t  ddg¡} t  ddg¡}t  g ¡}tdd„ | ||ƒ\}}}t| |ƒ\}}t||ƒ t||ƒ t|d kƒ t  ddg¡} t  dd	g¡}t  dg¡}tt| ||ƒ\}}}t| ||ƒ\}}}t||ƒ t||ƒ t||ƒ t  dd
g¡} t  ddg¡}t  g ¡}tdd„ | ||ƒ\}}}t| |ƒ\}}t||ƒ t||ƒ t|d kƒ d S )Ng      ð¿r   rs   rA   c                 S   s
   t | |ƒS rT   ©r+   r?   r   r   r   r„   ?  r…   z%test_compute_bc_jac.<locals>.<lambda>rt   r   rB   éd   iüÿÿg      %@c                 S   s
   t | |ƒS rT   )rP   r?   r   r   r   r„   R  r…   )	r   r.   r   r2   r   r   r@   rF   rQ   )	r)   r*   r8   r0   r1   rE   Z
dbc_dya_anZ
dbc_dyb_anZ	dbc_dp_anr   r   r   Útest_compute_bc_jac:  sD    
   ÿ






   ÿ


r‹   c                  C   s*  d} d}d}t | ||ƒ\}}tt |¡||ffƒ ¡ }t ddddddddddg
ddddddddddg
ddddddddddg
ddddddddddg
ddddddddddg
ddddddddddg
ddddddddddg
ddddddddddg
ddddddddddg
ddddddddddg
g
¡}t||ƒ d S )Nr   rM   r   r   )r   r   r   Z	ones_likeÚtoarrayr.   r   )r;   r<   rm   ÚiÚjÚsZs_truer   r   r   Útest_compute_jac_indicesY  s$    ör�   c                  C   s8  d} d}d}t dddƒ\}}t ddd¡}t |¡}t t tj| ¡tjt tj| ¡ f¡}t dg¡}t	|||ƒ}	|d d… d|  }
d|d d …d d…f |d d …dd …f   |d |	d d …dd …f |	d d …d d…f    }t
|||ƒ\}}t
|
||ƒ\}}t|d d …df |d d …df |ƒ\}}}t| ||||||||||||ƒ}| ¡ }d	d
„ }t ||  | ||  | f¡}t|d ƒD ]@}||| |d ƒ|||  |d |  …||  |d |  …f< �qŒ||d  d |dd d…f |ddd …f   |d |d |  d…df< |||dd d…f |ddd …f   |d d |dd d…f |ddd …f     |d|d |  d…df< d|d< d|d< d|d< d|d< t||dd� tt	|||ƒ\}}tt	|
||ƒ\}}tt|d d …df |d d …df |ƒ\}}}t| ||||||||||||ƒ}| ¡ }t||ddd� d S )Nr   rJ   r   r   g      @rB   rs   é   c              
   S   s�   t  | d |d  d d d|  | d  |d  d d d|  gd|  |d  | d |d  d d d|  |d  d| d |d  d  gg¡S )Nr   é   r   rR   rs   r-   )Úhr8   r   r   r   ÚJ_block…  s    <Jþz(test_compute_global_jac.<locals>.J_blockr~   )r‘   r   )rz   r‘   )r†   r   )r†   r†   ç»½×Ùß|Û=©Úrtolg:Œ0âŽyU>©r—   Úatol)r   r   r‡   Údiffr   rG   rg   rh   r.   r9   r>   rF   r   rŒ   rD   ra   r   r   r   r@   )r;   r<   rm   Zi_jacZj_jacr   r“   r   r8   rY   Zx_middleZy_middler$   r=   Zdf_dy_middleZdf_dp_middler0   r1   rE   ÚJr”   ZJ_truer�   r   r   r   Útest_compute_global_jacn  s^    
,\*    ÿ>F$*ÿ,    ÿrœ   c               	   C   sÐ   dddg} t  d¡}ttttt| |ƒ t  ddd¡} t  d¡}ttttt| |ƒ dd„ }d	d„ }t  d
| jd f¡}ttt||| |dgd� dd„ }ttt||| |ƒ t  	ddgg¡}ttttt| ||d� d S )Nr   r   rs   )r   rA   rJ   )r   rM   c                 S   s
   t | |ƒS rT   rƒ   r7   r   r   r   r„   ¬  r…   z+test_parameter_validation.<locals>.<lambda>c                 S   s
   t | |ƒS rT   r‰   r?   r   r   r   r„   ­  r…   r   )r8   c                 S   s
   t  d¡S )NrA   rC   r   r   r   r   Úwrong_shape_fun²  s    z2test_parameter_validation.<locals>.wrong_shape_fun)ÚS)
r   rD   Úassert_raisesÚ
ValueErrorr   r   r+   r‡   r"   r.   )r   r   ZfunÚbcr�   rž   r   r   r   Útest_parameter_validation£  s    


r¢   c               
   C   sH  t  ddd¡} t  ddd¡}t  d| jd f¡}d tfD �]}d tfD ]ú}ttt| |||d�}t	|j
dƒ t|jƒ t	|jjdƒ | |¡}t|d t|ƒdd� t||ƒ}| |d¡| }|dt  |¡  }	t j|	d dd	�d
 }
tt  |
dk ¡ƒ tt  |jdk ¡ƒ t| |j¡|jddd� t| |jd¡|jddd� qFq8d S )Nr   r   rJ   rŠ   r   ©Úfun_jacÚbc_jacçñhãˆµøä>©r™   ©Zaxisrs   rf   r•   r˜   )r   r‡   rD   r"   r%   r2   r   r   r+   r   Ústatusr   Úsuccessr   r]   Úsolr   r6   ÚabsÚsumÚallÚrms_residualsr   Úyp©r   Úx_testr   r¤   r¥   r«   Úsol_testÚf_testÚrÚrel_resÚnorm_resr   r   r   Útest_no_params»  s*    ÿ


r¸   c                  C   sp  t  dt jd¡} t  dt jd¡}t  d| jd f¡}d tfD �],}d tfD �]}ttt	| |dg||d�}t
|jdƒ t|jƒ t|jjdk ƒ t|jdgd	d
� | |¡}t|d t|dgƒd	d	d� t||dgƒ}| |d¡| }|dt  |¡  }	t j|	d dd�d }
tt  |
dk ¡ƒ tt  |jdk ¡ƒ t| |j¡|jddd� t| |jd¡|jddd� qJq<d S )Nr   rJ   rŠ   r   rs   ©r8   r¤   r¥   r†   r   rr   r–   r˜   r¨   rf   r•   )r   r‡   rg   r\   r"   r>   rF   r   r9   r@   r   r©   r   rª   r   r]   r   r8   r«   rI   r¬   r­   r®   r¯   r   r°   r±   r   r   r   Útest_with_paramsØ  s2    ÿ

 ÿrº   c                  C   s`  t  ddd¡} t  ddd¡}t  d¡}d|d< d|d< t  ddgdd	gg¡}d tfD �]}d tfD ]ö}ttt| ||||d
�}t	|j
dƒ t|jƒ t	|jjdƒ | |¡}t|d t|ƒdd� t||ƒ| |¡|  }| |d¡| }	|	dt  |¡  }
t j|
d dd�d }tt  |dk ¡ƒ t| |j¡|jddd� t| |jd¡|jddd� qbqTd S )Nr   r   r†   gš™™™™™©?rŠ   )r   r†   rO   rr   r3   )rž   r¤   r¥   r¦   r§   r   r¨   rs   rf   r•   r˜   )r   r‡   r!   r.   rN   rQ   r   rK   rP   r   r©   r   rª   r   r]   r«   r   rS   Údotr¬   r­   r®   r   r°   )r   r²   r   rž   r¤   r¥   r«   r³   r´   rµ   r¶   r·   r   r   r   Útest_singular_termù  s.    
ÿ

r¼   c               
   C   sf  t  ddd¡} t  ddd¡}t jd| jd ftd�}d tfD �]"}d tfD �]}ttt	| |||d�}t
|jdƒ t|jƒ | |¡}t|d jt|ƒdd	� t|d jt|ƒdd	� t||ƒ}| |d¡| }|dt  |¡  }	t jt  |	t  |	¡ ¡dd
�d }
tt  |
dk ¡ƒ tt  |jdk ¡ƒ t| |j¡|jddd� t| |jd¡|jddd� qJq<d S )Nr   r   rJ   rŠ   r   r{   r£   r¦   r§   r¨   rs   rf   r•   r˜   )r   r‡   rD   r"   Úcomplexr%   r2   r   r   r,   r   r©   r   rª   r«   r   Úrealr6   Úimagr¬   r­   Úconjr®   r¯   r   r   r°   r±   r   r   r   Útest_complex  s2    ÿ


ÿÿrÁ   c                  C   s’   t  ddd¡} t  d| jf¡}ttt| |ddd�}t|jdƒ t	|j
 ƒ t  ddd¡} t  d| jf¡}ttt| |ƒ}t|jdƒ t	|j
 ƒ d S )Nr   r   r   r¦   rJ   )ZtolZ	max_nodes)r   r‡   rD   r]   r   r   r+   r   r©   r   rª   rW   rX   )r   r   Úresr   r   r   Útest_failures7  s    rÃ   c            	      C   s  d} t  ddd¡}t  d|  |jf¡}ttt||ƒ}t|jdƒ t	|j
ƒ | |¡}t|d t|| ƒƒ t||ƒ}| |d¡| }|dt  |¡  }t jt  |t  |¡ ¡dd�d }t	t  |dk ¡ƒ t	t  |jdk ¡ƒ t| |j¡|jd	d	d
� t| |jd¡|jd	d	d
� d S )Né   r   r   rJ   r   r¨   rs   rf   r•   r˜   )r   r‡   rD   r]   r   rZ   r[   r   r©   r   rª   r«   r   r^   r¬   r­   r¾   rÀ   r®   r¯   r   r   r°   )	r;   r   r   r«   r³   r´   rµ   r¶   r·   r   r   r   Útest_big_problemE  s     


"rÅ   c                  C   s¨  d} t  dt jd¡}t  dt jd¡}t  d|  |jf¡}d tfD �]`}d tfD �]P}ttt	||ddg||d�}t
|jdƒ t|jƒ t|jddgd	d
� | |¡}td| dƒD ]L}t|| t|ddgƒd d	d	d� t||d  t|ddgƒd d	d	d� q®t||ddgƒ}	| |d¡|	 }
|
dt  |	¡  }t j|d dd�d }tt  |dk ¡ƒ tt  |jdk ¡ƒ t| |j¡|jddd� t| |jd¡|jddd� qNq@d S )NrÄ   r   rJ   rŠ   r   rs   r¹   r   rr   r–   rM   r˜   r¨   rf   r•   )r   r‡   rg   r\   r]   rb   rd   r   r_   rc   r   r©   r   rª   r   r8   r«   ra   re   r¬   r­   r®   r¯   r   r   r°   )r;   r   r²   r   r¤   r¥   r«   r³   Zisolr´   rµ   r¶   r·   r   r   r   Ú test_big_problem_with_parameters]  sF       ÿ

 þ þrÆ   c            	      C   s  t  ddd¡} t  ddd¡}t  d| jf¡}ttt| |ƒ}t|jdƒ t	|j
ƒ t	|jjdk ƒ | |¡}t|d t|ƒddd	� t||ƒ}| |d¡| }|dt  |¡  }t j|d dd
�d }t	t  |dk ¡ƒ t| |j¡|jddd	� t| |jd¡|jddd	� d S )NrB   r   rJ   rŠ   r   r   én   r¦   r˜   r¨   rs   rf   r•   )r   r‡   rD   r]   r   rj   rk   r   r©   r   rª   r   r«   r   rn   r¬   r­   r®   r   r°   ©	r   r²   r   r«   r³   r´   rµ   r¶   r·   r   r   r   Útest_shock_layer‚  s     


rÉ   c            	      C   s  t  ddd¡} | }t  d| jg¡}ttt| |ƒ}t|jdƒ t	|j
ƒ t	|jjdk ƒ | |¡}t|d t|ƒddd� t||ƒ}| |d¡| }|dt  |¡  }t j|d dd	�d
 }t	t  |dk ¡ƒ t| |j¡|jddd� t| |jd¡|jddd� d S )Nr   gš™™™™™¹?rJ   r   r‘   r¦   r˜   r   r¨   rs   rf   r•   )r   r‡   rD   r]   r   rp   rx   r   r©   r   rª   r   r«   r   ry   r¬   r­   r®   r   r°   rÈ   r   r   r   Útest_nonlin_bcš  s     


rÊ   c               	   C   s²   t  ddd¡} t  d| jd f¡}dD ]†}tj}tƒ t_z ttt	| ||d�}tj 
¡ }W 5 |t_X t|jƒ |dkr€t| |ƒ |dkr–td|k|ƒ |dkr&td|k|ƒ q&d S )	Nr   r   rJ   r   )r   r   r   )Úverbosez	Solved inzMax residual)r   r‡   rD   r"   ÚsysÚstdoutr   r   r   r+   Úgetvaluer   rª   )r   r   rË   Z
old_stdoutr«   Útextr   r   r   Útest_verbose²  s     
rÐ   )IrÌ   r   ÚImportErrorÚioÚnumpyr   Znumpy.testingr   r   r   r   Zpytestr   rŸ   Zscipy.sparser   Zscipy.specialr	   Zscipy.integrate._bvpr
   r   r   r   r   r   r   r%   r+   r,   r2   r6   r9   r>   r@   rF   rI   rK   rN   rP   rQ   rS   rW   rX   rZ   r[   r^   r_   rb   rc   rd   re   rj   rk   rn   rp   rx   ry   r‚   rˆ   r‹   r�   rœ   r¢   r¸   rº   r¼   rÁ   rÃ   rÅ   rÆ   rÉ   rÊ   rÐ   r   r   r   r   Ú<module>   st    			
 5!%