include ${PETSC_DIR}/conf/variables
PROG = $(HOME)/bin/wwmadv
#PROG = wwmadv

FFLAGS = -WF,-DST42

# Put MPI = on for compiling with mpi, nothing if no MPI is wished.
MPI = on
# Put PETSC = on for compiling with petsc, nothing if no petsc is wished.
PETSC =
# Put NETCDF = on for compiling with netcdf, nothing if no netcdf is wished.
NETCDF = on
# Put OPENMP = on for compiling with openmp, nothing if no openmp is wished.
OPENMP =
# Put OPENMP = on for compiling with openmp, nothing if no openmp is wished.
DARKO =

#F90 = gfortran
#F90 = mpif90
#F90 = mpif90-vt
#F90 = ifort
#F90 = $(FLINKER)
#F90 = pgf90
#F90 = pathf95
F90 = mpxlf90_r


#INTEL
#save opti
#F90OPTI = -fpp -traceback -g
#F90OPTI = -O1 -axSSE4.2 -traceback -g  -check uninit -check bounds -check pointers -warn interfaces,nouncalled
#F90OPTI = -fpp -O2 -stand f03 -assume realloc_lhs -fstack-protector -assume protect_parens
#F90OPTI = -warn interfaces,nouncalled -fpp -gen-interface -g -traceback -check uninit -check bounds -check pointers

#F90OPTI = -ip -O2
F90OPTI =  -O1 -axSSE4.2 -unroll-aggressive -assume byterecl
#F90OPTI = -warn interfaces,nouncalled -fpp -gen-interface -g -traceback -check all


F90OPTI = -O2 -qx -qextname


#F90OPTI = -fpp -O2 -stand f03 -assume realloc_lhs -check all -traceback -fstack-protector -assume protect_parens -implicitnone
#extreme aggressive opti ...
#F90OPTI = -g -traceback -O1 -axSSE4.2 -unroll-aggressive -assume byterecl #-openmp#-check all -warn all
#F90OPTI = -g -traceback -O1 -axSSE4.2 -unroll-aggressive -assume byterecl 
#F90OPTI = -g -traceback -O2 -axSSE4.2 -unroll-aggressive -assume byterecl 
#aggressive opti
#F90OPTI = -O1 -fp-model fast -opt-multi-version-aggressive -axSSE4.2 -no-heap-arrays -fpp -stack_temps -unroll-aggressive -vec-guard-write -traceback -g
#aggressive opti no openmp
#F90OPTI = -O1 -axSSE4.2 -fpp
#debug 1
#F90OPTI = -O1 -mp1 -fpp -traceback -g -traceback -check pointers -check bound -check uninit 
#debug 2
#F90OPTI =  -fpp -g -traceback -check all
#aggresive debug openmp
#F90OPTI = -fpp -g -traceback -check all -openmp
#debug no openmp
#F90OPTI = -fpp -g -traceback -fp-model precise -check all 

#PGI
#F90OPTI = -g -O1 -Mprof=dwarf -Mprof=time -Minfo=ccff -mp
#F90OPTI = -fastsse -Munroll -Minline=reshape -Minline=levels:10 -Mvect -Mipa=fast Mipa=levels:10 -Mlarge_arrays -mp
#F90OPTI  = -g -Mbounds -Mchkfpstk -Mchkptr -Mchkstk

#GFORTRAN
#F90OPTI = -g -O3 -ffree-line-length-0 -fbacktrace -fopenmp -Wall

#LDFLAGS = -Mprof=dwarf -Mprof=lines -Mprof=func -Mprof=time Minfo=ccff
#TCFLAG  = -tcheck
#LDFLAGS = -lpthread

#ITT_BASE = /home/aron/intel/itt

#LIBS = #libgoto_penrynp-r1.26.a #sparskit_pgi.a libgoto.a #sparskit.a

#ARCH  = $(shell uname -m | sed -e s/x86_64/32e/ -e s/i.86/32/ -e s/ia// )
#LPATH = $(ITT_BASE)/tcheck/bin/$(ARCH)



OBJSELFE = elfe_glbl.o elfe_msgp.o solver_subs.o io_subs.o grid_subs.o misc_subs.o
OBJWWM = wwm_datapl.o wwm_petscpool.o  wwm_petsc_seriell.o wwm_petsc_parallel.o \
       wwm_petsc_block.o wwm_petsc_controller.o wwm_aux.o wwm_mjdv2.o wwm_blasaux.o wwm_sparskit.o \
       wwm_ardhuin_old.o wwm_wind.o wwm_ardhuin_new.o wwm_dislin.o wwm_diclass.o \
       wwm_gridcf.o wwm_hotfile.o wwm_parall_solver.o wwm_m_constants.o wwm_m_fileio.o wwm_serv_xnl4v5.o wwm_mod_xnl4v5.o wwm_snl4_wrt.o \
       wwm_initio.o wwm_netcdf.o wwm_input.o wwm_bdcons.o \
       wwm_specparam.o wwm_windinput.o wwm_dissipation.o wwm_snl3.o wwm_snl4.o wwm_snl42.o wwm_babanin.o wwm_sourceterms.o \
       wwm_specint.o wwm_nums1d.o wwm_numtheta.o wwm_numsigma.o wwm_fluctsplit.o wwm_wave_setup.o \
       wwm_ecmwf.o wwm_output.o wwm_compute.o wwm_diffrac.o wwm_coupl_roms.o wwm_coupl_shyfem.o wwm_coupl_selfe.o wwm_coupl_timor.o wwm_main.o
#       dislin.o diclass.o \

#LIBS = -L/home/aron/opt/dislin/lib/dislin.a

#LIBS = /home/aron/opt/dislin/lib/dislin-10.2.so

ifdef NETCDF
  all: $(NETC) $(PROG)
  LIBS += -L$(NETCDF_LIBDIR) -lnetcdf
  FFLAGS +=  -WF,-DNCDF -I$(NETCDF_INCDIR)
else
  all: $(PROG)
endif

ifdef MPI
  LIBS += $(METIS_PATH)/lib/libparmetis.a $(METIS_PATH)/lib/libmetis.a
  MPIFLAG  = -WF,-DWWM_MPI -WF,-DMPIVERSION=2 -WF,-DUSE_WWM -WF,-DWWM_SOLVER -WF,-DSHYFEM_COUPLING
  OBJS= $(OBJSELFE) $(OBJWWM)
else
  MPIFLAG = 
  OBJS= $(OBJWWM)
endif

ifdef OPENMP 
  OPENMPFLAG  = -openmp 
endif

ifdef PETSC
  MPIFLAG += -DPETSC ${PETSC_FC_INCLUDES} 
  LIBS  += ${PETSC_LIB}  
endif

ifdef DARKO 
  DARKOFLAG = -DDARKO 
endif


MPI_INCLUDE = -I/home/aron/opt/mpich2_1.3_intel/include/  
F90FLAGS += ${MPI_INCLUDE}


F90FLAGS = ${MPIFLAG} ${FFLAGS} ${F90OPTI} ${OPENMPFLAG} ${DARKOFLAG}

NETC = NETC

$(NETC):
	cp -f $(NETCDF_INCDIR)/netcdf.mod .
	cp -f $(NETCDF_INCDIR)/typesizes.mod .

$(PROG): $(OBJS)
	$(F90) -o $(PROG) $(F90FLAGS) $(TCFLAG) $(OBJS) $(LIBS) 

clean:
	rm -f *.o *.oo *.obj *.ipo *.mod *.map *__genmod.f90 *.ilk *.pdb $(PROG)

cleanall:
	rm -f *.*~ *.spg *.smb *.o *.oo *.obj *.ipo *.mod *.map *.ilk *.pdb *genmod* $(PROG)

.SUFFIXES: $(SUFFIXES) .F90 .f .ftn

.F90.o:
	$(F90) $(F90FLAGS) $(TCFLAG)   -c $<

.ftn.o:
	$(F90) $(F90FLAGS) -c $<