VfiLLNdZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z  ddl Z n #e $rdZ YnwxYwddl mZmZddlTejadadadadadad 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;ej<dej=j>Z?ej<dej=j>Z@ej<dej=j>ZAej<dej=jBZCgdZDgdZEdZFd ZGeHdfd!ZId"ZJd#ZKej<eJd eKeKd$fzej=d%fZLej<eJd eKd&zeKd&zd$fzej=ZMej<eJd'zej=d(fZNej<eJd)zej=d(fZOd*ZPej<eJd ePePd$fzej=d(fZQePd+zZRej<eJd eReRd$fzej=d(fZSd,ZTej<eJd eTeTd$fzej=d-fZUd.ZVej<eJd/eVeVd$fzej=d0fZWd1ZXej<eJd eXeXd$fzej=d2fZYej<eJd3zej=d4fZZej<eJd5zej=d6fZ[ej<eJd7zej=d8fZ\ej<eJd9zej=d:fZ]ej<eJd;zej=dfZ_ej<eJd?zej=d@fZ`ej<eJdAzej=dBfZaej<eJdCzej=dDfZbej<eJdEzej=dFfZcej<eJdGzej=dHfZdej<eJdIzej=dJfZeej<eJdKzej=dLfZfej<eJdMzej=dNfZgej<eJdOzej=dPfZhej<eJdQzej=dRfZiej<eJdSzej=dTfZjej<eJdUzej=dVfZkej<eJdWzej=ejlzdXfZmej<dYejldZfZnd[Zod\Zpej<d]ej=Zqej<d^ej=Zrej<d_ej=Zsdd`ZtdaZuddcZvddZwddeZxej<dfej=Zyej<dgej=Zzej<dhej=Z{ej<diej=Z|ej<djej=Z}ej<dkZ~ej<dlZej<dmej=ZdnZdoZdpZdqZdrZdsZdtZej<duej=Zej<dvej=Zej<dwej=Zej<dxej=Zej<dyej=ZdzZd{Zd|Zd}Zdd~ZddZddZddZdZdZddZddZddZdZdZddZdZddZej<dej=ZdZej<dej=ZdZdZdZdZdZddZifdZdZej<djBZdZdZej<dej=ZddZdZgfdZdZej<dej=Zej<dej=Zej<dej=Zej<dej=Zej<dej=ZdZifdZddZddZddZdZddZgadZdZdZgdfdZdZÐt|eæedkrgZgZdZdZdZdZejddD]2Zed kr eddkrdZȌedkrdada$edkrdada/edkrt&r e1dddadaMedkrdaVedkrda_edkrdadajedkrdadadawedkrdZɌedkrdZˌedkrdZʌeddkredeeͦderdZeaerdZeaerV eeͦeƠeͦ#e$rZedeӛdYdZ[ӐdZ[wwxYweǠeͦ4t&st2rt4s e1ddeeƦZt0rge1det0ddeeԦZet0dǦ5ZeȠeզdddn #1swxYwYereHeԦdSdSdS)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 c|dadadadadadadadadada ga da tgia da dadagaiadadadagagagagadadS)Nrrrr r r ) strictf77sourcecodeformquietverbosetabchar pyffilename f77modulename skipemptyendsignorecontains dolowercasedebug groupcounter grouplist neededmodule expectbeginskipblocksuntil usermodules f90modulevars gotnextfilefilepositiontextcurrentfilename skipfunctions skipfuncs onlyfuncs include_pathsprevious_contextFc:\PYTHON\DbComparer\venv\Lib\site-packages\numpy/f2py/crackfortran.pyreset_global_f2py_varsr*sIN EGGKMMNK ELr"ILKOKMKOMIIMr(ctsdStsG|r$tjt tj|dSdSN)rrsysstdoutwriter )lineflags r)outmessr2s^    / J  - . . . r(2zabcdefghopqrstuvwxyz$_typespecrealijklmninteger)3intdoublefloatcharshortlongvoidcasewhilereturnsignedunsignediffortypedefsizeofunionstructstaticregisternewbreakdogotoswitchcontinueelseinlineexterndeleteconstautolenrankshapeindexslensize_imaxminflenfshapestringcomplex_double float_doublestdinstderrr.typedefault_bnct|tvr.td|dt|dt|S|S)Nzrmbadname1: Replacing "" with "". )badnameserrmessnames r) rmbadname1rr sB xL$LLLLLMMM~ Kr(cd|DS)Nc,g|]}t|Sr')rr.0_ms r) zrmbadname..s + + +rJrNN + + +r(r'namess r) rmbadnamer{s + +U + + ++r(ct|tvr.td|dt|dt|S|S)Nzundo_rmbadname1: Replacing "rlrm) invbadnamesrorps r)undo_rmbadname1r~sD {TtTT[=NTTTUUU4  Kr(cd|DS)Nc,g|]}t|Sr')r~rus r)rxz"undo_rmbadname..s 0 0 0BOB   0 0 0r(r'rys r)undo_rmbadnamers 0 0% 0 0 00r(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`t,tj|j}nt dt j|}t|d5}| |}| tj rd}n^| tj tjfrd}n0| tjtjfrd}nd}dddn #1swxYwYt|||S) 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+sB%%/99>>@@IR2233 (D ! ! #W,,v&&C~~fo.. #&!4f6I JKK ## >?? ### # # # # # # # # # # # # # # # $ 2 2 22s1BDDDc(d}t|jtvrd}t |d5}|}d}t |rd}nt|rd}d}|dkrw|ru|ddkrM|r9|dz}|ddkrt|d d s|d d d krd}n|}|dkr|ud d d n #1swxYwY|S)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_formatrJsjF E{{!!%;;; %  &!!     AA T " " AF!eeeAw#~~$**,,~QGtOORaR(A(AOd2b5kUXFXFX!F##%%D !eee&&&&&&&&&&&&&&& MsB9DD D c |s8tttttt t ttf }|gkrdSt}d}d}d}tj dtj }tj d} tj d} tj d} |r |ddd \}} d gd td Dz} datj|t } |}nO#t"$rB}t%d|d|d|dd}~wwxYw|sn|rda|ada|} dadat,jtd}t3tjt8vr!t;|st=|sdan%t?trt=|sdatrt@antBatEdtGtdttrdpdd|$%dd }|dks|ddvrn|dd}|dkd}tM|d\}}|d z }|dddkr#tM|d z|ddzd\}}d}|'dkrtdkrnd}[tdkrS|dd!vr6|ddd"krd#|ddz}d}n*d}d}trtQ|d$kr |dd$}|d| vrt%d%tG|z|rtr2tQ|dkr|dd ks||d&dz}d}d}n| )|}|r|*d'}|r1|| )|*d'z}d}d}nhd#|ddz}|r|}n|}|}|}n'" is met. NFr z*\s*include\s*(\'|")(?P[^\'"]*)(\'|")z(?P.*)&\s*\Zz(\s*&|)(?P.*)z.*?'''r )r r  c,g|]}t|Sr')strrus r)rxz#readfortrancode..s777r3r77777r( )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. )7rr r!rr beginpatternrrrrecompileIrange fileinput FileInputrrUnicodeDecodeError Exceptionrlineno isfirstlinerrsplitextrrrCOMMON_FIXED_EXTENSIONSr_has_fix_headerrbeginpattern77beginpattern90r2repr expandtabsreplacesplit_by_unquotedrrXmatchgrouprorstripiscstyledirective ValueError filelinenoisfilereadfortrancodedirnamer%joinpathsepclose)ffilerr saveglobalslocaldolowercasecont finallinell includelinecont1cont2 mline_markl1 spacedigitsfinlmsgextis_f2py_directiverl_ origfinallinerlcmfn include_dirs foundfileinc_dirfn1s r)rrds  6!#3_nV_ %+6  {{" DI B*5rt==K J, - -E J- . .EI&&J  2r FB%77U2YY7777K  eh 7 7 7C]  AA!   CLLNNSZZ\\!$      ??   9! !llnnOKBI"N'""?33A6CO$$+11337NNN(++O/>q/A/AO 00 (9K9K (!' .- - GO,,,,nn!/i6B668 9 9 9 LLNN " "63 / /r''uH$$#2#Ar'' "#As++B S bqb6<<>>W $ $$Q[2abb6%93??DAq $  7799??''   U " "t000QqS6<<>>V++!ABB%A(,%% D(-% q66B;;#2#At;&&!GIMa!QRRR I CFFQJJqts{{!ABB%Z " KKNN(A ekk!nn226:::B "I$&MM !ABB%A''$&HHJJ $& $&MBB v % % C6MMj.>.>q.A.AMHBMOOOBA!''++HHJJ AA $GGFOO %++a....v666 " ##4E gIZ[]I^I^ g egII "I " TMDD]tNG[G[]]__ _4 NN  q /2877   m , ,  "Bw~~b!! BzCCCCCGOOO44 68E F  +G',,w33Cw~~c**$% ' !LLLL!BGR"*//,"?"?"?"?ABBB Jy ! ! ! {]~HHJJ  M0 1or433-((A WWV__ 7>>"   > B:Q ? ? ? ? ?GOOO<<= MLI'  gll7B//7>>#&& !I#CJaHHHHE >HHHHbjool;;;;=>>>  9IIKKK D 2q9D 6 % %+++s:D E=EEzN\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 optionalr rr )r requiredr rr )r publicr rr )r privater rr )r intrinsicr rr )r intent|depend|note|checkrz \s*\(.*?\).*intent)r parameterrz\s*\(.*r)r datarrr)r callrrr)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 tdt|zr Jdtjddtj|ddtj|ddd }||}|r$|}|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__,PP/PPP -  !!'7ry44777-RYz**---00 "("2"2 3 3A  A) KKMM( QwZ(( ":r(cg}t|dD]2}dD]}||d}||3d|S)N@,@z(),r,)markoutercommasplitrappendr)argslinearrs r) _simplifyargsr1sq A H % % + +E 2 2 " "A !S!!AA  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*\)cpt|d\}}|rtd|std|sq|dksJt |t|d\}}|r-t ||t|ddd\}}|-t ||dS|dkrwdat diat iiat gia gtt d<itt d<dtt d<dtt d <d a d a dS|dkr d}trtt krd }t |krtd t t d t tdtdtt dz tt tt tt dz d d<tt =t dz at |ktr tt krtt dz tt tt tt dz d d<tt =t dz att dz tt tt tt dz d d<tt =t dz ad a dS|dkrdSd}tt t"t$t&t(t*t,t.t0t2t4t6t8t:t<t>t@tBtDtFtHtJtttLfD]&}|d|}|rn|dz}'|stN} dtcxkr t krnndSdtt vrbtt dD]H} | tPvr tP| } dtt vr| tt dvrHtSjd| ztU|tRj+} | r| | ,d} t[| ,d} | r d| d| d| ,dd}n d| d| d}t\d|}|s#tdt |ddSt_|d|dSJt`dks7t`dkrEtb23drda4tdt zdS|ddkrdtcxkr t krnnt dz att krdSt dkrtkd t zt8d|} | r| ,d!tt ksZtkd"t | ,d!d#t tt d$tltt krd a tt dz tt tt tt dz d d<tt =t dz atnsda8dSdS|dd%krCdtcxkr t krnn t dzadSda9t_||d|da8dS|dd&krdS|dd'krt_||d|dS|dd(kr.ttrdSdtcxkr t krnndSt a dSdtcxkr t krnndSt_||d|dS))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[^@]*)@\)@.*\Zr"argszcallfun (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_1r}rmarkouterparenrrr1callfunpattern analyzelinerr!rendswithr&rr rrrr)r0resetr has_semicolonsemicolon_lineflr1patrre_1rqm1m2r0s r)rArAsU)s33A} 5a8>>tDD /288>> zzz4;;zzz0s;;n N dE " " "#4^ABB5G#M#M D. N $ qyy !2& "B' !2& +- < (+- < (,. < )+- < (  qyy   \\99BR G,''''i: ; ; ; l n n n lQ& ' . .z,/G H H H6? 6MIlQ& ' +F 3,''!+LR  \\99 lQ& ' . .z,/G H H H6? 6MIlQ& ' +F 3,''!+L lQ& ' . .z,/G H H H6? 6MIlQ& ' +F 3,''!+LL rzz D /=/ +}n jo/@}Z' &  FLL     Eax J%  / / / /< / / / / / F *\2 2 2"<0=  ;&&&t,D:l#;;; S_H`amHn@n@nXLtSUcdhUiUikmkoqq BHHX$6$677B%bhhv&6&677A6S$SSSSbhhx>P>PSSS5$55555&q)//55AbSWX\S]S]bbbddd9d333FF  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\bcr|dgD]}t|rdS dS)Nrsrr)get_intentcallbackpatternr)vdeclr0s r)_is_intent_callbackrsF YYz2 & & ! ' ' * * 11  1r(cxd|}t|}t |||rc|d}|rd|dDng}|d||dfSdgdfS)Nr attributesc6g|]}|Sr')r)rvr0s r)rxz*_resolvetypedefpattern..s 555q555r(r+rqparams)rr-typedefpatternrprintr)r0rfattrss r)_resolvetypedefpatternrs 774::<< D   d # #B $OOO ;&&9>F55EKK$4$45555Bxx(:(::: T>r(ctjdtj}||}d}|rN|d}|d|||dz}||fS)NzObind\(\s*(?P[^,]+)(?:\s*,\s*name\s*=\s*["\'](?P[^"\']+)["\']\s*)?\)r)rrrsearchrstartr)r0patternrbind_statements r)parse_name_for_bindrs|jkmomqrrG NN4 EN 9QNU[[]]N#d599;;<<&88  r(c<t|\}}t|}t|}|r?|d|d|d|fSt |}|r7|ddz|dzdz}|gddfSt |}|r,|d|dddfSdgddfS)Nrqr:rschemer;r<)rr\nameargspatternrroperatorpatterncallnameargspattern)r0 bind_cnamerfrqs r)_resolvenameargspatternrs*400D* $  D   t $ $B Rxx&!1!1288H3E3EzQQ   t $ $B $xx!!C'"((6*:*::S@Rt##  " "4 ( (B >xx&!1!14== T4 r(c E|d}|dkrdatr |dvrtstdkrt jt dd}td|d da tdzad tt<itt<gtt<gttd <ittd <d ttd <|ttd<dttd<da|dv r]|}t!jd|t jrd}nEt!jd|t jrd}n"t!jd|t jrd}|dkrHt'|d\}}}d|ittd |<g}d} n't)|d\}}} } ||dkrd}nd}|dvrtd||tfa|r:t+dt-| d D}ng}d|vr,d|vr|dd|vtd!d} d} |d"vrd} d#ttvrdS|ttd#vrdSttD]} | d|krdS|ttd$vrdSd%d&d"|}t0r(t2d'krtdkrtd(zad} |d)vrd} tdzaitt<gtt<| rt4dkr%td*t7t0zdd+tt<dttd <t0ttd<dttd<gttd <gttd,<gttd$<ittd <tdzaitt<gtt<| r$t4dkrtd-tzdd.tt<d.ttd <d/ttd<ttdz dd0ttdz dttd<gttd <gttd,<gttd$<ittd <tdzaitt<gtt<|tt<|ttd <|sd1|d2d3z}|d4ttd5<t;|ttd<| ttd6<tdkrtttd<nt0rDtd7kr9ttdz dd0tttd<nLttdz dd0ttdz dttd<t=ttD]-}tt|stt|=.|ttd#<gttd <gttd,<gttd$<ittd <ittd8<|dkrgttd9<|d"vr|ttd(z d,vr.ttd(z d, |tCj"ttd(z d ttd < ttd |ttd |d#d:=n#tH$rYnwxYw|d;vr| rt!j%tL| }|r|iittd<<|d=ttd<|d=<|d>r4|d>ttd<|d< tOttd |ttd(z d dttd |<n#tH$rYnwxYw|d?kr| r| ttd vrg|| ksatOttd |ttd | ttd |< ttd(z d$ |n#tH$rYnwxYw|d&krtPd|d4d2z|z}|rMtS|d|d\}}}}tU|||||d"vrttdz  ttttttdz d'd <tt=tdz attdz  ttttttdz d'd <tt=tdz adSdS|d8krt)|d\}}} }|~|r:t+d@t-| d D}ng}| Jt7| |ttd8|<d8|tfadSdS|dkrJtS||d\}}}}tU||||}| dA|tfadSdS|dBvrttd }|d+}|,dC}|dkr|dDkrt[|,dEd(z }|d|dzdCz||dzdz}|,dC}||ddCkrrd#ttvr^tdF|d|d|dG|dH.ttd#z}|dkrd}d}n)|d|+}||d(zd}t-| d }t_|dkr5|d}tdIdH.|ddzd}dJt-| d DD]}t`|}|sL|dKvrd}ngtc|2tdL|dMt7|dNkt;|d}|dKvr|dOvr||dz }||vri||<|dPkr||dz}|dDkr|d|z}tf|r|ttd#vrtdkrdQttd(z dvrtdR|ttdkrWtdS|dTttddUttd# |n&tidV|dWntidX|z|dYvr|}d||vr"||d |n |g||d<|d:krttd d krtdZi|ttd#vrd,ttvrgttd,<ttd, ||}|ttd <| dA|tfadSdS|d[krGd\|d dHDttd]<dS|d^kr|.dkr|-|1z}-J|.d(krb|,+},|,EdHr|,dd+},| |,|-g|1},d}-d}.|.d(kr\|,+},|,EdHr|,dd+},| |,|-gtt7d i}2d}|D]!}3|3d+FdH|3d+c|3d<|3d<|3dEdrtd|3ddtt+dt-|3d d DD]M\}4} | Edrtd| d/d|3dvrtd|3ddS|2H| i|2| 7dg}5t|2| }6|5dkkrt!jJd|3dn|3d dH}7 |6rdd.|7dn|7|4}8n #t$rtd|7Drg}9|7D]}:d|:vr |: d\};}<|9M|<+gt|;zX#t$r*|9 |:+YwxYw|9 |:+|9}7|6rdd.|7dn|7|4}8YnwxYw|2| 7d`}=|=r|=|8krtd| de|=d|8dc|8|2| d`<| }O#|2ttd <|r dA|tfadSdS|dkrE|d+}|ddksd|z}g}>t!j d|d(\}}?}@|?+}?|?sd}?|> |?|@gi}Adttvrttd}A|>D]o}1|1d|Avr g|A|1d<dt-|1d d DD]%}|r!|A|1d |&p|Attd<d|?tfadS|dkrt!jd|dt j}|r|2}Bdttvrittd<|d}ittd|<d}Cd|Bvr!|Bdd|Bvr |Bdd}C|Cttd|d<d|Bd dHD}i}D|D]}3d`|3vrt!jd|3t j}$|$rP|$d+|D|$d+<n&tdt7|3dGn|3|D|3<|Dttd|d<dSdSdStc|2tddS|dvrdttvrittd<ttd}E|ddkr[d|EvrWt|Edtr |Edg|Ed<|Ed |ddS|d|E|d<dS|dkrdtt4rtddSt}Ftt|Ftdd(|ddSt4dkr2tc|2tddSdS)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. r>rN)rrrrhr.rz=analyzeline: no group yet. Creating program group with name "rmprogramr4r5r6rqfromskyfrom)rrrz block\s*data block datazpython\s*module python modulezabstract\s*interfaceabstract interfacerhr#rs _BLOCK_DATA_r ) interfacerrz2analyzeline: No name/args pattern found for line. c6g|]}|Sr'rrvxs r)rxzanalyzeline..s6JJJ"# ggiiJJJr(r*z.s6"N"N"N&'#$''))"N"N"Nr(variable)rrr r rr r r ::rrjz"All arguments will have attribute rr+zXanalyzeline: cannot handle multiple attributes without type specification. Ignoring %r. c6g|]}|Sr'rrs r)rxzanalyzeline..s EEE!''))EEEr(r r z&analyzeline: no name pattern found in z statement for . Skipping. >operator 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 )r r r rr r z(analyzeline: ignoring program arguments rc6g|]}|Sr'rrs r)rxzanalyzeline..s < < <1QWWYY < < .s ???Qqwwyy???r(rvzAanalyzeline: 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 "rtrurw-c6g|]}|Sr'rrs r)rxzanalyzeline..cs )J)J)J!'')))J)J)Jr(z2analyzeline: expected "-" instead of "z&" in range list of implicit statement z*" in range list of implicit statement (2) r'/r;r<zanalyzeline: implied-DO list "z" is not supported. Skipping. c6g|]}|Sr'rrs r)rxzanalyzeline..s .d.d.dQqwwyy.d.d.dr(rzComment line in declaration "z\(.*?\)(/, z/)c3K|]}d|vV dS)rNr')rvrs r) zanalyzeline..s&553!8555555r(rz*analyzeline: changing init expression of "") to "rz//)maxsplit_BLNK_c6g|]}|Sr'rrs r)rxzanalyzeline..s KKKAaggiiKKKr(rzR\A\s*(?P\b\w+\b)\s*((,(\s*\bonly\b\s*:|(?P))\s*(?P.*))|)\s*\Zr{notonlyonlyc6g|]}|Sr'rrs r)rxzanalyzeline..s ???Aaggii???r(z7\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-r2rrBrCrrrrrrrr{r,removerrrrrrrr{r|r.copydeepcopyr[rrcrackline_bindlangrrTcracktypespec0 updatevarsrfindr\rrX namepatternrr&rroget_parametersdetermineexprtyper real16patternfinditerrreval SyntaxError NameError TypeErrortypespattern4implicit cracktypespecrordchrr removeprefix enumerate setdefault getdimensionfindall IndexErroranyextendr8r isinstancerappendmultiline)Grr?r0r6newnamerqrrr:r bindcline needmodule needinterfaceitrbindcdattr4selectorattredecl last_nameriplchrrfapinitexprrttvrimplrrg kindselect charselectrwrbegcendcodlilrkfcinprr5ridxvtypevdimmatchesnew_val expanded_listr multipliervalue current_valclbnol commonkeymmisonlyrr(gcsG r)r^r^s# GGFOOE {t#GGGH!-!1!1'""?3399#>>qA YG Y Y Y [ [ [ #a' "+ ,#% < "$ ,+- < (+- < (,5 < )+2 < (+4 < (  +++  8OUBD 1 1 ) EE X(% 6 6 )#EE X-ubd ; ; )(E F??3AGGG4D4DEEND%6@%5HJ| $V ,T 2DFF,CAGGGDTDT,U,U )D$ < $$%MMMMNNN!46  JJ'5d';';'A'A%'H'HJJJKKDDD ::** B** O Q Q Q  & & &MZ 555:l3F;;; -  f:%%FF&z,/ ===)jAA$GE  "\R//LA4E4E'!+LJ??? ! #a' #% < "$ ,  ){{A]++,-.000&.Il #0?J| $W -/-> < *+5d+;+; < (-3 < * 1  />J| $V , ,  \|q00vF~~k22iMU^^\gMhMh <0>AK&|4V >4<<>>>6:J| $W -d 3 '|<      *8 1777##+%+%'(D%x4??  *I|D    ! n n n<(0 WWW   # # % % GGDMM q55TX%%r""''..2AFQUFd"RAZ/B A!""v~~&J|,D"D"D"RaR&&&2333#((:l#;F#CDDD q55ABBBQBBAEFFB B   % %e , , r77Q;;AB oABB  " # # # EE^B%7%7%=%=e%D%DEEE4 4 A""1%%B 1000AA!++--(((Gd1gggg'(((rxx//00,,,6P1P1PRXXg&&&~~a{""BHHW---xWWV__r))//33= < 8 @@@'!++)L1>><>J|,[9<(5<)>??? F FAaxxXVXY[][_aa]<>HH %='='',uwwrxx00668899$ [PTUVPWPW [ [ []]]]!"1CEJ|,U3D9%@@%| 6 6 F F !++-- G H H H H H % % % Z %= = =;=J| $%7 8 | $%7 8 776??j ( (Z1__!J--- 0!":* jM !1!1 2 2 2 2 2!"!1!1Aaggfoo        # JHIII F  2(!, ) ) ) ) ) 1 akkmm>????? s(Ac== d  d A$h** h76h7.k33 l?lM "ANN AN&N%AN&U'AU9U9AV1VAV,V,AV1a"Aa;a;AbbAbq#Arr-Av r1AAttAv t1At6 t3Av t5At6 t6AAv vAv cpd|vri|d<|d}||vrg||<|||dS)Nf2pymultilinesr.)r context_namemlr(s r)rrsUu$$"$ A1,lO2r(cd}d}tjd|tjrd}nItjd|tjrd}n&|}t t |}|stddS|}t| D]}t||||<|dvr|d}|d}| d }|d kr)|d|}||d zd}||||fS) Nzdouble\s*complexdouble complexzdouble\s*precisionzdouble precisionz>cracktypespec0: no kind/char_selector pattern found for line. )rr7logicalr5 characterrhr>r#rrr7) rrrrr selectpatternr\r2r&r{r|rqr)r4rrrrfr(rr s r)rr!sSH D x#Xrt44,# '24 8 8,%>>##))++   ^B// 0 0B  M O O O A !&&((^^&&!%%!QQQV9 wZ  AAvv"1"v||~~ 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(|}t|dkr|S|d}tdt|dz D]4}||dkr||dzdvs ||dz dvr)|||z}5||dz}|S)Nrrrz ()[]{}=+-/* r )rrXr)exprexpr2r s r) removespacesr7Js ::<|d)kr8d|vs|dsi|d<d&|dvr |dd&=|d&|dd*<|d&=d1|vrGd2|vr8|d2|d1ks&td3|d|d2d|d1dn |d1|d2<d'|vr}d4|d'd5}d|vs|ds|g|d<n|d ||dD]:}|dd6d7kr*||kr$|dd8=t-d|d9|d:|dn;n(td;|| d#zzt)|D] }||s||=|t"t$d|<d.s MMM!AGGIIMMMr(r*z(?P[a-zA-Z]+)rc6g|]}|Sr'rrs r)rxzupdatevars..s E E E!'')) E E Er(c6g|]}|Sr'rrs r)rxzupdatevars..s ooo17799ooor(rroz@ @r;z-updatevars: no name pattern found for entity=rrqr5r4z+updatevars: attempt to change the type of "rrz ". Ignoring. rtz0updatevars: attempt to change the kindselector "rruz updatevars:z*: attempt to change empty charselector to rz0updatevars: attempt to change the charselector "rwz/updatevars: attempt to change the typename of "rsrr:r8r#)rXarrayinit2rXrFr r2rr+z updatevars: "z" is mapped to "r;z)" rr7r1r5rGrvz6updatevars: attempt to change the init expression of " dimension(r< rr z: attempt to change rz?updatevars: could not crack entity declaration "%s". Ignoring. r)rr,r-rrrrrrXr.r7r@rrr2rrrrCrrr{r|rorlenarraypatternr\r&rq)r4rrs entitydeclrrrrwrrr0rselel1re1enamernot_has_typespecrrfd1lkdmdm1s r)rr~s I'4Xx'H'H$J H MM~h'?'?'E'Ee'L'LMMM  J. / /  A  A #GGG$$**,,#a&&'' N HHQKKKK E E^J77==eDD E E EB C 33oon\/RSBTBT5U5U]`&a&a&a&g&ghm&n&nooo 3 3B 3 2::eS11222 3EE   a   VQVVV X X X 1776??++ J|,V4 4 4|,V4U;@@BBE)6  9$,j!! 98uZ/@#@#@EE5,,,hhh8999U**(, *(=(=n%% Ljoo//00LLAE.111:a=ER`LabcLd;d;dAAuuueN&;A&>&>&> 1 !OPPPP489Z]3K3Kn-a00U**z*#3,6E.))G$uujjj23333 Ljoo//00LLAE.111:a=ER`LabcLd;d;dAAuuueN&;A&>&>&> 1 !OPPPP489Z]3K3Kn-a00&&$,j!! 95#4#@#@EE5,,,hhh8999&&$(Ih$7$7j!! 4!44Aj 111j)00333 $ ( 3 3E* $(Ij$9$9E. !$(Ij$9$9E. ! (E*  $ ( 3 3E*  %))J//52 6 61 <@XY_@`;`;`*\":::8: <(5 | $[ 1 8 8 ; ; ; 777  C / &&~aggg6F6F'G'GHHBA /\\^^2))B"s(|/!#BH2rCxLbggii""A!u( 0A 7 71qEEB;;7b==%yB$&wK5 wKK![00*%77~AV746E.1 E.$999 %n 5e <57Yn-c2uII&(kC&7"U)&C7 uI$HHaaa555"W+++!GHHHB;;#LLL*%77~AV746E.157Yn-c2uII![00*%77~AV746E.1 E.$999 %n 5e <57Yn-c2uIR<<e||U3Z2f:-E-E!EE5:::r&zzz!;<<<<&(Zc b==4bk444B!..uZ7H.-/Dj))j)00444#(#4&&C"2A2w+55#))$)*$5b$9 '+055###rrr);!<!<!< %ZAGGG,,,.///ejjll##  A8 !H27 < (/ L1 1 1 | $Z 0 7 7 > > > r(cxd}d}d}|r|dvrt|}|s"tdt|ddS|}|d|d<|d=t |D] }||s||=t |D]\}}t|||<n|dkrWt|}|s"tdt|ddS|}|d|d<|d=|d rtt|d }|}d D],}||d zr||d z||<||||<||d z=-|d  |d |d <|d =t |D] }||s||=t |D]\}}t|||<n|d kr[tjd|tj }|r|d}nCtdt||zzn tdt|d|||fS)NrIz1cracktypespec: no kindselector pattern found for rkind2rr2z1cracktypespec: no charselector pattern found for charlenlenkind)rXkindrHf2py_lenrhz\s*\(\s*(?P\w+)\s*\)rqz'cracktypespec: no typename found in %s z$cracktypespec: no selector used for )rtrr2rr&r{r|itemsrrrulenkindpatternr,rrr) r4rrrrwrr r[rUs r)rr'sCJJH2O @ @ @%++H55J ZXZZZ\\\#--//J(1JsO7#*//++,, & &!!}&"1 Z--//00 . .1 *1 1  .  $ $%++H55J ZXZZZ\\\#--//J(3JsO9%)$ A(..":i#899;;!++--)**BrCx(8&-b3h&7 %,R[JrNS)):&2-4Z-@Jz*9%*//++,, & &!!}&"1 Z--//00 . .1 *1 1  .   x =xNNH 5#>>&11Bh12245555 M4>>MMM N N N z8 ++r(c|si}|s|Sd|vr|g|d<|S|r|d|||dvr|S|dkr&d|dvr|d|n|dkr&d|dvr|d|ns|dkr&d|dvr|d|nG|dkr&d|dvr|d|n|d||S)NrsrJ automaticr r r,)rrrs r)r}r}bsb    6Z  & Z%%% tJ  xKtJ/??? Z%%%%   j1A!A!A Z%%%%    D, , ,   # #D ) ) )    4 + + +   # #D ) ) ) Z%%% Kr(c|si}|s|Sd|vr||d<|St|D]}|s ||dvr|||d|< |S)Nrtr{r|rselrrs r)r~r~}s   T!!"^ #((**  --  -AT.111&)!fD  # Kr(c|si}|s|Sd|vr||d<|St|D]}|s ||dvr|||d|< |S)Nrurcrds r)rrs   T!!"^ #((**  --  -AT.111&)!fD  # Kr(unknowncd|vr|dS|S)Nrqr')r6rgs r) getblocknameris V} Nr(cT d|dd|ddadS#t$rYdSwxYw)NzIn: rrrqr)r r)r6s r) setmesstextrksP C%-CC%-CCC      s  ''czi}d|vrt|d}d|vr||d|S)N parent_blockr) get_usedictupdate)r6usedicts r)rnrnsHGeN344 ~~uU|$$$ Nr(c 8|i}t|}|s|St|D]\}}|}|tvr*t d|d|ddLt|}t|}|sk|rtd|dt|D]>\}}||vr0t dt|dt|d|||<?|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 ) rnr{r^rrr2rrror) r6 param_maprpusenamemappingmvarsrrrs r)get_useparametersrvs\ %  G  11--// - ' ' GWWeii////1 2 2 2 g&&&    M KgKKK L L L((  DAqI~~59!WWWWd7mmmmMNNNIaLL   r(cts|St|trfd|D}|St|t d|dddt |_d|vr[|d}t|D]1}||}d|vr#|d}d|vr|d}|vr ||d<2fd |d D} | |d <|S) Nc:g|]}t|dzSr)tabrr postcrack2)rvgrrrzs r)rxzpostcrack2..s<!tyAAAr(Block: rqrrr5rtr\c:g|]}t|dzSryr{)rvbrrrzs r)rxzpostcrack2..s<(((1#* BBB(((r(r4)rrr{rkr2rvr|) r6rzrrretr5rvarr\valnew_bodys `` r)r|r|s[  %  s , ,5= , , ,a000%e,, 5V}diikk"" 6 6Aq'C$$>*T>>v,Ci'''0~V (((((v(((HE&M Lr(ct|trjg}g}|D]^}t|t||dz}d|vr d|dvr||I||_||zSt|t|t s#d|vrt dt|zd|vr(|ddkst|d|dd d t|}t|}t||d <t|d |d <| d r|d }t||||d<g}d|vrF|d}t|D]}d|vr||ni}d} d|vr|d} | drg} d|vr|d} t!j|d } | r| dz} nd} | |vr d} | d| |vr| dz} | d| |v| d| } dgi| dzd}|dD]}|| vrg}d}|dD]}|dz}|ddkrld} |dD]6}| dz} d|vr+|d|krt!j|}|d| =n7|r)|ds |d|=| | |=n|d||| vr&t%| |s| ||d |<|d s|dr3| |d<d|gi| |dd}i|| <t&||r||d<|S)zi TODO: function return values determine expression types if in argument list rrzrqrr6z0postcrack: Expected block dictionary instead of rr~rrr5sortvarsr:r4rr r8r9__user__routinesunknown__user__routinesrrr_user_interface)r6r4r5rqr r)r6r4r5rqr9)rr{rk postcrackr.dictrrr2 analyzeargs analyzecommon analyzevars sortvarnamesr analyzebodyr|rr[ isexternalr)r6r:rzgreturetr} userisdefineduseblockrrqr9rumnamer rredefjrbbmblocks r)rrs}%   A NNN!t,,,A{{zQvY66 A Ad{ eT " "$we';';JE #$$ $ uV}0CCC300uV}000!444   E % E&&E&M$U6]33E* yyV}t555E&MM ~~<hmmoo&& ( (AQ$$Q''' ( D V} yy+' 5 |,J %-((  .--EE-E M ! !A..Q..M11E..Q..M11NNqNNE)20A)ACC {# 0 0AJv""AAAz[00"#F)&&B !AA%||6 a'+y}}$%fIaL %"#$V95$)&M!$4 *:+;+;A+>+> ?!E&!((....eJuQx$8$8',Qx &!!$ V  ' & 1 '",E, .9$&U;EWYYF HUO   v & & & e Lr(cPg}g}t|D]E}d||vr$||dr||0||Ft|}d}|r|d}d}|ddD]}|||dvrd}n|rH|dd|gz}|dz}||kr.t dd|zdz||z}n3n0|||dd}t|}d}||S)NrzrrzTsortvarnames: failed to compute dependencies because of cyclic dependencies between rr)r{r|r.rXror)r5indepdeprrr rcws r)rrQs| E C $))++   tAw  478#4  JJqMMMM LLOOOO CA A  F QRR  ADGH%%%&  abb'QC-CAA1uu;))C..)+/0111   LLOOOabb'CCAA) * Lr(c Ht|s|Sg}t|dD]}g}|d|D]}tjd|tj}|rZg}|dr?dt|ddD}t|d }||dvryd|d|vr?|d|d d d |d n]d d |d g|d|d<n3|r&dd d |d gi|d|<n i|d|<||vr| |n|}td |d |d| |||d|<d|vr||d<n|d|z|d<|S)Nrz2\A\s*\b(?P.*?)\b\s*(\((?P.*?)\)|)\s*\Zdimsc6g|]}|Sr'rrs r)rxz!analyzecommon..s6SSS !GGIISSSr(r*rqr5rsrJr+r<z:analyzecommon: failed to extract "[()]" from "z " in common /z/. commonvars) hascommonr{r|rrrrr,r-rrrr.rro)r6rrcomvarsrrrrs r)rrss U   J %/&&(( ) )%%x#  AEq"$PPA j776??SSS%3AGGFOO%D%D%J%J5%Q%QSSSDqwwv446677f %%!U6]1%555f a(4;;:$:::<<<<;$:::8<f a(44*"%C#((4..%C%C%C$D(FE&M!$$(*E&M!$J&&%%a(((hQRhhabhhhjjj NN1    $h5  (l#L1J>l Lr(c0t|d|dD}g}|dD]V}||d<|ddvr| |d|vr|d}|d|vr t|d|dtvrst r|dt vrt |d d |d <n|}t|||d z}|ddvr"|ds|dsd|vr|d dddkrt||ddkr|dt|d<||X|S)Nc6i|]\}}d|vs d|dv||S)rsr r')rvkeyr!s r) zanalyzebody..sB C U " "heJ6G&G&G U&G&G&Gr(r5r4rmr6rrqr:z T as_interfacesaved_interfacerrrrrrr pythonmoduler) rkr^r|r#r.r$crack2fortrangenrrrrr)r6r:rz maybe_privater4ras_s r)rrs---//M D 6]!. W:3 3 3AfIT$9$9iyM..0000  6+++yI%% QvYi77#3>$6$6$6A C a#* - - - W:< < <y =!"!7!7 =!** W:  c2 & &. 8 8   q ! ! ! !zX%%+,V9 ai( KKNNNN Kr(ct|t}i}d|vr|d4d}tdkr&tdt |ddnvt |dD]N}|d|ddvr|d|||<7|d|d||<O||fS)Nrrz2buildimplicitrules: no implicit rules for routine rqr=r4)rJra)rkdefaultimplicitrulesrr2rr{r|r)r6 implicitrules attrrulesrs r)buildimplicitrulesrs(MIU   $ M{{aeTZmI\I\aaaccc% +002233 D D$Q'++J77?VVV',Z'8';M!$$#(#4Q#7 #CIaLL ) ##r(ct|||}t|ttfvr|St d|)z2 Like `eval` but returns only integers and floats zr=)rrhr8r:r)rr}rrs r)myevalrs? Q1 A Aww3, Z!ZZ  r(z \A\b\w+\b\Zc tt|ii}d|dfS#t$rYnwxYwt|rdd|fSt |}|D]b}t ||krt jd|zdz|r3t jd|zdzt j }||}|r ||}|rG| dd dd | d }||}|Gt|ii} ||}|rG| dd dd | d }||}|Gt|ii| z } ||}|rG| dd d d | d }||}|Gt|ii}||}|rG| dd d d | d }||}|Gt|ii} | d z| z|kr| d z| z| kr| | |fcSn#t$rYnwxYwnddS)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') rNrz\w\s*\([^)]*\b\b(?P.*?)\b\b(?P.*)r"r;r<r#g?g?)NNN) r8rrgetlincoef_re_1rrXrrrrr) rxsetrlen_errerrfeerr0c2s r) getlincoefrs:* q"b!! " "!Tz      Q!Qw FFE ## q66E>>  9&*U2A 6 6  z.25GGNN JJqMM   ZZ]](HHX..HHHHRXXg5F5FHHBBB(2r2&&ZZ]](HHX..HHHHRXXg5F5FHHBBB(2r2&&*ZZ]](HHX..JJJJrxx7H7HJJBBB(2r2&&ZZ]](HHX..JJJJrxx7H7HJJBBB(BB''GaK1$$S1):):a7NNN     E7 8  s"% 22GJ55 KKz\b[a-z][\w$]*\bc ||vr||dg}d||vrat||sLt||dD]%}||vr||vr||kr||&|ddD]E}||gpt |||D]}||vr||Fn"t dt|dg}|||<|S)Nrzrvz)_get_depend_dict: no dependence info for r)risstring word_patternrr._get_depend_dictr2r)rqr5depswordswordrs r)rr/ s7 t||T x,, $t*  Xd4j%9%9 $,,T$Z_== ' 'u$$$$,,LL&&&!!!H $ $DXXdB'':'dD99 $ $E>>LLOOO $ $ JDJJJJJKKKDJ Lr(cxt|}i}|D]}t||||Sr,)r{r|r)r5rz depend_dictrs r)_calc_depend_dictrE sF   EK //D+.... r(c~tg}tD]"}|s|||=#rWtD]3\}}fd|D}|s|||=.||<4Wfd|DS)Ncg|]}|v| Sr'r')rvrrs r)rxz$get_sorted_names..V s#:::Qk)9)9q)9)9)9r(cg|]}|v| Sr'r')rvrqr5s r)rxz$get_sorted_names..\ s 3 3 3TddllDlllr()rr{r|r.r^)r5rzrqlstnew_lstrs` @r)get_sorted_namesrM s#D))K E[%%''((""4  " LL   D! ,k//1122 , ,ID#::::#:::G , T"""%%$+ D!! , 4 3 3 3U 3 3 33r(c|ddvr |dd}t|rdSt|rdSd|zdzS) Nr'"rr zkind(r<)rr real8pattern)rcs r) _kind_funcr_ sd ayE"6""q   F # #q V c !!r(cfd|z}|dkrdS|dkrdS|dkrdS|dkrd S|dd zkrd Sd S) Nrrir7lrlrr r')rrs r)_selected_int_kind_funcrj sZ aAF{{qG||qG||qG||qAH}}r 2r(c|dkrdS|dkrdStj}|dr |dkrdSn|dkrdS|dkrdSd S) Nrrr) aarch64alphaarm64 loongarchmipspowerppcriscvs390xsparc!rr )platformmachinerr)prradixrs r)_selected_real_kind_funcrz s 1uuq2vvq  &&((Gwxx 772  Rr br 2r(c ~ tj|}tj|}dtfdtfdtffD]\}}||vr|||<g}t |D]1}d||vr%d||dvr||2t jdt j}t jdt j} t jdt j} |D]}d ||vr||d } t||r#| } d D] } | j | } | d | } | d | } d } d||vr]d||dvrMt| }| d||ddzd} t| |k} | s| | s| d}t|dkr[d|dd |d d} t#||rt%| }t&| D]}t%| || dd|||<d|} n(t/||rt1d| dd||dDpdgd}t&| rd} nt4| rd} t7| |||||<n2#t8$r%}| ||<t1d|d|dYd}~nd}~wwxYwt;||r3t=||t>rtA||||<| }||kr ||||<tC||t1d|d|S) Nr\selected_int_kindselected_real_kindrsrz \bkind\s*\(\s*(?P.*)\s*\)z-\bselected_int_kind\s*\(\s*(?P.*)\s*\)z4\bselected_(int|real)_kind\s*\(\s*(?P.*)\s*\)rv))z.false.False)z.true.Truez kind("\1")zselected_int_kind(\1)Frtrr rr r(rzAget_parameters[TODO]: implement evaluation of complex expression rcg|]>}|d|d?S)r)rrr)rvrNs r)rxz"get_parameters.. sQ555,,{335{3399;;555r(rrr)dimspeczget_parameters: got "" on zget_parameters:parameter z does not have value?! )"rrrrrr.rrr islogicalrrsubrXrr-risdoubler{rrrr iscomplexr2rr param_evalrrrr8rr)r5 global_paramsrg_paramsrqfunc param_namesrkind_reselected_int_kind_reselected_kind_rerrepl is_replaced orig_v_lenv_rrrrnls r)rr s Y} % %Fy''H ++-DE,.FGK"" d x  !HTNK d # #"" a [DGJ4G%G%G   q ! ! !j>Q Aa!! )GGII))D " 4(AA M1--A$(()A1EEA  Ka((T!W^444!$QJ #Q(?(G"GLLA#&a&&:"5K Q'--a00QB2ww{{GGBssG,,2244<?@t|t|\}}tj|d@|ddkr|d@vr i@|d<d|dvr|@d=d|ddvri|ddd}t@d|dDzD]2}d D]-}||vr't @|i|@|<.3g}|d }|D]0} @|||!#t$rY-wxYwt@ D]}||vr||t@t|} i} tj d j} t@ D]} | | } | rr| | | } | |G#t$r-tj d | ztjj| |<Y}wxYw|D ]}|d t| vr%t @|||d @|<d@|vrd@|vrd@|dvs|r|d }t|| D]m}|dkr|||dkr|@|vr|||@||<=|dkr*|||D]}t @||@|<nn3||d vr)t'dt)|d|ddd@|vred@|dvrU@|dd} t+t-|i| }n#t.$rYnwxYw|@|dd<d@|vred@|dvrU@|dd} t+t-|i| }n#t.$rYnwxYw|@|dd<i}d@|vr@|d}|g@|d<d\}}}}}|D]}|dddkr%|dddd}n|dddkr%|dddd}n|ddd kr%|dddd}n|dd!d"kr%|d!ddd}nL|dd#d$kr%|d#ddd}nt @||@|<|rd@|vr g@|d<d%t5|d&DD]I}|d'd}|@|dvr!@|d|Jd}|rf|d(d)}|d*d+}d$@|vr |g@|d$<n!@|d$|d}|d @|vr g@|d <t;d,t5|d&DD]3}|@|d vr!@|d |4d}|wd"@|vr g@|d"<d-t5|d&DD]3}|@|d"vr!@|d"|4d}|rd@|vrg@|d<t;d.t5|d&DD]D} t=|| }n0#t>t@tf$rt'd/|d+YnwxYw|d0krd0nd1}||kr|g}n#t5|d0d2}tC|d3kr d1|vrd1g}d1}tC|dkr|d |kr d4|d g}tC|d3krNtEtFj$j%|\}}||z dz}|&tFj'j(5}i}|dD]} tGj)| } |*| r |+| \}}!||!fd6}"t|,}#|#-|!,n:#t\$r-}$d}"t|,}#Yd}$~$nd}$~$wwxYw@fd7|#D}%|"t|%f|| <|||<@|d|Fd"@|vrKd |vrF||d vr;@|d g}&g}'t_t`tbtd@|}(tg@|rti@|dD]\})}||>>n|(r>5D]\} \}*}+>?fd8?t},?| |,| |&vsd9@| vs d @| vrB|*| |,vrd:}-|*tGj)d;|d<|)d=}.|.&tFj'j(5}.|.@| d9<|g|+z@| d <d"@| vrd;|d<|)d>|g@| d"<n{d?}-d@| vr g@| d<d@@| dvr!@| dd@|&| |'d;|d<|)d>|@| dg}/dA|/vsdB|/vs|/|-rdBndA|/r |/@| d<>>5D]\} \}*}+@| d g}%@| dgD]n}0|06d rWd7|0}0|%8|0dCddDo|%r%tt|%@| d <||%vr|&| nts@|rd@|vrd1@|dvr4tu@|dd1| }1|1@|dd1<nRd@|dvrBtu@|dd| }1@|dd=|1@|dd1<|'r |'@|d"<|&r%tt|&@|d <d9@|vrd@|vr g@|d<dA@|dvr1dB@|dvr!@|ddAd @|vrg@|d <t| 5D]=\} } | @|d9r!@|d | >@|d s @|d =tw@|r%ty@|d9| @|d9< t@ D]}||dkrd$@|vr@|d$|d$<|ddkrdE|vr/|dE@vr%t{@|@|dE@|<dF|vr|dF}2|2dGd}3|2|3k }4|3dHd}2|2|3k }5t|d |2} | rt| @dI| @dJ\}6}7}}8t|6|7\}9}:};|6@|d< |dEr|6@|dEd<n#t.$rYnwxYw|9r;d|9vr, t-|9di| |9d<n#t.$rYnwxYw|9@|d<|:r |:@|d<|;r |;@|dK<|4rt @|dG@|<|5rt @|dH@|<t'dLt)|dFdM|ddNvrdO|vr$tj|d |dOz}zanalyzevars.. s!C!C!C!F)!C!C!Cr(r4rr:z[A-Za-z][\w$]*z.*\b%s\brr4r undefinedz"analyzevars: typespec of variable z is not defined in routine r=rurXrtr\)NNNNNNrKrrr rrrzrryrrxc6g|]}|Sr'rrs r)rxzanalyzevars..q s UUUAaggiiUUUr(r*rz\n\nz z\n rc6g|]}|Sr'rrs r)rxzanalyzevars.. s '_'_'_a '_'_'_r(c6g|]}|Sr'rrs r)rxzanalyzevars.. s TTTAaggiiTTTr(c6g|]}|Sr'rrs r)rxzanalyzevars.. s MMMqMMMr(z4analyzevars: could not parse dimension for variable rrz@:@r71)languagec||z |z Sr,r')rNr0rs r)solve_vzanalyzevars..solve_v s01A{(:r(c0h|]}|jv |jSr')r)rvrNr5s r)rzanalyzevars.. s.*7*7*7/0'(v~~%&F'5~~r(c|dggdD]'}||vr!||||(dS)Nr)radd)rrv1coeffs_and_deps compute_depss r)r!z!analyzevars..compute_deps s`*9*=*=a$*L*LQ*O!?!?B')~~(, (4 R(>(>(>!?!?r(rvFzshape(rr<z) == Tinr r rr+rrpure recursiver>r#rwzanalyzevars: prefix (z) were not used )rrrrrr)rrrh)Drkrrr$r}rr.KeyErrorr{r|rrvrrrrrrrr2rrrrreverserr,r-rr{ param_parserrrXrrExprparsetostringLanguager as_symbolr linear_solvesymbolsro RuntimeErrorl_or isintent_inisintent_inoutisintent_inplaceisarrayrr^rrrrr isscalarr rrTrrrisintent_callback isintent_aux)Ar6rrgenrrsvarsr:r0r dep_matches name_matchrrln0rdimension_exprsrdimrrzryrxrtmpr(dim_charrrTd2dsizesolver_and_depsrNrr all_symbolsrv_depsn_depsn_checks n_is_inputr solverrall_deps is_requiredrGv_attraar prpr1ispureisrecr4rrrrrw neededvarsrqr r!r5sA @@@r)rr sA1%88M9 9U6] # #D W~##f T(A(A U6] U6] H vr* * *-#J/CYY!C!CU6]!C!C!CC B B.BBACxx"-dhhq"ooq"A"AQB E =D   GG LLOOOO    D  $))++   D== LLOOO D"3E":": ; ;FK-..4J $))++  KK JqMM  K!''))AEEGG#$A KA K K K!#K1,=rt!D!D!J A K  K MBMB Q44 (()) ) )!$q'9QqT?;;DG T!W $ $$q'))jDGJDGAJJ*__%23%7%:BB*5d1gq*A*AQB%-''GQv0111 T!W $ $Q///GN+E2DB//00AA D12Q'. T!W $ $a000GN+F3DB//00AA D23Q'/ a 7:&D LLNNN"$DGJ /K ,C+ !+ !RaR5K''QRR5;;==!B$/CCrrUh&&ekkmmQrT2FFrrUh&&ekkmmQrT2FFrrUg%%qrrU[[]]AbD1EErrUf__abbEKKMM1R40DD)$q'155DG"tAw..,.Q)UU1G1G1M1Me1T1TUUU::iiR00d1gh&777 GH-44S999!F <<&99D<<55DT!W,,+/&QQ..t444D%tAw..,.Q)&'_'_>&;Q;Q;W;WX];^;^'_'_'_``88DGH$555 GH-44Q777!F$d1g--+-Q(TT1F1F1L1LU1S1STTT77DGG$444 GG,33A666 EA 3{$q'11')Q $"MMN3,?,?,E,Ee,L,LMMM?3?3A (622& H=0()000 '(3hhssCHH}}&Z+As3399%@@2ww!||r !U2ww!||1(9(9!2a5\2ww!||!$X]%8"!=!=B "R! !NNH4E4GNHH+-!&vKKA ( 21 5 5A$~~a00K!G+0+=+=a+@+@DAq56!%;%;%;%;36aiikk2B2BK$/$6$6qyy{{$C$C$C$C'3!G!G!G /3G25emmoo2F2FKKKKKK!G*7*7*7*74?*7*7*76=d6ll5J 2.=*GK(//2222 $q' ! !foo!uV}:L:L !W[[2..FH0k>.0004Q99JtAwW >%d1gk&:;;K1K1DAq&5&9&9!&<&-@(5(B(B/3Q 67C$JQ 1#*$q'#9#9)B(A(Aa(A(Aa(A(A8CDGG$4 /3 #+47#:#:8:DGH$5#'tAwx/@#@#@$(GH$5$<$%>F&*1gkk*b&A&AGG#%==#:#:!G)+)<)!T!W,,d1gn555!-d1gn.Ec.J.4"6"67=Q/44$q'."999!-d1gn.Ee.L.4"6"6 GN3E:7=Q/4 ,#+Q  6$(V$5$5Q! $q'>>a((&(Q #$q'*"555$q'*"555Q #**:666tAw&&$&Q! !2!2!4!45544DAqqa4Q)00333Awx(*Q)Q   B+DGCL&AAQ $))++  +^+^ f  a  $Qf W~++u$$xD)@)@(a$uX2GHHDGu$$xB**VR00C"$)mF["55B!#s]E$Q--b11A^:HGGFOOQWWW-=-=;?;?7(D%;H$h<0<08 J.6Q +!$XMDLU8_ 5j A(!!! D!%A%33!)9=(26(:B:H:HJv$6$6'0!)!)!)$(D!)6@DGN3%A6@DGN3#;2:DGJ/!C&1$q'6&B&BDG H&1$q';&G&GDG\Dx4I4I\\\^^^ W~VVV 5 5=53F#FGGJJ5=11Jdiikk"" % %A4t%|44T!W== %!!!$$$ e     d5>#6#6#8#899 : : :%.--//00 - -w*--A **"))!,,,- >Z ' '5  !!%/2222!!%-000 >7 7 7=Dt||DJ 6 6"&t*X"6h >V # #   d499;;// 0 0 0diikk""  A ""G Ks5D D D 7H4H76H7O%% O21O25Q Q! Q!"`33*a a 8A&g h )#h h D3AE E AEEAEE$AE?E? AF F AF z\A[a-z]+[\w$]*\Zc z|D t|||}n/#t$r"}|}td|d|dYd}~nd}~wwxYw|St|dks|ddt|dz dkrt d|d |dd d }t|dkr|d d }t|dkr7t |d |}tdt|dz}nmt |d |}t |d|} tt|t| dz}nt d|d| dr |ddn|d }g} |D]W} t| ||} n-#t$r }td|d| dYd}~nd}~wwxYw| | Xtt|| }|S)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 "rrr7rrmzparam_eval: dimension z can't be parsedr r+rrz.param_eval: multidimensional array parameters z not supportedrr) rrr2rXrr-r'rr8rr.rzip) rrrrrrdimrangeboundlbounduboundv_evalitems r)rr s& ;Q&))AA ; ; ;A 999!999 : : : : : : : : ; 7||a7#5#5S\\A%5#56$>>L'LLLMMMqt}""3''H 8}}A;$$S)) x==A   V44EQE Q//HH !f55F !f55FS[[#f++/::HH4#44455 5LL&& -1R4A44S99A F >h//DD > > > <<<$<<< = = = = = = = = > d S6 " "##A Hs* A=A G H%HHcd|vr|d|d}||ddz|d}tt||}t |||S||vrt ||S|D]}t jd|zdzt j}||}|rX| dt ||z| dz}||}|X|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 r;Nrr<rrr"r#) rrfindr8r'rrrrrr)r(rdnameddimsr[rrers r)r'r' s8r axx,166#;;,!&&++/!''#,,./Kv..//6%='((( f6!9~~ " "A:$q(+==rtD 1 A "GGH%%q NN#%&WWW%5%56JJqMM "r(c|}t| }|rt|\}}t||d|}d}|D]8} | } | t jt jzvrd} || z}9|ddkr|dz}n|dz}|}||dvs ||dvr|dz}||dv||dv||vrAd } |t| z|vr| d z} |t| z|v|t| z}|r ||d|<nk||dvr%|d |i|d|<d |vr8||d |d zvr%t|d|d |d|<|S) Nr5e_rr r_er:rrr8r9r) analyzeargs_re_1rrrrrcascii_lowercasedigitsrrr}) r0r6r:orig_a a_is_exprrratnarrs r) expr2nameri" s F$**1---I#5e#<#< y q%- ? ?   A A.>>>aBB b6S==cBBdB 5=  Av$6$6CA5=  Av$6$6Dyy #a&&jD  AA#a&&jD  AJIf a 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:rrAssertionErrorr)rs r)_ensure_exprdictrng s!S'I&&!U$F##!W'I&&!T a ! !!r(c||vrt||S|}t|rddiSt|}|rOd|vr5|dr tdt|dddiSt|}|rOd|vr5|dr tdt|dddiSdD]V}d t||  d |zd zDD]}||vrt||ccS Wi}t|rt|d d ||}nt|}|ri|d}t|d||}|rd|vr|d=|s%|d|vrt||dS|ddvrdddidS|s tdt|d|S)Nr4rrqz6determineexprtype: selected kind types not supported (rr7r5)+rrrc6g|]}|Sr'rrs r)rxz%determineexprtype.. s ZZZ!''))ZZZr(rErnrr rsrrr2r)r4ruz4determineexprtype: could not determine expressions (z) type. )rnrdetermineexprtype_re_1rdetermineexprtype_re_2r&rr2rdetermineexprtype_re_3r,r-determineexprtype_re_4rdetermineexprtype_re_5)r5r5rulesroprrrns r)rrs s t||T +++ ::<>+E"Q%L999 Aw%'#sDDD Z X4:: X X X Z Z Z Hr(rFcpt|d}t|trO|D]J}|r1|ddvr'|dtvrtr|dtvr5|t |||z}K|Sd}d}d}|d}|dkrdSg} d|vr|d}d|vru|d} |dD]=} t | || } t| | s| | >|dd ks| rd d | d }d} d |vrIt|d  D]!} | |tz| d|d | } "| dgdd}|d krd|vr| d|r'| |tzdd |d|} d}d|vrt|d|tz}d}d|vrt|d|tz}|dkrd}d}d|vr1d|dd }|d| vr| |dt |d|tz|}t!||d| |tz|} d}d|vr |s d|d}d|vr\d}t|dD]-\} }||tzd| d d |d }.||z}|dkr|dkrd}|||d|||d|| || |||d|d|}|S) Nr r6rrqrrr:r5rr;r+r<rrrcallbackintent(z) rrrrz result (r4rz! in rzentry rrzend )rkrr{r#r$rrir6r.rr|rrr use2fortrancommon2fortran vars2fortranr^)r6rzrrr}rrqr: blocktypeargslr5r0rr intent_lstrrrr4mess entry_stmtsr s r)rr sU C% L LA QwZ#===V9 ))6)!;!;(ClKKKKCC F D DgIIr E V} V}v  A!UE**A$T!W--  Q >Z ' '5 ')sxx)))DU""e./446677 R RA  #--E:L4Ma4P4P R  8R((+JJ:#;#;*%%%8,,cGmmmHHZ0000$$8 C ~~%,g 66 F5hw?? """ F5/U8_/// ?% ' ' LLx ) ) ) E&M3=| T T TD  uV}eS7] O O OD D |&uV}&&% w--//00 R RDAq(Q#-QQqQQ388A;;QQQKKk!L  T^%;%; VVYYYddFFFDD:J:JCCQUQUW]W]_c_cehehehjsjsjsuyuy {C Jr(c d}t|D]P}|dkr#||dd||}+||d|dd||}Q|S)Nr rzcommon r+zcommon /z/ )r{r|r)rrzrrs r)r~r~ s C &++-- BB ==;#;;chhvay&9&9;;CCA#AAqAACHHVAY,?,?AACC Jr(c2d}t|D]}||d|d}||ikr|r|ddkr |dd}1d||vr||dr|d}d||vr||drtd}t||dD]D}|||d|kr |||}d}%|||d ||d|}d}E|r|ddkr |dd}|S) Nr zuse r+r rz only:rrz=>rc)rrzrrrrs r)r}r} sj C #((**  #c##q### q6R<< s2w#~~#2#h  SV  Av ...C CF??s1ve}?A#a&-,,..//  Au a((( .!.Q..CAA >crc(C Jr(c|d}g}|D]J} td|}||r||;#t$rYGwxYw|S)Nr isintent_)globalsr.r%)rrrrrks r)true_intent_listr s h-C C## # .f../Aqvv # 6"""     D  JsA AAc  t|d}g}|D]!}||dvr||"d|vr<|dD]3}||vr||vr|| td|d4d|vr||d|s=t |D]}||vr|||D]}d||vrE||dD]6}||vr0d||vr&|||dvrtd|d |d 7d |vr||d vrt ||r ||d |}||d |}t||r ||d|}||vr d||vrd} |dD]} || dkr| ddkrd} n| r||vr$t|td|d||dkr#|ddks| dr7d||vrSd||vrd||dvr||vr ||d |}jt||td|d||d} | dkrd||vr| d||dd} i} d ||vr||d } nd!||vr||d!} d"| vr'| d"d#vr| d$| d"d} nJ| d"| d"} n.n s,...! ,,,,,r(z intent(in)z intent(out)rr+rrJrr|ryzcheck(zdepend(rv)rr0z :: )rkr.rorr{r|r6 isoptionalshowr2rrrrrr5imagr)r6r5r:rzrrnoutr0r(rrvardefrrrrrs r)rr sG C D  f   KKNNNu|$ R RADyyD==KKNNNP!PPPRRRRU E*%&&& diikk""  A}} A d$d$ tAw  !WX& i i99T!W!4!4d1gh>O9O9OgVWgg`agggiii %  A{);$;$; a)) 87c77A77+#++++C$q'"" 0/c//A//DyyZtAw66D6]  & >>ajJ&>&>DE  D== JJJ HHHH I I I  f  W~++uyy/B/B+  T!W $ $T!W$$tAwz7J)J)J99 3#3333C aMMM FqFFF G G G a$ V   d1g 5 577a!4777F T!W $ $Aw~.HH tAw & &Aw~.H (??} **"66hsm666"44Xc]44 h  66Xe_66F!!"==(6*:===" x  99hv&6999F  a ..tAwz2...D +  4 4$9N9N  M*** "66chhtnn66 $q' ! !NNNSXXd1gk6J-K-KNNNFA tAw  "47++C ?">A>>chhsmm>>>A d1g  FFF$q''2B)C)CFFFFA tAw  HHH#((4783D*E*EHHHFA $q'>>Q AAwz"&CCCQA.AF..QV...AA D++A++++FF''A''F#c#6## Js!"S SSc|tddt|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)... ) r2rrArrrpost_processing_hooks__name__traverser|)filespostlisthooks r) crackfortranr s (!,,,E9%%% "A&&&K1&&H 11555%,,&T]&&&***Hd++ ,a000(##H  !!r(cNt|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)r6pyfheaderfooters r) crack2fortranr s? 5 ! !D (CF F C<&  r(ct|to4t|dko!t|dttfS)Nr7r)rtuplerXr8r)objs r)_is_visit_pairr s@ sE " " /CA  /3q6C:..0r(ct|r9|ddkr|S||||g|Ri|}|t|sJ|S|}|\}}nd|f}d}t|trKg}t|D]8\} } t | | f|||gz|g|Ri|\} } | || 9nWt|t r@i}|D](\} } t | | f|||gz|g|Ri|\}}||||<)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. """ rrmN)rrr{rrr.rr^)rvisitparentsrr:kwargs new_resultparent result_keyr[r! new_indexnew_itemrnew_key new_values r)rr s8c  q6^ # #JU3A$AAA&AA  !!*-- - --  CC #t %cNN , ,LE5"*E5>5+2fX+=v#<,0#<#<#<4:#<#< Ix$!!(+++  , C    ))++ 0 0JC!)3,*1VH*.fix_usagesF{W,u4guEEuw)@@'' r()rryrr5rrvrN callstatementz (? `z` )r^ ischaracterrrr2)rZrrr:r parent_key parent_valuerr!r vars_dictrrvds r)%character_backward_compatibility_hookrs 'r{J JC +++r{1~''''BKN r{1~''''BKN  I $??,, : :KGR2 :%Igy99  :   BKN6*  $??,, O OKGR2 OF!G+e3S7]IOO     >>>c>>"'>>/8>>>?@ B B BYr(__main__rz-quietz-verboser7z-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+)rgr,)r N)Nr )r )NN)rr)rF)r F)__doc__rrrrrrrcr-pathlibrr ImportErrorr rrauxfuncsversionrr rrrrrrrrrrrr!rrr rrCrrrBr%rr$r&rr#r"rr*r2 _MAXCACHErrrnr}rrrr{r~rrrrrrrrrrrrrrrbeforethisafter fortrantypesrTrrQrR groupbegins77r groupbegins90r groupendsrOendifsrNmoduleproceduresrZrSrDrErGrHrKrLrMrFrIrJrVrYr]rUrWrXrPSr?r@rr1r[crackline_bind_1rrAr\r,rqrr3rrrrrrrrrrrr^rrrrtrur_rLr7r@rrr}r~rrirkrnrvr|rrrrrrrrrrrrrrrrr rr rrbrr'rirrrrsrtrurvrnrrr~r}rrrrrrrrr.rrfuncsrkf2f3 showblocklistargvrrorrrOSErrordetailrrr/r'r(r)rsIIT   $####### "                 2          ###L  !33A)62 66A)95     Ae)HQKKE ,,,111 3RT::A "*12488?"*12488?"*12488>:99888333>4'+!_D_D_D_DFD rzr<t<>FFGNO r=->>FFGNO7 RZr9i66>>?DE  rzy&&$77??@GH )#r+-=tDDbdLL"*88"$@@AKL2:o1889;??@KL"*88"$@@AKL"*88"$@@AKL"*88"$@@AKL 44bd<<=EF 66>>?HI2:::BDBBCNO ?.QQRTRVXXYab 2:@@"$HHITUbj00"$889?@ bj00"$889?@ rz22BD::;BC 66>>?HI 44bd<<=EF RZ..667<= "*66>>?IJ 44bd<<=EF %"*_8M&MOQOSVXVZOZ[[]oo2:924AABMN(A24HH2:A24HHRZ kmomqrr[%[%[%[%|   $    &   @ KRTSS %&(d,,"*rtvtxyy"**+-411!bj@"$HH ;== rzHJJ $$A24HH          u@u@u@p(((8bjErtLL rzI24QQ rz924AA 235499"*GIKIMNN   """JfffR7,7,7,v6           <@\\\\~D'''T****Z$$$&!!!!"*^RT22AAAHrz,bd33 ,444$"""    $(*bbbbJ((( "*W%%+    DDDN 2:12488; ; ; ; |MMM`     D6$$6==#$DbdKK#12499#M2488#$ErtLL " " ")+( ( ( ( ZGGGGT0   zzzz@"""" ! ! !000 "$D?"?"?"?"D9 9 9 xBCCC z E E A B BM Xabb\11 77  qTS[[AA (]]EGG *__GEE &[[ [VXY[[[M"NN " " "MM % % %NN &[[I"NN &[[I#NMM $YYBB '\\MM $YYBB qTS[[ G1dd1gg111 2 2 2 2  BKK  BMM   2Q  Q 2 2 20F00011111111 2 LLOOOO }     |E""HE[0A0AEEEqIIImH%% T+s # # q GGCLLL                XSPs6/992cc cc 'f  f f