www.mooseframework.org
EBSDReader.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 
22 registerMooseObject("PhaseFieldApp", EBSDReader);
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 
63 void
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 
205  EulerAngles & b = _avg_angles[i];
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];
249  EulerAngles & b = _avg_angles[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 
350 EBSDReader::getData(const Point & p) const
351 {
352  return _data[indexFromPoint(p)];
353 }
354 
356 EBSDReader::getAvgData(unsigned int var) const
357 {
358  return _avg_data[indexFromIndex(var)];
359 }
360 
361 const EulerAngles &
362 EBSDReader::getEulerAngles(unsigned int var) const
363 {
364  return _avg_angles[indexFromIndex(var)];
365 }
366 
368 EBSDReader::getAvgData(unsigned int phase, unsigned int local_id) const
369 {
370  return _avg_data[indexFromIndex(_global_id[phase][local_id])];
371 }
372 
373 unsigned int
375 {
376  return _grain_num;
377 }
378 
379 unsigned int
380 EBSDReader::getGrainNum(unsigned int phase) const
381 {
382  return _global_id[phase].size();
383 }
384 
385 unsigned int
386 EBSDReader::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 
419 unsigned int
420 EBSDReader::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 
436 const std::map<dof_id_type, std::vector<Real>> &
438 {
440 }
441 
442 const std::map<dof_id_type, std::vector<Real>> &
444 {
446 }
447 
448 unsigned int
449 EBSDReader::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 
457 void
459 {
460  // maps are only rebuild for use in initial conditions, which happens in time step zero
461  if (_time_step == 0)
463 }
464 
465 void
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 std::map<dof_id_type, std::vector<dof_id_type>> & node_to_elem_map =
474 
475  // Loop through each node in mesh and calculate eta values for each grain associated with the node
476  for (const auto & node : as_range(mesh.active_nodes_begin(), mesh.active_nodes_end()))
477  {
478  // Get node_id
479  const dof_id_type node_id = node->id();
480 
481  // Initialize map entries for current node
482  _node_to_grain_weight_map[node_id].assign(getGrainNum(), 0.0);
483  _node_to_phase_weight_map[node_id].assign(getPhaseNum(), 0.0);
484 
485  // Loop through element indices associated with the current node and record weighted eta value
486  // in new map
487  const auto & node_to_elem_pair = node_to_elem_map.find(node_id);
488  if (node_to_elem_pair != node_to_elem_map.end())
489  {
490  unsigned int n_elems =
491  node_to_elem_pair->second
492  .size(); // n_elems can range from 1 to 4 for 2D and 1 to 8 for 3D problems
493 
494  for (unsigned int ne = 0; ne < n_elems; ++ne)
495  {
496  // Current element index
497  unsigned int elem_id = (node_to_elem_pair->second)[ne];
498 
499  // Retrieve EBSD grain number for the current element index
500  const Elem * elem = mesh.elem_ptr(elem_id);
501  const EBSDReader::EBSDPointData & d = getData(elem->vertex_average());
502 
503  // get the (global) grain ID for the EBSD feature ID
504  const unsigned int global_id = getGlobalID(d._feature_id);
505 
506  // Calculate eta value and add to map
507  _node_to_grain_weight_map[node_id][global_id] += 1.0 / n_elems;
508  _node_to_phase_weight_map[node_id][d._phase] += 1.0 / n_elems;
509  }
510  }
511  }
512 }
513 
514 MooseSharedPointer<EBSDAccessFunctors::EBSDPointDataFunctor>
516 {
517  EBSDPointDataFunctor * ret_val = NULL;
518 
519  switch (field_name)
520  {
521  case 0: // phi1
522  ret_val = new EBSDPointDataPhi1();
523  break;
524  case 1: // phi
525  ret_val = new EBSDPointDataPhi();
526  break;
527  case 2: // phi2
528  ret_val = new EBSDPointDataPhi2();
529  break;
530  case 3: // grain
531  ret_val = new EBSDPointDataFeatureID();
532  break;
533  case 4: // phase
534  ret_val = new EBSDPointDataPhase();
535  break;
536  case 5: // symmetry
537  ret_val = new EBSDPointDataSymmetry();
538  break;
539  default:
540  {
541  // check for custom columns
542  for (const auto i : make_range(_custom_columns))
543  if (field_name == "CUSTOM" + Moose::stringify(i))
544  {
545  ret_val = new EBSDPointDataCustom(i);
546  break;
547  }
548  }
549  }
550 
551  // If ret_val was not set by any of the above cases, throw an error.
552  if (!ret_val)
553  mooseError("Error: Please input supported EBSD_param");
554 
555  // If we made it here, wrap up the the ret_val in a
556  // MooseSharedPointer and ship it off.
557  return MooseSharedPointer<EBSDPointDataFunctor>(ret_val);
558 }
559 
560 MooseSharedPointer<EBSDAccessFunctors::EBSDAvgDataFunctor>
562 {
563  EBSDAvgDataFunctor * ret_val = NULL;
564 
565  switch (field_name)
566  {
567  case 0: // phi1
568  ret_val = new EBSDAvgDataPhi1();
569  break;
570  case 1: // phi
571  ret_val = new EBSDAvgDataPhi();
572  break;
573  case 2: // phi2
574  ret_val = new EBSDAvgDataPhi2();
575  break;
576  case 3: // phase
577  ret_val = new EBSDAvgDataPhase();
578  break;
579  case 4: // symmetry
580  ret_val = new EBSDAvgDataSymmetry();
581  break;
582  case 5: // local_id
583  ret_val = new EBSDAvgDataLocalID();
584  break;
585  case 6: // feature_id
586  ret_val = new EBSDAvgDataFeatureID();
587  break;
588  default:
589  {
590  // check for custom columns
591  for (const auto i : make_range(_custom_columns))
592  if (field_name == "CUSTOM" + Moose::stringify(i))
593  {
594  ret_val = new EBSDAvgDataCustom(i);
595  break;
596  }
597  }
598  }
599 
600  // If ret_val was not set by any of the above cases, throw an error.
601  if (!ret_val)
602  mooseError("Error: Please input supported EBSD_param");
603 
604  // If we made it here, wrap up the the ret_val in a
605  // MooseSharedPointer and ship it off.
606  return MooseSharedPointer<EBSDAvgDataFunctor>(ret_val);
607 }
const Geometry & getEBSDGeometry() const
const EBSDAvgData & getAvgData(unsigned int i) const
Get the requested type of average data for (global) grain number i.
Definition: EBSDReader.C:356
unsigned indexFromPoint(const Point &p) const
Computes a global index in the _data array given an input centroid point.
Definition: EBSDReader.C:386
const MeshGenerator & getMeshGenerator(const std::string &name) const
std::map< dof_id_type, std::vector< Real > > _node_to_phase_weight_map
Map of phase weights per node.
Definition: EBSDReader.h:156
unsigned int _custom_columns
number of additional custom data columns
Definition: EBSDReader.h:135
Real _minx
Grid origin.
Definition: EBSDReader.h:177
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
const std::map< dof_id_type, std::vector< dof_id_type > > & nodeToActiveSemilocalElemMap()
std::vector< std::string > getMeshGeneratorNames() const
Real _maxx
Maximum grid extent.
Definition: EBSDReader.h:180
unsigned _nz
Definition: EBSDReader.h:171
MooseSharedPointer< EBSDPointDataFunctor > getPointDataAccessFunctor(const MooseEnum &field_name) const
Factory function to return a point functor specified by name.
Definition: EBSDReader.C:515
MeshBase & mesh
Real _miny
Definition: EBSDReader.h:177
unsigned int _grain_num
Variables needed to determine reduced order parameter values.
Definition: EBSDReader.h:128
const std::vector< double > y
unsigned int _L_norm
L_norm value for averaging.
Definition: EBSDReader.h:168
unsigned _nx
The number of values in the x, y and z directions.
Definition: EBSDReader.h:171
const EBSDPointData & getData(const Point &p) const
Get the requested type of data at the point p.
Definition: EBSDReader.C:350
const std::string & getEBSDFilename() const
virtual const std::string & name() const
MooseMesh & _mesh
MooseMesh Variables.
Definition: EBSDReader.h:123
Real _minz
Definition: EBSDReader.h:177
Mesh generated from parameters read from a DREAM3D EBSD file.
bool isParamValid(const std::string &name) const
static InputParameters validParams()
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
MeshBase & getMesh()
Per element EBSD data point.
const std::vector< double > x
dof_id_type weight(const MeshBase &mesh, const processor_id_type pid)
SimpleRange< IndexType > as_range(const std::pair< IndexType, IndexType > &p)
std::map< unsigned int, unsigned int > _global_id_map
map from feature_id to global_id
Definition: EBSDReader.h:147
virtual const EulerAngles & getEulerAngles(unsigned int) const
EulerAngleProvider interface implementation to fetch a triplet of Euler angles.
Definition: EBSDReader.C:362
std::array< Real, 3 > min
Access functor base class for EBSDAvgData.
const int & _time_step
current timestep. Maps are only rebuild on mesh change during time step zero
Definition: EBSDReader.h:159
A GeneralUserObject that reads an EBSD file and stores the centroid data in a data structure which in...
Definition: EBSDReader.h:31
unsigned _ny
Definition: EBSDReader.h:171
Real _dx
The spacing of the values in x, y and z directions.
Definition: EBSDReader.h:174
void paramError(const std::string &param, Args... args) const
std::string stringify(const T &t)
std::array< Real, 3 > d
unsigned int _mesh_dimension
Dimension of the problem domain.
Definition: EBSDReader.h:162
dof_id_type total_weight(const MeshBase &mesh)
virtual unsigned int getGrainNum() const
Return the total number of grains.
Definition: EBSDReader.C:374
EBSDReader(const InputParameters &params)
Definition: EBSDReader.C:40
std::vector< EBSDAvgData > _avg_data
Averages by (global) grain ID.
Definition: EBSDReader.h:141
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static const std::string v
Definition: NS.h:82
registerMooseObject("PhaseFieldApp", EBSDReader)
unsigned indexFromIndex(unsigned int var) const
Transfer the index into the _avg_data array from given index.
Definition: EBSDReader.C:420
Real _maxz
Definition: EBSDReader.h:180
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 _bins
number of bins for each quaternion component
Definition: EBSDReader.h:165
Euler angle triplet.
Definition: EulerAngles.h:24
IntRange< T > make_range(T beg, T end)
virtual ~EBSDReader()
Definition: EBSDReader.C:347
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
std::array< unsigned int, 3 > n
Real _maxy
Definition: EBSDReader.h:180
Abstract base class for user objects that implement the Euler Angle provider interface.
const ConsoleStream _console
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
static InputParameters validParams()
Definition: EBSDReader.C:25
std::vector< EulerAngles > _avg_angles
Euler Angles by (global) grain ID.
Definition: EBSDReader.h:144
void buildNodeWeightMaps()
Build grain and phase weight maps.
Definition: EBSDReader.C:466
virtual unsigned int getPhaseNum() const
Return the total number of phases.
Definition: EBSDReader.h:73
MooseSharedPointer< EBSDAvgDataFunctor > getAvgDataAccessFunctor(const MooseEnum &field_name) const
Factory function to return a average functor specified by name.
Definition: EBSDReader.C:561
Mesh generated from parameters.
Definition: EBSDMesh.h:20
void meshChanged()
Maps need to be updated when the mesh changes.
Definition: EBSDReader.C:458
MooseUnits pow(const MooseUnits &, int)
virtual void readFile()
Definition: EBSDReader.C:64
void ErrorVector unsigned int
std::vector< std::vector< unsigned int > > _global_id
global ID for given phases and grains
Definition: EBSDReader.h:150
Access functor base class for EBSDPointData.
std::vector< EBSDPointData > _data
Logically three-dimensional data indexed by geometric points in a 1D vector.
Definition: EBSDReader.h:138
uint8_t dof_id_type
const Real pi
Eigen::Quaternion< Real > toQuaternion()
Definition: EulerAngles.C:44
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