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 "InterfaceKernelBase.h" 11 : 12 : // MOOSE includes 13 : #include "Assembly.h" 14 : #include "MooseVariableFE.h" 15 : #include "SystemBase.h" 16 : 17 : #include "libmesh/quadrature.h" 18 : 19 : InputParameters 20 201487 : InterfaceKernelBase::validParams() 21 : { 22 201487 : InputParameters params = NeighborResidualObject::validParams(); 23 201487 : params += BoundaryRestrictable::validParams(); 24 201487 : params += TwoMaterialPropertyInterface::validParams(); 25 : 26 604461 : params.addParam<bool>("use_displaced_mesh", 27 402974 : false, 28 : "Whether or not this object should use the " 29 : "displaced mesh for computation. Note that in " 30 : "the case this is true but no displacements " 31 : "are provided in the Mesh block the " 32 : "undisplaced mesh will still be used."); 33 201487 : params.addParamNamesToGroup("use_displaced_mesh", "Advanced"); 34 : 35 201487 : params.declareControllable("enable"); 36 201487 : params.addRequiredCoupledVar("neighbor_var", "The variable on the other side of the interface."); 37 201487 : params.set<std::string>("_moose_base") = "InterfaceKernel"; 38 201487 : params.registerSystemAttributeName("InterfaceKernel"); 39 201487 : params.addParam<std::vector<AuxVariableName>>( 40 : "save_in", 41 : {}, 42 : "The name of auxiliary variables to save this Kernel's residual contributions to. " 43 : " Everything about that variable must match everything about this variable (the " 44 : "type, what blocks it's on, etc.)"); 45 201487 : params.addParam<std::vector<AuxVariableName>>( 46 : "diag_save_in", 47 : {}, 48 : "The name of auxiliary variables to save this Kernel's diagonal Jacobian " 49 : "contributions to. Everything about that variable must match everything " 50 : "about this variable (the type, what blocks it's on, etc.)"); 51 : 52 201487 : MultiMooseEnum save_in_var_side("m s"); 53 201487 : params.addParam<MultiMooseEnum>( 54 : "save_in_var_side", 55 : save_in_var_side, 56 : "This parameter must exist if save_in variables are specified and must have the same length " 57 : "as save_in. This vector specifies whether the corresponding aux_var should save-in " 58 : "residual contributions from the primary ('p') or secondary side ('s')."); 59 201487 : params.addParam<MultiMooseEnum>( 60 : "diag_save_in_var_side", 61 : save_in_var_side, 62 : "This parameter must exist if diag_save_in variables are specified and must have the same " 63 : "length as diag_save_in. This vector specifies whether the corresponding aux_var should " 64 : "save-in jacobian contributions from the primary ('p') or secondary side ('s')."); 65 201487 : params.addParamNamesToGroup("diag_save_in save_in save_in_var_side diag_save_in_var_side", 66 : "Residual and Jacobian debug output"); 67 : 68 : // InterfaceKernels always need one layer of ghosting. 69 201487 : params.addRelationshipManager("ElementSideNeighborLayers", 70 : Moose::RelationshipManagerType::GEOMETRIC | 71 : Moose::RelationshipManagerType::ALGEBRAIC | 72 : Moose::RelationshipManagerType::COUPLING); 73 402974 : return params; 74 201487 : } 75 : 76 : // Static mutex definitions 77 : Threads::spin_mutex InterfaceKernelBase::_resid_vars_mutex; 78 : Threads::spin_mutex InterfaceKernelBase::_jacoby_vars_mutex; 79 : 80 931 : InterfaceKernelBase::InterfaceKernelBase(const InputParameters & parameters) 81 : : NeighborResidualObject(parameters), 82 : BoundaryRestrictable(this, false), // false for _not_ nodal 83 : NeighborCoupleableMooseVariableDependencyIntermediateInterface(this, false, false), 84 : TwoMaterialPropertyInterface(this, Moose::EMPTY_BLOCK_IDS, boundaryIDs()), 85 : ElementIDInterface(this), 86 1862 : _current_elem(_assembly.elem()), 87 931 : _current_elem_volume(_assembly.elemVolume()), 88 931 : _neighbor_elem(_assembly.neighbor()), 89 931 : _neighbor_elem_volume(_assembly.neighborVolume()), 90 931 : _current_side(_assembly.side()), 91 931 : _current_side_elem(_assembly.sideElem()), 92 931 : _current_side_volume(_assembly.sideElemVolume()), 93 931 : _coord_sys(_assembly.coordSystem()), 94 931 : _q_point(_assembly.qPointsFace()), 95 931 : _qrule(_assembly.qRuleFace()), 96 931 : _JxW(_assembly.JxWFace()), 97 931 : _coord(_assembly.coordTransformation()), 98 931 : _save_in_var_side(parameters.get<MultiMooseEnum>("save_in_var_side")), 99 931 : _save_in_strings(parameters.get<std::vector<AuxVariableName>>("save_in")), 100 931 : _diag_save_in_var_side(parameters.get<MultiMooseEnum>("diag_save_in_var_side")), 101 2793 : _diag_save_in_strings(parameters.get<std::vector<AuxVariableName>>("diag_save_in")) 102 : { 103 931 : } 104 : 105 : const Real & 106 0 : InterfaceKernelBase::getNeighborElemVolume() 107 : { 108 0 : return _assembly.neighborVolume(); 109 : } 110 : 111 : void 112 30740 : InterfaceKernelBase::prepareShapes(const unsigned int var_num) 113 : { 114 30740 : _subproblem.prepareFaceShapes(var_num, _tid); 115 30740 : }