# COPYRIGHT
#
#  Copyright 2007 Johannes Kaestner (kaestner@theochem.uni-stuttgart.de),
#  Tom Keal (thomas.keal@stfc.ac.uk)
#
#  This file is part of DL-FIND.
#
#  DL-FIND is free software: you can redistribute it and/or modify
#  it under the terms of the GNU Lesser General Public License as 
#  published by the Free Software Foundation, either version 3 of the 
#  License, or (at your option) any later version.
#
#  DL-FIND is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU Lesser General Public License for more details.
#
#  You should have received a copy of the GNU Lesser General Public 
#  License along with DL-FIND.  If not, see 
#  <http://www.gnu.org/licenses/>.
#

# pg, g95, intel, gfortran, nag
arch = intel

PPFLAGS = -DDLF_STANDALONE_INTERFACE#  -D withopenmp 
F90EXT = f90
ALLOC = new
OBJDIR = $(arch)/objects
PARA = $(MAKECMDGOALS)
#EXTERNAL = oh3.o

########################################################################
##  Protland compiler
ifeq ($(arch),pg)
  F90        = pgf95
  MPI_F90    = mpif90
  F90FLAGS   =  -C -module $(OBJDIR)
  #F90FLAGS   =  -C -fast -Mvect=sse -Mcache_align -Kieee -Mr8
  LDFLAGS    = -L/usr/pgi/linux86/6.1/lib -llapack -lblas
  LDFLAGS    = -lacml
  MPI_LDFLAGS= -lacml -lmpi
  PPFLAGS    = -DOLDALLOC
  F90EXT     = F95
  ALLOC      = old
endif
# with -lacml this works on HECToR

########################################################################
##  g95 compiler
ifeq ($(arch),g95)
  F90        = g95
  F90FLAGS   =  -C 
  F90FLAGS   =  -C -ftrace=full -freal=nan -finteger=nan -flogical=none \
                -fpointer=none -fimplicit-none  -fbounds-check \
                -fintrinsic-extensions -std=f95 -ftr15581 -Wuninitialized \
                -Wprecision-loss -fmod=$(OBJDIR) 
# general - system blas/lapack
  LDFLAGS    =  -lm -llapack -lblas
# Netlib blas and lapack - http://www.netlib.org/lapack/lapack.tgz
#  LDFLAGS    = -L/home/linux8_i1/kaestner/scr/lib/LAPACK/lapack-3.2 \
#                -lm -llapack_LINUX -lblas_LINUX 
# general - system blas/lapack
   LDFLAGS    =  -lm -llapack -lblas
F90EXT     = F90
# the next line may be used to find memory leaks
#  ALLOC      = old
endif
########################################################################

########################################################################
##  Intel compiler
ifeq ($(arch),intel)
  F90        = ifort 
  MPI_F90    = ${HOME}/bin/mpifort
#  F90FLAGS   =  -ftrapuv -traceback -module $(OBJDIR)  -qopenmp
  F90FLAGS  = -O3 -xHost -heap-arrays  -module $(OBJDIR) -qopenmp
#-assume realloc_lhs  -check all
  # fast
#  F90FLAGS   =  -module $(OBJDIR) -heap-arrays -O3 -funroll-loops -qopenmp
#  LDFLAGS    = -L/usr/lib -lpthread -L/home/linux8_i1/kaestner/lib/mkl/10.0.3.020/lib/em64t -lguide -lmkl_lapack -lmkl_em64t -lpthread 
#  LDFLAGS    = -L/home/linux8_i1/kaestner/lib/mkl/10.0.3.020/lib/em64t -liomp5 -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -qopenmp
  LDFLAGS = -L /software/linux_amd64/parallel_studio_xe_2020/mkl/lib/intel64 -liomp5 -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -qopenmp
MPI_LDFLAGS=$(LDFLAGS)
# When using MKL:
 # Macbook
#  MKLPATH    = /opt/intel/Compiler/11.1/088/Frameworks/mkl/lib/em64t
  MKLPATH    = /opt/intel/mkl/lib
  # dynamic, short integers
#  LDFLAGS    = -L${MKLPATH} ${MKLPATH}/libmkl_solver_lp64_sequential.a -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread
  F90EXT     = F90
# the next line may be used to find memory leaks
#  ALLOC      = old
endif
########################################################################

########################################################################
##  gfortran (gcc) compiler
ifeq ($(arch),gfortran)
  F90        = gfortran
  MPI_F90    = mpifort
  F90FLAGS   =  -O3 -fPIC -march=native -ffast-math -funroll-loops -J $(OBJDIR) -fopenmp 
#  F90FLAGS   =  -O -J $(OBJDIR)
#  F90FLAGS   =   -C -fimplicit-none  -fbounds-check -std=gnu -Wconversion \
	           -Wsurprising -J $(OBJDIR) -fopenmp -Wall -fbacktrace -ffpe-trap=invalid,underflow,denormal -ggdb
#  F90FLAGS   =   -fimplicit-none  -fbounds-check  -Wconversion  \
	           -Wsurprising -J $(OBJDIR) -Wall -fbacktrace -fopenmp 
#  LDFLAGS    = -llapack -lblas -fopenmp
  LDFLAGS    = -llapack -lblas  
  MPI_LDFLAGS=$(LDFLAGS)
  F90EXT     = F90
endif
########################################################################

########################################################################
##  NAG Fortran compiler
ifeq ($(arch),nag)
  F90        = nagfor
  MPI_F90    = mpifort
  F90FLAGS   =  -O -openmp -mdir $(OBJDIR) -I $(OBJDIR) -kind=byte -mismatch -I /opt/nagfor/lib64/bytes
#  F90FLAGS=-kind=byte
#  F90FLAGS   =  -C=all -f2008 -info -mismatch -mdir $(OBJDIR) -I $(OBJDIR) -kind=byte -I /opt/nagfor/lib64/bytes -openmp
  LDFLAGS    = -llapack -lblas
  MPI_LDFLAGS=$(LDFLAGS)
  F90EXT     = F90
endif
########################################################################

.SUFFIXES:
.SUFFIXES: .f90 .o .mod

# modules used by more than one file
OBJ_MOD = $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/dlf_global_module.o \
        $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_util.o \
	$(OBJDIR)/dlf_sort.o \
	$(OBJDIR)/gpr_types.o $(OBJDIR)/gpr_kernels.o $(OBJDIR)/gpr.o \
	$(OBJDIR)/gpr_opt.o $(OBJDIR)/dlf_sct.o \
	$(OBJDIR)/dlf_cinter.o

# Objects that work without numerical libraries (this distinction does not hold any more) 
OBJ_NOLAPACK = $(OBJDIR)/dl-find.o $(OBJDIR)/dlf_convergence.o \
       $(OBJDIR)/dlf_checkpoint.o $(OBJDIR)/dlf_svnversion.o\
       $(OBJDIR)/dlf_formstep.o $(OBJDIR)/dlf_scalestep.o \
       $(OBJDIR)/dlf_lbfgs.o $(OBJDIR)/dlf_time.o \
       $(OBJDIR)/dlf_task.o $(OBJDIR)/dlf_neb.o $(OBJDIR)/dlf_geodesic.o \
       $(OBJDIR)/dlf_qts.o \
       $(OBJDIR)/dlf_rateaux.o \
       $(OBJDIR)/dlf_dimer.o $(OBJDIR)/dlf_conint.o $(OBJDIR)/dlf_coords.o\
       $(OBJDIR)/dlf_parallel_opt.o $(OBJDIR)/dlf_microiter.o \
       $(OBJDIR)/dlf_pes.o \
       $(OBJDIR)/gpr_extensions.o $(OBJDIR)/dlf_oop_lbfgs.o \
       $(OBJDIR)/oop_clock.o $(OBJDIR)/dlf_gprmep.o \
       $(OBJDIR)/fftpack5-1d.o $(OBJDIR)/kronrod.o \
       $(OBJDIR)/dlf_vpt2_main.mod.o \
       $(OBJDIR)/dlf_vpt2_part_func.mod.o $(OBJDIR)/dlf_vpt2_terms.mod.o \
       $(OBJDIR)/dlf_vpt2_freq.mod.o \
       $(OBJDIR)/dlf_vpt2_hess_deriv.mod.o $(OBJDIR)/dlf_vpt2_utility.mod.o \
       $(OBJDIR)/dlf_vpt2_test_routines.mod.o $(OBJDIR)/nr_gamma.mod.o 

# Objects that need LAPACK linked in
OBJ_LAPACK = $(OBJDIR)/dlf_hdlc_matrixlib.o $(OBJDIR)/dlf_hdlc_primitive.o $(OBJDIR)/dlf_hdlc_constraint.o \
         $(OBJDIR)/dlf_hdlc_hdlclib.o $(OBJDIR)/dlf_hdlc_interface.o $(OBJDIR)/dlf_linalg.o \
         $(OBJDIR)/dlf_vpt2_project.mod.o $(OBJDIR)/dlf_vpt2_intcoord.mod.o $(OBJDIR)/dlf_gpr_hdlc.o

OBJ =  $(OBJ_NOLAPACK) $(OBJ_LAPACK) 

find:	$(OBJ_MOD) $(OBJ) $(OBJDIR)/main.o $(OBJDIR)/dlf_serial.o
	@echo "Linking ..."
	$(F90) $(F90FLAGS) -o find.x $(OBJDIR)/main.o $(OBJ) $(OBJDIR)/dlf_serial.o $(OBJ_MOD) $(EXTERNAL) $(LDFLAGS)
	@cp find.x $(arch)/find_$(arch).x

remassweight_hessian:   $(OBJ_MOD) $(OBJ) $(OBJDIR)/remassweight_hessian.o
	@echo "Linking remassweight_hessian ..."
	$(F90) $(F90FLAGS) -o remassweight_hessian.x $(OBJDIR)/remassweight_hessian.o $(OBJ) $(OBJ_MOD)  $(LDFLAGS)

head_checkpoint:   $(OBJ_MOD) $(OBJ) $(OBJDIR)/head_checkpoint.o
	@echo "Linking head_checkpoint ..."
	$(F90) $(F90FLAGS) -o head_checkpoint.x $(OBJDIR)/head_checkpoint.o $(OBJ) $(OBJ_MOD)  $(LDFLAGS)

parallel: $(OBJ_MOD) $(OBJ) $(OBJDIR)/main.o $(OBJDIR)/dlf_mpi.o
	@echo "Linking ..."
	$(MPI_F90) $(F90FLAGS) -o Pfind.x $(OBJDIR)/main.o $(OBJ) $(OBJDIR)/dlf_mpi.o $(OBJ_MOD)  $(MPI_LDFLAGS)
	@cp Pfind.x $(arch)/Pfind_$(arch).x

 
obj:	$(OBJ_MOD) $(OBJ) 

#	echo 'subroutine dlf_svnversion(iver)' > dlf_svnversion.f90
#	echo '  character(*) :: iver' >> dlf_svnversion.f90
#	echo -n '  iver="' >> dlf_svnversion.f90
dlf_svnversion.f90: FORCE 
	cp dlf_svnversion.head dlf_svnversion.f90
	-svnversion -n . >> dlf_svnversion.f90
	echo '"' >> dlf_svnversion.f90
	echo "end subroutine dlf_svnversion" >> dlf_svnversion.f90

FORCE:

#
# The main rule for compiling f90 files:
#
$(OBJDIR)/%.o: %.f90
	@mkdir -p $(OBJDIR)
ifeq ($(ALLOC),old)
	   sed -e"s/call allocate *(/ aLLocate(/g" \
               -e"/ aLLocate(/s/,/(/" \
               -e"/ aLLocate(/s/\(.*\))/\1))/" \
               -e"s/call deallocate *(/deallocate(/" $*.f90 > $(OBJDIR)/$*_d.$(F90EXT)
else
	  cp $*.f90 $(OBJDIR)/$*_d.$(F90EXT)
endif	

#
# remove $(OBJDIR)/dlf_mpi_d.$(F90EXT) if compiling the serial version, 
# and $(OBJDIR)/dlf_serial_d.$(F90EXT) if the parallel one.
#
ifeq ($(findstring parallel,$(PARA)),parallel)
	@rm -f $(OBJDIR)/dlf_serial_d.$(F90EXT)
	$(MPI_F90) $(F90FLAGS) $(PPFLAGS) -c $(OBJDIR)/$*_d.$(F90EXT) -o $(OBJDIR)/$*.o
	@#rm $*_d.$(F90EXT)
	@echo 
else
	@rm -f $(OBJDIR)/dlf_mpi_d.$(F90EXT)
	$(F90) $(F90FLAGS) $(PPFLAGS) -c $(OBJDIR)/$*_d.$(F90EXT) -o $(OBJDIR)/$*.o
	@#rm $*_d.$(F90EXT)
	@echo 
endif

#
# Utilities
#
clean:
	rm -f $(OBJ_MOD) $(OBJ) $(OBJDIR)/*.mod $(OBJDIR)/main.o $(OBJDIR)/*_d.?9? $(OBJDIR)/dlf_mpi.o $(OBJDIR)/dlf_serial.o 

# remove all module directories and executables
clean_all:
	rm -r g95 pg intel gfortran

man:
	pdflatex documentation.tex

litpath=~/data/literatur/

bib:
	cp $(litpath)/tex/jabref.bib text.bib
	bibtex documentation

doc:
	robodoc

#dependencies from makedepf90, should be possible to do with the following:
# files=$(ls *.f90 | grep -v "txt_to_modes.f90"); makedepf90 $files | sed 's/^/$(OBJDIR)\//' | sed 's/ *$//' | sed 's/ : /:/g' | sed 's/ / $(OBJDIR)\//g' | sed 's/:/ : /g'
# explanation:
# get all files that are not txt_to_modes.f90 in a list; get dependencies | put $(OBJDIR)/ at the beginning | delete space at the end | delete space around : | exchange spaces with $(OBJDIR)/ | put spaces around : in again

$(OBJDIR)/dl-find.o : dl-find.f90 $(OBJDIR)/gpr_extensions.o $(OBJDIR)/dlf_util.o $(OBJDIR)/dlf_util.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_allocate.o : dlf_allocate.f90 $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_checkpoint.o : dlf_checkpoint.f90 $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/dlf_global_module.o
$(OBJDIR)/dlf_cinter.o : dlf_cinter.f90 $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_oop_lbfgs.o $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/gpr_opt.o $(OBJDIR)/gpr_types.o $(OBJDIR)/gpr.o
$(OBJDIR)/dlf_conint.o : dlf_conint.f90 $(OBJDIR)/dlf_checkpoint.o $(OBJDIR)/dlf_formstep.o $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_convergence.o : dlf_convergence.f90 $(OBJDIR)/dlf_gprmep.o $(OBJDIR)/gpr_extensions.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_coords.o : dlf_coords.f90 $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_dimer.o : dlf_dimer.f90 $(OBJDIR)/dlf_checkpoint.o $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_formstep.o : dlf_formstep.f90 $(OBJDIR)/dlf_vpt2_main.mod.o $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/dlf_checkpoint.o $(OBJDIR)/gpr_opt.o $(OBJDIR)/dlf_sct.o $(OBJDIR)/dlf_gprmep.o $(OBJDIR)/dlf_geodesic.o $(OBJDIR)/gpr.o $(OBJDIR)/gpr_extensions.o $(OBJDIR)/dlf_util.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_geodesic.o : dlf_geodesic.f90 $(OBJDIR)/oop_clock.o $(OBJDIR)/dlf_oop_lbfgs.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_global_module.o : dlf_global_module.f90 $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_gprmep.o : dlf_gprmep.f90 $(OBJDIR)/dlf_time.o $(OBJDIR)/dlf_oop_lbfgs.o $(OBJDIR)/dlf_util.o $(OBJDIR)/dlf_geodesic.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/dlf_cinter.o $(OBJDIR)/gpr_types.o $(OBJDIR)/gpr.o
$(OBJDIR)/dlf_hdlc_constraint.o : dlf_hdlc_constraint.f90 $(OBJDIR)/dlf_hdlc_primitive.o $(OBJDIR)/dlf_hdlc_matrixlib.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_hdlc_hdlclib.o : dlf_hdlc_hdlclib.f90 $(OBJDIR)/dlf_checkpoint.o $(OBJDIR)/dlf_hdlc_constraint.o $(OBJDIR)/dlf_hdlc_primitive.o $(OBJDIR)/dlf_hdlc_matrixlib.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_hdlc_interface.o : dlf_hdlc_interface.f90 $(OBJDIR)/dlf_checkpoint.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_hdlc_hdlclib.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_hdlc_matrixlib.o : dlf_hdlc_matrixlib.f90 $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_hdlc_primitive.o : dlf_hdlc_primitive.f90 $(OBJDIR)/dlf_hdlc_matrixlib.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_lbfgs.o : dlf_lbfgs.f90 $(OBJDIR)/dlf_checkpoint.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_linalg.o : dlf_linalg.f90 $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_hdlc_matrixlib.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_linalg_interface_mod.o : dlf_linalg_interface_mod.f90 $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_microiter.o : dlf_microiter.f90 $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_mpi.o : dlf_mpi.f90 $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_neb.o : dlf_neb.f90 $(OBJDIR)/dlf_checkpoint.o $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/dlf_util.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_oop_lbfgs.o : dlf_oop_lbfgs.f90 $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_parallel_opt.o : dlf_parallel_opt.f90 $(OBJDIR)/dlf_sort.o $(OBJDIR)/dlf_checkpoint.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_pes.o : dlf_pes.f90 $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/gpr.o
$(OBJDIR)/dlf_qts.o : dlf_qts.f90 $(OBJDIR)/dlf_util.o $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_util.o $(OBJDIR)/dlf_formstep.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_neb.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_rateaux.o : dlf_rateaux.f90 $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/dlf_util.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_qts.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_neb.o
$(OBJDIR)/dlf_scalestep.o : dlf_scalestep.f90 $(OBJDIR)/dlf_checkpoint.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/gpr_opt.o $(OBJDIR)/gpr_extensions.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_sct.o : dlf_sct.f90 $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_util.o $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/dlf_global_module.o
$(OBJDIR)/dlf_serial.o : dlf_serial.f90 $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_sort.o : dlf_sort.f90 $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_stat_module.o : dlf_stat_module.f90
$(OBJDIR)/dlf_task.o : dlf_task.f90 $(OBJDIR)/dlf_util.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_time.o : dlf_time.f90 $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_util.o : dlf_util.f90 $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_vpt2_freq.mod.o : dlf_vpt2_freq.mod.f90 $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_util.o $(OBJDIR)/dlf_linalg_interface_mod.o $(OBJDIR)/dlf_vpt2_utility.mod.o $(OBJDIR)/dlf_sort.o $(OBJDIR)/dlf_vpt2_project.mod.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_vpt2_hess_deriv.mod.o : dlf_vpt2_hess_deriv.mod.f90 $(OBJDIR)/dlf_vpt2_intcoord.mod.o $(OBJDIR)/dlf_sort.o $(OBJDIR)/dlf_util.o $(OBJDIR)/dlf_vpt2_freq.mod.o $(OBJDIR)/dlf_linalg_interface_mod.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_vpt2_utility.mod.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_vpt2_intcoord.mod.o : dlf_vpt2_intcoord.mod.f90 $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_linalg_interface_mod.o $(OBJDIR)/dlf_vpt2_utility.mod.o $(OBJDIR)/dlf_util.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_vpt2_main.mod.o : dlf_vpt2_main.mod.f90 $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_vpt2_part_func.mod.o $(OBJDIR)/dlf_vpt2_terms.mod.o $(OBJDIR)/dlf_vpt2_hess_deriv.mod.o $(OBJDIR)/dlf_vpt2_freq.mod.o $(OBJDIR)/dlf_vpt2_utility.mod.o $(OBJDIR)/dlf_linalg_interface_mod.o $(OBJDIR)/dlf_util.o $(OBJDIR)/dlf_vpt2_project.mod.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_vpt2_part_func.mod.o : dlf_vpt2_part_func.mod.f90 $(OBJDIR)/dlf_linalg_interface_mod.o $(OBJDIR)/nr_gamma.mod.o $(OBJDIR)/dlf_sort.o $(OBJDIR)/dlf_vpt2_utility.mod.o $(OBJDIR)/dlf_vpt2_terms.mod.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_util.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_vpt2_project.mod.o : dlf_vpt2_project.mod.f90 $(OBJDIR)/dlf_sort.o $(OBJDIR)/dlf_util.o $(OBJDIR)/dlf_linalg_interface_mod.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_vpt2_utility.mod.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_vpt2_terms.mod.o : dlf_vpt2_terms.mod.f90 $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_linalg_interface_mod.o $(OBJDIR)/dlf_vpt2_utility.mod.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_vpt2_test_routines.mod.o : dlf_vpt2_test_routines.mod.f90 $(OBJDIR)/dlf_linalg_interface_mod.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_util.o $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_vpt2_utility.mod.o $(OBJDIR)/dlf_vpt2_intcoord.mod.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/dlf_vpt2_utility.mod.o : dlf_vpt2_utility.mod.f90 $(OBJDIR)/dlf_linalg_interface_mod.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/fftpack5-1d.o : fftpack5-1d.f90 $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/gpr.o : gpr.f90 $(OBJDIR)/dlf_oop_lbfgs.o $(OBJDIR)/dlf_geodesic.o $(OBJDIR)/gpr_kernels.o $(OBJDIR)/gpr_types.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/dlf_gpr_hdlc.o 
$(OBJDIR)/gpr_extensions.o : gpr_extensions.f90 $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o $(OBJDIR)/gpr.o $(OBJDIR)/gpr.o $(OBJDIR)/gpr_opt.o $(OBJDIR)/gpr_types.o $(OBJDIR)/dlf_gpr_hdlc.o
$(OBJDIR)/gpr_kernels.o : gpr_kernels.f90 $(OBJDIR)/gpr_types.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/gpr_opt.o : gpr_opt.f90 $(OBJDIR)/dlf_gpr_hdlc.o $(OBJDIR)/dlf_oop_lbfgs.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/gpr.o $(OBJDIR)/gpr_types.o
$(OBJDIR)/gpr_types.o : gpr_types.f90 $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/kronrod.o : kronrod.f90 $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/main.o : main.f90 $(OBJDIR)/dlf_allocate.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_pes.o $(OBJDIR)/dlf_util.o $(OBJDIR)/dlf_pes.o $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/nr_gamma.mod.o : nr_gamma.mod.f90 $(OBJDIR)/dlf_stat_module.o
$(OBJDIR)/oop_clock.o : oop_clock.f90
$(OBJDIR)/dlf_gpr_hdlc.o: dlf_gpr_hdlc.f90  $(OBJDIR)/dlf_checkpoint.o  $(OBJDIR)/dlf_allocate.o  $(OBJDIR)/dlf_hdlc_constraint.o $(OBJDIR)/dlf_hdlc_primitive.o $(OBJDIR)/dlf_hdlc_matrixlib.o $(OBJDIR)/dlf_global_module.o $(OBJDIR)/dlf_stat_module.o

# They might look like:
#dlf_linalg.o: dlfhdlc_matrixlib.mod dlf_parameter_module.mod dlf_linalg.f90
#main.o driver_module.mod: dlf_parameter_module.mod main.f90
#$(OBJDIR)/main.o $(OBJDIR)/driver_module.mod: $(OBJDIR)/dlf_parameter_module.mod main.f90
