# This is the makefile for the mesa star package

MESA_DIR = ../..

#################################################################
#
# PREAMBLE

include $(MESA_DIR)/utils/makefile_header

MOD_DEFAULTS_DIR = $(MODULE_DIR)/defaults
MOD_JOB_DIR = $(MODULE_DIR)/job
MOD_OTHER_DIR = $(MODULE_DIR)/other
MOD_SE_DIR = $(MODULE_DIR)/se

#################################################################
#
# SOURCE FILES

ifeq ($(USE_PGSTAR),YES)
   PGSTAR_SRCS = \
      pgstar_ctrls_io.f90 \
      pgstar_support.f90 \
      pgstar_hist_track.f90 \
      pgstar_kipp.f90 \
      pgstar_dpg_dnu.f90 \
      pgstar_trho.f90 \
      pgstar_hr.f90 \
      pgstar_r_l.f90 \
      pgstar_r_teff.f90 \
      pgstar_l_teff.f90 \
      pgstar_l_r.f90 \
      pgstar_l_v.f90 \
      pgstar_logl_teff.f90 \
      pgstar_logl_r.f90 \
      pgstar_logl_v.f90 \
      pgstar_logg_teff.f90 \
      pgstar_logg_logt.f90 \
      pgstar_history_panels.f90 \
      pgstar_trho_profile.f90 \
      pgstar_mode_prop.f90 \
      pgstar_power.f90 \
      pgstar_abundance.f90 \
      pgstar_dynamo.f90 \
      pgstar_mixing_ds.f90 \
      pgstar_summary_burn.f90 \
      pgstar_summary_profile.f90 \
      pgstar_summary_history.f90 \
      pgstar_summary.f90 \
      pgstar_profile_panels.f90 \
      pgstar_grid.f90 \
      pgstar.f90
   ifneq ($(MAKECMDGOALS),clean)
      $(shell ln -sf $(MOD_PRIVATE_DIR)/pgstar_full.f90 pgstar.f90)
   endif
else
   PGSTAR_SRCS = pgstar.f90
   ifneq ($(MAKECMDGOALS),clean)
      $(shell ln -sf $(MOD_PRIVATE_DIR)/pgstar_stub.f90 pgstar.f90)
   endif
endif

ifeq ($(USE_SE),YES)
   SE_SRCS = se_support.f90
   ifneq ($(MAKECMDGOALS),clean)
      $(shell ln -sf $(MOD_SE_DIR)/se_support_full.f90 se_support.f90)
   endif
else
   SE_SRCS = se_support.f90
   ifneq ($(MAKECMDGOALS),clean)
      $(shell ln -sf $(MOD_SE_DIR)/se_support_stub.f90 se_support.f90)
   endif
endif

SRCS = \
   star_def.f90 \
   star_profile_def.f90 \
   star_history_def.f90 \
   star_private_def.f90 \
   other_split_mix.f90 \
   other_d_mix.f90 \
   other_am_mixing.f90 \
   other_wind.f90 \
   other_adjust_net.f90 \
   other_adjust_mdot.f90 \
   other_brunt.f90 \
   other_brunt_smoothing.f90 \
   other_build_initial_model.f90 \
   other_torque.f90 \
   other_torque_implicit.f90 \
   other_energy.f90 \
   other_energy_implicit.f90 \
   other_cgrav.f90 \
   other_opacity_factor.f90 \
   other_mlt.f90 \
   other_adjust_mlt_gradt_fraction.f90 \
   other_after_set_mixing_info.f90 \
   other_neu.f90 \
   other_paquette_coefficients.f90 \
   other_atm.f90 \
   other_diffusion.f90 \
   other_eos.f90 \
   other_kap.f90 \
   other_eps_grav.f90 \
   other_momentum.f90 \
   other_pgstar_plots.f90 \
   other_mesh_functions.f90 \
   other_surface_pt.f90 \
   other_write_pulsation_info.f90 \
   other_get_pulsation_info.f90 \
   other_edit_pulsation_info.f90 \
   other_edit_gyre_info.f90 \
   other_get_gyre_model.f90 \
   other_history_data_initialize.f90 \
   other_history_data_add_model.f90 \
   other_newton_monitor.f90 \
   other_photo_write.f90 \
   other_photo_read.f90 \
   other_astero_freq_corr.f90 \
   star_utils.f90 \
   ctrls_io.f90 \
   alloc.f90 \
   overshoot.f90 \
   turbulent_diffusion.f90 \
   mix_smoothing.f90 \
   mlt_info.f90 \
   rotation_mix_info.f90 \
   mix_info.f90 \
   opacities.f90 \
   net.f90 \
   neu.f90 \
   solve_mix.f90 \
   micro.f90 \
   hydro_rotation.f90 \
   brunt.f90 \
   create_atm.f90 \
   hydro_vars.f90 \
   report.f90 \
   read_model.f90 \
   write_model.f90 \
   photo_in.f90 \
   photo_out.f90 \
   pulsation_info.f90 \
   profile_getval.f90 \
   profile.f90 \
   mesh_functions.f90 \
   mesh_plan.f90 \
   mesh_adjust.f90 \
   eps_grav.f90 \
   hydro_chem_eqns.f90 \
   hydro_eqns.f90 \
   hydro_mtx.f90 \
   hydro_newton_procs.f90 \
   solve_omega_mix.f90 \
   history_specs.f90 \
   history.f90 \
   $(PGSTAR_SRCS) \
   timestep.f90 \
   do_one_utils.f90 \
   adjust_xyz.f90 \
   adjust_net.f90 \
   adjust_mass.f90 \
   adjust_mesh_support.f90 \
   adjust_mesh_plot.f90 \
   adjust_mesh.f90 \
   paquette_coeffs.f \
   diffusion_support.f90 \
   diffusion_procs.f90 \
   diffusion.f90 \
   element_diffusion.f90 \
   evolve_support.f90 \
   star_sparse.f90 \
   star_bcyclic.f90 \
   star_bcyclic_qp.f90 \
   star_newton.f90 \
   solve_hydro.f90 \
   dirk.f90 \
   struct_burn_mix.f90 \
   kuma.f90 \
   winds.f90 \
   evolve.f90 \
   relax.f90 \
   create_initial_model.f90 \
   pre_ms_model.f90 \
   init_model.f90 \
   init.f90 \
   star_job_ctrls_io.f90 \
   star_lib.f90 \
   $(SE_SRCS) \
   run_star_support.f90 \
   sample_pgstar_plot.f90

#################################################################
#
# TARGETS

LIB = libstar.a
LIB_DEFS = 
#    solve_burn_sparse.o \
#    solve_substep_burn.o \
#    solve_burn.o
LIB_OBJS = $(patsubst %.f,%.o,$(patsubst %.f90,%.o,$(SRCS)))
$(LIB) : $(LIB_DEFS) $(LIB_OBJS)
	$(LIB_TOOL) $(LIB) $(LIB_OBJS)

#################################################################
#
# COMPILATION RULES

INCLUDE_DEFAULTS = -I$(MOD_DEFAULTS_DIR)
INCLUDE_JOB = -I$(MOD_JOB_DIR)
INCLUDE_OTHER = -I$(MOD_OTHER_DIR)

STAR_INCLUDES = \
   $(INCLUDE_SE) $(INCLUDE_DEFAULTS) $(INCLUDE_JOB) $(INCLUDE_OTHER)

COMPILE = $(COMPILE_TO_DEPLOY) $(FCfree) $(STAR_INCLUDES)
#COMPILE = $(COMPILE_TO_TEST) $(FCfree) $(STAR_INCLUDES)

#COMPILE = $(COMPILE_NO_OPENMP_NO_OPT) $(FCfree) $(STAR_INCLUDES)
#COMPILE = $(COMPILE_TO_TEST) $(FCfree) $(FCwarn_unused) $(STAR_INCLUDES)
#COMPILE = $(COMPILE_FAST) $(FCfree) -g $(STAR_INCLUDES)

COMPILE_XTRA = $(COMPILE_BASIC) $(FCopt) $(FCfixed) -c

STAR_COMPILE_BASIC = $(COMPILE_BASIC) $(FCfree) $(STAR_INCLUDES) -c -O0

COMPILE_CMD = $(COMPILE)

star_def.o : COMPILE_CMD = $(COMPILE) -D$(FC)
se_support_full.o se_support_stub.o : COMPILE_CMD = $(STAR_COMPILE_BASIC)
report.o : COMPILE_CMD = $(STAR_COMPILE_BASIC)
lahyc.o : COMPILE_CMD = $(COMPILE_XTRA)
profile.o : COMPILE_CMD = $(STAR_COMPILE_BASIC)
paquette_coeffs.o : COMPILE_CMD = $(COMPILE_NO_CHECKS) $(FCfixed)
star_lib.o : COMPILE_CMD = $(STAR_COMPILE_BASIC)

%.o : %.f
	$(COMPILE_CMD) $<
%.o : %.f90
	$(COMPILE_CMD) $<
%.mod : %.o
	@true

clean:
	-@rm -f *.f90 *.o *.mod *.modmic *genmod.f90 *.a .depend

#################################################################
#
# DEPENDENCIES

# Paths to search for source & include files

VPATH = $(MOD_PUBLIC_DIR):$(MOD_PRIVATE_DIR):$(MOD_DEFAULTS_DIR):$(MOD_JOB_DIR):$(MOD_OTHER_DIR):$(MOD_SE_DIR)

# Automatic dependency generation using makedepf90

nodeps : $(.DEFAULT_GOAL)

NODEPS = $(or $(filter nodeps,$(MAKECMDGOALS)),$(filter clean,$(MAKECMDGOALS)))

ifeq ($(NODEPS),)

  DEPEND_DIRS = .:$(MOD_PUBLIC_DIR):$(MOD_PRIVATE_DIR):$(MOD_DEFAULTS_DIR):$(MOD_JOB_DIR):$(MOD_OTHER_DIR):$(MOD_SE_DIR)

  .depend :
	makedepf90 -m %m.mod -I$(DEPEND_DIRS) $(SRCS) > .depend
  -include .depend

endif
