#ifndef GRIDS_H #define GRIDS_H #include "nufi/cells.h" #include #include #include #include #include #include #include using namespace dealii; template class PoissonProblem; template struct GridStructure { //==//==// // Vars // //==//==// std::unique_ptr> triangulation; std::unique_ptr> dof_handler; std::unique_ptr> mapping; std::unique_ptr> fe; CellLocator locator; unsigned int grid_version; // === // === // // Evaluator // // === // === // std::vector eval_vector_grad(const Vector &solution, const std::vector> &points) const { std::vector values(points.size()); #pragma omp parallel { std::vector local_solution_buffer(fe->n_dofs_per_cell()); FEPointEvaluation evaluator(*mapping, *fe, update_gradients); #pragma omp for for (unsigned int p = 0; p < points.size(); ++p) { const auto cell_location = locator.locate(points[p]); cell_location.info->cell->get_dof_values(solution, local_solution_buffer.begin(), local_solution_buffer.end()); evaluator.reinit( cell_location.info->cell, ArrayView>(&cell_location.reference_point, 1)); evaluator.evaluate(local_solution_buffer, EvaluationFlags::gradients); values[p] = evaluator.get_gradient(0)[0]; } } return values; } }; template GridStructure make_grid_snapshot(const PoissonProblem &poisson) { GridStructure grid; grid.grid_version = 0; grid.triangulation = std::make_unique>(); grid.triangulation->copy_triangulation(poisson.get_triangulation()); grid.mapping = std::make_unique>(poisson.get_mapping()); grid.dof_handler = std::make_unique>(*grid.triangulation); grid.dof_handler->distribute_dofs(poisson.get_dof_handler().get_fe()); grid.locator.rebuild(*grid.dof_handler, *grid.triangulation); grid.fe = std::make_unique>(poisson.get_fe()); return grid; } template struct SolutionSnapshot { unsigned int grid_version; Vector solution; }; template inline void update_grid_versions(std::vector> &grid_versions, PoissonProblem &poisson) { auto grid = make_grid_snapshot(poisson); if (!grid_versions.empty()) grid.grid_version = grid_versions.back().grid_version + 1; grid_versions.push_back(std::move(grid)); } template inline void update_solution_history(std::vector> &solution_history, PoissonProblem &poisson, unsigned int current_grid_version) { SolutionSnapshot snapshot; snapshot.grid_version = current_grid_version; Vector solution = poisson.get_solution(); snapshot.solution = solution; solution_history.push_back(std::move(snapshot)); } #endif // !GRIDS_H