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/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 
43 // Forward declarations to avoid cyclic dependencies.
46 class OpenMCTallyEditor;
47 class OpenMCCellTransform;
49 
50 typedef openmc::tensor::Tensor<double> OMCTensor;
51 
55 class OpenMCProblemBase : public CardinalProblem, public PostprocessorInterface
56 {
57 public:
58  OpenMCProblemBase(const InputParameters & params);
59 
60  static InputParameters validParams();
61 
62  virtual ~OpenMCProblemBase() override;
63 
69  std::string subdomainName(const SubdomainID & id) const;
70 
75  bool isReactionRateScore(const std::string & score) const;
76 
81  bool isHeatingScore(const std::string & score) const;
82 
90  unsigned int addExternalVariable(const std::string & name,
91  const std::string & system,
92  const std::vector<SubdomainName> * block = nullptr);
93 
98  const Real & scaling() const { return _scaling; }
99 
104  bool hasScaling() const { return _specified_scaling; }
105 
111  std::string enumToTallyScore(const std::string & score) const;
112 
118  std::string tallyScoreToEnum(const std::string & score) const;
119 
125  virtual void geometryType(bool & has_csg_universe, bool & has_dag_universe) const;
126 
128  bool firstSolve() const;
129 
135  openmc::TriggerMetric triggerMetric(trigger::TallyTriggerTypeEnum trigger) const;
136  openmc::TriggerMetric triggerMetric(std::string trigger) const;
137 
143  openmc::TallyEstimator tallyEstimator(tally::TallyEstimatorEnum estimator) const;
144 
150  std::string estimatorToString(openmc::TallyEstimator estimator) const;
151 
153  void externalSolve() override;
154 
156  virtual void initialSetup() override;
157 
159  virtual void syncSolutions(ExternalProblem::Direction direction) override;
160  virtual bool adaptMesh() override;
161 
163  void importProperties() const;
164 
177  OMCTensor tallySum(const openmc::Tally * tally, const unsigned int & score) const;
178 
185  double tallySumAcrossBins(std::vector<const openmc::Tally *> tally,
186  const unsigned int & score) const;
187 
194  double tallyMeanAcrossBins(std::vector<const openmc::Tally *> tally,
195  const unsigned int & score) const;
196 
201  typedef std::pair<int32_t, int32_t> cellInfo;
202 
208  bool cellIsVoid(const cellInfo & cell_info) const;
209 
215  bool cellHasZeroInstances(const cellInfo & cell_info) const;
216 
223  std::string materialName(const int32_t index) const;
224 
231  OMCTensor
232  relativeError(const OMCTensor & sum, const OMCTensor & sum_sq, const int & n_realizations) const;
233 
240  Real relativeError(const Real & sum, const Real & sum_sq, const int & n_realizations) const;
241 
246  const Real & densityConversionFactor() const { return _density_conversion_factor; }
247 
249  const Real * _particles;
250 
255  int nParticles() const;
256 
261  int nTotalParticles() const { return _total_n_particles; }
262 
267  openmc::RunMode runMode() const { return _run_mode; }
268 
274  int32_t cellID(const int32_t index) const;
275 
281  int32_t materialID(const int32_t index) const;
282 
287  std::string printPoint(const Point & p) const;
288 
294  std::string printMaterial(const int32_t & index) const;
295 
300  void writeSourceBank(const std::string & filename);
301 
308  unsigned int numElemsInSubdomain(const SubdomainID & id) const;
309 
314  bool isLocalElem(const Elem * elem) const;
315 
321  unsigned int globalElemID(const unsigned int & id) const { return _local_to_global_elem[id]; }
322 
333  virtual void setCellTemperature(const int32_t & id,
334  const int32_t & instance,
335  const Real & T,
336  const cellInfo & cell_info) const;
337 
343  virtual void setCellDensity(const Real & density, const cellInfo & cell_info) const;
344 
351  virtual std::string printCell(const cellInfo & cell_info, const bool brief = false) const;
352 
359  virtual std::vector<int32_t> cellFill(const cellInfo & cell_info, int & fill_type) const;
360 
368  bool materialFill(const cellInfo & cell_info, int32_t & material_index) const;
369 
374  long unsigned int numCells() const;
375 
380  virtual std::vector<int32_t> getMappedTallyIDs() const = 0;
381 
387 
392  const openmc::Tally & getCommonKineticsTally();
393 
398  const openmc::Tally & getMGBetaTally();
399 
400 protected:
402  void getOpenMCUserObjects();
403 
405  bool hasCellTransform() const;
406 
408  void checkOpenMCUserObjectIDs() const;
409 
411  void checkTallyEditorIDs() const;
412 
414  void executeFilterEditors();
415 
417  void executeTallyEditors();
418 
419  // execute tallly and filte editors
420  void executeEditors();
421 
424 
427 
434  void fillElementalAuxVariable(const unsigned int & var_num,
435  const std::vector<unsigned int> & elem_ids,
436  const Real & value);
437 
442  std::string sourceBankFileName() const
443  {
444  return openmc::settings::path_output + "initial_source_" +
445  std::to_string(_fixed_point_iteration) + ".h5";
446  }
447 
449  const bool & _verbose;
450 
452  const Real * _power;
453 
455  const Real * _source_strength;
456 
465 
467  const bool _specified_scaling;
468 
488  const Real & _scaling;
489 
491  const bool & _skip_statepoint;
492 
500 
502  unsigned int _total_n_particles;
503 
505  long unsigned int _n_openmc_cells;
506 
514 
516  openmc::RunMode _run_mode;
517 
519  std::vector<OpenMCNuclideDensities *> _nuclide_densities_uos;
520 
522  std::vector<OpenMCDomainFilterEditor *> _filter_editor_uos;
523 
525  std::vector<OpenMCTallyEditor *> _tally_editor_uos;
526 
528  std::vector<OpenMCCellTransform *> _cell_transform_uos;
529 
531  std::vector<unsigned int> _local_to_global_elem;
532 
534  const bool _has_adaptivity;
535 
542 
545 
547  const bool & _reset_seed;
548 
550  const int64_t _initial_seed;
551 
554 
560 
562  openmc::Tally * _ifp_common_tally = nullptr;
563 
565  openmc::Tally * _ifp_mg_beta_tally = nullptr;
566 
568  const std::string & _xml_directory;
569 
571  static constexpr Real _density_conversion_factor{0.001};
572 
574  static constexpr int MATERIAL_VOID{-1};
575 
578 };
TallyTriggerTypeEnum
Type of trigger to apply.
Definition: CardinalEnums.h:190
unsigned int _total_n_particles
Total number of particles simulated.
Definition: OpenMCProblemBase.h:502
const int64_t _initial_seed
The initial OpenMC seed.
Definition: OpenMCProblemBase.h:550
int _fixed_point_iteration
Definition: OpenMCProblemBase.h:499
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:467
const bool & _skip_statepoint
Whether to skip writing statepoints from OpenMC.
Definition: OpenMCProblemBase.h:491
const Real & densityConversionFactor() const
Definition: OpenMCProblemBase.h:246
const bool _calc_kinetics_params
A flag to indicate if OpenMC is calculating kinetics parameters.
Definition: OpenMCProblemBase.h:544
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:562
static InputParameters validParams()
int32_t materialID(const int32_t index) const
bool isHeatingScore(const std::string &score) const
Definition: OpenMCTallyEditor.h:30
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:267
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:531
bool computeKineticsParams() const
Definition: OpenMCProblemBase.h:386
const bool _has_adaptivity
Whether or not the problem contains mesh adaptivity.
Definition: OpenMCProblemBase.h:534
std::string sourceBankFileName() const
Definition: OpenMCProblemBase.h:442
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:574
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:513
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:525
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:577
openmc::TriggerMetric triggerMetric(trigger::TallyTriggerTypeEnum trigger) const
std::vector< OpenMCNuclideDensities * > _nuclide_densities_uos
Userobjects for changing OpenMC material compositions.
Definition: OpenMCProblemBase.h:519
const Real & scaling() const
Definition: OpenMCProblemBase.h:98
std::string printPoint(const Point &p) const
bool cellIsVoid(const cellInfo &cell_info) const
const openmc::Tally & getMGBetaTally()
Definition: OpenMCProblemBase.h:55
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:565
TallyEstimatorEnum
Type of estimator to use for OpenMC tallies.
Definition: CardinalEnums.h:167
int nTotalParticles() const
Definition: OpenMCProblemBase.h:261
bool cellHasZeroInstances(const cellInfo &cell_info) const
const Real & _scaling
Definition: OpenMCProblemBase.h:488
static constexpr Real _density_conversion_factor
Conversion unit to transfer between kg/m3 and g/cm3.
Definition: OpenMCProblemBase.h:571
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:505
int _ifp_mg_beta_tally_index
Definition: OpenMCProblemBase.h:559
unsigned int numElemsInSubdomain(const SubdomainID &id) const
std::vector< OpenMCCellTransform * > _cell_transform_uos
Userobjects for updating OpenMC cell transforms.
Definition: OpenMCProblemBase.h:528
bool hasScaling() const
Definition: OpenMCProblemBase.h:104
const bool & _verbose
Whether to print diagnostic information about model setup and the transfers.
Definition: OpenMCProblemBase.h:449
double tallySumAcrossBins(std::vector< const openmc::Tally * > tally, const unsigned int &score) const
bool _reuse_source
Definition: OpenMCProblemBase.h:464
int _ifp_common_tally_index
The index of a global tally which accumulates the common scores required for kinetics parameters.
Definition: OpenMCProblemBase.h:553
virtual void syncSolutions(ExternalProblem::Direction direction) override
Set the 'mesh changed' adaptivity flag.
openmc::tensor::Tensor< double > OMCTensor
Definition: OpenMCProblemBase.h:48
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:522
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:547
unsigned int globalElemID(const unsigned int &id) const
Definition: OpenMCProblemBase.h:321
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:541
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:516
const Real * _particles
Number of particles that OpenMC will run in each batch.
Definition: OpenMCProblemBase.h:249
const Real * _source_strength
Source strength by which to normalize the OpenMC results, for fixed source mode.
Definition: OpenMCProblemBase.h:455
const std::string & _xml_directory
Directory in which OpenMC settings xml files are located.
Definition: OpenMCProblemBase.h:568
virtual void initialSetup() override
Set up an OpenMC simulation.
std::pair< int32_t, int32_t > cellInfo
Definition: OpenMCProblemBase.h:201
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:452
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