diff --git a/.gitignore b/.gitignore index ff3b85816..2dc827ccf 100644 --- a/.gitignore +++ b/.gitignore @@ -12,12 +12,10 @@ build/ install/ -*.[ao] +*.[aox] *.mod *.so *.exe -*.x *.swp configure.upp* -*.a diff --git a/.gitmodules b/.gitmodules index 9d045ee2a..f387f5779 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,7 @@ +[submodule "CMakeModules"] + path = CMakeModules + url = https://github.com/noaa-emc/CMakeModules + branch = develop [submodule "comupp/src/lib/crtm2"] path = sorc/comlibs/crtm2 url = https://github.com/NCAR/UPP_CRTM -[submodule "cmake"] - path = cmake - url = https://github.com/NOAA-EMC/CMakeModules - branch = release/public-v1 diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b3a8ebe0..d4d8a5ba1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,22 +1,17 @@ cmake_minimum_required(VERSION 3.15) -file(STRINGS "VERSION" pVersion) +file(STRINGS "VERSION" pVersion LIMIT_COUNT 1) project( - ncep_post + nceppost VERSION ${pVersion} LANGUAGES Fortran) -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/") - -if(POLICY CMP0054) - cmake_policy(SET CMP0054 NEW) -endif() -if(POLICY CMP0012) - cmake_policy(SET CMP0012 NEW) -endif() +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/Modules") option(OPENMP "use OpenMP threading" OFF) +option(BUILD_POSTEXEC "Build NCEPpost executable" ON) +option(BUILD_WITH_WRFLIB "Build NCEPpost with WRF library" OFF) if(NOT CMAKE_BUILD_TYPE MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel)$") message(STATUS "Setting build type to 'Release' as none was specified.") @@ -32,64 +27,33 @@ if(NOT CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel|GNU|Clang|AppleClang)$") endif() find_package(MPI REQUIRED) -find_package(PNG REQUIRED) -find_package(Jasper REQUIRED) -find_package(NetCDF MODULE REQUIRED) +find_package(NetCDF REQUIRED COMPONENTS Fortran) if(OPENMP) find_package(OpenMP REQUIRED COMPONENTS Fortran) endif() -set(CMAKE_FIND_PACKAGE_PREFER_CONFIG true) - -if(NOT TARGET sigio_4) - find_package(sigio REQUIRED) -endif() - -if(NOT TARGET w3nco_4) - find_package(w3nco REQUIRED) -endif() - -if(NOT TARGET g2_4) - find_package(g2 REQUIRED) -endif() - -if(NOT TARGET g2tmpl) - find_package(g2tmpl REQUIRED) -endif() - -if(NOT TARGET bacio_4) - find_package(bacio REQUIRED) +if(BUILD_WITH_WRFLIB) + find_package(wrf REQUIRED) +else() + set(wrf_FOUND FALSE) endif() -if(NOT TARGET ip_4) - find_package(ip REQUIRED) -endif() - -if(NOT TARGET sp_4) - find_package(sp REQUIRED) -endif() +find_package(w3nco REQUIRED) +find_package(g2 REQUIRED) +find_package(g2tmpl REQUIRED) +find_package(bacio REQUIRED) +find_package(ip REQUIRED) +find_package(sp REQUIRED) +find_package(w3emc REQUIRED) +find_package(crtm REQUIRED) -if(NOT TARGET sfcio_4) +if(BUILD_POSTEXEC) + find_package(sigio REQUIRED) find_package(sfcio REQUIRED) -endif() - -if(NOT TARGET nemsio) find_package(nemsio REQUIRED) -endif() - -if(NOT TARGET gfsio_4) find_package(gfsio REQUIRED) endif() -if(NOT TARGET w3emc_4) - find_package(w3emc REQUIRED) -endif() - -if(NOT TARGET crtm) - find_package(crtm REQUIRED) -endif() - add_subdirectory(sorc) - -install(FILES parm/postxconfig-NT-GFS.txt parm/postxconfig-NT-GFS-F00.txt DESTINATION share) +add_subdirectory(parm) diff --git a/CMakeModules b/CMakeModules new file mode 160000 index 000000000..fece613c2 --- /dev/null +++ b/CMakeModules @@ -0,0 +1 @@ +Subproject commit fece613c2968bf1000e9b57e6bfc526169063a7f diff --git a/VERSION b/VERSION index 3eefcb9dd..64a3d8066 100644 --- a/VERSION +++ b/VERSION @@ -1 +1,3 @@ -1.0.0 +9.9.9 +# This is a placeholder version number. +# It will be replaced with an appropriate version following a discussion within the UPP management. diff --git a/cmake b/cmake deleted file mode 160000 index b605db0df..000000000 --- a/cmake +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b605db0df4f8fb1110aaba989dbffad5312752b9 diff --git a/cmake/PackageConfig.cmake.in b/cmake/PackageConfig.cmake.in new file mode 100644 index 000000000..131d97f7e --- /dev/null +++ b/cmake/PackageConfig.cmake.in @@ -0,0 +1,43 @@ +@PACKAGE_INIT@ + +#@PROJECT_NAME@-config.cmake +# +# Imported interface targets provided: +# * @PROJECT_NAME@::@PROJECT_NAME@ - library target + +# Include targets file. This will create IMPORTED target @PROJECT_NAME@ +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-config-version.cmake") +include(CMakeFindDependencyMacro) + +find_dependency(MPI) + +# ON/OFF implies @PROJECT_NAME@ was compiled with/without OpenMP +if(@OPENMP@) + find_dependency(OpenMP COMPONENTS Fortran) +endif() + +find_dependency(NetCDF COMPONENTS Fortran) + +find_dependency(w3nco CONFIG) +find_dependency(g2 CONFIG) +find_dependency(g2tmpl CONFIG) +find_dependency(bacio CONFIG) +find_dependency(ip CONFIG) +find_dependency(sp CONFIG) +find_dependency(w3emc CONFIG) +find_dependency(crtm CONFIG) + +# nceppost library does not depend on these, the executable does. +#find_dependency(sigio CONFIG) +#find_dependency(sfcio CONFIG) +#find_dependency(nemsio CONFIG) +#find_dependency(gfsio CONFIG) + +# Get the build type from library target +get_target_property(@PROJECT_NAME@_BUILD_TYPES @PROJECT_NAME@::@PROJECT_NAME@ IMPORTED_CONFIGURATIONS) + +check_required_components("@PROJECT_NAME@") + +get_target_property(location @PROJECT_NAME@::@PROJECT_NAME@ LOCATION) +message(STATUS "Found @PROJECT_NAME@: ${location} (found version \"${PACKAGE_VERSION}\")") diff --git a/parm/CMakeLists.txt b/parm/CMakeLists.txt new file mode 100644 index 000000000..64e8bd8fc --- /dev/null +++ b/parm/CMakeLists.txt @@ -0,0 +1,5 @@ +list(APPEND parmfiles + postxconfig-NT-GFS.txt + postxconfig-NT-GFS-F00.txt) + +install(FILES ${parmfiles} DESTINATION share) diff --git a/sorc/ncep_post.fd/CMakeLists.txt b/sorc/ncep_post.fd/CMakeLists.txt index e3cd549bb..2578afad8 100644 --- a/sorc/ncep_post.fd/CMakeLists.txt +++ b/sorc/ncep_post.fd/CMakeLists.txt @@ -1,15 +1,16 @@ -set(LIB_SRC +list(APPEND LIB_SRC AllGETHERV_GSD.f ALLOCATE_ALL.f - ASSIGNNEMSIOVAR.f AVIATION.f BNDLYR.f BOUND.f CALCAPE.f + CALCAPE2.f CALDRG.f CALDWP.f CALGUST.f CALHEL.f + CALHEL2.f CALLCL.f CALMCVG.f CALMICT.f @@ -27,6 +28,7 @@ set(LIB_SRC CALTAU.f CALTHTE.f CALUPDHEL.f + CALVESSEL.f CALVIS.f CALVIS_GSD.f CALVOR.f @@ -48,6 +50,7 @@ set(LIB_SRC DEALLOCATE.f DEWPOINT.f ETCALC.f + ETAMP_Q2F.f EXCH2.f EXCH.f FDLVL.f @@ -59,10 +62,7 @@ set(LIB_SRC GEO_ZENITH_ANGLE.f GET_BITS.f GETGBANDSCATTER.f - getIVariableN.f - GETNEMSNDSCATTER.f get_postfilename.f - getVariable.f GFIP3.f GFSPOST.F GPVS.f @@ -78,15 +78,6 @@ set(LIB_SRC gtg_indices.f90 gtg_smoothseams.f90 ICAOHEIGHT.f - INITPOST.F - INITPOST_GFS.f - INITPOST_GFS_NEMS.f - INITPOST_GFS_NEMS_MPIIO.f - INITPOST_GFS_SIGIO.f - INITPOST_NEMS.f - INITPOST_NEMS_MPIIO.f - INITPOST_NETCDF.f - INITPOST_NMM.f kinds_mod.F LFMFLD.f LFMFLD_GFS.f @@ -99,6 +90,7 @@ set(LIB_SRC MDL2P.f MDL2SIGMA2.f MDL2SIGMA.f + MDL2STD_P.f MDL2THANDPV.f MDLFLD.f MICROINIT.F @@ -148,28 +140,46 @@ set(LIB_SRC VRBLS4D_mod.f WETBULB.f WETFRZLVL.f - wrf_io_flags.f - wrf_io_flags.h xml_perl_data.f ZENSUN.f) -set(EXE_SRC - CALCAPE2.f - CALHEL2.f - CALVESSEL.f +list(APPEND EXE_SRC + ASSIGNNEMSIOVAR.f + GETNEMSNDSCATTER.f GFSPOSTSIG.F + INITPOST.F + INITPOST_GFS.f + INITPOST_GFS_NEMS.f + INITPOST_GFS_NEMS_MPIIO.f INITPOST_GFS_NETCDF.f - MDL2STD_P.f + INITPOST_GFS_NETCDF_PARA.f + INITPOST_GFS_SIGIO.f + INITPOST_NEMS.f + INITPOST_NEMS_MPIIO.f + INITPOST_NETCDF.f + INITPOST_NMM.f TIMEF.f WRFPOST.f + getIVariableN.f + getVariable.f getlvls.f intio_tags.f + native_endianness.f + retrieve_index.f + wrf_io_flags.f + wrf_io_flags.h) + +# Use IO stubs in place of WRFLIB +if(NOT wrf_FOUND) + list(APPEND EXE_SRC io_int_stubs.f) +endif() if(CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel)$") set(CMAKE_Fortran_FLAGS "-g -traceback -fp-model source -free -convert big_endian") set(CMAKE_Fortran_FLAGS_RELEASE "-O3") + set(CMAKE_Fortran_FLAGS_DEBUG "-O0") elseif(CMAKE_Fortran_COMPILER_ID MATCHES "^(GNU|Clang|AppleClang)$") set(CMAKE_Fortran_FLAGS "-g -fbacktrace -ffree-form -ffree-line-length-none -fconvert=big-endian") @@ -177,54 +187,81 @@ elseif(CMAKE_Fortran_COMPILER_ID MATCHES "^(GNU|Clang|AppleClang)$") set(CMAKE_Fortran_FLAGS_DEBUG "-O0 -ggdb -fno-unsafe-math-optimizations -frounding-math -fsignaling-nans -ffpe-trap=invalid,zero,overflow -fbounds-check") endif() -if(APPLE) - add_compile_definitions(APPLE) -elseif(UNIX) - add_compile_definitions(LINUX) -endif() - -set(LIBNAME nceppost) -set(EXENAME ncep_post) +set(LIBNAME "nceppost") +set(EXENAME "nceppost.x") set(module_dir "${CMAKE_CURRENT_BINARY_DIR}/include") -add_library(${LIBNAME} ${LIB_SRC}) +add_library(${LIBNAME} STATIC ${LIB_SRC}) +add_library(${PROJECT_NAME}::${LIBNAME} ALIAS ${LIBNAME}) + set_target_properties(${LIBNAME} PROPERTIES Fortran_MODULE_DIRECTORY ${module_dir}) -target_include_directories(${LIBNAME} PUBLIC ${NETCDF_INCLUDES} ${module_dir}) -target_link_libraries( - ${LIBNAME} - sp_4 - sigio_4 - sfcio_4 - gfsio_4 - nemsio - ip_4 - w3emc_4 - w3nco_4 - g2tmpl - g2_4 - crtm - bacio_4 + +target_include_directories(${LIBNAME} INTERFACE + $ + $) + +target_link_libraries(${LIBNAME} PUBLIC + bacio::bacio_4 + crtm::crtm + g2::g2_4 + g2tmpl::g2tmpl + ip::ip_4 MPI::MPI_Fortran - PNG::PNG - ${JASPER_LIBRARY}) + NetCDF::NetCDF_Fortran) + +target_link_libraries(${LIBNAME} PRIVATE + sp::sp_4 + w3emc::w3emc_4 + w3nco::w3nco_4) if(OpenMP_Fortran_FOUND) - target_link_libraries(${LIBNAME} OpenMP::OpenMP_Fortran) + target_link_libraries(${LIBNAME} PUBLIC OpenMP::OpenMP_Fortran) +endif() + +if(BUILD_POSTEXEC) + add_executable(${EXENAME} ${EXE_SRC}) + target_link_libraries(${EXENAME} PRIVATE + ${LIBNAME} + gfsio::gfsio + nemsio::nemsio + sfcio::sfcio + sigio::sigio) + install(TARGETS ${EXENAME} RUNTIME DESTINATION bin) endif() +install(DIRECTORY ${module_dir} DESTINATION ${CMAKE_INSTALL_PREFIX}) + install( TARGETS ${LIBNAME} + EXPORT ${PROJECT_NAME}Exports + RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) -install(DIRECTORY ${module_dir} DESTINATION ${CMAKE_INSTALL_PREFIX}) -add_executable(${EXENAME} ${EXE_SRC}) -target_link_libraries( - ${EXENAME} - ${LIBNAME} - ${NETCDF_LIBRARIES} - ${CMAKE_DL_LIBS}) +### Package config +include(CMakePackageConfigHelpers) +set(CONFIG_INSTALL_DESTINATION lib/cmake/${PROJECT_NAME}) + +export(EXPORT ${PROJECT_NAME}Exports + NAMESPACE ${PROJECT_NAME}:: + FILE ${PROJECT_NAME}-targets.cmake) + +configure_package_config_file( + ${CMAKE_SOURCE_DIR}/cmake/PackageConfig.cmake.in ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-config.cmake + INSTALL_DESTINATION ${CONFIG_INSTALL_DESTINATION}) +install(FILES ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-config.cmake + DESTINATION ${CONFIG_INSTALL_DESTINATION}) + +write_basic_package_version_file( + ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY AnyNewerVersion) +install(FILES ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake + DESTINATION ${CONFIG_INSTALL_DESTINATION}) -install(TARGETS ${EXENAME} RUNTIME DESTINATION bin) +install(EXPORT ${PROJECT_NAME}Exports + NAMESPACE ${PROJECT_NAME}:: + FILE ${PROJECT_NAME}-targets.cmake + DESTINATION ${CONFIG_INSTALL_DESTINATION}) diff --git a/sorc/ncep_post.fd/io_int_stubs.f b/sorc/ncep_post.fd/io_int_stubs.f old mode 100755 new mode 100644 diff --git a/sorc/ncep_post.fd/makefile_module b/sorc/ncep_post.fd/makefile_module old mode 100755 new mode 100644