#  Dynamical clover fermions with general gauge action
#  MIMD version 7
#
#  Generic make-include file for wilson_dynamical codes
#  This template file defines rules and macros common to all architectures
#  It is intended to be an include file for other Makefiles.
#  Don't use it by itself!
#
#	"make su3_rmd" used the refreshed molecular dynamics algorithm
#	"make su3_phi" uses phi algorithm.
#	"make su3_hmc" uses hybrid Monte Carlo algorithm.
#	"make su3_rmd_spectrum" uses the refreshed molecular dynamics
#		algorithm and does spectrum measurements
#	"make su3_hmc_spectrum" same, but HMC algorithm
#	"make su3_rmd_screen" uses the refreshed molecular dynamics
#		algorithm and does screening measurements
#  in all cases, defining "LU" causes the dynamical fermion matrix
#  to be the LU preconditioned matrix, on even sites only.
#  Edit the Makefiles to change this.
#

MYINCLUDEDIR = .
INCLUDEDIR = ../include
#Where the complex and su3 libraries are
LIBDIR = ../libraries

GLOBAL_HEADERS = ${INCLUDEDIR} ../libraries/include

MY_HEADERS = \
  lattice.h \
  lattice_qdp.h \
  params.h \
  defines.h \
  cl_dyn_includes.h \
  ${ADDHEADERS}

HEADERS = ${GLOBAL_HEADERS} ${MY_HEADERS} ${INLINE_HEADERS} ${SCIDAC_HEADERS}

# All required object files
# Basic set from current directory
MY_OBJECTS =         \
  control.o          \
  gauge_action.o     \
  loop_table.o       \
  mult_sigma_mu_nu.o \
  path.o             \
  setup.o            \
  udadu_mat_mu_nu.o  \
  udadu_mu_nu.o      \
  update.o           \
  update_u.o         \
  update_h_cl.o      \
  grsource.o         \
  f_measure_cl.o     \
  gauge_info.o

# Basic set from generic directory
G_OBJECTS =          \
  check_unitarity.o  \
  d_plaq4.o          \
  io_helpers.o       \
  io_lat4.o          \
  io_lat_utils.o     \
  make_lattice.o     \
  nersc_cksum.o \
  ploop_dist.o       \
  ranmom.o           \
  ranstuff.o         \
  remap_stdio_from_args.o \
  reunitarize2.o

ifeq ($(strip ${HAVEQIO}),true)
  G_OBJECTS += io_scidac.o io_scidac_types.o
endif

# Basic set from generic_wilson directory
G_WILSON_OBJECTS =   \
  boundary_flip.o    \
  wilson_invert.o    \
  dslash_w3.o         

# Basic set from generic_clover directory
G_CLOVER_OBJECTS =   \
  cl_solver_utilities.o \
  d_congrad2_cl.o    \
  d_cgilu_cl.o  \
  f_mu_nu.o          \
  make_clov2.o

# Objects depending on architecture and software package 

# Selection of layout
ifeq ($(strip ${QCDOC}),true)
  LAYOUT = layout_qcdoc.o # Required
else
  ifeq ($(strip ${HAVEQDP}),true)
    LAYOUT = layout_qdp.o # Required
  else
    LAYOUT = layout_hyper_prime.o # Choices possible here
  endif
endif

# EDRAM allocation for QCDOC
ifeq ($(strip ${QCDOC}),true)
  QCDOC_OBJECTS = qcdoc_alloc.o
endif

ADD_OBJECTS = ${MACHINE_DEP_IO} ${COMMPKG} ${QCDOC_OBJECTS} ${QDP_OBJECTS} \
   ${SCIDAC_OBJECTS}

# Generic QOP objects
ifeq ($(strip ${HAVEQOP}),true)
  ADD_OBJECTS += ${GENERICQOP}
endif

OBJECTS = ${MY_OBJECTS} ${G_OBJECTS} ${G_WILSON_OBJECTS} \
  ${G_CLOVER_OBJECTS} ${LAYOUT} ${ADD_OBJECTS} ${EXTRA_OBJECTS}

#Libraries for complex numbers and su3 functions
P = $(strip ${PRECISION})
QCDLIB = ${LIBDIR}/su3.${P}.a ${LIBDIR}/complex.${P}.a 

LIBRARIES = ${QCDLIB} ${SCIDAC_LIBRARIES}

# Default rule for C compilation
.c.o: ; ${CC} -c ${CFLAGS} $<

# To force a full remake when changing targets
LASTMAKE = .lastmake.${MAKEFILE}.${P}.${MYTARGET}

${LASTMAKE}: ${ALL_MAKES}
	-/bin/rm -f .lastmake.*
	${MAKE} -f ${MAKEFILE} clean
	touch ${LASTMAKE}

# All make files used in this compilation
ALL_MAKES = \
  Make_template \
  ${MAKEFILE} \
  ../Make_template_qop \
  ../Make_template_scidac \
  ../generic/Make_template \
  ../generic_wilson/Make_template \
  ../generic_clover/Make_template \

# To force a remake when changing any make file, header, or target
${OBJECTS} : ${HEADERS} ${LASTMAKE} ${ALL_MAKES}

ifeq ($(strip ${QCDOC}),true)
  DQCDOC = -DQCDOC
endif

ifeq ($(strip ${HAVEQMP}),true)
  DHAVE_QMP = -DHAVE_QMP
endif

ifeq ($(strip ${HAVEQIO}),true)
  DHAVE_QIO = -DHAVE_QIO
endif

ifeq ($(strip ${HAVEQDP}),true)
  DHAVE_QDP = -DHAVE_QDP
endif

ifeq ($(strip ${HAVEQOP}),true)
  DHAVE_QOP = -DHAVE_QOP
endif

DARCH = ${DQCDOC} ${DHAVE_QMP} ${DHAVE_QIO} ${DHAVE_QDP} ${DHAVE_QOP}

# User compiler macro options
# BI specifies biconjugate gradient inversions
# LU specifies LU decomposition with standard cg inversions
#
##### Targets:
# Optional DEFINES for timing:
# -DCGTIME for cg timing and iterations

su3_rmd::
	${MAKE} -f ${MAKEFILE} target "MYTARGET= $@" \
	"DEFINES= -DLU" \
	"EXTRA_OBJECTS= "

su3_rmd_bi::
	${MAKE} -f ${MAKEFILE} target "MYTARGET= $@" \
	"DEFINES= -DLU -DBI" \
	"EXTRA_OBJECTS= d_bicgilu_cl.o"

su3_phi::
	${MAKE} -f ${MAKEFILE} target "MYTARGET= $@" \
	"DEFINES= -DLU -DPHI_ALGORITHM -DBI" \
	"EXTRA_OBJECTS= "

su3_hmc::
	${MAKE} -f ${MAKEFILE} target "MYTARGET= $@" \
	"DEFINES= -DLU -DPHI_ALGORITHM -DHMC_ALGORITHM" \
	"EXTRA_OBJECTS= d_action.o "

su3_hmc_bi::
	${MAKE} -f ${MAKEFILE} target "MYTARGET= $@" \
	"DEFINES= -DLU -DPHI_ALGORITHM -DHMC_ALGORITHM -DBI" \
	"EXTRA_OBJECTS= d_action.o  d_bicgilu_cl.o "

su3_hmc_spectrum::
	${MAKE} -f ${MAKEFILE} target "MYTARGET= $@" \
	"DEFINES= -DLU -DPHI_ALGORITHM -DHMC_ALGORITHM -DSPECTRUM" \
	"EXTRA_OBJECTS= d_action.o gaugefix2.o  \
	t_props_cl.o w_spectrum_cl.o   "

su3_hmc_bi_spectrum::
	${MAKE} -f ${MAKEFILE} target "MYTARGET= $@" \
	"DEFINES= -DLU -DPHI_ALGORITHM -DHMC_ALGORITHM -DBI -DSPECTRUM" \
	"EXTRA_OBJECTS=  d_action.o gaugefix2.o  \
	t_props_cl.o w_spectrum_cl.o  d_bicgilu_cl.o  "

su3_rmd_spectrum::
	${MAKE} -f ${MAKEFILE} target "MYTARGET= $@" \
	"DEFINES= -DLU -DSPECTRUM" \
	"EXTRA_OBJECTS= gaugefix2.o  t_props_cl.o w_spectrum.o   "

su3_hmc_screen::
	${MAKE} -f ${MAKEFILE} target "MYTARGET= $@" \
	"DEFINES= -DLU -DPHI_ALGORITHM -DHMC_ALGORITHM -DSPECTRUM -DSCREEN" \
	"EXTRA_OBJECTS= d_action.o gaugefix2.o  s_props_cl.o    "

su3_hmc_bi_screen::
	${MAKE} -f ${MAKEFILE} target "MYTARGET= $@" \
	"DEFINES= -DLU -DPHI_ALGORITHM -DHMC_ALGORITHM -DBI -DSPECTRUM -DSCREEN" \
	"EXTRA_OBJECTS=  d_action.o gaugefix2.o  \
	s_props_cl.o  d_bicgilu_cl.o  "

clean:
	-/bin/rm -f *.o

# Rules for generic routines
include ../generic/Make_template

# Rules for generic_wilson routines
include ../generic_wilson/Make_template

# Rules for generic_clover routines
include ../generic_clover/Make_template

libmake:
	@echo Building libraries with ${MAKELIBRARIES}
	cd ${LIBDIR} ;\
	${MAKE} -f ${MAKELIBRARIES} "APP_CC=${CC}" "PRECISION=${PRECISION}" all

localmake: ${OBJECTS} ${LIBRARIES}
	${LD} -o ${MYTARGET} ${LDFLAGS} \
	${OBJECTS} ${QCDLIB} ${ILIB} -lm
	touch localmake

target: libmake localmake 



