#ifndef GRIDS_H #define GRIDS_H #include "nufi/cells.h" #include #include #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 = 0; // === // === // // Evaluator // // === // === // std::vector eval_vector_grad(const Vector &solution, const std::vector> &points) const { std::vector values(points.size()); #pragma omp parallel for for (unsigned int p = 0; p < points.size(); ++p) { const Tensor<1, dim> grad_phi = VectorTools::point_gradient( *mapping, *dof_handler, solution, points[p]); values[p] = grad_phi[0]; } return values; } // #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]; // } // } // AssertThrow(dof_handler->n_dofs() == solution.size(), // ExcMessage("Solution vector size does not match // DoFHandler.")); // return values; // } }; template GridStructure make_grid_snapshot(const PoissonProblem &poisson) { GridStructure grid; grid.triangulation = std::make_unique>(); grid.triangulation->copy_triangulation(poisson.get_triangulation()); grid.fe = std::make_unique>(poisson.get_fe()); grid.dof_handler = std::make_unique>(*grid.triangulation); grid.dof_handler->distribute_dofs(*grid.fe); grid.mapping = std::make_unique>(poisson.get_mapping()); grid.locator.rebuild(*grid.dof_handler, *grid.triangulation); 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