Line data Source code
1 : //* This file is part of the MOOSE framework 2 : //* https://mooseframework.inl.gov 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 "XFEMEqualValueAtInterface.h" 11 : #include "FEProblem.h" 12 : #include "GeometricCutUserObject.h" 13 : #include "XFEM.h" 14 : 15 : registerMooseObject("XFEMApp", XFEMEqualValueAtInterface); 16 : 17 : InputParameters 18 32 : XFEMEqualValueAtInterface::validParams() 19 : { 20 32 : InputParameters params = ElemElemConstraint::validParams(); 21 64 : params.addRequiredParam<Real>("alpha", "Penalty parameter in penalty formulation."); 22 64 : params.addRequiredParam<Real>("value", "Prescribed value at the interface."); 23 64 : params.addParam<UserObjectName>( 24 : "geometric_cut_userobject", 25 : "Name of GeometricCutUserObject associated with this constraint."); 26 32 : params.addClassDescription("Enforce that the solution have the same value on opposing sides of " 27 : "an XFEM interface."); 28 32 : return params; 29 0 : } 30 : 31 16 : XFEMEqualValueAtInterface::XFEMEqualValueAtInterface(const InputParameters & parameters) 32 48 : : ElemElemConstraint(parameters), _alpha(getParam<Real>("alpha")), _value(getParam<Real>("value")) 33 : { 34 48 : _xfem = std::dynamic_pointer_cast<XFEM>(_fe_problem.getXFEM()); 35 16 : if (_xfem == nullptr) 36 0 : mooseError("Problem casting to XFEM in XFEMEqualValueAtInterface"); 37 : 38 : const UserObject * uo = 39 32 : &(_fe_problem.getUserObjectBase(getParam<UserObjectName>("geometric_cut_userobject"))); 40 : 41 16 : if (dynamic_cast<const GeometricCutUserObject *>(uo) == nullptr) 42 0 : mooseError("UserObject casting to GeometricCutUserObject in XFEMEqualValueAtInterface"); 43 : 44 16 : _interface_id = _xfem->getGeometricCutID(dynamic_cast<const GeometricCutUserObject *>(uo)); 45 16 : } 46 : 47 48 : XFEMEqualValueAtInterface::~XFEMEqualValueAtInterface() {} 48 : 49 : void 50 609 : XFEMEqualValueAtInterface::reinitConstraintQuadrature(const ElementPairInfo & element_pair_info) 51 : { 52 609 : ElemElemConstraint::reinitConstraintQuadrature(element_pair_info); 53 609 : } 54 : 55 : Real 56 14096 : XFEMEqualValueAtInterface::computeQpResidual(Moose::DGResidualType type) 57 : { 58 : Real r = 0; 59 : 60 14096 : switch (type) 61 : { 62 7048 : case Moose::Element: 63 7048 : r += _alpha * (_u[_qp] - _value) * _test[_i][_qp]; 64 7048 : break; 65 : 66 7048 : case Moose::Neighbor: 67 7048 : r += _alpha * (_u_neighbor[_qp] - _value) * _test_neighbor[_i][_qp]; 68 7048 : break; 69 : } 70 14096 : return r; 71 : } 72 : 73 : Real 74 65792 : XFEMEqualValueAtInterface::computeQpJacobian(Moose::DGJacobianType type) 75 : { 76 : Real r = 0; 77 : 78 65792 : switch (type) 79 : { 80 16448 : case Moose::ElementElement: 81 16448 : r += _alpha * _phi[_j][_qp] * _test[_i][_qp]; 82 16448 : break; 83 : 84 16448 : case Moose::NeighborNeighbor: 85 16448 : r += _alpha * _phi_neighbor[_j][_qp] * _test_neighbor[_i][_qp]; 86 16448 : break; 87 : 88 : default: 89 : break; 90 : } 91 : 92 65792 : return r; 93 : }