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 "ComputeGrainCenterUserObject.h" 11 : 12 : #include "libmesh/quadrature.h" 13 : 14 : InputParameters 15 0 : ComputeGrainCenterUserObject::validParams() 16 : { 17 0 : InputParameters params = ElementUserObject::validParams(); 18 0 : params.addClassDescription("Userobject for calculating the grain volumes and grain centers"); 19 0 : params.addRequiredCoupledVarWithAutoBuild("etas", "var_name_base", "op_num", "order parameters"); 20 0 : return params; 21 0 : } 22 : 23 0 : ComputeGrainCenterUserObject::ComputeGrainCenterUserObject(const InputParameters & parameters) 24 : : ElementUserObject(parameters), 25 0 : _ncrys(coupledComponents("etas")), // determine number of grains from the number of names passed 26 : // in. Note this is the actual number -1 27 0 : _vals(coupledValues("etas")), 28 0 : _ncomp(4 * _ncrys), 29 0 : _grain_data(_ncomp), 30 0 : _grain_volumes(_ncrys), 31 0 : _grain_centers(_ncrys) 32 : { 33 0 : } 34 : 35 : void 36 0 : ComputeGrainCenterUserObject::initialize() 37 : { 38 0 : for (unsigned int i = 0; i < _ncomp; ++i) 39 0 : _grain_data[i] = 0; 40 0 : } 41 : 42 : void 43 0 : ComputeGrainCenterUserObject::execute() 44 : { 45 0 : for (unsigned int i = 0; i < _ncrys; ++i) 46 0 : for (_qp = 0; _qp < _qrule->n_points(); ++_qp) 47 : { 48 0 : _grain_data[4 * i + 0] += _JxW[_qp] * _coord[_qp] * (*_vals[i])[_qp]; 49 0 : _grain_data[4 * i + 1] += _JxW[_qp] * _coord[_qp] * _q_point[_qp](0) * (*_vals[i])[_qp]; 50 0 : _grain_data[4 * i + 2] += _JxW[_qp] * _coord[_qp] * _q_point[_qp](1) * (*_vals[i])[_qp]; 51 0 : _grain_data[4 * i + 3] += _JxW[_qp] * _coord[_qp] * _q_point[_qp](2) * (*_vals[i])[_qp]; 52 : } 53 0 : } 54 : 55 : void 56 0 : ComputeGrainCenterUserObject::finalize() 57 : { 58 0 : gatherSum(_grain_data); 59 : 60 0 : for (unsigned int i = 0; i < _ncrys; ++i) 61 : { 62 0 : _grain_volumes[i] = _grain_data[4 * i + 0]; 63 0 : _grain_centers[i](0) = _grain_data[4 * i + 1] / _grain_volumes[i]; 64 0 : _grain_centers[i](1) = _grain_data[4 * i + 2] / _grain_volumes[i]; 65 0 : _grain_centers[i](2) = _grain_data[4 * i + 3] / _grain_volumes[i]; 66 : } 67 0 : } 68 : 69 : void 70 0 : ComputeGrainCenterUserObject::threadJoin(const UserObject & y) 71 : { 72 : const auto & pps = static_cast<const ComputeGrainCenterUserObject &>(y); 73 0 : for (unsigned int i = 0; i < _ncomp; ++i) 74 0 : _grain_data[i] += pps._grain_data[i]; 75 0 : } 76 : 77 : const std::vector<Real> & 78 0 : ComputeGrainCenterUserObject::getGrainVolumes() const 79 : { 80 0 : return _grain_volumes; 81 : } 82 : 83 : const std::vector<Point> & 84 0 : ComputeGrainCenterUserObject::getGrainCenters() const 85 : { 86 0 : return _grain_centers; 87 : }