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;
51 
52 typedef openmc::tensor::Tensor<double> OMCTensor;
53 
57 class OpenMCProblemBase : public CardinalProblem, public PostprocessorInterface
58 {
59 public:
60  OpenMCProblemBase(const InputParameters & params);
61 
62  static InputParameters validParams();
63 
64  virtual ~OpenMCProblemBase() override;
65 
71  std::string subdomainName(const SubdomainID & id) const;
72 
77  bool isReactionRateScore(const std::string & score) const;
78 
83  bool isHeatingScore(const std::string & score) const;
84 
89  bool validRandomRayScore(const std::string & score) const;
90 
98  unsigned int addExternalVariable(const std::string & name,
99  const std::string & system,
100  const std::vector<SubdomainName> * block = nullptr);
101 
106  const Real & scaling() const { return _scaling; }
107 
112  bool hasScaling() const { return _specified_scaling; }
113 
119  bool runRandomRay() const;
120 
126  std::string enumToTallyScore(const std::string & score) const;
127 
133  std::string tallyScoreToEnum(const std::string & score) const;
134 
140  virtual void geometryType(bool & has_csg_universe, bool & has_dag_universe) const;
141 
143  bool firstSolve() const;
144 
150  openmc::TriggerMetric triggerMetric(trigger::TallyTriggerTypeEnum trigger) const;
151  openmc::TriggerMetric triggerMetric(std::string trigger) const;
152 
158  openmc::TallyEstimator tallyEstimator(tally::TallyEstimatorEnum estimator) const;
159 
165  std::string estimatorToString(openmc::TallyEstimator estimator) const;
166 
168  void externalSolve() override;
169 
171  virtual void initialSetup() override;
172 
174  virtual void syncSolutions(ExternalProblem::Direction direction) override;
175  virtual bool adaptMesh() override;
176 
178  void importProperties() const;
179 
192  OMCTensor tallySum(const openmc::Tally * tally, const unsigned int & score) const;
193 
200  double tallySumAcrossBins(std::vector<const openmc::Tally *> tally,
201  const unsigned int & score) const;
202 
209  double tallyMeanAcrossBins(std::vector<const openmc::Tally *> tally,
210  const unsigned int & score) const;
211 
216  typedef std::pair<int32_t, int32_t> cellInfo;
217 
223  bool cellIsVoid(const cellInfo & cell_info) const;
224 
230  bool cellHasZeroInstances(const cellInfo & cell_info) const;
231 
238  std::string materialName(const int32_t index) const;
239 
246  OMCTensor
247  relativeError(const OMCTensor & sum, const OMCTensor & sum_sq, const int & n_realizations) const;
248 
255  Real relativeError(const Real & sum, const Real & sum_sq, const int & n_realizations) const;
256 
261  const Real densityConversionFactor() const;
262 
264  const Real * _particles;
265 
270  int nParticles() const;
271 
276  int nTotalParticles() const { return _total_n_particles; }
277 
282  openmc::RunMode runMode() const { return _run_mode; }
283 
289  int32_t cellID(const int32_t index) const;
290 
296  int32_t materialID(const int32_t index) const;
297 
302  std::string printPoint(const Point & p) const;
303 
309  std::string printMaterial(const int32_t & index) const;
310 
315  void writeSourceBank(const std::string & filename);
316 
323  unsigned int numElemsInSubdomain(const SubdomainID & id) const;
324 
329  bool isLocalElem(const Elem * elem) const;
330 
336  unsigned int globalElemID(const unsigned int & id) const { return _local_to_global_elem[id]; }
337 
348  virtual void setCellTemperature(const int32_t & id,
349  const int32_t & instance,
350  const Real & T,
351  const cellInfo & cell_info) const;
352 
358  virtual void setCellDensity(const Real & density, const cellInfo & cell_info) const;
359 
366  virtual std::string printCell(const cellInfo & cell_info, const bool brief = false) const;
367 
374  virtual std::vector<int32_t> cellFill(const cellInfo & cell_info, int & fill_type) const;
375 
383  bool materialFill(const cellInfo & cell_info, int32_t & material_index) const;
384 
389  long unsigned int numCells() const;
390 
395  virtual std::vector<int32_t> getMappedTallyIDs() const = 0;
396 
402 
407  const openmc::Tally & getCommonKineticsTally();
408 
413  const openmc::Tally & getMGBetaTally();
414 
415 protected:
417  virtual void critSearchStep() = 0;
418 
420  void getOpenMCUserObjects();
421 
423  bool hasCellTransform() const;
424 
426  void checkOpenMCUserObjectIDs() const;
427 
429  void checkTallyEditorIDs() const;
430 
432  void executeFilterEditors();
433 
435  void executeTallyEditors();
436 
437  // execute tallly and filte editors
438  void executeEditors();
439 
442 
445 
452  void fillElementalAuxVariable(const unsigned int & var_num,
453  const std::vector<unsigned int> & elem_ids,
454  const Real & value);
455 
460  std::string sourceBankFileName() const
461  {
462  return openmc::settings::path_output + "initial_source_" +
463  std::to_string(_fixed_point_iteration) + ".h5";
464  }
465 
467  const bool & _verbose;
468 
470  const Real * _power;
471 
473  const Real * _source_strength;
474 
483 
485  const bool _specified_scaling;
486 
506  const Real & _scaling;
507 
509  const bool & _skip_statepoint;
510 
518 
520  unsigned int _total_n_particles;
521 
523  long unsigned int _n_openmc_cells;
524 
532 
534  openmc::RunMode _run_mode;
535 
537  std::vector<OpenMCNuclideDensities *> _nuclide_densities_uos;
538 
540  std::vector<OpenMCDomainFilterEditor *> _filter_editor_uos;
541 
543  std::vector<OpenMCTallyEditor *> _tally_editor_uos;
544 
546  std::vector<OpenMCCellTransform *> _cell_transform_uos;
547 
549  std::vector<unsigned int> _local_to_global_elem;
550 
552  const bool _has_adaptivity;
553 
560 
563 
565  const bool & _reset_seed;
566 
568  const int64_t _initial_seed;
569 
572 
578 
580  openmc::Tally * _ifp_common_tally = nullptr;
581 
583  openmc::Tally * _ifp_mg_beta_tally = nullptr;
584 
586  const std::string & _xml_directory;
587 
589  static constexpr Real _density_conversion_factor{0.001};
590 
592  static constexpr int MATERIAL_VOID{-1};
593 
596 };
TallyTriggerTypeEnum
Type of trigger to apply.
Definition: CardinalEnums.h:190
unsigned int _total_n_particles
Total number of particles simulated.
Definition: OpenMCProblemBase.h:520
const int64_t _initial_seed
The initial OpenMC seed.
Definition: OpenMCProblemBase.h:568
int _fixed_point_iteration
Definition: OpenMCProblemBase.h:517
std::string materialName(const int32_t index) const
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:485
const bool & _skip_statepoint
Whether to skip writing statepoints from OpenMC.
Definition: OpenMCProblemBase.h:509
const bool _calc_kinetics_params
A flag to indicate if OpenMC is calculating kinetics parameters.
Definition: OpenMCProblemBase.h:562
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:580
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:282
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:549
bool computeKineticsParams() const
Definition: OpenMCProblemBase.h:401
const bool _has_adaptivity
Whether or not the problem contains mesh adaptivity.
Definition: OpenMCProblemBase.h:552
std::string sourceBankFileName() const
Definition: OpenMCProblemBase.h:460
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:592
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:531
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:543
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:595
openmc::TriggerMetric triggerMetric(trigger::TallyTriggerTypeEnum trigger) const
std::vector< OpenMCNuclideDensities * > _nuclide_densities_uos
Userobjects for changing OpenMC material compositions.
Definition: OpenMCProblemBase.h:537
const Real & scaling() const
Definition: OpenMCProblemBase.h:106
std::string printPoint(const Point &p) const
bool cellIsVoid(const cellInfo &cell_info) const
const openmc::Tally & getMGBetaTally()
Definition: OpenMCProblemBase.h:57
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:583
TallyEstimatorEnum
Type of estimator to use for OpenMC tallies.
Definition: CardinalEnums.h:167
int nTotalParticles() const
Definition: OpenMCProblemBase.h:276
bool cellHasZeroInstances(const cellInfo &cell_info) const
const Real & _scaling
Definition: OpenMCProblemBase.h:506
bool runRandomRay() const
static constexpr Real _density_conversion_factor
Conversion unit to transfer between kg/m3 and g/cm3.
Definition: OpenMCProblemBase.h:589
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:523
int _ifp_mg_beta_tally_index
Definition: OpenMCProblemBase.h:577
unsigned int numElemsInSubdomain(const SubdomainID &id) const
std::vector< OpenMCCellTransform * > _cell_transform_uos
Userobjects for updating OpenMC cell transforms.
Definition: OpenMCProblemBase.h:546
bool hasScaling() const
Definition: OpenMCProblemBase.h:112
const bool & _verbose
Whether to print diagnostic information about model setup and the transfers.
Definition: OpenMCProblemBase.h:467
double tallySumAcrossBins(std::vector< const openmc::Tally * > tally, const unsigned int &score) const
bool _reuse_source
Definition: OpenMCProblemBase.h:482
int _ifp_common_tally_index
The index of a global tally which accumulates the common scores required for kinetics parameters.
Definition: OpenMCProblemBase.h:571
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:50
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:540
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:565
unsigned int globalElemID(const unsigned int &id) const
Definition: OpenMCProblemBase.h:336
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:559
std::string subdomainName(const SubdomainID &id) const
virtual void setCellDensity(const Real &density, const cellInfo &cell_info) 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:534
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:264
const Real * _source_strength
Source strength by which to normalize the OpenMC results, for fixed source mode.
Definition: OpenMCProblemBase.h:473
const std::string & _xml_directory
Directory in which OpenMC settings xml files are located.
Definition: OpenMCProblemBase.h:586
virtual void initialSetup() override
Set up an OpenMC simulation.
std::pair< int32_t, int32_t > cellInfo
Definition: OpenMCProblemBase.h:216
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:470
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