Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,4 @@ stream_list.*
*.i90

src/core_*/inc
/build-cmake-colm-debug
15 changes: 13 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,19 @@ option(MPAS_PROFILE "Enable GPTL profiling" OFF)
option(MPAS_OPENMP "Enable OpenMP" OFF)
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
option(MPAS_USE_PIO "Build with PIO I/O library" OFF)
option(MPAS_COLM2024 "Build atmosphere core with embedded CoLM2024 land-surface physics" OFF)

if(MPAS_COLM2024 AND NOT DO_PHYSICS)
message(FATAL_ERROR "MPAS_COLM2024 requires DO_PHYSICS=ON because CoLM2024 is built into the atmosphere physics driver.")
endif()

message(STATUS "[OPTION] MPAS_CORES: ${MPAS_CORES}")
message(STATUS "[OPTION] MPAS_DOUBLE_PRECISION: ${MPAS_DOUBLE_PRECISION}")
message(STATUS "[OPTION] MPAS_PROFILE: ${MPAS_PROFILE}")
message(STATUS "[OPTION] MPAS_OPENMP: ${MPAS_OPENMP}")
message(STATUS "[OPTION] BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}")
message(STATUS "[OPTION] MPAS_USE_PIO: ${MPAS_USE_PIO}")
message(STATUS "[OPTION] MPAS_COLM2024: ${MPAS_COLM2024}")

# Build product output locations
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
Expand All @@ -43,8 +49,11 @@ if(NOT CMAKE_BUILD_TYPE)
endif()

# Detect MPAS git version
if(DEFINED GIT_EXECUTABLE AND NOT EXISTS "${GIT_EXECUTABLE}")
unset(GIT_EXECUTABLE CACHE)
endif()
find_package(Git QUIET)
if(NOT MPAS_GIT_VERSION)
find_package(Git QUIET)
if(GIT_FOUND)
execute_process(COMMAND ${GIT_EXECUTABLE} describe --dirty
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
Expand All @@ -68,9 +77,11 @@ endif()
find_package(MPI REQUIRED COMPONENTS Fortran)

find_package(PnetCDF REQUIRED COMPONENTS Fortran)
if(MPAS_USE_PIO OR MPAS_COLM2024)
find_package(NetCDF REQUIRED COMPONENTS Fortran C)
endif()
if(MPAS_USE_PIO)
find_package(PIO REQUIRED COMPONENTS Fortran C)
find_package(NetCDF REQUIRED COMPONENTS Fortran C)
endif()
if(MPAS_PROFILE)
find_package(GPTL REQUIRED)
Expand Down
73 changes: 68 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -755,28 +755,85 @@ else # Not using PIO, using SMIOL
endif

ifneq "$(NETCDF)" ""
ifneq ($(wildcard $(NETCDF)/lib/libnetcdf.*), )
ifneq ($(filter-out %.settings,$(wildcard $(NETCDF)/lib/libnetcdf.*)), )
NETCDFLIBLOC = lib
endif
ifneq ($(wildcard $(NETCDF)/lib64/libnetcdf.*), )
ifneq ($(filter-out %.settings,$(wildcard $(NETCDF)/lib64/libnetcdf.*)), )
NETCDFLIBLOC = lib64
endif
CPPINCLUDES += -I$(NETCDF)/include
FCINCLUDES += -I$(NETCDF)/include
LIBS += -L$(NETCDF)/$(NETCDFLIBLOC)
NCLIB = -lnetcdf
NCLIBF = -lnetcdff
ifneq ($(wildcard $(NETCDF)/$(NETCDFLIBLOC)/libnetcdff.*), ) # CHECK FOR NETCDF4
ifneq ($(filter-out %.settings,$(wildcard $(NETCDF)/$(NETCDFLIBLOC)/libnetcdff.*)), ) # CHECK FOR NETCDF4
LIBS += $(NCLIBF)
endif # CHECK FOR NETCDF4
ifneq "$(NETCDFF)" ""
ifneq ($(filter-out %.settings,$(wildcard $(NETCDFF)/lib/libnetcdff.*)), )
NETCDFFLIBLOC = lib
endif
ifneq ($(filter-out %.settings,$(wildcard $(NETCDFF)/lib64/libnetcdff.*)), )
NETCDFFLIBLOC = lib64
endif
FCINCLUDES += -I$(NETCDFF)/include
LIBS += -L$(NETCDFF)/$(NETCDFLIBLOC)
LIBS += -L$(NETCDFF)/$(NETCDFFLIBLOC)
LIBS += $(NCLIBF)
endif
LIBS += $(NCLIB)
endif

ifeq "$(COLM2024)" "true"
NF_CONFIG ?= nf-config
COLM2024_NETCDF_C_LIB := $(if $(strip $(NETCDFLIBLOC)),$(firstword $(filter-out %.settings,$(wildcard $(NETCDF)/$(NETCDFLIBLOC)/libnetcdf.*))))
COLM2024_NETCDF_F_ROOT := $(if $(strip $(NETCDFF)),$(NETCDFF),$(NETCDF))
COLM2024_NETCDF_F_LIBLOC := $(if $(strip $(NETCDFF)),$(NETCDFFLIBLOC),$(NETCDFLIBLOC))
COLM2024_NETCDF_F_LIB := $(if $(strip $(COLM2024_NETCDF_F_LIBLOC)),$(firstword $(filter-out %.settings,$(wildcard $(COLM2024_NETCDF_F_ROOT)/$(COLM2024_NETCDF_F_LIBLOC)/libnetcdff.*))))
COLM2024_NETCDF_F_MOD := $(if $(strip $(COLM2024_NETCDF_F_ROOT)),$(firstword $(wildcard $(COLM2024_NETCDF_F_ROOT)/include/netcdf.mod $(COLM2024_NETCDF_F_ROOT)/include/NETCDF.mod)))
COLM2024_NETCDF_ROOTS_READY := $(and $(COLM2024_NETCDF_C_LIB),$(COLM2024_NETCDF_F_LIB),$(COLM2024_NETCDF_F_MOD))

ifneq ($(strip $(NETCDF)),)
ifeq ($(strip $(COLM2024_NETCDF_C_LIB)),)
$(error COLM2024=true but NETCDF=$(NETCDF) does not contain libnetcdf under lib or lib64)
endif
endif
ifneq ($(strip $(NETCDFF)),)
ifeq ($(strip $(COLM2024_NETCDF_F_LIB)),)
$(error COLM2024=true but NETCDFF=$(NETCDFF) does not contain libnetcdff under lib or lib64)
endif
ifeq ($(strip $(COLM2024_NETCDF_F_MOD)),)
$(error COLM2024=true but NETCDFF=$(NETCDFF) does not contain include/netcdf.mod)
endif
endif

ifeq ($(strip $(COLM2024_NETCDF_ROOTS_READY)),)
ifneq ($(strip $(NETCDF)$(NETCDFF)),)
COLM2024_NF_CONFIG := $(firstword \
$(if $(strip $(NETCDFF)),$(wildcard $(NETCDFF)/bin/nf-config)) \
$(if $(strip $(NETCDF)),$(wildcard $(NETCDF)/bin/nf-config)))
else
COLM2024_NF_CONFIG := $(shell command -v $(NF_CONFIG) 2>/dev/null)
endif
ifeq ($(strip $(COLM2024_NF_CONFIG)),)
ifneq ($(strip $(NETCDF)$(NETCDFF)),)
$(error COLM2024=true received incomplete NETCDF/NETCDFF roots; provide matching NetCDF-C and NetCDF-Fortran libraries plus netcdf.mod, or a root-local bin/nf-config)
else
$(error COLM2024=true requires NetCDF-C and NetCDF-Fortran; set NETCDF/NETCDFF or provide nf-config in PATH)
endif
endif
COLM2024_NETCDF_FFLAGS := $(strip $(shell "$(COLM2024_NF_CONFIG)" --fflags 2>/dev/null))
COLM2024_NETCDF_FLIBS := $(strip $(shell "$(COLM2024_NF_CONFIG)" --flibs 2>/dev/null))
ifeq ($(strip $(COLM2024_NETCDF_FFLAGS)),)
$(error $(COLM2024_NF_CONFIG) did not return NetCDF-Fortran compile flags from --fflags)
endif
ifeq ($(strip $(COLM2024_NETCDF_FLIBS)),)
$(error $(COLM2024_NF_CONFIG) did not return NetCDF-C/Fortran link flags from --flibs)
endif
override FCINCLUDES += $(COLM2024_NETCDF_FFLAGS)
override LIBS += $(COLM2024_NETCDF_FLIBS)
endif
endif

ifneq "$(SCOTCH)" ""
SCOTCH_INCLUDES += -I$(SCOTCH)/include
SCOTCH_LIBS += -L$(SCOTCH)/lib64 -lptscotch -lscotch -lptscotcherr -lm
Expand Down Expand Up @@ -1029,6 +1086,12 @@ endif # END OF GIT DESCRIBE VERSION
####################################################
# Section for adding external libraries and includes
####################################################
ifeq "$(COLM2024)" "true"
override CPPFLAGS += -DMPAS_COLM2024
COLM2024_MESSAGE = "MPAS was built with the bundled CoLM2024 physics package."
else
COLM2024_MESSAGE = "MPAS was not built with CoLM2024."
endif
ifdef MPAS_EXTERNAL_LIBS
override LIBS += $(MPAS_EXTERNAL_LIBS)
endif
Expand Down Expand Up @@ -1573,6 +1636,7 @@ mpas_main: $(MAIN_DEPS)
@echo $(OPENMP_OFFLOAD_MESSAGE)
@echo $(OPENACC_MESSAGE)
@echo $(MUSICA_MESSAGE)
@echo $(COLM2024_MESSAGE)
@echo $(SCOTCH_MESSAGE)
@echo $(SHAREDLIB_MESSAGE)
ifeq "$(AUTOCLEAN)" "true"
Expand Down Expand Up @@ -1648,4 +1712,3 @@ errmsg:
ifdef CORE
exit 1
endif

25 changes: 14 additions & 11 deletions cmake/Functions/MPAS_Functions.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,8 @@ function(mpas_fortran_target target)
endfunction()


# mpas_core_target(CORE <core-name> TARGET <cmake-target-name> INCLUDE <file1.inc, ...> )
# mpas_core_target(CORE <core-name> TARGET <cmake-target-name>
# INCLUDES <file1.inc, ...> REGISTRY_DEPENDS <file1.xml, ...> )
#
# Common configuration and properties for `MPAS::core::<core_name>` targets.
# * Calls mpas_fortran_target() for common Fortran target configuration.
Expand All @@ -164,9 +165,10 @@ endfunction()
# CORE - Name of core
# TARGET - Name of core_target (without namespace)
# INCLUDES - List of generated include files
# REGISTRY_DEPENDS - Files included by the core Registry.xml preprocessor input
#
function(mpas_core_target)
cmake_parse_arguments(ARG "" "CORE;TARGET" "INCLUDES" ${ARGN})
cmake_parse_arguments(ARG "" "CORE;TARGET" "INCLUDES;REGISTRY_DEPENDS" ${ARGN})

mpas_fortran_target(${ARG_TARGET})

Expand Down Expand Up @@ -214,25 +216,26 @@ function(mpas_core_target)
if (${DO_PHYSICS})
set(CPP_EXTRA_FLAGS ${CPP_EXTRA_FLAGS} -DDO_PHYSICS)
endif()
set(REGISTRY_PROCESSED_XML ${CMAKE_CURRENT_BINARY_DIR}/Registry_processed.xml)

add_custom_command(OUTPUT Registry_processed.xml
COMMAND ${CPP_EXECUTABLE} -E -P ${CPP_EXTRA_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/Registry.xml > Registry_processed.xml
add_custom_command(OUTPUT ${REGISTRY_PROCESSED_XML}
COMMAND ${CPP_EXECUTABLE} -E -P ${CPP_EXTRA_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/Registry.xml > ${REGISTRY_PROCESSED_XML}
COMMENT "CORE ${ARG_CORE}: Pre-Process Registry"
DEPENDS Registry.xml)
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/Registry.xml ${ARG_REGISTRY_DEPENDS})
add_custom_command(OUTPUT ${ARG_INCLUDES}
COMMAND mpas_parse_${ARG_CORE} Registry_processed.xml ${CPP_EXTRA_FLAGS}
COMMAND mpas_parse_${ARG_CORE} ${REGISTRY_PROCESSED_XML} ${CPP_EXTRA_FLAGS}
COMMENT "CORE ${ARG_CORE}: Parse Registry"
DEPENDS mpas_parse_${ARG_CORE} Registry_processed.xml)
DEPENDS mpas_parse_${ARG_CORE} ${REGISTRY_PROCESSED_XML})
add_custom_command(OUTPUT namelist.${ARG_CORE}
WORKING_DIRECTORY ${CORE_DATADIR}
COMMAND mpas_namelist_gen ${CMAKE_CURRENT_BINARY_DIR}/Registry_processed.xml namelist.${ARG_CORE} in_defaults=true
COMMAND mpas_namelist_gen ${REGISTRY_PROCESSED_XML} namelist.${ARG_CORE} in_defaults=true
COMMENT "CORE ${ARG_CORE}: Generate Namelist"
DEPENDS mpas_namelist_gen Registry_processed.xml)
DEPENDS mpas_namelist_gen ${REGISTRY_PROCESSED_XML})
add_custom_command(OUTPUT streams.${ARG_CORE}
WORKING_DIRECTORY ${CORE_DATADIR}
COMMAND mpas_streams_gen ${CMAKE_CURRENT_BINARY_DIR}/Registry_processed.xml streams.${ARG_CORE} stream_list.${ARG_CORE}. listed
COMMAND mpas_streams_gen ${REGISTRY_PROCESSED_XML} streams.${ARG_CORE} stream_list.${ARG_CORE}. listed
COMMENT "CORE ${ARG_CORE}: Generate Streams"
DEPENDS mpas_streams_gen Registry_processed.xml)
DEPENDS mpas_streams_gen ${REGISTRY_PROCESSED_XML})
add_custom_target(gen_${ARG_CORE} DEPENDS ${ARG_INCLUDES} namelist.${ARG_CORE} streams.${ARG_CORE})
add_dependencies(${ARG_TARGET} gen_${ARG_CORE})

Expand Down
Loading