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
Is your feature request related to a problem? Please describe.
Currently Gbasis works with Cartesian primitives defined as:
Where$N(\alpha_i, \mathbf{a})$ is the normalization constant of the Cartesian primitive defined as:
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_integralsin construct_array_contraction thenorm_prim_cartinformation is passed. There would be two ways to include this option into Gbasis.norm_prim_cartcould read that flag and generate ones instead of the normalization constantsAdditional 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:generate_transformationuses 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