#
#     ##################################################################
#     ##################################################################
#     ######                                                      ######
#     ######      Advanced Regional Prediction System (ARPS)      ######
#     ######                   Version 4.3                        ######
#     ######                                                      ######
#     ######                     Developed by                     ######
#     ######     Center for Analysis and Prediction of Storms     ######
#     ######                University of Oklahoma                ######
#     ######                                                      ######
#     ##################################################################
#     ##################################################################
#
#=======================================================================
#
#  PURPOSE: This makefile generates the 3DVAR executable and shared
#           library
#
#  AUTHOR:  Jidong Gao
#           7/22/2000
#
#  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)

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

TOPDIR = 
BINDIR = $(TOPDIR)
INCLDIR = $(TOPDIR)/include
LIBDIR = $(TOPDIR)/lib
ARPSDIR = $(TOPDIR)/src/arps
ADASDIR = $(TOPDIR)/src/adas

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

FFLAGS    =
FIXFLAGS  =
FREEFLAGS =
CFLAGS    =
LDFLAGS   =

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

.SUFFIXES: $(SUFFIXES) .f90

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

#-----------------------------------------------------------------------
#
# Executable to be generated by this make file:
#
# 3DVAREXE = arps3dvar          3DVAR executable
#
#-----------------------------------------------------------------------

3DVAREXE   = arps3dvar
3DVARMPEXE = arps3dvar_mpi

#-----------------------------------------------------------------------
#
# Object library to be generated for ARPS solver:
#
# LIBARPS = libarps     ARPS shared library
# LIBADAS = libadas     ADAS shared library
#
#-----------------------------------------------------------------------

LIBARPS  = libarps
LIBADAS  = libadas
LIBRADTN = libradtn

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

3DVARMAINOBJ = Vmodule_3dvar.o  module_arpsArray.o  module_analysisArrays.o \
               module_anaIncArray.o module_soilArray.o arps3dvar.o

3DVAROBJS1 =$(ADASDIR)/anxiter.o  $(ADASDIR)/initadas.o        \
            $(ADASDIR)/incrdump.o $(ADASDIR)/prepretr.o        \
            $(ADASDIR)/prepsfc.o  $(ADASDIR)/adasmpi.o         \
            $(ADASDIR)/prepsng.o  $(ADASDIR)/prepua.o          \
            $(ADASDIR)/rdacars.o  $(ADASDIR)/adjtsfc.o         \
            $(ADASDIR)/rdretcol.o $(ADASDIR)/rdsfcobs.o        \
            $(ADASDIR)/cmpcldlib.o $(ADASDIR)/rdprofiles.o     \
            $(ADASDIR)/rdradcol.o                              \
            grd2obsth.o prepradar.o                            \
            Vcostf3d.o Vlinear_int3d.o Vinit3dvar.o            \
            Vtrans.o Vctr_to_vbl.o Vminimization.o             \
            Vvbl_to_ctr.o Vgradc3d.o Vderac_scale.o            \
            Vminim_sub.o Vlinear_int2d.o Vrecur_filt3d.o 
 
3DVARCLDOBJS = $(ADASDIR)/cloud_cv.o $(ADASDIR)/cloud_lwc.o    \
               $(ADASDIR)/cmpclddrv.o $(ADASDIR)/sunfuncs.o    \
               $(ADASDIR)/cldinsert.o $(ADASDIR)/rdsatfld.o

MPIOBJ_ON = Vrecur_filtmpi.o
MPOBJS_ON = $(MPIOBJ_ON)

MPIOBJ_OFF = Vrecur_filtnompi.o
MPOBJS_OFF = $(MPIOBJ_OFF)

MPOBJS     = $(MPIOBJ)

3DVAROBJS = $(3DVARMAINOBJ) $(3DVAROBJS1) $(3DVARCLDOBJS) \
            $(LIB3DVAROBJS) $(MPOBJS)

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

default: $(3DVAREXE)

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

$(3DVAREXE): $(BINDIR)/$(3DVAREXE)
	ls -l $(BINDIR)/$(3DVAREXE)

$(BINDIR)/$(3DVAREXE): $(3DVAROBJS) $(LIBDIR)/$(LIBARPS).a $(LIBDIR)/$(LIBADAS).a \
                       $(LIBDIR)/$(LIBRADTN).a
	$(ARPS_LD) $(LDFLAGS) -o $@ $(3DVAROBJS) $(LIBDIR)/$(LIBARPS).a  \
                  $(LIBDIR)/$(LIBADAS).a $(LIBDIR)/$(LIBRADTN).a $(LIBS) 

$(3DVARMPEXE): $(BINDIR)/$(3DVARMPEXE)
	ls -l $(BINDIR)/$(3DVARMPEXE)

$(BINDIR)/$(3DVARMPEXE): $(3DVAROBJS) $(LIBDIR)/$(LIBARPS).a $(LIBDIR)/$(LIBADAS).a \
                       $(LIBDIR)/$(LIBRADTN).a
	$(ARPS_LD) $(LDFLAGS) -o $@ $(3DVAROBJS) $(LIBDIR)/$(LIBARPS).a  \
                  $(LIBDIR)/$(LIBADAS).a $(LIBDIR)/$(LIBRADTN).a $(LIBS) 

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

CPPSRC = arps3dvar.f90 grd2obsth.f90 prepradar.f90

clean.arps3dvar:
	-$(RM) -f $(BINDIR)/$(3DVAREXE) $(BINDIR)/$(3DVARMPEXE)         \
                  $(3DVARMAINOBJ) $(3DVAROBJS) $(LIB3DVAROBJS)          \
                  $(MPIOBJ_ON) $(MPIOBJ_OFF) $(CPPSRC)

#-----------------------------------------------------------------------
#
# Object code dependency list:
#
#-----------------------------------------------------------------------
Vmodule_3dvar.o: Vmodule_3dvar.f90
module_anaIncArray.o: $(ADASDIR)/module_anaIncArray.f90
	$(FTN) $(FFLAGS) $(FREEFLAGS) -c $<
module_soilArray.o:   $(ADASDIR)/module_soilArray.f90
	$(FTN) $(FFLAGS) $(FREEFLAGS) -c $<
module_arpsArray.o: $(ADASDIR)/module_arpsArray.f90
	$(FTN) $(FFLAGS) $(FREEFLAGS) -c $<
module_analysisArrays.o: $(ADASDIR)/module_analysisArrays.f90
	$(FTN) $(FFLAGS) $(FREEFLAGS) -c $<

arps3dvar.o : $(ADASDIR)/adas_3dvar_driver.F \
                                 $(ADASDIR)/module_arpsArray.f90 \
                                 $(ARPSDIR)/thermolib3d.f90  \
                                 $(INCLDIR)/adas.inc     \
                                 $(INCLDIR)/exbc.inc     \
                                 $(INCLDIR)/bndry.inc    \
                                 $(INCLDIR)/globcst.inc  \
                                 $(INCLDIR)/nudging.inc  \
                                 $(INCLDIR)/phycst.inc   \
                                 $(INCLDIR)/grid.inc     \
                                 $(INCLDIR)/alloc.inc   \
               module_arpsArray.o   module_soilArray.o  \
               module_anaIncArray.o module_analysisArrays.o \
               Vmodule_3dvar.o
	$(CPP) -Darps3dvar $(CPPFLAGS) $(ADASDIR)/adas_3dvar_driver.F arps3dvar.f90;
	$(FTN) $(FFLAGS_main) $(FREEFLAGS) -c arps3dvar.f90

$(ADASDIR)/anxiter.o : $(ADASDIR)/anxiter.f90
$(ADASDIR)/initadas.o   : $(ADASDIR)/initadas.f90        \
                                 $(INCLDIR)/adas.inc     \
                                 $(INCLDIR)/bndry.inc    \
                                 $(INCLDIR)/globcst.inc
$(ADASDIR)/prepsfc.o    : $(ADASDIR)/prepsfc.f90         \
                                 $(INCLDIR)/phycst.inc
$(ADASDIR)/prepsng.o    : $(ADASDIR)/prepsng.f90         \
                                 $(INCLDIR)/phycst.inc
$(ADASDIR)/prepua.o     : $(ADASDIR)/prepua.f90
$(ADASDIR)/radarlib3d.o : $(ADASDIR)/radarlib3d.f90      \
                                 $(INCLDIR)/remap.inc    \
                                 $(INCLDIR)/remaptab.inc \
                                 $(INCLDIR)/globcst.inc
$(ADASDIR)/rdacars.o    : $(ADASDIR)/rdacars.f90
$(ADASDIR)/rdprofiles.o : $(ADASDIR)/rdprofiles.f90      
$(ADASDIR)/rdsfcobs.o   : $(ADASDIR)/rdsfcobs.f90
$(ADASDIR)/incrdump.o   : $(ADASDIR)/incrdump.f90        \
                                 $(INCLDIR)/globcst.inc  \
                                 $(INCLDIR)/grid.inc

$(ADASDIR)/cloud_cv.o   : $(ADASDIR)/cloud_cv.f90        \
                                 $(INCLDIR)/adas.inc 
$(ADASDIR)/cmpclddrv.o  : $(ADASDIR)/cmpclddrv.f90       \
                                 $(INCLDIR)/adas.inc     \
                                 $(INCLDIR)/globcst.inc  \
                                 $(INCLDIR)/phycst.inc   \
                                 $(INCLDIR)/grid.inc
$(ADASDIR)/cldinsert.o  : $(ADASDIR)/cldinsert.f90       \
                                 $(INCLDIR)/adas.inc     \
                                 $(INCLDIR)/phycst.inc

$(ADASDIR)/cloud_lwc.o  : $(ADASDIR)/cloud_lwc.f90       \
                                 $(INCLDIR)/adas.inc 
$(ADASDIR)/rdsatfld.o   : $(ADASDIR)/rdsatfld.f90        \
                                 $(INCLDIR)/globcst.inc  \
                                 $(INCLDIR)/grid.inc
$(ADASDIR)/sunfuncs.o   : $(ADASDIR)/sunfuncs.f90
$(ADASDIR)/cmpcldlib.o  : $(ADASDIR)/cmpcldlib.f90       \
                                 $(INCLDIR)/adas.inc 
$(ADASDIR)/prepretr.o   : $(ADASDIR)/prepretr.f90
$(ADASDIR)/rdretcol.o   : $(ADASDIR)/rdretcol.f90
$(ADASDIR)/adjtsfc.o    : $(ADASDIR)/adjtsfc.f90
$(ADASDIR)/rdprofiles.o : $(ADASDIR)/rdprofiles.f90
$(ADASDIR)/adasmpi.o 	: $(ADASDIR)/adasmpi.f90
$(ADASDIR)/rdradcol.o 	: $(ADASDIR)/rdradcol.f90
grd2obsth.o 	: $(ADASDIR)/grd2obsth.F $(INCLDIR)/phycst.inc
	$(CPP) -Darps3dvar $(CPPFLAGS) $(ADASDIR)/grd2obsth.F grd2obsth.f90;
	$(FTN) $(FFLAGS) $(FREEFLAGS) -c grd2obsth.f90
prepradar.o     : $(ADASDIR)/prepradar.F $(ARPSDIR)/thermolib3d.f90
	$(CPP) -Darps3dvar $(CPPFLAGS) $(ADASDIR)/prepradar.F prepradar.f90;
	$(FTN) $(FFLAGS) $(FREEFLAGS) -c prepradar.f90
Vinit3dvar.o    : Vinit3dvar.f90    $(INCLDIR)/varpara.inc
Vcostf3d.o      : Vcostf3d.f90
Vctr_to_vbl.o   : Vctr_to_vbl.f90
Vgradc3d.o      : Vgradc3d.f90
Vlinear_int2d.o : Vlinear_int2d.f90
Vlinear_int3d.o : Vlinear_int3d.f90
Vminimization.o : Vminimization.f90
Vrecur_filt3d.o : Vrecur_filt3d.f90
Vderac_scale.o  : Vderac_scale.f90
Vtrans.o        : Vtrans.f90
Vvbl_to_ctr.o   : Vvbl_to_ctr.f90
Vminim_sub.o    : Vminim_sub.f90

Vrecur_filtmpi.o: Vrecur_filtmpi.f90
	$(FTNMP) $(FFLAGS) $(FREEFLAGS) -c $<
