################################################################################
# Parallel SCHISM Makefile
#
# User makes environment settings for particular OS / PLATFORM / COMPILER / MPI
# below. These settings are based on the following options.
#
# Compiler name:
#   FCS: Serial compiler (for utilities)
#   FCP: Parallel compiler
#   FLD: Linker (in general same as parallel compiler)
#
# Compilation flags
#   FCSFLAGS: Flags for serial compilation
#   FCPFLAGS: Flags for parallel compilation (including all pre-processing flags)
#   FLDFLAGS: Flags for linker (e.g., -O2)
#
# Preprocessor flags:
#   DEBUG: Enable debugging code
#   ORDERED_SUM: Enable globally ordered sums & dot-products for bit reproducibility
#     of state quantities independent of number of processors (note: this can
#     significantly degrade performance);
#   INCLUDE_TIMING: Enable wallclock timing of code (note: this can have slight
#     effect on performance);
#   MPI_VERSION = 1 or 2: Version of MPI (try 2 first, if compile fails due to mpi
#     related errors then switch to version 1;
#
# Libraries (needed for parallel code). Need to re-compile these when compilers are changed.
#   MTSLIBS: Flags for linking ParMeTiS/MeTiS libaries
#   netcdf: v3.x has been tested
#   GOTM77051428:    v3.2.5
#   ALTLIBS: (obsolete) Flags for linking alternate solver libraries (LAPACK or ITPACK,
#            these are just for testing)
################################################################################

##########

########### Ensure that the user's Make.defs.local exists and include it

make_defs_local_exists := $(wildcard ../mk/Make.defs.local)
ifeq ($(strip $(make_defs_local_exists)),)
   $(error Make.defs.local does not exist in the /mk directory (parallel to this /src directory). See readme)
endif


-include ../mk/Make.defs.local  #optional include
include ../mk/Make.defs.config

ifeq ($(findstring GNU Fortran,$(shell $(FCP) --version)),GNU Fortran)
  $(print Here)
  MODULEOUTDIR = -J
else
  ifeq ($(ENV),DKRZold) ##please edit here, Eli
    MODULEOUTDIR = -qmoddir=
  else
    MODULEOUTDIR = -module 
  endif
endif


##########
# Check for serial compiler and revert to parallel if not provided
#########
ifeq ($(FCS),)
    FCS := ${FCP}
endif

##PetSc config file that defines things like PETSC_FC_INCLUDES below
ifeq ($(PETSC_VERSION),v1) #v3.5
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DPETSCV=1
  include ${PETSC_DIR}/conf/variables
else
  ifeq ($(PETSC_VERSION),v2) ##v3.6, 3.7
    PPFLAGS := $(PPFLAGS) $(IBMCPP)-DPETSCV=2
    include ${PETSC_DIR}/lib/petsc/conf/variables
  endif
  ifeq ($(PETSC_VERSION),v3) #v3.10
    PPFLAGS := $(PPFLAGS) $(IBMCPP)-DPETSCV=3 -I${PETSC_DIR}/include/petsc
    include ${PETSC_DIR}/lib/petsc/conf/variables
  endif
endif

############
# Derived compiler flags
###########

ifeq ($(ENV),DKRZold)
  IBMCPP = -WF,
else
  IBMCPP =
endif

PPFLAGS := $(PPFLAGS) $(IBMCPP)-DSCHISM

ifneq ($(USE_OPEN64),)
    ifeq ($(USE_64), yes)
      AVOID_ADV_WRITE := $(USE_OPEN64)
      PPFLAGS := $(PPFLAGS) $(IBMCPP)-DAVOID_ADV_WRITE $(IBMCPP)-DUSE_OPEN64
    endif
endif

################################################################################
# Object files; modules compile first; modules that depend on other modules compile last.
################################################################################

# rules to build objects for executable programs and libraries

#Search path
VPATH = Core/ Core/PaHM/ Driver/ Hydro/ EcoSim/ COSINE/ Sediment/ Sed2d/ \
        WWMIII/ ICM/ TIMOR/ FIB/ Ice/ Multi_ice/ Fabm/

ifdef FUJITSU
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DFUJITSU
endif

include o/$(config)/autosrc.mk

#Cores
#OBJS =  $(AUTO_OBJ) PaHM_Sizes.o PaHM_Global.o PaHM_Messages.o TimeDateUtils.o PaHM_Utilities.o \
#        csv_module.o SortUtils.o csv_parameters.o PaHM_Vortex.o \
#        csv_utilities.o  parwind.o 
OBJS :=  $(AUTO_OBJ) schism_glbl.o schism_msgp.o scribe_io.o misc_modules.o schism_io.o schism_driver.o gen_modules_clock.o

ifdef USE_PETSC
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_PETSC
  PETSCLIBS = ${PETSC_LIB}
  PETSCMOD = ${PETSC_FC_INCLUDES}

  OBJS := $(OBJS) petsc_schism.o
else
  PETSCLIBS =
  PETSCMOD =
endif

ifdef NO_PARMETIS
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DNO_PARMETIS
endif

ifdef USE_OLDIO
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DOLDIO
endif

ifdef USE_PREC_EVAP
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DPREC_EVAP
endif

ifdef USE_BULK_FAIRALL
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_BULK_FAIRALL
endif

ifdef USE_MM5
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DMM5
endif

ifeq ($(TVD_LIM),SB)
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DTVD_SB
else
  ifeq ($(TVD_LIM),VL)
    PPFLAGS := $(PPFLAGS) $(IBMCPP)-DTVD_VL
  else
    ifeq ($(TVD_LIM),OS)
      PPFLAGS := $(PPFLAGS) $(IBMCPP)-DTVD_OS
    else 
      ifeq ($(TVD_LIM),MM)
        PPFLAGS := $(PPFLAGS) $(IBMCPP)-DTVD_MM
      else
        $(error TVD_LIM must be defined!)
      endif
    endif
  endif
endif

ifdef USE_DEBUG
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DDEBUG 
endif

ifdef USE_TIMER2
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DTIMER2
endif

ifdef USE_TIMER
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DINCLUDE_TIMING
endif

ifdef USE_TIMOR_FLMUD
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_TIMOR_FLMUD
  OBJS := $(OBJS) flmud_input.o flmud_main.o flmud_pool.o
endif

ifdef USE_TIMOR
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_TIMOR
  OBJS := $(OBJS) timor_datapl.o\
       timor_3D_Boden.o timor_area.o timor_Bank.Avala.o  timor_bed.o \
       timor_Bilanzen.o timor_cr_w.o timor_dredge.o timor_fluc.o \
       timor_GravTrans.o timor_hydro_Anlagen.o\
       timor_init.o timor_Q3D.o timor_ReadWrite.o timor_schub.o\
       timor_sukzession.o timor_SusTrans.o timor_timeloop.o \
       timor_upw_ups.o timor_waves.o
endif

ifdef USE_GOTM
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_GOTM
endif

ifdef USE_HA
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_HA
  OBJS := $(OBJS) harm.o
endif

ifdef USE_PAHM
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_PAHM
  OBJS := $(OBJS) PaHM_Sizes.o PaHM_Global.o PaHM_Messages.o TimeDateUtils.o PaHM_Utilities.o \
        csv_module.o SortUtils.o csv_parameters.o PaHM_Vortex.o \
        csv_utilities.o  parwind.o
endif

ifdef USE_GEN
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_GEN
endif

ifdef USE_AGE
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_AGE
endif

ifdef USE_ECO
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_ECO
  OBJS := $(OBJS) bio_param.o eclight.o biology.o bio_init.o ecosim.o read_ecoin.o specir.o
endif

ifdef USE_ICM
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_ICM
  OBJS := $(OBJS) icm_mod.o icm_sed_mod.o icm_init.o icm_sed_flux.o  icm.o  read_icm_input.o
endif

ifdef USE_COSINE
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_COSINE
  OBJS := $(OBJS) cosine_misc.o cosine_mod.o cosine_init.o cosine.o 
endif

ifdef USE_FIB
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_FIB
###Add FIB file here
  OBJS := $(OBJS) fib_param.o fib.o
endif

ifdef USE_NAPZD
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_NAPZD
  OBJS := $(OBJS) biology_napzd.o napzd_spitz.o read_napzd_input.o
endif

ifdef USE_SED
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_SED
  OBJS := $(OBJS) sed_mod.o sed_misc_subs.o \
                  read_sed_input.o sed_init.o  \
                  sed_friction.o sed_filter.o \
                  sediment.o sed_bedload.o

endif

ifdef USE_FABM
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_FABM
  FABMINSTALLDIR = ./Fabm/build
  FABMLIBS = -L$(FABMINSTALLDIR)/lib -lfabm
  OBJS := $(OBJS) fabm_schism.o
  FCPFLAGS += -I$(FABMINSTALLDIR)/include
endif

ifdef USE_DVD
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_DVD
endif

ifdef USE_OIL
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_OIL
endif

ifdef USE_WWM
# please take care we have now ST41 (ardhuin_old) and ST42 (ardhuin_new)
  PPFLAGS := $(PPFLAGS) -DUSE_WWM -DNCDF -DST42 -DWWM_SOLVER 
  OBJS := $(OBJS) wwm_datapl.o wwm_petscpool.o  wwm_petsc_seriell.o wwm_petsc_parallel.o \
       wwm_petsc_block.o wwm_petsc_controller.o wwm_aux.o wwm_aux_parall.o wwm_mjdv2.o wwm_blasaux.o wwm_sparskit.o \
       wwm_ardhuin_old.o wwm_wind.o wwm_ardhuin_new.o wwm_breaking.o wwm_friction.o wwm_cycle3.o  \
       wwm_gridcf.o wwm_hotfile.o wwm_parall_solver.o wwm_m_constants.o wwm_m_fileio.o wwm_serv_xnl4v5.o wwm_mod_xnl4v5.o wwm_snl4_wrt.o \
       wwm_wave_setup.o wwm_initio.o wwm_netcdf.o wwm_input.o wwm_grid.o \
       wwm_bdcons_init.o wwm_bdcons.o wwm_bdcons_wam.o wwm_nesting.o wwm_export_ww3.o \
       wwm_specparam.o wwm_windinput.o wwm_dissipation.o wwm_snl3.o wwm_snl4.o wwm_snl42.o wwm_babanin.o wwm_sourceterms.o \
       wwm_specint.o wwm_nums1d.o wwm_numtheta.o wwm_numsigma.o wwm_fluctsplit.o \
       wwm_snonlin.o wwm_stress.o wwm_stresso.o wwm_sbottom.o wwm_sdiss_ardh_vec.o wwm_sinput.o wwm_sinput_ard.o wwm_wsigstar.o wwm_tauhf.o wwm_airsea.o wwm_jafu.o wwm_nlweigt.o wwm_buildstress.o wwm_inisnonlin.o wwm_fkmean.o wwm_frcutindex.o wwm_femeanws.o wwm_sdissip.o wwm_implsch.o wwm_implsch2.o \
       wwm_output.o wwm_compute.o wwm_compute_roller.o wwm_diffrac.o wwm_coupl_roms_pipe.o wwm_coupl_roms_pgmcl.o wwm_jacobi.o wwm_coupl_shyfem.o wwm_coupl_selfe.o wwm_coupl_timor.o wwm_vegdiss.o wwm_main.o wwm_lpp_filter.o
endif

ifdef USE_ICE
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_ICE
  OBJS := $(OBJS) ice_module.o ice_therm_mod.o ice_init.o ice_step.o ice_evp.o ice_mevp.o \
                  ice_fct.o ice_thermodynamics.o
endif

ifdef USE_MICE
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_MICE
  OBJS := $(OBJS) icepack_kinds.o icepack_warnings.o icepack_parameters.o icepack_age.o icepack_tracers.o \
                  icepack_mushy_physics.o icepack_orbital.o icepack_ocean.o icepack_firstyear.o \
                  icepack_meltpond_cesm.o icepack_therm_shared.o icepack_therm_bl99.o icepack_meltpond_lvl.o \
                  icepack_meltpond_topo.o icepack_zbgc_shared.o icepack_fsd.o icepack_atmo.o icepack_therm_mushy.o \
                  icepack_isotope.o icepack_flux.o icepack_itd.o icepack_shortwave.o icepack_brine.o \
                  icepack_aerosol.o icepack_therm_0layer.o icepack_zsalinity.o icepack_wavefracspec.o \
                  icepack_mechred.o icepack_algae.o icepack_therm_vertical.o icepack_zbgc.o icepack_therm_itd.o \
                  icepack_intfc.o icedrv_kinds.o icedrv_constants.o mice_module.o icedrv_system.o \
                  icedrv_main.o icedrv_allocate.o icedrv_set.o mice_init.o mice_evp.o icedrv_init.o\
                  mice_mevp.o icedrv_advection.o icedrv_transfer.o icedrv_io.o mice_step.o
endif

ifdef USE_MARSH
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_MARSH
endif

ifdef USE_ANALYSIS
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_ANALYSIS
endif

ifdef USE_SED2D
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_SED2D
  OBJS := $(OBJS) sed2d_mod.o sed2d_read.o sed2d_filter.o sed2d_transport.o \
                  sed2d_friction.o sed2d_morpho.o sed2d_check.o sed2d_init.o \
                  sed2d_main.o
endif

#Remaining Hydro
OBJS := $(OBJS) grid_subs.o hydraulic_structures.o schism_init.o \
        schism_step.o schism_finalize.o bktrk_subs.o solver_subs.o \
        misc_subs.o transport_TVD.o transport_TVD_imp.o \
        sflux_9c.o lap.o

ifdef USE_SIMPLE_WIND
  PPFLAGS := $(PPFLAGS) $(IBMCPP)-DUSE_SIMPLE_WIND
   OBJS := $(OBJS) simpler_wind.o
endif

# Names of the object files with configuration intermediate file (.o,.mod) output directory prepended
CONFIG_OBJS :=  $(addprefix o/$(config)/, $(OBJS))

# Names of source files with relative path as found on $VPATH
FULLSRC := $(foreach f,$(subst .o,.F90,$(OBJS)),$(firstword $(wildcard $(VPATH:%=%$f) not-found:$f)))

#PARMETISDIR := ./ParMetis-3.1-Sep2010
PARMETISDIR := ./ParMetis-4.0.3
ifeq ($(ENV),EDISON)
    PARMETISDIR := $(PARMETISDIR).cray
endif
ifeq ($(ENV),CORI2)
    PARMETISDIR := $(PARMETISDIR).cray
endif
ifeq ($(ENV),BEBOP)
    PARMETISDIR := $(PARMETISDIR).mpiicc
endif
ifeq ($(ENV),ANVIL)
    PARMETISDIR := $(PARMETISDIR).mpiicc
endif
ifeq ($(ENV),COMET)
    PARMETISDIR := $(PARMETISDIR).mpiicc
endif
ifeq ($(ENV),STAMPEDE2)
    PARMETISDIR := $(PARMETISDIR).mpiicc
endif

################################################################################
# Library list
################################################################################
ifdef NO_PARMETIS
#Use offline partitioning and disable ParMETIS
  MTSLIBS= 
else
  MTSLIBS= -L$(PARMETISDIR) -lparmetis -lmetis
endif
LIBS = $(MTSLIBS) $(FABMLIBS) $(CDFLIBS) $(GTMLIBS) $(PETSCLIBS)

################################################################################
# Build commands for SCHISM
################################################################################

.PRECIOUS: $(SELFE_HOME)/mk/.check.$(config) o/$(config)/%.o o/$(config)/.dummy


# Allow for the override of executable name by the user
ifeq ($(EXEC),)
    EXEC := pschism.$(config).ex
endif




o/$(config)/autosrc.mk: o/$(config)/.dummy
	python Core/gen_version.py
	echo "AUTO_OBJ=`echo schism_version.o`"  > o/$(config)/autosrc.mk



.PHONY: pschism psc

pschism: $(EXEC) o/$(config)/.dummy 

psc: $(EXEC) o/$(config)/.dummy 

.PHONY: all
all: pschism utility


# This is the main executable target
ifdef NO_PARMETIS
$(EXEC): $(CONFIG_OBJS) 
	$(FLD) $(FLDFLAGS) $(CONFIG_OBJS) $(LIBS) ${MODULEOUTDIR}. -I. -o $@
	ar -ru libschism.a $(CONFIG_OBJS)
else
$(EXEC): $(CONFIG_OBJS) $(PARMETISDIR)/parmetis.a 
	$(FLD) $(FLDFLAGS) $(CONFIG_OBJS) $(LIBS) ${MODULEOUTDIR}. -I. -o $@
	ar -ru libschism.a $(CONFIG_OBJS)


$(PARMETISDIR)/parmetis.a:
##	+$(MAKE) distclean --directory=$(PARMETISDIR)
	+$(MAKE) config --directory=$(PARMETISDIR)
	+$(MAKE) --directory=$(PARMETISDIR)
endif

#.PHONY: parmetis
#parmetis:
#	+$(MAKE) clean --directory=$(PARMETISDIR)
#	+$(MAKE) --directory=$(PARMETISDIR)


.PHONY: depend
depend: o/$(config)/.dummy o/$(config)/.depend ../bin/.dummy
	@echo Dependencies generated



o/$(config)/.depend: o/$(config)/.dummy 
	@echo Building depend list
	@echo $(util_srcs_abs)
	@ ../mk/sfmakedepend.pl -d o/$(config) -I $(VPATH) -f o/$(config)/.depend_extended $(FULLSRC) > depend.out
	@echo $(FULL_CONFIG_OBJS)
	@ ../mk/cull_depends.py o/$(config)/.depend_extended o/$(config)/.depend "$(FULL_CONFIG_OBJS)"


o/$(config)/schism_version.mod: o/$(config)/schism_version.o

o/$(config)/schism_version.o: Core/schism_version.F90 

Core/schism_version.F90:

ifneq "$(MAKECMDGOALS)" "clean"
  -include o/$(config)/.depend
endif

o/$(config)/%.o: %.F90 o/$(config)/.dummy o/$(config)/.depend
	$(QUIET)$(FCP) -c $(FCPFLAGS)  ${MODULEOUTDIR}o/$(config) -Io/$(config) $(GTMMOD) $(CDFMOD) $(PETSCMOD) $< -o $@

o/$(config)/fabm_schism.o: $(FABMINSTALLDIR)/lib/libfabm.a

$(FABMINSTALLDIR)/lib/libfabm.a:
	mkdir -p $(FABMINSTALLDIR)
	cd $(FABMINSTALLDIR) && cmake $(FABM_BASE)/src -DCMAKE_Fortran_COMPILER=$(FCP) -DFABM_HOST=schism -DCMAKE_INSTALL_PREFIX=. && make install

################# Utility
# The utility directory contains a lot of single-file executables plus a few that rely on shared subroutines
# for things like geometry calculations.
#
# The executables will be discovered automatically
# Files with re-usable routines should be maually added to the list util_lib_src a few lines below.
# Please consider moving the common files to UtilLib if you think the subroutines can be re-used 
# by utility scripts in several directories ... we'd like to start creating a modern API-driven library.


src_extension := .f90
util_lib_src := schism_geometry.f90 pt_in_poly.f90 pt_in_poly2.f90 extract_mod.f90 compute_zcor.f90 stat_pool.f90 stat_pool.f90 stripsearch_unstr.f90 argparse.f90 netcdf_var_names.f90 moving_average_filter.f90
util_lib_obj := $(subst $(src_extension),.o,$(util_lib_src))
util_lib_config_objs := $(addprefix o/$(config)/, $(util_lib_obj))


util_dirs :=  Combining_Scripts Grid_Scripts NCOM OneWayNestScripts Particle_Tracking Post-Processing-Fortran Sflux_nc SMS Stat3 UtilLib ArcGIS
util_dirs := $(addprefix Utility/,$(util_dirs))
VPATH := $(VPATH) $(util_dirs)


# list of source files in all the other source directories
ifneq ($(util_dirs),)
  util_srcs_abs := $(wildcard $(foreach ext,$(src_extension),$(addsuffix /*$(ext),$(util_dirs))))
  util_srcs_all := $(notdir $(util_srcs_abs) )
endif

# remove library items that don't compile as executables
util_srcs  := $(filter-out $(util_lib_src),$(util_srcs_all))
util_execs := $(addprefix ../bin/,$(subst $(src_extension),.ex,$(util_srcs)))
util_objs  := $(subst $(src_extension),.o,$(util_srcs))
util_config_objs := $(addprefix o/$(config)/, $(util_objs)) 

FULLSRC := $(FULLSRC) $(util_srcs_abs)
FULL_CONFIG_OBJS = $(CONFIG_OBJS) $(util_config_objs) $(util_lib_config_objs)

.PHONY: utility

utility: $(util_execs) o/$(config)/libutil_lib.a


#$(util_execs): $(util_config_objs) o/$(config)/libutil_lib.a
#	$(FCS) $(SCPFLAGS)  ${MODULEOUTDIR}o/$(config) -Lo/$(config) -lutil_lib -Io/$(config)  $(CDFLIBS) $(GTTMOD) $(CDFMOD) $< -o $@
$(util_execs): ../bin/%.ex : o/$(config)/%.o o/$(config)/libutil_lib.a
	$(FCS) $(SCPFLAGS) $< ${MODULEOUTDIR}o/$(config) -Lo/$(config) -lutil_lib -Io/$(config)  $(CDFLIBS) $(GTTMOD) $(CDFMOD) -o $@

o/$(config)/libutil_lib.a: $(util_lib_config_objs)
	$(AR) $(ARFLAGS) $@ $^


#$(util_config_obs) : $(util_srcs) o/$(config)/.dummy  ../bin/.dummy
#	$(SCP) -c $(FCPFLAGS)  ${MODULEOUTDIR}o/$(config) -Io/$(config) $(GTTMOD) $(CDFMOD) $< -o $@


o/$(config)/%.o : %.f90 o/$(config)/.dummy  ../bin/.dummy
#	$(FCS) -c $(FCPFLAGS)  ${MODULEOUTDIR}o/$(config) -Io/$(config) $(GTTMOD) $(CDFMOD) $< -o $@
	$(FCS) -c -cpp $(FCPFLAGS) $< ${MODULEOUTDIR}o/$(config) -Io/$(config) $(GTTMOD) $(CDFMOD) -o $@


../bin/%.ex: o/$(config)/%.o  ../bin/.dummy
	$(FLD) $(FLDFLAGS) $< $(LIBS) ${MODULEOUTDIR}. -I. -o $@





#################################################################################

# This file exists solely to force creation of the subdirectories that
# hold the dependency, object and preprocessor files.
# NOTE: we cant use a dependency for this because .dummy will always
#       be out-of-date with respect to the subdirs because they are
#       modified after .dummy is created.  But since there are no
#       dependencies, this rule only runs when the file doesn't exist.
outdir_exists := $(wildcard o/$config)
make_defs_local_exists := $(wildcard ../mk/Make.defs.local)

o/$(config)/.dummy:
	@echo $(make_defs_local_exists)
        ifeq ( $(strip $(make_defs_local_exists)), )
             $(error Make.defs.local does not exist in the /mk directory. Please create one using another mk/Make.defs.xxx as a template.  \
             If you put your Make.defs.xxx file in svn, you can make a symbolic link Make.defs.local pointing to it.[1])
        endif
	$(ECHO)mkdir -p o/$(config)
	@touch o/$(config)/.dummy


../bin/.dummy:
	$(ECHO)mkdir -p ../bin
	@touch ../bin/.dummy

../mk/Make.defs.local :
	$(error Make.defs.local does not exist in the /mk directory. Please create one using another mk/Make.defs.xxx as a template. \n \
             If you put your Make.defs.xxx file in svn, you can make a symbolic link Make.defs.local pointing to it.[1])



################################################################################
# Clean up or Clobber
################################################################################
# Clean up objects and modules. Clean kills all configurations.

.PHONY: clean
clean:
	$(QUIET)rm -f $(EXEC)
	$(QUIET)rm -f libschism.a
	$(QUIET)rm -rf o/*
	$(QUIET)rm -rf ../bin/*
	$(QUIET)rm -rf WWMIII/*.mod
	$(QUIET)rm -rf WWMIII/*.o
	(cd $(PARMETISDIR); make distclean; rm -f *.a )
	##(cd $(PARMETISDIR)/ParMETISLib ; make realclean )
	$(QUIET)rm -rf $(FABMINSTALLDIR)