https://mooseframework.inl.gov
Loading...
Searching...
No Matches
SolutionRasterizer.C
Go to the documentation of this file.
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 "SolutionRasterizer.h"
11
12#include <fstream>
13#include "libmesh/mesh_function.h"
14#include "libmesh/exodusII_io.h"
15#include "libmesh/nemesis_io.h"
16
18
21{
23 params.addClassDescription("Process an XYZ file of atomic coordinates and filter atoms via "
24 "threshold or map variable values.");
25 params.addRequiredParam<FileName>("xyz_input", "XYZ input file.");
26 params.addRequiredParam<FileName>("xyz_output", "XYZ output file.");
27 params.addRequiredParam<std::string>(
28 "variable", "Variable from the mesh file to use for mapping to or filtering of the atoms.");
29 MooseEnum modeEnum("MAP FILTER", "MAP");
30 params.addParam<MooseEnum>("raster_mode", modeEnum, "Rasterization mode (MAP|FILTER).");
31 params.addParam<Real>("threshold",
32 "Accept atoms with a variable value above this threshold in FILTER mode.");
33 return params;
34}
35
37 : SolutionUserObject(parameters),
38 _xyz_input(getParam<FileName>("xyz_input")),
39 _xyz_output(getParam<FileName>("xyz_output")),
40 _variable(getParam<std::string>("variable")),
41 _raster_mode(getParam<MooseEnum>("raster_mode")),
42 _threshold(0.0)
43{
44 if (_raster_mode == "FILTER")
45 {
46 if (!isParamValid("threshold"))
47 mooseError("Please specify 'threshold' parameter for raster_mode = FILTER");
48 _threshold = getParam<Real>("threshold");
49 }
50}
51
52void
54{
55 // only execute once
56 if (_initialized)
57 return;
58
59 // initialize parent class
61
62 // open input XYZ file
63 std::ifstream stream_in(_xyz_input.c_str());
64
65 // open output XYZ file
66 std::ofstream stream_out(_xyz_output.c_str());
67
68 std::string line, dummy;
69 Real x, y, z;
70 unsigned int current_line = 0;
71 unsigned int nfilter = 0, len0 = 0;
72 while (std::getline(stream_in, line))
73 {
74 if (current_line < 2)
75 {
76 // dump header
77 stream_out << line << '\n';
78
79 // get length of line 0 - the amount of space we have to replace the atom count at the end of
80 // filtering
81 if (current_line == 0)
82 len0 = line.size();
83 }
84 else
85 {
86 std::istringstream iss(line);
87
88 if (iss >> dummy >> x >> y >> z)
89 switch (_raster_mode)
90 {
91 case 0: // MAP
92 stream_out << line << ' ' << pointValue(0.0, Point(x, y, z), _variable) << '\n';
93 break;
94 case 1: // FILTER
95 if (pointValue(0.0, Point(x, y, z), _variable) > _threshold)
96 {
97 stream_out << line << '\n';
98 nfilter++;
99 }
100 break;
101 }
102 }
103
104 current_line++;
105 }
106
107 stream_in.close();
108 stream_out.close();
109
110 // modify output file to fix atom count in line 0
111 if (_raster_mode == "FILTER")
112 {
113 // stringify the new number of atoms
114 std::ostringstream oss;
115 oss << nfilter;
116 std::string newline0 = oss.str();
117
118 // the new number should always be lower -> shorter than the old one, but we check to be sure
119 if (newline0.size() > len0)
120 {
121 mooseWarning("SolutionRasterizer could not update XYZ atom count in header.");
122 return;
123 }
124
125 // pad shorter numbers with spaces
126 while (newline0.size() < len0)
127 newline0 += ' ';
128
129 // inject new number into the file
130 std::ofstream stream_fix(_xyz_output.c_str(), std::ios::binary | std::ios::in | std::ios::out);
131 stream_fix << newline0;
132 stream_fix.close();
133 }
134}
const std::vector< double > y
const std::vector< double > x
registerMooseObject("PhaseFieldApp", SolutionRasterizer)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
void mooseError(Args &&... args) const
void mooseWarning(Args &&... args) const
bool isParamValid(const std::string &name) const
This Userobject is the base class of Userobjects that generate one random number per timestep and qua...
SolutionRasterizer(const InputParameters &parameters)
static InputParameters validParams()
virtual void initialSetup()
Initialize the System and Mesh objects for the solution being read.
Real pointValue(Real t, const Point &p, const unsigned int local_var_index, const std::set< subdomain_id_type > *subdomain_ids=nullptr) const
virtual void initialSetup() override
static InputParameters validParams()