Skip to content
Open
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
55 changes: 38 additions & 17 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -155,18 +155,19 @@ set( USE_HDF5 OFF CACHE BOOL "USE_HDF5" )
set( USE_JASPER OFF CACHE BOOL "USE_JASPER" )
set( USE_PIO OFF CACHE BOOL "USE_PIO" )
set( USE_IPO OFF CACHE BOOL "USE_IPO" )


set( ENABLE_CHEM OFF CACHE BOOL "ENABLE_CHEM" )
set( ENABLE_CMAQ OFF CACHE BOOL "ENABLE_CMAQ" )
set( ENABLE_CTSM OFF CACHE BOOL "ENABLE_CTSM" )
set( ENABLE_DFI_RADAR OFF CACHE BOOL "ENABLE_DFI_RADAR" )
set( ENABLE_HYDRO OFF CACHE BOOL "ENABLE_HYDRO" )
set( ENABLE_KPP OFF CACHE BOOL "ENABLE_KPP" )
set( ENABLE_MARS OFF CACHE BOOL "ENABLE_MARS" )
set( ENABLE_TERRAIN OFF CACHE BOOL "ENABLE_TERRAIN" )
set( ENABLE_TITAN OFF CACHE BOOL "ENABLE_TITAN" )
set( ENABLE_VENUS OFF CACHE BOOL "ENABLE_VENUS" )
set( USE_PNETCDF OFF CACHE BOOL "USE_PNETCDF" )

set( ENABLE_PNETCDF_QUILT OFF CACHE BOOL "ENABLE_PNETCDF_QUILT" )
set( ENABLE_CHEM OFF CACHE BOOL "ENABLE_CHEM" )
set( ENABLE_CMAQ OFF CACHE BOOL "ENABLE_CMAQ" )
set( ENABLE_CTSM OFF CACHE BOOL "ENABLE_CTSM" )
set( ENABLE_DFI_RADAR OFF CACHE BOOL "ENABLE_DFI_RADAR" )
set( ENABLE_HYDRO OFF CACHE BOOL "ENABLE_HYDRO" )
set( ENABLE_KPP OFF CACHE BOOL "ENABLE_KPP" )
set( ENABLE_MARS OFF CACHE BOOL "ENABLE_MARS" )
set( ENABLE_TERRAIN OFF CACHE BOOL "ENABLE_TERRAIN" )
set( ENABLE_TITAN OFF CACHE BOOL "ENABLE_TITAN" )
set( ENABLE_VENUS OFF CACHE BOOL "ENABLE_VENUS" )

# What do these defines even do if they are always on????
set( USE_ALLOCATABLES ON CACHE BOOL "USE_ALLOCATABLES" )
Expand Down Expand Up @@ -286,6 +287,16 @@ if ( NOT ${WRFIO_NCD_NO_LARGE_FILE_SUPPORT} )
message( STATUS "netCDF large file support not suppressed, if available it will be used" )
endif()

# PnetCDF options require MPI
if ( ${ENABLE_PNETCDF_QUILT} AND NOT ${USE_PNETCDF} )
message( STATUS "PnetCDF Quilt IO requires PnetCDF" )
set( USE_PNETCDF ON CACHE BOOL "Required by configuration" FORCE )
endif()
if ( ${USE_PNETCDF} AND NOT ${USE_MPI} )
message( STATUS "PnetCDF require MPI usage" )
set( USE_MPI ON CACHE BOOL "Required by configuration" FORCE )
endif()

# Hydro option requires MPI
if ( ${ENABLE_HYDRO} AND NOT ${USE_MPI} )
message( STATUS "WRF Hydro requires MPI usage" )
Expand Down Expand Up @@ -521,6 +532,12 @@ endif()
# Will need our own finder
# find_package( GPFS REQUIRED )

# Find this first in case we need to use pnetcdf's netCDF
# Priority is given to pnetcdf due to performance
if ( ${USE_PNETCDF} )
find_package( PnetCDF REQUIRED )
endif()

# Included is a lightweight finder, but we really should switch to using UniData's netCDF cmake config
# The reason these are two separate and not COMPONENTS of one larger package is because that is the way UniData
# has laid out the cmake configs for each respective package
Expand All @@ -542,12 +559,10 @@ if ( NOT ${FORCE_NETCDF_CLASSIC} )
endif()
endif()

find_package( pnetCDF QUIET )

# Attempt to find zlib packaged with netcdf first
set( ZLIB_ROOT ${netCDF_PREFIX} )
find_package( ZLIB REQUIRED )
find_package( CURL REQUIRED )

################################################################################
##
Expand Down Expand Up @@ -763,6 +778,13 @@ else()
list( APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS WRF_USE_CLM )
endif()

if ( ${PnetCDF_FOUND} )
list( APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS PNETCDF )
endif()
if ( ${ENABLE_PNETCDF_QUILT} )
list( APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS PNETCDF_QUILT=1 )
endif()

# If force classic or no nc-4 support enable classic
if ( ${FORCE_NETCDF_CLASSIC} OR ( NOT ${netCDF_HAS_NC4} ) )
list( APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS NETCDF_classic=1 )
Expand Down Expand Up @@ -1075,7 +1097,6 @@ target_include_directories(
${PROJECT_SOURCE_DIR}/external/io_int

# Found Packages not handled through :: imported target
${pnetCDF_INCLUDE_DIRS}
)

# Configure core
Expand All @@ -1093,8 +1114,8 @@ target_link_options( ${PROJECT_NAME}_Core PRIVATE ${WRF_LINK_FLAGS} )

target_link_libraries( ${PROJECT_NAME}_Core
PUBLIC
netCDF::netcdff
${pnetCDF_LIBRARIES}
$<TARGET_NAME_IF_EXISTS:PnetCDF::pnetcdf>
$<TARGET_NAME_IF_EXISTS:netCDF::netcdff>
$<$<BOOL:${USE_MPI}>:$<TARGET_NAME_IF_EXISTS:MPI::MPI_Fortran>>
$<$<BOOL:${USE_OPENMP}>:$<TARGET_NAME_IF_EXISTS:OpenMP::OpenMP_Fortran>>
# This will add in target dependencies if they exist
Expand Down
156 changes: 156 additions & 0 deletions cmake/modules/FindPnetCDF.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
# Find pnetcdf
# Eventually replace with PnetCDF's actual config if using that
# Once found this file will define:
# PnetCDF_FOUND - System has pnetcdf
# PnetCDF_INCLUDE_DIRS - The pnetcdf include directories
# PnetCDF_LIBRARIES - The libraries needed to use pnetcdf
# PnetCDF_DEFINITIONS - Compiler switches required for using pnetcdf

# list( REMOVE_ITEM CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR} )
# find_package( PnetCDF )
# list( APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR} )


# exit early if we don't even need to be here
if ( PnetCDF_FOUND )
return()
endif()

# Use pnetcdf-config
find_program(
PNETCDF_PROGRAM
pnetcdf-config
QUIET
)

if ( ${PNETCDF_PROGRAM} MATCHES "-NOTFOUND$" )
message( STATUS "No pnetcdf-config found" )
else()
message( STATUS "Found PNETCDF_PROGRAM : ${PNETCDF_PROGRAM}" )

execute_process( COMMAND ${PNETCDF_PROGRAM} --includedir OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE PnetCDF_INCLUDE_DIR )
execute_process( COMMAND ${PNETCDF_PROGRAM} --prefix OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE PnetCDF_PREFIX )
execute_process( COMMAND ${PNETCDF_PROGRAM} --libdir OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE PnetCDF_LIBDIR )
execute_process( COMMAND ${PNETCDF_PROGRAM} --version OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE PnetCDF_VERSION_RAW )

# These are what PnetCDF was built with
execute_process( COMMAND ${PNETCDF_PROGRAM} --ldflags OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE PnetCDF_LDFLAGS )
execute_process( COMMAND ${PNETCDF_PROGRAM} --libs OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE PnetCDF_BUILD_LIBS )

# Sanitize version
string( REPLACE " " ";" PnetCDF_VERSION_LIST ${PnetCDF_VERSION_RAW} )
list( GET PnetCDF_VERSION_LIST -1 PnetCDF_VERSION )

# These do not pull all options available from nc-config out, but rather mirrors what is available from PnetCDFConfig.cmake.in
set(
PnetCDF_QUERY_YES_OPTIONS
has-c++
has-fortran
netcdf4
adios
)

foreach( PN_QUERY ${PnetCDF_QUERY_YES_OPTIONS} )
string( REPLACE "has-" "" PN_QUERY_FILTERED ${PN_QUERY} )
execute_process( COMMAND ${PNETCDF_PROGRAM} --${PN_QUERY} OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE PnetCDF_${PN_QUERY_FILTERED}_LOWERCASE )
if ( "${PnetCDF_${PN_QUERY_FILTERED}_LOWERCASE}" STREQUAL "" )
# might be empty
set( PnetCDF_${PN_QUERY_FILTERED}_LOWERCASE no )
endif()

string( TOUPPER ${PN_QUERY_FILTERED} PN_QUERY_UPPERCASE )
string( TOUPPER ${PnetCDF_${PN_QUERY_FILTERED}_LOWERCASE} PN_ANSWER_UPPERCASE )

set( PN_QUERY_YES_RESPONSE YES ENABLED )
list( FIND PN_QUERY_YES_RESPONSE ${PN_ANSWER_UPPERCASE} PN_FIND_ANSWER )
if ( ${PN_FIND_ANSWER} EQUAL -1 )
set( PN_ANSWER_UPPERCASE NO )
else()
set( PN_ANSWER_UPPERCASE YES )
endif()

# Convert to PnetCDF_HAS_* = YES/NO - Note this cannot be generator expression if you want to use it during configuration time
set( PnetCDF_HAS_${PN_QUERY_UPPERCASE} ${PN_ANSWER_UPPERCASE} )
endforeach()

# Because we may need this for in-situ manual preprocessing do not use genex
set( PnetCDF_INCLUDE_DIRS ${PnetCDF_INCLUDE_DIR} )

# Find the actual name of the library
find_library(
PnetCDF_LIBRARY
pnetcdf
PATHS ${PnetCDF_LIBDIR}
NO_DEFAULT_PATH
)

set( PnetCDF_DEFINITIONS )
set( PnetCDF_LIBRARIES ${PnetCDF_LIBRARY} )
endif()

include(FindPackageHandleStandardArgs)

# handle the QUIETLY and REQUIRED arguments and set PnetCDF_FOUND to TRUE
# if all listed variables are TRUE
find_package_handle_standard_args(
PnetCDF
FOUND_VAR PnetCDF_FOUND
REQUIRED_VARS
PnetCDF_INCLUDE_DIRS
PnetCDF_LIBRARIES
PnetCDF_VERSION
VERSION_VAR PnetCDF_VERSION
HANDLE_VERSION_RANGE
)

if ( PnetCDF_FOUND AND NOT TARGET PnetCDF::pnetcdf )
if ( ${PnetCDF_HAS_NETCDF4} )
list( APPEND CMAKE_MESSAGE_INDENT " " )
if ( NOT "${PnetCDF_LDFLAGS}" STREQUAL "" )
# Find prefix
message( STATUS "Looking for netCDF location provided by ${PNETCDF_PROGRAM}")
foreach( PNETCDF_BUILD_LINK_DIR ${PnetCDF_LDFLAGS} )
string( REGEX MATCH "^-L([^ ]*)" PN_LIBRARY_LINK_LOCATION_TMP ${PNETCDF_BUILD_LINK_DIR} )
if ( NOT "${PN_LIBRARY_LINK_LOCATION_TMP}" STREQUAL "" )
message( STATUS "Searching ${PN_LIBRARY_LINK_LOCATION_TMP}..." )
set( PN_LIBRARY_LINK_DIR ${CMAKE_MATCH_1} )
find_library(
netCDF_LIBRARY_FOR_PNETCDF
netcdf
PATHS ${PN_LIBRARY_LINK_DIR}
NO_DEFAULT_PATH
)
if ( NOT "${netCDF_LIBRARY_FOR_PNETCDF}" MATCHES "-NOTFOUND$" )
string( REGEX REPLACE "/(lib|lib64)$" "" netCDF_ROOT ${PN_LIBRARY_LINK_DIR} )
message( STATUS "Using ${netCDF_ROOT} as prefix for netCDF requirements of PnetCDF" )
break()
endif() # found netcdf location
endif() # found valid link library location
endforeach() # looped over ldflags built with
endif() # see if we should use the built-with ldflags
list( POP_BACK CMAKE_MESSAGE_INDENT )
find_package( netCDF REQUIRED )
endif()

set( PNETCDF_LINK_INTERFACE_LANGUAGES )
list( APPEND PNETCDF_LINK_INTERFACE_LANGUAGES C )
if ( ${PnetCDF_HAS_CXX} )
list( APPEND PNETCDF_LINK_INTERFACE_LANGUAGES CXX )
endif()
if( ${PnetCDF_HAS_FORTRAN} )
list( APPEND PNETCDF_LINK_INTERFACE_LANGUAGES Fortran )
endif()
add_library( PnetCDF::pnetcdf UNKNOWN IMPORTED )
set_target_properties(
PnetCDF::pnetcdf
PROPERTIES
IMPORTED_LOCATION "${PnetCDF_LIBRARY}"
IMPORTED_LINK_INTERFACE_LANGUAGES "${PNETCDF_LINK_INTERFACE_LANGUAGES}"
INTERFACE_INCLUDE_DIRECTORIES "${PnetCDF_INCLUDE_DIRS}"
)
if ( ${PnetCDF_HAS_NETCDF4} )
target_link_libraries( PnetCDF::pnetcdf INTERFACE netCDF::netcdf )
endif()
endif()

mark_as_advanced( PnetCDF_FLIBS PnetCDF_PREFIX PnetCDF_LIBRARY_DIR )
90 changes: 0 additions & 90 deletions cmake/modules/FindpnetCDF.cmake

This file was deleted.

2 changes: 1 addition & 1 deletion external/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ if ( ${netCDF_HAS_PARALLEL} AND ${USE_MPI} )
add_subdirectory( io_netcdfpar )
endif()

if ( ${pnetCDF_FOUND} )
if ( ${PnetCDF_FOUND} )
message( STATUS "Adding [io_pnetcdf] to configuration" )
add_subdirectory( io_pnetcdf )
endif()
Expand Down
11 changes: 5 additions & 6 deletions external/io_pnetcdf/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,18 @@ set_target_properties(

target_link_libraries( ${FOLDER_COMPILE_TARGET}
PRIVATE
${netCDF_LIBRARIES}
${pnetCDF_LIBRARIES}
$<$<BOOL:${USE_MPI}>:$<TARGET_NAME_IF_EXISTS:MPI::MPI_Fortran>>
$<$<BOOL:${USE_OPENMP}>:$<TARGET_NAME_IF_EXISTS:OpenMP::OpenMP_Fortran>>
PnetCDF::pnetcdf
)

target_include_directories( ${FOLDER_COMPILE_TARGET}
PUBLIC
$<TARGET_PROPERTY:${FOLDER_COMPILE_TARGET},Fortran_MODULE_DIRECTORY>
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/external/ioapi_share>
$<INSTALL_INTERFACE:include/external/ioapi_share>
PRIVATE
${netCDF_INCLUDE_DIRS}
${pnetCDF_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/../ioapi_share
${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET}
)


Expand Down
2 changes: 1 addition & 1 deletion external/io_pnetcdf/ext_pnc_get_dom_ti.code
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
use ext_pnc_support_routines
implicit none
include 'wrf_status_codes.h'
# include "pnetcdf.inc"
include "pnetcdf.inc"
integer ,intent(in) :: DataHandle
character*(*) ,intent(in) :: Element
TYPE_DATA
Expand Down
Loading