Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Filter material from #2750

Merged
merged 13 commits into from
Nov 9, 2023
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,7 @@ list(APPEND libopenmc_SOURCES
src/tallies/filter_energyfunc.cpp
src/tallies/filter_legendre.cpp
src/tallies/filter_material.cpp
src/tallies/filter_materialfrom.cpp
src/tallies/filter_mesh.cpp
src/tallies/filter_meshsurface.cpp
src/tallies/filter_mu.cpp
Expand Down
1 change: 1 addition & 0 deletions docs/source/pythonapi/base.rst
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ Constructing Tallies
openmc.Filter
openmc.UniverseFilter
openmc.MaterialFilter
openmc.MaterialFromFilter
openmc.CellFilter
openmc.CellFromFilter
openmc.CellBornFilter
Expand Down
1 change: 1 addition & 0 deletions include/openmc/particle_data.h
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,7 @@ class ParticleData {
int& material() { return material_; }
const int& material() const { return material_; }
int& material_last() { return material_last_; }
const int& material_last() const { return material_last_; }

BoundaryInfo& boundary() { return boundary_; }

Expand Down
1 change: 1 addition & 0 deletions include/openmc/tallies/filter.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ enum class FilterType {
ENERGY_OUT,
LEGENDRE,
MATERIAL,
MATERIALFROM,
MESH,
MESH_SURFACE,
MU,
Expand Down
2 changes: 1 addition & 1 deletion include/openmc/tallies/filter_material.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class MaterialFilter : public Filter {

void set_materials(gsl::span<const int32_t> materials);

private:
protected:
pshriwise marked this conversation as resolved.
Show resolved Hide resolved
//----------------------------------------------------------------------------
// Data members

Expand Down
29 changes: 29 additions & 0 deletions include/openmc/tallies/filter_materialfrom.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#ifndef OPENMC_TALLIES_FILTER_MATERIALFROM_H
#define OPENMC_TALLIES_FILTER_MATERIALFROM_H

#include <string>

#include "openmc/tallies/filter_material.h"

namespace openmc {

//==============================================================================
//! Specifies which geometric cells particles exit when crossing a surface.
//==============================================================================

class MaterialFromFilter : public MaterialFilter {
public:
//----------------------------------------------------------------------------
// Methods

std::string type_str() const override { return "materialfrom"; }
FilterType type() const override { return FilterType::MATERIALFROM; }

void get_all_bins(const Particle& p, TallyEstimator estimator,
FilterMatch& match) const override;

std::string text_label(int bin) const override;
};

} // namespace openmc
#endif // OPENMC_TALLIES_FILTER_MATERIALFROM_H
30 changes: 26 additions & 4 deletions openmc/filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
_FILTER_TYPES = (
'universe', 'material', 'cell', 'cellborn', 'surface', 'mesh', 'energy',
'energyout', 'mu', 'polar', 'azimuthal', 'distribcell', 'delayedgroup',
'energyfunction', 'cellfrom', 'legendre', 'spatiallegendre',
'energyfunction', 'cellfrom', 'materialfrom', 'legendre', 'spatiallegendre',
'sphericalharmonics', 'zernike', 'zernikeradial', 'particle', 'cellinstance',
'collision', 'time'
)
Expand Down Expand Up @@ -451,7 +451,7 @@ class UniverseFilter(WithIDFilter):
Parameters
----------
bins : openmc.UniverseBase, int, or iterable thereof
The Universes to tally. Either openmc.UniverseBase objects or their
The Universes to tally. Either :class:`openmc.UniverseBase` objects or their
Integral ID numbers can be used.
filter_id : int
Unique identifier for the filter
Expand All @@ -475,7 +475,7 @@ class MaterialFilter(WithIDFilter):
Parameters
----------
bins : openmc.Material, Integral, or iterable thereof
The Materials to tally. Either openmc.Material objects or their
The material(s) to tally. Either :class:`openmc.Material` objects or their
Integral ID numbers can be used.
filter_id : int
Unique identifier for the filter
Expand All @@ -492,14 +492,36 @@ class MaterialFilter(WithIDFilter):
"""
expected_type = Material

class MaterialFromFilter(WithIDFilter):
"""Bins tally event locations based on the Material they occurred in.

Parameters
----------
bins : openmc.Material, Integral, or iterable thereof
The material(s) to tally. Either :class:`openmc.Material` objects or their
Integral ID numbers can be used.
filter_id : int
Unique identifier for the filter

Attributes
----------
bins : Iterable of Integral
openmc.Material IDs.
id : int
Unique identifier for the filter
num_bins : Integral
The number of filter bins

"""
expected_type = Material

class CellFilter(WithIDFilter):
"""Bins tally event locations based on the Cell they occurred in.

Parameters
----------
bins : openmc.Cell, int, or iterable thereof
The cells to tally. Either openmc.Cell objects or their ID numbers can
The cells to tally. Either :class:`openmc.Cell` objects or their ID numbers can
be used.
filter_id : int
Unique identifier for the filter
Expand Down
5 changes: 4 additions & 1 deletion openmc/lib/filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
'Filter', 'AzimuthalFilter', 'CellFilter', 'CellbornFilter', 'CellfromFilter',
'CellInstanceFilter', 'CollisionFilter', 'DistribcellFilter', 'DelayedGroupFilter',
'EnergyFilter', 'EnergyoutFilter', 'EnergyFunctionFilter', 'LegendreFilter',
'MaterialFilter', 'MeshFilter', 'MeshSurfaceFilter', 'MuFilter', 'ParticleFilter',
'MaterialFilter', 'MaterialFromFilter', 'MeshFilter', 'MeshSurfaceFilter', 'MuFilter', 'ParticleFilter',
'PolarFilter', 'SphericalHarmonicsFilter', 'SpatialLegendreFilter', 'SurfaceFilter',
'UniverseFilter', 'ZernikeFilter', 'ZernikeRadialFilter', 'filters'
]
Expand Down Expand Up @@ -341,6 +341,8 @@ def bins(self, materials):
bins = (c_int32*n)(*(m._index for m in materials))
_dll.openmc_material_filter_set_bins(self._index, n, bins)

class MaterialFromFilter(Filter):
filter_type = 'materialfrom'

class MeshFilter(Filter):
filter_type = 'mesh'
Expand Down Expand Up @@ -501,6 +503,7 @@ class ZernikeRadialFilter(ZernikeFilter):
'energyfunction': EnergyFunctionFilter,
'legendre': LegendreFilter,
'material': MaterialFilter,
'materialfrom': MaterialFromFilter,
'mesh': MeshFilter,
'meshsurface': MeshSurfaceFilter,
'mu': MuFilter,
Expand Down
3 changes: 3 additions & 0 deletions src/tallies/filter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "openmc/tallies/filter_energyfunc.h"
#include "openmc/tallies/filter_legendre.h"
#include "openmc/tallies/filter_material.h"
#include "openmc/tallies/filter_materialfrom.h"
#include "openmc/tallies/filter_mesh.h"
#include "openmc/tallies/filter_meshsurface.h"
#include "openmc/tallies/filter_mu.h"
Expand Down Expand Up @@ -121,6 +122,8 @@ Filter* Filter::create(const std::string& type, int32_t id)
return Filter::create<LegendreFilter>(id);
} else if (type == "material") {
return Filter::create<MaterialFilter>(id);
} else if (type == "materialfrom") {
return Filter::create<MaterialFromFilter>(id);
} else if (type == "mesh") {
return Filter::create<MeshFilter>(id);
} else if (type == "meshsurface") {
Expand Down
24 changes: 24 additions & 0 deletions src/tallies/filter_materialfrom.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#include "openmc/tallies/filter_materialfrom.h"

#include "openmc/cell.h"
#include "openmc/material.h"

namespace openmc {

void MaterialFromFilter::get_all_bins(
const Particle& p, TallyEstimator estimator, FilterMatch& match) const
{
auto search = map_.find(p.material_last());
if (search != map_.end()) {
match.bins_.push_back(search->second);
match.weights_.push_back(1.0);
}
}

std::string MaterialFromFilter::text_label(int bin) const
{
return "Material from " +
std::to_string(model::materials[materials_[bin]]->id_);
}

} // namespace openmc
2 changes: 1 addition & 1 deletion tests/regression_tests/surface_tally/inputs_true.dat
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
<filter id="4" type="surface">
<bins>1</bins>
</filter>
<filter id="7" type="cellfrom">
<filter id="7" type="materialfrom">
<bins>2</bins>
</filter>
<filter id="8" type="cell">
Expand Down
6 changes: 3 additions & 3 deletions tests/regression_tests/surface_tally/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,19 +106,19 @@ def __init__(self, *args, **kwargs):

# Create partial current tallies from water to fuel
# Filters
cell_from_filter = openmc.CellFromFilter(water)
mat_from_filter = openmc.MaterialFromFilter(borated_water)
pshriwise marked this conversation as resolved.
Show resolved Hide resolved
cell_filter = openmc.CellFilter(fuel)

# Cell to cell filters for partial current
cell_to_cell_tally = openmc.Tally(name=str('water_to_fuel_1'))
cell_to_cell_tally.filters = [cell_from_filter, cell_filter, \
cell_to_cell_tally.filters = [mat_from_filter, cell_filter, \
energy_filter, polar_filter, azimuthal_filter]
cell_to_cell_tally.scores = ['current']
tallies_file.append(cell_to_cell_tally)

# Cell from + surface filters for partial current
cell_to_cell_tally = openmc.Tally(name=str('water_to_fuel_2'))
cell_to_cell_tally.filters = [cell_from_filter, surface_filter, \
cell_to_cell_tally.filters = [mat_from_filter, surface_filter, \
energy_filter, polar_filter, azimuthal_filter]
cell_to_cell_tally.scores = ['current']
tallies_file.append(cell_to_cell_tally)
Expand Down