Program Listing for File reference_flow.h

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

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

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

#include <immersx/vascularization/network.h>

namespace ImmersX::Vascularization
{
  struct ReferenceConditions
  {
    std::map<Id, double> pressures;
    std::map<Id, double> inflows;
    std::map<Id, std::pair<double, double>> robin = {};
  };

  struct ReferenceParameters
  {
    void
    validate() const;

    unsigned int maximum_iterations              = 10000;
    double       linear_relative_tolerance       = 1.e-12;
    double       conservation_relative_tolerance = 1.e-9;
    double absolute_flow_tolerance = 0.;
  };

  struct VesselReference
  {
    double resistance = 0.;
    double flow = 0.;
    std::array<double, 2> wall_shear{{0., 0.}};
  };

  struct TerritoryReference
  {
    double flow = 0.;
    double flow_per_demand = 0.;
    double arterial_flow = 0., portal_flow = 0., venous_flow = 0.;
    double compartment_pressure = std::numeric_limits<double>::quiet_NaN();
  };

  struct ReferenceResult
  {
    ValidationReport validation;
    std::map<Id, double> pressures;
    std::map<Id, VesselReference> vessels;
    std::map<Id, TerritoryReference> territories;
    std::map<Id, double> terminal_outflows;
    std::map<Id, double> boundary_inflows;
    double       dissipated_power      = 0.;
    double       maximum_flow_defect   = 0.;
    double       relative_flow_defect  = 0.;
    double       boundary_flow_balance = 0.;
    double       linear_residual       = 0.;
    unsigned int iterations            = 0;
  };

  ReferenceResult
  solve_reference(const NetworkData               &network,
                  const std::vector<TerminalPair> &pairs,
                  const ReferenceConditions       &conditions,
                  const ReferenceParameters       &parameters,
                  MPI_Comm                         communicator);
  ReferenceResult
  solve_reference(const NetworkData                  &network,
                  const std::vector<TerminalPair>    &pairs,
                  const std::vector<TerminalTriplet> &triplets,
                  const ReferenceConditions          &conditions,
                  const ReferenceParameters          &parameters,
                  MPI_Comm                            communicator);
  ReferenceConditions
  demand_flow_conditions(const NetworkData          &network,
                         const std::map<Id, double> &port_pressures,
                         double                      total_flow,
                         const std::vector<Id>      &selected_terminals,
                         MPI_Comm                    communicator);
  ReferenceConditions
  demand_flow_conditions(const NetworkData              &network,
                         const std::map<Id, double>     &port_pressures,
                         const std::map<System, double> &total_flows,
                         const std::vector<Id>          &selected_terminals,
                         MPI_Comm                        communicator);

  double
  reference_pressure(const NetworkData     &network,
                     const ReferenceResult &reference,
                     Id                     vessel,
                     double                 coordinate);
} // namespace ImmersX::Vascularization
#endif