template <int dim>
void EigenvalueProblem<dim>::output_results () const
{
std::vector<DataComponentInterpretation::DataComponentInterpretation>
data_component_interpretation
(dim, DataComponentInterpretation::component_is_part_of_vector);
DataOut<dim> data_out;
data_out.attach_dof_handler (dof_handler);
for (unsigned int i=0; i<eigenvectors.size(); ++i)
{
data_out.add_data_vector (eigenvectors[i],
std::string("Mode_") +
Utilities::int_to_string(i+1),
DataOut<dim>::type_dof_data,
data_component_interpretation);
}
std::vector<types::subdomain_id> partition_int (triangulation.n_active_cells());
GridTools::get_subdomain_association (triangulation, partition_int);
const Vector<double> partitioning(partition_int.begin(),
partition_int.end());
data_out.add_data_vector (partitioning, "partitioning");
data_out.build_patches ();
const std::string filename = ("eigenvectors-" +
Utilities::int_to_string (this_mpi_process, 1) +
".vtu");
std::ofstream output (filename.c_str());
data_out.write_vtu (output);
if (this_mpi_process == 0)
{
std::vector<std::string> filenames;
for (unsigned int i=0; i<n_mpi_processes; ++i)
filenames.push_back ("eigenvectors-" +
Utilities::int_to_string (i, 1) +
".vtu");
std::ofstream master_output ("eigenvectors.pvtu");
data_out.write_pvtu_record (master_output, filenames);
}
}
unsigned int EigenvalueProblem<dim>::solve ()
{
TimerOutput::Scope t(computing_timer, "solve");
pcout << " Number of eigenvectors requested: "
<< eigenvectors.size() << std::endl;
PETScWrappers::PreconditionBoomerAMG::AdditionalData data;
data.symmetric_operator = true;
PETScWrappers::PreconditionBoomerAMG preconditioner(mpi_communicator, data);
SolverControl linear_solver_control(dof_handler.n_dofs(),1.0e-16,false,false);
PETScWrappers::SolverCG linear_solver(linear_solver_control,mpi_communicator);
linear_solver.initialize(preconditioner);
SolverControl solver_control (2000, 1e-14, false, false);
SLEPcWrappers::SolverKrylovSchur eigensolver(solver_control, mpi_communicator);
double shift_freq = parameters.get_double ("Shift frequency");
double eigen_shift = std::pow( 2.0 * PI * shift_freq, 2.0);
SLEPcWrappers::TransformationShiftInvert::AdditionalData additional_data(eigen_shift);
SLEPcWrappers::TransformationShiftInvert shift (mpi_communicator, additional_data);
shift.set_solver(linear_solver);
eigensolver.set_transformation (shift);
eigensolver.set_which_eigenpairs (EPS_SMALLEST_REAL);
eigensolver.set_problem_type (EPS_GHEP);
eigensolver.solve (stiffness_matrix,mass_matrix,eigenvalues,eigenvectors,
eigenvectors.size());
// Normalize the vectors
for (unsigned int i=0; i<eigenvectors.size(); ++i)
eigenvectors[i] /= eigenvectors[i].linfty_norm ();
// Finally return the number of iterations it took to converge:
return solver_control.last_step ();
}