mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-28 22:26:08 -04:00
Leaky and Albedo Boundary Conditions Implementation (#2724)
Co-authored-by: Paul Romano <paul.k.romano@gmail.com>
This commit is contained in:
parent
2c1e304892
commit
693314d097
15 changed files with 376 additions and 82 deletions
|
|
@ -1,7 +1,10 @@
|
|||
#ifndef OPENMC_BOUNDARY_CONDITION_H
|
||||
#define OPENMC_BOUNDARY_CONDITION_H
|
||||
|
||||
#include "openmc/hdf5_interface.h"
|
||||
#include "openmc/particle.h"
|
||||
#include "openmc/position.h"
|
||||
#include <fmt/core.h>
|
||||
|
||||
namespace openmc {
|
||||
|
||||
|
|
@ -22,8 +25,44 @@ public:
|
|||
//! \param surf The specific surface on the boundary the particle struck.
|
||||
virtual void handle_particle(Particle& p, const Surface& surf) const = 0;
|
||||
|
||||
//! Modify the incident particle's weight according to the boundary's albedo.
|
||||
//! \param p The particle that struck the boundary. This function calculates
|
||||
//! the reduction in the incident particle's weight as it interacts
|
||||
//! with a boundary. The lost weight is tallied before the remaining weight
|
||||
//! is reassigned to the incident particle. Implementations of the
|
||||
//! handle_particle function typically call this method in its body.
|
||||
//! \param surf The specific surface on the boundary the particle struck.
|
||||
void handle_albedo(Particle& p, const Surface& surf) const
|
||||
{
|
||||
if (!has_albedo())
|
||||
return;
|
||||
double initial_wgt = p.wgt();
|
||||
// Treat the lost weight fraction as leakage, similar to VacuumBC.
|
||||
// This ensures the lost weight is tallied properly.
|
||||
p.wgt() *= (1.0 - albedo_);
|
||||
p.cross_vacuum_bc(surf);
|
||||
p.wgt() = initial_wgt * albedo_;
|
||||
};
|
||||
|
||||
//! Return a string classification of this BC.
|
||||
virtual std::string type() const = 0;
|
||||
|
||||
//! Write albedo data of this BC to hdf5.
|
||||
void to_hdf5(hid_t surf_group) const
|
||||
{
|
||||
if (has_albedo()) {
|
||||
write_string(surf_group, "albedo", fmt::format("{}", albedo_), false);
|
||||
}
|
||||
};
|
||||
|
||||
//! Set albedo of this BC.
|
||||
void set_albedo(double albedo) { albedo_ = albedo; }
|
||||
|
||||
//! Return if this BC has an albedo.
|
||||
bool has_albedo() const { return (albedo_ > 0.0); }
|
||||
|
||||
private:
|
||||
double albedo_ = -1.0;
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
|
|
|
|||
|
|
@ -83,10 +83,10 @@ struct BoundingBox {
|
|||
|
||||
class Surface {
|
||||
public:
|
||||
int id_; //!< Unique ID
|
||||
std::string name_; //!< User-defined name
|
||||
std::shared_ptr<BoundaryCondition> bc_ {nullptr}; //!< Boundary condition
|
||||
GeometryType geom_type_; //!< Geometry type indicator (CSG or DAGMC)
|
||||
int id_; //!< Unique ID
|
||||
std::string name_; //!< User-defined name
|
||||
unique_ptr<BoundaryCondition> bc_; //!< Boundary condition
|
||||
GeometryType geom_type_; //!< Geometry type indicator (CSG or DAGMC)
|
||||
bool surf_source_ {false}; //!< Activate source banking for the surface?
|
||||
|
||||
explicit Surface(pugi::xml_node surf_node);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue