www.mooseframework.org
ForceDensityMaterial.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 "ForceDensityMaterial.h"
11 
13 
14 template <>
15 InputParameters
17 {
18  InputParameters params = validParams<Material>();
19  params.addClassDescription("Calculating the force density acting on a grain");
20  params.addCoupledVar("etas", "Array of coupled order parameters");
21  params.addCoupledVar("c", "Concentration field");
22  params.addParam<Real>("ceq", 0.9816, "Equilibrium density");
23  params.addParam<Real>("cgb", 0.25, "Threshold Concentration for GB");
24  params.addParam<Real>("k", 100.0, "stiffness constant");
25  return params;
26 }
27 
28 ForceDensityMaterial::ForceDensityMaterial(const InputParameters & parameters)
29  : DerivativeMaterialInterface<Material>(parameters),
30  _c(coupledValue("c")),
31  _c_name(getVar("c", 0)->name()),
32  _ceq(getParam<Real>("ceq")),
33  _cgb(getParam<Real>("cgb")),
34  _k(getParam<Real>("k")),
35  _op_num(coupledComponents(
36  "etas")), // determine number of grains from the number of names passed in.
37  _vals(_op_num), // Size variable arrays
38  _grad_vals(_op_num),
39  _vals_name(_op_num),
40  _product_etas(_op_num),
41  _sum_grad_etas(_op_num),
42  _dF(declareProperty<std::vector<RealGradient>>("force_density")),
43  _dFdc(declarePropertyDerivative<std::vector<RealGradient>>("force_density", _c_name)),
44  _dFdgradeta(_op_num)
45 {
46  // Loop through grains and load coupled variables into the arrays
47  for (unsigned int i = 0; i < _op_num; ++i)
48  {
49  _vals[i] = &coupledValue("etas", i);
50  _grad_vals[i] = &coupledGradient("etas", i);
51  _vals_name[i] = getVar("etas", i)->name();
52  _dFdgradeta[i] = &declarePropertyDerivative<std::vector<Real>>("force_density", _vals_name[i]);
53  }
54 }
55 
56 void
58 {
59  _dF[_qp].resize(_op_num);
60  _dFdc[_qp].resize(_op_num);
61 
62  for (unsigned int i = 0; i < _op_num; ++i)
63  {
64  _sum_grad_etas[i] = 0.0;
65  for (unsigned int j = 0; j < _op_num; ++j)
66  if (j != i)
67  {
68  _product_etas[i] = (*_vals[i])[_qp] * (*_vals[j])[_qp] >= _cgb ? 1.0 : 0.0;
69  _sum_grad_etas[i] += _product_etas[i] * ((*_grad_vals[i])[_qp] - (*_grad_vals[j])[_qp]);
70  }
71  _dF[_qp][i] = _k * (_c[_qp] - _ceq) * _sum_grad_etas[i];
72  _dFdc[_qp][i] = _k * _sum_grad_etas[i];
73  }
74 
75  for (unsigned int i = 0; i < _op_num; ++i)
76  {
77  (*_dFdgradeta[i])[_qp].resize(_op_num);
78  for (unsigned int j = 0; j < _op_num; ++j)
79  {
80  for (unsigned int k = 0; k < _op_num; ++k)
81  if (k != j)
82  _product_etas[j] = (*_vals[j])[_qp] * (*_vals[k])[_qp] >= _cgb ? 1.0 : 0.0;
83 
84  if (j == i)
85  (*_dFdgradeta[i])[_qp][j] = _k * _product_etas[j] * (_c[_qp] - _ceq);
86  else
87  (*_dFdgradeta[i])[_qp][j] = -_k * _product_etas[j] * (_c[_qp] - _ceq);
88  }
89  }
90 }
ForceDensityMaterial::_vals_name
std::vector< VariableName > _vals_name
Definition: ForceDensityMaterial.h:47
registerMooseObject
registerMooseObject("PhaseFieldApp", ForceDensityMaterial)
ForceDensityMaterial
This Material calculates the force density acting on a particle/grain due to interaction between part...
Definition: ForceDensityMaterial.h:25
ForceDensityMaterial::ForceDensityMaterial
ForceDensityMaterial(const InputParameters &parameters)
Definition: ForceDensityMaterial.C:28
ForceDensityMaterial.h
libMesh::RealGradient
VectorValue< Real > RealGradient
Definition: GrainForceAndTorqueInterface.h:17
ForceDensityMaterial::_op_num
unsigned int _op_num
Definition: ForceDensityMaterial.h:44
ForceDensityMaterial::_ceq
Real _ceq
equilibrium density at the grain boundaries
Definition: ForceDensityMaterial.h:38
ForceDensityMaterial::_vals
std::vector< const VariableValue * > _vals
Definition: ForceDensityMaterial.h:45
ForceDensityMaterial::_c
const VariableValue & _c
concentration field considered to be the density of particles
Definition: ForceDensityMaterial.h:35
ForceDensityMaterial::_dFdc
MaterialProperty< std::vector< RealGradient > > & _dFdc
first order derivative of force density material w.r.t c
Definition: ForceDensityMaterial.h:58
ForceDensityMaterial::_dFdgradeta
std::vector< MaterialProperty< std::vector< Real > > * > _dFdgradeta
first order derivative of force density material w.r.t etas
Definition: ForceDensityMaterial.h:60
ForceDensityMaterial::computeQpProperties
virtual void computeQpProperties()
Definition: ForceDensityMaterial.C:57
ForceDensityMaterial::_grad_vals
std::vector< const VariableGradient * > _grad_vals
Definition: ForceDensityMaterial.h:46
ForceDensityMaterial::_product_etas
std::vector< Real > _product_etas
Definition: ForceDensityMaterial.h:49
name
const std::string name
Definition: Setup.h:21
ForceDensityMaterial::_sum_grad_etas
std::vector< RealGradient > _sum_grad_etas
Definition: ForceDensityMaterial.h:50
ForceDensityMaterial::_k
Real _k
stiffness constant
Definition: ForceDensityMaterial.h:42
ForceDensityMaterial::_cgb
Real _cgb
thresold value for identifying grain boundaries
Definition: ForceDensityMaterial.h:40
validParams< ForceDensityMaterial >
InputParameters validParams< ForceDensityMaterial >()
Definition: ForceDensityMaterial.C:16
ForceDensityMaterial::_dF
MaterialProperty< std::vector< RealGradient > > & _dF
force density material
Definition: ForceDensityMaterial.h:56