Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 70 additions & 1 deletion include/gauxc/c/xc_integrator.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,14 @@ typedef struct GauXCIntegrator {
void* ptr; ///< Pointer to the XCIntegrator instance.
} GauXCIntegrator;

/**
* @brief Settings for Kohn-Sham XC integrations.
*/
typedef struct GauXCKSSettings {
double gks_dtol; ///< Density tolerance used by GKS integrations.
bool rks_density_matrix_is_spin_summed; ///< True if an RKS matrix contains the spin-summed density.
} GauXCKSSettings;

/**
* @brief Delete an XCIntegrator instance.
* @param status Status object to capture any errors.
Expand Down Expand Up @@ -109,6 +117,20 @@ extern void gauxc_integrator_eval_exc_rks(
double* exc
);

/**
* @brief Evaluate the exchange-correlation energy for RKS with explicit settings.
*/
extern void gauxc_integrator_eval_exc_rks_with_settings(
GauXCStatus* status,
const GauXCIntegrator integrator,
const int64_t m,
const int64_t n,
const double* density_matrix,
const int64_t ldp,
const GauXCKSSettings* settings,
double* exc
);

/**
* @brief Evaluate the exchange-correlation energy for UKS.
* @param status Status object to capture any errors.
Expand Down Expand Up @@ -189,6 +211,22 @@ extern void gauxc_integrator_eval_exc_vxc_rks(
const int64_t vxc_ld
);

/**
* @brief Evaluate the exchange-correlation energy and potential for RKS with explicit settings.
*/
extern void gauxc_integrator_eval_exc_vxc_rks_with_settings(
GauXCStatus* status,
const GauXCIntegrator integrator,
const int64_t m,
const int64_t n,
const double* density_matrix,
const int64_t ldp,
const GauXCKSSettings* settings,
double* exc,
double* vxc_matrix,
const int64_t vxc_ld
);

/**
* @brief Evaluate the exchange-correlation energy and potential for UKS.
* @param status Status object to capture any errors.
Expand Down Expand Up @@ -323,6 +361,20 @@ extern void gauxc_integrator_eval_exc_grad_rks(
double* exc_grad
);

/**
* @brief Evaluate the exchange-correlation nuclear gradient for RKS with explicit settings.
*/
extern void gauxc_integrator_eval_exc_grad_rks_with_settings(
GauXCStatus* status,
const GauXCIntegrator integrator,
const int64_t m,
const int64_t n,
const double* density_matrix,
const int64_t ldp,
const GauXCKSSettings* settings,
double* exc_grad
);

/**
* @brief Evaluate the exchange-correlation energy gradient for UKS.
* @param status Status object to capture any errors.
Expand Down Expand Up @@ -421,6 +473,23 @@ extern void gauxc_integrator_eval_fxc_contraction_rks(
const int64_t ldfxc
);

/**
* @brief Evaluate the FXC contraction for RKS with explicit settings.
*/
extern void gauxc_integrator_eval_fxc_contraction_rks_with_settings(
GauXCStatus* status,
const GauXCIntegrator integrator,
const int64_t m,
const int64_t n,
const double* density_matrix,
const int64_t ldp,
const double* t_density_matrix,
const int64_t ltdp,
const GauXCKSSettings* settings,
double* fxc,
const int64_t ldfxc
);

/**
* @brief Evaluate the FXC contraction for UKS.
* @param status Status object to capture any errors.
Expand Down Expand Up @@ -462,4 +531,4 @@ extern void gauxc_integrator_eval_fxc_contraction_uks(
#ifdef __cplusplus
} // namespace GauXC::C
} // extern "C"
#endif
#endif
3 changes: 3 additions & 0 deletions include/gauxc/xc_integrator_settings.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ struct IntegratorSettingsSNLinK : public IntegratorSettingsEXX {
struct IntegratorSettingsXC { virtual ~IntegratorSettingsXC() noexcept = default; };
struct IntegratorSettingsKS : public IntegratorSettingsXC {
double gks_dtol = 1e-12;
// RKS density matrices are interpreted as one-spin densities by default.
// Set this when the caller provides the spin-summed closed-shell density.
bool rks_density_matrix_is_spin_summed = false;
};

struct OneDFTSettings : public IntegratorSettingsXC {
Expand Down
192 changes: 192 additions & 0 deletions src/c-api/c_xc_integrator.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,31 @@ get_replicated_integrator( const char* integrator_kernel_name,


namespace GauXC::C {

namespace {

IntegratorSettingsKS convert_ks_settings( const GauXCKSSettings* c_settings ) {
IntegratorSettingsKS settings;
if( c_settings != nullptr ) {
settings.gks_dtol = c_settings->gks_dtol;
settings.rks_density_matrix_is_spin_summed =
c_settings->rks_density_matrix_is_spin_summed;
}
return settings;
}

IntegratorSettingsEXC_GRAD convert_exc_grad_settings( const GauXCKSSettings* c_settings ) {
IntegratorSettingsEXC_GRAD settings;
if( c_settings != nullptr ) {
settings.gks_dtol = c_settings->gks_dtol;
settings.rks_density_matrix_is_spin_summed =
c_settings->rks_density_matrix_is_spin_summed;
}
return settings;
}

} // namespace

extern "C" {

void gauxc_integrator_delete(
Expand Down Expand Up @@ -211,6 +236,44 @@ void gauxc_integrator_eval_exc_rks(
}
}

void gauxc_integrator_eval_exc_rks_with_settings(
GauXCStatus* status,
const GauXCIntegrator integrator,
int64_t m,
int64_t n,
const double* density_matrix,
int64_t ldp,
const GauXCKSSettings* settings,
double* exc
) {
detail::gauxc_status_init(status);
if (integrator.ptr == nullptr || integrator.hdr.type != GauXC_Type_Integrator) {
detail::gauxc_status_handle(status, 1, "Invalid Integrator handle");
return;
}
if (density_matrix == nullptr) {
detail::gauxc_status_handle(status, 1, "Density matrix pointer cannot be null");
return;
}
if (settings == nullptr) {
detail::gauxc_status_handle(status, 1, "KS settings pointer cannot be null");
return;
}
if (exc == nullptr) {
detail::gauxc_status_handle(status, 1, "Exc output pointer cannot be null");
return;
}
try {
detail::get_xc_integrator_ptr(integrator)->eval_exc(
m, n,
density_matrix, ldp,
exc,
convert_ks_settings(settings) );
} catch (std::exception& e) {
detail::gauxc_status_handle(status, 1, e.what());
}
}

void gauxc_integrator_eval_exc_uks(
GauXCStatus* status,
const GauXCIntegrator integrator,
Expand Down Expand Up @@ -345,6 +408,51 @@ void gauxc_integrator_eval_exc_vxc_rks(
}
}

void gauxc_integrator_eval_exc_vxc_rks_with_settings(
GauXCStatus* status,
const GauXCIntegrator integrator,
int64_t m,
int64_t n,
const double* density_matrix,
int64_t ldp,
const GauXCKSSettings* settings,
double* exc,
double* vxc_matrix,
int64_t vxc_ld
) {
detail::gauxc_status_init(status);
if (integrator.ptr == nullptr || integrator.hdr.type != GauXC_Type_Integrator) {
detail::gauxc_status_handle(status, 1, "Invalid Integrator handle");
return;
}
if (density_matrix == nullptr) {
detail::gauxc_status_handle(status, 1, "Density matrix pointer cannot be null");
return;
}
if (settings == nullptr) {
detail::gauxc_status_handle(status, 1, "KS settings pointer cannot be null");
return;
}
if (exc == nullptr) {
detail::gauxc_status_handle(status, 1, "Exc output pointer cannot be null");
return;
}
if (vxc_matrix == nullptr) {
detail::gauxc_status_handle(status, 1, "VXC matrix pointer cannot be null");
return;
}
try {
detail::get_xc_integrator_ptr(integrator)->eval_exc_vxc(
m, n,
density_matrix, ldp,
vxc_matrix, vxc_ld,
exc,
convert_ks_settings(settings) );
} catch (std::exception& e) {
detail::gauxc_status_handle(status, 1, e.what());
}
}

void gauxc_integrator_eval_exc_vxc_uks(
GauXCStatus* status,
const GauXCIntegrator integrator,
Expand Down Expand Up @@ -576,6 +684,44 @@ void gauxc_integrator_eval_exc_grad_rks(
}
}

void gauxc_integrator_eval_exc_grad_rks_with_settings(
GauXCStatus* status,
const GauXCIntegrator integrator,
int64_t m,
int64_t n,
const double* density_matrix,
int64_t ldp,
const GauXCKSSettings* settings,
double* exc_grad
) {
detail::gauxc_status_init(status);
if (integrator.ptr == nullptr || integrator.hdr.type != GauXC_Type_Integrator) {
detail::gauxc_status_handle(status, 1, "Invalid Integrator handle");
return;
}
if (density_matrix == nullptr) {
detail::gauxc_status_handle(status, 1, "Density matrix pointer cannot be null");
return;
}
if (settings == nullptr) {
detail::gauxc_status_handle(status, 1, "KS settings pointer cannot be null");
return;
}
if (exc_grad == nullptr) {
detail::gauxc_status_handle(status, 1, "Exc gradient output pointer cannot be null");
return;
}
try {
detail::get_xc_integrator_ptr(integrator)->eval_exc_grad(
m, n,
density_matrix, ldp,
exc_grad,
convert_exc_grad_settings(settings) );
} catch (std::exception& e) {
detail::gauxc_status_handle(status, 1, e.what());
}
}

void gauxc_integrator_eval_exc_grad_uks(
GauXCStatus* status,
const GauXCIntegrator integrator,
Expand Down Expand Up @@ -738,6 +884,52 @@ void gauxc_integrator_eval_fxc_contraction_rks(
}
}

void gauxc_integrator_eval_fxc_contraction_rks_with_settings(
GauXCStatus* status,
const GauXCIntegrator integrator,
int64_t m,
int64_t n,
const double* density_matrix,
int64_t ldp,
const double* t_density_matrix,
int64_t ldtp,
const GauXCKSSettings* settings,
double* fxc,
int64_t ldfxc
) {
detail::gauxc_status_init(status);
if (integrator.ptr == nullptr || integrator.hdr.type != GauXC_Type_Integrator) {
detail::gauxc_status_handle(status, 1, "Invalid Integrator handle");
return;
}
if (density_matrix == nullptr) {
detail::gauxc_status_handle(status, 1, "Density matrix pointer cannot be null");
return;
}
if (t_density_matrix == nullptr) {
detail::gauxc_status_handle(status, 1, "Density matrix pointer cannot be null");
return;
}
if (settings == nullptr) {
detail::gauxc_status_handle(status, 1, "KS settings pointer cannot be null");
return;
}
if (fxc == nullptr) {
detail::gauxc_status_handle(status, 1, "FXC output pointer cannot be null");
return;
}
try {
detail::get_xc_integrator_ptr(integrator)->eval_fxc_contraction(
m, n,
density_matrix, ldp,
t_density_matrix, ldtp,
fxc, ldfxc,
convert_ks_settings(settings) );
} catch (std::exception& e) {
detail::gauxc_status_handle(status, 1, e.what());
}
}

void gauxc_integrator_eval_fxc_contraction_uks(
GauXCStatus* status,
const GauXCIntegrator integrator,
Expand Down
Loading