# Makefile for MPI-Spin model of Example 2.13 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>
# Modified By:  Pujan Kafle <kafle@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_blocking.prom 
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))

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

jacobi_p0_0: $(PREREQ)
	$(MS) -np=2 -buf=4 -req=8 -DN=2 -DMAXIT=2 jacobi_blocking.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

# This model is unsafe and depends upon buffering of messages.
# To check for potential deadlock -dl option is used with the ms command
# (In target jacobi_p0_1).

jacobi_p0_1: $(PREREQ)
	$(MS) -np=2 -block -chansize=2 -dl -DN=2 -DMAXIT=2 jacobi_blocking.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 -block -chansize=2 -DN=3 -DMAXIT=2 jacobi_blocking.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=3 -block -chansize=2 -DN=7 -DMAXIT=2 jacobi_blocking.prom \
          -DA_SEQ_SIZE=81 -DB_SEQ_SIZE=49 -DA_PAR_SIZE=45 -DB_PAR_SIZE=21
	$(MSCC) -DVECTORSZ=2048
	$(EXECUTE) > jacobi_p0_3.out 2>jacobi_p0_3.err

jacobi_p0_4: $(PREREQ)
	$(MS) -np=4 -block -chansize=2 -DN=11 -DMAXIT=2 jacobi_blocking.prom \
          -DA_SEQ_SIZE=169 -DB_SEQ_SIZE=121 -DA_PAR_SIZE=65  -DB_PAR_SIZE=33
	$(MSCC) -DVECTORSZ=4096
	$(EXECUTE) > jacobi_p0_4.out 2>jacobi_p0_4.err

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

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