# Makefile for MPI-Spin model of Example 2.17 from
# "MPI: The Complete Reference, vol. 1", 2nd ed.

# We are using model checking with symbolic execution
# to establish the equivalence between sequential and 
# parallel version of Jacobi iteration.

# Author:       Dr. Stephen Siegel <siegel@cis.udel.edu>
# Last modified: 30-jul-2007

PREP       = rm -f pan* *trail mpi-spin-init.c
MS         = $(PREP) ; ms -notest -nocancel -noprobe \
             -crmax=100 -crhash=100 -DVERBOSE
MSCC       = mscc -DCOLLAPSE -DSAFETY
PREREQ     = jacobi.h jacobi.prom jacobi_support.c
EXECUTE    = (time ./pan -n)

# A_SEQ_SIZE == (N+2)*(N+2)
# B_SEQ_SIZE == N*N
# A_PAR_SIZE == (N+2)*(N/NPROCS + (N%NPROCS==0 -> 2 : 3))
# B_PAR_SIZE == N*(N/NPROCS + (N%NPROCS==0 -> 0 : 1))

small: jacobi_p0_0 \
       jacobi_p0_1 \
       jacobi_p0_2 \
       jacobi_p0_3 \
       jacobi_p0_4 \
       jacobi_p0_5

all: small \
     jacobi_p0_6 \
     jacobi_p0_7 \
     jacobi_p0_8 \
     jacobi_p0_9

dl: jacobi_dl.prom
	ms -notest -nocancel -noprobe -DVERBOSE \
           -np=7 -req=28 -buf=0 -DMAXIT=3 jacobi_dl.prom
	$(MSCC)
	$(EXECUTE) > jacobi_dl.txt


jacobi_p0_0: $(PREREQ)
	$(MS) -np=2 -req=8 -buf=0 -DN=2 -DMAXIT=1 jacobi.prom \
          -DA_SEQ_SIZE=16 -DB_SEQ_SIZE=4 -DA_PAR_SIZE=12 -DB_PAR_SIZE=2
	$(MSCC)
	$(EXECUTE) > jacobi_p0_0.out 2>jacobi_p0_0.err

jacobi_p0_1: $(PREREQ)
	$(MS) -np=2 -req=8 -buf=0 -DN=2 -DMAXIT=2 jacobi.prom \
          -DA_SEQ_SIZE=16 -DB_SEQ_SIZE=4 -DA_PAR_SIZE=12 -DB_PAR_SIZE=2
	$(MSCC)
	$(EXECUTE) > jacobi_p0_1.out 2>jacobi_p0_1.err

jacobi_p0_2: $(PREREQ)
	$(MS) -np=2 -req=8 -buf=0 -DN=3 -DMAXIT=1 jacobi.prom \
          -DA_SEQ_SIZE=25 -DB_SEQ_SIZE=9 -DA_PAR_SIZE=20 -DB_PAR_SIZE=6
	$(MSCC)
	$(EXECUTE) > jacobi_p0_2.out 2>jacobi_p0_2.err

jacobi_p0_3: $(PREREQ)
	$(MS) -np=2 -req=8 -buf=0 -DN=3 -DMAXIT=2 jacobi.prom \
          -DA_SEQ_SIZE=25 -DB_SEQ_SIZE=9 -DA_PAR_SIZE=20 -DB_PAR_SIZE=6
	$(MSCC)
	$(EXECUTE) > jacobi_p0_3.out 2>jacobi_p0_3.err

jacobi_p0_4: $(PREREQ)
	$(MS) -np=2 -req=8 -buf=4 -DN=3 -DMAXIT=2 jacobi.prom \
          -DA_SEQ_SIZE=25 -DB_SEQ_SIZE=9 -DA_PAR_SIZE=20 -DB_PAR_SIZE=6
	$(MSCC)
	$(EXECUTE) > jacobi_p0_4.out 2>jacobi_p0_4.err

# the following one throws error: two isends simultaneously access
# same buffer for nprocs=2 this wasn't a problem because one of the
# two isends had destination MPI_PROC_NULL.

jacobi_p0_5: $(PREREQ)
	$(MS) -np=3 -req=12 -buf=0 -DN=3 -DMAXIT=2 jacobi.prom \
          -DA_SEQ_SIZE=25 -DB_SEQ_SIZE=9 -DA_PAR_SIZE=15 -DB_PAR_SIZE=3
	$(MSCC)
	$(EXECUTE) > jacobi_p0_5.out 2>jacobi_p0_5.err
	./pan -r > trail_p0_5.txt

jacobi_p0_6: $(PREREQ)
	$(MS) -np=3 -req=12 -buf=6 -DN=6 -DMAXIT=2 jacobi.prom \
          -DA_SEQ_SIZE=64 -DB_SEQ_SIZE=36 -DA_PAR_SIZE=32 -DB_PAR_SIZE=12
	$(MSCC)
	$(EXECUTE) > jacobi_p0_6.out 2>jacobi_p0_6.err

jacobi_p0_7: $(PREREQ)
	$(MS) -np=3 -req=12 -buf=6 -DN=7 -DMAXIT=2 jacobi.prom \
          -DA_SEQ_SIZE=81 -DB_SEQ_SIZE=49 -DA_PAR_SIZE=45 -DB_PAR_SIZE=21
	$(MSCC) -DVECTORSZ=2048
	$(EXECUTE) > jacobi_p0_7.out 2>jacobi_p0_7.err

jacobi_p0_8: $(PREREQ)
	$(MS) -np=4 -req=16 -buf=0 -DN=11 -DMAXIT=2 jacobi.prom \
          -DA_SEQ_SIZE=169 -DB_SEQ_SIZE=121 -DA_PAR_SIZE=65  -DB_PAR_SIZE=33
	$(MSCC) -DVECTORSZ=4096
	$(EXECUTE) > jacobi_p0_8.out 2>jacobi_p0_8.err

jacobi_p0_9: $(PREREQ)
	$(MS) -np=4 -req=16 -buf=0 -DN=10 -DMAXIT=3 jacobi.prom \
          -DA_SEQ_SIZE=144 -DB_SEQ_SIZE=100 -DA_PAR_SIZE=60  -DB_PAR_SIZE=30
	$(MSCC) -DVECTORSZ=4096
	$(EXECUTE) > jacobi_p0_9.out 2>jacobi_p0_9.err

jacobi_p0_10: $(PREREQ)
	$(MS) -np=6 -req=24 -buf=0 -DN=12 -DMAXIT=3 jacobi.prom \
          -DA_SEQ_SIZE=196 -DB_SEQ_SIZE=144 -DA_PAR_SIZE=56  -DB_PAR_SIZE=24
	$(MSCC) -DVECTORSZ=4096
	$(EXECUTE) > jacobi_p0_10.out 2>jacobi_p0_10.err

clean:
	-rm -f pan* *.trail *.out mpi-spin-init.c trail*.txt *.err *~
