This module generalizes the “supergroup” concept of PropVec to arbitrary property vectors. This allows more general constraints such as Löwdin’s perturbation theory via PQ space folding or constraints that use e.g. the spin projection.
A property vector is a vector of integers where each element encodes a property of a sub-space.
In traditional PropVec the property is just the particle number, while in general these can be e.g.
[N_1, Sz_1, N_2, Sz_2]
where N_i is the particle number in the i-th sub-space and Sz_i is the spin projection
in the i-th sub-space (encoded as integer).
The only assumed constraint of the property vectors is that the sum over them is preserved.
The algorithm follows the ideas of stochastic PropVec (https://pubs.acs.org/doi/full/10.1021/acs.jctc.1c00936), i.e. the property vectors are indexed by calculating the corresponding composition index.
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| class(PropertyIndexer_t), | public, | allocatable | :: | indexer | |||
| class(PropertyIndexer_t), | public, | allocatable | :: | lookup_property_indexer |
Check if a single excitation is allowed.
Is called once at initialization, so it does not have to be super fast.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(PropertyIndexer_t), | intent(in) | :: | this | |||
| type(Excite_1_t), | intent(in) | :: | exc | |||
| integer, | intent(in) | :: | prop_vec(:) |
Check if a double excitation is allowed.
Is called once at initialization, so it does not have to be super fast.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(PropertyIndexer_t), | intent(in) | :: | this | |||
| type(Excite_2_t), | intent(in) | :: | exc | |||
| integer, | intent(in) | :: | prop_vec(:) |
Check if a double excitation is allowed.
Is called once at initialization, so it does not have to be super fast.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(PropertyIndexer_t), | intent(in) | :: | this | |||
| type(Excite_3_t), | intent(in) | :: | exc | |||
| integer, | intent(in) | :: | prop_vec(:) |
Check if an excitation nI -> nJ is allowed.
Is called once at initialization, so it does not have to be super fast.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(PropertyIndexer_t), | intent(in) | :: | this | |||
| integer, | intent(in) | :: | nI(nEl) | |||
| integer, | intent(in) | :: | nJ(nEl) |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(AlsoGUGA_PropertyIndexer_t), | intent(in) | :: | this | |||
| type(DistinctDouble_t), | intent(in) | :: | exc | |||
| integer, | intent(in) | :: | prop_vec(:) |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(PropertyIndexer_t), | intent(in) | :: | this | |||
| integer, | intent(in) | :: | nI(:) |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(AlsoGUGA_PropertyIndexer_t), | intent(in) | :: | this | |||
| type(CSF_Info_t), | intent(in) | :: | csf_i |
Get all excitated determinants from det_I that are allowed under PropVec constraints.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(PropertyIndexer_t), | intent(in) | :: | this | |||
| integer, | intent(in) | :: | nI(:) |
Starting determinant |
||
| integer, | intent(out) | :: | n_excits |
Number of determinants |
||
| integer(kind=n_int), | intent(out), | allocatable | :: | det_list(:,:) |
Allocatable array of determinants in ilut format |
|
| integer, | intent(in), | optional | :: | ic |
Optional input for excitation level (ic=1 => singles, ic=2 => doubles) If ommited generate all. |
Write a string representation of this PropVec specification to iunit
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(PropertyIndexer_t), | intent(in) | :: | this | |||
| integer, | intent(in) | :: | iunit |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| integer(kind=int64), | public, | allocatable | :: | allowed_composition_indices(:) | |||
| integer, | public | :: | n_spin_orbs_ |
The number of spin orbitals of underlying determinants. |
|||
| integer, | public | :: | prop_vec_sum_ |
The sum of the property vectors. In the case of PropVec this is the particle number. |
|||
| integer, | public | :: | prop_vec_dim_ |
The dimension of the property vector (corresponds to number of PropVec spaces for pure PropVec) |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| integer(kind=int64), | public, | allocatable | :: | allowed_composition_indices(:) | |||
| integer, | public | :: | n_spin_orbs_ |
The number of spin orbitals of underlying determinants. |
|||
| integer, | public | :: | prop_vec_sum_ |
The sum of the property vectors. In the case of PropVec this is the particle number. |
|||
| integer, | public | :: | prop_vec_dim_ |
The dimension of the property vector (corresponds to number of PropVec spaces for pure PropVec) |
| procedure, public :: idx_prop_vec | |
| procedure, public :: idx_nI => get_idx_prop_vec_det | |
| procedure, public :: n_prop_vecs => get_n_prop_vecs | |
| procedure, public :: get_prop_vecs | |
| procedure, public :: dyn_is_allowed | |
| procedure(idxer_gen_all_excits_t), public, deferred :: gen_all_excits | |
| procedure, public :: prop_vec_dim | |
| procedure, public :: n_spin_orbs | |
| procedure, public :: prop_vec_sum | |
| procedure(write_to_t), public, deferred :: write_to | |
| procedure, public :: idx_csf => get_prop_vec_idx_csf | |
| generic, public :: lookup_prop_vec_idx => lookup_prop_vec_idx_nI, lookup_prop_vec_idx_CSF | |
| procedure, private :: lookup_prop_vec_idx_CSF | |
| procedure(is_allowed_distinct_double_t), private, deferred :: is_allowed_distinct_double | |
| generic, public :: is_allowed => is_allowed_single, is_allowed_double, is_allowed_triple, is_allowed_configurations, is_allowed_distinct_double | |
| procedure(to_prop_vec_csf_t), private, deferred :: to_prop_vec_csf | |
| generic, public :: to_prop_vec => to_prop_vec_ni, to_prop_vec_csf |
Use a precomputed prop_vec index from global_det_data.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(PropertyIndexer_t), | intent(in) | :: | this | |||
| integer, | intent(in) | :: | idet |
The index of nI in the FciMCData::CurrentDets array. |
||
| integer, | intent(in) | :: | nI(:) |
The determinant for which the prop_vec index should be calculated. |
Get the index of a property vector.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(PropertyIndexer_t), | intent(in) | :: | this | |||
| integer, | intent(in) | :: | prop_vec(:) |
Calculate the property vector index for a determinant nI
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(PropertyIndexer_t), | intent(in) | :: | this | |||
| integer, | intent(in) | :: | nI(:) |
The determinant for which the prop_vec index should be calculated. |
Get the number of possible prop_vecs.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(PropertyIndexer_t), | intent(in) | :: | this |
Get the ordered compositions of n into k summands constrained by cumulative minima and maxima.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(PropertyIndexer_t), | intent(in) | :: | this |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(PropertyIndexer_t), | intent(in) | :: | this |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(PropertyIndexer_t), | intent(in) | :: | this |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(PropertyIndexer_t), | intent(in) | :: | this |
Calculate the prop_vec index for a CSF csf_i
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(AlsoGUGA_PropertyIndexer_t), | intent(in) | :: | this | |||
| type(CSF_Info_t), | intent(in) | :: | csf_i |
The CSF for which the prop_vec index should be calculated. |
Use a precomputed prop_vec index from global_det_data.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(AlsoGUGA_PropertyIndexer_t), | intent(in) | :: | this | |||
| type(CSF_Info_t), | intent(in) | :: | csf_i |
The CSF |
Check if an excitation is allowed.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(PropertyIndexer_t), | intent(in) | :: | this | |||
| class(Excitation_t), | intent(in) | :: | exc | |||
| integer, | intent(in) | :: | prop_vec(:) |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | nI(nEl) | |||
| integer, | intent(in) | :: | nJ(nEl) |