#------------------------------------------------------------------------------
# @file Makefile
# @author jlinford
# @date 2014-09-24 15:52:02.907694
# @brief Makefile for mixed language (Fortran90, CUDA) compilation
# 
# Makefile for mixed language (Fortran90, CUDA) compilation
# 
# This file was generated by Kppa: http://www.paratools.com/Kppa
#------------------------------------------------------------------------------


FC = gfortran
NVCC = nvcc
LD = $(FC)

CUDA_HOME = /usr/local/cuda

ARCH_FLAGS = -m64 \
             -gencode arch=compute_20,code=sm_20 \
             -gencode arch=compute_30,code=sm_30 \
             -gencode arch=compute_32,code=sm_32 \
             -gencode arch=compute_35,code=sm_35 \
             -gencode arch=compute_50,code=sm_50
OPT_FLAGS = -O3
WARN_FLAGS = -Wall
PREC_FLAGS = -fdefault-real-8 -fdefault-double-8

# Uncomment this line to get more information about your CUDA device
CUDA_CPPFLAGS += -DSHOW_CUDA_DEVICE_PROPERTIES=1

CPPFLAGS = $(CUDA_CPPFLAGS)
FFLAGS = $(OPT_FLAGS) $(WARN_FLAGS) $(PREC_FLAGS)
CXXFLAGS = $(OPT_FLAGS) $(ARCH_FLAGS)
LDFLAGS = $(OPT_FLAGS) -L$(CUDA_HOME)/lib64 -L$(CUDA_HOME)/lib
LIBS = -lm -lcudart

OBJ = globchem_integrate.o \
      globchem_jacobian.o \
      globchem_main.o \
      globchem_parameters.o \
      globchem_cu_integrate.o \
      globchem_rosenbrock.o \
      globchem_blas.o \
      globchem_rates.o \
      globchem_function.o \
      globchem_decomp.o \
      globchem_solve.o \
      globchem_initialize.o \
      globchem_driver_parameters.o \
      globchem_monitor.o \
      globchem_gcdata.o


EXE = globchem.exe

all: $(EXE)

$(EXE):  $(OBJ)
	$(LD) -o $(EXE) $(LDFLAGS) $(OBJ) $(LIBS)

%.o: %.mod

globchem_integrate.o: globchem_integrate.f90 \
        globchem_parameters.mod \
        globchem_cu_integrate.o \
        globchem_rosenbrock.o
	$(FC) -c $(FFLAGS) -o globchem_integrate.o globchem_integrate.f90

globchem_jacobian.o: globchem_jacobian.cu \
        globchem_cu_parameters.h \
        globchem_sparse.h
	$(NVCC) -c $(CXXFLAGS) $(CPPFLAGS) -o globchem_jacobian.o globchem_jacobian.cu

globchem_main.o: globchem_main.f90 \
        globchem_parameters.mod \
        globchem_integrate.o \
        globchem_initialize.o \
        globchem_driver_parameters.mod \
        globchem_monitor.o \
	globchem_gcdata.o
	$(FC) -c $(FFLAGS) -o globchem_main.o globchem_main.f90

globchem_gcdata.o: globchem_gcdata.f90 \
        globchem_driver_parameters.mod
	$(FC) -c $(FFLAGS) -o globchem_gcdata.o globchem_gcdata.f90

globchem_parameters.o: globchem_parameters.f90
	$(FC) -c $(FFLAGS) -o globchem_parameters.o globchem_parameters.f90
globchem_parameters.mod: globchem_parameters.o
	

globchem_cu_integrate.o: globchem_cu_integrate.cu \
        globchem_cu_parameters.h \
        globchem_sparse.h
	$(NVCC) -c $(CXXFLAGS) $(CPPFLAGS) -o globchem_cu_integrate.o globchem_cu_integrate.cu

globchem_rosenbrock.o: globchem_rosenbrock.cu \
        globchem_cu_parameters.h \
        globchem_blas.o \
        globchem_rates.o \
        globchem_function.o \
        globchem_decomp.o \
        globchem_solve.o \
        globchem_jacobian.o \
        globchem_sparse.h
	$(NVCC) -c $(CXXFLAGS) $(CPPFLAGS) -o globchem_rosenbrock.o globchem_rosenbrock.cu

globchem_blas.o: globchem_blas.cu \
        globchem_cu_parameters.h
	$(NVCC) -c $(CXXFLAGS) $(CPPFLAGS) -o globchem_blas.o globchem_blas.cu

globchem_rates.o: globchem_rates.cu \
        globchem_cu_parameters.h
	$(NVCC) -c $(CXXFLAGS) $(CPPFLAGS) -o globchem_rates.o globchem_rates.cu

globchem_function.o: globchem_function.cu \
        globchem_cu_parameters.h \
        globchem_sparse.h
	$(NVCC) -c $(CXXFLAGS) $(CPPFLAGS) -o globchem_function.o globchem_function.cu

globchem_decomp.o: globchem_decomp.cu \
        globchem_cu_parameters.h \
        globchem_sparse.h
	$(NVCC) -c $(CXXFLAGS) $(CPPFLAGS) -o globchem_decomp.o globchem_decomp.cu

globchem_solve.o: globchem_solve.cu \
        globchem_cu_parameters.h \
        globchem_sparse.h
	$(NVCC) -c $(CXXFLAGS) $(CPPFLAGS) -o globchem_solve.o globchem_solve.cu

globchem_initialize.o: globchem_initialize.f90 \
        globchem_parameters.mod \
	globchem_gcdata.o
	$(FC) -c $(FFLAGS) -o globchem_initialize.o globchem_initialize.f90

globchem_driver_parameters.o: globchem_driver_parameters.f90
	$(FC) -c $(FFLAGS) -o globchem_driver_parameters.o globchem_driver_parameters.f90
globchem_driver_parameters.mod: globchem_driver_parameters.o
	

globchem_monitor.o: globchem_monitor.f90 \
        globchem_parameters.mod
	$(FC) -c $(FFLAGS) -o globchem_monitor.o globchem_monitor.f90


clean:
	rm -f globchem_integrate.o globchem_jacobian.o globchem_main.o globchem_parameters.o globchem_cu_integrate.o globchem_rosenbrock.o globchem_blas.o globchem_rates.o globchem_function.o globchem_decomp.o globchem_solve.o globchem_initialize.o globchem_driver_parameters.o globchem_monitor.o globchem_gcdata.o
	rm -f globchem_parameters.mod globchem_initialize.mod globchem_driver_parameters.mod globchem_monitor.mod globchem_gcdata.mod
	rm -f globchem.exe
	
destroy: clean
	rm -f globchem_integrate.f90 globchem_jacobian.cu globchem_main.f90 globchem_parameters.f90 globchem_cu_integrate.cu globchem_rosenbrock.cu globchem_blas.cu globchem_rates.cu globchem_function.cu globchem_decomp.cu globchem_solve.cu globchem_initialize.f90 globchem_driver_parameters.f90 globchem_monitor.f90 
	rm -f globchem_integrate.mod globchem_jacobian.h globchem_main.mod globchem_cu_integrate.h globchem_cu_parameters.h globchem_sparse.h globchem_rosenbrock.h globchem_blas.h globchem_rates.h globchem_function.h globchem_decomp.h globchem_solve.h
	rm -f Makefile

# Dummy rule to prevent GNUMake from confusing Fortran with MODULA2
%.o: %.mod



#----------------------------- END Makefile END -------------------------------
