LCOV - code coverage report
Current view: top level - src/userobjects - EulerAngleUpdateFromReporter.C (source / functions) Hit Total Coverage
Test: idaholab/moose solid_mechanics: #32971 (54bef8) with base c6cf66 Lines: 38 39 97.4 %
Date: 2026-05-29 20:40:07 Functions: 4 4 100.0 %
Legend: Lines: hit not hit

          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 : }

Generated by: LCOV version 1.14