Program Listing for File discretization.h

↰ Return to documentation for file (include/immersx/vascularization/discretization.h)

// Copyright (C) 2026 by Luca Heltai
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#ifndef immersx_vascularization_discretization_h
#define immersx_vascularization_discretization_h

#include <deal.II/base/mpi.h>

#include <deal.II/fe/mapping.h>

#include <deal.II/grid/cell_id.h>
#include <deal.II/grid/tria.h>

#include <immersx/vascularization/growth_work.h>
#include <immersx/vascularization/network.h>

#include <functional>
#include <set>

namespace ImmersX::Vascularization
{
  struct DiscretizationParameters
  {
    void
    validate() const;

    double target_factor = 1.;
    double lower_factor  = .5;
    double upper_factor  = 2.;
    double       exterior_length = 0.;
    unsigned int cell_budget     = 1000000;
  };

  struct DiscretizationCell
  {
    VesselCell reference;
    double                      h_min  = 0.;
    double                      h_max  = 0.;
    dealii::types::subdomain_id owner  = 0;
    bool                        inside = false;
    bool short_cell = false;
  };

  struct DiscretizationResult
  {
    GrowthWork work;
    std::vector<DiscretizationCell> cells;
    ValidationReport                validation;
    double       inside_volume  = 0.;
    unsigned int short_cells    = 0;
    unsigned int exterior_cells = 0;
  };

  DiscretizationResult
  discretize(const dealii::Triangulation<3> &background,
             const dealii::Mapping<3>       &mapping,
             const NetworkData              &network,
             const DiscretizationParameters &parameters,
             MPI_Comm                        communicator);

  using CellVessels = std::map<dealii::types::coarse_cell_id, VesselCell>;

  CellVessels
  create_triangulation(const NetworkData           &network,
                       const DiscretizationResult  &discretization,
                       dealii::Triangulation<1, 3> &triangulation);

  CellVessels
  create_triangulation(
    const NetworkData           &network,
    const DiscretizationResult  &discretization,
    dealii::Triangulation<1, 3> &triangulation,
    const std::set<Id>          &reversed_vessels,
    const std::function<std::array<dealii::types::boundary_id, 2>(
      const VesselCell &,
      const Vessel &)>          &boundary_ids = {});

  VesselCell
  physical_reference(const dealii::CellId &cell,
                     const CellVessels    &coarse_cells);
} // namespace ImmersX::Vascularization
#endif