Program Listing for File mesh_scale.h

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

// Copyright (C) 2026 by Luca Heltai
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#ifndef immersx_vascularization_mesh_scale_h
#define immersx_vascularization_mesh_scale_h
#include <deal.II/base/mpi.h>

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

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

#include <immersx/vascularization/network.h>

namespace ImmersX::Vascularization
{
  enum class LengthScalePolicy
  {
    meter,
    local_mesh_size,
    min_mesh_size,
    max_mesh_size
  };

  struct MeshLengthScale
  {
    LengthScalePolicy policy       = LengthScalePolicy::meter;
    double            mesh_minimum = 1., mesh_maximum = 1.;
    void
    validate() const;
    double
    value(double local_diameter) const;
    double
    minimum() const;
    double
    maximum() const;
    double
    physical_length(double coefficient, double local_diameter) const;
    std::string
    name() const;
  };

  MeshLengthScale
  mesh_length_scale(const dealii::Triangulation<3> &background,
                    const std::string              &policy,
                    MPI_Comm                        communicator);

  struct ScaledVesselMeasure
  {
    double normalized_length = 0., inside_length = 0., exterior_length = 0.;
    double minimum_scale = 0., maximum_scale = 0.;
    double minimum_normalized_radius = 0., maximum_normalized_radius = 0.;
    bool   has_normalized_part = false;
    bool complete = true;
  };

  std::map<Id, ScaledVesselMeasure>
  measure_scaled_vessels(const dealii::Triangulation<3> &background,
                         const dealii::Mapping<3>       &mapping,
                         const NetworkData              &network,
                         const MeshLengthScale          &scale,
                         MPI_Comm                        communicator);
} // namespace ImmersX::Vascularization
#endif