Spin-dependent cluster solver

Introduction

The solver can either be specified as "spin_dependent_cluster_nmr_solver" or "spin_dependent_cluster_nmr_solver (symmetry)". If the symmetry version is used, the solver is allowed to exploit local SU(2) symmetry. We will refer to the cluster_nmr_solver for details, as the basic solver setup is very similar. The main difference is that the solver does not just split the molecule into independent parts, but identifies for each spin the spins that are most strongly coupling to it and groups them in one cluster, which is solved to find the individual spin contributions.

Although this is the most accurate approximate solver for large molecules, it has a slightly larger runtime as the cluster_nmr_solver. The gain in accuracy though typically justifies the small computational overhead, especially since often cluster sizes can be chosen smaller.

The setup is the same as for the direct solver. That means that based on a struqture Hamiltonian input, the spectral function is computed from the correlation function , where corresponds to the spin operator including the gyromagnetic factors gamma, , .

Math

As for the direct and cluster solver the resolvent representation (see chapter math) is used. The correlation function is given as

However, for each spin the evaluation is restricted to a spin-dependent cluster, which is identified in multiple steps:

Partitioning

First, a partitioning of the system into strictly independent parts (from now on called partitions) is performed. For details you may check here.

Symmetry Considerations

As a next stage, if the symmetry option was specified, symmetric groups are identified in each partition. Again details can be found here.

Clustering

To perform the clustering, we define as in the cluster solver lower triangular matrices for each partition representing a weighted graph with the spins being the nodes and the edge weights based on assumptions from perturbation theory:

Here, are the entries in the J-coupling matrix connecting sites x and y, the gyromagnetic ratio, the chemical shift and the magnetic field strength. We now use this graph to identify for each spin a cluster of the most strongly coupled spins. After having identified them for each spin we additionally check, whether multiple spins are associated with the same cluster and if so only evaluate such a cluster once.

Extra Arguments

eta: float Artificial broadening.

The broadening is formally necessary to ensure the convergence of the Fourier integral. In practice it corresponds to the unknown or neglected noise, being intrinsic for the resolution limitation of the spectrometer. Note that the complete spectral function is positive, . However, the spin resolved spectral functions can be negative.

beta: float Inverse temperature.

.

Due to the low energy of nuclear spin excitations the temperature in real measurements is practically infinite, i.e. . For theoretical studies or comparison to very low temperature NMR measurements one can apply finite temperatures.

Note: Currently only the case is implemented.

max_cluster_size: int Maximum cluster size.

This has to be set according to restraints imposed by the computational resources available. Note that symmetric groups are viewed as one site, with an effective number of sites corresponding to the spin representation of the group.

tolerance_couplings: float Tolerance for the J-coupling when identifying symmetry groups.

When the symmetry groups are identified, the coupling to the outside does not have to be perfectly symmetric, as there might be small deviations in the input parameters. Hence this parameter allows to define a tolerance for the J-coupling until which spins are assumed to couple symmetric.

tolerance_shifts: float Tolerance for the chemical shifts when identifying symmetry groups.

Similarly to the tolerance for the J-couplings the chemical shifts don't have to be perfectly identical. This parameter allows in the same way to define a tolerance until which they are assumed to be the same.

delta: float

Small parameter to avoid division by zero, when creating the weight matrix for the clustering.

threshold_matrix_elements: float

In the final evaluation a lot of matrix elements evaluate to zero and hence do not need to be included, when performing the summation for each frequency. We therefore remove all matrix elements below this threshold beforehand.

verbose: int Verbosity of output

Specifically when set to one, the partitioning, as well as the identified groups and the clustering is printed. For further debug information it may be set higher.