You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Assuming the description in NWChemEx/SimDE#40 is correct, Libint will give us quantities like (one shell-pair at a time). This issue focuses on writing a module LibintEKineticNuc which will:
Initialize Libint (see the tutorial link at the bottom of this issue)
Create a lambda function which can be used to fill in a TA::DistArrayD instance via TA::make_array (the signature for the lambda is double (TA::Tensor<double>& t, const TA::Range& range) where the return is the norm of the tile, t is the tile being filled in, and range is the range of the tile (the indices of the elements in t).
Copy the TA tensor into a TW tensor and return the TW tensor.
Depending on when this issue is being worked on, NWChemEx/TensorWrapper#33 may have been resolved. If that's the case the lambda signature will change slightly and the copying of the TA tensor into the TW tensor will no longer need to happen.
The literal tasks:
Write the LibintEKineticNuc module (I recommend putting it in a new file src/integrals/libint/ekinetic_nuc.hpp)
unit test the module (I recommend putting the test in a new file tests/integrals/libint/test_ekinetic_nuc.cpp) the testing should be largely analogous to how we unit test EKinetic itself (see here)
Additional Notes:
We have some infrastructure in this repo for initializing and calling Libint. That infrastructure is heavily templated, and frankly, at this point a mess (it's built off a legacy version of what's now called PluginPlay and can be massively streamlined). It's recommended you ignore most of that infrastructure and follow the tutorials for Libint to implement LibintEKineticNuc
For the purposes of this issue there's no need to worry about attempting to generalize the module for different operators, just hard-code everything to the electronic kinetic energy. We'll worry about generalizing in another issue.
While I recommended ignoring most of the infrastructure in this repo, some of it is likely to still be very useful, particularly take a look at nwx_libint.hpp which will help convert from Chemist objects to Libint.
As a first pass just worry about an implementation where the entire integral is stored in core memory. Direct is done by changing the tile types of the TA tensor and it should be possible to implement direct in a manner that is largely orthogonal to the filling in of the tensor handled by this module.
At this stage I wouldn't worry too much about documentation. Any documentation that is written would probably need changed when the module gets generalized to other derivative types.
This issue depends on NWChemEx/SimDE#40 and https://github.com/NWChemEx-Project/Mokup/issues/31.
Assuming the description in NWChemEx/SimDE#40 is correct, Libint will give us quantities like
(one shell-pair at a time). This issue focuses on writing a module
LibintEKineticNucwhich will:EKinetic_NucPT defined in Property Type for Gradient of EKinetic SimDE#40TA::DistArrayDinstance viaTA::make_array(the signature for the lambda isdouble (TA::Tensor<double>& t, const TA::Range& range)where the return is the norm of the tile,tis the tile being filled in, andrangeis the range of the tile (the indices of the elements int).Depending on when this issue is being worked on, NWChemEx/TensorWrapper#33 may have been resolved. If that's the case the lambda signature will change slightly and the copying of the TA tensor into the TW tensor will no longer need to happen.
The literal tasks:
LibintEKineticNucmodule (I recommend putting it in a new filesrc/integrals/libint/ekinetic_nuc.hpp)tests/integrals/libint/test_ekinetic_nuc.cpp) the testing should be largely analogous to how we unit testEKineticitself (see here)Additional Notes:
LibintEKineticNuc