Viewing file: func2subr.py (4.99 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#!/usr/bin/env python """
Rules for building C/API module with f2py2e.
Copyright 1999,2000 Pearu Peterson all rights reserved, Pearu Peterson <pearu@ioc.ee> 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. $Date: 2004/11/26 11:13:06 $ Pearu Peterson """
__version__ = "$Revision: 1.16 $"[10:-1]
f2py_version='See `f2py -v`'
import pprint import copy import sys errmess=sys.stderr.write outmess=sys.stdout.write show=pprint.pprint
from auxfuncs import * def var2fixfortran(vars,a,fa=None,f90mode=None): if fa is None: fa = a if a not in vars: show(vars) outmess('var2fixfortran: No definition for argument "%s".\n'%a) return '' if 'typespec' not in vars[a]: show(vars[a]) outmess('var2fixfortran: No typespec for argument "%s".\n'%a) return '' vardef=vars[a]['typespec'] if vardef=='type' and 'typename' in vars[a]: vardef='%s(%s)'%(vardef,vars[a]['typename']) selector={} lk = '' if 'kindselector' in vars[a]: selector=vars[a]['kindselector'] lk = 'kind' elif 'charselector' in vars[a]: selector=vars[a]['charselector'] lk = 'len' if '*' in selector: if f90mode: if selector['*'] in ['*',':','(*)']: vardef='%s(len=*)'%(vardef) else: vardef='%s(%s=%s)'%(vardef,lk,selector['*']) else: if selector['*'] in ['*',':']: vardef='%s*(%s)'%(vardef,selector['*']) else: vardef='%s*%s'%(vardef,selector['*']) else: if 'len' in selector: vardef='%s(len=%s'%(vardef,selector['len']) if 'kind' in selector: vardef='%s,kind=%s)'%(vardef,selector['kind']) else: vardef='%s)'%(vardef) elif 'kind' in selector: vardef='%s(kind=%s)'%(vardef,selector['kind'])
vardef='%s %s'%(vardef,fa) if 'dimension' in vars[a]: vardef='%s(%s)'%(vardef,','.join(vars[a]['dimension'])) return vardef
def createfuncwrapper(rout,signature=0): assert isfunction(rout) ret = [''] def add(line,ret=ret): ret[0] = '%s\n %s'%(ret[0],line) name = rout['name'] fortranname = getfortranname(rout) f90mode = ismoduleroutine(rout) newname = '%sf2pywrap'%(name) vars = rout['vars'] if newname not in vars: vars[newname] = vars[name] args = [newname]+rout['args'][1:] else: args = [newname]+rout['args']
l = var2fixfortran(vars,name,newname,f90mode) return_char_star = 0 if l[:13]=='character*(*)': return_char_star = 1 if f90mode: l = 'character(len=10)'+l[13:] else: l = 'character*10'+l[13:] charselect = vars[name]['charselector'] if charselect.get('*','')=='(*)': charselect['*'] = '10' if f90mode: sargs = ', '.join(args) add('subroutine f2pywrap_%s_%s (%s)'%(rout['modulename'],name,sargs)) if not signature: add('use %s, only : %s'%(rout['modulename'],fortranname)) else: add('subroutine f2pywrap%s (%s)'%(name,', '.join(args))) add('external %s'%(fortranname)) #if not return_char_star: l = l + ', '+fortranname args = args[1:] dumped_args = [] for a in args: if isexternal(vars[a]): add('external %s'%(a)) dumped_args.append(a) for a in args: if a in dumped_args: continue if isscalar(vars[a]): add(var2fixfortran(vars,a,f90mode=f90mode)) dumped_args.append(a) for a in args: if a in dumped_args: continue add(var2fixfortran(vars,a,f90mode=f90mode))
add(l)
if not signature: if islogicalfunction(rout): add('%s = .not.(.not.%s(%s))'%(newname,fortranname,', '.join(args))) else: add('%s = %s(%s)'%(newname,fortranname,', '.join(args))) if f90mode: add('end subroutine f2pywrap_%s_%s'%(rout['modulename'],name)) else: add('end') #print '**'*10 #print ret[0] #print '**'*10 return ret[0]
def assubr(rout): if not isfunction_wrap(rout): return rout,'' fortranname = getfortranname(rout) name = rout['name'] outmess('\t\tCreating wrapper for Fortran function "%s"("%s")...\n'%(name,fortranname)) rout = copy.copy(rout) fname = name rname = fname if 'result' in rout: rname = rout['result'] rout['vars'][fname]=rout['vars'][rname] fvar = rout['vars'][fname] if not isintent_out(fvar): if 'intent' not in fvar: fvar['intent']=[] fvar['intent'].append('out') flag=1 for i in fvar['intent']: if i.startswith('out='): flag = 0 break if flag: fvar['intent'].append('out=%s' % (rname))
rout['args'] = [fname] + rout['args'] return rout,createfuncwrapper(rout)
|