38 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
40 typedef dealii::LinearAlgebra::distributed::Vector<typename Preconditioner::MultigridNumber>
43 CheckMultigrid(Operator
const & underlying_operator_in,
44 std::shared_ptr<Preconditioner> preconditioner_in,
45 MPI_Comm
const & mpi_comm_in)
46 : underlying_operator(underlying_operator_in),
47 preconditioner(preconditioner_in),
75 VectorType initial_solution;
76 underlying_operator.initialize_dof_vector(initial_solution);
77 VectorType solution_after_mg_cylce(initial_solution), tmp(initial_solution);
79 for(
unsigned int i = 0; i < initial_solution.locally_owned_size(); ++i)
80 initial_solution.local_element(i) = (double)rand() / RAND_MAX;
82 underlying_operator.vmult(tmp, initial_solution);
84 preconditioner->vmult(solution_after_mg_cylce, tmp);
85 solution_after_mg_cylce += initial_solution;
91 VectorTypeMG initial_solution_float;
92 initial_solution_float = initial_solution;
93 VectorTypeMG solution_after_smoothing, tmp_float;
94 solution_after_smoothing = initial_solution;
97 preconditioner->apply_smoother_on_fine_level(solution_after_smoothing, tmp_float);
98 solution_after_smoothing += initial_solution_float;
103 write_output(initial_solution, solution_after_mg_cylce, solution_after_smoothing);
112 write_output(VectorType
const & initial_solution,
113 VectorType
const & solution_after_mg_cylce,
114 VectorTypeMG
const & solution_after_smoothing)
const
116 dealii::DataOut<dim> data_out;
117 dealii::DataOutBase::VtkFlags flags;
118 flags.write_higher_order_cells =
true;
119 data_out.set_flags(flags);
121 unsigned int dof_index = underlying_operator.get_dof_index();
129 data_out.add_data_vector(underlying_operator.get_matrix_free().get_dof_handler(dof_index),
132 data_out.add_data_vector(underlying_operator.get_matrix_free().get_dof_handler(dof_index),
133 solution_after_mg_cylce,
135 data_out.add_data_vector(underlying_operator.get_matrix_free().get_dof_handler(dof_index),
136 solution_after_smoothing,
142 std::vector<std::string> initial(dim,
"initial");
143 std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation>
144 initial_component_interpretation(
145 dim, dealii::DataComponentInterpretation::component_is_part_of_vector);
147 data_out.add_data_vector(underlying_operator.get_matrix_free().get_dof_handler(dof_index),
150 initial_component_interpretation);
152 std::vector<std::string> mg_cycle(dim,
"mg_cycle");
153 std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation>
154 mg_cylce_component_interpretation(
155 dim, dealii::DataComponentInterpretation::component_is_part_of_vector);
157 data_out.add_data_vector(underlying_operator.get_matrix_free().get_dof_handler(dof_index),
158 solution_after_mg_cylce,
160 mg_cylce_component_interpretation);
162 std::vector<std::string> smoother(dim,
"smoother");
163 std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation>
164 smoother_component_interpretation(
165 dim, dealii::DataComponentInterpretation::component_is_part_of_vector);
167 data_out.add_data_vector(underlying_operator.get_matrix_free().get_dof_handler(dof_index),
168 solution_after_smoothing,
170 smoother_component_interpretation);
173 data_out.build_patches(
174 underlying_operator.get_matrix_free().get_dof_handler(dof_index).get_fe().degree);
176 std::ostringstream filename;
177 std::string name =
"smoothing";
178 filename << name <<
"_Proc" << dealii::Utilities::MPI::this_mpi_process(mpi_comm) <<
".vtu";
180 std::ofstream output(filename.str().c_str());
181 data_out.write_vtu(output);
183 if(dealii::Utilities::MPI::this_mpi_process(mpi_comm) == 0)
185 std::vector<std::string> filenames;
186 for(
unsigned int i = 0; i < dealii::Utilities::MPI::n_mpi_processes(mpi_comm); ++i)
188 std::ostringstream filename;
189 filename << name <<
"_Proc" << i <<
".vtu";
191 filenames.push_back(filename.str().c_str());
193 std::string master_name = name +
".pvtu";
194 std::ofstream master_output(master_name.c_str());
195 data_out.write_pvtu_record(master_output, filenames);
200 Operator
const & underlying_operator;
202 std::shared_ptr<Preconditioner> preconditioner;