Skip to content

Writing R package that call Fortran codes

14 messages · Eduardo M. A. M. Mendes, MacQueen, Don, William Dunlap +2 more

#
Hi,

I'm trying to write an R package that calls a Fortran subroutine on my  Mac
os x El Capitan with Xcode 7 and gfortran 6.1, R 3.3.0.   I can build and
load the library but when I try to use it in R I get this error:
Error in .Fortran("random_epi", : "random_pi" not resolved from current
namespace (NEpidemic).

Then I  tried adding useDynLib(random_epi.f95) in the NAMESPACE file,
additional to useDynLib(NEpidemic). After doing that I couldn't build the
package and it gave me another error:

Error in library.dynam(lib, package, package.lib) :
  shared object ?random_epi.so? not found
Error: loading failed
Execution halted
ERROR: loading failed

When I checked my src folder, there is only random_epi.o file.  How can I
fix this issue? Any help would be much appreciated. I'm vey new to both R
and Fortran coding, especially in package building.

Thanks in advance!
Vineetha
#
Hi

Have you tried to load and run the fortran code using just a wrapper function in R?   I do that as the first step in order to build a package.  

Example:   fortran sources -> rk4_mod_r.f90 ,derive_henonheilles.f90, poincare_section.f90

a) I use R CMD SHLIB rk4_mod_r.f90 ,derive_henonheilles.f90, poincare_section.f90 - o poincare_section_henonheilles_rk4.so 
b) Then I write a wrapper function in R, poinc_section_henonheilles.R
...
 dyn.load("poincare_section_henonheilles_rk4.so")
  
  out<-.Fortran("section_crossing",
                h=as.numeric(h),
                nphas=as.integer(nphas),..
...
c) and call the function as usual.

Please note that the function called by .Fortran is the name of the subroutine within poincare_section.f90 and not the filename.

I take the opportunity to thank R-developers for making the calling of C and Fortran in R very easy.   

I hope this helps.

regards

Ed

PS.  If you need an example of a package using Fortran90, please check https://github.com/emammendes/mittagleffler <https://github.com/emammendes/mittagleffler>

  
  
#
You might want to take this question to R-sig-mac.
#
Hi Eduardo,

 Thanks for your comments. I haven't tried the way you told me. Now when I
tried, got the following error:

*** caught segfault ***
address 0x0, cause 'memory not mapped'

Traceback:
 1: .Fortran("dataxy", n = as.integer(n), tmax = as.integer(tmax),
alpha = as.double(alpha), beta = as.double(beta), x = as.double(0,
length = n), y = as.double(0, length = n), tau = as.integer(0,
length = n))
 2: out(NULL, NULL, NULL, NULL)

Possible actions:
1: abort (with core dump, if enabled)
2: normal R exit
3: exit R without saving workspace
4: exit R saving workspace
Selection:

Any suggestions?

Thanks,
Vineetha

On Wed, Jun 15, 2016 at 3:55 PM, Eduardo M. A. M.Mendes <
emammendes at gmail.com> wrote:

            

  
  
#
Hi Vineetha

It seems that there are some problems in the Fortran code as far as allocating memory is concerned.  If you have statements such as double preciosion :: y(n)   you will need to allocate memory for the vector within the Fortran code or in the R wrapper-function.  It is hard to pinpoint the error without seeing the source files.

Cheers

Ed

  
  
#
alpha = as.double(alpha), beta = as.double(beta), x = as.double(0,
 length = n), y = as.double(0, length = n), tau = as.integer(0,
 length = n))

Are you expecting that
    as.integer(0, length=n)
and
    as.double(0, length = n)
will produce vectors of length 'n'?  They do not and short inputs will
usually
cause memory misuse and crashes in the Fortran code.



Bill Dunlap
TIBCO Software
wdunlap tibco.com

On Thu, Jun 16, 2016 at 10:03 AM, Kodalore Vijayan, Vineetha W <
vwkv13 at mun.ca> wrote:

            

  
  
#
Hi,

@Eduardo:  I do have statements like, double preciosion :: y(n) in my
fortran code. Will change the code and run again.

@ William :  Yes I was initializing X ,Y,and tau, each  have a vector of
length "n".

Thanks,
Vineetha
On Thu, Jun 16, 2016 at 11:54 AM, William Dunlap <wdunlap at tibco.com> wrote:

            

  
  
#
Thanks  Bill for pointing this out.  I haven?t noticed it.

Vineetha, try as.double(rep(0,n)) or as.matrix(rep(0,n)),

Ed

  
  
#
Hi,

 Its running in R separately using dyn.load(). Thanks!

 But my original issue is still there. I still can not build my package. My
source code file name in SRC folder is "randomepi.f95" , the package name
is "NEpidemic". and the wrapper function in the R folder is "randomepi.r".
Not sure if I have to give the same file names.

$R CMD BUILD NEpidemic
shared object ?randomepi.so? not found
   Error: loading failed

My namespace file has the following:

exportPattern("^[[:alpha:]]+")
export(randomepi)
useDynLib(randomepi)
import(graphics,grDevices,stats, utils)


Thanks,
Vineetha


On Thu, Jun 16, 2016 at 12:02 PM, Eduardo M. A. M.Mendes <
emammendes at gmail.com> wrote:

            

  
  
#
Why not simply numeric(n)?

Berend Hasselman
#
as.numeric(rep(0,n)) works too. Please remember that he wants a vector nor a scalar.
#
Indeed it does. And I certainly remembered that the OP wants a vector of length n.
But so does numeric(n), which creates a length n vector. Just try numeric(2).

Berend
#
Thanks for the suggestion Berend. I just tried with numeric(n) and its
working for  x and y.

But my issue is different and its not resolved yet.

-Vineetha
On Thu, Jun 16, 2016 at 1:19 PM, Berend Hasselman <bhh at xs4all.nl> wrote:

            

  
  
#
Thank you Don. I did send an email to R-sig-mac.

-Vineetha
On Thu, Jun 16, 2016 at 10:36 AM, MacQueen, Don <macqueen1 at llnl.gov> wrote: