mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-27 21:55:41 -04:00
Reduce code duplication with TallyFilter::type()
This commit is contained in:
parent
f2a5e10c46
commit
9d0c1ff7e2
9 changed files with 53 additions and 81 deletions
|
|
@ -375,5 +375,11 @@ write_dataset(hid_t obj_id, const char* name, Position r)
|
|||
write_dataset(obj_id, name, buffer);
|
||||
}
|
||||
|
||||
inline void
|
||||
write_dataset(hid_t obj_id, const char* name, std::string buffer)
|
||||
{
|
||||
write_string(obj_id, name, buffer.c_str(), false);
|
||||
}
|
||||
|
||||
} // namespace openmc
|
||||
#endif // OPENMC_HDF5_INTERFACE_H
|
||||
|
|
|
|||
|
|
@ -32,10 +32,10 @@ extern std::vector<TallyFilter*> tally_filters;
|
|||
class TallyFilterMatch
|
||||
{
|
||||
public:
|
||||
int i_bin;
|
||||
//int i_bin;
|
||||
std::vector<int> bins;
|
||||
std::vector<double> weights;
|
||||
bool bins_present;
|
||||
//bool bins_present;
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
|
|
@ -45,6 +45,8 @@ public:
|
|||
class TallyFilter
|
||||
{
|
||||
public:
|
||||
virtual std::string type() const = 0;
|
||||
|
||||
virtual ~TallyFilter() = 0;
|
||||
|
||||
virtual void from_xml(pugi::xml_node node) = 0;
|
||||
|
|
@ -52,7 +54,12 @@ public:
|
|||
virtual void
|
||||
get_all_bins(Particle* p, int estimator, TallyFilterMatch& match) const = 0;
|
||||
|
||||
virtual void to_statepoint(hid_t filter_group) const {}
|
||||
virtual void
|
||||
to_statepoint(hid_t filter_group) const
|
||||
{
|
||||
write_dataset(filter_group, "type", type());
|
||||
write_dataset(filter_group, "n_bins", n_bins_);
|
||||
}
|
||||
|
||||
virtual std::string text_label(int bin) const = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -16,6 +16,8 @@ namespace openmc {
|
|||
class CellFilter : public TallyFilter
|
||||
{
|
||||
public:
|
||||
virtual std::string type() const override {return "cell";}
|
||||
|
||||
virtual ~CellFilter() override = default;
|
||||
|
||||
virtual void
|
||||
|
|
@ -61,8 +63,7 @@ public:
|
|||
virtual void
|
||||
to_statepoint(hid_t filter_group) const override
|
||||
{
|
||||
write_dataset(filter_group, "type", "cell");
|
||||
write_dataset(filter_group, "n_bins", n_bins_);
|
||||
TallyFilter::to_statepoint(filter_group);
|
||||
std::vector<int32_t> cell_ids;
|
||||
for (auto c : cells_) cell_ids.push_back(cells[c]->id_);
|
||||
write_dataset(filter_group, "bins", cell_ids);
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@ namespace openmc {
|
|||
class CellbornFilter : public CellFilter
|
||||
{
|
||||
public:
|
||||
virtual std::string type() const override {return "cellborn";}
|
||||
|
||||
virtual void
|
||||
get_all_bins(Particle* p, int estimator, TallyFilterMatch& match)
|
||||
const override
|
||||
|
|
@ -20,16 +22,6 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
virtual void
|
||||
to_statepoint(hid_t filter_group) const override
|
||||
{
|
||||
write_dataset(filter_group, "type", "cellborn");
|
||||
write_dataset(filter_group, "n_bins", n_bins_);
|
||||
std::vector<int32_t> cell_ids;
|
||||
for (auto c : cells_) cell_ids.push_back(cells[c]->id_);
|
||||
write_dataset(filter_group, "bins", cell_ids);
|
||||
}
|
||||
|
||||
virtual std::string
|
||||
text_label(int bin) const override
|
||||
{
|
||||
|
|
|
|||
|
|
@ -9,6 +9,8 @@ namespace openmc {
|
|||
class CellFromFilter : public CellFilter
|
||||
{
|
||||
public:
|
||||
virtual std::string type() const override {return "cellfrom";}
|
||||
|
||||
virtual void
|
||||
get_all_bins(Particle* p, int estimator, TallyFilterMatch& match)
|
||||
const override
|
||||
|
|
@ -23,16 +25,6 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
virtual void
|
||||
to_statepoint(hid_t filter_group) const override
|
||||
{
|
||||
write_dataset(filter_group, "type", "cellfrom");
|
||||
write_dataset(filter_group, "n_bins", cells_.size());
|
||||
std::vector<int32_t> cell_ids;
|
||||
for (auto c : cells_) cell_ids.push_back(cells[c]->id_);
|
||||
write_dataset(filter_group, "bins", cell_ids);
|
||||
}
|
||||
|
||||
virtual std::string
|
||||
text_label(int bin) const override
|
||||
{
|
||||
|
|
|
|||
|
|
@ -15,6 +15,8 @@ namespace openmc {
|
|||
class DistribcellFilter : public TallyFilter
|
||||
{
|
||||
public:
|
||||
virtual std::string type() const override {return "distribcell";}
|
||||
|
||||
virtual ~DistribcellFilter() override = default;
|
||||
|
||||
virtual void
|
||||
|
|
@ -72,8 +74,7 @@ public:
|
|||
virtual void
|
||||
to_statepoint(hid_t filter_group) const override
|
||||
{
|
||||
write_dataset(filter_group, "type", "distribcell");
|
||||
write_dataset(filter_group, "n_bins", n_bins_);
|
||||
TallyFilter::to_statepoint(filter_group);
|
||||
write_dataset(filter_group, "bins", cells[cell_]->id_);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,14 +15,18 @@ namespace openmc {
|
|||
class MeshFilter : public TallyFilter
|
||||
{
|
||||
public:
|
||||
virtual std::string type() const override {return "mesh";}
|
||||
|
||||
virtual ~MeshFilter() override = default;
|
||||
|
||||
virtual void
|
||||
from_xml(pugi::xml_node node) override
|
||||
{
|
||||
auto bins_ = get_node_array<int32_t>(node, "bins");
|
||||
if (bins_.size() != 1)
|
||||
fatal_error("Only one mesh can be specified per mesh filter.");
|
||||
if (bins_.size() != 1) {
|
||||
fatal_error("Only one mesh can be specified per " + type()
|
||||
+ " mesh filter.");
|
||||
}
|
||||
|
||||
auto id = bins_[0];
|
||||
auto search = mesh_map.find(id);
|
||||
|
|
@ -56,8 +60,7 @@ public:
|
|||
virtual void
|
||||
to_statepoint(hid_t filter_group) const override
|
||||
{
|
||||
write_dataset(filter_group, "type", "mesh");
|
||||
write_dataset(filter_group, "n_bins", n_bins_);
|
||||
TallyFilter::to_statepoint(filter_group);
|
||||
write_dataset(filter_group, "bins", meshes[mesh_]->id_);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -7,33 +7,20 @@
|
|||
#include "openmc/constants.h"
|
||||
#include "openmc/error.h"
|
||||
#include "openmc/mesh.h"
|
||||
#include "openmc/tallies/tally_filter.h"
|
||||
#include "openmc/tallies/tally_filter_mesh.h"
|
||||
|
||||
|
||||
namespace openmc {
|
||||
|
||||
class MeshSurfaceFilter : public TallyFilter
|
||||
class MeshSurfaceFilter : public MeshFilter
|
||||
{
|
||||
public:
|
||||
virtual ~MeshSurfaceFilter() override = default;
|
||||
virtual std::string type() const override {return "meshsurface";}
|
||||
|
||||
virtual void
|
||||
from_xml(pugi::xml_node node) override
|
||||
{
|
||||
auto bins_ = get_node_array<int32_t>(node, "bins");
|
||||
if (bins_.size() != 1)
|
||||
fatal_error("Only one mesh can be specified per mesh filter.");
|
||||
|
||||
auto id = bins_[0];
|
||||
auto search = mesh_map.find(id);
|
||||
if (search != mesh_map.end()) {
|
||||
mesh_ = search->second;
|
||||
} else{
|
||||
std::stringstream err_msg;
|
||||
err_msg << "Could not find cell " << id << " specified on tally filter.";
|
||||
fatal_error(err_msg);
|
||||
}
|
||||
|
||||
MeshFilter::from_xml(node);
|
||||
n_bins_ = 4 * meshes[mesh_]->n_dimension_;;
|
||||
for (auto dim : meshes[mesh_]->shape_) n_bins_ *= dim;
|
||||
}
|
||||
|
|
@ -46,14 +33,6 @@ public:
|
|||
for (auto b : match.bins) match.weights.push_back(1.0);
|
||||
}
|
||||
|
||||
virtual void
|
||||
to_statepoint(hid_t filter_group) const override
|
||||
{
|
||||
write_dataset(filter_group, "type", "meshsurface");
|
||||
write_dataset(filter_group, "n_bins", n_bins_);
|
||||
write_dataset(filter_group, "bins", meshes[mesh_]->id_);
|
||||
}
|
||||
|
||||
virtual std::string
|
||||
text_label(int bin) const override
|
||||
{
|
||||
|
|
@ -65,45 +44,37 @@ public:
|
|||
int i_surf = ((bin - 1) % (4 * n_dim)) + 1;
|
||||
|
||||
// Get mesh index part of label.
|
||||
int ijk[n_dim];
|
||||
mesh.get_indices_from_bin(i_mesh, ijk);
|
||||
std::stringstream out;
|
||||
out << "Mesh Index (" << ijk[0];
|
||||
if (n_dim > 1) out << ", " << ijk[1];
|
||||
if (n_dim > 2) out << ", " << ijk[2];
|
||||
out << ")";
|
||||
std::string out = MeshFilter::text_label(i_mesh);
|
||||
|
||||
// Get surface part of label.
|
||||
if (i_surf == OUT_LEFT) {
|
||||
out << " Outgoing, x-min";
|
||||
out += " Outgoing, x-min";
|
||||
} else if (i_surf == IN_LEFT) {
|
||||
out << " Incoming, x-min";
|
||||
out += " Incoming, x-min";
|
||||
} else if (i_surf == OUT_RIGHT) {
|
||||
out << " Outgoing, x-max";
|
||||
out += " Outgoing, x-max";
|
||||
} else if (i_surf == IN_RIGHT) {
|
||||
out << " Incoming, x-max";
|
||||
out += " Incoming, x-max";
|
||||
} else if (i_surf == OUT_BACK) {
|
||||
out << " Outgoing, y-min";
|
||||
out += " Outgoing, y-min";
|
||||
} else if (i_surf == IN_BACK) {
|
||||
out << " Incoming, y-min";
|
||||
out += " Incoming, y-min";
|
||||
} else if (i_surf == OUT_FRONT) {
|
||||
out << " Outgoing, y-max";
|
||||
out += " Outgoing, y-max";
|
||||
} else if (i_surf == IN_FRONT) {
|
||||
out << " Incoming, y-max";
|
||||
out += " Incoming, y-max";
|
||||
} else if (i_surf == OUT_BOTTOM) {
|
||||
out << " Outgoing, z-min";
|
||||
out += " Outgoing, z-min";
|
||||
} else if (i_surf == IN_BOTTOM) {
|
||||
out << " Incoming, z-min";
|
||||
out += " Incoming, z-min";
|
||||
} else if (i_surf == OUT_TOP) {
|
||||
out << " Outgoing, z-max";
|
||||
out += " Outgoing, z-max";
|
||||
} else if (i_surf == IN_TOP) {
|
||||
out << " Incoming, z-max";
|
||||
out += " Incoming, z-max";
|
||||
}
|
||||
|
||||
return out.str();
|
||||
return out;
|
||||
}
|
||||
|
||||
int32_t mesh_;
|
||||
};
|
||||
|
||||
} // namespace openmc
|
||||
|
|
|
|||
|
|
@ -188,9 +188,8 @@ prepare_distribcell()
|
|||
// Find all cells listed in a DistribcellFilter.
|
||||
std::unordered_set<int32_t> distribcells;
|
||||
for (auto* filt : tally_filters) {
|
||||
//TODO: replace this cast
|
||||
auto* distrib_filt = dynamic_cast<DistribcellFilter*>(filt);
|
||||
if (distrib_filt) {
|
||||
if (filt->type() == "distribcell") {
|
||||
auto* distrib_filt = static_cast<DistribcellFilter*>(filt);
|
||||
distribcells.insert(distrib_filt->cell_);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue