diff --git a/include/openmc/mesh.h b/include/openmc/mesh.h index de556321f2..c88ffc3504 100644 --- a/include/openmc/mesh.h +++ b/include/openmc/mesh.h @@ -75,6 +75,8 @@ public: virtual ~Mesh() = default; // Methods + //! Perform any preparation needed to support use in mesh filters + virtual void prepare_for_tallies() {}; //! Update a position to the local coordinates of the mesh virtual void local_coords(Position& r) const {}; @@ -664,6 +666,9 @@ public: // Overridden Methods + //! Perform any preparation needed to support use in mesh filters + void prepare_for_tallies() override; + Position sample_element(int32_t bin, uint64_t* seed) const override; void bins_crossed(Position r0, Position r1, const Direction& u, diff --git a/src/mesh.cpp b/src/mesh.cpp index 34510b614e..cb6851d04d 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -2057,6 +2057,13 @@ void MOABMesh::initialize() } } } +} + +void MOABMesh::prepare_for_tallies() +{ + // if the KDTree has already been constructed, do nothing + if (kdtree_) + return; // build acceleration data structures compute_barycentric_data(ehs_); diff --git a/src/tallies/filter_mesh.cpp b/src/tallies/filter_mesh.cpp index deb143346c..ed9c716673 100644 --- a/src/tallies/filter_mesh.cpp +++ b/src/tallies/filter_mesh.cpp @@ -77,8 +77,10 @@ std::string MeshFilter::text_label(int bin) const void MeshFilter::set_mesh(int32_t mesh) { + // perform any additional perparation for mesh tallies here mesh_ = mesh; n_bins_ = model::meshes[mesh_]->n_bins(); + model::meshes[mesh_]->prepare_for_tallies(); } void MeshFilter::set_translation(const Position& translation)