[R-SIG-Mac] gfortran bug?

Andreas Noack Jensen andreas.noack.jensen at econ.ku.dk
Sun Apr 25 22:22:57 CEST 2010

Dear list members

I have organised some code in a package including a Fortran subroutine for a
multivariate recursive filter to simulate VAR-porcesses. I have worked with
R for some time, but I am new to writing packages and coding Fortran so
first I thought I had made some mistakes in the Fortran code but I have now
tested the package on Ubuntu 10.4 and Windows XP and the problem is only
present on Mac.

On Mac I quite randomly get very weird results from the subroutine. It is
like the initial values explodes to fx 2e+290 even for identical calls
without random number generation. Most results are identical to results I
get from a pure R code but at some calls they explode in a non systematic

I would have tried to use the gfortran 4.2.4 from r.research.att.com, to
isolate the error (right now I use their 4.2.3), but it seems like it
installs 4.2.1 instead and I get the same error still. I have tried to build
gfortran myself but was unsuccessful in doing so.

I cannot produce a small example you can run but as an example watch this:

> for(i in 1:500){
+     cat(i)
+     tmp <- I1(civecm:::simulate.I1(fit.postWW2, res =
fit.postWW2$residuals), 2, 'drift')
+ }
1234567891011121314Error in svd(X) : infinite or missing values in 'x'
> for(i in 1:500){
+     cat(i)
+     tmp <- I1(civecm:::simulate.I1(fit.postWW2, res =
fit.postWW2$residuals), 2, 'drift')
+ }
1234Error in svd(X) : infinite or missing values in 'x'

which is weird because there is no random number generation in play.
Completely identical calls every time. The error comes from the weird data
generated in the Fortran subroutine.

Some information about my system:
R version 2.11.0 (2010-04-22)

[1] da_DK.UTF-8/da_DK.UTF-8/C/C/da_DK.UTF-8/da_DK.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] civecm_0.1-1   timsac_1.2.1   MASS_7.3-5     foreign_0.8-40

I use the latest prebuild version of R from r.research.att.com.

Finally the Fortran and R code for the subroute is:

      subroutine rmfilter(x, nl, coef, ndim, init)

      implicit none
      integer, intent(in) :: nl(2), ndim(3)
      double precision, intent(inout) :: x(nl(1),nl(2))
      double precision, intent(in) :: coef(ndim(1),ndim(2),ndim(3)),
      double precision :: y(nl(1),nl(2))
      integer :: i, j

      y = 0.0d+0   
      do i = 1, nl(1), 1
       do j = 1, ndim(3), 1
        if ( i <= j ) then
         call dgemm('N', 'T', 1, ndim(1), nl(2), 1.0d+0,
     &init(ndim(3)-j+1,:), 1, coef(:,:,j), ndim(1), 1.0d+0, y(i,:), 1)
         call dgemm('N', 'T', 1, ndim(1), nl(2), 1.0d+0, y(i-j,:), 1,
     &coef(:,:,j), ndim(1), 1.0d+0, y(i,:), 1)
        end if
       end do
       y(i,:) = y(i,:) + x(i,:)
      end do
      x = y
      end subroutine rmfilter


rmfilter    <- function(x, coef, init)
    if(any(is.na(x))) stop('Series includes NAs')
    if(any(is.na(coef))) stop('Coefficients includes NAs')
    if(is.null(dim(x))) stop('Input series has no dimensions')
    nl        <- dim(x)
    if(!is.array(coef)) stop('coef must be an array')
    cdim    <- dim(coef)
    if(nl[2] != cdim[2] | cdim[1] != cdim[2]) stop('coef has wrong
    if(missing(init)) init <- matrix(0, cdim[3], nl[2])
    else if(any(is.na(init))) stop('Initial values includes NAs')
    else if(any(dim(init) != c(cdim[3], nl[2]))) stop('init matrix has wrong
    ans    <- .Fortran('rmfilter', as.double(x), as.integer(nl),
as.double(coef), as.integer(cdim), as.double(init))[[1]]
    dim(ans)    <- dim(x)
    dimnames(ans)<- dimnames(x)
    tsp(ans)    <- tsp(hasTsp(x))
    class(ans)    <- class(x)


Andreas Noack Jensen        Øster Farimagsgade 5, bygning 26
Ph.d.-stipendiat            1353 København K
Økonomisk Institut          Danmark
Københavns Universitet      Tel. (+1)646-643-0985

More information about the R-SIG-Mac mailing list