§
    OŠtjÛ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;¦  «        ZDdS ))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j        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,d0„ Z-d1„ Z.d2„ Z/d3„ Z0d4„ Z1d5„ Z2d6„ Z3d7„ Z4d8„ Z5d9„ Z6d:„ Z7d;„ Z8d<„ Z9d=„ Z:d>„ Z;d?„ Z<d@„ Z=dA„ Z>dB„ Z?dC„ Z@dD„ ZAdE„ ZBdF„ ZCdG„ ZDdH„ ZEdI„ ZFdJ„ ZGdK„ ZHdL„ ZIdM„ ZJdN„ ZKdO„ ZLdP„ ZMdQ„ ZNdR„ ZOdS„ ZPdT„ ZQdU„ ZRdV„ ZSdW„ ZTdX„ ZUdY„ ZVdZ„ ZWd[„ 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/=Nc           	     ó  •— |si }i | _         g | _        t          t          | j                             ¦   «         |                     di ¦  «                             ¦   «         ¦  «        ¦  «        | _        t          t          | j                             ¦   «         |                     di ¦  «                             ¦   «         ¦  «        ¦  «        | _        t          ¦   «          	                    |¦  «         t          t          ¦  «        | _
        |                     di ¦  «        }| j
                             |¦  «         h d£}| j        d         |vrt          d| j        d         z  ¦  «        ‚t          t           ¦  «        | _        d S )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/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/printing/fortran.pyro   zFCodePrinter.__init__x   sk  ø€ Øð 	ØˆHØ!ˆÔØˆŒÝ ¥ tÔ'8×'>Ò'>Ñ'@Ô'@Ø'/§|¢|°NÀBÑ'GÔ'G×'MÒ'MÑ'OÔ'Oñ"Qô "Qñ Rô RˆÔå!¥%¨Ô(:×(@Ò(@Ñ(BÔ(BØ(0¯ª°_ÀbÑ(IÔ(I×(OÒ(OÑ(QÔ(Qñ#Sô #Sñ Tô TˆÔå‰Œ×Ò˜Ñ"Ô"Ð"Ý#¥OÑ4Ô4ˆÔØ—L’LÐ!1°2Ñ6Ô6ˆ	ØÔ×#Ò# IÑ.Ô.Ð.à0Ð0Ð0ˆ	ØŒ>˜*Ô%¨YÐ6Ð6ÝÐ;¸d¼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Œ   sa   € àŒ>˜/Ô*¨gÒ5Ð5Ø$¨iÀHÐMÐMÐMØŒ^˜OÔ,°Ò6Ð6Ø¨¸TÐBÐBÐBåÐ8¸4¼>È/Ô;ZÑZÑ[Ô[Ð[r}   c                óè  •— | j         d         dk    r¾|| j        vr›|j        }|                     ¦   «         | j        v r |dz  }|                     ¦   «         | j        v ° | j                             |                     ¦   «         ¦  «         ||j        k    r|| j        |<   nt          |¦  «        | 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Ð2Ø˜4Ô/Ð/Ð/Ø”y�Ø—j’j‘l”l d¤nÐ4Ð4Ø˜C‘K�Dð —j’j‘l”l d¤nÐ4Ð4à”×%Ò% d§j¢j¡l¤lÑ3Ô3Ð3Ø˜4œ9Ò$Ð$Ø15�DÔ(¨Ñ.Ð.å17¸±´�DÔ(¨Ñ.à—=’= Ô!5Ñ6Ô6ˆDå‰wŒ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                      |¦  «        S )Nz! {})Úformat)rw   Útexts     r|   Ú_get_commentzFCodePrinter._get_comment¬   s   € Ø�}Š}˜TÑ"Ô"Ð"r}   c                óT   — d                      ||                      |¦  «        ¦  «        S )Nzparameter ({} = {}))r—   Ú_print)rw   r‡   Úvalues      r|   Ú_declare_number_constz"FCodePrinter._declare_number_const¯   s$   € Ø$×+Ò+¨D°$·+²+¸eÑ2DÔ2DÑEÔEÐEr}   c           	     ó®   — | j                              |t          |                     | j        d         ¦  «        ¦  «        f¦  «         t          |¦  «        S )NrU   )Ú_number_symbolsÚaddr*   Úevalfrs   Ústr©rw   rŒ   s     r|   Ú_print_NumberSymbolz FCodePrinter._print_NumberSymbol²   sG   € ð 	Ô× Ò  $­¨d¯jªj¸¼ÈÔ9TÑ.UÔ.UÑ(VÔ(VÐ!WÑXÔXÐXÝ�4‰yŒyÐr}   c                óR   — |                       |                      |¦  «        ¦  «        S r“   )Ú_wrap_fortranÚindent_code)rw   Úliness     r|   Ú_format_codezFCodePrinter._format_code¸   s$   € Ø×!Ò! $×"2Ò"2°5Ñ"9Ô"9Ñ:Ô:Ð:r}   c                óN   ‡— |j         \  Š}ˆfd„t          |¦  «        D ¦   «         S )Nc              3  óD   •K  — | ]}t          ‰¦  «        D ]}||fV — Œ	Œd S r“   )Úrange)Ú.0ÚjÚiÚrowss      €r|   ú	<genexpr>z8FCodePrinter._traverse_matrix_indices.<locals>.<genexpr>½   s:   øè è € ÐAÐA˜1µU¸4±[´[ÐAÐA°��A�ÐAÐAÐAÐAÐAÐAÐAr}   )Úshaper¬   )rw   ÚmatÚcolsr°   s      @r|   Ú_traverse_matrix_indicesz%FCodePrinter._traverse_matrix_indices»   s.   ø€ Ø”Y‰
ˆˆdØAÐAÐAÐA¥ d¡¤ÐAÑAÔAÐAr}   c           	     óä   — g }g }|D ]f}t          | j        |j        |j        dz   |j        dz   g¦  «        \  }}}|                     d|›d|›d|›�¦  «         |                     d¦  «         Œg||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˜aœg¨™k¨1¬7°Q©;Ð7ñ 9ô  9ÑˆC�˜à×ÒÐ°#°#°#°u°u°u¸d¸dÐCÑDÔDÐDØ×Ò˜xÑ(Ô(Ð(Ð(Ø˜;Ð&Ð&r}   c           
     óL  — ddl m} |j        \  }|j        r.t	          dt          d|¦  «        t          |d¦  «        ¦  «        }nÌ|j        s|j        rjt	          t          t          d¦  «        t          d¦  «        ¦  «        | ||¦  «        z  t           ||¦  «        t          d¦  «        ¦  «        ¦  «        }nTt	          t          d¦  «        t          t          d¦  «        |¦  «        t          |t          d¦  «        ¦  «        ¦  «        }|                      |¦  «        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‰ˆØŒ>ð 	_Ý˜Q¥ a¨¡¤­r°#°q©z¬zÑ:Ô:ˆHˆHØŒnð 	_ ¤ð 	_Ý�U¥:¨a¡=¤=µ*¸Q±-´-Ñ@Ô@À#ÀcÀcÈ#ÁhÄhÁ,ÕPRÐSVÐSVÐWZÑS[ÔS[Õ]gÐhiÑ]jÔ]jÑPkÔPkÑlÔlˆHˆHå�Z¨™]œ]­Eµ*¸Q±-´-ÀÑ,EÔ,EÅrÈ#ÍzÐZ[É}Ì}ÑG]ÔG]Ñ^Ô^ˆHØ�{Š{˜8Ñ$Ô$Ð$r}   c                ó  — |j         d         j        dk    rt          d¦  «        ‚g }|                     t          ¦  «        �rt          |j         ¦  «        D ]Ä\  }\  }}|dk    r,|                     d|                      |¦  «        z  ¦  «         nb|t          |j         ¦  «        dz
  k    r|dk    r|                     d¦  «         n+|                     d|                      |¦  «        z  ¦  «         |                     |                      |¦  «        ¦  «         ŒÅ|                     d	¦  «         d
 	                    |¦  «        S | j
        d         dk    r¢d}|                      |j         d         j        ¦  «        }t          |j         d d…         ¦  «        }|r[|                     ¦   «         \  }}|                      |¦  «        }|                      |¦  «        }	|                     |||	¬¦  «        }|°[|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�RŒ=Ô Ò%Ð%õ ð /ñ 0ô 0ð 0ð
 ˆØ�8Š8•JÑÔñ 	KÝ& t¤yÑ1Ô1ð -ð -‘	�‘6�A�qØ˜’6�6Ø—L’L °$·+²+¸a±.´.Ñ!@ÑAÔAÐAÐAØ�#˜dœi™.œ.¨1Ñ,Ò,Ð,°°d²°Ø—L’L Ñ(Ô(Ð(Ð(à—L’LÐ!4°t·{²{À1±~´~Ñ!EÑFÔFÐFØ—’˜TŸ[š[¨™^œ^Ñ,Ô,Ð,Ð,Ø�LŠL˜Ñ"Ô"Ð"Ø—9’9˜UÑ#Ô#Ð#ØŒ^˜JÔ'¨2Ò-Ð-ð 0ˆGØ—;’;˜tœy¨œ}Ô1Ñ2Ô2ˆDÝ˜œ 3 B 3œÑ(Ô(ˆEØð AØ—y’y‘{”{‘��1Ø—{’{ 1‘~”~�Ø—{’{ 1‘~”~�Ø—~’~¨°¸4�~Ñ@Ô@�ð	 ð Að
 ˆKõ &ð 'Jñ Kô Kð Kr}   c                óœ   — d                      |                      |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   sS   € Ø×"Ò" 4×#4Ò#4°T´[Ý˜6Ô"¨4ð $5ñ $1ô $1Ø26´&¸1±*¸d¼fÀq¹jñJô Jð 	Jr}   c           	     ó  — g }g }g }|j         D ]_}|j        r|j        r|                     |¦  «         Œ&|j        r|j        r|                     |¦  «         ŒJ|                     |¦  «         Œ`|�r|r¹t          |¦  «        }t          |Ž }|                      |¦  «        }|                     d¦  «        rd}	|dd …         }nd}	t          |¦  «        |k     rd|z  }d|                      t          |Ž ¦  «        ›d|                      t          j
         t          |Ž z  ¦  «        ›d|	›d|›�S d|                      t          |Ž ¦  «        ›d|                      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ð 	"ð 	"ˆCØŒ}ð " ¤ð "Ø× Ò  Ñ%Ô%Ð%Ð%Ø”ð " 3Ô#3ð "Ø×%Ò% cÑ*Ô*Ð*Ð*à—’˜SÑ!Ô!Ð!Ð!Øñ 	6Øð Ý! $Ñ'Ô'�Ý˜E�{�Ø—K’K Ñ%Ô%�Ø—<’< Ñ$Ô$ð Ø�DØ˜!˜"˜"œ�A�Aà�DÝ˜dÑ#Ô# dÒ*Ð*Ø ™
�Aøð —K’K¥ Y Ñ0Ô0Ð0Ð0Ø—K’K¥¤Ð 0µ°nÐ1EÑ EÑFÔFÐFÐFØ�D�D˜!˜!ðð ðð& —K’K¥ Y Ñ0Ô0Ð0Ð0Ø—K’K¥¤Ð 0µ°nÐ1EÑ EÑFÔFÐFÐFðð õ
 Ô)¨$°Ñ5Ô5Ð5r}   c                óæ   ‡— | j         d         Šˆfd„|j        D ¦   «         } |j        |Ž }t          |t          ¦  «        s|                      |¦  «        S t          j        |  |j        |Ž ¦  «        S )NrU   c                ó0   •— g | ]}t          |‰¦  «        ‘ŒS r�   )r)   )r­   ÚaÚprecs     €r|   ú
<listcomp>z0FCodePrinter._print_Function.<locals>.<listcomp>.  s!   ø€ Ð.Ð.Ð.˜q•�!�T‘
”
Ð.Ð.Ð.r}   )rs   rÇ   ÚfuncÚ
isinstancer,   r›   r0   Ú_print_Function)rw   rŒ   rÇ   Ú	eval_exprrþ   s       @r|   r  zFCodePrinter._print_Function+  sy   ø€ à”˜{Ô+ˆØ.Ð.Ð.Ð. D¤IÐ.Ñ.Ô.ˆØ�D”I˜tÐ$ˆ	Ý˜)¥XÑ.Ô.ð 	GØ—;’;˜yÑ)Ô)Ð)åÔ.¨t°Y°T´YÀÐ5EÑFÔFÐFr}   c                óÎ   — | j         d         dv rd}t          |¦  «        ‚|j        \  }}d                     |                      |¦  «        |                      |¦  «        ¦  «        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  s`   € ð
 Œ>˜*Ô%¨Ð1Ð1ð>ˆCå% cÑ*Ô*Ð*à”9‰DˆAˆqØ)×0Ò0°·²¸Q±´ÀÇÂÈQÁÄÑPÔPÐPr}   c                ó   — dS )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ŒyÐr}   c                ó”   — |j         r-|j        r&d|                      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  sQ   € àŒ>ð 	6˜dÔ/ð 	6Ø Ø—’�Qœ_Ð,¨TÑ1Ñ2Ô2ñð õ Ô)¨$°Ñ5Ô5Ð5r}   c                óü  — t          |¦  «        }t          |j        d¦  «        r@|                      t	          d¦  «        ¦  «        ›d|                      |j        |¦  «        ›�S t          |j        d¦  «        ro|j        j        rF|j        j        rd|                      |j        ¦  «        z  S d|                      |j        ¦  «        z  S d|                      |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ï   € Ý˜$ÑÔˆÝ˜œ "Ñ%Ô%ð 	6à—’�J q™MœMÑ*Ô*Ð*Ð*Ø×!Ò! $¤)¨TÑ2Ô2Ð2ðð õ ˜$œ( CÑ(Ô(ð 
	6ØŒyÔ#ð ;à”9Ô&ð EØ)¨D¯KªK¸¼	Ñ,BÔ,BÑBÐBà+¨d¯kªk¸$¼)Ñ.DÔ.DÑDÐDà! D§K¢K°´	Ñ$:Ô$:Ñ:Ð:åÔ)¨$°Ñ5Ô5Ð5r}   c                ó`   — 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‰{Œ{�C ¤™KœKˆ1ˆØ ! Q Ñ'Ð'r}   c                ó    — t          j        | |¦  «        }|                     d¦  «        }|dk    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  s^   € ÝÔ*¨4°Ñ6Ô6ˆØ�LŠL˜ÑÔˆØˆrŠ6ˆ6Ø% b q bœk˜k˜k¨7°1°q±5°6°6¬?¨?Ð;Ð;Ø˜ÑÐr}   c                óÖ   — |                       |j        ¦  «        }|                       |j        ¦  «        }|j        }|| j        vr|n| j        |         }d                     |||¦  «        S )Nz{} {} {})r›   ÚlhsÚrhsÚrel_opÚ_relationalsr—   )rw   rŒ   Úlhs_codeÚrhs_codeÚops        r|   Ú_print_RelationalzFCodePrinter._print_Relationalp  se   € Ø—;’;˜tœxÑ(Ô(ˆØ—;’;˜tœxÑ(Ô(ˆØŒ[ˆØ˜TÔ.Ð.Ð.ˆRˆR°DÔ4EÀbÔ4IˆØ× Ò  ¨2¨xÑ8Ô8Ð8r}   c                óš   ‡ — ˆ fd„|j         D ¦   «         }‰                      |j        j        ¦  «        ›dd                     |¦  «        ›d�S )Nc                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r�   ©r›   )r­   r¯   rw   s     €r|   rÿ   z/FCodePrinter._print_Indexed.<locals>.<listcomp>x  s#   ø€ Ð7Ð7Ð7 A�—’˜Q‘”Ð7Ð7Ð7r}   ú(r¹   rí   )r¾   r›   r  r¼   rÚ   )rw   rŒ   Úindss   `  r|   Ú_print_IndexedzFCodePrinter._print_Indexedw  sM   ø€ Ø7Ð7Ð7Ð7¨¬Ð7Ñ7Ô7ˆØŸ;š; t¤y¤Ñ7Ô7Ð7Ð7¸¿ºÀ4¹¼¸¸ÐIÐIr}   c           	     ó:  — |                       |j        ¦  «        }|                       |j        ¦  «        }|                      d                     |                       |¦  «        |                       |j        ¦  «        |                       |¦  «        ¦  «        ¦  «        S )Nz{0} = {0} {1} {2})r›   r  r   r•   r—   Úbinop)rw   rŒ   r#  r$  s       r|   Ú_print_AugmentedAssignmentz'FCodePrinter._print_AugmentedAssignment{  s…   € Ø—;’;˜tœxÑ(Ô(ˆØ—;’;˜tœxÑ(Ô(ˆØ×"Ò"Ð#6×#=Ò#=Ø�KŠK˜Ñ!Ô! 4§;¢;¨t¬zÑ#:Ô#:¸D¿KºKÈÑ<QÔ<Qñ$Sô $Sñ Tô Tð 	Tr}   c                ó,  — |                       |j        ¦  «        }|j        d k    r |d|                       |j        ¦  «        z   z  }|j        d k    r |d|                       |j        ¦  «        z   z  }|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Ñ&Ô&ˆØŒ6�TŠ>ˆ>Ø�d˜TŸ[š[¨¬Ñ0Ô0Ñ0Ñ0ˆFØŒ7�dŠ?ˆ?Ø�i $§+¢+¨b¬gÑ"6Ô"6Ñ6Ñ6ˆFØœ<Ô0×7Ò7¸Ñ<Ô<Ð<Ð<¸f¸f¸fÐEÐEr}   c                ó,   — |                       |¦  «        S r“   )r8  )rw   Úprods     r|   Ú_print_product_zFCodePrinter._print_product_‰  s   € Ø×Ò Ñ%Ô%Ð%r}   c                óÀ   ‡ — dg}|j         dk    r|                     d¦  «         d}nd} d|z   dz   j        dd|j        rdndi|                     ˆ fd	„|¬
¦  «        ¤ŽS )NÚ
concurrentr·   Ústeprƒ   ú, {step}z*do {concurrent}{counter} = {first}, {last}z
{body}
end do
zconcurrent c                ó.   •— ‰                      | ¦  «        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�aŠ<ˆ<Ø�KŠK˜ÑÔÐØˆDˆDàˆDðØ8¸Ñ=ð ?ñ ô ð	
ð 
ð
 )+¬Ð=�}�}¸2ð
ð �iŠiÐ:Ð:Ð:Ð:ÀDˆiÑIÔIð
ð 
ð 	
r}   c                óv   ‡ — |j         dk    rdnd} d|z   dz   j        di |                     ˆ fd„¬¦  «        ¤ŽS )	Nr·   rƒ   r?  z$({expr}, {counter} = {first}, {last}rí   c                ó.   •— ‰                      | ¦  «        S r“   r)  rA  s    €r|   rB  z3FCodePrinter._print_ImpliedDoLoop.<locals>.<lambda>   s   ø€ ¨4¯;ª;°sÑ+;Ô+;€ r}   ©rC  r�   )r>  r—   rE  )rw   Úidlr>  s   `  r|   Ú_print_ImpliedDoLoopz!FCodePrinter._print_ImpliedDoLoop�  s]   ø€ Ø”X ’]�]ˆrˆr¨
ˆØGÐ6°tÑ;¸CÑ?ÔGð 
ð 
Ø�jŠjÐ;Ð;Ð;Ð;ˆjÑ<Ô<ð
ð 
ð 	
r}   c                ó  — |                       |j        ¦  «        }t          |j        t          ¦  «        r|j        j        \  }}}nt          d¦  «        ‚|                       |j        ¦  «        }d                     |||dz
  ||¬¦  «        S )Nz*Only iterable currently supported is Rangez3do {target} = {start}, {stop}, {step}
{body}
end dor·   )ÚtargetrÂ   rÃ   r>  Úbody)	r›   rO  r  Úiterabler/   rÇ   rÜ   rP  r—   )rw   rŒ   rO  rÂ   rÃ   r>  rP  s          r|   Ú
_print_ForzFCodePrinter._print_For£  sŒ   € Ø—’˜Tœ[Ñ)Ô)ˆÝ�d”m¥UÑ+Ô+ð 	TØ $¤Ô 2ÑˆE�4˜˜å%Ð&RÑSÔSÐSØ�{Š{˜4œ9Ñ%Ô%ˆðç š&¨°eÀ$ÈÁ(Ø!¨ð !ñ .ô .ð	.r}   c                ó  — | j                              ||¦  «        }| j                             ||j        ¦  «        }| j                             |¦  «        }|r(|D ]%\  }}| 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Ô3ˆØÔ%×)Ò)¨%°´Ñ<Ô<ˆØÔ'×+Ò+¨EÑ2Ô2ˆØð 	+Ø#ð +ð +‘��1ØÔ  Ô#×'Ò'¨Ñ*Ô*Ð*Ð*Øˆr}   c                óª   ‡ — d                      ‰                      |j        ¦  «        d                     ˆ fd„|j        D ¦   «         ¦  «        ¬¦  «        S )Nú{symbol}({idxs})r¹   c              3  óB   •K  — | ]}‰                      |¦  «        V — Œd S r“   r)  ©r­   rË   rw   s     €r|   r±   z.FCodePrinter._print_Element.<locals>.<genexpr>»  ó/   øè è € ÐEÐE°˜DŸKšK¨Ñ,Ô,ÐEÐEÐEÐEÐEÐEr}   ©ÚsymbolÚidxs)r—   r›   r`  rÚ   r¾   ©rw   Úelems   ` r|   Ú_print_ElementzFCodePrinter._print_Element¸  sW   ø€ Ø!×(Ò(Ø—;’;˜tœ{Ñ+Ô+Ø—’ÐEÐEÐEÐE¸¼ÐEÑEÔEÑFÔFð )ñ 
ô 
ð 	
r}   c                ó    — t          |¦  «        S r“   r  )rw   Úexts     r|   Ú_print_ExtentzFCodePrinter._print_Extent¾  s   € Ý�3‰xŒxˆr}   c           
     óÈ  ‡ ‡— |j         Š‰j        }‰                     d¦  «        }ˆfd„t          t          t
          fD ¦   «         }|                     d¦  «        dk    rd}nL|                     d¦  «        dk    r!dg d¢|                     d¦  «                 z  }nt          d	‰ z  ¦  «        ‚t          ‰t          ¦  «        rt          d
¦  «        ‚‰ j        d         dk    r³d                     ‰                      ‰j        ¦  «        t           ‰j        v rdnd|r$dd                     ˆ fd„|D ¦   «         ¦  «        z  nd|t&          ‰j        v rdnd‰                      ‰j        ¦  «        ¬¦  «        }|d k    r|d‰                      |¦  «        z  z  }nLt           ‰j        v s|rt          d¦  «        ‚d                     ˆ fd„‰j        ‰j        fD ¦   «         ¦  «        }|S )NÚ	dimensionc                ó"   •— g | ]}|‰j         v ‘ŒS r�   )Úattrs)r­   ÚintentrÁ   s     €r|   rÿ   z3FCodePrinter._print_Declaration.<locals>.<listcomp>Å  s    ø€ Ð[Ð[Ð[¨6�6˜SœYÐ&Ð[Ð[Ð[r}   Tr   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  óB   •K  — | ]}‰                      |¦  «        V — Œd S r“   r)  r]  s     €r|   r±   z2FCodePrinter._print_Declaration.<locals>.<genexpr>Ó  s/   øè è € Ð2SÐ2SÈ°4·;²;¸sÑ3CÔ3CÐ2SÐ2SÐ2SÐ2SÐ2SÐ2Sr}   z, allocatable)rù   Úvcr2  rl  ÚallocÚsz = %sz0F77 init./parameter statem. req. multiple lines.rì   c              3  óB   •K  — | ]}‰                      |¦  «        V — Œd S r“   r)  r]  s     €r|   r±   z2FCodePrinter._print_Declaration.<locals>.<genexpr>Ý  s/   øè è € ÐRÐR°C˜tŸ{š{¨3Ñ/Ô/ÐRÐRÐRÐRÐRÐRr}   )Úvariablerœ   Úattr_paramsr$   r%   r&   ÚcountÚindexrt   r  r	   rÜ   rs   r—   r›   Útyper
   rk  rÚ   r   r`  )rw   rŒ   Úvalr2  Úintentsrl  ÚresultrÁ   s   `      @r|   Ú_print_DeclarationzFCodePrinter._print_DeclarationÁ  sû  øø€ ØŒmˆØŒiˆØ�oŠo˜kÑ*Ô*ˆØ[Ð[Ð[Ð[µiÅÍ\Ð5ZÐ[Ñ[Ô[ˆØ�=Š=˜ÑÔ !Ò#Ð#ØˆFˆFØ�]Š]˜4Ñ Ô  AÒ%Ð%Ø#Ð&<Ð&<Ð&<¸W¿]º]È4Ñ=PÔ=PÔ&QÑQˆFˆFåÐ@À4ÑGÑHÔHÐHå�c�7Ñ#Ô#ð 	[Ý%Ð&YÑZÔZÐZØŒ>˜*Ô%¨Ò+Ð+Ø9×@Ò@Ø—+’+˜cœhÑ'Ô'Ý$/°3´9Ð$<Ð$<�=�=À"ØX[ÐcÐ%¨¯	ª	Ð2SÐ2SÐ2SÐ2SÈsÐ2SÑ2SÔ2SÑ(TÔ(TÑTÐTÐacØÝ)4¸¼	Ð)AÐ)A�o�oÀrØ—+’+˜cœjÑ)Ô)ð Añ ô ˆFð �dŠ{ˆ{Ø˜' D§K¢K°Ñ$4Ô$4Ñ4Ñ4�øå˜cœiÐ'Ð'¨3Ð'Ý)Ð*\Ñ]Ô]Ð]Ø—X’XÐRÐRÐRÐR¸C¼HÀcÄjÐ;QÐRÑRÔRÑSÔSˆFàˆr}   c                óL   — d|                       t          d¦  «        ¦  «        z  S )Nz(huge(%s) + 1)r   )r›   r!   r£   s     r|   Ú_print_InfinityzFCodePrinter._print_Infinityâ  s   € Ø $§+¢+­j¸©m¬mÑ"<Ô"<Ñ<Ð<r}   c                óL   ‡ —  dj         di |                     ˆ fd„¬¦  «        ¤ŽS )Nz$do while ({condition})
{body}
end doc                ó.   •— ‰                      | ¦  «        S r“   r)  rA  s    €r|   rB  z+FCodePrinter._print_While.<locals>.<lambda>ç  s   ø€ ˜dŸkšk¨#Ñ.Ô.€ r}   rK  r�   ©r—   rE  r£   s   ` r|   Ú_print_WhilezFCodePrinter._print_Whileå  sJ   ø€ Ø>Ð7Ô>ð 1ð 1ÀÇÂØ.Ð.Ð.Ð.ð BMñ B0ô B0ð 1ð 1ð 	1r}   c                ó   — dS )Nz.true.r�   r£   s     r|   Ú_print_BooleanTruezFCodePrinter._print_BooleanTrueé  s   € Øˆxr}   c                ó   — dS )Nz.false.r�   r£   s     r|   Ú_print_BooleanFalsez FCodePrinter._print_BooleanFalseì  s   € Øˆyr}   c                ó   — g }|D ]x}|                      d¦  «        r>|                     | j        d         |dd …                              ¦   «         z   ¦  «         ŒU|                     | j        d         |z   ¦  «         Œy|S )Nú!r�   r·   r   )rñ   r‰   r„   Úlstrip)rw   r¨   r|  Úlines       r|   Ú_pad_leading_columnsz!FCodePrinter._pad_leading_columnsï  sƒ   € ØˆØð 	9ð 	9ˆDØ�Š˜sÑ#Ô#ð 9Ø—’˜dœj¨Ô3°d¸1¸2¸2´h·o²oÑ6GÔ6GÑGÑHÔHÐHÐHà—’˜dœj¨Ô0°4Ñ7Ñ8Ô8Ð8Ð8Øˆr}   c                ó&  ‡‡	— t          dt          j        z   t          j        z   ¦  «        Št          d¦  «        Š	ˆˆ	fd„}g }| j        d         dk    rd}nd}|D �]4}|                     | j        d         ¦  «        �rt          |¦  «        d	k    rÜ|                     d
dd	¦  «        }|dk    rd	}|d|…         }||d…          	                    ¦   «         }| 
                    |¦  «         |r~|                     d
dd¦  «        }|dk    st          |¦  «        dk     rd}|d|…         }||d…          	                    ¦   «         }| 
                    | j        d         ›|›�¦  «         |°~�Œ| 
                    |¦  «         �Œ*|                     | j        d         ¦  «        rÕ ||d	¦  «        }|d|…                              ¦   «         }||d…          	                    ¦   «         }|r||z  }| 
                    |¦  «         |rq ||d¦  «        }|d|…                              ¦   «         }||d…          	                    ¦   «         }|r||z  }| 
                    | j        d         ›|›�¦  «         |°q�Œ| 
                    |¦  «         �Œ6|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 )Nc                ó¼   •— ‰|          ‰v r‰| dz
           ‰vpD‰|          ‰vo‰| dz
           ‰v p-‰|          ‰v o‰| dz
           ‰vp‰|          ‰vo‰| dz
           ‰v S )Nr·   r�   )Úposr‹  Úmy_alnumÚmy_whites    €€€r|   rB  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  sŽ   øø€ Ý�4‰yŒy˜FÒ"Ð"Ý˜4‘y”yÐ ØˆCðJð Jð Jð Jð Jð JˆEð
 �e˜C‘j”jð "Ø�q‘�Ø˜!’8�8Ø!�Mð �e˜C‘j”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‰   r5  )
rw   r¨   r•  r|  Útrailingr‹  r�  Úhunkr‘  r’  s
           @@r|   r¦   zFCodePrinter._wrap_fortranø  sÕ  øø€ õ �v¥¤Ñ-µÔ0DÑDÑEÔEˆÝ�w‘<”<ˆð	ð 	ð 	ð 	ð 	ð 	ð ˆØŒ>˜/Ô*¨fÒ4Ð4ØˆHˆHàˆHØð #	$ñ #	$ˆDØ�Š˜tœz¨)Ô4Ñ5Ô5ñ "$å�t‘9”9˜r’>�>ØŸ*š* S¨!¨RÑ0Ô0�CØ˜b’y�yØ ˜Ø   œ:�DØ   œ:×,Ò,Ñ.Ô.�DØ—M’M $Ñ'Ô'Ð'Øð NØ"Ÿjšj¨¨a°Ñ4Ô4˜Ø "š9˜9­¨D©	¬	°Bª¨Ø"$˜CØ# D S Dœz˜Ø# C D Dœz×0Ò0Ñ2Ô2˜ØŸš°´
¸9Ô0EÐ0EÀtÀtÐ&LÑMÔMÐMð ð Nùð —M’M $Ñ'Ô'Ð'Ñ'Ø—’ ¤¨FÔ!3Ñ4Ô4ð $à$�n T¨2Ñ.Ô.�Ø˜D˜S˜D”z×(Ò(Ñ*Ô*�Ø˜C˜D˜D”z×(Ò(Ñ*Ô*�Øð %Ø˜HÑ$�DØ—’˜dÑ#Ô#Ð#Øð GØ(˜.¨¨rÑ2Ô2�CØ   œ:×,Ò,Ñ.Ô.�DØ   œ:×,Ò,Ñ.Ô.�DØð )Ø Ñ(˜Ø—M’M¨D¬J°vÔ,>Ð,>ÀÀÐ"EÑFÔFÐFð ð Gùð —’˜dÑ#Ô#Ð#Ñ#Øˆr}   c                óÆ  ‡‡— t          |t          ¦  «        r=|                      |                     d¦  «        ¦  «        }d                     |¦  «        S | j        d         dk    }d„ |D ¦   «         }dŠdŠˆfd„|D ¦   «         }ˆfd	„|D ¦   «         }d
„ |D ¦   «         }d}d}d}	g }
t          |¦  «        D ]”\  }}|dv r|
                     |¦  «         Œ|||         z  }|rd||	z  |z   z  }nd|z  |	z  }|›|›�}|s|                      |g¦  «        d         }|
                     |¦  «         ||         rd|	z  }nd}|||         z  }Œ•|s|  	                    |
¦  «        S |
S )z0Accepts a string of code or a list of code linesTrƒ   rW   r‚   c                ó8   — g | ]}|                      d ¦  «        ‘ŒS )z 	)rŠ  ©r­   r‹  s     r|   rÿ   z,FCodePrinter.indent_code.<locals>.<listcomp>F  s$   € Ð6Ð6Ð6¨�—’˜UÑ#Ô#Ð6Ð6Ð6r}   )r¸   zif(zif zdo
rÐ   ÚprogramÚ	interface)rº   ÚenddorÑ   ÚendifrÐ   zend programzend interfacec           
     ón   •— g | ]1}t          t          t          |j        ‰¦  «        ¦  «        ¦  «        ‘Œ2S r�   ©r  Úanyr»   rñ   )r­   r‹  Úinc_keywords     €r|   rÿ   z,FCodePrinter.indent_code.<locals>.<listcomp>K  óE   ø€ ð (ð (ð (Øõ ��S ¤°+Ñ>Ô>Ñ?Ô?Ñ@Ô@ð (ð (ð (r}   c           
     ón   •— g | ]1}t          t          t          |j        ‰¦  «        ¦  «        ¦  «        ‘Œ2S r�   r§  )r­   r‹  Údec_keywords     €r|   rÿ   z,FCodePrinter.indent_code.<locals>.<listcomp>M  rª  r}   c                óp   — g | ]3}t          t          t          |j        d dg¦  «        ¦  «        ¦  «        ‘Œ4S )ú&z&
)r  r¨  r»   Úendswithr¡  s     r|   rÿ   z,FCodePrinter.indent_code.<locals>.<listcomp>O  sH   € ð ,ð ,ð ,Ø!õ �S¥ T¤]°S¸%°LÑ!AÔ!AÑBÔBÑCÔCð ,ð ,ð ,r}   r   é   )rƒ   rÒ   rì   é   )
r  r¢   r§   Ú
splitlinesrÚ   rs   rØ   r‰   rŒ  r¦   )rw   r   Ú
code_linesr‚   ÚincreaseÚdecreaseÚcontinuationÚlevelÚcont_paddingÚtabwidthÚnew_coder¯   r‹  Úpaddingr¬  r©  s                 @@r|   r§   zFCodePrinter.indent_code?  sú  øø€ å�d�CÑ Ô ð 	'Ø×)Ò)¨$¯/ª/¸$Ñ*?Ô*?Ñ@Ô@ˆJØ—7’7˜:Ñ&Ô&Ð&àŒ~˜oÔ.°&Ò8ˆØ6Ð6°Ð6Ñ6Ô6ˆàSˆØdˆð(ð (ð (ð (Ø!%ð(ñ (ô (ˆð(ð (ð (ð (Ø!%ð(ñ (ô (ˆð,ð ,Ø%)ð,ñ ,ô ,ˆð ˆØˆØˆØˆÝ  ‘”ð 	!ð 	!‰GˆAˆtØ�zÐ!Ð!Ø—’ Ñ%Ô%Ð%ØØ�X˜a”[Ñ ˆEàð -Ø˜u X™~°Ñ<Ñ=��à˜e™) HÑ,�à$˜W d dÐ+ˆDØð <Ø×0Ò0°$°Ñ8Ô8¸Ô;�à�OŠO˜DÑ!Ô!Ð!à˜AŒð !Ø  ™z��à �Ø�X˜a”[Ñ ˆEˆEàð 	0Ø×%Ò% hÑ/Ô/Ð/Øˆr}   c                óú   ‡ — |j         rSd                     d                     ˆ fd„|j        D ¦   «         ¦  «        ‰                      |j         ¦  «        ¬¦  «        S |j        \  }d‰                      |¦  «        z  S )Nzgo to ({labels}), {expr}r¹   c              3  óB   •K  — | ]}‰                      |¦  «        V — Œd S r“   r)  r]  s     €r|   r±   z+FCodePrinter._print_GoTo.<locals>.<genexpr>t  s/   øè è € Ð!JÐ!J°s $§+¢+¨cÑ"2Ô"2Ð!JÐ!JÐ!JÐ!JÐ!JÐ!Jr}   )ÚlabelsrŒ   zgo to %s)rŒ   r—   rÚ   r¾  r›   )rw   ÚgotoÚlbls   `  r|   Ú_print_GoTozFCodePrinter._print_GoToq  sƒ   ø€ ØŒ9ð 	1Ø-×4Ò4Ø—y’yÐ!JÐ!JÐ!JÐ!J¸d¼kÐ!JÑ!JÔ!JÑKÔKØ—[’[ ¤Ñ+Ô+ð 5ñ ô ð ð
 ”;‰DˆCØ §¢¨CÑ 0Ô 0Ñ0Ð0r}   c                óL   ‡ —  dj         di |                     ˆ fd„¬¦  «        ¤ŽS )Nz"program {name}
{body}
end program
c                ó.   •— ‰                      | ¦  «        S r“   r)  rA  s    €r|   rB  z-FCodePrinter._print_Program.<locals>.<lambda>€  s   ø€ °·²¸SÑ1AÔ1A€ r}   rK  r�   r‚  )rw   Úprogs   ` r|   Ú_print_ProgramzFCodePrinter._print_Program{  sM   ø€ ððô ð	Dð Dð —;’;Ð%AÐ%AÐ%AÐ%A�;ÑBÔBð	Dð Dð 	Dr}   c                óL   ‡ —  dj         di |                     ˆ fd„¬¦  «        ¤ŽS )NzAmodule {name}
{declarations}

contains

{definitions}
end module
c                ó.   •— ‰                      | ¦  «        S r“   r)  rA  s    €r|   rB  z,FCodePrinter._print_Module.<locals>.<lambda>‰  s   ø€ °·²¸CÑ0@Ô0@€ r}   rK  r�   r‚  )rw   Úmods   ` r|   Ú_print_ModulezFCodePrinter._print_Module‚  sM   ø€ ððô
 ðCð Cð —:’:Ð$@Ð$@Ð$@Ð$@�:ÑAÔAðCð Cð 	Cr}   c                ó"  — |j         dk    r3| j        d         dk    r"| j        d                              d¦  «         dS |j         dk    r3| j        d         dk    r"| j        d                              d¦  «         d	S |j         dk    rd
S |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˜Ò Ð  T¤^°JÔ%?À4Ò%GÐ%GØÔ˜_Ô-×1Ò1Ð2FÑGÔGÐGØ�<ØŒY˜(Ò"Ð" t¤~°jÔ'AÀTÒ'IÐ'IØÔ˜_Ô-×1Ò1Ð2FÑGÔGÐGØ�<àŒy˜HÒ$Ð$Ø�sà”yÐ r}   c                ó4  ‡ — |j         t          k    rd}d}nHddt          dt          di                     |j        d¦  «        iz  }‰                      |j         ¦  «        }|                     |d                     ˆ fd„|j	        D ¦   «         ¦  «        ¬	¦  «        S )
Nzprint {fmt}, {iolist}rÍ  z3write(%(out)s, fmt="{fmt}", advance="no"), {iolist}rn  Ú0Ú6r¹   c              3  óB   •K  — | ]}‰                      |¦  «        V — Œd S r“   r)  r]  s     €r|   r±   z,FCodePrinter._print_Print.<locals>.<genexpr>¢  s/   øè è € Ð7Ð7 #ˆT�[Š[˜ÑÔÐ7Ð7Ð7Ð7Ð7Ð7r}   )Ú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ˆCàLØ� ¥V¨SÐ1×5Ò5°b´g¸sÑCÔCðPñ ˆHð —+’+˜bÔ.Ñ/Ô/ˆCØ�Š 3¨t¯yªyØ7Ð7Ð7Ð7¨¬Ð7Ñ7Ô7ñ09ô 09ˆñ :ô :ð 	:r}   c                óš   — |j         \  }d                     | j                             dd¦  «        |                      |¦  «        ¬¦  «        S )Nz{result_name} = {arg}Úresult_nameÚsympy_result)rÝ  rË   )rÇ   r—   Ú_contextrq   r›   )rw   ÚrsrË   s      r|   Ú_print_ReturnzFCodePrinter._print_Return¤  sL   € ØŒw‰ˆØ&×-Ò-Øœ×)Ò)¨-¸ÑHÔHØ—’˜CÑ Ô ð .ñ 
ô 
ð 	
r}   c                óL   — |j         \  }|rd|                      |¦  «        z  S dS )Nz	return %sÚreturn)rÇ   r›   )rw   ÚfrsrË   s      r|   Ú_print_FortranReturnz!FCodePrinter._print_FortranReturn«  s/   € ØŒx‰ˆØð 	Ø §¢¨SÑ!1Ô!1Ñ1Ð1à�8r}   c                ó�  ‡ — |                      d¦  «        }|€d}n|rd|d         z  nd}‰ j                             dd ¦  «        }d                     |‰                      |j        ¦  «        d                     ˆ fd	„|j        D ¦   «         ¦  «        |rd
|z  nd|d                     ˆ fd„|j        D ¦   «         ¦  «        ¬¦  «        S )NÚbind_Crƒ   z bind(C, name="%s")r   z bind(C)rÝ  z<{entity}{name}({arg_names}){result}{bind}
{arg_declarations}r¹   c                óD   •— g | ]}‰                      |j        ¦  «        ‘ŒS r�   )r›   r`  r]  s     €r|   rÿ   z&FCodePrinter._head.<locals>.<listcomp>¿  s'   ø€ Ð RÐ RÐ R¸S §¢¨S¬ZÑ!8Ô!8Ð RÐ RÐ Rr}   z result(%s)rÒ   c              3  ó\   •K  — | ]&}‰                      t          |¦  «        ¦  «        V — Œ'd S r“   )r›   r   r]  s     €r|   r±   z%FCodePrinter._head.<locals>.<genexpr>Â  s7   øè è € Ð'_Ð'_È#¨¯ªµKÀÑ4DÔ4DÑ(EÔ(EÐ'_Ð'_Ð'_Ð'_Ð'_Ð'_r}   )Úentityr‡   Ú	arg_namesr|  ÚbindÚarg_declarations)rv  rs   rq   r—   r›   r‡   rÚ   Ú
parameters)rw   rê  ÚfprE  Úbind_C_paramsrì  rÝ  s   `      r|   Ú_headzFCodePrinter._head²  sè   ø€ ØŸš xÑ0Ô0ˆØÐ ØˆDˆDà?LÐ\Ð(¨=¸Ô+;Ñ;Ð;ÐR\ˆDØ”n×(Ò(¨¸Ñ=Ô=ˆð!ç
Š&ØØ—’˜RœWÑ%Ô%Ø—i’iÐ RÐ RÐ RÐ RÀBÄMÐ RÑ RÔ RÑSÔSØ4?ÐG�M KÑ/Ð/ÀRØØ!ŸYšYÐ'_Ð'_Ð'_Ð'_ÐQSÔQ^Ð'_Ñ'_Ô'_Ñ`Ô`ð ñ 
ô 
ð
	
r}   c                ó°   — d                      |                      |j        ¦  «        ¦  «        }d                      |                      ||¦  «        ¬¦  «        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Å  sL   € Ø×&Ò& t§{¢{°2´>Ñ'BÔ'BÑCÔCˆð÷ Š&˜tŸzšz¨&°"Ñ5Ô5ˆ&Ñ
6Ô
6ð	7r}   c                óŒ  — t           |j        v rd}nt          |j        v rd}nd}d                     |                      |j        ¦  «        ¦  «        }t          | |j        ¬¦  «        5  d                     ||                      ||¦  «        |                      |j	        ¦  «        ¬¦  «        cd d d ¦  «         S # 1 swxY w Y   d S )Nz
elemental zpure rƒ   ró  )rÝ  z,{prefix}{function_head}
{body}
end function
)Úprefixrô  rP  )
r"   rk  r#   r—   r›   rõ  r3   r‡   rñ  rP  )rw   Úfdrø  rê  s       r|   Ú_print_FunctionDefinitionz&FCodePrinter._print_FunctionDefinitionÎ  s	  € Ý˜œÐ Ð Ø!ˆFˆFÝ�R”XÐÐØˆFˆFàˆFà×&Ò& t§{¢{°2´>Ñ'BÔ'BÑCÔCˆÝ˜T¨r¬wÐ7Ñ7Ô7ð 		ð 		ð!÷ ŠfØØ"Ÿjšj¨°Ñ4Ô4Ø—[’[ ¤Ñ)Ô)ð ñ ô ð		ð 		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð 		ð 		ð 		øøøð 		ð 		ð 		ð 		ð 		ð 		s   Á(AB9Â9B=Ã B=c                óˆ   — d                      |                      d|¦  «        |                      |j        ¦  «        ¬¦  «        S )Nz({subroutine_head}
{body}
end subroutine
zsubroutine )Úsubroutine_headrP  )r—   rñ  r›   rP  )rw   Úsubs     r|   Ú_print_SubroutinezFCodePrinter._print_Subroutineâ  sD   € ð÷ Š&Ø ŸJšJ }°cÑ:Ô:Ø—’˜SœXÑ&Ô&ð ñ 
ô 
ð		
r}   c                óª   ‡ — d                      ‰                      |j        ¦  «        d                     ˆ fd„|j        D ¦   «         ¦  «        ¬¦  «        S )Nzcall {name}({args})r¹   c              3  óB   •K  — | ]}‰                      |¦  «        V — Œd S r“   r)  r]  s     €r|   r±   z5FCodePrinter._print_SubroutineCall.<locals>.<genexpr>ï  s/   øè è € ÐNÐN°˜DŸKšK¨Ñ,Ô,ÐNÐNÐNÐNÐNÐNr}   )r‡   rÇ   )r—   r›   r‡   rÚ   Úsubroutine_args)rw   Úscalls   ` r|   Ú_print_SubroutineCallz"FCodePrinter._print_SubroutineCallì  sX   ø€ Ø$×+Ò+Ø—’˜UœZÑ(Ô(Ø—’ÐNÐNÐNÐN¸Ô8MÐNÑNÔNÑOÔOð ,ñ 
ô 
ð 	
r}   c                óJ   ‡ — dt          ˆ fd„|j        D ¦   «         ¦  «        z  S )Nz%s => %sc              3  óB   •K  — | ]}‰                      |¦  «        V — Œd S r“   r)  r]  s     €r|   r±   z1FCodePrinter._print_use_rename.<locals>.<genexpr>ó  s/   øè è € Ð"HÐ"H¸ 4§;¢;¨sÑ#3Ô#3Ð"HÐ"HÐ"HÐ"HÐ"HÐ"Hr}   )ÚtuplerÇ   )rw   Úrnms   ` r|   Ú_print_use_renamezFCodePrinter._print_use_renameò  s-   ø€ Ø�EÐ"HÐ"HÐ"HÐ"H¸s¼xÐ"HÑ"HÔ"HÑIÔIÑIÐIr}   c                ó  ‡ — d‰                       |j        ¦  «        z  }|j        d k    r,|dd                     ˆ fd„|j        D ¦   «         ¦  «        z   z  }|j        d k    r,|dd                     ˆ fd„|j        D ¦   «         ¦  «        z   z  }|S )Nzuse %sr¹   c                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r�   r)  )r­   r  rw   s     €r|   rÿ   z+FCodePrinter._print_use.<locals>.<listcomp>ø  s%   ø€ Ð'OÐ'OÐ'O¸S¨¯ª°CÑ(8Ô(8Ð'OÐ'OÐ'Or}   z, only: c                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r�   r)  )r­   Únlyrw   s     €r|   rÿ   z+FCodePrinter._print_use.<locals>.<listcomp>ú  s%   ø€ Ð-SÐ-SÐ-SÀ3¨d¯kªk¸#Ñ.>Ô.>Ð-SÐ-SÐ-Sr}   )r›   Ú	namespaceÚrenamerÚ   Úonly)rw   Úuser|  s   `  r|   Ú
_print_usezFCodePrinter._print_useõ  sž   ø€ Ø˜DŸKšK¨¬Ñ6Ô6Ñ6ˆØŒ:˜ÒÐØ�d˜TŸYšYÐ'OÐ'OÐ'OÐ'OÀCÄJÐ'OÑ'OÔ'OÑPÔPÑPÑPˆFØŒ8�tÒÐØ�j 4§9¢9Ð-SÐ-SÐ-SÐ-SÈ#Ì(Ð-SÑ-SÔ-SÑ#TÔ#TÑTÑTˆFØˆr}   c                ó   — dS )NÚexitr�   ©rw   r†   s     r|   Ú_print_BreakTokenzFCodePrinter._print_BreakTokený  s   € Øˆvr}   c                ó   — dS )NÚcycler�   r  s     r|   Ú_print_ContinueTokenz!FCodePrinter._print_ContinueToken   s   € Øˆwr}   c                ó€   ‡ — ‰ j         d         dk    rdnd}|d                     ˆ fd„|j        D ¦   «         ¦  «        z  S )NrY   rh   z[%s]z(/%s/)r¹   c              3  óB   •K  — | ]}‰                      |¦  «        V — Œd S r“   r)  r]  s     €r|   r±   z7FCodePrinter._print_ArrayConstructor.<locals>.<genexpr>  s/   øè è € Ð"KÐ"K¸ 4§;¢;¨sÑ#3Ô#3Ð"KÐ"KÐ"KÐ"KÐ"KÐ"Kr}   )rs   rÚ   Úelements)rw   ÚacÚfmtstrs   `  r|   Ú_print_ArrayConstructorz$FCodePrinter._print_ArrayConstructor  sK   ø€ Øœ>¨*Ô5¸Ò=Ð=��À8ˆØ˜Ÿ	š	Ð"KÐ"KÐ"KÐ"K¸r¼{Ð"KÑ"KÔ"KÑLÔLÑLÐLr}   c                óª   ‡ — d                      ‰                      |j        ¦  «        d                     ˆ fd„|j        D ¦   «         ¦  «        ¬¦  «        S )Nr[  r¹   c              3  óB   •K  — | ]}‰                      |¦  «        V — Œd S r“   r)  r]  s     €r|   r±   z3FCodePrinter._print_ArrayElement.<locals>.<genexpr>
  r^  r}   r_  )r—   r›   r‡   rÚ   r¾   rb  s   ` r|   Ú_print_ArrayElementz FCodePrinter._print_ArrayElement  sW   ø€ Ø!×(Ò(Ø—;’;˜tœyÑ)Ô)Ø—’ÐEÐEÐEÐE¸¼ÐEÑEÔEÑFÔFð )ñ 
ô 
ð 	
r}   r“   )[r4  Ú
__module__Ú__qualname__Ú__doc__ÚprintmethodÚlanguager   r   r   r   r   r   rb   r   r   r   r   r   r   r   r   rc   rT  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/  r8  r;  rH  rM  rR  rY  rd  rg  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Ø€KØ€Hð 	�ØˆgØ�*ð€Lð 	ÐØ�Ø�Ø�Ø�;Ø�LØˆkØˆ{Øˆ{Øˆ{Øˆyð€Mð 	ˆ Ð(ð€Lð )-¨¨[Ô-Jð )ð )ØØØ ØØØðOð Oð )ð )Ðð ð ð ñ ð ØØØØðð €Jð 	ˆdð€Lð,ð ,ð ,ð ,ð ,ð ,ð( ð\ð \ñ „Xð\ðð ð ð ð ð"ð ð ðð ð ð#ð #ð #ðFð Fð Fðð ð ð;ð ;ð ;ðBð Bð Bð	'ð 	'ð 	'ð	%ð 	%ð 	%ð(Kð (Kð (KðTJð Jð Jð%6ð %6ð %6ðNGð Gð GðQð Qð Qðð ð ðð ð ð6ð 6ð 6ð6ð 6ð 6ð&(ð (ð (ð ð  ð  ð9ð 9ð 9ðJð Jð JðTð Tð TðFð Fð Fð&ð &ð &ð
ð 
ð 
ð"
ð 
ð 
ð
.ð 
.ð 
.ðð ð ð
ð 
ð 
ðð ð ðð ð ðB=ð =ð =ð1ð 1ð 1ðð ð ðð ð ðð ð ðEð Eð EðN0ð 0ð 0ðd1ð 1ð 1ðDð Dð DðCð Cð Cð!ð !ð !ð
:ð 
:ð 
:ð
ð 
ð 
ðð ð ð
ð 
ð 
ð&7ð 7ð 7ðð ð ð(
ð 
ð 
ð
ð 
ð 
ðJð Jð Jðð ð ðð ð ðð ð ðMð Mð 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>r9     s¡  ððð ð& #Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð à #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð Ø €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð
ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 0Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø (Ð (Ð (Ð (Ð (Ð (Ø +Ð +Ð +Ð +Ð +Ð +Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2ð :Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9ðØ	ˆ5ðà	ˆ5ðð 
ˆ5ðð ˆFð	ð
 ˆFðð ˆFðð ˆWðð ˆFðð ˆFðð ˆFðð 
ˆ5ðð 
ˆ5ðð 
ˆ5ðð 
ˆ5ðð �ðð  
ˆ5ð!ð" 
ˆ5ð#€ð*E
ð E
ð E
ð E
ð E
�;ñ E
ô E
ð E
ð E
ð E
r}   