www.mooseframework.org
PolycrystalCircles.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 "PolycrystalCircles.h"
11 #include "MooseMesh.h"
12 #include "MooseVariable.h"
13 
14 #include "libmesh/utility.h"
15 #include <fstream>
16 
17 registerMooseObject("PhaseFieldApp", PolycrystalCircles);
18 
19 template <>
20 InputParameters
22 {
23  InputParameters params = validParams<PolycrystalUserObjectBase>();
24  params.addClassDescription(
25  "Polycrystal circles generated from a vector input or read from a file");
26  params.addParam<bool>("read_from_file",
27  false,
28  "Set to true to read the position and radius "
29  "vectors from a file rather than inputing them "
30  "manually");
31  params.addParam<bool>(
32  "columnar_3D", false, "3D microstructure will be columnar in the z-direction?");
33  params.addParam<std::vector<Real>>("x_positions", "x coordinate for each circle center");
34  params.addParam<std::vector<Real>>("y_positions", "y coordinate for each circle center");
35  params.addParam<std::vector<Real>>("z_positions", "z coordinate for each circle center");
36  params.addParam<std::vector<Real>>("radii", "The radius for each circle");
37  params.addParam<FileName>("file_name", "File containing circle centers and radii");
38  params.addParam<Real>("int_width", 0.0, "Width of diffuse interface");
39 
40  return params;
41 }
42 
43 PolycrystalCircles::PolycrystalCircles(const InputParameters & parameters)
44  : PolycrystalUserObjectBase(parameters),
45  _columnar_3D(getParam<bool>("columnar_3D")),
46  _int_width(getParam<Real>("int_width")),
47  _grain_num(0)
48 {
49 }
50 
51 void
53  std::vector<unsigned int> & grains) const
54 {
55  unsigned int n_grains = _centerpoints.size();
56  grains.resize(0);
57 
58  for (unsigned int i = 0; i < n_grains; ++i)
59  {
60  Real distance = 0;
61 
62  if (_columnar_3D)
63  {
64  Real d_x = (point(0) - _centerpoints[i](0)) * (point(0) - _centerpoints[i](0));
65  Real d_y = (point(1) - _centerpoints[i](1)) * (point(1) - _centerpoints[i](1));
66  distance = std::sqrt(d_x + d_y);
67  }
68  else
69  distance = _mesh.minPeriodicDistance(_vars[0]->number(), _centerpoints[i], point);
70 
71  if (distance < _radii[i] + _int_width)
72  grains.push_back(i);
73  }
74 }
75 
76 Real
77 PolycrystalCircles::getVariableValue(unsigned int op_index, const Point & p) const
78 {
79  std::vector<unsigned int> grain_ids;
80  getGrainsBasedOnPoint(p, grain_ids);
81 
82  unsigned int active_grain_on_op = invalid_id;
83  for (auto grain_id : grain_ids)
84  if (op_index == _grain_to_op[grain_id])
85  {
86  active_grain_on_op = grain_id;
87  break;
88  }
89 
90  return active_grain_on_op != invalid_id ? computeDiffuseInterface(p, active_grain_on_op) : 0.0;
91 }
92 
93 void
95 {
96  bool readfromfile = getParam<bool>("read_from_file");
97  if (readfromfile)
98  {
99  // Read file
100  const FileName file_name = getParam<FileName>("file_name");
101  MooseUtils::DelimitedFileReader txt_reader(file_name, &_communicator);
102 
103  txt_reader.read();
104  std::vector<std::string> col_names = txt_reader.getNames();
105  std::vector<std::vector<Real>> data = txt_reader.getData();
106  _grain_num = data[0].size();
107  _centerpoints.resize(_grain_num);
108 
109  std::array<int, 4> col_map = {{-1, -1, -1, -1}};
110 
111  for (unsigned int i = 0; i < col_names.size(); ++i)
112  {
113  // Check vector lengths
114  if (data[i].size() != _grain_num)
115  mooseError("Columns in ", file_name, " do not have uniform lengths.");
116 
117  // Map columns to variables
118  if (col_names[i] == "x")
119  col_map[X] = i;
120  else if (col_names[i] == "y")
121  col_map[Y] = i;
122  else if (col_names[i] == "z")
123  col_map[Z] = i;
124  else if (col_names[i] == "r")
125  col_map[R] = i;
126  }
127 
128  // Check all columns are included
129  if (col_map[X] == -1)
130  mooseError("No column 'x' in ", file_name, ".");
131  if (col_map[Y] == -1)
132  mooseError("No column 'y' in ", file_name, ".");
133  if (col_map[Z] == -1)
134  mooseError("No column 'z' in ", file_name, ".");
135  if (col_map[R] == -1)
136  mooseError("No column 'r' in ", file_name, ".");
137 
138  // Write data to variables
139  _radii.assign(data[col_map[R]].begin(), data[col_map[R]].end());
140  for (unsigned int i = 0; i < _grain_num; ++i)
141  {
142  _centerpoints[i](0) = data[col_map[X]][i];
143  _centerpoints[i](1) = data[col_map[Y]][i];
144  _centerpoints[i](2) = data[col_map[Z]][i];
145  }
146  }
147  else // if (readfromfile)
148  {
149  // Read vectors
150  std::vector<Real> x_c = getParam<std::vector<Real>>("x_positions");
151  std::vector<Real> y_c = getParam<std::vector<Real>>("y_positions");
152  std::vector<Real> z_c = getParam<std::vector<Real>>("z_positions");
153  std::vector<Real> r_c = getParam<std::vector<Real>>("radii");
154 
155  _grain_num = r_c.size();
156  _centerpoints.resize(_grain_num);
157 
158  // Check vector lengths
159  if (_grain_num != x_c.size())
160  mooseError("The vector length of x_positions does not match the length of radii");
161  else if (_grain_num != y_c.size())
162  mooseError("The vector length of y_positions does not match the length of radii");
163  else if (_grain_num != z_c.size())
164  mooseError("The vector length of z_positions does not match the length of radii");
165 
166  // Assign values
167  _radii.assign(r_c.begin(), r_c.end());
168  for (unsigned int i = 0; i < _grain_num; ++i)
169  {
170  _centerpoints[i](0) = x_c[i];
171  _centerpoints[i](1) = y_c[i];
172  _centerpoints[i](2) = z_c[i];
173  }
174  }
175 }
176 
177 Real
178 PolycrystalCircles::computeDiffuseInterface(const Point & p, const unsigned int & i) const
179 {
180  if (_int_width == 0)
181  return 1.0;
182 
183  Real d = 0;
184 
185  if (_columnar_3D)
186  {
187  Real d_x = (p(0) - _centerpoints[i](0)) * (p(0) - _centerpoints[i](0));
188  Real d_y = (p(1) - _centerpoints[i](1)) * (p(1) - _centerpoints[i](1));
189  d = std::sqrt(d_x + d_y);
190  }
191  else
192  d = _mesh.minPeriodicDistance(_vars[0]->number(), _centerpoints[i], p);
193 
194  return 0.5 * (1 - std::tanh(2.0 * (d - _radii[i]) / _int_width));
195 }
PolycrystalCircles::_centerpoints
std::vector< Point > _centerpoints
x,y,z coordinates of circle centers
Definition: PolycrystalCircles.h:60
FeatureFloodCount::_mesh
MooseMesh & _mesh
A reference to the mesh.
Definition: FeatureFloodCount.h:581
PolycrystalCircles
PolycrystalCircles creates a polycrystal made up of circles.
Definition: PolycrystalCircles.h:30
PolycrystalCircles::_radii
std::vector< Real > _radii
Radius for each circular grain created.
Definition: PolycrystalCircles.h:63
PolycrystalCircles::_columnar_3D
const bool _columnar_3D
Whether to use columns or spheres in 3D geometries.
Definition: PolycrystalCircles.h:51
PolycrystalCircles::computeDiffuseInterface
Real computeDiffuseInterface(const Point &p, const unsigned int &i) const
Definition: PolycrystalCircles.C:178
PolycrystalCircles::Z
Definition: PolycrystalCircles.h:47
PolycrystalCircles::precomputeGrainStructure
virtual void precomputeGrainStructure() override
This callback is triggered after the object is initialized and may be optionally overridden to do pre...
Definition: PolycrystalCircles.C:94
PolycrystalUserObjectBase::_grain_to_op
std::vector< unsigned int > _grain_to_op
A vector indicating which op is assigned to each grain.
Definition: PolycrystalUserObjectBase.h:150
registerMooseObject
registerMooseObject("PhaseFieldApp", PolycrystalCircles)
PolycrystalCircles::getGrainsBasedOnPoint
virtual void getGrainsBasedOnPoint(const Point &point, std::vector< unsigned int > &grains) const override
Method for retrieving active grain IDs based on some point in the mesh.
Definition: PolycrystalCircles.C:52
PolycrystalUserObjectBase
This object provides the base capability for creating proper polycrystal ICs.
Definition: PolycrystalUserObjectBase.h:27
PolycrystalCircles.h
PolycrystalCircles::getVariableValue
virtual Real getVariableValue(unsigned int op_index, const Point &p) const override
Returns the variable value for a given op_index and mesh point.
Definition: PolycrystalCircles.C:77
PolycrystalCircles::Y
Definition: PolycrystalCircles.h:46
PolycrystalCircles::PolycrystalCircles
PolycrystalCircles(const InputParameters &parameters)
Definition: PolycrystalCircles.C:43
validParams< PolycrystalCircles >
InputParameters validParams< PolycrystalCircles >()
Definition: PolycrystalCircles.C:21
PolycrystalCircles::_grain_num
unsigned int _grain_num
Number of crystal grains to create.
Definition: PolycrystalCircles.h:57
PolycrystalCircles::_int_width
const Real _int_width
Interfacial width.
Definition: PolycrystalCircles.h:54
PolycrystalCircles::R
Definition: PolycrystalCircles.h:48
FeatureFloodCount::_vars
std::vector< MooseVariable * > _vars
The vector of coupled in variables cast to MooseVariable.
Definition: FeatureFloodCount.h:566
FeatureFloodCount::invalid_id
static const unsigned int invalid_id
Definition: FeatureFloodCount.h:94
PolycrystalCircles::X
Definition: PolycrystalCircles.h:45
validParams< PolycrystalUserObjectBase >
InputParameters validParams< PolycrystalUserObjectBase >()
Definition: PolycrystalUserObjectBase.C:24