123 const auto &discretization = offline_data_->discretization();
124 const auto &dof_handler = offline_data_->dof_handler();
126 Vector<Number> difference_per_cell(
127 discretization.triangulation().n_active_cells());
131 const std::string &norm) -> Number {
133 return vector.linfty_norm();
135 VectorTools::integrate_difference(discretization.mapping(),
138 Functions::ZeroFunction<dim, Number>(),
140 discretization.quadrature_high_order(),
141 norm ==
"L1" ? VectorTools::L1_norm
142 : VectorTools::L2_norm);
145 return Utilities::MPI::sum(difference_per_cell.l1_norm(),
146 mpi_ensemble_.ensemble_communicator());
148 return Number(std::sqrt(
149 Utilities::MPI::sum(std::pow(difference_per_cell.l2_norm(), 2),
150 mpi_ensemble_.ensemble_communicator())));
153 selected_components_extractor_.prepare_extraction(analytic);
154 auto analytic_components = selected_components_extractor_.view().extract();
156 selected_components_extractor_.prepare_extraction(state_vector);
157 auto error_components = selected_components_extractor_.view().extract();
159 std::vector<Number> norms(error_norms_.size(), Number(0.));
162 for (std::size_t k = 0; k < error_quantities_.size(); ++k) {
163 auto &analytic_component = analytic_components[k];
164 auto &error_component = error_components[k];
166 analytic_component.update_ghost_values();
169 offline_data_->affine_constraints().distribute(error_component);
170 error_component.update_ghost_values();
171 error_component -= analytic_component;
173 for (std::size_t n = 0; n < error_norms_.size(); ++n) {
174 const auto error = compute_norm(error_component, error_norms_[n]);
175 norms[n] += error_normalize_ ? error / compute_norm(analytic_component,
186 if (mpi_ensemble_.ensemble_rank() == 0 && mpi_ensemble_.n_ensembles() > 1)
187 for (
auto &norm : norms)
188 norm = Utilities::MPI::sum(
189 norm, mpi_ensemble_.ensemble_leader_communicator());
195 template <
typename Description,
int dim,
typename Number>
199 const Number t)
const
202 std::cout <<
"ErrorEvaluation<dim, Number>::write_out()" << std::endl;
205 const auto norms = compute(state_vector, analytic);
207 if (mpi_ensemble_.world_rank() != 0)
210 std::ofstream output(base_name_ +
"-error.log",
211 std::ofstream::out | std::ofstream::app);
212 output << std::scientific << std::setprecision(14);
215 for (
const auto &norm : norms)
216 output <<
"\t" << norm;
217 output <<
"\n" << std::flush;
221 template <
typename Description,
int dim,
typename Number>
223 std::ostream &stream,
225 const dealii::types::global_dof_index n_global_dofs,
226 const std::vector<Number> &norms)
const
228 if (mpi_ensemble_.world_rank() != 0)
231 stream << description() <<
" at final time \n";
232 stream << std::setprecision(16);
233 stream <<
"#dofs = " << n_global_dofs << std::endl;
234 stream <<
"t = " << t << std::endl;
236 for (std::size_t n = 0; n < error_norms_.size(); ++n) {
237 const auto &name = error_norms_[n];
238 stream << name << std::string(6 - name.size(),
' ') <<
"= " << norms[n]