forked from iterorganization/JOREK
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdefaults.mk
More file actions
384 lines (331 loc) · 12.6 KB
/
Copy pathdefaults.mk
File metadata and controls
384 lines (331 loc) · 12.6 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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
DEBUG ?= 0 # Build in release mode by default
# To use the default compiler flags, set $(COMPILER_FAMILY)
# If you do not want to do this, be sure to set OUTPUT_MODULE_COMMAND to the correct
# one for your compiler in Makefile.inc.
# build in directories to not clutter the repository
MODDIR := .mod
OBJDIR := .obj
DEPDIR := .dep
$(shell mkdir -p $(MODDIR) $(OBJDIR) $(DEPDIR) >/dev/null)
INCLUDES += -I$(MODDIR)
# Detect the compiler vendors (sort to remove duplicates)
F_COMPILER_FAMILY :=$(sort $(shell $(FC) --version | grep -oim 1 'intel\|gcc\|gnu' | tr A-Z a-z | sed 's/gcc/gnu/'))
C_COMPILER_FAMILY :=$(sort $(shell $(CC) --version | grep -oim 1 'intel\|gcc\|gnu' | tr A-Z a-z | sed 's/gcc/gnu/'))
CXX_COMPILER_FAMILY :=$(sort $(shell $(CXX) --version | grep -oim 1 'intel\|gcc\|gnu\|g[+][+]' | tr A-Z a-z | sed -e 's/gcc/gnu/' -e 's/g[+][+]/gnu/'))
ifneq ($(F_COMPILER_FAMILY),$(C_COMPILER_FAMILY))
$(error "Fortran compiler ($(F_COMPILER_FAMILY)) must be same as C compiler ($(C_COMPILER_FAMILY))")
endif
ifneq ($(CXX_COMPILER_FAMILY),$(C_COMPILER_FAMILY))
$(error "C++ compiler ($(CXX_COMPILER_FAMILY)) must be same as C compiler ($(C_COMPILER_FAMILY))")
endif
ifeq ($(COMPILER_FAMILY),)
COMPILER_FAMILY = $(F_COMPILER_FAMILY)
endif
ifneq ($(F_COMPILER_FAMILY),$(COMPILER_FAMILY))
$(warning "*******************************************************************************************")
$(warning "Set compiler family ($(COMPILER_FAMILY)) is different from $(FC) ($(F_COMPILER_FAMILY))")
$(warning "*******************************************************************************************")
endif
# Clear some variables (makefile bug?)
F77FLAGS=
F90FLAGS=
# Default (GNU) preprocessor
GCPP ?= cpp
# Default flags for GCC
ifeq ($(COMPILER_FAMILY), gnu)
GCPP = $(FC) -cpp -E # use gfortran precompiler to generate dependencies with __GFORTRAN__ flag
FLAGS += -cpp -fopenmp
FLAGS += -Wall -Wextra
FLAGS += -Wno-unused-variable
FFLAGS += -Wintrinsics-std
FFLAGS += -Wcharacter-truncation
FFLAGS += -Wsurprising -Wno-tabs
FFLAGS += -ffree-line-length-none
F77FLAGS += -fdefault-real-8 -fdefault-double-8
ifeq ($(DEBUG), 1)
FLAGS += -g -Og -ggdb -fno-lto
FLAGS += -Wunused-variable
FFLAGS += -fcheck=all
FLAGS += -ffpe-trap=invalid,zero,overflow,denormal
FFLAGS += -ftrapv
FFLAGS += -finit-real=snan -finit-integer=12345678
FFLAGS += -Wconversion
F90FLAGS += -fimplicit-none
endif
ifeq ($(DEBUG), 2)
FFLAGS += -Wimplicit-interface -Wimplicit-procedure
endif
FFLAGS +=-J$(MODDIR)
endif
# Default flags for intel
ifeq ($(COMPILER_FAMILY), intel)
COMPILER_MAJOR_VERSION=$(shell $(FC) -V 2>&1 | grep -o "Version [0-9]*" | cut -d' ' -f 2)
COMPILER_MAJOR_VERSION_ID=$(shell $(FC) -V 2>&1 | grep -o "Version [0-9]*.*" | cut -d'.' -f 2)
FFLAGS += -align
ifeq ($(shell test $(COMPILER_MAJOR_VERSION) -ge 15; echo $$?),0)
FLAGS += -qopenmp
else
FLAGS += -openmp
endif
ifeq ($(shell test $(COMPILER_MAJOR_VERSION) -gt 19; echo $$?),0)
FFLAGS +: -warn noexternal
else ifeq ($(shell test $(COMPILER_MAJOR_VERSION) -eq 19; echo $$?),0)
ifeq ($(shell test $(COMPILER_MAJOR_VERSION_ID) -ge 1; echo $$?),0)
FFLAGS += -warn noexternal
endif
endif
FFLAGS += -warn all
FFLAGS += -warn nointerfaces
FFLAGS += -warn nounused
FFLAGS += -fpp
FFLAGS += -r8
F77FLAGS += -warn nodeclarations
ifeq ($(DEBUG), 1)
# Debug flags for ifort, see http://www.nas.nasa.gov/hecc/support/kb/recommended-intel-compiler-debugging-options_92.html
FLAGS += -O0 -g -traceback
FLAGS += -debug all -debug-parameters
FLAGS += -fstack-security-check
FFLAGS += -ftrapuv
FFLAGS += -fpe0
FFLAGS += -check all,noarg_temp_created
FFLAGS += -check bounds
FFLAGS += -check uninit
FFLAGS += -init=snan
FFLAGS += -gen-interfaces -warn-interfaces
F90FLAGS += -implicitnone
endif
FFLAGS +=-module $(MODDIR)
endif
#TODO identify good default flags for XLF
# Correct preprocessor-defines for IBM XLF Compiler
IBM_DEFINES = `echo $(DEFINES) | sed -e 's/^/-WF,/' -e 's/ */,/g'`
ifdef IBMFC
DEFINES := $(IBM_DEFINES) -DIBM_MACHINE
endif
# TODO set the option to output module files to a specific directory for XLF
# Make rules for specific files
# This is needed because the file stems must match and we do not really want to recreate the directory structure in $(OBJDIR) and $(DEPDIR)
# Also, it will make everything slightly nicer later
# Template for generating object files from source files
# Touch the .mod file again if it exists (because it is not written if there is no change to the interfaces, and this messes with the make rules)
# Note that gfortran outputs module files in lowercase of the module name, while intel remains case-sensitive. Best to use lowercase module names
define O_TEMPLATE
$(OBJDIR)/%.o $(MODDIR)/%.mod:: $(1)%.f90
$$(FC) $$(FLAGS) $$(FFLAGS) $$(F90FLAGS) $$(DEFINES) $$(INCLUDES) $$(EXTRA_FLAGS) -c $$< -o $(OBJDIR)/$$*.o
@test -e $(MODDIR)/$$*.mod && touch $(MODDIR)/$$*.mod || true
$(OBJDIR)/%.o:: $(1)%.f
$$(FC) $$(FLAGS) $$(FFLAGS) $$(F77FLAGS) $$(DEFINES) $$(INCLUDES) $$(EXTRA_FLAGS) -c $$< -o $(OBJDIR)/$$*.o
$(OBJDIR)/%.o:: $(1)%.c
$$(CC) $$(FLAGS) $$(CFLAGS) $$(DEFINES) $$(INCLUDES) $$(EXTRA_FLAGS) -c $$< -o $(OBJDIR)/$$*.o
$(OBJDIR)/%.o:: $(1)%.cpp
$$(CXX) $$(FLAGS) $$(CXXFLAGS) $$(DEFINES) $$(INCLUDES) $$(EXTRA_FLAGS) -c $$< -o $(OBJDIR)/$$*.o
endef
# Template for generating dependencies from source file
define F90_D_TEMPLATE
$(DEPDIR)/%.d: $(1)%.f90 | $(MODDIR)/version.h
@echo "Generating dependencies for $$<"
@$(GCPP) -traditional-cpp -dI $$(DEFINES) $$(INCLUDES) $$< | util/makedepend $$< - $(DIRS) > $(DEPDIR)/$$(*F).d
endef
# This template defines a program $(file_stem)
# which has prerequisites $(OBJDIR)/$(file_stem).o and as determined by the output of obj_deps.sh
# Since make will try to build the .d files first and re-exec every time
# these will be up-to-date
file_stem=$(notdir $(basename $(1)))
define PROGRAM_TEMPLATE
$(notdir $(basename $(1))): $(OBJDIR)/$(file_stem).o $(shell ./util/obj_deps $(DEPDIR)/$(file_stem).d)
$$(FC) $$(FLAGS) $$(EXTRA_FLAGS) $$(DEFINES) $$(INCLUDES) -o $(file_stem) $$^ $$(LIBS)
endef
LIBS += $(LIBLAPACK) $(LIBBLAS) $(OPENMPLIB)
DEFINES += -DJOREK_MODEL=$(MODEL_NUMBER) -DUSE_MPI
# Full-MHD models flags
ifeq (model710, $(MODEL))
DEFINES := $(DEFINES) -Dfullmhd
endif
ifeq (model711, $(MODEL))
DEFINES := $(DEFINES) -Dfullmhd
endif
ifeq (model712, $(MODEL))
DEFINES := $(DEFINES) -Dfullmhd
endif
ifeq (model750, $(MODEL))
DEFINES := $(DEFINES) -Dfullmhd
endif
CGDEP= generate_code # Pre-compute analytic expressions from mod_equations for performance
USE_DOMM ?= 1
ifeq ($(USE_DOMM), 1)
DEFINES := $(DEFINES) -DUSE_DOMM # Use Dommaschk potentials, without FE correction of n.B on boundary
endif
USE_EXT_FIELD ?= 0
ifeq ($(USE_EXT_FIELD), 1)
ifeq ($(USE_DOMM), 0) # Should only be set if USE_DOMM=0
DEFINES := $(DEFINES) -DUSE_EXT_FIELD # Use external magnetic field from gvec2jorek file
endif
endif
ifeq (model180, $(MODEL))
DEFINES := $(DEFINES) -DSEMIANALYTICAL -DSTELLARATOR_MODEL
FFLAGS := $(FFLAGS) -heap-arrays
endif
ifeq (model183, $(MODEL))
DEFINES := $(DEFINES) -DSEMIANALYTICAL -DSTELLARATOR_MODEL
FFLAGS := $(FFLAGS) -heap-arrays
endif
ifeq (.true., $(shell ./util/config.sh -p with_vpar))
DEFINES := $(DEFINES) -DWITH_Vpar
endif
ifeq (.true., $(shell ./util/config.sh -p with_TiTe))
DEFINES := $(DEFINES) -DWITH_TiTe
endif
ifeq (.true., $(shell ./util/config.sh -p with_neutrals))
DEFINES := $(DEFINES) -DWITH_Neutrals
endif
ifeq (.true., $(shell ./util/config.sh -p with_rho))
DEFINES := $(DEFINES) -DWITH_Rho
endif
ifeq (.true., $(shell ./util/config.sh -p with_impurities))
DEFINES := $(DEFINES) -DWITH_Impurities
endif
ifeq (.true., $(shell ./util/config.sh -p with_refluid))
DEFINES := $(DEFINES) -DWITH_REFluid
endif
ifneq (0, $(shell ./util/config.sh -p n_mod_ext))
DEFINES := $(DEFINES) -DMODEL_FAMILY
endif
ifeq (1, $(USE_FFTW))
LIBS := $(LIBS) $(LIBFFTW)
DEFINES := $(DEFINES) -DUSE_FFTW
INCLUDES := $(INCLUDES) $(INC_FFTW)
endif
# polynomial order > 3 requires more Gauss points
N_ORDER_PARAMETER = $(shell cat models/mod_settings.f90 |grep n_order |grep -v n_degrees | grep -v SETTINGS | awk '{print $$6}' | bc)
ifneq (3, $(N_ORDER_PARAMETER))
DEFINES := $(DEFINES) -DGAUSS_ORDER=8
endif
ifeq (1, $(USE_PASTIX_MURGE))
LIBS := $(LIBS) $(LIB_PASTIX_MURGE) $(LIB_PASTIX_BLAS)
DEFINES := $(DEFINES) -DUSE_MURGE
INCLUDES := $(INCLUDES) $(INC_PASTIX)
endif
ifeq (1, $(USE_PASTIX))
DEFINES := $(DEFINES) -DUSE_PASTIX
ifeq (0, $(USE_PASTIX_MURGE))
LIBS := $(LIBS) $(LIB_PASTIX) $(LIB_PASTIX_BLAS)
INCLUDES := $(INCLUDES) $(INC_PASTIX)
endif
PASTIX_MEMORY_USAGE?=1
ifeq (1, $(PASTIX_MEMORY_USAGE))
DEFINES := $(DEFINES) -DMEMORY_USAGE
endif
else
# This is a hack to remove the linking problems that otherwise arise
DEFINES += -Dpastix_fortran=fake_pastix_fortran
endif
ifeq (1, $(USE_PASTIX6))
DEFINES := $(DEFINES) -DUSE_PASTIX6
LIBS := $(LIBS) $(LIB_PASTIX)
INCLUDES := $(INCLUDES) $(INC_PASTIX)
EXTRA_FLAGS := $(EXTRA_FLAGS) -lstdc++ -std=c++14
endif
ifeq (1, $(USE_WSMP))
DEFINES := $(DEFINES) -DUSE_WSMP
LIBS := $(LIBS) $(LIB_WSMP)
endif
ifeq (1, $(USE_HIPS))
LIBS := $(LIBS) $(LIBHIPS)
INCLUDES := $(INCLUDES) $(INCHIPS)
DEFINES := $(DEFINES) -DUSE_HIPS
endif
ifeq (1, $(USE_MUMPS))
LIBS := $(LIBS) $(LIB_MUMPS) $(ORDLIB) $(SCALAP) $(BLACS) $(LIBLAPACK) $(LIBBLAS) $(PPPLIB) $(OPENMP_LIB) $(LIBFFTW)
INCLUDES := $(INCLUDES) -I$(INC_MUMPS) $(INC_MUMPS_EXTRA)
DEFINES := $(DEFINES) -DUSE_MUMPS
endif
ifeq (1, $(USE_HDF5))
LIBS := $(LIBS) $(HDF5LIB)
INCLUDES := $(INCLUDES) -I$(HDF5INCLUDE)
DEFINES := $(DEFINES) -DUSE_HDF5
else
$(warning "USE_HDF5=1 is recommended for input/output")
endif
ifeq (1, $(USE_BLOCK))
DEFINES := $(DEFINES) -DUSE_BLOCK
endif
ifeq (1, $(USE_NO_TREE))
DEFINES := $(DEFINES) -DUSE_NO_TREE
endif
ifeq (1, $(USE_QUADTREE))
DEFINES := $(DEFINES) -DUSE_QUADTREE
endif
ifeq (1, $(USE_DIRECT_CONSTRUCTION))
DEFINES := $(DEFINES) -DDIRECT_CONSTRUCTION
endif
ifeq (1, $(USE_COMPLEX_PRECOND))
DEFINES := $(DEFINES) -DUSE_COMPLEX_PRECOND
endif
ifeq (1, $(USE_INTSIZE64))
DEFINES := $(DEFINES) -DINTSIZE64
endif
ifeq (1, $(USE_STRUMPACK))
DEFINES := $(DEFINES) -DUSE_STRUMPACK
LIBS := $(LIBS) $(STRUMPACKLIB)
INCLUDES := $(INCLUDES) $(STRUMPACKINC)
EXTRA_FLAGS := $(EXTRA_FLAGS) -lstdc++ -std=c++14
endif
ifeq (1, $(USE_STD_BESSELK))
DEFINES := $(DEFINES) -DUSE_STD_BESSELK
EXTRA_FLAGS := $(EXTRA_FLAGS) -lstdc++ -std=c++17
USE_BOOST = 0
endif
ifeq (1, $(USE_BOOST))
DEFINES := $(DEFINES) -DUSE_BOOST
LIBS := $(LIBS) $(LIB_BOOST)
INCLUDES := $(INCLUDES) $(INC_BOOST)
EXTRA_FLAGS := $(EXTRA_FLAGS) -lstdc++ -std=c++17
USE_STD_BESSELK = 0
endif
ifeq (1, $(USE_BICGSTAB))
DEFINES := $(DEFINES) -DUSE_BICGSTAB
else
DEFINES := $(DEFINES) -DUSE_GMRES
endif
ifeq (1, $(USE_IMAS))
LIBS := $(LIBS) $(IMASLIB)
INCLUDES := $(INCLUDES) $(IMASINCLUDE)
DEFINES := $(DEFINES) -DUSE_IMAS
endif
ifeq (1, $(USE_CATALYST))
LIBS := $(LIBS) $(CATALYSTLIB)
INCLUDES := $(INCLUDES) -I$(CATALYSTINCLUDE)
DEFINES := $(DEFINES) -DUSE_CATALYST
endif
ifeq (1, $(USE_TASKLOOP))
DEFINES := $(DEFINES) -DUSE_TASKLOOP
endif
ifeq (1, $(USE_STDLIB))
LIBS := $(LIBS) $(LIB_STDLIB)
INCLUDES := $(INCLUDES) $(INC_STDLIB)
DEFINES := $(DEFINES) -DUSE_STDLIB
endif
# Do not check to make these files to speed up and clean -d output
Makefile: ;
Makefile.inc: ;
%.mk: ;
%.f90: ;
# Try to create .mod/version.h, but only overwrite it if the contents have changed
$(MODDIR)/version.h:
@echo "Generate .mod/version.h"
@rm -f $@.tmp
@echo "#define RCS_VERSION '`git describe --always --dirty --abbrev 2> /dev/null`'" >> $@.tmp
@echo "#define JOREK_VERSION '`git describe --tags \`git rev-list --tags --max-count=1\` 2> /dev/null`'" >> $@.tmp
@echo "#define RCS_LABEL '`git log -1 --format="%s (%D)" 2> /dev/null | sed -e "s/'/''/g" `'" >> $@.tmp
@echo "#define RCS_TIME '`git log -1 --format="%ad" 2> /dev/null`'" >> $@.tmp
@echo "#define compile_command '$(FC)'" >> $@.tmp
@echo "#define compile_flags '$(FLAGS) $(FFLAGS) $(F90FLAGS) $(EXTRA_FLAGS)'" >> $@.tmp
@echo "#define compile_includes '$(INCLUDES)'" >> $@.tmp
@echo "#define compile_defines '$(DEFINES)'" >> $@.tmp
@echo "#define compile_libs '$(LIBS)'" >> $@.tmp
-@echo "#define compile_dir '`pwd`'" >> $@.tmp
-@echo "#define compile_user '`whoami`'" >> $@.tmp
-@echo "#define compile_machine '`hostname`'" >> $@.tmp
@echo "#define compile_modules '$(LOADEDMODULES)'" >> $@.tmp
@[ -f $@ ] && cmp --silent $@ $@.tmp || mv $@.tmp $@
-@rm -f $@.tmp