U
    0e                     @   s  d dl Z d dlZd dlmZmZ d dlmZmZmZm	Z	m
Z
mZmZmZmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!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- d d	l.m/Z/m0Z0m1Z1 d d
l2m3Z3 d dl4m5Z5m6Z6 e+dZ7e+dZ8dd Z9e3dd Z:e6e3dd Z;e3dd Z<e3dd Z=e6e3dd Z>dd Z?dd Z@dd ZAd d! ZBd"d# ZCe3d$d% ZDdS )&    N)Symbolsymbols)

AssignmentPrintDeclarationFunctionDefinitionReturnrealFunctionCallVariableElementinteger)allocatableArrayConstructorisigndsigncmplxkind
literal_dpProgramModuleuse
Subroutine	dimensionassumed_extentImpliedDoLoop
intent_outsizeDoSubroutineCallsum_arraybind_C)render_as_module)	unchanged)import_module)fcode)has_fortrancompile_run_stringscompile_link_import_strings)	may_xfail)skipXFAILcythonZnumpyc                  C   s,   t ddd} t| }t|dddks(td S )NxTr	   freesource_formatzsize(x))r   r   r&   AssertionError)r.   Zsx r4   C/tmp/pip-unpacked-wheel-_6tpq7m6/sympy/codegen/tests/test_fnodes.py	test_size   s    r6   c                  C   s   t  std tddd} tt| d t|  d g}t| dgdd	}ttd
|g|}t	|gd t
dt	|gdfdgdd\\}}}d|kst|dkst|d tjkstd S )NNo fortran compiler found.aTr/            ?:indimZintentrmsmod_rmsrms.f90)main.f90zprogram myprog
use mod_rms, only: rms
real*8, dimension(4), parameter :: x = [4, 2, 2, 2]
print *, dsqrt(7d0) - rms(x)
end program
cleanz0.00000 exit_status)r'   r+   r   r   r    r   r!   r   r	   r#   r(   r3   osEX_OK)r8   bodyarrfdstdoutstderrinfor4   r4   r5   test_size_assumed_shape   s     	
rO   c            
      C   s   t  std tddd\} }t|d |ddd}td|d	g}t| d
gtgd} td|  t	| |t
| gg}t|ddd}td|fgdd\\}}}d D ]}	|	|kstq|dkst|d tjkstd S )Nr7   za iTr      r9   i   r;   )r>   attrsZidlprogi  r0   standardr2   rB   rC   z-28 -27 -1 1 27 28rE   rF   )r'   r+   r   r   r   r!   r   r   Zas_Declarationr   r   r&   r(   splitr3   rG   rH   )
r8   iZidlacprogfsrcrL   rM   rN   Znumstrr4   r4   r5   test_ImpliedDoLoop8   s"    r\   c                  C   s   t ddd} t| d}t|}t| | d g}td||g}t sLtd tdt	|d	d
fgdd\\}}}d|kszt
d|kst
|dkst
|d tjkst
d S )Nr.   Tr/   *      foor7   rB   Z   rV   rC   42Z43rE   rF   )r   r   deducedr   r   r   r'   r+   r(   r&   r3   rG   rH   )r.   ZvxdeclZprntrZ   rL   rM   rN   r4   r4   r5   test_ProgramO   s    "re   c            	      C   s   t ddd} t| }ttd|gt| d g}tdg |g}tddg}tdt	ddgd	t
d
|gg}t sxtd tdt|ddfdt|ddfgdd\\}}}d|ksttd|kst|dkstd S )Nr.   Tr/   Zsqrr9   mod_sqg      E@Zfoobaronlyz"Square of 42 = "r7   z
mod_sq.f90r`   ra   rB   rC   rb   i  rE   )r   r   rc   r   r	   r   r   r
   r   r   r   r'   r+   r(   r&   r3   str)	r.   Zv_xsqrf   Zsq_callZprg_sqrL   rM   rN   r4   r4   r5   test_Module`   s(    

rk   c               	   C   s  t ddd} t ddd}tj| tttfd}t|}tdt}ttt	| |gt
d|d	  g|d|}td
|gt|t|t|t| |g}t ddd}tj|tdgd}td|gd}	tdt|	|gdt|t||gtt||gg}
t std tdt|	ddfdt|
ddfgdd\\}}}dd tddD }tt|d d |ksht|D ] }t|d d |ksltql|dkstd S )NrTr/   rX   rP   rT   nr^   r9   fr.   rQ   Zmymod)Zdefinitionsr_   rg   r7   za.f90r`   ra   zb.f90rC   c                 S   s   g | ]}d |d  qS )g      ?r9   r4   ).0rX   r4   r4   r5   
<listcomp>   s     z#test_Subroutine.<locals>.<listcomp>   rR   rE   )r   r   rc   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r'   r+   r(   r&   rangeri   sumr3   )rl   rX   Zv_rZv_iZv_nZdo_loopsubr.   Zv_x3modrZ   rL   rM   rN   ref_r4   r4   r5   test_Subroutinev   sP    

  
ry   c                  C   s<   t ddd} ttd| stttd| ddddks8td S )	Nr.   TrP   r^   _   r0   rU   zisign(1, x))r   r$   r   r3   r&   r.   r4   r4   r5   
test_isign   s    r|   c                  C   s<   t d} ttd| sttttd| ddddks8td S )Nr.   r^   rz   r0   rU   zdsign(1d0, x))r   r$   r   r3   r&   r   r{   r4   r4   r5   
test_dsign   s    r}   c                  C   s   t d} ttd| std S )Nr.   r^   )r   r$   r   r3   r{   r4   r4   r5   
test_cmplx   s    r~   c                  C   s   t d} tt| std S )Nr.   )r   r$   r   r3   r{   r4   r4   r5   	test_kind   s    r   c                   C   s   t tddddkstd S )Nr   r0   r1   Z0d0)r&   r   r3   r4   r4   r4   r5   test_literal_dp   s    r   c            	   
   C   s   t  std tstd ts&td tddd} tddd}tt| d	 | d
 g}t| |gdd}tt	d||g|t
dgd}t|gd}t T}td|fdddd fg|d\}}t|tddddgd dk stW 5 Q R X d S )Nr7   zCython not found.zNumPy not found.r8   Tr/   srP   r9   r:   r<   r=   r?   rm   r@   rA   z_rms.pyxz#cython: language_level={}
3zscdef extern double rms(double*, int*)
def py_rms(double[::1] x):
    cdef int s = x.size
    return rms(&x[0], &s)
)	build_dirg       @g      @gҩ*@g+=)r'   r+   r-   npr   r   r    r!   r   r	   r"   r#   tempfileTemporaryDirectoryr)   formatabsZpy_rmsr3   )	r8   r   rI   rJ   rK   Zf_modfolderrv   rN   r4   r4   r5   test_bind_C   s0    

	r   )ErG   r   Zsympy.core.symbolr   r   Zsympy.codegen.astr   r   r   r   r   r	   r
   r   r   r   Zsympy.codegen.fnodesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   Zsympy.codegen.futilsr#   Zsympy.core.exprr$   Zsympy.externalr%   Zsympy.printing.codeprinterr&   Zsympy.utilities._compilationr'   r(   r)   Z!sympy.utilities._compilation.utilr*   Zsympy.testing.pytestr+   r,   r-   r   r6   rO   r\   re   rk   ry   r|   r}   r~   r   r   r   r4   r4   r4   r5   <module>   sB   0\


)