#  Main body of the installation makefile for the GALAHAD TOPOLOGY package
#  SPRAL HW_TOPOLOGY was developed as part of SPRAL by Jonathan Hogg 
#  (now at Apple) and is available under a BSD licence as part of GALAHAD

#  Nick Gould, for GALAHAD production
#  This version: 2025-08-27

SHELL = /bin/$(BINSHELL)

ifeq "$(PRECIS)" "single_64"
  DPREC = -DREAL_32 -DINTEGER_64 $(QUADREAL)
  METIS_64 = _64
else ifeq "$(PRECIS)" "quadruple_64"
  DPREC = -DREAL_128 -DINTEGER_64 $(QUADREAL)
  METIS_64 = _64
else ifeq "$(PRECIS)" "double_64"
  DPREC = -DINTEGER_64 $(QUADREAL)
  METIS_64 = _64
else ifeq "$(PRECIS)" "single"
  DPREC = -DREAL_32 $(QUADREAL)
  METIS_64 =
else ifeq "$(PRECIS)" "quadruple"
  DPREC = -DREAL_128 $(QUADREAL)
  METIS_64 =
else
  DPREC = $(QUADREAL)
  METIS_64 =
endif

ifeq "$(MULTIVERSIONS)" "yes"
  MULTI = -DMULTIPRECISION
else
  MULTI = 
endif

CPPDEFINES = $(DPREC) $(MULTI)

GALINCLUDE = $(GALAHAD)/include

VALGRIND = -v --tool=memcheck --leak-check=full --show-reachable=yes \
--track-origins=yes -s

#  compiler flags

FFLAGS = $(BASIC) $(OPTIMIZATION) $(DEBUG) $(MODULES) $(F90) $(USUAL) \
         $(CPPDEFINES) -I $(GALINCLUDE)
FFLAGSS = $(BASIC) $(OPTIMIZATION) $(DEBUG) $(MODULES) $(F90) $(SPECIAL) \
          $(CPPDEFINES) -I $(GALINCLUDE)
FFLAGSN = $(BASIC) $(NOOPTIMIZATION) $(DEBUG) $(MODULES) $(F90) \
          $(CPPDEFINES) -I $(GALINCLUDE)
FFLAGS77 = $(BASIC) $(OPTIMIZATION) $(DEBUG) $(MODULES) $(F77) $(USUAL) \
           $(CPPDEFINES) -I $(GALINCLUDE)
FFLAGS77S = $(BASIC) $(OPTIMIZATION) $(DEBUG) $(MODULES) $(F77) $(SPECIAL) \
            $(CPPDEFINES) -I $(GALINCLUDE)
FFLAGSOMP = $(BASIC) $(OPTIMIZATION) $(DEBUG) $(MODULES) $(F90) $(USUAL) \
            $(SOMP) $(CPPDEFINES) -I $(GALINCLUDE)
FFLAGSNOMP = $(BASIC) $(OPTIMIZATION) $(DEBUG) $(MODULES) $(F90) \
             $(SOMP) $(CPPDEFINES) -I $(GALINCLUDE)

#  C compiler flags

CFLAGS     = $(CCBASIC) $(OPTIMIZATION) $(CCDEBUG) \
              $(CPPDEFINES) -I $(GALAHAD)/include -I ./include
CFLAGSN    = $(CCBASIC) $(NOOPTIMIZATION) $(CCDEBUG) \
              $(CPPDEFINES) -I $(GALAHAD)/include -I ./include

#  linking and run flags

RUNFFLAGS     = $(OPTIMIZATION) $(DEBUG) $(MODULES)
RUNFFLAGSOMP  = $(OPTIMIZATION) $(DEBUG) $(MODULES) $(SOMP)

#  names of random libraries

LG  = $(OBJ)/libgalahad.a
LGS = $(OBJS)/libgalahad.a
LGD = $(OBJD)/libgalahad.a
LGQ = $(OBJQ)/libgalahad.a
LGS64 = $(OBJS64)/libgalahad.a
LGD64 = $(OBJD64)/libgalahad.a
LGQ64 = $(OBJQ64)/libgalahad.a

#CLG  = $(OBJ)/libgalahad_c.a
#CLGS = $(OBJS)/libgalahad_c.a
#CLGD = $(OBJD)/libgalahad_c.a
#CLGQ = $(OBJQ)/libgalahad_c.a
#CLGS64 = $(OBJS64)/libgalahad_c.a
#CLGD64 = $(OBJD64)/libgalahad_c.a
#CLGQ64 = $(OBJQ64)/libgalahad_c.a

CLG  = $(OBJ)/libgalahad.a
CLGS = $(OBJS)/libgalahad.a
CLGD = $(OBJD)/libgalahad.a
CLGQ = $(OBJQ)/libgalahad.a
CLGS64 = $(OBJS64)/libgalahad.a
CLGD64 = $(OBJD64)/libgalahad.a
CLGQ64 = $(OBJQ64)/libgalahad.a

#  Libraries used

ifeq "$(METIS_64)" "_64"
  LIBS = -L$(OBJ) $(METIS464ND) $(METIS564ND) $(LAPACK) $(BLAS) \
          -lgalahad $(METIS464ND) $(METIS564ND) $(HSL)
else
  LIBS = -L$(OBJ) $(METIS4ND) $(METIS5ND) $(LAPACK) $(BLAS) \
         -lgalahad $(METIS4ND) $(METIS5ND) $(HSL)
endif

PLIBS = $(LIBS) -lgalahad_problem
CLIBS = -lgalahad_c -lhsl_c $(LIBS)

#  Archive manipulation strings

ARR = $(AR) $(ARREPFLAGS) $(LG)
RMARFILE = $(GALAHAD)/bin/rmarfile $(AR) $(GREP) $(LG)
RMOBFILE = $(GALAHAD)/bin/rmobfile $(RM) $(OBJ)

#CARR = $(AR) $(ARREPFLAGS) $(CLG)
#CRMARFILE = $(GALAHAD)/bin/rmarfile $(AR) $(GREP) $(CLG)

CARR = $(AR) $(ARREPFLAGS) $(LG)
CRMARFILE = $(GALAHAD)/bin/rmarfile $(AR) $(GREP) $(LG)

RARR = $(AR) $(ARREPFLAGS) $(LG)
RRMARFILE = $(GALAHAD)/bin/rmarfile $(AR) $(GREP) $(LG)

#RARR = $(AR) $(ARREPFLAGS) $(RLG)
#RRMARFILE = $(GALAHAD)/bin/rmarfile $(AR) $(GREP) $(RLG)

#  strings

SUCC = precision version) compiled successfully

#  compilation agenda

HWS = kinds $(LGS)(topology.o)
HWD = kinds $(LGD)(topology.o)
HWQ = kinds $(LGQ)(topology.o)
HWS64 = kinds $(LGS64)(topology.o)
HWD64 = kinds $(LGD64)(topology.o)
HWQ64 = kinds $(LGQ64)(topology.o)

#  main compilations and runs

all: topology

# topology

topology_silent: topology_silent_$(PRECIS)
topology_silent_single: $(HWS)
	$(RANLIB) $(LGS)
	$(RANLIB) $(CLGS)
topology_silent_double: $(HWD)
	$(RANLIB) $(LGD)
	$(RANLIB) $(CLGD)
topology_silent_quadruple: $(HWQ)
	$(RANLIB) $(LGQ)
	$(RANLIB) $(CLGQ)
topology_silent_single_64: $(HWS64)
	$(RANLIB) $(LGS64)
	$(RANLIB) $(CLGS64)
topology_silent_double_64: $(HWD64)
	$(RANLIB) $(LGD64)
	$(RANLIB) $(CLGD64)
topology_silent_quadruple_64: $(HWQ64)
	$(RANLIB) $(LGQ64)
	$(RANLIB) $(CLGQ64)

topology: topology_$(PRECIS)
	@printf ' %-21s\n' "GALAHAD: TOPOLOGY ($(PRECIS) $(SUCC)"
topology_single: $(HWS)
	$(RANLIB) $(LGS)
topology_double: $(HWD)
	$(RANLIB) $(LGD)
topology_quadruple: $(HWQ)
	$(RANLIB) $(LGQ)
topology_single_64: $(HWS64)
	$(RANLIB) $(LGS64)
topology_double_64: $(HWD64)
	$(RANLIB) $(LGD64)
topology_quadruple_64: $(HWQ64)
	$(RANLIB) $(LGQ64)

#  basic packages

kinds:
	( cd ../kinds ; $(MAKE) -f $(GALAHAD)/makefiles/$(VERSION) \
             kinds_silent PRECIS=$(PRECIS) PWD=$(PWD)/../kinds )

#  individual compilations

topology.o: $(LG)(topology.o)

$(LG)(topology.o): ../topology/topology.F90
	@printf ' %-9s %-15s\t\t' "Compiling" "topology  "
	$(CP) ../topology/topology.F90 $(OBJ)/topology.F90
	cd $(OBJ) ; $(FORTRAN) -o topology.o $(FFLAGSOMP) topology.F90 \
                 || ( printf ' %-26s' "=> Disabling optimization " ; \
                    $(FORTRAN) -o topology.o $(FFLAGSNOMP) topology.F90 )
	cd $(OBJ) ; $(ARR) topology.o ; $(RM) topology.F90 topology.o
	$(RRMARFILE) slblt_$(PRECIS).o
	$(MVMODS)
	@printf '[ OK ]\n'

#  book keeping

clean:
	@printf ' %-9s %-15s\t\t' "Cleaning $(PRECIS) precision topology"
	$(RM) $(LGS) $(LGD) $(OBJ)/topology*.o $(OBJ)/libgalahad.a \
                            $(OBJ)/libgalahad_c.a $(MOD)/galahad*
	@printf '[ OK ]\n'

cleanall:
	@printf ' %-14s\t\t' \
          "Removing all $(PRECIS) precision object and module files"
	$(RM) -r $(OBJ)/* $(MOD)/*
	@printf '[ OK ]\n'

rmtopology:
	@printf ' %-9s %-15s\t\t' "Removing" "topology from archive "
	$(RRMARFILE) topology_$(PRECIS).o
	@printf '[ OK ]\n'
