68 dealii::Triangulation<dim> &triangulation)
const final
73 "The geotiff profile ng geometry is only implemented in 2D."));
80 using Base = dealii::parallel::TriangulationBase<dim>;
81 using FD = dealii::parallel::fullydistributed::Triangulation<dim>;
82 const auto distributed =
dynamic_cast<const Base *
>(&triangulation);
83 const auto fully_distributed =
dynamic_cast<const FD *
>(&triangulation);
85 fully_distributed !=
nullptr || distributed ==
nullptr,
86 dealii::ExcMessage(
"The geotiff profile ng geometry only supports "
87 "serial and fully distributed triangulations."));
89 if constexpr (dim == 2) {
90 std::unique_ptr<dealii::Triangulation<dim>> temporary;
91 if (fully_distributed !=
nullptr)
92#if DEAL_II_VERSION_GTE(9, 7, 0)
94 std::make_unique<FD>(triangulation.get_mpi_communicator());
96 temporary = std::make_unique<FD>(triangulation.get_communicator());
99 temporary = std::make_unique<dealii::Triangulation<dim>>();
102 temporary->refine_global(refinement_);
109 const auto height = [&](
const dealii::Point<dim> &vertex) {
111 dealii::Point<2>(vertex[0], reference_y_coordinate_));
114 mesh_alignment_.align_with_elevation_profile(*temporary, height);
116 cut_cell_decomposition_.create_triangulation(
138 &collection)
const final
140 using namespace dealii;
149 if constexpr (dim == 2) {
150 const auto mapping_degree = fe_degree;
151 const auto quadrature_degree = fe_degree + 1;
153 const auto make = [](
auto collection,
154 const auto &quadrilateral,
155 const auto &triangle) {
156 collection.push_back(quadrilateral);
157 collection.push_back(triangle);
158 return std::make_unique<decltype(collection)>(
159 std::move(collection));
162 collection.finite_element_cg = make(hp::FECollection<dim>(),
163 FE_Q<dim>(fe_degree),
164 FE_SimplexP<dim>(fe_degree));
165 collection.finite_element_dg = make(hp::FECollection<dim>(),
166 FE_DGQ<dim>(fe_degree),
167 FE_SimplexDGP<dim>(fe_degree));
170 make(hp::MappingCollection<dim>(),
171 MappingQ<dim>(mapping_degree),
172 MappingFE<dim>(FE_SimplexP<dim>(mapping_degree)));
174 collection.quadrature = make(hp::QCollection<dim>(),
175 QGauss<dim>(quadrature_degree),
176 QGaussSimplex<dim>(quadrature_degree));
177 collection.quadrature_high_order =
178 make(hp::QCollection<dim>(),
179 QGauss<dim>(quadrature_degree + 1),
180 QGaussSimplex<dim>(quadrature_degree + 1));
181 collection.nodal_quadrature =
182 make(hp::QCollection<dim>(),
183 QGaussLobatto<dim>(quadrature_degree),
184 FETools::compute_nodal_quadrature(
185 FE_SimplexP<dim>(quadrature_degree)));
187 collection.quadrature_1d = make(hp::QCollection<1>(),
188 QGauss<1>(quadrature_degree),
189 QGaussSimplex<1>(quadrature_degree));
190 collection.nodal_quadrature_1d =
191 make(hp::QCollection<1>(),
192 QGaussLobatto<1>(quadrature_degree),
193 QGaussLobatto<1>(quadrature_degree));
196 using QCF = hp::QCollection<dim - 1>;
197 collection.face_quadrature =
198 make(std::vector<QCF>(),
199 QCF(QGauss<dim - 1>(quadrature_degree)),
200 QCF(QGaussSimplex<dim - 1>(quadrature_degree)));
201 collection.face_nodal_quadrature =
202 make(std::vector<QCF>(),
203 QCF(QGaussLobatto<dim - 1>(quadrature_degree)),
204 QCF(QGaussLobatto<dim - 1>(quadrature_degree)));