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; }