Line data Source code
1 : //* This file is part of the MOOSE framework 2 : //* https://www.mooseframework.org 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 "EulerAngleUpdateFromReporter.h" 11 : 12 : #include <fstream> 13 : 14 : registerMooseObject("SolidMechanicsApp", EulerAngleUpdateFromReporter); 15 : 16 : InputParameters 17 10 : EulerAngleUpdateFromReporter::validParams() 18 : { 19 10 : InputParameters params = EulerAngleFileReader::validParams(); 20 10 : params.addClassDescription("Update Euler angle from reporter value."); 21 20 : params.addRequiredParam<ReporterName>( 22 : "euler_angle_0_name", 23 : "reporter name for the first component of the Euler angles in degrees. This " 24 : "parameter uses the reporter syntax <reporter>/<name>."); 25 20 : params.addRequiredParam<ReporterName>( 26 : "euler_angle_1_name", 27 : "reporter name for the second component of the Euler angles in degrees. This " 28 : "parameter uses the reporter syntax <reporter>/<name>."); 29 20 : params.addRequiredParam<ReporterName>( 30 : "euler_angle_2_name", 31 : "reporter name for the third component of the Euler angles in degrees. This " 32 : "parameter uses the reporter syntax <reporter>/<name>."); 33 20 : params.addRequiredParam<ReporterName>("grain_id_name", 34 : "reporter name for the grain IDs. This " 35 : "parameter uses the reporter syntax <reporter>/<name>."); 36 10 : return params; 37 0 : } 38 : 39 5 : EulerAngleUpdateFromReporter::EulerAngleUpdateFromReporter(const InputParameters & params) 40 : : EulerAngleFileReader(params), 41 5 : _euler_angle_0( 42 15 : getReporterValue<std::vector<Real>>("euler_angle_0_name", REPORTER_MODE_REPLICATED)), 43 5 : _euler_angle_1( 44 15 : getReporterValue<std::vector<Real>>("euler_angle_1_name", REPORTER_MODE_REPLICATED)), 45 5 : _euler_angle_2( 46 15 : getReporterValue<std::vector<Real>>("euler_angle_2_name", REPORTER_MODE_REPLICATED)), 47 5 : _grain_id(getReporterValue<std::vector<Real>>("grain_id_name", REPORTER_MODE_REPLICATED)), 48 5 : _first_time(true) 49 : { 50 5 : } 51 : 52 : void 53 11 : EulerAngleUpdateFromReporter::initialize() 54 : { 55 : // only update Euler angles info from the reporter when the initial Euler angle has been read from 56 : // file 57 11 : if (_first_time) 58 : { 59 5 : _angles.clear(); 60 5 : EulerAngleFileReader::readFile(); 61 5 : _first_time = false; 62 : } 63 : else 64 6 : UpdateEulerAngle(); 65 10 : } 66 : 67 : void 68 6 : EulerAngleUpdateFromReporter::UpdateEulerAngle() 69 : { 70 : // check sizes of the containers 71 6 : if (_grain_id.size() != _euler_angle_0.size() || _grain_id.size() != _euler_angle_1.size() || 72 5 : _grain_id.size() != _euler_angle_2.size()) 73 1 : paramError("grain_id_name", "Number of reporters' entries do not match."); 74 : 75 : // Note here the size of the `_angles` and `_grain_id` can differ, as we resize the `_angles` 76 : // container based on the largest grain ID. This can be improved by having `_angles` as a 77 : // unordered_map which stores grain ID and EulerAngles pairs. 78 : 79 : // zip the grain id with the euler angles 80 : std::map<int, EulerAngles> ea_data; 81 45 : for (const auto i : index_range(_grain_id)) 82 : { 83 40 : unsigned int gid = (unsigned int)(_grain_id[i]); 84 40 : ea_data[gid] = EulerAngles(_euler_angle_0[i], _euler_angle_1[i], _euler_angle_2[i]); 85 : } 86 : 87 : // re-assign euler angles based on the new data 88 5 : auto max_grain_id = ea_data.rbegin()->first; 89 5 : _angles.clear(); 90 5 : _angles.resize(max_grain_id + 1); // make sure _angles[max_grain_id] is valid 91 : 92 45 : for (const auto it : ea_data) 93 : { 94 40 : _angles[it.first] = it.second; 95 : } 96 5 : }