Loading [MathJax]/extensions/tex2jax.js
Cardinal
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
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 
27 #include "mpi.h"
28 #include "openmc/bank.h"
29 #include "openmc/capi.h"
30 #include "openmc/cell.h"
31 #include "openmc/geometry.h"
32 #include "openmc/geometry_aux.h"
33 #include "openmc/hdf5_interface.h"
34 #include "openmc/material.h"
35 #include "openmc/mesh.h"
36 #include "openmc/settings.h"
37 #include "openmc/simulation.h"
38 #include "openmc/source.h"
39 #include "openmc/state_point.h"
40 #include "openmc/tallies/tally.h"
41 #include "openmc/tallies/filter_cell_instance.h"
42 #include "xtensor/xview.hpp"
43 
44 // Forward declarations to avoid cyclic dependencies.
47 class OpenMCTallyEditor;
48 
52 class OpenMCProblemBase : public CardinalProblem, public PostprocessorInterface
53 {
54 public:
55  OpenMCProblemBase(const InputParameters & params);
56 
57  static InputParameters validParams();
58 
59  virtual ~OpenMCProblemBase() override;
60 
66  std::string subdomainName(const SubdomainID & id) const;
67 
73  void catchOpenMCError(const int & err, const std::string descriptor) const;
74 
79  bool isReactionRateScore(const std::string & score) const;
80 
85  bool isHeatingScore(const std::string & score) const;
86 
93  unsigned int addExternalVariable(const std::string & name, const std::vector<SubdomainName> * block = nullptr);
94 
99  const Real & scaling() const { return _scaling; }
100 
105  bool hasScaling() const { return _specified_scaling; }
106 
112  std::string enumToTallyScore(const std::string & score) const;
113 
119  std::string tallyScoreToEnum(const std::string & score) const;
120 
126  virtual void geometryType(bool & has_csg_universe, bool & has_dag_universe) const;
127 
129  bool firstSolve() const;
130 
136  openmc::TriggerMetric triggerMetric(trigger::TallyTriggerTypeEnum trigger) const;
137  openmc::TriggerMetric triggerMetric(std::string trigger) const;
138 
144  openmc::TallyEstimator tallyEstimator(tally::TallyEstimatorEnum estimator) const;
145 
151  std::string estimatorToString(openmc::TallyEstimator estimator) const;
152 
154  void externalSolve() override;
155 
157  virtual void syncSolutions(ExternalProblem::Direction direction) override;
158  virtual bool adaptMesh() override;
159 
161  void importProperties() const;
162 
175  xt::xtensor<double, 1> tallySum(openmc::Tally * tally, const unsigned int & score) const;
176 
183  double tallySumAcrossBins(std::vector<openmc::Tally *> tally, const unsigned int & score) const;
184 
191  double tallyMeanAcrossBins(std::vector<openmc::Tally *> tally, const unsigned int & score) const;
192 
197  typedef std::pair<int32_t, int32_t> cellInfo;
198 
204  bool cellIsVoid(const cellInfo & cell_info) const;
205 
211  bool cellHasZeroInstances(const cellInfo & cell_info) const;
212 
219  std::string materialName(const int32_t index) const;
220 
227  xt::xtensor<double, 1> relativeError(const xt::xtensor<double, 1> & sum,
228  const xt::xtensor<double, 1> & sum_sq, const int & n_realizations) const;
229 
234  const Real & densityConversionFactor() const { return _density_conversion_factor; }
235 
240  int nParticles() const;
241 
246  int nTotalParticles() const { return _total_n_particles; }
247 
253  int32_t cellID(const int32_t index) const;
254 
260  int32_t materialID(const int32_t index) const;
261 
266  std::string printPoint(const Point & p) const;
267 
273  std::string printMaterial(const int32_t & index) const;
274 
279  void writeSourceBank(const std::string & filename);
280 
287  unsigned int numElemsInSubdomain(const SubdomainID & id) const;
288 
293  bool isLocalElem(const Elem * elem) const;
294 
300  unsigned int globalElemID(const unsigned int & id) const { return _local_to_global_elem[id]; }
301 
311  virtual void setCellTemperature(const int32_t & id, const int32_t & instance, const Real & T,
312  const cellInfo & cell_info) const;
313 
319  virtual void setCellDensity(const Real & density, const cellInfo & cell_info) const;
320 
327  virtual std::string printCell(const cellInfo & cell_info, const bool brief = false) const;
328 
335  virtual std::vector<int32_t> cellFill(const cellInfo & cell_info, int & fill_type) const;
336 
344  bool materialFill(const cellInfo & cell_info, int32_t & material_index) const;
345 
350  long unsigned int numCells() const;
351 
356  virtual std::vector<int32_t> getMappedTallyIDs() const = 0;
357 
363 
368  const openmc::Tally & getKineticsParamTally();
369 
370 protected:
372  void getOpenMCUserObjects();
373 
375  void checkOpenMCUserObjectIDs() const;
376 
378  void checkTallyEditorIDs() const;
379 
381  void executeFilterEditors();
382 
384  void executeTallyEditors();
385 
386  // execute tallly and filte editors
387  void executeEditors();
388 
391 
394 
401  void fillElementalAuxVariable(const unsigned int & var_num,
402  const std::vector<unsigned int> & elem_ids,
403  const Real & value);
404 
409  std::string sourceBankFileName() const
410  {
411  return openmc::settings::path_output + "initial_source_" +
412  std::to_string(_fixed_point_iteration) + ".h5";
413  }
414 
416  const bool & _verbose;
417 
419  const Real * _power;
420 
422  const Real * _source_strength;
423 
432 
434  const bool _specified_scaling;
435 
455  const Real & _scaling;
456 
458  const bool & _skip_statepoint;
459 
467 
469  unsigned int _total_n_particles;
470 
472  long unsigned int _n_openmc_cells;
473 
481 
483  openmc::RunMode _run_mode;
484 
486  std::vector<OpenMCNuclideDensities *> _nuclide_densities_uos;
487 
489  std::vector<OpenMCDomainFilterEditor *> _filter_editor_uos;
490 
492  std::vector<OpenMCTallyEditor *> _tally_editor_uos;
493 
495  std::vector<unsigned int> _local_to_global_elem;
496 
498  const bool _has_adaptivity;
499 
506 
509 
512 
514  openmc::Tally * _ifp_tally = nullptr;
515 
517  static constexpr Real _density_conversion_factor{0.001};
518 
520  static constexpr int MATERIAL_VOID{-1};
521 };
TallyTriggerTypeEnum
Type of trigger to apply.
Definition: CardinalEnums.h:173
unsigned int _total_n_particles
Total number of particles simulated.
Definition: OpenMCProblemBase.h:469
int _fixed_point_iteration
Definition: OpenMCProblemBase.h:466
std::string materialName(const int32_t index) const
bool isReactionRateScore(const std::string &score) const
void writeSourceBank(const std::string &filename)
double tallyMeanAcrossBins(std::vector< openmc::Tally * > tally, const unsigned int &score) const
const bool _specified_scaling
Whether a mesh scaling was specified by the user.
Definition: OpenMCProblemBase.h:434
const bool & _skip_statepoint
Whether to skip writing statepoints from OpenMC.
Definition: OpenMCProblemBase.h:458
const Real & densityConversionFactor() const
Definition: OpenMCProblemBase.h:234
const bool _calc_kinetics_params
A flag to indicate if OpenMC is calculating kinetics parameters.
Definition: OpenMCProblemBase.h:508
bool materialFill(const cellInfo &cell_info, int32_t &material_index) const
long unsigned int numCells() const
virtual ~OpenMCProblemBase() override
void checkOpenMCUserObjectIDs() const
Ensure that the IDs of OpenMC objects in UserObjects don't clash.
static InputParameters validParams()
int32_t materialID(const int32_t index) const
bool isHeatingScore(const std::string &score) const
Definition: OpenMCTallyEditor.h:30
unsigned int addExternalVariable(const std::string &name, const std::vector< SubdomainName > *block=nullptr)
virtual std::vector< int32_t > cellFill(const cellInfo &cell_info, int &fill_type) const
virtual bool adaptMesh() override
std::vector< unsigned int > _local_to_global_elem
Mapping from local element indices to global element indices for this rank.
Definition: OpenMCProblemBase.h:495
bool computeKineticsParams() const
Definition: OpenMCProblemBase.h:362
const bool _has_adaptivity
Whether or not the problem contains mesh adaptivity.
Definition: OpenMCProblemBase.h:498
std::string sourceBankFileName() const
Definition: OpenMCProblemBase.h:409
Definition: OpenMCNuclideDensities.h:28
OpenMCProblemBase(const InputParameters &params)
void sendNuclideDensitiesToOpenMC()
Set the nuclide densities for any materials being modified via MOOSE.
static constexpr int MATERIAL_VOID
ID used by OpenMC to indicate that a material fill is VOID.
Definition: OpenMCProblemBase.h:520
int _ifp_tally_index
The index of a global tally to accumulate the scores required for kinetics parameters.
Definition: OpenMCProblemBase.h:511
virtual void geometryType(bool &has_csg_universe, bool &has_dag_universe) const
virtual void setCellTemperature(const int32_t &id, const int32_t &instance, const Real &T, const cellInfo &cell_info) const
int _n_cell_digits
Definition: OpenMCProblemBase.h:480
void getOpenMCUserObjects()
Find all userobjects which are changing OpenMC data structures.
void checkTallyEditorIDs() const
Ensure that any tally editors don't apply to Cardinal-mapped tallies.
Definition: CardinalEnums.h:216
Definition: OpenMCDomainFilterEditor.h:32
xt::xtensor< double, 1 > relativeError(const xt::xtensor< double, 1 > &sum, const xt::xtensor< double, 1 > &sum_sq, const int &n_realizations) const
openmc::Tally * _ifp_tally
The global tally used to accumulate the scores required for kinetics parameters.
Definition: OpenMCProblemBase.h:514
std::vector< OpenMCTallyEditor * > _tally_editor_uos
Userobjects for creating/changing OpenMC tallies.
Definition: OpenMCProblemBase.h:492
int32_t cellID(const int32_t index) const
virtual std::string printCell(const cellInfo &cell_info, const bool brief=false) const
Definition: CardinalProblem.h:26
void executeTallyEditors()
Execute all tally editor userobjects.
openmc::TriggerMetric triggerMetric(trigger::TallyTriggerTypeEnum trigger) const
std::vector< OpenMCNuclideDensities * > _nuclide_densities_uos
Userobjects for changing OpenMC material compositions.
Definition: OpenMCProblemBase.h:486
const Real & scaling() const
Definition: OpenMCProblemBase.h:99
std::string printPoint(const Point &p) const
bool cellIsVoid(const cellInfo &cell_info) const
Definition: OpenMCProblemBase.h:52
void importProperties() const
Import temperature and density from a properties.h5 file.
TallyEstimatorEnum
Type of estimator to use for OpenMC tallies.
Definition: CardinalEnums.h:150
int nTotalParticles() const
Definition: OpenMCProblemBase.h:246
bool cellHasZeroInstances(const cellInfo &cell_info) const
const Real & _scaling
Definition: OpenMCProblemBase.h:455
static constexpr Real _density_conversion_factor
Conversion unit to transfer between kg/m3 and g/cm3.
Definition: OpenMCProblemBase.h:517
void sendTallyNuclidesToOpenMC()
Set the tally nuclides for any tallies being modified via MOOSE.
long unsigned int _n_openmc_cells
Total number of unique OpenMC cell IDs + instances combinations.
Definition: OpenMCProblemBase.h:472
unsigned int numElemsInSubdomain(const SubdomainID &id) const
bool hasScaling() const
Definition: OpenMCProblemBase.h:105
const bool & _verbose
Whether to print diagnostic information about model setup and the transfers.
Definition: OpenMCProblemBase.h:416
bool _reuse_source
Definition: OpenMCProblemBase.h:431
virtual void syncSolutions(ExternalProblem::Direction direction) override
Set the 'mesh changed' adaptivity flag.
void fillElementalAuxVariable(const unsigned int &var_num, const std::vector< unsigned int > &elem_ids, const Real &value)
const openmc::Tally & getKineticsParamTally()
std::vector< OpenMCDomainFilterEditor * > _filter_editor_uos
Userobjects for creating/changing OpenMC filters.
Definition: OpenMCProblemBase.h:489
int nParticles() const
xt::xtensor< double, 1 > tallySum(openmc::Tally *tally, const unsigned int &score) const
Compute the sum of a tally within each bin.
virtual std::vector< int32_t > getMappedTallyIDs() const =0
std::string printMaterial(const int32_t &index) const
openmc::TallyEstimator tallyEstimator(tally::TallyEstimatorEnum estimator) const
unsigned int globalElemID(const unsigned int &id) const
Definition: OpenMCProblemBase.h:300
Definition: CardinalEnums.h:170
bool _run_on_adaptivity_cycle
Definition: OpenMCProblemBase.h:505
std::string subdomainName(const SubdomainID &id) const
void catchOpenMCError(const int &err, const std::string descriptor) const
virtual void setCellDensity(const Real &density, const cellInfo &cell_info) const
Definition: CardinalEnums.h:140
bool firstSolve() const
Whether this is the first time OpenMC is running.
openmc::RunMode _run_mode
OpenMC run mode.
Definition: OpenMCProblemBase.h:483
const Real * _source_strength
Source strength by which to normalize the OpenMC results, for fixed source mode.
Definition: OpenMCProblemBase.h:422
std::pair< int32_t, int32_t > cellInfo
Definition: OpenMCProblemBase.h:197
std::string estimatorToString(openmc::TallyEstimator estimator) const
void externalSolve() override
Run a k-eigenvalue OpenMC simulation.
const Real * _power
Power by which to normalize the OpenMC results, for k-eigenvalue mode.
Definition: OpenMCProblemBase.h:419
void executeFilterEditors()
Execute all filter editor userobjects.
bool isLocalElem(const Elem *elem) const
std::string enumToTallyScore(const std::string &score) const
double tallySumAcrossBins(std::vector< openmc::Tally * > tally, const unsigned int &score) const
std::string tallyScoreToEnum(const std::string &score) const