#
# Makefile for kgec (Kubo-Greenwood Electric Conductivity)
# Prerequisite: QE installed either for parallel or serial execution
# (For QE  versions 5.1.2 5.2.1 5.4.0 6.0 6.1 6.2.1 6.3 6.4.1)
#
# Lazaro Calderin, University of Arizona
# Apr 2019

#
# QE version, build type and root directory.
# Override on the command line, e.g.:
#   make QEV=6.4.1
#   make QEV=5.4.0 TYPE=serial
# DQEV is auto-derived from QEV; override only when forcing a specific stanza.
#

QEV  ?= 5.1.2
TYPE ?= serial

# Map QEV -> DQEV (controls which #ifdef block is enabled in src and which
# Makefile-include stanza is used below).
# NOTE: __QE52 is only half-wired in src (kgecvars.f90 uses it but
# qevars.f90 does not), so we alias 5.2.1 to the 5.1.2 preprocessor path.
DQEV_5.1.2 := QE512
DQEV_5.2.1 := QE512
DQEV_5.4.0 := QE54
DQEV_6.0   := QE6
DQEV_6.1   := QE6
DQEV_6.2.1 := QE62
DQEV_6.3   := QE62
DQEV_6.4.1 := QE64
DQEV_7.0   := QE7
DQEV_7.1   := QE7N
DQEV_7.2   := QE7N
DQEV_7.3   := QE7N
DQEV_7.3.1 := QE7N
DQEV_7.4   := QE7N
DQEV_7.4.1 := QE7N
DQEV_7.5   := QE75

DQEV ?= $(DQEV_$(QEV))

ifeq ($(strip $(DQEV)),)
$(error Unknown QEV='$(QEV)'. Supported: 5.1.2 5.2.1 5.4.0 6.0 6.1 6.2.1 6.3 6.4.1 7.0 7.1 7.2 7.3 7.3.1 7.4 7.4.1 7.5; or set DQEV=... explicitly)
endif

QE = $(HOME)/prgs/qe/qe-gnu/$(QEV)-$(TYPE)


#===================================================================
#
# Load make.inc and redefine/modify QE compilation variables
#

#ifeq ($(strip $(DQEV)),QE64)
#  include $(QE)/make.inc
#  TOPDIR  = $(QE)
#  QEOBJS  = $(QE)/Modules/libqemod.a $(QE)/FFTXlib/libqefft.a 
#  QEOBJS += $(QE)/KS_Solvers/CG/libcg.a $(QE)/KS_Solvers/Davidson/libdavid.a $(QE)/LAXlib/libqela.a 
#  LIBOBJS = $(QEOBJS) $(QE)/iotk/src/libiotk.a $(QE)/UtilXlib/libutil.a $(QE)/clib/clib.a 
#  PPOBJS  = $(QE)/PP/src/libpp.a
#  PWOBJS  = $(QE)/PW/src/libpw.a
#  LIBS    = $(SCALAPACK_LIBS) $(LAPACK_LIBS) $(BLAS_LIBS) $(MPI_LIBS) $(MASS_LIBS) $(HDF5_LIB) $(LIBXC_LIBS) $(LD_LIBS)
#  LIBS   += $(FOX_LIB)
#endif

ifneq (,$(filter $(DQEV), QE62 QE64))
#ifeq ($(strip $(DQEV)),QE62)
  include $(QE)/make.inc
  QEOBJS  = $(QE)/Modules/libqemod.a $(QE)/FFTXlib/libqefft.a
  QEOBJS += $(QE)/KS_Solvers/CG/libcg.a $(QE)/KS_Solvers/Davidson/libdavid.a $(QE)/LAXlib/libqela.a
  LIBOBJS = $(QEOBJS) $(QE)/iotk/src/libiotk.a $(QE)/UtilXlib/libutil.a $(QE)/clib/clib.a
  PPOBJS  = $(QE)/PP/src/libpp.a
  PWOBJS  = $(QE)/PW/src/libpw.a
endif

ifneq (,$(filter $(DQEV), QE7 QE7N QE75))
  include $(QE)/make.inc
  # QE 7 dropped clib/, added libupf, libmbd, xc_lib, libdevXlib;
  # KS_Solvers ships as a single combined libks_solvers.a (still has per-subdir libs too).
  # FFTXlib was reorganized in 7.1: FFTXlib/libqefft.a -> FFTXlib/src/libqefft.a
  # (7.0 used the old layout)
  ifneq (,$(filter $(DQEV), QE7N QE75))
    FFTXLIB_A = $(QE)/FFTXlib/src/libqefft.a
  else
    FFTXLIB_A = $(QE)/FFTXlib/libqefft.a
  endif
  QEOBJS  = $(QE)/KS_Solvers/libks_solvers.a
  QEOBJS += $(QE)/dft-d3/libdftd3qe.a
  QEOBJS += $(QE)/Modules/libqemod.a
  QEOBJS += $(QE)/upflib/libupf.a
  QEOBJS += $(QE)/XClib/xc_lib.a
  QEOBJS += $(FFTXLIB_A)
  QEOBJS += $(QE)/LAXlib/libqela.a
  QEOBJS += $(QE)/UtilXlib/libutil.a
  QEOBJS += $(QE)/MBD/libmbd.a
  QEOBJS += $(QE)/external/devxlib/src/libdevXlib.a
  LIBOBJS = $(QEOBJS)
  PPOBJS  = $(QE)/PP/src/libpp.a
  PWOBJS  = $(QE)/PW/src/libpw.a
endif

ifeq ($(strip $(DQEV)),QE6)
  include $(QE)/make.inc
  QEOBJS  = $(QE)/Modules/libqemod.a $(QE)/FFTXlib/libqefft.a $(QE)/LAXlib/libqela.a
  LIBOBJS = $(QEOBJS) $(QE)/clib/clib.a $(QE)/iotk/src/libiotk.a
  PPOBJS  = $(QE)/PP/src/openfil_pp.o
  PWOBJS  = $(QE)/PW/src/libpw.a
endif

ifneq (,$(findstring QE54, $(DQEV)))
  include $(QE)/make.sys
  QEOBJS  = $(QE)/Modules/libqemod.a $(QE)/FFTXlib/libqefft.a $(QE)/LAXlib/libqela.a
  LIBOBJS = $(QEOBJS) $(QE)/clib/clib.a $(QE)/iotk/src/libiotk.a
  PPOBJS  = $(QE)/PP/src/openfil_pp.o
  PWOBJS  = $(QE)/PW/src/libpw.a
endif

ifneq (,$(findstring QE51, $(DQEV)))
  include $(QE)/make.sys
  QEOBJS  = $(QE)/Modules/libqemod.a
  LIBOBJS = $(QE)/flib/ptools.a $(QE)/flib/flib.a $(QE)/clib/clib.a $(QE)/iotk/src/libiotk.a
  PPOBJS  = $(QE)/PP/src/openfil_pp.o
  PWOBJS  = $(QE)/PW/src/libpw.a
endif

ifneq (,$(findstring QE52, $(DQEV)))
  include $(QE)/make.sys
  QEOBJS  = $(QE)/Modules/libqemod.a
  LIBOBJS = $(QE)/flib/ptools.a $(QE)/flib/flib.a $(QE)/clib/clib.a $(QE)/iotk/src/libiotk.a
  PPOBJS  = $(QE)/PP/src/openfil_pp.o
  PWOBJS  = $(QE)/PW/src/libpw.a
endif


F90FLAGS += -D__$(DQEV)

ifneq (,$(findstring GFORTRAN, $(DFLAGS)))
 MPIF90 += -ffree-line-length-none
 F77    += -ffree-line-length-none
endif


MODFLAGS = -I $(QE)/Modules -I $(QE)/PW/src -I ./

#ifeq ($(strip $(DQEV)),QE64)
# MODFLAGS += -I $(QE)/UtilXlib -I $(QE)/LAXlib
#endif

ifneq (,$(filter $(DQEV), QE62 QE64 QE7 QE7N QE75))
#ifeq ($(strip $(DQEV)),QE62)
 MODFLAGS += -I $(QE)/UtilXlib -I $(QE)/LAXlib
endif

ifneq (,$(filter $(DQEV), QE7 QE7N QE75))
 # In QE 7.x, uspp/atom/paw_variables modules moved to upflib/
 MODFLAGS += -I $(QE)/upflib
endif


#F90FLAGS += -O0 -debug all  -check all  -traceback  -fpp -D__$(DQEV)
#-fpe3 #-ftrapuv #-fpe:0

KGOBJS = \
./qevars.o \
./apawgm.o \
./qe_p_psi.o \
./kgecvars.o \
./kgsigma1.o \
./kgsigma2.o \
./parallel.o \
./kgecchecks.o \
./kgecpaw.o \
./kgecgradient.o \
./kgecout.o \
./kgsigma2_w.o \
./kgepsilon1.o \
./kgepsilon2.o \
./kgrrae.o \
./read_file_nowfc.o

export 

SRCDIR=./gnu/for-qe-$(QEV)-$(TYPE)

#===================================================================

all :
	(cp -r ./src $(SRCDIR); cp makefiles/Makefile.for-qe-$(QEV) $(SRCDIR); \
         cd $(SRCDIR); pwd; $(MAKE) -f Makefile.for-qe-$(QEV) all || exit 1)

clean :
	rm -fr $(SRCDIR)

