11# ###################################################################
2- # 11 Jun 2024 #
2+ # HeatFlow Build System (MKL + optional PETSc + OpenMP)
33# ###################################################################
4- SHELL = /bin/sh
5- PLAT = _linux
6-
7- # #########################################
8- # CODE DIRECTORIES AND FILES
9- # #########################################
10- mkfile_path := $(abspath $(firstword $(MAKEFILE_LIST ) ) )
11- mkfile_dir := $(dir $(mkfile_path ) )
12- BIN_DIR := ./bin
13- SRC_DIR := ./src
14- BUILD_DIR = ./obj
15-
16- SRCS := heatflow/mod_constants.f90 \
17- heatflow/mod_constructions.f90 \
18- heatflow/mod_SPtype.f90 \
19- heatflow/mod_global.f90 \
20- heatflow/mod_Sparse.f90 \
21- heatflow/mod_inputs.f90 \
22- heatflow/mod_material.f90 \
23- heatflow/mod_hmatrix.f90 \
24- heatflow/mod_init_evolve.f90 \
25- heatflow/mkl_pardiso.f90 \
26- heatflow/mod_sparse_solver.f90 \
27- heatflow/mod_setup.f90 \
28- heatflow/mod_boundary.f90 \
29- heatflow/mod_heating.f90 \
30- heatflow/mod_cattaneo.f90 \
31- heatflow/mod_tempdep.f90 \
32- heatflow/mod_evolve.f90 \
33- heatflow/mod_output.f90 \
34- heatflow.f90
354
36- OBJS := $(addprefix $(BUILD_DIR ) /,$(notdir $(SRCS:.f90=.o ) ) )
37-
38- # MKL configuration
39- MKLROOT ?= /opt/intel/oneapi/mkl/latest
40- MKL_LIB_DIR = $(MKLROOT ) /lib/intel64
41- MKL_INCLUDE_DIR = $(MKLROOT ) /include
42- # MKL_FLAGS = -L$(MKL_LIB_DIR) -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl
43- MKL_FLAGS = -L$(MKL_LIB_DIR ) -lmkl_gf_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl
5+ SHELL = /bin/sh
6+
7+ # Directories
8+ SRC_DIR := ./src
9+ BUILD_DIR := ./obj
10+ BIN_DIR := ./bin
11+
12+ # Compiler
13+ FC := gfortran
14+
15+ # Core count
16+ NCORES := $(shell nproc)
17+
18+ # MKL
19+ MKLROOT ?= /opt/intel/oneapi/mkl/latest
20+ MKL_LIB_DIR := $(MKLROOT ) /lib/intel64
21+ MKL_INCLUDE := $(MKLROOT ) /include
22+ MKL_FLAGS := -L$(MKL_LIB_DIR ) -lmkl_gf_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl
23+
24+ # PETSc (manual fallback if petsc-config missing)
25+ PETSC_PREFIX := /usr/lib/petscdir/petsc3.15/x86_64-linux-gnu-real
26+ PETSC_FINCLUDE := /usr/share/petsc/3.15/include
27+ PETSC_AINCLUDE := $(PETSC_PREFIX ) /include
28+ PETSC_LIBDIR := $(PETSC_PREFIX ) /lib
29+
30+ PETSC_CONFIG := $(shell command -v petsc-config 2>/dev/null)
31+ ifeq ($(PETSC_CONFIG ) ,)
32+ PETSC_INC := -I$(PETSC_FINCLUDE ) -I$(PETSC_AINCLUDE )
33+ PETSC_LIB := -L$(PETSC_LIBDIR ) -lpetsc
34+ PETSC_NOTE := (PETSc manual paths)
35+ else
36+ PETSC_INC := $(shell petsc-config --cflags)
37+ PETSC_LIB := $(shell petsc-config --libs)
38+ PETSC_NOTE := (petsc-config)
39+ endif
40+
41+ # Flags
42+ OPTFLAGS := -O3
43+ OMPFLAGS := -fopenmp
44+ WARNFLAGS := -Wall
45+ MODDIR_FLAG := -J$(BUILD_DIR )
46+
47+ FFLAGS := -cpp $(OPTFLAGS ) $(OMPFLAGS ) $(WARNFLAGS ) -I$(MKL_INCLUDE ) $(PETSC_INC ) $(MODDIR_FLAG )
48+ DEBUGFLAGS := -cpp -O0 -g -fcheck=all -fbacktrace -ffpe-trap=invalid,zero,overflow,underflow -fbounds-check -I$(MKL_INCLUDE ) $(PETSC_INC ) $(MODDIR_FLAG )
49+
50+ # Program
51+ NAME := ThermalFlow.x
52+ TARGET := $(BIN_DIR ) /$(NAME )
53+
54+ # Sources (module order)
55+ SRCS := \
56+ heatflow/mod_constants.f90 \
57+ heatflow/mod_constructions.f90 \
58+ heatflow/mod_SPtype.f90 \
59+ heatflow/mod_global.f90 \
60+ heatflow/mod_Sparse.f90 \
61+ heatflow/mod_inputs.f90 \
62+ heatflow/mod_material.f90 \
63+ heatflow/mod_hmatrix.f90 \
64+ heatflow/mod_init_evolve.f90 \
65+ heatflow/mkl_pardiso.f90 \
66+ heatflow/mod_sparse_solver.f90 \
67+ heatflow/mod_petsc_solver.f90 \
68+ heatflow/mod_boundary.f90 \
69+ heatflow/mod_heating.f90 \
70+ heatflow/mod_cattaneo.f90 \
71+ heatflow/mod_tempdep.f90 \
72+ heatflow/mod_evolve.f90 \
73+ heatflow/mod_output.f90 \
74+ heatflow/mod_setup.f90 \
75+ heatflow.f90
4476
45- # FFLAGS = -O3 -I$(MKL_INCLUDE_DIR)
46- MODULEFLAGS = -J$(BUILD_DIR )
47- FC = gfortran
48- NCORES := $(shell nproc)
49- FFLAGS = -O3 -fopenmp -I$(MKL_INCLUDE_DIR )
50-
51- # #########################################
52- # TARGETS
53- # #########################################
54- NAME = ThermalFlow.x
55- programs = $(BIN_DIR ) /$(NAME )
77+ OBJS := $(addprefix $(BUILD_DIR ) /,$(notdir $(SRCS:.f90=.o ) ) )
5678
57- .PHONY : all debug clean OMP
79+ .PHONY : all debug clean distclean run help show
5880
59- all : $( programs )
81+ all : show $( TARGET )
6082
61- $( BIN_DIR ) :
62- mkdir -p $@
83+ show :
84+ @printf ' Building %s %s\n ' ' $(NAME) ' ' $(PETSC_NOTE) '
6385
64- $(BUILD_DIR ) :
86+ $(BIN_DIR ) $( BUILD_DIR ) :
6587 mkdir -p $@
6688
67- # Pattern rule for compiling Fortran files
89+ # Compile module sources
6890$(BUILD_DIR ) /% .o : $(SRC_DIR ) /heatflow/% .f90 | $(BUILD_DIR )
69- $(FC ) $(FFLAGS ) $(MODULEFLAGS ) -c $< -o $@
70-
71- $(BUILD_DIR ) /% .o : $(SRC_DIR ) /% .f90 | $(BUILD_DIR )
72- $(FC ) $(FFLAGS ) $(MODULEFLAGS ) -c $< -o $@
91+ $(FC ) $(FFLAGS ) -c $< -o $@
7392
74- $(programs ) : $(OBJS ) | $(BIN_DIR )
75- $(FC ) -O3 -fopenmp $(OBJS ) -o $@ $(MKL_FLAGS )
93+ # Main program
94+ $(BUILD_DIR ) /heatflow.o : $(SRC_DIR ) /heatflow.f90 | $(BUILD_DIR )
95+ $(FC ) $(FFLAGS ) -c $< -o $@
7696
77- .PHONY : run
78- run : $(programs )
79- OMP_NUM_THREADS = $( NCORES ) MKL_NUM_THREADS= $( NCORES ) MKL_DYNAMIC=FALSE OMP_PROC_BIND=spread OMP_PLACES=cores ./bin/ $( NAME )
97+ # Link (single definition)
98+ $( TARGET ) : $(BIN_DIR ) $( OBJS )
99+ $( FC ) $( OPTFLAGS ) $( OMPFLAGS ) $( OBJS ) -o $@ $( MKL_FLAGS ) $( PETSC_LIB ) -Wl,-rpath, $( PETSC_LIBDIR )
80100
81- debug : FFLAGS = -O0 -Wall -g -ffpe-trap=invalid,zero,overflow,underflow -fbacktrace -fcheck=all -fbounds-check -I$(MKL_INCLUDE_DIR )
82- debug : $(OBJS ) | $(BIN_DIR )
83- $(FC ) $(FFLAGS ) $(OBJS ) -o $(programs ) $(MKL_FLAGS )
101+ debug : FFLAGS = $(DEBUGFLAGS )
102+ debug : clean show $(TARGET )
84103
85- OMP : $(programs )
86- ./util/DShell/omp_exec.sh
104+ run : $(TARGET )
105+ OMP_NUM_THREADS=$(NCORES ) \
106+ MKL_NUM_THREADS=$(NCORES ) \
107+ MKL_DYNAMIC=FALSE \
108+ OMP_PROC_BIND=spread \
109+ OMP_PLACES=cores \
110+ $< $(RUN_ARGS )
87111
88112clean :
89- rm -f $(BUILD_DIR ) /* .o $(BUILD_DIR ) /* .mod $(programs )
113+ @echo " [CLEAN] objects and modules"
114+ @rm -f $(BUILD_DIR ) /* .o $(BUILD_DIR ) /* .mod
115+
116+ distclean : clean
117+ @echo " [CLEAN] executable"
118+ @rm -f $(TARGET )
119+
120+ help :
121+ @echo " Targets:"
122+ @echo " make / make all - build optimized"
123+ @echo " make debug - debug build"
124+ @echo " make run - run with all cores"
125+ @echo " make clean - remove objects/modules"
126+ @echo " make distclean - remove executable"
127+ @echo " Variables:"
128+ @echo " RUN_ARGS='-ksp_type cg -pc_type gamg -ksp_rtol 1e-8 -ksp_monitor'"
129+ @echo " Parallel build: make -j$( NCORES) "
130+
131+ # ###################################################################
132+ # End
133+ # ###################################################################
0 commit comments