PRISMS-PF Manual
Loading...
Searching...
No Matches
io_parameters.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: © 2025 PRISMS Center at the University of Michigan
2// SPDX-License-Identifier: GNU Lesser General Public Version 2.1
3
4#pragma once
5
6#include <deal.II/base/data_out_base.h>
7#include <deal.II/base/utilities.h>
8
12#include <prismspf/core/types.h>
13#include <prismspf/core/variable_attributes.h>
14
15#include <prismspf/user_inputs/parameter_base.h>
16
18
19#include <prismspf/config.h>
20
21#include <climits>
22#include <execution>
23#include <set>
24#include <string>
25#include <unordered_map>
26
28
33{
37 enum OutputType : std::uint8_t
38 {
41 PVTU
42 };
43
53
62 unsigned int patch_subdivisions = 0;
63
71 dealii::DataOutBase::CompressionLevel compression_level =
72 dealii::DataOutBase::CompressionLevel::default_compression;
73
79 std::string folder;
80
87 std::string file_name;
88
95 std::set<unsigned int> output_list;
96
109 std::set<std::pair<Types::Index, DependencyType>> output_fields;
110};
111
115class FieldOutputParameterLoader : ParameterBase
116{
117public:
121 void
122 declare(dealii::ParameterHandler &parameter_handler) const override
123 {
124 parameter_handler.enter_subsection("field output");
125
126 parameter_handler.declare_entry("folder",
127 "",
128 dealii::Patterns::Anything(),
129 "The folder where output files are stored.");
130 parameter_handler.declare_entry("file name",
131 "solution",
132 dealii::Patterns::Anything(),
133 "The base name for the output file, before the time "
134 "step and processor info are added.");
135 parameter_handler.declare_entry("file type",
136 "vtu",
137 dealii::Patterns::Selection("vtu|vtk|pvtu"),
138 "The output file type (either vtu, pvtu, or vtk).");
139 parameter_handler.declare_entry(
140 "subdivisions",
141 "0",
142 dealii::Patterns::Integer(0, INT_MAX),
143 "The number of subdivisions to apply to the mesh when building output patches. If "
144 "0, the degree is used.");
145 parameter_handler.declare_entry("compression level",
146 "default",
147 dealii::Patterns::Selection(
148 "default|best speed|best size|none"),
149 "The compression level of the output (either "
150 "default, best speed, best size, or none).");
151
152 parameter_handler.declare_entry(
153 "condition",
154 "EQUAL_SPACING",
155 dealii::Patterns::Selection("EQUAL_SPACING|LOG_SPACING|N_PER_DECADE|LIST"),
156 "The spacing type for outputting the solution fields (either EQUAL_SPACING, "
157 "LOG_SPACING, N_PER_DECADE, or LIST).");
158 parameter_handler.declare_entry(
159 "list",
160 "0",
161 dealii::Patterns::List(dealii::Patterns::Integer(0, INT_MAX), 0, INT_MAX, ","),
162 "The list of time steps to output. Used for the LIST type only and must be comma "
163 "delimited.");
164 parameter_handler.declare_entry("number",
165 "10",
166 dealii::Patterns::Integer(0, INT_MAX),
167 "The number of outputs (or number of outputs "
168 "per decade for the N_PER_DECADE type).");
169
170 parameter_handler.declare_entry(
171 "fields",
172 "",
173 dealii::Patterns::List(dealii::Patterns::Anything(), 0, INT_MAX, ","),
174 "The list of fields to output. Must be comma delimited. Additionally, for the "
175 "output of change and old fields, they must follow the same delimiters in "
176 "VariableAttributes. In other words, something like `set fields = n1, old_1(n1), "
177 "change(n1)`.");
178
179 parameter_handler.leave_subsection();
180 }
181
185 void
186 read(dealii::ParameterHandler &parameter_handler) override
187 {
188 const std::unordered_map<std::string, FieldOutputParameters::OutputType>
193 };
194 const std::unordered_map<std::string, dealii::DataOutBase::CompressionLevel>
196 {"default", dealii::DataOutBase::CompressionLevel::default_compression},
197 {"best speed", dealii::DataOutBase::CompressionLevel::best_speed },
198 {"best size", dealii::DataOutBase::CompressionLevel::best_compression },
199 {"none", dealii::DataOutBase::CompressionLevel::no_compression }
200 };
201
202 parameter_handler.enter_subsection("field output");
203
204 parameters.folder = parameter_handler.get("folder");
205 parameters.file_name = parameter_handler.get("file name");
207 string_to_type(parameter_handler.get("file type"), output_type_table);
208 parameters.patch_subdivisions = parameter_handler.get_integer("subdivisions");
210 string_to_type(parameter_handler.get("compression level"), compression_level_table);
211
212 condition = parameter_handler.get("condition");
213 user_output_list = dealii::Utilities::string_to_int(
214 dealii::Utilities::split_string_list(parameter_handler.get("list")));
215 n_outputs = parameter_handler.get_integer("number");
216 field_list = dealii::Utilities::split_string_list(parameter_handler.get("fields"));
217
218 parameter_handler.leave_subsection();
219 }
220
224 void
226 {
228
229 // Determine which fields we are outputting.
230 }
231
235 void
236 validate(const std::vector<VariableAttributes> &field_attributes) const override
237 {}
238
243 package() const
244 {
245 return parameters;
246 }
247
251 void
252 print_parameter_summary() const override
253 {
255 << "================================================\n"
256 << " Field Output Parameter Class\n"
257 << "================================================\n"
258 << std::flush;
259 }
260
261private:
262 void
264 {
265 // If the user has specified a list and we have list output use that and return early
266 if (condition == "LIST")
267 {
268 for (const auto &increment : user_output_list)
269 {
270 parameters.output_list.insert(static_cast<unsigned int>(increment));
271 }
272 return;
273 }
274
275 // If the number of outputs is 0 return early
276 if (n_outputs == 0)
277 {
278 return;
279 }
280
281 // If the number of outputs is greater than the number of increments, force them to be
282 // equivalent
283 n_outputs = std::min(n_outputs, n_increments);
284
285 // If the number of increments is 0, we only output the initial condition. We can set
286 // that and return early.
287 if (n_increments == 0)
288 {
289 parameters.output_list.insert(0);
290 return;
291 }
292
293 // Determine the output list from the other criteria
294 if (condition == "EQUAL_SPACING")
295 {
296 for (unsigned int iteration = 0; iteration <= n_increments;
298 {
300 }
301 }
302 else if (condition == "LOG_SPACING")
303 {
304 parameters.output_list.insert(0);
305 for (unsigned int output = 1; output <= n_outputs; output++)
306 {
307 parameters.output_list.insert(static_cast<unsigned int>(std::round(
308 std::pow(static_cast<double>(n_increments),
309 static_cast<double>(output) / static_cast<double>(n_outputs)))));
310 }
311 }
312 else if (condition == "N_PER_DECADE")
313 {
315 dealii::ExcMessage("For n per decaded spaced outputs, the number of "
316 "increments must be greater than 1."));
317 parameters.output_list.insert(0);
318 parameters.output_list.insert(1);
319 for (unsigned int iteration = 2; iteration <= n_increments; iteration++)
320 {
321 const auto decade =
322 static_cast<unsigned int>(std::ceil(std::log10(iteration)));
323 const auto step_size =
324 static_cast<unsigned int>(std::pow(10, decade) / n_outputs);
325 if (iteration % step_size == 0)
326 {
328 }
329 }
330 }
331 else
332 {
334 }
335 }
336
338
339 std::string condition;
340
341 std::vector<int> user_output_list;
342
343 unsigned int n_outputs = 0;
344
345 std::vector<std::string> field_list;
346};
347
static dealii::ConditionalOStream & pout_summary()
Log output stream for writing a summary.log file.
Definition conditional_ostreams.cc:34
A class that determines how often and what fields are output.
Definition io_parameters.h:116
void validate(const std::vector< VariableAttributes > &field_attributes) const override
Validate parameters.
Definition io_parameters.h:236
unsigned int n_outputs
Definition io_parameters.h:343
std::vector< std::string > field_list
Definition io_parameters.h:345
void read(dealii::ParameterHandler &parameter_handler) override
Read parameters.
Definition io_parameters.h:186
void postprocess(unsigned int n_increments)
Postprocess parameters.
Definition io_parameters.h:225
void print_parameter_summary() const override
Print parameters to summary.log.
Definition io_parameters.h:252
void fill_out_output_list(unsigned int n_increments)
Definition io_parameters.h:263
std::string condition
Definition io_parameters.h:339
void declare(dealii::ParameterHandler &parameter_handler) const override
Declare parameters.
Definition io_parameters.h:122
std::vector< int > user_output_list
Definition io_parameters.h:341
FieldOutputParameters package() const
Package parameters.
Definition io_parameters.h:243
FieldOutputParameters parameters
Definition io_parameters.h:337
@ Value
Use value of the variable as a criterion for refinement.
Definition grid_refiner_criterion.h:31
Definition conditional_ostreams.cc:20
Simple struct for field output.
Definition io_parameters.h:33
OutputType
VTK output types.
Definition io_parameters.h:38
@ VTU
Definition io_parameters.h:39
@ PVTU
Definition io_parameters.h:41
@ VTK
Definition io_parameters.h:40
dealii::DataOutBase::CompressionLevel compression_level
Compression level for output.
Definition io_parameters.h:71
unsigned int patch_subdivisions
Number of subdivisions to apply when building patches.
Definition io_parameters.h:62
OutputType file_type
File type for field output.
Definition io_parameters.h:52
std::string folder
Folder for field output.
Definition io_parameters.h:79
std::set< std::pair< Types::Index, DependencyType > > output_fields
A list of fields that are output.
Definition io_parameters.h:109
std::string file_name
Base filename for field output.
Definition io_parameters.h:87
std::set< unsigned int > output_list
A list of output steps.
Definition io_parameters.h:95
PRISMS_PF_BEGIN_NAMESPACE Type string_to_type(const std::string &string, const std::unordered_map< std::string, Type > &table)
Helper function that converts a string to some type, given a mapping.
Definition utilities.h:29