## Makefile (D. Prendergast/J. Deslippe Jan 2008)
##

PREFIX=..
include $(PREFIX)/Common/common-rules.mk

SRC = rqstar.f90 input.f90 input_q.f90 \
      inread.f90 genwf_disk.f90 genwf_mpi.f90 mtxel.f90 epsinv.f90 mtxelmultiply.f90 \
      extrapolar.f90 epsilon_main.f90 
OBJ = $(SRC:.f90=.o)

# object files from $(COMMON) directory
COMOBJ = bessel.o subgrp.o check_inversion.o svninfo.o sort.o \
         scalapack.o misc.o gmap.o inversion.o write_program_header.o \
         write_matrix.o read_matrix.o fftw.o fullbz.o irrbz.o \
         fft_parallel.o minibzaverage.o vcoul_generator.o \
         trunc_cell_wire.o trunc_cell_box.o trunc_cell_box_d.o \
         trunc_scell_box_d.o checkbz.o eqpcor.o createpools.o \
         random.o input_utils.o wfn_rho_vxc_io.o blas.o lapack.o \
         splines.o eqpcor.o
COMMONOBJS = $(addprefix $(COMMON)/,$(COMOBJ)) $(GLOBALOBJS)

TOOLOBJEXT = epsmat_merge.o epsascbin.o epsbinasc.o ploteps.o epsinvomega.o epsomega.o printchi.o eps0sym.o 


TOOLOBJ = $(TOOLOBJEXT) $(TOOLOBJINT)

LIBS = $(SCALAPACKLIB) $(FFTWLIB) $(LAPACKLIB) $(PERFORMANCE)

default: epsilon

all: epsilon tools

tools: $(TOOLOBJ:.o=$(FLAVOR).x)

epsilon: epsilon$(FLAVOR).x
epsilon$(FLAVOR).x: $(COMMONOBJS) $(OBJ)
	$(LINK) $(FOPTS) -o $@ $^ $(LIBS)
	$(INSTALL_CMD)

epsmat_merge$(FLAVOR).x: $(GLOBALOBJS) epsmat_merge.o
	$(LINK) $(FOPTS) -o $@ $^
	$(INSTALL_CMD)


epsascbin$(FLAVOR).x: $(GLOBALOBJS) epsascbin.o
	$(LINK) $(FOPTS) -o $@ $^
	$(INSTALL_CMD)

epsbinasc$(FLAVOR).x: $(GLOBALOBJS) epsbinasc.o
	$(LINK) $(FOPTS) -o $@ $^
	$(INSTALL_CMD)

eps0sym$(FLAVOR).x: $(GLOBALOBJS) eps0sym.o
	$(LINK) $(FOPTS) -o $@ $^
	$(INSTALL_CMD)

ploteps$(FLAVOR).x: $(GLOBALOBJS) ploteps.o
	$(LINK) $(FOPTS) -o $@ $^
	$(INSTALL_CMD)

epsinvomega$(FLAVOR).x: $(GLOBALOBJS) epsinvomega.o
	$(LINK) $(FOPTS) -o $@ $^
	$(INSTALL_CMD)

epsomega$(FLAVOR).x: $(GLOBALOBJS) epsomega.o $(COMMON)/read_matrix.o $(COMMON)/scalapack.o $(COMMON)/inversion.o \
                     $(COMMON)/lapack.o $(COMMON)/input_utils.o $(COMMON)/splines.o
	$(LINK) $(FOPTS) -o $@ $^ $(LIBS)
	$(INSTALL_CMD)

printchi$(FLAVOR).x: $(GLOBALOBJS) printchi.o
	$(LINK) $(FOPTS) -o $@ $^
	$(INSTALL_CMD)

# dependencies

$(OBJ) $(TOOLOBJ) : $(GLOBALMODS)
epsinv.o : $(COMMON)/inversion_m.mod $(COMMON)/vcoul_generator_m.mod
epsomega.o : $(COMMON)/inversion_m.mod $(COMMON)/input_utils_m.mod

# ifort issued a warning when compiling Epsilon/epsilon_main.f90 on lawrencium
# << Space exceeded in Data Dependence Test in MAIN__               >>
# << Subdivide routine into smaller ones to avoid optimization loss >>
# set FNOOPTS to -O2 in lawrencium.mk and to $(FOPTS) in other .mk files

epsilon_main.o: epsilon_main.f90 $(COMMON)/sort_m.mod $(COMMON)/blas_m.mod $(COMMON)/gmap_m.mod \
                $(COMMON)/scalapack_m.mod extrapolar_m.mod mtxelmultiply_m.mod $(COMMON)/vcoul_generator_m.mod
	$(f90_CPP)
	$(F90_CMD_NOOPT)
	$(RM_P_F_CMD)

input.o genwf_mpi.o genwf_disk.o : $(COMMON)/sort_m.mod
genwf_mpi.o genwf_disk.o : $(COMMON)/gmap_m.mod
genwf_mpi.o : $(COMMON)/blas_m.mod
extrapolar.o extrapolar_m.mod : $(COMMON)/scalapack_m.mod $(COMMON)/fftw_m.mod $(COMMON)/misc_m.mod
mtxelmultiply.o mtxelmultiply_m.mod : $(COMMON)/scalapack_m.mod $(COMMON)/blas_m.mod
epsinv.o epsomega.o : $(COMMON)/scalapack_m.mod
epsilon_main.o input.o mtxel.o : $(COMMON)/fftw_m.mod
input.o mtxel.o epsinv.o input_q.o rqstar.o wfnmix_QSGW.o : $(COMMON)/misc_m.mod
input.o input_q.o : $(COMMON)/input_utils_m.mod $(COMMON)/wfn_rho_vxc_io_m.mod $(COMMON)/eqpcor_m.mod
epsilon_main.o input.o : $(COMMON)/fullbz_m.mod $(COMMON)/irrbz_m.mod
epsilon_main.o epsinv.o : $(COMMON)/write_matrix_m.mod
epsilon_main.o epsomega.o : $(COMMON)/read_matrix_m.mod
