# Makefile for compilation of MEDUSA

.KEEP_STATE:

.SUFFIXES:

.SUFFIXES: .F .o .for .h .inc

# First define some useful things like
RM = /bin/rm -f
MV = /bin/mv -f
CP = /bin/cp
LNSYM = /bin/ln -s
MKDIR = /bin/mkdir -p
AR = /usr/bin/ar
ARFLAGS = qs


SRCDIR_MCG    = ../src-mcg
LIBDIR_MODLIB = $(SRCDIR_MCG)/lib
XMLLIST_MCG   = list_testpt.xml


###########################################
### Guita: Debian Squeeze with gfortran ###
###########################################
FC = gfortran
FPP = cpp -E
#FFLAGS = -g -O0 -fmax-errors=5 -fcheck=bounds
#FFLAGS = -g -O0 -fmax-errors=5 -ffpe-trap=invalid,zero,overflow
FFLAGS = -g -O0 -fmax-errors=5
#FFLAGS = -O3
#FFLAGS = -O
INCLFLAGS = -I./include -I./gen/include -I. -I./gen/lib -I./gen

OPTIONDEFS =


LDFLAGS_SB2N = -L/usr/lib -lnetcdf -lnetcdff



########################################################################
# OPTIONDEFS possible definitions (non-exhaustive list)                #
########################################################################
#
#
# Enable the debugging output, according to the precisions in debug.h
#  -DDEBUG
#
#
# Enable MPI (default: no MPI -- see mod_execontrol_medusa.F for more
# information)
#  -DALLOW_MPI
#
#
# Select the calendar (default: -DCALENDAR_365DAYS)
#  -DCALENDAR_360DAYS    1 yr = 360 d,    1 d = 24 h, 1 h = 3600 s
#  -DCALENDAR_365DAYS    1 yr = 365 d,    1 d = 24 h, 1 h = 3600 s
#  -DCALENDAR_365P25DAYS 1 yr = 365.25 d, 1 d = 24 h, 1 h = 3600 s
#
#
# Select interface extensions for host model grids organised
# along more than 1 dimension (default: no extensions)
#  -DMEDUSA_BASE2D     host model grid is mapped onto a 2D map
#                      (host model uses (:,:) arrays)
#  -DMEDUSA_BASE2DT2D  host model grid is mapped onto a 2D array
#                      of 2D tiles (host model uses (:,:,:,:) arrays)
#
#
#  -DGRID_CUSTOM          use custom grid (for full control)
#
#  -DBIODIFFUSION_CUSTOM  use custom profile, to be provided in a
#                         source file called "bdiffc_custom.F", to be
#                         copied or linked into src-med/gen/include
#
#  -DBIOIRRIGATION_CUSTOM use custom profile, to be provided in a
#                         source file called "birric_custom.F", to be
#                         copied or linked into src-med/gen/include
#
#
########################################################################


SRCFILES_MED := mod_defines_medusa.F mod_execontrol_medusa.F \
           gen/mod_seafloor_wdata.F mod_logunits.F mod_gridparam.F \
           gen/mod_indexparam.F mod_gauss.F primit.F \
           mod_basicdata_medusa.F mod_milieucharas.F \
           gen/mod_materialcharas.F gen/mod_chemicalconsts.F \
           gen/mod_equilibdata.F gen/mod_equilibsubr.F gen/mod_equilibcontrol.F \
           gen/mod_processdata.F mod_medinterfaces.F \
           gen/mod_processsubr.F gen/mod_processcontrol.F \
           gen/mod_rreac.F mod_transport.F \
           mod_seafloor_central.F mod_zone_mass_totals.F \
           gen/mod_netcdfparam.F gen/mod_store_ncfiles.F gen/mod_read_ncfiles.F \
           gen/mod_seafloor_init.F \
           mod_seafloor_temp.F mod_sedcore.F \
           gen/mod_fvupwind_params.F \
           solvsedFVFullUpwind.F gen/flux2dae.F \
           solvsed_onestep.F gen/mass_balances.F

SRCFILES_GEN := mod_rreac.F mod_chemicalconsts.F mod_seafloor_wdata.F \
           mod_equilibdata.F mod_equilibcontrol.F mod_equilibsubr.F \
           mod_processdata.F mod_processcontrol.F mod_processsubr.F \
           mod_indexparam.F mod_materialcharas.F flux2dae.F \
           mod_fvupwind_params.F \
           mod_netcdfparam.F mod_store_ncfiles.F mod_read_ncfiles.F \
           mod_seafloor_init.F mass_balances.F

TPLFILES_GEN := solvsed_onestep_its_solut.F_template \
           solvsedLossConversions.F_template \
           medusa_seafloor_init.nml_template \
           medusa_compo_scales.nml_template medusa.rrp_template \
           mod_host1D_medusa_setup.F_template \
           mod_host2D_medusa_setup.F_template \
           mod_host2DT2D_medusa_setup.F_template \
           mod_host1D_o2s.F_template     mod_host1D_s2o.F_template \
           mod_host2D_o2s.F_template     mod_host2D_s2o.F_template \
           mod_host2DT2D_o2s.F_template  mod_host2DT2D_s2o.F_template


INCFILES_GEN = mdiffc.F speciate_wcflx.F \
           get_materialcharas.F save_materialcharas.F \
           seafloor_setup_1D.F seafloor_setup_2D.F \
           seafloor_setup_2DT2D.F

DBGFILES_GEN = medusa-main_indices.F


###############  You need not to change anything below  ###############

OBJFILES_MED = $(SRCFILES_MED:.F=.o)

OBJFILES_SB2N = mod_logunits.o mod_defines_medusa.o mod_execontrol_medusa.o \
           gen/mod_indexparam.o mod_gridparam.o gen/mod_netcdfparam.o \
           sedcore_bin2nc.o

codegen: tidy
	(cd -P $(SRCDIR_MCG); \
	 make clean_mcgfiles; \
	 $(RM) list.xml; $(LNSYM) $(XMLLIST_MCG) list.xml; \
	 ./medusa_cocogen_xml)
	$(MKDIR) gen/include
	$(MKDIR) gen/template
	$(MKDIR) gen/debug
	$(CP) $(addprefix $(SRCDIR_MCG)/gen/,$(SRCFILES_GEN)) gen
	$(CP) $(addprefix $(SRCDIR_MCG)/gen/,$(INCFILES_GEN)) gen/include
	$(CP) $(addprefix $(SRCDIR_MCG)/gen/,$(TPLFILES_GEN)) gen/template
	$(CP) $(addprefix $(SRCDIR_MCG)/gen/,$(DBGFILES_GEN)) gen/debug
	(cd -P $(LIBDIR_MODLIB); make libmodlib.a "FC = $(FC)")
	$(LNSYM) $(abspath $(LIBDIR_MODLIB)) gen/lib
	@echo
	@echo "**************************************************************"
	@echo " To complete the source file collection, it is still required"
	@echo " to provide (copy or link) appropriate versions of"
	@echo "  - solvsedLossConversions.F    in src-med/gen/include"
	@echo "  - solvsed_onestep_its_solut.F in src-med/gen/include"
	@echo " For all of these, there are templates available in"
	@echo " src-med/gen/template and templates. To use the templates as"
	@echo " they are you may execute"
	@echo "   make usetemplates"
	@echo " in the src-med directory."
	@echo " Once these three files are in place, complete the"
	@echo " libmedusa.a generation with"
	@echo "   make libmedusa.a"
	@echo " in the src-med directory again."
	@echo "**************************************************************"
	@echo


usetemplates: gen/template
	$(CP) gen/template/solvsed_onestep_its_solut.F_template \
          gen/include/solvsed_onestep_its_solut.F
	$(CP) gen/template/solvsedLossConversions.F_template \
          gen/include/solvsedLossConversions.F

#libmedusa.a: $(OBJFILES_MED)
#	$(RM) $@
#	$(AR) $(ARFLAGS) $@ $(OBJFILES_MED)
#	$(AR) -M < libmedusa.a.mri


libmedusa.a: $(OBJFILES_MED)
	$(RM) $@
	$(CP) gen/lib/libmodlib.a $@
	$(AR) $(ARFLAGS) $@ $(OBJFILES_MED)


sedcore_bin2nc: codegen $(OBJFILES_SB2N)
	$(FC) $(OPTIONDEFS) $(FFLAGS) $(INCLFLAGS) $(OBJFILES_SB2N) \
        $(LDFLAGS_SB2N) -o $@
	$(MV) $@ ../work


.F.o:;
	$(FC) $(OPTIONDEFS) -c $(FFLAGS) $(INCLFLAGS) -o $@ $*.F

.F.for:;
	$(FPP) $(OPTIONDEFS) $(INCLFLAGS) $*.F | \
	   egrep -v '(^[ ]*$$)' | egrep -v '(^[\#])' > $@

clean :
	$(RM) *.o gen/*.o *% *.mod *~ ~* *.log *.bak

tidy : clean
	$(RM) -r gen
