From 805c336597822d8c5281c5c19824ef796d12aa30 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 18 Mar 2019 10:07:18 -0500 Subject: [PATCH] Updating template parameter, moving generate_dat def to header, renaming generate_data->gen_map and removing additional indirection. --- include/openmc/plot.h | 78 +++++++++++++++++++++++++++++++++++---- src/plot.cpp | 85 ++----------------------------------------- 2 files changed, 75 insertions(+), 88 deletions(-) diff --git a/include/openmc/plot.h b/include/openmc/plot.h index f6f8c7ea7..2e56c9658 100644 --- a/include/openmc/plot.h +++ b/include/openmc/plot.h @@ -10,6 +10,8 @@ #include "hdf5.h" #include "openmc/position.h" #include "openmc/constants.h" +#include "openmc/cell.h" +#include "openmc/geometry.h" #include "openmc/particle.h" #include "openmc/xml_interface.h" @@ -96,14 +98,8 @@ enum class PlotColorBy { //=============================================================================== class PlotBase { - // Methods public: - IdData get_id_map() const; - PropertyData get_property_map() const; - - private: - template - D generate_data() const; + template T get_map() const; // Members public: @@ -114,6 +110,74 @@ class PlotBase int level_; //!< Plot universe level }; +template +T PlotBase::get_map() const { + + size_t width = pixels_[0]; + size_t height = pixels_[1]; + + // get pixel size + double in_pixel = (width_[0])/static_cast(width); + double out_pixel = (width_[1])/static_cast(height); + + // size data array + T data(width, height); + + // setup basis indices and initial position centered on pixel + int in_i, out_i; + Position xyz = origin_; + switch(basis_) { + case PlotBasis::xy : + in_i = 0; + out_i = 1; + break; + case PlotBasis::xz : + in_i = 0; + out_i = 2; + break; + case PlotBasis::yz : + in_i = 1; + out_i = 2; + break; + } + + // set initial position + xyz[in_i] = origin_[in_i] - width_[0] / 2. + in_pixel / 2.; + xyz[out_i] = origin_[out_i] + width_[1] / 2. - out_pixel / 2.; + + // arbitrary direction + Direction dir = {0.5, 0.5, 0.5}; + + #pragma omp parallel + { + Particle p; + p.r() = xyz; + p.u() = dir; + p.coord_[0].universe = model::root_universe; + int level = level_; + int j{}; + + #pragma omp for + for (int y = 0; y < height; y++) { + p.r()[out_i] = xyz[out_i] - out_pixel * y; + for (int x = 0; x < width; x++) { + p.r()[in_i] = xyz[in_i] + in_pixel * x; + p.n_coord_ = 1; + // local variables + bool found_cell = find_cell(&p, 0); + j = p.n_coord_ - 1; + if (level >=0) {j = level + 1;} + if (found_cell) { + data.set_value(y, x, p, j); + Cell* c = model::cells[p.coord_[j].cell].get(); + } + } // inner for + } // outer for + } // omp parallel + + return data; +} + class Plot : public PlotBase { diff --git a/src/plot.cpp b/src/plot.cpp index 9b5f5c3bc..0d43d1b8d 100644 --- a/src/plot.cpp +++ b/src/plot.cpp @@ -6,7 +6,6 @@ #include "xtensor/xview.hpp" -#include "openmc/cell.h" #include "openmc/constants.h" #include "openmc/file_utils.h" #include "openmc/geometry.h" @@ -137,7 +136,7 @@ void create_ppm(Plot pl) ImageData data({width, height}, pl.not_found_); // generate ids for the plot - auto ids = pl.get_id_map(); + auto ids = pl.get_map(); // assign colors for (int y = 0; y < height; y++) { @@ -639,82 +638,6 @@ Plot::Plot(pugi::xml_node plot_node) set_mask(plot_node); } // End Plot constructor -template -D PlotBase::generate_data() const { - - size_t width = pixels_[0]; - size_t height = pixels_[1]; - - // get pixel size - double in_pixel = (width_[0])/static_cast(width); - double out_pixel = (width_[1])/static_cast(height); - - // size data array - D data(width, height); - - // setup basis indices and initial position centered on pixel - int in_i, out_i; - Position xyz = origin_; - switch(basis_) { - case PlotBasis::xy : - in_i = 0; - out_i = 1; - break; - case PlotBasis::xz : - in_i = 0; - out_i = 2; - break; - case PlotBasis::yz : - in_i = 1; - out_i = 2; - break; - } - - // set initial position - xyz[in_i] = origin_[in_i] - width_[0] / 2. + in_pixel / 2.; - xyz[out_i] = origin_[out_i] + width_[1] / 2. - out_pixel / 2.; - - // arbitrary direction - Direction dir = {0.5, 0.5, 0.5}; - -#pragma omp parallel -{ - Particle p; - p.r() = xyz; - p.u() = dir; - p.coord_[0].universe = model::root_universe; - int level = level_; - int j{}; - - #pragma omp for - for (int y = 0; y < height; y++) { - p.r()[out_i] = xyz[out_i] - out_pixel * y; - for (int x = 0; x < width; x++) { - p.r()[in_i] = xyz[in_i] + in_pixel * x; - p.n_coord_ = 1; - // local variables - bool found_cell = find_cell(&p, 0); - j = p.n_coord_ - 1; - if (level >=0) {j = level + 1;} - if (found_cell) { - data.set_value(y, x, p, j); - Cell* c = model::cells[p.coord_[j].cell].get(); - } - } // inner for - } // outer for - } // omp parallel - - return data; -} - -IdData PlotBase::get_id_map() const { - return generate_data(); -} - -PropertyData PlotBase::get_property_map() const { - return generate_data(); -} - //============================================================================== // OUTPUT_PPM writes out a previously generated image to a PPM file //============================================================================== @@ -913,7 +836,7 @@ void create_voxel(Plot pl) pltbase.origin_.z = ll.z + z * vox[2]; // generate ids using plotbase - IdData ids = pltbase.get_id_map(); + IdData ids = pltbase.get_map(); // select only cell ID data and flip the y-axis xt::xtensor data1 = xt::flip(xt::view(ids.data_, xt::all(), xt::all(), 0), 0); @@ -976,7 +899,7 @@ extern "C" int openmc_id_map(const void* plot, int32_t* data_out) return OPENMC_E_INVALID_ARGUMENT; } - auto ids = plt->get_id_map(); + auto ids = plt->get_map(); // write id data to array std::copy(ids.data_.begin(), ids.data_.end(), data_out); @@ -992,7 +915,7 @@ extern "C" int openmc_property_map(const void* plot, double* data_out) { return OPENMC_E_INVALID_ARGUMENT; } - auto props = plt->get_property_map(); + auto props = plt->get_map(); // write id data to array std::copy(props.data_.begin(), props.data_.end(), data_out);