67 dealii::Triangulation<dim> &triangulation)
const final
72 "The geotiff profile ng geometry is only implemented in 2D."));
79 using Base = dealii::parallel::TriangulationBase<dim>;
80 using FD = dealii::parallel::fullydistributed::Triangulation<dim>;
81 const auto distributed =
dynamic_cast<const Base *
>(&triangulation);
82 const auto fully_distributed =
dynamic_cast<const FD *
>(&triangulation);
84 fully_distributed !=
nullptr || distributed ==
nullptr,
85 dealii::ExcMessage(
"The geotiff profile ng geometry only supports "
86 "serial and fully distributed triangulations."));
88 if constexpr (dim == 2) {
89 std::unique_ptr<dealii::Triangulation<dim>> temporary;
90 if (fully_distributed !=
nullptr)
91#if DEAL_II_VERSION_GTE(9, 7, 0)
93 std::make_unique<FD>(triangulation.get_mpi_communicator());
95 temporary = std::make_unique<FD>(triangulation.get_communicator());
98 temporary = std::make_unique<dealii::Triangulation<dim>>();
101 temporary->refine_global(refinement_);
108 const auto height = [&](
const dealii::Point<dim> &vertex) {
110 dealii::Point<2>(vertex[0], reference_y_coordinate_));
113 mesh_alignment_.align_with_elevation_profile(*temporary, height);
115 cut_cell_decomposition_.create_triangulation(
137 &collection)
const final
139 using namespace dealii;
148 if constexpr (dim == 2) {
149 const auto mapping_degree = fe_degree;
150 const auto quadrature_degree = fe_degree + 1;
152 const auto make = [](
auto collection,
153 const auto &quadrilateral,
154 const auto &triangle) {
155 collection.push_back(quadrilateral);
156 collection.push_back(triangle);
157 return std::make_unique<decltype(collection)>(
158 std::move(collection));
161 collection.finite_element_cg = make(hp::FECollection<dim>(),
162 FE_Q<dim>(fe_degree),
163 FE_SimplexP<dim>(fe_degree));
164 collection.finite_element_dg = make(hp::FECollection<dim>(),
165 FE_DGQ<dim>(fe_degree),
166 FE_SimplexDGP<dim>(fe_degree));
169 make(hp::MappingCollection<dim>(),
170 MappingQ<dim>(mapping_degree),
171 MappingFE<dim>(FE_SimplexP<dim>(mapping_degree)));
173 collection.quadrature = make(hp::QCollection<dim>(),
174 QGauss<dim>(quadrature_degree),
175 QGaussSimplex<dim>(quadrature_degree));
176 collection.quadrature_high_order =
177 make(hp::QCollection<dim>(),
178 QGauss<dim>(quadrature_degree + 1),
179 QGaussSimplex<dim>(quadrature_degree + 1));
180 collection.nodal_quadrature =
181 make(hp::QCollection<dim>(),
182 QGaussLobatto<dim>(quadrature_degree),
183 FETools::compute_nodal_quadrature(
184 FE_SimplexP<dim>(quadrature_degree)));
186 collection.quadrature_1d = make(hp::QCollection<1>(),
187 QGauss<1>(quadrature_degree),
188 QGaussSimplex<1>(quadrature_degree));
189 collection.nodal_quadrature_1d =
190 make(hp::QCollection<1>(),
191 QGaussLobatto<1>(quadrature_degree),
192 QGaussLobatto<1>(quadrature_degree));
195 using QCF = hp::QCollection<dim - 1>;
196 collection.face_quadrature =
197 make(std::vector<QCF>(),
198 QCF(QGauss<dim - 1>(quadrature_degree)),
199 QCF(QGaussSimplex<dim - 1>(quadrature_degree)));
200 collection.face_nodal_quadrature =
201 make(std::vector<QCF>(),
202 QCF(QGaussLobatto<dim - 1>(quadrature_degree)),
203 QCF(QGaussLobatto<dim - 1>(quadrature_degree)));