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 
27 #include "mpi.h"
28 #include "openmc/bank.h"
29 #include "openmc/capi.h"
30 #include "openmc/cell.h"
31 #include "openmc/constants.h"
32 #include "openmc/geometry.h"
33 #include "openmc/geometry_aux.h"
34 #include "openmc/hdf5_interface.h"
35 #include "openmc/material.h"
36 #include "openmc/mesh.h"
37 #include "openmc/settings.h"
38 #include "openmc/simulation.h"
39 #include "openmc/random_ray/random_ray_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 
45 // Forward declarations to avoid cyclic dependencies.
48 class OpenMCTallyEditor;
49 class OpenMCCellTransform;
52 
53 typedef openmc::tensor::Tensor<double> OMCTensor;
54 
58 class OpenMCProblemBase : public CardinalProblem, public PostprocessorInterface
59 {
60 public:
61  OpenMCProblemBase(const InputParameters & params);
62 
63  static InputParameters validParams();
64 
65  virtual ~OpenMCProblemBase() override;
66 
72  std::string subdomainName(const SubdomainID & id) const;
73 
78  bool isReactionRateScore(const std::string & score) const;
79 
84  bool isHeatingScore(const std::string & score) const;
85 
90  Real tallyNormalizationValue() const;
91 
96  bool validRandomRayScore(const std::string & score) const;
97 
105  unsigned int addExternalVariable(const std::string & name,
106  const std::string & system,
107  const std::vector<SubdomainName> * block = nullptr);
108 
113  const Real & scaling() const { return _scaling; }
114 
119  bool hasScaling() const { return _specified_scaling; }
120 
126  bool runRandomRay() const;
127 
133  std::string enumToTallyScore(const std::string & score) const;
134 
140  std::string tallyScoreToEnum(const std::string & score) const;
141 
147  virtual void geometryType(bool & has_csg_universe, bool & has_dag_universe) const;
148 
150  bool firstSolve() const;
151 
157  openmc::TriggerMetric triggerMetric(trigger::TallyTriggerTypeEnum trigger) const;
158  openmc::TriggerMetric triggerMetric(std::string trigger) const;
159 
165  openmc::TallyEstimator tallyEstimator(tally::TallyEstimatorEnum estimator) const;
166 
172  std::string estimatorToString(openmc::TallyEstimator estimator) const;
173 
175  void externalSolve() override;
176 
178  virtual void initialSetup() override;
179 
181  virtual void syncSolutions(ExternalProblem::Direction direction) override;
182  virtual bool adaptMesh() override;
183 
185  void importProperties() const;
186 
199  OMCTensor tallySum(const openmc::Tally * tally, const unsigned int & score) const;
200 
207  double tallySumAcrossBins(std::vector<const openmc::Tally *> tally,
208  const unsigned int & score) const;
209 
216  double tallyMeanAcrossBins(std::vector<const openmc::Tally *> tally,
217  const unsigned int & score) const;
218 
223  typedef std::pair<int32_t, int32_t> cellInfo;
224 
230  bool cellIsVoid(const cellInfo & cell_info) const;
231 
237  bool cellHasZeroInstances(const cellInfo & cell_info) const;
238 
245  std::string materialName(const int32_t index) const;
246 
253  OMCTensor
254  relativeError(const OMCTensor & sum, const OMCTensor & sum_sq, const int & n_realizations) const;
255 
262  Real relativeError(const Real & sum, const Real & sum_sq, const int & n_realizations) const;
263 
268  const Real densityConversionFactor() const;
269 
271  const Real * _particles;
272 
277  int nParticles() const;
278 
283  int nTotalParticles() const { return _total_n_particles; }
284 
289  openmc::RunMode runMode() const { return _run_mode; }
290 
296  int32_t cellID(const int32_t index) const;
297 
303  int32_t materialID(const int32_t index) const;
304 
309  std::string printPoint(const Point & p) const;
310 
316  std::string printMaterial(const int32_t & index) const;
317 
322  void writeSourceBank(const std::string & filename);
323 
330  unsigned int numElemsInSubdomain(const SubdomainID & id) const;
331 
336  bool isLocalElem(const Elem * elem) const;
337 
343  unsigned int globalElemID(const unsigned int & id) const { return _local_to_global_elem[id]; }
344 
355  virtual void setCellTemperature(const int32_t & id,
356  const int32_t & instance,
357  const Real & T,
358  const cellInfo & cell_info) const;
359 
370  virtual void setCellDensity(const int32_t & id,
371  const int32_t & instance,
372  const Real & density,
373  const cellInfo & cell_info) const;
374 
381  virtual std::string printCell(const cellInfo & cell_info, const bool brief = false) const;
382 
389  virtual std::vector<int32_t> cellFill(const cellInfo & cell_info, int & fill_type) const;
390 
398  bool materialFill(const cellInfo & cell_info, int32_t & material_index) const;
399 
404  long unsigned int numCells() const;
405 
410  virtual std::vector<int32_t> getMappedTallyIDs() const = 0;
411 
417 
422  const openmc::Tally & getCommonKineticsTally();
423 
428  const openmc::Tally & getMGBetaTally();
429 
430 protected:
432  virtual void critSearchStep() = 0;
433 
435  void getOpenMCUserObjects();
436 
438  bool hasCellTransform() const;
439 
441  void checkOpenMCUserObjectIDs() const;
442 
444  void checkTallyEditorIDs() const;
445 
447  void executeFilterEditors();
448 
450  void executeTallyEditors();
451 
452  // execute tallly and filte editors
453  void executeEditors();
454 
457 
460 
467  void fillElementalAuxVariable(const unsigned int & var_num,
468  const std::vector<unsigned int> & elem_ids,
469  const Real & value);
470 
475  std::string sourceBankFileName() const
476  {
477  return openmc::settings::path_output + "initial_source_" +
478  std::to_string(_fixed_point_iteration) + ".h5";
479  }
480 
482  const bool & _verbose;
483 
485  const Real * _power;
486 
488  const Real * _source_strength;
489 
498 
500  const bool _specified_scaling;
501 
521  const Real & _scaling;
522 
524  const bool & _skip_statepoint;
525 
533 
535  unsigned int _total_n_particles;
536 
538  long unsigned int _n_openmc_cells;
539 
547 
549  openmc::RunMode _run_mode;
550 
552  std::vector<OpenMCNuclideDensities *> _nuclide_densities_uos;
553 
555  std::vector<OpenMCDomainFilterEditor *> _filter_editor_uos;
556 
558  std::vector<OpenMCTallyEditor *> _tally_editor_uos;
559 
561  std::vector<OpenMCCellTransform *> _cell_transform_uos;
562 
564  std::vector<unsigned int> _local_to_global_elem;
565 
567  const bool _has_adaptivity;
568 
575 
578 
580  const bool & _reset_seed;
581 
583  const int64_t _initial_seed;
584 
587 
593 
595  openmc::Tally * _ifp_common_tally = nullptr;
596 
598  openmc::Tally * _ifp_mg_beta_tally = nullptr;
599 
601  const std::string & _xml_directory;
602 
604  static constexpr Real _density_conversion_factor{0.001};
605 
607  static constexpr int MATERIAL_VOID{-1};
608 
611 };
TallyTriggerTypeEnum
Type of trigger to apply.
Definition: CardinalEnums.h:190
unsigned int _total_n_particles
Total number of particles simulated.
Definition: OpenMCProblemBase.h:535
const int64_t _initial_seed
The initial OpenMC seed.
Definition: OpenMCProblemBase.h:583
int _fixed_point_iteration
Definition: OpenMCProblemBase.h:532
std::string materialName(const int32_t index) const
Definition: ModelModifiersBase.h:27
bool isReactionRateScore(const std::string &score) const
void writeSourceBank(const std::string &filename)
const bool _specified_scaling
Whether a mesh scaling was specified by the user.
Definition: OpenMCProblemBase.h:500
const bool & _skip_statepoint
Whether to skip writing statepoints from OpenMC.
Definition: OpenMCProblemBase.h:524
const bool _calc_kinetics_params
A flag to indicate if OpenMC is calculating kinetics parameters.
Definition: OpenMCProblemBase.h:577
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.
openmc::Tally * _ifp_common_tally
The global tally used to accumulate the common scores required for kinetics parameters.
Definition: OpenMCProblemBase.h:595
static InputParameters validParams()
int32_t materialID(const int32_t index) const
bool isHeatingScore(const std::string &score) const
Definition: OpenMCTallyEditor.h:30
bool validRandomRayScore(const std::string &score) const
virtual std::vector< int32_t > cellFill(const cellInfo &cell_info, int &fill_type) const
OMCTensor tallySum(const openmc::Tally *tally, const unsigned int &score) const
Compute the sum of a tally within each bin.
openmc::RunMode runMode() const
Definition: OpenMCProblemBase.h:289
virtual bool adaptMesh() override
unsigned int addExternalVariable(const std::string &name, const std::string &system, const std::vector< SubdomainName > *block=nullptr)
std::vector< unsigned int > _local_to_global_elem
Mapping from local element indices to global element indices for this rank.
Definition: OpenMCProblemBase.h:564
bool computeKineticsParams() const
Definition: OpenMCProblemBase.h:416
const bool _has_adaptivity
Whether or not the problem contains mesh adaptivity.
Definition: OpenMCProblemBase.h:567
std::string sourceBankFileName() const
Definition: OpenMCProblemBase.h:475
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:607
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:546
void getOpenMCUserObjects()
Find all userobjects which are changing OpenMC data structures.
bool hasCellTransform() const
Whether OpenMC cell transforms are being applied to the geometry.
void checkTallyEditorIDs() const
Ensure that any tally editors don't apply to Cardinal-mapped tallies.
Definition: CardinalEnums.h:233
Definition: OpenMCDomainFilterEditor.h:32
OMCTensor relativeError(const OMCTensor &sum, const OMCTensor &sum_sq, const int &n_realizations) const
std::vector< OpenMCTallyEditor * > _tally_editor_uos
Userobjects for creating/changing OpenMC tallies.
Definition: OpenMCProblemBase.h:558
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.
CriticalitySearchBase * _criticality_search
Object to use for a criticality search.
Definition: OpenMCProblemBase.h:610
openmc::TriggerMetric triggerMetric(trigger::TallyTriggerTypeEnum trigger) const
std::vector< OpenMCNuclideDensities * > _nuclide_densities_uos
Userobjects for changing OpenMC material compositions.
Definition: OpenMCProblemBase.h:552
const Real & scaling() const
Definition: OpenMCProblemBase.h:113
std::string printPoint(const Point &p) const
bool cellIsVoid(const cellInfo &cell_info) const
const openmc::Tally & getMGBetaTally()
Definition: OpenMCProblemBase.h:58
void importProperties() const
Import temperature and density from a properties.h5 file.
Definition: CriticalitySearchBase.h:29
openmc::Tally * _ifp_mg_beta_tally
The global tally used to accumulate the score required for \beta_eff.
Definition: OpenMCProblemBase.h:598
TallyEstimatorEnum
Type of estimator to use for OpenMC tallies.
Definition: CardinalEnums.h:167
int nTotalParticles() const
Definition: OpenMCProblemBase.h:283
bool cellHasZeroInstances(const cellInfo &cell_info) const
const Real & _scaling
Definition: OpenMCProblemBase.h:521
bool runRandomRay() const
static constexpr Real _density_conversion_factor
Conversion unit to transfer between kg/m3 and g/cm3.
Definition: OpenMCProblemBase.h:604
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:538
int _ifp_mg_beta_tally_index
Definition: OpenMCProblemBase.h:592
unsigned int numElemsInSubdomain(const SubdomainID &id) const
std::vector< OpenMCCellTransform * > _cell_transform_uos
Userobjects for updating OpenMC cell transforms.
Definition: OpenMCProblemBase.h:561
bool hasScaling() const
Definition: OpenMCProblemBase.h:119
const bool & _verbose
Whether to print diagnostic information about model setup and the transfers.
Definition: OpenMCProblemBase.h:482
double tallySumAcrossBins(std::vector< const openmc::Tally * > tally, const unsigned int &score) const
Real tallyNormalizationValue() const
bool _reuse_source
Definition: OpenMCProblemBase.h:497
int _ifp_common_tally_index
The index of a global tally which accumulates the common scores required for kinetics parameters.
Definition: OpenMCProblemBase.h:586
const Real densityConversionFactor() const
virtual void syncSolutions(ExternalProblem::Direction direction) override
Set the 'mesh changed' adaptivity flag.
openmc::tensor::Tensor< double > OMCTensor
Definition: OpenMCProblemBase.h:51
void fillElementalAuxVariable(const unsigned int &var_num, const std::vector< unsigned int > &elem_ids, const Real &value)
std::vector< OpenMCDomainFilterEditor * > _filter_editor_uos
Userobjects for creating/changing OpenMC filters.
Definition: OpenMCProblemBase.h:555
virtual void setCellDensity(const int32_t &id, const int32_t &instance, const Real &density, const cellInfo &cell_info) const
int nParticles() const
virtual std::vector< int32_t > getMappedTallyIDs() const =0
std::string printMaterial(const int32_t &index) const
const openmc::Tally & getCommonKineticsTally()
openmc::TallyEstimator tallyEstimator(tally::TallyEstimatorEnum estimator) const
const bool & _reset_seed
Whether to reset the seed each time a new OpenMC calculation runs.
Definition: OpenMCProblemBase.h:580
unsigned int globalElemID(const unsigned int &id) const
Definition: OpenMCProblemBase.h:343
double tallyMeanAcrossBins(std::vector< const openmc::Tally * > tally, const unsigned int &score) const
Definition: CardinalEnums.h:187
bool _run_on_adaptivity_cycle
Definition: OpenMCProblemBase.h:574
std::string subdomainName(const SubdomainID &id) const
Definition: CardinalEnums.h:157
bool firstSolve() const
Whether this is the first time OpenMC is running.
openmc::RunMode _run_mode
OpenMC run mode.
Definition: OpenMCProblemBase.h:549
virtual void critSearchStep()=0
A virtual function to allow for execution prior to each step in a criticality search.
const Real * _particles
Number of particles that OpenMC will run in each batch.
Definition: OpenMCProblemBase.h:271
const Real * _source_strength
Source strength by which to normalize the OpenMC results, for fixed source mode.
Definition: OpenMCProblemBase.h:488
const std::string & _xml_directory
Directory in which OpenMC settings xml files are located.
Definition: OpenMCProblemBase.h:601
virtual void initialSetup() override
Set up an OpenMC simulation.
std::pair< int32_t, int32_t > cellInfo
Definition: OpenMCProblemBase.h:223
std::string estimatorToString(openmc::TallyEstimator estimator) const
void externalSolve() override
Run an OpenMC simulation.
const Real * _power
Power by which to normalize the OpenMC results, for k-eigenvalue mode.
Definition: OpenMCProblemBase.h:485
void executeFilterEditors()
Execute all filter editor userobjects.
bool isLocalElem(const Elem *elem) const
std::string enumToTallyScore(const std::string &score) const
std::string tallyScoreToEnum(const std::string &score) const