In this post I write an example about how to launch a fortran executable form a java program passing some arguments and getting back a result.
The chosen example uses code written in fortran to get primes, it is from Sieve of Eratosthenes.
program sieve
  implicit none
  integer :: i_max
  integer :: i
  logical, dimension (:), allocatable :: is_prime
  character(len=10) :: arg
  call getarg(1,arg)
  if(arg .ne. '') then
    read(arg,*) i_max
  else
    i_max=100
  end if
  allocate(is_prime(i_max))
  is_prime = .true.
  is_prime (1) = .false.
  do i = 2, int (sqrt (real (i_max)))
    if (is_prime (i)) is_prime (i * i : i_max : i) = .false.
  end do
  do i = 1, i_max
    if (is_prime (i)) write (*, '(i0)', advance = 'yes') i
  end do
end program sieve
Unlike the original code, the program accepts an argument, it is equal to i_max (row 12) and it is the upper limit in the search for prime numbers.
The java code to launch the fortran program is:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
public class Main {
    private final static Logger log = Logger.getLogger(Main.class);
    public static void main(String[] args) {
	int max = 0;
	if (args.length > 0) {
	    try {
		max = Integer.parseInt(args[0]);
	    } catch (NumberFormatException e) {
		System.err.println("Argument" + " must be an integer");
		System.exit(1);
	    }
	}
	List<Integer> primes = new ArrayList<Integer>();
	try {
	    String line;
	    Process p = Runtime
		    .getRuntime()
		    .exec(new String[] {
			    "[put the path to the fortran executable]",
			    Integer.toString(max) });
	    BufferedReader bri = new BufferedReader(new InputStreamReader(
		    p.getInputStream()));
	    BufferedReader bre = new BufferedReader(new InputStreamReader(
		    p.getErrorStream()));
	    while ((line = bri.readLine()) != null) {
		primes.add(new Integer(line));
	    }
	    bri.close();
	    while ((line = bre.readLine()) != null) {
		System.out.println(line);
	    }
	    bre.close();
	    p.waitFor();
	    Iterator<Integer> it = primes.iterator();
	    while (it.hasNext()) {
		log.debug(it.next());
	    }
	} catch (Exception err) {
	    err.printStackTrace();
	}
    }
}
This code is from Execute an external program.
At the lines 29-33 the fortran executable is called with the statement Runtime.getRuntime().exec() with argument a string array whose first element is the path to the fortran executable and the second one is the highest number to which to look for prime numbers.
The second element is passed to the java program as argument.
If you run the java program with 100 as argument you get the sequence of prime numbers between 2 and 97 on the console.


Leave a Reply