#ifndef NUFI_FIELDS_H_ #define NUFI_FIELDS_H_ #include "nufi/grids.h" #include "nufi/parameters.h" #include #include #include #include #include using namespace dealii; inline std::vector make_x_eval(size_t Nx) { std::vector x_eval_E; double dx = (Parameters::X_DOMAIN_RIGHT - Parameters::X_DOMAIN_LEFT) / Nx; for (unsigned int i = 0; i < Nx; ++i) x_eval_E.push_back(Parameters::X_DOMAIN_LEFT + (i + 0.5) * dx); return x_eval_E; } inline void reset_x_eval(std::vector &x_vals) { const size_t Nx = x_vals.size(); const double dx = Parameters::LX / Nx; for (size_t i = 0; i < Nx; ++i) x_vals[i] = Parameters::X_DOMAIN_LEFT + i * dx; }; inline double f0(const double x, const double v, const size_t f0_type = Parameters::f0_TYPE) { const double eps = Parameters::EPS; const double k = Parameters::WAVE_NR; double result; double prefactor; double gaussian; switch (f0_type) { case 0: prefactor = Parameters::F0_FACTOR * (1.0 + eps * std::cos(k * x)); gaussian = v * v * std::exp(-0.5 * v * v); result = prefactor * gaussian; case 1: // test prefactor = Parameters::F0_FACTOR * (1.0 + eps * std::cos(k * x)); gaussian = v * v * std::exp(-0.5 * v * v); result = prefactor * gaussian; } return result; } // wrapper for eval_point() { VectorTools::point_values() } inline std::vector eval(std::vector &X, const GridStructure<1> &grid, const Vector &solution) noexcept { AssertThrow(grid.dof_handler->n_dofs() == solution.size(), ExcMessage("@ eval(...) grid's number of DoFs doesn't correspond " "to solution's size")); size_t x_size = X.size(); std::vector> Points(x_size); for (size_t i = 0; i < x_size; ++i) { X[i] = X[i] - Parameters::X_DOMAIN_LEFT; X[i] = X[i] - Parameters::LX * std::floor(X[i] * Parameters::LX_INV); Points[i][0] = X[i]; } return grid.eval_vector_grad(solution, Points); } inline double integral_space_vector(const GridStructure<1> &grid, const Vector &solution, size_t Nx = Parameters::PLOT_NX) { double integral = 0.0; std::vector x_eval = make_x_eval(Nx); const double dx = Parameters::LX / Nx; std::vector tmp = eval(x_eval, grid, solution); for (size_t i = 0; i < Nx; ++i) integral += tmp[i]; return integral * dx; } inline double integral_space_vector_squared(const GridStructure<1> &grid, const Vector &solution, size_t Nx = Parameters::PLOT_NX) { double integral = 0.0; std::vector x_eval = make_x_eval(Nx); const double dx = Parameters::LX / Nx; std::vector tmp = eval(x_eval, grid, solution); for (size_t i = 0; i < Nx; ++i) integral += tmp[i] * tmp[i]; return integral * dx; } inline std::vector Point_vector_to_double_vector(const std::vector> &Points) { const size_t n_points = Points.size(); std::vector vector(n_points); for (size_t i = 0; i < n_points; ++i) vector[i] = Points[i][0]; return vector; } #endif // NUFI_FIELDS_H_