void
fgRealSymmEigs(
    const FgMatrixV<T>    &rsm,
    FgMatrixV<T>          &val, // RETURNED: Col vector of eigenvalues, smallest to largest
    FgMatrixV<T>          &vec) // RETURNED: Col vectors are respective eigenvectors
{
    // JAMA enters an infinite loop with NaNs:
    for (size_t ii=0; ii<rsm.m_data.size(); ++ii)
        FGASSERT(boost::math::isfinite(rsm.m_data[ii]));
    uint                    dim = rsm.numRows();
    FGASSERT(rsm.numCols() == dim);
        // We use a const cast since we know 'solver' will not modify the elements, even though
        // the Array2D object holds a non-const pointer to our data.
    JAMA::Eigenvalue<T>
        solver(TNT::Array2D<T>(rsm.numRows(),rsm.numCols(),const_cast<T*>(rsm.dataPtr())));
    TNT::Array2D<T>         vecs;
    TNT::Array1D<T>         vals;
    solver.getV(vecs);
    solver.getRealEigenvalues(vals);
    val.resize(dim,1);
    vec.resize(dim,dim);
    int                     idim = static_cast<int>(dim);
    for (int row=0; row<idim; row++) {
        val[row] = vals[row];
        for (uint col=0; col<dim; col++)
            vec.elem(row,col) = vecs[row][col];
    }
}