Yes BlochState does support non-collinear spin. However the documentation is a bit confusing on this point: A BlochState is a kind of GridValues object, and GridValues was really mostly designed for representing spin-densities, which really is a combination of a scalar density n(r) and a vector magnetization m(r). A wave function can't be split into such two fields: it is a two component complex spinor field. You can directly access the complex spinor values by using the index operator:
bloch_state = BlochState(...)
spinor_value = bloch_state[i, j, k] # spinor_value will be PhysicalQuantity array of length 2: [up, down]
You can get the dimensions of the grid with:
dimensions = bloch_state.shape
.
Also if you are going to do a lot of bloch state analysis I suggest you to first do the DFT SCF ground state and save that to a file, then do the analysis in a separate script like so:
configuration = nlread('my_groundstate_calc.hdf5', BulkConfiguration)[-1]
bloch_state = BlochState(configuration, ...)
Then if there are errors or you need to do multiple bloch state calculations you don't need to redo the expensive SCF calculation.