LCOV - code coverage report
Current view: top level - src/mesh - EBSDMesh.C (source / functions) Hit Total Coverage
Test: idaholab/moose phase_field: #31405 (292dce) with base fef103 Lines: 0 81 0.0 %
Date: 2025-09-04 07:55:36 Functions: 0 6 0.0 %
Legend: Lines: hit not hit

          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 "EBSDMesh.h"
      11             : #include "MooseApp.h"
      12             : 
      13             : #include <fstream>
      14             : 
      15             : registerMooseObject("PhaseFieldApp", EBSDMesh);
      16             : 
      17             : InputParameters
      18           0 : EBSDMesh::validParams()
      19             : {
      20           0 :   InputParameters params = GeneratedMesh::validParams();
      21           0 :   params.addClassDescription("Mesh generated from a specified DREAM.3D EBSD data file.");
      22           0 :   params.addRequiredParam<FileName>("filename", "The name of the file containing the EBSD data");
      23           0 :   params.addParam<unsigned int>(
      24           0 :       "uniform_refine", 0, "Number of coarsening levels available in adaptive mesh refinement.");
      25             : 
      26             :   // suppress parameters
      27           0 :   params.suppressParameter<MooseEnum>("dim");
      28           0 :   params.set<MooseEnum>("dim") = MooseEnum("1=1 2 3", "1");
      29           0 :   params.suppressParameter<unsigned int>("nx");
      30           0 :   params.suppressParameter<unsigned int>("ny");
      31           0 :   params.suppressParameter<unsigned int>("nz");
      32           0 :   params.suppressParameter<Real>("xmin");
      33           0 :   params.suppressParameter<Real>("ymin");
      34           0 :   params.suppressParameter<Real>("zmin");
      35           0 :   params.suppressParameter<Real>("xmax");
      36           0 :   params.suppressParameter<Real>("ymax");
      37           0 :   params.suppressParameter<Real>("zmax");
      38             : 
      39           0 :   return params;
      40           0 : }
      41             : 
      42           0 : EBSDMesh::EBSDMesh(const InputParameters & parameters)
      43           0 :   : GeneratedMesh(parameters), _filename(getParam<FileName>("filename"))
      44             : {
      45           0 :   mooseDeprecated(
      46             :       "EBSDMesh is deprecated, please use the EBSDMeshGenerator instead. For example:\n\n[Mesh]\n  "
      47             :       "type = EBDSMesh\n  filename = my_ebsd_data.dat\n[]\n\nbecomes\n\n[Mesh]\n  [ebsd_mesh]\n    "
      48             :       "type = EBDSMeshGenerator\n    filename = my_ebsd_data.dat\n  []\n[]");
      49             : 
      50           0 :   if (_nx != 1 || _ny != 1 || _nz != 1)
      51           0 :     mooseWarning("Do not specify mesh geometry information, it is read from the EBSD file.");
      52           0 : }
      53             : 
      54           0 : EBSDMesh::~EBSDMesh() {}
      55             : 
      56             : void
      57           0 : EBSDMesh::readEBSDHeader()
      58             : {
      59           0 :   std::ifstream stream_in(_filename.c_str());
      60             : 
      61           0 :   if (!stream_in)
      62           0 :     paramError("filename", "Can't open EBSD file: ", _filename);
      63             : 
      64             :   // Labels to look for in the header
      65             :   std::vector<std::string> labels = {
      66           0 :       "x_step", "x_dim", "y_step", "y_dim", "z_step", "z_dim", "x_min", "y_min", "z_min"};
      67             : 
      68             :   // Dimension variables to store once they are found in the header
      69             :   // X_step, X_Dim, Y_step, Y_Dim, Z_step, Z_Dim
      70             :   // We use Reals even though the Dim values should all be integers...
      71           0 :   std::vector<Real> label_vals(labels.size(), 0.0);
      72             : 
      73             :   std::string line;
      74           0 :   while (std::getline(stream_in, line))
      75             :   {
      76             :     // We need to process the comment lines that have:
      77             :     // X_step, X_Dim
      78             :     // Y_step, Y_Dim
      79             :     // Z_step, Z_Dim
      80             :     // in them. The labels are case insensitive.
      81           0 :     if (line.find("#") == 0)
      82             :     {
      83             :       // Process lines that start with a comment character (comments and meta data)
      84             :       std::transform(line.begin(), line.end(), line.begin(), ::tolower);
      85             : 
      86           0 :       for (unsigned i = 0; i < labels.size(); ++i)
      87           0 :         if (line.find(labels[i]) != std::string::npos)
      88             :         {
      89             :           std::string dummy;
      90           0 :           std::istringstream iss(line);
      91           0 :           iss >> dummy >> dummy >> label_vals[i];
      92             : 
      93             :           // One label per line, break out of for loop over labels
      94             :           break;
      95           0 :         }
      96             :     }
      97             :     else
      98             :       // first non comment line marks the end of the header
      99             :       break;
     100             :   }
     101             : 
     102             :   // Copy stuff out of the label_vars array into class variables
     103           0 :   _geometry.d[0] = label_vals[0];
     104           0 :   _geometry.n[0] = label_vals[1];
     105           0 :   _geometry.min[0] = label_vals[6];
     106             : 
     107           0 :   _geometry.d[1] = label_vals[2];
     108           0 :   _geometry.n[1] = label_vals[3];
     109           0 :   _geometry.min[1] = label_vals[7];
     110             : 
     111           0 :   _geometry.d[2] = label_vals[4];
     112           0 :   _geometry.n[2] = label_vals[5];
     113           0 :   _geometry.min[2] = label_vals[8];
     114             : 
     115             :   unsigned int dim;
     116             : 
     117             :   // determine mesh dimension
     118           0 :   for (dim = 3; dim > 0 && _geometry.n[dim - 1] == 0; --dim)
     119             :     ;
     120             : 
     121             :   // check if the data has nonzero stepsizes
     122           0 :   for (unsigned i = 0; i < dim; ++i)
     123             :   {
     124           0 :     if (_geometry.n[i] == 0)
     125           0 :       mooseError("Error reading header, EBSD grid size is zero.");
     126           0 :     if (_geometry.d[i] == 0.0)
     127           0 :       mooseError("Error reading header, EBSD data step size is zero.");
     128             :   }
     129             : 
     130           0 :   if (dim == 0)
     131           0 :     mooseError("Error reading header, EBSD data is zero dimensional.");
     132             : 
     133           0 :   _geometry.dim = dim;
     134           0 : }
     135             : 
     136             : void
     137           0 : EBSDMesh::buildMesh()
     138             : {
     139           0 :   readEBSDHeader();
     140             : 
     141           0 :   unsigned int uniform_refine = getParam<unsigned int>("uniform_refine");
     142           0 :   _dim = (_geometry.dim == 1 ? "1" : (_geometry.dim == 2 ? "2" : "3"));
     143             : 
     144             :   std::array<unsigned int, 3> nr;
     145           0 :   nr[0] = _geometry.n[0];
     146           0 :   nr[1] = _geometry.n[1];
     147           0 :   nr[2] = _geometry.n[2];
     148             : 
     149             :   // set min/max box length
     150           0 :   _xmin = _geometry.min[0];
     151           0 :   _xmax = nr[0] * _geometry.d[0] + _geometry.min[0];
     152           0 :   _ymin = _geometry.min[1];
     153           0 :   _ymax = nr[1] * _geometry.d[1] + _geometry.min[1];
     154           0 :   _zmin = _geometry.min[2];
     155           0 :   _zmax = nr[2] * _geometry.d[2] + _geometry.min[2];
     156             : 
     157             :   // check if the requested uniform refine level is possible and determine initial grid size
     158           0 :   for (unsigned int i = 0; i < uniform_refine; ++i)
     159           0 :     for (unsigned int j = 0; j < _geometry.dim; ++j)
     160             :     {
     161           0 :       if (nr[j] % 2 != 0)
     162           0 :         mooseError("EBSDMesh error. Requested uniform_refine levels not possible.");
     163           0 :       nr[j] /= 2;
     164             :     }
     165             : 
     166           0 :   _nx = nr[0];
     167           0 :   _ny = nr[1];
     168           0 :   _nz = nr[2];
     169             : 
     170           0 :   GeneratedMesh::buildMesh();
     171           0 : }

Generated by: LCOV version 1.14