std::pair<Real, Real> CondensedEigenSystem::get_eigenpair(unsigned int i)
{
  START_LOG("get_eigenpair()", "CondensedEigenSystem");

  // If we haven't initialized any condensed dofs,
  // just use the default eigen_system
  if(!condensed_dofs_initialized)
    {
      STOP_LOG("get_eigenpair()", "CondensedEigenSystem");
      return Parent::get_eigenpair(i);
    }

  // If we reach here, then there should be some non-condensed dofs
  libmesh_assert(!local_non_condensed_dofs_vector.empty());

  // This function assumes that condensed_solve has just been called.
  // If this is not the case, then we will trip an asset in get_eigenpair
  UniquePtr< NumericVector<Number> > temp = NumericVector<Number>::build(this->comm());
  unsigned int n_local = local_non_condensed_dofs_vector.size();
  unsigned int n       = n_local;
  this->comm().sum(n);

  temp->init (n, n_local, false, PARALLEL);

  std::pair<Real, Real> eval = eigen_solver->get_eigenpair (i, *temp);

  // Now map temp to solution. Loop over local entries of local_non_condensed_dofs_vector
  this->solution->zero();
  for (unsigned int j=0; j<local_non_condensed_dofs_vector.size(); j++)
    {
      unsigned int index = local_non_condensed_dofs_vector[j];
      solution->set(index,(*temp)(temp->first_local_index()+j));
    }

  solution->close();
  this->update();

  STOP_LOG("get_eigenpair()", "CondensedEigenSystem");

  return eval;
}