#
#     ##################################################################
#     ##################################################################
#     ######                                                      ######
#     ######      Advanced Regional Prediction System (ARPS)      ######
#     ######                   Version 5.2                        ######
#     ######                                                      ######
#     ######                     Developed by                     ######
#     ######     Center for Analysis and Prediction of Storms     ######
#     ######                University of Oklahoma                ######
#     ######                                                      ######
#     ##################################################################
#     ##################################################################
#
#=======================================================================
#
#  PURPOSE: This makefile generates the ARPS2WRF executable
#
#  AUTHOR:  Yunheng Wang
#           10/23/2008
#
#  Modification history:
#
#
#  OTHER INFORMATION:
#       See the makearps command.
#
#=======================================================================

#-----------------------------------------------------------------------
#
# Default names of the loader and tar, can be replaced on the command
# line for other system
#
#-----------------------------------------------------------------------

FTN = ifort
FTNMP = $(FTN)
LDR = $(FTN)
CC  = gcc
CPP = cpp

ARPS_LD = $(LDR)

TAR = tar
AWK = awk
RM  = rm
LN  = ln

TOPDIR     = ../..
BINDIR     = $(TOPDIR)/bin
INCLDIR    = $(TOPDIR)/include
ARPSLIBDIR = $(TOPDIR)/lib
MODDIR     = $(TOPDIR)/modules
COMMONDIR  = $(TOPDIR)/src/common

#-----------------------------------------------------------------------
#
# Compiler Flag of Options. The default is for Intel Fortran on Linux.
#
#-----------------------------------------------------------------------

FFLAGS = -I$(INCLDIR)
CFLAGS =
LDFLAGS =

FIXFLAGS  =
FREEFLAGS =
CPPFLAGS  = -C -P

#-----------------------------------------------------------------------
#
# Dependencies
#
#-----------------------------------------------------------------------

.SUFFIXES: $(SUFFIXES) .f90

.f.o:
	$(FTN) $(FFLAGS) $(FIXFLAGS) -c $<
.f90.o:
	$(FTN) $(FFLAGS) $(FREEFLAGS) -c $<
.c.o:
	$(CC)  $(CFLAGS) -c $<
.F.o:
	$(CPP) $(CPPFLAGS) $< $(addsuffix .f90, $(basename $<));
	$(FTNMP) $(FFLAGS) $(FREEFLAGS) -c $(addsuffix .f90, $(basename $<))
.mod.o:        # .mod --> .o dependency dropped

#-----------------------------------------------------------------------
#
# Executables to be generated by this make file:
#
# A2WEXE   = arps4wrf          ARPS4WRF executable
# A2WMPEXE = arps4wrf_mpi      ARPS4WRF mpi executable
#
#-----------------------------------------------------------------------

A4WEXE   = arps4wrf
A4WMPEXE = arps4wrf_mpi

#-----------------------------------------------------------------------
#
# ARPS library and WRF library to be linked
#
# LIBARPS = libarps      ARPS shared library
#
#-----------------------------------------------------------------------

LIBARPS = libarps

#-----------------------------------------------------------------------
#
# List of machine-dependent object codes
#
#-----------------------------------------------------------------------

MPIOBJ_ON  = wrf_parallel_module.o
MPIOBJ_OFF = wrf_parallel_module.o

MPIOBJS    = $(MPIOBJ_OFF)

#-----------------------------------------------------------------------
#
# List of code objects
#
#-----------------------------------------------------------------------

A4WMAINOBJ = arps4wrf.o

A4MODULES  = module_wrfgrid_constants.o module_commontypes.o \
             module_metgrid.o module_geogrid.o    \
             static_input_module.o queue_module.o \
             wrf_mapprojs_module.o wrf_maputils_module.o \
             module_arps4wrf_namelist.o

EXTMODULES = module_arpsgrid_constants.o module_read_arpsgrid.o

A4WOBJS1   = process_domain.o output_domain.o wrf_subs.o \
             interplib.o interpmpi.o

A4WOBJS = $(A4MODULES) $(EXTMODULES) $(MPIOBJS) $(A4WOBJS1) $(A4WMAINOBJ)

#-----------------------------------------------------------------------
#
# Set Default
#
#-----------------------------------------------------------------------

default: $(A4WEXE)

#-----------------------------------------------------------------------
#
# Compile and link executable
#
#-----------------------------------------------------------------------

$(A4WEXE):      $(BINDIR)/$(A4WEXE)
	@$(RM) wrf_parallel_module.f90 interpmpi.f90 wrf_subs.f90
	@$(RM) wrf_parallel_module.o interpmpi.o wrf_subs.o
	ls -l $(BINDIR)/$(A4WEXE)

$(A4WMPEXE):    $(BINDIR)/$(A4WMPEXE)
	@$(RM) wrf_parallel_module.f90 interpmpi.f90 wrf_subs.f90
	@$(RM) wrf_parallel_module.o interpmpi.o wrf_subs.o
	ls -l $(BINDIR)/$(A4WMPEXE)

$(BINDIR)/$(A4WMPEXE): $(A4WOBJS) $(ARPSLIBDIR)/$(LIBARPS).a
	$(ARPS_LD) $(LDFLAGS) -o $@ $(A4WOBJS)            \
                               $(ARPSLIBDIR)/$(LIBARPS).a \
                               $(LIBS)

$(BINDIR)/$(A4WEXE): $(A4WOBJS) $(ARPSLIBDIR)/$(LIBARPS).a
	$(ARPS_LD) $(LDFLAGS) -o $@ $(A4WOBJS)            \
                               $(ARPSLIBDIR)/$(LIBARPS).a \
                               $(LIBS)

#-----------------------------------------------------------------------
#
# Remove the object code for individual programs
#
#-----------------------------------------------------------------------

clean.arps4wrf:
	-$(RM) -f $(BINDIR)/$(A4WEXE) $(BINDIR)/$(A4WMPEXE)  \
                  $(A4WOBJS) $(MPIOBJ_ON) $(MPIOBJ_OFF)      \
                  wrf_parallel_module.f90 interpmpi.f90      \
                  wrf_subs.f90 *.mod *.d work.pc work.pcl

#-----------------------------------------------------------------------
#
# Object code dependency list:
#
#-----------------------------------------------------------------------

arps4wrf.o : arps4wrf.f90 module_wrfgrid_constants.o module_arps4wrf_namelist.o

process_domain.o   : process_domain.f90 module_read_arpsgrid.o    \
                     module_metgrid.o interplib.o interpmpi.o

output_domain.o    : output_domain.f90  module_metgrid.o

module_read_arpsgrid.o  : $(COMMONDIR)/module_read_arpsgrid.f90 module_arpsgrid_constants.o
	$(FTN) $(FFLAGS) $(FREEFLAGS) -o $@ -c $<

module_arpsgrid_constants.o : $(COMMONDIR)/module_arpsgrid_constants.f90
	$(FTN) $(FFLAGS) $(FREEFLAGS) -o $@ -c $<

module_metgrid.o   : module_metgrid.f90  module_geogrid.o
module_geogrid.o   : module_geogrid.f90  static_input_module.o    \
                     wrf_parallel_module.o wrf_mapprojs_module.o  \
                     module_commontypes.o

module_commontypes.o : module_commontypes.f90 module_wrfgrid_constants.o

module_arps4wrf_namelist.o  : module_arps4wrf_namelist.f90 module_wrfgrid_constants.o
module_wrf_constants.o : module_wrfgrid_constants.f90

static_input_module.o : static_input_module.f90 queue_module.o \
                        module_wrfgrid_constants.o module_arpsgrid_constants.o $(MPIOBJS)
queue_module.o        : queue_module.f90
wrf_parallel_module.o : wrf_parallel_module.F
wrf_mapprojs_module.o : wrf_mapprojs_module.f90 wrf_maputils_module.o
wrf_maputils_module.o : wrf_maputils_module.f90

wrf_subs.o : $(TOPDIR)/src/arps2wrf/wrf_subs.F
	 -$(RM) -f wrf_subs.f90 wrf_subs.o
	$(CPP) $(CPPFLAGS) $(TOPDIR)/src/arps2wrf/wrf_subs.F wrf_subs.f90
	$(FTN) $(FFLAGS) $(FREEFLAGS) -c wrf_subs.f90

interpmpi.o : interpmpi.F
	 -$(RM) -f interpmpi.f90
	$(CPP) $(CPPFLAGS) interpmpi.F interpmpi.f90
	$(FTNMP) $(FFLAGS) $(FREEFLAGS) -c interpmpi.f90
