Created
June 28, 2020 00:01
-
-
Save vdikan/50200c892d76dd5a8e492525d5f60776 to your computer and use it in GitHub Desktop.
Siesta's arch-experimental makefile with library paths obtained from calls to `spack location -i`. Serial version (adding links to MPI is straightforward).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# | |
SIESTA_ARCH=Spack-shell-in-Master-template-Serial | |
# | |
# Machine specific settings might be: | |
# | |
# 1. Inherited from environmental variables | |
# (paths, libraries, etc) | |
# 2. Set from a 'fortran.mk' file that is | |
# included below (compiler names, flags, etc) (Uncomment first) | |
# | |
#-------------------------------------------------------- | |
# Use these symbols to request particular features | |
# To turn on, set '=1'. | |
#-------------- | |
# These are mandatory for PSML and MaX Versions, | |
# but they should be turned off for 4.1 | |
WITH_PSML=1 | |
WITH_GRIDXC=1 | |
#------------- | |
# | |
WITH_EXTERNAL_ELPA= | |
WITH_ELSI= | |
WITH_FLOOK= | |
WITH_MPI= #FIXME: trouble building custom libgridxc in parallel | |
WITH_NETCDF=1 | |
WITH_SEPARATE_NETCDF_FORTRAN=1 | |
WITH_NCDF= | |
WITH_LEGACY_GRIDXC_INSTALL=1 # For now Spack recipy uses legacy installation schema for gridxc | |
WITH_GRID_SP= | |
# | |
#=========================================================== | |
# Make sure you have the appropriate library symbols | |
# (Either explicitly here, or through shell variables, perhaps | |
# set by a module system) | |
# Define also compiler names and flags | |
#-------------------------------------------------------- | |
XMLF90_ROOT=$(shell spack location -i xmlf90) | |
PSML_ROOT=$(shell spack location -i libpsml) | |
GRIDXC_ROOT=$(shell spack location -i libgridxc) | |
#ELSI_ROOT= | |
#ELPA_ROOT= | |
#ELPA_INCLUDE_DIRECTORY= | |
#FLOOK_ROOT= | |
#-------------------------------------------------------- | |
NETCDF_ROOT=$(shell spack location -i netcdf-c) | |
NETCDF_FORTRAN_ROOT=$(shell spack location -i netcdf-fortran) | |
#HDF5_LIBS=-L/apps/HDF5/1.8.20/GCC/OPENMPI/lib -lhdf5_hl -lhdf5 -lcurl -lz | |
SCALAPACK_LIBS=-L$(shell spack location -i netlib-scalapack)/lib -lscalapack | |
LAPACK_LIBS = -L$(shell spack location -i openblas)/lib -lopenblas | |
#FFTW_ROOT=/apps/FFTW/3.3.8/GCC/OPENMPI/ | |
# Needed for PEXSI (ELSI) support | |
#LIBS_CPLUS=-lstdc++ -lmpi_cxx | |
#-------------------------------------------------------- | |
# | |
# Commented out since I'm building serial: | |
# FC_PARALLEL=$(shell spack location -i openmpi)/bin/mpif90 # Another example of a spec | |
# # with (absent) variant | |
FC_SERIAL=$(shell spack location -i gcc)/bin/gfortran | |
FPP = $(FC_SERIAL) -E -P -x c | |
FFLAGS = -g -O2 -fallow-argument-mismatch -fPIC -ftree-vectorize | |
FFLAGS_DEBUG= -g -O0 -fallow-argument-mismatch -fPIC -ftree-vectorize | |
#RANLIB=echo | |
# | |
# Alternatively, prepare a fortran.mk file with compiler definitions, | |
# put it in this same directory, and uncomment the two lines below | |
# | |
#SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST))) | |
#include $(SELF_DIR)fortran.mk | |
#=========================================================== | |
# | |
# Possible section on specific recipes for troublesome files, using | |
# a lower optimization level. | |
# | |
#atom.o: atom.F | |
# $(FC) -c $(FFLAGS_DEBUG) $(INCFLAGS) $(FPPFLAGS) $(FPPFLAGS_fixed_F) $< | |
#state_analysis.o: | |
#create_Sparsity_SC.o: | |
# | |
# Note that simply using target-specific variables, such as: | |
#atom.o: FFLAGS=$(FFLAGS_DEBUG) | |
# would compile *all* dependencies of atom.o with that setting... | |
# | |
#---------------------------------------------------------------- | |
# In case your compiler does not understand the special meaning of | |
# the .F and .F90 extensions ("files in need of preprocessing"), you | |
# will need to use an explicit preprocessing step. | |
#WITH_EXPLICIT_FPP = 1 | |
# Explicit Fortran preprocessor. Typically this is sufficient to be the | |
# compiler with options '-E -P -x c'. | |
#FPP = $(FC) -E -P -x c | |
# This enables specific preprocessing options for certain source files. | |
#FPPFLAGS_fixed_f = -qsuffix=cpp=F -qfixed | |
#FPPFLAGS_free_f90 = -qsuffix=cpp=F90 -qfree=F90 | |
# Some compilers (notably IBM's) are not happy with the standard syntax for | |
# definition of preprocessor symbols (-DSOME_SYMBOL), and thy need a prefix | |
# (i.e. -WF,-DSOME_SYMBOL). This is used in some utility makefiles. Typically | |
# this need not be defined. | |
#DEFS_PREFIX = -WF, | |
# | |
#-------------------------------------------------------- | |
# Nothing should need to be changed below | |
#-------------------------------------------------------- | |
# | |
FC_ASIS=$(FC_SERIAL) | |
# | |
# These are for initialization of variables added to below | |
# | |
FPPFLAGS= $(DEFS_PREFIX)-DF2003 | |
LIBS= | |
COMP_LIBS= | |
# | |
# ---- ELPA configuration ----------- | |
# | |
# An external ELPA library can be used through the native interface (-DSIESTA__ELPA) and | |
# through the ELSI interface. Due to namespace collisions, the *same* external library | |
# must be used. | |
# | |
ifdef WITH_EXTERNAL_ELPA | |
ifndef ELPA_ROOT | |
$(error you need to define ELPA_ROOT in your arch.make) | |
endif | |
ifndef ELPA_INCLUDE_DIRECTORY | |
# It cannot be generated directly from ELPA_ROOT... | |
$(error you need to define ELPA_INCLUDE_DIRECTORY in your arch.make) | |
endif | |
FPPFLAGS_ELPA=$(DEFS_PREFIX)-DSIESTA__ELPA | |
ELPA_INCFLAGS= -I$(ELPA_INCLUDE_DIRECTORY) | |
INCFLAGS += $(ELPA_INCFLAGS) | |
FPPFLAGS += $(FPPFLAGS_ELPA) | |
ELPA_LIB=-L$(ELPA_ROOT)/lib -lelpa | |
LIBS +=$(ELPA_LIB) | |
endif | |
# ---- ELPA configuration ----------- | |
# ---- ELSI configuration ----------- | |
ifdef WITH_ELSI | |
ifndef ELSI_ROOT | |
$(error you need to define ELSI_ROOT in your arch.make) | |
endif | |
# Add the second symbol for MAGMA and EigenExa support | |
FPPFLAGS_ELSI=$(DEFS_PREFIX)-DSIESTA__ELSI # -DSIESTA__ELSI_2_4_SOLVERS | |
ELSI_INCFLAGS = -I$(ELSI_ROOT)/include | |
ifdef WITH_EXTERNAL_ELPA | |
ELSI_ELPA_ROOT=$(ELPA_ROOT) | |
$(echo Make sure that ELSI is compiled with external ELPA...) | |
# Explicit checks? | |
else | |
ELSI_ELPA_ROOT=$(ELSI_ROOT) | |
endif | |
# This assumes that ELSI has been compiled with PEXSI | |
ELSI_LIB = -L$(ELSI_ROOT)/lib -lelsi \ | |
-lfortjson -lOMM -lMatrixSwitch \ | |
-lNTPoly \ | |
-lpexsi -lsuperlu_dist \ | |
-lptscotchparmetis -lptscotch -lptscotcherr \ | |
-lscotchmetis -lscotch -lscotcherr \ | |
-L$(ELSI_ELPA_ROOT)/lib -lelpa | |
INCFLAGS += $(ELSI_INCFLAGS) | |
FPPFLAGS += $(FPPFLAGS_ELSI) | |
LIBS +=$(ELSI_LIB) $(LIBS_CPLUS) | |
endif | |
ifdef WITH_NETCDF | |
ifndef NETCDF_ROOT | |
$(error you need to define NETCDF_ROOT in your arch.make) | |
endif | |
# If NetCDF is enabled, for completeness in some installations, | |
# we might need to deal separately with the install prefixes of NetCDF and | |
# NetCDF-Fortran. By default both are the same | |
ifdef WITH_SEPARATE_NETCDF_FORTRAN | |
ifndef NETCDF_FORTRAN_ROOT | |
$(error you need to define NETCDF_FORTRAN_ROOT in your arch.make) | |
endif | |
NETCDF_INCFLAGS = -I$(NETCDF_ROOT)/include -I$(NETCDF_FORTRAN_ROOT)/include | |
NETCDF_LIBS = -L$(NETCDF_FORTRAN_ROOT)/lib -lnetcdff -L$(NETCDF_ROOT)/lib -lnetcdf | |
else | |
NETCDF_INCFLAGS = -I$(NETCDF_ROOT)/include | |
NETCDF_LIBS = -L$(NETCDF_ROOT)/lib -lnetcdff | |
endif | |
NETCDF_LIBS += $(HDF5_LIBS) | |
FPPFLAGS_CDF = $(DEFS_PREFIX)-DCDF | |
FPPFLAGS += $(FPPFLAGS_CDF) | |
INCFLAGS += $(NETCDF_INCFLAGS) | |
LIBS += $(NETCDF_LIBS) | |
endif | |
# | |
ifdef WITH_NCDF | |
ifndef WITH_NETCDF | |
$(error For NCDF you need to define also WITH_NETCDF in your arch.make) | |
endif | |
FPPFLAGS += $(DEFS_PREFIX)-DNCDF $(DEFS_PREFIX)-DNCDF_4 | |
COMP_LIBS += libncdf.a libfdict.a | |
endif | |
# | |
ifdef WITH_FLOOK | |
ifndef FLOOK_ROOT | |
$(error you need to define FLOOK_ROOT in your arch.make) | |
endif | |
FLOOK_INCFLAGS=-I$(FLOOK_ROOT)/include | |
INCFLAGS += $(FLOOK_INCFLAGS) | |
FLOOK_LIBS= -L$(FLOOK_ROOT)/lib -lflookall -ldl | |
FPPFLAGS_FLOOK= $(DEFS_PREFIX)-DSIESTA__FLOOK | |
FPPFLAGS += $(FPPFLAGS_FLOOK) | |
LIBS +=$(FLOOK_LIBS) | |
COMP_LIBS+= libfdict.a | |
endif | |
# | |
ifdef WITH_MPI | |
FC=$(FC_PARALLEL) | |
MPI_INTERFACE=libmpi_f90.a | |
MPI_INCLUDE=. # Note . for no-op | |
FPPFLAGS_MPI=$(DEFS_PREFIX)-DMPI $(DEFS_PREFIX)-DMPI_TIMING | |
LIBS +=$(SCALAPACK_LIBS) | |
LIBS +=$(LAPACK_LIBS) | |
FPPFLAGS += $(FPPFLAGS_MPI) | |
else | |
FC=$(FC_SERIAL) | |
LIBS += $(LAPACK_LIBS) $(COMP_LIBS) | |
endif | |
# ------------- libGridXC configuration ----------- | |
# | |
ifdef WITH_GRID_SP | |
GRIDXC_CONFIG_PREFIX=sp | |
FPPFLAGS_GRID= $(DEFS_PREFIX)-DGRID_SP | |
else | |
GRIDXC_CONFIG_PREFIX=dp | |
endif | |
ifdef WITH_MPI | |
GRIDXC_CONFIG_PREFIX:=$(GRIDXC_CONFIG_PREFIX)_mpi | |
endif | |
FPPFLAGS += $(FPPFLAGS_GRID) | |
# ------------------------------------------------- | |
# | |
# | |
SYS=nag | |
# | |
# These lines make use of a custom mechanism to generate library lists and | |
# include-file management. The mechanism is not implemented in all libraries. | |
#--------------------------------------------- | |
ifdef WITH_PSML | |
include $(XMLF90_ROOT)/share/org.siesta-project/xmlf90.mk | |
include $(PSML_ROOT)/share/org.siesta-project/psml.mk | |
endif | |
# | |
# A legacy libGridXC installation will have dual 'serial' and 'mpi' subdirectories, | |
# whereas a modern one, generated with the 'multiconfig' option, will have split | |
# include directories but a flat lib directory. The details are still handled by | |
# appropriate .mk files in the installation directories. | |
# | |
# The multiconfig option appeared in 0.9.X, but the legacy compilation option is | |
# still allowed. For single-precision support with the 'legacy' option, you need to | |
# make sure that your installation is 'single'... | |
# | |
ifdef WITH_GRIDXC | |
ifdef WITH_LEGACY_GRIDXC_INSTALL | |
include $(GRIDXC_ROOT)/gridxc.mk | |
else | |
include $(GRIDXC_ROOT)/share/org.siesta-project/gridxc_$(GRIDXC_CONFIG_PREFIX).mk | |
endif | |
endif | |
#--------------------------------------------- | |
.c.o: | |
$(CC) -c $(CFLAGS) $(INCFLAGS) $(CPPFLAGS) $< | |
.F.o: | |
$(FC) -c $(FFLAGS) $(INCFLAGS) $(FPPFLAGS) $(FPPFLAGS_fixed_F) $< | |
.F90.o: | |
$(FC) -c $(FFLAGS) $(INCFLAGS) $(FPPFLAGS) $(FPPFLAGS_free_F90) $< | |
.f.o: | |
$(FC) -c $(FFLAGS) $(INCFLAGS) $(FCFLAGS_fixed_f) $< | |
.f90.o: | |
$(FC) -c $(FFLAGS) $(INCFLAGS) $(FCFLAGS_free_f90) $< |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment