diff --git a/BASIS/CMakeLists.txt b/BASIS/CMakeLists.txt new file mode 100644 index 0000000..ad755a4 --- /dev/null +++ b/BASIS/CMakeLists.txt @@ -0,0 +1,7 @@ +set(dir "${CMAKE_CURRENT_SOURCE_DIR}") + +file(GLOB BASIS_LIB CONFIGURE_DEPENDS *) + +foreach(BASIS ${BASIS_LIB}) + install(FILES ${BASIS} DESTINATION share/BASIS) +endforeach() \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..3bda11e --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,212 @@ +cmake_minimum_required(VERSION 3.22) + +project(MRCC + VERSION "" #"2022-03-18" + LANGUAGES C Fortran) + +set(CMAKE_C_STANDARD 99) +set(CMAKE_Fortran_STANDARD 2003) + +option(ENABLE_OPENMP "Enable OpenMP parallelization" OFF) +option(ENABLE_MPI "Enable MPI parallelization" OFF) +option(ENABLE_LIBXC "Enable LibXC library" OFF) +option(ENABLE_PCM "Enable PCMSolver library" OFF) +option(ENABLE_HDF5 "Enable HDF5 library" OFF) + +option(INTEGER_64BIT "Use 64-bit integers" ON) +option(EXTERNAL_FLAGS "External flags, like `-march=native`" "") + +if(INTEGER_64BIT) + add_definitions(-DINT64) + add_definitions(-DMPI_INTEGER_MRCC=MPI_INTEGER8) + set(BLA_SIZEOF_INTEGER 8) +else() + add_definitions(-DINT32) + add_definitions(-DMPI_INTEGER_MRCC=MPI_INTEGER4) + set(BLA_SIZEOF_INTEGER 4) +endif() + +find_package(BLAS REQUIRED) +find_package(LAPACK REQUIRED) + +string(FIND "${BLAS_LIBRARIES}" "mkl" ENABLE_MKL) +if(ENABLE_MKL GREATER -1) + add_definitions(-DMKL) +endif() +unset(ENABLE_MKL) + +if(ENABLE_OPENMP) + find_package(OpenMP 3.0 REQUIRED) +endif() + +if(ENABLE_MPI) + find_package(MPI REQUIRED) + add_definitions(-DOPENMPI) +endif() + +if(ENABLE_LIBXC) + add_definitions(-DLIBXC) +endif() + +if(ENABLE_PCM) + add_definitions(-DPCM) + enable_language(CXX) +endif() + +if(ENABLE_HDF5) + message(FATAL_ERROR "HDF5 is not supporting!") +endif() + +add_subdirectory(external) + +if("${CMAKE_Fortran_COMPILER_ID}" STREQUAL "GNU") + add_compile_options($<$:-cpp>) + add_compile_options($<$:-std=legacy>) + add_compile_options($<$:-ffree-line-length-none>) + add_compile_options($<$:-w>) # for CMake debugging + add_definitions(-Dgfortran) + if(INTEGER_64BIT) + add_compile_options($<$:-fdefault-integer-8>) + endif() + if(CMAKE_Fortran_COMPILER_VERSION VERSION_GREATER 10.0) + add_compile_options($<$:-fallow-argument-mismatch>) + endif() +elseif("${CMAKE_Fortran_COMPILER_ID}" STREQUAL "Flang") + add_compile_options($<$:-cpp>) + if(INTEGER_64BIT) + add_compile_options($<$:-fdefault-integer-8>) + endif() + # For Armflang, F90-F-0000-Internal compiler error. no type conversion available 0 (/home/ger/Proj/MRCC/source/combin.f: 1611) + message(FATAL_ERROR "${CMAKE_Fortran_COMPILER_ID} is not supporting!") +elseif("${CMAKE_Fortran_COMPILER_ID}" STREQUAL "Intel") + set(INTEL_FFLAGS "SHELL:-assume byterecl") + add_compile_options($<$:-fpp>) + add_compile_options($<$:${INTEL_FFLAGS}>) + unset(INTEL_FFLAGS) + if(INTEGER_64BIT) + add_compile_options($<$:-i8>) + endif() +elseif("${CMAKE_Fortran_COMPILER_ID}" STREQUAL "IntelLLVM") + add_compile_options($<$:-i8>) + message(FATAL_ERROR "${CMAKE_Fortran_COMPILER_ID} is not supporting!") +else() + message(FATAL_ERROR "${CMAKE_Fortran_COMPILER_ID} is not supporting!") +endif() + +add_compile_options(${EXTERNAL_FLAGS}) + +set(MRCCEXE goldstone mrcc integ scf ovirt orbloc mulli prop ccsd uccsd xmrcc drpa cis mp2f12 minp qmmod dirac_mointegral_export dmrcc) +set(MRCCEXE_MPI mrcc_mpi scf_mpi ccsd_mpi xmrcc_mpi drpa_mpi dmrcc_mpi mrcc_manager) + +# often used libraries +set(MRCC_OFTENUSED_LIB brasub brasub_1der brasub_3der cfunc combin derspher_3der df2intsubs df2intsubs_rangesep df3int dfint dfint_triplets dfint_triplets_3der dfint_triplets_rangesep dfintder1c dfintloc dprscr dprscrsubs ecp ellip hrrspher hrrsub_3der hrrsub_ader hrrsub_bder hrrsub_cder intio intsub intsub_3der intsub_ader intsub_bder intsub_cder intsub_rangesep ketsub_1der mem mulint_shc nucat1 nucat1_shc nuceq1 nuceq1_shc onein1 onein1_sh onein1_shc oneint oneint_sh oneint_shc rearrsubs signal sphersubs teint xalloc) +# no-MPI +set(MRCC_goldstone_LIB goldstone mem xalloc combin signal qsorti cfunc) +set(MRCC_mrcc_LIB mrcc lambda pert mem xalloc combin signal sacc dcommunicate3 cfunc) +set(MRCC_integ_LIB integ calcorb z2c nucint nucint_shc) +set(MRCC_scf_LIB scf hessgrad diis dft calcorb calcorbd calcorbh func pssp semint_shc denschol pml bopu nucint nucint_shc boys localize) +set(MRCC_ovirt_LIB ovirt intio combin signal cfunc) +set(MRCC_orbloc_LIB orbloc mem xalloc combin signal denschol pml cfunc boys localize) +set(MRCC_mulli_LIB mulli mem xalloc combin signal bopu cfunc) +set(MRCC_prop_LIB prop propcore denschol diis dft calcorb calcorbd calcorbh func pssp semint_shc pml nucint nucint_shc) +set(MRCC_ccsd_LIB ccsd ccsdmain diis laplace mem xalloc combin signal assembly cfunc) +set(MRCC_uccsd_LIB uccsd uccsdmain diis mem xalloc combin assembly signal laplace cfunc) +set(MRCC_xmrcc_LIB xmrcc xlambda xpert xmem combin signal xalloc cfunc) +set(MRCC_drpa_LIB drpa ldrpa loccis drpagrad laplace calcorb bopu assembly ccsd diis local driver uccsd) +set(MRCC_cis_LIB cis cis2 diis laplace bopu calcorb dft calcorbd calcorbh func pssp semint_shc nucint nucint_shc) +set(MRCC_mp2f12_LIB mp2f12 diis semint_shc nucint nucint_shc) +set(MRCC_minp_LIB minp combin signal cfunc) +set(MRCC_qmmod_LIB qmmod combin signal mem xalloc bopu cfunc) +set(MRCC_dirac_mointegral_export_LIB dirac_mointegral_export cfunc) +set(MRCC_dmrcc_LIB dmrcc basopt geomopt optim combin signal z2c freqdrv cfunc compmod driver) +set(MRCC_mrcc_manager_LIB mrcc_manager_main mrcc_manager cfunc combin signal) +# Add OFTENUSED libraries +list(APPEND MRCC_integ_LIB ${MRCC_OFTENUSED_LIB}) +list(APPEND MRCC_scf_LIB ${MRCC_OFTENUSED_LIB}) +list(APPEND MRCC_prop_LIB ${MRCC_OFTENUSED_LIB}) +list(APPEND MRCC_drpa_LIB ${MRCC_OFTENUSED_LIB}) +list(APPEND MRCC_cis_LIB ${MRCC_OFTENUSED_LIB}) +list(APPEND MRCC_mp2f12_LIB ${MRCC_OFTENUSED_LIB}) +# MPI; add more libraries, if necessary +set(MRCC_mrcc_mpi_ADDLIB ) +set(MRCC_scf_mpi_ADDLIB ) +set(MRCC_ccsd_mpi_ADDLIB mrcc_manager) +set(MRCC_xmrcc_mpi_ADDLIB ) +set(MRCC_drpa_mpi_ADDLIB mrcc_manager) +set(MRCC_dmrcc_mpi_ADDLIB ) +set(MRCC_mrcc_manager_ADDLIB ) + +if(ENABLE_MPI) + list(APPEND MRCCEXE ${MRCCEXE_MPI}) +endif() + +set(MRCC_MPI_LIBRARIES) + +add_subdirectory(BASIS) +add_subdirectory(MTEST) +add_subdirectory(source) + +foreach(EXE ${MRCCEXE}) + set(MRCC_LINK_LIBS) + string(REPLACE "_mpi" "" EXE_noMPI ${EXE}) + if(${EXE} IN_LIST MRCCEXE_MPI) + foreach(LIB ${MRCC_${EXE_noMPI}_LIB}) + if(${LIB}_mpi_lib IN_LIST MRCC_MPI_LIBRARIES) + list(APPEND MRCC_LINK_LIBS ${LIB}_mpi_lib) + else() + list(APPEND MRCC_LINK_LIBS ${LIB}_lib) + endif() + endforeach() + foreach(LIB ${MRCC_${EXE}_ADDLIB}) + list(APPEND MRCC_LINK_LIBS ${LIB}_lib) + endforeach() + else() + foreach(LIB ${MRCC_${EXE_noMPI}_LIB}) + list(APPEND MRCC_LINK_LIBS ${LIB}_lib) + endforeach() + endif() + add_executable(${EXE} ${CMAKE_SOURCE_DIR}/source/null.f) + target_link_libraries(${EXE} PRIVATE ${MRCC_LINK_LIBS}) + target_link_libraries(${EXE} PRIVATE ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES}) + if(${EXE} IN_LIST MRCCEXE_MPI) + target_link_libraries(${EXE} PRIVATE ${MPI_Fortran_LIBRARIES}) + endif() +endforeach() + +if(ENABLE_LIBXC) + foreach(EXE integ scf prop cis minp) + add_dependencies(${EXE} libxc) + target_link_libraries(${EXE} PRIVATE xcf03 xc) + target_link_directories(${EXE} PRIVATE ${CMAKE_BINARY_DIR}/external/libxc/src/libxc-build-${CMAKE_Fortran_COMPILER_ID}) + if(ENABLE_MPI) + if(${EXE}_mpi IN_LIST MRCCEXE_MPI) + add_dependencies(${EXE}_mpi libxc) + target_link_libraries(${EXE}_mpi PRIVATE xcf03 xc) + target_link_directories(${EXE}_mpi PRIVATE ${CMAKE_BINARY_DIR}/external/libxc/src/libxc-build-${CMAKE_Fortran_COMPILER_ID}) + endif() + endif() + endforeach() +endif() + +if(ENABLE_PCM) + foreach(EXE scf) + add_dependencies(${EXE} pcmsolver) + target_link_libraries(${EXE} PRIVATE pcm_lib) + target_link_libraries(${EXE} PRIVATE pcm) + target_link_directories(${EXE} PRIVATE ${CMAKE_BINARY_DIR}/external/pcmsolver/src/pcmsolver-build-${CMAKE_Fortran_COMPILER_ID}/lib64) + if(ENABLE_MPI) + if(${EXE}_mpi IN_LIST MRCCEXE_MPI) + add_dependencies(${EXE}_mpi pcmsolver) + target_link_libraries(${EXE}_mpi PRIVATE pcm_lib) + target_link_libraries(${EXE}_mpi PRIVATE pcm) + target_link_directories(${EXE}_mpi PRIVATE ${CMAKE_BINARY_DIR}/external/pcmsolver/src/pcmsolver-build-${CMAKE_Fortran_COMPILER_ID}/lib64) + endif() + endif() + endforeach() +endif() + +foreach(EXE ${MRCCEXE}) + install(TARGETS ${EXE}) +endforeach() + +install(FILES ${CMAKE_SOURCE_DIR}/manual.pdf DESTINATION doc) diff --git a/MTEST/CMakeLists.txt b/MTEST/CMakeLists.txt new file mode 100644 index 0000000..663b604 --- /dev/null +++ b/MTEST/CMakeLists.txt @@ -0,0 +1,7 @@ +set(dir "${CMAKE_CURRENT_SOURCE_DIR}") + +file(GLOB MTEST CONFIGURE_DEPENDS *) + +foreach(TEST ${MTEST}) + install(FILES ${TEST} DESTINATION share/MTEST) +endforeach() \ No newline at end of file diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt new file mode 100644 index 0000000..e8c9482 --- /dev/null +++ b/external/CMakeLists.txt @@ -0,0 +1,39 @@ +include(ExternalProject) + +if(ENABLE_LIBXC) + ExternalProject_Add(libxc + PREFIX ${CMAKE_SOURCE_DIR}/external/libxc + URL https://gitlab.com/libxc/libxc/-/archive/5.1.7/libxc-5.1.7.tar.gz + URL_HASH SHA256=1d50e1a92e59b5f3c8e7408f8612f0fb0e953d4f159515b7d81485891f3a1bbc + BINARY_DIR ${CMAKE_BINARY_DIR}/external/libxc/src/libxc-build-${CMAKE_Fortran_COMPILER_ID} + STAMP_DIR ${CMAKE_BINARY_DIR}/external/libxc/src/libxc-stamp-${CMAKE_Fortran_COMPILER_ID} + UPDATE_COMMAND "" + INSTALL_COMMAND "" + CMAKE_ARGS -DDISABLE_VXC=OFF + -DDISABLE_FXC=OFF + -DDISABLE_KXC=ON + -DDISABLE_LXC=ON + -DENABLE_FORTRAN=ON + -DBUILD_TESTING=ON + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DCMAKE_Fortran_COMPILER=${CMAKE_Fortran_COMPILER} + -DCMAKE_GENERATOR:INTERNAL=${CMAKE_GENERATOR} + ) +endif() + +if(ENABLE_PCM) + ExternalProject_Add(pcmsolver + PREFIX ${CMAKE_SOURCE_DIR}/external/pcmsolver + URL https://github.com/foxtran/pcmsolver/archive/refs/tags/v1.3.1.tar.gz + URL_HASH SHA256=1006b23b0b7d40d04391944e62ccaf8e055ce1324504c2e5b9ad4a244858c09b + BINARY_DIR ${CMAKE_BINARY_DIR}/external/pcmsolver/src/pcmsolver-build-${CMAKE_Fortran_COMPILER_ID} + STAMP_DIR ${CMAKE_BINARY_DIR}/external/pcmsolver/src/pcmsolver-stamp-${CMAKE_Fortran_COMPILER_ID} + UPDATE_COMMAND "" + INSTALL_COMMAND "" + CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DCMAKE_Fortran_COMPILER=${CMAKE_Fortran_COMPILER} + -DCMAKE_GENERATOR:INTERNAL=${CMAKE_GENERATOR} + ) +endif() \ No newline at end of file diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt new file mode 100644 index 0000000..4ce145c --- /dev/null +++ b/source/CMakeLists.txt @@ -0,0 +1,88 @@ +set(dir "${CMAKE_CURRENT_SOURCE_DIR}") + +set(MRCCSTUFF_F assembly basopt bopu boys brasub brasub_1der brasub_3der calcorb calcorbd calcorbh ccsd ccsdmain cis cis2 combin compmod dcommunicate3 denschol derspher_3der df2intsubs df2intsubs_rangesep df3int dfint dfint_triplets dfint_triplets_3der dfint_triplets_rangesep dfintder1c dfintloc dft diis dmrcc dprscr dprscrsubs driver drpa drpagrad ecp ellip flush freqdrv func geomopt goldstone hessgrad hrrspher hrrsub_3der hrrsub_ader hrrsub_bder hrrsub_cder integ intsub intsub_3der intsub_ader intsub_bder intsub_cder intsub_rangesep ketsub_1der lambda laplace ldrpa local localize loccis mem minp mp2f12 mrcc mulint_shc mulli nucat1 nucat1_shc nuceq1 nuceq1_shc nucint nucint_shc onein1 onein1_sh onein1_shc oneint oneint_sh oneint_shc orbloc ovirt pert pml prop propcore pssp qmmod qsorti rearrsubs sacc scf semint_shc sphersubs teint uccsd uccsdmain xlambda xmem xmrcc xpert z2c) +set(MRCCSTUFF_F_MPI ccsd ccsdmain combin dcommunicate3 df3int dft dmrcc driver drpa hessgrad lambda ldrpa mrcc pert scf teint xmrcc xpert) + +set(MRCC_MPI_LIBRARIES) + +#C routines +add_library(intio_lib OBJECT intio.c) +add_library(signal_lib OBJECT signal.c) +add_library(xalloc_lib OBJECT xalloc.c) +add_library(cfunc_lib OBJECT cfunc.c) +if(ENABLE_MPI) + add_library(cfunc_mpi_lib OBJECT cfunc.c) + target_compile_definitions(cfunc_mpi_lib PRIVATE -DMPI) + target_include_directories(cfunc_mpi_lib PRIVATE ${MPI_INCLUDE_PATH}) + list(APPEND MRCC_MPI_LIBRARIES cfunc_mpi_lib) +endif() + +# Fortran-90 routines +add_library(optim_lib OBJECT optim.f90) +add_library(dirac_mointegral_export_lib OBJECT dirac_mointegral_export.F90) + +# Fortran-77 routines +foreach(STUFF ${MRCCSTUFF_F}) + if(IS_DIRECTORY ${dir}/${STUFF}) + file(GLOB ${STUFF}_src CONFIGURE_DEPENDS ${dir}/${STUFF}/*.f) + add_library(${STUFF}_lib OBJECT ${${STUFF}_src}) + target_include_directories(${STUFF}_lib PRIVATE ${dir}) + else() + add_library(${STUFF}_lib OBJECT ${STUFF}.f) + endif() +endforeach() +target_link_libraries(scf_lib PRIVATE hessgrad_lib) +target_link_libraries(basopt_lib PRIVATE optim_lib) +target_link_libraries(geomopt_lib PRIVATE optim_lib) + +if(ENABLE_MPI) + # Fortran-90 MPI-manager + add_library(mrcc_manager_lib OBJECT mrcc_manager.f90) + add_library(mrcc_manager_main_lib OBJECT mrcc_manager_main.f90) + target_link_libraries(mrcc_manager_main_lib PRIVATE mrcc_manager) + target_compile_definitions(mrcc_manager_lib PRIVATE -DMPI) + target_include_directories(mrcc_manager_lib PRIVATE ${MPI_INCLUDE_PATH}) + target_compile_definitions(mrcc_manager_main_lib PRIVATE -DMPI) + target_include_directories(mrcc_manager_main_lib PRIVATE ${MPI_INCLUDE_PATH}) + # Fortran-77 routines + foreach(STUFF ${MRCCSTUFF_F_MPI}) + if(IS_DIRECTORY ${dir}/${STUFF}) + file(GLOB ${STUFF}_src CONFIGURE_DEPENDS ${dir}/${STUFF}/*.f) + add_library(${STUFF}_mpi_lib OBJECT ${${STUFF}_src}) + target_include_directories(${STUFF}_mpi_lib PRIVATE ${dir}) + else() + add_library(${STUFF}_mpi_lib OBJECT ${STUFF}.f) + endif() + target_compile_definitions(${STUFF}_mpi_lib PRIVATE -DMPI) + target_include_directories(${STUFF}_mpi_lib PRIVATE ${MPI_INCLUDE_PATH}) + list(APPEND MRCC_MPI_LIBRARIES ${STUFF}_mpi_lib) + endforeach() + target_link_libraries(scf_mpi_lib PRIVATE hessgrad_mpi_lib) + target_link_libraries(ccsd_lib PRIVATE mrcc_manager_lib) + target_link_libraries(ldrpa_lib PRIVATE mrcc_manager_lib) +endif() + +if(ENABLE_LIBXC) + foreach(TGT dft integ minp scf) + add_dependencies(${TGT}_lib libxc) + target_include_directories(${TGT}_lib PRIVATE ${CMAKE_BINARY_DIR}/external/libxc/src/libxc-build-${CMAKE_Fortran_COMPILER_ID}) + if(ENABLE_MPI) + if(${TGT} IN_LIST MRCCSTUFF_F_MPI) + add_dependencies(${TGT}_mpi_lib libxc) + target_include_directories(${TGT}_mpi_lib PRIVATE ${CMAKE_BINARY_DIR}/external/libxc/src/libxc-build-${CMAKE_Fortran_COMPILER_ID}) + endif() + endif() + endforeach() +endif() + +if(ENABLE_PCM) + add_library(pcm_lib OBJECT pcm.f90) + target_include_directories(pcm_lib PRIVATE ${CMAKE_SOURCE_DIR}/external/pcmsolver/src/pcmsolver/api/) + add_dependencies(pcm_lib pcmsolver) + target_link_libraries(scf_lib PUBLIC pcm_lib) + if(ENABLE_MPI) + target_link_libraries(scf_mpi_lib PUBLIC pcm_lib) + endif() +endif() + +set(MRCC_MPI_LIBRARIES ${MRCC_MPI_LIBRARIES} PARENT_SCOPE) diff --git a/source/null.f b/source/null.f new file mode 100644 index 0000000..e69de29 diff --git a/source/pcm.f90 b/source/pcm.f90 index a430c10..f579aea 100644 --- a/source/pcm.f90 +++ b/source/pcm.f90 @@ -1,3 +1,5 @@ +include 'pcmsolver.f90' + !*********************************************************************** subroutine pcm_core(pcm,epol,verbosity,iout,dcore,icore,imem,nbasis,focka,fockb,pa,pb,scftype,dero,grad) !***********************************************************************