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

openmc-dev / openmc / 21979935674

13 Feb 2026 08:26AM UTC coverage: 81.457% (-0.4%) from 81.851%
21979935674

Pull #3801

github

web-flow
Merge cee3353e4 into bcb939520
Pull Request #3801: avoid need to set particles and batches for dagmc models when calling convert_to_multigroup

16961 of 23617 branches covered (71.82%)

Branch coverage included in aggregate %.

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

908 existing lines in 38 files now uncovered.

55977 of 65925 relevant lines covered (84.91%)

39154534.73 hits per line

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

84.85
/src/tallies/filter_cell_instance.cpp
1
#include "openmc/tallies/filter_cell_instance.h"
2

3
#include <cassert>
4
#include <string>
5

6
#include <fmt/core.h>
7

8
#include "openmc/capi.h"
9
#include "openmc/cell.h"
10
#include "openmc/error.h"
11
#include "openmc/geometry.h"
12
#include "openmc/xml_interface.h"
13

14
namespace openmc {
15

16
CellInstanceFilter::CellInstanceFilter(span<CellInstance> instances)
×
17
{
18
  this->set_cell_instances(instances);
×
19
}
×
20

21
void CellInstanceFilter::from_xml(pugi::xml_node node)
22✔
22
{
23
  // Get cell IDs/instances
24
  auto cells = get_node_array<int32_t>(node, "bins");
22✔
25
  assert(cells.size() % 2 == 0);
16!
26

27
  // Convert into vector of CellInstance
28
  vector<CellInstance> instances;
22✔
29
  for (int64_t i = 0; i < cells.size() / 2; ++i) {
462✔
30
    int32_t cell_id = cells[2 * i];
440✔
31
    int64_t instance = cells[2 * i + 1];
440✔
32
    auto search = model::cell_map.find(cell_id);
440✔
33
    if (search == model::cell_map.end()) {
440!
34
      throw std::runtime_error {fmt::format(
×
35
        "Could not find cell {} specified on tally filter.", cell_id)};
×
36
    }
37
    int64_t index = search->second;
440✔
38
    instances.push_back({index, instance});
440✔
39
  }
40

41
  this->set_cell_instances(instances);
22✔
42
}
22✔
43

44
void CellInstanceFilter::set_cell_instances(span<CellInstance> instances)
22✔
45
{
46
  // Clear existing cells
47
  cell_instances_.clear();
22✔
48
  cell_instances_.reserve(instances.size());
22✔
49
  cells_.clear();
22✔
50
  map_.clear();
22✔
51

52
  // Update cells and mapping
53
  for (auto& x : instances) {
462✔
54
    assert(x.index_cell >= 0);
320!
55
    assert(x.index_cell < model::cells.size());
320!
56
    cell_instances_.push_back(x);
440✔
57
    cells_.insert(x.index_cell);
440✔
58
    map_[x] = cell_instances_.size() - 1;
440✔
59
  }
60

61
  n_bins_ = cell_instances_.size();
22✔
62

63
  material_cells_only_ = true;
22✔
64
  for (const auto& cell_inst : cell_instances_) {
198!
65
    const auto& c = *model::cells[cell_inst.index_cell];
198✔
66
    if (c.type_ == Fill::MATERIAL)
198✔
67
      continue;
176✔
68
    material_cells_only_ = false;
22✔
69
    break;
22✔
70
  }
71
}
22✔
72

73
void CellInstanceFilter::get_all_bins(
5,535,264✔
74
  const Particle& p, TallyEstimator estimator, FilterMatch& match) const
75
{
76
  int64_t index_cell = p.lowest_coord().cell();
5,535,264✔
77
  int64_t instance = p.cell_instance();
5,535,264✔
78

79
  if (cells_.count(index_cell) > 0) {
5,535,264✔
80
    auto search = map_.find({index_cell, instance});
1,497,808✔
81
    if (search != map_.end()) {
1,497,808!
82
      int index_bin = search->second;
1,497,808✔
83
      match.bins_.push_back(index_bin);
1,497,808✔
84
      match.weights_.push_back(1.0);
1,497,808✔
85
    }
86
  }
87

88
  if (material_cells_only_)
5,535,264!
UNCOV
89
    return;
×
90

91
  for (int i = 0; i < p.n_coord() - 1; i++) {
12,478,352✔
92
    int64_t index_cell = p.coord(i).cell();
6,943,088✔
93
    // if this cell isn't used on the filter, move on
94
    if (cells_.count(index_cell) == 0)
6,943,088✔
95
      continue;
5,535,264✔
96

97
    // if this cell is used in the filter, check the instance as well
98
    int64_t instance = cell_instance_at_level(p, i);
1,407,824✔
99
    auto search = map_.find({index_cell, instance});
1,407,824✔
100
    if (search != map_.end()) {
1,407,824!
101
      match.bins_.push_back(search->second);
1,407,824✔
102
      match.weights_.push_back(1.0);
1,407,824✔
103
    }
104
  }
105
}
106

107
void CellInstanceFilter::to_statepoint(hid_t filter_group) const
16✔
108
{
109
  Filter::to_statepoint(filter_group);
16✔
110
  size_t n = cell_instances_.size();
16✔
111
  xt::xtensor<size_t, 2> data({n, 2});
16✔
112
  for (int64_t i = 0; i < n; ++i) {
336✔
113
    const auto& x = cell_instances_[i];
320✔
114
    data(i, 0) = model::cells[x.index_cell]->id_;
320✔
115
    data(i, 1) = x.instance;
320✔
116
  }
117
  write_dataset(filter_group, "bins", data);
16✔
118
}
16✔
119

120
std::string CellInstanceFilter::text_label(int bin) const
320✔
121
{
122
  const auto& x = cell_instances_[bin];
320✔
123
  auto cell_id = model::cells[x.index_cell]->id_;
320✔
124
  return "Cell " + std::to_string(cell_id) + ", Instance " +
640✔
125
         std::to_string(x.instance);
960✔
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

© 2026 Coveralls, Inc