include Makefile.inc

PROBLEM = Problem
FFTWLIBS = -L$(FFTW_PATH)/lib -lfftw3

HDFINC = \
	-I$(HDF5PATH)/include \
	-I$(HDF5PATH)/lib

MPIPLIBS = -L$(MPIPPATH)/lib -lmpiP

ifeq ($(HYPREFLAG),1)
HYPRELIBS=-L/$(HYPREPATH)/lib -lHYPRE
HYPREINC=-I/$(HYPREPATH)/include


HYPRE_OBJ_FILES = \
	    elliptic/elliptic_comms.o \
	    elliptic/extended_hypre_wrapper.o \
	    elliptic/self_gravity/multipole.o \
	    elliptic/self_gravity/poisson.o \
	    elliptic/elliptic_control.o 
HCPPFLAGS = -DHYPRE
endif

EXPLICIT_OBJ_FILES = \
            explicit/resistive.o \
	    explicit/conductive.o \
	    explicit/bviscosity.o \
	    explicit/explicit_control.o

ifeq ($(PTHREADFLAG),1)

PTHREAD_OBJ_FILES = \
            threads/fpthread_lib.o \
            threads/thread_declarations.o \
            threads/thread_control.o 

PCPPFLAGS = -DPTHREADS
endif

ifeq ($(PTHREADFLAG),2)

PTHREAD_OBJ_FILES = \
            pth/fpth_lib.o \
            pth/pth_declarations.o \
            pth/pth_control.o 

PCPPFLAGS = -DPTH

PTHREADLIBS=-L/$(PTH_PATH)/lib -lpth
PTHREADINC=-I/$(PTH_PATH)/include
endif



OBJ_FILES = global_declarations.o \
            communication/message_declarations.o \
            communication/communication_declarations.o \
            data/boundary.o \
            data/slopelim.o \
            data/data_declarations.o \
            tree/tree_declarations.o \
            physics/physics_declarations.o \
            elliptic/elliptic_declarations.o \
            explicit/explicit_declarations.o \
            physics/specfun.o \
            physics/common_functions.o \
            physics/BE_module.o \
            physics/Bondi.o \
            hyperbolic/hyperbolic_declarations.o \
            timing.o \
            amr/scheduling.o \
            physics/EOS.o \
            hyperbolic/riemann_solvers.o \
            data/data_info_ops.o \
            source/source_declarations.o \
            modules/objects/object_declarations.o \
            source/neqcooling.o \
            source/cooling.o \
            source/cylindrical.o \
            source/rotating.o \
            source/uniformgravity.o \
            source/pointgravity.o \
            modules/objects/outflows.o \
            source/selfgravity.o \
            source/source_control.o \
	    $(EXPLICIT_OBJ_FILES) \
            particle/particle_declarations.o \
            particle/particle_info_ops.o \
            particle/particle_level_ops.o \
            particle/particle_advance.o \
            particle/particle_comms.o \
            particle/particle_control.o \
            modules/objects/shapes.o \
            processing/emissions.o \
            processing/fields.o \
	    processing/processing_declarations.o \
            processing/splines.o \
            modules/objects/profiles.o \
            modules/objects/interfaces.o \
            modules/objects/perturbations.o \
            modules/objects/vectorperturbations.o \
            modules/objects/ambients.o \
            modules/objects/clumps.o \
            modules/objects/disks.o \
            modules/objects/winds.o \
            modules/objects/uniformregions.o \
            modules/objects/splitregions.o \
            modules/objects/collidingflows.o \
            physics/physics_control.o \
            io/io_bov.o \
            io/io_ppm.o \
            layouts/layout_declarations.o \
            layouts/layout_comms.o \
            physics/PFFT.o \
            layouts/layout_control.o \
            processing/images.o \
            processing/histograms.o \
            processing/spectra.o \
            processing/pdfs.o \
            processing/cameras.o \
            processing/movies.o \
            processing/projections.o \
            processing/totals.o \
            modules/objects/refinements.o \
            modules/objects/object_control.o \
            $(PROBLEM_OBJ_FILES) \
            modules/module_control.o \
            hyperbolic/sweep/stencil_declarations.o \
            hyperbolic/sweep/sweep_declarations.o \
            hyperbolic/sweep/stencil_control.o \
            hyperbolic/sweep/sweep_scheme.o \
            hyperbolic/MUSCL/MUSCL_scheme.o \
            hyperbolic/hyperbolic_control.o \
            distribution/distribution_declarations.o \
            distribution/hilbert.o \
            distribution/distribution_control.o \
            communication/mpi_transmission.o \
            communication/mpi_packing.o \
            communication/communication_control.o \
            tree/tree_node_ops.o \
            tree/tree_parsing.o \
            tree/tree_level_comms.o \
            data/data_parsing.o \
            data/data_level_comms.o \
            data/data_level_ops.o \
            tree/tree_level_ops.o


POST_ELLIPTIC_OBJ_FILES = \
            processing/processing_control.o

POST_PTHREADS_OBJ_FILES = \
            amr/time_step.o \
            io/io_declarations.o \
            io/hdf5_declarations.o \
            io/chombo_declarations.o \
            io/io_chombo.o \
            io/io_okc.o \
            io/io_comms.o \
            io/io_parsing.o \
            io/io_control.o \
	    amr/amr_control.o \
            scrambler.o 

PROBLEM_OBJ_FILES = \
            modules/$(PROBLEM)/problem.o \

MOD_FILES = *.mod \
	    amr/*.mod \
	    physics/*.mod \
	    data/*.mod \
	    modules/*.mod \
	    hyperbolic/*.mod \
	    io/*.mod \
	    communication/*.mod \
	    source/*.mod

METHOD_INCLUDE_FILES = \
        hyperbolic/i_dependencies.f90 \
        hyperbolic/riemann_solvers.f90

EXECUTABLE = astrobear



default: $(EXECUTABLE)

bov2jpeg: global_declarations.o io/io_bov.o io/io_ppm.o processing/images.o bov2jpeg.o
	$(FC) $(LFLAGS) bov2jpeg.o global_declarations.o io/io_bov.o io/io_ppm.o processing/images.o bov2jpeg.o -o bov2jpeg

astrobear: $(OBJ_FILES) $(HYPRE_OBJ_FILES) $(POST_ELLIPTIC_OBJ_FILES) $(PTHREAD_OBJ_FILES)  $(POST_PTHREADS_OBJ_FILES) 
	$(FC) $(LFLAGS)	$(OBJ_FILES) $(HYPRE_OBJ_FILES) $(POST_ELLIPTIC_OBJ_FILES) $(PTHREAD_OBJ_FILES)  $(POST_PTHREADS_OBJ_FILES) $(HDFLIBS) $(HDFINC) $(HYPRELIBS) $(HYPREINC) $(PTHREADLIBS) $(FFTWLIBS) -o $(EXECUTABLE)
	echo 'Be sure to update/remove your profile.data file'
scrambler.o : scrambler.f90
	$(CPP) $(HCPPFLAGS) $(PCPPFLAGS) scrambler.f90 -o scrambler.cpp.f90
	$(FC) -c $(FFLAGS) scrambler.cpp.f90 -o scrambler.o

io/io_bov.o : io/io_bov.f90
	$(CPP) $(HCPPFLAGS) $(PCPPFLAGS) io/io_bov.f90 -o io/io_bov.cpp.f90
	$(FC) -c $(FFLAGS) io/io_bov.cpp.f90 -o io/io_bov.o

amr/amr_control.o : amr/amr_control.f90
	$(CPP) $(HCPPFLAGS) $(PCPPFLAGS) amr/amr_control.f90 -o amr/amr_control.cpp.f90
	$(FC) -c $(FFLAGS) amr/amr_control.cpp.f90 -o amr/amr_control.o

processing/processing_control.o : processing/processing_control.f90
	$(CPP) $(HCPPFLAGS) $(PCPPFLAGS) processing/processing_control.f90 -o processing/processing_control.cpp.f90
	$(FC) -c $(FFLAGS) processing/processing_control.cpp.f90 -o processing/processing_control.o

amr/time_step.o : amr/time_step.f90
	$(CPP) $(HCPPFLAGS) $(PCPPFLAGS) amr/time_step.f90 -o amr/time_step.cpp.f90
	$(FC) -c $(FFLAGS) amr/time_step.cpp.f90 -o amr/time_step.o

ifeq ($(PTHREADFLAG),2)
communication/mpi_transmission.o : communication/message_declarations.o communication/mpi_transmission.f90 pth/fpth_lib.o pth/pth_declarations.o
	$(CPP) $(PCPPFLAGS) communication/mpi_transmission.f90 -o communication/mpi_transmission.cpp.f90
	$(FC)	-c $(FFLAGS) communication/mpi_transmission.cpp.f90 -o communication/mpi_transmission.o
else
communication/mpi_transmission.o : communication/message_declarations.o communication/mpi_transmission.f90
	$(CPP) $(PCPPFLAGS) communication/mpi_transmission.f90 -o communication/mpi_transmission.cpp.f90
	$(FC)	-c $(FFLAGS) communication/mpi_transmission.cpp.f90 -o communication/mpi_transmission.o

endif
#
#test: test.o global_declarations.o data/boundary.o data/slopelim.o data/node_info.o tree/amr_node.o data/syncgrids.o
#	$(FC) $(FFLAGS) test.o global_declarations.o data/boundary.o data/slopelim.o data/node_info.o tree/amr_node.o data/syncgrids.o -o astrobear
#
#scrambler.o : global_declarations.o data/boundary.o data/slopelim.o data/data_declarations.o tree/tree_declarations.o modules/module_control.o physics/physics_control.o io/io_control.o scrambler.f90
#	$(FC) -c $(FFLAGS) scrambler.f90 -o scrambler.o
#
#test.o : global_declarations.o data/boundary.o data/slopelim.o data/data_declarations.o tree/tree_declarations.o modules/module_control.o data/data_info_ops.o test.f90
#	$(FC) -c $(FFLAGS) test.f90 -o test.o
#
#modules/module_control.o : modules/module_control.f90 hyperbolic/hyperbolic_declarations.o physics/physics_declarations.o global_declarations.o data/data_declarations.o $(PROBLEM_OBJ_FILES)
#	$(FC) -c $(FFLAGS) modules/module_control.f90 -o modules/module_control.o
#
#hyperbolic/hyperbolic_control.o : hyperbolic/hyperbolic_control.f90 hyperbolic/hyperbolic_declarations.o hyperbolic/sweep/sweep_scheme.o data/data_declarations.o
#	$(FC) -c $(FFLAGS) hyperbolic/hyperbolic_control.f90 -o hyperbolic/hyperbolic_control.o
#
hyperbolic/sweep/sweep_scheme.o : hyperbolic/sweep/sweep_scheme.f90 global_declarations.o data/data_declarations.o hyperbolic/hyperbolic_declarations.o modules/module_control.o pth/pth_declarations.o#
	$(CPP) $(HCPPFLAGS) $(PCPPFLAGS) hyperbolic/sweep/sweep_scheme.f90 -o hyperbolic/sweep/sweep_scheme.cpp.f90
	$(FC) -c $(FFLAGS) hyperbolic/sweep/sweep_scheme.cpp.f90 -o hyperbolic/sweep/sweep_scheme.o

hyperbolic/MUSCL/MUSCL_scheme.o : hyperbolic/MUSCL/MUSCL_scheme.f90 global_declarations.o data/data_declarations.o hyperbolic/hyperbolic_declarations.o modules/module_control.o#
	$(CPP) $(HCPPFLAGS) $(PCPPFLAGS) hyperbolic/MUSCL/MUSCL_scheme.f90 -o hyperbolic/MUSCL/MUSCL_scheme.cpp.f90
	$(FC) -c $(FFLAGS) hyperbolic/MUSCL/MUSCL_scheme.cpp.f90 -o hyperbolic/MUSCL/MUSCL_scheme.o

hyperbolic/sweep/stencil_control.o : hyperbolic/sweep/stencil_control.f90 global_declarations.o data/data_declarations.o hyperbolic/hyperbolic_declarations.o pth/pth_declarations.o
	$(CPP) $(HCPPFLAGS) $(PCPPFLAGS) hyperbolic/sweep/stencil_control.f90 -o hyperbolic/sweep/stencil_control.cpp.f90
	$(FC) -c $(FFLAGS) hyperbolic/sweep/stencil_control.cpp.f90 -o hyperbolic/sweep/stencil_control.o

#
#elliptic/elliptic_control.o : elliptic/elliptic_control.f90
#	$(FC) -c $(HDFINC) $(FFLAGS) $(EFLAGS) elliptic/elliptic_control.f90 -o elliptic/elliptic_control.o

pth/pth_control.o : pth/pth_control.f90 hyperbolic/hyperbolic_control.o
	$(FC) -c $(FFLAGS) pth/pth_control.f90 -o pth/pth_control.o

source/source_control.o : source/cooling.o io/chombo_declarations.o source/source_control.f90
	$(FC) -c $(HDFINC) $(FFLAGS) source/source_control.f90 -o source/source_control.o


elliptic/self_gravity/poisson.o : elliptic/self_gravity/poisson.f90
	$(FC) -c $(HDFINC) $(FFLAGS) -I$(FFTW_PATH)/include elliptic/self_gravity/poisson.f90 -o elliptic/self_gravity/poisson.o

modules/Problem/problem.o : modules/Problem/problem.f90
	$(FC) -c $(HDFINC) $(FFLAGS) -I$(FFTW_PATH)/include modules/Problem/problem.f90 -o modules/Problem/problem.o

physics/PFFT.o : physics/PFFT.f90
	$(FC) -c $(HDFINC) $(FFLAGS) -I$(FFTW_PATH)/include physics/PFFT.f90 -o physics/PFFT.o

source/pointgravity.o : source/pointgravity.f90 io/chombo_declarations.o io/hdf5_declarations.o
	$(FC) -c $(HDFINC) $(FFLAGS) source/pointgravity.f90 -o source/pointgravity.o

source/cooling.o : source/cooling.f90 io/chombo_declarations.o io/hdf5_declarations.o
	$(FC) -c $(HDFINC) $(FFLAGS) source/cooling.f90 -o source/cooling.o

particle/particle_control.o : particle/particle_declarations.o particle/particle_level_ops.o particle/particle_comms.o particle/particle_advance.o particle/particle_info_ops.o particle/particle_control.f90
	$(FC) -c $(HDFINC) $(FFLAGS) particle/particle_control.f90 -o particle/particle_control.o

particle/particle_level_ops.o : particle/particle_declarations.o particle/particle_info_ops.o particle/particle_level_ops.f90
	$(FC) -c $(HDFINC) $(FFLAGS) particle/particle_level_ops.f90 -o particle/particle_level_ops.o

particle/particle_declarations.o : physics/physics_declarations.o global_declarations.o io/chombo_declarations.o io/hdf5_declarations.o source/pointgravity.o particle/particle_declarations.f90
	$(FC) -c $(HDFINC) $(FFLAGS) particle/particle_declarations.f90 -o particle/particle_declarations.o

io/io_control.o : io/io_chombo.o io/io_declarations.o io/io_control.f90
	$(FC) -c $(HDFINC) $(FFLAGS) io/io_control.f90 -o io/io_control.o

io/io_chombo.o : global_declarations.o data/data_level_ops.o physics/physics_declarations.o distribution/distribution_control.o tree/tree_level_comms.o io/hdf5_declarations.o io/io_comms.o io/chombo_declarations.o io/io_chombo.f90
	$(FC) -c $(HDFINC) $(FFLAGS) io/io_chombo.f90 -o io/io_chombo.o

io/io_comms.o : io/io_comms.f90 tree/tree_declarations.o data/data_declarations.o global_declarations.o io/chombo_declarations.o communication/communication_declarations.o communication/message_declarations.o io/io_parsing.o communication/mpi_packing.o
	$(FC) -c $(HDFINC) $(FFLAGS) io/io_comms.f90 -o io/io_comms.o

io/io_parsing.o : io/io_parsing.f90 tree/tree_declarations.o data/data_declarations.o global_declarations.o io/chombo_declarations.o communication/mpi_packing.o
	$(FC) -c $(HDFINC) $(FFLAGS) io/io_parsing.f90 -o io/io_parsing.o

io/chombo_declarations.o : global_declarations.o io/hdf5_declarations.o io/io_declarations.o io/chombo_declarations.f90
	$(FC) -c $(HDFINC) $(FFLAGS) io/chombo_declarations.f90 -o io/chombo_declarations.o

io/hdf5_declarations.o : global_declarations.o io/hdf5_declarations.f90
	$(FC) -c $(HDFINC) $(FFLAGS) io/hdf5_declarations.f90 -o io/hdf5_declarations.o

distribution/distribution_control.o : distribution/hilbert.o data/data_info_ops.o distribution/distribution_control.f90
	$(FC) -c $(HDFINC) $(FFLAGS2) distribution/distribution_control.f90 -o distribution/distribution_control.o

#io/io_declarations.o : global_declarations.o io/io_declarations.f90
#	$(FC) -c $(FFLAGS) io/io_declarations.f90 -o io/io_declarations.o
#
#data/data_declarations.o : global_declarations.o data/boundary.o data/data_declarations.f90
#	$(FC) -c $(FFLAGS) data/data_declarations.f90 -o data/data_declarations.o
#
#data/boundary.o : global_declarations.o data/boundary.f90
#	$(FC) -c $(FFLAGS) data/boundary.f90 -o data/boundary.o
#
#data/slopelim.o : global_declarations.o data/slopelim.f90
#	$(FC) -c $(FFLAGS) data/slopelim.f90 -o data/slopelim.o
#
#data/data_info_ops.o : data/data_declarations.o data/data_info_ops.f90
#	$(FC) -c $(FFLAGS) data/data_info_ops.f90 -o data/data_info_ops.o
#
#tree/tree_level_ops.o : tree/tree_level_ops.f90 tree/tree_node_ops.o tree/tree_declarations.o $(PROBLEM_OBJ_FILES)
#	$(FC) -c $(FFLAGS) tree/tree_level_ops.f90 -o tree/tree_level_ops.o
#
#data/data_level_ops.o : data/data_level_ops.f90 amr/scheduling.o data/data_info_ops.o hyperbolic/hyperbolic_control.o data/data_declarations.o tree/tree_declarations.o modules/module_control.o $(PROBLEM_OBJ_FILES)
#	$(FC) -c $(FFLAGS) data/data_level_ops.f90 -o data/data_level_ops.o
#
##amr/time_step.o : amr/time_step.f90 elliptic_control.o
##	$(FC) -c $(FFLAGS) amr/time_step.f90 -o amr/time_step.o
#
##physics/physics_control.o : physics/physics_declarations.o physics/physics_control.f90
##	$(FC) -c $(FFLAGS) physics/physics_control.f90 -o physics/physics_control.o
#
#tree/tree_level_comms.o : tree/tree_declarations.o communication/mpi_packing.o tree/tree_parsing.o tree/tree_level_comms.f90
#	$(FC) -c $(FFLAGS) tree/tree_level_comms.f90 -o tree/tree_level_comms.o
#
#tree/tree_parsing.o : tree/tree_declarations.o tree/tree_node_ops.o communication/mpi_packing.o tree/tree_parsing.f90
#	$(FC) -c $(FFLAGS) tree/tree_parsing.f90 -o tree/tree_parsing.o
#
#data/data_level_comms.o : tree/tree_declarations.o data/data_declarations.o data/data_level_comms.f90
#	$(FC)	-c $(FFLAGS) data/data_level_comms.f90 -o data/data_level_comms.o
#
#communication/communication_declarations.o : global_declarations.o communication/message_declarations.o communication/communication_declarations.f90
#	$(FC)	-c $(FFLAGS) communication/communication_declarations.f90 -o communication/communication_declarations.o
#
#communication/mpi_packing.o : global_declarations.o tree/tree_declarations.o communication/message_declarations.o communication/mpi_transmission.o communication/mpi_packing.f90
#	$(FC)	-c $(FFLAGS) communication/mpi_packing.f90 -o communication/mpi_packing.o
#
#communication/mpi_transmission.o : communication/message_declarations.o communication/mpi_transmission.f90
#	$(FC)	-c $(FFLAGS) communication/mpi_transmission.f90 -o communication/mpi_transmission.o
#
#communication/message_declarations.o : communication/message_declarations.f90
#	$(FC)	-c $(FFLAGS) communication/message_declarations.f90 -o communication/message_declarations.o
#
#tree/tree_declarations.o : global_declarations.o data/data_declarations.o tree/tree_declarations.f90
#	$(FC) -c $(FFLAGS) tree/tree_declarations.f90 -o tree/tree_declarations.o
#
#tree/distribution/hilbert.o : tree/distribution/hilbert.c
#	$(CC) -c $(CFLAGS) tree/distribution/hilbert.c -o tree/distribution/hilbert.o
#
##physics/physics_declarations.o : physics/physics_declarations.f90
##	$(FC) -c $(FFLAGS) physics/physics_declarations.f90 -o physics/physics_declarations.o
#
#
#modules/FieldLoopAdvection/field_loop_advection.o : modules/FieldLoopAdvection/field_loop_advection.f90 global_declarations.o data/data_declarations.o
#	$(FC) -c $(FFLAGS) modules/FieldLoopAdvection/field_loop_advection.f90 -o modules/FieldLoopAdvection/field_loop_advection.o
#
ifeq ($(HYPREFLAG),1)
  ifeq ($(NOUNDERSCORE),1)
elliptic/extended_hypre_wrapper.o : elliptic/extended_hypre_wrapper.bg.c
	$(CC) -c $(CFLAGS) $(HYPREINC) elliptic/extended_hypre_wrapper.bg.c -o elliptic/extended_hypre_wrapper.o
  else
elliptic/extended_hypre_wrapper.o : elliptic/extended_hypre_wrapper.c
	$(CC) -c $(CFLAGS) $(HYPREINC) elliptic/extended_hypre_wrapper.c -o elliptic/extended_hypre_wrapper.o
  endif
endif

ifeq ($(NOUNDERSCORE),1)
distribution/hilbert.o : distribution/hilbert.bg.c
	  $(CC) -c $(CFLAGS) distribution/hilbert.bg.c -o distribution/hilbert.o
else
distribution/hilbert.o : distribution/hilbert.c
	  $(CC) -c $(CFLAGS) distribution/hilbert.c -o distribution/hilbert.o
endif

ifeq ($(PTHREADFLAG),1)
threads/fpthread_lib.o : threads/fpthread_lib.c
	$(CC) -c $(CFLAGS) threads/fpthread_lib.c -pthread -o threads/fpthread_lib.o

endif

ifeq ($(PTHREADFLAG),2)
pth/fpth_lib.o : pth/fpth_lib.c
	$(CC) -c $(CFLAGS) pth/fpth_lib.c -I$(PTH_PATH)/include -o pth/fpth_lib.o

endif

#modules/Template/template.o : modules/Template/template.f90 modules/objects/winds.o modules/objects/clumps.o
#	$(FC) -c $(FFLAGS) modules/Template/template.f90 -o modules/Template/template.o


%.o : %.f90
	$(FC) -c $(FFLAGS) $< -o $@ 

%.o : %.c
	$(CC) -c $(CFLAGS) $< -o $@


clean:
	rm -f $(OBJ_FILES) $(MOD_FILES) $(PROBLEM_OBJ_FILES) $(PROBLEM_MOD_FILES) $(EXECUTABLE)
	rm -f $(HYPRE_OBJ_FILES) $(POST_ELLIPTIC_OBJ_FILES) $(PTHREAD_OBJ_FILES)  $(POST_PTHREADS_OBJ_FILES) 
	rm -f *.lst
	rm -f *.cpp.f90 */*.cpp.f90 */*/*.cpp.f90
#	ls *.o
#	ls */*.o
#	ls */*/*.o
