[R] Trouble returning 2D array into R from Fortran

Berend Hasselman bhh at xs4all.nl
Sat Oct 20 18:25:04 CEST 2012


See inline.

On 20-10-2012, at 17:18, paulfjbrowne <paulfj.browne at gmail.com> wrote:

> Hello,
> 
> I have been trying to use a collection of Fortran subroutines to return a 2D
> array of calculated values to my R code, calling a Fortran wrapper
> subroutine from R. I've done this successfully before with C & C++ code.
> 
> The Fortran wrapper subroutine  which is to be called by R takes a set of
> input arguments & then should return an array of 2 columns & the specified
> number of rows.
> 
> I've tested the wrapping subroutine from another Fortan main program & it
> does work as expected, so the Fortran works, but my problem has been with
> the correct syntax for retrieving the output double array from within R.
> 
> The wrapping Fortran subroutine is defined; 
> 
> subroutine xypos_parallax_r(k,year,ra,dec,ti,t0,tE,alpha,u0,piee,pien,y)
> 
> k is the number of rows & y an assumed size double array, y(2,*), the other
> arguments are other input variables for the Fortran.
> 
> I've tried putting the Fortran function call inside an R function, with this
> syntax;
> 
> #Source positions in lens plane under annual parallax
> xypos_parallax <- function(year,ra,dec,ti,model_par) {
>  if (!is.loaded('xypos_parallax_r')){
>    dyn.load('parallax.so')}
>  returned_data = .Fortran('xypos_parallax_r',
>                     as.integer(length(ti)),
>                     as.integer(year),
>                     as.double(ra),
>                     as.double(dec),
>                     as.double(ti),
>                     as.double(model_par$t0),
>                     as.double(model_par$tE),
>                     as.double(model_par$alpha),
>                     as.double(model_par$u0),
>                     as.double(model_par$piee),
>                     as.double(model_par$pien),
>                     as.double(array("double",dim=c(2,length(ti)))) )[[12]]
> }
> 

Why as.double(array("double",dim=c(2,length(ti))?
You are passing a character array to your fortran subroutine.
Use matrix(0,nrow=2,ncol=length(ti)) which will be a matrix of double precision's.

Berend

> The input arguments to the Fortran call include the number of rows of the
> output array, with the final argument in the .Fortran call intended to be
> the output array itself. ti is a vector of same length as the number of rows
> needed in the output array.
> 
> Testing this R function calling the Fortran code returns;
> 
> Error in xypos_parallax(year, ra, dec, ti, model_par) : 
>  NA/NaN/Inf in foreign function call (arg 12)
> In addition: Warning message:
> In xypos_parallax(year, ra, dec, ti, model_par) :
>  NAs introduced by coercion
> 
> The Fortran code does work as intended, so the problem must be with how I've
> written the R function making the Fortran call, but I can't see where I've
> gone wrong.
> 
> Would anyone have any idea, or experience with returning multi-dimensional
> arrays from external code into R?
> 
> Thanks in advance
> 
> 
> 
> --
> View this message in context: http://r.789695.n4.nabble.com/Trouble-returning-2D-array-into-R-from-Fortran-tp4646862.html
> Sent from the R help mailing list archive at Nabble.com.
> 
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.




More information about the R-help mailing list