Spin Dynamics Forum
Spinach support => Simulations => Topic started by: faq_user on May 16, 2012, 01:59:12 PM
I was hoping that you could help me with this. I played with your nmr_solids_1.m example, and tried to make a 'manual' pulse via the operators and evolution (see attached). The results are not the same. The 'manual' approach produces only one line, which the 'pulse_acquire' function produces a doublet, as it should. I am assuming I am doing something wrong here, but can't figure out what it is. Can you help me with this?
only returns the isotropic Liouvillian. Use
To get the isotropic part and the irreducible components (25 of them in a cell array) of the anisotropic part. Then use the orientation() function to pick the orientation and feed the result to the evolution function. See the headers of h_superop() and orientation() for specifics.
Thank you, that solves it. I was pretty sure that I missed something.
One other thing I wanted to ask you - I hope you don't mind that I bug you about these things:
What's the best way to think about the state-space restriction in terms of coupled clusters?
My understanding is that first you do graph analysis which separates subspaces that don't couple to each other. However, your initial paper seems to suggest that if you have subspaces that have only 1 or 2 spins overlap there are still opportunities for cutting down state spaces. Is that true in general? For example, say you have two subspaces, with one spin in common. Then you can't 'uncouple' the two spaces, and it is not immediately clear where the savings would come from (e.g. if you required diagonalization, you would have to use the whole space). The same is true, if there isn't even a spin in common in the clusters, but if one spin from one cluster couples to one spin of the other cluster.
So just to summarize to make sure I understand this correctly:
1) first you do graph analysis to see whether you have completely uncoupled subspaces
2) then you do Krylov to reduce state spaces within each subspace
3) symmetry and ZTE can provide additional reductions
Is this correct?
Strictly speaking, the basis set is arbitrary -- the local clusterization is just one of the reasonable methods that seem to work for NMR. It looks at what is connected to what and includes those product states that are judged to be important.
Indeed clusters can overlap by one or more spins, in which case the corresponding state spaces cannot be disentangled. But the direct sum of two subspaces (with intersection carefully removed to avoid duplication) is still a lot smaller than the direct product -- this is where the savings are coming from.
After the state list is compiled (using whatever method, you can simply tell Spinach to keep the states you want to keep), the rest is rigorous Lie algebra representation theory: operators are built in that basis and returned to the user. So the basis is up to the user ultimately, clusterization just happens to work rather well for NMR.
In general, the stages are:
1. Heuristic reduction based on our knowledge of the system. Could be clusterization, could be coherence order filter, could be blanket restriction to correlations lower than a certain level.
2. Construction of the Liouvillian matrix and state vectors in the resulting basis.
3. Analysis of Liouvillian to determine if it has any dynamically disconnected subspaces (symmetries, conservation laws, etc.). Those are simulated separately.
4. At run time, ZTE cuts the dimension to the absolute minimum required.
But you can only do the direct sum if you assume that the inter-cluster coupling will not entangle all the spins in both clusters. There is an overall rank limit, but within that rank you could have all combinations, correct?
Precisely – that is the core assumption. And the maximum rank can be different in different parts of the system – hence the “connectivity-adaptive” term.
So then I don't understand what the criterion for the clusterization is: is it based on an automated search considering relative coupling strengths?
On the number of couplings above a user-specified threshold. If a spin has k direct couplings to something else, IK-2 would include all product states up to k-spin orders involving that particular spin and its coupling partners into the basis.
I see, but does that mean you are throwing out all next-neares neighbor couplings?
Not necessarily – the basis includes all connected subgraphs up to a given size – so correlations between a pair of spins would be included if they occur together in at least one such subgraph. That is to say, if the max cluster size is set to 5, spins up to five couplings away from each other can be correlated in the resulting basis. But if two spins are further away than that, the correlation would not be included.
Just noticed one thing with the sample program that I am running (the same as before, just with the Haniso modification).
While secularity is set to 'nmr' in the script, the logfile says secularity is set to 'keep all'.
Also, I don't really understand why it takes a long time to set up the Zeeman hamiltonian (not a problem for two spins, but as soon as I try more spins, it rapidly becomes very slow to build each individual Zeeman term). Is this related to the secularity issue somehow?
The Hamiltonian is built twice in each run -- the Hamiltonian you use is built with secularity assumptions set to NMR, but the thermal equilibrium state is the exponential of the full Hamiltonian, hence another call with 'keep_all'. If you look carefully through the log, you will see both instances.
Spinach is not really intended for two-spin systems -- as you noticed, the Lie algebra housekeeping overhead is significant. For larger systems, however, it rapidly gets faster than any other Liouville space implementation.
Note that you cannot use kronecker products in reduced basis set -- the only way to build operators in an arbitrary basis is through structure relations of su(2), which is how Spinach does it.