From a16435981f21565b915ccfdcde6c7d74173f2f07 Mon Sep 17 00:00:00 2001 From: Mark Petersen Date: Fri, 1 Nov 2019 07:49:22 -0600 Subject: [PATCH 1/6] Add cmake files to framework --- src/CMakeLists.txt | 136 ++++++++++++++++++++++++++++++++++++++++++ src/build_core.cmake | 106 ++++++++++++++++++++++++++++++++ src/cmake_utils.cmake | 74 +++++++++++++++++++++++ 3 files changed, 316 insertions(+) create mode 100644 src/CMakeLists.txt create mode 100644 src/build_core.cmake create mode 100644 src/cmake_utils.cmake diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000000..6d3b6a32ff --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,136 @@ +include(${CASEROOT}/Macros.cmake) + +# +# General setup +# + +if (USE_ESMF_LIB) + set(ESMFDIR "esmf") +else() + set(ESMFDIR "noesmf") +endif() + +set(CMAKE_C_COMPILER ${MPICC}) +set(CMAKE_CXX_COMPILER ${MPICXX}) +set(CMAKE_Fortran_COMPILER ${MPIFC}) +set(CMAKE_EXE_LINKER_FLAGS "${LDFLAGS}") +set(CMAKE_VERBOSE_MAKEFILE TRUE) + +# Set up CPPDEFS +set(FILE_OFFSET "-DOFFSET64BIT") +if (CPPDEFS) + separate_arguments(CPPDEFS UNIX_COMMAND "${CPPDEFS}") +endif() +list(APPEND CPPDEFS "-DMPAS_NO_LOG_REDIRECT" "-DUSE_PIO2" "-DMPAS_NO_ESMF_INIT" "-DMPAS_ESM_SHR_CONST" "-DMPAS_PERF_MOD_TIMERS" "${MODEL_FORMULATION}" "${FILE_OFFSET}" "${ZOLTAN_DEFINE}" "-D_MPI" "-DMPAS_NAMELIST_SUFFIX=${NAMELIST_SUFFIX}" "-DMPAS_EXE_NAME=${EXE_NAME}") +if (DEBUG) + list(APPEND CPPDEFS "-DMPAS_DEBUG") +endif() +if (compile_threaded) + list(APPEND CPPDEFS "-DMPAS_OPENMP") +endif() + +set(INCLUDES "${INSTALL_SHAREDPATH}/include" "${INSTALL_SHAREDPATH}/${COMP_INTERFACE}/${ESMFDIR}/${NINST_VALUE}/csm_share" "${INSTALL_SHAREDPATH}/pio" "${PNETCDF_PATH}/include" "${CMAKE_CURRENT_SOURCE_DIR}/external/ezxml" "${CMAKE_BINARY_DIR}/framework" "${CMAKE_BINARY_DIR}/operators") +if (NETCDF_PATH) + list(APPEND INCLUDES ${NETCDF_PATH}/include) +else() + if (NETCDF_C_PATH) + list(APPEND INCLUDES ${NETCDF_C_PATH}/include) + endif() + if (NETCDF_FORTRAN_PATH) + list(APPEND INCLUDES ${NETCDF_FORTRAN_PATH}/include) + endif() +endif() + +if (USE_KOKKOS) + include(${INSTALL_SHAREDPATH}/kokkos_generated_settings.cmake) + string (REPLACE ";" " " KOKKOS_CXXFLAGS_STR "${KOKKOS_CXXFLAGS}") + set(CXXFLAGS "${CXXFLAGS} ${KOKKOS_CXXFLAGS_STR}") +endif() + +set(CMAKE_Fortran_FLAGS "${FFLAGS}") +set(CMAKE_C_FLAGS "${CFLAGS}") +set(CMAKE_CXX_FLAGS "${CXXFLAGS}") + +# Make build tools +set(CMAKE_C_COMPILER ${SCC}) + +add_executable(streams_gen tools/input_gen/streams_gen.c tools/input_gen/test_functions.c external/ezxml/ezxml.c) +add_executable(namelist_gen tools/input_gen/namelist_gen.c tools/input_gen/test_functions.c external/ezxml/ezxml.c) +add_executable(parse tools/registry/parse.c tools/registry/dictionary.c tools/registry/gen_inc.c tools/registry/fortprintf.c tools/registry/utility.c external/ezxml/ezxml.c) + +foreach(EXEITEM streams_gen namelist_gen parse) + target_compile_definitions(${EXEITEM} PRIVATE ${CPPDEFS}) + target_compile_options(${EXEITEM} PRIVATE "-Uvector") + target_include_directories(${EXEITEM} PRIVATE ${INCLUDES}) +endforeach() + +set(CMAKE_C_COMPILER ${MPICC}) + +# Gather sources that are needed for all cores + +# externals +set(COMMON_RAW_SOURCES external/ezxml/ezxml.c) + +# framework +list(APPEND COMMON_RAW_SOURCES + framework/mpas_kind_types.F + framework/mpas_framework.F + framework/mpas_timer.F + framework/mpas_timekeeping.F + framework/mpas_constants.F + framework/mpas_attlist.F + framework/mpas_hash.F + framework/mpas_sort.F + framework/mpas_block_decomp.F + framework/mpas_block_creator.F + framework/mpas_dmpar.F + framework/mpas_abort.F + framework/mpas_decomp.F + framework/mpas_threading.F + framework/mpas_io.F + framework/mpas_io_streams.F + framework/mpas_bootstrapping.F + framework/mpas_io_units.F + framework/mpas_stream_manager.F + framework/mpas_stream_list.F + framework/mpas_forcing.F + framework/mpas_c_interfacing.F + framework/random_id.c + framework/pool_hash.c + framework/mpas_derived_types.F + framework/mpas_domain_routines.F + framework/mpas_field_routines.F + framework/mpas_pool_routines.F + framework/xml_stream_parser.c + framework/regex_matching.c + framework/mpas_field_accessor.F + framework/mpas_log.F +) + +# operators +list(APPEND COMMON_RAW_SOURCES + operators/mpas_vector_operations.F + operators/mpas_matrix_operations.F + operators/mpas_tensor_operations.F + operators/mpas_rbf_interpolation.F + operators/mpas_vector_reconstruction.F + operators/mpas_spline_interpolation.F + operators/mpas_tracer_advection_helpers.F + operators/mpas_tracer_advection_mono.F + operators/mpas_tracer_advection_std.F + operators/mpas_geometry_utils.F +) + +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake_utils.cmake) +include(${CMAKE_CURRENT_SOURCE_DIR}/build_core.cmake) + +add_library(common OBJECT) +target_compile_definitions(common PRIVATE ${CPPDEFS}) +target_include_directories(common PRIVATE ${INCLUDES}) + +genf90_targets("${COMMON_RAW_SOURCES}" "${INCLUDES}" "${CPPDEFS}" "" "") +target_sources(common PRIVATE ${SOURCES}) + +foreach(CORE IN LISTS CORES) + build_core(${CORE}) +endforeach() diff --git a/src/build_core.cmake b/src/build_core.cmake new file mode 100644 index 0000000000..ab4ab4d67e --- /dev/null +++ b/src/build_core.cmake @@ -0,0 +1,106 @@ +function(build_core CORE) + set(EXE_NAME ${CORE}_model) + set(NAMELIST_SUFFIX ${CORE}) + + # Map the ESM component corresponding to each MPAS core + if (CORE STREQUAL "ocean") + set(COMPONENT "ocn") + elseif(CORE STREQUAL "landice") + set(COMPONENT "glc") + elseif(CORE STREQUAL "seaice") + set(COMPONENT "ice") + endif() + + # build_options.mk stuff handled here + if (CORE STREQUAL "ocean") + list(APPEND CPPDEFS "-DCORE_OCEAN") + list(APPEND INCLUDES "${CMAKE_BINARY_DIR}/core_ocean/BGC" "${CMAKE_BINARY_DIR}/core_ocean/shared" "${CMAKE_BINARY_DIR}/core_ocean/analysis_members" "${CMAKE_BINARY_DIR}/core_ocean/cvmix" "${CMAKE_BINARY_DIR}/core_ocean/mode_forward" "${CMAKE_BINARY_DIR}/core_ocean/mode_analysis" "${CMAKE_BINARY_DIR}/core_ocean/mode_init") + + elseif (CORE STREQUAL "seaice") + list(APPEND CPPDEFS "-DCORE_SEAICE" "-Dcoupled" "-DCCSMCOUPLED") + list(APPEND INCLUDES "${CMAKE_BINARY_DIR}/core_seaice/column" "${CMAKE_BINARY_DIR}/core_seaice/shared" "${CMAKE_BINARY_DIR}/core_seaice/analysis_members" "${CMAKE_BINARY_DIR}/core_seaice/model_forward") + + elseif (CORE STREQUAL "landice") + list(APPEND CPPDEFS "-DCORE_LANDICE") + list(APPEND INCLUDES "${CMAKE_BINARY_DIR}/core_landice/shared" "${CMAKE_BINARY_DIR}/core_landice/analysis_members" "${CMAKE_BINARY_DIR}/core_landice/mode_forward") + + # + # Check if building with LifeV, Albany, and/or PHG external libraries + # + + if (LIFEV) + # LifeV can solve L1L2 or FO + list(APPEND CPPDEFS "-DLIFEV" "-DUSE_EXTERNAL_L1L2" "-DUSE_EXTERNAL_FIRSTORDER" "-DMPAS_LI_BUILD_INTERFACE") + endif() + + # Albany can only solve FO at present + if (ALBANY) + list(APPEND CPPDEFS "-DUSE_EXTERNAL_FIRSTORDER" "-DMPAS_LI_BUILD_INTERFACE") + endif() + + if (LIFEV AND ALBANY) + message(FATAL "Compiling with both LifeV and Albany is not allowed at this time.") + endif() + + # PHG currently requires LifeV + if (PHG AND NOT LIFEV) + message(FATAL "Compiling with PHG requires LifeV at this time.") + endif() + + # PHG can only Stokes at present + if (PHG) + list(APPEND CPPDEFS "-DUSE_EXTERNAL_STOKES" "-DMPAS_LI_BUILD_INTERFACE") + endif() + endif() + + add_library(${COMPONENT}) + target_compile_definitions(${COMPONENT} PRIVATE ${CPPDEFS}) + target_include_directories(${COMPONENT} PRIVATE ${INCLUDES}) + + # Gather sources + set(CORE_BLDDIR ${CMAKE_BINARY_DIR}/core_${CORE}) + if (NOT EXISTS ${CORE_BLDDIR}) + file(MAKE_DIRECTORY ${CORE_BLDDIR}) + endif() + + set(CORE_INPUT_DIR ${CORE_BLDDIR}/default_inputs) + if (NOT EXISTS ${CORE_INPUT_DIR}) + file(MAKE_DIRECTORY ${CORE_INPUT_DIR}) + endif() + + # Make .inc files + add_custom_command ( + OUTPUT ${CORE_BLDDIR}/Registry_processed.xml + COMMAND cpp -P -traditional ${CPPDEFS} -Uvector + ${CMAKE_CURRENT_SOURCE_DIR}/core_${CORE}/Registry.xml > Registry_processed.xml + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/core_${CORE}/Registry.xml + WORKING_DIRECTORY ${CORE_BLDDIR} + ) + + set(INC_DIR ${CORE_BLDDIR}/inc) + if (NOT EXISTS ${INC_DIR}) + file(MAKE_DIRECTORY ${INC_DIR}) + endif() + + add_custom_command( + OUTPUT ${INC_DIR}/core_variables.inc + COMMAND ${CMAKE_BINARY_DIR}/mpas-source/src/parse < ${CORE_BLDDIR}/Registry_processed.xml + DEPENDS parse ${CORE_BLDDIR}/Registry_processed.xml + WORKING_DIRECTORY ${INC_DIR} + ) + + include(${CMAKE_CURRENT_SOURCE_DIR}/core_${CORE}/${CORE}.cmake) + + # Disable qsmp for some files + if (FFLAGS MATCHES ".*-qsmp.*") + foreach(DISABLE_QSMP_FILE IN LISTS DISABLE_QSMP) + get_filename_component(SOURCE_EXT ${DISABLE_QSMP_FILE} EXT) + string(REPLACE "${SOURCE_EXT}" ".f90" SOURCE_F90 ${DISABLE_QSMP_FILE}) + set_property(SOURCE ${CMAKE_BINARY_DIR}/${SOURCE_F90} APPEND_STRING PROPERTY COMPILE_FLAGS " -nosmp") + endforeach() + endif() + + genf90_targets("${RAW_SOURCES}" "${INCLUDES}" "${CPPDEFS}" "${NO_PREPROCESS}" "${INC_DIR}") + target_sources(${COMPONENT} PRIVATE ${SOURCES} $) + +endfunction(build_core) diff --git a/src/cmake_utils.cmake b/src/cmake_utils.cmake new file mode 100644 index 0000000000..0640abaad4 --- /dev/null +++ b/src/cmake_utils.cmake @@ -0,0 +1,74 @@ +# Function for handling nl and st gen +function(handle_st_nl_gen NL_GEN_ARGS ST_GEN_ARGS CORE_INPUT_DIR_ARG CORE_BLDDIR_ARG) + foreach(NL_GEN_ARG IN LISTS NL_GEN_ARGS) + separate_arguments(ITEMS UNIX_COMMAND "${NL_GEN_ARG}") + list(GET ITEMS 0 ITEM) + list(APPEND INPUTS ${ITEM}) + add_custom_command( + OUTPUT ${CORE_INPUT_DIR_ARG}/${ITEM} + COMMAND ${CMAKE_BINARY_DIR}/namelist_gen ${CORE_BLDDIR_ARG}/Registry_processed.xml ${NL_GEN_ARG} + DEPENDS namelist_gen ${CORE_BLDDIR_ARG}/Registry_processed.xml + WORKING_DIRECTORY ${CORE_INPUT_DIR_ARG} + ) + endforeach() + + foreach(ST_GEN_ARG IN LISTS ST_GEN_ARGS) + separate_arguments(ITEMS UNIX_COMMAND "${ST_GEN_ARG}") + list(GET ITEMS 0 ITEM) + list(APPEND INPUTS ${ITEM}) + add_custom_command( + OUTPUT ${CORE_INPUT_DIR_ARG}/${ITEM} + COMMAND ${CMAKE_BINARY_DIR}/streams_gen ${CORE_BLDDIR_ARG}/Registry_processed.xml ${ST_GEN_ARG} + DEPENDS streams_gen ${CORE_BLDDIR_ARG}/Registry_processed.xml + WORKING_DIRECTORY ${CORE_INPUT_DIR_ARG} + ) + endforeach() + + foreach(INPUT IN LISTS INPUTS) + add_custom_command( + OUTPUT ${CORE_BLDDIR_ARG}/${INPUT} + COMMAND ${CMAKE_COMMAND} -E copy ${CORE_INPUT_DIR_ARG}/${INPUT} ${CORE_BLDDIR_ARG}/${INPUT} + DEPENDS ${CORE_INPUT_DIR_ARG}/${INPUT} + WORKING_DIRECTORY ${CORE_BLDDIR_ARG} + ) + endforeach() +endfunction() + +# Function for generating f90 file targets, will add to parent's SOURCES var +function(genf90_targets RAW_SOURCES_ARG INCLUDES_ARG CPPDEFS_ARG NO_PREPROCESS_ARG CORE_INC_DIR_ARG) + # Add -I to includes so that they can used for cpp command + foreach(ITEM IN LISTS INCLUDES_ARG) + list(APPEND INCLUDES_I "-I${ITEM}") + endforeach() + + # Run all .F files through cpp to generate the f90 file + foreach(RAW_SOURCE_FILE IN LISTS RAW_SOURCES_ARG) + get_filename_component(SOURCE_EXT ${RAW_SOURCE_FILE} EXT) + if ( (SOURCE_EXT STREQUAL ".F" OR SOURCE_EXT STREQUAL ".F90") AND NOT RAW_SOURCE_FILE IN_LIST NO_PREPROCESS_ARG) + string(REPLACE "${SOURCE_EXT}" ".f90" SOURCE_F90 ${RAW_SOURCE_FILE}) + get_filename_component(DIR_RELATIVE ${SOURCE_F90} DIRECTORY) + set(DIR_ABSOLUTE ${CMAKE_BINARY_DIR}/${DIR_RELATIVE}) + if (NOT EXISTS ${DIR_ABSOLUTE}) + file(MAKE_DIRECTORY ${DIR_ABSOLUTE}) + endif() + if (CORE_INC_DIR_ARG) + add_custom_command ( + OUTPUT ${CMAKE_BINARY_DIR}/${SOURCE_F90} + COMMAND cpp -P -traditional ${CPPDEFS_ARG} ${INCLUDES_I} -Uvector + ${CMAKE_CURRENT_SOURCE_DIR}/${RAW_SOURCE_FILE} > ${CMAKE_BINARY_DIR}/${SOURCE_F90} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${RAW_SOURCE_FILE} ${CORE_INC_DIR_ARG}/core_variables.inc) + else() + add_custom_command ( + OUTPUT ${CMAKE_BINARY_DIR}/${SOURCE_F90} + COMMAND cpp -P -traditional ${CPPDEFS_ARG} ${INCLUDES_I} -Uvector + ${CMAKE_CURRENT_SOURCE_DIR}/${RAW_SOURCE_FILE} > ${CMAKE_BINARY_DIR}/${SOURCE_F90}) + endif() + list(APPEND LOCAL_SOURCES ${CMAKE_BINARY_DIR}/${SOURCE_F90}) + else() + list(APPEND LOCAL_SOURCES ${RAW_SOURCE_FILE}) + endif() + endforeach() + + set(SOURCES ${LOCAL_SOURCES} PARENT_SCOPE) + +endfunction(genf90_targets) From 0295ffc1870f7bd1ff833e026b389974118421f7 Mon Sep 17 00:00:00 2001 From: Mark Petersen Date: Fri, 1 Nov 2019 07:49:40 -0600 Subject: [PATCH 2/6] Add ocean cmake file --- src/core_ocean/ocean.cmake | 186 +++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 src/core_ocean/ocean.cmake diff --git a/src/core_ocean/ocean.cmake b/src/core_ocean/ocean.cmake new file mode 100644 index 0000000000..d012b79006 --- /dev/null +++ b/src/core_ocean/ocean.cmake @@ -0,0 +1,186 @@ + +# driver (files live in E3SM) +list(APPEND RAW_SOURCES + ../../mpas-ocean/driver/ocn_comp_mct.F + ../../mpas-ocean/driver/mpaso_cpl_indices.F + ../../mpas-ocean/driver/mpaso_mct_vars.F +) + +# dycore +list(APPEND RAW_SOURCES + core_ocean/mode_forward/mpas_ocn_forward_mode.F + core_ocean/mode_forward/mpas_ocn_time_integration.F + core_ocean/mode_forward/mpas_ocn_time_integration_rk4.F + core_ocean/mode_forward/mpas_ocn_time_integration_split.F + + core_ocean/mode_analysis/mpas_ocn_analysis_mode.F + + core_ocean/mode_init/mpas_ocn_init_mode.F + core_ocean/mode_init/mpas_ocn_init_spherical_utils.F + core_ocean/mode_init/mpas_ocn_init_vertical_grids.F + core_ocean/mode_init/mpas_ocn_init_cell_markers.F + core_ocean/mode_init/mpas_ocn_init_interpolation.F + core_ocean/mode_init/mpas_ocn_init_ssh_and_landIcePressure.F + core_ocean/mode_init/mpas_ocn_init_baroclinic_channel.F + core_ocean/mode_init/mpas_ocn_init_lock_exchange.F + core_ocean/mode_init/mpas_ocn_init_dam_break.F + core_ocean/mode_init/mpas_ocn_init_internal_waves.F + core_ocean/mode_init/mpas_ocn_init_overflow.F + core_ocean/mode_init/mpas_ocn_init_cvmix_WSwSBF.F + core_ocean/mode_init/mpas_ocn_init_iso.F + core_ocean/mode_init/mpas_ocn_init_soma.F + core_ocean/mode_init/mpas_ocn_init_ziso.F + core_ocean/mode_init/mpas_ocn_init_sub_ice_shelf_2D.F + core_ocean/mode_init/mpas_ocn_init_periodic_planar.F + core_ocean/mode_init/mpas_ocn_init_ecosys_column.F + core_ocean/mode_init/mpas_ocn_init_sea_mount.F + core_ocean/mode_init/mpas_ocn_init_global_ocean.F + core_ocean/mode_init/mpas_ocn_init_isomip.F + core_ocean/mode_init/mpas_ocn_init_hurricane.F + core_ocean/mode_init/mpas_ocn_init_isomip_plus.F + core_ocean/mode_init/mpas_ocn_init_tidal_boundary.F + + core_ocean/shared/mpas_ocn_init_routines.F + core_ocean/shared/mpas_ocn_gm.F + core_ocean/shared/mpas_ocn_diagnostics.F + core_ocean/shared/mpas_ocn_diagnostics_routines.F + core_ocean/shared/mpas_ocn_thick_ale.F + core_ocean/shared/mpas_ocn_equation_of_state.F + core_ocean/shared/mpas_ocn_equation_of_state_jm.F + core_ocean/shared/mpas_ocn_equation_of_state_linear.F + core_ocean/shared/mpas_ocn_thick_hadv.F + core_ocean/shared/mpas_ocn_thick_vadv.F + core_ocean/shared/mpas_ocn_thick_surface_flux.F + core_ocean/shared/mpas_ocn_vel_hadv_coriolis.F + core_ocean/shared/mpas_ocn_vel_vadv.F + core_ocean/shared/mpas_ocn_vel_hmix.F + core_ocean/shared/mpas_ocn_vel_hmix_del2.F + core_ocean/shared/mpas_ocn_vel_hmix_leith.F + core_ocean/shared/mpas_ocn_vel_hmix_del4.F + core_ocean/shared/mpas_ocn_vel_forcing.F + core_ocean/shared/mpas_ocn_vel_forcing_surface_stress.F + core_ocean/shared/mpas_ocn_vel_forcing_explicit_bottom_drag.F + core_ocean/shared/mpas_ocn_vel_pressure_grad.F + core_ocean/shared/mpas_ocn_vmix.F + core_ocean/shared/mpas_ocn_vmix_coefs_const.F + core_ocean/shared/mpas_ocn_vmix_coefs_rich.F + core_ocean/shared/mpas_ocn_vmix_coefs_tanh.F + core_ocean/shared/mpas_ocn_vmix_coefs_redi.F + core_ocean/shared/mpas_ocn_vmix_cvmix.F + core_ocean/shared/mpas_ocn_tendency.F + core_ocean/shared/mpas_ocn_tracer_hmix.F + core_ocean/shared/mpas_ocn_tracer_hmix_del2.F + core_ocean/shared/mpas_ocn_tracer_hmix_del4.F + core_ocean/shared/mpas_ocn_tracer_hmix_redi.F + core_ocean/shared/mpas_ocn_tracer_advection.F + core_ocean/shared/mpas_ocn_tracer_advection_mono.F + core_ocean/shared/mpas_ocn_tracer_advection_std.F + core_ocean/shared/mpas_ocn_tracer_nonlocalflux.F + core_ocean/shared/mpas_ocn_tracer_short_wave_absorption.F + core_ocean/shared/mpas_ocn_tracer_short_wave_absorption_jerlov.F + core_ocean/shared/mpas_ocn_tracer_short_wave_absorption_variable.F + core_ocean/shared/mpas_ocn_tracer_surface_restoring.F + core_ocean/shared/mpas_ocn_tracer_interior_restoring.F + core_ocean/shared/mpas_ocn_tracer_exponential_decay.F + core_ocean/shared/mpas_ocn_tracer_ideal_age.F + core_ocean/shared/mpas_ocn_tracer_TTD.F + core_ocean/shared/mpas_ocn_tracer_ecosys.F + core_ocean/shared/mpas_ocn_tracer_DMS.F + core_ocean/shared/mpas_ocn_tracer_MacroMolecules.F + core_ocean/shared/mpas_ocn_high_freq_thickness_hmix_del2.F + core_ocean/shared/mpas_ocn_tracer_surface_flux_to_tend.F + core_ocean/shared/mpas_ocn_test.F + core_ocean/shared/mpas_ocn_constants.F + core_ocean/shared/mpas_ocn_forcing.F + core_ocean/shared/mpas_ocn_surface_bulk_forcing.F + core_ocean/shared/mpas_ocn_surface_land_ice_fluxes.F + core_ocean/shared/mpas_ocn_effective_density_in_land_ice.F + core_ocean/shared/mpas_ocn_frazil_forcing.F + core_ocean/shared/mpas_ocn_tidal_forcing.F + core_ocean/shared/mpas_ocn_time_average_coupled.F + core_ocean/shared/mpas_ocn_sea_ice.F + core_ocean/shared/mpas_ocn_framework_forcing.F + core_ocean/shared/mpas_ocn_time_varying_forcing.F + core_ocean/shared/mpas_ocn_wetting_drying.F + core_ocean/shared/mpas_ocn_tidal_potential_forcing.F +) + +set(OCEAN_DRIVER + core_ocean/driver/mpas_ocn_core.F + core_ocean/driver/mpas_ocn_core_interface.F +) +list(APPEND RAW_SOURCES ${OCEAN_DRIVER}) +list(APPEND DISABLE_QSMP ${OCEAN_DRIVER}) + +# Get CVMix +execute_process(COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/core_ocean/get_cvmix.sh + WORKING_DIRECTORY ${CORE_BLDDIR}) + +# Get BGC +execute_process(COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/core_ocean/get_BGC.sh + WORKING_DIRECTORY ${CORE_BLDDIR}) + +# Add CVMix +set(CVMIX_FILES + ${CORE_BLDDIR}/cvmix/cvmix_kinds_and_types.F90 + ${CORE_BLDDIR}/cvmix/cvmix_background.F90 + ${CORE_BLDDIR}/cvmix/cvmix_convection.F90 + ${CORE_BLDDIR}/cvmix/cvmix_ddiff.F90 + ${CORE_BLDDIR}/cvmix/cvmix_kpp.F90 + ${CORE_BLDDIR}/cvmix/cvmix_math.F90 + ${CORE_BLDDIR}/cvmix/cvmix_put_get.F90 + ${CORE_BLDDIR}/cvmix/cvmix_shear.F90 + ${CORE_BLDDIR}/cvmix/cvmix_tidal.F90 + ${CORE_BLDDIR}/cvmix/cvmix_utils.F90 +) + +# Add BGC +set(BGC_FILES + ${CORE_BLDDIR}/BGC/BGC_mod.F90 + ${CORE_BLDDIR}/BGC/BGC_parms.F90 + ${CORE_BLDDIR}/BGC/DMS_mod.F90 + ${CORE_BLDDIR}/BGC/DMS_parms.F90 + ${CORE_BLDDIR}/BGC/MACROS_mod.F90 + ${CORE_BLDDIR}/BGC/MACROS_parms.F90 + ${CORE_BLDDIR}/BGC/co2calc.F90 +) + +list(APPEND RAW_SOURCES ${CVMIX_FILES} ${BGC_FILES}) +list(APPEND NO_PREPROCESS ${CVMIX_FILES} ${BGC_FILES}) + +# Add analysis members +list(APPEND RAW_SOURCES + core_ocean/analysis_members/mpas_ocn_global_stats.F + core_ocean/analysis_members/mpas_ocn_okubo_weiss.F + core_ocean/analysis_members/mpas_ocn_okubo_weiss_eigenvalues.c + core_ocean/analysis_members/mpas_ocn_layer_volume_weighted_averages.F + core_ocean/analysis_members/mpas_ocn_surface_area_weighted_averages.F + core_ocean/analysis_members/mpas_ocn_water_mass_census.F + core_ocean/analysis_members/mpas_ocn_meridional_heat_transport.F + core_ocean/analysis_members/mpas_ocn_test_compute_interval.F + core_ocean/analysis_members/mpas_ocn_high_frequency_output.F + core_ocean/analysis_members/mpas_ocn_zonal_mean.F + core_ocean/analysis_members/mpas_ocn_lagrangian_particle_tracking_interpolations.F + core_ocean/analysis_members/mpas_ocn_particle_list.F + core_ocean/analysis_members/mpas_ocn_lagrangian_particle_tracking_reset.F + core_ocean/analysis_members/mpas_ocn_lagrangian_particle_tracking.F + core_ocean/analysis_members/mpas_ocn_eliassen_palm.F + core_ocean/analysis_members/mpas_ocn_time_filters.F + core_ocean/analysis_members/mpas_ocn_mixed_layer_depths.F + core_ocean/analysis_members/mpas_ocn_pointwise_stats.F + core_ocean/analysis_members/mpas_ocn_debug_diagnostics.F + core_ocean/analysis_members/mpas_ocn_time_series_stats.F + core_ocean/analysis_members/mpas_ocn_regional_stats.F + core_ocean/analysis_members/mpas_ocn_rpn_calculator.F + core_ocean/analysis_members/mpas_ocn_transect_transport.F + core_ocean/analysis_members/mpas_ocn_eddy_product_variables.F + core_ocean/analysis_members/mpas_ocn_moc_streamfunction.F + core_ocean/analysis_members/mpas_ocn_analysis_driver.F +) + +# Generate core input +handle_st_nl_gen( + "namelist.ocean;namelist.ocean.forward mode=forward;namelist.ocean.analysis mode=analysis;namelist.ocean.init mode=init" + "streams.ocean stream_list.ocean. mutable;streams.ocean.forward stream_list.ocean.forward. mutable mode=forward;streams.ocean.analysis stream_list.ocean.analysis. mutable mode=analysis;streams.ocean.init stream_list.ocean.init. mutable mode=init" + ${CORE_INPUT_DIR} ${CORE_BLDDIR} +) From cb8310b91184c77dc695b9ce32015e2a95cf2df5 Mon Sep 17 00:00:00 2001 From: Mark Petersen Date: Fri, 1 Nov 2019 07:49:50 -0600 Subject: [PATCH 3/6] Add seaice cmake file --- src/core_seaice/seaice.cmake | 103 +++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 src/core_seaice/seaice.cmake diff --git a/src/core_seaice/seaice.cmake b/src/core_seaice/seaice.cmake new file mode 100644 index 0000000000..fa3e01ca0e --- /dev/null +++ b/src/core_seaice/seaice.cmake @@ -0,0 +1,103 @@ + +# driver (files live in E3SM) +list(APPEND RAW_SOURCES + ../../mpas-seaice/driver/ice_comp_mct.F + ../../mpas-seaice/driver/mpassi_cpl_indices.F + ../../mpas-seaice/driver/mpassi_mct_vars.F +) + +# column +list(APPEND RAW_SOURCES + core_seaice/column/ice_colpkg.F90 + core_seaice/column/ice_kinds_mod.F90 + core_seaice/column/ice_warnings.F90 + core_seaice/column/ice_colpkg_shared.F90 + core_seaice/column/constants/cesm/ice_constants_colpkg.F90 + core_seaice/column/ice_therm_shared.F90 + core_seaice/column/ice_orbital.F90 + core_seaice/column/ice_mushy_physics.F90 + core_seaice/column/ice_therm_mushy.F90 + core_seaice/column/ice_atmo.F90 + core_seaice/column/ice_age.F90 + core_seaice/column/ice_firstyear.F90 + core_seaice/column/ice_flux_colpkg.F90 + core_seaice/column/ice_meltpond_cesm.F90 + core_seaice/column/ice_meltpond_lvl.F90 + core_seaice/column/ice_meltpond_topo.F90 + core_seaice/column/ice_therm_vertical.F90 + core_seaice/column/ice_therm_bl99.F90 + core_seaice/column/ice_therm_0layer.F90 + core_seaice/column/ice_itd.F90 + core_seaice/column/ice_colpkg_tracers.F90 + core_seaice/column/ice_therm_itd.F90 + core_seaice/column/ice_shortwave.F90 + core_seaice/column/ice_mechred.F90 + core_seaice/column/ice_aerosol.F90 + core_seaice/column/ice_brine.F90 + core_seaice/column/ice_algae.F90 + core_seaice/column/ice_zbgc.F90 + core_seaice/column/ice_zbgc_shared.F90 + core_seaice/column/ice_zsalinity.F90 + core_seaice/column/ice_snow.F90 +) + +# shared +list(APPEND RAW_SOURCES + core_seaice/shared/mpas_seaice_time_integration.F + core_seaice/shared/mpas_seaice_advection_incremental_remap_tracers.F + core_seaice/shared/mpas_seaice_advection_incremental_remap.F + core_seaice/shared/mpas_seaice_advection_upwind.F + core_seaice/shared/mpas_seaice_advection.F + core_seaice/shared/mpas_seaice_velocity_solver_unit_tests.F + core_seaice/shared/mpas_seaice_velocity_solver.F + core_seaice/shared/mpas_seaice_velocity_solver_weak.F + core_seaice/shared/mpas_seaice_velocity_solver_variational.F + core_seaice/shared/mpas_seaice_velocity_solver_wachspress.F + core_seaice/shared/mpas_seaice_velocity_solver_pwl.F + core_seaice/shared/mpas_seaice_velocity_solver_variational_shared.F + core_seaice/shared/mpas_seaice_velocity_solver_constitutive_relation.F + core_seaice/shared/mpas_seaice_forcing.F + core_seaice/shared/mpas_seaice_initialize.F + core_seaice/shared/mpas_seaice_testing.F + core_seaice/shared/mpas_seaice_unit_test.F + core_seaice/shared/mpas_seaice_mesh.F + core_seaice/shared/mpas_seaice_diagnostics.F + core_seaice/shared/mpas_seaice_numerics.F + core_seaice/shared/mpas_seaice_constants.F + core_seaice/shared/mpas_seaice_column.F + core_seaice/shared/mpas_seaice_diagnostics.F + core_seaice/shared/mpas_seaice_error.F +) + +# analysis members +list(APPEND RAW_SOURCES + core_seaice/analysis_members/mpas_seaice_analysis_driver.F + core_seaice/analysis_members/mpas_seaice_high_frequency_output.F + core_seaice/analysis_members/mpas_seaice_temperatures.F + core_seaice/analysis_members/mpas_seaice_regional_statistics.F + core_seaice/analysis_members/mpas_seaice_ridging_diagnostics.F + core_seaice/analysis_members/mpas_seaice_conservation_check.F + core_seaice/analysis_members/mpas_seaice_geographical_vectors.F + core_seaice/analysis_members/mpas_seaice_ice_present.F + core_seaice/analysis_members/mpas_seaice_time_series_stats.F + core_seaice/analysis_members/mpas_seaice_load_balance.F + core_seaice/analysis_members/mpas_seaice_maximum_ice_presence.F + core_seaice/analysis_members/mpas_seaice_miscellaneous.F + core_seaice/analysis_members/mpas_seaice_area_variables.F + core_seaice/analysis_members/mpas_seaice_pond_diagnostics.F + core_seaice/analysis_members/mpas_seaice_deactivate_unneeded_fields.F + core_seaice/analysis_members/mpas_seaice_pointwise_stats.F + core_seaice/analysis_members/mpas_seaice_unit_conversion.F + core_seaice/analysis_members/mpas_seaice_ice_shelves.F +) + +# model_forward (DISABLE qsmp for these) +set(SEAICE_MODEL_FORWARD + core_seaice/model_forward/mpas_seaice_core.F + core_seaice/model_forward/mpas_seaice_core_interface.F +) +list(APPEND RAW_SOURCES ${SEAICE_MODEL_FORWARD}) +list(APPEND DISABLE_QSMP ${SEAICE_MODEL_FORWARD}) + +# Generate core input +handle_st_nl_gen("namelist.seaice" "streams.seaice stream_list.seaice. listed" ${CORE_INPUT_DIR} ${CORE_BLDDIR}) From cfa4598555804145a8fa51b8f6f84c7cc40476f8 Mon Sep 17 00:00:00 2001 From: Mark Petersen Date: Fri, 1 Nov 2019 07:50:04 -0600 Subject: [PATCH 4/6] Add landice cmake file --- src/core_landice/landice.cmake | 47 ++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/core_landice/landice.cmake diff --git a/src/core_landice/landice.cmake b/src/core_landice/landice.cmake new file mode 100644 index 0000000000..e28fa92753 --- /dev/null +++ b/src/core_landice/landice.cmake @@ -0,0 +1,47 @@ + +# driver (files live in E3SM) +list(APPEND RAW_SOURCES + ../../mpas-albany-landice/driver/glc_comp_mct.F + ../../mpas-albany-landice/driver/glc_cpl_indices.F + ../../mpas-albany-landice/driver/glc_mct_vars.F +) + +# shared +list(APPEND RAW_SOURCES + core_landice/shared/mpas_li_constants.F + core_landice/shared/mpas_li_mask.F + core_landice/shared/mpas_li_setup.F +) + +# analysis members +list(APPEND RAW_SOURCES + core_landice/analysis_members/mpas_li_analysis_driver.F + core_landice/analysis_members/mpas_li_global_stats.F + core_landice/analysis_members/mpas_li_regional_stats.F +) + +# mode forward +list(APPEND RAW_SOURCES + core_landice/mode_forward/mpas_li_core.F + core_landice/mode_forward/mpas_li_core_interface.F + core_landice/mode_forward/mpas_li_time_integration.F + core_landice/mode_forward/mpas_li_time_integration_fe.F + core_landice/mode_forward/mpas_li_diagnostic_vars.F + core_landice/mode_forward/mpas_li_advection.F + core_landice/mode_forward/mpas_li_calving.F + core_landice/mode_forward/mpas_li_statistics.F + core_landice/mode_forward/mpas_li_velocity.F + core_landice/mode_forward/mpas_li_thermal.F + core_landice/mode_forward/mpas_li_iceshelf_melt.F + core_landice/mode_forward/mpas_li_sia.F + core_landice/mode_forward/mpas_li_velocity_simple.F + core_landice/mode_forward/mpas_li_velocity_external.F + core_landice/mode_forward/mpas_li_subglacial_hydro.F +) + +if (CPPFLAGS MATCHES ".*MPAS_LI_BUILD_INTERFACE.*") + list(APPEND RAW_SOURCES core_landice/mode_forward/Interface_velocity_solver.cpp) +endif() + +# Generate core input +handle_st_nl_gen("namelist.landice" "streams.landice stream_list.landice. listed" ${CORE_INPUT_DIR} ${CORE_BLDDIR}) From a2bd7eae784aac3cb7a2c659b9b74c10d4a2ef7b Mon Sep 17 00:00:00 2001 From: James Foucar Date: Mon, 4 Nov 2019 16:28:15 -0700 Subject: [PATCH 5/6] Add tools as a subdirectory so that it can use serial compiler --- src/CMakeLists.txt | 15 +-------------- src/build_core.cmake | 2 +- src/cmake_utils.cmake | 4 ++-- src/tools/CMakeLists.txt | 13 +++++++++++++ 4 files changed, 17 insertions(+), 17 deletions(-) create mode 100644 src/tools/CMakeLists.txt diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6d3b6a32ff..514b2e686f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -51,20 +51,7 @@ set(CMAKE_Fortran_FLAGS "${FFLAGS}") set(CMAKE_C_FLAGS "${CFLAGS}") set(CMAKE_CXX_FLAGS "${CXXFLAGS}") -# Make build tools -set(CMAKE_C_COMPILER ${SCC}) - -add_executable(streams_gen tools/input_gen/streams_gen.c tools/input_gen/test_functions.c external/ezxml/ezxml.c) -add_executable(namelist_gen tools/input_gen/namelist_gen.c tools/input_gen/test_functions.c external/ezxml/ezxml.c) -add_executable(parse tools/registry/parse.c tools/registry/dictionary.c tools/registry/gen_inc.c tools/registry/fortprintf.c tools/registry/utility.c external/ezxml/ezxml.c) - -foreach(EXEITEM streams_gen namelist_gen parse) - target_compile_definitions(${EXEITEM} PRIVATE ${CPPDEFS}) - target_compile_options(${EXEITEM} PRIVATE "-Uvector") - target_include_directories(${EXEITEM} PRIVATE ${INCLUDES}) -endforeach() - -set(CMAKE_C_COMPILER ${MPICC}) +add_subdirectory(tools) # Gather sources that are needed for all cores diff --git a/src/build_core.cmake b/src/build_core.cmake index ab4ab4d67e..8019fdfa37 100644 --- a/src/build_core.cmake +++ b/src/build_core.cmake @@ -84,7 +84,7 @@ function(build_core CORE) add_custom_command( OUTPUT ${INC_DIR}/core_variables.inc - COMMAND ${CMAKE_BINARY_DIR}/mpas-source/src/parse < ${CORE_BLDDIR}/Registry_processed.xml + COMMAND ${CMAKE_BINARY_DIR}/mpas-source/src/tools/parse < ${CORE_BLDDIR}/Registry_processed.xml DEPENDS parse ${CORE_BLDDIR}/Registry_processed.xml WORKING_DIRECTORY ${INC_DIR} ) diff --git a/src/cmake_utils.cmake b/src/cmake_utils.cmake index 0640abaad4..c3a25f238d 100644 --- a/src/cmake_utils.cmake +++ b/src/cmake_utils.cmake @@ -6,7 +6,7 @@ function(handle_st_nl_gen NL_GEN_ARGS ST_GEN_ARGS CORE_INPUT_DIR_ARG CORE_BLDDIR list(APPEND INPUTS ${ITEM}) add_custom_command( OUTPUT ${CORE_INPUT_DIR_ARG}/${ITEM} - COMMAND ${CMAKE_BINARY_DIR}/namelist_gen ${CORE_BLDDIR_ARG}/Registry_processed.xml ${NL_GEN_ARG} + COMMAND ${CMAKE_BINARY_DIR}/tools/namelist_gen ${CORE_BLDDIR_ARG}/Registry_processed.xml ${NL_GEN_ARG} DEPENDS namelist_gen ${CORE_BLDDIR_ARG}/Registry_processed.xml WORKING_DIRECTORY ${CORE_INPUT_DIR_ARG} ) @@ -18,7 +18,7 @@ function(handle_st_nl_gen NL_GEN_ARGS ST_GEN_ARGS CORE_INPUT_DIR_ARG CORE_BLDDIR list(APPEND INPUTS ${ITEM}) add_custom_command( OUTPUT ${CORE_INPUT_DIR_ARG}/${ITEM} - COMMAND ${CMAKE_BINARY_DIR}/streams_gen ${CORE_BLDDIR_ARG}/Registry_processed.xml ${ST_GEN_ARG} + COMMAND ${CMAKE_BINARY_DIR}/tools/streams_gen ${CORE_BLDDIR_ARG}/Registry_processed.xml ${ST_GEN_ARG} DEPENDS streams_gen ${CORE_BLDDIR_ARG}/Registry_processed.xml WORKING_DIRECTORY ${CORE_INPUT_DIR_ARG} ) diff --git a/src/tools/CMakeLists.txt b/src/tools/CMakeLists.txt new file mode 100644 index 0000000000..a8bae570bc --- /dev/null +++ b/src/tools/CMakeLists.txt @@ -0,0 +1,13 @@ + +# Make build tools, need to be compiled with serial compiler. +set(CMAKE_C_COMPILER ${SCC}) + +add_executable(streams_gen input_gen/streams_gen.c input_gen/test_functions.c ../external/ezxml/ezxml.c) +add_executable(namelist_gen input_gen/namelist_gen.c input_gen/test_functions.c ../external/ezxml/ezxml.c) +add_executable(parse registry/parse.c registry/dictionary.c registry/gen_inc.c registry/fortprintf.c registry/utility.c ../external/ezxml/ezxml.c) + +foreach(EXEITEM streams_gen namelist_gen parse) + target_compile_definitions(${EXEITEM} PRIVATE ${CPPDEFS}) + target_compile_options(${EXEITEM} PRIVATE "-Uvector") + target_include_directories(${EXEITEM} PRIVATE ${INCLUDES}) +endforeach() From 08d3e495e7fd58e6a758e41340bb229abae0905a Mon Sep 17 00:00:00 2001 From: James Foucar Date: Wed, 6 Nov 2019 10:22:40 -0700 Subject: [PATCH 6/6] Improve docs, put core-specific stuff in core.cmake --- src/CMakeLists.txt | 74 +++++++++------------------------- src/build_core.cmake | 57 +++++--------------------- src/core_landice/landice.cmake | 32 +++++++++++++++ src/core_ocean/ocean.cmake | 4 ++ src/core_seaice/seaice.cmake | 5 +++ src/framework/framework.cmake | 35 ++++++++++++++++ src/operators/operators.cmake | 13 ++++++ 7 files changed, 117 insertions(+), 103 deletions(-) create mode 100644 src/framework/framework.cmake create mode 100644 src/operators/operators.cmake diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 514b2e686f..0f9a19e866 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,3 +1,13 @@ +# +# This is the interface between E3SM's new CMake-based build system and MPAS. +# +# The following CMake variables are expected to be defined: +# * CORES : A list of CORES to build, comma-separated (e.g. "ocean,seaice,landice") +# * Whatever CIME settings are setting to correctly resolve the ${CASEROOT}/Macros.cmake file +# - COMPILER, DEBUG, MPILIB, MACH, OS +# + +# Source CIME-generated Macros include(${CASEROOT}/Macros.cmake) # @@ -51,65 +61,18 @@ set(CMAKE_Fortran_FLAGS "${FFLAGS}") set(CMAKE_C_FLAGS "${CFLAGS}") set(CMAKE_CXX_FLAGS "${CXXFLAGS}") +# Include custom cmake libraries used for mpas +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake_utils.cmake) +include(${CMAKE_CURRENT_SOURCE_DIR}/build_core.cmake) + +# Add tools add_subdirectory(tools) -# Gather sources that are needed for all cores +# Gather sources that are needed for all cores into "common" library -# externals set(COMMON_RAW_SOURCES external/ezxml/ezxml.c) - -# framework -list(APPEND COMMON_RAW_SOURCES - framework/mpas_kind_types.F - framework/mpas_framework.F - framework/mpas_timer.F - framework/mpas_timekeeping.F - framework/mpas_constants.F - framework/mpas_attlist.F - framework/mpas_hash.F - framework/mpas_sort.F - framework/mpas_block_decomp.F - framework/mpas_block_creator.F - framework/mpas_dmpar.F - framework/mpas_abort.F - framework/mpas_decomp.F - framework/mpas_threading.F - framework/mpas_io.F - framework/mpas_io_streams.F - framework/mpas_bootstrapping.F - framework/mpas_io_units.F - framework/mpas_stream_manager.F - framework/mpas_stream_list.F - framework/mpas_forcing.F - framework/mpas_c_interfacing.F - framework/random_id.c - framework/pool_hash.c - framework/mpas_derived_types.F - framework/mpas_domain_routines.F - framework/mpas_field_routines.F - framework/mpas_pool_routines.F - framework/xml_stream_parser.c - framework/regex_matching.c - framework/mpas_field_accessor.F - framework/mpas_log.F -) - -# operators -list(APPEND COMMON_RAW_SOURCES - operators/mpas_vector_operations.F - operators/mpas_matrix_operations.F - operators/mpas_tensor_operations.F - operators/mpas_rbf_interpolation.F - operators/mpas_vector_reconstruction.F - operators/mpas_spline_interpolation.F - operators/mpas_tracer_advection_helpers.F - operators/mpas_tracer_advection_mono.F - operators/mpas_tracer_advection_std.F - operators/mpas_geometry_utils.F -) - -include(${CMAKE_CURRENT_SOURCE_DIR}/cmake_utils.cmake) -include(${CMAKE_CURRENT_SOURCE_DIR}/build_core.cmake) +include(${CMAKE_CURRENT_SOURCE_DIR}/framework/framework.cmake) +include(${CMAKE_CURRENT_SOURCE_DIR}/operators/operators.cmake) add_library(common OBJECT) target_compile_definitions(common PRIVATE ${CPPDEFS}) @@ -118,6 +81,7 @@ target_include_directories(common PRIVATE ${INCLUDES}) genf90_targets("${COMMON_RAW_SOURCES}" "${INCLUDES}" "${CPPDEFS}" "" "") target_sources(common PRIVATE ${SOURCES}) +# Build cores! foreach(CORE IN LISTS CORES) build_core(${CORE}) endforeach() diff --git a/src/build_core.cmake b/src/build_core.cmake index 8019fdfa37..b91904b55d 100644 --- a/src/build_core.cmake +++ b/src/build_core.cmake @@ -9,54 +9,10 @@ function(build_core CORE) set(COMPONENT "glc") elseif(CORE STREQUAL "seaice") set(COMPONENT "ice") + else() + message(FATAL_ERROR "Unrecognized core: ${CORE}") endif() - # build_options.mk stuff handled here - if (CORE STREQUAL "ocean") - list(APPEND CPPDEFS "-DCORE_OCEAN") - list(APPEND INCLUDES "${CMAKE_BINARY_DIR}/core_ocean/BGC" "${CMAKE_BINARY_DIR}/core_ocean/shared" "${CMAKE_BINARY_DIR}/core_ocean/analysis_members" "${CMAKE_BINARY_DIR}/core_ocean/cvmix" "${CMAKE_BINARY_DIR}/core_ocean/mode_forward" "${CMAKE_BINARY_DIR}/core_ocean/mode_analysis" "${CMAKE_BINARY_DIR}/core_ocean/mode_init") - - elseif (CORE STREQUAL "seaice") - list(APPEND CPPDEFS "-DCORE_SEAICE" "-Dcoupled" "-DCCSMCOUPLED") - list(APPEND INCLUDES "${CMAKE_BINARY_DIR}/core_seaice/column" "${CMAKE_BINARY_DIR}/core_seaice/shared" "${CMAKE_BINARY_DIR}/core_seaice/analysis_members" "${CMAKE_BINARY_DIR}/core_seaice/model_forward") - - elseif (CORE STREQUAL "landice") - list(APPEND CPPDEFS "-DCORE_LANDICE") - list(APPEND INCLUDES "${CMAKE_BINARY_DIR}/core_landice/shared" "${CMAKE_BINARY_DIR}/core_landice/analysis_members" "${CMAKE_BINARY_DIR}/core_landice/mode_forward") - - # - # Check if building with LifeV, Albany, and/or PHG external libraries - # - - if (LIFEV) - # LifeV can solve L1L2 or FO - list(APPEND CPPDEFS "-DLIFEV" "-DUSE_EXTERNAL_L1L2" "-DUSE_EXTERNAL_FIRSTORDER" "-DMPAS_LI_BUILD_INTERFACE") - endif() - - # Albany can only solve FO at present - if (ALBANY) - list(APPEND CPPDEFS "-DUSE_EXTERNAL_FIRSTORDER" "-DMPAS_LI_BUILD_INTERFACE") - endif() - - if (LIFEV AND ALBANY) - message(FATAL "Compiling with both LifeV and Albany is not allowed at this time.") - endif() - - # PHG currently requires LifeV - if (PHG AND NOT LIFEV) - message(FATAL "Compiling with PHG requires LifeV at this time.") - endif() - - # PHG can only Stokes at present - if (PHG) - list(APPEND CPPDEFS "-DUSE_EXTERNAL_STOKES" "-DMPAS_LI_BUILD_INTERFACE") - endif() - endif() - - add_library(${COMPONENT}) - target_compile_definitions(${COMPONENT} PRIVATE ${CPPDEFS}) - target_include_directories(${COMPONENT} PRIVATE ${INCLUDES}) - # Gather sources set(CORE_BLDDIR ${CMAKE_BINARY_DIR}/core_${CORE}) if (NOT EXISTS ${CORE_BLDDIR}) @@ -68,6 +24,13 @@ function(build_core CORE) file(MAKE_DIRECTORY ${CORE_INPUT_DIR}) endif() + # Provides us RAW_SOURCES, CPPDEFS, and INCLUDES + include(${CMAKE_CURRENT_SOURCE_DIR}/core_${CORE}/${CORE}.cmake) + + add_library(${COMPONENT}) + target_compile_definitions(${COMPONENT} PRIVATE ${CPPDEFS}) + target_include_directories(${COMPONENT} PRIVATE ${INCLUDES}) + # Make .inc files add_custom_command ( OUTPUT ${CORE_BLDDIR}/Registry_processed.xml @@ -89,8 +52,6 @@ function(build_core CORE) WORKING_DIRECTORY ${INC_DIR} ) - include(${CMAKE_CURRENT_SOURCE_DIR}/core_${CORE}/${CORE}.cmake) - # Disable qsmp for some files if (FFLAGS MATCHES ".*-qsmp.*") foreach(DISABLE_QSMP_FILE IN LISTS DISABLE_QSMP) diff --git a/src/core_landice/landice.cmake b/src/core_landice/landice.cmake index e28fa92753..232f3ccc9d 100644 --- a/src/core_landice/landice.cmake +++ b/src/core_landice/landice.cmake @@ -1,4 +1,36 @@ +# build_options.mk stuff handled here +list(APPEND CPPDEFS "-DCORE_LANDICE") +list(APPEND INCLUDES "${CMAKE_BINARY_DIR}/core_landice/shared" "${CMAKE_BINARY_DIR}/core_landice/analysis_members" "${CMAKE_BINARY_DIR}/core_landice/mode_forward") + +# +# Check if building with LifeV, Albany, and/or PHG external libraries +# + +if (LIFEV) + # LifeV can solve L1L2 or FO + list(APPEND CPPDEFS "-DLIFEV" "-DUSE_EXTERNAL_L1L2" "-DUSE_EXTERNAL_FIRSTORDER" "-DMPAS_LI_BUILD_INTERFACE") +endif() + +# Albany can only solve FO at present +if (ALBANY) + list(APPEND CPPDEFS "-DUSE_EXTERNAL_FIRSTORDER" "-DMPAS_LI_BUILD_INTERFACE") +endif() + +if (LIFEV AND ALBANY) + message(FATAL "Compiling with both LifeV and Albany is not allowed at this time.") +endif() + +# PHG currently requires LifeV +if (PHG AND NOT LIFEV) + message(FATAL "Compiling with PHG requires LifeV at this time.") +endif() + +# PHG can only Stokes at present +if (PHG) + list(APPEND CPPDEFS "-DUSE_EXTERNAL_STOKES" "-DMPAS_LI_BUILD_INTERFACE") +endif() + # driver (files live in E3SM) list(APPEND RAW_SOURCES ../../mpas-albany-landice/driver/glc_comp_mct.F diff --git a/src/core_ocean/ocean.cmake b/src/core_ocean/ocean.cmake index d012b79006..29679934d2 100644 --- a/src/core_ocean/ocean.cmake +++ b/src/core_ocean/ocean.cmake @@ -1,4 +1,8 @@ +# build_options.mk stuff handled here +list(APPEND CPPDEFS "-DCORE_OCEAN") +list(APPEND INCLUDES "${CMAKE_BINARY_DIR}/core_ocean/BGC" "${CMAKE_BINARY_DIR}/core_ocean/shared" "${CMAKE_BINARY_DIR}/core_ocean/analysis_members" "${CMAKE_BINARY_DIR}/core_ocean/cvmix" "${CMAKE_BINARY_DIR}/core_ocean/mode_forward" "${CMAKE_BINARY_DIR}/core_ocean/mode_analysis" "${CMAKE_BINARY_DIR}/core_ocean/mode_init") + # driver (files live in E3SM) list(APPEND RAW_SOURCES ../../mpas-ocean/driver/ocn_comp_mct.F diff --git a/src/core_seaice/seaice.cmake b/src/core_seaice/seaice.cmake index fa3e01ca0e..0ac2b0dd49 100644 --- a/src/core_seaice/seaice.cmake +++ b/src/core_seaice/seaice.cmake @@ -1,4 +1,9 @@ +# build_options.mk stuff handled here +list(APPEND CPPDEFS "-DCORE_SEAICE" "-Dcoupled" "-DCCSMCOUPLED") +list(APPEND INCLUDES "${CMAKE_BINARY_DIR}/core_seaice/column" "${CMAKE_BINARY_DIR}/core_seaice/shared" "${CMAKE_BINARY_DIR}/core_seaice/analysis_members" "${CMAKE_BINARY_DIR}/core_seaice/model_forward") + + # driver (files live in E3SM) list(APPEND RAW_SOURCES ../../mpas-seaice/driver/ice_comp_mct.F diff --git a/src/framework/framework.cmake b/src/framework/framework.cmake new file mode 100644 index 0000000000..f74747fb4f --- /dev/null +++ b/src/framework/framework.cmake @@ -0,0 +1,35 @@ +# framework +list(APPEND COMMON_RAW_SOURCES + framework/mpas_kind_types.F + framework/mpas_framework.F + framework/mpas_timer.F + framework/mpas_timekeeping.F + framework/mpas_constants.F + framework/mpas_attlist.F + framework/mpas_hash.F + framework/mpas_sort.F + framework/mpas_block_decomp.F + framework/mpas_block_creator.F + framework/mpas_dmpar.F + framework/mpas_abort.F + framework/mpas_decomp.F + framework/mpas_threading.F + framework/mpas_io.F + framework/mpas_io_streams.F + framework/mpas_bootstrapping.F + framework/mpas_io_units.F + framework/mpas_stream_manager.F + framework/mpas_stream_list.F + framework/mpas_forcing.F + framework/mpas_c_interfacing.F + framework/random_id.c + framework/pool_hash.c + framework/mpas_derived_types.F + framework/mpas_domain_routines.F + framework/mpas_field_routines.F + framework/mpas_pool_routines.F + framework/xml_stream_parser.c + framework/regex_matching.c + framework/mpas_field_accessor.F + framework/mpas_log.F +) diff --git a/src/operators/operators.cmake b/src/operators/operators.cmake new file mode 100644 index 0000000000..d65c7c661e --- /dev/null +++ b/src/operators/operators.cmake @@ -0,0 +1,13 @@ +# operators +list(APPEND COMMON_RAW_SOURCES + operators/mpas_vector_operations.F + operators/mpas_matrix_operations.F + operators/mpas_tensor_operations.F + operators/mpas_rbf_interpolation.F + operators/mpas_vector_reconstruction.F + operators/mpas_spline_interpolation.F + operators/mpas_tracer_advection_helpers.F + operators/mpas_tracer_advection_mono.F + operators/mpas_tracer_advection_std.F + operators/mpas_geometry_utils.F +)