# Makefile for assimilation routines.
# IMPORTANT COMPILATION NOTES
# 1. Do the make in "../support" first.  Many source files in this directory
#  have implicit dependencies on modules in ../support.
# 2. Compile the files in this directory with "make -r".
#
#
SOURCES = assim_vars.f90 assimilation.f90 blas.f90 covar_setup.f90 driver.f90 \
   diagnostics.f90 fixio.f90 fsplit.f90 gfs_init.f90 gfs_transforms.f90 \
   grid_indexing.f90 grid_io.f90 grid_model.f90 grid_obs.f90 \
   grid_setup.f90 grid_types.f90 griddump.f90 interpolate.f90 \
   kdtree.f90 main.f90 mp.f90 mp_ferror.f90 nat2obs.f90 postanal.f90 \
   preanal.f90 readobs.f90 scalings.bak sdump.f90 surface.f90 spectral.f90 \
   split_defs.f90 ydump.f90 Makefile nodelist.c \
   scripts/beo_assim scripts/copyin scripts/copyout scripts/fcstsuffix \
   scripts/forecast.2001 scripts/ndate scripts/postgrib.2001 \
   scripts/postgrib.2004 scripts/run_assim_p \
   scripts/run_gfs.2001 scripts/forecast.2004 scripts/run_gfs.2004 \
   scripts/start_gfs.2004 scripts/sfccopy config.sample master.2001 master

#DUMPOBJECTS = griddump.o assim_vars.o grid_manager.o scalings.o


SUPPORTDIR=$$HOME/lekf/support
INCLUDEDIR=$(SUPPORTDIR)
GRIDDIR=.
PRE_OBJECTS = preanal.o gfs_init.o fsplit.o readobs.o split_defs.o spectral.o \
    interpolate.o gfs_transforms.o assim_vars.o grid_io.o grid_model.o \
    grid_setup.o covar_setup.o grid_obs.o kdtree.o grid_indexing.o \
    grid_types.o

POST_OBJECTS = postanal.o gfs_init.o split_defs.o surface.o spectral.o \
   interpolate.o gfs_transforms.o assim_vars.o grid_io.o grid_setup.o \
   covar_setup.o fixio.o 

OBJECTS = main.o driver.o assimilation.o assim_vars.o spectral.o \
   gfs_transforms.o \
   gfs_init.o grid_indexing.o grid_model.o grid_obs.o grid_setup.o \
   grid_types.o grid_io.o covar_setup.o kdtree.o interpolate.o diagnostics.o

SDUMP_OBJECTS = sdump.o assim_vars.o spectral.o gfs_transforms.o gfs_init.o 
#
# SGI
#
#LIBS = ../eiglib.a -L$$HOME/lorenz/nws/support -lsupport -lscs
#DEBUG = -g -c -DEBUG:trap_uninitialized -DEBUG:conform_check=YES \
 #-DEBUG:verbose_runtime=YES -DEBUG:subscript_check=YES \
 #-ansi -fullwarn -woff 878,1438,1584 -Dsgi
#OPT = -O -c -OPT:swp=ON -g3 -Dsgi -ansi -fullwarn -woff 878,1438,1584
#F95 = f90

#
# Sun - specify "save" to save stack space
#
#LIBS = -xlic_lib=sunperf -L../support -lev -lsupport -lfft
#DEBUG = -I../support -M../support -M. -g -c -ansi -ftrap=invalid -u -w4 \
   #-xcheck=stkovf
#OPT =  -I../support -M../support -M. -O4 -c -ftrap=invalid -u -xcheck=stkovf
#F95 = f95

#
# Lahey - add --trap for f.p. trapping (but not with these e.v. routines)
#
# --f95 flags nonstandard constructs. There should be
# none in this code, except for "call exit" statements (which are de facto
# standard).
# Use --info for more details on code optimizations
# Use --lst for a listing
#
LIBS = -L$(SUPPORTDIR) -lev -lsupport -llapackmt -lblasmt -lfft
ANALLIBS = -L$(SUPPORTDIR) -lev -lsupport -lfft -lblasmt 
DEBUG = --mod .:$(SUPPORTDIR) -g -c --trace --chk a,e,s --f95 --maxfatals 3
OPT = --mod .:$(SUPPORTDIR) -O -c --trace --f95 --maxfatals 3
F95 = lf95
#
#DOUBLE=--dbl

#
#  G95 - Cygwin/ATLAS
#
#INCLUDEDIR = -I../support -I.
#LIBS = -L$(SUPPORTDIR) -lev -lsupport -lfft -llapack -lf77blas -latlas
#DEBUG = $(INCLUDEDIR) -g -c -std=f2003 -Wall
#OPT = $(INCLUDEDIR) -O3 -c -std=f2003 -Wall
#DBLFLAGS = -r8
#F95 = g95

#
#  G95 - OSX
#
#F95 = g95
#ANALLIBS = -L$(SUPPORTDIR) -lev -lsupport -lfft -framework Accelerate
#LIBS = -L$(SUPPORTDIR) -lev -lsupport -lfft -framework Accelerate
#DEBUG = -I../support -I. -g -c -Wall -std=f2003 
#OPT = -I../support -I. -O -c -Wall -std=f2003 
#DOUBLE = -r8

FFLAGS = $(OPT) 
#FFLAGS = $(DEBUG) 

FFLAGD = $(FFLAGS) $(DOUBLE)

.SUFFIXES: .o .mod .f .f90 .f95 .F90 .F95
#.f.mod:
#$(F95) $(FFLAGS) $<
.F90.o:
	$(F95) $(FFLAGS) $<
.f90.mod:
	$(F95) $(FFLAGS) $<
.f95.mod:
	$(F95) $(FFLAGS) $<
.f.o:
	$(F95) $(FFLAGS) $<
.f90.o:
	$(F95) $(FFLAGS) $<
.f95.o:
	$(F95) $(FFLAGS) $<

opt:
	make -r FFLAGS="$(OPT)" assim_p preanalysis postanalysis griddump
debug:
	make -r FFLAGS="$(DEBUG)" assim_p preanalysis postanalysis griddump

#  All module dependencies except those in the support directory are listed.

#  Assimilation program

assim_p: $(OBJECTS)
	$(F95) $(OBJECTS) $(LIBS) -o assim_p

griddump: griddump.o grid_io.o assim_vars.o interpolate.o spectral.o 
	$(F95) griddump.o grid_io.o assim_vars.o covar_setup.o \
	grid_indexing.o grid_setup.o interpolate.o \
	spectral.o gfs_transforms.o gfs_init.o $(LIBS) -o griddump

gridprint.o: gridprint.f90 grid_io.o assim_vars.o grid_setup.o
gridprint: gridprint.o grid_io.o assim_vars.o grid_setup.o \
   covar_setup.o
	$(F95) gridprint.o grid_io.o assim_vars.o grid_setup.o \
	covar_setup.o $(LIBS) -o gridprint
#  Main assimilation code.  Make sure that the routines in $(SUPPORT)
#  are compiled first!  No explicit dependencies on support modules
#  are listed here, as we regard the support directory as a library.

assim_vars.o:
grid_types.o:
interpolate.o:
kdtree.o: grid_types.o
blas.o:
#scalings.o: grid_types.o assim_vars.o
gfs_transforms.o: gfs_init.o
gfs_init.o:
covar_setup.o: grid_types.o assim_vars.o
grid_setup.o: covar_setup.o
grid_indexing.o: grid_setup.o interpolate.o 
spectral.o: grid_indexing.o gfs_transforms.o grid_types.o
grid_io.o: kdtree.o grid_indexing.o
grid_model.o: grid_io.o
grid_obs.o: grid_model.o spectral.o interpolate.o
diagnostics.o: grid_obs.o
assimilation.o: diagnostics.o grid_obs.o blas.o
driver.o: assimilation.o diagnostics.o
main.o: driver.o

#  Preanalysis and postanalysis

split_defs.o: grid_indexing.o
fixio.o: grid_indexing.o
surface.o: fixio.o
fsplit.o: split_defs.o grid_io.o
readobs.o: readobs.f90 fsplit.o spectral.o grid_obs.o
preanal.o:  spectral.o gfs_init.o gfs_transforms.o readobs.o 
postanal.o:  spectral.o surface.o grid_io.o

preanalysis: $(PRE_OBJECTS)
	$(F95) $(PRE_OBJECTS) $(LIBS) -o preanalysis

postanalysis: $(POST_OBJECTS)
	$(F95) $(POST_OBJECTS) $(LIBS) -o postanalysis

#  others

nat2obs: nat2obs.o
	$(F95) nat2obs.o grid_types.o $(LIBS) -o nat2obs
nat2obs.o: grid_types.o

sdump: sdump.o spectral.o
	$(F95) $(SDUMP_OBJECTS) $(LIBS) -o sdump 
sdump.o: spectral.o gfs_transforms.o

ydump.o: ydump.f90 grid_types.o
ydump: ydump.o
	$(F95) ydump.o grid_types.o  $(LIBS) -o ydump

ymake: ymake.f90
	$(F95) $(FFLAGS) ymake.f90 
	$(F95) ymake.o -o ymake

backup:
	tar cf - $(SOURCES) | gzip > assim_3d.tar.gz
clean:
	@rm -f *.o *.mod core assim_p preanalysis postanalysis

# other junk 
itest.o:  itest.f90 split_defs.o
itest: itest.o
	$(F95) itest.o split_defs.o grid_indexing.o grid_setup.o \
	assim_vars.o covar_setup.o grid_types.o $(LIBS) -o itest

