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 "GrainForceAndTorqueSum.h" 11 : 12 : registerMooseObject("PhaseFieldApp", GrainForceAndTorqueSum); 13 : 14 : InputParameters 15 14 : GrainForceAndTorqueSum::validParams() 16 : { 17 14 : InputParameters params = GeneralUserObject::validParams(); 18 14 : params.addClassDescription("Userobject for summing forces and torques acting on a grain"); 19 28 : params.addParam<std::vector<UserObjectName>>( 20 : "grain_forces", 21 : "List of names of user objects that provides forces and torques applied to grains"); 22 28 : params.addParam<unsigned int>("grain_num", "Number of grains"); 23 14 : return params; 24 0 : } 25 : 26 7 : GrainForceAndTorqueSum::GrainForceAndTorqueSum(const InputParameters & parameters) 27 : : GrainForceAndTorqueInterface(), 28 : GeneralUserObject(parameters), 29 14 : _sum_objects(getParam<std::vector<UserObjectName>>("grain_forces")), 30 7 : _num_forces(_sum_objects.size()), 31 14 : _grain_num(getParam<unsigned int>("grain_num")), 32 7 : _sum_forces(_num_forces), 33 7 : _force_values(_grain_num), 34 14 : _torque_values(_grain_num) 35 : { 36 21 : for (unsigned int i = 0; i < _num_forces; ++i) 37 14 : _sum_forces[i] = &getUserObjectByName<GrainForceAndTorqueInterface>(_sum_objects[i]); 38 7 : } 39 : 40 : void 41 91 : GrainForceAndTorqueSum::initialize() 42 : { 43 273 : for (unsigned int i = 0; i < _grain_num; ++i) 44 : { 45 182 : _force_values[i] = 0.0; 46 : _torque_values[i] = 0.0; 47 546 : for (unsigned int j = 0; j < _num_forces; ++j) 48 : { 49 364 : _force_values[i] += (_sum_forces[j]->getForceValues())[i]; 50 364 : _torque_values[i] += (_sum_forces[j]->getTorqueValues())[i]; 51 : } 52 : } 53 : 54 91 : if (_fe_problem.currentlyComputingJacobian()) 55 : { 56 39 : unsigned int total_dofs = _subproblem.es().n_dofs(); 57 39 : _c_jacobians.resize(6 * _grain_num * total_dofs, 0.0); 58 39 : _eta_jacobians.resize(_grain_num); 59 : 60 84279 : for (unsigned int i = 0; i < _c_jacobians.size(); ++i) 61 252720 : for (unsigned int j = 0; j < _num_forces; ++j) 62 168480 : _c_jacobians[i] += (_sum_forces[j]->getForceCJacobians())[i]; 63 : 64 117 : for (unsigned int i = 0; i < _grain_num; ++i) 65 : { 66 78 : _eta_jacobians[i].resize(6 * _grain_num * total_dofs, 0.0); 67 168558 : for (unsigned int j = 0; j < _eta_jacobians[i].size(); ++j) 68 505440 : for (unsigned int k = 0; k < _num_forces; ++k) 69 336960 : _eta_jacobians[i][j] += (_sum_forces[k]->getForceEtaJacobians())[i][j]; 70 : } 71 : } 72 91 : } 73 : 74 : const std::vector<RealGradient> & 75 7 : GrainForceAndTorqueSum::getForceValues() const 76 : { 77 7 : return _force_values; 78 : } 79 : 80 : const std::vector<RealGradient> & 81 7 : GrainForceAndTorqueSum::getTorqueValues() const 82 : { 83 7 : return _torque_values; 84 : } 85 : 86 : const std::vector<Real> & 87 0 : GrainForceAndTorqueSum::getForceCJacobians() const 88 : { 89 0 : return _c_jacobians; 90 : } 91 : 92 : const std::vector<std::vector<Real>> & 93 0 : GrainForceAndTorqueSum::getForceEtaJacobians() const 94 : { 95 0 : return _eta_jacobians; 96 : }