Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 0 additions & 3 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +0,0 @@
[submodule "generic_tracers"]
path = src/access/generic_tracers
url = https://github.com/ACCESS-NRI/GFDL-generic-tracers.git
2 changes: 1 addition & 1 deletion bin/mkmf.template.ubuntu
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ MAKEFLAGS += --jobs=$(shell grep '^processor' /proc/cpuinfo | wc -l)

FPPFLAGS :=

FFLAGS := -fcray-pointer -fdefault-real-8 -ffree-line-length-none -fno-range-check -Waliasing -Wampersand -Warray-bounds -Wcharacter-truncation -Wconversion -Wline-truncation -Wintrinsics-std -Wsurprising -Wno-tabs -Wunderflow -Wunused-parameter -Wintrinsic-shadow -Wno-align-commons
FFLAGS := -fcray-pointer -fdefault-real-8 -ffree-line-length-none -fno-range-check -Waliasing -Wampersand -Warray-bounds -Wcharacter-truncation -Wconversion -Wline-truncation -Wintrinsics-std -Wsurprising -Wno-tabs -Wunderflow -Wunused-parameter -Wintrinsic-shadow -Wno-align-commons -fallow-argument-mismatch -fallow-invalid-boz
FFLAGS += -I/usr/include/mpich2 -I/usr/include
FFLAGS += -DGFORTRAN

Expand Down
264 changes: 155 additions & 109 deletions cmake/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,133 +1,179 @@
cmake_minimum_required(VERSION 3.6)
project(MOM5 C Fortran)
# Copyright ACCESS-NRI and contributors. See the top-level LICENSE file for details.

set(CMAKE_VERBOSE_MAKEFILE ON)
cmake_minimum_required(VERSION 3.18)

# make sure that the default is RELWITHDEBINFO
if (NOT CMAKE_BUILD_TYPE)
set (CMAKE_BUILD_TYPE RELWITHDEBINFO CACHE STRING
"Choose the type of build, options are: Debug Release Relwithdebinfo."
FORCE)
#[==============================================================================[
# Basic project definition #
#]==============================================================================]

project(MOM5
DESCRIPTION "Modular Ocean Model 5"
HOMEPAGE_URL https://github.com/ACCESS-NRI/MOM5
LANGUAGES C Fortran)

#[==============================================================================[
# Options #
#]==============================================================================]

# CMake build type
if(NOT CMAKE_BUILD_TYPE MATCHES "^(Debug|Release|RelWithDebInfo)$")
message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.")
set(CMAKE_BUILD_TYPE
"RelWithDebInfo"
CACHE STRING "Choose the type of build." FORCE)
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "RelWithDebInfo")
endif()
message("Build type: " ${CMAKE_BUILD_TYPE})

# If your system uses a bespoke MPI compiler wrapper then define this on the
# command line using the MPIFORT_EXE and MPICC_EXE environment variables
if ((DEFINED ENV{MPIFORT_EXE}) AND (DEFINED ENV{MPICC_EXE}))
message("mpifort executable defined: " $ENV{MPIFORT_EXE})
message("Will assume system MPI implementation is sound. Remove MPIFORT_EXE from environment to automatically configure MPI")
set(CMAKE_Fortran_COMPILER $ENV{MPIFORT_EXE})
message("mpicc executable found: " $ENV{MPICC_EXE})
message("Will assume system MPI implementation is sound. Remove MPICC_EXE from environment to automatically configure MPI")
set(CMAKE_C_COMPILER $ENV{MPICC_EXE})
else ()
if(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU" AND (ENV{FC} STREQUAL "gfortran" AND ENV{CC} STREQUAL "gcc"))
# Use compiler wrappers if FC and CC are default values
SET( CMAKE_Fortran_COMPILER mpif90 )
SET( CMAKE_C_COMPILER mpicc )
endif()

# MOM5 build types
set(MOM5_TYPE "MOM5_SOLO" CACHE STRING "Build type of the model")

set(ALLOWED_TYPES MOM5_SOLO MOM5_SIS MOM5_ACCESS_CM MOM5_ACCESS_OM MOM5_ACCESS_ESM MOM5_ACCESS_OM_BGC)
if(NOT MOM5_TYPE IN_LIST ALLOWED_TYPES)
message(FATAL_ERROR "${MOM5_TYPE} is not a valid build type. Allowed types are: ${ALLOWED_TYPES}")
endif()
find_package(MPI REQUIRED COMPONENTS Fortran)
message(STATUS "Build type = ${MOM5_TYPE}")

message("Using Fortran: ${MPI_Fortran_COMPILER} ${CMAKE_Fortran_COMPILER} and C: ${MPI_C_COMPILER} ${CMAKE_C_COMPILER}")
# Build options
option(MOM5_USE_NETCDF3 "Use netCDF3 rather than netCDF4. Only relevant for MOM5_TYPEs that use internal FMS" OFF)
option(MOM5_DETERMINISTIC "Deterministic build" OFF)

if(CMAKE_Fortran_COMPILER_ID STREQUAL "Intel")
set(CMAKE_Fortran_FLAGS "-fno-alias -stack-temps -safe-cray-ptr -ftz -shared-intel -assume byterecl -i4 -r8 -nowarn -sox -traceback")
set(CMAKE_Fortran_FLAGS_RELEASE "-O2 -fp-model source")
set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "${CMAKE_Fortran_FLAGS_RELEASE} -g")
set(CMAKE_Fortran_FLAGS_DEBUG "-g -O0 -check -check noarg_temp_created -check nopointer -warn -warn noerrors -fpe0 -ftrapuv")
message(STATUS "Build options")
message(STATUS " - MOM5_USE_NETCDF3 ${MOM5_USE_NETCDF3}")
message(STATUS " - MOM5_DETERMINISTIC ${MOM5_DETERMINISTIC}" )

#[==============================================================================[
# Project configuration #
#]==============================================================================]

list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR})
include(CheckFortranCompilerFlag)

# Fortran compiler flags
if(CMAKE_Fortran_COMPILER_ID MATCHES "Intel")
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fno-alias -safe-cray-ptr -fpe0 -ftz -assume byterecl -i4 -r8 -nowarn -check noarg_temp_created -assume nobuffered_io -convert big_endian -grecord-gcc-switches -fp-model precise -fp-model source -align all")
if (MOM5_DETERMINISTIC)
set(CMAKE_Fortran_FLAGS_RELEASE "-g0 -O0 -xCORE-AVX2 -debug none -check none")
else()
set(CMAKE_Fortran_FLAGS_RELEASE "-g3 -O2 -xCORE-AVX2 -debug all -check none -traceback")
endif()
set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "${CMAKE_Fortran_FLAGS_RELEASE} -g")
set(CMAKE_Fortran_FLAGS_DEBUG "-g3 -O0 -debug all -check -check noarg_temp_created -check nopointer -warn -warn noerrors -ftrapuv -traceback")
elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
include(CheckFortranCompilerFlag)
set(CMAKE_Fortran_FLAGS "-fcray-pointer -fdefault-real-8 -fdefault-double-8 -Waliasing -ffree-line-length-none -fno-range-check -fbacktrace")
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fcray-pointer -fdefault-real-8 -ffree-line-length-none -fno-range-check -Waliasing -Wampersand -Warray-bounds -Wcharacter-truncation -Wconversion -Wline-truncation -Wintrinsics-std -Wsurprising -Wno-tabs -Wunderflow -Wunused-parameter -Wintrinsic-shadow -Wno-align-commons")
check_fortran_compiler_flag("-fallow-invalid-boz" _boz_flag)
check_fortran_compiler_flag("-fallow-argument-mismatch" _argmis_flag)
if(_boz_flag)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fallow-invalid-boz" )
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fallow-invalid-boz" )
endif()
if(_argmis_flag)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fallow-argument-mismatch" )
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fallow-argument-mismatch" )
endif()
set(CMAKE_Fortran_FLAGS_RELEASE "-O2 -fbounds-check")
set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "${CMAKE_Fortran_FLAGS_RELEASE} -g")
set(CMAKE_Fortran_FLAGS_DEBUG "-O0 -g -W -fbounds-check -ffpe-trap=invalid,zero,overflow")
set(CMAKE_Fortran_FLAGS_RELEASE "-O2")
set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "${CMAKE_Fortran_FLAGS_RELEASE} -g")
set(CMAKE_Fortran_FLAGS_DEBUG "-O0 -g -W -fbounds-check")
else ()
message ("Unknown Fortran compiler default flags only...")
message(WARNING "Fortran compiler with ID ${CMAKE_Fortran_COMPILER_ID} will be used with CMake default options")
endif()

execute_process(COMMAND nf-config --includedir OUTPUT_VARIABLE NETCDF_INCDIR OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND nf-config --flibs OUTPUT_VARIABLE NETCDF_FLIBS OUTPUT_STRIP_TRAILING_WHITESPACE)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -I${NETCDF_INCDIR}")
# set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${NETCDF_FLIBS}")

message("Linker flags: ${CMAKE_EXE_LINKER_FLAGS}")

if(CMAKE_C_COMPILER_ID STREQUAL "Intel")
set(CMAKE_C_FLAGS "-sox -traceback")
set(CMAKE_C_FLAGS_DEBUG "-O0 -debug")
set(CMAKE_C_FLAGS_RELEASE "-O2 -debug minimal")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} -g")
add_compile_definitions(__IFC)
# C compiler flags
if(CMAKE_C_COMPILER_ID STREQUAL "IntelLLVM")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fp-model precise")
if (MOM5_DETERMINISTIC)
set(CMAKE_C_FLAGS_RELEASE "-O0 -debug none -xCORE-AVX2")
else()
set(CMAKE_C_FLAGS_RELEASE "-O2 -debug minimal -xCORE-AVX2")
endif()
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} -g")
set(CMAKE_C_FLAGS_DEBUG "-O0 -g -ftrapuv -traceback")
elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fp-model precise -fp-model source")
if (MOM5_DETERMINISTIC)
set(CMAKE_C_FLAGS_RELEASE "-O0 -debug none -xCORE-AVX2")
else()
set(CMAKE_C_FLAGS_RELEASE "-O2 -debug minimal -xCORE-AVX2")
endif()
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} -g")
set(CMAKE_C_FLAGS_DEBUG "-O0 -g -ftrapuv -traceback")
elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU")
set(CMAKE_C_FLAGS "-frecord-gcc-switches")
set(CMAKE_C_FLAGS_DEBUG "-O0 -Werror -Wuninitialized -Wno-stringop-overflow")
set(CMAKE_C_FLAGS_RELEASE "-O2")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} -g")
set(CMAKE_C_FLAGS_RELEASE "-O2")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} -g")
set(CMAKE_C_FLAGS_DEBUG "-O0 -g")
else ()
message ("Unknown C compiler default flags only...")
message(WARNING "C compiler with ID ${CMAKE_C_COMPILER_ID} will be used with CMake default options")
endif()

#[==============================================================================[
# External packages #
#]==============================================================================]

find_package(MPI REQUIRED COMPONENTS Fortran)

if (MOM5_TYPE MATCHES "MOM5_ACCESS")
# External FMS, provides NetCDF interface
find_package(fms COMPONENTS R8 REQUIRED)
find_package(GFDLGTracers REQUIRED)
else()
# Internal FMS, requires NetCDF
find_package(NetCDF 4.7.3 REQUIRED Fortran)
endif()

if (MOM5_TYPE STREQUAL "MOM5_ACCESS_OM" OR
MOM5_TYPE STREQUAL "MOM5_ACCESS_OM_BGC")
find_package(libaccessom2 REQUIRED)
endif()
execute_process(COMMAND nc-config --cflags OUTPUT_VARIABLE NETCDF_CFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${NETCDF_CFLAGS}")

# Transfer command line setting of CPP defs to CMake
set(CPPDEFS
use_netCDF
use_netCDF3
use_netCDF4
use_libMPI
SPMD
ENABLE
ODA
USE_OCEAN_BGC
LAND_BND_TRACERS
OVERLOAD_C8
OVERLOAD_C4
OVERLOAD_R4
)
foreach(VAR ${CPPDEFS})
if(${VAR})
message("Setting CPP def ${VAR}")
add_compile_definitions(${VAR})
endif()
endforeach()

string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE)
message("Using Fortran flags: ${CMAKE_Fortran_FLAGS} ${CMAKE_Fortran_FLAGS_${BUILD_TYPE}}")
if (MOM5_TYPE STREQUAL "MOM5_ACCESS_ESM" OR
MOM5_TYPE STREQUAL "MOM5_ACCESS_CM")
find_package(PkgConfig REQUIRED)
pkg_check_modules(OASIS3MCT REQUIRED IMPORTED_TARGET "oasis3-mct")
pkg_check_modules(OASIS3MPEU REQUIRED IMPORTED_TARGET "oasis3-mpeu")
pkg_check_modules(OASIS3PSMILE REQUIRED IMPORTED_TARGET "oasis3-psmile.MPI1")
pkg_check_modules(OASIS3SCRIP REQUIRED IMPORTED_TARGET "oasis3-scrip")
endif()

set(CMAKE_DEBUG_TARGET_PROPERTIES
# INCLUDE_DIRECTORIES
# COMPILE_DEFINITIONS
# POSITION_INDEPENDENT_CODE
# CONTAINER_SIZE_REQUIRED
# LIB_VERSION
)
#[==============================================================================[
# Main definitions #
#]==============================================================================]

set(SRC_DIR "${CMAKE_SOURCE_DIR}/../src")

add_subdirectory(version)
add_subdirectory(FMS)
add_subdirectory(ocean)
add_subdirectory(atmos_bg)
add_subdirectory(atmos_ebm)
add_subdirectory(atmos_fv)
add_subdirectory(atmos_null)
add_subdirectory(atmos_phys)
add_subdirectory(land_null)
add_subdirectory(land_lad)
add_subdirectory(land_lad2)
add_subdirectory(ice_sis)
add_subdirectory(MOM5_solo)
add_subdirectory(MOM5_SIS)
add_subdirectory(MOM5_CM2M)
add_subdirectory(MOM5_ESM2M)
add_subdirectory(MOM5_ICCM)
add_subdirectory(MOM5_EBM)
add_compile_definitions(use_netCDF use_libMPI __IFC)

if (MOM5_USE_NETCDF3)
add_compile_definitions(use_netCDF3)
else ()
add_compile_definitions(use_netCDF4)
endif()

if (MOM5_TYPE STREQUAL "MOM5_ACCESS_OM")
set(ACCESS_COMPILE_DEFS ACCESS_OM USE_OCEAN_BGC)
elseif (MOM5_TYPE STREQUAL "MOM5_ACCESS_OM_BGC")
set(ACCESS_COMPILE_DEFS ACCESS_OM CSIRO_BGC)
elseif (MOM5_TYPE STREQUAL "MOM5_ACCESS_ESM")
set(ACCESS_COMPILE_DEFS ACCESS_CM USE_OCEAN_BGC)
elseif (MOM5_TYPE STREQUAL "MOM5_ACCESS_CM")
set(ACCESS_COMPILE_DEFS ACCESS_CM)
else()
add_compile_definitions(USE_OCEAN_BGC ENABLE_ODA SPMD LAND_BND_TRACERS)
endif()

if (MOM5_TYPE STREQUAL "MOM5_SOLO")
add_subdirectory(fms_mom5)
add_subdirectory(ocean)
add_subdirectory(mom5_solo)
elseif (MOM5_TYPE STREQUAL "MOM5_SIS")
add_subdirectory(fms_mom5)
add_subdirectory(ocean)
add_subdirectory(ice_sis)
add_subdirectory(atmos_null)
add_subdirectory(land_null)
add_subdirectory(mom5_sis)
elseif (MOM5_TYPE STREQUAL "MOM5_ACCESS_OM" OR
MOM5_TYPE STREQUAL "MOM5_ACCESS_OM_BGC")
add_subdirectory(ocean_access)
add_subdirectory(mom5_access_om)
elseif (MOM5_TYPE STREQUAL "MOM5_ACCESS_ESM" OR
MOM5_TYPE STREQUAL "MOM5_ACCESS_CM")
add_subdirectory(ocean_access)
add_subdirectory(mom5_access_cm)
endif()
15 changes: 0 additions & 15 deletions cmake/FMS/CMakeLists.txt

This file was deleted.

Loading
Loading