Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement NEO-DFT on host #92

Open
wants to merge 51 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
8b4f0a1
Add swap files to .gitignore
aodongliu Oct 31, 2023
403882b
change H slater radius and fix C++ syntax in trim_left
aodongliu Oct 31, 2023
23fafd2
add neo rks/uks skeleton
aodongliu Oct 31, 2023
1809551
pass another basis to the load balancer
aodongliu Oct 31, 2023
f47b51f
set up gauxc to call neo_exc_vxc_local_work
aodongliu Oct 31, 2023
c220f09
attemp to create protonic shell list
aodongliu Oct 19, 2023
e39c08e
try to evaluate protonic density
aodongliu Oct 21, 2023
7fbb657
first attempt. Begin to debug
aodongliu Oct 24, 2023
fed1b3e
allow neo_eval_exc_exc to return 2 energies
aodongliu Oct 31, 2023
53f2551
correct some errors
aodongliu Oct 24, 2023
a2fc43c
fix factor of 2 in electronic EPC
aodongliu Oct 24, 2023
ad2cd1f
refactor epc functional to be a enum class in GauXC.
aodongliu Oct 27, 2023
d1a7cec
finished rebasing. Need to change function calls in neo. Non-working atm
aodongliu Oct 31, 2023
8de578e
fix issues to allow energy to match after rebase
aodongliu Oct 31, 2023
585710f
add micro batch screening for protons
aodongliu Nov 7, 2023
574ac7e
refactor the code after EPC to be electronic & protonic sequentially
aodongliu Nov 7, 2023
d2cb40e
add naive implementation of proton screening
aodongliu Nov 7, 2023
0958be1
allow electronic and protonic to use the same scratch space
aodongliu Nov 8, 2023
625bd1c
clean up debug printing
aodongliu Nov 8, 2023
51a07fc
fix issues after rebasing to newest master branch
aodongliu Nov 30, 2023
fab91dd
revert local changes
aodongliu Nov 30, 2023
46070d4
remove epcfunctional enum in GauXC. Will add this in exchcxx
aodongliu Dec 2, 2023
1727797
delegate to default LoadBalancerImpl constructor to initialize common…
aodongliu Dec 4, 2023
754e744
check existance of protonic basis before returning its basis information
aodongliu Dec 4, 2023
6f4019b
seperate neo_eval_exc_vxc function and the local driver to its sepera…
aodongliu Dec 4, 2023
44706c1
explicitly spell out 'protonic' for class variables and function argu…
aodongliu Dec 4, 2023
2550d2f
adding neo functionality to test_xc_integrator
aodongliu Dec 5, 2023
cb65123
add second integration in test and revert H radius to GauXC default
aodongliu Dec 5, 2023
0397aa1
adding neo unit tests
aodongliu Dec 6, 2023
087789d
modify NEO UT ref data
aodongliu Dec 6, 2023
21681a7
remote protonic_shell_pairs() as it's not needed atm
aodongliu Dec 6, 2023
d8578f2
remove unwanted changes
aodongliu Jan 6, 2024
55eb9fa
fix code after rebase
aodongliu Apr 5, 2024
850a895
remove unwanted changes
aodongliu Apr 5, 2024
c0639ad
update integration to be consistent with regular local work driver
aodongliu Apr 6, 2024
1c65a4d
edit code for benchmarking vs CQ
aodongliu Apr 26, 2024
aac7924
disable mpi to match cq default
aodongliu Apr 26, 2024
07d6e52
attemp to add epcfunc pointer
aodongliu Apr 27, 2024
f6040f8
epc is now done via exchcxx builtin
aodongliu Apr 27, 2024
b955f17
remove debug statements
aodongliu Apr 28, 2024
236370d
fix logic bug where elec den overwrites prot den in epc
aodongliu Apr 29, 2024
15a4493
remove unwanted changes
aodongliu May 3, 2024
a9d49fe
update exchcxx version in cmake
aodongliu May 3, 2024
e0bb9e7
modifying NEO tests
aodongliu May 7, 2024
d95f1c9
modified tests to also be able to use epcfunctional
aodongliu May 8, 2024
1e46e2b
fix problems
aodongliu May 8, 2024
141364f
added epc tests
aodongliu May 8, 2024
fd76906
remove unwanted changes
aodongliu May 8, 2024
76ff623
Merge remote-tracking branch 'upstream/master' into merge_neo
aodongliu Jun 4, 2024
ee00338
swap alpha/beta prot den after epc
aodongliu Jun 4, 2024
b33ec95
Merge with master, GPU+NEO NYI
mikovtun Jul 31, 2024
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
2 changes: 1 addition & 1 deletion cmake/gauxc-dep-versions.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ set( GAUXC_CUTLASS_REPOSITORY https://github.com/NVIDIA/cutlass.git )
set( GAUXC_CUTLASS_REVISION v2.10.0 )

set( GAUXC_EXCHCXX_REPOSITORY https://github.com/wavefunction91/ExchCXX.git )
set( GAUXC_EXCHCXX_REVISION 21a4700a826ec0beae1311a1d59677393bcb168f )
set( GAUXC_EXCHCXX_REVISION ef88e168249e38c526353fe7c48aab4bc697c99d )

set( GAUXC_GAU2GRID_REPOSITORY https://github.com/dgasmith/gau2grid.git )
set( GAUXC_GAU2GRID_REVISION v2.0.6 )
Expand Down
15 changes: 15 additions & 0 deletions include/gauxc/load_balancer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,12 @@ class LoadBalancer {
const shell_pair_type& shell_pairs() const;
const shell_pair_type& shell_pairs();

/// Return the underlying protonic BasisSet instance used to generate this LoadBalancer
const basis_type& protonic_basis() const;

/// Return the protonic BasisSetMap instance corresponding to protonic basis/molecule
const basis_map_type& protonic_basis_map() const;

/// Return the runtime handle used to construct this LoadBalancer
const RuntimeEnvironment& runtime() const;

Expand Down Expand Up @@ -163,6 +169,10 @@ class LoadBalancerFactory {
LoadBalancer get_instance( const RuntimeEnvironment& rt,
const Molecule& mol, const MolGrid& mg, const BasisSet<double>& bs);

LoadBalancer get_instance( const RuntimeEnvironment& rt,
const Molecule& mol, const MolGrid& mg, const BasisSet<double>& bs,
const BasisSet<double>& bs2 );

/**
* @brief Generate a shared pointer to a LoadBalancer instance per kernel and
* execution space specfication
Expand All @@ -180,6 +190,11 @@ class LoadBalancerFactory {
const RuntimeEnvironment& rt,
const Molecule& mol, const MolGrid& mg, const BasisSet<double>&);

std::shared_ptr<LoadBalancer> get_shared_instance(
const RuntimeEnvironment& rt,
const Molecule& mol, const MolGrid& mg, const BasisSet<double>&,
const BasisSet<double>& );

private:

ExecutionSpace ex_; ///< Execution space for the generated LoadBalancer instances
Expand Down
8 changes: 7 additions & 1 deletion include/gauxc/xc_integrator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ class XCIntegrator {
using exc_vxc_type_rks = std::tuple< value_type, matrix_type >;
using exc_vxc_type_uks = std::tuple< value_type, matrix_type, matrix_type >;
using exc_vxc_type_gks = std::tuple< value_type, matrix_type, matrix_type, matrix_type, matrix_type >;
using exc_vxc_type_neo_rks = std::tuple< value_type, value_type, matrix_type, matrix_type, matrix_type >;
using exc_vxc_type_neo_uks = std::tuple< value_type, value_type, matrix_type, matrix_type, matrix_type, matrix_type >;
wavefunction91 marked this conversation as resolved.
Show resolved Hide resolved
using exc_grad_type = std::vector< value_type >;
using exx_type = matrix_type;

Expand Down Expand Up @@ -64,7 +66,11 @@ class XCIntegrator {
exc_vxc_type_uks eval_exc_vxc ( const MatrixType&, const MatrixType&,
const IntegratorSettingsXC& = IntegratorSettingsXC{} );
exc_vxc_type_gks eval_exc_vxc ( const MatrixType&, const MatrixType&, const MatrixType&, const MatrixType&,
const IntegratorSettingsXC& = IntegratorSettingsXC{});
const IntegratorSettingsXC& = IntegratorSettingsXC{} );
exc_vxc_type_neo_rks neo_eval_exc_vxc ( const MatrixType&, const MatrixType&, const MatrixType&,
const IntegratorSettingsXC& = IntegratorSettingsXC{} );
exc_vxc_type_neo_uks neo_eval_exc_vxc ( const MatrixType&, const MatrixType&, const MatrixType&, const MatrixType&,
const IntegratorSettingsXC& = IntegratorSettingsXC{} );

exc_grad_type eval_exc_grad( const MatrixType& );

Expand Down
23 changes: 20 additions & 3 deletions include/gauxc/xc_integrator/impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,26 @@ template <typename MatrixType>
typename XCIntegrator<MatrixType>::exc_vxc_type_gks
XCIntegrator<MatrixType>::eval_exc_vxc( const MatrixType& Ps, const MatrixType& Pz, const MatrixType& Py, const MatrixType& Px,
const IntegratorSettingsXC& ks_settings ) {
if( not pimpl_ ) GAUXC_PIMPL_NOT_INITIALIZED();
return pimpl_->eval_exc_vxc(Ps, Pz, Py, Px, ks_settings);
};
if( not pimpl_ ) GAUXC_PIMPL_NOT_INITIALIZED();
return pimpl_->eval_exc_vxc(Ps, Pz, Py, Px, ks_settings);
};

template <typename MatrixType>
typename XCIntegrator<MatrixType>::exc_vxc_type_neo_rks
XCIntegrator<MatrixType>::neo_eval_exc_vxc( const MatrixType& elec_Ps, const MatrixType& prot_Ps, const MatrixType& prot_Pz,
const IntegratorSettingsXC& ks_settings ){
if( not pimpl_ ) GAUXC_PIMPL_NOT_INITIALIZED();
return pimpl_->neo_eval_exc_vxc(elec_Ps, prot_Ps, prot_Pz, ks_settings);
};

template <typename MatrixType>
typename XCIntegrator<MatrixType>::exc_vxc_type_neo_uks
XCIntegrator<MatrixType>::neo_eval_exc_vxc( const MatrixType& elec_Ps, const MatrixType& elec_Pz, const MatrixType& prot_Ps, const MatrixType& prot_Pz,
const IntegratorSettingsXC& ks_settings ){
if( not pimpl_ ) GAUXC_PIMPL_NOT_INITIALIZED();
return pimpl_->neo_eval_exc_vxc(elec_Ps, elec_Pz, prot_Ps, prot_Pz, ks_settings);
};


template <typename MatrixType>
typename XCIntegrator<MatrixType>::exc_grad_type
Expand Down
52 changes: 52 additions & 0 deletions include/gauxc/xc_integrator/integrator_factory.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,58 @@ class XCIntegratorFactory {
return get_shared_instance( std::make_shared<functional_type>(func), lb );
}

/** Generate XCIntegrator instance
*
* @param[in] func XC functional
* @param[in] epcfunc EPC functional
* @param[in] lb Preconstructed Load Balancer instance
*/
std::shared_ptr<integrator_type> get_shared_instance(
std::shared_ptr<functional_type> func,
std::shared_ptr<functional_type> epcfunc,
std::shared_ptr<LoadBalancer> lb ) {

// Create Local Work Driver
auto lwd = LocalWorkDriverFactory::make_local_work_driver( ex_,
lwd_kernel_, local_work_settings_ );

// Create Reduction Driver
auto rd = ReductionDriverFactory::get_shared_instance(
lb->runtime(), rd_kernel_ );

// Create Integrator instance
std::transform( input_type_.begin(), input_type_.end(), input_type_.begin(),
::toupper );

if(!epcfunc->is_polarized())
GAUXC_GENERIC_EXCEPTION("EPC FUNCTIONAL NOT POLARIZED");

if( input_type_ == "REPLICATED" )
return std::make_shared<integrator_type>(
ReplicatedXCIntegratorFactory<MatrixType>::make_integrator_impl(
ex_, integrator_kernel_, func, epcfunc, lb, std::move(lwd), rd
)
);
else GAUXC_GENERIC_EXCEPTION("INTEGRATOR TYPE NOT RECOGNIZED");

return nullptr;

}

auto get_shared_instance( const functional_type& func, const functional_type& epcfunc,
const LoadBalancer& lb ) {
return get_shared_instance( std::make_shared<functional_type>(func),
std::make_shared<functional_type>(epcfunc),
std::make_shared<LoadBalancer>(lb) );
}

auto get_shared_instance( const functional_type& func, const functional_type& epcfunc,
std::shared_ptr<LoadBalancer> lb ) {
return get_shared_instance( std::make_shared<functional_type>(func),
std::make_shared<functional_type>(epcfunc),
lb );
}


template <typename... Args>
integrator_type get_instance( Args&&... args ) {
Expand Down
53 changes: 53 additions & 0 deletions include/gauxc/xc_integrator/replicated/impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,59 @@ typename ReplicatedXCIntegrator<MatrixType>::exc_vxc_type_gks

}

template <typename MatrixType>
typename ReplicatedXCIntegrator<MatrixType>::exc_vxc_type_neo_rks
ReplicatedXCIntegrator<MatrixType>::neo_eval_exc_vxc_( const MatrixType& elec_Ps, const MatrixType& prot_Ps, const MatrixType& prot_Pz,
const IntegratorSettingsXC& ks_settings ) {

if( not pimpl_ ) GAUXC_PIMPL_NOT_INITIALIZED();
matrix_type elec_VXCs( elec_Ps.rows(), elec_Ps.cols() );
matrix_type prot_VXCs( prot_Ps.rows(), prot_Ps.cols() );
matrix_type prot_VXCz( prot_Pz.rows(), prot_Pz.cols() );
value_type elec_EXC;
value_type prot_EXC;

pimpl_->neo_eval_exc_vxc( elec_Ps.rows(), elec_Ps.cols(), prot_Ps.rows(), prot_Ps.cols(),
elec_Ps.data(), elec_Ps.rows(),
prot_Ps.data(), prot_Ps.rows(),
prot_Pz.data(), prot_Pz.rows(),
elec_VXCs.data(), elec_VXCs.rows(),
prot_VXCs.data(), prot_VXCs.rows(),
prot_VXCz.data(), prot_VXCz.rows(),
&elec_EXC, &prot_EXC, ks_settings );

return std::make_tuple( elec_EXC, prot_EXC, elec_VXCs, prot_VXCs, prot_VXCz );

}

template <typename MatrixType>
typename ReplicatedXCIntegrator<MatrixType>::exc_vxc_type_neo_uks
ReplicatedXCIntegrator<MatrixType>::neo_eval_exc_vxc_( const MatrixType& elec_Ps, const MatrixType& elec_Pz, const MatrixType& prot_Ps, const MatrixType& prot_Pz,
const IntegratorSettingsXC& ks_settings ) {

if( not pimpl_ ) GAUXC_PIMPL_NOT_INITIALIZED();
matrix_type elec_VXCs( elec_Ps.rows(), elec_Ps.cols() );
matrix_type elec_VXCz( elec_Pz.rows(), elec_Pz.cols() );
matrix_type prot_VXCs( prot_Ps.rows(), prot_Ps.cols() );
matrix_type prot_VXCz( prot_Pz.rows(), prot_Pz.cols() );
value_type elec_EXC;
value_type prot_EXC;

pimpl_->neo_eval_exc_vxc( elec_Ps.rows(), elec_Ps.cols(), prot_Ps.rows(), prot_Ps.cols(),
elec_Ps.data(), elec_Ps.rows(),
elec_Pz.data(), elec_Pz.rows(),
prot_Ps.data(), prot_Ps.rows(),
prot_Pz.data(), prot_Pz.rows(),
elec_VXCs.data(), elec_VXCs.rows(),
elec_VXCz.data(), elec_VXCz.rows(),
prot_VXCs.data(), prot_VXCs.rows(),
prot_VXCz.data(), prot_VXCz.rows(),
&elec_EXC, &prot_EXC, ks_settings );

return std::make_tuple( elec_EXC, prot_EXC, elec_VXCs, elec_VXCz, prot_VXCs, prot_VXCz );

}

template <typename MatrixType>
typename ReplicatedXCIntegrator<MatrixType>::exc_grad_type
ReplicatedXCIntegrator<MatrixType>::eval_exc_grad_( const MatrixType& P ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,15 @@ struct ReplicatedXCDeviceIntegratorFactory {
std::shared_ptr<ReductionDriver> rd
);

static ptr_return_t make_integrator_impl(
std::string integrator_kernel,
std::shared_ptr<functional_type> func,
std::shared_ptr<functional_type> epcfunc,
std::shared_ptr<LoadBalancer> lb,
std::unique_ptr<LocalWorkDriver>&& lwd,
std::shared_ptr<ReductionDriver> rd
);

};


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,15 @@ struct ReplicatedXCHostIntegratorFactory {
std::unique_ptr<LocalWorkDriver>&& lwd,
std::shared_ptr<ReductionDriver> rd
);

static ptr_return_t make_integrator_impl(
std::string integrator_kernel,
std::shared_ptr<functional_type> func,
std::shared_ptr<functional_type> epcfunc,
std::shared_ptr<LoadBalancer> lb,
std::unique_ptr<LocalWorkDriver>&& lwd,
std::shared_ptr<ReductionDriver> rd
);

};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,59 @@ struct ReplicatedXCIntegratorFactory {

}



/** Generate a ReplicatedXCIntegrator instance
*
* @param[in] ex Execution space for integrator instance
* @param[in] integration_kernel Name of integration scaffold to load ("Default", "Reference", etc)
* @param[in] func XC functional to integrate
* @param[in] epcfunc EPC functional to integrate
* @param[in] lb Pregenerated LoadBalancer instance
* @param[in] lwd Local Work Driver
*/
static ptr_return_t make_integrator_impl(
ExecutionSpace ex,
std::string integrator_kernel,
std::shared_ptr<functional_type> func,
std::shared_ptr<functional_type> epcfunc,
std::shared_ptr<LoadBalancer> lb,
std::unique_ptr<LocalWorkDriver>&& lwd,
std::shared_ptr<ReductionDriver> rd
) {



switch(ex) {

using host_factory =
detail::ReplicatedXCHostIntegratorFactory<value_type>;
case ExecutionSpace::Host:
return std::make_unique<integrator_type>(
host_factory::make_integrator_impl(
integrator_kernel, func, epcfunc, lb, std::move(lwd), rd
)
);

#ifdef GAUXC_HAS_DEVICE
using device_factory =
detail::ReplicatedXCDeviceIntegratorFactory<value_type>;
case ExecutionSpace::Device:
return std::make_unique<integrator_type>(
device_factory::make_integrator_impl(
integrator_kernel, func, epcfunc, lb, std::move(lwd), rd
)
);
#endif

default:
GAUXC_GENERIC_EXCEPTION("ReplicatedXCIntegrator ExecutionSpace Not Supported");
}

return nullptr;

}


};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class ReplicatedXCIntegratorImpl {
protected:

std::shared_ptr< functional_type > func_; ///< XC functional
std::shared_ptr< functional_type > epcfunc_; ///< EPC functional for NEO
std::shared_ptr< LoadBalancer > load_balancer_; ///< Load Balancer
std::unique_ptr< LocalWorkDriver > local_work_driver_; ///< Local Work Driver
std::shared_ptr< ReductionDriver > reduction_driver_; ///< Reduction Driver
Expand Down Expand Up @@ -73,7 +74,24 @@ class ReplicatedXCIntegratorImpl {
value_type* VXCy, int64_t ldvxcy,
value_type* VXCx, int64_t ldvxcx,
value_type* EXC, const IntegratorSettingsXC& ks_settings ) = 0;

virtual void neo_eval_exc_vxc_( int64_t elec_m, int64_t elec_mn, int64_t prot_m, int64_t prot_n,
const value_type* elec_Ps, int64_t elec_ldps,
const value_type* prot_Ps, int64_t prot_ldps,
const value_type* prot_Pz, int64_t prot_ldpz,
value_type* elec_VXCs, int64_t elec_ldvxcs,
value_type* prot_VXCs, int64_t prot_ldvxcs,
value_type* prot_VXCz, int64_t prot_ldvxcz,
value_type* elec_EXC, value_type* prot_EXC, const IntegratorSettingsXC& ks_settings) = 0;
virtual void neo_eval_exc_vxc_( int64_t elec_m, int64_t elec_n, int64_t prot_m, int64_t prot_n,
const value_type* elec_Ps, int64_t elec_ldps,
const value_type* elec_Pz, int64_t elec_ldpz,
const value_type* prot_Ps, int64_t prot_ldps,
const value_type* prot_Pz, int64_t prot_ldpz,
value_type* elec_VXCs, int64_t elec_ldvxcs,
value_type* elec_VXCz, int64_t elec_ldvxcz,
value_type* prot_VXCs, int64_t prot_ldvxcs,
value_type* prot_VXCz, int64_t prot_ldvxcz,
value_type* elec_EXC, value_type* prot_EXC, const IntegratorSettingsXC& ks_settings) = 0;
virtual void eval_exc_grad_( int64_t m, int64_t n, const value_type* P,
int64_t ldp, value_type* EXC_GRAD ) = 0;
virtual void eval_exx_( int64_t m, int64_t n, const value_type* P,
Expand All @@ -88,6 +106,13 @@ class ReplicatedXCIntegratorImpl {
std::shared_ptr< ReductionDriver> rd
);

ReplicatedXCIntegratorImpl( std::shared_ptr< functional_type > func,
std::shared_ptr< functional_type > epcfunc,
std::shared_ptr< LoadBalancer > lb,
std::unique_ptr< LocalWorkDriver >&& lwd,
std::shared_ptr< ReductionDriver> rd
);

virtual ~ReplicatedXCIntegratorImpl() noexcept;

void integrate_den( int64_t m, int64_t n, const value_type* P,
Expand Down Expand Up @@ -128,7 +153,26 @@ class ReplicatedXCIntegratorImpl {
value_type* VXCy, int64_t ldvxcy,
value_type* VXCx, int64_t ldvxcx,
value_type* EXC, const IntegratorSettingsXC& ks_settings );


void neo_eval_exc_vxc( int64_t elec_m, int64_t elec_n, int64_t prot_m, int64_t prot_n,
const value_type* elec_Ps, int64_t elec_ldps,
const value_type* prot_Ps, int64_t prot_ldps,
const value_type* prot_Pz, int64_t prot_ldpz,
value_type* elec_VXCs, int64_t elec_ldvxcs,
value_type* prot_VXCs, int64_t prot_ldvxcs,
value_type* prot_VXCz, int64_t prot_ldvxcz,
value_type* elec_EXC, value_type* prot_EXC, const IntegratorSettingsXC& ks_settings );

void neo_eval_exc_vxc( int64_t elec_m, int64_t elec_n, int64_t prot_m, int64_t prot_n,
const value_type* elec_Ps, int64_t elec_ldps,
const value_type* elec_Pz, int64_t elec_ldpz,
const value_type* prot_Ps, int64_t prot_ldps,
const value_type* prot_Pz, int64_t prot_ldpz,
value_type* elec_VXCs, int64_t elec_ldvxcs,
value_type* elec_VXCz, int64_t elec_ldvxcz,
value_type* prot_VXCs, int64_t prot_ldvxcs,
value_type* prot_VXCz, int64_t prot_ldvxcz,
value_type* elec_EXC, value_type* prot_EXC, const IntegratorSettingsXC& ks_settings );

void eval_exc_grad( int64_t m, int64_t n, const value_type* P,
int64_t ldp, value_type* EXC_GRAD );
Expand Down
Loading