diff --git a/External/SPEC/CFP2017speed/628.pop2_s/CMakeLists.txt b/External/SPEC/CFP2017speed/628.pop2_s/CMakeLists.txt --- a/External/SPEC/CFP2017speed/628.pop2_s/CMakeLists.txt +++ b/External/SPEC/CFP2017speed/628.pop2_s/CMakeLists.txt @@ -8,17 +8,31 @@ speccpu2017_benchmark(SPEED) +# Check if compiler can support big-endian IO format, if true proceed +# otherwise, return immediately. 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 (NOT SUPPORTS_FCONVERT_BIG_ENDIAN) + elseif (NOT SUPPORTS_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 () + 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. + # Re-use the speccpu2017_prepare_rundir but then implement an input + # file fix at the end. 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. + speccpu2017_prepare_rundir() 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() @@ -32,13 +46,7 @@ # 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 -# +# Compiler definitions affect C and *.f90 files, but not *.F90 files. add_definitions( -D_MPISERIAL -D_NETCDF @@ -52,40 +60,6 @@ -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 ######################################################################## @@ -102,10 +76,11 @@ ################################################################################ # 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) +speccpu2017_verify_output(IGNORE_WHITESPACE ABSOLUTE_TOLERANCE 0.03 RELATIVE_TOLERANCE 0.03) -# *.F90 files are preprocessed are written to the CMake build -# directory +# *.F90 files are preprocessed with specpp and written to the CMake build +# directory. We only list C sources files and Fortran files that don't +# need to be preprocessed below. speccpu2017_add_executable( netcdf/attr.c netcdf/dim.c @@ -135,7 +110,6 @@ netcdf/var.c netcdf/netcdf.f90 netcdf/typeSizes.f90 - ${CMAKE_CURRENT_BINARY_DIR}/fort.F90 mpi.c send.c recv.c @@ -147,317 +121,44 @@ 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 ) +# Preprocess *.F90 with specpp and add sources to target +speccpu2017_run_specpp( + -D_MPISERIAL + -D_NETCDF + -D_USEBOX + -DCCSMCOUPLED=1 + -DNO_SHR_VMATH + -DBLCKX=50 + -DBLCKY=4 + -DMXBLCKS=58 + -DNO_GETTIMEOFDAY + -I${SRC_DIR}/netcdf/include +) + + # 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 () - +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) endif () pop2_prepare_rundir() diff --git a/External/SPEC/SpecCPU2017.cmake b/External/SPEC/SpecCPU2017.cmake --- a/External/SPEC/SpecCPU2017.cmake +++ b/External/SPEC/SpecCPU2017.cmake @@ -174,6 +174,10 @@ # No OpenMP for the moment, even for the _s suites. add_definitions(-DSPEC_SUPPRESS_OPENMP) + # Used by cam4, pop2, and wrf tests for portability + # https://gcc.gnu.org/gcc-10/porting_to.html + check_fortran_compiler_flag("-fallow-argument-mismatch" SUPPORTS_FALLOW_ARGUMENT_MISMATCH) + endif () endmacro() @@ -360,20 +364,37 @@ endforeach () endmacro() -# Run specpp on all Fortran files, but do not do it recursively +# Run specpp on all Fortran files, but do not do it recursively. +# https://www.spec.org/cpu2017/Docs/specpp.html +# specpp is needed due to legacy use of filepp by climate/weather codes. 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) + # We don't use GLOB_RECURSE below because only the *.F90 files in the top + # level directory needs to be processed by specpp. + file(GLOB _specpp_sources ${SRC_DIR}/*.F90) + list(REMOVE_ITEM _specpp_sources ${SRC_DIR}/test.F90) # pop2 source file that doesn't get linked + + # Add common specpp arguments used by all SPEC CPU 2017 tests. + # -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. + set(ARG_COMMON -w -U__FILE__ -DSPEC -DSPEC_CPU -DNDEBUG -DSPEC_CASE_FLAG + -DSPEC_AUTO_BYTEORDER=${SPEC_AUTO_BYTEORDER_VALUE} -DSPEC_${SPEC_PTR_TYPE} -DSPEC_SUPPRESS_OPENMP -I${SRC_DIR}) + 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}" + COMMAND "${_specpp_bin}" ${ARG_COMMON} ${ARGN} "${_absfilename}" > "${CMAKE_CURRENT_BINARY_DIR}/${_filename}" DEPENDS "${_absfilename}" VERBATIM ) + target_sources(${PROG} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/${_filename}") endforeach () endmacro()