#
#     ##################################################################
#     ##################################################################
#     ######                                                      ######
#     ######      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 ARPSENS executable
#
#  AUTHOR:  Yuhe Liu
#           7/22/1997
#
#  Modification history:
#    09/21/2006 Mingjing Tong
#    Add arpsenkfic.f90 and rndprt.f90
#
#    08/20/2007 Youngsun Jung
#    Use arpsarray module
#
#    03/11/2009 Gang Zhao
#    Added lib_RecursiveFilter.f90,
#    Modified arpsenkfic.f90
#
#    03/27/2009 Gang Zhao
#    link Lapack and Blas ( to solve for Square-root of matrix in
#    vertical Explicit Filter. find where they are on your machine
#    and link them)
#
#  OTHER INFORMATION:
#       See the makearps command.
#
#=======================================================================

#include $(INCFILE)

#-----------------------------------------------------------------------
#
# 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)

CPP = cpp
TAR = tar
AWK = awk
SED = sed
RM  = rm
LN  = ln

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

#-----------------------------------------------------------------------
#
# Compiler Flag of Options. The default is for AIX Fortran xlf.
#
#-----------------------------------------------------------------------

FFLAGS =
CFLAGS =
LDFLAGS =

CPPFLAGS  = -C -P
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

#-----------------------------------------------------------------------
#
# Executable to be generated by this make file:
#
# ENSICEXE = arpsensic     arpsensic executable
# ENSBCEXE = arpsensbc     arpsensbc executable
# ENSCVEXE = arpsenscv     arpsenscv executable
# ENKFICEXE = arpsenkfic   arpsenkfic executable
# RNDPRTEXE = rndprt       rndprt executable
# ENSSCORESEXE = ensscores ensscores executable
#
#-----------------------------------------------------------------------

ENSICEXE   = arpsensic
ENSICMPEXE = arpsensic_mpi
ENSBCEXE   = arpsensbc
ENSCVEXE   = arpsenscv
EPOSTEXE   = arpspost
EPOSTMPEXE = arpspost_mpi
B2GEXE     = bin2gem
ENSANAEXE  = ens_ana
ENSCALEXE  = ens_cal
ENKFICEXE = arpsenkfic
RNDPRTEXE = rndprt
ENSSCORESEXE = ensscores

#-----------------------------------------------------------------------
#
# Shared library to be linked
#
# LIBARPS = libarps      ARPS shared library
# LIBADAS = libadas      ADAS shared library
# LIBENKF = libenkf      ENKF shared library
#
#-----------------------------------------------------------------------

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

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

ZXPLOTOBJ = $(ZXPLOTOBJ_POST)

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

ENSICOBJ = arpsensic.o
ENSBCOBJ = arpsensbc.o
ENSCVOBJ = arpsenscv.o
EPOSTOBJ = arpspost.o
B2GOBJ   = bin2gem.o
ENSANAOBJ   = ens_ana.o
ENSCALOBJ   = ens_cal.o
ENSSCORESOBJ = ensscores.o

GEMOBJ_ON  = gemio.o
GEMOBJ_OFF = nogemio.o
GEMOBJ     = $(GEMOBJ_OFF)

CRTM_ON   = crtmpost.o
CRTM_OFF  = crtm_no.o
CRTMOBJ   = $(CRTM_OFF)

CITM_ON   =
CITM_OFF  = citm_no.o
CITMOBJ   = $(CRTM_OFF)

ENSICOBJS = $(ENSICOBJ) arpsenslib.o lib_RecursiveFilter.o enkflib.o
EPOSTOBJS = $(EPOSTOBJ) arpsenslib.o postcore.o arpspostlib.o extrefleclib.o \
            $(GEMOBJ) $(CRTMOBJ) $(CITMOBJ)
B2GOBJS   = $(B2GOBJ) arpsenslib.o postcore.o arpspostlib.o extrefleclib.o gemio.o
ENSANAOBJS = $(ENSANAOBJ) arpsenslib.o mrgrnk.o $(GEMOBJ)
ENSCALOBJS = $(ENSCALOBJ) arpsenslib.o mrgrnk.o lsq.o logistic.o
ENKFICOBJ = arpsenkfic.o initenkfic.o	lib_RecursiveFilter.o \
            module_arps_dtaread.o enkfio3d4wrf.o 
RNDPRTOBJ = rndprt.o

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

default: $(ENSICEXE)

#-----------------------------------------------------------------------
#
# Compile and link ARPS model executables
#
#-----------------------------------------------------------------------

$(ENSICEXE): $(BINDIR)/$(ENSICEXE)
	ls -l $(BINDIR)/$(ENSICEXE)
$(ENSICMPEXE): $(BINDIR)/$(ENSICMPEXE)
	ls -l $(BINDIR)/$(ENSICMPEXE)

$(BINDIR)/$(ENSICEXE): $(ENSICOBJS) $(LIBDIR)/$(LIBARPS).a
	$(ARPS_LD) $(LDFLAGS) -o $@ $(ENSICOBJS)            \
                               $(LIBDIR)/$(LIBARPS).a $(LIBS)
$(BINDIR)/$(ENSICMPEXE): $(ENSICOBJS) $(LIBDIR)/$(LIBARPS).a
	$(ARPS_LD) $(LDFLAGS) -o $@ $(ENSICOBJS)             \
                               $(LIBDIR)/$(LIBARPS).a $(LIBS)

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

$(BINDIR)/$(ENSBCEXE): $(ENSBCOBJ) $(LIBDIR)/$(LIBARPS).a
	$(ARPS_LD) $(LDFLAGS) -o $@ $(ENSBCOBJ)             \
                               $(LIBDIR)/$(LIBARPS).a $(LIBS)

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

$(BINDIR)/$(ENSCVEXE): $(ENSCVOBJ) $(LIBDIR)/$(LIBADAS).a \
                                   $(LIBDIR)/$(LIBARPS).a \
                                   $(ZXPLOTOBJ)
	$(ARPS_LD) $(LDFLAGS) -o $@ $(ENSCVOBJ)           \
                               $(LIBDIR)/$(LIBADAS).a     \
                               $(LIBDIR)/$(LIBARPS).a     \
                               $(ZXPLOTOBJ) $(LIBS)

$(EPOSTEXE): $(BINDIR)/$(EPOSTEXE)
	ls -l $(BINDIR)/$(EPOSTEXE)
$(EPOSTMPEXE): $(BINDIR)/$(EPOSTMPEXE)
	ls -l $(BINDIR)/$(EPOSTMPEXE)

$(BINDIR)/$(EPOSTEXE): $(EPOSTOBJS) $(LIBDIR)/$(LIBADAS).a \
                                    $(LIBDIR)/$(LIBARPS).a
	$(ARPS_LD) $(LDFLAGS) -o $@ $(EPOSTOBJS)           \
             $(LIBDIR)/$(LIBADAS).a $(LIBDIR)/$(LIBARPS).a \
             $(LIBS)

$(BINDIR)/$(EPOSTMPEXE): $(EPOSTOBJS) $(LIBDIR)/$(LIBADAS).a \
                                      $(LIBDIR)/$(LIBARPS).a
	$(ARPS_LD) $(LDFLAGS) -o $@ $(EPOSTOBJS)           \
             $(LIBDIR)/$(LIBADAS).a $(LIBDIR)/$(LIBARPS).a \
             $(LIBS)

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

$(BINDIR)/$(B2GEXE): $(B2GOBJS) $(LIBDIR)/$(LIBADAS).a \
                                    $(LIBDIR)/$(LIBARPS).a
	$(ARPS_LD) $(LDFLAGS) -o $@ $(B2GOBJS)          \
                               $(LIBDIR)/$(LIBADAS).a     \
                               $(LIBDIR)/$(LIBARPS).a     \
             $(LIBS)

$(ENSANAEXE): $(BINDIR)/$(ENSANAEXE)
	ls -l $(BINDIR)/$(ENSANAEXE)
$(ENSCALEXE): $(BINDIR)/$(ENSCALEXE)
	ls -l $(BINDIR)/$(ENSCALEXE)
$(ENKFICEXE): $(BINDIR)/$(ENKFICEXE)
	ls -l $(BINDIR)/$(ENKFICEXE)

$(BINDIR)/$(ENKFICEXE): $(ENKFICOBJ) $(LIBDIR)/$(LIBARPS).a \
                                     $(LIBDIR)/$(LIBENKF).a \
                                     $(LIBDIR)/$(LIBADAS).a
	$(ARPS_LD) $(LDFLAGS) -o $@ $(ENKFICOBJ)            \
                               $(LIBDIR)/$(LIBARPS).a       \
                               $(LIBDIR)/$(LIBENKF).a       \
                               $(LIBDIR)/$(LIBADAS).a $(LIBS)

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

$(BINDIR)/$(RNDPRTEXE): $(RNDPRTOBJ) $(LIBDIR)/$(LIBENKF).a
	$(ARPS_LD) $(LDFLAGS) -o $@ $(RNDPRTOBJ)           \
                               $(LIBDIR)/$(LIBARPS).a       \
                               $(LIBDIR)/$(LIBENKF).a $(LIBS)
$(BINDIR)/$(ENSANAEXE): $(ENSANAOBJS) $(LIBDIR)/$(LIBADAS).a \
                                    $(LIBDIR)/$(LIBARPS).a
	$(ARPS_LD) $(LDFLAGS) -o $@ $(ENSANAOBJS)          \
                               $(LIBDIR)/$(LIBADAS).a     \
                               $(LIBDIR)/$(LIBARPS).a     \
                              $(LIBS)
$(BINDIR)/$(ENSCALEXE): $(ENSCALOBJS) $(LIBDIR)/$(LIBADAS).a \
                                    $(LIBDIR)/$(LIBARPS).a
	$(ARPS_LD) $(LDFLAGS) -o $@ $(ENSCALOBJS)          \
                               $(LIBDIR)/$(LIBADAS).a     \
                               $(LIBDIR)/$(LIBARPS).a     \
                               $(LIBS)

$(ENSSCORESEXE): $(BINDIR)/$(ENSSCORESEXE)
	ls -l $(BINDIR)/$(ENSSCORESEXE)
$(BINDIR)/$(ENSSCORESEXE): $(ENSSCORESOBJ) $(LIBDIR)/$(LIBARPS).a
	$(ARPS_LD) $(LDFLAGS) -o $@ $(ENSSCORESOBJ) $(LIBDIR)/$(LIBARPS).a $(LIBS)

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

clean.arpsens:
	-$(RM) -f $(BINDIR)/$(ENSICEXE) $(BINDIR)/$(ENSICMPEXE) \
                  $(ENSICOBJS) $(B2GOBJS) $(GEMOBJ_ON)          \
                  $(BINDIR)/$(ENSBCEXE) $(ENSBCOBJ)  \
                  $(BINDIR)/$(ENSCVEXE) $(ENSCVOBJ)  \
                  $(BINDIR)/$(EPOSTEXE) $(EPOSTOBJS) \
                  $(BINDIR)/$(EPOSTMPEXE) $(BINDIR)/$(B2GEXE)   \
                  $(BINDIR)/$(ENKFICEXE) $(ENKFICOBJ) \
                  $(BINDIR)/$(RNDPRTEXE) $(RNDPRTOBJ) \
                  $(BINDIR)/$(ENSANAEXE) $(ENSANAOBJS) \
                  $(BINDIR)/${ENSCALEXE} ${ENSCALOBJS} \
                  $(BINDIR)/$(ENSSCORESEXE) $(ENSSCORESOBJ) \
                  $(CRTM_ON) $(CRTM_OFF) GEMPRM.PRM

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

arpsensic.o : arpsensic.f90   $(INCLDIR)/globcst.inc \
                              $(INCLDIR)/grid.inc    \
                              $(INCLDIR)/indtflg.inc
arpsensbc.o : arpsensbc.f90   $(INCLDIR)/globcst.inc \
                              $(INCLDIR)/grid.inc
arpsenscv.o : arpsenscv.f90   $(INCLDIR)/enscv.inc   \
                              $(INCLDIR)/globcst.inc \
                              $(INCLDIR)/grid.inc    \
                              $(INCLDIR)/indtflg.inc \
                              $(INCLDIR)/phycst.inc  \
                              $(INCLDIR)/sfcphycst.inc
arpspost.o : arpspost.f90     $(INCLDIR)/enscv.inc   \
                              $(INCLDIR)/globcst.inc \
                              $(INCLDIR)/grid.inc    \
                              $(INCLDIR)/indtflg.inc \
                              $(INCLDIR)/sfcphycst.inc

arpsenslib.o : arpsenslib.f90
bin2gem.o    : bin2gem.f90
	@if [ ! -r GEMPRM.PRM ]; then \
	sed -e 's/^C/!/;/MPAORT/s/= 3,/= 3, \&/;/MPALAM/s/+//;s/INCLUDE/!INCLUDE/' $(NAWIPS)/gempak/include/GEMPRM.PRM > GEMPRM.PRM; \
	fi
	$(FTN) $(FFLAGS) $(FREEFLAGS) -c $<

postcore.o   : postcore.f90   $(INCLDIR)/globcst.inc \
                              $(INCLDIR)/grid.inc

gemio.o      : gemio.f90
	@$(RM) -f GEMPRM.PRM
	@if [ "$(NAWIPS)" != "" ]; then \
	sed -e 's/^C/!/;/MPAORT/s/= 3,/= 3, \&/;/MPALAM/s/+//;s/INCLUDE/!INCLUDE/' $(NAWIPS)/gempak/include/GEMPRM.PRM > GEMPRM.PRM; \
	fi
	$(FTN) $(FFLAGS) $(FREEFLAGS) -c $<

nogemio.o    : nogemio.f90

ens_ana.o    : ens_ana.f90    $(INCLDIR)/enscv.inc mrgrnk.o

ens_cal.o    : ens_cal.f90 lsq.o logistic.o mrgrnk.o

arpsenkfic.o : arpsenkfic.f90 module_arps_dtaread.o     \
                              #$(MODDIR)/arpsarray.mod \
                              #$(MODDIR)/arps3darray.mod \
                              $(INCLDIR)/globcst.inc \
                              $(INCLDIR)/grid.inc    \
                              $(INCLDIR)/indtflg.inc \
                              $(INCLDIR)/arpsenkfic.inc \
                              $(INCLDIR)/arpsenkf.inc
	$(FTN) $(FFLAGS) $(FREEFLAGS) -c $<

initenkfic.o : initenkfic.f90 $(INCLDIR)/arpsenkfic.inc \
                              $(INCLDIR)/arpsenkf.inc

rndprt.o : rndprt.f90         $(INCLDIR)/arpsenkfic.inc \
                              $(INCLDIR)/arpsenkf.inc

enkflib.o : $(ENKFDIR)/enkflib.f90
	$(FTN) $(FFLAGS) $(FREEFLAGS) -c $<

lib_RecursiveFilter.o : lib_RecursiveFilter.f90

module_arps_dtaread.o : $(ARPSDIR)/module_arps_dtaread.f90
	$(FTN) $(FFLAGS) $(FREEFLAGS) -c $<
enkflib4wrf.o : $(ENKFDIR)/enkflib4wrf.f90
	$(FTN) $(FFLAGS) $(FREEFLAGS) -c $<

enkfio3d4wrf.o : $(ENKFDIR)/enkfio3d4wrf.f90 $(INCLDIR)/globcst.inc \
                                  $(INCLDIR)/grid.inc \
                                  $(INCLDIR)/indtflg.inc \
                                  $(INCLDIR)/phycst.inc \
                                  $(INCLDIR)/bndry.inc \
                                  $(INCLDIR)/exbc.inc \
                                  $(INCLDIR)/mp.inc
	$(FTN) $(FFLAGS) $(FREEFLAGS) -c $<

ensscores.o : ensscores.f90   $(INCLDIR)/mp.inc
