Skip to content

Commit eff66a4

Browse files
committed
Add NUOPC cap to parflow
* cmake option -DPARFLOW_ENABLE_NUOPC=ON * pass MPI communicator from cap to amps layer * add amps_EmbeddedInitFComm to convert fortran communicator to c for embedded applications * fix target_link_libraries for pfsimulator * fork wrf_parflow.c to cpl_parflow.c * add solver_mask in cpl_parflow.c * add cplparflowexport function * export specific and zmulit from cplparflowadvance * add ExportRichards function * add GetGrid2DRichards to solver_richards.c * add GetMaskRichards to solver_richards.c * update to cmake source dirs for embedded builds
1 parent 499ea44 commit eff66a4

25 files changed

+4618
-3
lines changed

CMakeLists.txt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ cmake_minimum_required (VERSION 3.14)
22

33
project (PARFLOW LANGUAGES C Fortran CXX)
44

5-
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/")
5+
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/")
66

77
#-----------------------------------------------------------------------------
88
# Set standard compiler flagsx
@@ -613,6 +613,13 @@ if ( ${PARFLOW_ENABLE_TOOLS} )
613613
add_subdirectory (pftools)
614614
endif ()
615615

616+
# Optionally build the NUOPC cap and ESMX
617+
option(PARFLOW_ENABLE_NUOPC "Enable building of the Parflow nuopc" "False")
618+
option(PARFLOW_ENABLE_ESMX "Enable building of ESMX" "False")
619+
if ( ${PARFLOW_ENABLE_NUOPC} OR ${PARFLOW_ENABLE_ESMX} )
620+
add_subdirectory (pfnuopc)
621+
endif ()
622+
616623
#-----------------------------------------------------------------------------
617624
# Setup CTEST environment
618625
#-----------------------------------------------------------------------------
@@ -623,7 +630,7 @@ if (PARFLOW_ENABLE_LATEX)
623630
add_subdirectory(docs/manuals)
624631
endif()
625632

626-
install (DIRECTORY ${CMAKE_BINARY_DIR}/config/ DESTINATION config)
633+
install (DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/config/ DESTINATION config)
627634

628635
#-----------------------------------------------------------------------------
629636
# Doxygen

pfnuopc/CMakeLists.txt

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
cmake_minimum_required (VERSION 3.5.2)
2+
3+
### Build Flags
4+
if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
5+
set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "${CMAKE_Fortran_FLAGS_RELWITHDEBINFO} -fbacktrace")
6+
set(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -O0 -fbacktrace -fcheck=all" )
7+
elseif(CMAKE_Fortran_COMPILER_ID MATCHES "Intel")
8+
set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "${CMAKE_Fortran_FLAGS_RELWITHDEBINFO} -traceback")
9+
set(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -O0 -traceback -check all")
10+
endif()
11+
12+
### Find and Include ESMF
13+
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/")
14+
find_package(ESMF MODULE REQUIRED)
15+
16+
### Include ESMF Compiler Options
17+
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${ESMF_F90COMPILEOPTS}")
18+
19+
set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/include)
20+
21+
### Library Files
22+
list(APPEND pf_nuopc_files
23+
src/pf_nuopc_cap.F90
24+
src/pf_nuopc_fields.F90
25+
src/pf_nuopc_grid.F90
26+
src/pf_nuopc_flags.F90
27+
)
28+
29+
### New Library: parflow_nuopc
30+
add_library(parflow_nuopc STATIC ${pf_nuopc_files})
31+
add_dependencies(parflow_nuopc pfsimulator)
32+
include_directories(parflow_nuopc include)
33+
target_link_libraries(parflow_nuopc PUBLIC ESMF)
34+
target_link_libraries(parflow_nuopc PUBLIC pfsimulator)
35+
36+
# configure fire behavior esmx executable
37+
if (PARFLOW_ENABLE_ESMX)
38+
if(ESMF_VERSION VERSION_LESS "8.5.0")
39+
message(FATAL_ERROR "ESMX requires ESMF version 8.5.0 or greater")
40+
endif (ESMF_VERSION VERSION_LESS "8.5.0")
41+
include(ExternalProject)
42+
ExternalProject_Add(esmx
43+
BINARY_DIR ${CMAKE_BINARY_DIR}/esmx
44+
SOURCE_DIR ${ESMF_ESMXDIR}
45+
CMAKE_ARGS -DESMX_BUILD_FILE=${CMAKE_CURRENT_SOURCE_DIR}/esmxBuild.yaml
46+
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
47+
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
48+
BUILD_ALWAYS TRUE
49+
DEPENDS parflow_nuopc
50+
EXCLUDE_FROM_ALL TRUE
51+
)
52+
endif (PARFLOW_ENABLE_ESMX)
53+
54+
### Install Library
55+
install(TARGETS parflow_nuopc
56+
EXPORT ParFlow
57+
LIBRARY DESTINATION lib
58+
ARCHIVE DESTINATION lib
59+
INCLUDES DESTINATION include
60+
)
61+
install(FILES ${CMAKE_Fortran_MODULE_DIRECTORY}/parflow_nuopc.mod
62+
DESTINATION include
63+
)
64+

pfnuopc/README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# ParFlow NUOPC Cap
2+
3+
The ParFlow NUOPC Cap is a ParFlow interface wrapper for the National Unified
4+
Operational Prediction Capability (NUOPC) coupling framework.
5+
6+
[NUOPC Documentation](http://earthsystemmodeling.org/nuopc/)
7+
8+
## Build
9+
Include -DPARFLOW\_ENABLE\_NUOPC=ON in cmake build
10+
```
11+
cmake <PARFLOW_SOURCE> \
12+
-DPARFLOW_ENABLE_NUOPC=ON
13+
```
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
# - Try to find ESMF
2+
#
3+
# Uses ESMFMKFILE to find the filepath of esmf.mk. If this is NOT set, then this
4+
# module will attempt to find esmf.mk. If ESMFMKFILE exists, then
5+
# ESMF_FOUND=TRUE and all ESMF makefile variables will be set in the global
6+
# scope. Optionally, set ESMF_MKGLOBALS to a string list to filter makefile
7+
# variables. For example, to globally scope only ESMF_LIBSDIR and ESMF_APPSDIR
8+
# variables, use this CMake command in CMakeLists.txt:
9+
#
10+
# set(ESMF_MKGLOBALS "LIBSDIR" "APPSDIR")
11+
12+
# Set ESMFMKFILE as defined by system env variable. If it's not explicitly set
13+
# try to find esmf.mk file in default locations (ESMF_ROOT, CMAKE_PREFIX_PATH,
14+
# etc)
15+
if(NOT DEFINED ESMFMKFILE)
16+
if(NOT DEFINED ENV{ESMFMKFILE})
17+
find_path(ESMFMKFILE_PATH esmf.mk PATH_SUFFIXES lib lib64)
18+
if(ESMFMKFILE_PATH)
19+
set(ESMFMKFILE ${ESMFMKFILE_PATH}/esmf.mk)
20+
message(STATUS "Found esmf.mk file ${ESMFMKFILE}")
21+
endif()
22+
else()
23+
set(ESMFMKFILE $ENV{ESMFMKFILE})
24+
endif()
25+
endif()
26+
27+
# Only parse the mk file if it is found
28+
if(EXISTS ${ESMFMKFILE})
29+
set(ESMFMKFILE ${ESMFMKFILE} CACHE FILEPATH "Path to esmf.mk file")
30+
set(ESMF_FOUND TRUE CACHE BOOL "esmf.mk file found" FORCE)
31+
32+
# Read the mk file
33+
file(STRINGS "${ESMFMKFILE}" esmfmkfile_contents)
34+
# Parse each line in the mk file
35+
foreach(str ${esmfmkfile_contents})
36+
# Only consider uncommented lines
37+
string(REGEX MATCH "^[^#]" def ${str})
38+
# Line is not commented
39+
if(def)
40+
# Extract the variable name
41+
string(REGEX MATCH "^[^=]+" esmf_varname ${str})
42+
# Extract the variable's value
43+
string(REGEX MATCH "=.+$" esmf_vardef ${str})
44+
# Only for variables with a defined value
45+
if(esmf_vardef)
46+
# Get rid of the assignment string
47+
string(SUBSTRING ${esmf_vardef} 1 -1 esmf_vardef)
48+
# Remove whitespace
49+
string(STRIP ${esmf_vardef} esmf_vardef)
50+
# A string or single-valued list
51+
if(NOT DEFINED ESMF_MKGLOBALS)
52+
# Set in global scope
53+
set(${esmf_varname} ${esmf_vardef})
54+
# Don't display by default in GUI
55+
mark_as_advanced(esmf_varname)
56+
else() # Need to filter global promotion
57+
foreach(m ${ESMF_MKGLOBALS})
58+
string(FIND ${esmf_varname} ${m} match)
59+
# Found the string
60+
if(NOT ${match} EQUAL -1)
61+
# Promote to global scope
62+
set(${esmf_varname} ${esmf_vardef})
63+
# Don't display by default in the GUI
64+
mark_as_advanced(esmf_varname)
65+
# No need to search for the current string filter
66+
break()
67+
endif()
68+
endforeach()
69+
endif()
70+
endif()
71+
endif()
72+
endforeach()
73+
74+
# Construct ESMF_VERSION from ESMF_VERSION_STRING_GIT
75+
# ESMF_VERSION_MAJOR and ESMF_VERSION_MINOR are defined in ESMFMKFILE
76+
set(ESMF_VERSION 0)
77+
set(ESMF_VERSION_PATCH ${ESMF_VERSION_REVISION})
78+
set(ESMF_BETA_RELEASE FALSE)
79+
if(ESMF_VERSION_BETASNAPSHOT MATCHES "^('T')$")
80+
set(ESMF_BETA_RELEASE TRUE)
81+
if(ESMF_VERSION_STRING_GIT MATCHES "^ESMF.*beta_snapshot")
82+
set(ESMF_BETA_SNAPSHOT ${ESMF_VERSION_STRING_GIT})
83+
elseif(ESMF_VERSION_STRING_GIT MATCHES "^v.\..\..b")
84+
set(ESMF_BETA_SNAPSHOT ${ESMF_VERSION_STRING_GIT})
85+
else()
86+
set(ESMF_BETA_SNAPSHOT 0)
87+
endif()
88+
message(STATUS "Detected ESMF Beta snapshot: ${ESMF_BETA_SNAPSHOT}")
89+
endif()
90+
set(ESMF_VERSION "${ESMF_VERSION_MAJOR}.${ESMF_VERSION_MINOR}.${ESMF_VERSION_PATCH}")
91+
92+
# Find the ESMF library
93+
if(USE_ESMF_STATIC_LIBS)
94+
find_library(ESMF_LIBRARY_LOCATION NAMES libesmf.a PATHS ${ESMF_LIBSDIR} NO_DEFAULT_PATH)
95+
if(ESMF_LIBRARY_LOCATION MATCHES "ESMF_LIBRARY_LOCATION-NOTFOUND")
96+
message(WARNING "Static ESMF library (libesmf.a) not found in \
97+
${ESMF_LIBSDIR}. Try setting USE_ESMF_STATIC_LIBS=OFF")
98+
endif()
99+
if(NOT TARGET ESMF)
100+
add_library(ESMF STATIC IMPORTED)
101+
endif()
102+
else()
103+
find_library(ESMF_LIBRARY_LOCATION NAMES esmf PATHS ${ESMF_LIBSDIR} NO_DEFAULT_PATH)
104+
if(ESMF_LIBRARY_LOCATION MATCHES "ESMF_LIBRARY_LOCATION-NOTFOUND")
105+
message(WARNING "ESMF library not found in ${ESMF_LIBSDIR}.")
106+
endif()
107+
if(NOT TARGET ESMF)
108+
add_library(ESMF UNKNOWN IMPORTED)
109+
endif()
110+
endif()
111+
112+
# Add ESMF include directories
113+
set(ESMF_INCLUDE_DIRECTORIES "")
114+
separate_arguments(_ESMF_F90COMPILEPATHS UNIX_COMMAND ${ESMF_F90COMPILEPATHS})
115+
foreach(_ITEM ${_ESMF_F90COMPILEPATHS})
116+
string(REGEX REPLACE "^-I" "" _ITEM "${_ITEM}")
117+
list(APPEND ESMF_INCLUDE_DIRECTORIES ${_ITEM})
118+
endforeach()
119+
120+
# Add ESMF link libraries
121+
string(STRIP "${ESMF_F90LINKRPATHS} ${ESMF_F90ESMFLINKRPATHS} ${ESMF_F90ESMFLINKPATHS} ${ESMF_F90LINKPATHS} ${ESMF_F90LINKLIBS} ${ESMF_F90LINKOPTS}" ESMF_INTERFACE_LINK_LIBRARIES)
122+
123+
# Finalize find_package
124+
include(FindPackageHandleStandardArgs)
125+
126+
find_package_handle_standard_args(
127+
${CMAKE_FIND_PACKAGE_NAME}
128+
REQUIRED_VARS ESMF_LIBRARY_LOCATION
129+
ESMF_INTERFACE_LINK_LIBRARIES
130+
ESMF_F90COMPILEPATHS
131+
VERSION_VAR ESMF_VERSION)
132+
133+
set_target_properties(ESMF PROPERTIES
134+
IMPORTED_LOCATION "${ESMF_LIBRARY_LOCATION}"
135+
INTERFACE_INCLUDE_DIRECTORIES "${ESMF_INCLUDE_DIRECTORIES}"
136+
INTERFACE_LINK_LIBRARIES "${ESMF_INTERFACE_LINK_LIBRARIES}")
137+
138+
else()
139+
set(ESMF_FOUND FALSE CACHE BOOL "esmf.mk file NOT found" FORCE)
140+
message(WARNING "ESMFMKFILE ${ESMFMKFILE} not found. Try setting ESMFMKFILE \
141+
to esmf.mk location.")
142+
endif()

pfnuopc/esmxBuild.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
application:
2+
exe_name: esmx_parflow
3+
4+
components:
5+
parflow:
6+
build_type: none
7+
cmake_config: ParFlow.cmake
8+
libraries: parflow_nuopc
9+
fort_module: parflow_nuopc.mod

pfnuopc/include/pf_nuopc_macros.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
!Define Defaults
2+
#define CONTEXT line = __LINE__, file = __FILE__
3+
#define PASSTHRU msg = ESMF_LOGERR_PASSTHRU, CONTEXT
4+
#define ESMF_STDERRORCHECK(rc) ESMF_LogFoundError(rcToCheck = rc, msg = ESMF_LOGERR_PASSTHRU, line = __LINE__, file = __FILE__)
5+
6+
!Define ESMF real kind to match Appplications single / double precision
7+
#if defined(REAL4)
8+
#define ESMF_KIND_FIELD ESMF_KIND_R4
9+
#define ESMF_KIND_COORD ESMF_KIND_R4
10+
#define ESMF_DEFAULT_VALUE 9.99e20_ESMF_KIND_R8
11+
#define ESMF_TYPEKIND_FIELD ESMF_TYPEKIND_R4
12+
#define ESMF_TYPEKIND_COORD ESMF_TYPEKIND_R4
13+
#elif defined(REAL8)
14+
#define ESMF_KIND_FIELD ESMF_KIND_R8
15+
#define ESMF_KIND_COORD ESMF_KIND_R8
16+
#define ESMF_DEFAULT_VALUE 9.99e20_ESMF_KIND_R8
17+
#define ESMF_TYPEKIND_FIELD ESMF_TYPEKIND_R8
18+
#define ESMF_TYPEKIND_COORD ESMF_TYPEKIND_R8
19+
#else
20+
#define ESMF_KIND_FIELD ESMF_KIND_R4
21+
#define ESMF_KIND_COORD ESMF_KIND_R8
22+
#define ESMF_DEFAULT_VALUE 9.99e20_ESMF_KIND_R8
23+
#define ESMF_TYPEKIND_FIELD ESMF_TYPEKIND_R4
24+
#define ESMF_TYPEKIND_COORD ESMF_TYPEKIND_R8
25+
#endif
26+

0 commit comments

Comments
 (0)