Ë
    7^(hÛo  ã                  óÔ  — d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	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!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/m0Z0m1Z1 dd
l2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z=m>Z> ddl?m@Z@ ddl:mAZAmBZB i dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd “d!d"“d#d$“d%d&“ZC G d'„ d(e;«      ZDy))ar  
Fortran code printer

The FCodePrinter converts single SymPy expressions into single Fortran
expressions, using the functions defined in the Fortran 77 standard where
possible. Some useful pointers to Fortran can be found on wikipedia:

https://en.wikipedia.org/wiki/Fortran

Most of the code below is based on the "Professional Programmer's Guide to
Fortran77" by Clive G. Page:

https://www.star.le.ac.uk/~cgp/prof77.html

Fortran is a case-insensitive language. This might cause trouble because
SymPy is case sensitive. So, fcode adds underscores to variable names when
it is necessary to make them different for Fortran.
é    )Úannotations)ÚAny)Údefaultdict)ÚchainN)Ú
AssignmentÚDeclarationÚPointerÚvalue_constÚfloat32Úfloat64Úfloat80Ú	complex64Ú
complex128Úint8Úint16Úint32Úint64ÚintcÚrealÚintegerÚbool_Úcomplex_ÚnoneÚstderrÚstdout)ÚallocatableÚisignÚdsignÚcmplxÚmergeÚ
literal_dpÚ	elementalÚpureÚ	intent_inÚ
intent_outÚintent_inout)ÚSÚAddÚNÚFloatÚSymbol)ÚFunction)Úequal_valued)ÚEq)ÚRange)ÚCodePrinter)Ú
precedenceÚ
PRECEDENCE)Úprinter_context)ÚfcodeÚprint_fcodeÚsinÚcosÚtanÚasinÚacosÚatanÚatan2ÚsinhÚcoshÚtanhÚlogÚexpÚerfÚAbsÚabsÚ	conjugateÚconjgÚMaxÚmaxÚMinÚminc                  ó@  ‡ — e Zd ZU dZdZdZeeee	e
eiZedede	dededed	ed
edededediZeddiiZ eej2                  fi di dddddœ¤ŽZded<   ddddddœZddiZd\ˆ fd „	Zed!„ «       Zˆ fd"„Z d#„ Z!d$„ Z"d%„ Z#d&„ Z$d'„ Z%d(„ Z&d)„ Z'd*„ Z(d+„ Z)d,„ Z*d-„ Z+d.„ Z,d/„ Z-d0„ Z.d1„ Z/d2„ Z0d3„ Z1d4„ Z2d5„ Z3d6„ Z4d7„ Z5d8„ Z6d9„ Z7d:„ Z8d;„ Z9d<„ Z:d=„ Z;d>„ Z<d?„ Z=d@„ Z>dA„ Z?dB„ Z@dC„ ZAdD„ ZBdE„ ZCdF„ ZDdG„ ZEdH„ ZFdI„ ZGdJ„ ZHdK„ ZIdL„ ZJdM„ ZKdN„ ZLdO„ ZMdP„ ZNdQ„ ZOdR„ ZPdS„ ZQdT„ ZRdU„ ZSdV„ ZTdW„ ZUdX„ ZVdY„ ZWdZ„ ZXd[„ ZYˆ xZZS )]ÚFCodePrinterzAA printer to convert SymPy expressions to strings of Fortran codeÚ_fcodeÚFortranzinteger(c_int)zreal*4zreal*8zreal*10z	complex*8z
complex*16z	integer*1z	integer*2z	integer*4z	integer*8ÚlogicalÚiso_c_bindingÚc_inté   ÚfixedTéM   )Ú	precisionÚuser_functionsÚsource_formatÚcontractÚstandardÚname_manglingzdict[str, Any]Ú_default_settingsz.and.z.or.z.neqv.z.eqv.z.not. )ÚandÚorÚxorÚ
equivalentÚnotz!=z/=c           	     ó’  •— |si }i | _         g | _        t        t        | j                  j                  «       |j                  di «      j                  «       «      «      | _        t        t        | j                  j                  «       |j                  di «      j                  «       «      «      | _        t        ‰| �%  |«       t        t        «      | _
        |j                  di «      }| j                  j                  |«       h d£}| j                  d   |vrt        d| j                  d   z  «      ‚t        t         «      | _        y )NÚtype_aliasesÚtype_mappingsrV   >   éØ  éB   rT   éZ   é_   éÓ  rY   zUnknown Fortran standard: %s)Úmangled_symbolsÚ	used_nameÚdictr   rb   ÚitemsÚpoprc   ÚsuperÚ__init__Úknown_functionsÚgetÚupdateÚ	_settingsÚ
ValueErrorr   ÚsetÚmodule_uses)ÚselfÚsettingsÚ	userfuncsÚ	standardsÚ	__class__s       €úT/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/printing/fortran.pyro   zFCodePrinter.__init__x   s  ø€ ÙØˆHØ!ˆÔØˆŒÜ ¤ t×'8Ñ'8×'>Ñ'>Ó'@Ø'/§|¡|°NÀBÓ'G×'MÑ'MÓ'Oó"Qó RˆÔä!¤%¨×(:Ñ(:×(@Ñ(@Ó(BØ(0¯©°_ÀbÓ(I×(OÑ(OÓ(Qó#Só TˆÔä‰Ñ˜Ô"Ü#¤OÓ4ˆÔØ—L‘LÐ!1°2Ó6ˆ	Ø×Ñ×#Ñ# IÔ.â0ˆ	Ø�>‰>˜*Ñ%¨YÑ6ÜÐ;¸d¿n¹nØ'ñ?)ñ )ó *ð *ä&¤sÓ+ˆÕó    c                ó˜   — | j                   d   dk(  rddddœS | j                   d   dk(  rddd	dœS t        d
| j                   d   z  «      ‚)NrW   rS   z      z     @ zC     )ÚcodeÚcontÚcommentÚfreeÚ z! zUnknown source format: %s)rs   rt   )rw   s    r|   Ú_leadzFCodePrinter._leadŒ   sX   € à�>‰>˜/Ñ*¨gÒ5Ø$¨iÀHÑMÐMØ�^‰^˜OÑ,°Ò6Ø¨¸TÑBÐBäÐ8¸4¿>¹>È/Ñ;ZÑZÓ[Ð[r}   c                óð  •— | j                   d   dk(  rÓ|| j                  vrª|j                  }|j                  «       | j                  v r"|dz  }|j                  «       | j                  v rŒ"| j                  j                  |j                  «       «       ||j                  k(  r|| j                  |<   nt        |«      | j                  |<   |j                  | j                  «      }t        ‰| �%  |«      }|S )NrZ   TÚ_)
rs   ri   ÚnameÚlowerrj   Úappendr+   Úxreplacern   Ú_print_Symbol)rw   Úexprr‡   r{   s      €r|   r‹   zFCodePrinter._print_Symbol•   sÊ   ø€ Ø�>‰>˜/Ñ*¨dÒ2Ø˜4×/Ñ/Ñ/Ø—y‘y�Ø—j‘j“l d§n¡nÑ4Ø˜C‘K�Dð —j‘j“l d§n¡nÒ4à—‘×%Ñ% d§j¡j£lÔ3Ø˜4Ÿ9™9Ò$Ø15�D×(Ñ(¨Ò.ä17¸³�D×(Ñ(¨Ñ.à—=‘= ×!5Ñ!5Ó6ˆDä‰wÑ$ TÓ*ˆØˆr}   c                ó   — | dz  S )Né   © )rw   Úps     r|   Ú_rate_index_positionz!FCodePrinter._rate_index_position¦   s   € Øˆr�!‰tˆr}   c                ó   — |S ©Nr�   )rw   Ú
codestrings     r|   Ú_get_statementzFCodePrinter._get_statement©   s   € ØÐr}   c                ó$   — dj                  |«      S )Nz! {})Úformat)rw   Útexts     r|   Ú_get_commentzFCodePrinter._get_comment¬   s   € Ø�}‰}˜TÓ"Ð"r}   c                óD   — dj                  || j                  |«      «      S )Nzparameter ({} = {}))r—   Ú_print)rw   r‡   Úvalues      r|   Ú_declare_number_constz"FCodePrinter._declare_number_const¯   s   € Ø$×+Ñ+¨D°$·+±+¸eÓ2DÓEÐEr}   c           	     óœ   — | j                   j                  |t        |j                  | j                  d   «      «      f«       t        |«      S ©NrU   )Ú_number_symbolsÚaddr*   Úevalfrs   Ústr©rw   rŒ   s     r|   Ú_print_NumberSymbolz FCodePrinter._print_NumberSymbol²   s>   € ð 	×Ñ× Ñ  $¬¨d¯j©j¸¿¹ÈÑ9TÓ.UÓ(VÐ!WÔXÜ�4‹yÐr}   c                óB   — | j                  | j                  |«      «      S r“   )Ú_wrap_fortranÚindent_code)rw   Úliness     r|   Ú_format_codezFCodePrinter._format_code¸   s   € Ø×!Ñ! $×"2Ñ"2°5Ó"9Ó:Ð:r}   c                óJ   ‡— |j                   \  Š}ˆfd„t        |«      D «       S )Nc              3  óF   •K  — | ]  }t        ‰«      D ]  }||f–— Œ
 Œ y ­wr“   )Úrange)Ú.0ÚjÚiÚrowss      €r|   ú	<genexpr>z8FCodePrinter._traverse_matrix_indices.<locals>.<genexpr>½   s%   øè ø€ ÒA˜1´U¸4³[ÒA°��A”ÐA�ÑAùs   ƒ!)Úshaper­   )rw   ÚmatÚcolsr±   s      @r|   Ú_traverse_matrix_indicesz%FCodePrinter._traverse_matrix_indices»   s   ø€ Ø—Y‘Y‰
ˆˆdÛA¤ d£ÔAÐAr}   c           	     óø   — g }g }|D ]n  }t        | j                  |j                  |j                  dz   |j                  dz   g«      \  }}}|j                  d|›d|›d|›�«       |j                  d«       Œp ||fS )Né   údo z = ú, úend do)Úmapr›   Úlabelrˆ   Úupperr‰   )rw   ÚindicesÚ
open_linesÚclose_linesr°   ÚvarÚstartÚstops           r|   Ú_get_loop_opening_endingz%FCodePrinter._get_loop_opening_ending¿   s€   € Øˆ
ØˆØò 	)ˆAä" 4§;¡;Ø—W‘W˜aŸg™g¨™k¨1¯7©7°Q©;Ð7ó 9ÑˆC�˜à×Ò²#²u¹dÐCÔDØ×Ñ˜xÕ(ð	)ð ˜;Ð&Ð&r}   c           
     óè  — ddl m} |j                  \  }|j                  r"t	        dt        d|«      t        |d«      «      }n |j                  s|j                  rLt	        t        t        d«      t        d«      «      | ||«      z  t         ||«      t        d«      «      «      }n<t	        t        d«      t        t        d«      |«      t        |t        d«      «      «      }| j                  |«      S )Nr   )rC   r¸   )Ú$sympy.functions.elementary.complexesrC   ÚargsÚ
is_integerr    r   r.   Ú
is_complexÚis_infiniter   r!   r   r›   )rw   rŒ   rC   ÚargÚnew_exprs        r|   Ú_print_signzFCodePrinter._print_signÊ   s±   € Ý<Ø�y‰y‰ˆØ�>Š>Ü˜Q¤ a¨£¬r°#°q«zÓ:‰HØ�nŠn §¢ÜœU¤:¨a£=´*¸Q³-Ó@À#ÁcÈ#ÃhÁ,ÔPRÑSVÐWZÓS[Ô]gÐhiÓ]jÓPkÓl‰HäœZ¨›]¬E´*¸Q³-ÀÓ,EÄrÈ#ÌzÐZ[Ë}ÓG]Ó^ˆHØ�{‰{˜8Ó$Ð$r}   c                óœ  — |j                   d   j                  dk7  rt        d«      ‚g }|j                  t        «      ràt        |j                   «      D ]¦  \  }\  }}|dk(  r$|j                  d| j                  |«      z  «       nU|t        |j                   «      dz
  k(  r|dk(  r|j                  d«       n#|j                  d| j                  |«      z  «       |j                  | j                  |«      «       Œ¨ |j                  d	«       d
j                  |«      S | j                  d   dk\  r’d}| j                  |j                   d   j                  «      }t        |j                   d d «      }|rL|j                  «       \  }}| j                  |«      }| j                  |«      }	|j                  |||	¬«      }|rŒL|S t        d«      ‚)NéÿÿÿÿTz¼All Piecewise expressions must contain an (expr, True) statement to be used as a default condition. Without one, the generated expression may not evaluate to anything under some condition.r   zif (%s) thenr¸   Úelsezelse if (%s) thenúend ifú
rY   rg   zmerge({T}, {F}, {COND}))ÚTÚFÚCONDzmUsing Piecewise as an expression using inline operators is not supported in standards earlier than Fortran95.)rÈ   Úcondrt   Úhasr   Ú	enumerater‰   r›   ÚlenÚjoinrs   rŒ   Úlistrm   r—   ÚNotImplementedError)
rw   rŒ   r©   r°   ÚeÚcÚpatternr   Útermsr×   s
             r|   Ú_print_PiecewisezFCodePrinter._print_PiecewiseÖ   sœ  € Ø�9‰9�R‰=×Ñ Ò%ô ð /ó 0ð 0ð
 ˆØ�8‰8”JÔÜ& t§y¡yÓ1ò -‘	�‘6�A�qØ˜’6Ø—L‘L °$·+±+¸a³.Ñ!@ÕAØœ#˜dŸi™i›.¨1Ñ,Ò,°°d²Ø—L‘L Õ(à—L‘LÐ!4°t·{±{À1³~Ñ!EÔFØ—‘˜TŸ[™[¨›^Õ,ð-ð �L‰L˜Ô"Ø—9‘9˜UÓ#Ð#Ø�^‰^˜JÑ'¨2Ò-ð 0ˆGØ—;‘;˜tŸy™y¨™}×1Ñ1Ó2ˆDÜ˜Ÿ™ 3 B˜Ó(ˆEÙØ—y‘y“{‘��1Ø—{‘{ 1“~�Ø—{‘{ 1“~�Ø—~‘~¨°¸4�~Ó@�ò	 ð
 ˆKô &ð 'Jó Kð Kr}   c                ó¢   — dj                  | j                  |j                  t        d   d¬«      |j                  dz   |j
                  dz   «      S )Nz
{}({}, {})ÚAtomT)Ústrictr¸   )r—   ÚparenthesizeÚparentr2   r°   r¯   r¤   s     r|   Ú_print_MatrixElementz!FCodePrinter._print_MatrixElement   sN   € Ø×"Ñ" 4×#4Ñ#4°T·[±[Ü˜6Ñ"¨4ð $5ó $1Ø26·&±&¸1±*¸d¿f¹fÀq¹jóJð 	Jr}   c           	     óð  — g }g }g }|j                   D ]g  }|j                  r|j                  r|j                  |«       Œ-|j                  r|j                  r|j                  |«       ŒW|j                  |«       Œi |rã|rœt        |«      }t        |Ž }| j                  |«      }|j                  d«      rd}	|dd  }nd}	t        |«      |k  rd|z  }d| j                  t        |Ž «      ›d| j                  t        j                   t        |Ž z  «      ›d|	›d|›�S d| j                  t        |Ž «      ›d| j                  t        j                   t        |Ž z  «      ›d	�S t        j                  | |«      S )
Nú-r¸   ú+z(%s)zcmplx(ú,z) ú ú))rÈ   Ú	is_numberÚis_realr‰   Úis_imaginaryr1   r(   r›   Ú
startswithr'   ÚImaginaryUnitr0   Ú
_print_Add)
rw   rŒ   Ú	pure_realÚpure_imaginaryÚmixedrÌ   ÚPRECÚtermÚtÚsigns
             r|   rô   zFCodePrinter._print_Add  s\  € ð ˆ	ØˆØˆØ—9‘9ò 	"ˆCØ�}Š} §¢Ø× Ñ  Õ%Ø—’ 3×#3Ò#3Ø×%Ñ% cÕ*à—‘˜SÕ!ð	"ñ ÙÜ! $Ó'�Ü˜E�{�Ø—K‘K Ó%�Ø—<‘< Ô$Ø�DØ˜!˜"˜‘Aà�DÜ˜dÓ# dÒ*Ø ™
�Aøð —K‘K¤ Y Õ0Ø—K‘K¤§¡Ð 0´°nÐ1EÑ EÕFÚ™!ðð ð ð& —K‘K¤ Y Õ0Ø—K‘K¤§¡Ð 0´°nÐ1EÑ EÕFðð ô
 ×)Ñ)¨$°Ó5Ð5r}   c                ó  — | j                   d   }|j                  D �cg c]  }t        ||«      ‘Œ }} |j                  |Ž }t	        |t
        «      s| j                  |«      S t        j                  |  |j                  |Ž «      S c c}w rŸ   )	rs   rÈ   r)   ÚfuncÚ
isinstancer,   r›   r0   Ú_print_Function)rw   rŒ   ÚprecÚarÈ   Ú	eval_exprs         r|   rÿ   zFCodePrinter._print_Function+  sy   € à—‘˜{Ñ+ˆØ$(§I¡IÖ.˜q”�!�T•
Ð.ˆÐ.Ø�D—I‘I˜tÐ$ˆ	Ü˜)¤XÔ.Ø—;‘;˜yÓ)Ð)ä×.Ñ.¨t°Y°T·Y±YÀÐ5EÓFÐFùò /s   žBc                ó¼   — | j                   d   dv rd}t        |«      ‚|j                  \  }}dj                  | j	                  |«      | j	                  |«      «      S )NrY   )re   rT   z]Python % operator and SymPy's Mod() function are not supported by Fortran 66 or 77 standards.z      modulo({}, {}))rs   rÝ   rÈ   r—   r›   )rw   rŒ   ÚmsgÚxÚys        r|   Ú
_print_ModzFCodePrinter._print_Mod5  sW   € ð
 �>‰>˜*Ñ%¨Ñ1ð>ˆCä% cÓ*Ð*à—9‘9‰DˆAˆqØ)×0Ñ0°·±¸Q³ÀÇÁÈQÃÓPÐPr}   c                 ó   — y)Nz
cmplx(0,1)r�   r¤   s     r|   Ú_print_ImaginaryUnitz!FCodePrinter._print_ImaginaryUnitB  s   € àr}   c                ó   — t        |«      S r“   ©r£   r¤   s     r|   Ú
_print_intzFCodePrinter._print_intF  s   € Ü�4‹yÐr}   c                óª   — |j                   r2|j                  r&d| j                  t        j                   |z  «      z  S t        j                  | |«      S )Nzcmplx(0,%s))rï   rñ   r›   r'   ró   r0   Ú
_print_Mulr¤   s     r|   r  zFCodePrinter._print_MulI  sK   € à�>Š>˜d×/Ò/Ø Ø—‘œQŸ_™_Ð,¨TÑ1Ó2ñð ô ×)Ñ)¨$°Ó5Ð5r}   c                ó  — t        |«      }t        |j                  d«      r9| j                  t	        d«      «      ›d| j                  |j                  |«      ›�S t        |j                  d«      r†|j                  j                  rR|j                  j                  rd| j                  |j                  «      z  S d| j                  |j                  «      z  S d| j                  |j                  «      z  S t        j                  | |«      S )NrÐ   r¸   ú/g      à?zsqrt(%s.0d0)zsqrt(dble(%s))zsqrt(%s))r1   r-   rA   r›   r!   ræ   ÚbaserÉ   Ú	is_Numberr0   Ú
_print_Pow)rw   rŒ   rø   s      r|   r  zFCodePrinter._print_PowR  sÍ   € Ü˜$ÓˆÜ˜Ÿ™ "Ô%à—‘œJ q›MÕ*Ø×!Ñ! $§)¡)¨TÔ2ðð ô ˜$Ÿ(™( CÔ(Ø�y‰y×#Ò#à—9‘9×&Ò&Ø)¨D¯K©K¸¿	¹	Ó,BÑBÐBà+¨d¯k©k¸$¿)¹)Ó.DÑDÐDà! D§K¡K°·	±	Ó$:Ñ:Ð:ä×)Ñ)¨$°Ó5Ð5r}   c                ód   — t        |j                  «      t        |j                  «      }}d||fz  S )Nz%d.0d0/%d.0d0)Úintr�   Úq)rw   rŒ   r�   r  s       r|   Ú_print_RationalzFCodePrinter._print_Rationale  s*   € Ü�4—6‘6‹{œC §¡›Kˆ1ˆØ ! Q Ñ'Ð'r}   c                ó„   — t        j                  | |«      }|j                  d«      }|dkD  r|d | ›d||dz   d  ›�S d|z  S )NrÞ   rÐ   Údr¸   z%sd0)r0   Ú_print_FloatÚfind)rw   rŒ   ÚprintedrÞ   s       r|   r  zFCodePrinter._print_Floati  sO   € Ü×*Ñ*¨4°Ó6ˆØ�L‰L˜ÓˆØˆrŠ6Ø% b qšk¨7°1°q±5°6©?Ð;Ð;Ø˜ÑÐr}   c                óê   — | j                  |j                  «      }| j                  |j                  «      }|j                  }|| j                  vr|n| j                  |   }dj                  |||«      S )Nz{} {} {})r›   ÚlhsÚrhsÚrel_opÚ_relationalsr—   )rw   rŒ   Úlhs_codeÚrhs_codeÚops        r|   Ú_print_RelationalzFCodePrinter._print_Relationalp  sc   € Ø—;‘;˜tŸx™xÓ(ˆØ—;‘;˜tŸx™xÓ(ˆØ�[‰[ˆØ˜T×.Ñ.Ñ.‰R°D×4EÑ4EÀbÑ4IˆØ× Ñ  ¨2¨xÓ8Ð8r}   c                óÐ   — |j                   D �cg c]  }| j                  |«      ‘Œ }}| j                  |j                  j                  «      ›ddj	                  |«      ›d�S c c}w )Nú(rº   rî   )r¿   r›   r  r½   rÛ   )rw   rŒ   r°   Úindss       r|   Ú_print_IndexedzFCodePrinter._print_Indexedw  sJ   € Ø)-¯©Ö7 A�—‘˜Q•Ð7ˆÐ7ØŸ;™; t§y¡y§¡Õ7¸¿¹À4½ÐIÐIùò 8s   �A#c           	     ó   — | j                  |j                  «      }| j                  |j                  «      }| j                  dj	                  | j                  |«      | j                  |j
                  «      | j                  |«      «      «      S )Nz{0} = {0} {1} {2})r›   r  r  r•   r—   Úbinop)rw   rŒ   r"  r#  s       r|   Ú_print_AugmentedAssignmentz'FCodePrinter._print_AugmentedAssignment{  sp   € Ø—;‘;˜tŸx™xÓ(ˆØ—;‘;˜tŸx™xÓ(ˆØ×"Ñ"Ð#6×#=Ñ#=Ø�K‰K˜Ó! 4§;¡;¨t¯z©zÓ#:¸D¿K¹KÈÓ<Qó$Só Tð 	Tr}   c                óN  — | j                  |j                  «      }|j                  d k7  r!|d| j                  |j                  «      z   z  }|j                  d k7  r!|d| j                  |j                  «      z   z  }|j                  j
                  j                  d«      ›d|›d�S )Nrº   z, mask=r†   r'  rî   )r›   ÚarrayÚdimÚmaskr{   Ú__name__Úrstrip)rw   ÚsmÚparamss      r|   Ú_print_sum_zFCodePrinter._print_sum_�  s‚   € Ø—‘˜RŸX™XÓ&ˆØ�6‰6�TŠ>Ø�d˜TŸ[™[¨¯©Ó0Ñ0Ñ0ˆFØ�7‰7�dŠ?Ø�i $§+¡+¨b¯g©gÓ"6Ñ6Ñ6ˆFØŸ<™<×0Ñ0×7Ñ7¸Õ<ºfÐEÐEr}   c                ó$   — | j                  |«      S r“   )r5  )rw   Úprods     r|   Ú_print_product_zFCodePrinter._print_product_‰  s   € Ø×Ñ Ó%Ð%r}   c                óÌ   ‡ — dg}|j                   dk(  r|j                  d«       d}nd} d|z   dz   j                  dd|j                  rdndi|j	                  ˆ fd	„|¬
«      ¤ŽS )NÚ
concurrentr¸   Ústeprƒ   ú, {step}z*do {concurrent}{counter} = {first}, {last}z
{body}
end do
zconcurrent c                ó&   •— ‰j                  | «      S r“   ©r›   ©rÌ   rw   s    €r|   ú<lambda>z(FCodePrinter._print_Do.<locals>.<lambda>š  s   ø€ ¨$¯+©+°cÓ*:€ r}   )ÚapplyÚexcluder�   )r;  r‰   r—   r:  Úkwargs)rw   ÚdoÚexclr;  s   `   r|   Ú	_print_DozFCodePrinter._print_DoŒ  s}   ø€ Øˆ~ˆØ�7‰7�aŠ<Ø�K‰K˜ÔØ‰DàˆDðØ8¸Ñ=ð ?ñ ÷ ‰&ñ	
ð
 )+¯ª‘}¸2ð
ð �i‰iÓ:ÀDˆiÓIñ
ð 	
r}   c                ó€   ‡ — |j                   dk(  rdnd} d|z   dz   j                  di |j                  ˆ fd„¬«      ¤ŽS )	Nr¸   rƒ   r<  z$({expr}, {counter} = {first}, {last}rî   c                ó&   •— ‰j                  | «      S r“   r>  r?  s    €r|   r@  z3FCodePrinter._print_ImpliedDoLoop.<locals>.<lambda>   s   ø€ ¨4¯;©;°sÓ+;€ r}   ©rA  r�   )r;  r—   rC  )rw   Úidlr;  s   `  r|   Ú_print_ImpliedDoLoopz!FCodePrinter._print_ImpliedDoLoop�  sH   ø€ Ø—X‘X ’]‰r¨
ˆØGÐ6°tÑ;¸CÑ?×GÑGñ 
Ø�j‰jÓ;ˆjÓ<ñ
ð 	
r}   c                ó   — | j                  |j                  «      }t        |j                  t        «      r|j                  j
                  \  }}}nt        d«      ‚| j                  |j                  «      }dj                  |||dz
  ||¬«      S )Nz*Only iterable currently supported is Rangez3do {target} = {start}, {stop}, {step}
{body}
end dor¸   )ÚtargetrÃ   rÄ   r;  Úbody)	r›   rM  rþ   Úiterabler/   rÈ   rÝ   rN  r—   )rw   rŒ   rM  rÃ   rÄ   r;  rN  s          r|   Ú
_print_ForzFCodePrinter._print_For£  s~   € Ø—‘˜TŸ[™[Ó)ˆÜ�d—m‘m¤UÔ+Ø $§¡× 2Ñ 2ÑˆE�4™ä%Ð&RÓSÐSØ�{‰{˜4Ÿ9™9Ó%ˆðç ™&¨°eÀ$ÈÁ(Ø!¨ð !ó .ð	.r}   c                ó  — | j                   j                  ||«      }| j                  j                  ||j                  «      }| j                  j                  |«      }|r(|D ]#  \  }}| j
                  |   j                  |«       Œ% |S r“   )rb   rq   rc   r‡   Útype_modulesrv   r¡   )rw   Útype_Útype_strrv   ÚkÚvs         r|   Ú_print_TypezFCodePrinter._print_Type¯  s€   € Ø×!Ñ!×%Ñ% e¨UÓ3ˆØ×%Ñ%×)Ñ)¨%°·±Ó<ˆØ×'Ñ'×+Ñ+¨EÓ2ˆÙØ#ò +‘��1Ø× Ñ  Ñ#×'Ñ'¨Õ*ð+àˆr}   c                ó    ‡ — dj                  ‰ j                  |j                  «      dj                  ˆ fd„|j                  D «       «      ¬«      S )Nú{symbol}({idxs})rº   c              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr“   r>  ©r®   rÌ   rw   s     €r|   r²   z.FCodePrinter._print_Element.<locals>.<genexpr>»  ó   øè ø€ ÒE°˜DŸK™K¨×,ÑEùó   ƒ©ÚsymbolÚidxs)r—   r›   r_  rÛ   r¿   ©rw   Úelems   ` r|   Ú_print_ElementzFCodePrinter._print_Element¸  sA   ø€ Ø!×(Ñ(Ø—;‘;˜tŸ{™{Ó+Ø—‘ÓE¸¿¹ÔEÓFð )ó 
ð 	
r}   c                ó   — t        |«      S r“   r  )rw   Úexts     r|   Ú_print_ExtentzFCodePrinter._print_Extent¾  s   € Ü�3‹xˆr}   c           
     ó²  ‡ — |j                   }|j                  }|j                  d«      }t        t        t
        fD �cg c]  }||j                  v ‘Œ }}|j                  d«      dk(  rd}n<|j                  d«      dk(  rdg d¢|j                  d«         z  }nt        d‰ z  «      ‚t        |t        «      rt        d	«      ‚‰ j                  d
   dk\  r®dj                  ‰ j                  |j                   «      t"        |j                  v rdnd|rddj%                  ˆ fd„|D «       «      z  nd|t&        |j                  v rdnd‰ j                  |j(                  «      ¬«      }|d k7  r|d‰ j                  |«      z  z  }|S t"        |j                  v s|rt        d«      ‚dj%                  ˆ fd„|j                   |j(                  fD «       «      }|S c c}w )NÚ	dimensionTr   rƒ   r¸   z, intent(%s))ÚinÚoutÚinoutz!Multiple intents specified for %sz1Pointers are not available by default in Fortran.rY   rf   z"{t}{vc}{dim}{intent}{alloc} :: {s}z, parameterz, dimension(%s)rº   c              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr“   r>  r[  s     €r|   r²   z2FCodePrinter._print_Declaration.<locals>.<genexpr>Ó  s   øè ø€ Ò2SÈ°4·;±;¸s×3CÑ2Sùr]  z, allocatable)rú   Úvcr/  ÚintentÚallocÚsz = %sz0F77 init./parameter statem. req. multiple lines.rí   c              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr“   r>  r[  s     €r|   r²   z2FCodePrinter._print_Declaration.<locals>.<genexpr>Ý  s   øè ø€ ÒR°C˜tŸ{™{¨3×/ÑRùr]  )Úvariablerœ   Úattr_paramsr$   r%   r&   ÚattrsÚcountÚindexrt   rþ   r	   rÝ   rs   r—   r›   Útyper
   rÛ   r   r_  )rw   rŒ   rÂ   Úvalr/  rn  ÚintentsÚresults   `       r|   Ú_print_DeclarationzFCodePrinter._print_DeclarationÁ  s¤  ø€ Ø�m‰mˆØ�i‰iˆØ�o‰o˜kÓ*ˆÜ6?ÄÌ\Ð5ZÖ[¨6�6˜SŸY™YÒ&Ð[ˆÐ[Ø�=‰=˜Ó !Ò#Ø‰FØ�]‰]˜4Ó  AÒ%Ø#Ò&<¸W¿]¹]È4Ó=PÑ&QÑQ‰FäÐ@À4ÑGÓHÐHä�cœ7Ô#Ü%Ð&YÓZÐZØ�>‰>˜*Ñ%¨Ò+Ø9×@Ñ@Ø—+‘+˜cŸh™hÓ'Ü$/°3·9±9Ñ$<‘=À"ÙX[Ð%¨¯	©	Ó2SÈsÔ2SÓ(TÒTÐacØÜ)4¸¿	¹	Ñ)A‘oÀrØ—+‘+˜cŸj™jÓ)ð Aó ˆFð �dŠ{Ø˜' D§K¡K°Ó$4Ñ4Ñ4�ð ˆô	 ˜cŸi™iÑ'©3Ü)Ð*\Ó]Ð]Ø—X‘XÓR¸C¿H¹HÀcÇjÁjÐ;QÔRÓSˆFàˆùò5 \s   ¾Gc                ó<   — d| j                  t        d«      «      z  S )Nz(huge(%s) + 1)r   )r›   r!   r¤   s     r|   Ú_print_InfinityzFCodePrinter._print_Infinityâ  s   € Ø $§+¡+¬j¸«mÓ"<Ñ<Ð<r}   c                óN   ‡ —  dj                   di |j                  ˆ fd„¬«      ¤ŽS )Nz$do while ({condition})
{body}
end doc                ó&   •— ‰j                  | «      S r“   r>  r?  s    €r|   r@  z+FCodePrinter._print_While.<locals>.<lambda>ç  s   ø€ ˜dŸk™k¨#Ó.€ r}   rI  r�   ©r—   rC  r¤   s   ` r|   Ú_print_WhilezFCodePrinter._print_Whileå  s4   ø€ Ø>Ð7×>Ñ>ñ 1ÀÇÁÛ.ð BMó B0ñ 1ð 	1r}   c                 ó   — y)Nz.true.r�   r¤   s     r|   Ú_print_BooleanTruezFCodePrinter._print_BooleanTrueé  s   € Ør}   c                 ó   — y)Nz.false.r�   r¤   s     r|   Ú_print_BooleanFalsez FCodePrinter._print_BooleanFalseì  s   € Ør}   c                óâ   — g }|D ]g  }|j                  d«      r3|j                  | j                  d   |dd  j                  «       z   «       ŒG|j                  | j                  d   |z   «       Œi |S )Nú!r�   r¸   r   )rò   r‰   r„   Úlstrip)rw   r©   rz  Úlines       r|   Ú_pad_leading_columnsz!FCodePrinter._pad_leading_columnsï  sj   € ØˆØò 	9ˆDØ�‰˜sÔ#Ø—‘˜dŸj™j¨Ñ3°d¸1¸2°h·o±oÓ6GÑGÕHà—‘˜dŸj™j¨Ñ0°4Ñ7Õ8ð		9ð
 ˆr}   c                óL  ‡‡	— t        dt        j                  z   t        j                  z   «      Št        d«      Š	ˆˆ	fd„}g }| j                  d   dk(  rd}nd}|D �]Ä  }|j                  | j                  d   «      rÌt        |«      d	kD  r¬|j                  d
dd	«      }|dk(  rd	}|d| }||d j                  «       }|j                  |«       |sŒv|j                  d
dd«      }|dk(  st        |«      dk  rd}|d| }||d j                  «       }|j                  | j                  d   ›|›�«       |rŒeŒÜ|j                  |«       Œî|j                  | j                  d   «      r¨ ||d	«      }|d| j                  «       }||d j                  «       }|r||z  }|j                  |«       |s�ŒW ||d«      }|d| j                  «       }||d j                  «       }|r||z  }|j                  | j                  d   ›|›�«       |rŒ[�Œ´|j                  |«       �ŒÇ |S )zøWrap long Fortran lines

           Argument:
             lines  --  a list of lines (without \n character)

           A comment line is split at white space. Code lines are split with a more
           complex rule to give nice results.
        z_+-.z 	()c                óˆ   •‡ — t        ‰ «      |k  rt        ‰ «      S |}ˆ ˆˆfd„} ||«      s|dz  }|dk(  r|S  ||«      sŒ|S )Nc                ó¨   •— ‰|    ‰v xr
 ‰| dz
     ‰vxs= ‰|    ‰vxr
 ‰| dz
     ‰v xs( ‰|    ‰v xr
 ‰| dz
     ‰vxs ‰|    ‰vxr
 ‰| dz
     ‰v S )Nr¸   r�   )Úposr‰  Úmy_alnumÚmy_whites    €€€r|   r@  zDFCodePrinter._wrap_fortran.<locals>.split_pos_code.<locals>.<lambda>	  s”   ø€ Ø�c‘˜hÐ&ÒH¨4°°a±©=ÀÐ+Hò JØ�c‘ (Ð*ÒH¨t°C¸!±G©}ÀÐ/HòJà�c‘˜hÐ&ÒH¨4°°a±©=ÀÐ+HòJð �c‘ (Ð*ÒH¨t°C¸!±G©}ÀÐ/Hð	 r}   r¸   r   )rÚ   )r‰  ÚendposrŽ  Úsplitr�  r�  s   `   €€r|   Úsplit_pos_codez2FCodePrinter._wrap_fortran.<locals>.split_pos_code  sT   ù€ Ü�4‹y˜FÒ"Ü˜4“yÐ ØˆCõJˆEñ
 ˜C”jØ�q‘�Ø˜!’8Ø!�Mñ ˜C•jð ˆJr}   rW   r‚   z &rƒ   r�   éH   rí   é   rÐ   Nr   re   r   éA   r€   )ru   ÚstringÚdigitsÚascii_lettersrs   rò   r„   rÚ   Úrfindrˆ  r‰   r2  )
rw   r©   r“  rz  Útrailingr‰  rŽ  Úhunkr�  r�  s
           @@r|   r§   zFCodePrinter._wrap_fortranø  s  ù€ ô �v¤§¡Ñ-´×0DÑ0DÑDÓEˆÜ�w“<ˆõ	ð ˆØ�>‰>˜/Ñ*¨fÒ4Ø‰HàˆHØó #	$ˆDØ�‰˜tŸz™z¨)Ñ4Ô5ä�t“9˜r’>ØŸ*™* S¨!¨RÓ0�CØ˜b’yØ ˜Ø  ˜:�DØ  ˜:×,Ñ,Ó.�DØ—M‘M $Ô'ÚØ"Ÿj™j¨¨a°Ó4˜Ø "š9¬¨D«	°BªØ"$˜CØ# D S˜z˜Ø# C D˜z×0Ñ0Ó2˜ØŸ™°·
±
¸9Ò0EÁtÐ&LÔMó ð —M‘M $Õ'Ø—‘ §¡¨FÑ!3Ô4á$ T¨2Ó.�Ø˜D˜S�z×(Ñ(Ó*�Ø˜C˜D�z×(Ñ(Ó*�ÙØ˜HÑ$�DØ—‘˜dÔ#ÛÙ(¨¨rÓ2�CØ  ˜:×,Ñ,Ó.�DØ  ˜:×,Ñ,Ó.�DÙØ Ñ(˜Ø—M‘M¨D¯J©J°vÒ,>ÁÐ"EÔFô ð —‘˜dÖ#ðG#	$ðH ˆr}   c                ó¤  — t        |t        «      r1| j                  |j                  d«      «      }dj	                  |«      S | j
                  d   dk(  }|D �cg c]  }|j                  d«      ‘Œ }}d}d}|D �cg c]*  }t        t        t        |j                  |«      «      «      ‘Œ, }}|D �cg c]*  }t        t        t        |j                  |«      «      «      ‘Œ, }}|D �cg c],  }t        t        t        |j                  dd	g«      «      «      ‘Œ. }	}d
}
d
}d}g }t        |«      D ]|  \  }}|dv r|j                  |«       Œ|
||   z  }
|rd|
|z  |z   z  }nd|
z  |z  }|›|›�}|s| j                  |g«      d
   }|j                  |«       |	|   rd|z  }nd
}|
||   z  }
Œ~ |s| j                  |«      S |S c c}w c c}w c c}w c c}w )z0Accepts a string of code or a list of code linesTrƒ   rW   r‚   z 	)r¹   zif(zif zdo
rÑ   ÚprogramÚ	interface)r»   ÚenddorÒ   ÚendifrÑ   zend programzend interfaceú&z&
r   é   )rƒ   rÓ   rí   é   )rþ   r£   r¨   Ú
splitlinesrÛ   rs   rˆ  r  Úanyr¼   rò   ÚendswithrÙ   r‰   rŠ  r§   )rw   r   Ú
code_linesr‚   r‰  Úinc_keywordÚdec_keywordÚincreaseÚdecreaseÚcontinuationÚlevelÚcont_paddingÚtabwidthÚnew_coder°   Úpaddings                   r|   r¨   zFCodePrinter.indent_code?  s  € ä�dœCÔ Ø×)Ñ)¨$¯/©/¸$Ó*?Ó@ˆJØ—7‘7˜:Ó&Ð&à�~‰~˜oÑ.°&Ñ8ˆØ04Ö6¨�—‘˜UÕ#Ð6ˆÐ6àSˆØdˆð "&ö(Øô œœS §¡°+Ó>Ó?Õ@ð (ˆð (ð "&ö(Øô œœS §¡°+Ó>Ó?Õ@ð (ˆð (ð &*ö,Ø!ô œS¤ T§]¡]°S¸%°LÓ!AÓBÕCð ,ˆð ,ð ˆØˆØˆØˆÜ  “ò 	!‰GˆAˆtØ�zÑ!Ø—‘ Ô%ØØ�X˜a‘[Ñ ˆEáØ˜u X™~°Ñ<Ñ=‘à˜e™) HÑ,�á$¡dÐ+ˆDÙØ×0Ñ0°$°Ó8¸Ñ;�à�O‰O˜DÔ!à˜AŠØ  ™z‘à �Ø�X˜a‘[Ñ ‰Eð+	!ñ. Ø×%Ñ% hÓ/Ð/ØˆùòS 7ùò
(ùò(ùò,s   ÁF>Á:/GÂ//GÃ$1Gc                óü   ‡ — |j                   rNdj                  dj                  ˆ fd„|j                  D «       «      ‰ j	                  |j                   «      ¬«      S |j                  \  }d‰ j	                  |«      z  S )Nzgo to ({labels}), {expr}rº   c              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr“   r>  r[  s     €r|   r²   z+FCodePrinter._print_GoTo.<locals>.<genexpr>t  s   øè ø€ Ò!J°s $§+¡+¨c×"2Ñ!Jùr]  )ÚlabelsrŒ   zgo to %s)rŒ   r—   rÛ   rµ  r›   )rw   ÚgotoÚlbls   `  r|   Ú_print_GoTozFCodePrinter._print_GoToq  si   ø€ Ø�9Š9Ø-×4Ñ4Ø—y‘yÓ!J¸d¿k¹kÔ!JÓKØ—[‘[ §¡Ó+ð 5ó ð ð
 —;‘;‰DˆCØ §¡¨CÓ 0Ñ0Ð0r}   c                óN   ‡ —  dj                   di |j                  ˆ fd„¬«      ¤ŽS )Nz"program {name}
{body}
end program
c                ó&   •— ‰j                  | «      S r“   r>  r?  s    €r|   r@  z-FCodePrinter._print_Program.<locals>.<lambda>€  s   ø€ °·±¸SÓ1A€ r}   rI  r�   r€  )rw   Úprogs   ` r|   Ú_print_ProgramzFCodePrinter._print_Program{  s7   ø€ ðð÷ ‰&ñ	Dð —;‘;Ó%A�;ÓBñ	Dð 	Dr}   c                óN   ‡ —  dj                   di |j                  ˆ fd„¬«      ¤ŽS )NzAmodule {name}
{declarations}

contains

{definitions}
end module
c                ó&   •— ‰j                  | «      S r“   r>  r?  s    €r|   r@  z,FCodePrinter._print_Module.<locals>.<lambda>‰  s   ø€ °·±¸CÓ0@€ r}   rI  r�   r€  )rw   Úmods   ` r|   Ú_print_ModulezFCodePrinter._print_Module‚  s7   ø€ ðð÷
 ‰&ñCð —:‘:Ó$@�:ÓAñCð 	Cr}   c                ó:  — |j                   dk(  r1| j                  d   dk\  r| j                  d   j                  d«       y|j                   dk(  r1| j                  d   dk\  r| j                  d   j                  d«       y	|j                   dk(  ry
|j                   S )Nr   rY   rh   rP   zstdint=>input_unitÚ
input_unitr   zstdint=>error_unitÚ
error_unitÚ*)r‡   rs   rv   r¡   )rw   Ústrms     r|   Ú_print_StreamzFCodePrinter._print_Stream‹  s�   € Ø�9‰9˜Ò  T§^¡^°JÑ%?À4Ò%GØ×Ñ˜_Ñ-×1Ñ1Ð2FÔGØØ�Y‰Y˜(Ò" t§~¡~°jÑ'AÀTÒ'IØ×Ñ˜_Ñ-×1Ñ1Ð2FÔGØà�y‰y˜HÒ$Øà—y‘yÐ r}   c                ó.  ‡ — |j                   t        k(  rd}d}nHddt        dt        dij	                  |j
                  d«      iz  }‰ j                  |j                   «      }|j                  |dj                  ˆ fd„|j                  D «       «      ¬	«      S )
Nzprint {fmt}, {iolist}rÄ  z3write(%(out)s, fmt="{fmt}", advance="no"), {iolist}rj  Ú0Ú6rº   c              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr“   r>  r[  s     €r|   r²   z,FCodePrinter._print_Print.<locals>.<genexpr>¢  s   øè ø€ Ò7 #ˆT�[‰[˜×Ñ7ùr]  )ÚfmtÚiolist)
Úformat_stringr   r   r   rq   Úfiler›   r—   rÛ   Ú
print_args)rw   ÚpsÚtemplaterË  s   `   r|   Ú_print_PrintzFCodePrinter._print_Print˜  sŒ   ø€ Ø×ÑœtÒ#Ø.ˆHØ‰CàLØœ ¤V¨SÐ1×5Ñ5°b·g±g¸sÓCðPñ ˆHð —+‘+˜b×.Ñ.Ó/ˆCØ�‰ 3¨t¯y©yÛ7¨¯©Ô7ó09ˆó :ð 	:r}   c                ó–   — |j                   \  }dj                  | j                  j                  dd«      | j	                  |«      ¬«      S )Nz{result_name} = {arg}Úresult_nameÚsympy_result)rÔ  rÌ   )rÈ   r—   Ú_contextrq   r›   )rw   ÚrsrÌ   s      r|   Ú_print_ReturnzFCodePrinter._print_Return¤  sE   € Ø�w‰w‰ˆØ&×-Ñ-ØŸ™×)Ñ)¨-¸ÓHØ—‘˜CÓ ð .ó 
ð 	
r}   c                óL   — |j                   \  }|rd| j                  |«      z  S y)Nz	return %sÚreturn)rÈ   r›   )rw   ÚfrsrÌ   s      r|   Ú_print_FortranReturnz!FCodePrinter._print_FortranReturn«  s'   € Ø�x‰x‰ˆÙØ §¡¨SÓ!1Ñ1Ð1àr}   c                ó¼  ‡ — |j                  d«      }|€d}n|rd|d   z  nd}‰ j                  j                  dd «      }dj                  |‰ j	                  |j
                  «      dj                  |j                  D �cg c]  }‰ j	                  |j                  «      ‘Œ c}«      |rd	|z  nd|d
j                  ˆ fd„|j                  D «       «      ¬«      S c c}w )NÚbind_Crƒ   z bind(C, name="%s")r   z bind(C)rÔ  z<{entity}{name}({arg_names}){result}{bind}
{arg_declarations}rº   z result(%s)rÓ   c              3  óR   •K  — | ]  }‰j                  t        |«      «      –— Œ  y ­wr“   )r›   r   r[  s     €r|   r²   z%FCodePrinter._head.<locals>.<genexpr>Â  s   øè ø€ Ò'_È#¨¯©´KÀÓ4D×(EÑ'_ùs   ƒ$')Úentityr‡   Ú	arg_namesrz  ÚbindÚarg_declarations)	rs  rs   rq   r—   r›   r‡   rÛ   Ú
parametersr_  )rw   rà  ÚfprC  Úbind_C_paramsrâ  rÔ  rÌ   s   `       r|   Ú_headzFCodePrinter._head²  sÉ   ø€ ØŸ™ xÓ0ˆØÐ Ø‰Dá?LÐ(¨=¸Ñ+;Ò;ÐR\ˆDØ—n‘n×(Ñ(¨¸Ó=ˆð!ç
‰&ØØ—‘˜RŸW™WÓ%Ø—i‘iÀBÇMÁMÖ R¸S §¡¨S¯Z©ZÕ!8Ò RÓSÙ4?�M KÒ/ÀRØØ!ŸY™YÓ'_ÐQS×Q^ÑQ^Ô'_Ó`ð ó 
ð
	
ùò !Ss   Á?"Cc                óš   — dj                  | j                  |j                  «      «      }dj                  | j                  ||«      ¬«      S )Nú{} function z4interface
{function_head}
end function
end interface)Úfunction_head)r—   r›   Úreturn_typerç  )rw   rå  rà  s      r|   Ú_print_FunctionPrototypez%FCodePrinter._print_FunctionPrototypeÅ  sB   € Ø×&Ñ& t§{¡{°2·>±>Ó'BÓCˆð÷ ‰&˜tŸz™z¨&°"Ó5ˆ&Ó
6ð	7r}   c                ó‚  — t         |j                  v rd}nt        |j                  v rd}nd}dj                  | j	                  |j
                  «      «      }t        | |j                  ¬«      5  dj                  || j                  ||«      | j	                  |j                  «      ¬«      cd d d «       S # 1 sw Y   y xY w)Nz
elemental zpure rƒ   ré  )rÔ  z,{prefix}{function_head}
{body}
end function
)Úprefixrê  rN  )
r"   rt  r#   r—   r›   rë  r3   r‡   rç  rN  )rw   Úfdrî  rà  s       r|   Ú_print_FunctionDefinitionz&FCodePrinter._print_FunctionDefinitionÎ  s    € Ü˜Ÿ™Ñ Ø!‰FÜ�R—X‘XÑØ‰FàˆFà×&Ñ& t§{¡{°2·>±>Ó'BÓCˆÜ˜T¨r¯w©wÔ7ñ 		ð!÷ ‰fØØ"Ÿj™j¨°Ó4Ø—[‘[ §¡Ó)ð ó ÷		÷ 		ò 		ús   Á.=B5Â5B>c                óz   — dj                  | j                  d|«      | j                  |j                  «      ¬«      S )Nz({subroutine_head}
{body}
end subroutine
zsubroutine )Úsubroutine_headrN  )r—   rç  r›   rN  )rw   Úsubs     r|   Ú_print_SubroutinezFCodePrinter._print_Subroutineâ  s;   € ð÷ ‰&Ø ŸJ™J }°cÓ:Ø—‘˜SŸX™XÓ&ð ó 
ð		
r}   c                ó    ‡ — dj                  ‰ j                  |j                  «      dj                  ˆ fd„|j                  D «       «      ¬«      S )Nzcall {name}({args})rº   c              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr“   r>  r[  s     €r|   r²   z5FCodePrinter._print_SubroutineCall.<locals>.<genexpr>ï  s   øè ø€ ÒN°˜DŸK™K¨×,ÑNùr]  )r‡   rÈ   )r—   r›   r‡   rÛ   Úsubroutine_args)rw   Úscalls   ` r|   Ú_print_SubroutineCallz"FCodePrinter._print_SubroutineCallì  sC   ø€ Ø$×+Ñ+Ø—‘˜UŸZ™ZÓ(Ø—‘ÓN¸×8MÑ8MÔNÓOð ,ó 
ð 	
r}   c                óF   ‡ — dt        ˆ fd„|j                  D «       «      z  S )Nz%s => %sc              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr“   r>  r[  s     €r|   r²   z1FCodePrinter._print_use_rename.<locals>.<genexpr>ó  s   øè ø€ Ò"H¸ 4§;¡;¨s×#3Ñ"Hùr]  )ÚtuplerÈ   )rw   Úrnms   ` r|   Ú_print_use_renamezFCodePrinter._print_use_renameò  s   ø€ ØœEÓ"H¸s¿x¹xÔ"HÓIÑIÐIr}   c           
     óŠ  — d| j                  |j                  «      z  }|j                  d k7  r>|ddj                  |j                  D �cg c]  }| j                  |«      ‘Œ c}«      z   z  }|j                  d k7  r>|ddj                  |j                  D �cg c]  }| j                  |«      ‘Œ c}«      z   z  }|S c c}w c c}w )Nzuse %srº   z, only: )r›   Ú	namespaceÚrenamerÛ   Úonly)rw   Úuserz  rý  Únlys        r|   Ú
_print_usezFCodePrinter._print_useõ  sŸ   € Ø˜DŸK™K¨¯©Ó6Ñ6ˆØ�:‰:˜ÒØ�d˜TŸY™YÀCÇJÁJÖ'O¸S¨¯©°CÕ(8Ò'OÓPÑPÑPˆFØ�8‰8�tÒØ�j 4§9¡9È#Ï(É(Ö-SÀ3¨d¯k©k¸#Õ.>Ò-SÓ#TÑTÑTˆFØˆùò (Pùâ-Ss   Á	B;ÂC c                 ó   — y)NÚexitr�   ©rw   r†   s     r|   Ú_print_BreakTokenzFCodePrinter._print_BreakTokený  s   € Ør}   c                 ó   — y)NÚcycler�   r  s     r|   Ú_print_ContinueTokenz!FCodePrinter._print_ContinueToken   s   € Ør}   c                ó~   ‡ — ‰ j                   d   dk\  rdnd}|dj                  ˆ fd„|j                  D «       «      z  S )NrY   rh   z[%s]z(/%s/)rº   c              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr“   r>  r[  s     €r|   r²   z7FCodePrinter._print_ArrayConstructor.<locals>.<genexpr>  s   øè ø€ Ò"K¸ 4§;¡;¨s×#3Ñ"Kùr]  )rs   rÛ   Úelements)rw   ÚacÚfmtstrs   `  r|   Ú_print_ArrayConstructorz$FCodePrinter._print_ArrayConstructor  s8   ø€ ØŸ>™>¨*Ñ5¸Ò=‘À8ˆØ˜Ÿ	™	Ó"K¸r¿{¹{Ô"KÓLÑLÐLr}   c                ó    ‡ — dj                  ‰ j                  |j                  «      dj                  ˆ fd„|j                  D «       «      ¬«      S )NrY  rº   c              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr“   r>  r[  s     €r|   r²   z3FCodePrinter._print_ArrayElement.<locals>.<genexpr>
  r\  r]  r^  )r—   r›   r‡   rÛ   r¿   ra  s   ` r|   Ú_print_ArrayElementz FCodePrinter._print_ArrayElement  sA   ø€ Ø!×(Ñ(Ø—;‘;˜tŸy™yÓ)Ø—‘ÓE¸¿¹ÔEÓFð )ó 
ð 	
r}   r“   )[r1  Ú
__module__Ú__qualname__Ú__doc__ÚprintmethodÚlanguager   r   r   r   r   r   rb   r   r   r   r   r   r   r   r   rc   rR  rk   r0   r[   Ú__annotations__Ú
_operatorsr!  ro   Úpropertyr„   r‹   r‘   r•   r™   r�   r¥   rª   r¶   rÅ   rÎ   râ   rè   rô   rÿ   r  r	  r  r  r  r  r  r%  r)  r,  r5  r8  rF  rK  rP  rW  rc  rf  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  Ú__classcell__)r{   s   @r|   rL   rL   F   s+  ø… ÙKØ€KØ€Hð 	�ØˆgØ�*ð€Lð 	ÐØ�Ø�Ø�Ø�;Ø�LØˆkØˆ{Øˆ{Øˆ{Øˆyð€Mð 	ˆ Ð(ð€Lñ )-¨[×-JÑ-Jñ )ØØØ ØØØñOñ )Ð�~ó ð ØØØØñ€Jð 	ˆdð€Lõ,ð( ñ\ó ð\ôò"òò#òFòò;òBò	'ò	%ò(KòTJò%6òNGòQòòò6ò6ò&(ò ò9òJòTòFò&ò
ò"
ò
.òò
òòòB=ò1òòòòEòN0òd1òDòCò!ò
:ò
òò
ò&7òò(
ò
òJòòòòMö
r}   rL   )Er  Ú
__future__r   Útypingr   Úcollectionsr   Ú	itertoolsr   r—  Úsympy.codegen.astr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Úsympy.codegen.fnodesr   r   r   r   r    r!   r"   r#   r$   r%   r&   Ú
sympy.corer'   r(   r)   r*   r+   Úsympy.core.functionr,   Úsympy.core.numbersr-   Úsympy.core.relationalr.   Ú
sympy.setsr/   Úsympy.printing.codeprinterr0   Úsympy.printing.precedencer1   r2   Úsympy.printing.printerr3   r4   r5   rp   rL   r�   r}   r|   ú<module>r-     sL  ðñõ& #Ý å #Ý Û ÷÷ ÷ ÷ ÷ õ ÷
÷ ÷ ñ ÷ 0Õ /Ý (Ý +Ý $Ý Ý 2ß <Ý 2÷ :ðØ	ˆ5ðà	ˆ5ðð 
ˆ5ðð ˆFð	ð
 ˆFðð ˆFðð ˆWðð ˆFðð ˆFðð ˆFðð 
ˆ5ðð 
ˆ5ðð 
ˆ5ðð 
ˆ5ðð �ðð  
ˆ5ð!ð" 
ˆ5ð#€ô*E
�;õ E
r}   