Slater determinants¶
Let \(\Psi_{\mathrm{SD}}\) be an \(N_{\mathrm{e}}\)-electron Slater determinant constructed from \(N_{\mathrm{e}}\) occupied spin-orbitals \(\chi_i(\mathbfit{x})\) written in terms of the composite spin-spatial coordinates \(\mathbfit{x}\):
where \(\hat{\mathscr{A}}\) is the antisymmetriser in the symmetric group \(\operatorname{Sym}(N_{\mathrm{e}})\) acting on the electron labels.
The projected Slater determinant is
which is clearly no longer a Slater determinant but a linear combination of symmetry-equivalent ones that are in general non-orthogonal.
Requirements¶
Atomic-orbital basis angular order¶
As the molecular orbitals \(\chi_i(\mathbfit{x}_i)\) are expressed in terms of Gaussian atomic orbitals, QSym² requires information about their angular momenta and ordering conventions as described in Representation analysis/Basics/Requirements/#Atomic-orbital basis angular order in order to symmetry-transform \(\Psi_{\mathrm{SD}}\).
Basis overlap matrix¶
Since symmetry projection is a linear-space operation, inner products are not required to be defined on the space in which \(\Psi_{\mathrm{SD}}\) lives. However, if one seeks to normalise the projected multi-determinantal wavefunction \(\hat{\mathscr{P}^{(\Gamma)}} \Psi_{\mathrm{SD}}\), then one needs to define an appropriate inner product, which thus requires the specification of a basis overlap matrix as explained in Representation analysis/Basics/Requirements/#Basis overlap matrix. This is also needed if one seeks to construct the density matrices of the resulting multi-determinantal wavefunctions.
Parameters¶
Feature requirements
- Using the Python API requires the
pythonfeature.
At the moment, QSym² offers one way to perform symmetry projection for Slater determinants, which is:
- via the Python library API reading in data from Python data structures.
More methods might become possible in the future. The parameter specifications for the one existing method are shown below.
from qsym2 import (
project_slater_determinant,
SymmetryTransformationKind, #(1)!
MagneticSymmetryAnalysisKind, #(2)!
PySpinConstraint, #(3)!
PySpinOrbitCoupled, #(4)!
PySlaterDeterminantReal,
PySlaterDeterminantComplex,
)
ca = np.array([ #(5)!
[+1.000, +0.000],
[+0.000, +0.707],
[+0.000, +0.707],
...
])
cb = np.array([
[+0.000, +0.707],
[+1.000, +0.000],
[+0.000, -0.707],
...
])
occa = np.array([1.0, 1.0]) #(6)!
occb = np.array([1.0, 0.0])
ea = np.array([-0.51, -0.38]) #(7)!
eb = np.array([-0.50, +0.02])
pydet = PySlaterDeterminantReal( #(8)!
structure_constraint=PySpinConstraint.Unrestricted,
complex_symmetric=False,
coefficients=[ca, cb],
occupations=[occa, occb],
threshold=1e-7,
mo_energies=[ea, eb],
energy=-1.30,
)
irreps, multidets = project_slater_determinant( #(9)!
# Data
inp_sym="mol", #(10)!
pydet=pydet, #(11)!
projection_targets=[0, "||A|_(2g)|"], #(12)!
pybaos=[pybao], #(13)!
sao=sao_spatial, #(14)!
sao_h=None, #(15)!
# Thresholds
density_matrix_calculation_thresholds=(1e-7, 1e-7), #(16)!
# Projection options
use_magnetic_group=None, #(17)!
use_double_group=False, #(18)!
symmetry_transformation_kind=SymmetryTransformationKind.Spatial, #(19)!
infinite_order_to_finite=None, #(20)!
# Other options
write_character_table=True, #(21)!
) #(22)!
- This is a Python-exposed Rust enum,
SymmetryTransformationKind, for indicating the kind of symmetry transformation to be applied on the target. See Representation analysis/Basics/Analysis options/#Transformation kinds for further information. - This is a Python-exposed Rust enum,
MagneticSymmetryAnalysisKind, for indicating the type of magnetic symmetry to be used for symmetry projection. Note that projections using corepresentations of magnetic-represented groups are not yet supported. See Representation analysis/Basics/Analysis options/#Magnetic groups for further information. - This is a Python-exposed Rust enum,
PySpinConstraint, for indicating the spin constraint applicable to the Slater determinant. In the Python API, only two spin spaces arranged in decreasing-\(m_s\) order are permitted because Python enums do not support associated values. - This is a Python-exposed Rust enum,
PySpinOrbitCoupled, for indicating the spin--orbit-coupled structure applicable to the Slater determinant. In the Python API, only two-component j-adapted basis structures are permitted. - This specifies a coefficient matrix for one spin space, which is a \(N_{\mathrm{bas}} \times N_{\mathrm{MO}}\)
numpyarray. The number of basis functions, \(N_{\mathrm{bas}}\), depends on the underlying spin constraint: for generalised spin constraint, this is twice the number of spatial basis functions, whereas for restricted and unrestricted spin constraints, this is the same as the number of spatial basis functions. Each column in the array specifies a molecular orbital which can be occupied or virtual as specified by the occupation numbers. - This specifies an occupation number vector for one spin space, which is a one-dimensional
numpyarray of size \(N_{\mathrm{MO}}\). Each value in this array gives the occupation number for the corresponding molecular orbital. Fractional values are allowed, but only when occupation numbers are either \(0\) or \(1\) can the Slater determinant symmetry be well-defined (otherwise the collection of fractionally occupied molecular orbitals does not actually form a single-determinantal wavefunction). - This specifies an optional orbital energy vector for one spin space, which is a one-dimensional
numpyarray of size \(N_{\mathrm{MO}}\). Each value in this array gives the orbital energy for the corresponding molecular orbital. -
PySlaterDeterminantRealconstructs a real-valued Slater determinant object. If a complex-valued Slater determinant is required instead, usePySlaterDeterminantComplex. - This is the Python driver function for symmetry projection of Slater determinants.
This is a Python-exposed Rust function,
project_slater_determinant. See the API documentation of this function for more details. - This specifies the path to the
.qsym2.symfile that contains the serialised results of the symmetry-group detection (see the documentation for theout_symparameter of the Pythondetect_symmetry_groupfunction in Symmetry-group detection/#Parameters). This file should have been generated by thedetect_symmetry_groupfunction on the underlying molecular system prior to symmetry projection. This name does not need to contain the.qsym2.symextension. The symmetry results in this file will be used to construct the symmetry group \(\mathcal{G}\) to be used in the subsequent symmetry projection. - This specifies the Slater determinant to be symmetry-projected.
- This specifies the irreducible representations of the group onto which the provided densities are projected. Each element in this list is either an integer indicating the index of an irreducible representation in the group, or a string of the format
|^(presup)_(presub)|main|^(postsup)_(postsub)|(note that four|characters are required), such as||A|_(2g)|or||E|^(')_(1)|, specifying the label of the irreducible representation. - This specifies the basis angular order information for the underlying basis. Each item in the list is for one explicit component in the coefficient matrices. See Representation analysis/Basics/Requirements/#Atomic-orbital basis angular order for details of how to specify this.
- This specifies the optional two-centre atomic-orbital overlap matrix as a two-dimensional
numpyarray. The dimensions of this matrix must be \(n_{\mathrm{comps}}N_{\mathrm{bas}} \times n_{\mathrm{comps}}N_{\mathrm{bas}}\), where \(N_{\mathrm{bas}}\) is the number of basis functions specified in the basis angular order information, and \(n_{\mathrm{comps}}\) is either \(1\) or the total number of explicit components per coefficient matrix. This is only required for norm and density matrix calculations. - This specifies the optional complex-symmetric two-centre atomic-orbital spatial matrix as a two-dimensional
numpyarray. The dimensions of this matrix must be \(n_{\mathrm{comps}}N_{\mathrm{bas}} \times n_{\mathrm{comps}}N_{\mathrm{bas}}\), where \(N_{\mathrm{bas}}\) is the number of basis functions specified in the basis angular order information, and \(n_{\mathrm{comps}}\) is either \(1\) or the total number of explicit components per coefficient matrix. This is only required if antiunitary operations are ppresent. Default:None. - This specifies an optional pair of thresholds for Löwdin pairing, one for checking zero off-diagonal values and one for checking zero overlaps, when computing multi-determinantal density matrices.
IfNone, no density matrices will be computed. - This specifies whether magnetic groups, if present, shall be used for symmetry projection. The possible options are:
None: this specifies choice 1 of Representation analysis/Basics/Analysis options/#Magnetic groups — use the irreducible representations of the unitary group \(\mathcal{G}\),MagneticSymmetryAnalysisKind.Representation: this specifies choice 2 of Representation analysis/Basics/Analysis options/#Magnetic groups — use the irreducible representations of the magnetic group \(\mathcal{M}\), if \(\mathcal{M}\) is available,MagneticSymmetryAnalysisKind.Corepresentation: this specifies choice 3 of Representation analysis/Basics/Analysis options/#Magnetic groups — use the irreducible corepresentations of the magnetic group \(\mathcal{M}\), if \(\mathcal{M}\) is available. However, this is not yet supported for symmetry projection. For more information, see Representation analysis/Basics/Analysis options/#Magnetic groups.
- This is a boolean specifying if double groups shall be used for symmetry projection. The possible options are:
False: use only conventional irreducible representations or corepresentations of \(\mathcal{G}\),True: use projective irreducible representations or corepresentations of \(\mathcal{G}\) obtainable via its double cover \(\mathcal{G}^*\). For more information, see Representation analysis/Basics/Analysis options/#Double groups.
- This specifies the kind of symmetry transformations to be applied to generate the orbit for symmetry projection.
The possible options are:
SymmetryTransformationKind.Spatial: spatial transformation only,SymmetryTransformationKind.SpatialWithSpinTimeReversal: spatial transformation with spin-including time reversal,SymmetryTransformationKind.Spin: spin transformation only,SymmetryTransformationKind.SpinSpatial: coupled spin and spatial transformations. For more information, see Representation analysis/Basics/Analysis options/#Transformation kinds.
- This specifies the finite order \(n\) to which all infinite-order symmetry elements, if any, are restricted. The possible options are:
None: do not restrict infinite-order symmetry elements to finite order,- a positive integer value: restrict all infinite-order symmetry elements to this finite order (this will be ignored if the system has no infinite-order symmetry elements). For more information, see Representation analysis/Basics/Analysis options/#Infinite-order symmetry elements. Default:
None. - This boolean indicates if the symbolic character table of the prevailing symmetry group is to be printed in the output.
Default:
True. - The
project_slater_determinantfunction returns a tuple: where the first item is a list of the labels of the subspaces used for projection, and the second item is either aPyMultiDeterminantsRealobject or aPyMultiDeterminantsComplexcontaining the Slater determinant basis and the linear combination coefficients as a two-dimensional array with each column corresponding to one projected state.