PRISMS-PF Manual v3.0-pre
All Classes Functions Variables Enumerations Pages
output_parameters.h
1// SPDX-FileCopyrightText: © 2025 PRISMS Center at the University of Michigan
2// SPDX-License-Identifier: GNU Lesser General Public Version 2.1
3
4#ifndef output_parameters_h
5#define output_parameters_h
6
7#include <prismspf/config.h>
8#include <prismspf/core/conditional_ostreams.h>
9#include <prismspf/core/exceptions.h>
10#include <prismspf/user_inputs/temporal_discretization.h>
11#include <prismspf/utilities/utilities.h>
12
13#include <climits>
14#include <set>
15#include <string>
16
17PRISMS_PF_BEGIN_NAMESPACE
18
23{
24public:
28 [[nodiscard]] bool
29 should_output(unsigned int increment) const;
30
34 void
35 postprocess_and_validate(const temporalDiscretization &temporal_discretization);
36
40 void
42
43 // Output file type
44 std::string file_type;
45
46 // Output file name
47 std::string file_name;
48
49 // Whether to output one vtu or vtk file per process
50 // TODO (landinjm): Actually implement this and set it to true is vtk outputs
51 bool output_per_process = false;
52
53 // The number of steps between outputting relevant information to screen
54 unsigned int print_output_period = UINT_MAX;
55
56 // Output condition type
57 std::string condition;
58
59 // Number of outputs
60 unsigned int n_outputs = 0;
61
62 // User given output_list
63 std::vector<int> user_output_list;
64
65 // Whether to print timing information with output
66 bool print_timing_with_output = false;
67
68 // List of increments that output the solution to file
69 std::set<unsigned int> output_list;
70};
71
72inline bool
73outputParameters::should_output(unsigned int increment) const
74{
75 return output_list.find(increment) != output_list.end();
76}
77
78inline void
80 const temporalDiscretization &temporal_discretization)
81{
82 // If the user has specified a list and we have list output use that and return early
83 if (condition == "LIST")
84 {
85 for (const auto &increment : user_output_list)
86 {
87 output_list.insert(static_cast<unsigned int>(increment));
88 }
89 return;
90 }
91
92 // If the number of outputs is 0 return early
93 if (n_outputs == 0)
94 {
95 return;
96 }
97
98 // If the number of outputs is greater than the number of increments, force them to be
99 // equivalent
100 n_outputs = std::min(n_outputs, temporal_discretization.total_increments);
101
102 // Determine the output list from the other criteria
103 if (condition == "EQUAL_SPACING")
104 {
105 for (unsigned int iteration = 0;
106 iteration <= temporal_discretization.total_increments;
107 iteration += temporal_discretization.total_increments / n_outputs)
108 {
109 output_list.insert(iteration);
110 }
111 }
112 else if (condition == "LOG_SPACING")
113 {
114 output_list.insert(0);
115 for (unsigned int output = 1; output <= n_outputs; output++)
116 {
117 output_list.insert(static_cast<unsigned int>(std::round(
118 std::pow(static_cast<double>(temporal_discretization.total_increments),
119 static_cast<double>(output) / static_cast<double>(n_outputs)))));
120 }
121 }
122 else if (condition == "N_PER_DECADE")
123 {
124 AssertThrow(temporal_discretization.total_increments > 1,
125 dealii::ExcMessage("For n per decaded spaced outputs, the number of "
126 "increments must be greater than 1."));
127
128 output_list.insert(0);
129 output_list.insert(1);
130 for (unsigned int iteration = 2;
131 iteration <= temporal_discretization.total_increments;
132 iteration++)
133 {
134 const auto decade = static_cast<unsigned int>(std::ceil(std::log10(iteration)));
135 const auto step_size =
136 static_cast<unsigned int>(std::pow(10, decade) / n_outputs);
137 if (iteration % step_size == 0)
138 {
139 output_list.insert(iteration);
140 }
141 }
142 }
143 else
144 {
145 AssertThrow(false, UnreachableCode());
146 }
147}
148
149inline void
151{
153 << "================================================\n"
154 << " Output Parameters\n"
155 << "================================================\n"
156 << "Output file type: " << file_type << "\n"
157 << "Output file name: " << file_name << "\n"
158 << "Print output period: " << print_output_period << "\n"
159 << "Output condition: " << condition << "\n"
160 << "Number of outputs: " << n_outputs << "\n"
161 << "Print timing info: " << bool_to_string(print_timing_with_output) << "\n";
162
163 conditionalOStreams::pout_summary() << "Output iteration list: ";
164 for (const auto &iteration : output_list)
165 {
166 conditionalOStreams::pout_summary() << iteration << " ";
167 }
168 conditionalOStreams::pout_summary() << "\n\n" << std::flush;
169}
170
171PRISMS_PF_END_NAMESPACE
172
173#endif
static dealii::ConditionalOStream & pout_summary()
Log output stream for writing a summary.log file.
Definition conditional_ostreams.cc:22
Struct that holds output parameters.
Definition output_parameters.h:23
bool should_output(unsigned int increment) const
Return is the current increment should be output.
Definition output_parameters.h:73
void postprocess_and_validate(const temporalDiscretization &temporal_discretization)
Postprocess and validate parameters.
Definition output_parameters.h:79
void print_parameter_summary() const
Print parameters to summary.log.
Definition output_parameters.h:150
Struct that holds temporal discretization parameters.
Definition temporal_discretization.h:17