Reduce code duplication with TallyFilter::type()

This commit is contained in:
Sterling Harper 2018-10-11 23:06:47 -04:00
parent f2a5e10c46
commit 9d0c1ff7e2
9 changed files with 53 additions and 81 deletions

View file

@ -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

View file

@ -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;

View file

@ -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);

View file

@ -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
{

View file

@ -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
{

View file

@ -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_);
}

View file

@ -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_);
}

View file

@ -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

View file

@ -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_);
}
}