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
56SHELL = /bin/sh
@@ -9,84 +10,145 @@ SRC_DIR := ./src
910BUILD_DIR := ./obj
1011BIN_DIR := ./bin
1112
12- # Compiler (gfortran with OpenMP for threading)
13+ # Compiler
1314FC := gfortran
1415
1516# Core count
1617NCORES := $(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+
7078else
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+ # ###################################################################
82142FFLAGS := -cpp $(OPTFLAGS ) $(OMPFLAGS ) $(WARNFLAGS ) $(PETSC_INC ) $(HDF5_FLAGS ) $(MODDIR_FLAG )
83143DEBUGFLAGS := -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+ # ###################################################################
86148NAME := ThermalFlow.x
87149TARGET := $(BIN_DIR ) /$(NAME )
88150
89- # Sources (module order)
151+ # Sources (module order matters )
90152SRCS := \
91153 heatflow/mod_constants.f90 \
92154 heatflow/mod_constructions.f90 \
@@ -110,12 +172,15 @@ SRCS := \
110172
111173OBJS := $(addprefix $(BUILD_DIR ) /,$(notdir $(SRCS:.f90=.o ) ) )
112174
175+ # ###################################################################
176+ # Targets
177+ # ###################################################################
113178.PHONY : all debug clean distclean run help show
114179
115180all : show $(TARGET )
116181
117182show :
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
135200debug : FFLAGS = $(DEBUGFLAGS )
136201debug : clean show $(TARGET )
137202
138203run : $(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
153206clean :
154207 @echo " [CLEAN] objects and modules"
@@ -160,13 +213,14 @@ distclean: clean
160213
161214help :
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