Add v4.0.x API of DFT-D4 (#4964)

This commit is contained in:
SY Wang 2026-03-25 16:40:09 +08:00 committed by GitHub
parent cce4b85ea5
commit c6fc4eb94e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 170 additions and 56 deletions

View file

@ -784,6 +784,13 @@ endif()
if(CP2K_USE_DFTD4)
find_package(dftd4 REQUIRED)
# Detect dftd4_VERSION from dftd4-config-version.cmake
if(dftd4_VERSION VERSION_LESS "4.0.0")
message(STATUS "DFTD4: found version ${dftd4_VERSION}, using v3.x API")
set(CP2K_USE_DFTD4_V3 ON)
else()
set(CP2K_USE_DFTD4_V3 OFF)
endif()
endif()
if(CP2K_USE_DEEPMD)
@ -809,12 +816,20 @@ endif()
if(CP2K_USE_TBLITE)
find_package(mctc-lib REQUIRED)
find_package(toml-f REQUIRED)
find_package(dftd4 REQUIRED)
find_package(s-dftd3 REQUIRED)
find_package(tblite REQUIRED)
add_library(cp2k::tblite INTERFACE IMPORTED)
target_link_libraries(
cp2k::tblite INTERFACE tblite::tblite mctc-lib::mctc-lib dftd4::dftd4
toml-f::toml-f s-dftd3::s-dftd3)
# Detect dftd4_VERSION from dftd4-config-version.cmake
if(dftd4_VERSION VERSION_LESS "4.0.0")
message(STATUS "DFTD4: found version ${dftd4_VERSION}, using v3.x API")
set(CP2K_USE_DFTD4_V3 ON)
else()
set(CP2K_USE_DFTD4_V3 OFF)
endif()
endif()
# SIRIUS

View file

@ -1789,6 +1789,7 @@ target_compile_definitions(
$<$<BOOL:${CP2K_USE_TBLITE}>:__TBLITE>
$<$<BOOL:${CP2K_USE_TBLITE}>:__DFTD4>
$<$<BOOL:${CP2K_USE_DFTD4}>:__DFTD4>
$<$<BOOL:${CP2K_USE_DFTD4_V3}>:__DFTD4_V3>
$<$<BOOL:${CP2K_USE_DEEPMD}>:__DEEPMD>
$<$<BOOL:${CP2K_USE_PEXSI}>:__PEXSI>
$<$<BOOL:${CP2K_USE_ACE}>:__ACE>

View file

@ -193,6 +193,9 @@ CONTAINS
#if defined(__DFTD4)
flags = TRIM(flags)//" libdftd4"
#endif
#if defined(__DFTD4_V3)
flags = TRIM(flags)//" dftd4_v3"
#endif
#if defined(__TBLITE)
flags = TRIM(flags)//" mctc-lib"
flags = TRIM(flags)//" tblite"

View file

@ -939,9 +939,12 @@ CONTAINS
usage="POTENTIAL_TYPE (NONE|PAIR_POTENTIAL|NON_LOCAL)", &
enum_c_vals=s2a("NONE", "PAIR_POTENTIAL", "NON_LOCAL"), &
enum_i_vals=[xc_vdw_fun_none, xc_vdw_fun_pairpot, xc_vdw_fun_nonloc], &
enum_desc=s2a("No dispersion/van der Waals functional", &
"Pair potential van der Waals density functional", &
"Nonlocal van der Waals density functional"), &
enum_desc=s2a("No dispersion/van der Waals functional.", &
"Pair potential van der Waals density functional, "// &
"including Grimme's empirical DFT-D methods.", &
"Nonlocal van der Waals density functional; more "// &
"rigorous in principle, but significantly more "// &
"time-consuming."), &
default_i_val=xc_vdw_fun_none)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
@ -981,7 +984,7 @@ CONTAINS
"Grimme D3 method (zero damping)", &
"Grimme D3 method (Becke-Johnson damping)", &
"Grimme D4 method"), &
default_i_val=vdw_pairpot_dftd3)
default_i_val=vdw_pairpot_dftd3bj)
CALL section_add_keyword(subsection, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="PARAMETER_FILE_NAME", &
@ -1001,7 +1004,11 @@ CONTAINS
CALL section_add_keyword(subsection, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="D4_REFERENCE_CODE", &
description="Calculate D4 energy using external library.", &
description="Calculate D4 energy using external library entirely. "// &
"If set to F, CP2K will use its own codes to perform part of the "// &
"DFT-D4 correction (including the calculation of EEQ charges) in "// &
"parallel, which can significally save time if you use an MPI version "// &
"of CP2K because DFT-D4 package does not support MPI parallelization.", &
usage="D4_REFERENCE_CODE", default_l_val=.TRUE., &
lone_keyword_l_val=.TRUE.)
CALL section_add_keyword(subsection, keyword)

View file

@ -55,7 +55,12 @@ MODULE qs_dispersion_d4
rational_damping_param, &
get_coordination_number, &
get_lattice_points
#if defined(__DFTD4_V3)
USE dftd4_charge, ONLY: get_charges
#else
USE multicharge, ONLY: get_charges
USE mctc_env, ONLY: error_type
#endif
!&>
#endif
#include "./base/base_uses.f90"
@ -93,8 +98,12 @@ CONTAINS
CHARACTER(LEN=*), PARAMETER :: routineN = 'calculate_dispersion_d4_pairpot'
INTEGER :: atoma, cnfun, enshift, handle, i, iatom, &
ikind, mref, natom, nghost
INTEGER :: atoma, cnfun, enshift, handle, i, iatom
#if defined(__DFTD4_V3)
INTEGER :: ikind, mref, natom, nghost
#else
INTEGER :: ikind, mref, natom, ncoup, nghost
#endif
INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, atomtype, kind_of, &
t_atomtype
INTEGER, DIMENSION(3) :: periodic
@ -106,9 +115,14 @@ CONTAINS
ta, tb, tc, td, te, ts
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: cn, cnd, dEdcn, dEdq, edcn, edq, enerd2, &
enerd3, energies, energies3, q, qd
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: ga, gradient, gwdcn, gwdq, gwvec, t_xyz, &
tvec, xyz
#if defined(__DFTD4_V3)
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: ga, gradient, gwdcn, gwdq, gwvec, &
t_xyz, tvec, xyz
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: gdeb
#else
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: ga, gradient, t_xyz, tvec, xyz
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: gdeb, gwdcn, gwdq, gwvec
#endif
REAL(KIND=dp), DIMENSION(3, 3) :: sigma, stress
REAL(KIND=dp), DIMENSION(3, 3, 4) :: sdeb
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
@ -125,6 +139,10 @@ CONTAINS
TYPE(structure_type) :: mol
TYPE(realspace_cutoff) :: cutoff
#if !defined(__DFTD4_V3)
TYPE(error_type), ALLOCATABLE :: error
#endif
CALL timeset(routineN, handle)
debug = dispersion_env%d4_debug
@ -170,7 +188,17 @@ CONTAINS
!prepare for the call to the dispersion function
CALL new(mol, atomtype, xyz, lattice=cell%hmat, periodic=lperiod)
#if defined(__DFTD4_V3)
CALL new_d4_model(disp, mol)
#else
CALL new_d4_model(error, disp, mol)
IF (ALLOCATED(error)) THEN
CPABORT(error%message)
END IF
! Number of coupling
ncoup = disp%ncoup
#endif
IF (dispersion_env%ref_functional == "none") THEN
CALL get_rational_damping("pbe", param, s9=0.0_dp)
@ -295,8 +323,13 @@ CONTAINS
WRITE (iw, '(A,T71,F10.6)') " DEBUG D4| Charge differences (ave)", SUM(ABS(q - qd))/natom
END IF
! Weights for C6 calculation
#if defined(__DFTD4_V3)
ALLOCATE (gwvec(mref, natom))
IF (grad) ALLOCATE (gwdcn(mref, natom), gwdq(mref, natom))
#else
ALLOCATE (gwvec(mref, natom, ncoup))
IF (grad) ALLOCATE (gwdcn(mref, natom, ncoup), gwdq(mref, natom, ncoup))
#endif
CALL disp%weight_references(mol, cn, q, gwvec, gwdcn, gwdq)
ALLOCATE (energies(natom))
@ -504,19 +537,32 @@ CONTAINS
TYPE(d4_model) :: disp
TYPE(structure_type) :: mol
TYPE(realspace_cutoff) :: cutoff
#if !defined(__DFTD4_V3)
TYPE(error_type), ALLOCATABLE :: error
#endif
LOGICAL, INTENT(IN) :: grad, doabc
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: enerd2, enerd3, cnd, qd, dEdcn, dEdq
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: gradient
REAL(KIND=dp), DIMENSION(3, 3, 4) :: stress
#if defined(__DFTD4_V3)
INTEGER :: mref, natom, i
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: q, qq
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: lattr, gwdcn, gwdq, gwvec, &
c6, dc6dcn, dc6dq
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: cndr, cndL, qdr, qdL
#else
INTEGER :: mref, natom, i, ncoup
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: q, qq
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: lattr, c6, dc6dcn, dc6dq
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: cndr, cndL, qdr, qdL, gwdcn, gwdq, gwvec
#endif
mref = MAXVAL(disp%ref)
natom = mol%nat
#if !defined(__DFTD4_V3)
ncoup = disp%ncoup
#endif
! Coordination numbers
ALLOCATE (cnd(natom))
@ -527,10 +573,22 @@ CONTAINS
! EEQ charges
ALLOCATE (qd(natom))
IF (grad) ALLOCATE (qdr(3, natom, natom), qdL(3, 3, natom))
#if defined(__DFTD4_V3)
CALL get_charges(mol, qd, qdr, qdL)
#else
CALL get_charges(disp%mchrg, mol, error, qd, qdr, qdL)
IF (ALLOCATED(error)) THEN
CPABORT(error%message)
END IF
#endif
! C6 interpolation
#if defined(__DFTD4_V3)
ALLOCATE (gwvec(mref, natom))
IF (grad) ALLOCATE (gwdcn(mref, natom), gwdq(mref, natom))
#else
ALLOCATE (gwvec(mref, natom, ncoup))
IF (grad) ALLOCATE (gwdcn(mref, natom, ncoup), gwdq(mref, natom, ncoup))
#endif
CALL disp%weight_references(mol, cnd, qd, gwvec, gwdcn, gwdq)
ALLOCATE (c6(natom, natom))
IF (grad) ALLOCATE (dc6dcn(natom, natom), dc6dq(natom, natom))
@ -636,7 +694,11 @@ CONTAINS
TYPE(qs_dispersion_type), POINTER :: dispersion_env
REAL(KIND=dp), INTENT(IN) :: cutoff
REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: r4r2
#if defined(__DFTD4_V3)
REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: gwvec, gwdcn, gwdq
#else
REAL(KIND=dp), DIMENSION(:, :, :), INTENT(IN) :: gwvec, gwdcn, gwdq
#endif
REAL(KIND=dp), DIMENSION(:, :, :, :), INTENT(IN) :: c6ref
INTEGER, DIMENSION(:), INTENT(IN) :: mrefs
REAL(KIND=dp), DIMENSION(:), INTENT(INOUT) :: energies, dEdcn, dEdq
@ -740,7 +802,11 @@ CONTAINS
REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: tvec
REAL(KIND=dp), INTENT(IN) :: cutoff
REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: r4r2
#if defined(__DFTD4_V3)
REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: gwvec, gwdcn, gwdq
#else
REAL(KIND=dp), DIMENSION(:, :, :), INTENT(IN) :: gwvec, gwdcn, gwdq
#endif
REAL(KIND=dp), DIMENSION(:, :, :, :), INTENT(IN) :: c6ref
INTEGER, DIMENSION(:), INTENT(IN) :: mrefs
REAL(KIND=dp), DIMENSION(:), INTENT(INOUT) :: energies, dEdcn, dEdq
@ -1008,7 +1074,11 @@ CONTAINS
SUBROUTINE get_c6value(c6ij, ia, ja, ik, jk, gwvec, c6ref, mrefs)
REAL(KIND=dp), INTENT(OUT) :: c6ij
INTEGER, INTENT(IN) :: ia, ja, ik, jk
#if defined(__DFTD4_V3)
REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: gwvec
#else
REAL(KIND=dp), DIMENSION(:, :, :), INTENT(IN) :: gwvec
#endif
REAL(KIND=dp), DIMENSION(:, :, :, :), INTENT(IN) :: c6ref
INTEGER, DIMENSION(:), INTENT(IN) :: mrefs
@ -1019,7 +1089,11 @@ CONTAINS
DO jref = 1, mrefs(jk)
DO iref = 1, mrefs(ik)
refc6 = c6ref(iref, jref, ik, jk)
#if defined(__DFTD4_V3)
c6ij = c6ij + gwvec(iref, ia)*gwvec(jref, ja)*refc6
#else
c6ij = c6ij + gwvec(iref, ia, 1)*gwvec(jref, ja, 1)*refc6
#endif
END DO
END DO
@ -1045,7 +1119,11 @@ CONTAINS
REAL(KIND=dp), INTENT(OUT) :: c6ij
REAL(KIND=dp), DIMENSION(2), INTENT(OUT) :: dc6dcn, dc6dq
INTEGER, INTENT(IN) :: ia, ja, ik, jk
#if defined(__DFTD4_V3)
REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: gwvec, gwdcn, gwdq
#else
REAL(KIND=dp), DIMENSION(:, :, :), INTENT(IN) :: gwvec, gwdcn, gwdq
#endif
REAL(KIND=dp), DIMENSION(:, :, :, :), INTENT(IN) :: c6ref
INTEGER, DIMENSION(:), INTENT(IN) :: mrefs
@ -1058,11 +1136,19 @@ CONTAINS
DO jref = 1, mrefs(jk)
DO iref = 1, mrefs(ik)
refc6 = c6ref(iref, jref, ik, jk)
#if defined(__DFTD4_V3)
c6ij = c6ij + gwvec(iref, ia)*gwvec(jref, ja)*refc6
dc6dcn(1) = dc6dcn(1) + gwdcn(iref, ia)*gwvec(jref, ja)*refc6
dc6dcn(2) = dc6dcn(2) + gwvec(iref, ia)*gwdcn(jref, ja)*refc6
dc6dq(1) = dc6dq(1) + gwdq(iref, ia)*gwvec(jref, ja)*refc6
dc6dq(2) = dc6dq(2) + gwvec(iref, ia)*gwdq(jref, ja)*refc6
#else
c6ij = c6ij + gwvec(iref, ia, 1)*gwvec(jref, ja, 1)*refc6
dc6dcn(1) = dc6dcn(1) + gwdcn(iref, ia, 1)*gwvec(jref, ja, 1)*refc6
dc6dcn(2) = dc6dcn(2) + gwvec(iref, ia, 1)*gwdcn(jref, ja, 1)*refc6
dc6dq(1) = dc6dq(1) + gwdq(iref, ia, 1)*gwvec(jref, ja, 1)*refc6
dc6dq(2) = dc6dq(2) + gwvec(iref, ia, 1)*gwdq(jref, ja, 1)*refc6
#endif
END DO
END DO

View file

@ -311,7 +311,11 @@ CONTAINS
END DO
END IF
ELSE IF (dispersion_env%pp_type == vdw_pairpot_dftd4) THEN
WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'DFT-D4(Version 3.6.0)')")
#if defined(__DFTD4_V3)
WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'DFT-D4(Version 3.7)')")
#else
WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'DFT-D4(Version 4.0)')")
#endif
WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'see https://github.com/dftd4/dftd4')")
WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'E. Caldeweyher et al, PCCP 22: 8499 (2020)')")
WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'E. Caldeweyher et al, JCP 150: 154122 (2019)')")

View file

@ -6,8 +6,8 @@
[ "${BASH_SOURCE[0]}" ] && SCRIPT_NAME="${BASH_SOURCE[0]}" || SCRIPT_NAME=$0
SCRIPT_DIR="$(cd "$(dirname "$SCRIPT_NAME")/.." && pwd -P)"
dftd4_ver="3.7.0"
dftd4_sha256="2e0d3504038358b8a82fdd21912b7765d416a58ebedbdd44f2ca8d2e88339ad7"
dftd4_ver="4.0.2"
dftd4_sha256="ed4a6a3ba0a89b8d6825bf11724dee647fd8ee6272e7822e0cbd9847994eb872"
source "${SCRIPT_DIR}"/common_vars.sh
source "${SCRIPT_DIR}"/tool_kit.sh
@ -32,18 +32,15 @@ case "$with_dftd4" in
install_lock_file="${pkg_install_dir}/install_successful"
if verify_checksums "${install_lock_file}"; then
echo "dftd4_dist-${dftd4_ver} is already installed, skipping it."
echo "dftd4-${dftd4_ver} is already installed, skipping it."
else
retrieve_package "${dftd4_sha256}" "dftd4-${dftd4_ver}.tar.gz"
retrieve_package "${dftd4_sha256}" "dftd4-${dftd4_ver}-source.tar.xz"
echo "Installing from scratch into ${pkg_install_dir}"
[ -d dftd4-${dftd4_ver} ] && rm -rf dftd4-${dftd4_ver}
tar -xzf dftd4-${dftd4_ver}.tar.gz
cd dftd4-${dftd4_ver}/subprojects/dftd4
rm -Rf build
mkdir build
cd build
tar -xJf dftd4-${dftd4_ver}-source.tar.xz
cd dftd4-${dftd4_ver}
mkdir build && cd build
CMAKE_PREFIX_PATH="${CMAKE_PREFIX_PATH}:${OPENBLAS_ROOT}" cmake \
-DCMAKE_INSTALL_PREFIX="${pkg_install_dir}" \
-DCMAKE_INSTALL_LIBDIR=lib \
@ -61,6 +58,7 @@ case "$with_dftd4" in
echo "==================== Finding DFTD4 from system paths ===================="
check_command pkg-config --modversion dftd4
DFTD4_INCLUDE_PATH=$(pkg-config --cflags dftd4 | awk '{print $1}' | cut -dI -f2)
pkg_install_dir=$(dirname ${DFTD4_INCLUDE_PATH})
add_include_from_paths DFTD4_CFLAGS "dftd4.h" $DFTD4_INCLUDE_PATH
add_include_from_paths DFTD4_CFLAGS "dftd4.mod" $DFTD4_INCLUDE_PATH
add_include_from_paths DFTD4_CFLAGS "mctc_io.mod" $DFTD4_INCLUDE_PATH
@ -86,22 +84,21 @@ if [ "$with_dftd4" != "__DONTUSE__" ]; then
export DFTD4_VER="${dftd4_ver}"
EOF
TEMP_LOC=$(find ${pkg_install_dir}/include -name "multicharge.mod")
MCHARGE=${TEMP_LOC%/*}
TEMP_LOC=$(find ${pkg_install_dir}/include -name "mstore.mod")
MSTORE=${TEMP_LOC%/*}
TEMP_LOC=$(find ${pkg_install_dir}/include -name "mctc_io.mod")
MCTC=${TEMP_LOC%/*}
TEMP_LOC=$(find ${pkg_install_dir}/include -name "dftd4.mod")
DFTD4=${TEMP_LOC%/*}
DFTD4_INCLUDE_DIRS="$pkg_install_dir/include"
DFTD4_LINK_LIBRARIES="${pkg_install_dir}/lib"
DFTD4_CFLAGS="-I'${MCHARGE}' -I'${MCTC}' -I'${DFTD4}'"
DFTD4_LDFLAGS="-L'${DFTD4_LINK_LIBRARIES}' -Wl,-rpath,'${DFTD4_LINK_LIBRARIES}'"
if [ "$with_dftd4" != "__SYSTEM__" ]; then
TEMP_LOC=$(find ${pkg_install_dir}/include -name "multicharge.mod")
MCHARGE=${TEMP_LOC%/*}
TEMP_LOC=$(find ${pkg_install_dir}/include -name "mstore.mod")
MSTORE=${TEMP_LOC%/*}
TEMP_LOC=$(find ${pkg_install_dir}/include -name "mctc_io.mod")
MCTC=${TEMP_LOC%/*}
TEMP_LOC=$(find ${pkg_install_dir}/include -name "dftd4.mod")
DFTD4=${TEMP_LOC%/*}
DFTD4_INCLUDE_DIRS="$pkg_install_dir/include"
DFTD4_LINK_LIBRARIES="${pkg_install_dir}/lib"
DFTD4_CFLAGS="-I'${MCHARGE}' -I'${MCTC}' -I'${DFTD4}'"
DFTD4_LDFLAGS="-L'${DFTD4_LINK_LIBRARIES}' -Wl,-rpath,'${DFTD4_LINK_LIBRARIES}'"
cat << EOF >> "${BUILDDIR}/setup_dftd4"
prepend_path LD_LIBRARY_PATH "${DFTD4_LINK_LIBRARIES}"
prepend_path LD_RUN_PATH "${DFTD4_LINK_LIBRARIES}"

View file

@ -69,7 +69,8 @@ case "$with_tblite" in
__SYSTEM__)
echo "==================== Finding tblite from system paths ===================="
check_command pkg-config --modversion tblite
TBLITE_INCLUDE_PATH=$(pkg-config --cflags dftd4 | awk '{print $1}' | cut -dI -f2)
TBLITE_INCLUDE_PATH=$(pkg-config --cflags tblite | awk '{print $1}' | cut -dI -f2)
pkg_install_dir=$(dirname ${TBLITE_INCLUDE_PATH})
add_include_from_paths TBLITE_CFLAGS "tblite.h" $TBLITE_INCLUDE_PATH
add_include_from_paths TBLITE_CFLAGS "tblite.mod" $TBLITE_INCLUDE_PATH
add_include_from_paths TBLITE_CFLAGS "dftd4.mod" $TBLITE_INCLUDE_PATH
@ -96,27 +97,27 @@ if [ "$with_tblite" != "__DONTUSE__" ]; then
export TBLITE_VER="${tblite_ver}"
EOF
TEMP_LOC=$(find ${pkg_install_dir}/include -name "tomlf.mod")
TOMLF=${TEMP_LOC%/*}
TEMP_LOC=$(find ${pkg_install_dir}/include -name "multicharge.mod")
MCHARGE=${TEMP_LOC%/*}
TEMP_LOC=$(find ${pkg_install_dir}/include -name "mstore.mod")
MSTORE=${TEMP_LOC%/*}
TEMP_LOC=$(find ${pkg_install_dir}/include -name "mctc_io.mod")
MCTC=${TEMP_LOC%/*}
TEMP_LOC=$(find ${pkg_install_dir}/include -name "dftd3.mod")
SDFTD3=${TEMP_LOC%/*}
TEMP_LOC=$(find ${pkg_install_dir}/include -name "dftd4.mod")
DFTD4=${TEMP_LOC%/*}
TEMP_LOC=$(find ${pkg_install_dir}/include -name "tblite_xtb.mod")
TBLITE=${TEMP_LOC%/*}
TBLITE_INCLUDE_DIRS="${pkg_install_dir}/include"
TBLITE_LINK_LIBRARIES="${pkg_install_dir}/lib"
TBLITE_CFLAGS="-I'${TOMLF}' -I'${MCTC}' -I'${SDFTD3}' -I'${DFTD4}' -I'${TBLITE}'"
TBLITE_LDFLAGS="-L'${TBLITE_LINK_LIBRARIES}' -Wl,-rpath,'${TBLITE_LINK_LIBRARIES}'"
if [ "$with_tblite" != "__SYSTEM__" ]; then
TEMP_LOC=$(find ${pkg_install_dir}/include -name "tomlf.mod")
TOMLF=${TEMP_LOC%/*}
TEMP_LOC=$(find ${pkg_install_dir}/include -name "multicharge.mod")
MCHARGE=${TEMP_LOC%/*}
TEMP_LOC=$(find ${pkg_install_dir}/include -name "mstore.mod")
MSTORE=${TEMP_LOC%/*}
TEMP_LOC=$(find ${pkg_install_dir}/include -name "mctc_io.mod")
MCTC=${TEMP_LOC%/*}
TEMP_LOC=$(find ${pkg_install_dir}/include -name "dftd3.mod")
SDFTD3=${TEMP_LOC%/*}
TEMP_LOC=$(find ${pkg_install_dir}/include -name "dftd4.mod")
DFTD4=${TEMP_LOC%/*}
TEMP_LOC=$(find ${pkg_install_dir}/include -name "tblite_xtb.mod")
TBLITE=${TEMP_LOC%/*}
TBLITE_INCLUDE_DIRS="${pkg_install_dir}/include"
TBLITE_LINK_LIBRARIES="${pkg_install_dir}/lib"
TBLITE_CFLAGS="-I'${TOMLF}' -I'${MCTC}' -I'${SDFTD3}' -I'${DFTD4}' -I'${TBLITE}'"
TBLITE_LDFLAGS="-L'${TBLITE_LINK_LIBRARIES}' -Wl,-rpath,'${TBLITE_LINK_LIBRARIES}'"
cat << EOF >> "${BUILDDIR}/setup_tblite"
prepend_path PATH "${pkg_install_dir}/bin"
prepend_path LD_LIBRARY_PATH "${TBLITE_LINK_LIBRARIES}"