• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

openmc-dev / openmc / 19281637216

11 Nov 2025 11:45PM UTC coverage: 82.02% (+0.1%) from 81.92%
19281637216

Pull #3601

github

web-flow
Merge 825ba0ccc into c0f302db6
Pull Request #3601: Reset DAGMC history when reviving from source.

16722 of 23233 branches covered (71.98%)

Branch coverage included in aggregate %.

1 of 1 new or added line in 1 file covered. (100.0%)

1433 existing lines in 20 files now uncovered.

54246 of 63292 relevant lines covered (85.71%)

44167143.19 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

79.05
/src/distribution_multi.cpp
1
#include "openmc/distribution_multi.h"
2

3
#include <algorithm> // for move
4
#include <cmath>     // for sqrt, sin, cos, max
5

6
#include "openmc/constants.h"
7
#include "openmc/error.h"
8
#include "openmc/math_functions.h"
9
#include "openmc/random_dist.h"
10
#include "openmc/random_lcg.h"
11
#include "openmc/xml_interface.h"
12

13
namespace openmc {
14

15
unique_ptr<UnitSphereDistribution> UnitSphereDistribution::create(
3,176✔
16
  pugi::xml_node node)
17
{
18
  // Check for type of angular distribution
19
  std::string type;
3,176✔
20
  if (check_for_node(node, "type"))
3,176!
21
    type = get_node_value(node, "type", true, true);
3,176✔
22
  if (type == "isotropic") {
3,176✔
23
    return UPtrAngle {new Isotropic()};
256✔
24
  } else if (type == "monodirectional") {
2,920✔
25
    return UPtrAngle {new Monodirectional(node)};
2,882✔
26
  } else if (type == "mu-phi") {
38!
27
    return UPtrAngle {new PolarAzimuthal(node)};
38✔
28
  } else {
29
    fatal_error(fmt::format(
×
30
      "Invalid angular distribution for external source: {}", type));
31
  }
32
}
3,176✔
33

34
//==============================================================================
35
// UnitSphereDistribution implementation
36
//==============================================================================
37

38
UnitSphereDistribution::UnitSphereDistribution(pugi::xml_node node)
2,920✔
39
{
40
  // Read reference directional unit vector
41
  if (check_for_node(node, "reference_uvw")) {
2,920!
42
    auto u_ref = get_node_array<double>(node, "reference_uvw");
2,920✔
43
    if (u_ref.size() != 3)
2,920!
44
      fatal_error("Angular distribution reference direction must have "
×
45
                  "three parameters specified.");
46
    u_ref_ = Direction(u_ref.data());
2,920✔
47
  }
2,920✔
48
}
2,920✔
49

50
//==============================================================================
51
// PolarAzimuthal implementation
52
//==============================================================================
53

54
PolarAzimuthal::PolarAzimuthal(Direction u, UPtrDist mu, UPtrDist phi)
×
55
  : UnitSphereDistribution {u}, mu_ {std::move(mu)}, phi_ {std::move(phi)}
×
56
{}
×
57

58
PolarAzimuthal::PolarAzimuthal(pugi::xml_node node)
38✔
59
  : UnitSphereDistribution {node}
38✔
60
{
61
  // Read reference directional unit vector
62
  if (check_for_node(node, "reference_vwu")) {
38!
63
    auto v_ref = get_node_array<double>(node, "reference_vwu");
38✔
64
    if (v_ref.size() != 3)
38!
65
      fatal_error("Angular distribution reference v direction must have "
×
66
                  "three parameters specified.");
67
    v_ref_ = Direction(v_ref.data());
38✔
68
  }
38✔
69
  w_ref_ = u_ref_.cross(v_ref_);
38✔
70
  if (check_for_node(node, "mu")) {
38!
71
    pugi::xml_node node_dist = node.child("mu");
38✔
72
    mu_ = distribution_from_xml(node_dist);
38✔
73
  } else {
UNCOV
74
    mu_ = UPtrDist {new Uniform(-1., 1.)};
×
75
  }
76

77
  if (check_for_node(node, "phi")) {
38!
78
    pugi::xml_node node_dist = node.child("phi");
38✔
79
    phi_ = distribution_from_xml(node_dist);
38✔
80
  } else {
UNCOV
81
    phi_ = UPtrDist {new Uniform(0.0, 2.0 * PI)};
×
82
  }
83
}
38✔
84

85
Direction PolarAzimuthal::sample(uint64_t* seed) const
25,300✔
86
{
87
  // Sample cosine of polar angle
88
  double mu = mu_->sample(seed);
25,300✔
89
  if (mu == 1.0)
25,300✔
90
    return u_ref_;
759✔
91
  if (mu == -1.0)
24,541✔
92
    return -u_ref_;
1,628✔
93

94
  // Sample azimuthal angle
95
  double phi = phi_->sample(seed);
22,913✔
96

97
  double f = std::sqrt(1 - mu * mu);
22,913✔
98

99
  return mu * u_ref_ + f * std::cos(phi) * v_ref_ + f * std::sin(phi) * w_ref_;
22,913✔
100
}
101

102
//==============================================================================
103
// Isotropic implementation
104
//==============================================================================
105

106
Direction isotropic_direction(uint64_t* seed)
116,150,877✔
107
{
108
  double phi = uniform_distribution(0., 2.0 * PI, seed);
116,150,877✔
109
  double mu = uniform_distribution(-1., 1., seed);
116,150,877✔
110
  return {mu, std::sqrt(1.0 - mu * mu) * std::cos(phi),
116,150,877✔
111
    std::sqrt(1.0 - mu * mu) * std::sin(phi)};
116,150,877✔
112
}
113

114
Direction Isotropic::sample(uint64_t* seed) const
22,326,206✔
115
{
116
  return isotropic_direction(seed);
22,326,206✔
117
}
118

119
//==============================================================================
120
// Monodirectional implementation
121
//==============================================================================
122

123
Direction Monodirectional::sample(uint64_t* seed) const
12,466,574✔
124
{
125
  return u_ref_;
12,466,574✔
126
}
127

128
} // namespace openmc
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc