186 AssertThrow(initial_direction_.norm() != 0.,
187 ExcMessage(
"Initial direction is set to the zero vector."));
188 initial_direction_ /= initial_direction_.norm();
193 bool initialized =
false;
194 for (
auto &it : initial_state_list_)
195 if (it->name() == configuration_) {
196 initial_state_ = [
this, &it](
const dealii::Point<dim> &point,
198 const auto transformed_point =
199 affine_transform(initial_direction_, initial_position_, point);
200 auto state = it->compute(transformed_point, t);
201 const auto view = hyperbolic_system_->template view<dim, Number>();
203 view.apply_galilei_transform(state, [&](
const auto &momentum) {
204 return affine_transform_vector(initial_direction_, momentum);
209 initial_precomputed_ = [
this, &it](
const dealii::Point<dim> &point) {
210 const auto transformed_point =
211 affine_transform(initial_direction_, initial_position_, point);
212 return it->initial_precomputations(transformed_point);
222 "Could not find an initial state description with name \"" +
223 configuration_ +
"\""));
228 if (perturbation_ != 0.) {
229 initial_state_ = [old_state = this->initial_state_,
230 perturbation = this->perturbation_](
231 const dealii::Point<dim> &point, Number t) {
232 auto state = old_state(point, t);
237 static std::default_random_engine generator =
238 std::default_random_engine(std::random_device()());
239 static std::uniform_real_distribution<Number> distribution(-1., 1.);
240 static auto draw = std::bind(distribution, generator);
241 for (
unsigned int i = 0; i < problem_dimension; ++i)
242 state[i] *= (Number(1.) + perturbation * draw());
256 std::cout <<
"InitialValues<dim, Number>::"
257 <<
"interpolate_hyperbolic_vector(t = " << t <<
")" << std::endl;
260 const auto &scalar_partitioner = offline_data_->scalar_partitioner();
261 const auto &vector_partitioner =
262 offline_data_->hyperbolic_vector_partitioner();
268 temp.reinit(scalar_partitioner);
274 const auto U_view = U.template view<problem_dimension>();
275 const auto callable = [&](
const auto &p) {
return initial_state(p, t); };
276 for (
unsigned int d = 0; d < problem_dimension; ++d) {
277 VectorTools::interpolate(offline_data_->discretization().mapping(),
278 offline_data_->dof_handler(),
279 to_function<dim, Number>(callable, d),
281 U_view.insert_component(temp, d);
284 U_view.update_ghost_values();
296 std::cout <<
"InitialValues<dim, Number>::"
297 <<
"interpolate_initial_precomputed_vector()" << std::endl;
300 const auto &scalar_partitioner = offline_data_->scalar_partitioner();
304 n_initial_precomputed_values);
306 if constexpr (n_initial_precomputed_values == 0)
310 temp.reinit(scalar_partitioner);
316 const auto precomputed_view =
317 precomputed.template view<n_initial_precomputed_values>();
318 const auto callable = [&](
const auto &p) {
return initial_precomputed(p); };
319 for (
unsigned int d = 0; d < n_initial_precomputed_values; ++d) {
320 VectorTools::interpolate(offline_data_->dof_handler(),
321 to_function<dim, Number>(callable, d),
323 precomputed_view.insert_component(temp, d);
326 precomputed_view.update_ghost_values();