Thanks! now it works !

Giacomo


Duncan Murdoch wrote:
On 11/09/2009 4:39 AM, Giacomo Santini wrote:
Dear R users,


I have to call fortran program from within R (R 2.8.1 on ubuntu 8.10 machine). Suppose I have a fortran code like this (this is only a toy model, my working model is far more complex, but input/output is similar)


      DOUBLE PRECISION FUNCTION model(times, alfa, beta)
      DOUBLE PRECISION alfa, beta, times
      model=beta*sin(times)+alfa*cos(times)
      END FUNCTION

which is saved as model.f.

I wrote a wapper like this (saved as wrapper.f)

       SUBROUTINE model_wrapper(times, alfa, beta, answer)
       DOUBLE PRECISION times, alfa, beta, answer
       EXTERNAL model
       answer = model(times, alfa, beta)
       END SUBROUTINE

It's been a long time since I worked in Fortran, but don't you need to declare that model returns a double precision value in the wrapper? By default in ancient Fortran model would be an integer value. Since you compile the two functions separately, the wrapper code won't see the declaration in model.f.


Then I compiled all this stuff

g77 -fno-second-underscore -c -fPIC model.f
g77 -fno-second-underscore -c -fPIC wrapper.f
g77 -fno-second-underscore -shared -o model.so model.o wrapper.o

I would use R CMD SHLIB model.f wrapper.f

to be sure the options match what R is expecting.

Duncan Murdoch



 From within R

dyn.load('model.so')
model <- function(times, alfa, beta) {
returned_data = .Fortran('model_wrapper', times=as.double(times), alfa=as.double(alfa),
      beta=as.double(beta), result=double(1))
      return(returned_data) }

# example run
test_1<-model(1.0,0.2,0.3)

which gives

test_1$times
[1] 1.0
$alfa
[1] 0.2
$beta
[1] 0.3
$result
[1] 147456887

where $result is clearly wrong.

I suppose I made some mistake with the handling of data types, but I am not able to figure out where.

Can someboby help me?


Giacomo




--
-------------------------------------------------------
Giacomo Santini PhD
Dipartimento di Biologia Evoluzionistica "Leo Pardi"
Universita' degli Studi di Firenze
Via Romana 17
I-50125 Firenze
Italy

Tel: +39 055 2288288 (DBE) - +39 0574 447727 (CESPRO)
Fax: +39 055 2288289
www.dbe.unifi.it/santini

______________________________________________
R-help@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.

Reply via email to