##----------------------------------------------------------------------
## sieve7.F77.18.R
## Sieve of Eratosthenes search for primes.
## Calculate prime numbers up to 100 million.
## Calls a Fortran routine in a .so shared object file
## 18/04/2020
##----------------------------------------------------------------------

sink('sieve7.F77.18.out')

rm(list=objects())
gc()

if( !is.loaded(symbol = 'findp5') ) {
    dyn.load('ACRO.so')
}

kMAX <- as.integer(1.e8)
kprimes <- rep(0L, kMAX)
kkmax <- 0L
ifail <- 0L
memory.size()
for( jloop in 1:7 ) {
    if( exists('list2') ) {
        rm(list2)
        gc()  
    }
    if( jloop==1 ) {
        kMAX <- 100L
        kFAC <- c(2, 3, 5, 7)       ## primes 0 to 10, as before
        NKFAC <- length(kFAC)
    } else {
        kMAX <- as.integer(10*kMAX)
    }
    nprimes <- 0L
    print(system.time(
        list2 <- .Fortran('findp5',
            nkfac=as.integer(NKFAC),     kfac=as.integer(kFAC),
            kmax=as.integer(kMAX),
            kprimes=as.integer(kprimes), nprimes=as.integer(nprimes),
            kkmax=as.integer(kkmax),     ifail=as.integer(ifail))
    ))
    print(list2$nprimes)            ## the number of primes found
    print(list2$kkmax)
    nprimes <- list2$nprimes
    if( jloop <= 3 ) {      ## too many to show beyond this point!
        print(list2$kprimes[1:nprimes])
    }
    kFAC <- list2$kprimes[1:nprimes]  ## for the next try
    NKFAC <- nprimes
    print(memory.size())
}

sink()