Re: [Rd] Generate random numbers in Fortran

From: Kjell Konis <kjell.konis_at_epfl.ch>
Date: Sat, 14 Feb 2009 12:35:57 +0100

Sorry, my example was just to give you a rough idea of how to do this. Here is an example that works.

myrandom.c:

#include <R.h>
#include <Rmath.h>

void F77_SUB(fseedi)(void)
{

   GetRNGstate();
}

void F77_SUB(fseedo)(void)
{

   PutRNGstate();
}

void F77_SUB(myrbeta)(double* px, double* pa, double* pb) {

        *px = rbeta(*pa, *pb);
}

and example.f

       subroutine example(x, a, b)
       implicit double precision (a-h,o-z)
       call fseedi()
       call myrbeta(x, a, b)
       call fseedo()
       end



Note: it is important that there are 6 spaces at the beginning of each line.

Also, don't do this:

void F77_SUB(myrbeta)(double* px)
{

     GetRNGstate();
     *px = rbeta(1.00,3.00);
     PutRNGstate();

}

It spends more time seeding the random number generator than generating random numbers.

Regards,
Kjell

On Feb 14, 2009, at 11:09 AM, Fabio Mathias wrote:

> As I am wanting to generate a beta, then I created a function in C
> to generate a beta, but the problem appears when I go to compile
>
> My function in C is
>
> #include <R.h>
> #include <Rmath.h>
> #include <math.h>
>
> void F77_SUB(myrbeta)(double* px)
> {
> GetRNGstate();
> *px = rbeta(1.00,3.00);
> PutRNGstate();
> }
>
> My function in Fortran is
>
> subroutine blah(a)
> double precision (a)
> call myrbeta(RND)
> end
>
> The error
>
> fmcron_at_fmcron-desktop:~/teste$ R CMD SHLIB mat.c blah.f
> gcc -std=gnu99 -I/usr/share/R/include -fpic -g -O2 -c mat.c -
> o mat.o
> gfortran -fpic -g -O2 -c blah.f -o blah.o
> blah.f:1.1:
>
> subroutine blah(a)
> 1
> Erro: Non-numeric character in statement label at (1)
> blah.f:1.1:
>
> subroutine blah(a)
> 1
> Erro: Unclassifiable statement at (1)
> blah.f:2.1:
>
> double precision (a)
> 1
> Erro: Non-numeric character in statement label at (1)
> blah.f:2.1:
>
> double precision (a)
> 1
> Erro: Unclassifiable statement at (1)
> blah.f:4.1:
>
> end
> 1
> Erro: Non-numeric character in statement label at (1)
> blah.f:4.1:
>
> end
> 1
> Erro: Unclassifiable statement at (1)
> make: ** [blah.o] Erro 1
>
>
> Fábio Mathias Corrêa
> UFLA
>
>
> --- Em sex, 13/2/09, Kjell Konis <kjell.konis_at_epfl.ch> escreveu:
> De: Kjell Konis <kjell.konis_at_epfl.ch>
> Assunto: Re: [Rd] Generate random numbers in Fortran
> Para: "fabio.ufla_at_yahoo.com.br" <fabio.ufla_at_yahoo.com.br>
> Cc: "r-devel_at_r-project.org" <r-devel_at_r-project.org>
> Data: Sexta-feira, 13 de Fevereiro de 2009, 16:49
>
> Take a look at section 6.6 in Writing R Extensions. It describes
> how to call C
> functions from FORTRAN.
>
> Basically it just boils down to this, in a C file define
> the functions
>
> void F77_SUB(fseedi)(void)
> {
> int x = 100;
> seed_in(&x);
> }
>
>
> void F77_SUB(fseedo)(void)
> {
> int x = 100;
> seed_out(&x);
> }
>
>
> void F77_SUB(myrunif)(double* px)
> {
> *px = unif_rand();
> }
>
>
> Then you could write a FORTRAN subroutine like
>
> subroutine blah()
> implicit double precision (a-h,o-z)
> call fseedi()
> call myrunif(RND)
> call fseedo()
> end
>
> The fseed* subroutines only need to be called once, fseedi at the
> beginning of
> your FORTRAN code and fseedo at the end.
>
> HTH,
> Kjell
>
>
> On 13 févr. 09, at 17:32, Fabio Mathias wrote:
>
> > Hi!!!
> > It would like to know if it exists a form to use the functions to
> > generate variates in FORTRAN with the same easiness I use that
> them in
> > C? Or not?
> > If yes. They
>
> would have some example? I would like to use the functions
> rbeta, rlnorm and others!
> >
> >
> > Sorry my english..rsrsrs
> >
> > Thanks!!!
> >
> >
> > Fábio Mathias Corrêa University Federal of the
> Lavras -
> Brazil
> >
> >
> >
> > Veja quais são os assuntos do momento no Yahoo! +Buscados
> >
> > [[alternative HTML version deleted]]
> >
> > <ATT00001.txt>
>
>
> Veja quais são os assuntos do momento no Yahoo! + Buscados: Top 10
> - Celebridades - Música - Esportes

        [[alternative HTML version deleted]]



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Sat 14 Feb 2009 - 10:39:23 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Sat 14 Feb 2009 - 18:30:23 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive