www.mooseframework.org
GrainBoundaryArea.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 "GrainBoundaryArea.h"
11 #include "MooseUtils.h"
12 
13 registerMooseObject("PhaseFieldApp", GrainBoundaryArea);
14 
15 template <>
16 InputParameters
18 {
19  InputParameters params = validParams<ElementIntegralPostprocessor>();
20  params.addClassDescription("Calculate total grain boundary length in 2D and area in 3D");
21  params.addRequiredCoupledVarWithAutoBuild(
22  "v", "var_name_base", "op_num", "Array of coupled variables");
23  params.addParam<Real>("grains_per_side",
24  2.0,
25  "Number of order parameters contacting a boundary "
26  "(should be 2.0 in polycrystals and 1.0 for "
27  "dispersed particles)");
28  params.addParam<Real>("op_range",
29  1.0,
30  "Range over which order parameters change across an "
31  "interface. By default order parameters are assumed to "
32  "vary from 0 to 1");
33  return params;
34 }
35 
36 GrainBoundaryArea::GrainBoundaryArea(const InputParameters & parameters)
37  : ElementIntegralPostprocessor(parameters),
38  _op_num(coupledComponents("v")),
39  _grads(_op_num),
40  _factor(getParam<Real>("grains_per_side") * getParam<Real>("op_range"))
41 {
42  // make sure user input is valid
43  if (MooseUtils::absoluteFuzzyEqual(_factor, 0.0))
44  mooseError("Neither grains_per_side nor op_range may be zero.");
45 
46  // Loop over variables (ops)
47  for (MooseIndex(_op_num) op_index = 0; op_index < _op_num; ++op_index)
48  _grads[op_index] = &coupledGradient("v", op_index);
49 }
50 
51 Real
53 {
54  Real grad_sum = 0.0;
55  for (auto grad : _grads)
56  grad_sum += (*grad)[_qp].norm();
57  return grad_sum;
58 }
59 
60 Real
62 {
63  return ElementIntegralPostprocessor::getValue() / _factor;
64 }
registerMooseObject
registerMooseObject("PhaseFieldApp", GrainBoundaryArea)
GrainBoundaryArea::_factor
const Real _factor
normalization factor, depending on order parameter range and grains per side
Definition: GrainBoundaryArea.h:39
GrainBoundaryArea
Calculate total grain boundary length in 2D and area in 3D.
Definition: GrainBoundaryArea.h:22
GrainBoundaryArea::_op_num
const unsigned int _op_num
Number of order parameters.
Definition: GrainBoundaryArea.h:33
GrainBoundaryArea::computeQpIntegral
virtual Real computeQpIntegral() override
Definition: GrainBoundaryArea.C:52
GrainBoundaryArea::_grads
std::vector< const VariableGradient * > _grads
Order parameters.
Definition: GrainBoundaryArea.h:36
GrainBoundaryArea::GrainBoundaryArea
GrainBoundaryArea(const InputParameters &parameters)
Definition: GrainBoundaryArea.C:36
validParams< GrainBoundaryArea >
InputParameters validParams< GrainBoundaryArea >()
Definition: GrainBoundaryArea.C:17
GrainBoundaryArea.h
GrainBoundaryArea::getValue
virtual Real getValue() override
Definition: GrainBoundaryArea.C:61