Skip to content

Commit 44cb9a9

Browse files
committed
Add XML node ctors for multivariate distributions
1 parent bb9f63c commit 44cb9a9

4 files changed

Lines changed: 51 additions & 7 deletions

File tree

‎include/openmc/distribution_multi.h‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
#include <memory>
55

6+
#include "pugixml.hpp"
7+
68
#include "openmc/distribution.h"
79
#include "openmc/position.h"
810

@@ -16,14 +18,15 @@ namespace openmc {
1618
class UnitSphereDistribution {
1719
public:
1820
UnitSphereDistribution() { };
19-
explicit UnitSphereDistribution(Direction u) : u_ref{u} { };
21+
explicit UnitSphereDistribution(Direction u) : u_ref_{u} { };
22+
explicit UnitSphereDistribution(pugi::xml_node node);
2023
virtual ~UnitSphereDistribution() = default;
2124

2225
//! Sample a direction from the distribution
2326
//! \return Direction sampled
2427
virtual Direction sample() const = 0;
2528

26-
Direction u_ref {0.0, 0.0, 1.0}; //!< reference direction
29+
Direction u_ref_ {0.0, 0.0, 1.0}; //!< reference direction
2730
};
2831

2932
//==============================================================================
@@ -33,6 +36,7 @@ class UnitSphereDistribution {
3336
class PolarAzimuthal : public UnitSphereDistribution {
3437
public:
3538
PolarAzimuthal(Direction u, UPtrDist mu, UPtrDist phi);
39+
explicit PolarAzimuthal(pugi::xml_node node);
3640

3741
//! Sample a direction from the distribution
3842
//! \return Direction sampled
@@ -62,6 +66,7 @@ class Isotropic : public UnitSphereDistribution {
6266
class Monodirectional : public UnitSphereDistribution {
6367
public:
6468
Monodirectional(Direction u) : UnitSphereDistribution{u} { };
69+
explicit Monodirectional(pugi::xml_node node) : UnitSphereDistribution{node} { };
6570

6671
//! Sample a direction from the distribution
6772
//! \return Sampled direction

‎include/openmc/distribution_spatial.h‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class CartesianIndependent : public SpatialDistribution {
4343

4444
class SpatialBox : public SpatialDistribution {
4545
public:
46-
explicit SpatialBox(pugi::xml_node node);
46+
explicit SpatialBox(pugi::xml_node node, bool fission=false);
4747

4848
//! Sample a position from the distribution
4949
//! \return Sampled position
@@ -60,6 +60,7 @@ class SpatialBox : public SpatialDistribution {
6060

6161
class SpatialPoint : public SpatialDistribution {
6262
public:
63+
SpatialPoint() : r_{} { };
6364
explicit SpatialPoint(pugi::xml_node node);
6465

6566
//! Sample a position from the distribution

‎src/distribution_multi.cpp‎

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,64 @@
44
#include <cmath> // for sqrt, sin, cos, max
55

66
#include "openmc/constants.h"
7+
#include "openmc/error.h"
78
#include "openmc/math_functions.h"
89
#include "openmc/random_lcg.h"
10+
#include "openmc/xml_interface.h"
911

1012
namespace openmc {
1113

14+
//==============================================================================
15+
// UnitSphereDistribution implementation
16+
//==============================================================================
17+
18+
UnitSphereDistribution::UnitSphereDistribution(pugi::xml_node node)
19+
{
20+
// Read reference directional unit vector
21+
if (check_for_node(node, "reference_uvw")) {
22+
auto u_ref = get_node_array<double>(node, "reference_uvw");
23+
if (u_ref.size() != 3)
24+
fatal_error("Angular distribution reference direction must have "
25+
"three parameters specified.");
26+
u_ref_ = Direction(u_ref.data());
27+
}
28+
}
29+
30+
1231
//==============================================================================
1332
// PolarAzimuthal implementation
1433
//==============================================================================
1534

1635
PolarAzimuthal::PolarAzimuthal(Direction u, UPtrDist mu, UPtrDist phi) :
1736
UnitSphereDistribution{u}, mu_{std::move(mu)}, phi_{std::move(phi)} { }
1837

38+
PolarAzimuthal::PolarAzimuthal(pugi::xml_node node)
39+
: UnitSphereDistribution{node}
40+
{
41+
if (check_for_node(node, "mu")) {
42+
pugi::xml_node node_dist = node.child("mu");
43+
mu_ = distribution_from_xml(node_dist);
44+
} else {
45+
mu_ = UPtrDist{new Uniform(-1., 1.)};
46+
}
47+
48+
if (check_for_node(node, "phi")) {
49+
pugi::xml_node node_dist = node.child("phi");
50+
phi_ = distribution_from_xml(node_dist);
51+
} else {
52+
phi_ = UPtrDist{new Uniform(0.0, 2.0*PI)};
53+
}
54+
}
55+
1956
Direction PolarAzimuthal::sample() const
2057
{
2158
// Sample cosine of polar angle
2259
double mu = mu_->sample();
23-
if (mu == 1.0) return u_ref;
60+
if (mu == 1.0) return u_ref_;
2461

2562
// Sample azimuthal angle
2663
double phi = phi_->sample();
27-
return rotate_angle(u_ref, mu, &phi);
64+
return rotate_angle(u_ref_, mu, &phi);
2865
}
2966

3067
//==============================================================================
@@ -45,7 +82,7 @@ Direction Isotropic::sample() const
4582

4683
Direction Monodirectional::sample() const
4784
{
48-
return u_ref;
85+
return u_ref_;
4986
}
5087

5188
} // namespace openmc

‎src/distribution_spatial.cpp‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ Position CartesianIndependent::sample() const
5555
// SpatialBox implementation
5656
//==============================================================================
5757

58-
SpatialBox::SpatialBox(pugi::xml_node node)
58+
SpatialBox::SpatialBox(pugi::xml_node node, bool fission)
59+
: only_fissionable_{fission}
5960
{
6061
// Read lower-right/upper-left coordinates
6162
auto params = get_node_array<double>(node, "parameters");

0 commit comments

Comments
 (0)