From 0f69ee305ff82c54e131fb3af908ab74e29a73b4 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 13 Jul 2020 12:27:23 +0100 Subject: [PATCH 1/4] Support 2D projections Supply the required projection as a basis of either xyz, ry, or rz. If the basis is 2D then project the cross section of the plasma onto the provided dimensions. --- parametric_plasma_source/source_sampling.cpp | 22 +++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/parametric_plasma_source/source_sampling.cpp b/parametric_plasma_source/source_sampling.cpp index 70d8a76..ab91a00 100644 --- a/parametric_plasma_source/source_sampling.cpp +++ b/parametric_plasma_source/source_sampling.cpp @@ -24,6 +24,7 @@ const double shafranov_shift = 0.0; //metres const std::string name = "parametric_plasma_source"; const int number_of_bins = 100; const int plasma_type = 1; // 1 is default; //0 = L mode anything else H/A mode +const std::string basis = "xyz"; // xyz for 3D, ry or rz for 2D @@ -70,9 +71,28 @@ extern "C" openmc::Particle::Bank sample_source(uint64_t* seed) { source.SampleSource(randoms,particle.r.x,particle.r.y,particle.r.z, u,v,w,E); + // Convert m to cm particle.r.x *= 100.; particle.r.y *= 100.; - particle.r.z *= 100.; + particle.r.z *= 100.; + + if(basis == "xyz") { + // Use values as-is + } + else if(basis == "ry") { + particle.r.x = std::sqrt(std::pow(particle.r.x, 2) + std::pow(particle.r.y, 2)); + particle.r.y = particle.r.z; + particle.r.z = 0.; + } + else if(basis == "rz") { + particle.r.x = std::sqrt(std::pow(particle.r.x, 2) + std::pow(particle.r.y, 2)); + particle.r.y = 0.; + particle.r.z = particle.r.z; + } + else { + throw std::runtime_error("Parametric plasma source: incorrect basis provided, " + "please use xyz, xy, or xz."); + } // particle.E = 14.08e6; particle.E = E*1e6; // convert from MeV -> eV From 153db913882e1bb34636ab8b65be192887cb4c61 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 13 Jul 2020 12:46:14 +0100 Subject: [PATCH 2/4] Fix error message --- parametric_plasma_source/source_sampling.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parametric_plasma_source/source_sampling.cpp b/parametric_plasma_source/source_sampling.cpp index ab91a00..cc562a3 100644 --- a/parametric_plasma_source/source_sampling.cpp +++ b/parametric_plasma_source/source_sampling.cpp @@ -91,7 +91,7 @@ extern "C" openmc::Particle::Bank sample_source(uint64_t* seed) { } else { throw std::runtime_error("Parametric plasma source: incorrect basis provided, " - "please use xyz, xy, or xz."); + "please use xyz, ry, or rz."); } // particle.E = 14.08e6; From ae81a0489b70f6eb7c9a5009d6cf0a394290eee0 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 29 Jul 2020 09:11:52 +0100 Subject: [PATCH 3/4] Constrain basis selection using enum --- parametric_plasma_source/enums.hpp | 10 ++++++++++ parametric_plasma_source/source_sampling.cpp | 11 ++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 parametric_plasma_source/enums.hpp diff --git a/parametric_plasma_source/enums.hpp b/parametric_plasma_source/enums.hpp new file mode 100644 index 0000000..183d131 --- /dev/null +++ b/parametric_plasma_source/enums.hpp @@ -0,0 +1,10 @@ +namespace plasma_source { + + // Defines a selection of valid basis values to sample from. + enum valid_basis { + XYZ, // 3-D basis + RY, // 2-D basis in radial plane along y-axis + RZ, // 2-D basis in radial plane along z-axis + }; + +} diff --git a/parametric_plasma_source/source_sampling.cpp b/parametric_plasma_source/source_sampling.cpp index cc562a3..50c0887 100644 --- a/parametric_plasma_source/source_sampling.cpp +++ b/parametric_plasma_source/source_sampling.cpp @@ -3,6 +3,7 @@ #include "openmc/source.h" #include "openmc/particle.h" #include "plasma_source.hpp" +#include "enums.hpp" // Spherical tokamak SOURCE @@ -24,7 +25,7 @@ const double shafranov_shift = 0.0; //metres const std::string name = "parametric_plasma_source"; const int number_of_bins = 100; const int plasma_type = 1; // 1 is default; //0 = L mode anything else H/A mode -const std::string basis = "xyz"; // xyz for 3D, ry or rz for 2D +const plasma_source::valid_basis basis = plasma_source::valid_basis::XYZ; // XYZ for 3D, RY or RZ for 2D @@ -76,22 +77,22 @@ extern "C" openmc::Particle::Bank sample_source(uint64_t* seed) { particle.r.y *= 100.; particle.r.z *= 100.; - if(basis == "xyz") { + if(basis == plasma_source::valid_basis::XYZ) { // Use values as-is } - else if(basis == "ry") { + else if(basis == plasma_source::valid_basis::RY) { particle.r.x = std::sqrt(std::pow(particle.r.x, 2) + std::pow(particle.r.y, 2)); particle.r.y = particle.r.z; particle.r.z = 0.; } - else if(basis == "rz") { + else if(basis == plasma_source::valid_basis::RZ) { particle.r.x = std::sqrt(std::pow(particle.r.x, 2) + std::pow(particle.r.y, 2)); particle.r.y = 0.; particle.r.z = particle.r.z; } else { throw std::runtime_error("Parametric plasma source: incorrect basis provided, " - "please use xyz, ry, or rz."); + "please use XYZ, RY, or RZ."); } // particle.E = 14.08e6; From d94d7ccea624bbebaebc2c595d5656d58d605c6a Mon Sep 17 00:00:00 2001 From: Dan Short Date: Wed, 29 Jul 2020 09:11:52 +0100 Subject: [PATCH 4/4] Constrain basis selection using enum --- parametric_plasma_source/enums.hpp | 10 ++++++++++ parametric_plasma_source/source_sampling.cpp | 11 ++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 parametric_plasma_source/enums.hpp diff --git a/parametric_plasma_source/enums.hpp b/parametric_plasma_source/enums.hpp new file mode 100644 index 0000000..183d131 --- /dev/null +++ b/parametric_plasma_source/enums.hpp @@ -0,0 +1,10 @@ +namespace plasma_source { + + // Defines a selection of valid basis values to sample from. + enum valid_basis { + XYZ, // 3-D basis + RY, // 2-D basis in radial plane along y-axis + RZ, // 2-D basis in radial plane along z-axis + }; + +} diff --git a/parametric_plasma_source/source_sampling.cpp b/parametric_plasma_source/source_sampling.cpp index cc562a3..50c0887 100644 --- a/parametric_plasma_source/source_sampling.cpp +++ b/parametric_plasma_source/source_sampling.cpp @@ -3,6 +3,7 @@ #include "openmc/source.h" #include "openmc/particle.h" #include "plasma_source.hpp" +#include "enums.hpp" // Spherical tokamak SOURCE @@ -24,7 +25,7 @@ const double shafranov_shift = 0.0; //metres const std::string name = "parametric_plasma_source"; const int number_of_bins = 100; const int plasma_type = 1; // 1 is default; //0 = L mode anything else H/A mode -const std::string basis = "xyz"; // xyz for 3D, ry or rz for 2D +const plasma_source::valid_basis basis = plasma_source::valid_basis::XYZ; // XYZ for 3D, RY or RZ for 2D @@ -76,22 +77,22 @@ extern "C" openmc::Particle::Bank sample_source(uint64_t* seed) { particle.r.y *= 100.; particle.r.z *= 100.; - if(basis == "xyz") { + if(basis == plasma_source::valid_basis::XYZ) { // Use values as-is } - else if(basis == "ry") { + else if(basis == plasma_source::valid_basis::RY) { particle.r.x = std::sqrt(std::pow(particle.r.x, 2) + std::pow(particle.r.y, 2)); particle.r.y = particle.r.z; particle.r.z = 0.; } - else if(basis == "rz") { + else if(basis == plasma_source::valid_basis::RZ) { particle.r.x = std::sqrt(std::pow(particle.r.x, 2) + std::pow(particle.r.y, 2)); particle.r.y = 0.; particle.r.z = particle.r.z; } else { throw std::runtime_error("Parametric plasma source: incorrect basis provided, " - "please use xyz, ry, or rz."); + "please use XYZ, RY, or RZ."); } // particle.E = 14.08e6;