Cardinal
OpenMCProblemBase.h
Go to the documentation of this file.
1 /********************************************************************/
2 /* SOFTWARE COPYRIGHT NOTIFICATION */
3 /* Cardinal */
4 /* */
5 /* (c) 2021 UChicago Argonne, LLC */
6 /* ALL RIGHTS RESERVED */
7 /* */
8 /* Prepared by UChicago Argonne, LLC */
9 /* Under Contract No. DE-AC02-06CH11357 */
10 /* With the U. S. Department of Energy */
11 /* */
12 /* Prepared by Battelle Energy Alliance, LLC */
13 /* Under Contract No. DE-AC07-05ID14517 */
14 /* With the U. S. Department of Energy */
15 /* */
16 /* See LICENSE for full restrictions */
17 /********************************************************************/
18 
19 #pragma once
20 
21 #define LIBMESH
22 
23 #include "CardinalProblem.h"
24 #include "PostprocessorInterface.h"
25 #include "CardinalEnums.h"
26 #include "OpenMCNuclideDensities.h"
27 #include "OpenMCTallyNuclides.h"
28 
29 #include "mpi.h"
30 #include "openmc/bank.h"
31 #include "openmc/capi.h"
32 #include "openmc/cell.h"
33 #include "openmc/geometry.h"
34 #include "openmc/geometry_aux.h"
35 #include "openmc/hdf5_interface.h"
36 #include "openmc/material.h"
37 #include "openmc/mesh.h"
38 #include "openmc/settings.h"
39 #include "openmc/simulation.h"
40 #include "openmc/source.h"
41 #include "openmc/state_point.h"
42 #include "openmc/tallies/tally.h"
43 #include "openmc/tallies/filter_cell_instance.h"
44 #include "xtensor/xview.hpp"
45 
49 class OpenMCProblemBase : public CardinalProblem, public PostprocessorInterface
50 {
51 public:
52  OpenMCProblemBase(const InputParameters & params);
53 
54  static InputParameters validParams();
55 
56  virtual ~OpenMCProblemBase() override;
57 
63  std::string subdomainName(const SubdomainID & id) const;
64 
70  void catchOpenMCError(const int & err, const std::string descriptor) const;
71 
76  bool isHeatingScore(const std::string & score) const;
77 
84  unsigned int addExternalVariable(const std::string & name, const std::vector<SubdomainName> * block = nullptr);
85 
90  const Real & scaling() const { return _scaling; }
91 
96  bool hasScaling() const { return _specified_scaling; }
97 
103  std::string enumToTallyScore(const std::string & score) const;
104 
110  std::string tallyScoreToEnum(const std::string & score) const;
111 
117  virtual void geometryType(bool & has_csg_universe, bool & has_dag_universe) const;
118 
120  bool firstSolve() const;
121 
127  openmc::TriggerMetric triggerMetric(trigger::TallyTriggerTypeEnum trigger) const;
128  openmc::TriggerMetric triggerMetric(std::string trigger) const;
129 
135  openmc::TallyEstimator tallyEstimator(tally::TallyEstimatorEnum estimator) const;
136 
142  std::string estimatorToString(openmc::TallyEstimator estimator) const;
143 
145  void externalSolve() override;
146 
148  void importProperties() const;
149 
162  xt::xtensor<double, 1> tallySum(openmc::Tally * tally, const unsigned int & score) const;
163 
170  double tallySumAcrossBins(std::vector<openmc::Tally *> tally, const unsigned int & score) const;
171 
178  double tallyMeanAcrossBins(std::vector<openmc::Tally *> tally, const unsigned int & score) const;
179 
184  typedef std::pair<int32_t, int32_t> cellInfo;
185 
191  bool cellIsVoid(const cellInfo & cell_info) const;
192 
198  bool cellHasZeroInstances(const cellInfo & cell_info) const;
199 
206  std::string materialName(const int32_t index) const;
207 
214  xt::xtensor<double, 1> relativeError(const xt::xtensor<double, 1> & sum,
215  const xt::xtensor<double, 1> & sum_sq, const int & n_realizations) const;
216 
221  const Real & densityConversionFactor() const { return _density_conversion_factor; }
222 
227  int nParticles() const;
228 
233  int nTotalParticles() const { return _total_n_particles; }
234 
240  int32_t cellID(const int32_t index) const;
241 
247  int32_t materialID(const int32_t index) const;
248 
253  std::string printPoint(const Point & p) const;
254 
260  std::string printMaterial(const int32_t & index) const;
261 
266  void writeSourceBank(const std::string & filename);
267 
274  unsigned int numElemsInSubdomain(const SubdomainID & id) const;
275 
280  bool isLocalElem(const Elem * elem) const;
281 
287  unsigned int globalElemID(const unsigned int & id) const { return _local_to_global_elem[id]; }
288 
298  virtual void setCellTemperature(const int32_t & id, const int32_t & instance, const Real & T,
299  const cellInfo & cell_info) const;
300 
306  virtual void setCellDensity(const Real & density, const cellInfo & cell_info) const;
307 
314  virtual std::string printCell(const cellInfo & cell_info, const bool brief = false) const;
315 
322  virtual std::vector<int32_t> cellFill(const cellInfo & cell_info, int & fill_type) const;
323 
331  bool materialFill(const cellInfo & cell_info, int32_t & material_index) const;
332 
337  long unsigned int numCells() const;
338 
339 protected:
341  void getOpenMCUserObjects();
342 
345 
348 
355  void fillElementalAuxVariable(const unsigned int & var_num,
356  const std::vector<unsigned int> & elem_ids,
357  const Real & value);
358 
363  std::string sourceBankFileName() const
364  {
365  return openmc::settings::path_output + "initial_source_" +
366  std::to_string(_fixed_point_iteration) + ".h5";
367  }
368 
370  const bool & _verbose;
371 
373  const Real * _power;
374 
376  const Real * _source_strength;
377 
386 
388  const bool _specified_scaling;
389 
409  const Real & _scaling;
410 
412  const bool & _skip_statepoint;
413 
421 
423  unsigned int _total_n_particles;
424 
426  long unsigned int _n_openmc_cells;
427 
435 
437  openmc::RunMode _run_mode;
438 
440  std::vector<OpenMCNuclideDensities *> _nuclide_densities_uos;
441 
443  std::vector<OpenMCTallyNuclides *> _tally_nuclides_uos;
444 
446  std::vector<unsigned int> _local_to_global_elem;
447 
449  static constexpr Real _density_conversion_factor{0.001};
450 
452  static constexpr int MATERIAL_VOID{-1};
453 };
OpenMCProblemBase::_scaling
const Real & _scaling
Definition: OpenMCProblemBase.h:409
CardinalProblem.h
OpenMCProblemBase::validParams
static InputParameters validParams()
OpenMCProblemBase::sourceBankFileName
std::string sourceBankFileName() const
Definition: OpenMCProblemBase.h:363
OpenMCProblemBase::fillElementalAuxVariable
void fillElementalAuxVariable(const unsigned int &var_num, const std::vector< unsigned int > &elem_ids, const Real &value)
OpenMCProblemBase::isHeatingScore
bool isHeatingScore(const std::string &score) const
OpenMCProblemBase::nParticles
int nParticles() const
OpenMCProblemBase::sendNuclideDensitiesToOpenMC
void sendNuclideDensitiesToOpenMC()
Set the nuclide densities for any materials being modified via MOOSE.
OpenMCProblemBase::geometryType
virtual void geometryType(bool &has_csg_universe, bool &has_dag_universe) const
OpenMCProblemBase::globalElemID
unsigned int globalElemID(const unsigned int &id) const
Definition: OpenMCProblemBase.h:287
OpenMCProblemBase::cellHasZeroInstances
bool cellHasZeroInstances(const cellInfo &cell_info) const
OpenMCProblemBase::hasScaling
bool hasScaling() const
Definition: OpenMCProblemBase.h:96
OpenMCProblemBase::relativeError
xt::xtensor< double, 1 > relativeError(const xt::xtensor< double, 1 > &sum, const xt::xtensor< double, 1 > &sum_sq, const int &n_realizations) const
OpenMCProblemBase::getOpenMCUserObjects
void getOpenMCUserObjects()
Find all userobjects which are changing OpenMC data structures.
OpenMCProblemBase::catchOpenMCError
void catchOpenMCError(const int &err, const std::string descriptor) const
OpenMCProblemBase::cellID
int32_t cellID(const int32_t index) const
trigger::TallyTriggerTypeEnum
TallyTriggerTypeEnum
Type of trigger to apply.
Definition: CardinalEnums.h:162
OpenMCProblemBase::_nuclide_densities_uos
std::vector< OpenMCNuclideDensities * > _nuclide_densities_uos
Userobjects for changing OpenMC material compositions.
Definition: OpenMCProblemBase.h:440
coupling::density
@ density
Definition: CardinalEnums.h:177
OpenMCProblemBase::_density_conversion_factor
static constexpr Real _density_conversion_factor
Conversion unit to transfer between kg/m3 and g/cm3.
Definition: OpenMCProblemBase.h:449
OpenMCProblemBase::tallySum
xt::xtensor< double, 1 > tallySum(openmc::Tally *tally, const unsigned int &score) const
Compute the sum of a tally within each bin.
OpenMCProblemBase::cellInfo
std::pair< int32_t, int32_t > cellInfo
Definition: OpenMCProblemBase.h:184
OpenMCProblemBase::cellIsVoid
bool cellIsVoid(const cellInfo &cell_info) const
OpenMCProblemBase::_verbose
const bool & _verbose
Whether to print diagnostic information about model setup and the transfers.
Definition: OpenMCProblemBase.h:370
OpenMCProblemBase::externalSolve
void externalSolve() override
Run a k-eigenvalue OpenMC simulation.
OpenMCProblemBase::setCellDensity
virtual void setCellDensity(const Real &density, const cellInfo &cell_info) const
tally::TallyEstimatorEnum
TallyEstimatorEnum
Type of estimator to use for OpenMC tallies.
Definition: CardinalEnums.h:139
OpenMCProblemBase::_specified_scaling
const bool _specified_scaling
Whether a mesh scaling was specified by the user.
Definition: OpenMCProblemBase.h:388
OpenMCProblemBase::_skip_statepoint
const bool & _skip_statepoint
Whether to skip writing statepoints from OpenMC.
Definition: OpenMCProblemBase.h:412
OpenMCProblemBase::scaling
const Real & scaling() const
Definition: OpenMCProblemBase.h:90
OpenMCNuclideDensities.h
OpenMCProblemBase::densityConversionFactor
const Real & densityConversionFactor() const
Definition: OpenMCProblemBase.h:221
OpenMCProblemBase::subdomainName
std::string subdomainName(const SubdomainID &id) const
OpenMCProblemBase::materialName
std::string materialName(const int32_t index) const
OpenMCProblemBase::materialFill
bool materialFill(const cellInfo &cell_info, int32_t &material_index) const
OpenMCProblemBase::_power
const Real * _power
Power by which to normalize the OpenMC results, for k-eigenvalue mode.
Definition: OpenMCProblemBase.h:373
OpenMCProblemBase::writeSourceBank
void writeSourceBank(const std::string &filename)
OpenMCProblemBase::tallyEstimator
openmc::TallyEstimator tallyEstimator(tally::TallyEstimatorEnum estimator) const
CardinalEnums.h
OpenMCProblemBase::materialID
int32_t materialID(const int32_t index) const
OpenMCProblemBase
Definition: OpenMCProblemBase.h:49
OpenMCProblemBase::isLocalElem
bool isLocalElem(const Elem *elem) const
OpenMCProblemBase::sendTallyNuclidesToOpenMC
void sendTallyNuclidesToOpenMC()
Set the tally nuclides for any tallies being modified via MOOSE.
OpenMCProblemBase::_local_to_global_elem
std::vector< unsigned int > _local_to_global_elem
Mapping from local element indices to global element indices for this rank.
Definition: OpenMCProblemBase.h:446
OpenMCProblemBase::_total_n_particles
unsigned int _total_n_particles
Total number of particles simulated.
Definition: OpenMCProblemBase.h:423
OpenMCProblemBase::addExternalVariable
unsigned int addExternalVariable(const std::string &name, const std::vector< SubdomainName > *block=nullptr)
OpenMCProblemBase::OpenMCProblemBase
OpenMCProblemBase(const InputParameters &params)
OpenMCProblemBase::_fixed_point_iteration
int _fixed_point_iteration
Definition: OpenMCProblemBase.h:420
OpenMCProblemBase::printMaterial
std::string printMaterial(const int32_t &index) const
OpenMCProblemBase::printCell
virtual std::string printCell(const cellInfo &cell_info, const bool brief=false) const
CardinalProblem
Definition: CardinalProblem.h:26
OpenMCProblemBase::setCellTemperature
virtual void setCellTemperature(const int32_t &id, const int32_t &instance, const Real &T, const cellInfo &cell_info) const
OpenMCProblemBase::triggerMetric
openmc::TriggerMetric triggerMetric(trigger::TallyTriggerTypeEnum trigger) const
OpenMCProblemBase::printPoint
std::string printPoint(const Point &p) const
OpenMCProblemBase::_run_mode
openmc::RunMode _run_mode
OpenMC run mode.
Definition: OpenMCProblemBase.h:437
OpenMCProblemBase::firstSolve
bool firstSolve() const
Whether this is the first time OpenMC is running.
OpenMCProblemBase::numCells
long unsigned int numCells() const
OpenMCProblemBase::tallySumAcrossBins
double tallySumAcrossBins(std::vector< openmc::Tally * > tally, const unsigned int &score) const
OpenMCProblemBase::_source_strength
const Real * _source_strength
Source strength by which to normalize the OpenMC results, for fixed source mode.
Definition: OpenMCProblemBase.h:376
OpenMCProblemBase::~OpenMCProblemBase
virtual ~OpenMCProblemBase() override
OpenMCProblemBase::tallyScoreToEnum
std::string tallyScoreToEnum(const std::string &score) const
OpenMCProblemBase::estimatorToString
std::string estimatorToString(openmc::TallyEstimator estimator) const
OpenMCProblemBase::MATERIAL_VOID
static constexpr int MATERIAL_VOID
ID used by OpenMC to indicate that a material fill is VOID.
Definition: OpenMCProblemBase.h:452
OpenMCProblemBase::importProperties
void importProperties() const
Import temperature and density from a properties.h5 file.
OpenMCProblemBase::enumToTallyScore
std::string enumToTallyScore(const std::string &score) const
OpenMCTallyNuclides.h
OpenMCProblemBase::tallyMeanAcrossBins
double tallyMeanAcrossBins(std::vector< openmc::Tally * > tally, const unsigned int &score) const
OpenMCProblemBase::nTotalParticles
int nTotalParticles() const
Definition: OpenMCProblemBase.h:233
trigger
Definition: CardinalEnums.h:159
OpenMCProblemBase::cellFill
virtual std::vector< int32_t > cellFill(const cellInfo &cell_info, int &fill_type) const
OpenMCProblemBase::_n_cell_digits
int _n_cell_digits
Definition: OpenMCProblemBase.h:434
OpenMCProblemBase::_reuse_source
bool _reuse_source
Definition: OpenMCProblemBase.h:385
tally
Definition: CardinalEnums.h:128
OpenMCProblemBase::_tally_nuclides_uos
std::vector< OpenMCTallyNuclides * > _tally_nuclides_uos
Userobjects for changing OpenMC tally nuclides.
Definition: OpenMCProblemBase.h:443
OpenMCProblemBase::_n_openmc_cells
long unsigned int _n_openmc_cells
Total number of unique OpenMC cell IDs + instances combinations.
Definition: OpenMCProblemBase.h:426
OpenMCProblemBase::numElemsInSubdomain
unsigned int numElemsInSubdomain(const SubdomainID &id) const