#
#     ##################################################################
#     ##################################################################
#     ######                                                      ######
#     ######      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
#           01/18/2011
#
#  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
COMDIR     = $(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   = arps2coamps          arps2coamps executable
# A2WMPEXE = arps2coamps_mpi      arps2coamps mpi executable
#
#-----------------------------------------------------------------------

A2CEXE   = arps2coamps
A2CMPEXE = arps2coamps_mpi

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

LIBARPS = libarps

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

MPIOBJ_ON  = coamps_parallel_module.o
MPIOBJ_OFF = coamps_parallel_module.o

MPIOBJS    = $(MPIOBJ_OFF)

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

A2CMAINOBJ = arps2coamps.o

A2CMODULES = module_coamps_constants.o module_arps2coamps_namelist.o   \
             module_coampsgrid.o module_interpolation.o                \
             static_input_module.o coamps_mapprojs_module.o            \
             mod_topo.o

EXTMODULES = module_arpsgrid_constants.o module_read_arpsgrid.o

A2COBJS1   = process_domain.o output_domain.o \
             interplib.o xgetgg.o

A2COBJS = $(EXTMODULES) $(A2CMODULES) $(MPIOBJS) $(A2COBJS1) $(A2CMAINOBJ)

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

default: $(A2CEXE)

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

$(A2CEXE):      $(BINDIR)/$(A2CEXE)
	@$(RM) coamps_parallel_module.f90 coamps_parallel_module.o
	ls -l $(BINDIR)/$(A2CEXE)

$(A2CMPEXE):    $(BINDIR)/$(A2CMPEXE)
	@$(RM) coamps_parallel_module.f90
	@$(RM) coamps_parallel_module.o
	ls -l $(BINDIR)/$(A2CMPEXE)

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

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

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

clean.arps2coamps:
	-$(RM) -f $(BINDIR)/$(A2CEXE) $(BINDIR)/$(A2CMPEXE)  \
                  $(A2COBJS) $(MPIOBJ_ON) $(MPIOBJ_OFF)      \
                  coamps_parallel_module.f90                 \
                  *.mod *.d work.pc work.pcl

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

arps2coamps.o : arps2coamps.f90 module_read_arpsgrid.o module_coampsgrid.o

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

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

module_coampsgrid.o : module_coampsgrid.f90 coamps_mapprojs_module.o \
                      coamps_parallel_module.o output_domain.o static_input_module.o

module_arps2coamps_namelist.o  : module_arps2coamps_namelist.f90 module_coamps_constants.o
module_coamps_constants.o : module_coamps_constants.f90

coamps_parallel_module.o : coamps_parallel_module.F
coamps_mapprojs_module.o : coamps_mapprojs_module.f90

process_domain.o : process_domain.f90 module_interpolation.o \
                   module_read_arpsgrid.o module_coampsgrid.o

module_interpolation.o: module_interpolation.f90 module_coamps_constants.o

interpmpi.o : interpmpi.F
	 -$(RM) -f interpmpi.f90
	$(CPP) $(CPPFLAGS) interpmpi.F interpmpi.f90
	$(FTNMP) $(FFLAGS) $(FREEFLAGS) -c interpmpi.f90
static_input_module.o : static_input_module.f90 coamps_mapprojs_module.o \
                        mod_topo.o xgetgg.o

xgetgg.o : xgetgg.c

