diff --git a/External/SPEC/CFP2017speed/628.pop2_s/CMakeLists.txt b/External/SPEC/CFP2017speed/628.pop2_s/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/External/SPEC/CFP2017speed/628.pop2_s/CMakeLists.txt @@ -0,0 +1,463 @@ +# https://www.spec.org/cpu2017/Docs/benchmarks/628.pop2_s.html +include(../../SpecCPU2017.cmake) +if (NOT TEST_SUITE_SPEC2017_ROOT) + return () +endif () + +ninja_required() + +speccpu2017_benchmark(SPEED) + +macro(pop2_prepare_rundir) + # Similar to the spec2017_prepare_rundir with an input file fix. + # input file for pop2 is hard-coded to drv_in, but actual filename + # in SPEC2017 benchmark input directory is drv_in.in. The SPEC perl + # run script renames the file as well. + foreach (_runtype IN LISTS TEST_SUITE_RUN_TYPE) + if (EXISTS "${INPUT_all_DIR}") + llvm_copy_dir(${PROG} "${RUN_${_runtype}_DIR}" "${INPUT_all_DIR}") + endif () + llvm_copy_dir(${PROG} "${RUN_${_runtype}_DIR}" "${INPUT_${_runtype}_DIR}") + # Fix the input file name here in the line below + llvm_copy(${PROG} "${RUN_${_runtype}_DIR}/drv_in" "${INPUT_${_runtype}_DIR}/drv_in.in") + endforeach () +endmacro() + +speccpu2017_add_include_dirs( + ${CMAKE_CURRENT_BINARY_DIR} + ${SRC_DIR} + ${SRC_DIR}/netcdf/include +) + +# pop2 has Fortran sources that need to be processed with specpp and C +# sources that do not require it. + +# Compiler definitions affect C and *.f90 files, but note *.F90 files. +# Following flags get added automatically by SpecCPU2017.cmake and not +# include below: +# -DSPEC -DSPEC_CPU -DNDEBUG +# -DSPEC_SUPPRESS_OPENMP +# -DSPEC_AUTO_BYTEORDER=0x12345678 +# +add_definitions( + -D_MPISERIAL + -D_NETCDF + -D_USEBOX + -DCCSMCOUPLED=1 + -DNO_SHR_VMATH + -DBLCKX=50 + -DBLCKY=4 + -DMXBLCKS=58 + -DNO_GETTIMEOFDAY + -DSPEC_CASE_FLAG +) + +# Compiler definitions for *.F90. Do not remove -I or specpp will +# not preprocess correctly. +# +# -U__FILE__ is included as a work around. Source files uses _FILE_ as +# the filename without the path, but a few source files have a typo +# and use __FILE__ instead which is an absolute path. So specpp fails +# to do a replacement with just the filename (i.e. without the path as +# intended). This is usually a benign error, but __FILE__ can lead to +# a deeply nested directory due CMake's build directories. As a +# result, the source file line length becomes incredibly long, so you +# end up with a ridiculously long line that some compilers, like +# GCC, are unable to compile. +speccpu2017_run_specpp( + -w + -U__FILE__ + -D_MPISERIAL + -D_NETCDF + -D_USEBOX + -DCCSMCOUPLED=1 + -DNO_SHR_VMATH + -DBLCKX=50 + -DBLCKY=4 + -DMXBLCKS=58 + -DNO_GETTIMEOFDAY + -DSPEC + -DSPEC_CPU + -DNDEBUG + -DSPEC_CASE_FLAG + -DSPEC_AUTO_BYTEORDER=${SPEC_AUTO_BYTEORDER_VALUE} + -DSPEC_${SPEC_PTR_TYPE} + -DSPEC_SUPPRESS_OPENMP + -I${SRC_DIR} + -I${SRC_DIR}/netcdf/include +) + +## test ######################################################################## + +speccpu2017_run_test(RUN_TYPE test) + +## train ####################################################################### + +speccpu2017_run_test(RUN_TYPE train) + +## ref ######################################################################### + +speccpu2017_run_test(RUN_TYPE ref) + +################################################################################ + +# SPEC Test has both absolute and relative tolerance with same order +speccpu2017_verify_output(IGNORE_WHITE_SPACE ABSOLUTE_TOLERANCE 0.03 RELATIVE_TOLERANCE 0.03) + +# *.F90 files are preprocessed are written to the CMake build +# directory +speccpu2017_add_executable( + netcdf/attr.c + netcdf/dim.c + netcdf/error.c + netcdf/fort-attio.c + netcdf/fort-control.c + netcdf/fort-dim.c + netcdf/fort-genatt.c + netcdf/fort-geninq.c + netcdf/fort-genvar.c + netcdf/fort-lib.c + netcdf/fort-misc.c + netcdf/fort-v2compat.c + netcdf/fort-var1io.c + netcdf/fort-varaio.c + netcdf/fort-vario.c + netcdf/fort-varmio.c + netcdf/fort-varsio.c + netcdf/libvers.c + netcdf/nc.c + netcdf/ncx.c + netcdf/posixio.c + netcdf/putget.c + netcdf/string.c + netcdf/v1hpg.c + netcdf/v2i.c + netcdf/var.c + netcdf/netcdf.f90 + netcdf/typeSizes.f90 + ${CMAKE_CURRENT_BINARY_DIR}/fort.F90 + mpi.c + send.c + recv.c + collective.c + req.c + list.c + handles.c + comm.c + group.c + time.c + pack.c + ${CMAKE_CURRENT_BINARY_DIR}/m_IndexBin_char.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_IndexBin_integer.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_IndexBin_logical.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_List.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_MergeSorts.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_Filename.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_FcComms.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_Permuter.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_SortingTools.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_String.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_StrTemplate.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_chars.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_die.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_dropdead.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_FileResolv.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_flow.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_inpak90.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_ioutil.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_mall.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_mpif.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_mpif90.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_mpout.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_rankMerge.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_realkinds.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_stdio.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_TraceBack.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_zeit.F90 + get_zeits.c + ${CMAKE_CURRENT_BINARY_DIR}/m_MCTWorld.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_AttrVect.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_GlobalMap.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_GlobalSegMap.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_GlobalSegMapComms.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_Accumulator.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_SparseMatrix.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_Navigator.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_AttrVectComms.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_AttrVectReduce.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_AccumulatorComms.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_GeneralGrid.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_GeneralGridComms.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_SpatialIntegral.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_SpatialIntegralV.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_MatAttrVectMul.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_Merge.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_GlobalToLocal.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_ExchangeMaps.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_ConvertMaps.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_SparseMatrixDecomp.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_SparseMatrixToMaps.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_SparseMatrixComms.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_SparseMatrixPlus.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_Router.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_Rearranger.F90 + ${CMAKE_CURRENT_BINARY_DIR}/m_Transfer.F90 + ${CMAKE_CURRENT_BINARY_DIR}/alloc_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/box_rearrange.F90 + ${CMAKE_CURRENT_BINARY_DIR}/iompi_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ionf_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/mct_rearrange.F90 + ${CMAKE_CURRENT_BINARY_DIR}/nf_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/piodarray.F90 + ${CMAKE_CURRENT_BINARY_DIR}/pio.F90 + ${CMAKE_CURRENT_BINARY_DIR}/pio_kinds.F90 + ${CMAKE_CURRENT_BINARY_DIR}/piolib_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/pio_mpi_utils.F90 + ${CMAKE_CURRENT_BINARY_DIR}/pionfatt_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/pionfget_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/pionfput_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/pionfread_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/pio_nf_utils.F90 + ${CMAKE_CURRENT_BINARY_DIR}/pionfwrite_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/pio_quicksort.F90 + ${CMAKE_CURRENT_BINARY_DIR}/pio_spmd_utils.F90 + ${CMAKE_CURRENT_BINARY_DIR}/pio_support.F90 + ${CMAKE_CURRENT_BINARY_DIR}/pio_types.F90 + ${CMAKE_CURRENT_BINARY_DIR}/pio_utils.F90 + pnetcdfversion.c + ${CMAKE_CURRENT_BINARY_DIR}/rearrange.F90 + topology.c + ${CMAKE_CURRENT_BINARY_DIR}/dead_data_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/dead_mct_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/dead_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ESMF_AlarmClockMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ESMF_AlarmMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ESMF_BaseMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ESMF_BaseTimeMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ESMF_CalendarMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ESMF_ClockMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ESMF_FractionMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ESMF_Mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ESMF_Stubs.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ESMF_TimeIntervalMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ESMF_TimeMod.F90 + f_wrappers.c + GPTLget_memusage.c + GPTLprint_memusage.c + GPTLutil.c + ${CMAKE_CURRENT_BINARY_DIR}/mct_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/Meat.F90 + ${CMAKE_CURRENT_BINARY_DIR}/perf_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/perf_utils.F90 + ${CMAKE_CURRENT_BINARY_DIR}/seq_cdata_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/seq_comm_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/seq_drydep_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/seq_flds_indices.F90 + ${CMAKE_CURRENT_BINARY_DIR}/seq_flds_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/seq_infodata_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/seq_io_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/seq_timemgr_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_cal_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_const_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_dmodel_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_file_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_flux_mod.F90 + shr_jlcp.c + ${CMAKE_CURRENT_BINARY_DIR}/shr_kind_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_log_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_map_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_mct_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_mem_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_mpi_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_msg_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_ncread_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_orb_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_pcdf_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_scam_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_strdata_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_stream_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_string_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_sys_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_timer_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/shr_tInterp_mod.F90 + shr_vmath_fwrap.c + ${CMAKE_CURRENT_BINARY_DIR}/shr_vmath_mod.F90 + threadutil.c + ${CMAKE_CURRENT_BINARY_DIR}/wrf_error_fatal.F90 + ${CMAKE_CURRENT_BINARY_DIR}/wrf_message.F90 + ${CMAKE_CURRENT_BINARY_DIR}/atm_comp_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/datm_comp_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/datm_shr_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/dlnd_comp_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/lnd_comp_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/dice_comp_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ice_comp_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_BlocksMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_BroadcastMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_CommMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_ConfigMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_ConstantsMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_DistributionMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_DomainSizeMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_ErrorMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_FieldMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_FinalMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_GridDimMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_GridHorzMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_GridVertMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_HaloMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_IOUnitsMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_InitMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_KindsMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_MCT_vars_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_RedistributeMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_ReductionsMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/POP_SolversMod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/advection.F90 + ${CMAKE_CURRENT_BINARY_DIR}/baroclinic.F90 + ${CMAKE_CURRENT_BINARY_DIR}/barotropic.F90 + ${CMAKE_CURRENT_BINARY_DIR}/blocks.F90 + ${CMAKE_CURRENT_BINARY_DIR}/broadcast.F90 + ${CMAKE_CURRENT_BINARY_DIR}/budget_diagnostics.F90 + ${CMAKE_CURRENT_BINARY_DIR}/cfc11_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/cfc_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/check_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/co2calc.F90 + ${CMAKE_CURRENT_BINARY_DIR}/communicate.F90 + ${CMAKE_CURRENT_BINARY_DIR}/constants.F90 + ${CMAKE_CURRENT_BINARY_DIR}/current_meters.F90 + ${CMAKE_CURRENT_BINARY_DIR}/diag_bsf.F90 + ${CMAKE_CURRENT_BINARY_DIR}/diagnostics.F90 + ${CMAKE_CURRENT_BINARY_DIR}/diags_on_lat_aux_grid.F90 + ${CMAKE_CURRENT_BINARY_DIR}/distribution.F90 + ${CMAKE_CURRENT_BINARY_DIR}/domain.F90 + ${CMAKE_CURRENT_BINARY_DIR}/domain_size.F90 + ${CMAKE_CURRENT_BINARY_DIR}/drifters.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ecosys_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ecosys_parms.F90 + ${CMAKE_CURRENT_BINARY_DIR}/exit_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/forcing.F90 + ${CMAKE_CURRENT_BINARY_DIR}/forcing_ap.F90 + ${CMAKE_CURRENT_BINARY_DIR}/forcing_coupled.F90 + ${CMAKE_CURRENT_BINARY_DIR}/forcing_fields.F90 + ${CMAKE_CURRENT_BINARY_DIR}/forcing_pt_interior.F90 + ${CMAKE_CURRENT_BINARY_DIR}/forcing_s_interior.F90 + ${CMAKE_CURRENT_BINARY_DIR}/forcing_sfwf.F90 + ${CMAKE_CURRENT_BINARY_DIR}/forcing_shf.F90 + ${CMAKE_CURRENT_BINARY_DIR}/forcing_tools.F90 + ${CMAKE_CURRENT_BINARY_DIR}/forcing_ws.F90 + ${CMAKE_CURRENT_BINARY_DIR}/gather_scatter.F90 + ${CMAKE_CURRENT_BINARY_DIR}/global_reductions.F90 + ${CMAKE_CURRENT_BINARY_DIR}/grid.F90 + ${CMAKE_CURRENT_BINARY_DIR}/history.F90 + ${CMAKE_CURRENT_BINARY_DIR}/hmix_aniso.F90 + ${CMAKE_CURRENT_BINARY_DIR}/hmix_del2.F90 + ${CMAKE_CURRENT_BINARY_DIR}/hmix_del4.F90 + ${CMAKE_CURRENT_BINARY_DIR}/hmix_gm.F90 + ${CMAKE_CURRENT_BINARY_DIR}/hmix_gm_submeso_share.F90 + ${CMAKE_CURRENT_BINARY_DIR}/horizontal_mix.F90 + ${CMAKE_CURRENT_BINARY_DIR}/hydro_sections.F90 + ${CMAKE_CURRENT_BINARY_DIR}/iage_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ice.F90 + ${CMAKE_CURRENT_BINARY_DIR}/initial.F90 + ${CMAKE_CURRENT_BINARY_DIR}/io.F90 + ${CMAKE_CURRENT_BINARY_DIR}/io_binary.F90 + ${CMAKE_CURRENT_BINARY_DIR}/io_ccsm.F90 + ${CMAKE_CURRENT_BINARY_DIR}/io_netcdf.F90 + ${CMAKE_CURRENT_BINARY_DIR}/io_pio.F90 + ${CMAKE_CURRENT_BINARY_DIR}/io_tools.F90 + ${CMAKE_CURRENT_BINARY_DIR}/io_types.F90 + ${CMAKE_CURRENT_BINARY_DIR}/kinds_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/mix_submeso.F90 + ${CMAKE_CURRENT_BINARY_DIR}/movie.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ms_balance.F90 + ${CMAKE_CURRENT_BINARY_DIR}/msg_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/named_field_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ocn_communicator.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ocn_comp_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/operators.F90 + ${CMAKE_CURRENT_BINARY_DIR}/output.F90 + ${CMAKE_CURRENT_BINARY_DIR}/overflows.F90 + ${CMAKE_CURRENT_BINARY_DIR}/passive_tracer_tools.F90 + ${CMAKE_CURRENT_BINARY_DIR}/passive_tracers.F90 + ${CMAKE_CURRENT_BINARY_DIR}/pressure_grad.F90 + ${CMAKE_CURRENT_BINARY_DIR}/prognostic.F90 + ${CMAKE_CURRENT_BINARY_DIR}/qflux_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/registry.F90 + ${CMAKE_CURRENT_BINARY_DIR}/restart.F90 + ${CMAKE_CURRENT_BINARY_DIR}/spacecurve_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/state_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/step_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/surface_hgt.F90 + ${CMAKE_CURRENT_BINARY_DIR}/sw_absorption.F90 + ${CMAKE_CURRENT_BINARY_DIR}/tavg.F90 + ${CMAKE_CURRENT_BINARY_DIR}/tidal_mixing.F90 + ${CMAKE_CURRENT_BINARY_DIR}/time_management.F90 + ${CMAKE_CURRENT_BINARY_DIR}/timers.F90 + ${CMAKE_CURRENT_BINARY_DIR}/topostress.F90 + ${CMAKE_CURRENT_BINARY_DIR}/tracer_types.F90 + ${CMAKE_CURRENT_BINARY_DIR}/vertical_mix.F90 + ${CMAKE_CURRENT_BINARY_DIR}/vmix_const.F90 + ${CMAKE_CURRENT_BINARY_DIR}/vmix_kpp.F90 + ${CMAKE_CURRENT_BINARY_DIR}/vmix_rich.F90 + ${CMAKE_CURRENT_BINARY_DIR}/glc_comp_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/ccsm_driver.F90 + ${CMAKE_CURRENT_BINARY_DIR}/map_atmatm_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/map_atmice_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/map_atmlnd_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/map_atmocn_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/map_glcglc_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/map_iceice_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/map_iceocn_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/map_lndlnd_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/map_ocnocn_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/map_rofocn_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/map_rofrof_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/map_snoglc_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/map_snosno_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/mrg_x2a_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/mrg_x2g_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/mrg_x2i_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/mrg_x2l_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/mrg_x2o_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/mrg_x2s_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/seq_avdata_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/seq_diag_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/seq_domain_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/seq_flux_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/seq_frac_mct.F90 + ${CMAKE_CURRENT_BINARY_DIR}/seq_hist_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/seq_rearr_mod.F90 + ${CMAKE_CURRENT_BINARY_DIR}/seq_rest_mod.F90 +) + +# Several compiler options below for C and Fortran +set_property(TARGET ${PROG} PROPERTY C_STANDARD 99) + +check_fortran_compiler_flag("-fallow-argument-mismatch" SUPPORTS_FALLOW_ARGUMENT_MISMATCH) +if (SUPPORTS_FALLOW_ARGUMENT_MISMATCH) + target_compile_options(${PROG} PRIVATE $<$:-fallow-argument-mismatch>) +endif () + +# This is due to some binary input files stored in big-endian format +if (ENDIAN STREQUAL "little") + # GCC + check_fortran_compiler_flag("-fconvert=big-endian" SUPPORTS_FCONVERT_BIG_ENDIAN) + # Intel + check_fortran_compiler_flag("-convert big_endian" SUPPORTS_CONVERT_BIG_ENDIAN) + # Flang + # TBD + + if (SUPPORTS_FCONVERT_BIG_ENDIAN) # GCC + target_compile_options(${PROG} PRIVATE -fconvert=big-endian) + elseif (SUPPORTS_CONVERT_BIG_ENDIAN) # Intel + target_compile_options(${PROG} PRIVATE -convert big_endian) + else () + message(WARN, + "628.pop2_s not supported. No way to read big-endian binary IO on little-endian architecture.") + return () + endif () + +endif () + +pop2_prepare_rundir() 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 @@ -6,7 +6,7 @@ if (TEST_SUITE_FORTRAN) #add_subdirectory(621.wrf_s) # Fortran, C add_subdirectory(627.cam4_s) # Fortran, C - #add_subdirectory(628.pop2_s) # Fortran, C + add_subdirectory(628.pop2_s) # Fortran, C endif () add_subdirectory(638.imagick_s) # C add_subdirectory(644.nab_s) # C diff --git a/External/SPEC/SpecCPU2017.cmake b/External/SPEC/SpecCPU2017.cmake --- a/External/SPEC/SpecCPU2017.cmake +++ b/External/SPEC/SpecCPU2017.cmake @@ -115,23 +115,31 @@ endif () # Portability flags + # SPEC_AUTO_BYTEORDER_value variable is used for Fortran tests that use specpp if (ENDIAN STREQUAL "little") add_definitions(-DSPEC_AUTO_BYTEORDER=0x12345678) + set(SPEC_AUTO_BYTEORDER_VALUE 0x12345678) elseif (ENDIAN STREQUAL "big") add_definitions(-DSPEC_AUTO_BYTEORDER=0x87654321) + set(SPEC_AUTO_BTYEORDER_VALUE 0x87654321) endif () check_type_size("long long" SIZEOF_LONG_LONG) check_type_size("long" SIZEOF_LONG) check_type_size("int" SIZEOF_INT) + # SPEC_PTR_TYPE variable is used for Fortran tests that use specpp if (CMAKE_SIZEOF_VOID_P EQUAL 4 AND SIZEOF_LONG_LONG EQUAL 8 AND SIZEOF_LONG EQUAL 4 AND SIZEOF_INT EQUAL 4) add_definitions(-DSPEC_ILP32) + set(SPEC_PTR_TYPE ILP32) elseif (CMAKE_SIZEOF_VOID_P EQUAL 8 AND SIZEOF_LONG_LONG EQUAL 8 AND SIZEOF_LONG EQUAL 4 AND SIZEOF_INT EQUAL 4) add_definitions(-DSPEC_P64) + set(SPEC_PTR_TYPE P64) elseif (CMAKE_SIZEOF_VOID_P EQUAL 8 AND SIZEOF_LONG_LONG EQUAL 8 AND SIZEOF_LONG EQUAL 8 AND SIZEOF_INT EQUAL 4) add_definitions(-DSPEC_LP64) + set(SPEC_PTR_TYPE LP64) elseif (CMAKE_SIZEOF_VOID_P EQUAL 8 AND SIZEOF_LONG_LONG EQUAL 8 AND SIZEOF_LONG EQUAL 8 AND SIZEOF_INT EQUAL 8) add_definitions(-DSPEC_ILP64) + set(SPEC_PTR_TYPE ILP64) else () message(FATAL_ERROR "SPEC CPU 2017 unsupported data model (supported: ILP32/LLP64/LP64/ILP64)") endif () @@ -351,3 +359,21 @@ llvm_copy_dir(${PROG} "${RUN_${_runtype}_DIR}" "${INPUT_${_runtype}_DIR}") endforeach () endmacro() + +# Run specpp on all Fortran files, but do not do it recursively +macro(speccpu2017_run_specpp) + set(_specpp_bin ${TEST_SUITE_SPEC2017_ROOT}/bin/specpp) + # We don't use GLOB_RECURSE below, because the stdout redirects + # don't include relative path of the source file. Hence, there could + # potentially be two files with the same name in different directories. + file(GLOB _specpp_sources ${SRC_DIR}/*.f ${SRC_DIR}/*.F ${SRC_DIR}/*.f90 ${SRC_DIR}/*.F90) + foreach(_absfilename ${_specpp_sources}) + get_filename_component(_filename ${_absfilename} NAME) + add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${_filename}" + COMMAND "${_specpp_bin}" ${ARGN} "${_absfilename}" > "${CMAKE_CURRENT_BINARY_DIR}/${_filename}" + DEPENDS "${_absfilename}" + VERBATIM + ) + endforeach () +endmacro()