Skip to content

Commit cc9bde8

Browse files
committed
Fixed the makefile to try to make it install smoothly across Mac and Linux
1 parent b8d7725 commit cc9bde8

1 file changed

Lines changed: 123 additions & 69 deletions

File tree

Makefile

Lines changed: 123 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
####################################################################
2-
# HeatFlow Build System (MKL + optional PETSc + OpenMP)
2+
# HeatFlow Build System (PETSc + OpenMP)
3+
# PETSc is REQUIRED — the source has no fallback stubs.
34
####################################################################
45

56
SHELL = /bin/sh
@@ -9,84 +10,145 @@ SRC_DIR := ./src
910
BUILD_DIR := ./obj
1011
BIN_DIR := ./bin
1112

12-
# Compiler (gfortran with OpenMP for threading)
13+
# Compiler
1314
FC := gfortran
1415

1516
# Core count
1617
NCORES := $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 2)
1718

18-
# Detect conda environment for BLAS/LAPACK (fallback if no system libs)
19-
CONDA_PREFIX ?= $(shell conda info --base 2>/dev/null || echo /home/hm556/miniforge3)
19+
# Common flags
20+
OPTFLAGS := -O3
21+
OMPFLAGS := -fopenmp
22+
WARNFLAGS := -Wall
23+
MODDIR_FLAG := -J$(BUILD_DIR)
2024

21-
# PETSc Configuration
22-
BREW_PETSC := $(shell brew --prefix petsc 2>/dev/null)
23-
ifneq ($(BREW_PETSC),)
24-
PETSC_INC := -I$(BREW_PETSC)/include
25-
PETSC_LIB := -L$(BREW_PETSC)/lib -lpetsc -Wl,-rpath,$(BREW_PETSC)/lib
26-
PETSC_NOTE := (Homebrew PETSc)
27-
else
28-
# PETSc (system installation - Linux fallback)
29-
PETSC_INC := -I/usr/share/petsc/3.15/include -I/usr/lib/petscdir/petsc3.15/x86_64-linux-gnu-real/include
30-
PETSC_LIB := -L/usr/lib/petscdir/petsc3.15/x86_64-linux-gnu-real/lib -lpetsc -Wl,-rpath,/usr/lib/petscdir/petsc3.15/x86_64-linux-gnu-real/lib
31-
PETSC_NOTE := (system PETSc 3.15)
32-
endif
25+
####################################################################
26+
# Platform detection — one big block per OS
27+
####################################################################
28+
UNAME_S := $(shell uname -s)
3329

34-
# HDF5 Support
35-
# Run `make USE_HDF5=1` to enable
36-
ifeq ($(USE_HDF5),1)
37-
# Check for Homebrew HDF5 on macOS
38-
BREW_HDF5 := $(shell brew --prefix hdf5-mpi 2>/dev/null || brew --prefix hdf5 2>/dev/null)
39-
ifneq ($(BREW_HDF5),)
40-
HDF5_INC := -I$(BREW_HDF5)/include
41-
HDF5_LIB := -L$(BREW_HDF5)/lib -lhdf5_fortran -lhdf5 -Wl,-rpath,$(BREW_HDF5)/lib
42-
HDF5_FLAGS := -DUSE_HDF5 $(HDF5_INC)
43-
HDF5_NOTE := (+ HDF5)
30+
ifeq ($(UNAME_S),Darwin)
31+
################################################################
32+
# macOS (Homebrew)
33+
################################################################
34+
35+
# --- PETSc (Homebrew) ---
36+
BREW_PETSC := $(shell brew --prefix petsc 2>/dev/null)
37+
ifneq ($(BREW_PETSC),)
38+
PETSC_INC := -I$(BREW_PETSC)/include
39+
PETSC_LIB := -L$(BREW_PETSC)/lib -lpetsc -Wl,-rpath,$(BREW_PETSC)/lib
40+
PETSC_NOTE := (Homebrew PETSc)
4441
else
45-
# Linux fallback
46-
HDF5_INC := -I/usr/include/hdf5/openmpi
47-
HDF5_LIB := -L/usr/lib/x86_64-linux-gnu/hdf5/openmpi -lhdf5_fortran -lhdf5
48-
HDF5_FLAGS := -DUSE_HDF5 $(HDF5_INC)
49-
HDF5_NOTE := (+ HDF5)
42+
$(error PETSc not found via Homebrew — install with: brew install petsc)
5043
endif
51-
else
52-
HDF5_FLAGS :=
53-
HDF5_LIB :=
54-
HDF5_NOTE :=
55-
endif
5644

57-
# BLAS/LAPACK: Use Apple Accelerate on macOS, OpenBLAS on Linux
58-
UNAME_S := $(shell uname -s)
59-
ifeq ($(UNAME_S),Darwin)
60-
# macOS SDK sysroot (fixes 'library System not found' with Homebrew gfortran)
45+
# --- HDF5 (Homebrew, optional) ---
46+
ifeq ($(USE_HDF5),1)
47+
BREW_HDF5 := $(shell brew --prefix hdf5-mpi 2>/dev/null || brew --prefix hdf5 2>/dev/null)
48+
ifneq ($(BREW_HDF5),)
49+
HDF5_INC := -I$(BREW_HDF5)/include
50+
HDF5_LIB := -L$(BREW_HDF5)/lib -lhdf5_fortran -lhdf5 -Wl,-rpath,$(BREW_HDF5)/lib
51+
HDF5_FLAGS := -DUSE_HDF5 $(HDF5_INC)
52+
HDF5_NOTE := (+ HDF5)
53+
else
54+
$(error HDF5 requested but not found — install with: brew install hdf5)
55+
endif
56+
else
57+
HDF5_FLAGS :=
58+
HDF5_LIB :=
59+
HDF5_NOTE :=
60+
endif
61+
62+
# --- BLAS/LAPACK (Apple Accelerate) ---
6163
MACOS_SDK := $(shell xcrun --show-sdk-path 2>/dev/null)
6264
ifneq ($(MACOS_SDK),)
6365
SYSROOT_FLAGS := -L$(MACOS_SDK)/usr/lib -F$(MACOS_SDK)/System/Library/Frameworks
6466
else
6567
SYSROOT_FLAGS :=
6668
endif
67-
# Apple Accelerate framework - optimized for Apple Silicon
6869
BLAS_FLAGS := $(SYSROOT_FLAGS) -framework Accelerate -lgomp -lpthread -lm
69-
BLAS_NOTE := (Apple Accelerate)
70+
BLAS_NOTE := (Apple Accelerate)
71+
72+
# --- Runtime environment ---
73+
RUN_ENV := OMP_NUM_THREADS=$(NCORES) \
74+
VECLIB_MAXIMUM_THREADS=$(NCORES) \
75+
OMP_PROC_BIND=spread \
76+
OMP_PLACES=cores
77+
7078
else
71-
# Linux: Use OpenBLAS for multi-threaded BLAS/LAPACK
79+
################################################################
80+
# Linux
81+
################################################################
82+
83+
# --- PETSc (pkg-config with Fortran include discovery) ---
84+
PETSC_PKGCONFIG := $(shell pkg-config --cflags petsc 2>/dev/null)
85+
ifneq ($(PETSC_PKGCONFIG),)
86+
# pkg-config gives us the C include path and libs
87+
PETSC_INC_BASE := $(shell pkg-config --cflags petsc)
88+
PETSC_LIB := $(shell pkg-config --libs petsc)
89+
# Also need the Fortran finclude path (not provided by pkg-config)
90+
# Find petsc/finclude/petscsys.h under /usr/share/petsc/
91+
PETSC_FINCLUDE := $(shell find /usr/share/petsc -path '*/petsc/finclude/petscsys.h' -printf '%h/../..\n' 2>/dev/null | head -1)
92+
ifneq ($(PETSC_FINCLUDE),)
93+
PETSC_INC := $(PETSC_INC_BASE) -I$(PETSC_FINCLUDE)
94+
else
95+
PETSC_INC := $(PETSC_INC_BASE)
96+
endif
97+
PETSC_NOTE := (pkg-config PETSc)
98+
else
99+
# Debian/Ubuntu fallback (hardcoded paths)
100+
PETSC_DEBIAN := $(shell test -d /usr/lib/petscdir/petsc3.19/x86_64-linux-gnu-real/include && echo yes)
101+
PETSC_DEBIAN_OLD := $(shell test -d /usr/lib/petscdir/petsc3.15/x86_64-linux-gnu-real/include && echo yes)
102+
ifneq ($(PETSC_DEBIAN),)
103+
PETSC_INC := -I/usr/share/petsc/3.19t64/include -I/usr/lib/petscdir/petsc3.19/x86_64-linux-gnu-real/include
104+
PETSC_LIB := -L/usr/lib/petscdir/petsc3.19/x86_64-linux-gnu-real/lib -lpetsc_real -Wl,-rpath,/usr/lib/petscdir/petsc3.19/x86_64-linux-gnu-real/lib
105+
PETSC_NOTE := (system PETSc 3.19)
106+
else ifneq ($(PETSC_DEBIAN_OLD),)
107+
PETSC_INC := -I/usr/share/petsc/3.15/include -I/usr/lib/petscdir/petsc3.15/x86_64-linux-gnu-real/include
108+
PETSC_LIB := -L/usr/lib/petscdir/petsc3.15/x86_64-linux-gnu-real/lib -lpetsc -Wl,-rpath,/usr/lib/petscdir/petsc3.15/x86_64-linux-gnu-real/lib
109+
PETSC_NOTE := (system PETSc 3.15)
110+
else
111+
$(error PETSc not found — install via: sudo apt install libpetsc-real-dev pkgconf)
112+
endif
113+
endif
114+
115+
# --- HDF5 (system, optional) ---
116+
ifeq ($(USE_HDF5),1)
117+
HDF5_INC := -I/usr/include/hdf5/openmpi
118+
HDF5_LIB := -L/usr/lib/x86_64-linux-gnu/hdf5/openmpi -lhdf5_fortran -lhdf5
119+
HDF5_FLAGS := -DUSE_HDF5 $(HDF5_INC)
120+
HDF5_NOTE := (+ HDF5)
121+
else
122+
HDF5_FLAGS :=
123+
HDF5_LIB :=
124+
HDF5_NOTE :=
125+
endif
126+
127+
# --- BLAS/LAPACK (OpenBLAS) ---
72128
BLAS_FLAGS := -lopenblas -lgomp -lpthread -lm
73-
BLAS_NOTE := (OpenBLAS)
74-
endif
129+
BLAS_NOTE := (OpenBLAS)
75130

76-
# Flags
77-
OPTFLAGS := -O3
78-
OMPFLAGS := -fopenmp
79-
WARNFLAGS := -Wall
80-
MODDIR_FLAG := -J$(BUILD_DIR)
131+
# --- Runtime environment ---
132+
RUN_ENV := OMP_NUM_THREADS=$(NCORES) \
133+
OPENBLAS_NUM_THREADS=$(NCORES) \
134+
OMP_PROC_BIND=spread \
135+
OMP_PLACES=cores
136+
137+
endif
81138

139+
####################################################################
140+
# Compiler flags
141+
####################################################################
82142
FFLAGS := -cpp $(OPTFLAGS) $(OMPFLAGS) $(WARNFLAGS) $(PETSC_INC) $(HDF5_FLAGS) $(MODDIR_FLAG)
83143
DEBUGFLAGS := -cpp -O0 -g -fcheck=all -fbacktrace -ffpe-trap=invalid,zero,overflow,underflow -fbounds-check $(PETSC_INC) $(HDF5_FLAGS) $(MODDIR_FLAG)
84144

145+
####################################################################
85146
# Program
147+
####################################################################
86148
NAME := ThermalFlow.x
87149
TARGET := $(BIN_DIR)/$(NAME)
88150

89-
# Sources (module order)
151+
# Sources (module order matters)
90152
SRCS := \
91153
heatflow/mod_constants.f90 \
92154
heatflow/mod_constructions.f90 \
@@ -110,12 +172,15 @@ SRCS := \
110172

111173
OBJS := $(addprefix $(BUILD_DIR)/,$(notdir $(SRCS:.f90=.o)))
112174

175+
####################################################################
176+
# Targets
177+
####################################################################
113178
.PHONY: all debug clean distclean run help show
114179

115180
all: show $(TARGET)
116181

117182
show:
118-
@printf 'Building %s %s %s\n' '$(NAME)' '$(PETSC_NOTE)' '$(BLAS_NOTE)'
183+
@printf 'Building %s %s %s %s\n' '$(NAME)' '$(PETSC_NOTE)' '$(HDF5_NOTE)' '$(BLAS_NOTE)'
119184

120185
$(BIN_DIR) $(BUILD_DIR):
121186
mkdir -p $@
@@ -128,27 +193,15 @@ $(BUILD_DIR)/%.o: $(SRC_DIR)/heatflow/%.f90 | $(BUILD_DIR)
128193
$(BUILD_DIR)/heatflow.o: $(SRC_DIR)/heatflow.f90 | $(BUILD_DIR)
129194
$(FC) $(FFLAGS) -c $< -o $@
130195

131-
# Link (single definition)
196+
# Link
132197
$(TARGET): $(BIN_DIR) $(OBJS)
133198
$(FC) $(OPTFLAGS) $(OMPFLAGS) $(OBJS) -o $@ $(BLAS_FLAGS) $(PETSC_LIB) $(HDF5_LIB)
134199

135200
debug: FFLAGS = $(DEBUGFLAGS)
136201
debug: clean show $(TARGET)
137202

138203
run: $(TARGET)
139-
ifeq ($(UNAME_S),Darwin)
140-
OMP_NUM_THREADS=$(NCORES) \
141-
VECLIB_MAXIMUM_THREADS=$(NCORES) \
142-
OMP_PROC_BIND=spread \
143-
OMP_PLACES=cores \
144-
$< $(RUN_ARGS)
145-
else
146-
OMP_NUM_THREADS=$(NCORES) \
147-
OPENBLAS_NUM_THREADS=$(NCORES) \
148-
OMP_PROC_BIND=spread \
149-
OMP_PLACES=cores \
150-
$< $(RUN_ARGS)
151-
endif
204+
$(RUN_ENV) $< $(RUN_ARGS)
152205

153206
clean:
154207
@echo "[CLEAN] objects and modules"
@@ -160,13 +213,14 @@ distclean: clean
160213

161214
help:
162215
@echo "Targets:"
163-
@echo " make / make all - build optimized"
216+
@echo " make / make all - build with PETSc (required)"
164217
@echo " make debug - debug build"
165218
@echo " make run - run with all cores"
166219
@echo " make clean - remove objects/modules"
167220
@echo " make distclean - remove executable"
168-
@echo "Variables:"
169-
@echo " RUN_ARGS='-ksp_type cg -pc_type gamg -ksp_rtol 1e-8 -ksp_monitor'"
221+
@echo "Options:"
222+
@echo " USE_HDF5=1 - enable HDF5 output support"
223+
@echo " RUN_ARGS='...' - pass PETSc runtime flags"
170224
@echo "Parallel build: make -j$(NCORES)"
171225

172226
####################################################################

0 commit comments

Comments
 (0)