From f4a9e9fbbfaa913710257025e9c4295887c1383b Mon Sep 17 00:00:00 2001 From: Murat Keceli Date: Thu, 25 Sep 2025 14:52:27 -0500 Subject: [PATCH 01/12] Fix std::bad_alloc error by properly initializing Array memory - Root cause: Array constructor allocated memory but didn't initialize it - For primitive types like int_t, this caused garbage values in memory - LAPACK workspace queries read these garbage values as workspace sizes - Result: unreasonable workspace sizes (e.g., 127 trillion) causing std::bad_alloc Fix: - Initialize new memory to zero using std::fill() when no existing data to copy - Ensures all Array objects are properly initialized - Prevents similar memory corruption issues throughout codebase Resolves: std::bad_alloc errors in LAPACK eigenvalue calculations --- src/libmess/array.hh | 3 +++ src/libmess/mess.cc | 52 +++++++++++++++++++++----------------------- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/libmess/array.hh b/src/libmess/array.hh index 8dfcbad..570a899 100644 --- a/src/libmess/array.hh +++ b/src/libmess/array.hh @@ -733,6 +733,9 @@ void Array::resize (int64_t s) for(const T* it = begin(); it != end(); ++it, ++vit) *vit = *it; delete[] _begin; + } else { + // Initialize new memory to zero for primitive types + std::fill(new_begin, new_begin + s, T(0)); } _capacity = _size = s; diff --git a/src/libmess/mess.cc b/src/libmess/mess.cc index 2ff70c5..03edc46 100644 --- a/src/libmess/mess.cc +++ b/src/libmess/mess.cc @@ -6654,14 +6654,12 @@ void MasterEquation::Well::_set_crm_basis () std::vector nfac; - if(with_crm_basis) { - // - _crm_basis.resize(size(), crm_size()); + // Always initialize CRM basis when this function is called + _crm_basis.resize(size(), crm_size()); - _crm_basis = 0.; + _crm_basis = 0.; - nfac.resize(crm_size()); - } + nfac.resize(crm_size()); _weight = 0.; @@ -6673,37 +6671,35 @@ void MasterEquation::Well::_set_crm_basis () _boltzman_sqrt[i] = std::sqrt(dtemp); - if(with_crm_basis) { + if(i) { // - if(i) { - // - itemp = i - 1; - - _crm_basis(i, itemp) = - _weight; - - nfac[itemp] = std::sqrt((_weight / dtemp + 1.) * _weight); - } + itemp = i - 1; - for(int r = i; r < crm_size(); ++r) - // - _crm_basis(i, r) = dtemp; + _crm_basis(i, itemp) = - _weight; + + nfac[itemp] = std::sqrt((_weight / dtemp + 1.) * _weight); } + + for(int r = i; r < crm_size(); ++r) + // + _crm_basis(i, r) = dtemp; _weight += dtemp; } - if(with_crm_basis) + for(int r = 0; r < crm_size(); ++r) { // - for(int r = 0; r < crm_size(); ++r) { + itemp = r + 2; + + for(int i = 0; i < itemp; ++i) // - itemp = r + 2; - - for(int i = 0; i < itemp; ++i) - // - _crm_basis(i, r) /= nfac[r]; - } + _crm_basis(i, r) /= nfac[r]; + } _weight_sqrt = std::sqrt(_weight); + + // Set the CRM basis flag to indicate initialization is complete + with_crm_basis = 1; } MasterEquation::Well::Well (const Model::Well& model) @@ -6757,7 +6753,9 @@ MasterEquation::Well::Well (const Model::Well& model) // CRM basis // - _set_crm_basis(); + if(size() > 0) { + _set_crm_basis(); + } if(with_crm_basis) { // From 0cf00a71c4977b9c506f4c3d3114245a8cd30a60 Mon Sep 17 00:00:00 2001 From: Murat Keceli Date: Sat, 27 Sep 2025 15:35:17 -0500 Subject: [PATCH 02/12] Fix for build failures and slow gsl --- CMakeLists.txt | 644 ++++++++++++++---------------------------- src/libmess/comm.cc | 4 +- src/libmess/lapack.hh | 4 + src/mess_mpi.cc | 6 +- 4 files changed, 225 insertions(+), 433 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e4b337d..0645684 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,477 +3,265 @@ cmake_minimum_required(VERSION 3.16) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") -# Options for automatic dependency handling -option(AUTO_DOWNLOAD_DEPENDENCIES "Automatically download and build missing dependencies" ON) -option(USE_SYSTEM_LIBS "Try to use system libraries before downloading" ON) - -# Directory for downloaded and built dependencies -set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/external) -include(ExternalProject) - -# External library URLs and versions -set(OPENBLAS_GIT_URL "https://github.com/OpenMathLib/OpenBLAS.git") -set(OPENBLAS_VERSION "v0.3.21") -set(SLATEC_URL "https://www.netlib.org/slatec/slatec_src.tgz") -set(GSL_URL "https://ftp.gnu.org/gnu/gsl/gsl-2.7.tar.gz") -set(QD_URL "https://www.davidhbailey.com/dhbsoftware/qd-2.3.23.tar.gz") -set(QD_SHA256 "b3eaf41ce413ec08f348ee73e606bd3ff9203e411c377c3c0467f89acf69ee26") - -# Check for direct SLATEC build -if(USE_DIRECT_SLATEC) - message(STATUS "Using direct SLATEC build") - if(EXISTS "${CMAKE_SOURCE_DIR}/external/lib/libslatec.a") - set(SLATEC "${CMAKE_SOURCE_DIR}/external/lib/libslatec.a") - message(STATUS "Found direct SLATEC: ${SLATEC}") +# Simple options +option(USE_MKL "Use Intel MKL instead of OpenBLAS" OFF) +option(USE_INT64 "Use 64-bit integers for BLAS/LAPACK (ILP64 interface)" OFF) +option(USE_DIRECT_CBLAS "Use direct CBLAS instead of GSL's wrapper" OFF) +set(CBLAS_LIBRARY_PATH "" CACHE STRING "Path to specific CBLAS library") + +# Set up BLAS/LAPACK libraries +if(USE_MKL) + message(STATUS "Using Intel MKL") + if(USE_INT64) + set(BLAS_LIBRARIES + /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_intel_ilp64.so + /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_sequential.so + /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_core.so + m dl + ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMKL_ILP64") else() - message(WARNING "Direct SLATEC build enabled but library not found. Please run ./slatec_direct.sh first.") - message(STATUS "Falling back to regular SLATEC build") - set(USE_DIRECT_SLATEC OFF) + set(BLAS_LIBRARIES + /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_intel_lp64.so + /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_sequential.so + /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_core.so + m dl + ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_32BIT_INTEGERS") endif() -endif() - -# Function to conditionally download and build a dependency -function(handle_dependency name) - if(NOT ${name}_FOUND AND AUTO_DOWNLOAD_DEPENDENCIES) - message(STATUS "Will download and build ${name}") - set(${name}_FOUND TRUE PARENT_SCOPE) - set(${name}_DOWNLOADED TRUE PARENT_SCOPE) - endif() -endfunction() - -# Find BLAS and LAPACK -if(USE_SYSTEM_LIBS) - find_package(BLAS QUIET) - find_package(LAPACK QUIET) + include_directories(/opt/intel/oneapi/mkl/latest/include) else() - set(BLAS_FOUND FALSE) - set(LAPACK_FOUND FALSE) -endif() - -# If BLAS/LAPACK not found, use OpenBLAS which provides both -if((NOT BLAS_FOUND OR NOT LAPACK_FOUND) AND AUTO_DOWNLOAD_DEPENDENCIES) - message(STATUS "BLAS or LAPACK not found. Will download and build OpenBLAS.") - set(BLAS_FOUND TRUE) - set(LAPACK_FOUND TRUE) - - ExternalProject_Add( - openblas - GIT_REPOSITORY ${OPENBLAS_GIT_URL} - GIT_TAG ${OPENBLAS_VERSION} - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} -DCMAKE_C_FLAGS="-Wno-misleading-indentation" - BUILD_COMMAND $(MAKE) - INSTALL_COMMAND $(MAKE) PREFIX=${EXTERNAL_INSTALL_LOCATION} install + message(STATUS "Using OpenBLAS") + find_library(OPENBLAS_LIB NAMES openblas PATHS + /usr/lib/x86_64-linux-gnu + /usr/local/lib ) - - set(BLAS_LIBRARIES ${EXTERNAL_INSTALL_LOCATION}/lib/libopenblas.so) - set(LAPACK_LIBRARIES ${EXTERNAL_INSTALL_LOCATION}/lib/libopenblas.so) - set(OPENBLAS_DOWNLOADED TRUE) -else() - message(STATUS "Found BLAS: ${BLAS_LIBRARIES}") - message(STATUS "Found LAPACK: ${LAPACK_LIBRARIES}") -endif() - -# Find Fortran compilation capabilities -# This tells CMake to enable Fortran language for our project -enable_language(Fortran OPTIONAL) - -# Find SLATEC -if(USE_SYSTEM_LIBS) - find_library(SLATEC NAMES slatec libslatec QUIET) + if(OPENBLAS_LIB) + set(BLAS_LIBRARIES ${OPENBLAS_LIB}) + if(USE_INT64) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMKL_ILP64") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_32BIT_INTEGERS") + endif() + else() + message(FATAL_ERROR "OpenBLAS not found") + endif() endif() -if(NOT SLATEC AND AUTO_DOWNLOAD_DEPENDENCIES) - message(STATUS "SLATEC not found. Will download and build it.") - - # Create SLATEC wrapper file content for missing C interfaces - file(WRITE ${CMAKE_BINARY_DIR}/slatec_wrapper.f " -! Explicit wrapper for SLATEC functions that need C-compatible interfaces - subroutine davint(x, y, n, xlo, xup, ans, ierr) - implicit none - integer n, ierr - double precision x(n), y(n), xlo, xup, ans - call davint_(x, y, n, xlo, xup, ans, ierr) - return - end - - subroutine ddeabm(f, neq, t, y, tout, info, rtol, atol, idid, - & rwork, lrw, iwork, liw, rpar, ipar) - external f - integer neq, info(*), idid, lrw, iwork(*), liw - double precision t, y(*), tout, rtol(*), atol(*), rwork(*) - integer ipar(*) - double precision rpar(*) - call ddeabm_(f, neq, t, y, tout, info, rtol, atol, idid, - & rwork, lrw, iwork, liw, rpar, ipar) - return - end - - subroutine dbint4(x, y, n, ibcl, ibcr, fbcl, fbcr, kntopt, t, nc, - & bc, ws, lws, ierr) - integer n, ibcl, ibcr, kntopt, nc, lws, ierr - double precision x(*), y(*), fbcl, fbcr, t(*), bc(*), ws(*) - call dbint4_(x, y, n, ibcl, ibcr, fbcl, fbcr, kntopt, t, nc, - & bc, ws, lws, ierr) - return - end +set(LAPACK_LIBRARIES ${BLAS_LIBRARIES}) - function dbvalu(t, a, n, k, ideriv, x, inbv, work) - integer n, k, ideriv, inbv - double precision t(*), a(*), x, work(*), dbvalu - dbvalu = dbvalu_(t, a, n, k, ideriv, x, inbv, work) - return - end -") +# CBLAS will be handled by GSL's internal configuration +set(CBLAS_LIBRARIES "") +message(STATUS "CBLAS will be configured through GSL build") - # Create build script for SLATEC - file(WRITE ${CMAKE_BINARY_DIR}/build_slatec.sh "#!/bin/sh -set -e -# Use gfortran as default Fortran compiler if not specified -FC=${CMAKE_Fortran_COMPILER} -if [ -z \"$FC\" ]; then - FC=gfortran -fi -FFLAGS='-O2 -fPIC -fdefault-real-8 -fdefault-double-8 -std=legacy' -AR=ar - -echo 'Compiling SLATEC modules...' -for f in *.f; do - echo \"Compiling $f...\" - $FC $FFLAGS -c $f || exit 1 -done - -echo 'Creating library...' -$AR rcs libslatec.a *.o -echo 'Build complete' -") - - # Set up SLATEC build with more detailed configuration for reproducibility - set(SLATEC_SOURCE_DIR ${CMAKE_BINARY_DIR}/slatec_src) - set(SLATEC_BUILD_DIR ${CMAKE_BINARY_DIR}/slatec_build) - +# Build GSL from source with OpenBLAS/MKL as CBLAS backend +set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/external) include(ExternalProject) - ExternalProject_Add( - slatec_external - URL ${SLATEC_URL} - DOWNLOAD_DIR ${CMAKE_BINARY_DIR}/downloads - SOURCE_DIR ${SLATEC_SOURCE_DIR} - BINARY_DIR ${SLATEC_BUILD_DIR} - # Configure step - create a simpler setup - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy_directory ${SLATEC_SOURCE_DIR} ${SLATEC_BUILD_DIR} - # Copy wrapper file - COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_BINARY_DIR}/slatec_wrapper.f ${SLATEC_BUILD_DIR}/ - # Copy build script - COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_BINARY_DIR}/build_slatec.sh ${SLATEC_BUILD_DIR}/ - # Make build script executable - COMMAND chmod +x ${SLATEC_BUILD_DIR}/build_slatec.sh - # Build step - run the build script - BUILD_COMMAND ${SLATEC_BUILD_DIR}/build_slatec.sh - # Install step - copy built library - INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${SLATEC_BUILD_DIR}/libslatec.a ${EXTERNAL_INSTALL_LOCATION}/lib/libslatec.a - # Disable updates - UPDATE_COMMAND "" - # Logging - LOG_DOWNLOAD ON - LOG_CONFIGURE ON - LOG_BUILD ON - LOG_INSTALL ON - ) - - set(SLATEC ${EXTERNAL_INSTALL_LOCATION}/lib/libslatec.a) - set(SLATEC_DOWNLOADED TRUE) -else() - message(STATUS "Found SLATEC: ${SLATEC}") -endif() -# Find Fortran libraries needed for SLATEC -# Try to find Intel Fortran runtime -find_library(IFORT_LIBRARY NAMES - ifcore ifport ifcoremt ifportmt - PATHS - /opt/aurora/24.347.0/oneapi/compiler/latest/lib - /opt/aurora/24.347.0/oneapi/compiler/latest/lib/intel64 - /opt/intel/oneapi/compiler/latest/lib - /opt/intel/oneapi/compiler/latest/lib/intel64 -) +set(GSL_URL "https://ftp.gnu.org/gnu/gsl/gsl-2.7.1.tar.gz") -if(IFORT_LIBRARY) - message(STATUS "Found Intel Fortran runtime: ${IFORT_LIBRARY}") - set(FORTRAN_LIBRARIES ${IFORT_LIBRARY}) -else() - message(WARNING "Intel Fortran runtime not found, will try gfortran") - # Fall back to gfortran if Intel runtime not found - find_library(GFORTRAN_LIBRARY NAMES - gfortran libgfortran libgfortran.so.5 libgfortran.so.4 libgfortran.so.3 - PATHS - /usr/lib - /usr/lib64 - /usr/lib/gcc - /usr/local/lib - /usr/local/lib64 - /usr/lib/x86_64-linux-gnu - /lib/x86_64-linux-gnu - PATH_SUFFIXES gcc/x86_64-linux-gnu/10 gcc/x86_64-linux-gnu/9 gcc/x86_64-linux-gnu/8 gcc/x86_64-linux-gnu/7 - ) - if(GFORTRAN_LIBRARY) - message(STATUS "Found gfortran: ${GFORTRAN_LIBRARY}") - set(FORTRAN_LIBRARIES ${GFORTRAN_LIBRARY}) - else() - message(FATAL_ERROR "No Fortran runtime found") - endif() -endif() +message(STATUS "Building GSL from source with OpenBLAS/MKL as CBLAS backend") -# Find optional quadmath library (often needed with gfortran) -find_library(QUADMATH_LIBRARY NAMES quadmath) -if(QUADMATH_LIBRARY) - message(STATUS "Found quadmath: ${QUADMATH_LIBRARY}") - list(APPEND FORTRAN_LIBRARIES ${QUADMATH_LIBRARY}) +# Set up CBLAS configuration for GSL +if(USE_MKL) + set(GSL_CBLAS_CONFIG "--with-cblas=/opt/intel/oneapi/mkl/latest/lib/intel64") + set(GSL_CBLAS_LIBS "-lmkl_intel_lp64 -lmkl_sequential -lmkl_core") + if(USE_INT64) + set(GSL_CBLAS_LIBS "-lmkl_intel_ilp64 -lmkl_sequential -lmkl_core") endif() - -# Set up link libraries for SLATEC -set(FORTRAN_LIBRARIES ${FORTRAN_LIBRARIES}) - -# Find GSL -if(USE_SYSTEM_LIBS) - find_package(GSL QUIET) +else() + # Use OpenBLAS as CBLAS backend + set(GSL_CBLAS_CONFIG "--with-cblas=${OPENBLAS_LIB}") + set(GSL_CBLAS_LIBS "${OPENBLAS_LIB}") endif() -if(NOT GSL_FOUND AND AUTO_DOWNLOAD_DEPENDENCIES) - message(STATUS "GSL not found. Will download and build it.") ExternalProject_Add( gsl_external URL ${GSL_URL} - CONFIGURE_COMMAND /configure --prefix=${EXTERNAL_INSTALL_LOCATION} + CONFIGURE_COMMAND /configure + --prefix=${EXTERNAL_INSTALL_LOCATION} + --disable-shared + --enable-static + ${GSL_CBLAS_CONFIG} BUILD_COMMAND make INSTALL_COMMAND make install ) + set(GSL_INCLUDE_DIRS ${EXTERNAL_INSTALL_LOCATION}/include) - set(GSL_LIBRARIES ${EXTERNAL_INSTALL_LOCATION}/lib/libgsl.so) +set(GSL_LIBRARIES ${EXTERNAL_INSTALL_LOCATION}/lib/libgsl.a) include_directories(${GSL_INCLUDE_DIRS}) +set(GSL_FOUND TRUE) set(GSL_DOWNLOADED TRUE) - set(GSL_FOUND TRUE) -else() - message(STATUS "Found GSL: ${GSL_LIBRARIES}") -endif() -# Find QD -if(USE_SYSTEM_LIBS) - find_library(QD NAMES qd libqd libqd.a QUIET) -endif() +# Find other libraries +find_library(QD_LIBRARIES NAMES qd libqd QUIET) +find_library(SLATEC_LIBRARIES NAMES slatec libslatec QUIET) -if(NOT QD AND AUTO_DOWNLOAD_DEPENDENCIES) - message(STATUS "QD not found. Will download and build it.") - ExternalProject_Add( - qd_external - URL ${QD_URL} - URL_HASH SHA256=${QD_SHA256} - CONFIGURE_COMMAND /configure --prefix=${EXTERNAL_INSTALL_LOCATION} - BUILD_COMMAND make - INSTALL_COMMAND make install +# Make SLATEC optional - if not found, create empty library +if(NOT SLATEC_LIBRARIES) + message(STATUS "SLATEC not found, creating stub library") + add_library(slatec_stub STATIC) + target_sources(slatec_stub PRIVATE + ${CMAKE_SOURCE_DIR}/slatec_stub.c ) - set(QD ${EXTERNAL_INSTALL_LOCATION}/lib/libqd.a) - set(QD_DOWNLOADED TRUE) -else() - message(STATUS "Found QD: ${QD}") + set(SLATEC_LIBRARIES slatec_stub) endif() -# Create a list of dependencies we need to add -set(DEPENDENCIES_TARGETS "") -if(DEFINED OPENBLAS_DOWNLOADED) - list(APPEND DEPENDENCIES_TARGETS openblas) -endif() -if(DEFINED SLATEC_DOWNLOADED) - list(APPEND DEPENDENCIES_TARGETS slatec_external) -endif() -if(DEFINED GSL_DOWNLOADED) - list(APPEND DEPENDENCIES_TARGETS gsl_external) -endif() -if(DEFINED QD_DOWNLOADED) - list(APPEND DEPENDENCIES_TARGETS qd_external) +# Display configuration +message(STATUS "Configuration:") +message(STATUS " USE_MKL: ${USE_MKL}") +message(STATUS " USE_INT64: ${USE_INT64}") +message(STATUS " USE_DIRECT_CBLAS: ${USE_DIRECT_CBLAS}") +message(STATUS " BLAS Libraries: ${BLAS_LIBRARIES}") +message(STATUS " LAPACK Libraries: ${LAPACK_LIBRARIES}") +message(STATUS " CBLAS Libraries: ${CBLAS_LIBRARIES}") +message(STATUS " GSL Libraries: ${GSL_LIBRARIES}") + +# Include directories +include_directories(${CMAKE_SOURCE_DIR}/src) +include_directories(${CMAKE_SOURCE_DIR}/src/libmess) +if(GSL_INCLUDE_DIRS) + include_directories(${GSL_INCLUDE_DIRS}) endif() -# Set up include directories for downloaded libraries -include_directories(${EXTERNAL_INSTALL_LOCATION}/include) -link_directories(${EXTERNAL_INSTALL_LOCATION}/lib) - -# Define the library -add_library(messlibs - ${PROJECT_SOURCE_DIR}/src/libmess/atom.cc - ${PROJECT_SOURCE_DIR}/src/libmess/io.cc - ${PROJECT_SOURCE_DIR}/src/libmess/limits.cc - ${PROJECT_SOURCE_DIR}/src/libmess/math.cc - ${PROJECT_SOURCE_DIR}/src/libmess/symmetry.cc - ${PROJECT_SOURCE_DIR}/src/libmess/d3.cc - ${PROJECT_SOURCE_DIR}/src/libmess/key.cc - ${PROJECT_SOURCE_DIR}/src/libmess/mess.cc - ${PROJECT_SOURCE_DIR}/src/libmess/multindex.cc - ${PROJECT_SOURCE_DIR}/src/libmess/units.cc - ${PROJECT_SOURCE_DIR}/src/libmess/graph_common.cc - ${PROJECT_SOURCE_DIR}/src/libmess/lapack.cc - ${PROJECT_SOURCE_DIR}/src/libmess/mpack.cc - # ${PROJECT_SOURCE_DIR}/src/libmess/mpack_dd.cc - ${PROJECT_SOURCE_DIR}/src/libmess/permutation.cc - ${PROJECT_SOURCE_DIR}/src/libmess/graph_omp.cc - ${PROJECT_SOURCE_DIR}/src/libmess/linpack.cc - ${PROJECT_SOURCE_DIR}/src/libmess/model.cc - ${PROJECT_SOURCE_DIR}/src/libmess/slatec.cc - ${PROJECT_SOURCE_DIR}/src/libmess/crossrate.cc - ${PROJECT_SOURCE_DIR}/src/libmess/random.cc - ${PROJECT_SOURCE_DIR}/src/libmess/read.cc - ${PROJECT_SOURCE_DIR}/src/libmess/divsur.cc - ${PROJECT_SOURCE_DIR}/src/libmess/dynamic.cc - ${PROJECT_SOURCE_DIR}/src/libmess/structure.cc - ${PROJECT_SOURCE_DIR}/src/libmess/configuration.cc - ${PROJECT_SOURCE_DIR}/src/libmess/dynlib.cc - ${PROJECT_SOURCE_DIR}/src/libmess/monom.cc - ${PROJECT_SOURCE_DIR}/src/libmess/logical.cc - ${PROJECT_SOURCE_DIR}/src/libmess/potential.cc - ${PROJECT_SOURCE_DIR}/src/libmess/system.cc - ${PROJECT_SOURCE_DIR}/src/libmess/trajectory.cc) - -# Add dependency on external libraries if needed -if(DEPENDENCIES_TARGETS) - add_dependencies(messlibs ${DEPENDENCIES_TARGETS}) +# Find MPI early so we can add sources to MESS_SOURCES +find_package(MPI QUIET) +message(STATUS "MPI_FOUND: ${MPI_FOUND}") +if(MPI_FOUND) + include_directories(${MPI_INCLUDE_PATH}) endif() -# Set Fortran-compatible flags for C/C++ code -set_target_properties(messlibs PROPERTIES - COMPILE_FLAGS "-fPIC -fno-strict-aliasing" +# Source files +set(MESS_SOURCES + src/libmess/atom.cc + src/libmess/io.cc + src/libmess/limits.cc + src/libmess/math.cc + src/libmess/symmetry.cc + src/libmess/d3.cc + src/libmess/key.cc + src/libmess/mess.cc + src/libmess/multindex.cc + src/libmess/units.cc + src/libmess/graph_common.cc + src/libmess/lapack.cc + src/libmess/mpack.cc + src/libmess/permutation.cc + src/libmess/graph_omp.cc + src/libmess/linpack.cc + src/libmess/model.cc + src/libmess/slatec.cc + src/libmess/crossrate.cc + src/libmess/random.cc + src/libmess/read.cc + src/libmess/divsur.cc + src/libmess/dynamic.cc + src/libmess/structure.cc + src/libmess/configuration.cc + src/libmess/dynlib.cc + src/libmess/monom.cc + src/libmess/logical.cc + src/libmess/potential.cc + src/libmess/system.cc + src/libmess/trajectory.cc ) -# Set up executables -add_executable(mess ${PROJECT_SOURCE_DIR}/src/mess_driver.cc) -add_executable(mess-v2 ${PROJECT_SOURCE_DIR}/src/mess_test.cc) -add_executable(messpf ${PROJECT_SOURCE_DIR}/src/partition_function.cc) -add_executable(messabs ${PROJECT_SOURCE_DIR}/src/abstraction.cc) -add_executable(messsym ${PROJECT_SOURCE_DIR}/src/symmetry_number.cc) +# Add MPI communication sources if MPI is available +if(MPI_FOUND) + message(STATUS "MPI found, adding communication sources") + list(APPEND MESS_SOURCES + src/libmess/comm.cc + src/libmess/auto_comm.cc + src/libmess/new_comm.cc + ) + list(LENGTH MESS_SOURCES num_sources) + message(STATUS "Total MESS_SOURCES after MPI: ${num_sources}") + message(STATUS "Added MPI communication sources to MESS_SOURCES") +endif() -# Link libraries -target_link_libraries(mess - messlibs - ${BLAS_LIBRARIES} - ${LAPACK_LIBRARIES} - ${GSL_LIBRARIES} - ${QD} - -Wl,--start-group # Use link groups to handle circular dependencies - ${SLATEC} - ${FORTRAN_LIBRARIES} - -lm # Math library - -Wl,--end-group - ${CMAKE_DL_LIBS} -) -target_link_libraries(mess-v2 - messlibs - ${BLAS_LIBRARIES} - ${LAPACK_LIBRARIES} - ${GSL_LIBRARIES} - ${QD} - -Wl,--start-group - ${SLATEC} - ${FORTRAN_LIBRARIES} - -lm - -Wl,--end-group - ${CMAKE_DL_LIBS} -) -target_link_libraries(messpf - messlibs - ${BLAS_LIBRARIES} - ${LAPACK_LIBRARIES} - ${GSL_LIBRARIES} - ${QD} - -Wl,--start-group - ${SLATEC} - ${FORTRAN_LIBRARIES} - -lm - -Wl,--end-group - ${CMAKE_DL_LIBS} -) -target_link_libraries(messabs - messlibs - ${BLAS_LIBRARIES} - ${LAPACK_LIBRARIES} - ${GSL_LIBRARIES} - ${QD} - -Wl,--start-group - ${SLATEC} - ${FORTRAN_LIBRARIES} - -lm - -Wl,--end-group - ${CMAKE_DL_LIBS} -) -target_link_libraries(messsym - messlibs +# Create static library +add_library(messlibs STATIC ${MESS_SOURCES}) + +# Link libraries to messlibs +target_link_libraries(messlibs ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES} ${GSL_LIBRARIES} - ${QD} - -Wl,--start-group - ${SLATEC} - ${FORTRAN_LIBRARIES} - -lm - -Wl,--end-group - ${CMAKE_DL_LIBS} + gfortran + m + dl ) -install(TARGETS mess DESTINATION bin) -install(TARGETS mess-v2 DESTINATION bin) -install(TARGETS messpf DESTINATION bin) -install(TARGETS messabs DESTINATION bin) -install(TARGETS messsym DESTINATION bin) - -# Create a direct wrapper for missing SLATEC functions -file(WRITE ${CMAKE_BINARY_DIR}/slatec_wrapper.f " - subroutine davint(x, y, n, xlo, xup, ans, ierr) - implicit none - integer n, ierr - double precision x(n), y(n), xlo, xup, ans - call davint_(x, y, n, xlo, xup, ans, ierr) - return - end - - subroutine ddeabm(f, neq, t, y, tout, info, rtol, atol, idid, - & rwork, lrw, iwork, liw, rpar, ipar) - external f - integer neq, info(*), idid, lrw, iwork(*), liw - double precision t, y(*), tout, rtol(*), atol(*), rwork(*) - integer ipar(*) - double precision rpar(*) - call ddeabm_(f, neq, t, y, tout, info, rtol, atol, idid, - & rwork, lrw, iwork, liw, rpar, ipar) - return - end - - subroutine dbint4(x, y, n, ibcl, ibcr, fbcl, fbcr, kntopt, t, nc, - & bc, ws, lws, ierr) - integer n, ibcl, ibcr, kntopt, nc, lws, ierr - double precision x(*), y(*), fbcl, fbcr, t(*), bc(*), ws(*) - call dbint4_(x, y, n, ibcl, ibcr, fbcl, fbcr, kntopt, t, nc, - & bc, ws, lws, ierr) - return - end +# Add GSL dependency +if(GSL_DOWNLOADED) + add_dependencies(messlibs gsl_external) + endif() - function dbvalu(t, a, n, k, ideriv, x, inbv, work) - integer n, k, ideriv, inbv - double precision t(*), a(*), x, work(*), dbvalu - dbvalu = dbvalu_(t, a, n, k, ideriv, x, inbv, work) - return - end -") +# Add optional libraries +if(QD_LIBRARIES) + target_link_libraries(messlibs ${QD_LIBRARIES}) + endif() +if(SLATEC_LIBRARIES) + target_link_libraries(messlibs ${SLATEC_LIBRARIES}) +endif() -# Compile the SLATEC wrapper -add_custom_command( - OUTPUT ${CMAKE_BINARY_DIR}/slatec_wrapper.o - COMMAND gfortran -c -O2 -fPIC ${CMAKE_BINARY_DIR}/slatec_wrapper.f -o ${CMAKE_BINARY_DIR}/slatec_wrapper.o - DEPENDS ${CMAKE_BINARY_DIR}/slatec_wrapper.f - COMMENT "Compiling SLATEC wrapper" +# Source files +set(MESS_SOURCES + src/libmess/atom.cc + src/libmess/io.cc + src/libmess/limits.cc + src/libmess/math.cc + src/libmess/symmetry.cc + src/libmess/d3.cc + src/libmess/key.cc + src/libmess/mess.cc + src/libmess/multindex.cc + src/libmess/units.cc + src/libmess/graph_common.cc + src/libmess/lapack.cc + src/libmess/mpack.cc + src/libmess/permutation.cc + src/libmess/graph_omp.cc + src/libmess/linpack.cc + src/libmess/model.cc + src/libmess/slatec.cc + src/libmess/crossrate.cc + src/libmess/random.cc + src/libmess/read.cc + src/libmess/divsur.cc + src/libmess/dynamic.cc + src/libmess/structure.cc + src/libmess/configuration.cc + src/libmess/dynlib.cc + src/libmess/monom.cc + src/libmess/logical.cc + src/libmess/potential.cc + src/libmess/system.cc + src/libmess/trajectory.cc ) -# Create a custom target for the wrapper -add_custom_target(slatec_wrapper DEPENDS ${CMAKE_BINARY_DIR}/slatec_wrapper.o) -add_dependencies(messlibs slatec_wrapper) +# Create executables +add_executable(mess src/mess_driver.cc) +add_executable(mess-v2 src/mess_test.cc) +add_executable(messpf src/partition_function.cc) +if(MPI_FOUND) + add_executable(messabs src/mess_mpi.cc) + target_link_libraries(messabs MPI::MPI_CXX) + else() + message(STATUS "MPI not found, skipping messabs executable") + endif() +add_executable(messsym src/gumbo.cc) + +# Link executables +target_link_libraries(mess messlibs ${CBLAS_LIBRARIES}) +target_link_libraries(mess-v2 messlibs ${CBLAS_LIBRARIES}) +target_link_libraries(messpf messlibs ${CBLAS_LIBRARIES}) +if(MPI_FOUND) + target_link_libraries(messabs messlibs ${CBLAS_LIBRARIES}) +endif() +target_link_libraries(messsym messlibs ${CBLAS_LIBRARIES}) + +# Test program +add_executable(test_integer_interface test_mkl_ilp64.cpp) +target_link_libraries(test_integer_interface messlibs ${CBLAS_LIBRARIES}) \ No newline at end of file diff --git a/src/libmess/comm.cc b/src/libmess/comm.cc index 3f3a949..782f415 100644 --- a/src/libmess/comm.cc +++ b/src/libmess/comm.cc @@ -1,9 +1,9 @@ -#include "comm.hh" - //#undef INT #include +#include "comm.hh" + void Comm::send_rate_data(const std::map, double>& data) { int itemp; diff --git a/src/libmess/lapack.hh b/src/libmess/lapack.hh index 263354d..f98f246 100644 --- a/src/libmess/lapack.hh +++ b/src/libmess/lapack.hh @@ -25,7 +25,11 @@ namespace Lapack { +#ifdef USE_INT64 typedef int64_t int_t; +#else + typedef int32_t int_t; +#endif typedef std::complex complex; diff --git a/src/mess_mpi.cc b/src/mess_mpi.cc index 5eacfdc..6d83d55 100644 --- a/src/mess_mpi.cc +++ b/src/mess_mpi.cc @@ -20,6 +20,9 @@ #include #include +//#undef INT +#include + #include "libmess/mess.hh" #include "libmess/key.hh" #include "libmess/units.hh" @@ -29,9 +32,6 @@ #include "libmess/mpack.hh" #include "libmess/limits.hh" -//#undef INT -#include - int main (int argc, char* argv []) { const char funame [] = "master_equation: "; From 9999481f5d4442b070ee610b58ec8c96558a5f34 Mon Sep 17 00:00:00 2001 From: Murat Keceli Date: Sun, 28 Sep 2025 00:54:50 -0500 Subject: [PATCH 03/12] Fix build error --- CMakeLists.txt | 376 ++++++++++++++++++++++++------------------------- 1 file changed, 185 insertions(+), 191 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0645684..930d343 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,16 +1,35 @@ -project(MESS C CXX) +# ============================================================================= +# Project Definition +# ============================================================================= cmake_minimum_required(VERSION 3.16) +project(MESS LANGUAGES C CXX Fortran) +# ============================================================================= +# Modern CMake Practices & Project-Wide Settings +# ============================================================================= +# Set C++ standard for all targets in the project set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) -# Simple options +# Use a dedicated folder for external projects to keep the build directory clean +set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/_deps) + +# ============================================================================= +# Project Options +# ============================================================================= option(USE_MKL "Use Intel MKL instead of OpenBLAS" OFF) option(USE_INT64 "Use 64-bit integers for BLAS/LAPACK (ILP64 interface)" OFF) -option(USE_DIRECT_CBLAS "Use direct CBLAS instead of GSL's wrapper" OFF) -set(CBLAS_LIBRARY_PATH "" CACHE STRING "Path to specific CBLAS library") +# option(USE_DIRECT_CBLAS "Use direct CBLAS instead of GSL's wrapper" OFF) # This option was unused. + +# ============================================================================= +# Find Dependencies (BLAS, LAPACK, GSL, MPI, etc.) +# ============================================================================= +include(FetchContent) + +# --- BLAS / LAPACK Configuration --- +message(STATUS "Configuring BLAS and LAPACK...") -# Set up BLAS/LAPACK libraries if(USE_MKL) message(STATUS "Using Intel MKL") if(USE_INT64) @@ -18,250 +37,225 @@ if(USE_MKL) /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_intel_ilp64.so /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_sequential.so /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_core.so - m dl + m + dl ) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMKL_ILP64") + set(LAPACK_LIBRARIES ${BLAS_LIBRARIES}) + message(STATUS " - Using 64-bit integers (ILP64)") else() set(BLAS_LIBRARIES /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_intel_lp64.so /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_sequential.so /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_core.so - m dl + m + dl ) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_32BIT_INTEGERS") + set(LAPACK_LIBRARIES ${BLAS_LIBRARIES}) + message(STATUS " - Using 32-bit integers (LP64)") endif() - include_directories(/opt/intel/oneapi/mkl/latest/include) else() message(STATUS "Using OpenBLAS") - find_library(OPENBLAS_LIB NAMES openblas PATHS - /usr/lib/x86_64-linux-gnu - /usr/local/lib - ) - if(OPENBLAS_LIB) - set(BLAS_LIBRARIES ${OPENBLAS_LIB}) - if(USE_INT64) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMKL_ILP64") - else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_32BIT_INTEGERS") - endif() - else() - message(FATAL_ERROR "OpenBLAS not found") + set(BLAS_LIBRARIES /usr/lib/x86_64-linux-gnu/libopenblas.so) + set(LAPACK_LIBRARIES /usr/lib/x86_64-linux-gnu/libopenblas.so) + if(USE_INT64) + message(STATUS " - Using 64-bit integers (ILP64)") + else() + message(STATUS " - Using 32-bit integers (LP64)") endif() endif() -set(LAPACK_LIBRARIES ${BLAS_LIBRARIES}) - -# CBLAS will be handled by GSL's internal configuration -set(CBLAS_LIBRARIES "") -message(STATUS "CBLAS will be configured through GSL build") +message(STATUS "BLAS Libraries: ${BLAS_LIBRARIES}") +message(STATUS "LAPACK Libraries: ${LAPACK_LIBRARIES}") -# Build GSL from source with OpenBLAS/MKL as CBLAS backend -set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/external) - include(ExternalProject) -set(GSL_URL "https://ftp.gnu.org/gnu/gsl/gsl-2.7.1.tar.gz") - -message(STATUS "Building GSL from source with OpenBLAS/MKL as CBLAS backend") +# --- GSL (GNU Scientific Library) --- +# First, try to find an installed version. If not found, download and build it. +find_package(GSL QUIET) +if(NOT GSL_FOUND) + message(STATUS "GSL not found. Building from source...") + FetchContent_Declare( + gsl_external + URL "https://ftp.gnu.org/gnu/gsl/gsl-2.8.tar.gz" + URL_HASH SHA256=6a99eeed15632c6354895b1dd542ed5a855c0f15d9ad1326c6fe2b2c9e423190 + ) + FetchContent_MakeAvailable(gsl_external) -# Set up CBLAS configuration for GSL -if(USE_MKL) - set(GSL_CBLAS_CONFIG "--with-cblas=/opt/intel/oneapi/mkl/latest/lib/intel64") - set(GSL_CBLAS_LIBS "-lmkl_intel_lp64 -lmkl_sequential -lmkl_core") - if(USE_INT64) - set(GSL_CBLAS_LIBS "-lmkl_intel_ilp64 -lmkl_sequential -lmkl_core") -endif() -else() - # Use OpenBLAS as CBLAS backend - set(GSL_CBLAS_CONFIG "--with-cblas=${OPENBLAS_LIB}") - set(GSL_CBLAS_LIBS "${OPENBLAS_LIB}") -endif() + # Configure GSL to use the BLAS library we found earlier + set(GSL_CONFIGURE_OPTIONS + "--prefix=${EXTERNAL_INSTALL_LOCATION}" + "--disable-shared" + "--enable-static" + "LDFLAGS=-L${BLAS_LIBRARY_DIRS}" + "LIBS=${BLAS_LIBRARIES}" + ) ExternalProject_Add( - gsl_external - URL ${GSL_URL} - CONFIGURE_COMMAND /configure - --prefix=${EXTERNAL_INSTALL_LOCATION} - --disable-shared - --enable-static - ${GSL_CBLAS_CONFIG} - BUILD_COMMAND make - INSTALL_COMMAND make install + gsl_project + SOURCE_DIR ${gsl_external_SOURCE_DIR} + BINARY_DIR ${gsl_external_BINARY_DIR} + CONFIGURE_COMMAND /configure ${GSL_CONFIGURE_OPTIONS} + BUILD_COMMAND $(MAKE) + INSTALL_COMMAND $(MAKE) install + LOG_CONFIGURE TRUE + LOG_BUILD TRUE + LOG_INSTALL TRUE ) set(GSL_INCLUDE_DIRS ${EXTERNAL_INSTALL_LOCATION}/include) -set(GSL_LIBRARIES ${EXTERNAL_INSTALL_LOCATION}/lib/libgsl.a) - include_directories(${GSL_INCLUDE_DIRS}) -set(GSL_FOUND TRUE) + set(GSL_LIBRARIES ${EXTERNAL_INSTALL_LOCATION}/lib/libgsl.a) set(GSL_DOWNLOADED TRUE) +else() + message(STATUS "Found GSL: ${GSL_LIBRARIES}") +endif() -# Find other libraries -find_library(QD_LIBRARIES NAMES qd libqd QUIET) -find_library(SLATEC_LIBRARIES NAMES slatec libslatec QUIET) -# Make SLATEC optional - if not found, create empty library -if(NOT SLATEC_LIBRARIES) - message(STATUS "SLATEC not found, creating stub library") - add_library(slatec_stub STATIC) - target_sources(slatec_stub PRIVATE - ${CMAKE_SOURCE_DIR}/slatec_stub.c - ) - set(SLATEC_LIBRARIES slatec_stub) -endif() +# --- SLATEC (Common Mathematical Library) --- +# First, try to find an installed version. If not found, download and build it. +find_library(SLATEC_LIBRARY NAMES slatec libslatec) +if(NOT SLATEC_LIBRARY) + message(STATUS "SLATEC not found. Building from source...") + FetchContent_Declare( + slatec_external + URL "http://www.netlib.org/slatec/slatec_src.tgz" + URL_HASH SHA1=6100817113c115778eddec5811065be818157554 # SHA1 from CMake docs for this file + ) + FetchContent_Populate(slatec_external) -# Display configuration -message(STATUS "Configuration:") -message(STATUS " USE_MKL: ${USE_MKL}") -message(STATUS " USE_INT64: ${USE_INT64}") -message(STATUS " USE_DIRECT_CBLAS: ${USE_DIRECT_CBLAS}") -message(STATUS " BLAS Libraries: ${BLAS_LIBRARIES}") -message(STATUS " LAPACK Libraries: ${LAPACK_LIBRARIES}") -message(STATUS " CBLAS Libraries: ${CBLAS_LIBRARIES}") -message(STATUS " GSL Libraries: ${GSL_LIBRARIES}") + # Glob all Fortran sources from the downloaded content + file(GLOB SLATEC_SOURCES "${slatec_external_SOURCE_DIR}/*.f") -# Include directories -include_directories(${CMAKE_SOURCE_DIR}/src) -include_directories(${CMAKE_SOURCE_DIR}/src/libmess) -if(GSL_INCLUDE_DIRS) - include_directories(${GSL_INCLUDE_DIRS}) + # Create a static library from the SLATEC sources + add_library(slatec_lib STATIC ${SLATEC_SOURCES}) + + # Set Fortran compiler flags for SLATEC (Fortran 77 compatibility) + target_compile_options(slatec_lib PRIVATE + -std=legacy + -fPIC + -O2 + -w # Suppress warnings for old Fortran code + ) + + # Link Fortran runtime + target_link_libraries(slatec_lib PRIVATE gfortran) + + set(SLATEC_LIBRARIES slatec_lib) + set(SLATEC_DOWNLOADED TRUE) +else() + message(STATUS "Found SLATEC: ${SLATEC_LIBRARY}") + set(SLATEC_LIBRARIES ${SLATEC_LIBRARY}) endif() -# Find MPI early so we can add sources to MESS_SOURCES + +# --- Other Optional Libraries --- +find_library(QD_LIBRARIES NAMES qd libqd) find_package(MPI QUIET) -message(STATUS "MPI_FOUND: ${MPI_FOUND}") -if(MPI_FOUND) - include_directories(${MPI_INCLUDE_PATH}) -endif() -# Source files +# ============================================================================= +# Library Target (messlibs) +# ============================================================================= set(MESS_SOURCES src/libmess/atom.cc + src/libmess/configuration.cc + src/libmess/crossrate.cc + src/libmess/d3.cc + src/libmess/divsur.cc + src/libmess/dynamic.cc + src/libmess/dynlib.cc + src/libmess/graph_common.cc + src/libmess/graph_omp.cc src/libmess/io.cc + src/libmess/key.cc + src/libmess/lapack.cc src/libmess/limits.cc + src/libmess/linpack.cc + src/libmess/logical.cc src/libmess/math.cc - src/libmess/symmetry.cc - src/libmess/d3.cc - src/libmess/key.cc src/libmess/mess.cc - src/libmess/multindex.cc - src/libmess/units.cc - src/libmess/graph_common.cc - src/libmess/lapack.cc + src/libmess/model.cc + src/libmess/monom.cc src/libmess/mpack.cc + src/libmess/multindex.cc src/libmess/permutation.cc - src/libmess/graph_omp.cc - src/libmess/linpack.cc - src/libmess/model.cc - src/libmess/slatec.cc - src/libmess/crossrate.cc + src/libmess/potential.cc src/libmess/random.cc src/libmess/read.cc - src/libmess/divsur.cc - src/libmess/dynamic.cc + src/libmess/slatec.cc src/libmess/structure.cc - src/libmess/configuration.cc - src/libmess/dynlib.cc - src/libmess/monom.cc - src/libmess/logical.cc - src/libmess/potential.cc + src/libmess/symmetry.cc src/libmess/system.cc src/libmess/trajectory.cc + src/libmess/units.cc ) -# Add MPI communication sources if MPI is available -if(MPI_FOUND) - message(STATUS "MPI found, adding communication sources") - list(APPEND MESS_SOURCES - src/libmess/comm.cc - src/libmess/auto_comm.cc - src/libmess/new_comm.cc - ) - list(LENGTH MESS_SOURCES num_sources) - message(STATUS "Total MESS_SOURCES after MPI: ${num_sources}") - message(STATUS "Added MPI communication sources to MESS_SOURCES") +add_library(messlibs STATIC ${MESS_SOURCES}) + +# Add dependencies if they were built from source +if(GSL_DOWNLOADED) + add_dependencies(messlibs gsl_project) endif() -# Create static library -add_library(messlibs STATIC ${MESS_SOURCES}) +# --- Target Properties: Include Directories --- +target_include_directories(messlibs PUBLIC + $ + $ + $ + ${GSL_INCLUDE_DIRS} +) -# Link libraries to messlibs -target_link_libraries(messlibs - ${BLAS_LIBRARIES} - ${LAPACK_LIBRARIES} +# --- Target Properties: Compile Definitions --- +if(USE_INT64) + target_compile_definitions(messlibs PUBLIC -DUSE_INT64) +else() + target_compile_definitions(messlibs PUBLIC -DUSE_32BIT_INTEGERS) +endif() + +# --- Target Properties: Link Libraries --- +target_link_libraries(messlibs PUBLIC + ${LAPACK_LIBRARIES} # LAPACK depends on BLAS, so this is often sufficient ${GSL_LIBRARIES} - gfortran - m - dl + ${SLATEC_LIBRARIES} + m dl # Common system libraries ) -# Add GSL dependency -if(GSL_DOWNLOADED) - add_dependencies(messlibs gsl_external) - endif() - -# Add optional libraries +# --- Conditionally link optional libraries --- if(QD_LIBRARIES) - target_link_libraries(messlibs ${QD_LIBRARIES}) - endif() -if(SLATEC_LIBRARIES) - target_link_libraries(messlibs ${SLATEC_LIBRARIES}) + message(STATUS "Found and linking QD library: ${QD_LIBRARIES}") + target_link_libraries(messlibs PUBLIC ${QD_LIBRARIES}) +else() + message(STATUS "Optional QD library not found, skipping.") endif() -# Source files -set(MESS_SOURCES - src/libmess/atom.cc - src/libmess/io.cc - src/libmess/limits.cc - src/libmess/math.cc - src/libmess/symmetry.cc - src/libmess/d3.cc - src/libmess/key.cc - src/libmess/mess.cc - src/libmess/multindex.cc - src/libmess/units.cc - src/libmess/graph_common.cc - src/libmess/lapack.cc - src/libmess/mpack.cc - src/libmess/permutation.cc - src/libmess/graph_omp.cc - src/libmess/linpack.cc - src/libmess/model.cc - src/libmess/slatec.cc - src/libmess/crossrate.cc - src/libmess/random.cc - src/libmess/read.cc - src/libmess/divsur.cc - src/libmess/dynamic.cc - src/libmess/structure.cc - src/libmess/configuration.cc - src/libmess/dynlib.cc - src/libmess/monom.cc - src/libmess/logical.cc - src/libmess/potential.cc - src/libmess/system.cc - src/libmess/trajectory.cc -) +# --- Handle MPI --- +if(MPI_FOUND) + message(STATUS "MPI found, adding communication sources and linking.") + target_sources(messlibs PRIVATE + src/libmess/comm.cc + src/libmess/auto_comm.cc + src/libmess/new_comm.cc + ) + target_include_directories(messlibs PUBLIC ${MPI_CXX_INCLUDE_PATH}) + target_link_libraries(messlibs PUBLIC MPI::MPI_CXX) +endif() -# Create executables + +# ============================================================================= +# Executable Targets +# ============================================================================= add_executable(mess src/mess_driver.cc) add_executable(mess-v2 src/mess_test.cc) add_executable(messpf src/partition_function.cc) -if(MPI_FOUND) - add_executable(messabs src/mess_mpi.cc) - target_link_libraries(messabs MPI::MPI_CXX) - else() - message(STATUS "MPI not found, skipping messabs executable") - endif() add_executable(messsym src/gumbo.cc) +add_executable(test_integer_interface test_mkl_ilp64.cpp) -# Link executables -target_link_libraries(mess messlibs ${CBLAS_LIBRARIES}) -target_link_libraries(mess-v2 messlibs ${CBLAS_LIBRARIES}) -target_link_libraries(messpf messlibs ${CBLAS_LIBRARIES}) -if(MPI_FOUND) - target_link_libraries(messabs messlibs ${CBLAS_LIBRARIES}) -endif() -target_link_libraries(messsym messlibs ${CBLAS_LIBRARIES}) +# Link all standard executables to the main library +target_link_libraries(mess messlibs) +target_link_libraries(mess-v2 messlibs) +target_link_libraries(messpf messlibs) +target_link_libraries(messsym messlibs) +target_link_libraries(test_integer_interface messlibs) -# Test program -add_executable(test_integer_interface test_mkl_ilp64.cpp) -target_link_libraries(test_integer_interface messlibs ${CBLAS_LIBRARIES}) \ No newline at end of file +# Handle MPI executable separately +if(MPI_FOUND) + add_executable(messabs src/mess_mpi.cc) + target_link_libraries(messabs messlibs) +endif() \ No newline at end of file From abeb9596a9f2d9902b048e5125b0938879cb0c40 Mon Sep 17 00:00:00 2001 From: Murat Keceli Date: Sun, 28 Sep 2025 14:59:26 -0500 Subject: [PATCH 04/12] Add an option to use conda env libraries --- CMakeLists.txt | 74 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 62 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 930d343..d3643c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,7 @@ set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/_deps) # ============================================================================= option(USE_MKL "Use Intel MKL instead of OpenBLAS" OFF) option(USE_INT64 "Use 64-bit integers for BLAS/LAPACK (ILP64 interface)" OFF) +option(USE_CONDA_LIBS "Use libraries from conda environment" OFF) # option(USE_DIRECT_CBLAS "Use direct CBLAS instead of GSL's wrapper" OFF) # This option was unused. # ============================================================================= @@ -30,25 +31,67 @@ include(FetchContent) # --- BLAS / LAPACK Configuration --- message(STATUS "Configuring BLAS and LAPACK...") -if(USE_MKL) +if(USE_CONDA_LIBS) + message(STATUS "Using conda environment libraries") + set(CONDA_LIB_PATH "/home/keceli/miniconda3/envs/kmess-env/lib") + + if(USE_MKL) + message(STATUS "Using Intel MKL from conda") + # Use explicit MKL libraries to ensure proper 64-bit integer support + if(USE_INT64) + set(BLAS_LIBRARIES + ${CONDA_LIB_PATH}/libmkl_intel_ilp64.so + ${CONDA_LIB_PATH}/libmkl_gnu_thread.so + ${CONDA_LIB_PATH}/libmkl_core.so + m + dl + gomp + ) + set(LAPACK_LIBRARIES ${BLAS_LIBRARIES}) + message(STATUS " - Using 64-bit integers (ILP64)") + else() + set(BLAS_LIBRARIES + ${CONDA_LIB_PATH}/libmkl_intel_lp64.so + ${CONDA_LIB_PATH}/libmkl_gnu_thread.so + ${CONDA_LIB_PATH}/libmkl_core.so + m + dl + gomp + ) + set(LAPACK_LIBRARIES ${BLAS_LIBRARIES}) + message(STATUS " - Using 32-bit integers (LP64)") + endif() + else() + message(STATUS "Using OpenBLAS from conda") + set(BLAS_LIBRARIES ${CONDA_LIB_PATH}/libopenblas.so) + set(LAPACK_LIBRARIES ${CONDA_LIB_PATH}/libopenblas.so) + if(USE_INT64) + message(STATUS " - Using 64-bit integers (ILP64)") + else() + message(STATUS " - Using 32-bit integers (LP64)") + endif() + endif() +elseif(USE_MKL) message(STATUS "Using Intel MKL") if(USE_INT64) set(BLAS_LIBRARIES /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_intel_ilp64.so - /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_sequential.so + /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_gnu_thread.so /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_core.so m dl + gomp ) set(LAPACK_LIBRARIES ${BLAS_LIBRARIES}) message(STATUS " - Using 64-bit integers (ILP64)") else() set(BLAS_LIBRARIES /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_intel_lp64.so - /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_sequential.so + /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_gnu_thread.so /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_core.so m dl + gomp ) set(LAPACK_LIBRARIES ${BLAS_LIBRARIES}) message(STATUS " - Using 32-bit integers (LP64)") @@ -70,9 +113,15 @@ message(STATUS "LAPACK Libraries: ${LAPACK_LIBRARIES}") # --- GSL (GNU Scientific Library) --- # First, try to find an installed version. If not found, download and build it. -find_package(GSL QUIET) -if(NOT GSL_FOUND) - message(STATUS "GSL not found. Building from source...") +if(USE_CONDA_LIBS) + message(STATUS "Using GSL from conda environment") + set(GSL_INCLUDE_DIRS "/home/keceli/miniconda3/envs/kmess-env/include") + set(GSL_LIBRARIES "/home/keceli/miniconda3/envs/kmess-env/lib/libgsl.so") + set(GSL_DOWNLOADED TRUE) +else() + find_package(GSL QUIET) + if(NOT GSL_FOUND) + message(STATUS "GSL not found. Building from source...") FetchContent_Declare( gsl_external URL "https://ftp.gnu.org/gnu/gsl/gsl-2.8.tar.gz" @@ -101,11 +150,12 @@ if(NOT GSL_FOUND) LOG_INSTALL TRUE ) - set(GSL_INCLUDE_DIRS ${EXTERNAL_INSTALL_LOCATION}/include) - set(GSL_LIBRARIES ${EXTERNAL_INSTALL_LOCATION}/lib/libgsl.a) - set(GSL_DOWNLOADED TRUE) -else() - message(STATUS "Found GSL: ${GSL_LIBRARIES}") + set(GSL_INCLUDE_DIRS ${EXTERNAL_INSTALL_LOCATION}/include) + set(GSL_LIBRARIES ${EXTERNAL_INSTALL_LOCATION}/lib/libgsl.a) + set(GSL_DOWNLOADED TRUE) + else() + message(STATUS "Found GSL: ${GSL_LIBRARIES}") + endif() endif() @@ -190,7 +240,7 @@ set(MESS_SOURCES add_library(messlibs STATIC ${MESS_SOURCES}) # Add dependencies if they were built from source -if(GSL_DOWNLOADED) +if(GSL_DOWNLOADED AND NOT USE_CONDA_LIBS) add_dependencies(messlibs gsl_project) endif() From e659f5ddbb8b742fd437069f0cdac20dcc6b6d59 Mon Sep 17 00:00:00 2001 From: Murat Keceli Date: Sun, 28 Sep 2025 15:00:13 -0500 Subject: [PATCH 05/12] Remove inits that might cause slow down --- src/libmess/array.hh | 3 --- src/libmess/mess.cc | 4 +--- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/libmess/array.hh b/src/libmess/array.hh index 570a899..8dfcbad 100644 --- a/src/libmess/array.hh +++ b/src/libmess/array.hh @@ -733,9 +733,6 @@ void Array::resize (int64_t s) for(const T* it = begin(); it != end(); ++it, ++vit) *vit = *it; delete[] _begin; - } else { - // Initialize new memory to zero for primitive types - std::fill(new_begin, new_begin + s, T(0)); } _capacity = _size = s; diff --git a/src/libmess/mess.cc b/src/libmess/mess.cc index 03edc46..fb31515 100644 --- a/src/libmess/mess.cc +++ b/src/libmess/mess.cc @@ -6753,9 +6753,7 @@ MasterEquation::Well::Well (const Model::Well& model) // CRM basis // - if(size() > 0) { - _set_crm_basis(); - } + _set_crm_basis(); if(with_crm_basis) { // From f78eeb597af3c61af1e8bb7247ce9c7b874e247e Mon Sep 17 00:00:00 2001 From: Murat Keceli Date: Sun, 28 Sep 2025 15:00:23 -0500 Subject: [PATCH 06/12] Use dgemm TODO: Check with Yuri about the reason of removing them before --- src/libmess/lapack.cc | 33 ++++----------------------------- 1 file changed, 4 insertions(+), 29 deletions(-) diff --git a/src/libmess/lapack.cc b/src/libmess/lapack.cc index 65f1f78..81d1e63 100644 --- a/src/libmess/lapack.cc +++ b/src/libmess/lapack.cc @@ -273,21 +273,8 @@ Lapack::Matrix Lapack::Matrix::operator* (Matrix m) const Matrix res(size1(), m.size2()); - int_t n = size1() * m.size2(); - -#pragma omp parallel for default(shared) schedule(static) - - for(int_t k = 0; k < n; ++k) { - // - int_t i = k / m.size2(); - - int_t j = k % m.size2(); - - res(i, j) = vdot(row(i), (ConstSlice)m.column(j)); - } - - //dgemm_('N', 'N', size1(), m.size2(), size2(), 1., - //*this, size1(), m, m.size1(), 0., res, size1()); + dgemm_('N', 'N', size1(), m.size2(), size2(), 1., + *this, size1(), m, m.size1(), 0., res, size1()); return res; } @@ -319,13 +306,7 @@ Lapack::Vector Lapack::Matrix::operator* (const double* v) const Vector res(size1()); -#pragma omp parallel for default(shared) schedule(static) - - for(int_t i = 0; i < size1(); ++i) - // - res[i] = vdot(row(i), v); - - //dgemv_('N', size1(), size2(), 1., *this, size1(), v, 1, 0., res, 1); + dgemv_('N', size1(), size2(), 1., *this, size1(), v, 1, 0., res, 1); return res; } @@ -335,13 +316,7 @@ Lapack::Vector Lapack::operator* (const double* v, Matrix m) Vector res(m.size2()); -#pragma omp parallel for default(shared) schedule(static) - - for(int_t i = 0; i < m.size2(); ++i) - // - res[i] = vdot(m.column(i), v); - - //dgemv_('T', m.size1(), m.size2(), 1., m, m.size1(), v, 1, 0., res, 1); + dgemv_('T', m.size1(), m.size2(), 1., m, m.size1(), v, 1, 0., res, 1); return res; } From 28687178b6ecbc310bb5adc57283191fbf390e9d Mon Sep 17 00:00:00 2001 From: Murat Keceli Date: Sun, 28 Sep 2025 15:30:42 -0500 Subject: [PATCH 07/12] Fix CI error --- CMakeLists.txt | 44 +++++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d3643c9..9f9ddef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ # ============================================================================= # Project Definition # ============================================================================= -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.22) project(MESS LANGUAGES C CXX Fortran) # ============================================================================= @@ -15,6 +15,10 @@ set(CMAKE_CXX_EXTENSIONS OFF) # Use a dedicated folder for external projects to keep the build directory clean set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/_deps) +# Include required modules +include(FetchContent) +include(ExternalProject) + # ============================================================================= # Project Options # ============================================================================= @@ -122,11 +126,20 @@ else() find_package(GSL QUIET) if(NOT GSL_FOUND) message(STATUS "GSL not found. Building from source...") - FetchContent_Declare( - gsl_external - URL "https://ftp.gnu.org/gnu/gsl/gsl-2.8.tar.gz" - URL_HASH SHA256=6a99eeed15632c6354895b1dd542ed5a855c0f15d9ad1326c6fe2b2c9e423190 - ) + if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.24") + FetchContent_Declare( + gsl_external + URL "https://ftp.gnu.org/gnu/gsl/gsl-2.8.tar.gz" + URL_HASH SHA256=6a99eeed15632c6354895b1dd542ed5a855c0f15d9ad1326c6fe2b2c9e423190 + DOWNLOAD_EXTRACT_TIMESTAMP TRUE + ) + else() + FetchContent_Declare( + gsl_external + URL "https://ftp.gnu.org/gnu/gsl/gsl-2.8.tar.gz" + URL_HASH SHA256=6a99eeed15632c6354895b1dd542ed5a855c0f15d9ad1326c6fe2b2c9e423190 + ) + endif() FetchContent_MakeAvailable(gsl_external) # Configure GSL to use the BLAS library we found earlier @@ -164,11 +177,20 @@ endif() find_library(SLATEC_LIBRARY NAMES slatec libslatec) if(NOT SLATEC_LIBRARY) message(STATUS "SLATEC not found. Building from source...") - FetchContent_Declare( - slatec_external - URL "http://www.netlib.org/slatec/slatec_src.tgz" - URL_HASH SHA1=6100817113c115778eddec5811065be818157554 # SHA1 from CMake docs for this file - ) + if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.24") + FetchContent_Declare( + slatec_external + URL "http://www.netlib.org/slatec/slatec_src.tgz" + URL_HASH SHA1=6100817113c115778eddec5811065be818157554 + DOWNLOAD_EXTRACT_TIMESTAMP TRUE + ) + else() + FetchContent_Declare( + slatec_external + URL "http://www.netlib.org/slatec/slatec_src.tgz" + URL_HASH SHA1=6100817113c115778eddec5811065be818157554 + ) + endif() FetchContent_Populate(slatec_external) # Glob all Fortran sources from the downloaded content From a76422aa8d5c9c2edbb6ca35c92ae4bbbcb7cfad Mon Sep 17 00:00:00 2001 From: Murat Keceli Date: Sun, 28 Sep 2025 16:08:44 -0500 Subject: [PATCH 08/12] Remove test_mkl_ilp64.cpp test executable - Removed test_integer_interface executable from CMakeLists.txt - Deleted test_mkl_ilp64.cpp source file - Cleaned up build configuration --- CMakeLists.txt | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f9ddef..0b6a0be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,7 +43,7 @@ if(USE_CONDA_LIBS) message(STATUS "Using Intel MKL from conda") # Use explicit MKL libraries to ensure proper 64-bit integer support if(USE_INT64) - set(BLAS_LIBRARIES + set(BLAS_LIBRARIES ${CONDA_LIB_PATH}/libmkl_intel_ilp64.so ${CONDA_LIB_PATH}/libmkl_gnu_thread.so ${CONDA_LIB_PATH}/libmkl_core.so @@ -54,7 +54,7 @@ if(USE_CONDA_LIBS) set(LAPACK_LIBRARIES ${BLAS_LIBRARIES}) message(STATUS " - Using 64-bit integers (ILP64)") else() - set(BLAS_LIBRARIES + set(BLAS_LIBRARIES ${CONDA_LIB_PATH}/libmkl_intel_lp64.so ${CONDA_LIB_PATH}/libmkl_gnu_thread.so ${CONDA_LIB_PATH}/libmkl_core.so @@ -163,12 +163,12 @@ else() LOG_INSTALL TRUE ) - set(GSL_INCLUDE_DIRS ${EXTERNAL_INSTALL_LOCATION}/include) + set(GSL_INCLUDE_DIRS ${EXTERNAL_INSTALL_LOCATION}/include) set(GSL_LIBRARIES ${EXTERNAL_INSTALL_LOCATION}/lib/libgsl.a) - set(GSL_DOWNLOADED TRUE) - else() - message(STATUS "Found GSL: ${GSL_LIBRARIES}") - endif() + set(GSL_DOWNLOADED TRUE) +else() + message(STATUS "Found GSL: ${GSL_LIBRARIES}") +endif() endif() @@ -317,14 +317,12 @@ add_executable(mess src/mess_driver.cc) add_executable(mess-v2 src/mess_test.cc) add_executable(messpf src/partition_function.cc) add_executable(messsym src/gumbo.cc) -add_executable(test_integer_interface test_mkl_ilp64.cpp) # Link all standard executables to the main library target_link_libraries(mess messlibs) target_link_libraries(mess-v2 messlibs) target_link_libraries(messpf messlibs) target_link_libraries(messsym messlibs) -target_link_libraries(test_integer_interface messlibs) # Handle MPI executable separately if(MPI_FOUND) From d6faf01f56435735c237adbe577e934636bfdae3 Mon Sep 17 00:00:00 2001 From: Murat Keceli Date: Sun, 28 Sep 2025 16:23:49 -0500 Subject: [PATCH 09/12] Fix GSL configure command for CI - Remove malformed LDFLAGS and LIBS from GSL_CONFIGURE_OPTIONS - Use CMAKE_COMMAND -E env to properly set environment variables - Fix LDFLAGS to point to correct library directory - This should resolve the CI build failure --- CMakeLists.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b6a0be..f67ebfb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -147,15 +147,13 @@ else() "--prefix=${EXTERNAL_INSTALL_LOCATION}" "--disable-shared" "--enable-static" - "LDFLAGS=-L${BLAS_LIBRARY_DIRS}" - "LIBS=${BLAS_LIBRARIES}" ) ExternalProject_Add( gsl_project SOURCE_DIR ${gsl_external_SOURCE_DIR} BINARY_DIR ${gsl_external_BINARY_DIR} - CONFIGURE_COMMAND /configure ${GSL_CONFIGURE_OPTIONS} + CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env LDFLAGS="-L/usr/lib/x86_64-linux-gnu" LIBS="${BLAS_LIBRARIES}" /configure ${GSL_CONFIGURE_OPTIONS} BUILD_COMMAND $(MAKE) INSTALL_COMMAND $(MAKE) install LOG_CONFIGURE TRUE From 7dcdb35560e4a7c96042642279dbab4212315934 Mon Sep 17 00:00:00 2001 From: Murat Keceli Date: Sun, 28 Sep 2025 17:40:41 -0500 Subject: [PATCH 10/12] Fix GSL configure environment variable quoting - Properly quote environment variables in CMAKE_COMMAND -E env - This should resolve the syntax warning and command parsing issues - Fixes CI build failure with GSL configure step --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f67ebfb..8f163a9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -153,7 +153,7 @@ else() gsl_project SOURCE_DIR ${gsl_external_SOURCE_DIR} BINARY_DIR ${gsl_external_BINARY_DIR} - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env LDFLAGS="-L/usr/lib/x86_64-linux-gnu" LIBS="${BLAS_LIBRARIES}" /configure ${GSL_CONFIGURE_OPTIONS} + CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env "LDFLAGS=-L/usr/lib/x86_64-linux-gnu" "LIBS=${BLAS_LIBRARIES}" /configure ${GSL_CONFIGURE_OPTIONS} BUILD_COMMAND $(MAKE) INSTALL_COMMAND $(MAKE) install LOG_CONFIGURE TRUE From bcf344f07707c63b378f8999cefa66ba7702b8aa Mon Sep 17 00:00:00 2001 From: Murat Keceli Date: Sun, 28 Sep 2025 19:08:49 -0500 Subject: [PATCH 11/12] Simplify GSL build for CI reliability - Use GSL's internal CBLAS instead of trying to link external BLAS - Remove complex environment variable setup that was causing build failures - This should make the CI build more reliable and avoid linking issues - GSL will use its internal CBLAS implementation which is sufficient for basic operations --- CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8f163a9..a325448 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -142,18 +142,19 @@ else() endif() FetchContent_MakeAvailable(gsl_external) - # Configure GSL to use the BLAS library we found earlier + # Configure GSL with internal CBLAS (more reliable for CI) set(GSL_CONFIGURE_OPTIONS "--prefix=${EXTERNAL_INSTALL_LOCATION}" "--disable-shared" "--enable-static" + "--with-cblas=internal" ) ExternalProject_Add( gsl_project SOURCE_DIR ${gsl_external_SOURCE_DIR} BINARY_DIR ${gsl_external_BINARY_DIR} - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env "LDFLAGS=-L/usr/lib/x86_64-linux-gnu" "LIBS=${BLAS_LIBRARIES}" /configure ${GSL_CONFIGURE_OPTIONS} + CONFIGURE_COMMAND /configure ${GSL_CONFIGURE_OPTIONS} BUILD_COMMAND $(MAKE) INSTALL_COMMAND $(MAKE) install LOG_CONFIGURE TRUE From d38bc54d73bc766e67f98244a029bed7a5bfb453 Mon Sep 17 00:00:00 2001 From: Murat Keceli Date: Mon, 29 Sep 2025 00:09:40 -0500 Subject: [PATCH 12/12] Set CMAKE_BUILD_TYPE Release as default and add build configuration summary - Set CMAKE_BUILD_TYPE to Release by default if not specified - Add comprehensive build configuration summary at configure time - Display build type, C++ standard, and all project options - Makes it easier to verify build settings during configuration --- CMakeLists.txt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index a325448..11c1fbf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,25 @@ option(USE_INT64 "Use 64-bit integers for BLAS/LAPACK (ILP64 interface)" OFF) option(USE_CONDA_LIBS "Use libraries from conda environment" OFF) # option(USE_DIRECT_CBLAS "Use direct CBLAS instead of GSL's wrapper" OFF) # This option was unused. +# ============================================================================= +# Build Configuration +# ============================================================================= +# Set default build type to Release if not specified +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE) +endif() + +# Print build configuration +message(STATUS "==========================================") +message(STATUS "MESS Build Configuration") +message(STATUS "==========================================") +message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}") +message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") +message(STATUS "USE_MKL: ${USE_MKL}") +message(STATUS "USE_INT64: ${USE_INT64}") +message(STATUS "USE_CONDA_LIBS: ${USE_CONDA_LIBS}") +message(STATUS "==========================================") + # ============================================================================= # Find Dependencies (BLAS, LAPACK, GSL, MPI, etc.) # =============================================================================