f2py fails for functions returning character(len=len(input_string))
See original GitHub issueI’ve written simple toupper() and tolower() functions in Fortran that start like this:
pure function toupper(str)
character(len=*) intent(in) :: str
character(len=len(str)) :: toupper
...
When wrapping these with f2py, I get an error looking like this:
/tmp/tmpmrZ5Ra/src.linux-x86_64-2.7/RMCfunctionsmodule.c: In function ‘f2py_rout_RMCfunctions_mod_functions_toupper’: /tmp/tmpmrZ5Ra/src.linux-x86_64-2.7/RMCfunctionsmodule.c:926:23: error: ‘str_Dims’ undeclared (first use in this function)
slen(toupper) = len(str); ^
I guess the len(str)
needs to be replaced by slen(str)
.
This problem occurs with both f2py-2.7 and f2py-3.3
It does not depend on the name of the variable str
- I tried a couple of other names.
Issue Analytics
- State:
- Created 10 years ago
- Comments:6 (5 by maintainers)
Top Results From Across the Web
f2py fails if a function argument passed to another function
Here is my Fortran code !WRONG function fun1(myfun1) implicit none real(8) :: fun1 real(8),external :: myfun1 fun1 = myfun1(1) return end ...
Read more >F2PY Users Guide and Reference Manual
The purpose of the F2PY –Fortran to Python interface generator– project is to provide a connection between. Python and Fortran languages.
Read more >Using F2PY bindings in Python — NumPy v1.24 Manual
In general, a scalar argument for a F2PY generated wrapper function can be an ... b : in/output rank-0 array(string(len=5),'c') c : input...
Read more >NumPy User Guide
To create sequences of numbers, NumPy provides the arange function which is analogous to the Python built-in range, but returns an array.
Read more >Using F2PY bindings in Python — NumPy v1.9 Manual
Such CObjects can be used as an callback argument of F2PY generated functions to bypass Python C/API layer of calling Python functions from...
Read more >Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start FreeTop Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
Top GitHub Comments
My first reaction (without looking at code) is that f2py should be fixed by replacing
len(..)
call withslen(..)
whenlen
is used in the context of characterlen
specification. Note that there are three kinds of length functions involved here:slen
andlen
defined by f2py and to be used withing .pyf files, andlen
that is Fortran intrinsic. f2pylen
should be used in the context of arrays while f2pyslen
in the context of character types.Here’s what I’ve managed to get so far:
I get:
Running
$ f2py -c strings.f90 strings.pyf
compiles fine, but(note the incorrect intent for
a
)strings.pyf
to usecharacter(len=slen(str)), intent(out) :: a
runs fine and works.So the problem seems to be when using a function but not a subroutine.
When inspecting the code, IIUC the problem comes from the fact that we need to use
slen
for the C function wrapper, butlen
for the fortran function wrapper (both generated by f2py).My question to @pearu is if we should require the use of the
slen
expression in the pyf file in this case, or try to fix this from f2py itself, considering the two separate cases of the fortran and C function wrappers.