For each pair (shape function,component within vector), store whether the selected vector component may be nonzero. For primitive shape functions we know for sure whether a certain scalar component of a given shape function is nonzero, whereas for non-primitive shape functions this may not be entirely clear (e.g. for RT elements it depends on the shape of a cell).

For each pair (shape function, component within vector), store the row index within the shape_values, shape_gradients, and shape_hessians tables (the column index is the quadrature point index). If the shape function is primitive, then we can get this information from the shape_function_to_row_table of the FEValues object; otherwise, we have to work a bit harder to compute this information.

For each shape function say the following: if only a single entry in is_nonzero_shape_function_component for this shape function is nonzero, then store the corresponding value of row_index and single_nonzero_component_index represents the index between 0 and (dim^2) for which it is attained. If multiple components are nonzero, then store -1. If no components are nonzero then store -2.