-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMakefile
More file actions
118 lines (93 loc) · 3.38 KB
/
Makefile
File metadata and controls
118 lines (93 loc) · 3.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
####################################################################
# HeatFlow Build System (MKL + optional PETSc + OpenMP)
####################################################################
SHELL = /bin/sh
# Directories
SRC_DIR := ./src
BUILD_DIR := ./obj
BIN_DIR := ./bin
# Compiler (gfortran with OpenMP for threading)
FC := gfortran
# Core count
NCORES := $(shell nproc)
# Detect conda environment for BLAS/LAPACK (fallback if no system libs)
CONDA_PREFIX ?= $(shell conda info --base 2>/dev/null || echo /home/hm556/miniforge3)
# PETSc (system installation)
PETSC_INC := -I/usr/share/petsc/3.15/include -I/usr/lib/petscdir/petsc3.15/x86_64-linux-gnu-real/include
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
PETSC_NOTE := (system PETSc 3.15)
# Use OpenBLAS for multi-threaded BLAS/LAPACK (better than reference BLAS/ATLAS)
BLAS_FLAGS := -lopenblas -lgomp -lpthread -lm
# Flags
OPTFLAGS := -O3
OMPFLAGS := -fopenmp
WARNFLAGS := -Wall
MODDIR_FLAG := -J$(BUILD_DIR)
FFLAGS := -cpp $(OPTFLAGS) $(OMPFLAGS) $(WARNFLAGS) $(PETSC_INC) $(MODDIR_FLAG)
DEBUGFLAGS := -cpp -O0 -g -fcheck=all -fbacktrace -ffpe-trap=invalid,zero,overflow,underflow -fbounds-check $(PETSC_INC) $(MODDIR_FLAG)
# Program
NAME := ThermalFlow.x
TARGET := $(BIN_DIR)/$(NAME)
# Sources (module order)
SRCS := \
heatflow/mod_constants.f90 \
heatflow/mod_constructions.f90 \
heatflow/mod_SPtype.f90 \
heatflow/mod_global.f90 \
heatflow/mod_Sparse.f90 \
heatflow/mod_inputs.f90 \
heatflow/mod_material.f90 \
heatflow/mod_hmatrix.f90 \
heatflow/mod_init_evolve.f90 \
heatflow/mod_petsc_solver.f90 \
heatflow/mod_boundary.f90 \
heatflow/mod_heating.f90 \
heatflow/mod_cattaneo.f90 \
heatflow/mod_tempdep.f90 \
heatflow/mod_evolve.f90 \
heatflow/mod_output.f90 \
heatflow/mod_setup.f90 \
heatflow.f90
OBJS := $(addprefix $(BUILD_DIR)/,$(notdir $(SRCS:.f90=.o)))
.PHONY: all debug clean distclean run help show
all: show $(TARGET)
show:
@printf 'Building %s %s\n' '$(NAME)' '$(PETSC_NOTE)'
$(BIN_DIR) $(BUILD_DIR):
mkdir -p $@
# Compile module sources
$(BUILD_DIR)/%.o: $(SRC_DIR)/heatflow/%.f90 | $(BUILD_DIR)
$(FC) $(FFLAGS) -c $< -o $@
# Main program
$(BUILD_DIR)/heatflow.o: $(SRC_DIR)/heatflow.f90 | $(BUILD_DIR)
$(FC) $(FFLAGS) -c $< -o $@
# Link (single definition)
$(TARGET): $(BIN_DIR) $(OBJS)
$(FC) $(OPTFLAGS) $(OMPFLAGS) $(OBJS) -o $@ $(BLAS_FLAGS) $(PETSC_LIB)
debug: FFLAGS = $(DEBUGFLAGS)
debug: clean show $(TARGET)
run: $(TARGET)
OMP_NUM_THREADS=$(NCORES) \
OPENBLAS_NUM_THREADS=$(NCORES) \
OMP_PROC_BIND=spread \
OMP_PLACES=cores \
$< $(RUN_ARGS)
clean:
@echo "[CLEAN] objects and modules"
@rm -f $(BUILD_DIR)/*.o $(BUILD_DIR)/*.mod
distclean: clean
@echo "[CLEAN] executable"
@rm -f $(TARGET)
help:
@echo "Targets:"
@echo " make / make all - build optimized"
@echo " make debug - debug build"
@echo " make run - run with all cores"
@echo " make clean - remove objects/modules"
@echo " make distclean - remove executable"
@echo "Variables:"
@echo " RUN_ARGS='-ksp_type cg -pc_type gamg -ksp_rtol 1e-8 -ksp_monitor'"
@echo "Parallel build: make -j$(NCORES)"
####################################################################
# End
####################################################################