121 const std::string &norm) -> Number {
123 return vector.linfty_norm();
125 VectorTools::integrate_difference(discretization.mapping(),
128 Functions::ZeroFunction<dim, Number>(),
130 discretization.quadrature_high_order(),
131 norm ==
"L1" ? VectorTools::L1_norm
132 : VectorTools::L2_norm);
135 return Utilities::MPI::sum(difference_per_cell.l1_norm(),
136 mpi_ensemble_.ensemble_communicator());
138 return Number(std::sqrt(
139 Utilities::MPI::sum(std::pow(difference_per_cell.l2_norm(), 2),
140 mpi_ensemble_.ensemble_communicator())));
143 selected_components_extractor_.prepare_extraction(analytic);
144 auto analytic_components = selected_components_extractor_.view().extract();
146 selected_components_extractor_.prepare_extraction(state_vector);
147 auto error_components = selected_components_extractor_.view().extract();
149 std::vector<Number> norms(error_norms_.size(), Number(0.));
152 for (std::size_t k = 0; k < error_quantities_.size(); ++k) {
153 auto &analytic_component = analytic_components[k];
154 auto &error_component = error_components[k];
156 analytic_component.update_ghost_values();
159 offline_data_->affine_constraints().distribute(error_component);
160 error_component.update_ghost_values();
161 error_component -= analytic_component;
163 for (std::size_t n = 0; n < error_norms_.size(); ++n) {
164 const auto error = compute_norm(error_component, error_norms_[n]);
165 norms[n] += error_normalize_ ? error / compute_norm(analytic_component,
176 if (mpi_ensemble_.ensemble_rank() == 0 && mpi_ensemble_.n_ensembles() > 1)
177 for (
auto &norm : norms)
178 norm = Utilities::MPI::sum(
179 norm, mpi_ensemble_.ensemble_leader_communicator());
185 template <
typename HyperbolicDescription,
int dim,
typename Number>
189 const Number t)
const
192 std::cout <<
"ErrorEvaluation<dim, Number>::write_out()" << std::endl;
195 const auto norms = compute(state_vector, analytic);
197 if (mpi_ensemble_.world_rank() != 0)
200 std::ofstream output(base_name_ +
"-error.log",
201 std::ofstream::out | std::ofstream::app);
202 output << std::scientific << std::setprecision(14);
205 for (
const auto &norm : norms)
206 output <<
"\t" << norm;
207 output <<
"\n" << std::flush;
211 template <
typename HyperbolicDescription,
int dim,
typename Number>
213 std::ostream &stream,
215 const dealii::types::global_dof_index n_global_dofs,
216 const std::vector<Number> &norms)
const
218 if (mpi_ensemble_.world_rank() != 0)
221 stream << description() <<
" at final time \n";
222 stream << std::setprecision(16);
223 stream <<
"#dofs = " << n_global_dofs << std::endl;
224 stream <<
"t = " << t << std::endl;
226 for (std::size_t n = 0; n < error_norms_.size(); ++n) {
227 const auto &name = error_norms_[n];
228 stream << name << std::string(6 - name.size(),
' ') <<
"= " << norms[n]