From ripley at stats.ox.ac.uk  Fri Jun 18 17:06:20 2010
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Fri, 18 Jun 2010 16:06:20 +0100 (BST)
Subject: [Rd] [R] Use of .Fortran
In-Reply-To: <4C1B7BCB.6070605@auckland.ac.nz>
References: <4C1B7BCB.6070605@auckland.ac.nz>
Message-ID: <alpine.LFD.2.00.1006181551410.17082@gannet.stats.ox.ac.uk>

On Sat, 19 Jun 2010, David Scott wrote:

> I have no experience with incorporating Fortran code and am probably doing 
> something pretty stupid.

Surely you saw in the posting guide that R-help is not the place for 
questions about C, C++, Fortran code?  Diverting to R-devel.

> I want to use the following Fortran subroutine (not written by me) in the

Well, it is not Fortran 77 but Fortran 95, and so needs to be given a 
.f95 extension to be sure to work.

> file SSFcoef.f
>
>      subroutine SSFcoef(nmax,nu,A,nrowA,ncolA)
>      implicit double precision(a-h,o-z)
>      implicit integer (i-n)
>      integer l,i,nmax
>      double precision nu,A(0:nmax,0:nmax)
>      A(0,0) = 1D0
>      do l=1,nmax
>      	do i=1,l-1
>      		A(l,i) = (-nu+i+l-1D0)*A(l-1,i)+A(l-1,i-1)
>      	end do
>      	A(l,0) = (-nu+l-1D0)*A(l-1,0)
>      	A(l,l) = 1D0
>      end do
>      return
>      end
>
>
> I created a dll (this is windows) using R CMD SHLIB SSFcoef.f
>
> Then my R code is:
>
> ### Load the compiled shared library in.
> dyn.load("SSFcoef.dll")
>
> ### Write a function that calls the Fortran subroutine
> SSFcoef <- function(nmax, nu){
>  .Fortran("SSFcoef",
>           as.integer(nmax),
>           as.integer(nu)
>           )$A
> }

That does not match.  nrowA and ncolA are unused, so you need
SSFcoef <- function(nmax, nu){
   .Fortran("SSFcoef",
            as.integer(nmax),
            as.integer(nu),
            A = matrix(0, nmax+1, nmax+1),
            0L, 0L)$A
}


>
> SSFcoef(10,2)
>
> which when run gives
>
>> SSFcoef(10,2)
> NULL
>
> I am pretty sure the problem is that I am not dealing with the matrix A 
> properly. I also tried this on linux and got a segfault.
>
> Can anyone supply the appropriate modification to my call (and possibly to 
> the subroutine) to make this work?
>
> David Scott
>
>
> -- 
> _________________________________________________________________
> David Scott	Department of Statistics
> 		The University of Auckland, PB 92019
> 		Auckland 1142,    NEW ZEALAND
> Phone: +64 9 923 5055, or +64 9 373 7599 ext 85055
> Email:	d.scott at auckland.ac.nz,  Fax: +64 9 373 7018
>
> Director of Consulting, Department of Statistics
>
> ______________________________________________
> 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.
>

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



[Rd] [R] Use of .Fortran
Prof Brian Ripley