:- use_module(library(lam_mpi)).

:- initialization(main).

main :-
       mpi_init,
       mpi_comm_size(2),
       mpi_comm_rank(Rank),
       do_comm(Rank),
       mpi_finalize.

do_comm(0) :-
	   between(1,10,I),
	   NI is I*1000,
	   gen_list(NI,List),
	   mpi_send(List, 1, I),
	   T =.. [f|List],
	   mpi_send(T, 1, I),
	   writeln(sent:I),
	   fail.
do_comm(0) :-
	   between(1,10,I),
	   NI is 2.3*I,
	   mpi_send(NI, 1, I),
	   fail.
do_comm(0).
do_comm(1) :-
	   between(1,10,I),
	   mpi_recv(0, I, List),
%	   writeln(I:List),
	   mpi_recv(0, I, T),
%	   writeln(I:T),
	   writeln(received:I),
	   fail.
do_comm(1) :-
	   between(1,10,I),
	   mpi_recv(0, I, T),
	   writeln(I:T),
	   fail.
do_comm(1).

gen_list(0,[]) :- !.
gen_list(I,I.List) :-
          I1 is I-1,
          gen_list(I1,List).