
    BwgD                       d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
 	 ddlZddlmZ ddl ddlmZ ej"                  adadadadad	ad
ad
adadadag ad
ad
ada i a!d
a"da#da$da%tJ        g ia&d
a'g a(da)g a*da+da,g a-g a.g a/d Z0ddZ1de_2        i Z3dD ]	  Z4ddie3e4<    dD ]	  Z4ddie3e4<    i Z5i Z6dD ]  Z7e7dz   e5e7<   e7e6e7dz   <    d Z8d Z9d Z:d Z; ejx                  dejz                        j|                  Z? ejx                  dejz                        j|                  Z@ ejx                  dejz                        j|                  ZA ejx                  dejz                        j                  ZCg dZDg dZEd  ZFd! ZGeHdfd"ZId#ZJd$ZK ejx                  eJd
eKeKd%fz  ejz                        d&fZL ejx                  eJd
eKd'z   eKd'z   d%fz  ejz                        ZM ejx                  eJd(z  ejz                        d)fZN ejx                  eJd*z  ejz                        d)fZOd+ZP ejx                  eJd
ePePd%fz  ejz                        d)fZQePd,z   d-z   ZR ejx                  eJd
eReRd%fz  ejz                        d)fZSd.ZT ejx                  eJd
eTeTd%fz  ejz                        d/fZUd0ZV ejx                  eJd1eVeVd%fz  ejz                        d2fZWd3ZX ejx                  eJd
eXeXd%fz  ejz                        d4fZY ejx                  eJd5z  ejz                        d6fZZ ejx                  eJd7z  ejz                        d8fZ[ ejx                  eJd9z  ejz                        d:fZ\ ejx                  eJd;z  ejz                        d<fZ] ejx                  eJd=z  ejz                        d>fZ^ ejx                  eJd?z  ejz                        d@fZ_ ejx                  eJdAz  ejz                        dBfZ` ejx                  eJdCz  ejz                        dDfZa ejx                  eJdEz  ejz                        dFfZb ejx                  eJdGz  ejz                        dHfZc ejx                  eJdIz  ejz                        dJfZd ejx                  eJdKz  ejz                        dLfZe ejx                  eJdMz  ejz                        dNfZf ejx                  eJdOz  ejz                        dPfZg ejx                  eJdQz  ejz                        dRfZh ejx                  eJdSz  ejz                        dTfZi ejx                  eJdUz  ejz                        dVfZj ejx                  eJdWz  ejz                        dXfZk ejx                  eJdYz  ejz                  ej                  z        dZfZm ejx                  d[ej                        d\fZnd] Zod^ Zp ejx                  d_ejz                        Zq ejx                  d`ejz                        Zr ejx                  daejz                        ZsddbZtdc ZudddZvde ZwddfZx ejx                  dgejz                        Zy ejx                  dhejz                        Zz ejx                  diejz                        Z{ ejx                  djejz                        Z| ejx                  dkejz                        Z} ejx                  dl      Z~ ejx                  dm      Z ejx                  dnejz                        Zdo Zdp Zdq Zdr Zds Zdt Zdu Z ejx                  dvejz                        Z ejx                  dwejz                        Z ejx                  dxejz                        Z ejx                  dyejz                        Z ejx                  dzejz                        Zd{ Zd| Zd} Zd~ ZddZddZddZddZd Zd ZddZddZddZd Zd ZddZd ZddZ ejx                  dejz                        Zd Z ejx                  dejz                        Zd Zd Zd Zd Zd ZddZi fdZd Z ejx                  d      j                  Zd Zd Z ejx                  dejz                        ZddZd Zg fdZd Z ejx                  dejz                        Z ejx                  dejz                        Z ejx                  dejz                        Z ejx                  dejz                        Z ejx                  dejz                        Zd Zi fdZddZddZddZd ZddZg ad Zd Zd Zg dfdZd ZÐt|        j                  eë       edk(  rg Zg ZdZdZdZdZej                  dd D ]  Zed
k(  r	ed   dk(  rdZȌedk(  rdadaedk(  rdada(edk(  rt&        r	 e1dd       dadaAedk(  rdaIedk(  rdaQedk(  rdada[edk(  rdadadagedk(  rdZɌoedk(  rdZˌwedk(  rdZʌed   dk(  r ed eeͫ      z         erdZeaerdZeaer+	  eeͫ      j                          eƐj                  eͫ       eǐj                  eͫ        t&        st2        rt4        s	 e1dd        eeƫ      Zt0        rF e1d et0              z  d        eeԫ      Z et0        dƫ      5 ZeȐj                  eի       ddd       er	 eHeԫ       yyy# e$ r dZY 
w xY w# e$ rZ edeӛd       Y dZ[ӐdZ[ww xY w# 1 sw Y   CxY w)a  
crackfortran --- read fortran (77,90) code and extract declaration information.

Copyright 1999 -- 2011 Pearu Peterson all rights reserved.
Copyright 2011 -- present NumPy Developers.
Permission to use, modify, and distribute this software is given under the
terms of the NumPy License.

NO WARRANTY IS EXPRESSED OR IMPLIED.  USE AT YOUR OWN RISK.


Usage of crackfortran:
======================
Command line keys: -quiet,-verbose,-fix,-f77,-f90,-show,-h <pyffilename>
                   -m <module name for f77 routines>,--ignore-contains
Functions: crackfortran, crack2fortran
The following Fortran statements/constructions are supported
(or will be if needed):
   block data,byte,call,character,common,complex,contains,data,
   dimension,double complex,double precision,end,external,function,
   implicit,integer,intent,interface,intrinsic,
   logical,module,optional,parameter,private,public,
   program,real,(sequence?),subroutine,type,use,virtual,
   include,pythonmodule
Note: 'virtual' is mapped to 'dimension'.
Note: 'implicit integer (z) static (z)' is 'implicit static (z)' (this is minor bug).
Note: code after 'contains' will be ignored until its scope ends.
Note: 'common' statement is extended: dimensions are moved to variable definitions
Note: f2py directive: <commentchar>f2py<line> is read as <line>
Note: pythonmodule is introduced to represent Python module

Usage:
  `postlist=crackfortran(files)`
  `postlist` contains declaration information read from the list of files `files`.
  `crack2fortran(postlist)` returns a fortran code to be saved to pyf-file

  `postlist` has the following structure:
 *** it is a list of dictionaries containing `blocks':
     B = {'block','body','vars','parent_block'[,'name','prefix','args','result',
          'implicit','externals','interfaced','common','sortvars',
          'commonvars','note']}
     B['block'] = 'interface' | 'function' | 'subroutine' | 'module' |
                  'program' | 'block data' | 'type' | 'pythonmodule' |
                  'abstract interface'
     B['body'] --- list containing `subblocks' with the same structure as `blocks'
     B['parent_block'] --- dictionary of a parent block:
                             C['body'][<index>]['parent_block'] is C
     B['vars'] --- dictionary of variable definitions
     B['sortvars'] --- dictionary of variable definitions sorted by dependence (independent first)
     B['name'] --- name of the block (not if B['block']=='interface')
     B['prefix'] --- prefix string (only if B['block']=='function')
     B['args'] --- list of argument names if B['block']== 'function' | 'subroutine'
     B['result'] --- name of the return value (only if B['block']=='function')
     B['implicit'] --- dictionary {'a':<variable definition>,'b':...} | None
     B['externals'] --- list of variables being external
     B['interfaced'] --- list of variables being external and defined
     B['common'] --- dictionary of common blocks (list of objects)
     B['commonvars'] --- list of variables used in common blocks (dimensions are moved to variable definitions)
     B['from'] --- string showing the 'parents' of the current block
     B['use'] --- dictionary of modules used in current block:
         {<modulename>:{['only':<0|1>],['map':{<local_name1>:<use_name1>,...}]}}
     B['note'] --- list of LaTeX comments on the block
     B['f2pyenhancements'] --- optional dictionary
          {'threadsafe':'','fortranname':<name>,
           'callstatement':<C-expr>|<multi-line block>,
           'callprotoargument':<C-expr-list>,
           'usercode':<multi-line block>|<list of multi-line blocks>,
           'pymethoddef:<multi-line block>'
           }
     B['entry'] --- dictionary {entryname:argslist,..}
     B['varnames'] --- list of variable names given in the order of reading the
                       Fortran code, useful for derived types.
     B['saved_interface'] --- a string of scanned routine signature, defines explicit interface
 *** Variable definition is a dictionary
     D = B['vars'][<variable name>] =
     {'typespec'[,'attrspec','kindselector','charselector','=','typename']}
     D['typespec'] = 'byte' | 'character' | 'complex' | 'double complex' |
                     'double precision' | 'integer' | 'logical' | 'real' | 'type'
     D['attrspec'] --- list of attributes (e.g. 'dimension(<arrayspec>)',
                       'external','intent(in|out|inout|hide|c|callback|cache|aligned4|aligned8|aligned16)',
                       'optional','required', etc)
     K = D['kindselector'] = {['*','kind']} (only if D['typespec'] =
                         'complex' | 'integer' | 'logical' | 'real' )
     C = D['charselector'] = {['*','len','kind','f2py_len']}
                             (only if D['typespec']=='character')
     D['='] --- initialization expression string
     D['typename'] --- name of the type if D['typespec']=='type'
     D['dimension'] --- list of dimension bounds
     D['intent'] --- list of intent specifications
     D['depend'] --- list of variable names on which current variable depends on
     D['check'] --- list of C-expressions; if C-expr returns zero, exception is raised
     D['note'] --- list of LaTeX comments on the variable
 *** Meaning of kind/char selectors (few examples):
     D['typespec>']*K['*']
     D['typespec'](kind=K['kind'])
     character*C['*']
     character(len=C['len'],kind=C['kind'], f2py_len=C['f2py_len'])
     (see also fortran type declaration statement formats below)

Fortran 90 type declaration statement format (F77 is subset of F90)
====================================================================
(Main source: IBM XL Fortran 5.1 Language Reference Manual)
type declaration = <typespec> [[<attrspec>]::] <entitydecl>
<typespec> = byte                          |
             character[<charselector>]     |
             complex[<kindselector>]       |
             double complex                |
             double precision              |
             integer[<kindselector>]       |
             logical[<kindselector>]       |
             real[<kindselector>]          |
             type(<typename>)
<charselector> = * <charlen>               |
             ([len=]<len>[,[kind=]<kind>]) |
             (kind=<kind>[,len=<len>])
<kindselector> = * <intlen>                |
             ([kind=]<kind>)
<attrspec> = comma separated list of attributes.
             Only the following attributes are used in
             building up the interface:
                external
                (parameter --- affects '=' key)
                optional
                intent
             Other attributes are ignored.
<intentspec> = in | out | inout
<arrayspec> = comma separated list of dimension bounds.
<entitydecl> = <name> [[*<charlen>][(<arrayspec>)] | [(<arrayspec>)]*<charlen>]
                      [/<init_expr>/ | =<init_expr>] [,<entitydecl>]

In addition, the following attributes are used: check,depend,note

TODO:
    * Apply 'parameter' attribute (e.g. 'integer parameter :: i=2' 'real x(i)'
                                   -> 'real x(2)')
    The above may be solved by creating appropriate preprocessor program, for example.

    N)Path   )__version__)*)symbolicfix     c                  x    da dadadadadadadadada	g a
dat        g iadadadag ai adadadag ag ag ag ad ay )Nr   r   r   r	   r
   r   )	strictf77sourcecodeformquietverbosetabcharpyffilenamef77modulenameskipemptyendsignorecontainsdolowercasedebuggroupcounter	grouplistneededmoduleexpectbeginskipblocksuntilusermodulesf90modulevarsgotnextfilefilepositiontextcurrentfilenameskipfunctions	skipfuncs	onlyfuncsinclude_pathsprevious_context     N/var/www/horilla/myenv/lib/python3.12/site-packages/numpy/f2py/crackfortran.pyreset_global_f2py_varsr*      s     INEGGKMMNKELr"ILKOKMKOMIIMr(   c                     t         sy t        sE|r#t        j                  j	                  t
               t        j                  j	                  |        y y N)r   r   sysstdoutwriter    )lineflags     r)   outmessr2      s:     JJ-.

 r(   2   zabcdefghopqrstuvwxyz$_typespecrealijklmninteger)3intdoublefloatcharshortlongvoidcasewhilereturnsignedunsignediffortypedefsizeofunionstructstaticregisternewbreakdogotoswitchcontinueelseinlineexterndeleteconstautolenrankshapeindexslensize_imaxminflenfshapestringcomplex_doublefloat_doublestdinstderrr.   typedefault_bnc                 Z    | t         v r"t        d| dt         |    d       t         |    S | S )Nzrmbadname1: Replacing "" with "".
)badnameserrmessnames    r)   
rmbadname1rr   
  s/    xx~' 	(~Kr(   c                 >    | D cg c]  }t        |       c}S c c}w r,   )rr   names_ms     r)   	rmbadnamerw     s    %*+rJrN+++   c                 Z    | t         v r"t        d| dt         |    d       t         |    S | S )Nzundo_rmbadname1: Replacing "rl   rm   )invbadnamesro   rp   s    r)   undo_rmbadname1r{     s1    {T*, 	-4  Kr(   c                 >    | D cg c]  }t        |       c}S c c}w r,   )r{   rt   s     r)   undo_rmbadnamer}     s    */0BOB000rx   z-\*-\s*fortran\s*-\*-z-\*-\s*f90\s*-\*-z-\*-\s*fix\s*-\*-z[^c*]\s*[^\s\d\t])z.f90z.f95z.f03z.f08)z.forz.ftnz.f77z.fc                 L   t         .t        j                  |       j                         j                  }nt	        dt
        j                  j                  |             }t        | d      5 }|j                  |      }|j                  t        j                        rd}nf|j                  t        j                  t        j                  f      rd}n4|j                  t        j                  t        j                   f      rd}nd}ddd       t        | |      S # 1 sw Y   xY w)	aN  Ensures that filename is opened with correct encoding parameter.

    This function uses charset_normalizer package, when available, for
    determining the encoding of the file to be opened. When charset_normalizer
    is not available, the function detects only UTF encodings, otherwise, ASCII
    encoding is used as fallback.
    N    rbz	UTF-8-SIGzUTF-32zUTF-16ascii)encoding)charset_normalizer	from_pathbestr   r`   ospathgetsizeopenread
startswithcodecsBOM_UTF8BOM_UTF32_LEBOM_UTF32_BEBOM_LEBOM_BE)filenamemoder   nbytesfhandleraws         r)   openhookr   ,  s     %%//9>>@II R23(D! 
	#W,,v&C~~foo.&!4!4f6I6I JK# >?# #
	# $22
	# 
	#s   *BDD#c                    d}t        |       j                  j                         t        v rd}t	        | d      5 }|j                         }d}t        |      rd}nt        |      rd}d}|dkD  rX|rV|d   dk7  r6|j                         r&|dz  }|d   dk7  rt        |d	d
       s|dd dk(  rd}n|j                         }|dkD  r|rVd	d	d	       |S # 1 sw Y   |S xY w)z(Check if file is in free format Fortran.FTr   r   !r   	N   r   &)
r   suffixlowerCOMMON_FREE_EXTENSIONSr   readline_has_f_header_has_f90_headerstrip_free_f90_start)fnameresultr   r0   ns        r)   is_free_formatr   K  s     FE{!%;;	%	 &!AT"AF!eAw#~$**,QGtORa(Ad2bkUXFX!F##%D !e& M& Ms   BCCc           
      `   |s/t         t        t        t        t        t
        t        t        t        f	}| g k(  ryt        }d}d}d}t        j                  dt        j                        }t        j                  d      }	t        j                  d      }
t        j                  d      }|r	 |dd       d	\  }}d
gt        d      D cg c]  }t        |       c}z   }dat        j                  | t               }	 	 |j#                         }|sn|j-                         rda|j)                         ada |}dadat.        j0                  j3                  t              d   }t5        t              j6                  j9                         t:        v rt=        |      st?        |      sdantA        t              rt?        |      sdat        rtB        antD        atG        dtI        t              dt        t        xr dxs dd       |jK                         jM                  dd
      }|dk(  s|d   dvrn|dd }|dk(  sd}tO        |d      \  }}|d
z  }|dd j9                         dk(  rtO        |dz   |dd z   d      \  }}d}|jQ                         dk(  rt        dk(  rnd}t        dk(  r|d   d v r'|dd j9                         d!k(  rd"|dd z   }d}nd}d}t        rtS        |      d#kD  r|dd# }|d   |vrt'        d$tI        |      z        |rt        r$tS        |      dkD  r|d   d
k(  s||d%d z   }d}d}nu|	jU                  |      }|r|jW                  d&      }|r)||
jU                  |      jW                  d&      z   }d}d}n&d"|dd z   }|r|j9                         }n|}|}|}nt        dk(  r|sbd'k(  r]|jU                  |      rL|d(z   }	 |j#                         }|stY        d)       n||z   }|jU                  |      rn6|j[                         }|	jU                  |      }|r|jW                  d&      }|r(||
jU                  |      jW                  d&      z   }d}d}n(|r |rt]        |      s|j9                         n|}n|}|}|}|du}nt_        d*tI        t              z        d+|ja                         dz
  t        |fz  a|jU                  |      }|r|jW                  d,      }t.        j0                  jc                  |      rte        ||d-       nt.        j0                  jg                  t              gth        z   }d}|D ]S  }t.        j0                  jk                  ||      }t.        j0                  jc                  |      sCd}te        ||d-        n |sAtG        d.tI        |      d/t.        jl                  jk                  |      d0       n ||       |}|r|j9                         }n|}|}d+|ja                         dz
  t        |fz  a|jU                  |      }|r|jW                  d,      }t.        j0                  jc                  |      rte        ||d-       nt.        j0                  jg                  t              gth        z   }d}|D ]S  }t.        j0                  jk                  ||      }t.        j0                  jc                  |      sCd}te        ||d-        n |sAtG        d.tI        |      d/t.        jl                  jk                  |      d0       n ||       da|jo                          |r
 |dd       y\	  a aaaaaaaayc c}w # t$        $ r6}t'        d|j)                          d|j+                          d| d      d}~ww xY w)1z
    Read fortran codes from files and
     1) Get rid of comments, line continuations, and empty lines; lower cases.
     2) Call dowithline(line) on every line.
     3) Recursively call itself when statement "include '<filename>'" is met.
    NFr
   z*\s*include\s*(\'|")(?P<name>[^\'"]*)(\'|")z(?P<line>.*)&\s*\Zz(\s*&|)(?P<line>.*)z.*?'''r   )r
   r
    
   )r   Tzreadfortrancode: reading #z failed with
zu.
It is likely that installing charset_normalizer package will help f2py determine the input file encoding correctly.r   r   r   freez	Reading file z	 (format:z,strict)
    z
r   r   z!f2pyr	   )r   cr   Cr   f2pyz     H   zxreadfortrancode: Found non-(space,digit) char in the first column.
	Are you sure that this code is in fix form?
	line=%s   r0   .pyf
z.Unexpected end of file when reading multiline
z6Flag sourcecodeform must be either 'fix' or 'free': %szLine #%d in %s:"%s"
	rq   )
dowithlineistopz-readfortrancode: could not find include file z in . Ignoring.
)8r   r    r!   r   r   beginpatternr   r   r   recompileIrangestr	fileinput	FileInputr   r   UnicodeDecodeError	Exceptionr   linenoisfirstliner   r   splitextr   r   r   COMMON_FIXED_EXTENSIONSr   _has_fix_headerr   beginpattern77beginpattern90r2   repr
expandtabsreplacesplit_by_unquotedr   rX   matchgroupro   rstripiscstyledirective
ValueError
filelinenoisfilereadfortrancodedirnamer%   joinpathsepclose)ffiler   r   saveglobalslocaldolowercasecont	finallinellincludelinecont1cont2
mline_markl1rv   spacedigitsfinlmsgextis_f2py_directiverl_origfinalliner   lcmfninclude_dirs	foundfileinc_dirfn1s                                  r)   r   r   e  sf    !#3_nV_%+6{" DI	B**5rtt=KJJ,-EJJ-.EI&J2rFB%U2Y7r3r777K


eh
7C
	A ??!!llnOKBI"N''""?3A6CO$++1137NN(+q/A	09K!'--O,n .Y4"46 7 LLN""63/r'uH$#2A r'
 "#As+B	Sbq6<<>W$$Q[2ab6%93?DAq $779?'
  U"t00Qq6<<>V+!AB%A(,% D(-%q6B;#2At;& !GIMa!Q R R ICFQJqts{!AB%Z	 "KKNAekk!n226::B "I$&M  !AB%A'$&HHJ	$&	$&MBv%C6Mj.>.>q.AHBMOBA!''+  HHJAAGGFO%++a...v66	 "# 4EIZ[]I^
egI "I "TMDH4P^K__a a4NNq /287 7m,Bww~~b!zC GGOOO4 68E F	+ G'',,w3Cww~~c*$%	'
!L !R"**//,"?A B y!{ ~ HHJ		M01or43 3-(AWWV_77>>"B:Q?GGOOO<=MLI' ggll7B/77>>#& !I#CJaH Hbjjool;= > 	9IIK2q 9D	6%	%+E 8 " 	+CLLN+;1SZZ\N  & 	s   ])<]. .	^-71^((^-zN\s*(?P<before>%s(?=\s*(\b(%s)\b)))\s*(?P<this>(\b(%s)\b))\s*(?P<after>%s)\s*\Zzqcharacter|logical|integer|real|complex|double\s*(precision\s*(complex|)|complex)|type(?=\s*\([\w\s,=(*)]*\))|byte.*rh   z|static|automatic|undefined)z([a-z]+[\w\s(=*+-/)]*?|)functionr   r   begin)z	[a-z\s]*?
subroutiner   r   zprogram|block\s*dataz@|module(?!\s*procedure)|python\s*module|(abstract|)\s*interface|ztype(?!\s*\()z\end|endprogram|endblockdata|endmodule|endpythonmodule|endinterface|endsubroutine|endfunctionendzDend\s*(if|do|where|select|while|forall|associate|critical|enum|team)z[\w]*?endifzmodule\s*proceduremoduleprocedure)r
   implicitr   r   r   )r
   dimension|virtualr  r   	dimension)r
   externalr  r   r  )r
   optionalr  r   r  )r
   requiredr  r   r  )r
   publicr  r   r  )r
   privater  r   r  )r
   	intrinsicr  r   r  )r
   intent|depend|note|checkr	  z\s*\(.*?\).*intent)r
   	parameterr  z\s*\(.*r  )r
   datar  r   r  )r
   callr  r   r  )r
   entryr  r   r  )r
   callfunr  r   r  )r
   commonr  r   r  )r
   user  r   r  )r
   containsr  r
   r  )r
   formatr  r   r  )r
   Kthreadsafe|fortranname|callstatement|callprotoargument|usercode|pymethoddefr  r   f2pyenhancementsz2\s*(?P<before>''')(?P<this>.*?)(?P<after>''')\s*\Z	multilinec           
      x   t        d      t        |      z  rJ d       t        j                  dj                  dj                  t        j                  |            dj                  t        j                  |            dd            }|j                  |       }|r|j                         }|d	   |d
   fS | dfS )z
    Splits the line into (line[:i], line[i:]),
    where i is the index of first occurrence of one of the characters
    not within quotes, or len(line) if no such index exists
    z"'zcannot split by unquoted quoteszR\A(?P<before>({single_quoted}|{double_quoted}|{not_quoted})*)(?P<after>{char}.*)\Zz[^"'{}]z[{}]z('([^'\\]|(\\.))*')z("([^"\\]|(\\.))*"))
not_quotedr;   single_quoteddouble_quotedbeforeafterr
   )setr   r   r  escaper   	groupdict)r0   
charactersr   r   ds        r)   r   r     s     E
S_,P/PP-


	!!'!((:)>?ryy4500	 "( "2	3A 	
AKKM(QwZ((":r(   c                     g }t        |       j                  d      D ],  }dD ]  }|j                  |d      } |j                  |       . dj	                  |      S )N@,@z(),r   ,)markoutercommasplitr   appendr   )argslinear   r   s       r)   _simplifyargsr*    s`    
AH%++E2  	"A		!S!A	"	 88A;r(   z"\s*(?P<result>\b[a-z]+\w*\b)\s*=.*z \s*(?P<bind>\b[a-z]+\w*\b)\s*=.*zH\s*bind\(\s*(?P<lang>[^,]+)\s*,\s*name\s*=\s*"(?P<lang_name>[^"]+)"\s*\)c                    t        | d      \  }}|rt        d   j                  |       slt        d   j                  |       sT|dk(  sJ t	        |             t        | d      \  } }|r!t        | |       t        |dd d      \  } }|r!t        | |       y|dk  r_dat        diat        i iat        g ia	g t        t           d<   i t        t           d<   dt        t           d<   dt        t           d	<   d
a
d
ay|dkD  rd}t        rt        t        k(  rd}t        |kD  rt        dt	        t              dt	        t              d       t        d       t        t        dz
     j                  t        t                  t        t           t        t        dz
     d
   d<   t        t        = t        dz
  at        |kD  rt        rt        t        k(  rt        t        dz
     j                  t        t                  t        t           t        t        dz
     d
   d<   t        t        = t        dz
  at        t        dz
     j                  t        t                  t        t           t        t        dz
     d
   d<   t        t        = t        dz
  ad
a
y| dk(  ryd}t        t         t"        t$        t&        t(        t*        t,        t.        t0        t2        t4        t6        t8        t:        t<        t>        t@        tB        tD        tF        tH        tJ        t        t        tL        fD ]  }|d   j                  |       }|r n|dz   }! stN        }	dt        cxk  r	t        k  ry dt        t           v rt        t           d   D ]  }
|
tP        v r	tP        |
   }
dt        t           v r|
t        t           d   v r7tS        j                  d|
z  tU        |       tR        jV                        }|sk|	j                  |jY                  d            }t[        |jY                  d            }|rd|
d|d|jY                  d      d} n	d|
d|d} t\        d   j                  |       }|st        dt	        |       z          yt_        |d|         y t`        dkD  s,t`        dk(  r7tb        je                         jg                  d      rda4t        dt        z         yd   dk(  r=dt        cxk  r	t        k  rn nt        dz
  at        t        k  ryt        dk  rtk        dt        z        t8        d   j                  |       }|rc|jY                  d       t        t           k(  sDtk        d!t	        |jY                  d             d"t	        t        t                 d#tl              t        t        k(  rd
at        t        dz
     j                  t        t                  t        t           t        t        dz
     d
   d<   t        t        = t        dz
  atn        sda8yy|d   d$k(  r5dt        cxk  r	t        k  rn n
t        dz   ayda9t_        ||d   |        da8y|d   d%k(  ry|d   d&k(  rt_        ||d   |        y|d   d'k(  r*tt        rydt        cxk  r	t        k  r	y t        ayt        aydt        cxk  r	t        k  ry t_        ||d   |        y)(z
    reset=-1  --- initialize
    reset=0   --- crack the line
    reset=1   --- final check if mismatch of blocks occurred

    Cracked data is saved in grouplist[0].
    ;r   r   Nr
   bodyvarsblockrq   r      zcrackline: groupcounter=z groupname=r   zYcrackline: Mismatch of blocks encountered. Trying to fix it by assuming "end" statement.
	externals
interfacedz5(?P<before>[^"]*)\b%s\b\s*@\(@(?P<args>[^@]*)@\)@.*\Zr  argszcallfun (z
) result (r   )z8crackline: could not resolve function call for line=%s.
r  r   z"crackline:%d: No pattern for line
r   z>crackline: groupcounter(=%s) is nonpositive. Check the blocks.thiszcrackline: End group z* does not match with previous Begin group z
	r   r   r   r  );r   f2pyenhancementspatternr   multilinepatternr   	crackliner   	groupname
groupcacher   r   r   r   r2   r'  dimensionpatternexternalpatternintentpatternoptionalpatternrequiredpatternparameterpatterndatapatternpublicpatternprivatepatternintrinsicpatternendifpattern
endpatternformatpatternr   functionpatternsubroutinepatternimplicitpatterntypespatterncommonpatterncallpattern
usepatterncontainspatternentrypatternmoduleprocedurepatterncrackline_re_1rz   r   markouterparenr   r   r*  callfunpatternanalyzeliner   r!   r   endswithr&   r   r    r   r   r   r   )r0   resetr   has_semicolonsemicolon_lineflr1   patr   re_1rq   m1m2r)  s                 r)   r9  r9    s6    )s3A}5a8>>tD/288>z&4;&z0s;ndE"#4^AB5G#M D.  	$qy!2&	"B'
!2&	+-
< (+-
< (,.
< )+-
< (qy\\9BR,'i: ;lnlQ&'..z,/GH6?6MIlQ&'+F3,''!+L R \\9lQ&'..z,/GH6?6MIlQ&'+F3,''!+LlQ&'..z,/GH6?6MIlQ&'+F3,''!+LLrzD /=/ +}n jo/@}Z' &  FLLax#$ /</ 0*\22"<0= ;&&t,D:l#;;
S_H`amHn@nXXLtSUcdhUikmkokoqBHHX$67B%bhhv&67A !RXXh%7 9  48;&q)//5AWZ^_cZddf9d3+, Q;7a<O,A,A,C,L,LV,T#9\JK	Q5.,.'!+L,.1 0+- . . !_""4(&)Y|-DD!"((6"23T)L:Q5R-/  
 l* O,"#**:l+CD2;L2I	,"#B'/l##a'K 	Q7	/</'!+LAs1vt$	Q7		Q$	$As1vt$	Q:	/</ 0&,/</ 0As1vt$r(   c                 z    d}d}| D ]1  }|dk(  r|dz   }|dk(  r|dz   }|dk(  r|dz
  }|dk(  r|dz   }-||z   }3 |S )Nr
   r   r4  r   @(@r5  @)@r'   )r0   r   fr   s       r)   rT  rT  W  sq    
A	A 8AAAvI#XAAAvIE Hr(   c                    d}d}t        | |dz         \  }}||z  }|rY|d   |k(  r|dk(  r|d|z   dz   z  }n#||d   z  }|d   dk(  r|dz  }n|d   dk(  r|dz  }t        |dd  |dz         \  }}||z  }|rY|rJ t        || |f             |S )Nr
   r   ()@r4  r   r5  )r   r   )r0   commar   rc  r  r  s         r)   r%  r%  i  s    
A	A%dEDL9MFEKA
!HAFus""AqMAQx3QqSQ)%)UT\B	V  $$4|$$5Hr(   c                 J    | j                  dd      j                  dd      }|S )Nra  r4  rb  r5  )r   )r0   r   s     r)   unmarkouterparenri  |  s$    UC ((4AHr(   c                    | si } |s| S | |u r| S t        |j                               D ]  }|dk(  r|s|| vs||   | |<   |dk(  r||   D ]  }t        | ||      }  5|dk(  rt        | ||   |      } K|dk(  rt	        | ||   |      } a|dv r|s|| vsl||   | |<   u|dk(  r{|dv rt        d|z         t        d	t        |      z          | S )
Nr4   attrspeckindselectorcharselector)=typenamenote)r
  checkr  r  r  dependz"appenddecl: "%s" not implemented.
z-appenddecl: Unknown variable definition key: )listkeyssetattrspecsetkindselectorsetcharselectorro   r   r   )decldecl2forcekr   s        r)   
appenddeclr|    s   u}%**, $
?(Q*_1X 3"4E23. "4q59D. "4q59D##(Q&[ ) )9A=>KF# $ $)$, Kr(   zD\s*(?P<this>(@\(@.*?@\)@|\*[\d*]+|\*\s*@\(@.*?@\)@|))(?P<after>.*)\Zz[(?:,(?P<attributes>[\w(),]+))?(::)?(?P<name>\b[a-z$_][\w$]*\b)(?:\((?P<params>[\w,]*)\))?\Zz\s*(?P<name>\b[\w$]+\b)\s*(@\(@\s*(?P<args>[\w\s,]*)\s*@\)@|)\s*((result(\s*@\(@\s*(?P<result>\b[\w$]+\b)\s*@\)@|))|(bind\s*@\(@\s*(?P<bind>(?:(?!@\)@).)*)\s*@\)@))*\s*\ZzF\s*(?P<scheme>(operator|assignment))@\(@\s*(?P<name>[^)]+)\s*@\)@\s*\Zz9\s*(?P<name>\b[\w$]+\b)\s*@\(@\s*(?P<args>.*)\s*@\)@\s*\Zz4([-+]?(?:\d+(?:\.\d*)?|\d*\.\d+))[dD]((?:[-+]?\d+)?)zA([-+]?((?:\d+(?:\.\d*)?|\d*\.\d+))[eE]((?:[-+]?\d+)?)|(\d+\.\d*))zintent\s*\(.*?\bcallback\bc                 `    | j                  dg       D ]  }t        j                  |      s y y)Nrk  r   r   )get_intentcallbackpatternr   )vdeclr)  s     r)   _is_intent_callbackr    s2    YYz2& !''* r(   c                 d   dj                  | j                               } t        j                  |       }t	        | |       |re|j                  d      }|r-|j                  d      D cg c]  }|j                          c}ng }|j                  d      ||j                  d      fS d g d fS c c}w )Nr
   
attributesr$  rq   params)r   r&  typedefpatternr   printr   r   )r0   r^  attrsr)  s       r)   _resolvetypedefpatternr    s    774::< D			d	#B	$O	&9>EKK$45q5Bxx(:::T> 6s   )B-c                     t        j                  dt         j                        }|j                  |       }d }|r8|j	                  d      }| d |j                          | |j                         d  z   } | |fS )NzObind\(\s*(?P<lang>[^,]+)(?:\s*,\s*name\s*=\s*["\'](?P<name>[^"\']+)["\']\s*)?\)r   )r   r   r   searchr   startr   )r0   patternr   bind_statements       r)   parse_name_for_bindr    sl    jjkmomqmqrGNN4 ENQNU[[]#d599;<&88r(   c                    t        |       \  } }t        |       } t        j                  |       }|r3|j	                  d      |j	                  d      |j	                  d      |fS t
        j                  |       }|r/|j	                  d      dz   |j	                  d      z   dz   }|g d d fS t        j                  |       }|r$|j	                  d      |j	                  d      d d fS d g d d fS )Nrq   r3  r   schemer4  r5  )r  rT  nameargspatternr   r   operatorpatterncallnameargspattern)r0   
bind_cnamer^  rq   s       r)   _resolvenameargspatternr    s    *40D*$D			t	$B	xx&!1288H3EzQQ			t	$B	xx!C'"((6*::S@Rt##		"	"4	(B	xx&!14==T4r(   c                 9   | j                  d      }|dk7  rdat        r|dvrt        st        dk  rt
        j                  j                  t              j                  d      d   }t        d|z         dat        dz   ad	t        t        <   i t        t        <   g t        t        <   g t        t           d
<   i t        t           d<   d	t        t           d<   |t        t           d<   dt        t           d<   da|dv r|j                         }t!        j"                  d|t         j$                        rd}nOt!        j"                  d|t         j$                        rd}n't!        j"                  d|t         j$                        rd}|dk(  r@t'        | j                  d            \  }}}t)        |      t        t           d   |<   g }d}	nt+        | j                  d            \  }}}	}
||dk(  rd}nd}|dvrt        d       ||t        fa|r@t-        t/        |      j                  d      D cg c]  }|j1                          c}      }ng }d|v r%d|v r|j3                  d       d|v rt        d       d}d}|d v r\d}d!t        t           vry|t        t           d!   vryt        t           D ]  }|d   |k(  s y |t        t           d"   v ryd#d$d |   }t4        r#t6        d%k(  rt        dk  rt        d&z   ad}|d'vrd}t        dz   ai t        t        <   g t        t        <   |rt8        dkD  rt        d(t;        t4              z  d       d)t        t        <   dt        t           d<   t4        t        t           d<   dt        t           d<   g t        t           d
<   g t        t           d*<   g t        t           d"<   i t        t           d<   t        dz   ai t        t        <   g t        t        <   |rt8        dkD  rt        d+t        z  d       d,t        t        <   d,t        t           d<   d-t        t           d<   t        t        dz
     d   d.t        t        dz
     d   t        t           d<   g t        t           d
<   g t        t           d*<   g t        t           d"<   i t        t           d<   t        dz   ai t        t        <   g t        t        <   |t        t        <   |t        t           d<   |sd/|j=                  d0d1      z   }| j                  d2      t        t           d3<   t?        |      t        t           d<   |	t        t           d4<   t        dk(  rt        t        t           d<   nqt4        r4t        d5k(  r+t        t        dz
     d   d.t        t        t           d<   n7t        t        dz
     d   d.t        t        dz
     d   t        t           d<   tA        t        t           jC                               D ]!  }t        t           |   rt        t           |= # |t        t           d!<   g t        t           d
<   g t        t           d*<   g t        t           d"<   i t        t           d<   i t        t           d6<   |dk(  rg t        t           d7<   |d v r|t        t        d&z
     d*   vr"t        t        d&z
     d*   jE                  |       tG        jH                  t        t        d&z
     d         t        t           d<   	 t        t           d   |   t        t           d   |   d8   jK                  d9      = |d:v rN
rt!        jN                  tP        |
      }|rm|i it        t           d;<   |j                  d<      t        t           d;   |   d<<   |j                  d=      r%|j                  d=      t        t           d;   |   d<   	 tS        t        t           d   |   t        t        d&z
     d   d         t        t           d   |<   |d>k(  rX|	rV|	t        t           d   v rD||	k(  s?tS        t        t           d   |   t        t           d   |	         t        t           d   |<   	 t        t        d&z
     d"   jE                  |       |d$k(  rltT        d   j#                  | j                  d2      d0z   |z         }|r=tW        |j                  d      |j                  d            \  }}}}tY        ||||       |d v rt        t        dz
     jE                  t        t                  t        t           t        t        dz
     d%   d
<   t        t        = t        dz
  at        t        dz
     jE                  t        t                  t        t           t        t        dz
     d%   d
<   t        t        = t        dz
  ayy|d6k(  rt+        | j                  d            \  }}}	}|s|r@t-        t/        |      j                  d      D cg c]  }|j1                          c}      }ng }|	J t;        |	             |t        t           d6   |<   d6|t        fayy|dk(  r;tW        || j                  d            \  }}}}tY        ||||      }|
d?|t        fayy|d@v rt        t           d   }| j                  d      j1                         }|j[                  dA      }|dk  r|dBk(  rt]        |      j[                  dC      d&z
  }|d|dz    dAz   ||dz   d z   }|j[                  dA      }||d dAk(  rTd!t        t           v rEt        dD| j                  d      |d| dE       |dFj_                  t        t           d!         z   }|dk  rd}d}n|d| j1                         }||d&z   d }t/        |      j                  d      }ta        |      dkD  r%|d   }t        dGdFj_                  |dd       z         d}t/        |      j                  d      D cg c]  }|j1                          c}D ]4  }tb        j#                  |      }|s<|dHv rd}nOte        | jg                                t        dI|dJt;        |      dK       Wt?        |j                  d            }|dHv r|dLk(  s|dMk(  r||j                  d      z  }||vri ||<   |dNk(  r||j                  d      z   }|dBk(  r| j                  d      |z   }th        j#                  |      r|t        t           d!   vrt        dkD  rsdOt        t        d&z
     d   vrt        dP       |t        t           d   k7  r]t        dQ|dRt        t           d   dS       t        t           d!   jE                  |       ntk        dT|z         ntk        dU|z         |dVv r|}d8||   v r||   d8   jE                         n	g||   d8<   |d9k(  rrt        t           d   d	k(  rt        dW       |t        t           d!   vrd*t        t           vrg t        t           d*<   t        t           d*   jE                  |       |}7 |t        t           d<   |
d?|t        fayy|dXk(  rK| j                  d      j                  dF      D cg c]  }|j1                          c}t        t           dY<   y|dZk(  r?t        t           d   }| j                  d      j1                         dd% }d}t/        |      j                  d      D ]  }	 |j                  d[      D cg c]  }|j1                          c}\  }}tm        |      }t?        |      }||vri ||<   d[||   v r&||   d[   |k(  st        d_|d`||   d[   da|db       to        ||      }|r|jq                  dc      ddk(  rtA        |      } tr        ju                  |      D ]i  } tA        || jw                         | jy                          j                         j=                  dedf            | | jw                         | jy                          k dj_                  |       }nG|jq                  dc      dgk(  r3|dd j                         j=                  dedf      j=                  dFdh      }	 t{        |i |      }!t;        |!      ||   d[<   d8||   v r||   d8   jE                  dZ       n	dZg||   d8<   |} |t        t           d<   |
d?|t        fayy|dkk(  r| j                  d      j1                         j                         dlk(  rdt        t           dk<   y| j                  d      r1dkt        t           v rt        t           dk   }#ni }#|#t        dm       i }#t/        | j                  d            j                  d      D ]  }i }$t!        j"                  dn|t         j$                        }|st        do|z         <t        j#                  |j                  d            }%|%st        dp|z         qtW        |%j                  d      |%j                  d            \  }}}}t        ||      \  }&}'}(||$dc<   |&|$dq<   |'|$dr<   |(|$ds<   tA        |$jC                               D ]  }|$|   r	|$|=  t/        |j                  d            j                  d      D ]  })dt|)v r2	 |)j                  dt      D cg c]  }|j1                          c}\  }*}+n|)j1                         x}*}+ta        |*      ta        |+      cxk(  rdk(  sn t        dv|)z         yt        t        |*      t        |+      dz         D ]  },|$|#t        |,      <      |#t        t           dk<   yy|dwk(  rg }d}-d}.d}/d}0d}1| j                  d      D ]  }2|1s|2dxk(  r|0 }0|2dyk(  r|0r|/dz   }/|2dzk(  r|1dz   }1n
|2d{k(  r|1dz
  }1|/dk(  r|-|2z   }-:|/dk(  r|.|2z   }.E|/d&k(  sK|-j1                         }-|-j                  dF      r|-dd j1                         }-|jE                  |-|.g       |2}-d}.d}/ |/d&k(  rG|-j1                         }-|-j                  dF      r|-dd j1                         }-|jE                  |-|.g       t        t           jq                  di       }3d}|D ]  }4|4d   j1                         |4d   j1                         c|4d<   |4d<   |4d   j                  dF      r|4d   dd |4d<   |4d   j                  dz      rt        d||4d   z         vt        t-        t/        |4d         j                  d      D cg c]  }|j1                          c}            D ]  \  }5}!|!j                  dz      rt        d||!z         'd}|4d   v rt        d~|4d   z         @|3j                  |!i        |3|!   jq                  dc      }6t        |3|!         }7|6dgk(  rt!        j                  d|4d         n|4d   j                  dF      }8	 |7r dj                  dj_                  |8            n|8|5   }9|3|!   jq                  d[      }>|>r|>|9k7  rt        d|!d`|>d|9d^       |9|3|!   d[<   |!}
  |3t        t           d<   |r
d?|t        fayy|dk(  r[| j                  d      j1                         }|d   dyk(  sd|z   }g }?d}/d}@d}A|D ]R  }2|2dyk(  r|/dz   }/|/d5k\  r0@j1                         }@|@sd}@|?jE                  @Ag       |/d&z
  }/d}@d}A|/d&z  r@|2z   }@NA|2z   }AT @j1                         }@|@sd}@|?jE                  @Ag       i }Bdt        t           v rt        t           d   }B|?D ]i  }2|2d   Bvrg B|2d   <   t/        |2d         j                  d      D cg c]  }|j1                          c}D ]  }|sB|2d      jE                  |        k Bt        t           d<   d@t        fay|dk(  rt!        j"                  d| j                  d      t         j$                        }|rW|jg                         }Cdt        t           vri t        t           d<   |j                  d      }i t        t           d   |<   d}DdCv rCd   dCv rCd   d}DDt        t           d   |   d<   Cd   j                  dF      D cg c]  }|j1                          }}i }E|D ]  }4d[|4v rt!        j"                  d|4t         j$                        }%|%r@|%j                  d      j1                         E|%j                  d      j1                         <   nt        dt;        |4      z         n|4E|4<   Et        t           d   |   d<    yyte        | jg                                t        d       y|dv rdt        t           vri t        t           d<   t        t           d   }F| j                  d      dk(  rDdFv r@t        Fd   t              r	Fd   g|Fd<   Fd   jE                  | j                  d             y| j                  d      F| j                  d      <   y|dk(  rIt        t8        rt        d       yt        }Gt        t        |G   t        dd& | j                  d             yt8        dkD  r%te        | jg                                t        d       yyc c}w # tL        $ r Y w xY w# tL        $ r Y w xY w# tL        $ r Y w xY wc c}w c c}w c c}w c c}w # tL        $ r t        d\|d]|d^       Y ?w xY w# t|        t~        t        f$ r}"tk        di|dj|"dE       Y d}"~"od}"~"ww xY wc c}w # tL        $ r t        du|)z         Y w xY wc c}w # t        $ r t        d |8D              rg }:|8D ]  };d|;v rp	 |;j                  d      \  }<}=|:j                  |=j1                         gt        |<      z         I# t        $ r" |:jE                  |;j1                                Y sw xY w|:jE                  |;j1                                 |:}8|7r dj                  dj_                  |8            n|8|5   }9Y Mw xY wc c}w c c}w )a  
    Reads each line in the input file in sequence and updates global vars.

    Effectively reads and collects information from the input file to the
    global variable groupcache, a dictionary containing info about each part
    of the fortran module.

    At the end of analyzeline, information is filtered into the correct dict
    keys, but parameter values and dimensions are not yet interpreted.
    r6  r  N)r   r  r  rh   r   .r   zBanalyzeline: no group yet. Creating program group with name "%s".
programr-  r.  r/  rq   fromskyfrom)r   r  r  zblock\s*data
block datazpython\s*modulepython modulezabstract\s*interfaceabstract interfacerh   r  )rk  _BLOCK_DATA_r
   )	interfacer  r  z2analyzeline: No name/args pattern found for line.
r#  z<analyzeline: argument list is malformed (missing argument).
)r  r  r3  r2  r   r   r   r0  r  r  z&analyzeline: Creating module block %s
moduler1  zDanalyzeline: Creating additional interface block (groupcounter=%s).
r  unknown_interface:unknown_r   r   r  prefixr      r  varnamesrk  r  r   r   bindlanglang	lang_namer  variable)r  r
  r  r  r  r  r  r  ::r
  rb  z"All arguments will have attribute r   r$  zXanalyzeline: cannot handle multiple attributes without type specification. Ignoring %r.
r  r  z&analyzeline: no name pattern found in z statement for z. Skipping.
operator
assignmentr  __user__z8analyzeline: missing __user__ module (could be nothing)
z(analyzeline: appending intent(callback)  to z arguments
z,analyzeline: intent(callback) %s is ignored
z=analyzeline: intent(callback) %s is already in argument list
)r  r  r  r  r  r  z(analyzeline: ignoring program arguments
r   implementedbyr  rn  zAanalyzeline: could not extract name,expr in parameter statement "" of ""
z1analyzeline: Overwriting the value of parameter "" ("z	") with "rm   r4   r5   r!  ecomplexz+1j*(z analyzeline: Failed to evaluate z. Ignoring: r   nonez<analyzeline: Overwriting earlier "implicit none" statement.
z9\s*(?P<this>.*?)\s*(\(\s*(?P<after>[a-z-, ]+)\s*\)\s*|)\ZzDanalyzeline: could not extract info of implicit statement part "%s"
zManalyzeline: could not extract types pattern of implicit statement part "%s"
rl  rm  ro  -zZanalyzeline: expected "<char>-<char>" instead of "%s" in range list of implicit statement
z^analyzeline: expected "<char>-<char>" instead of "%s" in range list of implicit statement (2)
r  '/r4  r5  z>analyzeline: implied-DO list "%s" is not supported. Skipping.
r   z=Comment line in declaration "%s" is not supported. Skipping.
z\(.*?\)z(/{}/), c              3   $   K   | ]  }d |v  
 yw)r   Nr'   ).0r   s     r)   	<genexpr>zanalyzeline.<locals>.<genexpr>  s     53!85s   r   z*analyzeline: changing init expression of "") to "r  z//_BLNK_r  zR\A\s*(?P<name>\b\w+\b)\s*((,(\s*\bonly\b\s*:|(?P<notonly>))\s*(?P<list>.*))|)\s*\Zrs  notonlyonlyz7\A\s*(?P<local>\b\w+\b)\s*=\s*>\s*(?P<use>\b\w+\b)\s*\Zlocalz0analyzeline: Not local=>use pattern found in %s
mapz0analyzeline: Could not crack the use statement.
)r  r  usercodez-analyzeline: No context for multiline block.
z+analyzeline: No code implemented for line.
)Tr   r&   r   r   r   r   r   basenamer!   r&  r2   r   r:  r;  r   r   r   r   r   r  dictr  rw   r%  r   remover   r   r   r   r   rr   rs  rt  r'  copydeepcopyr[   r   r  crackline_bindlangr|  rL  cracktypespec0
updatevarsfindrT  r   rX   namepatternr  r  r  ro   get_parametersdetermineexprtyper~  real16patternfinditerr  r   evalSyntaxError	NameError	TypeErrortypespattern4implicitcracktypespecr   ordchrr   	enumerate
setdefaultgetdimensionfindallr  
IndexErroranyextendr8   r   
isinstancer   appendmultiline)Hr   r?   r0   r/  newnamerq   r  r   r3  r   	bindclinex
needmoduleneedinterfaceitr{  bindcdattr4   selectorattredecl	last_namer   iplchr  r^  apinitexprr  ttvr   implrx  r_  
kindselect
charselectro  r   begcendcodlilrc  fcinpr   r.  r   idxvtypevdimmatchesnew_valexpanded_listr   
multipliervaluecurrent_valclbnol	commonkeymmisonlyr   r!  gcsH                                                                           r)   rV  rV    s    GGFOE{t#GG!1''""?399#>qAQT[[	]#a'"+	,#%
< "$	,+-
< (+-
< (,5
< )+2
< (+4
< (++88OUBDD1 EXX(%6#EXX-ubdd;(EF?3AGGG4DEND%59U5KJ|$V,T2DF,CAGGGDT,U)D$	<$%MMMN!46'5d';'A'A%'HJ"#  ggi J KD D:*B *OQ 
&&MZ55:l3F;;- f:% z,/==)jA$GE\R/LA4E'!+LJ?? !#a'#%
< "$	,{A]+,-.0&.Il#0?J|$W-/<J|$V,/1J|$V,/1J|$V,46J|$[157J|$\2/1J|$V,'!+L')J|$&(Il#{_ "#$&&1Il#0;J|$W-/BJ|$V,<!+,V4jPQAQ6RSY6Z0\J|$V,/1J|$V,46J|$[157J|$\2/1J|$V,'!+L')J|$&(Il#"'	,,1
< )c3 77D-.WWX->
< *+5d+;
< (-3
< *1/>J|$V,!2|a/08/4K
<(0 |a/08*\TUEU:VW]:^4`
<(0j.3356 	0Al+A.|,Q/	0 ,0
< (+-
< (02
< -13
< .+-
< (,.
< )F?35J|$Z0&&:lQ&67DD<!+,[9@@F/3}}<!+,V406J|$V,|,V4T:|,V4T::FLLZXZ ..99%7C<@2;J|,Z8IQX^I_J|,Z8>vF~~k2MU^^\gMh
<0<TB6J9C|,V4T:J|VWGW<XY_<`ac<d:f
<(06 y f
<(@(HH6>AK&|4V<TBJ|D\]cDdekDlBn
<08><!+,\:AA$G JQ%%aggh&7#&=&DEA2@GGFOQWWW%537/(D%8XtU;&&lQ&'..z,/GH6?6MIlQ&'+F3,''!+LlQ&'..z,/GH6?6MIlQ&'+F3,''!+L ' 
6qwww7GHdFA +9$+?+E+Ee+L"N&' #$'') "N O >/4</>6:J|$W-d3 '|<  
*81777#+%'(D%x4?	  *I|D !	n	n<(0WWW##%GGDMq5TX%r"''.2AFQUd"RAZ/BA!"v~&J|,D"D"Ra&2 3#((:l#;F#CDDq5ABBQBAEFBB%%e,r7Q;ABoAB " #	%3B%7%=%=e%DE!'')E 5	A""1%B00A!++-(d1g' (rxx/0,,Z1#4RXXg&&~a{"BHHW--xWWV_r))//3
< 8 @@'!+)L1<L1Mf1UU '$_!a  !J|$<V$DD '@A:lC[\bCc)e !f *< 8 @ G G J# OST UW   !69:!< =]]U1X%a$++B/(*ta$z!l+G4	AGHJ|4V<<j&>><>J|,[9<(5<<Q?Ik5	l ,1
< (  *I|D !	"	" ! 0 6 6s ;<1QWWY< 	< 1		<(0WWW##%a+	#))%0 $	A23''#,?Qqwwy?8
 $E*F1A~aeAha(AuQx}h0 1!(F3A55$.hB*33H= S04$QWWYquuw7==?GGSQ1S1779QUUW-S  "wwr{HUU:&)3'|113;;CEW- 2v.
 !GE!HSMU1X%a$++K8(3}a$II$	J ,1
< (  *I|D !		777!!#))+v537J|$Z0WWWZ55!,/
;|SU#AGGG$45;;EB ',XXPRSUWUYUY[_cdeg*00&1ABhlmnp2@HHV$bhhw&739/(D%3@h4(0
J#+Z '1^$'1^$#+Z diik* $A7 G$ ((9:@@G ,Aax%=>WWS\)J!''))JJD$ '(ggi/tt9D	6Q6}  AB  BC "3t9c$i!m< ,'+SV,,1',P 48J|$Z0c d 
! 	A8B8AACxAgcAgAv!Va!VaXXZ==%ABB		2r(#-	. 6B}}S!V\\^IIr2h,'++FB7	 2	A1qtzz|JAaD!A$ts#tABx!ts#Y\]^_\``a#I.QRSTQUBVB\B\]bBc.dQqwwy.d$ef +Q<<$]`aab !A$; \_`ab_ccd2&QJ/#DG,:?9:L"**Z16RSTURVR\R\]`Ra\EIhoodii.@AwWZ|G& #1gkk#.K7$:`acnpwxy&Q	W+2	f ,0
< ( *I|D 		www%%'Aw#~$;D 	ACxEAvXXZ!B		2r(#E1u!V!V	  XXZB
		2r(	z,//"<0:I 	.At9$"$	!A$)7!)=)C)CE)JKAaggiK .adO**1-.	. .7
< *$b,7	XXacdcjcjkrcsuwuyuy{BJ|4424
<(/88F#D46J|$U+D1F|6
 6?r)}'<F@F
<(/5f=)+F)9)9#)>?Aaggi?? FAaxXXVXY[][_[_a<>HH %='',uw rxx06689 $ SVZ[\V] ]_ !"1CEJ|,U3D9%@F !++- GH	%	%Z%==;=J|$%78|$%78776?j(Z1_!J--!":*jM  !12!"!1Aaggfo		#HI
2(!,	) Q;!++- BC eJP      ."NL Fv = @ hikmnp0  I6 #S* +h *K( %# }  AB  !BC$%r /e* " \
 5W55(*%, DE"e|!H8=C8H$5J$1$8$8%++-3z?9Z$['1 !H$1$8$8$G!H !. 4 4U[[] CD #0EIhoodii.@AwWZ|G#\x L& @sA  0Al7Al AAl( :"Al8 Am(Am>Am AmAm*AmCAm>K;An7LAn2L%An7V AoY	'Ao_Asd Asl	Al%l$Al%l(	Al5l4Al5l8	AmmAmmAmmAm;m:Am;m>An/nAn*n*An/n2An7n7AooAoo&Ar>pA AqqAr>q(Aq-q*Ar>q,Aq-q-AAr>r=Ar>c                 Z    d| vri | d<   | d   }||vrg ||<   ||   j                  |       y )Nf2pymultilinesr'  )r   context_namemlr!  s       r)   r  r  2  sF    u$"$A1,lO2
r(   c                 F   d }d }t        j                  d| t         j                        rd} nFt        j                  d| t         j                        rd} n| j                         j	                         } t
        j                  t        |            }|st        d       y |j                         }t        |j                               D ]  }t        ||         ||<    | dv r
|d   }|d   }|j                  d	      }|d
k\  r|d | j                         }||dz   d  }| |||fS )Nzdouble\s*complexdouble complexzdouble\s*precisionzdouble precisionz>cracktypespec0: no kind/char_selector pattern found for line.
)r  r7   logicalr5   	characterrh   r6  r  r  r   r0  )r   r   r   r   r   selectpatternrT  r2   r  rs  rt  ri  r  )r4   r   r  r  r^  r!  r{  r  s           r)   r  r  <  s   HD	xx#Xrtt4#	'244	8%>>#))+			^B/	0BM	O
A!&&(^ &!%!&QQV9wZ
AAv"1v||~AZXtR''r(   z)\s*(?P<name>\b\w+\b)\s*(?P<after>.*)\s*\ZzB\s*(\(\s*(kind\s*=)?\s*(?P<kind>.*)\s*\)|\*\s*(?P<kind2>.*?))\s*\Zz2\s*(\((?P<lenkind>.*)\)|\*\s*(?P<charlen>.*))\s*\Zz\s*(kind\s*=\s*(?P<kind>.*?)\s*(@,@\s*len\s*=\s*(?P<len>.*)|)|(len\s*=\s*|)(?P<len2>.*?)\s*(@,@\s*(kind\s*=\s*|)(?P<kind2>.*)|(f2py_len\s*=\s*(?P<f2py_len>.*))|))\s*\Zz\s*(@\(@\s*(?!/)\s*(?P<array>.*?)\s*@\)@\s*\*\s*(?P<len>.*?)|(\*\s*(?P<len2>.*?)|)\s*(@\(@\s*(?!/)\s*(?P<array2>.*?)\s*@\)@|))\s*(=\s*(?P<init>.*?)|(@\(@|)/\s*(?P<init2>.*?)\s*/(@\)@|)|)\s*\Zc                     | j                         } t        |       dk  r| S | d   }t        dt        |       dz
        D ]'  }| |   dk(  r| |dz      dv s
| |dz
     dv r || |   z   }) || d   z   }|S )Nr   r   r   z()[]{}=+-/* r   )r   rX   r   )exprexpr2r  s      r)   removespacesr!  c  s    ::<D
4yA~GE1c$i!m$  GsN1q5k^+a!e.Q  DHELr(   c                     d}d}d}d}| D ]8  }|dk(  r|dv r||z  }|}|s|dv r|}||k(  r| }n|dk(  r|r|dz  }2||z  }|}: |S )	a(  
    The function replace all spaces in the input variable line which are 
    surrounded with quotation marks, with the triplet "@_@".

    For instance, for the input "a 'b c'" the function returns "a 'b@_@c'"

    Parameters
    ----------
    line : str

    Returns
    -------
    str

    r
   FN\)r#  r  ")r  r$  r   @_@r'   )r0   fragmentinsidecurrent_quoteescapedr   s         r)   markinnerspacesr*  r  s      HFMG d?q$55MHG!{*MZF#X&HA Or(   c                 |   d}t        | |      \  }}}|rt        |      j                  d      D cg c]  }|j                          }}g }	t	        j
                  d      }
|D ]Y  }|s|
j                  |      }|r0|j                  d      j                         }||t        |      d z   }|	j                  |       [ |	}t        |      j                  d      D cg c]  }|j                          }}g }|D ]u  }t        t        t        |            d      j                  d      D cg c]  }|j                          c}D ]&  }|s|j                  |j                  dd             ( w |D ]  }t        j                  |      }|st        d	t!        |      z         3t#        |j                  d
            }i }|t$        t&           d   v rt$        t&           d   |   j)                         }d|v}|r| |d<   n"| r | |d   k(  st        d|d|d   d| d       d|vrt)        j(                  |      |d<   nu|rst+        |j-                               D ]W  }||d   v r0||   |d   |   k(  s"t        d|d|d|d   |   d||   d	       :t)        j(                  ||         |d   |<   Y d|vr|r|r||d<   nt/        d|d|d       nu|rst+        |j-                               D ]W  }||d   v r0||   |d   |   k(  s"t        d|d|d|d   |   d||   d	       :t)        j(                  ||         |d   |<   Y d|vr||d<   n"|r |d   |k(  st        d|d|d   d|d       d|vrt)        j(                  |      |d<   n|r|D ]  }||d   vs|d   j                  |         net)        j(                  |       |d<   t)        j(                  |      |d<   t)        j(                  |      |d<   ||d<   t)        j(                  |      |d<   d|j1                  d      xs g v rP|t$        t&           d   v r>dt$        t&           vrg t$        t&           d<   t$        t&           d   j                  |       |j                  d      r&t2        j                  t5        |j                  d                  }|r|j7                         }d D ]  }||d!z      ||d!z      ||<   ||d!z   =  t+        |j-                               D ]  }||   t9        ||         ||<   ||=  d"|v ryd#|v ru|d"   d$k(  r|d#   |d"<   |d#= na| d%k(  r*d|vs|d   si |d<   d"|d   v r|d   d"= |d"   |d   d&<   |d"= n2|d#   d'z   |d"   z   |d#<   |d"= t/        d(| d|d)| d|d*|d#   d+       d"|v rO| d,v rd|vs|d   si |d<   |d"   |d   d&<   |d"= n.| d%k(  r)d|vs|d   si |d<   d"|d   v r|d   d"= |d"   |d   d&<   |d"= d-|v r3d.|v r'|d.   |d-   k(  st        d/|d|d.   d|d-   d       n|d-   |d.<   d#|v rd0|d#   z  }d|vs|d   s|g|d<   nj|d   j                  |       |d   D ]-  }|dd1 d2k(  s||k7  s|d   d3= t/        d|d4|d5|d        n" n t        d6||j                  d      z   z         t+        |j-                               D ]  }||   r	||=  |t$        t&           d   |<   d7t$        t&           v rt$        t&           d7   j                  |       |} |S c c}w c c}w c c}w )8z
    Returns last_name, the variable name without special chars, parenthesis
        or dimension specifiers.

    Alters groupcache to add the name, typespec, attrspec (and possibly value)
    of current variable.
    Nr#  z(?P<start>[a-zA-Z]+)r  r   rg  z@ @r%  z;updatevars: no name pattern found for entity=%s. Skipping.
rq   r.  r4   z+updatevars: attempt to change the type of "r  r  z". Ignoring.
rl  z0updatevars: attempt to change the kindselector "r  rm  zupdatevars:z*: attempt to change empty charselector to r   z0updatevars: attempt to change the charselector "ro  z/updatevars: attempt to change the typename of "rk  r  r3  r1  r  )rX   arrayinit2rX   r-  r
   r  r   r$  zupdatevars: "z" is mapped to "r4  z)"
r  r7   r  r5   r.  rn  z6updatevars: attempt to change the init expression of "dimension(%s)	   r  r   z: attempt to change r  z?updatevars: could not crack entity declaration "%s". Ignoring.
r  )r  r%  r&  r   r   r   r   r   r   rX   r'  r!  r*  r   r  r2   r   rr   r;  r   r  rs  rt  ro   r~  lenarraypatternrT  r  ri  )r4   r  rk  
entitydeclr  r  r  ro  r  r   r   r)  r   selel1r  e1enamer  not_has_typespecr{  r^  d1lkdmdm1s                              r)   r  r    s8    I'4Xx'H$J
H'5h'?'E'Ee'LM!AGGIMMJJ./ 	A
AGGG$**,#a&'
NHHQK	 +J7==eD	E!'')	EB	E
C 3&4\/RSBT5U]`&a&g&ghm&no1779o 	3B

2::eS12	33  Ea NRVWXRYZ\1776?+J|,V44|,V4U;@@BE)6$,j!8uZ/@#@5,h8 9U*(,		*(=n%joo/0 LAE.11:a=ER`LabcLd;dueN&;A&>
1!O P 4899Z]3Kn-a0L U*z#,6E.)$j2 3joo/0 LAE.11:a=ER`LabcLd;dueN&;A&>
1!O P 4899Z]3Kn-a0L &$,j!5#4#@5,h8 9&$(IIh$7j!! 4Aj 11j)0034 !%		( 3E*$(IIj$9E.!$(IIj$9E.! (E* $		( 3E*%))J/5261
<@XY_@`;`*\"::8:
<(5|$[188;777 &&~aggg6F'GHB\\^2 )B"s(|/!#BH2rCxL) bggi "A!u( 0A 71qE	" B;7b=%yB$&wK5	wK![0*%7~AV46E.1 E.$99 %n 5e <57Yn-c2uI&(kC&7"U)&C7uI$a5"W+!G H B;#LL*%7~AV46E.157Yn-c2uI![0*%7~AV46E.1 E.$99 %n 5e <57Yn-c2uIR<e|U3Z2f:-E!5:r&z!; < &(Zc
b=(2g;6B!.uZ7H-/Dj)j)004#(#4 &C"2Aw+5#)$)*$5b$9 '+0#r); !< %& ZAGGG,,. /ejjl# 	A8!H	 38
< (/L11|$Z077>	KEL q N 
F ps   \/\4-\9c                 t   d }d }d }|r+| dv rt         j                  |      }|st        dt        |      z         y |j	                         }|d   |d<   |d= t        |j                               D ]  }||   r	||=  t        |j                               D ]  \  }}t        |      ||<    n| dk(  rt        j                  |      }|st        dt        |      z         y |j	                         }|d   |d<   |d= |d   rft        j                  t        |d               }|j	                         }d	D ]#  }||d
z      r||d
z      ||<   ||   ||<   ||d
z   = % |d   |d   |d<   |d= t        |j                               D ]  }||   r	||=  t        |j                               D ]  \  }}t        |      ||<    np| dk(  rTt        j                  d|t        j                        }|r|j                  d      }n2t        dt        | |z         z         nt        dt        |      z         |||fS )Nr0  z4cracktypespec: no kindselector pattern found for %s
kind2r   r  z4cracktypespec: no charselector pattern found for %s
charlenlenkind)rX   kindr/  f2py_lenrh   z\s*\(\s*(?P<name>\w+)\s*\)rq   z'cracktypespec: no typename found in %s
z'cracktypespec: no selector used for %s
)rl  r   r2   r   r  rs  rt  itemsrr   rm  lenkindpatternr%  r   r   r   )	r4   r  r  r  ro  r{  r  rB  r<  s	            r)   r  r  @  s   JJH@@%++H5JKtT\~^`#--/J(1JsO7#*//+, &!!}"1& Z--/0 .1 *1
1.$%++H5JKtT\~^`#--/J(3JsO9%)$(..":i#89;!++-) *BrCx(&-b3h&7%,R[JrNS)	*
 :&2-4Z-@Jz*9%*//+, &!!}"1& Z--/0 .1 *1
1.xx =xNH#>>&1Bh124 5 >(^% &z8++r(   c                    | si } |s| S d| vr|g| d<   | S |r| d   j                  |       || d   v r| S |dk(  rd| d   vr| d   j                  |       | S |dk(  rd| d   vr| d   j                  |       | S |dk(  rd| d   vr| d   j                  |       | S |dk(  rd| d   vr| d   j                  |       | S | d   j                  |       | S )Nrk  rJ   	automaticr  r  r  )rx  r  rz  s      r)   ru  ru  |  s-    6ZZ%tJxKtJ/??Z% K 
	j1A!AZ% K 
	D,,##D) K 
	4
++##D) K 	Z%Kr(   c                     | si } |s| S d| vr|| d<   | S t        |j                               D ]  }|s|| d   vs||   | d   |<    | S )Nrl  rs  rt  rx  selrz  r{  s       r)   rv  rv    sl    T!"^#((* -AT.11&)!fD #- Kr(   c                     | si } |s| S d| vr|| d<   | S t        |j                               D ]  }|s|| d   vs||   | d   |<    | S )Nrm  rJ  rK  s       r)   rw  rw    sl    T!"^#((* -AT.11&)!fD #- Kr(   c                     d| v r| d   S |S )Nrq   r'   )r/  unknowns     r)   getblocknamerP    s    V}Nr(   c                 @    d| d   d| d   da y # t        $ r Y y w xY w)NzIn: r  r  rq   r   )r    r   )r/  s    r)   setmesstextrR    s,    ,1&M5=I s    	c                 ^    i }d| v rt        | d         }d| v r|j                  | d          |S )Nparent_blockr  )get_usedictupdate)r/  usedicts     r)   rU  rU    s:    GeN34~uU|$Nr(   c           
         |i }t        |       }|s|S t        |j                               D ]  \  }}|j                         }|t        vr"t        d|d| j                  d      d       @t        |   }t        |      }|sW|rt        d|z         t        |j                               D ]2  \  }}||v r$t        dt        |      dt        |      d       |||<   4  |S )Nzget_useparameters: no module z info used by rq   r   z,get_useparameters: mapping for %s not impl.
z(get_useparameters: overriding parameter z with value from module )
rU  rs  rE  r   r   r2   r~  r  ro   r   )	r/  	param_maprW  usenamemappingmvarsr  r{  r  s	            r)   get_useparametersr]    s     	% G 1 --/-'eii/1 2g&&CwOP( 	DAqI~59!Wd7mM NIaL		& r(   c                    t         s| S t        | t              r | D cg c]  }t        ||dz   |       }}|S t	        |        t        |d| d   dd       |t        |       }|Md| v rI| d   }t        |j                               D ](  }||   }d|v s|d   }d	|v s|d	   }	|	|v s!||	   |d	<   * | d
   D 
cg c]  }
t        |
|dz   |       }}
|| d
<   | S c c}w c c}
w )Nr   )tabrY  Block: rq   r   r   r.  rl  rC  r-  )r   r  rs  
postcrack2rR  r2   r]  rt  )r/  r_  rY  gretr.  r   varrC  valbnew_bodys               r)   ra  ra    s'    % !tyA  
sE&M2A6%e,	5V}diik" 	6Aq'C$>*T>v,Ci''0~V	6 v( 1#*	B (H (E&ML/&(s   C<C"c                    t        | t              rYg }g }| D ]K  }t        |       t        ||dz         }d|v rd|d   v r|j	                  |       ;|j	                  |       M ||z   S t        |        t        | t
              sd| vrt        dt        |       z         d| v r| d   dk(  st        |d| d   d	d
       t        |       } t        |       } t        |       | d<   t        | d         | d<   | j                  d      r| d   }t        | ||      | d<   g }d| v r:| d   }t        |j                               D ]  }d|v s|j	                  |        ni }d}	d| v r| d   }	| j                  d      rKg }
d| v r| d   }
t!        j                   | d         }|	r|	dz   }nd}||v r!d}d||fz  |v r|dz   }d||fz  |v rd||fz  }dg i |	dz   d}| d   D ]  }||
v rg }d}| d   D ]l  }|dz   }|d   dk(  sd}|d   D ]1  }|dz   }d|v s|d   |k(  st!        j                   |      }|d   |=  n |sO|d   s| d   |= |
|
j#                  |      =  n |d   j	                  |       ||v st%        ||         r||   |d   |<    |d   s|d   r+|
| d<   d|gi || d   d}i ||<   t&        j	                  |       |r|| d<   | S )zi
    TODO:
          function return values
          determine expression types if in argument list
    r   r_  rq   r  r/  z0postcrack: Expected block dictionary instead of r  r`  r   r   r.  sortvarsr3  r-  r  r
   r1  r2  __user__routinesunknown__user__routinesr   z%s_%ir  _user_interface)r/  r-  r.  rq   r   r  )r/  r-  r.  rq   r2  )r  rs  rR  	postcrackr'  r  r   r   r2   analyzeargsanalyzecommonanalyzevarssortvarnamesr~  analyzebodyrt  r  r[   
isexternalr   )r/  r3  r_  greturetrb  userisdefineduseblockr{  rq   r2  r\  mnamer  r  r  edefjrf  bbmblocks                        r)   rn  rn    s    % 	AN!t,A{zQvY6AA	 d{eT"we';JE
# $ 	$uV}0CC3f6:E% E&E&M$U6]3E*yyV}t5E&MM~<hmmo& 	(AQ$$Q'	( DV}yy
5 |,J		%-(--E-EM!AUAJ&-7E UAJ&-7uaj(E)20A)AC	{# 	4AJv "AAAz[0"#F) &B !AA%|6
a'+yy}$%fIaL %&  #$V9$)&M!$4 *:+;+;A+> ?!" &!((.:jq&:+08If%a(-	4. V	& 1",E,.9$&U;EWYF HUOv&eLr(   c                    g }g }t        | j                               D ]4  }d| |   v r| |   d   r|j                  |       $|j                  |       6 t        |      }d}|r|d   }d}|dd  D ]  }|| |   d   v sd} n |r;|dd  |gz   }|dz   }||kD  rKt	        ddj                  |      z   dz          ||z   }	 |S |j                  |       |dd  }t        |      }d}|r|S )Nrr  r   r   zTsortvarnames: failed to compute dependencies because of cyclic dependencies between r  r   )rs  rt  r'  rX   ro   r   )r.  indepdepr  r   r  r[  ws           r)   rr  rr  l  s4   E
C$))+ tAw478#4JJqMLLO	
 	CA	A
FQR 	ADGH%%	 ab'QC-CAA1u ;))C.)+/0 1  L	 LLOab'CCAA) * Lr(   c           	         t        |       s| S g }t        | d   j                               D ]  }g }| d   |   D ]j  }t        j                  d|t        j
                        }|rg }|j                  d      rDt        |j                  d            j                  d      D cg c]  }|j                          }}t        |j                  d      j                               }|| d   v rVd| d   |   v r-| d   |   d   j                  dd	j                  |      z         nGdd	j                  |      z  g| d   |   d<   n(|rddd	j                  |      z  gi| d   |<   ni | d   |<   ||vr&|j                  |       n|}t        d
|d|d       |j                  |       m || d   |<    d| vr|| d<   | S | d   |z   | d<   | S c c}w )Nr  z2\A\s*\b(?P<name>.*?)\b\s*(\((?P<dims>.*?)\)|)\s*\Zdimsr#  rq   r.  rk  r1  r$  z:analyzecommon: failed to extract "<name>[(<dims>)]" from "z" in common /z/.

commonvars)	hascommonrs  rt  r   r   r   r   r%  r&  r   rr   r'  r   ro   )	r/  r  r{  comvarsr  r   r  r  r   s	            r)   rp  rp    s   UJ%/&&() %x# 	AEq"$$PA776?%3AGGFO%D%J%J5%QS ! GGI SD Sqwwv4467f%!U6]1%55fa(4;;+sxx~>@ ,sxx~>8@fa(4 &CHHTN)K(L,Nfa( ,.fa(J&%%a(ijlmnpNN19	: %h?%@ 5 (l L $L1J>lL9Ss   $Gc                    t        |        | d   j                         D ci c]  \  }}d|vsd|d   vr|| }}}g }| d   D ]  }| |d<   |d   dv rl||d   |vr|d	   }|d   |j                         v rt        j	                  |d          |d   t        v rXt
        r|d   t
        vrjt        |d
d      |d<   n|}t        |||dz         }|d   dv r|d   s|j                  d      sd|vr|d   j                  dd      dk(  rt        j	                  |       |d   dk(  r|d   t        |d   <   |j	                  |       	 |S c c}}w )Nr.  rk  r  r-  rT  r/  r  rq   r3  z
      Tas_interfacesaved_interfacer   ri  r  r  r  r   r
   pythonmoduler  )rR  rE  rt  r#   r'  r$   crack2fortrangenrn  r~  r   r   r   )	r/  r3  r_  keyr  maybe_privater-  rf  as_s	            r)   rs  rs    s      ---/CU"heJ6G&G 	U
M  D6] !.W:33AfIT$9iyM..00  6+yI%QvYi7#3>$6A  Ca#*-W:<<y!7!*W:c2&.8q!zX%+,V9ai(KKN;< KKs   Ec                 <   t        |        t        }i }d| v r| d   )d }t        dkD  rt        dt	        | d         z         ||fS t        | d   j                               D ]5  }| d   |   j                  d      dvr| d   |   ||<   (| d   |   d   ||<   7 ||fS )Nr   r   z6buildimplicitrules: no implicit rules for routine %s.
rq   r4   )rJ   rH  )rR  defaultimplicitrulesr   r2   r   rs  rt  r~  )r/  implicitrules	attrrulesr{  s       r)   buildimplicitrulesr    s    (MIU$ M{MPTUZ[aUbPcce )## %
+0023 D$Q'++J7?VV',Z'8';M!$#(#4Q#7
#CIaL	D
 )##r(   c                 j    t        | ||      }t        |      t        t        fv r|S t	        d|z        )z2 Like `eval` but returns only integers and floats zr=%r)r  rh   r8   r:   r   )r  rb  r   r   s       r)   myevalr    s3    Q1AAw3,
Vq\
""r(   z\A\b\w+\b\Zc                    	 t        t        | i i             }d|dfS # t        $ r Y nw xY wt        j	                  |       rdd| fS t        |       }|D ]  }t        |      |kD  rt        j                  d|z   dz   |       r0t        j                  d|z   dz   t        j                        }|j	                  |       }|sn	 |j	                  |       }|r<|j                  d      d	dd
|j                  d      }|j	                  |      }|r<t        i i       }	|j	                  |       }|r<|j                  d      d	dd
|j                  d      }|j	                  |      }|r<t        |i i       |	z
  }
|j	                  |       }|r<|j                  d      d	dd
|j                  d      }|j	                  |      }|r<t        |i i       }|j	                  |       }|r<|j                  d      d	dd
|j                  d      }|j	                  |      }|r<t        |i i       }|
dz  |	z   |k(  r|
dz  |	z   |k(  r|
|	|fc S  y# t        $ r Y  yw xY w y)a  
    Obtain ``a`` and ``b`` when ``e == "a*x+b"``, where ``x`` is a symbol in
    xset.

    >>> getlincoef('2*x + 1', {'x'})
    (2, 1, 'x')
    >>> getlincoef('3*x + x*2 + 2 + 1', {'x'})
    (5, 3, 'x')
    >>> getlincoef('0', {'x'})
    (0, 0, None)
    >>> getlincoef('0*x', {'x'})
    (0, 0, 'x')
    >>> getlincoef('x*x', {'x'})
    (None, None, None)

    This can be tricked by sufficiently complex expressions

    >>> getlincoef('(x - 0.5)*(x - 1.5)*(x - 1)*x + 2*x + 3', {'x'})
    (2.0, 3.0, 'x')
    r   Nr   z\w\s*\([^)]*\b\b(?P<before>.*?)\b\b(?P<after>.*)r  r4  r5  r  g      ?g      ?)NNN)r8   r  r   getlincoef_re_1r   rX   r   r  r   r   r   )r  xsetr   len_er  r]  r   r^  eerf  r)  c2s               r)   
getlincoefr  	  sl   *q"b!"!Tz Q!QwFE 'q6E>99&*U2A6zz.25GGNJJqMZZ]*Arxx/@BBBB  2r2&ZZ]*Arxx/@BBBB  2r2&*ZZ]*C'1BDBBB  2r2&ZZ]*C'1BDBBB  BB'GaK1$S1):a7N   K'P s:    	))AIAI-AIAI('I	I! I!z\b[a-z][\w$]*\bc                    | |v r||    j                  dg       }d||    v rOt        ||          sAt        j                  ||    d         D ]#  }||vs||v s|| k7  s|j	                  |       % |d d  D ]>  }|j                  |g       xs t        |||      D ]  }||vs|j	                  |        @ nt        dt        |       z         g }||| <   |S )Nrr  rn  z,_get_depend_dict: no dependence info for %s
)r~  isstringword_patternr  r'  _get_depend_dictr2   r   )rq   r.  depswordswordr  s         r)   r  r  N	  s    t|T
x,$t*Xd4j%9$,,T$Z_= ' u$$$,LL&	'
 !H 	$DXXdB' :'dD9$E>LLO$	$ 	?4:NODJLr(   c                 d    t        | j                               }i }|D ]  }t        || |        |S r,   )rs  rt  r  )r.  ru   depend_dictr   s       r)   _calc_depend_dictr  d	  s8    EK /D+./r(   c                 v   t        |       }g }t        |j                               D ]  }||   r	|j                  |       ||=  |rTt        |j	                               D ]5  \  }}|D cg c]	  }||v s| }}|s|j                  |       ||= 1|||<   7 |rT|D cg c]	  }|| v s| c}S c c}w c c}w r,   )r  rs  rt  r'  rE  )r.  r  ru   rq   lstr   new_lsts          r)   get_sorted_namesr  l	  s    #D)KE[%%'( "4 LLD!" k//12 	,ID#"%:Qk)9q:G:T"%$+D!	,  #3TddlD33 ; 4s   +	B15B1 	B6*B6c                     | d   dv r| dd } t         j                  |       ryt        j                  |       ryd| z   dz   S )	Nr   '"r   r         zkind(r5  )r  r   real8pattern)rc   s    r)   
_kind_funcr  ~	  sK    ayE"6"			F	#Vc!!r(   c                 P    d| z  }|dk  ry|dk  ry|dk  ry|dk  ry	|dd
z  k  ryy)Nr      r   i   r0  l        r  l            r        r   r'   )r   r   s     r)   _selected_int_kind_funcr  	  sD    
aAF{G|G|G|AH}r(   c                     | dk  ry| dk  ryt        j                         j                         }|j                  d      r| dk  ryy	| dk  ry| dk  ryy	)
N   r  r  r  )
aarch64alphaarm64	loongarchmipspowerppcriscvs390xsparc!      r   r   )platformmachiner   r   )pr   radixr  s       r)   _selected_real_kind_funcr  	  sf     	1u2v &&(Gwx7 	 r6"Wr(   c           	      B   t        j                   |      }t        j                   |      }dt        fdt        fdt        ffD ]  \  }}||vs|||<    g }t	        |       D ]&  }d| |   v sd| |   d   v s|j                  |       ( t        j                  dt        j                        }t        j                  dt        j                        }	t        j                  dt        j                        }
|D ]  }d	| |   v r| |   d	   }t        | |         r&|j                         }d
D ]  } |j                  | } |j                  d|      }|	j                  d|      }d}d| |   v rAd| |   d   v r7t        |      }|j                  d| |   d   d   z   d      }t        |      |k  }|ss|
j                  |      sb|j                  d      }t        |      dkD  rCdj!                  |d d       j                         j                  |d   j                         d      }t#        | |         rt%        |      }t&        j)                  |      D ]i  }t%        ||j+                         |j-                          j                         j                  dd            ||j+                         |j-                          k dj!                  |      }nt/        | |         rt1        d| d       | |   d   D cg c]2  }|j3                  d      r|j5                  d      j7                         4 c}xs d gd   }t&        j9                  |      rd}nt:        j9                  |      rd}	 t=        ||||      ||<   tA        | |         r$tC        ||   tD              rtG        ||         ||<   |j                         }||k7  s||   ||<   tI        | |          t1        d|d        |S c c}w # t>        $ r!}|||<   t1        d| d|d       Y d }~d }~ww xY w) NrC  selected_int_kindselected_real_kindrk  r  z \bkind\s*\(\s*(?P<value>.*)\s*\)z-\bselected_int_kind\s*\(\s*(?P<value>.*)\s*\)z4\bselected_(int|real)_kind\s*\(\s*(?P<value>.*)\s*\)rn  ))z.false.False)z.true.Truez
kind("\1")zselected_int_kind(\1)Frl  r   r
   r   r   r!  r  zAget_parameters[TODO]: implement evaluation of complex expression r   r  r   r  r  )dimspeczget_parameters: got "" on zget_parameters:parameter z does not have value?!
)%r  r  r  r  r  r'  r   r   r   	islogicalr   r   subrX   r   r&  r   isdoublers  r  r  r  r   	iscomplexr2   r   removeprefixr   r  r  
param_evalr   r  r  r8   r  r  )r.  global_paramsr  g_paramsrq   funcparam_namesr   kind_reselected_int_kind_reselected_kind_rer  replis_replaced
orig_v_lenv_r  r   r5  r  r   nls                         r)   r  r  	  s0   YY}%Fyy'H
++-DE,.FGK "
d x!HTN	"
 Kd# "a [DGJ4G%Gq!" jj<bddCG::8"$$@zz?G PO$q'>QAa!GGI )D
 "		4(A) M1-A$(()A1EA  Ka( T!W^44!$QJ		#Q(?(G"GLA #&a&:"5K'--a0B2w{GGBsG,224<<RV\\^RP Q !W&//2 HA,0!'')AEEG,224<<S#F-HBqwwy)H GGBK47# FFGSL M "&a!45,,{3 {399; 5 ?9=CG ##A&$$Q'C&q(FGLq	
 Q Zq	3%?q	Nq	BQw#AYr
$q'N/u4LMNaPOb M15  Cq	/uE!bABBCs   67O/(O44	P=PPc                 $    | dv ryt        | |      S )N)z(:)(*)r   r  )_eval_scalar)lengthr  s     r)   _eval_lengthr  
  s    $$''r(   z\d+_c                 X   t        |       r| j                  d      d   } 	 t        | i |      }  t        | t              rt
        nt        |       } | S # t        t        t        f$ r | cY S t        $ r7}t        d|d| dt        |j                               d       Y d }~| S d }~ww xY w)Nr   r   r$  z" in evaluating z (available names: r   )_is_kind_numberr&  r  r  r   r   r  r  r  r   ro   rs  rt  )r  r  r   s      r)   r  r  
  s    uC #	5UB'8E3/S%@ L {I.  5tFKKM24 	5 	5 L	5s   /A B)*B)2,B$$B)c                 P   ?@A t        |        t        |       \  }}t        j                  | d         A| d   dk(  r| d   Avri A| d   <   d| d   v riAd= d| d   d   v r\| d   d   d   }t        A      t        d | d   D              z  D ]-  }d	D ]&  }||v st	        Aj                  |i       |      A|<   ( / g }| d
   }|D ]  }	 A|    |j                  |        t        Aj                               D ]  }||vs|j                  |        t        At        |             }	i }
t        j                  d      j                  }t        Aj                               D ]4  } ||      }|s||j                         |j!                          }	 |
|    6 |D 
]B  }|d   t        |j                               v rt	        A|   ||d            A|<   dA|   vrdA|   v r
dA|   d   v s|r|d   j%                         }t        ||   j                               D ]N  }|dk(  r||   |   dk(  r|A|   vr||   |   A|   |<   *|dk(  s0||   |   D ]  }t	        A|   |      A|<    P n%|| d
   v rt'        dt)        |      d| d   d       dA|   v r7dA|   d   v r-A|   d   d   }	 t+        t-        |i |	            }|A|   d   d<   dA|   v r7dA|   d   v r-A|   d   d   }	 t+        t-        |i |	            }|A|   d   d<   i }dA|   v rA|   d   }|j1                          g A|   d<   d\  }}}}}|D ]m  }|dd dk(  r|dd j3                         dd }n|dd dk(  r|dd j3                         dd }no|dd d k(  r|dd j3                         dd }nP|dd! d"k(  r|d!d j3                         dd }n1|dd# d$k(  r|d#d j3                         dd }nt	        A|   |      A|<   |rdA|   vrg A|   d<   t5        |      j7                  d%      D cg c]  }|j3                          c}D ]6  }|j9                  d&d      }|A|   d   vs A|   d   j                  |       8 d}|rN|j9                  d'd(      }|j9                  d)d*      }d$A|   vr
|gA|   d$<   nA|   d$   j                  |       d}|wd A|   vrg A|   d <   t;        t5        |      j7                  d%      D cg c]  }|j3                          c}      D ]$  }|A|   d    vsA|   d    j                  |       & d}| d"A|   vrg A|   d"<   t5        |      j7                  d%      D cg c]  }|j3                          c}D ]$  }|A|   d"   vsA|   d"   j                  |       & d}p |rdA|   vrg A|   d<   t;        t5        |      j7                  d%      D cg c]  }|j3                          c}      D ]  }	 t=        ||	      }|d,k(  rd,nd-}||k(  r|g}nt5        |d,      j7                  d.      }tC        |      d/k(  r	d-|v rd-g}d-}tC        |      dk(  r|d   |k7  rd0|d   g}tC        |      d/k(  rtE        tF        jH                  jJ                  |      \  }}||z
  dz   }|jM                  tF        jN                  jP                  1      }i } | d   D ]  }tG        jR                  |      }!|jU                  |!      s*	 |jW                  |!      \  }}"||"fd2}#t        |jY                               }$|$j[                  |"jY                                t        Afd3|$D              }&|#t        |&      f| |<    | ||<   A|   d   j                  |        d"A|   vr\d
| v rW|| d
   v rOA|   j                  d g       }'g }( t_        t`        tb        td              A|         })tg        A|         rnti        A|   d         D ]X  \  }*}|j                  |      ??ni|)rf?jk                         D ]R  \  }\  }+},?@fd4@t               }- @||-       ||'v sd5A|   v sd A|   v r6|+||-vr|d6}. |+tG        jR                  d7| d8|* d9            }/|/jM                  tF        jN                  jP                  1      }/|/A|   d5<   |g|,z   A|   d <   d"A|   vrpd7| d8|* d:| gA|   d"<   n]d;}.dA|   vrg A|   d<   d<A|   d   vrA|   d   j                  d<       |'j                  |       |(j                  d7| d8|* d:|        A|   j                  dg       }0d=|0v sd>|0v s|0j                  |.rd>nd=       |0sK|0A|   d<   U ??jk                         D ]  \  }\  }+},A|   j                  d g       }&A|   j                  dg       D ]V  }1|1jm                  d       sdjo                  |1j7                               }1|&jq                  |1d?d j7                  d@             X |&rt        t        |&            A|   d <   ||&vs|'j                  |        [ nsts        A|         redA|   v r^d-A|   d   v r!tu        A|   d   d-   |	      }2|2A|   d   d-<   n3dA|   d   v r)tu        A|   d   d   |	      }2A|   d   d= |2A|   d   d-<   |(r|(A|   d"<   |'rt        t        |'            A|   d <   d5A|   v s	}dA|   vrg A|   d<   d=A|   d   vr!d>A|   d   vrA|   d   j                  d=       d A|   vr]g A|   d <   t        |
jk                               D ]+  \  }} |A|   d5         sA|   d    j                  |       - A|   d    sA|   d = tw        A|         s
+ty        A|   d5   |	      A|   d5<   
E t        Aj                               D ]r  }|| d   k(  sd$A|   v rA|   d$   | d$<   | d   dk(  s(dA| v r| dA   Av rt{        A|   A| dA            A|<   dB| v sP| dB   }3|3j9                  dCd      }4|3|4k(   }5|4j9                  dDd      }3|3|4k(   }6t|        d   j                  |3      }|rt        |j                  dE      |j                  dF            \  }7}8}}9t        |7|8      \  }:};}<|7A|   d<   	 | dA   r|7A| dA      d<   |:r d|:v r	 t-        |:d   i |	      |:d<   |:A|   d<   |;r|;A|   d<   |<r|<A|   dG<   |5rt	        A|   dC      A|<   |6sEt	        A|   dD      A|<   Yt'        dHt)        | dB         z         u | d   dIvrdJ| v rt        j                  | d
   | dJ   z         }=nt        j                  | d
         }=t        Aj                               D ]1  } t_        t        t              A|         s!|=j                  |       3 dK| v ro|=jq                  t        | dK   j                                      t        | dK   j                               D ]%  }| dK   |   D ]  }||=vs|=j                  |        ' | d   dk(  r-dA| v r|=j                  | dA          n|=j                  | d          | d   dLv r| d   }>|>Av rdA|>   v rA|>   d   | d<   | d   dMk(  r(|=jq                  t        Aj                                      t        Aj                               D ]
  }||=vsA|=  AS # t        $ r Y kw xY w# t        $ r8 t        j                  d|z  t        j"                        j                  |
|<   Y w xY w# t.        $ r Y w xY w# t.        $ r Y w xY wc c}w c c}w c c}w c c}w # t>        t@        t        f$ r t'        d+|d*       Y 	w xY w# t\        $ r&}%d}#t        |jY                               }$Y d}%~%d}%~%ww xY w# t.        $ r Y !w xY w# t.        $ r Y w xY w)NzH
    Sets correct dimension information for each variable/parameter
    r.  r/  r   rq   r
   rk  c              3   &   K   | ]	  }|d      yw)rq   Nr'   )r  rf  s     r)   r  zanalyzevars.<locals>.<genexpr>:
  s     $F1QvY$Fs   r-  r  r3  z[A-Za-z][\w$]*z.*\b%s\br   r4   r  	undefinedz"analyzevars: typespec of variable z is not defined in routine z.
rm  rX   rl  rC  )NNNNNNr2  r  r   r   r   r
  rr  r   rq  r  rp  r#  r   z\n\nz

z\n r   z4analyzevars: could not parse dimension for variable r  r   z@:@r0  1)languagec                     | |z
  |z  S r,   r'   )r5  r)  rf  s      r)   solve_vzanalyzevars.<locals>.solve_v
  s    01A{(:r(   c              3   R   K   | ]  }|j                   v r|j                      y wr,   )r  )r  r5  r.  s     r)   r  zanalyzevars.<locals>.<genexpr>
  s(      -7/0'(vv~ %&FF-7s   $'c                 |    j                  | d g g      d   D ]!  }||vs|j                  |        ||       # y )Nr   )r~  add)r  r  v1coeffs_and_depscompute_depss      r)   r  z!analyzevars.<locals>.compute_deps  sD    *9*=*=a$*LQ*O !?B')~(,(4R(>!?r(   rn  Fzshape(r  r5  z) == Tinr  r  r  r$  r   r  pure	recursiver6  r  ro  z'analyzevars: prefix (%s) were not used
)r  r  r  r  r  r  )r   r   rh   )DrR  r  r  r  ru  r~  r'  KeyErrorrs  rt  r  r]  r   r   r   r  r   r   r   r2   r   r   r  r   reverser   r%  r&  r   rw   param_parser   r  rX   r  r   ExprparsetostringLanguager   	as_symbolr  linear_solvesymbolsrV  RuntimeErrorl_orisintent_inisintent_inoutisintent_inplaceisarrayr  rE  r   r   r  r  r  isscalarr  r|  rL  r  r   r  isintent_callbackisintent_aux)Br/  r  r  genr   r{  svarsr3  r)  r  dep_matches
name_matchr  r   ln0r   dimension_exprsr  dimr
  rr  rq  rp  r  r   tmpr!  dim_charr   r;  d2dsizesolver_and_depsr5  rf  r  all_symbolsr   v_depsn_depsn_checks
n_is_inputr  solverr  all_depsis_requiredr.  v_attraar  prpr1ispureisrecr4   r  r  r  r  ro  
neededvarsrq   r  r  r.  sB                                                                  @@@r)   rq  rq  *
  s    1%8M999U6]#DW~#fT(A U6]	U6]Hvr**-#J/CY$Ff$F!FF B. BACx"-dhhq"oq"AQBB E=D 	GLLO $))+ D=LLO D"3E":;F K-.44J$))+ KqM!'')AEEG$AKAK  MBQ44	())!$q'9QqT?;DGT!W$a(Z47:;N-N A$**,C!-"4"9"9";< B
?}S/A!/D/S$DG+)6s);A)>DGAJ*_%23%7%: B*5d1gq*AQBB %-'Qv0 1T!W$Q//GN+E2DB/0A 23Q'.T!W$a00GN+F3DB/0A 34Q'/a 7:&DLLN"$DGJ/K,C +!Ra5K'QR5;;=!B/CrUh&ekkmQr2FrUh&ekkmQr2FrUg%qrU[[]Ab1ErUf_abEKKM1R0D)$q'15DGtAw.,.Q)1?1G1M1Me1TUAaggiU :iiR0d1gh&77 GH-44S9	:
 "F<<&9D<<5DT!W,+/&QQ..t4D%tAw.,.Q)&>&;Q;W;WX];^'_a	'_` 8DGH$55 GH-44Q78 "F$d1g-+-Q(1?1F1L1LU1STAaggiT 7DGG$44 GG,33A67 !EW+!X {$q'1')Q$",:3,?,E,Ee,LMqM ?3A
 (62 '(3hsCHH}&Z+As399%@2w!|r	!U2w!|1(9!2a5\2w!|!$X]]%8%8"!=B "R!!NNH4E4E4G4GNH +-!&v KA ( 2 21 5A$~~a0!G+0+=+=a+@DAq56! %; 36aiik2BK$/$6$6qyy{$C *- -74?-7 *7 6=d6l5J 2-K: .=*GK(//2?3B $q'!fo!uV}:L
 !W[[2.FH0k>.004Q9JtAw%d1gk&:; K1DAq&5&9&9!&<O&.# 2A1F1F1H 6=-A~?
 (+uH(H5 !V$'47N$,Q$7
 !)%1ax6G /4'-h.@.@&,QCr!A$6/8 (9'+}}-5->->-@-@ (5 (B/3Q 67C$JQ 1#*$q'#9 +12aSaS(A8CDGG$4 /3#+47#:8:DGH$5#'tAwx/@#@$(GH$5$<$<T$B &a 0 (&,QCr!E!$=!?%)!W[[R%@F$.&$8'1V'; &2=J:!O%6<Q
 3m6=n '21@1F1F1H 	1-A~%)!W[[2%>F&*1gkk*b&A G#%==#:)+)<B$*MM"Qr(..2E$FG  &48V4EQ 1  &a 0	1EK1X $q'"!T!W,d1gn55!-d1gn.Ec.J.4"67=Q/4$q'."99!-d1gn.Ee.L.4"6 GN3E:7=Q/4#+Q $(V$5Q!$q'>a(&(Q
#$q'*"55$q'*"55Q
#**:6tAw&$&Q! !2!2!45 4DAqaQ)0034 Awx(Q)Q +DGCL&AQ[MB^ $))+ +`fa  $QfW~+u$xD)@(a$uX2GHDGu$xB**VR0C"$)mF["5B!#s]E$Q--b1A:HGGFOQWWW-=;?7(D%;H$h<08
J.6Q
+!$XDLU8_ 5j A &%3!)9=(26(:B:HJv$6 7ADGN3%6@DGN3#2:DGJ/!&1$q'6&BDG &1$q';&GDGFeT\oI^^`U+`X W~VV5 5=53F#FGJ5=1Jdiik" 	%A4t%|4T!W=!!!$	% ed5>#6#6#89:%.--/0 -w* -A
*"))!,-- >Z'5 !!%/2!!%-0>77=Dt|DJ 6"&t*X"6h>V#d499;/0diik" 	A
"G	 KU  		"  K!#K1,=rtt!D!J!JAK2 !  ! 4 V" (` U N '
H= (()uB0F (4 !G /3G25emmo2FK!GD  ) ! ! (1 !)$(!)s   	|$|44}82~%~<~2~",~'
~,A#A@:A@$	|10|14=}54}58	~~	~~,#	A@	A@ 	@ A@	@	A@@A@@	A@%@$A@%z\A[a-z]+[\w$]*\Zc           	      v   |	 t        | ||      }|S t        |      dk  s|ddt        |      dz
     dk7  rt	        d| d	      |dd
 j                  d      }t        |      dk(  r|d   j                  d      }t        |      dk(  r(t        |d   |      }t        dt        |      dz         }nOt        |d   |      }t        |d   |      }	t        t        |      t        |	      dz         }nt	        d| d      | j                  d      r| dd n| j                  d      } g }
| D ]!  }	 t        |||      }|
j                  |       # t        t        ||
            }|S # t        $ r}| }t        d| d| d       Y d}~|S d}~ww xY w# t        $ r}t        d| d|d       Y d}~ud}~ww xY w)a  
    Creates a dictionary of indices and values for each parameter in a
    parameter array to be evaluated later.

    WARNING: It is not possible to initialize multidimensional array
    parameters e.g. dimension(-3:1, 4, 3:5) at this point. This is because in
    Fortran initialization through array constructor requires the RESHAPE
    intrinsic function. Since the right-hand side of the parameter declaration
    is not executed in f2py, but rather at the compiled c/fortran extension,
    later, it is not possible to execute a reshape of a parameter array.
    One issue remains: if the user wants to access the array parameter from
    python, we should either
    1) allow them to access the parameter array using python standard indexing
       (which is often incompatible with the original fortran indexing)
    2) allow the parameter array to be accessed in python as a dictionary with
       fortran indices as keys
    We are choosing 2 for now.
    Nzparam_eval: got "r  r   r0  r   re  zparam_eval: dimension z can't be parsedr   r$  r   r  z.param_eval: multidimensional array parameters z not supportedz(/r   )r  r   r2   rX   r   r&  r  r   r8   r   r'  r  zip)r  r  r  r  r  r   dimrangeboundlbounduboundv_evalitems               r)   r  r    s   & 	;Q&)A  7|a7#3S\!^#34<1':KLMMq}""3'H
8}A;$$S)x=AV4EQE
1-H !f5F !f5FS[#f+a-8HI#9N4 5 	5 LL&1RA44S9AF 	>h/D 	d 	S6"#AHK  	;A'uE!b9::	;>  	>'uE$<==	>s/   E( 1F(	F1FF	F8F33F8c                    d| v r`| d| j                  d       }| | j                  d      dz   | j                  d       }t        t        ||            }t	        ||   |         S | |v rt	        ||          S |D ]  }t        j                  d|z   dz   t
        j                        }|j                  |       }|sA|j                  d      t	        ||         z   |j                  d      z   } |j                  |       }|rF | S )	a  Recursively parse array dimensions.

    Parses the declaration of an array variable or parameter
    `dimension` keyword, and is called recursively if the
    dimension for this array is a previously defined parameter
    (found in `params`).

    Parameters
    ----------
    d : str
        Fortran expression describing the dimension of an array.
    params : dict
        Previously parsed parameters declared in the Fortran source file.

    Returns
    -------
    out : str
        Parsed dimension expression.

    Examples
    --------

    * If the line being analyzed is

      `integer, parameter, dimension(2) :: pa = (/ 3, 5 /)`

      then `d = 2` and we return immediately, with

    >>> d = '2'
    >>> param_parse(d, params)
    2

    * If the line being analyzed is

      `integer, parameter, dimension(pa) :: pb = (/1, 2, 3/)`

      then `d = 'pa'`; since `pa` is a previously parsed parameter,
      and `pa = 3`, we call `param_parse` recursively, to obtain

    >>> d = 'pa'
    >>> params = {'pa': 3}
    >>> param_parse(d, params)
    3

    * If the line being analyzed is

      `integer, parameter, dimension(pa(1)) :: pb = (/1, 2, 3/)`

      then `d = 'pa(1)'`; since `pa` is a previously parsed parameter,
      and `pa(1) = 3`, we call `param_parse` recursively, to obtain

    >>> d = 'pa(1)'
    >>> params = dict(pa={1: 3, 2: 5})
    >>> param_parse(d, params)
    3
    r4  Nr   r5  r  r  r  r  )
r  rfindr8   r  r   r   r   r   r   r   )r!  r  dnameddimsr[   r  r]  r   s           r)   r  r    s   r ax,166#;!&&+a-- Kv./6%='((	
f6!9~ 	"A::$q(+==rttD 

1AGGH%q	N#%&WWW%56JJqM 	" r(   c                    | }t         j                  |        }|rt        |      \  }}t        | |d   |      }d}| D ]<  }	|	j	                         }	|	t
        j                  t
        j                  z   vrd}	||	z   }> |d   dk(  r|dz   }n|dz   }|} | |d   v s| |d   v r| dz   } | |d   v r| |d   v r| |v r6d	}
| t        |
      z   |v r|
d	z   }
| t        |
      z   |v r| t        |
      z   } |r
|d   | <   | S | |d   vr||d   v r|d   |   |d   | <   ni |d   | <   d
|v r%||d
   |d   z   v rt        |d   |    d      |d   | <   | S )Nr.  e_r   r   r  _er3  r   r   r1  r2  r  )
analyzeargs_re_1r   r  r  r   rc   ascii_lowercasedigitsr   ru  )r)  r/  r3  orig_a	a_is_exprr  r  atnar   r{  s              r)   	expr2namerA  B  s   F$**1--I#5e#< yq%-? 	A	A..>>aB		
 b6S=cBdB5= Av$6CA 5= Av$6Dy#a&jD AA #a&jD AJfa H E&M!v&#(=#8fa #%fa %FeK.@5CV.V$V*5=+;ZHE&M!Hr(   c                    t        |        t        |       \  }}d| vrg | d<   g }| d   D ]   }t        || |      }|j                  |       " || d<   d| v r;t	        | d   j                               D ]  \  }}|D ]  }|| d   vsi | d   |<     | d   D ]5  }|d   |v sd| vrg | d<   |d   | d   vs| d   j                  |d          7 d| v r| d   | d   vri | d   | d   <   | S )Nr3  r  r.  r-  rq   r1  r   )rR  r  rA  r'  rs  rE  )r/  r  r   r3  r)  r{  args1rf  s           r)   ro  ro  g  sG   )%0M1UfD6] a%A E&M%U7^1134 	*HAu *E&M)')E&M!$*	*
 6] 5V9%'%'k"yk 22k"))!F)45 5U8_E&MA)+feHo&Lr(   z\A\(.+?,.+?\)\Zz\A[+-]?\d+(_(?P<name>\w+)|)\Zz*\A[+-]?[\d.]+[-\d+de.]*(_(?P<name>\w+)|)\Zz
\A\(.*\)\Zz\A(?P<name>\w+)\s*\(.*?\)\s*\Zc                     t        | t              rddiS t        | t              rddiS t        | t              rddiS t        | t              r| S t        t        |             )Nr4   r7   r5   r  )r  r8   r:   r  r  AssertionErrorr   )r   s    r)   _ensure_exprdictrF    s_    !SI&&!UF##!WI&&!T
a
!!r(   c                    | |v rt        ||          S | j                         } t        j                  |       rddiS t        j                  |       }|r>d|j                         v r(|j                  d      rt        dt        |       z         ddiS t        j                  |       }|r>d|j                         v r(|j                  d      rt        dt        |       z         ddiS dD ][  }t        | |      j                  d	|z   d	z         D cg c]  }|j                          c}D ]  }||v st        ||         c c S  ] i }t        j                  |       rt        | d
d ||      }ngt        j                  |       }|rP|j                  d      }t        |j                  d      ||      }|rd|v r|d= |s|d   |v rt        ||d            S | d   dv rdddidS |st        dt        |       z         |S c c}w )Nr4   r  rq   z:determineexprtype: selected kind types not supported (%s)
r7   r5   )+r  r   r  r,  rf  r   r   rk  r   r  r  r   )r4   rm  z>determineexprtype: could not determine expressions (%s) type.
)rF  r   determineexprtype_re_1r   determineexprtype_re_2r  r   r2   r   determineexprtype_re_3r%  r&  determineexprtype_re_4r  determineexprtype_re_5)	r  r.  rulesr   opr  r  r  rns	            r)   r  r    s
   t|T
++::<D##D)I&&$$T*AQ[[]"qwwvMPTUYPZZ\I&&$$T*AQ[[]"qwwvMPTUYPZZ\F##" 1%3D%C%I%I#PR(UX.%YZ!'')Z 	1ADy'Q00	11 	A##D)d1Rj$6"((.B!!''&/4?AZ1_jMa5E>+E"Q%L99Aw%'#sDDMQUVZQ[\	^H+ [s   G>r   c                 2   t        |        d}t        | t              rA| D ]:  }|r%|d   dv r|d   t        v rt        r|d   t        vr*|t        |||      z   }< |S d}d}d}| d   }|dk(  ryg }	d| v r| d   }d| v rZ| d   }
| d   D ]/  }t        || |	      }t        |
|         r|	j                  |       1 | d   d	k(  s|	rd
dj                  |	      z  }d}d| v r9t        | d   j                               D ]  }||t        z   |d| d   |   } | j                  dg       d d  }|d	k(  rd|v r|j                  d       |r"||t        z   ddj                  |      d|}d}d| v rt        | d   |t        z         }d}d| v rt        | d   |t        z         }|dk(  rd}d}d| v r#d| d   z  }| d   |	vr|	j                  | d          t        | d   |t        z   |      }t!        | | d   |	|t        z   |      }
d}d| v r
|sd| d   z  }d| v rNd}t        | d   j#                               D ](  \  }}||t        z   d|ddj                  |      d}* ||z   }|dk(  r|dk(  rd}|||d|||d||||
|||d |d|}|S )!Nr
   r/  r  rq   r  r  r3  r.  r   z(%s)r$  r  r   r
  callbackintent(z) r  r  r  r   z result (%s)r-  r  z! in %sr  zentry r4  r5  r  r  zend )rR  r  rs  r#   r$   r  rA  r  r'  r   rt  r   r~  r  use2fortrancommon2fortranvars2fortranrE  )r/  r_  r  rc  rb  r  rq   r3  	blocktypeargslr.  r)  r  r{  
intent_lstr  r  r   r-  messentry_stmtsr  s                         r)   r  r    s>    
C% 	LAQwZ#==V9	)6)!;(ClKKC	L 
FDDgIIEV}V}v 	 A!UE*A$T!W-Q	  >Z'5CHHUO+DU"e./4467 	RA #-E:L4Ma4P R	R 8R(+JJ:#;*%,cGmHHZ0$8 C~%,g6F5hw?""F5%/1?%'LLx)E&M3=|TDuV}eS7]ODD|5=(%w--/0 	IDAq(#-CHHQKIK	I k!L T^%;VYdFD:JCQUW]_cehjsuy{CJr(   c           
          d}t        | j                               D ]A  }|dk(  r||ddj                  | |         }$||d|ddj                  | |         }C |S )Nr
   r  zcommon r$  zcommon /z/ )rs  rt  r   )r  r_  rc  r{  s       r)   rU  rU    se    
C&++-  L=%(#sxxq	/BCC*-sAsxxq	7JKC	L
 Jr(   c                    d}t        | j                               D ]  }||d|d}| |   i k(  r|r|d   dk(  r|d d }%d| |   v r| |   d   rd|z  }d| |   v r]| |   d   rUd}t        | |   d   j                               D ]1  }|| |   d   |   k(  r|||}d}|||d	| |   d   |   }d}3 |s|d   dk(  s|d d } |S )
Nr
   zuse r$  r   r  z%s only:r  r   z=>rJ  )r  r_  rc  r   r   r{  s         r)   rT  rT    s   
C#((* "C+q6R<s2w#~#2hSVAv$CCF?s1ve}A#a&-,,./ Aua((&)1a0CA*-q!SVE]15EFCA 3r7c>cr(C%& Jr(   c                     | d   }g }|D ]-  }	 t               d|z     } ||       s|j                  |       / |S # t        $ r Y =w xY w)Nr
  zisintent_%s)globalsr'  r  )rd  r  rc  r
  rc  s        r)   true_intent_listr`  /  se    
h-C
C #	#	-&01A v

6"# J  		s   <	AAc           	         t        |        d}g }|D ]  }|| d   v s|j                  |        d| v r3| d   D ]+  }||v r||vs|j                  |       t        d|z         - d| v r|j                  | d          |s4t	        |j                               D ]  }||vs|j                  |        |D ]-  }d||   v r7||   d   D ],  }||v sd||   v s|||   d   v st        d|d|d	       . d
| v rn|| d
   v rgt        ||         r	||d|}||d|}t        ||         r	||d|}||v rd||   vrd}	| d   D ]  }
||
d   k(  s|
d   dk(  sd}	 n |	r||vrt        |       t        d|z         || d   k(  r| d   dk7  s| j                  d      rd||   vr>d||   v rd||   d   v r||v r	||d|}t        ||          t        d|z         9||   d   }|dk(  rd||   v r|d||   d   d}i }d||   v r	||   d   }nd||   v r||   d   }d |v r|d    d!v r|d"|d    d}n>|d |d    }n3d#|v r |d$|d#   }d%|v r|d&|d%   d}nd'|z  }nd%|v r|d(|d%   d}d)}d||   v rN||   d   D cg c]  }|d*vr|
 }}|rd+|v rd,|v r|j                  d,       |r|d-d.j                  |      }d.}d/||   v r!||d0d.j                  ||   d/         d}d.}d1||   v r+t        ||         }|r||d2d.j                  |      d}d.}d3||   v r!||d4d.j                  ||   d3         d}d.}d||   v r!||d5d.j                  ||   d         d}d.}d6||   v rF||   d6   }||   d   d7v r)	 t        |      }d|j                  d.|j                   d}|d8|d6|}n|d8|}|||}0 |S c c}w # t"        $ r Y /w xY w)9Nr
   r.  r  z7vars2fortran: Confused?!: "%s" is not defined in vars.
r  rr  z;vars2fortran: Warning: cross-dependence between variables "z" and "r  r1  zintent(callback) z	external z	optional r4   r   r-  rq   r/  r   r   z/vars2fortran: No definition for argument "%s".
r   rk  r  z-vars2fortran: No typespec for argument "%s".
rh   ro  r4  r5  rl  rm  r   )r   r  z*(rX   z(len=rC  z,kind=z%s)z(kind=r   )r  z
intent(in)zintent(out)r  r$  r  z
dimension(r
  rS  rq  zcheck(zdepend(rn  )r  r  z :: )rR  r'  ro   r  rs  rt  r  
isoptionalshowr2   r~  r  r   r`  r  r5   imagr   )r/  r.  r3  r_  r  rc  noutr)  r!  r   rf  vardefr  r   r   r  r  r  s                     r)   rV  rV  =  s<   
CD fKKN u|$ 	TADyD=KKNNQRRT	T UE*%&diik" 	A}A	  g,tAw!WX& n9T!W!4d1gh>O9Oghjklnn %A{);$; a)36Q?'*C3C$q'"+.Q7DyZtAw6D6] &	>ajJ&>D D=JFJKfW~+uyy/B
 T!W$T!W$tAwz7J)J9/2C;CaMDqHIa$V
d1g 5!'a)<=FT!W$Aw~.HtAw&Aw~.H(?}
*&,hsm<$*HSM: (.@X%.4hv6FGF"f-F8#*0(62BCa #Awz2 .!,  .D . 4$9N M*%+SXXd^<$q'!388DGK$89;FAtAw"47+C-3QFAd1g(.388DGG<L3MNFAtAw388DGH$568FA$q'>QAAwz"&CCQA%&VVQVV4A '-a3F#)1-FsF+Og,P JQ.D ! s   O*#(O//	O;:O;c                 4   t        dd       t        | t               t        dd       g at	        t
        d         }t        dd       t        D ](  }t        d|j                   dd       t        ||      }* t        dd       t        |      }t        |z   S )NzReading fortran codes...
r   zPost-processing...
z"Applying post-processing hooks...
z  r   zPost-processing (stage 2)...
)
r2   r   r9  r   rn  r   post_processing_hooks__name__traversera  )filespostlisthooks      r)   crackfortranrn    s     (!,E9%"A&K1&H115% ,"T]]O2&*Hd+, ,a0(#H!!r(   c                 D    t        |       dz   }d}dt        z  }||z   |z   S )Nr   zE!    -*- f90 -*-
! Note: the context of this file is case sensitive.
z
! This file was auto-generated with f2py (version:%s).
! See:
! https://web.archive.org/web/20140822061353/http://cens.ioc.ee/projects/f2py2e
)r  f2py_version)r/  pyfheaderfooters       r)   crack2fortranrt    s<     5
!D
(CF 	F
 C<&  r(   c                 x    t        | t              xr) t        |       dk(  xr t        | d   t        t        f      S )Nr0  r   )r  tuplerX   r8   r   )objs    r)   _is_visit_pairrx    s8    sE" /CA/3q6C:.0r(   c                    t        |       r1| d   dk(  r| S  || ||g|i |}|t        |      sJ |S | }| \  }} nd| f}d}t        | t              rFg }t        |       D ]5  \  }	}
t	        |	|
f|g|||gz   |d|\  }}|%|j                  |       7 nYt        | t              rGt               }| j                         D ])  \  }}
t	        ||
f|g|||gz   |d|\  }}|%|||<   + n| }||S ||fS )a  Traverse f2py data structure with the following visit function:

    def visit(item, parents, result, *args, **kwargs):
        """

        parents is a list of key-"f2py data structure" pairs from which
        items are taken from.

        result is a f2py data structure that is filled with the
        return value of the visit function.

        item is 2-tuple (index, value) if parents[-1][1] is a list
        item is 2-tuple (key, value) if parents[-1][1] is a dict

        The return value of visit must be None, or of the same kind as
        item, that is, if parents[-1] is a list, the return value must
        be 2-tuple (new_index, new_value), or if parents[-1] is a
        dict, the return value must be 2-tuple (new_key, new_value).

        If new_index or new_value is None, the return value of visit
        is ignored, that is, it will not be added to the result.

        If the return value is None, the content of obj will be
        traversed, otherwise not.
        """
    r   rT  N)parentsr   )rx  r  rs  r  rj  r'  r  rE  )rw  visitrz  r   r3  kwargs
new_resultparent
result_keyr[   r  	new_indexnew_itemr  new_key	new_values                   r)   rj  rj    s}   8 cq6^#J3A$A&A
!!*---
C
#t
%cN 	,LE5"*E5>5 #K;?#K3:fX3E28#KCI#KIx $!!(+	, 
C	V
))+ 	0JC!)3, "J:>"J29VH2D17"JBH"JGY "&/
7#	0 
z!!r(   c                    |d   \  }}| \  }}d }	|dv r|d   d   dk(  sJ |d   d   }
n|dk(  r|d	   d   dk(  sJ |d	   d   }
nd
}
d
}|
0|}|
j                         D ]  \  }}t        |      s |	||      } nV|dk(  rQ|d	   d   d   }
|}|
j                         D ]1  \  }}t        |      st        j                  d|z   dz   d|z   |      }3 |"||k7  rt	        d| d| d| d| d	d       ||fS y
)a  Previously, Fortran character was incorrectly treated as
    character*1. This hook fixes the usage of the corresponding
    variables in `check`, `dimension`, `=`, and `callstatement`
    expressions.

    The usage of `char*` in `callprotoargument` expression can be left
    unchanged because C `character` is C typedef of `char`, although,
    new implementations should use `character*` in the corresponding
    expressions.

    See https://github.com/numpy/numpy/pull/19388 for more information.

    r   c                 z    t        j                  d| z   dz   | |      }t        j                  d| z   dz   | |      }|S )Nz[*]\s*\br  z\b\s*[\[]\s*0\s*[\]])r   r  )varnamer  s     r)   	fix_usagez8character_backward_compatibility_hook.<locals>.fix_usage=  sB    {W,u4guEuw)@@'r(   )r  rq  r   r.  r   rn  r   Ncallstatementz
(?<![&])\br  r   zcharacter_bc_hook[r  z]: replaced `z` -> `z`
)rE  ischaracterr   r  r2   )r2  rz  r   r3  r|  
parent_keyparent_valuer  r  r  	vars_dictr  r  vds                 r)   %character_backward_compatibility_hookr  +  sv     'r{JJC ++r{1~'''BKN		r{1~'''BKN		I	$??, 	:KGR2%gy9		: 
	BKN6*		$??, 	OKGR2 FF!G+e3S7]IO			O 
 (AcU ;""'yk>?@BY r(   __main__r  z-quietz-verboser0  z-fixz?Use option -f90 before -fix if Fortran 90 code is in fix form.
z-skipemptyendsz--ignore-containsz-f77z-f90r   z-hz-showz-mr  zUnknown option %s
z	OSError: a    Warning: You have specified module name for non Fortran 77 code that
  should not need one (expect if you are scanning F90 code for non
  module blocks but then you should use flag -skipemptyends and also
  be sure that the files do not contain programs without program
  statement).
z Writing fortran code to file %s
r  )r   )r   )r$  )rO  r,   )r
   N)Nr
   )r
   )NN)r   r   )r   F)r
   F)__doc__r-   rc   r   r   r   r  r  r   pathlibr   r   ImportErrorr
   r   auxfuncsr   versionrp  r   r   r   r   r   r   r   r   r   r   r   r   r!   r   r   r    r   r;  r   r   r:  r%   r   r$   r&   r   r#   r"   r   r*   r2   	_MAXCACHEr  r   rn   rz   r   rr   rw   r{   r}   r   r   r  r   r   r   r   r   r   r   r   r   rc  r   beforethisafterfortrantypesrL  r  rI  rJ  groupbegins77r   groupbegins90r   	groupendsrG  endifsrF  moduleproceduresrR  rK  r<  r=  r?  r@  rC  rD  rE  r>  rA  rB  rN  rQ  rU  rM  rO  rP  rH  Sr7  r8  r   r*  rS  crackline_bind_1r  r9  rT  r%  ri  r|  r  r  r  r  r  r  r  r  r  r  r  r  rV  r  r  r  rl  rm  rF  r3  r!  r*  r  r  ru  rv  rw  rP  rR  rU  r]  ra  rn  rr  rp  rs  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rq  r:  r  r  rA  ro  rI  rJ  rK  rL  rM  rF  r  r  rU  rT  r`  rV  rh  rn  rt  rx  rj  r  r'  ri  rk  funcsrc  f2f3showblocklistargvr   ro   r   r   r   OSErrordetailrl  rq  r/   r'   r(   r)   <module>r     s  IT    	 	     
  "" 		


  
2			 	#L  	! 3A)623	 6A)956
 
A e)HQKKE	
,1 

3RTT:AA"**12448??"**12448??"**12448>> : 8 3>4 '+! _DD Drzzr<t<<bddDEKL"

?44lEb6bdh6j $jkmkokoq  "**_ 0? ?@BFGNOBJJ 24  457TT;<CD  (r=->>FGNOGH r=->>FGNO7	RZZr9i66>?DE

 rzzy&&$77?@GH ) #r+-=tDDbddL  "**88"$$@AKL2::o 18 89;?@KL "**88"$$@AKL"**88"$$@AKL"**88"$$@AKL

44bdd<=EF66>?HI2::::BDDBCNO 

? .Q QRTRVRVXYab2::@@"$$HITU bjj00"$$89?@bjj00"$$89?@rzz22BDD:;BC66>?HI

44bdd<=EFRZZ..67<=
"**66>?IJ

44bdd<=EF %"**_ 8M &M OQ  OS  OS  VX  VZ  VZ  OZ[ ]oo 2::9244ABMN ( A244H2::A244H RZZ kmomqmqr \%~$&
> 

KRTTS%&(dd, "** r  tv  tx  txy"***+-441 !bjj@"$$H 

;=rzzHJ $$A244H    P	Df(4 bjjErttLrzzI244Qrzz9244A235449 "** G  IK  IM  IMN"JfR8,x6<@]@D(V*Z$&# "**^RTT2EP rzz,bdd3,4$" & (* bJ( "**W%++ DN 2::12448 ;|M`   "J4 $$6= #$DbddK #12449 #M2448 #$ErttL 	" )+ (ZHV0}F  ""!0 "$D ?"D9 x   B C zEE	A	
B	
BMXXab\ 17qTS[A(]EG*_GE&[VXY[M"N""M%%N&[I"N&[I#NM$YB'\M$YBqTS[)DG34BKBM2QQ LLOc1d }  	 E"H3d;6GGKH%+s# 	qGGCL	X Q in  Rp  2)F:R0112"	 	s5   k )k'k<kkk9"k44k9<l