Skip to content

EKinetic Gradient from LibInt #74

@ryanmrichard

Description

@ryanmrichard

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 LibintEKineticNuc which will:

  • Satisfy the EKinetic_Nuc PT defined in Property Type for Gradient of EKinetic SimDE#40
  • 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.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions