https://mooseframework.inl.gov
Loading...
Searching...
No Matches
EBSDReader.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#include "EBSDReader.h"
11#include "EBSDMesh.h"
12#include "MooseMesh.h"
13#include "Conversion.h"
14#include "NonlinearSystem.h"
15
16#include "libmesh/int_range.h"
17
18#include <Eigen/Dense>
19
20#include <fstream>
21
23
26{
28 params.addClassDescription("Load and manage DREAM.3D EBSD data files for running simulations on "
29 "reconstructed microstructures.");
30 params.addParam<unsigned int>(
31 "custom_columns", 0, "Number of additional custom data columns to read from the EBSD file");
32 params.addParam<unsigned int>("bins", 20, "Number of bins to segregate quaternions");
33 params.addParam<Real>("L_norm", 1, "Specifies the type of average the user intends to perform");
34 params.addParam<std::string>("ebsd_meshgenerator",
35 "Specify the name of the EBSDMeshGenerator. The EBSDReader can "
36 "autodetect this, if only one such MeshGenerator exists.");
37 return params;
38}
39
41 : EulerAngleProvider(params),
42 _mesh(_fe_problem.mesh()),
43 _nl(_fe_problem.getNonlinearSystemBase(_sys.number())),
44 _grain_num(0),
45 _custom_columns(getParam<unsigned int>("custom_columns")),
46 _time_step(_fe_problem.timeStep()),
47 _mesh_dimension(_mesh.dimension()),
48 _bins(getParam<unsigned int>("bins")),
49 _L_norm(getParam<Real>("L_norm")),
50 _nx(0),
51 _ny(0),
52 _nz(0),
53 _dx(0.),
54 _dy(0.),
55 _dz(0.)
56{
57 readFile();
58 // throws an error for zero bins
59 if (_bins == 0)
60 mooseError("One cannot have zero bins");
61}
62
63void
65{
66 std::string ebsd_filename;
68
69 // Fetch and check mesh or meshgenerators
70 EBSDMesh * mesh = dynamic_cast<EBSDMesh *>(&_mesh);
71 if (mesh != NULL)
72 {
73 ebsd_filename = mesh->getEBSDFilename();
74 geometry = mesh->getEBSDGeometry();
75 }
76 else
77 {
78 std::string ebsd_meshgenerator_name;
79 if (isParamValid("ebsd_meshgenerator"))
80 ebsd_meshgenerator_name = getParam<std::string>("ebsd_meshgenerator");
81 else
82 {
83 auto meshgenerator_names = _app.getMeshGeneratorNames();
84 for (auto & mgn : meshgenerator_names)
85 {
86 const EBSDMeshGenerator * emg =
87 dynamic_cast<const EBSDMeshGenerator *>(&_app.getMeshGenerator(mgn));
88 if (emg)
89 {
90 if (!ebsd_meshgenerator_name.empty())
91 mooseError("Found multiple EBSDMeshGenerator objects (",
92 ebsd_meshgenerator_name,
93 " and ",
94 mgn,
95 "). Use the 'ebsd_meshgenerator' parameter to specify which one to use.");
96 ebsd_meshgenerator_name = mgn;
97 }
98 }
99
100 if (ebsd_meshgenerator_name.empty())
101 mooseError("Failed to autodetect an EBSDMeshGenerator (or a deprecated EBSDMesh object).");
102 }
103
104 // get the selected or detected mesh generator
105 const EBSDMeshGenerator * emg =
106 dynamic_cast<const EBSDMeshGenerator *>(&_app.getMeshGenerator(ebsd_meshgenerator_name));
107 if (!emg)
108 paramError("ebsd_meshgenerator", "No valid EBSDMeshGenerator object found.");
109
110 ebsd_filename = emg->getEBSDFilename();
111 geometry = emg->getEBSDGeometry();
112 }
113
114 std::ifstream stream_in(ebsd_filename.c_str());
115 if (!stream_in)
116 mooseError("Can't open EBSD file: ", ebsd_filename);
117
118 // Copy file header data from the EBSDMesh
119 _dx = geometry.d[0];
120 _nx = geometry.n[0];
121 _minx = geometry.min[0];
122 _maxx = _minx + _dx * _nx;
123
124 _dy = geometry.d[1];
125 _ny = geometry.n[1];
126 _miny = geometry.min[1];
127 _maxy = _miny + _dy * _ny;
128
129 _dz = geometry.d[2];
130 _nz = geometry.n[2];
131 _minz = geometry.min[2];
132 _maxz = _minz + _dz * _nz;
133
134 // Resize the _data array
135 unsigned total_size = geometry.dim < 3 ? _nx * _ny : _nx * _ny * _nz;
136 _data.resize(total_size);
137
138 std::string line;
139 while (std::getline(stream_in, line))
140 {
141 if (line.find("#") != 0)
142 {
143 // Temporary variables to read in on each line
145 Real x, y, z;
146
147 std::istringstream iss(line);
148 iss >> d._phi1 >> d._Phi >> d._phi2 >> x >> y >> z >> d._feature_id >> d._phase >>
149 d._symmetry;
150
151 // Transform angles to degrees
152 d._phi1 *= 180.0 / libMesh::pi;
153 d._Phi *= 180.0 / libMesh::pi;
154 d._phi2 *= 180.0 / libMesh::pi;
155
156 // Custom columns
157 d._custom.resize(_custom_columns);
158 for (unsigned int i = 0; i < _custom_columns; ++i)
159 if (!(iss >> d._custom[i]))
160 mooseError("Unable to read in EBSD custom data column #", i);
161
162 if (x < _minx || y < _miny || x > _maxx || y > _maxy ||
163 (geometry.dim == 3 && (z < _minz || z > _maxz)))
164 mooseError("EBSD Data ouside of the domain declared in the header ([",
165 _minx,
166 ':',
167 _maxx,
168 "], [",
169 _miny,
170 ':',
171 _maxy,
172 "], [",
173 _minz,
174 ':',
175 _maxz,
176 "]) dim=",
177 geometry.dim,
178 "\n",
179 line);
180
181 d._p = Point(x, y, z);
182
183 // determine number of grains in the dataset
184 if (_global_id_map.find(d._feature_id) == _global_id_map.end())
185 _global_id_map[d._feature_id] = _grain_num++;
186
187 unsigned int global_index = indexFromPoint(Point(x, y, z));
188 _data[global_index] = d;
189 }
190 }
191 stream_in.close();
192
193 // Resize the variables
194 _avg_data.resize(_grain_num);
195 _avg_angles.resize(_grain_num);
196
197 // clear the averages
198 for (const auto i : make_range(_grain_num))
199 {
200 EBSDAvgData & a = _avg_data[i];
201 a._symmetry = a._phase = a._n = 0;
202 a._p = 0.0;
203 a._custom.assign(_custom_columns, 0.0);
204
206 b.phi1 = b.Phi = b.phi2 = 0.0;
207 }
208
209 // Array of vectors to store quaternions of each grain
210 std::vector<std::vector<Eigen::Quaternion<Real>>> quat(_grain_num);
211
212 // Iterate through data points to store orientation information for each grain
213 for (auto & j : _data)
214 {
215 EBSDAvgData & a = _avg_data[_global_id_map[j._feature_id]];
216 EulerAngles angles;
217
218 angles.phi1 = j._phi1;
219 angles.Phi = j._Phi;
220 angles.phi2 = j._phi2;
221
222 // convert Euler angles to quaternions
223 Eigen::Quaternion<Real> q = angles.toQuaternion();
224 quat[_global_id_map[j._feature_id]].push_back(q);
225
226 if (a._n == 0)
227 a._phase = j._phase;
228 else if (a._phase != j._phase)
229 mooseError("An EBSD feature needs to have a uniform phase.");
230
231 if (a._n == 0)
232 a._symmetry = j._symmetry;
233 else if (a._symmetry != j._symmetry)
234 mooseError("An EBSD feature needs to have a uniform symmetry parameter.");
235
236 for (unsigned int i = 0; i < _custom_columns; ++i)
237 a._custom[i] += j._custom[i];
238
239 // store the feature (or grain) ID
240 a._feature_id = j._feature_id;
241
242 a._p += j._p;
243 a._n++;
244 }
245
246 for (const auto i : make_range(_grain_num))
247 {
248 EBSDAvgData & a = _avg_data[i];
250
251 if (a._n == 0)
252 continue;
253
254 // creating a map to store the quaternion count for each bin index
255 std::map<std::tuple<int, int, int, int>, unsigned int> feature_weights;
256
257 // looping through all quaternions of the current grain
258 for (const auto & q : quat[i])
259 {
260 const auto bin = std::make_tuple<int, int, int, int>(std::floor(q.w() * 0.5 * _bins),
261 std::floor(q.x() * 0.5 * _bins),
262 std::floor(q.y() * 0.5 * _bins),
263 std::floor(q.z() * 0.5 * _bins));
264 feature_weights[bin]++;
265 }
266
276 // quaternion average matrix Q*w*Q^T
277 typedef Eigen::Matrix<Real, 4, 4> Matrix4x4;
278 Matrix4x4 quat_mat = Matrix4x4::Zero();
279 typedef Eigen::Matrix<Real, 4, 1> Vector4;
280
281 bool data_quality_ok = false;
282 Real total_weight = 0.0;
283 for (const auto & q : quat[i])
284 {
285 Vector4 v(q.w(), q.x(), q.y(), q.z());
286
287 const auto bin = std::make_tuple<int, int, int, int>(std::floor(q.w() * 0.5 * _bins),
288 std::floor(q.x() * 0.5 * _bins),
289 std::floor(q.y() * 0.5 * _bins),
290 std::floor(q.z() * 0.5 * _bins));
291 const auto bin_size = feature_weights[bin];
292 const auto weight = std::pow(bin_size, _L_norm);
293 total_weight += weight;
294
295 quat_mat += v * weight * v.transpose();
296
302 if (bin_size * 2 > quat[i].size())
303 data_quality_ok = true;
304 }
305
306 quat_mat *= 1.0 / total_weight;
307
308 // throws a warning if EBSD data is not reliable
309 if (!data_quality_ok)
310 _console << COLOR_YELLOW << "EBSD orientation data may not be reliable for grain " << i
311 << '\n'
312 << COLOR_DEFAULT << std::flush;
313
314 // compute eigenvalues and eigenvectors
315 Eigen::EigenSolver<Matrix4x4> EigenSolver(quat_mat);
316 Vector4 eigen_values = EigenSolver.eigenvalues().real();
317 Matrix4x4 eigen_vectors = EigenSolver.eigenvectors().real();
318
319 // Selecting eigenvector corresponding to max eigenvalue to compute average Euler angle
320 Vector4::Index max_index = 0;
321 eigen_values.maxCoeff(&max_index);
322 const auto max_vec = eigen_vectors.col(max_index);
323 const Eigen::Quaternion<Real> q(max_vec(0), max_vec(1), max_vec(2), max_vec(3));
324 b = EulerAngles(q);
325
326 // link the EulerAngles into the EBSDAvgData for access via the functors
327 a._angles = &b;
328
329 if (a._phase >= _global_id.size())
330 _global_id.resize(a._phase + 1);
331
332 // The averaged per grain data locally contains the phase id, local id, and
333 // original feature id. It is stored contiguously indexed by global id.
334 a._local_id = _global_id[a._phase].size();
335 _global_id[a._phase].push_back(i);
336
337 a._p *= 1.0 / Real(a._n);
338
339 for (unsigned int i = 0; i < _custom_columns; ++i)
340 a._custom[i] /= Real(a._n);
341 }
342 // Build maps to indicate the weights with which grain and phase data
343 // from the surrounding elements contributes to a node for IC purposes
345}
346
348
350EBSDReader::getData(const Point & p) const
351{
352 return _data[indexFromPoint(p)];
353}
354
356EBSDReader::getAvgData(unsigned int var) const
357{
358 return _avg_data[indexFromIndex(var)];
359}
360
361const EulerAngles &
362EBSDReader::getEulerAngles(unsigned int var) const
363{
364 return _avg_angles[indexFromIndex(var)];
365}
366
368EBSDReader::getAvgData(unsigned int phase, unsigned int local_id) const
369{
370 return _avg_data[indexFromIndex(_global_id[phase][local_id])];
371}
372
373unsigned int
375{
376 return _grain_num;
377}
378
379unsigned int
380EBSDReader::getGrainNum(unsigned int phase) const
381{
382 return _global_id[phase].size();
383}
384
385unsigned int
386EBSDReader::indexFromPoint(const Point & p) const
387{
388 // Don't assume an ordering on the input data, use the (x, y,
389 // z) values of this centroid to determine the index.
390 unsigned int x_index, y_index, z_index, global_index;
391
392 x_index = (unsigned int)((p(0) - _minx) / _dx);
393 y_index = (unsigned int)((p(1) - _miny) / _dy);
394 if (p(0) <= _minx || p(0) >= _maxx || p(1) <= _miny || p(1) >= _maxy)
395 mooseError("Data points must be on the interior of the mesh elements. In EBSDReader ", name());
396
397 if (_mesh_dimension == 3)
398 {
399 z_index = (unsigned int)((p(2) - _minz) / _dz);
400 global_index = z_index * _ny;
401 if (p(2) <= _minz || p(2) >= _maxz)
402 mooseError("Data points must be on the interior of the mesh elements. In EBSDReader ",
403 name());
404 }
405 else
406 global_index = 0;
407
408 // Compute the global index into the _data array. This stores points
409 // in a [z][y][x] ordering.
410 global_index = (global_index + y_index) * _nx + x_index;
411
412 // Don't access out of range!
413 mooseAssert(global_index < _data.size(),
414 "global_index " << global_index << " points out of _data range: " << _data.size());
415
416 return global_index;
417}
418
419unsigned int
420EBSDReader::indexFromIndex(unsigned int var) const
421{
422
423 // Transfer the index into the _avg_data array.
424 unsigned avg_index = var;
425
426 // Don't access out of range!
427 if (avg_index >= _avg_data.size())
428 mooseError("Error! Index out of range in EBSDReader::indexFromIndex(), index: ",
429 avg_index,
430 " size: ",
431 _avg_data.size());
432
433 return avg_index;
434}
435
436const std::map<dof_id_type, std::vector<Real>> &
441
442const std::map<dof_id_type, std::vector<Real>> &
447
448unsigned int
449EBSDReader::getGlobalID(unsigned int feature_id) const
450{
451 auto it = _global_id_map.find(feature_id);
452 if (it == _global_id_map.end())
453 mooseError("Invalid Feature ID");
454 return it->second;
455}
456
457void
459{
460 // maps are only rebuild for use in initial conditions, which happens in time step zero
461 if (_time_step == 0)
463}
464
465void
467{
468 // Import nodeToElemMap from MooseMesh for current node
469 // This map consists of the node index followed by a vector of element indices that are associated
470 // with that node
471 const auto & node_to_elem_map = _mesh.nodeToElemMap();
473
474 // Loop through each node in mesh and calculate eta values for each grain associated with the node
475 for (const auto & node : as_range(mesh.active_nodes_begin(), mesh.active_nodes_end()))
476 {
477 // Get node_id
478 const dof_id_type node_id = node->id();
479
480 // Initialize map entries for current node
481 _node_to_grain_weight_map[node_id].assign(getGrainNum(), 0.0);
482 _node_to_phase_weight_map[node_id].assign(getPhaseNum(), 0.0);
483
484 // Loop through element indices associated with the current node and record weighted eta value
485 // in new map
486 const auto & node_to_elem_pair = node_to_elem_map.find(node_id);
487 if (node_to_elem_pair != node_to_elem_map.end())
488 {
489 unsigned int n_elems =
490 node_to_elem_pair->second
491 .size(); // n_elems can range from 1 to 4 for 2D and 1 to 8 for 3D problems
492
493 for (unsigned int ne = 0; ne < n_elems; ++ne)
494 {
495 // Current element index
496 unsigned int elem_id = (node_to_elem_pair->second)[ne];
497
498 // Retrieve EBSD grain number for the current element index
499 const Elem * elem = mesh.elem_ptr(elem_id);
500 const EBSDReader::EBSDPointData & d = getData(elem->vertex_average());
501
502 // get the (global) grain ID for the EBSD feature ID
503 const unsigned int global_id = getGlobalID(d._feature_id);
504
505 // Calculate eta value and add to map
506 _node_to_grain_weight_map[node_id][global_id] += 1.0 / n_elems;
507 _node_to_phase_weight_map[node_id][d._phase] += 1.0 / n_elems;
508 }
509 }
510 }
511}
512
513MooseSharedPointer<EBSDAccessFunctors::EBSDPointDataFunctor>
515{
516 EBSDPointDataFunctor * ret_val = NULL;
517
518 switch (field_name)
519 {
520 case 0: // phi1
521 ret_val = new EBSDPointDataPhi1();
522 break;
523 case 1: // phi
524 ret_val = new EBSDPointDataPhi();
525 break;
526 case 2: // phi2
527 ret_val = new EBSDPointDataPhi2();
528 break;
529 case 3: // grain
530 ret_val = new EBSDPointDataFeatureID();
531 break;
532 case 4: // phase
533 ret_val = new EBSDPointDataPhase();
534 break;
535 case 5: // symmetry
536 ret_val = new EBSDPointDataSymmetry();
537 break;
538 default:
539 {
540 // check for custom columns
541 for (const auto i : make_range(_custom_columns))
542 if (field_name == "CUSTOM" + Moose::stringify(i))
543 {
544 ret_val = new EBSDPointDataCustom(i);
545 break;
546 }
547 }
548 }
549
550 // If ret_val was not set by any of the above cases, throw an error.
551 if (!ret_val)
552 mooseError("Error: Please input supported EBSD_param");
553
554 // If we made it here, wrap up the the ret_val in a
555 // MooseSharedPointer and ship it off.
556 return MooseSharedPointer<EBSDPointDataFunctor>(ret_val);
557}
558
559MooseSharedPointer<EBSDAccessFunctors::EBSDAvgDataFunctor>
561{
562 EBSDAvgDataFunctor * ret_val = NULL;
563
564 switch (field_name)
565 {
566 case 0: // phi1
567 ret_val = new EBSDAvgDataPhi1();
568 break;
569 case 1: // phi
570 ret_val = new EBSDAvgDataPhi();
571 break;
572 case 2: // phi2
573 ret_val = new EBSDAvgDataPhi2();
574 break;
575 case 3: // phase
576 ret_val = new EBSDAvgDataPhase();
577 break;
578 case 4: // symmetry
579 ret_val = new EBSDAvgDataSymmetry();
580 break;
581 case 5: // local_id
582 ret_val = new EBSDAvgDataLocalID();
583 break;
584 case 6: // feature_id
585 ret_val = new EBSDAvgDataFeatureID();
586 break;
587 default:
588 {
589 // check for custom columns
590 for (const auto i : make_range(_custom_columns))
591 if (field_name == "CUSTOM" + Moose::stringify(i))
592 {
593 ret_val = new EBSDAvgDataCustom(i);
594 break;
595 }
596 }
597 }
598
599 // If ret_val was not set by any of the above cases, throw an error.
600 if (!ret_val)
601 mooseError("Error: Please input supported EBSD_param");
602
603 // If we made it here, wrap up the the ret_val in a
604 // MooseSharedPointer and ship it off.
605 return MooseSharedPointer<EBSDAvgDataFunctor>(ret_val);
606}
registerMooseObject("PhaseFieldApp", EBSDReader)
const std::vector< double > y
const std::vector< double > x
const Real p
const double v
void ErrorVector unsigned int
const ConsoleStream _console
Mesh generated from parameters read from a DREAM3D EBSD file.
const Geometry & getEBSDGeometry() const
const std::string & getEBSDFilename() const
Mesh generated from parameters.
Definition EBSDMesh.h:21
A GeneralUserObject that reads an EBSD file and stores the centroid data in a data structure which in...
Definition EBSDReader.h:32
unsigned _nz
Definition EBSDReader.h:171
void meshChanged()
Maps need to be updated when the mesh changes.
Definition EBSDReader.C:458
unsigned indexFromPoint(const Point &p) const
Computes a global index in the _data array given an input centroid point.
Definition EBSDReader.C:386
EBSDReader(const InputParameters &params)
Definition EBSDReader.C:40
std::map< unsigned int, unsigned int > _global_id_map
map from feature_id to global_id
Definition EBSDReader.h:147
virtual unsigned int getPhaseNum() const
Return the total number of phases.
Definition EBSDReader.h:73
MooseSharedPointer< EBSDPointDataFunctor > getPointDataAccessFunctor(const MooseEnum &field_name) const
Factory function to return a point functor specified by name.
Definition EBSDReader.C:514
virtual void readFile()
Definition EBSDReader.C:64
unsigned int _grain_num
Variables needed to determine reduced order parameter values.
Definition EBSDReader.h:128
std::vector< std::vector< unsigned int > > _global_id
global ID for given phases and grains
Definition EBSDReader.h:150
unsigned int _bins
number of bins for each quaternion component
Definition EBSDReader.h:165
unsigned _nx
The number of values in the x, y and z directions.
Definition EBSDReader.h:171
static InputParameters validParams()
Definition EBSDReader.C:25
unsigned indexFromIndex(unsigned int var) const
Transfer the index into the _avg_data array from given index.
Definition EBSDReader.C:420
const EBSDPointData & getData(const Point &p) const
Get the requested type of data at the point p.
Definition EBSDReader.C:350
std::map< dof_id_type, std::vector< Real > > _node_to_phase_weight_map
Map of phase weights per node.
Definition EBSDReader.h:156
const std::map< dof_id_type, std::vector< Real > > & getNodeToGrainWeightMap() const
Returns a map consisting of the node index followd by a vector of all grain weights for that node.
Definition EBSDReader.C:437
MooseMesh & _mesh
MooseMesh Variables.
Definition EBSDReader.h:123
std::vector< EBSDAvgData > _avg_data
Averages by (global) grain ID.
Definition EBSDReader.h:141
unsigned _ny
Definition EBSDReader.h:171
virtual const EulerAngles & getEulerAngles(unsigned int) const
EulerAngleProvider interface implementation to fetch a triplet of Euler angles.
Definition EBSDReader.C:362
unsigned int _L_norm
L_norm value for averaging.
Definition EBSDReader.h:168
virtual unsigned int getGrainNum() const
Return the total number of grains.
Definition EBSDReader.C:374
unsigned int _custom_columns
number of additional custom data columns
Definition EBSDReader.h:135
MooseSharedPointer< EBSDAvgDataFunctor > getAvgDataAccessFunctor(const MooseEnum &field_name) const
Factory function to return a average functor specified by name.
Definition EBSDReader.C:560
const EBSDAvgData & getAvgData(unsigned int i) const
Get the requested type of average data for (global) grain number i.
Definition EBSDReader.C:356
void buildNodeWeightMaps()
Build grain and phase weight maps.
Definition EBSDReader.C:466
std::vector< EulerAngles > _avg_angles
Euler Angles by (global) grain ID.
Definition EBSDReader.h:144
std::vector< EBSDPointData > _data
Logically three-dimensional data indexed by geometric points in a 1D vector.
Definition EBSDReader.h:138
Real _minx
Grid origin.
Definition EBSDReader.h:177
virtual unsigned int getGlobalID(unsigned int phase, unsigned int local_id) const
Return the (global) grain id for a given phase and (local) grain number.
Definition EBSDReader.h:92
Real _maxx
Maximum grid extent.
Definition EBSDReader.h:180
const int & _time_step
current timestep. Maps are only rebuild on mesh change during time step zero
Definition EBSDReader.h:159
const std::map< dof_id_type, std::vector< Real > > & getNodeToPhaseWeightMap() const
Returns a map consisting of the node index followd by a vector of all phase weights for that node.
Definition EBSDReader.C:443
Real _dx
The spacing of the values in x, y and z directions.
Definition EBSDReader.h:174
std::map< dof_id_type, std::vector< Real > > _node_to_grain_weight_map
Map of grain weights per node.
Definition EBSDReader.h:153
unsigned int _mesh_dimension
Dimension of the problem domain.
Definition EBSDReader.h:162
virtual ~EBSDReader()
Definition EBSDReader.C:347
Abstract base class for user objects that implement the Euler Angle provider interface.
static InputParameters validParams()
Euler angle triplet.
Definition EulerAngles.h:25
Eigen::Quaternion< Real > toQuaternion()
Definition EulerAngles.C:55
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
std::vector< std::string > getMeshGeneratorNames() const
const MeshGenerator & getMeshGenerator(const std::string &name) const
const std::string & name() const
void paramError(const std::string &param, Args... args) const
void mooseError(Args &&... args) const
bool isParamValid(const std::string &name) const
MeshBase & getMesh()
const std::unordered_map< dof_id_type, std::vector< dof_id_type > > & nodeToElemMap()
MeshBase & mesh
std::string stringify(const T &t)
const Real pi
Access functor base class for EBSDAvgData.
Access functor base class for EBSDPointData.
Per element EBSD data point.
std::array< Real, 3 > min
std::array< unsigned int, 3 > n