]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Merge pull request #15807 from peterrum/FineDoFHandlerViewBase
authorMartin Kronbichler <martin.kronbichler@uni-a.de>
Tue, 22 Aug 2023 13:19:24 +0000 (15:19 +0200)
committerGitHub <noreply@github.com>
Tue, 22 Aug 2023 13:19:24 +0000 (15:19 +0200)
MGTwoLevelTransfer: specialize setup for FCP and p-mg

1  2 
include/deal.II/multigrid/mg_transfer_global_coarsening.templates.h

index 169ed710006836e4ff88cb729858e11cb6849d1a,fcf2c8f5e5d6bed6192e8a8e6924daf7dc5e41b5..09d0f53ced9969ebdbcb6772e64cd197b69c8ae2
@@@ -999,75 -1404,15 +1408,79 @@@ namespace interna
                     is_dst_remote,
                     is_src_locally_owned,
                     true);
 +
 +      // check if meshes are compatible
 +      if (mg_level_coarse == numbers::invalid_unsigned_int)
 +        {
 +          std::vector<std::string> not_found_cells_local;
 +
 +          const auto coarse_operation_check = [&](const auto &cell) {
 +            bool flag = false;
 +
 +            const auto index = this->cell_id_translator.translate(cell);
 +
 +            flag |= this->is_dst_remote.is_element(index) ||
 +                    this->is_dst_locally_owned.is_element(index);
 +
 +            if (cell->level() + 1u != tria_dst.n_global_levels())
 +              {
 +                for (unsigned int i = 0;
 +                     i < GeometryInfo<dim>::max_children_per_cell;
 +                     ++i)
 +                  {
 +                    const auto index =
 +                      this->cell_id_translator.translate(cell, i);
 +
 +                    flag |= this->is_dst_remote.is_element(index) ||
 +                            this->is_dst_locally_owned.is_element(index);
 +                  }
 +              }
 +
 +            if (!flag)
 +              not_found_cells_local.emplace_back(cell->id().to_string());
 +          };
 +
 +          loop_over_active_or_level_cells(tria_src,
 +                                          mg_level_coarse,
 +                                          coarse_operation_check);
 +
 +          auto not_found_cells =
 +            Utilities::MPI::reduce<std::vector<std::string>>(
 +              not_found_cells_local,
 +              this->communicator,
 +              [](const auto &a, const auto &b) {
 +                auto result = a;
 +                result.insert(result.end(), b.begin(), b.end());
 +                return result;
 +              },
 +              0);
 +
 +          if (Utilities::MPI::this_mpi_process(this->communicator) == 0 &&
 +              !not_found_cells.empty())
 +            {
 +              std::sort(not_found_cells.begin(), not_found_cells.end());
 +
 +              const std::string str =
 +                boost::algorithm::join(not_found_cells, ", ");
 +
 +              AssertThrow(
 +                false,
 +                ExcMessage(
 +                  "Problem setting up two-level transfer operator, since coarse triangulation "
 +                  "seems to be obtainable by simple coarsening. Following coarse cells "
 +                  "or children cells could not be found in the fine mesh: " +
 +                  str + "."));
 +            }
 +        }
      }
+     virtual ~GlobalCoarseningFineDoFHandlerView() = default;
    };
  
    template <int dim>
-   class PermutationFineDoFHandlerView : public internal::FineDoFHandlerView<dim>
+   class PermutationFineDoFHandlerView : public BlackBoxFineDoFHandlerView<dim>
    {
    public:
      PermutationFineDoFHandlerView(const DoFHandler<dim> &dof_handler_dst,

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.