Skip to content

[REQUEST] Allow Gbasis to use normalized primitive contraction coefficients #197

@leila-pujal

Description

@leila-pujal

Is your feature request related to a problem? Please describe.

Currently Gbasis works with Cartesian primitives defined as:

$g_i(\mathbf{r} | \mathbf{R}_A, \mathbf{a}) = N(\alpha_i, \mathbf{a}) (x - X_A)^{a_x} (y - Y_A)^{a_y} (z - Z_A)^{a_z} \exp \left(-\alpha_i |\mathbf{r} - \mathbf{R}_A|^2 \right)$

Where $N(\alpha_i, \mathbf{a})$ is the normalization constant of the Cartesian primitive defined as:

$N(\alpha_i, \mathbf{a}) = \sqrt { \left(\frac{2\alpha_i}{\pi}\right)^\frac{3}{2} \frac{(4\alpha_i)^{a_x + a_y + a_z}}{(2a_x - 1)!! (2a_y - 1)!! (2a_z - 1)!!}} $

Gbasis assumes for each set of contraction primitives, contraction coefficients do not include $N(\alpha_i, \mathbf{a})$. There could be packages though where generated basis sets already include primitive normalization constants in the contraction coefficients for each primitive as shown in #194 . This issue suggests an enhancement to Gbasis code to allow for basis sets with primitive normalization constants already included in the contraction coefficients.

Is there a specific integral/formula that you would like implemented?

Is there a change to the code or algorithm you would like to see?

The normalization constant for each cartesian primitive is calculated at the contractions module in norm_prim_cart. Primitive normalization is used for all the integrals and density evaluations usually when the a lower level function is called. In the case of overlap for example when the Overlap class calls _compute_multipole_moment_integrals in construct_array_contraction the norm_prim_cart information is passed. There would be two ways to include this option into Gbasis.

  • As an argument to contractions and can be specified also when using parsers or wrappers. Then internally norm_prim_cart could read that flag and generate ones instead of the normalization constants
  • As an argument to the methods they use the normalization constants (most of them).

Additional info: Gbasis works at the low level only with cartesian primitives. Spherical primitives are converted to Cartesian here in generate_transformation. There the normalization applied is a factor combining Cartesian and Spherical normalizations:

$ \frac{N_s(\alpha_i, \ell)}{N(\alpha_i, \mathbf{a})} = \frac{ \sqrt{ \left(\frac{2 \alpha_i}{\pi} \right)^{\frac{3}{2}} \frac{(4 \alpha_i)^{\ell}}{(2\ell - 1)!!} } }{ \sqrt{ \left(\frac{2 \alpha_i}{\pi} \right)^{\frac{3}{2}} (4 \alpha_i)^{\ell} } \sqrt{ \frac{1}{(2 a_x -1)!! (2 a_y -1)!! (2 a_z -1)!!} } }\\ = \sqrt{\frac{(2 a_x -1)!! (2 a_y -1)!! (2 a_z -1)!!}{(2\ell - 1)!!}}$

generate_transformation uses the last simplification here but I think we could refactor that part to only use the spherical normalization if the contraction coefficients already include the cartesian primitive normalization.

Additional context

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions