K i=dZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z  ddl Z ddl mZmZddlej"adadadadadad ad adadadagad ad ada ia!d a"da#da$da%tJgia&d a'ga(d a)ga*da+d a,ga-ga.ga/d Z0dd Z1d e_2iZ3dD] Z4ddie3e4< dD] Z4ddie3e4< iZ5iZ6dD]Z7e7dze5e7<e7e6e7dz<dZ8dZ9dZ:dZ;ejxdejzj|Z?ejxdejzj|Z@ejxdejzj|ZAejxdejzjZCgdZDgdZEdZFd ZGeHdfd!ZId"ZJd#ZKejxeJd eKeKd$fzejzd%fZLejxeJd eKd&zeKd&zd$fzejzZMejxeJd'zejzd(fZNejxeJd)zejzd(fZOd*ZPejxeJd ePePd$fzejzd(fZQePd+zZRejxeJd eReRd$fzejzd(fZSd,ZTejxeJd eTeTd$fzejzd-fZUd.ZVejxeJd/eVeVd$fzejzd0fZWd1ZXejxeJd eXeXd$fzejzd2fZYejxeJd3zejzd4fZZejxeJd5zejzd6fZ[ejxeJd7zejzd8fZ\ejxeJd9zejzd:fZ]ejxeJd;zejzdfZ_ejxeJd?zejzd@fZ`ejxeJdAzejzdBfZaejxeJdCzejzdDfZbejxeJdEzejzdFfZcejxeJdGzejzdHfZdejxeJdIzejzdJfZeejxeJdKzejzdLfZfejxeJdMzejzdNfZgejxeJdOzejzdPfZhejxeJdQzejzdRfZiejxeJdSzejzdTfZjejxeJdUzejzdVfZkejxeJdWzejzejzdXfZmejxdYejdZfZnd[Zod\Zpejxd]ejzZqejxd^ejzZrejxd_ejzZsdd`ZtdaZuddbZvdcZwdddZxejxdeejzZyejxdfejzZzejxdgejzZ{ejxdhejzZ|ejxdiejzZ}ejxdjZ~ejxdkZejxdlejzZdmZdnZdoZdpZdqZdrZdsZejxdtejzZejxduejzZejxdvejzZejxdwejzZejxdxejzZdyZdzZd{Zd|Zdd}Zdd~ZddZddZdZdZddZddZddZdZdZddZdZddZejxdejzZdZejxdejzZdZdZdZdZdZddZifdZdZejxdjZdZdZejxdejzZddZdZgfdZdZejxdejzZejxdejzZejxdejzZejxdejzZejxdejzZdZifdZddZddZddZdZddZgadZdZdZgdfdZdZÐt|jeëedk(rgZgZdZdZdZdZejddD]Zed k(r eddk(rdZȌedk(rdadaedk(rdada(edk(rt&r e1dddadaAedk(rdaIedk(rdaQedk(rdada[edk(rdadadagedk(rdZɌoedk(rdZˌwedk(rdZʌeddk(redeeͫderdZeaerdZeaer+ eeͫjeƐjeͫeǐjeͫt&st2rt4s e1ddeeƫZt0rGe1det0ddeeԫZet0dī5ZeȐjeիddder eHeԫyyy#e $rdZ Y wxYw#e$rZedeӛdYdZ[ӐdZ[wwxYw#1swYCxYw)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 -m ,--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: f2py is read as 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'][]['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':,'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: {:{['only':<0|1>],['map':{:,...}]}} B['note'] --- list of LaTeX comments on the block B['f2pyenhancements'] --- optional dictionary {'threadsafe':'','fortranname':, 'callstatement':|, 'callprotoargument':, 'usercode':|, 'pymethoddef:' } 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'][] = {'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()', '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 = [[]::] = byte | character[] | complex[] | double complex | double precision | integer[] | logical[] | real[] | type() = * | ([len=][,[kind=]]) | (kind=[,len=]) = * | ([kind=]) = 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. = in | out | inout = comma separated list of dimension bounds. = [[*][()] | [()]*] [// | =] [,] 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 cxdadadadadadadadadada ga da tgia da dadagaiadadadagagagagaday)Nrrrr r r ) strictf77sourcecodeformquietverbosetabchar pyffilename f77modulename skipemptyendsignorecontains dolowercasedebug groupcounter grouplist neededmodule expectbeginskipblocksuntil usermodules f90modulevars gotnextfilefilepositiontextcurrentfilename skipfunctions skipfuncs onlyfuncs include_pathsprevious_context]/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/numpy/f2py/crackfortran.pyreset_global_f2py_varsr*sIN EGGKMMNK ELr"ILKOKMKOMIIMr(ctsytsE|r#tjj t tjj |yyN)rrsysstdoutwriter )lineflags r)outmessr2s:    JJ  - .  r(2zabcdefghopqrstuvwxyz$_typespecrealijklmninteger)3intdoublefloatcharshortlongvoidcasewhilereturnsignedunsignediffortypedefsizeofunionstructstaticregisternewbreakdogotoswitchcontinueelseinlineexterndeleteconstautolenrankshapeindexslensize_imaxminflenfshapestringcomplex_double float_doublestdinstderrr.typedefault_bncZ|tvr"td|dt|dt|S|S)Nzrmbadname1: Replacing "" with "". )badnameserrmessnames r) rmbadname1rr s6 x)$x7GtLM~ Kr(c>|Dcgc] }t|c}Scc}wr,)rrnames_ms r) rmbadnamerws%* +rJrN ++ +cZ|tvr"td|dt|dt|S|S)Nzundo_rmbadname1: Replacing "rlrm) invbadnamesrorps r)undo_rmbadname1r{s8 {.tfH[=N|Dcgc] }t|c}Scc}wr,)r{rts r)undo_rmbadnamer}s*/ 0BOB  00 0rxz-\*-\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.fcLt.tj|jj}nt dt j j|}t|d5}|j|}|jtjrd}nf|jtjtjfrd}n4|jtjtj frd}nd}dddt||S#1swYxYw) aNEnsures 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-SIGzUTF-32zUTF-16ascii)encoding)charset_normalizer from_pathbestrr`ospathgetsizeopenread startswithcodecsBOM_UTF8 BOM_UTF32_LE BOM_UTF32_BEBOM_LEBOM_BE)filenamemodernbytesfhandleraws r)openhookr+s%%//9>>@IIR23 (D ! #W,,v&C~~foo.&!4!4f6I6I JK# >?## # $ 22 # #s *BDD#cd}t|jjtvrd}t |d5}|j }d}t |rd}nt|rd}d}|dkDrX|rV|ddk7r6|jr&|dz}|ddk7rt|d d s|d d d k(rd}n|j }|dkDr|rVd d d |S#1swY|SxYw)z(Check if file is in free format Fortran.FTrr!r Nr &) rsuffixlowerCOMMON_FREE_EXTENSIONSrreadline _has_f_header_has_f90_headerstrip_free_f90_start)fnameresultrr0ns r)is_free_formatrJsF E{!%;; % &!   A T "AF!eAw#~$**,QGtORa(Ad2bkUXFX!F##%D !e& M& Ms B CCc `|s/tttttt t ttf }|gk(ryt}d}d}d}tjdtj}tjd} tjd} tjd} |r |ddd \}} d gtd D cgc] } t| c} z}datj|t } |j#}|sn|j-rda|j)ada|} dadat.j0j3td}t5tj6j9t:vrt=|st?|sdantAtr t?|sdatrtBantDatGdtItdttxrdxsdd|jKjMdd }|dk(s|ddvrn |dd}|dk(sd}tO|d\}}|d z }|ddj9dk(rtO|dz|ddzd\}}d }|jQdk(rtdk(rnd}tdk(r|dd vr'|ddj9d!k(r d"|ddz}d }nd}d}trtS|d#kDr|dd#}|d|vrt'd$tI|z|rtr$tS|dkDr|dd k(s||d%dz}d}d}nu| jU|}|r|jWd&}|r)|| jU|jWd&z}d}d}n&d"|ddz}|r|j9}n|}|}|}ntdk(r|sbd'k(r]| jU|rL|d(z} |j#}|s tYd)n||z}| jU|rn6|j[}| jU|}|r|jWd&}|r(|| jU|jWd&z}d}d}n(|r |r t]|s|j9n|}n|}|}|}|du}nt_d*tItd+|jadz t| fza|jU|}|r|jWd,}t.j0jc|rte||d-nt.j0jgtgthz}d}|D]S}t.j0jk||}t.j0jc|sCd}te||d-n|sAtGd.tI|d/t.jljk|d0n|||} |r|j9}n|}|}d+|jadz t| fza|jU|}|r|jWd,}t.j0jc|rte||d-nt.j0jgtgthz}d}|D]S}t.j0jk||}t.j0jc|sCd}te||d-n|sAtGd.tI|d/t.jljk|d0n||da|jo|r |ddy\ aaaaaaaaaycc} w#t$$r6}t'd|j)d|j+d|dd}~wwxYw)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 ''" is met. NFr z*\s*include\s*(\'|")(?P[^\'"]*)(\'|")z(?P.*)&\s*\Zz(\s*&|)(?P.*)z.*?'''r )r r  )rTzreadfortrancode: reading #z failed with zu. It is likely that installing charset_normalizer package will help f2py determine the input file encoding correctly.rrrfreez Reading file z (format:z,strict)  z rrz!f2pyr )rcrCrf2pyz Hzxreadfortrancode: Found non-(space,digit) char in the first column. Are you sure that this code is in fix form? line=%sr0.pyf z.Unexpected end of file when reading multiline z4Flag sourcecodeform must be either 'fix' or 'free': zLine #%d in %s:"%s" rq) dowithlineistopz-readfortrancode: could not find include file z in . Ignoring. )8rr r!rr beginpatternrrrrecompileIrangestr fileinput FileInputrrUnicodeDecodeError Exceptionrlineno isfirstlinerrsplitextrrrCOMMON_FIXED_EXTENSIONSr_has_fix_headerrbeginpattern77beginpattern90r2repr expandtabsreplacesplit_by_unquotedrrXmatchgrouprorstripiscstyledirective ValueError filelinenoisfilereadfortrancodedirnamer%joinpathsepclose)ffilerr saveglobalslocaldolowercasecont finallinell includelinecont1cont2 mline_markl1rv spacedigitsfinlmsgextis_f2py_directiverl_ origfinallinerlcmfn include_dirs foundfileinc_dirfn1s r)rrdsh !#3_nV_ %+6  {" DI B**5rtt=K JJ, -E JJ- .EI&J 2r FB%U2Y7r3r777K   eh 7C   A  ?? ! !llnOKBI"N''""?3A6CO$++1137NN(+q/A 09K!'- - O,n!/i6B68 9 LLN " "63 /r'uH$#2Ar' "#As+B S bq6<<>W $$Q[2ab6%93?DAq $  779?'   U "t00Qq6<<>V+!AB%A(,% D(-%q6B;#2At;&!GIMa!QRRICFQJqts{!AB%Z " KKNAekk!n226::B "I$&M !AB%A'$&HHJ $& $&MB v %C6Mj.>.>q.AHBMOBA!''+HHJ AAGGFO%++a...v66 " #4EIZ[]I^ egI "I " TMDFtNG[F\]_ _4 NN q /2877   m , Bww~~b!zCGGOOO4 68E F  +G'',,w3Cww~~c*$% ' !L  !R"**//,"?AB y ! { ~HHJ  M0 1or433-(A WWV_ 77>>"  B:Q ?GGOOO<= MLI' ggll7B/77>>#& !I#CJaH   Hbjjool;=> 9IIK 2q9D 6 % %+E8 " +CLLN+;1SZZ\N &  s])<].. ^-71^((^-zN\s*(?P%s(?=\s*(\b(%s)\b)))\s*(?P(\b(%s)\b))\s*(?P%s)\s*\Zzqcharacter|logical|integer|real|complex|double\s*(precision\s*(complex|)|complex)|type(?=\s*\([\w\s,=(*)]*\))|byte.*rhz|static|automatic|undefined)z([a-z]+[\w\s(=*+-/)]*?|)functionrrbegin)z [a-z\s]*? subroutinerrzprogram|block\s*datazM|module(?!\s*procedure)|python\s*module|(abstract|)\s*interface|type(?!\s*\()z\end|endprogram|endblockdata|endmodule|endpythonmodule|endinterface|endsubroutine|endfunctionendzDend\s*(if|do|where|select|while|forall|associate|critical|enum|team)z[\w]*?endifzmodule\s*proceduremoduleprocedure)r implicitrrr)r dimension|virtualrr dimension)r externalrrr)r optionalrrr)r requiredrrr)r publicrrr)r privaterrr)r intrinsicrrr)r intent|depend|note|checkr z \s*\(.*?\).*intent)r parameterr z\s*\(.*r )r datar rr )r callr rr )r entryrrr)r callfunrrr)r commonrrr)r userrr)r containsrr r)r formatrrr)r Kthreadsafe|fortranname|callstatement|callprotoargument|usercode|pymethoddefrrf2pyenhancementsz2\s*(?P''')(?P.*?)(?P''')\s*\Z multilinec Ltdt|zrJdtjdjdtj|ddtj|ddd }|j |}|r|j }|d |d fS|d fS) 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"'zcannot split by unquoted quoteszR\A(?P({single_quoted}|{double_quoted}|{not_quoted})*)(?P{char}.*)\Zz[^"'][z('([^'\\]|(\\.))*')z("([^"\\]|(\\.))*")) not_quotedr; single_quoted double_quotedbeforeafterr )setrrrescaper groupdict)r0 charactersrrds r)rrs E S_,P/PP -  !!'ryy45Q7RYYz*+1-00 "("2 3A  A KKM( QwZ(( ":r(cg}t|jdD],}dD]}|j|d}|j|.dj |S)N@,@z(),r,)markoutercommasplitrappendr)argslinearrs r) _simplifyargsr,s` A H % + +E 2 "A !S!A "   88A;r(z"\s*(?P\b[a-z]+\w*\b)\s*=.*z \s*(?P\b[a-z]+\w*\b)\s*=.*zH\s*bind\(\s*(?P[^,]+)\s*,\s*name\s*=\s*"(?P[^"]+)"\s*\)c t|d\}}|rtdj|sltdj|sT|dk(sJt |t|d\}}|r!t ||t|ddd\}}|r!t ||y|dkr_dat diat iiat gia gtt d<itt d<dtt d<dtt d <d a d a y|dkDrd}trtt k(rd }t |kDrtd t t d t tdtdtt dz jtt tt tt dz d d<tt =t dz at |kDrtrtt k(rtt dz jtt tt tt dz d d<tt =t dz att dz jtt tt tt dz d d<tt =t dz ad a y|dk(ryd}tt t"t$t&t(t*t,t.t0t2t4t6t8t:t<t>t@tBtDtFtHtJtttLfD]}|dj|}|rn|dz}!stN} dtcxkr t krydtt vr tt dD] } | tPvr tP| } dtt vr| tt dvr7tSjd| ztU|tRjV} | sk| j| jYd} t[| jYd} | rd| d| d| jYdd}n d| d| d}t\dj|}|stdt |dyt_|d|yt`dkDs,t`dk(r7tbjejgdrda4tdt zyddk(r=dtcxkr t krnnt dz att kryt dkrtkd t zt8dj|} | rc| jYd!tt k(sDtkd"t | jYd!d#t tt d$tltt k(rd a tt dz jtt tt tt dz d d<tt =t dz atnsda8yy|dd%k(r5dtcxkr t kr nn t dzayda9t_||d|da8y|dd&k(ry|dd'k(rt_||d|y|dd(k(r*ttrydtcxkr t kr yt a yt a ydtcxkr t kryt_||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]. ;rrNr bodyvarsblockrqr zcrackline: groupcounter=z groupname=rzYcrackline: Mismatch of blocks encountered. Trying to fix it by assuming "end" statement. externals interfacedz5(?P[^"]*)\b%s\b\s*@\(@(?P[^@]*)@\)@.*\Zrargszcallfun (z ) result (r)z4crackline: could not resolve function call for line=. rrz"crackline:%d: No pattern for line rz>crackline: groupcounter(=%s) is nonpositive. Check the blocks.thiszcrackline: End group z* does not match with previous Begin group z rrrr);rf2pyenhancementspatternrmultilinepatternr crackliner groupname groupcacherrrrr2r)dimensionpatternexternalpattern intentpatternoptionalpatternrequiredpatternparameterpattern datapattern publicpatternprivatepatternintrinsicpattern endifpattern endpattern formatpatternrfunctionpatternsubroutinepatternimplicitpattern typespattern commonpattern callpattern usepatterncontainspattern entrypatternmoduleprocedurepatterncrackline_re_1rzrmarkouterparenrrr,callfunpattern analyzelinerr!rendswithr&rr rrrr)r0resetr has_semicolonsemicolon_lineflr1patrre_1rqm1m2r+s r)r<r<sM)s3A}5a8>>tD/288>z&4;&z0s;n dE "#4^AB5G#M D. $ qy !2& "B' !2& +- < (+- < (,. < )+- < (  qy  \\9BR ,'i: ; l n lQ& ' . .z,/G H6? 6MIlQ& ' +F 3,''!+LR \\9 lQ& ' . .z,/G H6? 6MIlQ& ' +F 3,''!+L lQ& ' . .z,/G H6? 6MIlQ& ' +F 3,''!+LL rz D /=/ +}n jo/@}Z' &  FLL  ax#$   /< /  0 *\2 2"<0= ;&&t,D:l#;; S_H`amHn@nXXLtSUcdhUikmkokoqBHHX$67B%bhhv&67A!)$q:bhhx>P=QQRS!)$q15&q)//5ARSWX\S]R^^abd9d3) * Q;7a(@\(@.*?@\)@|\*[\d*]+|\*\s*@\(@.*?@\)@|))(?P.*)\Zz[(?:,(?P[\w(),]+))?(::)?(?P\b[a-z$_][\w$]*\b)(?:\((?P[\w,]*)\))?\Zz\s*(?P\b[\w$]+\b)\s*(@\(@\s*(?P[\w\s,]*)\s*@\)@|)\s*((result(\s*@\(@\s*(?P\b[\w$]+\b)\s*@\)@|))|(bind\s*@\(@\s*(?P(?:(?!@\)@).)*)\s*@\)@))*\s*\ZzF\s*(?P(operator|assignment))@\(@\s*(?P[^)]+)\s*@\)@\s*\Zz9\s*(?P\b[\w$]+\b)\s*@\(@\s*(?P.*)\s*@\)@\s*\Zz4([-+]?(?:\d+(?:\.\d*)?|\d*\.\d+))[dD]((?:[-+]?\d+)?)zA([-+]?((?:\d+(?:\.\d*)?|\d*\.\d+))[eE]((?:[-+]?\d+)?)|(\d+\.\d*))zintent\s*\(.*?\bcallback\bc`|jdgD]}tj|syy)Nrnrr)get_intentcallbackpatternr)vdeclr+s r)_is_intent_callbackrs2 YYz2 & ! ' ' * r(cddj|j}tj|}t |||re|j d}|r-|jdDcgc]}|j c}ng}|j d||j dfSdgdfScc}w)Nr attributesr&rqparams)rr(typedefpatternrprintrr)r0raattrsr+s r)_resolvetypedefpatternrs 774::< D   d #B $O &9>EKK$45q5Bxx(::: T>6s)B-ctjdtj}|j|}d}|r8|j d}|d|j ||j dz}||fS)NzObind\(\s*(?P[^,]+)(?:\s*,\s*name\s*=\s*["\'](?P[^"\']+)["\']\s*)?\)r)rrrsearchrstartr)r0patternrbind_statements r)parse_name_for_bindrsljjkmomqmqrG NN4 EN QNU[[]#d599;<&88  r(ct|\}}t|}tj|}|r3|j d|j d|j d|fSt j|}|r/|j ddz|j dzdz}|gddfSt j|}|r$|j d|j dddfSdgddfS)Nrqr5rschemer6r7)rrWnameargspatternrroperatorpatterncallnameargspattern)r0 bind_cnamerarqs r)_resolvenameargspatternrs*40D* $ D   t $B xx&!1288H3EzQQ   t $B xx!C'"((6*::S@Rt##  " "4 (B xx&!14== T4 r(c 8|jd}|dk7rdatr|dvrtstdkrt j jtjdd}td|d da tdzad tt<itt<gtt<gttd <ittd <d ttd <|ttd<dttd<da|dvr|j}t!j"d|t j$rd}nOt!j"d|t j$rd}n't!j"d|t j$rd}|dk(r8t'|jd\}}}d|ittd |<g}d} nt)|jd\}}} } ||dk(rd}nd}|dvr td||tfa|r@t+t-|jdD cgc]} | j/c} }ng}d|vr%d|vr|j1dd|vrtd d} d} |d!vr\d} d"ttvry|ttd"vryttD] }|d|k(s y|ttd#vryd$d%d!|}t2r#t4d&k(rtdkrtd'zad} |d(vrd} tdzaitt<gtt<| rt6dkDrtd)t9t2zdd*tt<dttd <t2ttd<dttd<gttd <gttd+<gttd#<ittd <tdzaitt<gtt<| rt6dkDrtd,tzdd-tt<d-ttd <d.ttd<ttdz dd/ttdz dttd<gttd <gttd+<gttd#<ittd <tdzaitt<gtt<|tt<|ttd <|sd0|j;d1d2z}|jd3ttd4<t=|ttd<| ttd5<tdk(rtttd<nqt2r4td6k(r+ttdz dd/tttd<n7ttdz dd/ttdz dttd<t?ttjAD]!}tt|rtt|=#|ttd"<gttd <gttd+<gttd#<ittd <ittd7<|dk(rgttd8<|d!vr|ttd'z d+vr"ttd'z d+jC|tEjFttd'z d ttd < ttd |ttd |djId9=|d:vrN rt!jLtN| }|rm|iittd;<|jd<ttd;|d<<|jd=r%|jd=ttd;|d< tQttd |ttd'z d dttd |<|d>k(rX| rV| ttd vrD|| k(s?tQttd |ttd | ttd |< ttd'z d#jC||d%k(rltRdj#|jd3d1z|z}|r=tU|jd|jd\}}}}tW|||||d!vrttdz jCttttttdz d&d <tt=tdz attdz jCttttttdz d&d <tt=tdz ayy|d7k(rt)|jd\}}} }|s|r@t+t-|jdD cgc]} | j/c} }ng}| Jt9| |ttd7|<d7|tfayy|dk(r;tU||jd\}}}}tW||||}| d?|tfayy|d@vrttd }|jdj/}|jYdA}|dkr|dBk(rt[|jYdCd'z }|d|dzdAz||dzdz}|jYdA}||ddAk(rTd"ttvrEtdD|jd|d|dE|dFj]ttd"z}|dkrd}d}n|d|j/}||d'zd}t-|jd}t_|dkDr%|d}tdGdFj]|ddzd}t-|jdD cgc]} | j/c} D]/}t`j#|}|s<|dHvrd}nOtc|jetdI|dJt9|dKWt=|jd}|dHvr|dLvr||jdz }||vri||<|dMk(r||jdz}|dBk(r|jd|z}tfj#|r|ttd"vrtdkDrsdNttd'z dvr tdO|ttdk7r^tdP|dQttddRttd"jC|ntidS|dTntidU|z|dVvr|}d||vr||djCn g||d<|d9k(rrttd d k(r tdW|ttd"vrd+ttvrgttd+<ttd+jC||}2|ttd <| d?|tfayy|dXk(rK|jdjdFD cgc]} | j/c} ttdY<y|dZk(r?ttd }|jdj/dd&}d}t-|jdD]} |jd[D cgc]} | j/c} \}}tk|}t=|}||vri||<d[||vr&||d[|k(std_|d`||d[da|d tm||}|r|jodbdck(rt?|} tpjs|D]i}t?||ju|jwjj;ddde| |ju|jwkdj]| }nG|jodbdfk(r3|ddjj;dddej;dFdg} ty|i|}!t9|!||d[<d||vr||djCdZn dZg||d<|}|ttd <| d?|tfayy|djk(r|jdj/jdkk(rdttdj<y|jdr/ttjodji}#|# tdli}#t-|jdjdD]}i}$t!j"dm|t j$}|stdn|d^=tj#|jd}%|%stdo|d^stU|%jd|%jd\}}}}t||\}&}'}(||$db<|&|$dp<|'|$dq<|(|$dr<t?|$jAD] }|$|r |$|= t-|jdjdD]})ds|)vr2 |)jdsD cgc]} | j/c} \}*}+n|)j/x}*}+t_|*t_|+cxk(rdk(sntdt|)dvztt|*t|+dzD]},|$|#t|,<|#ttdj<yy|dwk(rg}d}-d}.d}/d}0d}1|jdD]}2|1s|2dxk(r|0 }0|2dyk(r|0r|/dz}/|2dzk(r|1dz}1n |2d{k(r|1dz }1|/dk(r|-|2z}-:|/dk(r|.|2z}.E|/d'k(sK|-j/}-|-jdFr|-ddj/}-|jC|-|.g|2}-d}.d}/|/d'k(rG|-j/}-|-jdFr|-ddj/}-|jC|-|.gttjod i}3d}|D]}4|4dj/jdF|4dj/c|4d<|4d<|4djdzrtd||4dd}gtt+t-|4djdD cgc]} | j/c} D]\}5}!|!jdzrtd||!d}'d~|4dvrtd|4dd}A|3j|!i|3|!jodb}6t|3|!}7|6dfk(rt!jd|4dn|4djdF}8 |7rddj]|8dn|8|5}9|3|!jod[}>|>r|>|9k7rtd|!d`|>d|9d^|9|3|!d[<|!}|3ttd <|r d?|tfayy|dk(r|jdj/}|ddyk(sd|z}g}?t!jdy|d'\}}@}A|@j/}@|@sd}@|?jC@Agi}Bdttvrttd}B|?D]i}2|2dBvrgB|2d<t-|2djdD cgc]} | j/c} D]}|sB|2djC|kBttd<d@tfay|dk(rt!j"d|jdt j$}|rY|je}Cdttvrittd<|jd}ittd|<d}DdCvr%CddCvrCdd}DDttd|d<CdjdFD cgc]} | j/}} i}E|D]}4d[|4vrt!j"d|4t j$}%|%r@|%jdj/E|%jdj/<ntdt9|4dEn|4E|4<Ettd|d<ytc|jetdyyy|dvrdttvrittd<ttd}F|jddk(rDdFvr@tFdtr Fdg|Fd<FdjC|jdy|jdF|jd<y|dk(rItt6r tdyt}Gtt|Gtdd'|jdyt6dkDr%tc|jetdyycc} w#tJ$rY~wxYw#tJ$rYwxYw#tJ$rYKwxYwcc} wcc} wcc} wcc} w#tJ$rtd\|d]|d^Y wxYw#tzt|t~f$r}"tidh|di|"dEYd}"~" d}"~"wwxYwcc} w#tJ$rtdt|)duYwxYwcc} w#t$rtd|8Drg}:|8D]};d|;vrp |;jd\}<}=|:j|=j/gt|<zI#t$r"|:jC|;j/YswxYw|:jC|;j/|:}8|7rddj]|8dn|8|5}9YwxYwcc} wcc} 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. r9rN)rr rrhr.rz=analyzeline: no group yet. Creating program group with name "rmprogramr/r0r1rqfromskyfrom)rr rz block\s*data block datazpython\s*module python modulezabstract\s*interfaceabstract interfacerhrrn _BLOCK_DATA_r ) interfacerrz2analyzeline: No name/args pattern found for line. r%zoperator assignmentr__user__z8analyzeline: missing __user__ module (could be nothing) z(analyzeline: appending intent(callback)  to z arguments zanalyzeline: intent(callback) z is ignored z=analyzeline: intent(callback) %s is already in argument list )rrrrrrz(analyzeline: ignoring program arguments r implementedbyr rqzAanalyzeline: could not extract name,expr in parameter statement "" of "" z1analyzeline: Overwriting the value of parameter "" ("z ") with "r4r5r#ecomplexz+1j*(z analyzeline: Failed to evaluate z . Ignoring: rnonez.*?)\s*(\(\s*(?P[a-z-, ]+)\s*\)\s*|)\Zz@analyzeline: could not extract info of implicit statement part "zIanalyzeline: could not extract types pattern of implicit statement part "rorprr-z2analyzeline: expected "-" instead of "z&" in range list of implicit statement z*" in range list of implicit statement (2) r '/r6r7zanalyzeline: implied-DO list "z" is not supported. Skipping. rzComment line in declaration "z\(.*?\)(/, z/)c3$K|]}d|v yw)rNr').0rs r) zanalyzeline..s53!85srz*analyzeline: changing init expression of "") to "rz//)maxsplit_BLNK_rzR\A\s*(?P\b\w+\b)\s*((,(\s*\bonly\b\s*:|(?P))\s*(?P.*))|)\s*\Zrvnotonlyonlyz7\A\s*(?P\b\w+\b)\s*=\s*>\s*(?P\b\w+\b)\s*\Zlocalz-analyzeline: Not local=>use pattern found in mapz0analyzeline: Could not crack the use statement. )rrusercodez-analyzeline: No context for multiline block. z+analyzeline: No code implemented for line. )Srr&rrrrrbasenamer!r(r2rr=r>rrrrrrrrwr'rremoverrrrrrrrvrwr)copydeepcopyr[rrcrackline_bindlangrrOcracktypespec0 updatevarsfindrWrrX namepatternrr!rroget_parametersdetermineexprtyper real16patternfinditerrreval SyntaxError NameError TypeErrortypespattern4implicit cracktypespecrordchrr removeprefix enumerate setdefault getdimensionfindall IndexErroranyextendr8r isinstancerappendmultiline)Hrr?r0r1newnamerqrrr5r bindclinex needmodule needinterfaceitr~bindcdattr4selectorattredecl last_nameriplchrraapinitexprrttvrimplr{rb kindselect charselectrrrbegcendcodlilrffcinprr0ridxvtypevdimmatchesnew_val expanded_listr multipliervalue current_valclbnol commonkeymmisonlyrr#gcsH r)rYrYsp GGFOE {t#GG!1''""?399#>qAKG9TX Y [ #a' "+ ,#% < "$ ,+- < (+- < (,5 < )+2 < (+4 < (  ++  88OUBDD 1 E XX(% 6#E XX-ubdd ;(E F?3AGGG4DEND%6@%5HJ| $V ,T 2DF,CAGGGDT,U )D$ < $%MMMN!46 '5d';'A'A%'HJ"# ggiJKDD :* B* O Q  & &MZ 55:l3F;; - f:% z,/ ==)jA$GE \R/LA4E'!+LJ?? ! #a' #% < "$ , {A]+,-.0&.Il #0?J| $W -/ < *+5d+; < (-3 < * 1 />J| $V , |q0vF~~k2MU^^\gMh <0AK&|4V  /4< />6:J| $W -d 3 '|<   *8 1777#+%'(D%x4?  *I|D  ! n n<(0 WWW  # # % GGDM q5TX%r"''.2AFQUd"RAZ/B A!"v~&J|,D"D"Ra&23#((:l#;F#CDD q5ABBQBAEFB B  % %e , r7Q;AB oAB " # %3B%7%=%=e%DE!'')E4 A""1%B00A!++-(d1g'(rxx/0,,6P1PRXXg&&~a{"BHHW--xWWV_r))//3 < 8 @@'!+)L1><>J|,[9<(5<WWS\)J!''))JJD$ '(ggi/tt9D 6Q6PQRPSS~A "3t9c$i!m<,'+SV ,,1' ,P48J| $Z 0]^      ! A8B8AACxAgcAgAv!Va!VaXXZ==%ABB 2r(#- . 6B}}S!V\\^ IIr2h ,'++FB7 0 A122371JAaD!A$ts#81>]^_#I.QRSTQUBVB\B\]bBc.dQqwwy.d$ef+ Q<<$?Aaggi?? FAaxXXVXY[][_[_a<>HH %='',uwrxx06689$"OPTUVPWyXZ []!"1CEJ|,U3D9%@ F !++- G H+!7|, % % Z %= =;=J| $%7 8 | $%7 8 776?j (Z1_!J--!":* jM !1 2!"!1Aaggfo     #HI   2(!, ) 1 akkm>? oJN      ."NLFt =@ WXYWZZ`ac`ddhik 0 I6 #S*+ b*K(%#"TUVTWW~ A$%n/e*"T 5W55(* %,DE"e|!H8= C8H$5J$1$8$8%++-3z?9Z$['1!H$1$8$8$G!H!. 4 4U[[] CD#0=A499W#5"6b9ws|G#TVL&@sA)Aj/ 7Aj4AAk3"AkAk$!Ak)2Ak.4Ak8Ak3Ak8B8 AlK,AmK?AmLAmU#Am2X-Am7]1AqbAqj4 AkkAkk AkkAkk Ak!k Ak!k3Ak8k8AllAllAm l.AmmAm mAmmAm/m.Am/m7&AqnAAooAqo(Ap pAqp Ap p AAqqAqcZd|vri|d<|d}||vrg||<||j|y)Nf2pymultilinesr))r context_namemlr#s r)rrsCu$"$ A1,lO2r(cFd}d}tjd|tjrd}nFtjd|tjrd}n|jj }t jt |}|s tdy|j}t|jD]}t||||<|dvr |d}|d}|jd }|d k\r|d|j}||d zd}||||fS) Nzdouble\s*complexdouble complexzdouble\s*precisionzdouble precisionz>cracktypespec0: no kind/char_selector pattern found for line. )rr7logicalr5 characterrhr9rrrr2) rrrrr selectpatternrWr2r!rvrwrlr)r4rrrrar#r~rs r)rr!sH D xx#Xrtt4# '244 8%>>#))+   ^B/ 0B  M O A !&&(^&!%!&QQV9 wZ  AAv"1v||~ AZ XtR ''r(z)\s*(?P\b\w+\b)\s*(?P.*)\s*\ZzB\s*(\(\s*(kind\s*=)?\s*(?P.*)\s*\)|\*\s*(?P.*?))\s*\Zz2\s*(\((?P.*)\)|\*\s*(?P.*))\s*\Zz\s*(kind\s*=\s*(?P.*?)\s*(@,@\s*len\s*=\s*(?P.*)|)|(len\s*=\s*|)(?P.*?)\s*(@,@\s*(kind\s*=\s*|)(?P.*)|(f2py_len\s*=\s*(?P.*))|))\s*\Zz\s*(@\(@\s*(?!/)\s*(?P.*?)\s*@\)@\s*\*\s*(?P.*?)|(\*\s*(?P.*?)|)\s*(@\(@\s*(?!/)\s*(?P.*?)\s*@\)@|))\s*(=\s*(?P.*?)|(@\(@|)/\s*(?P.*?)\s*/(@\)@|)|)\s*\Zc|j}t|dkr|S|d}tdt|dz D]'}||dk(r||dzdvs ||dz dvr |||z})||dz}|S)Nrrrz ()[]{}=+-/* r )rrXr)exprexpr2rs r) removespacesr'Js ::dt$t&vrgt$t&d<t$t&dj|| jd r't2j t5| jd }|r|j7}d!D]}||d"z ||d"z||<||d"z=t+|j-D]}||t9||||<||=d#|vryd$|vru|d#d%k(r |d$|d#<|d$=na|d&k(r*d|vs|dsi|d<d#|dvr|dd#=|d#|dd'<|d#=n2|d$d(z|d#z|d$<|d#=t/d)|d|d*|d|d+|d$d, d#|vrO|d-vrd|vs|dsi|d<|d#|dd'<|d#=n.|d&k(r)d|vs|dsi|d<d#|dvr|dd#=|d#|dd'<|d#=d.|vr3d/|vr'|d/|d.k(std0|d|d/d|d.dn|d.|d/<d$|vrd1|d$d2}d|vs|ds|g|d<nj|dj||dD]-}|dd3d4k(s ||k7s|dd5=t/d|d6|d7|dn"n td8|| jd zzt+|j-D] }||r ||= |t$t&d |<d9t$t&vrt$t&d9j||}|Scc}wcc}wcc}w):z 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[a-zA-Z]+)rrrjz@ @r+z-updatevars: no name pattern found for entity=rrqr0r4z+updatevars: attempt to change the type of "rrz ". Ignoring. roz0updatevars: attempt to change the kindselector "rrpz updatevars:z*: attempt to change empty charselector to rz0updatevars: attempt to change the charselector "rrz/updatevars: attempt to change the typename of "rnrr5r3r)rXarrayinit2rXr3r r"rr&z updatevars: "z" is mapped to "r6z)" rr7r!r5r4rqz6updatevars: attempt to change the init expression of " dimension(r7 rr z: attempt to change rz?updatevars: could not crack entity declaration "%s". Ignoring. r)rr'r(rrrrrrrXr)r'r0rrr2rrrr>rrrvrwrorlenarraypatternrWr!rl)r4rrn entitydeclrrrrrrrrr+rselel1re1enamernot_has_typespecr~rad1lkdmdm1s r)rr~s=I'4Xx'H$J H'5h'?'E'Ee'LM!AGGIMM  JJ. / A AGGG$**,#a&' N HHQK +J7==eD E!'') EB E C 3&4\/RSBT5U]`&a&g&ghm&no1779o 3B 2::eS12 33E   a  ?Qy V X 1776?+ J|,V4 4|,V4U;@@BE)6 $,j!8uZ/@#@5,h89U*(, *(=n%joo/0LAE.11:a=ER`LabcLd;dueN&;A&> 1 !OP4899Z]3Kn-a0 L U*z#,6E.)$j23joo/0LAE.11:a=ER`LabcLd;dueN&;A&> 1 !OP4899Z]3Kn-a0 L &$,j!5#4#@5,h89&$(IIh$7j!!4Aj 11j)0034!% ( 3E* $(IIj$9E. !$(IIj$9E. ! (E*  $ ( 3E*  %))J/52 61 <@XY_@`;`*\"::8: <(5 | $[ 1 8 8 ; 777  &&~aggg6F'GHB\\^2)B"s(|/!#BH2rCxL)bggi"A!u( 0A 71qE " B;7b=%yB$&wK5 wK![0*%7~AV46E.1 E.$99 %n 5e <57Yn-c2uI&(kC&7"U)&C7 uI$a5"W+!GHB;#LL*%7~AV46E.157Yn-c2uI![0*%7~AV46E.1 E.$99 %n 5e <57Yn-c2uIR<e|U3Z2f:-E!5:r&z!;<&(Zc b=%bk]!4B!.uZ7H-/Dj)j)004#(#4&C"2Aw+5#)$)*$5b$9 '+0#r);!< % &ZAGGG,,./ejjl# A8!H 38 < (/ L1 1 | $Z 0 7 7 > KEL qN Fps\1\6-\;czd}d}d}|r.|dvrtj|}|stdt|dy|j }|d|d<|d=t |j D] }||r ||= t |jD]\}}t|||<n|dk(rtj|}|stdt|dy|j }|d|d<|d=|d rftjt|d }|j }d D]#}||d zr ||d z||<||||<||d z=%|d |d |d <|d =t |j D] }||r ||= t |jD]\}}t|||<nq|d k(rTtjd|tj}|r|jd}n3tdt||zzntdt|d|||fS)Nr6z1cracktypespec: no kindselector pattern found for rkind2rr"z1cracktypespec: no charselector pattern found for charlenlenkind)rXkindr5f2py_lenrhz\s*\(\s*(?P\w+)\s*\)rqz'cracktypespec: no typename found in %s z$cracktypespec: no selector used for )rorr2rr!rvrwitemsrrrplenkindpatternr'rrr) r4rrrrrr~rrHrBs r)rr'sJJH @ @%++H5JGXGWWYZ\#--/J(1JsO7#*//+, &!!}"1  &Z--/0 .1 *1 1  .  $%++H5JGXGWWYZ\#--/J(3JsO9%)$(..":i#89;!++-)*BrCx(&-b3h&7 %,R[JrNS) * :&2-4Z-@Jz*9%*//+, &!!}"1  &Z--/0 .1 *1 1  .  xx =xNH#>>&1Bh1245 :4>:J"M N z8 ++r(c|si}|s|Sd|vr|g|d<|S|r|dj|||dvr|S|dk(rd|dvr|dj||S|dk(rd|dvr|dj||S|dk(rd|dvr|dj||S|dk(rd|dvr|dj||S|dj||S)NrnrJ automaticrrr)r{rr}s r)rxrxbs-    6Z   Z% tJ  xKtJ/?? Z% K  j1A!A Z% K   D, ,   # #D ) K   4 + +   # #D ) K Z% Kr(c|si}|s|Sd|vr||d<|St|jD]}|s||dvs |||d|<|S)Nrorvrwr{selr}r~s r)ryry}sl   T!"^ #((* - AT.11&)!fD  #- Kr(c|si}|s|Sd|vr||d<|St|jD]}|s||dvs |||d|<|S)NrprPrQs r)rzrzsl   T!"^ #((* - AT.11&)!fD  #- Kr(cd|vr|dS|S)Nrqr')r1unknowns r) getblocknamerVs V} Nr(cB d|dd|dday#t$rYywxYw)NzIn: rrrqr)r r)r1s r) setmesstextrXs6 !%-%-C    s  c^i}d|vrt|d}d|vr|j|d|S)N parent_blockr) get_usedictupdate)r1usedicts r)r[r[s:GeN34 ~uU|$ Nr(c |i}t|}|s|St|jD]\}}|j}|tvr"t d|d|j dd@t|}t|}|sW|rtd|dt|jD]2\}}||vr$t dt|dt|d|||<4|S) Nzget_useparameters: no module z info used by rqrzget_useparameters: mapping for z not impl. z(get_useparameters: overriding parameter z with value from module ) r[rvrKrrr2rrror) r1 param_mapr]usenamemappingmvarsrr~rs r)get_useparametersrcs % G  1--/ - ' eii/1 2 g&&   5gYlK L( DAqI~59!Wd7mMNIaL  & r(cts|St|tr |Dcgc]}t||dz|}}|St |t |d|ddd| t |}|Md|vrI|d}t|jD](}||}d|vs |d}d |vs|d } | |vs!|| |d <*|d D cgc]} t| |dz|} } | |d <|Scc}wcc} w) Nr)tabr_Block: rqrrr0rorIr/)rrrv postcrack2rXr2rcrw) r1rer_gretr0rvarrIvalbnew_bodys r)rgrgs/  %!tyA  se75=/ ,a0%e, 5V}diik" 6Aq'C$>*T>v,Ci''0~V  6v(1#* B(H(E&M L/&(s C<C"ct|trYg}g}|D]K}t|t||dz}d|vrd|dvr|j |;|j |M||zSt|t|t sd|vrt dt|zd|vr|ddk(st|d|dd d t|}t|}t||d <t|d |d <|jd r|d }t||||d<g}d|vr:|d}t|jD]}d|vs|j |ni}d} d|vr|d} |jdrKg} d|vr|d} t!j |d } | r| dz} nd} | |vr!d} | d| |vr| dz} | d| |vr| d| } dgi| dzd}|dD]}|| vrg}d}|dD]l}|dz}|ddk(sd} |dD]1}| dz} d|vs |d|k(st!j |}|d| =n|sO|ds|d|=| | j#|=n|dj ||| vst%| |r| ||d |<|d s|dr+| |d<d|gi| |dd}i|| <t&j ||r||d<|S)zi TODO: function return values determine expression types if in argument list rrerqrr1z0postcrack: Expected block dictionary instead of rrfrrr0sortvarsr5r/rr r3r4__user__routinesunknown__user__routinesrrr_user_interface)r1r/r0rqr r)r1r/r0rqr4)rrvrX postcrackr)dictrrr2 analyzeargs analyzecommon analyzevars sortvarnamesr analyzebodyrwrr[ isexternalr)r1r5regreturetrh userisdefineduseblockr~rqr4rbmnamerrredefjrlbbmblocks r)rtrts% A N!t,A{zQvY6 A A d{ eT "we';JE #$ $ uV}0CC3%wuV}oR0!4  E % E&E&M$U6]3E* yyV}t5E&MM ~<hmmo& (AQ$$Q' ( D V} yy 5 |,J %-( --E-E M !AG1QC.M1EG1QC.M1gQqcNE)20A)AC {# 0AJv"AAAz[0"#F)&B !AA%|6 a'+yy}$%fIaL % &  #$V9$)&M!$4 *:+;+;A+> ?!"&!((.eJuQx$8',Qx &!!$+ 0, V  & 1",E, .9$&U;EWYF HUO   v &e Lr(cg}g}t|jD]4}d||vr||dr|j|$|j|6t|}d}|r|d}d}|ddD]}|||dvsd}n|r;|dd|gz}|dz}||kDrKt ddj |zdz||z} |S|j||dd}t|}d}|r|S)NrurrzTsortvarnames: failed to compute dependencies because of cyclic dependencies between rr)rvrwr)rXror)r0indepdeprrrr^ws r)ryryQs4 E C $))+  tAw 478#4 JJqM LLO  CA A F QR ADGH%%  ab'QC-CAA1u;))C.)+/01  L LLOab'CCAA) * Lr(c t|s|Sg}t|djD]}g}|d|D]m}tjd|tj }|rg}|j drDt|j djdDcgc]}|j}}t|j dj}||dvrXd|d|vr.|d|djdd j|d nIdd j|d g|d|d<n)|rddd j|d gi|d|<ni|d|<||vr&|j|n|}td |d |d |j|p||d|<d|vr||d<|S|d|z|d<|Scc}w)Nrz2\A\s*\b(?P.*?)\b\s*(\((?P.*?)\)|)\s*\Zdimsr%rqr0rnr7r&r7z:analyzecommon: failed to extract "[()]" from "z " in common /z/. commonvars) hascommonrvrwrrrrr'r(rrrr)rro) r1rr~comvarsrrrrrs r)rwrwss$ U  J %/&&( )%x# AEq"$$PA776?%3AGGFO%D%J%J5%QS !GGISDSqwwv4467f %!U6]1%55f a(4;;($(8:<)$(8:8<f a(4"z#((4.1A%C$D(FE&M!$(*E&M!$J&%%a(PQRPSS`ab`ccghj NN1 7 8%h=%>5 (l L$L1J>l L7Ss$Gct||djDcic]\}}d|vsd|dvr||}}}g}|dD]}||d<|ddvrl||d|vr|d }|d|jvrtj |d|dtvrXt r |dt vrjt |d d |d <n|}t|||dz}|ddvr|ds|jdsd|vr|djdddk(rtj ||ddk(r|dt|d<|j | |Scc}}w)Nr0rnrr/rZr1rrqr5z T as_interfacesaved_interfacerrorrrrr pythonmoduler) rXrKrwr#r)r$crack2fortrangenrtrrrr) r1r5rekeyr maybe_privater/rlas_s r)rzrzs ---/ C U "heJ6G&G U M D 6]!. W:3 3AfIT$9iyM..00  6+yI%QvYi7#3>$6A C a#* - W:< <y!7!* W:  c2 &. 8   q !zX%+,V9 ai( KKN;< KKsEc>t|t}i}d|vr|d*d}tdkDrtdt |dd||fSt |dj D]5}|d|jddvr |d|||<(|d|d||<7||fS)Nrrz2buildimplicitrules: no implicit rules for routine rqr8r4)rJrN)rXdefaultimplicitrulesrr2rrvrwr)r1 implicitrules attrrulesr~s r)buildimplicitrulesrs(MIU   $ M{HeTZmI\H]]`ac ) ## % +0023 D$Q'++J7?VV',Z'8';M!$#(#4Q#7 #CIaL  D ) ##r(cjt|||}t|ttfvr|St d|)z2 Like `eval` but returns only integers and floats zr=)rrhr8r:r)rrhrrs r)myevalrs5 Q1 A Aw3, r!Z  r(z \A\b\w+\b\Zc tt|ii}d|dfS#t$rYnwxYwtj |rdd|fSt |}|D]}t ||kDrt jd|zdz|r0t jd|zdzt j}|j |}|sn |j |}|r<|jdd dd |jd }|j |}|r>> 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') rNrz\w\s*\([^)]*\b\b(?P.*?)\b\b(?P.*)rr6r7rg?g?)NNN) r8rrgetlincoef_re_1rrXrrrrr) rxsetrlen_err`rraeerlr+c2s r) getlincoefrs* q"b! "!Tz    Q!Qw FE # q6E>  99&*U2A 6 zz.25GGN JJqM  ZZ]HHX./q1RXXg5F4GHBBB2r2&ZZ]HHX./q1RXXg5F4GHBBB2r2&*ZZ]HHX./qQrxx7H6IJBBB2r2&ZZ]HHX./qQrxx7H6IJBBBBB'GaK1$S1):a7N      C#H s: ))AIAI-AI AI('I I! I!z\b[a-z][\w$]*\bc||vr||jdg}d||vrOt||sAtj||dD]#}||vs||vs ||k7s|j |%|ddD]>}|j|gxs t |||D]}||vs|j |@nt dt|dg}|||<|S)Nrurqz)_get_depend_dict: no dependence info for r)risstring word_patternrr)_get_depend_dictr2r)rqr0depswordswordrs r)rr/ s t|T x, $t* Xd4j%9$,,T$Z_= 'u$$$,LL&  ' !H $DXXdB':'dD9 $E>LLO $ $ ;DJ$r!}| ||<t1d|d|dYd}~d}~wwxYw) NrIselected_int_kindselected_real_kindrnr z \bkind\s*\(\s*(?P.*)\s*\)z-\bselected_int_kind\s*\(\s*(?P.*)\s*\)z4\bselected_(int|real)_kind\s*\(\s*(?P.*)\s*\)rq))z.false.False)z.true.Truez kind("\1")zselected_int_kind(\1)Frorr rr r#rzAget_parameters[TODO]: implement evaluation of complex expression rrrrr)dimspeczget_parameters: got "" on zget_parameters:parameter z does not have value?! )%rrrrrr)rrr islogicalrrsubrXrr(risdoublervrrrr iscomplexr2rrrrr param_evalrrrr8rr)r0 global_paramsrg_paramsrqfunc param_namesrkind_reselected_int_kind_reselected_kind_rerrepl is_replaced orig_v_lenv_rrr;rrnls r)rr s0 YY} %Fyy'H ++-DE,.FGK" d x !HTN " K d #" a [DGJ4G%G   q !"jjQ Aa!GGI)D " 4(A ) M1-A$(()A1EA  Ka(T!W^44!$QJ #Q(?(G"GLA#&a&:"5K'--a0B2w{GGBsG,224<X|'rtt|'||d<||'vs|(j |[nstu||red||vr^d,||dvr!tw||dd,| }3|3||dd,<n3d||dvr)tw||dd| }3||dd=|3||dd,<|)r|)||d!<|(rtt|(||d<d3||vs d||vrg||d<d;||dvr!d<||dvr||dj d;d||vr]g||d<t| jmD]+\}}|||d3s||dj |-||ds||d=ty||s >t{||d3| ||d3< Xt|jD]s}||dk(s d#||vr ||d#|d#<|ddk(s(d?|vr|d?|vrt}||||d?||<d@|vsP|d@}4|4j9dAd}5|4|5k( }6|5j9dBd}4|4|5k( }7t~d j|4}|rt|jdC|jdD\}8}9}}:t|8|9\};}<}=|8||d < |d?r |8||d?d <|;r d|;vr t-|;di| |;d<|;||d<|ntj|d }>t|jD]1}tatt||s!|>j |3dJ|vro|>jst|dJjt|dJjD]%}|dJ|D]}||>vs|>j |'|ddk(r-d?|vr|>j |d?n|>j |d|ddKvr|d}?|?|vrd||?vr ||?d|d<|ddLk(r(|>jst|jt|jD] }||>vs||= |Scc}w#t$rYwxYw#t$r8tjd |ztj"j| |<Y)wxYw#t.$rY wxYw#t.$rY wxYwcc}wcc}wcc}wcc}w#t>t@tf$rt'd*|d)Y wxYw#t\$r&}&d}$t|!jY}%Yd}&~&d}&~&wwxYwcc}#w#t.$rY,wxYw#t.$rY"wxYw)MzH Sets correct dimension information for each variable/parameter r0r1rrqr rnr/rr5z[A-Za-z][\w$]*z.*\b%s\brr4r undefinedz"analyzevars: typespec of variable z is not defined in routine r8rprXrorI)NNNNNNr8rrr rr rurrtrrsr%rz\n\nz z\n rz4analyzevars: could not parse dimension for variable rrz@:@r21)languagec||z |z Sr,r')r;r+rls r)solve_vzanalyzevars..solve_v s01A{(:r(c|j|dggdD]!}||vs|j|||#y)Nr)radd)rrv1coeffs_and_deps compute_depss r)rz!analyzevars..compute_deps sD*9*=*=a$*LQ*O!?B')~(, (4R(>!?r(rqFzshape(rr7z) == Tinrrrr&rrpure recursiver9rrrzanalyzevars: prefix (z) were not used )rrrrrr)rrrh)ErXrrrrxrr)KeyErrorrvrwrrcrrrrrrrr2rrrrreverserr'r(rrw param_parserrrXrrExprparsetostringLanguager as_symbolr linear_solvesymbolsr\ RuntimeErrorr l_or isintent_inisintent_inoutisintent_inplaceisarrayrrKrrrrrisscalarrrrOrrrisintent_callback isintent_aux)Br1rrr0genrlrr~svarsr5r+r dep_matches name_matchrrln0rdimension_exprsrdimr rurtrsrrtmpr#dim_charrrAd2dsizesolver_and_depsr;r all_symbolsrv_depsn_depsn_checks n_is_inputrsolverrall_deps is_requiredr4v_attraarprpr1ispureisrecr4rrrrrr neededvarsrqrrsB @@r)rxrx s1%8M9 99U6] #D W~#f T(A U6] U6] H vr* *-#J/CYU6]!C!F)!CC B.BACx"-dhhq"oq"AQB B E =D   G LLO $))+  D= LLOD"3E": ;FK-.44J $))+ K qM !'')AEEG$A KA KMB Q44 () )!$q'9QqT?;DG T!W $$q')jDGJDGAJ*_%23%7%:B*5d1gq*AQB B%-'Qv01 T!W $Q//GN+E2DB/0A23Q'. T!W $a00GN+F3DB/0A34Q'/ a 7:&D LLN"$DGJ /K ,C+ !Ra5K'QR5;;=!B/CrUh&ekkmQr2FrUh&ekkmQr2FrUg%qrU[[]Ab1ErUf_abEKKM1R0D)$q'15DGtAw.,.Q)1?1G1M1Me1TUAaggiU:iiR0d1gh&77 GH-44S9 : "F<<&9D<<5DT!W,+/&QQ..t4D%tAw.,.Q)&>&;Q;W;WX];^'_a '_`8DGH$55 GH-44Q78"F$d1g-+-Q(1?1F1L1LU1STAaggiT7DGG$44 GG,33A67!EW+ !X{$q'1')Q $",:3,?,E,Ee,LMqM?3A (62'(3hsCHH}&Z+As399%@2w!|r !U2w!|1(9!2a5\2w!|!$X]]%8%8"!=B "R! !NNH4E4E4G4GNH+-!&vKA ( 2 21 5A$~~a0!G+0+=+=a+@DAq56!%;36aiik2BK$/$6$6qyy{$C5@*7/0'(vv~%&FF*7*76=d6l5J 2-K:.=*GK(//2?3B $q' !fo!uV}:L !W[[2.FH0k>.004Q9JtAw%d1gk&:;K1DAq&5&9&9!&->-@-@(5(B/3Q 67C$JQ 1#*$q'#9+12aSaS(A8CDGG$4 /3 #+47#:8:DGH$5#'tAwx/@#@$(GH$5$<$F&*1gkk*b&AG#%==#:)+)a(&(Q #$q'*"55$q'*"55Q #**:6tAw&$&Q! !2!2!454DAqaQ)0034Awx(Q)Q +DGCL&AQ [MB^$))+ +^ f a $Qf W~+u$xD)@(a$uX2GHDGu$xB**VR0C"$)mF["5B!#s]E$Q--b1A:HGGFOQWWW-=;?7(D%;H$h<08 J.6Q +!$XDLU8_ 5j A&%3!)9=(26(:B:HJv$67ADGN3%6@DGN3#2:DGJ/!&1$q'6&BDG &1$q';&GDG3Dx4I3JJ[\^U+^X W~VV 5 5=53F#FGJ5=1Jdiik" %A4t%|4T!W=!!!$ % e    d5>#6#6#89 :%.--/0 -w*-A *"))!,- - >Z '5 !!%/2!!%-0 >7 7=Dt|DJ 6"&t*X"6h >V #   d499;/ 0diik" A "G  Ki "D   " K!#K1,=rtt!D!J!J A K2!!4V"(`UN' H=(()uB0F(4!G /3G25emmo2FK!G*7t )! !(1!)$(!)s; |8 |=} 4~2~!%~1<~6 2~;,  A/,!A@! 6A@& A@6= }  }  =~ ~ ~~! ~.-~.#,+,/ A@ 8A@ @A@ @& A@3@2A@3@6 AAAAAz\A[a-z]+[\w$]*\Zc v| t|||}|St|dks|ddt|dz dk7rt d|d |dd j d }t|dk(r|d j d }t|dk(r(t |d |}tdt|dz}nOt |d |}t |d|} tt|t| dz}nt d|d|jdr|ddn|j d }g} |D]!} t| ||} | j| #tt|| }|S#t$r}|}td|d|dYd}~|Sd}~wwxYw#t$r}td|d| dYd}~ud}~wwxYw)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. Nzparam_eval: got "rrr2rrhzparam_eval: dimension z can't be parsedr r&rrz.param_eval: multidimensional array parameters z not supportedrr) rrr2rXrr(rrr8rr)ruzip) rrrrrrdimrangeboundlbounduboundv_evalitems r)rr s& ;Q&)A 7|a7#5S\A%5#56$>1':KLMMq}""3'H 8}A;$$S) x=A  V4EQE Q/H !f5F !f5FS[#f+/:HI#9N45 5LL&1RA44S9A F >h/D  d  S6 "#A HK ;A 'uE!b9 : : ;> > 'uE$< = = >s/ E(1 F( F1F  F F8F33F8cd|vr`|d|jd}||jddz|jd}tt||}t |||S||vrt ||S|D]}t j d|zdzt j}|j|}|sA|jdt ||z|jdz}|j|}|rF|S) aRecursively 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 r6Nrr7rrrr) rrfindr8rrrrrrr)r#rdnameddimsr[rr`rs r)rr sr ax,166#;!&&+/!''#,/Kv./6%='(( f6!9~ "A::$q(+==rttD 1 AGGH%q N#%&WWW%56JJqM  "r(c|}tj| }|rt|\}}t||d|}d}|D]<} | j } | t j t jzvrd} || z}>|ddk(r|dz}n|dz}|}||dvs||dvr|dz}||dvr ||dvr||vr6d } |t| z|vr| d z} |t| z|vr|t| z}|r |d|<|S||dvr|dj|i|d|<d |vr%||d |d zvrt|d|d |d|<|S) Nr0e_rr r_er5rrr3r4r) analyzeargs_re_1rrrrrcascii_lowercasedigitsrrrx) r+r1r5orig_a a_is_exprrratnarr~s r) expr2namerE" s F$**1--I#5e#< y q%- ?  A A..>>aB   b6S=cBdB 5= Av$6CA5= Av$6Dy #a&jD AA#a&jD AJf a H E&M !$V}00\w+)|)\Zz*\A[+-]?[\d.]+[-\d+de.]*(_(?P\w+)|)\Zz \A\(.*\)\Zz\A(?P\w+)\s*\(.*?\)\s*\Zct|trddiSt|trddiSt|trddiSt|tr|St t |)Nr4r7r5r)rr8r:rruAssertionErrorr)rs r)_ensure_exprdictrJg s_!SI&&!UF##!WI&&!T a !!r(c ||vrt||S|j}tj|rddiStj|}|r?d|j vr)|j drtdt|dddiStj|}|r?d|j vr)|j drtdt|dddiSdD][}t|| jd |zd zDcgc]}|jc}D]}||vst||ccS]i}tj|rt|d d ||}ngtj|}|rP|j d}t|j d||}|rd |vr|d =|s|d|vrt||dS|ddvrdddidS|stdt|d|Scc}w)Nr4rrqz6determineexprtype: selected kind types not supported (rr7r5)+rrrr2rirr rnrrr"r)r4rpz4determineexprtype: could not determine expressions (z) type. )rJrdetermineexprtype_re_1rdetermineexprtype_re_2r!rr2rdetermineexprtype_re_3r'r(determineexprtype_re_4rdetermineexprtype_re_5) r%r0rulesroprrrrns r)rrs s t|T ++ ::+E"Q%L99 Aw%'#sDD B4:,i X Z H+[sHrc6t|d}t|trA|D]:}|r%|ddvr|dtvrtr |dtvr*|t |||z}<|Sd}d}d}|d}|dk(ryg} d|vr|d}d|vr[|d} |dD]/} t | || } t| | r| j| 1|dd k(s| rd d j| d }d} d |vr9t|d jD]} | |tz| d|d | } |jdgdd}|d k(rd|vr|jd|r"| |tzdd j|d|} d}d|vrt|d|tz}d}d|vrt|d|tz}|dk(rd}d}d|vr$d|dd }|d| vr| j|dt |d|tz|}t!||d| |tz|} d}d|vr |sd|d}d|vrNd}t|dj#D](\} }||tzd| d d j|d }*||z}|dk(r|dk(rd}|||d|||d|| || |||d|d|}|S) Nr r1rrqrrr5r0rr6r&r7rrr callbackintent(z) rrrrz result (r/rz! in rzentry rrzend )rXrrvr#r$rrErr)rrwrrr use2fortrancommon2fortran vars2fortranrK)r1rerrirhrrqr5 blocktypeargslr0r+rr~ intent_lstrrrr/mess entry_stmtsrs r)rr sS C% LAQwZ#==V9 )6)!;(ClKKC  L F D DgII E V} V}v A!UE*A$T!W- Q  >Z '5sxx'q)DU"e./4467 RA #-E:L4Ma4P R  R8R(+JJ:#;*%,cGmHHZ0$8 C ~%,g 6 F5hw? "" F5U8_-Q/ ?% ' LLx ) E&M3=| TD  uV}eS7] OD D |uV}o&% w--/0 RDAq(M#-qc388A;-qQK Rk!L T^%; VYdFD:JCQUW]_cehjsuy {C Jr(c d}t|jD]A}|dk(r||ddj||}$||d|ddj||}C|S)Nr rzcommon r&zcommon /z/ )rvrwr)rrerir~s r)rYrY s{ C &++- B =E#gchhvay&9%:;CE#hqcCHHVAY,?+@AC B Jr(cd}t|jD]}||d|d}||ik(r|r |ddk(r|dd}%d||vr ||dr|d}d||vr]||drUd}t||djD]1}|||d|k(r |||}d}|||d ||d|}d}3|s|ddk(s|dd}|S) Nr zuse r&r rz only:rrz=>rP)rrerirrr~s r)rXrX s4 C #((* cU$qc# q6R<s2w#~#2h  SV AvE.C CF?s1ve}A#a&-,,./ Au a(( E!QC.CA E!QCr#a&-*:);cr(C%& Jr(c|d}g}|D]-} td|}||s|j|/|S#t$rY=wxYw)Nr  isintent_)globalsr)r)rjrrir rfs r)true_intent_listre sg h-C C# # IfX./Av 6"# J    s< AAc t|d}g}|D]}||dvs |j|d|vr4|dD],}||vr||vs |j|td|d.d|vr|j|d|s4t |j D]}||vs|j||D]/}d||vr7||dD],}||vsd||vs|||dvstd|d |d .d |vrn||d vrgt ||r ||d |}||d |}t||r ||d|}||vrd||vrd} |dD]} || dk(s | ddk(sd} n| r||vrt|td|d||dk(r|ddk7s|jdrd||vr?d||vrd||dvr||vr ||d |}t||td|d;||d} | dk(rd||vr| d||dd} i} d ||vr ||d } nd!||vr||d!} d"| vr| d"d#vr | d$| d"d} n>| d"| d"} n3d%| vr | d&| d%} d'| vr | d(| d'd} n| d} nd'| vr | d)| d'd} d*} d||vrN||dDcgc]}|d+vr| }}|rd,|vrd-|vr|jd-|r| d.d/j|} d/} d0||vr!| | d1d/j||d0d} d/} d2||vr+t||}|r| | d3d/j|d} d/} d4||vr!| | d5d/j||d4d} d/} d||vr!| | d6d/j||dd} d/} d7||vrF||d7}||dd8vr) t|}d|jd/|j d}| d9|d7|} n| d9|} ||| }2|Scc}w#t"$rY/wxYw):Nr r0rzvars2fortran: Confused?!: "z" is not defined in vars. rruz;vars2fortran: Warning: cross-dependence between variables "z" and "rr3zintent(callback) z external z optional r4rr/rqr1rrz*vars2fortran: No definition for argument "rmrrnrz(vars2fortran: No typespec for argument "rhrrr6r7rorpr)rrz*(rXz(len=rIz,kind=z(kind=r)rz intent(in)z intent(out)rr&rr7r rWrtzcheck(zdepend(rq)rr z :: )rXr)rorrvrwr isoptionalshowr2rrrrerr5imagr)r1r0r5rerrinoutr+r#rrlvardefrrrrrrs r)rZrZ s C D  f  KKNu|$ RADyD=KKN1!4OPR  RU E*%& diik" A} A d$ tAw !WX& i9T!W!4d1gh>O9OUVWUXX_`a_bbfgi i % A{);$; a)cU"3A37E#is+C$q'"cU)A3/DyZtAw6D6] & >ajJ&>D  D= J @4H I  f W~+uyy/B  T!W $T!W$tAwz7J)J9 E#is3C aM >qcF G a$ V  d1g 5xqa!4 5Q7F T!W $Aw~.H tAw &Aw~.H (?} *"82hsm_A6"81Xc]O4 h xuXe_$56F!"86(6*:);1="81 x xvhv&6%7q9F  a #Awz2.! ,.D.  4$9N  M*"82chhtn%56 $q' !xs*SXXd1gk6J-K,LANFA tAw "47+C"8A3gchhsm_A>A d1g xs&$q''2B)C(DAFFA tAw xs'#((4783D*E)FaHFA $q'>Q AAwz"&CCQAAFF81QVVHA.AxtA3as+FxtA3'FcU6(#Id$J JM.@!s O-&(O22 O>=O>c4tddt|ttddgat t d}tddt D](}td|jddt||}*tddt|}t|zS)NzReading fortran codes... rzPost-processing... z"Applying post-processing hooks... z rzPost-processing (stage 2)... ) r2rr<rrtrpost_processing_hooks__name__traverserg)filespostlisthooks r) crackfortranrs s (!,E9% "A&K1&H 115%,"T]]O2&*Hd+, ,a0(#H  !!r(cDt|dz}d}dtz}||z|zS)NrzE! -*- 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)r1pyfheaderfooters r) crack2fortranry s< 5 !D (CF F C<&  r(cxt|txr)t|dk(xrt|dttfS)Nr2r)rtuplerXr8r)objs r)_is_visit_pairr} s8 sE " /CA  /3q6C:.0r(ct|r1|ddk(r|S||||g|i|}|t|sJ|S|}|\}}nd|f}d}t|trEg}t|D]4\} } t | | f|||gz|g|i|\} } | $|j | 6nPt|t r>i}|jD](\} } t | | f|||gz|g|i|\}}|$|||<*n|}||S||fS)aTraverse 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. """ rrZN)r}rrvrror)rurK)r|visitparentsrr5kwargs new_resultparent result_keyr[r new_indexnew_itemrnew_key new_values r)roro sg8c q6^ #J3A$A&A  !!*- --  C #t %cN ,LE5"*E5>5+2fX+=v#<,0#<4:#< Ix$!!(+  , C  ))+ 0JC!)3,*1VH*.fix_usagesB{W,u4guEuw)@@' r()rrtrr0rrqrN callstatementz (? `z` )rK ischaracterrrr2)r6rrr5r parent_key parent_valuerrr vars_dictrrvds r)%character_backward_compatibility_hookrsv 'r{J JC ++r{1~'''BKN r{1~'''BKN  I $??, :KGR2%gy9  :  BKN6*  $??, OKGR2FF!G+e3S7]IO  O   ( AcU;""'yk>?@ BYr(__main__rz-quietz-verboser2z-fixz?Use option -f90 before -fix if Fortran 90 code is in fix form. z-skipemptyendsz--ignore-containsz-f77z-f90rz-hz-showz-mrzUnknown option 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). zWriting fortran code to file r)r)r)r&)rUr,)r N)Nr )r )NN)rr)rF)r F)__doc__rrrrrrrcr-pathlibrr ImportErrorr rrauxfuncsversionrur rrrrrrrrrrrr!rrr rr>rrr=r%rr$r&rr#r"rr*r2 _MAXCACHErrrnrzrrrrwr{r}rrrrrrrrrrrrrhrbeforethisafter fortrantypesrOrrLrM groupbegins77r groupbegins90r groupendsrJendifsrImoduleproceduresrUrNr?r@rBrCrFrGrHrArDrErQrTrXrPrRrSrKSr:r;rr,rVcrackline_bind_1rr<rWr'rlrr#rrrrrrrrrrrrYrrrrorprLr9r'r0rrrxryrzrVrXr[rcrgrtryrwrzrrrrrrrrrrrrrrrrxr>rrrErvrMrNrOrPrQrJrrrYrXrerZrmrsryr}rorr)rnrpfuncsrff2f3 showblocklistargvrrorrrOSErrordetailrqrvr/r'r(r)rs IT   $ ""                 2          #L  !3A)623 6A)956    Ae)HQKKE  ,1 3RTT:AA "**12448??"**12448??"**12448>>:83>4'+!_DFD rzzr<t<>FGNO r=->>FGNO7 RZZr9i66>?DE  rzzy&&$77?@GH )#r+-=tDDbddL"**88"$$@AKL2::o1889;?@KL"**88"$$@AKL"**88"$$@AKL"**88"$$@AKL 44bdd<=EF 66>?HI2::::BDDBCNO ?.QQRTRVRVXYab 2::@@"$$HITUbjj00"$$89?@ bjj00"$$89?@ rzz22BDD:;BC 66>?HI 44bdd<=EF RZZ..67<= "**66>?IJ 44bdd<=EF %"**_8M&MOQOSOSVXVZVZOZ[]oo2::9244ABMN(A244H2::A244HRZZ kmomqmqr[%| $ & @ KRTTS %&(dd,"**rtvtxtxy"***+-441!bjj@"$$H ;= rzzHJ $$A244H    u@p(8bjjErttL rzzI244Q rzz9244A 235449"**GIKIMIMN "JfR7,v6   <@\~D'T*Z$&!"**^RTT2AHrzz,bdd3 ,4$"  $(*bJ( "**W%++  DN 2::12448; |M`  D6$$6=#$DbddK#12449#M2448#$ErttL ")+( ZGT0 z@"" !0 "$D?"D9 xBC z E E A B BM XXab\1 7  qTS[A (]EG *_GE &[VXY[M"N " "M % %N &[I"N &[I#NM $YB '\M $YB qTS[ od1gYb1 2 BK BM  2Q  Q LLOc1d }   E"H/[0A/B"EqIH% +s # q GGCL  XQ[mDo 2)F:R011 2"  s5k )k"k7 kkk4 k//k47l