1
0
mirror of https://github.com/TREX-CoE/trexio.git synced 2025-01-03 10:06:01 +01:00

Added Jastrow group and reorganize data

This commit is contained in:
Anthony Scemama 2023-01-02 16:00:57 +01:00
parent 932e403ad2
commit 23b6c9008a
3 changed files with 967 additions and 843 deletions

View File

@ -19,6 +19,7 @@ CHANGES
- Added OCaml binding - Added OCaml binding
- Added spin and energy in MOs - Added spin and energy in MOs
- Added CSF group - Added CSF group
- Added Jastrow group
- Added Cholesky-decomposed two-electron integrals - Added Cholesky-decomposed two-electron integrals
- Added Cholesky-decomposed RDMs for Gammcor - Added Cholesky-decomposed RDMs for Gammcor
- Added `trexio_flush` functionality - Added `trexio_flush` functionality

View File

@ -73,7 +73,7 @@ python3 -m pip install dist/trexio-*.whl --force-reinstall
#python3 -m twine upload dist/trexio-*.tar.gz #python3 -m twine upload dist/trexio-*.tar.gz
# Cleaning # Cleaning
#rm -rf build dist trexio.egg-info rm -rf build dist trexio.egg-info
# Additional information related to the installation of the TREXIO Python API # Additional information related to the installation of the TREXIO Python API

797
trex.org
View File

@ -39,7 +39,7 @@ the [[./examples.html][examples]]. The ~sparse~ data representation implies the
[[https://en.wikipedia.org/wiki/Sparse_matrix#Coordinate_list_(COO)][coordinate list]] representation, namely the user has to write a list [[https://en.wikipedia.org/wiki/Sparse_matrix#Coordinate_list_(COO)][coordinate list]] representation, namely the user has to write a list
of indices and values. of indices and values.
For the Configuration Interfaction (CI) and Configuration State Function (CSF) For the Configuration Interaction (CI) and Configuration State Function (CSF)
groups, the ~buffered~ data type is introduced, which allows similar incremental groups, the ~buffered~ data type is introduced, which allows similar incremental
I/O as for ~sparse~ data but without the need to write indices of the sparse values. I/O as for ~sparse~ data but without the need to write indices of the sparse values.
@ -69,10 +69,12 @@ This means that the source code is not produced by the generator, but hand-writt
| ~description~ | ~str~ | | Text describing the content of file | | ~description~ | ~str~ | | Text describing the content of file |
| ~unsafe~ | ~int~ | | ~1~: true, ~0~: false | | ~unsafe~ | ~int~ | | ~1~: true, ~0~: false |
**Note:** ~unsafe~ attribute of the ~metadata~ group indicates whether the file has been previously opened with ~'u'~ mode. **Note:** ~unsafe~ attribute of the ~metadata~ group indicates
It is automatically written in the file upon the first unsafe opening. whether the file has been previously opened with ~'u'~ mode. It is
If the user has checked that the TREXIO file is valid (e.g. using ~trexio-tools~) after unsafe operations, automatically written in the file upon the first unsafe opening. If
then the ~unsafe~ attribute value can be manually overwritten (in unsafe mode) from ~1~ to ~0~. the user has checked that the TREXIO file is valid (e.g. using
~trexio-tools~) after unsafe operations, then the ~unsafe~ attribute
value can be manually overwritten (in unsafe mode) from ~1~ to ~0~.
#+CALL: json(data=metadata, title="metadata") #+CALL: json(data=metadata, title="metadata")
#+RESULTS: #+RESULTS:
@ -90,31 +92,8 @@ This means that the source code is not produced by the generator, but hand-writt
#+end_src #+end_src
:end: :end:
* Electron (electron group) * System
** Nucleus (nucleus group)
We consider wave functions expressed in the spin-free formalism, where
the number of \uparrow and \downarrow electrons is fixed.
#+NAME:electron
| Variable | Type | Dimensions | Description |
|----------+-------+------------+-------------------------------------|
| ~num~ | ~dim~ | | Number of electrons |
| ~up_num~ | ~int~ | | Number of \uparrow-spin electrons |
| ~dn_num~ | ~int~ | | Number of \downarrow-spin electrons |
#+CALL: json(data=electron, title="electron")
#+RESULTS:
:results:
#+begin_src python :tangle trex.json
"electron": {
"num" : [ "dim", [] ]
, "up_num" : [ "int", [] ]
, "dn_num" : [ "int", [] ]
} ,
#+end_src
:end:
* Nucleus (nucleus group)
The nuclei are considered as fixed point charges. Coordinates are The nuclei are considered as fixed point charges. Coordinates are
given in Cartesian $(x,y,z)$ format. given in Cartesian $(x,y,z)$ format.
@ -144,7 +123,331 @@ This means that the source code is not produced by the generator, but hand-writt
#+end_src #+end_src
:end: :end:
* Effective core potentials (ecp group) ** Cell (cell group)
3 Lattice vectors to define a box containing the system, for example
used in periodic calculations.
#+NAME: cell
| Variable | Type | Dimensions | Description |
|----------+---------+------------+-----------------------|
| ~a~ | ~float~ | ~(3)~ | First lattice vector |
| ~b~ | ~float~ | ~(3)~ | Second lattice vector |
| ~c~ | ~float~ | ~(3)~ | Third lattice vector |
#+CALL: json(data=cell, title="cell")
#+RESULTS:
:results:
#+begin_src python :tangle trex.json
"cell": {
"a" : [ "float", [ "3" ] ]
, "b" : [ "float", [ "3" ] ]
, "c" : [ "float", [ "3" ] ]
} ,
#+end_src
:end:
** Periodic boundary calculations (pbc group)
A single $k$-point per TREXIO file can be stored. The $k$-point is
defined in this group.
#+NAME: pbc
| Variable | Type | Dimensions | Description |
|------------+---------+------------+-------------------------|
| ~periodic~ | ~int~ | | ~1~: true or ~0~: false |
| ~k_point~ | ~float~ | ~(3)~ | $k$-point sampling |
#+CALL: json(data=pbc, title="pbc")
#+RESULTS:
:results:
#+begin_src python :tangle trex.json
"pbc": {
"periodic" : [ "int" , [] ]
, "k_point" : [ "float", [ "3" ] ]
} ,
#+end_src
:end:
** Numerical integration grid (grid group)
The molecular integrals have to be computed numerically on a grid in many applications.
A common choice for the angular grid is the one proposed by Lebedev and Laikov
[Russian Academy of Sciences Doklady Mathematics, Volume 59, Number 3, 1999, pages 477-481].
For the radial grids, many approaches have been developed over the years.
The structure of this group is adapted for the [[https://github.com/dftlibs/numgrid][numgrid]] library.
Feel free to submit a PR if you find missing options/functionalities.
#+name: grid
| Variable | Type | Dimensions | Description |
|-----------------+---------+------------------+-------------------------------------------------------------------------|
| ~description~ | ~str~ | | Details about the used quadratures can go here |
| ~rad_precision~ | ~float~ | | Radial precision parameter (not used in some schemes like Krack-Köster) |
| ~num~ | ~dim~ | | Number of grid points |
| ~max_ang_num~ | ~int~ | | Maximum number of angular grid points (for pruning) |
| ~min_ang_num~ | ~int~ | | Minimum number of angular grid points (for pruning) |
| ~coord~ | ~float~ | ~(grid.num)~ | Discretized coordinate space |
| ~weight~ | ~float~ | ~(grid.num)~ | Grid weights according to a given partitioning (e.g. Becke) |
| ~ang_num~ | ~dim~ | | Number of angular integration points (if used) |
| ~ang_coord~ | ~float~ | ~(grid.ang_num)~ | Discretized angular space (if used) |
| ~ang_weight~ | ~float~ | ~(grid.ang_num)~ | Angular grid weights (if used) |
| ~rad_num~ | ~dim~ | | Number of radial integration points (if used) |
| ~rad_coord~ | ~float~ | ~(grid.rad_num)~ | Discretized radial space (if used) |
| ~rad_weight~ | ~float~ | ~(grid.rad_num)~ | Radial grid weights (if used) |
#+CALL: json(data=grid, title="grid")
#+RESULTS:
:results:
#+begin_src python :tangle trex.json
"grid": {
"description" : [ "str" , [] ]
, "rad_precision" : [ "float", [] ]
, "num" : [ "dim" , [] ]
, "max_ang_num" : [ "int" , [] ]
, "min_ang_num" : [ "int" , [] ]
, "coord" : [ "float", [ "grid.num" ] ]
, "weight" : [ "float", [ "grid.num" ] ]
, "ang_num" : [ "dim" , [] ]
, "ang_coord" : [ "float", [ "grid.ang_num" ] ]
, "ang_weight" : [ "float", [ "grid.ang_num" ] ]
, "rad_num" : [ "dim" , [] ]
, "rad_coord" : [ "float", [ "grid.rad_num" ] ]
, "rad_weight" : [ "float", [ "grid.rad_num" ] ]
} ,
#+end_src
:end:
** Electron (electron group)
We consider wave functions expressed in the spin-free formalism, where
the number of \uparrow and \downarrow electrons is fixed.
#+NAME:electron
| Variable | Type | Dimensions | Description |
|----------+-------+------------+-------------------------------------|
| ~num~ | ~dim~ | | Number of electrons |
| ~up_num~ | ~int~ | | Number of \uparrow-spin electrons |
| ~dn_num~ | ~int~ | | Number of \downarrow-spin electrons |
#+CALL: json(data=electron, title="electron")
#+RESULTS:
:results:
#+begin_src python :tangle trex.json
"electron": {
"num" : [ "dim", [] ]
, "up_num" : [ "int", [] ]
, "dn_num" : [ "int", [] ]
} ,
#+end_src
:end:
** Ground or excited states (state group)
This group contains information about excited states. Since only a
single state can be stored in a TREXIO file, it is possible to store
in the main TREXIO file the names of auxiliary files containing the
information of the other states.
The ~file_name~ and ~label~ arrays have to be written only for the
main file, e.g. the one containing the ground state wave function
together with the basis set parameters, molecular orbitals,
integrals, etc.
The ~id~ and ~current_label~ attributes need to be specified for each file.
#+NAME: state
| Variable | Type | Dimensions | Description |
|-----------------+-------+---------------+---------------------------------------------------------------------------------------------|
| ~num~ | ~dim~ | | Number of states (including the ground state) |
| ~id~ | ~int~ | | Index of the current state (0 is ground state) |
| ~current_label~ | ~str~ | | Label of the current state |
| ~label~ | ~str~ | ~(state.num)~ | Labels of all states |
| ~file_name~ | ~str~ | ~(state.num)~ | Names of the TREXIO files linked to the current one (i.e. containing data for other states) |
#+CALL: json(data=state, title="state")
#+RESULTS:
:results:
#+begin_src python :tangle trex.json
"state": {
"num" : [ "dim", [] ]
, "id" : [ "int", [] ]
, "current_label" : [ "str", [] ]
, "label" : [ "str", [ "state.num" ] ]
, "file_name" : [ "str", [ "state.num" ] ]
} ,
#+end_src
:end:
* One-electron basis
** Basis set (basis group)
*** Gaussian and Slater-type orbitals
We consider here basis functions centered on nuclei. Hence, we enable
the possibility to define /dummy atoms/ to place basis functions in
random positions.
The atomic basis set is defined as a list of shells. Each shell $s$ is
centered on a center $A$, possesses a given angular momentum $l$ and a
radial function $R_s$. The radial function is a linear combination of
$N_{\text{prim}}$ /primitive/ functions that can be of type
Slater ($p=1$) or Gaussian ($p=2$),
parameterized by exponents $\gamma_{ks}$ and coefficients $a_{ks}$:
\[
R_s(\mathbf{r}) = \mathcal{N}_s \vert\mathbf{r}-\mathbf{R}_A\vert^{n_s}
\sum_{k=1}^{N_{\text{prim}}} a_{ks}\, f_{ks}(\gamma_{ks},p)\,
\exp \left( - \gamma_{ks}
\vert \mathbf{r}-\mathbf{R}_A \vert ^p \right).
\]
In the case of Gaussian functions, $n_s$ is always zero.
Different codes normalize functions at different levels. Computing
normalization factors requires the ability to compute overlap
integrals, so the normalization factors should be written in the
file to ensure that the file is self-contained and does not need the
client program to have the ability to compute such integrals.
Some codes assume that the contraction coefficients are for a linear
combination of /normalized/ primitives. This implies that a normalization
constant for the primitive $ks$ needs to be computed and stored. If
this normalization factor is not required, $f_{ks}=1$.
Some codes assume that the basis function are normalized. This
implies the computation of an extra normalization factor, $\mathcal{N}_s$.
If the the basis function is not considered normalized, $\mathcal{N}_s=1$.
All the basis set parameters are stored in one-dimensional arrays.
*** Plane waves
A plane wave is defined as
\[
\chi_j(r) = \exp \left( -i \mathbf{k}_j \mathbf{r} \right)
\]
The basis set is defined as the array of $k$-points in the
reciprocal space, defined in the ~pbc~ group. The kinetic energy
cutoff ~e_cut~ is the only input data relevant to plane waves.
*** Data definitions
#+NAME: basis
| Variable | Type | Dimensions | Description |
|-----------------+---------+---------------------+-----------------------------------------------------------------|
| ~type~ | ~str~ | | Type of basis set: "Gaussian", "Slater" or "PW" for plane waves |
| ~prim_num~ | ~dim~ | | Total number of primitives |
| ~shell_num~ | ~dim~ | | Total number of shells |
| ~nucleus_index~ | ~index~ | ~(basis.shell_num)~ | One-to-one correspondence between shells and atomic indices |
| ~shell_ang_mom~ | ~int~ | ~(basis.shell_num)~ | One-to-one correspondence between shells and angular momenta |
| ~shell_factor~ | ~float~ | ~(basis.shell_num)~ | Normalization factor of each shell ($\mathcal{N}_s$) |
| ~r_power~ | ~int~ | ~(basis.shell_num)~ | Power to which $r$ is raised ($n_s$) |
| ~shell_index~ | ~index~ | ~(basis.prim_num)~ | One-to-one correspondence between primitives and shell index |
| ~exponent~ | ~float~ | ~(basis.prim_num)~ | Exponents of the primitives ($\gamma_{ks}$) |
| ~coefficient~ | ~float~ | ~(basis.prim_num)~ | Coefficients of the primitives ($a_{ks}$) |
| ~prim_factor~ | ~float~ | ~(basis.prim_num)~ | Normalization coefficients for the primitives ($f_{ks}$) |
| ~e_cut~ | ~float~ | | Energy cut-off for plane-wave calculations |
#+CALL: json(data=basis, title="basis")
#+RESULTS:
:results:
#+begin_src python :tangle trex.json
"basis": {
"type" : [ "str" , [] ]
, "prim_num" : [ "dim" , [] ]
, "shell_num" : [ "dim" , [] ]
, "nucleus_index" : [ "index", [ "basis.shell_num" ] ]
, "shell_ang_mom" : [ "int" , [ "basis.shell_num" ] ]
, "shell_factor" : [ "float", [ "basis.shell_num" ] ]
, "r_power" : [ "int" , [ "basis.shell_num" ] ]
, "shell_index" : [ "index", [ "basis.prim_num" ] ]
, "exponent" : [ "float", [ "basis.prim_num" ] ]
, "coefficient" : [ "float", [ "basis.prim_num" ] ]
, "prim_factor" : [ "float", [ "basis.prim_num" ] ]
, "e_cut" : [ "float", [] ]
} ,
#+end_src
:end:
*** Example
For example, consider H_2 with the following basis set (in GAMESS
format), where both the AOs and primitives are considered normalized:
#+BEGIN_EXAMPLE
HYDROGEN
S 5
1 3.387000E+01 6.068000E-03
2 5.095000E+00 4.530800E-02
3 1.159000E+00 2.028220E-01
4 3.258000E-01 5.039030E-01
5 1.027000E-01 3.834210E-01
S 1
1 3.258000E-01 1.000000E+00
S 1
1 1.027000E-01 1.000000E+00
P 1
1 1.407000E+00 1.000000E+00
P 1
1 3.880000E-01 1.000000E+00
D 1
1 1.057000E+00 1.000000E+00
#+END_EXAMPLE
In TREXIO representaion we have:
#+BEGIN_EXAMPLE
type = "Gaussian"
prim_num = 20
shell_num = 12
# 6 shells per H atom
nucleus_index =
[ 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1 ]
# 3 shells in S (l=0), 2 in P (l=1), 1 in D (l=2)
shell_ang_mom =
[ 0, 0, 0, 1, 1, 2,
0, 0, 0, 1, 1, 2 ]
# no need to renormalize shells
shell_factor =
[ 1., 1., 1., 1., 1., 1.,
1., 1., 1., 1., 1., 1. ]
# 5 primitives for the first S shell and then 1 primitive per remaining shells in each H atom
shell_index =
[ 0, 0, 0, 0, 0, 1, 2, 3, 4, 5,
6, 6, 6, 6, 6, 7, 8, 9, 10, 11 ]
# parameters of the primitives (10 per H atom)
exponent =
[ 33.87, 5.095, 1.159, 0.3258, 0.1027, 0.3258, 0.1027, 1.407, 0.388, 1.057,
33.87, 5.095, 1.159, 0.3258, 0.1027, 0.3258, 0.1027, 1.407, 0.388, 1.057 ]
coefficient =
[ 0.006068, 0.045308, 0.202822, 0.503903, 0.383421, 1.0, 1.0, 1.0, 1.0, 1.0,
0.006068, 0.045308, 0.202822, 0.503903, 0.383421, 1.0, 1.0, 1.0, 1.0, 1.0 ]
`
prim_factor =
[ 1.0006253235944540e+01, 2.4169531573445120e+00, 7.9610924849766440e-01
3.0734305383061117e-01, 1.2929684417481876e-01, 3.0734305383061117e-01,
1.2929684417481876e-01, 2.1842769845268308e+00, 4.3649547399719840e-01,
1.8135965626177861e+00, 1.0006253235944540e+01, 2.4169531573445120e+00,
7.9610924849766440e-01, 3.0734305383061117e-01, 1.2929684417481876e-01,
3.0734305383061117e-01, 1.2929684417481876e-01, 2.1842769845268308e+00,
4.3649547399719840e-01, 1.8135965626177861e+00 ]
#+END_EXAMPLE
** Effective core potentials (ecp group)
An effective core potential (ECP) $V_A^{\text{ECP}}$ replacing the An effective core potential (ECP) $V_A^{\text{ECP}}$ replacing the
core electrons of atom $A$ can be expressed as core electrons of atom $A$ can be expressed as
@ -218,7 +521,7 @@ If you encounter the aforementioned issue, please report it to our [[https://git
#+end_src #+end_src
:end: :end:
** Example *** Example
For example, consider H_2 molecule with the following For example, consider H_2 molecule with the following
[[https://pseudopotentiallibrary.org/recipes/H/ccECP/H.ccECP.gamess][effective core potential]] [[https://pseudopotentiallibrary.org/recipes/H/ccECP/H.ccECP.gamess][effective core potential]]
@ -274,172 +577,7 @@ power = [
] ]
#+END_EXAMPLE #+END_EXAMPLE
* Basis set (basis group) ** Atomic orbitals (ao group)
** Gaussian and Slater-type orbitals
We consider here basis functions centered on nuclei. Hence, we enable
the possibility to define /dummy atoms/ to place basis functions in
random positions.
The atomic basis set is defined as a list of shells. Each shell $s$ is
centered on a center $A$, possesses a given angular momentum $l$ and a
radial function $R_s$. The radial function is a linear combination of
$N_{\text{prim}}$ /primitive/ functions that can be of type
Slater ($p=1$) or Gaussian ($p=2$),
parameterized by exponents $\gamma_{ks}$ and coefficients $a_{ks}$:
\[
R_s(\mathbf{r}) = \mathcal{N}_s \vert\mathbf{r}-\mathbf{R}_A\vert^{n_s}
\sum_{k=1}^{N_{\text{prim}}} a_{ks}\, f_{ks}(\gamma_{ks},p)\,
\exp \left( - \gamma_{ks}
\vert \mathbf{r}-\mathbf{R}_A \vert ^p \right).
\]
In the case of Gaussian functions, $n_s$ is always zero.
Different codes normalize functions at different levels. Computing
normalization factors requires the ability to compute overlap
integrals, so the normalization factors should be written in the
file to ensure that the file is self-contained and does not need the
client program to have the ability to compute such integrals.
Some codes assume that the contraction coefficients are for a linear
combination of /normalized/ primitives. This implies that a normalization
constant for the primitive $ks$ needs to be computed and stored. If
this normalization factor is not required, $f_{ks}=1$.
Some codes assume that the basis function are normalized. This
implies the computation of an extra normalization factor, $\mathcal{N}_s$.
If the the basis function is not considered normalized, $\mathcal{N}_s=1$.
All the basis set parameters are stored in one-dimensional arrays.
** Plane waves
A plane wave is defined as
\[
\chi_j(r) = \exp \left( -i \mathbf{k}_j \mathbf{r} \right)
\]
The basis set is defined as the array of $k$-points in the
reciprocal space, defined in the ~pbc~ group. The kinetic energy
cutoff ~e_cut~ is the only input data relevant to plane waves.
** Data definitions
#+NAME: basis
| Variable | Type | Dimensions | Description |
|-----------------+---------+---------------------+-----------------------------------------------------------------|
| ~type~ | ~str~ | | Type of basis set: "Gaussian", "Slater" or "PW" for plane waves |
| ~prim_num~ | ~dim~ | | Total number of primitives |
| ~shell_num~ | ~dim~ | | Total number of shells |
| ~nucleus_index~ | ~index~ | ~(basis.shell_num)~ | One-to-one correspondence between shells and atomic indices |
| ~shell_ang_mom~ | ~int~ | ~(basis.shell_num)~ | One-to-one correspondence between shells and angular momenta |
| ~shell_factor~ | ~float~ | ~(basis.shell_num)~ | Normalization factor of each shell ($\mathcal{N}_s$) |
| ~r_power~ | ~int~ | ~(basis.shell_num)~ | Power to which $r$ is raised ($n_s$) |
| ~shell_index~ | ~index~ | ~(basis.prim_num)~ | One-to-one correspondence between primitives and shell index |
| ~exponent~ | ~float~ | ~(basis.prim_num)~ | Exponents of the primitives ($\gamma_{ks}$) |
| ~coefficient~ | ~float~ | ~(basis.prim_num)~ | Coefficients of the primitives ($a_{ks}$) |
| ~prim_factor~ | ~float~ | ~(basis.prim_num)~ | Normalization coefficients for the primitives ($f_{ks}$) |
| ~e_cut~ | ~float~ | | Energy cut-off for plane-wave calculations |
#+CALL: json(data=basis, title="basis")
#+RESULTS:
:results:
#+begin_src python :tangle trex.json
"basis": {
"type" : [ "str" , [] ]
, "prim_num" : [ "dim" , [] ]
, "shell_num" : [ "dim" , [] ]
, "nucleus_index" : [ "index", [ "basis.shell_num" ] ]
, "shell_ang_mom" : [ "int" , [ "basis.shell_num" ] ]
, "shell_factor" : [ "float", [ "basis.shell_num" ] ]
, "r_power" : [ "int" , [ "basis.shell_num" ] ]
, "shell_index" : [ "index", [ "basis.prim_num" ] ]
, "exponent" : [ "float", [ "basis.prim_num" ] ]
, "coefficient" : [ "float", [ "basis.prim_num" ] ]
, "prim_factor" : [ "float", [ "basis.prim_num" ] ]
, "e_cut" : [ "float", [] ]
} ,
#+end_src
:end:
** Example
For example, consider H_2 with the following basis set (in GAMESS
format), where both the AOs and primitives are considered normalized:
#+BEGIN_EXAMPLE
HYDROGEN
S 5
1 3.387000E+01 6.068000E-03
2 5.095000E+00 4.530800E-02
3 1.159000E+00 2.028220E-01
4 3.258000E-01 5.039030E-01
5 1.027000E-01 3.834210E-01
S 1
1 3.258000E-01 1.000000E+00
S 1
1 1.027000E-01 1.000000E+00
P 1
1 1.407000E+00 1.000000E+00
P 1
1 3.880000E-01 1.000000E+00
D 1
1 1.057000E+00 1.000000E+00
#+END_EXAMPLE
In TREXIO representaion we have:
#+BEGIN_EXAMPLE
type = "Gaussian"
prim_num = 20
shell_num = 12
# 6 shells per H atom
nucleus_index =
[ 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1 ]
# 3 shells in S (l=0), 2 in P (l=1), 1 in D (l=2)
shell_ang_mom =
[ 0, 0, 0, 1, 1, 2,
0, 0, 0, 1, 1, 2 ]
# no need to renormalize shells
shell_factor =
[ 1., 1., 1., 1., 1., 1.,
1., 1., 1., 1., 1., 1. ]
# 5 primitives for the first S shell and then 1 primitive per remaining shells in each H atom
shell_index =
[ 0, 0, 0, 0, 0, 1, 2, 3, 4, 5,
6, 6, 6, 6, 6, 7, 8, 9, 10, 11 ]
# parameters of the primitives (10 per H atom)
exponent =
[ 33.87, 5.095, 1.159, 0.3258, 0.1027, 0.3258, 0.1027, 1.407, 0.388, 1.057,
33.87, 5.095, 1.159, 0.3258, 0.1027, 0.3258, 0.1027, 1.407, 0.388, 1.057 ]
coefficient =
[ 0.006068, 0.045308, 0.202822, 0.503903, 0.383421, 1.0, 1.0, 1.0, 1.0, 1.0,
0.006068, 0.045308, 0.202822, 0.503903, 0.383421, 1.0, 1.0, 1.0, 1.0, 1.0 ]
`
prim_factor =
[ 1.0006253235944540e+01, 2.4169531573445120e+00, 7.9610924849766440e-01
3.0734305383061117e-01, 1.2929684417481876e-01, 3.0734305383061117e-01,
1.2929684417481876e-01, 2.1842769845268308e+00, 4.3649547399719840e-01,
1.8135965626177861e+00, 1.0006253235944540e+01, 2.4169531573445120e+00,
7.9610924849766440e-01, 3.0734305383061117e-01, 1.2929684417481876e-01,
3.0734305383061117e-01, 1.2929684417481876e-01, 2.1842769845268308e+00,
4.3649547399719840e-01, 1.8135965626177861e+00 ]
#+END_EXAMPLE
* Atomic orbitals (ao group)
Going from the atomic basis set to AOs implies a systematic Going from the atomic basis set to AOs implies a systematic
construction of all the angular functions of each shell. We construction of all the angular functions of each shell. We
@ -508,7 +646,7 @@ prim_factor =
#+end_src #+end_src
:end: :end:
** One-electron integrals (~ao_1e_int~ group) *** One-electron integrals (~ao_1e_int~ group)
:PROPERTIES: :PROPERTIES:
:CUSTOM_ID: ao_one_e :CUSTOM_ID: ao_one_e
:END: :END:
@ -558,7 +696,7 @@ prim_factor =
#+end_src #+end_src
:end: :end:
** Two-electron integrals (~ao_2e_int~ group) *** Two-electron integrals (~ao_2e_int~ group)
:PROPERTIES: :PROPERTIES:
:CUSTOM_ID: ao_two_e :CUSTOM_ID: ao_two_e
:END: :END:
@ -596,7 +734,7 @@ prim_factor =
#+end_src #+end_src
:end: :end:
* Molecular orbitals (mo group) ** Molecular orbitals (mo group)
#+NAME: mo #+NAME: mo
| Variable | Type | Dimensions | Description | | Variable | Type | Dimensions | Description |
@ -630,7 +768,7 @@ prim_factor =
#+end_src #+end_src
:end: :end:
** One-electron integrals (~mo_1e_int~ group) *** One-electron integrals (~mo_1e_int~ group)
The operators as the same as those defined in the The operators as the same as those defined in the
[[#ao_one_e][AO one-electron integrals section]]. Here, the integrals are given in [[#ao_one_e][AO one-electron integrals section]]. Here, the integrals are given in
@ -670,7 +808,7 @@ prim_factor =
#+end_src #+end_src
:end: :end:
** Two-electron integrals (~mo_2e_int~ group) *** Two-electron integrals (~mo_2e_int~ group)
The operators are the same as those defined in the The operators are the same as those defined in the
[[#ao_two_e][AO two-electron integrals section]]. Here, the integrals are given in [[#ao_two_e][AO two-electron integrals section]]. Here, the integrals are given in
@ -707,8 +845,21 @@ prim_factor =
} , } ,
#+end_src #+end_src
:end: :end:
:results:
#+begin_src python :tangle trex.json
"mo_2e_int": {
"eri" : [ "float sparse", [ "mo.num", "mo.num", "mo.num", "mo.num" ] ]
, "eri_lr" : [ "float sparse", [ "mo.num", "mo.num", "mo.num", "mo.num" ] ]
, "eri_cholesky_num" : [ "dim" , [] ]
, "eri_cholesky" : [ "float sparse", [ "mo_2e_int.eri_cholesky_num", "mo.num", "mo.num" ] ]
, "eri_lr_cholesky_num" : [ "dim" , [] ]
, "eri_lr_cholesky" : [ "float sparse", [ "mo_2e_int.eri_lr_cholesky_num", "mo.num", "mo.num" ] ]
} ,
#+end_src
:
* Slater determinants (determinant group) * N-electron basis
** Slater determinants (determinant group)
The configuration interaction (CI) wave function $\Psi$ The configuration interaction (CI) wave function $\Psi$
can be expanded in the basis of Slater determinants $D_I$ as follows can be expanded in the basis of Slater determinants $D_I$ as follows
@ -756,7 +907,7 @@ prim_factor =
#+end_src #+end_src
:end: :end:
* Configuration state functions (csf group) ** Configuration state functions (csf group)
The configuration interaction (CI) wave function $\Psi$ can be The configuration interaction (CI) wave function $\Psi$ can be
expanded in the basis of [[https://en.wikipedia.org/wiki/Configuration_state_function][configuration state functions]] (CSFs) expanded in the basis of [[https://en.wikipedia.org/wiki/Configuration_state_function][configuration state functions]] (CSFs)
@ -792,44 +943,7 @@ prim_factor =
#+end_src #+end_src
:end: :end:
* Excited states (state group) ** Reduced density matrices (rdm group)
This group contains information about excited states. Since only a
single state can be stored in a TREXIO file, it is possible to store
in the main TREXIO file the names of auxiliary files containing the
information of the other states.
The ~file_name~ and ~label~ arrays have to be written only for the
main file, e.g. the one containing the ground state wave function
together with the basis set parameters, molecular orbitals,
integrals, etc.
The ~id~ and ~current_label~ attributes need to be specified for each file.
#+NAME: state
| Variable | Type | Dimensions | Description |
|-----------------+-------+---------------+---------------------------------------------------------------------------------------------|
| ~num~ | ~dim~ | | Number of states (including the ground state) |
| ~id~ | ~int~ | | Index of the current state (0 is ground state) |
| ~current_label~ | ~str~ | | Label of the current state |
| ~label~ | ~str~ | ~(state.num)~ | Labels of all states |
| ~file_name~ | ~str~ | ~(state.num)~ | Names of the TREXIO files linked to the current one (i.e. containing data for other states) |
#+CALL: json(data=state, title="state")
#+RESULTS:
:results:
#+begin_src python :tangle trex.json
"state": {
"num" : [ "dim", [] ]
, "id" : [ "int", [] ]
, "current_label" : [ "str", [] ]
, "label" : [ "str", [ "state.num" ] ]
, "file_name" : [ "str", [ "state.num" ] ]
} ,
#+end_src
:end:
* Reduced density matrices (rdm group)
The reduced density matrices are defined in the basis of molecular The reduced density matrices are defined in the basis of molecular
orbitals. orbitals.
@ -936,103 +1050,112 @@ prim_factor =
#+end_src #+end_src
:end: :end:
* Cell (cell group) * Correlation factors
** Jastrow factor (jastrow group)
3 Lattice vectors to define a box containing the system, for example The Jastrow factor is an $N$-electron function to which the CI
used in periodic calculations. expansion is multiplied: $\Psi = \Phi \times \exp(J)$,
where
#+NAME: cell \[
J(\mathbf{r},\mathbf{R}) = J_{\text{eN}}(\mathbf{r},\mathbf{R}) + J_{\text{ee}}(\mathbf{r}) + J_{\text{eeN}}(\mathbf{r},\mathbf{R})
\]
In the following, we use the notations $r_{ij} = |\mathbf{r}_i - \mathbf{r}_j|$ and
$R_{i\alpha} = |\mathbf{r}_i - \mathbf{R}_\alpha|$, where indices
$i$ and $j$ correspond to electrons and $\alpha$ to nuclei.
Parameters for multiple forms of Jastrow factors can be saved in
TREXIO files, and are described in the following sections. These
are identified by the ~type~ attribute. The type can be one of the
following:
- ~champ~
- ~mu~
*** CHAMP
The first form of Jastrow factor is the one used in
the [[https://trex-coe.eu/trex-quantum-chemistry-codes/champ][CHAMP]] program.
$J_{\text{eN}}$ contains electron-nucleus terms:
\[
J_{\text{eN}}(\mathbf{r},\mathbf{R}) = \sum_{i=1}^{N_\text{elec}} \sum_{\alpha=1}^{N_\text{nucl}}
\frac{a_{1,\alpha}\, g_\alpha(R_{i\alpha})}{1+a_{2,\alpha}\, g_\alpha(R_{i\alpha})} +
\sum_{p=2}^{N_\text{ord}^a} a_{p+1,\alpha}\, [g_\alpha(R_{i\alpha})]^p - J_{eN}^\infty
\]
$J_{\text{ee}}$ contains electron-electron terms:
\[
J_{\text{ee}}(\mathbf{r}) =
\sum_{i=1}^{N_\text{elec}} \sum_{j=1}^{i-1}
\frac{b_1\, f(r_{ij})}{1+b_2\, f(r_{ij})} +
\sum_{p=2}^{N_\text{ord}^b} a_{p+1}\, [f(r_{ij})]^p - J_{ee}^\infty
\]
and $J_{\text{eeN}}$ contains electron-electron-Nucleus terms:
\[
J_{\text{eeN}}(\mathbf{r},\mathbf{R}) =
\sum_{\alpha=1}^{N_{\text{nucl}}}
\sum_{i=1}^{N_{\text{elec}}}
\sum_{j=1}^{i-1}
\sum_{p=2}^{N_{\text{ord}}}
\sum_{k=0}^{p-1}
\sum_{l=0}^{p-k-2\delta_{k,0}}
c_{lkp\alpha} \left[ f({r}_{ij}) \right]^k
\left[ \left[ g_\alpha({R}_{i\alpha}) \right]^l + \left[ g_\alpha({R}_{j\alpha}) \right]^l \right]
\left[ g_\alpha({R}_{i\,\alpha}) \, g_\alpha({R}_{j\alpha}) \right]^{(p-k-l)/2}
\]
$c_{lkp\alpha}$ are non-zero only when $p-k-l$ is even.
The terms $J_{\text{ee}}^\infty$ and $J_{\text{eN}}^\infty$ are shifts to ensure that
$J_{\text{ee}}$ and $J_{\text{eN}}$ have an asymptotic value of zero.
$f$ and $g$ are scaling function defined as
\[
f(r) = \frac{1-e^{-\kappa\, r}}{\kappa} \text{ and }
g_\alpha(r) = e^{-\kappa_\alpha\, r}.
\]
*** mu
The "mu" Jastrow factor has only a single parameter $\mu$ for the
[[https://doi.org/10.1063/5.0044683][electron-electron term]]:
\[
J_{\text{ee}}(\mathbf{r}) =
\sum_{i=1}^{N_\text{elec}} \sum_{j=1}^{i-1} r_{ij}
\left( 1 - \text{erf}(\mu\, r_{ij})\right) - \frac{1}{\mu\sqrt{\pi}}
e^{-(\mu\,r_{ij})^2}
\]
# It was then updated for frozen-core calculations by introducing a
# set of electron-electron-nucleus terms with one parameter per nucleus:
# \[
# J_{\text{eeN}}(\mathbf{r}) =
# \]
*** Table of values
#+name: jastrow
| Variable | Type | Dimensions | Description | | Variable | Type | Dimensions | Description |
|----------+---------+------------+-----------------------| |---------------+----------+---------------------+-----------------------------------------------------------------|
| ~a~ | ~float~ | ~(3)~ | First lattice vector | | ~type~ | ~string~ | | Type of Jastrow factor: ~champ~ or ~mu~ |
| ~b~ | ~float~ | ~(3)~ | Second lattice vector | | ~ee_num~ | ~dim~ | | Number of Electron-electron parameters |
| ~c~ | ~float~ | ~(3)~ | Third lattice vector | | ~en_num~ | ~dim~ | ~(nucleus.num)~ | Number of Electron-nucleus parameters, per nucleus |
| ~een_num~ | ~dim~ | ~(nucleus.num)~ | Number of Electron-electron-nucleus parameters, per nucleus |
#+CALL: json(data=cell, title="cell") | ~ee~ | ~float~ | ~(jastrow.ee_num)~ | Electron-electron parameters |
| ~en~ | ~float~ | ~(jastrow.en_num)~ | Electron-nucleus parameters |
#+RESULTS: | ~een~ | ~float~ | ~(jastrow.een_num)~ | Electron-electron-nucleus parameters |
:results: | ~en_nucleus~ | ~index~ | ~(jastrow.en_num)~ | Nucleus relative to the eN parameter |
#+begin_src python :tangle trex.json | ~een_nucleus~ | ~index~ | ~(jastrow.een_num)~ | Nucleus relative to the eeN parameter |
"cell": { | ~ee_scaling~ | ~float~ | | $\kappa$ value in CHAMP Jastrow for electron-electron distances |
"a" : [ "float", [ "3" ] ] | ~eN_scaling~ | ~float~ | ~(nucleus.num)~ | $\kappa$ value in CHAMP Jastrow for electron-nucleus distances |
, "b" : [ "float", [ "3" ] ]
, "c" : [ "float", [ "3" ] ]
} ,
#+end_src
:end:
* Periodic boundary calculations (pbc group)
A single $k$-point per TREXIO file can be stored. The $k$-point is
defined in this group.
#+NAME: pbc
| Variable | Type | Dimensions | Description |
|---------------+---------+------------+-------------------------|
| ~periodic~ | ~int~ | | ~1~: true or ~0~: false |
| ~k_point~ | ~float~ | ~(3)~ | $k$-point sampling |
#+CALL: json(data=pbc, title="pbc")
#+RESULTS:
:results:
#+begin_src python :tangle trex.json
"pbc": {
"periodic" : [ "int" , [] ]
, "k_point" : [ "float", [ "3" ] ]
} ,
#+end_src
:end:
* Numerical integration grid (grid group)
The molecular integrals have to be computed numerically on a grid in many applications.
A common choice for the angular grid is the one proposed by Lebedev and Laikov
[Russian Academy of Sciences Doklady Mathematics, Volume 59, Number 3, 1999, pages 477-481].
For the radial grids, many approaches have been developed over the years.
The structure of this group is adapted for the [[https://github.com/dftlibs/numgrid][numgrid]] library.
Feel free to submit a PR if you find missing options/functionalities.
#+name: grid
| Variable | Type | Dimensions | Description |
|-----------------+---------+------------------+-------------------------------------------------------------------------|
| ~description~ | ~str~ | | Details about the used quadratures can go here |
| ~rad_precision~ | ~float~ | | Radial precision parameter (not used in some schemes like Krack-Köster) |
| ~num~ | ~dim~ | | Number of grid points |
| ~max_ang_num~ | ~int~ | | Maximum number of angular grid points (for pruning) |
| ~min_ang_num~ | ~int~ | | Minimum number of angular grid points (for pruning) |
| ~coord~ | ~float~ | ~(grid.num)~ | Discretized coordinate space |
| ~weight~ | ~float~ | ~(grid.num)~ | Grid weights according to a given partitioning (e.g. Becke) |
| ~ang_num~ | ~dim~ | | Number of angular integration points (if used) |
| ~ang_coord~ | ~float~ | ~(grid.ang_num)~ | Discretized angular space (if used) |
| ~ang_weight~ | ~float~ | ~(grid.ang_num)~ | Angular grid weights (if used) |
| ~rad_num~ | ~dim~ | | Number of radial integration points (if used) |
| ~rad_coord~ | ~float~ | ~(grid.rad_num)~ | Discretized radial space (if used) |
| ~rad_weight~ | ~float~ | ~(grid.rad_num)~ | Radial grid weights (if used) |
#+CALL: json(data=grid, title="grid")
#+RESULTS:
:results:
#+begin_src python :tangle trex.json
"grid": {
"description" : [ "str" , [] ]
, "rad_precision" : [ "float", [] ]
, "num" : [ "dim" , [] ]
, "max_ang_num" : [ "int" , [] ]
, "min_ang_num" : [ "int" , [] ]
, "coord" : [ "float", [ "grid.num" ] ]
, "weight" : [ "float", [ "grid.num" ] ]
, "ang_num" : [ "dim" , [] ]
, "ang_coord" : [ "float", [ "grid.ang_num" ] ]
, "ang_weight" : [ "float", [ "grid.ang_num" ] ]
, "rad_num" : [ "dim" , [] ]
, "rad_coord" : [ "float", [ "grid.rad_num" ] ]
, "rad_weight" : [ "float", [ "grid.rad_num" ] ]
} ,
#+end_src
:end:
* Quantum Monte Carlo data (qmc group) * Quantum Monte Carlo data (qmc group)