diff --git a/cmake/compiler_flags_Intel_Fortran.cmake b/cmake/compiler_flags_Intel_Fortran.cmake index 5138e0ee..a1674e21 100644 --- a/cmake/compiler_flags_Intel_Fortran.cmake +++ b/cmake/compiler_flags_Intel_Fortran.cmake @@ -20,7 +20,7 @@ set( CMAKE_Fortran_FLAGS_RELEASE "-O3 -ip -unroll -inline -no-heap-arrays" ) # DEBUG FLAGS #################################################################### -set( CMAKE_Fortran_FLAGS_DEBUG "-O0 -g -check bounds -traceback -warn -heap-arrays -fpe-all=0 -fpe:0 -check all" ) +set( CMAKE_Fortran_FLAGS_DEBUG "-O0 -g -check bounds -traceback -warn -heap-arrays -fpe-all=0 -fpe:0 -check all -warn all" ) #################################################################### # BIT REPRODUCIBLE FLAGS diff --git a/cmake/compiler_flags_Intel_LLVM_CXX.cmake b/cmake/compiler_flags_Intel_LLVM_CXX.cmake new file mode 100644 index 00000000..36d578f3 --- /dev/null +++ b/cmake/compiler_flags_Intel_LLVM_CXX.cmake @@ -0,0 +1,42 @@ +#################################################################### +# FLAGS COMMON TO ALL BUILD TYPES +#################################################################### + +#################################################################### +# RELEASE FLAGS +#################################################################### + +set( CMAKE_CXX_FLAGS_RELEASE "-O3" ) + +#################################################################### +# DEBUG FLAGS +#################################################################### + +set( CMAKE_CXX_FLAGS_DEBUG "-O0 -g -ffp-exception-behavior=strict -ftrapping-math -Wall" ) + +#################################################################### +# RELEASE WITH DEBUG INFO (DEFAULT) +#################################################################### + +set( CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG" ) + +#################################################################### +# BIT REPRODUCIBLE FLAGS +#################################################################### + +set( CMAKE_CXX_FLAGS_BIT "-O2" ) + +#################################################################### +# LINK FLAGS +#################################################################### + +set( CMAKE_CXX_LINK_FLAGS "" ) + +#################################################################### +# FLAGS FOR AUTOPROFILING +#################################################################### + +set( CXX_AUTOPROFILING_FLAGS "-finstrument-functions" ) + +#################################################################### + diff --git a/cmake/oops_compiler_flags.cmake b/cmake/oops_compiler_flags.cmake index 2229e593..17991b2b 100644 --- a/cmake/oops_compiler_flags.cmake +++ b/cmake/oops_compiler_flags.cmake @@ -52,6 +52,8 @@ endif() if( CMAKE_CXX_COMPILER_ID MATCHES "GNU" ) include( compiler_flags_GNU_CXX ) +elseif( CMAKE_CXX_COMPILER_ID MATCHES "IntelLLVM" ) + include( compiler_flags_Intel_LLVM_CXX ) elseif( CMAKE_CXX_COMPILER_ID MATCHES "Intel" ) include( compiler_flags_Intel_CXX ) elseif( CMAKE_CXX_COMPILER_ID MATCHES "XL" ) diff --git a/qg/model/qg_change_var_mod.F90 b/qg/model/qg_change_var_mod.F90 index 585d19fc..2105d78c 100644 --- a/qg/model/qg_change_var_mod.F90 +++ b/qg/model/qg_change_var_mod.F90 @@ -17,6 +17,7 @@ module qg_change_var_mod use oops_variables_mod implicit none +external abor1_ftn private public :: qg_change_var_registry @@ -252,4 +253,4 @@ subroutine qg_change_var_ad(fld,vars) end subroutine qg_change_var_ad ! ------------------------------------------------------------------------------ -end module qg_change_var_mod \ No newline at end of file +end module qg_change_var_mod diff --git a/qg/model/qg_error_covariance_mod.F90 b/qg/model/qg_error_covariance_mod.F90 index 0d07831e..d0cd32ab 100644 --- a/qg/model/qg_error_covariance_mod.F90 +++ b/qg/model/qg_error_covariance_mod.F90 @@ -21,6 +21,7 @@ module qg_error_covariance_mod use random_mod implicit none +external abor1_ftn, dsyev, dsymv private public :: qg_error_covariance_config diff --git a/qg/model/qg_fields_mod.F90 b/qg/model/qg_fields_mod.F90 index a2cb7ded..ad4321f9 100644 --- a/qg/model/qg_fields_mod.F90 +++ b/qg/model/qg_fields_mod.F90 @@ -32,6 +32,7 @@ module qg_fields_mod use random_mod implicit none +external abor1_ftn private public :: rseed diff --git a/qg/model/qg_geom_iter_mod.F90 b/qg/model/qg_geom_iter_mod.F90 index 04d4d246..530a94bf 100644 --- a/qg/model/qg_geom_iter_mod.F90 +++ b/qg/model/qg_geom_iter_mod.F90 @@ -13,6 +13,7 @@ module qg_geom_iter_mod use qg_geom_mod implicit none +external abor1_ftn private public :: qg_geom_iter diff --git a/qg/model/qg_geom_mod.F90 b/qg/model/qg_geom_mod.F90 index f4e7bf75..88cbe830 100644 --- a/qg/model/qg_geom_mod.F90 +++ b/qg/model/qg_geom_mod.F90 @@ -17,6 +17,7 @@ module qg_geom_mod use qg_projection_mod implicit none +external abor1_ftn, dgeev, dgetrf, dgetri private public :: qg_geom diff --git a/qg/model/qg_getvalues_interp_mod.F90 b/qg/model/qg_getvalues_interp_mod.F90 index ca9e6059..86ee4b2e 100644 --- a/qg/model/qg_getvalues_interp_mod.F90 +++ b/qg/model/qg_getvalues_interp_mod.F90 @@ -14,6 +14,7 @@ module qg_getvalues_interp_mod use qg_interp_mod implicit none +external abor1_ftn private public :: qg_getvalues_interp, qg_getvalues_interp_ad diff --git a/qg/model/qg_gom_mod.F90 b/qg/model/qg_gom_mod.F90 index 83f43d4a..6ee1ae3e 100644 --- a/qg/model/qg_gom_mod.F90 +++ b/qg/model/qg_gom_mod.F90 @@ -25,6 +25,8 @@ module qg_gom_mod use string_f_c_mod implicit none +external abor1_ftn + private public :: qg_gom public :: qg_gom_registry diff --git a/qg/model/qg_interp_mod.F90 b/qg/model/qg_interp_mod.F90 index 3a922abf..89f259c9 100644 --- a/qg/model/qg_interp_mod.F90 +++ b/qg/model/qg_interp_mod.F90 @@ -16,6 +16,7 @@ module qg_interp_mod use qg_tools_mod implicit none +external abor1_ftn private public :: qg_interp_trilinear, qg_interp_trilinear_ad, qg_interp_bilinear, qg_interp_bilinear_ad, & diff --git a/qg/model/qg_model_mod.F90 b/qg/model/qg_model_mod.F90 index 9323d994..7082a406 100644 --- a/qg/model/qg_model_mod.F90 +++ b/qg/model/qg_model_mod.F90 @@ -23,6 +23,7 @@ module qg_model_mod use random_mod implicit none +external abor1_ftn private public :: qg_model_config diff --git a/qg/model/qg_obsdb_mod.F90 b/qg/model/qg_obsdb_mod.F90 index 9a3f6f02..36a39ba8 100644 --- a/qg/model/qg_obsdb_mod.F90 +++ b/qg/model/qg_obsdb_mod.F90 @@ -26,6 +26,7 @@ module qg_obsdb_mod use string_f_c_mod implicit none +external abor1_ftn private public :: qg_obsdb diff --git a/qg/model/qg_obsvec_mod.F90 b/qg/model/qg_obsvec_mod.F90 index ee7e5f80..30510d40 100644 --- a/qg/model/qg_obsvec_mod.F90 +++ b/qg/model/qg_obsvec_mod.F90 @@ -15,6 +15,7 @@ module qg_obsvec_mod use random_mod implicit none +external abor1_ftn private public :: qg_obsvec diff --git a/qg/model/qg_projection_mod.F90 b/qg/model/qg_projection_mod.F90 index 0a29ab13..c8277799 100644 --- a/qg/model/qg_projection_mod.F90 +++ b/qg/model/qg_projection_mod.F90 @@ -12,6 +12,7 @@ module qg_projection_mod use qg_constants_mod implicit none +external abor1_ftn private public :: xy_to_lonlat,lonlat_to_xy diff --git a/qg/model/qg_tools_mod.F90 b/qg/model/qg_tools_mod.F90 index ae52ee9c..3cf6b857 100644 --- a/qg/model/qg_tools_mod.F90 +++ b/qg/model/qg_tools_mod.F90 @@ -17,6 +17,7 @@ module qg_tools_mod use qg_constants_mod implicit none +external abor1_ftn private public :: genfilename,ncerr,baroclinic_instability,large_vortices diff --git a/qg/model/qg_wspeed_mod.F90 b/qg/model/qg_wspeed_mod.F90 index 122311a9..04fe3cb6 100644 --- a/qg/model/qg_wspeed_mod.F90 +++ b/qg/model/qg_wspeed_mod.F90 @@ -19,6 +19,7 @@ module qg_wspeed_mod use oops_variables_mod implicit none +external abor1_ftn private public :: qg_wspeed_equiv,qg_wspeed_equiv_tl,qg_wspeed_equiv_ad, & diff --git a/src/oops/assimilation/CostJbTotal.h b/src/oops/assimilation/CostJbTotal.h index 8cd94f48..0829fb6f 100644 --- a/src/oops/assimilation/CostJbTotal.h +++ b/src/oops/assimilation/CostJbTotal.h @@ -105,8 +105,8 @@ template class CostJbTotal { const JbState_ & jbState() const {return *jb_;} const JbModelAux_ & jbModBias() const {return jbModBias_;} const JbObsAux_ & jbObsBias() const {return *jbObsBias_;} - const util::DateTime & windowBegin() const {return timeWindow_.start();} - const util::DateTime & windowEnd() const {return timeWindow_.end();} + const util::DateTime windowBegin() const {return timeWindow_.start();} + const util::DateTime windowEnd() const {return timeWindow_.end();} /// continuous DA update void applyContDaUpdate(const eckit::Configuration &, std::vector &); diff --git a/src/oops/assimilation/FtnTriDiagSpectrum.F90 b/src/oops/assimilation/FtnTriDiagSpectrum.F90 index 65c24e46..ea6bbfc5 100644 --- a/src/oops/assimilation/FtnTriDiagSpectrum.F90 +++ b/src/oops/assimilation/FtnTriDiagSpectrum.F90 @@ -17,6 +17,9 @@ subroutine tridiagev(nn, diag, subd, eval, evec) bind(c,name='FtnTriDiagSpectrum use kinds implicit none +external dsteqr +external abor1_ftn + integer(c_int), intent(in) :: nn !< Size of matrix real(c_double), intent(in) :: diag(nn) !< Diagonal elements real(c_double), intent(in) :: subd(nn-1) !< Sub-diagonal elements diff --git a/src/oops/assimilation/LETKFSolverPert.h b/src/oops/assimilation/LETKFSolverPert.h index 2f8b1d6b..841ae80c 100644 --- a/src/oops/assimilation/LETKFSolverPert.h +++ b/src/oops/assimilation/LETKFSolverPert.h @@ -58,8 +58,8 @@ class LETKFSolverPert : public LETKFSolver { const Eigen::MatrixXd & Yb, const Eigen::VectorXd & invVarR); /// Applies weights and adds posterior inflation - virtual void applyWeights(const IncrementEnsemble4D_ &, IncrementEnsemble4D_ &, - const GeometryIterator_ &); + void applyWeights(const IncrementEnsemble4D_ &, IncrementEnsemble4D_ &, + const GeometryIterator_ &) override; private: // departure ensemble object of observation perturbations diff --git a/src/oops/assimilation/gletkf_mod.f90 b/src/oops/assimilation/gletkf_mod.f90 index 5fd65451..9d7a30b2 100644 --- a/src/oops/assimilation/gletkf_mod.f90 +++ b/src/oops/assimilation/gletkf_mod.f90 @@ -123,6 +123,8 @@ subroutine letkf_core(nobsl,hxens,hxens_orig,dep,wts_ensmean,wts_ensperts,& !$$$ end documentation block implicit none +external dgemm, dsyevd, sgemm, ssyevd, abor1_ftn + integer(i_kind), intent(in) :: nobsl,nanals,neigv real(r_kind),dimension(nobsl),intent(in ) :: rdiaginv_loc real(r_kind),dimension(nanals,nobsl),intent(inout) :: hxens diff --git a/src/oops/base/StructuredGridWriter.h b/src/oops/base/StructuredGridWriter.h index 5d15051e..b945f374 100644 --- a/src/oops/base/StructuredGridWriter.h +++ b/src/oops/base/StructuredGridWriter.h @@ -61,7 +61,9 @@ void writerForPressures(const atlas::FieldSet & fset, // NetCDF IDs int ncid; // file ID int lat_did, lon_did, lev_did; // dim IDs - int lat_vid, lon_vid, lev_vid, field_vid[vars.size()]; // var IDs + int lat_vid, lon_vid, lev_vid; // var IDs + std::vector field_vid(vars.size()); // var IDs + int ncvartype; // float or double // NetCDF file path @@ -170,8 +172,9 @@ void writerForLevels(const atlas::FieldSet & fset, // NetCDF IDs int ncid; // file ID - int lat_did, lon_did, lev_did, sfc_did; // dim IDs - int lat_vid, lon_vid, lev_vid, field_vid[vars.size()]; // var IDs + int lat_did, lon_did, lev_did, sfc_did; // dim IDs + int lat_vid, lon_vid, lev_vid; // var IDs + std::vector field_vid(vars.size()); // var IDs int ncvartype; // float or double // NetCDF file path diff --git a/src/oops/generic/fft_multiple_f.F90 b/src/oops/generic/fft_multiple_f.F90 index 28e16a68..7ab1a222 100644 --- a/src/oops/generic/fft_multiple_f.F90 +++ b/src/oops/generic/fft_multiple_f.F90 @@ -8,7 +8,6 @@ !-- - subroutine fft_gp2spe(ds_mfft, size_mfft, no_seq, no_el_seq) bind(c) use iso_c_binding @@ -18,6 +17,7 @@ subroutine fft_gp2spe(ds_mfft, size_mfft, no_seq, no_el_seq) bind(c) !-- implicit none + external fft_gpoint2spectral_f !-- @@ -52,6 +52,7 @@ subroutine fft_spe2gp(ds_mfft, size_mfft, no_seq, no_el_seq) bind(c) !-- implicit none + external fft_spectral2gpoint_f !-- diff --git a/src/oops/runs/Test.h b/src/oops/runs/Test.h index be626aac..d431d178 100644 --- a/src/oops/runs/Test.h +++ b/src/oops/runs/Test.h @@ -56,7 +56,7 @@ int Test::execute(const eckit::Configuration & config) const { // Generate the argc and argv arguments for unit_test_main(...) int argc = 1; - char * argv[argc]; + std::vector argv(argc); char dummy[] = "abcde"; argv[0] = dummy; @@ -64,7 +64,7 @@ int Test::execute(const eckit::Configuration & config) const { Log::trace() << "Registering the unit tests" << std::endl; register_tests(); Log::trace() << "Running the unit tests" << std::endl; - int result = eckit::testing::run_tests(argc, argv, false); + int result = eckit::testing::run_tests(argc, argv.data(), false); Log::trace() << "Finished running the unit tests" << std::endl; Log::error() << "Finished running the unit tests, result = " << result << std::endl; diff --git a/src/oops/util/FieldSetHelpers.cc b/src/oops/util/FieldSetHelpers.cc index 3536a982..997137cf 100644 --- a/src/oops/util/FieldSetHelpers.cc +++ b/src/oops/util/FieldSetHelpers.cc @@ -13,6 +13,7 @@ #include #include #include +#include #include "atlas/array.h" #include "atlas/util/function/VortexRollup.h" @@ -969,7 +970,8 @@ void readFieldSet(const eckit::mpi::Comm & comm, } // NetCDF IDs - int ncid, retval, var_id[vars.size()]; + int ncid, retval; + std::vector var_id(vars.size()); if (oneFilePerTask) { // Case 1: one file per MPI task @@ -1161,7 +1163,8 @@ void readRank3FieldSet(const atlas::FunctionSpace & fspace, const std::string & ncfilepath, const bool & checkDims) { // Initialize NetCDF return value and IDs - int retval, ncid, dimid, varid[vars.size()]; + int retval, ncid, dimid; + std::vector varid(vars.size()); size_t rank3Size; oops::Log::info() << "Info : Reading file: " << ncfilepath << std::endl; @@ -1270,8 +1273,9 @@ void writeFieldSet(const eckit::mpi::Comm & comm, } // NetCDF IDs - int retval, ncid, nx_id, ny_id, nb_nodes_id, nz_id[vars.size()], - d1D_id[1], d2D_id[2], d3D_id[3], lon_id, lat_id, var_id[vars.size()]; + int retval, ncid, nx_id, ny_id, nb_nodes_id, + d1D_id[1], d2D_id[2], d3D_id[3], lon_id, lat_id; + std::vector var_id(vars.size()), nz_id(vars.size()); if (oneFilePerTask) { // Case 1: one file per MPI task @@ -1629,8 +1633,8 @@ void writeRank3FieldSet(const atlas::FieldSet & fset, const std::string & ncfilepath, const double & msvalr) { // Initialize NetCDF return value and IDs - int retval, ncid, nb_nodes_id, d1D_id[1], d3D_id[3], lon_id, lat_id, - nz_id[vars.size()], nv_id[vars.size()], var_id[vars.size()]; + int retval, ncid, nb_nodes_id, d1D_id[1], d3D_id[3], lon_id, lat_id; + std::vector nz_id(vars.size()), nv_id(vars.size()), var_id(vars.size()); // Get number of nodes size_t nb_nodes = 0; diff --git a/src/oops/util/abor1_ftn.F90 b/src/oops/util/abor1_ftn.F90 index 9c724672..fee4a71e 100644 --- a/src/oops/util/abor1_ftn.F90 +++ b/src/oops/util/abor1_ftn.F90 @@ -10,6 +10,14 @@ !> Prints an error message and stops the execution. +!module abor1_mod + +!implicit none +!private +!public abor1_ftn + +!contains + subroutine abor1_ftn(cderror) use, intrinsic :: iso_c_binding, only: c_char use string_f_c_mod @@ -36,3 +44,6 @@ end subroutine abor1_cpp call exit(1) ! just in case!!! end subroutine abor1_ftn + +!end module abor1_mod + diff --git a/src/oops/util/datetime_mod.F90 b/src/oops/util/datetime_mod.F90 index adb5bd19..4d5ebe7c 100644 --- a/src/oops/util/datetime_mod.F90 +++ b/src/oops/util/datetime_mod.F90 @@ -62,6 +62,7 @@ module datetime_mod subroutine datetime_create(fstring, self) use fckit_log_module, only : fckit_log implicit none +external abor1_ftn type(datetime), intent(out) :: self character(len=*), intent(in) :: fstring character(kind=c_char,len=1), allocatable :: cstring(:) @@ -86,6 +87,7 @@ end subroutine datetime_create subroutine datetime_delete(self) implicit none +external abor1_ftn type(datetime), intent(inout) :: self if (c_associated(self%ptr)) then @@ -314,6 +316,7 @@ end subroutine f_c_push_to_datetime_vector subroutine datetime_format_string(fstring, self) implicit none +external abor1_ftn type(datetime), intent(inout) :: self character(len=*), intent(inout) :: fstring character(kind=c_char,len=1), allocatable :: cstring(:) diff --git a/src/oops/util/linkedList_c.f b/src/oops/util/linkedList_c.f index 3ea7d860..4cb55864 100644 --- a/src/oops/util/linkedList_c.f +++ b/src/oops/util/linkedList_c.f @@ -50,6 +50,7 @@ subroutine get_(self,key,ptr) type (LISTED_TYPE), pointer :: ptr type(node_t), pointer :: next + external abor1_ftn !note that the list starts from self%head%next next => self%head diff --git a/src/oops/util/netcdf_utils_mod.f90 b/src/oops/util/netcdf_utils_mod.f90 index 8f5860dc..6a5c11e9 100644 --- a/src/oops/util/netcdf_utils_mod.f90 +++ b/src/oops/util/netcdf_utils_mod.f90 @@ -8,6 +8,7 @@ module netcdf_utils_mod use netcdf implicit none +external abor1_ftn private public nccheck diff --git a/src/oops/util/string_f_c_mod.F90 b/src/oops/util/string_f_c_mod.F90 index 86dc48a2..131ff752 100644 --- a/src/oops/util/string_f_c_mod.F90 +++ b/src/oops/util/string_f_c_mod.F90 @@ -9,13 +9,14 @@ !> Convert Fortran strings to/from C++ module string_f_c_mod - use, intrinsic :: iso_c_binding, only : c_char, c_null_char, c_horizontal_tab implicit none private public f_c_string, c_f_string, f_c_push_string_vector +external abor1_ftn + !------------------------------------------------------------------------------- interface !------------------------------------------------------------------------------- diff --git a/src/oops/util/string_utils.F90 b/src/oops/util/string_utils.F90 index f3e97ed8..388df704 100644 --- a/src/oops/util/string_utils.F90 +++ b/src/oops/util/string_utils.F90 @@ -16,6 +16,8 @@ module string_utils private public swap_name_member, replace_string +external abor1_ftn + !--------------------------------------------------------------------------------------------------- ! Fortran utilities !--------------------------------------------------------------------------------------------------- diff --git a/src/test/base/variables.F90 b/src/test/base/variables.F90 index ff3b3608..88733826 100644 --- a/src/test/base/variables.F90 +++ b/src/test/base/variables.F90 @@ -16,6 +16,7 @@ module test_oops_variables use fckit_log_module, only : fckit_log implicit none +external abor1_ftn private integer, parameter :: var_length = 10 diff --git a/src/test/util/random.F90 b/src/test/util/random.F90 index f9a9954c..46981de3 100644 --- a/src/test/util/random.F90 +++ b/src/test/util/random.F90 @@ -16,6 +16,7 @@ module test_random use fckit_log_module, only : fckit_log implicit none +external abor1_ftn private integer, parameter :: max_string = 800