#
#     ##################################################################
#     ##################################################################
#     ######                                                      ######
#     ######      Advanced Regional Prediction System (ARPS)      ######
#     ######                   Version 5.0                        ######
#     ######                                                      ######
#     ######                     Developed by                     ######
#     ######     Center for Analysis and Prediction of Storms     ######
#     ######                University of Oklahoma                ######
#     ######                                                      ######
#     ##################################################################
#     ##################################################################
#
#=======================================================================
#
#  PURPOSE: This makefile generates the ARPSPLT executables.
#
#  AUTHOR:  Yuhe Liu
#           7/22/1997
#
#  Modification history:
#
#
#  OTHER INFORMATION:
#       See the makearps command.
#
#=======================================================================

#-----------------------------------------------------------------------
#
# Default shell
#
#-----------------------------------------------------------------------

# SHELL=/bin/csh

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

FTN = f90
LDR = f90
CC  = cc

ARPS_LD = $(LDR)
FTNMP   = $(FTN)

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

TOPDIR  =
BINDIR  = $(TOPDIR)
INCLDIR = $(TOPDIR)/include
LIBDIR  = $(TOPDIR)/lib
ARPSDIR = $(TOPDIR)/src/arps
ENSDIR  = $(TOPDIR)/src/arpsens
MODDIR = $(TOPDIR)/modules

#-----------------------------------------------------------------------
#
# Compiler Flag of Options
#
#-----------------------------------------------------------------------

FFLAGS =
CFLAGS =
LDFLAGS =

FIXFLAGS  =
FREEFLAGS =

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

.SUFFIXES: $(SUFFIXES) .f90

.f.o:
	$(FTN) $(FFLAGS) $(FIXFLAGS) -c $<
.f90.o:
	$(FTN) $(FFLAGS) $(FREEFLAGS) -c $<
.c.o:
	$(CC)  $(CFLAGS) -c $<
.mod.o:     # .mod --> .o dependency dropped

#-----------------------------------------------------------------------
#
# Define HDF and NetCDF
#
#-----------------------------------------------------------------------

HDFLIBS = -ldf -lmfhdf -lz -ljpeg
NETLIBS = -lnetcdf

LIBS = $(HDFLIBS) $(NETLIBS)

ZXPLOTOBJ_ON      =
ZXPLOTOBJ_POST    = $(LIBDIR)/$(LIBZXPOST).a
ZXPLOTOBJ_NCAR    = $(LIBDIR)/$(LIBZXNCAR).a

ZXPLOTOBJ = $(ZXPLOTOBJ_POST)

MPIOBJ_ON = mpisubs.o
MPOBJS_ON = $(MPIOBJ_ON)

MPIOBJ_OFF = nompisubs.o
MPOBJS_OFF = $(MPIOBJ_OFF)

MPIOBJ  = $(MPIOBJS_OFF)
MPOBJS  = $(MPIOBJ)

#-----------------------------------------------------------------------
#
# Executable commands to be generated by this make file:
#
# PLTNCAREXE   = arpspltncar   ZXPLOT based graphic analysis program exec.
#                              GKS metafile will be generated.
# PLTPOSTEXE   = arpspltpost   ZXPLOT based graphic analysis program exec.
#                              Postscript file will be generated.
# PLTMAXEXE    = arpspltmax    ZXPLOT based graphic analysis program exec.
# PLTGRIDEXE   = pltgrid       ZXPLOT based graphic analysis program exec.
#
#-----------------------------------------------------------------------

PLTMAXEXE      = arpspltmax
PLTNCAREXE     = arpspltncar
PLTPOSTEXE     = arpspltpost
PLTPOSTMPEXE   = arpspltpost_mpi
PLTNCARMPEXE   = arpspltncar_mpi
PLTGRIDEXE     = pltgrid

#-----------------------------------------------------------------------
#
# ARPS and ADAS shared libraries
#
#-----------------------------------------------------------------------

LIBADAS = libadas
LIBARPS = libarps
LIBZXPOST = libzxpost
LIBZXNCAR = libzxncar

#-----------------------------------------------------------------------
#
# List of Makefiles
#
#-----------------------------------------------------------------------

MAKEFILE = Makefile

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

PLTMAXOBJ  = arpspltmax.o 
PLTGRIDOBJ = pltgrid.o

PLTMAINOBJ = arpsplt.o
PLTOBJS = arpspltlib.o arpsplt_cpu.o arpspltderive.o \
          read_surface_obs.o $(ENSDIR)/extrefleclib.o $(MPOBJS)

WIREFRMOBJ_ON  = wirfrm.o
WIREFRMOBJ_OFF = wirfrmstub.o


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

default: $(PLTNCAREXE)

#-----------------------------------------------------------------------
#
# Compile and link ARPS model executable, arps
#
#-----------------------------------------------------------------------

$(PLTNCAREXE):	$(BINDIR)/$(PLTNCAREXE)
	ls -l $(BINDIR)/$(PLTNCAREXE)

$(PLTPOSTEXE): $(BINDIR)/$(PLTPOSTEXE)
	ls -l $(BINDIR)/$(PLTPOSTEXE)

$(PLTPOSTMPEXE): $(BINDIR)/$(PLTPOSTMPEXE)
	ls -l $(BINDIR)/$(PLTPOSTMPEXE)

$(PLTNCARMPEXE): $(BINDIR)/$(PLTNCARMPEXE)
	ls -l $(BINDIR)/$(PLTNCARMPEXE)

$(PLTMAXEXE): $(PLTMAXOBJ) $(PLTOBJS) \
              $(LIBDIR)/$(LIBARPS).a  \
              $(LIBDIR)/$(LIBADAS).a  \
              $(ZXPLOTOBJ)
	$(ARPS_LD) $(LDFLAGS) -o $(BINDIR)/$@ $(PLTMAXOBJ) $(PLTOBJS) \
                  $(LIBDIR)/$(LIBADAS).a   $(LIBDIR)/$(LIBARPS).a \
                  $(ZXPLOTOBJ)             $(LIBS)

$(BINDIR)/$(PLTNCAREXE): $(PLTMAINOBJ) $(PLTOBJS) \
                         $(WIREFRMOBJ_ON)         \
                         $(LIBDIR)/$(LIBADAS).a   \
                         $(LIBDIR)/$(LIBARPS).a   \
                         $(LIBDIR)/$(LIBZXNCAR).a
	$(ARPS_LD) $(LDFLAGS) -o $@ $(PLTMAINOBJ) $(PLTOBJS) \
                               $(WIREFRMOBJ_ON)         \
                               $(LIBDIR)/$(LIBADAS).a   \
                               $(LIBDIR)/$(LIBARPS).a   \
                               $(LIBDIR)/$(LIBZXNCAR).a \
                               $(LIBS)

$(BINDIR)/$(PLTPOSTEXE): $(PLTMAINOBJ) $(PLTOBJS) \
                         $(WIREFRMOBJ_OFF)        \
                         $(LIBDIR)/$(LIBARPS).a   \
                         $(LIBDIR)/$(LIBADAS).a   \
                         $(LIBDIR)/$(LIBZXPOST).a 

	$(ARPS_LD) $(LDFLAGS) -o $@ $(PLTMAINOBJ) $(PLTOBJS) \
                               $(WIREFRMOBJ_OFF)        \
                               $(LIBDIR)/$(LIBADAS).a   \
                               $(LIBDIR)/$(LIBARPS).a   \
                               $(LIBDIR)/$(LIBZXPOST).a $(LIBS)

$(BINDIR)/$(PLTPOSTMPEXE): $(PLTMAINOBJ) $(PLTOBJS) \
                         $(WIREFRMOBJ_OFF)          \
                         $(LIBDIR)/$(LIBARPS).a     \
                         $(LIBDIR)/$(LIBADAS).a     \
                         $(LIBDIR)/$(LIBZXPOST).a 
	$(ARPS_LD) $(LDFLAGS) -o $@ $(PLTMAINOBJ) $(PLTOBJS) \
                               $(WIREFRMOBJ_OFF)        \
                               $(LIBDIR)/$(LIBADAS).a   \
                               $(LIBDIR)/$(LIBARPS).a   \
                               $(LIBDIR)/$(LIBZXPOST).a \
                               $(LIBS)

$(BINDIR)/$(PLTNCARMPEXE): $(PLTMAINOBJ) $(PLTOBJS) \
                         $(WIREFRMOBJ_ON)           \
                         $(LIBDIR)/$(LIBADAS).a     \
                         $(LIBDIR)/$(LIBARPS).a     \
                         $(LIBDIR)/$(LIBZXNCAR).a 
	$(ARPS_LD) $(LDFLAGS) -o $@ $(PLTMAINOBJ) $(PLTOBJS) \
                               $(WIREFRMOBJ_ON)         \
                               $(LIBDIR)/$(LIBADAS).a   \
                               $(LIBDIR)/$(LIBARPS).a   \
                               $(LIBDIR)/$(LIBZXNCAR).a \
                               $(LIBS) 

$(PLTGRIDEXE): $(BINDIR)/$(PLTGRIDEXE)
	ls -l $(BINDIR)/$(PLTGRIDEXE)

$(BINDIR)/$(PLTGRIDEXE): $(PLTGRIDOBJ) \
                         $(LIBDIR)/$(LIBADAS).a \
                         $(LIBDIR)/$(LIBZXPOST).a
	$(ARPS_LD) $(LDFLAGS) -o $@ $(PLTGRIDOBJ)     \
                         $(LIBDIR)/$(LIBADAS).a \
                         $(ZXPLOTOBJ) $(LIBS)

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

clean: clean.arpsplt

clean.arpsplt:
	-$(RM) -f $(BINDIR)/$(PLTNCAREXE)               \
                  $(BINDIR)/$(PLTPOSTEXE)               \
                  $(BINDIR)/$(PLTPOSTMPEXE)             \
                  $(BINDIR)/$(PLTNCARMPEXE)             \
                  $(BINDIR)/$(PLTMAXEXE)                \
                  $(BINDIR)/$(PLTGRIDEXE)               \
                  $(PLTGRIDOBJ) $(MPIOBJ_ON) $(MPIOBJ_OFF) \
                  $(PLTMAINOBJ) $(PLTMAXOBJ) $(PLTOBJS) \
                  $(WIREFRMOBJ_OFF) $(WIREFRMOBJ_ON) *.mod

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

arpsplt.o    : arpsplt.f90   $(ARPSDIR)/thermolib3d.f90 \
                             $(INCLDIR)/globcst.inc     \
                             $(INCLDIR)/indtflg.inc     \
                             $(INCLDIR)/arpsplt.inc     \
                             $(INCLDIR)/phycst.inc      \
                             $(INCLDIR)/grid.inc        \
                             $(INCLDIR)/alloc.inc       \
                             $(INCLDIR)/arpstrajc.inc
	$(FTN) $(FFLAGS_main) $(FREEFLAGS) -c $<

arpspltlib.o : arpspltlib.f90           \
                             $(INCLDIR)/arpsplt.inc    \
                             $(INCLDIR)/globcst.inc    \
                             $(INCLDIR)/phycst.inc     \
                             $(INCLDIR)/arpstrajc.inc
	$(FTN) $(FFLAGS_main) $(FREEFLAGS) -c $<


arpspltderive.o: arpspltderive.f90                     \
                             $(INCLDIR)/phycst.inc     \
                             $(INCLDIR)/arpsplt.inc    \
                             $(INCLDIR)/arpstrajc.inc

arpsplt_cpu.o: arpsplt_cpu.f90 $(INCLDIR)/globcst.inc

read_surface_obs.o : read_surface_obs.f90
wirfrm.o     : wirfrm.f90
wirfrmstub.o : wirfrmstub.f90
mpisubs.o    : mpisubs.f90 $(INCLDIR)/mp.inc
	$(FTNMP) $(FFLAGS) $(FREEFLAGS) -c $<

nompisubs.o  : nompisubs.f90
arpspltmax.o : arpspltmax.f90

pltgrid.o    : pltgrid.f90

$(ENSDIR)/extrefleclib.o : $(ENSDIR)/extrefleclib.f90
	$(FTN) $(FFLAGS) $(FREEFLAGS) -o $@ -c $<
