@@ -20,7 +20,7 @@ gnu: # BUILDTARGET GNU Fortran, C, and C++ compilers
20
20
" CFLAGS_OPT = -O3" \
21
21
" CXXFLAGS_OPT = -O3" \
22
22
" LDFLAGS_OPT = -O3" \
23
- " FFLAGS_DEBUG = -g -ffree-line-length-none -fconvert=big-endian -ffree-form -fcheck=all -fbacktrace -ffpe-trap=invalid,zero,overflow" \
23
+ " FFLAGS_DEBUG = -std=f2008 - g -ffree-line-length-none -fconvert=big-endian -ffree-form -fcheck=all -fbacktrace -ffpe-trap=invalid,zero,overflow" \
24
24
" CFLAGS_DEBUG = -g" \
25
25
" CXXFLAGS_DEBUG = -g" \
26
26
" LDFLAGS_DEBUG = -g" \
@@ -654,6 +654,33 @@ cray: # BUILDTARGET Cray Programming Environment
654
654
" OPENMP = $( OPENMP) " \
655
655
" CPPFLAGS = $( MODEL_FORMULATION) -D_MPI" )
656
656
657
+ intel : # BUILDTARGET Intel oneAPI Fortran, C, and C++ compiler suite
658
+ ( $( MAKE) all \
659
+ " FC_PARALLEL = mpifort" \
660
+ " CC_PARALLEL = mpicc" \
661
+ " CXX_PARALLEL = mpic++" \
662
+ " FC_SERIAL = ifx" \
663
+ " CC_SERIAL = icx" \
664
+ " CXX_SERIAL = icpx" \
665
+ " FFLAGS_PROMOTION = -real-size 64" \
666
+ " FFLAGS_OPT = -O3 -convert big_endian -free -align array64byte" \
667
+ " CFLAGS_OPT = -O3" \
668
+ " CXXFLAGS_OPT = -O3" \
669
+ " LDFLAGS_OPT = -O3" \
670
+ " FFLAGS_DEBUG = -g -convert big_endian -free -check all -fpe0 -traceback" \
671
+ " CFLAGS_DEBUG = -g -traceback" \
672
+ " CXXFLAGS_DEBUG = -g -traceback" \
673
+ " LDFLAGS_DEBUG = -g -fpe0 -traceback" \
674
+ " FFLAGS_OMP = -qopenmp" \
675
+ " CFLAGS_OMP = -qopenmp" \
676
+ " PICFLAG = -fpic" \
677
+ " BUILD_TARGET = $( @) " \
678
+ " CORE = $( CORE) " \
679
+ " DEBUG = $( DEBUG) " \
680
+ " USE_PAPI = $( USE_PAPI) " \
681
+ " OPENMP = $( OPENMP) " \
682
+ " CPPFLAGS = $( MODEL_FORMULATION) -D_MPI" )
683
+
657
684
CPPINCLUDES =
658
685
FCINCLUDES =
659
686
LIBS =
@@ -831,14 +858,18 @@ ifeq "$(OPENMP_OFFLOAD)" "true"
831
858
LDFLAGS += $(LDFLAGS_GPU)
832
859
endif # OPENMP_OFFLOAD IF
833
860
834
- ifeq "$(PRECISION ) " "single"
861
+ ifneq (,$(filter-out double single,$(PRECISION ) ) )
862
+ $(error PRECISION should be "", "single", or "double"; received value "$(PRECISION)")
863
+ endif
864
+ ifeq "$(PRECISION ) " "double"
865
+ FFLAGS += $(FFLAGS_PROMOTION)
866
+ PRECISION_MESSAGE="MPAS was built with default double-precision reals."
867
+ else
868
+ $(if $(PRECISION ) ,$(info NOTE : PRECISION=single is unnecessary, single is the default))
835
869
CFLAGS += " -DSINGLE_PRECISION"
836
870
CXXFLAGS += " -DSINGLE_PRECISION"
837
871
override CPPFLAGS += " -DSINGLE_PRECISION"
838
872
PRECISION_MESSAGE=" MPAS was built with default single-precision reals."
839
- else
840
- FFLAGS += $(FFLAGS_PROMOTION)
841
- PRECISION_MESSAGE="MPAS was built with default double-precision reals."
842
873
endif # PRECISION IF
843
874
844
875
ifeq "$(USE_PAPI ) " "true"
@@ -996,6 +1027,7 @@ override CPPFLAGS += -DMPAS_BUILD_TARGET=$(BUILD_TARGET)
996
1027
ifeq ($(wildcard src/core_$(CORE ) ) , ) # CHECK FOR EXISTENCE OF CORE DIRECTORY
997
1028
998
1029
all : core_error
1030
+ clean : core_error
999
1031
1000
1032
else
1001
1033
@@ -1074,70 +1106,70 @@ ifeq "$(OPENACC)" "true"
1074
1106
@# See whether the test programs can be compiled
1075
1107
@#
1076
1108
@echo "Checking [$(BUILD_TARGET)] compilers for OpenACC support..."
1077
- @( $(SCC) openacc.c $(CPPINCLUDES) $(CFLAGS) $(LDFLAGS) $(LIBS) -o openacc_c.out > openacc_c.log 2>&1; \
1109
+ @( $(SCC) openacc.c $(CPPINCLUDES) $(CFLAGS) $(LDFLAGS) -o openacc_c.out > openacc_c.log 2>&1; \
1078
1110
if [ $$? -eq 0 ]; then \
1079
1111
echo "=> $(SCC) can compile test OpenACC program"; \
1080
1112
else \
1081
1113
echo "*********************************************************"; \
1082
1114
echo "ERROR: Test OpenACC C program could not be compiled by $(SCC)."; \
1083
1115
echo "Following compilation command failed with errors:" ; \
1084
- echo "$(SCC) openacc.c $(CPPINCLUDES) $(CFLAGS) $(LDFLAGS) $(LIBS) -o openacc_c.out"; \
1116
+ echo "$(SCC) openacc.c $(CPPINCLUDES) $(CFLAGS) $(LDFLAGS) -o openacc_c.out"; \
1085
1117
echo ""; \
1086
1118
echo "Test program openacc.c and output openacc_c.log have been left"; \
1087
1119
echo "in the top-level MPAS directory for further debugging"; \
1088
1120
echo "*********************************************************"; \
1089
1121
rm -f openacc.f90 openacc_[cf].out openacc_f.log; exit 1; \
1090
1122
fi )
1091
- @( $(CC) openacc.c $(CPPINCLUDES) $(CFLAGS) $(LDFLAGS) $(LIBS) -o openacc_c.out > openacc_c.log 2>&1; \
1123
+ @( $(CC) openacc.c $(CPPINCLUDES) $(CFLAGS) $(LDFLAGS) -o openacc_c.out > openacc_c.log 2>&1; \
1092
1124
if [ $$? -eq 0 ] ; then \
1093
1125
echo "=> $(CC) can compile test OpenACC program"; \
1094
1126
else \
1095
1127
echo "*********************************************************"; \
1096
1128
echo "ERROR: Test OpenACC C program could not be compiled by $(CC)."; \
1097
1129
echo "Following compilation command failed with errors:" ; \
1098
- echo "$(CC) openacc.c $(CPPINCLUDES) $(CFLAGS) $(LDFLAGS) $(LIBS) -o openacc_c.out"; \
1130
+ echo "$(CC) openacc.c $(CPPINCLUDES) $(CFLAGS) $(LDFLAGS) -o openacc_c.out"; \
1099
1131
echo ""; \
1100
1132
echo "Test program openacc.c and output openacc_c.log have been left"; \
1101
1133
echo "in the top-level MPAS directory for further debugging"; \
1102
1134
echo "*********************************************************"; \
1103
1135
rm -f openacc.f90 openacc_[cf].out openacc_f.log; exit 1; \
1104
1136
fi )
1105
- @( $(CXX) openacc.c $(CPPINCLUDES) $(CFLAGS) $(LDFLAGS) $(LIBS) -o openacc_c.out > openacc_c.log 2>&1; \
1137
+ @( $(CXX) openacc.c $(CPPINCLUDES) $(CFLAGS) $(LDFLAGS) -o openacc_c.out > openacc_c.log 2>&1; \
1106
1138
if [ $$? -eq 0 ] ; then \
1107
1139
echo "=> $(CXX) can compile test OpenACC program"; \
1108
1140
else \
1109
1141
echo "*********************************************************"; \
1110
1142
echo "ERROR: Test OpenACC C program could not be compiled by $(CXX)."; \
1111
1143
echo "Following compilation command failed with errors:" ; \
1112
- echo "$(CXX) openacc.c $(CPPINCLUDES) $(CFLAGS) $(LDFLAGS) $(LIBS) -o openacc_c.out"; \
1144
+ echo "$(CXX) openacc.c $(CPPINCLUDES) $(CFLAGS) $(LDFLAGS) -o openacc_c.out"; \
1113
1145
echo ""; \
1114
1146
echo "Test program openacc.c and output openacc_c.log have been left"; \
1115
1147
echo "in the top-level MPAS directory for further debugging"; \
1116
1148
echo "*********************************************************"; \
1117
1149
rm -f openacc.f90 openacc_[cf].out openacc_f.log; exit 1; \
1118
1150
fi )
1119
- @( $(SFC) openacc.f90 $(FCINCLUDES) $(FFLAGS) $(LDFLAGS) $(LIBS) -o openacc_f.out > openacc_f.log 2>&1; \
1151
+ @( $(SFC) openacc.f90 $(FCINCLUDES) $(FFLAGS) $(LDFLAGS) -o openacc_f.out > openacc_f.log 2>&1; \
1120
1152
if [ $$? -eq 0 ] ; then \
1121
1153
echo "=> $(SFC) can compile test OpenACC program"; \
1122
1154
else \
1123
1155
echo "*********************************************************"; \
1124
1156
echo "ERROR: Test OpenACC Fortran program could not be compiled by $(SFC)."; \
1125
1157
echo "Following compilation command failed with errors:" ; \
1126
- echo "$(SFC) openacc.f90 $(FCINCLUDES) $(FFLAGS) $(LDFLAGS) $(LIBS) -o openacc_f.out"; \
1158
+ echo "$(SFC) openacc.f90 $(FCINCLUDES) $(FFLAGS) $(LDFLAGS) -o openacc_f.out"; \
1127
1159
echo ""; \
1128
1160
echo "Test program openacc.f90 and output openacc_f.log have been left"; \
1129
1161
echo "in the top-level MPAS directory for further debugging"; \
1130
1162
echo "*********************************************************"; \
1131
1163
rm -f openacc.c openacc_[cf].out openacc_c.log; exit 1; \
1132
1164
fi )
1133
- @( $(FC) openacc.f90 $(FCINCLUDES) $(FFLAGS) $(LDFLAGS) $(LIBS) -o openacc_f.out > openacc_f.log 2>&1; \
1165
+ @( $(FC) openacc.f90 $(FCINCLUDES) $(FFLAGS) $(LDFLAGS) -o openacc_f.out > openacc_f.log 2>&1; \
1134
1166
if [ $$? -eq 0 ] ; then \
1135
1167
echo "=> $(FC) can compile test OpenACC program"; \
1136
1168
else \
1137
1169
echo "*********************************************************"; \
1138
1170
echo "ERROR: Test OpenACC Fortran program could not be compiled by $(FC)."; \
1139
1171
echo "Following compilation command failed with errors:" ; \
1140
- echo "$(FC) openacc.f90 $(FCINCLUDES) $(FFLAGS) $(LDFLAGS) $(LIBS) -o openacc_f.out"; \
1172
+ echo "$(FC) openacc.f90 $(FCINCLUDES) $(FFLAGS) $(LDFLAGS) -o openacc_f.out"; \
1141
1173
echo ""; \
1142
1174
echo "Test program openacc.f90 and output openacc_f.log have been left"; \
1143
1175
echo "in the top-level MPAS directory for further debugging"; \
@@ -1225,11 +1257,42 @@ endif
1225
1257
exit 1; \
1226
1258
fi
1227
1259
1260
+
1261
+ mpi_f08_test :
1262
+ @#
1263
+ @# MPAS_MPI_F08 will be set to:
1264
+ @# 0 if no mpi_f08 module support was detected
1265
+ @# 1 if the MPI library provides an mpi_f08 module
1266
+ @#
1267
+ $(info Checking for mpi_f08 support...)
1268
+ $(eval MPAS_MPI_F08 := $(shell $\
1269
+ printf " program main\n$\
1270
+ & use mpi_f08, only : MPI_Init, MPI_Comm\n $\
1271
+ & integer :: ierr\n $\
1272
+ & type (MPI_Comm) :: comm\n $\
1273
+ & call MPI_Init(ierr)\n $\
1274
+ end program main\n " | sed 's/&/ /' > mpi_f08.f90; $\
1275
+ $\
1276
+ $(FC ) mpi_f08.f90 -o mpi_f08.x $(FFLAGS ) $(LDFLAGS ) > /dev/null 2>&1 ; $\
1277
+ mpi_f08_status=$$? ; $\
1278
+ rm -f mpi_f08.f90 mpi_f08.x; $\
1279
+ if [ $$ mpi_f08_status -eq 0 ]; then $\
1280
+ printf " 1" ; $\
1281
+ else $\
1282
+ printf " 0" ; $\
1283
+ fi $\
1284
+ ))
1285
+ $(if $(findstring 0,$(MPAS_MPI_F08 ) ) , $(eval MPI_F08_MESSAGE = "Using the mpi module.") , )
1286
+ $(if $(findstring 0,$(MPAS_MPI_F08 ) ) , $(info No working mpi_f08 module detected; using mpi module.) )
1287
+ $(if $(findstring 1,$(MPAS_MPI_F08 ) ) , $(eval override CPPFLAGS += -DMPAS_USE_MPI_F08) , )
1288
+ $(if $(findstring 1,$(MPAS_MPI_F08 ) ) , $(eval MPI_F08_MESSAGE = "Using the mpi_f08 module.") , )
1289
+ $(if $(findstring 1,$(MPAS_MPI_F08 ) ) , $(info mpi_f08 module detected.) )
1290
+
1228
1291
ifneq "$(PIO ) " ""
1229
- MAIN_DEPS = openmp_test openacc_test pio_test
1292
+ MAIN_DEPS = openmp_test openacc_test pio_test mpi_f08_test
1230
1293
override CPPFLAGS += "-DMPAS_PIO_SUPPORT"
1231
1294
else
1232
- MAIN_DEPS = openmp_test openacc_test
1295
+ MAIN_DEPS = openmp_test openacc_test mpi_f08_test
1233
1296
IO_MESSAGE = "Using the SMIOL library."
1234
1297
override CPPFLAGS += "-DMPAS_SMIOL_SUPPORT"
1235
1298
endif
@@ -1268,6 +1331,7 @@ endif
1268
1331
@echo $(PRECISION_MESSAGE)
1269
1332
@echo $(DEBUG_MESSAGE)
1270
1333
@echo $(PARALLEL_MESSAGE)
1334
+ @echo $(MPI_F08_MESSAGE)
1271
1335
@echo $(PAPI_MESSAGE)
1272
1336
@echo $(TAU_MESSAGE)
1273
1337
@echo $(OPENMP_MESSAGE)
@@ -1320,8 +1384,7 @@ clean_core:
1320
1384
else # CORE IF
1321
1385
1322
1386
all : error
1323
- clean : errmsg
1324
- exit 1
1387
+ clean : error
1325
1388
error : errmsg
1326
1389
@echo " ************ ERROR ************"
1327
1390
@echo " No CORE specified. Quitting."
@@ -1353,7 +1416,7 @@ errmsg:
1353
1416
@echo " TIMER_LIB=tau - Uses TAU for the timer interface instead of the native interface"
1354
1417
@echo " OPENMP=true - builds and links with OpenMP flags. Default is to not use OpenMP."
1355
1418
@echo " OPENACC=true - builds and links with OpenACC flags. Default is to not use OpenACC."
1356
- @echo " PRECISION=single - builds with default single -precision real kind. Default is to use double -precision."
1419
+ @echo " PRECISION=double - builds with default double -precision real kind. Default is to use single -precision."
1357
1420
@echo " SHAREDLIB=true - generate position-independent code suitable for use in a shared library. Default is false."
1358
1421
@echo " "
1359
1422
@echo " Ensure that NETCDF, PNETCDF, PIO, and PAPI (if USE_PAPI=true) are environment variables"
0 commit comments