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 "NodalWaveSpeed.h" 11 : 12 : // MOOSE includes 13 : #include "MooseVariable.h" 14 : #include "SystemBase.h" 15 : 16 : #include "libmesh/numeric_vector.h" 17 : #include "libmesh/quadrature.h" 18 : 19 : registerMooseObject("ContactApp", NodalWaveSpeed); 20 : 21 : InputParameters 22 156 : NodalWaveSpeed::validParams() 23 : { 24 156 : InputParameters params = SideIntegralVariableUserObject::validParams(); 25 156 : params.set<ExecFlagEnum>("execute_on") = EXEC_LINEAR; 26 156 : params.addClassDescription("Compute the tributary wave speeds for nodes on a surface"); 27 156 : return params; 28 0 : } 29 : 30 84 : NodalWaveSpeed::NodalWaveSpeed(const InputParameters & parameters) 31 : : SideIntegralVariableUserObject(parameters), 32 84 : _phi(_variable->phiFace()), 33 84 : _system(_variable->sys()), 34 84 : _aux_solution(_system.solution()), 35 168 : _wave_speed(getMaterialProperty<Real>("wave_speed")) 36 : { 37 84 : } 38 : 39 252 : NodalWaveSpeed::~NodalWaveSpeed() {} 40 : 41 : void 42 1968 : NodalWaveSpeed::threadJoin(const UserObject & fred) 43 : { 44 1968 : const NodalWaveSpeed & na = dynamic_cast<const NodalWaveSpeed &>(fred); 45 : 46 : std::map<const Node *, Real>::const_iterator it = na._node_wave_speeds.begin(); 47 : const std::map<const Node *, Real>::const_iterator it_end = na._node_wave_speeds.end(); 48 1968 : for (; it != it_end; ++it) 49 0 : _node_wave_speeds[it->first] += it->second; 50 1968 : } 51 : 52 : void 53 10496 : NodalWaveSpeed::initialize() 54 : { 55 : _node_wave_speeds.clear(); 56 10496 : } 57 : 58 : void 59 45112 : NodalWaveSpeed::execute() 60 : { 61 45112 : std::vector<Real> node_wave_speeds(_phi.size()); 62 225560 : for (unsigned qp(0); qp < _qrule->n_points(); ++qp) 63 1624032 : for (unsigned j(0); j < _phi.size(); ++j) 64 1443584 : node_wave_speeds[j] += (_phi[j][qp] * _wave_speed[qp]); 65 : 66 406008 : for (unsigned j(0); j < _phi.size(); ++j) 67 : { 68 360896 : const Real wave_speed = node_wave_speeds[j]; 69 360896 : if (wave_speed != 0) 70 180448 : _node_wave_speeds[_current_elem->node_ptr(j)] = wave_speed; 71 : } 72 45112 : } 73 : 74 : void 75 8528 : NodalWaveSpeed::finalize() 76 : { 77 : const std::map<const Node *, Real>::iterator it_end = _node_wave_speeds.end(); 78 101588 : for (std::map<const Node *, Real>::iterator it = _node_wave_speeds.begin(); it != it_end; ++it) 79 : { 80 93060 : const Node * const node = it->first; 81 93060 : dof_id_type dof = node->dof_number(_system.number(), _variable->number(), 0); 82 93060 : _aux_solution.set(dof, it->second); 83 : } 84 8528 : _aux_solution.close(); 85 8528 : }