diff --git a/External/SPEC/CFP2017rate/554.roms_r/CMakeLists.txt b/External/SPEC/CFP2017rate/554.roms_r/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/External/SPEC/CFP2017rate/554.roms_r/CMakeLists.txt @@ -0,0 +1,371 @@ +# https://www.spec.org/cpu2017/Docs/benchmarks/554.roms_r.html +include(../../SpecCPU2017.cmake) +if (NOT TEST_SUITE_SPEC2017_ROOT) + return () +endif () + +speccpu2017_benchmark(RATE) + +speccpu2017_add_include_dirs(.) + +# SPEC benchmark uses customized version of filepp, called specpp. +# However, these additional filepp flags do not make any impact +# to the benchmark results. This note serves a a reminder. +# set(MODULE_SPECPP_DIR "${TEST_SUITE_SPEC2017_ROOT}/bin/modules.specpp") +# add_definitions(-w -m literal-single.pm -m c-comment.pm) + +add_definitions(-DBENCHMARK -DNestedGrids=1 -DNO_GETTIMEOFDAY) + +## test ######################################################################## + +speccpu2017_run_test( + < ${INPUT_test_DIR}/ocean_benchmark0.in.x + STDOUT ocean_benchmark0.log + STDERR ocean_benchmark0.err + RUN_TYPE test +) + +## train ####################################################################### + +speccpu2017_run_test( + < ${INPUT_train_DIR}/ocean_benchmark1.in.x + STDOUT ocean_benchmark1.log + STDERR ocean_benchmark1.err + RUN_TYPE train +) + +## ref ######################################################################### + +speccpu2017_run_test( + < ${INPUT_ref_DIR}/ocean_benchmark2.in.x + STDOUT ocean_benchmark2.log + STDERR ocean_benchmark2.err + RUN_TYPE ref +) + +################################################################################ + +# fotonik3d has both relative and absolute tolerances +speccpu2017_verify_output(RELATIVE_TOLERANCE 1.0e-7 ABSOLUTE_TOLERANCE 1.0e-7) + +# This module needs to be compile first +speccpu2017_add_mod(MOD_NAME ${PROG}_Fortran_MOD_0 + mod_kinds.F90) + +# These modules need to be compiled second +speccpu2017_add_mod(MOD_NAME ${PROG}_Fortran_MOD_1 + mod_param.F90 + exchange_2d.F90 + exchange_3d.F90 +) +add_dependencies(${PROG}_Fortran_MOD_1 ${PROG}_Fortran_MOD_0) + +# These modules need to be compiled third +speccpu2017_add_mod(MOD_NAME ${PROG}_Fortran_MOD_2 + mod_grid.F90 + mod_scalars.F90 + mod_forces.F90 + mod_ocean.F90 + mod_strings.F90 + mod_iounits.F90 + mod_scalars.F90 + mod_ocean.F90 + mod_coupling.F90 +) +add_dependencies(${PROG}_Fortran_MOD_2 ${PROG}_Fortran_MOD_1) + +# These modules need to be compiled fourth +speccpu2017_add_mod(MOD_NAME ${PROG}_Fortran_MOD_3 + mod_mixing.F90 + mod_parallel.F90 + mod_stepping.F90 + mod_boundary.F90 + mod_ncparam.F90 + set_depth.F90 + t3dbc_im.F90 + u3dbc_im.F90 + v3dbc_im.F90 + u2dbc_im.F90 + v2dbc_im.F90 + zetabc.F90 + bc_2d.F90 + bc_3d.F90 + mod_eoscoef.F90 + lmd_skpp.F90 + nrutil.F90 + mod_netcdf.F90 + nf_fread2d.F90 + nf_fread3d.F90 + nf_fread4d.F90 + nf_fwrite2d.F90 + nf_fwrite3d.F90 + omega.F90 + ocean_control.F90 +) +add_dependencies(${PROG}_Fortran_MOD_3 ${PROG}_Fortran_MOD_2) + +# This is the last set of modules +speccpu2017_add_mod(MOD_NAME ${PROG}_Fortran_MOD_4 + bulk_flux.F90 + diag.F90 + ini_fields.F90 + lmd_vmix.F90 + omega.F90 + rho_eos.F90 + rhs3d.F90 + set_depth.F90 + set_massflux.F90 + set_vbc.F90 + set_zeta.F90 + step2d.F90 + step3d_t.F90 + step3d_uv.F90 + wvelocity.F90 + pre_step3d.F90 + prsgrd.F90 + t3dmix.F90 + uv3dmix.F90 +) +add_dependencies(${PROG}_Fortran_MOD_4 ${PROG}_Fortran_MOD_3) + +# Finally, we add the executable target +speccpu2017_add_executable( + bbl.F90 + bc_2d.F90 + exchange_2d.F90 + mod_param.F90 + mod_kinds.F90 + mod_grid.F90 + mod_scalars.F90 + mod_bbl.F90 + mod_forces.F90 + mod_ocean.F90 + mod_sediment.F90 + mod_parallel.F90 + mod_iounits.F90 + mod_strings.F90 + mod_stepping.F90 + mp_exchange.F90 + bc_3d.F90 + exchange_3d.F90 + bc_bry2d.F90 + bc_bry3d.F90 + bulk_flux.F90 + mod_mixing.F90 + bvf_mix.F90 + conv_2d.F90 + conv_3d.F90 + conv_bry2d.F90 + conv_bry3d.F90 + diag.F90 + analytical.F90 + distribute.F90 + mod_ncparam.F90 + mod_biology.F90 + mod_eclight.F90 + mod_boundary.F90 + mod_clima.F90 + mod_sources.F90 + mod_netcdf.F90 + strings.F90 + forcing.F90 + mod_coupling.F90 + frc_adjust.F90 + get_data.F90 + mod_obs.F90 + get_idata.F90 + mod_tides.F90 + nf_fread3d.F90 + nf_fread4d.F90 + gls_corstep.F90 + tkebc_im.F90 + gls_prestep.F90 + hmixing.F90 + ini_fields.F90 + set_depth.F90 + t3dbc_im.F90 + u2dbc_im.F90 + u3dbc_im.F90 + v2dbc_im.F90 + v3dbc_im.F90 + zetabc.F90 + initial.F90 + ini_adjust.F90 + mod_fourdvar.F90 + state_addition.F90 + state_copy.F90 + metrics.F90 + ocean_coupler.F90 + mod_coupler.F90 + roms_export.F90 + roms_import.F90 + omega.F90 + rho_eos.F90 + mod_eoscoef.F90 + set_massflux.F90 + stiffness.F90 + wpoints.F90 + mod_storage.F90 + interp_floats.F90 + lmd_bkpp.F90 + shapiro.F90 + lmd_skpp.F90 + lmd_swfrac.F90 + lmd_vmix.F90 + main2d.F90 + dotproduct.F90 + obc_adjust.F90 + oi_update.F90 + radiation_stress.F90 + mod_diags.F90 + set_avg.F90 + mod_average.F90 + set_tides.F90 + set_vbc.F90 + step2d.F90 + obc_volcons.F90 + wetdry.F90 + step_floats.F90 + mod_floats.F90 + vwalk_floats.F90 + utility.F90 + main3d.F90 + biology.F90 + my25_corstep.F90 + my25_prestep.F90 + rhs3d.F90 + pre_step3d.F90 + prsgrd.F90 + t3dmix.F90 + uv3dmix.F90 + sediment.F90 + sed_bed.F90 + sed_bedload.F90 + sed_fluxes.F90 + sed_settling.F90 + sed_surface.F90 + set_zeta.F90 + step3d_t.F90 + mpdata_adiff.F90 + step3d_uv.F90 + wvelocity.F90 + output.F90 + set_data.F90 + set_2dfld.F90 + set_3dfld.F90 + abort.F90 + ocean_control.F90 + back_cost.F90 + cgradient.F90 + nf_fread2d.F90 + nf_fread2d_bry.F90 + nf_fread3d_bry.F90 + state_dotprod.F90 + state_initialize.F90 + state_scale.F90 + cost_grad.F90 + normalization.F90 + nf_fwrite2d.F90 + nf_fwrite3d.F90 + white_noise.F90 + nrutil.F90 + packing.F90 + posterior.F90 + posterior_var.F90 + state_product.F90 + propagator.F90 + random_ic.F90 + sum_grad.F90 + zeta_balance.F90 + checkadj.F90 + checkdefs.F90 + checkerror.F90 + checkvars.F90 + close_io.F90 + congrad.F90 + def_avg.F90 + def_var.F90 + def_diags.F90 + def_dim.F90 + def_error.F90 + def_floats.F90 + def_gst.F90 + def_hessian.F90 + def_his.F90 + def_impulse.F90 + def_info.F90 + def_ini.F90 + def_lanczos.F90 + def_mod.F90 + def_norm.F90 + def_rst.F90 + def_station.F90 + def_tides.F90 + extract_obs.F90 + extract_sta.F90 + frc_weak.F90 + gasdev.F90 + get_2dfld.F90 + get_2dfldr.F90 + get_3dfld.F90 + get_3dfldr.F90 + get_bounds.F90 + get_cycle.F90 + get_date.F90 + get_grid.F90 + get_gst.F90 + get_ngfld.F90 + get_ngfldr.F90 + get_state.F90 + get_varcoords.F90 + grid_coords.F90 + interpolate.F90 + ini_lanczos.F90 + inp_par.F90 + ran_state.F90 + lubksb.F90 + ludcmp.F90 + mp_routines.F90 + nf_fwrite2d_bry.F90 + nf_fwrite3d_bry.F90 + nf_fwrite4d.F90 + obs_cost.F90 + obs_depth.F90 + obs_initial.F90 + obs_read.F90 + obs_write.F90 + ran1.F90 + regrid.F90 + rep_matrix.F90 + set_2dfldr.F90 + set_3dfldr.F90 + set_diags.F90 + set_ngfld.F90 + set_ngfldr.F90 + set_scoord.F90 + set_weights.F90 + stats_modobs.F90 + timers.F90 + wrt_avg.F90 + wrt_diags.F90 + wrt_error.F90 + wrt_floats.F90 + wrt_gst.F90 + wrt_hessian.F90 + wrt_his.F90 + wrt_impulse.F90 + wrt_info.F90 + wrt_ini.F90 + wrt_rst.F90 + wrt_station.F90 + wrt_tides.F90 + mod_arrays.F90 + mod_nesting.F90 + esmf_roms.F90 + master.F90 +) + +# dependency on executable, will include transitive dependencies as well +add_dependencies(${PROG} ${PROG}_Fortran_MOD_4) + +speccpu2017_prepare_rundir() diff --git a/External/SPEC/CFP2017rate/CMakeLists.txt b/External/SPEC/CFP2017rate/CMakeLists.txt --- a/External/SPEC/CFP2017rate/CMakeLists.txt +++ b/External/SPEC/CFP2017rate/CMakeLists.txt @@ -13,7 +13,7 @@ add_subdirectory(544.nab_r) # C if (TEST_SUITE_FORTRAN) add_subdirectory(549.fotonik3d_r) # Fortran - #add_subdirectory(554.roms_r) # Fortran + add_subdirectory(554.roms_r) # Fortran endif () add_subdirectory(997.specrand_fr) # C diff --git a/External/SPEC/CFP2017speed/654.roms_s/CMakeLists.txt b/External/SPEC/CFP2017speed/654.roms_s/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/External/SPEC/CFP2017speed/654.roms_s/CMakeLists.txt @@ -0,0 +1,9 @@ +# https://www.spec.org/cpu2017/Docs/benchmarks/654.roms_s.html +include(../../SpecCPU2017.cmake) +if (NOT TEST_SUITE_SPEC2017_ROOT) + return () +endif () + +speccpu2017_benchmark(SPEED ORIGIN 554.roms_r) + +speccpu2017_inherit(../../CFP2017rate/554.roms_r) diff --git a/External/SPEC/CFP2017speed/CMakeLists.txt b/External/SPEC/CFP2017speed/CMakeLists.txt --- a/External/SPEC/CFP2017speed/CMakeLists.txt +++ b/External/SPEC/CFP2017speed/CMakeLists.txt @@ -10,7 +10,7 @@ add_subdirectory(644.nab_s) # C if (TEST_SUITE_FORTRAN) add_subdirectory(649.fotonik3d_s) # Fortran - #add_subdirectory(654.roms_s) # Fortran + add_subdirectory(654.roms_s) # Fortran endif () add_subdirectory(996.specrand_fs) # C diff --git a/External/SPEC/SpecCPU2017.cmake b/External/SPEC/SpecCPU2017.cmake --- a/External/SPEC/SpecCPU2017.cmake +++ b/External/SPEC/SpecCPU2017.cmake @@ -336,6 +336,35 @@ endif () endmacro() +# Make a group of files into an OBJECT library. Mostly used for dealing +# with Fortran module dependencies +# +# Some of the tests have a complex heirarchy of Fortran modules and +# multiple USE statements. The object files created by some modules +# do not actually get linked into the executable, but their modules +# are still needed due to USE statements in other Fortran files. Thus we +# have a number of logical dependencies needed to build a target, but +# without the requirement to build a library. We use CMake OBJECT +# libraries to create intermediate targets. More info as to how they +# they are used can be found here: +# https://gitlab.kitware.com/cmake/community/-/wikis/doc/tutorials/Object-Library +# +# This macro just takes a MOD_NAME and a list of Fortran source files +# as arguements. +macro(speccpu2017_add_mod) + cmake_parse_arguments(_arg "" "MOD_NAME" "" ${ARGN}) + + set(_mod_name ${_arg_MOD_NAME}) + set(_sources) + + foreach(_filename ${_arg_UNPARSED_ARGUMENTS}) + get_filename_component(_absfilename "${_filename}" + ABSOLUTE BASE_DIR ${SRC_DIR}) + list(APPEND _sources "${_absfilename}") + endforeach() + + add_library(${_mod_name} OBJECT ${_sources}) +endmacro() # Copy the input data to the rundir. #