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 "NodalEqualValueConstraint.h" 11 : 12 : // MOOSE includes 13 : #include "Assembly.h" 14 : #include "MooseVariableScalar.h" 15 : 16 : registerMooseObject("MooseApp", NodalEqualValueConstraint); 17 : 18 : InputParameters 19 14303 : NodalEqualValueConstraint::validParams() 20 : { 21 14303 : InputParameters params = NodalScalarKernel::validParams(); 22 14303 : params.addClassDescription("Constrain two nodes to have identical values."); 23 14303 : params.addRequiredCoupledVar("var", "Variable(s) to put the constraint on"); 24 14303 : return params; 25 0 : } 26 : 27 21 : NodalEqualValueConstraint::NodalEqualValueConstraint(const InputParameters & parameters) 28 21 : : NodalScalarKernel(parameters), _val_number(coupledIndices("var")), _value(coupledValues("var")) 29 : { 30 21 : if (_node_ids.size() != 2) 31 4 : paramError("boundary", "invalid number of nodes: want 2, got ", _node_ids.size()); 32 17 : } 33 : 34 : void 35 18 : NodalEqualValueConstraint::computeResidual() 36 : { 37 18 : prepareVectorTag(_assembly, _var.number()); 38 : 39 36 : for (unsigned int k = 0; k < _value.size(); k++) 40 18 : _local_re(k) = (*_value[k])[0] - (*_value[k])[1]; 41 : 42 18 : assignTaggedLocalResidual(); 43 18 : } 44 : 45 : void 46 9 : NodalEqualValueConstraint::computeJacobian() 47 : { 48 9 : prepareMatrixTag(_assembly, _var.number(), _var.number()); 49 : 50 : // put zeroes on the diagonal (we have to do it, otherwise PETSc will complain!) 51 18 : for (unsigned int i = 0; i < _local_ke.m(); i++) 52 18 : for (unsigned int j = 0; j < _local_ke.n(); j++) 53 9 : _local_ke(i, j) = 0.; 54 : 55 9 : assignTaggedLocalMatrix(); 56 : 57 18 : for (unsigned int k = 0; k < _value.size(); k++) 58 : { 59 9 : prepareMatrixTag(_assembly, _var.number(), _val_number[k]); 60 : 61 9 : _local_ke(k, 0) = 1.; 62 9 : _local_ke(k, 1) = -1.; 63 : 64 9 : assignTaggedLocalMatrix(); 65 : } 66 9 : }