www.mooseframework.org
PeridynamicsKernelBase.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 "PeridynamicsKernelBase.h"
11 #include "PeridynamicsMesh.h"
12 
13 template <>
14 InputParameters
16 {
17  InputParameters params = validParams<Kernel>();
18  params.addClassDescription(
19  "Base class for calculating residual and Jacobian for peridynamic kernels");
20 
21  params.addParam<bool>("full_jacobian",
22  false,
23  "Whether to include coupling terms with nodes connected to neighbors in "
24  "the Jacobian matrix for state based formulations");
25 
26  return params;
27 }
28 
29 PeridynamicsKernelBase::PeridynamicsKernelBase(const InputParameters & parameters)
30  : Kernel(parameters),
31  _bond_status_var(&_subproblem.getStandardVariable(_tid, "bond_status")),
32  _use_full_jacobian(getParam<bool>("full_jacobian")),
33  _pdmesh(dynamic_cast<PeridynamicsMesh &>(_mesh)),
34  _dim(_pdmesh.dimension()),
35  _nnodes(2),
36  _vols_ij(_nnodes),
37  _dg_vol_frac_ij(_nnodes),
38  _horiz_rad(_nnodes)
39 {
40 }
41 
42 void
44 {
45  for (unsigned int nd = 0; nd < _nnodes; ++nd)
46  {
47  _vols_ij[nd] = _pdmesh.getPDNodeVolume(_current_elem->node_id(nd));
48  dof_id_type id_ji_in_ij =
49  _pdmesh.getNeighborIndex(_current_elem->node_id(nd), _current_elem->node_id(1 - nd));
50  _dg_vol_frac_ij[nd] = _pdmesh.getDefGradVolFraction(_current_elem->node_id(nd), id_ji_in_ij);
51  _horiz_rad[nd] = _pdmesh.getHorizon(_current_elem->node_id(nd));
52  }
53 
54  _origin_vec_ij = _pdmesh.getPDNodeCoord(_current_elem->node_id(1)) -
55  _pdmesh.getPDNodeCoord(_current_elem->node_id(0));
56  _bond_status_ij = _bond_status_var->getElementalValue(_current_elem);
57 }
58 
59 void
61 {
62  prepare();
63 
64  DenseVector<Number> & re = _assembly.residualBlock(_var.number());
65  mooseAssert(re.size() == _nnodes,
66  "PeridynamicsKernelBase is designed to only work with EDGE2 elements");
67  _local_re.resize(re.size());
68  _local_re.zero();
69 
71 
72  re += _local_re;
73 
74  if (_has_save_in)
75  {
76  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
77  for (unsigned int i = 0; i < _save_in.size(); ++i)
78  _save_in[i]->sys().solution().add_vector(_local_re, _save_in[i]->dofIndices());
79  }
80 
81  _local_re.zero();
82 
84 }
85 
86 void
88 {
89  prepare();
90 
91  DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), _var.number());
92  _local_ke.resize(ke.m(), ke.n());
93  _local_ke.zero();
94 
96 
97  ke += _local_ke;
98 
99  if (_has_diag_save_in)
100  {
101  unsigned int rows = ke.m();
102  DenseVector<Number> diag(rows);
103  for (unsigned int i = 0; i < rows; ++i)
104  diag(i) = _local_ke(i, i);
105 
106  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
107  for (unsigned int i = 0; i < _diag_save_in.size(); ++i)
108  _diag_save_in[i]->sys().solution().add_vector(diag, _diag_save_in[i]->dofIndices());
109  }
110 
111  _local_ke.zero();
112 
113  if (_use_full_jacobian)
114  computeNonlocalJacobian();
115 }
PeridynamicsKernelBase::computeResidual
virtual void computeResidual() override
Definition: PeridynamicsKernelBase.C:60
PeridynamicsMesh::getPDNodeVolume
Real getPDNodeVolume(dof_id_type node_id)
Function to return nodal volume for node node_id.
Definition: PeridynamicsMesh.C:435
PeridynamicsKernelBase::_bond_status_ij
Real _bond_status_ij
Bond status of current bond/edge2.
Definition: PeridynamicsKernelBase.h:74
PeridynamicsKernelBase::computeLocalJacobian
virtual void computeLocalJacobian()
Function to compute local contribution to the diagonal Jacobian at the current nodes.
Definition: PeridynamicsKernelBase.h:48
PeridynamicsKernelBase::_bond_status_var
MooseVariable * _bond_status_var
Bond_status variable.
Definition: PeridynamicsKernelBase.h:56
PeridynamicsMesh.h
PeridynamicsKernelBase::_nnodes
const unsigned int _nnodes
Definition: PeridynamicsKernelBase.h:64
PeridynamicsMesh
Peridynamics mesh class.
Definition: PeridynamicsMesh.h:25
PeridynamicsKernelBase::_dg_vol_frac_ij
std::vector< Real > _dg_vol_frac_ij
Definition: PeridynamicsKernelBase.h:66
PeridynamicsKernelBase::_horiz_rad
std::vector< Real > _horiz_rad
Definition: PeridynamicsKernelBase.h:67
PeridynamicsKernelBase::prepare
virtual void prepare()
Function to precalculate data which will be used in the derived classes.
Definition: PeridynamicsKernelBase.C:43
PeridynamicsMesh::getPDNodeCoord
Point getPDNodeCoord(dof_id_type node_id)
Function to return coordinates for node node_id.
Definition: PeridynamicsMesh.C:420
PeridynamicsKernelBase.h
PeridynamicsKernelBase::_use_full_jacobian
const bool _use_full_jacobian
Option to use full jacobian including nonlocal constribution or not.
Definition: PeridynamicsKernelBase.h:59
PeridynamicsKernelBase::_pdmesh
PeridynamicsMesh & _pdmesh
Parameters for peridynamic mesh information.
Definition: PeridynamicsKernelBase.h:62
PeridynamicsMesh::getHorizon
Real getHorizon(dof_id_type node_id)
Function to return horizon size.
Definition: PeridynamicsMesh.C:471
PeridynamicsMesh::getNeighborIndex
dof_id_type getNeighborIndex(dof_id_type node_i, dof_id_type node_j)
Function to return the local neighbor index of node_j from node_i's neighbor list.
Definition: PeridynamicsMesh.C:368
PeridynamicsKernelBase::PeridynamicsKernelBase
PeridynamicsKernelBase(const InputParameters &parameters)
Definition: PeridynamicsKernelBase.C:29
PeridynamicsKernelBase::computeNonlocalResidual
virtual void computeNonlocalResidual()
Function to compute nonlocal contribution to the residual at the current nodes.
Definition: PeridynamicsKernelBase.h:43
PeridynamicsKernelBase::_origin_vec_ij
RealGradient _origin_vec_ij
Vector for current bond under undefored configuration.
Definition: PeridynamicsKernelBase.h:71
validParams< PeridynamicsKernelBase >
InputParameters validParams< PeridynamicsKernelBase >()
Definition: PeridynamicsKernelBase.C:15
PeridynamicsMesh::getDefGradVolFraction
Real getDefGradVolFraction(dof_id_type node_id, dof_id_type neighbor_id)
Function to return summation of volumes of bond-associated neighbors used in the deformation gradient...
Definition: PeridynamicsMesh.C:453
PeridynamicsKernelBase::computeJacobian
virtual void computeJacobian() override
Definition: PeridynamicsKernelBase.C:87
PeridynamicsKernelBase::computeLocalResidual
virtual void computeLocalResidual()=0
Function to compute local contribution to the residual at the current nodes.
PeridynamicsKernelBase::_vols_ij
std::vector< Real > _vols_ij
Definition: PeridynamicsKernelBase.h:65