#INSTALL_DIR = /users/local/mpich-3.3.1_intel
###################################################################
#INSTALL_DIR = /opt/cray/mpt/7.3.2/gni/mpich-intel/15.0

FC = mpif90 -fc=ifort

# -diag-disable=8291 for disabling "Recommended relationship between field width and number of fractional digits"
EXTRAOPTS=-qopenmp -march=core-avx2 \
        -diag-disable=8291 -WB \
        -fimf-precision=high -prec-div -prec-sqrt \
        ${FORTRAN_DEBUG_FLAGS} ${PROFILER_FLAGS} ${FLAGS}
        -fimf-precision=high -fimf-arch-consistency=true \
        -fp-model precise -prec-div -prec-sqrt ${PROFILER_FLAGS}

#EXTRAOPTS=-qopenmp -march=native \
#	-diag-disable=8291 -WB \
#	-fimf-precision=high \
#	-prec-div -prec-sqrt

#EXTRAOPTS=-qopenmp

ifeq ($(strip $(DEBUG_FLAGS)),)
	OPTIMIZE3=-O3 -ipo
	OPTIMIZE2=-O2 -ip
else
	OPTIMIZE3=-O3
	OPTIMIZE2=-O2
endif

OPT  = ${EXTRAOPTS} ${DEBUG_FLAGS} ${OPTIMIZE3} -mcmodel=medium -shared-intel -I$(INSTALL_DIR)/include
OPT2 = ${EXTRAOPTS} ${OPTIMIZE2} -mcmodel=medium -shared-intel -I$(INSTALL_DIR)/include
OPT0 = ${EXTRAOPTS} -g -O0 -mcmodel=medium -shared-intel -I$(INSTALL_DIR)/include
OPT1 = ${EXTRAOPTS} -g -CA -CB -mcmodel=medium -shared-intel -I$(INSTALL_DIR)/include
#OPT3 = ${OPT0} -g -CA -CB
#OPT2 = ${OPT0} -g -CA -CB
#OPT = ${OPT0} -g -CA -CB
FFLAGS0 = -c ${OPT0} -CA -CB
FFLAGS  = -c ${OPT} 
FFLAGS2 = -c ${OPT2}
FFLAGS1 = -c ${OPT1}
FFLAGS0 = -c ${OPT0}

#LIBS = -L$(INSTALL_DIR)/lib -lmpi xdrf/libxdrf.a
LIBS = -L$(INSTALL_DIR)/lib -lmpi xdrf/libxdrf.a ${SITE_LIBS}
#/opt/cray/mpt/7.3.2/gni/mpich-intel/15.0/lib/libmpich.a

ARCH = LINUX
PP = /lib/cpp -P

OUTPUTDIR = /users2/adam/UNRES/bin

all: no_option
	@echo "Specify NEWCORR5D or NEWCORR5D_DFA"

.SUFFIXES: .F
.F.o:
	${FC} ${FFLAGS} ${CPPFLAGS} $*.F


object = unres.o arcos.o cartprint.o chainbuild-new.o convert.o initialize_p.o \
	matmult.o readrtns_CSA.o read_dist_constr.o parmread.o gen_rand_conf.o printmat.o map.o \
	pinorm.o randgens.o rescode.o intcor.o timing.o misc.o nmr_hpos.o xlinks.o esaxs.o out_viol.o \
	cart2intgrad-new.o checkder_p.o contact_cp.o edis_aveave.o econstr_local.o econstr_qlike.o \
	econstrq-PMF.o PMFprocess.o energy_p_new_barrier.o eelec_prep.o vec_and_deriv.o \
	eelec.o egb.o escp.o loc_precalc.o etor_kcc.o ebend_kcc.o \
	mytschebyshev.o make_list_RESPA_new.o make_list_new.o \
	energy_p_new-sep_barrier.o eelec_scale_save.o gradient_p.o minimize_p.o sumsld.o \
	e_modeller.o etheta_constr_aveave.o etor_constr_aveave.o \
        cored.o rmdd.o geomout.o readpdb-mult.o int_from_cart.o regularize.o \
	thread.o fitsq.o mcm.o \
	mc.o bond_move.o refsys.o check_sc_distr.o check_bond.o contact.o \
	eigen.o blas.o add.o entmcm.o minim_mcmf.o \
	together.o csa.o minim_jlee.o shift.o diff12.o bank.o newconf.o ran.o \
	indexx.o MP.o compare_s1.o prng_32.o \
	banach.o rmsd.o rmscalc.o elecont.o dihed_cons.o \
	sc_move.o local_move.o djacob.o \
	intcartderiv.o lagrangian_lesyng.o\
	chain_symmetry.o permut.o seq2chains.o iperm.o\
	stochfric.o kinetic_lesyng.o MD_A-MTS.o moments.o int_to_cart.o \
	surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split-sep.o \
	q_measure.o gnmr1.o mygauss.o ssMD.o gen_rand_conf_mchain.o orig_frame_chain.o \
	place_coords_in_box.o box.o block_partition.o list_merge.o calc_bondvec.o \
	omp.o lipid.o grid.o grid_arrays.o aveint_period.o nmrave_info.o restart.o wham_calc1.o

object_lbfgs = inform.o iounit.o keys.o linmin.o math.o minima.o scales.o output.o lbfgs.o search.o optsave_dum.o

no_option:

profile-NEWCORR5D: PROFILER_FLAGS= -gsplit-dwarf -fno-omit-frame-pointer
profile-NEWCORR5D: NEWCORR5D

NEWCORR5D: CPPFLAGS = -DPROCOR -DLINUX -DPGI -DAMD64 -DUNRES -DISNAN -DMP -DMPI \
	   -DSPLITELE -DLANG0 -DNEWCORR -DCORRCD -DFIVEDIAG -DLBFGS -DTIMING   \
           -DTIMING_ENE -DDPREC -DCHECK_GRAD_AVE -DSC_END -DPAWEL -DREPAVE -DCHECK_MREMD_GRAD # -DSCALE_ERESTR
#NEWCORR5D: BIN = ${OUTPUTDIR}/unres_ifort_MPICH-tryton-HCD5-EuroHPC-TAVE.exe
#NEWCORR5D: BIN = ${OUTPUTDIR}/unres_remd_ave_restart.exe
NEWCORR5D: BIN = ${OUTPUTDIR}/unres_ifort_MPICH-HCD5-timeave-REP_SC_END-SS-newtriss_SCEND.exe
NEWCORR5D: ${object_lbfgs} ${object} fdisy.o fdiag.o machpd.o kinetic_CASC.o xdrf/libxdrf.a
	./make-cinfo.sh > cinfo.f
	${FC} ${FFLAGS} cinfo.f
	${FC} ${OPT} ${object} ${object_lbfgs} fdisy.o fdiag.o machpd.o kinetic_CASC.o cinfo.o ${LIBS} -o ${BIN}
#${FC} ${OPT} ${object} ${object_lbfgs} fdisy.o fdiag.o machpd.o kinetic_CASC.o cinfo.o ${LIBS} -Wl,-M -o ${BIN}

NEWCORR: CPPFLAGS = -DPROCOR -DLINUX -DPGI -DAMD64 -DUNRES -DISNAN -DMP -DMPI \
	-DSPLITELE -DLANG0 -DNEWCORR -DCORRCD -DLBFGS -DTIMING -DTIMING_ENE -DAMBER
NEWCORR: BIN = ${OUTPUTDIR}/unres_ifort_MPICH-tryton-EuroHPC-ene1000.exe
NEWCORR: ${object_lbfgs} ${object} fdisy.o fdiag.o machpd.o kinetic_CASC.o xdrf/libxdrf.a
	./make-cinfo.sh > cinfo.f
	${FC} ${FFLAGS} cinfo.f
	${FC} ${OPT} ${object} ${object_lbfgs} fdisy.o fdiag.o machpd.o kinetic_CASC.o cinfo.o ${LIBS} -o ${BIN}

SINGLE: FC = ifort
SINGLE: CPPFLAGS = -DPROCOR -DLINUX -DPGI -DAMD64 -DUNRES -DISNAN \
	-DSPLITELE -DLANG0 -DNEWCORR -DCORRCD -DFIVEDIAG -DLBFGS -DTIMING -DTIMING_ENE #-DSC_END
SINGLE: LIBS = xdrf/libxdrf.a
SINGLE: BIN = ${OUTPUTDIR}/unres_ifort_MPICH-tryton-HCD5-EuroHPC-single.exe
SINGLE: ${object_lbfgs} ${object} fdisy.o fdiag.o machpd.o kinetic_CASC.o xdrf/libxdrf.a
	./make-cinfo.sh > cinfo.f
	${FC} ${FFLAGS} cinfo.f
	${FC} ${OPT} ${object} ${object_lbfgs} fdisy.o fdiag.o machpd.o kinetic_CASC.o cinfo.o ${LIBS} -o ${BIN}

NEWCORR5D_DFA: CPPFLAGS = -DPROCOR -DLINUX -DPGI -DAMD64 -DUNRES -DISNAN -DMP -DMPI \
	-DSPLITELE -DLANG0 -DNEWCORR -DCORRCD -DFIVEDIAG -DLBFGS -DDFA #-DMYGAUSS #-DTIMING
NEWCORR5D_DFA: BIN = ${OUTPUTDIR}/unres_ifort_MPICH-tryton-HCD5-DFA-EuroHPC.exe
NEWCORR5D_DFA: ${object_lbfgs} ${object} dfa.o fdisy.o fdiag.o machpd.o kinetic_CASC.o xdrf/libxdrf.a
	./make-cinfo.sh > cinfo.f
	${FC} ${FFLAGS} cinfo.f
	${FC} ${OPT} ${object_lbfgs} ${object} fdisy.o fdiag.o machpd.o dfa.o kinetic_CASC.o cinfo.o ${LIBS}  -o ${BIN}

xdrf/libxdrf.a:
	cd xdrf && make

clean:
	/bin/rm -f *.o *.mod && cd xdrf && make clean

test.o: test.F
	${FC} ${FFLAGS} ${CPPFLAGS} test.F

chainbuild-new.o: chainbuild-new.F
	${FC} ${FFLAGS} ${CPPFLAGS} chainbuild-new.F

djacob.o: djacob.f
	${FC} ${FFLAGS0} djacob.f

matmult.o: matmult.f
	${FC} ${FFLAGS} ${CPPFLAGS} matmult.f

parmread.o : parmread.F
	${FC} ${FFLAGS} ${CPPFLAGS} parmread.F

intcor.o : intcor.f
	${FC} ${DEBUG_FLAGS} ${FFLAGS} ${CPPFLAGS} intcor.f

cartder.o : cartder.F
	${FC} ${DEBUG_FLAGS} ${FFLAGS} ${CPPFLAGS} cartder.F

grid_arrays.mod grid_arrays.o : grid_arrays.F
	${FC} ${DEBUG_FLAGS} ${FFLAGS} ${CPPFLAGS} grid_arrays.F

grid.o : grid.F grid_arrays.mod
	${FC} ${DEBUG_FLAGS} ${FFLAGS} ${CPPFLAGS} $<

energy_p_new_barrier.o : energy_p_new_barrier.F grid_arrays.mod
	${FC} ${DEBUG_FLAGS} ${FFLAGS} ${CPPFLAGS} $<

edis.o : edis.F
	${FC} ${DEBUG_FLAGS} ${FFLAGS} ${CPPFLAGS} $<

readpdb-mult.o : readpdb-mult.F
	${FC} ${FFLAGS0} ${CPPFLAGS} readpdb-mult.F

readrtns_CSA.o : readrtns_CSA.F
	${FC} ${FFLAGS0} ${CPPFLAGS} readrtns_CSA.F

sumsld.o : sumsld.f
	${FC} ${FFLAGS} ${CPPFLAGS} sumsld.f
        
cored.o : cored.f
	${FC} ${FFLAGS1} ${CPPFLAGS} cored.f
 
rmdd.o : rmdd.f
	${FC} ${FFLAGS} ${CPPFLAGS} rmdd.f

blas.o : blas.f
	${FC} ${FFLAGS1} blas.f

add.o : add.f
	${FC} ${FFLAGS1} add.f

eigen.o : eigen.f
	${FC} ${FFLAGS0} eigen.f

dfa.o: dfa.F
	${FC} ${FFLAGS} ${CPPFLAGS} dfa.F

rmscalc.o: rmscalc.F
	${FC} ${FFLAGS2} ${CPPFLAGS} rmscalc.F

proc_proc.o: proc_proc.c
	${CC} ${CFLAGS} proc_proc.c
