/home/runner/work/amr-wind/amr-wind/amr-wind/utilities/PostProcessing.H Source File

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/utilities/PostProcessing.H Source File
AMR-Wind API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
PostProcessing.H
Go to the documentation of this file.
1#ifndef POSTPROCESSING_H
2#define POSTPROCESSING_H
3
4#include <memory>
6#include "AMReX_ParmParse.H"
7#include "AMReX_REAL.H"
8
9using namespace amrex::literals;
10
18
19namespace amr_wind {
20
21class CFDSim;
22
32 : public Factory<PostProcessBase, CFDSim&, const std::string&>
33{
34public:
35 static std::string base_identifier() { return "PostProcessBase"; }
36
37 ~PostProcessBase() override = default;
38
39 virtual void pre_init_actions() = 0;
40
46 virtual void initialize() = 0;
47
50 virtual void post_advance_work() = 0;
51
54 virtual void output_actions() = 0;
55
57 virtual void post_regrid_actions() = 0;
58
59 void populate_output_parameters(amrex::ParmParse& pp)
60 {
61 pp.query("output_interval", m_out_interval);
62 pp.query("output_time_interval", m_out_time_interval);
63 pp.query("output_delay", m_out_delay);
64 pp.query("output_time_delay", m_out_time_delay);
65 pp.query("output_from_restart", m_out_from_restart);
66 pp.query("output_start", m_out_start_index);
67 pp.query("output_start_time", m_out_start_time);
68 pp.query("enforce_output_time_dt", m_enforce_dt);
69 pp.query("enforce_output_time_dt_reltol", m_enforce_dt_tol);
70 pp.query("output_after_final_step", m_do_final_output);
71
72 // Check for presence of arguments
73 const bool has_interval = pp.contains("output_interval");
74 const bool has_time_int = pp.contains("output_time_interval");
75 const bool has_frequency = pp.contains("output_frequency");
76
77 if (has_frequency) {
78 if (has_interval) {
79 amrex::Print()
80 << "WARNING: output_interval and output_frequency "
81 "(legacy argument) are both specified; "
82 "output_frequency will be ignored.\n";
83 } else {
84 pp.get("output_frequency", m_out_interval);
85 amrex::Print()
86 << "WARNING: legacy input argument of output_frequency has "
87 "been specified; the code will function as normal, but "
88 "the new input argument of output_interval is "
89 "preferred.\n";
90 }
91 }
92
94 (pp.contains("output_start") || pp.contains("output_start_time"))) {
95 amrex::Abort(
96 "Conflict in output parameters. output_from_restart is true, "
97 "designating that output timing calculations consider the "
98 "restart time or time step, but the output_start or "
99 "output_start_time is specified, which manually overwrites the "
100 "stored restart time or time step.\n");
101 }
102
103 // Because of default, interval is valid unless turned off;
104 // time_interval is invalid unless turned on
105 const bool has_valid_interval =
106 (has_interval || has_frequency) ? m_out_interval > 0 : true;
107 const bool has_valid_interval_present =
108 (has_interval || has_frequency) ? m_out_interval > 0 : false;
109 const bool has_valid_time_int =
110 has_time_int ? m_out_time_interval > 0. : false;
111
112 if (!(has_valid_interval || has_valid_time_int)) {
113 amrex::Abort(
114 "post_processing output timing parameters are specified, but "
115 "none are valid. Please specify an output_interval (or "
116 "output_frequency) greater than 0 or an output_time_interval "
117 "greater than 0.0_rt, or rely on the default output_interval.");
118 }
119
120 if (has_valid_interval_present && has_valid_time_int) {
121 amrex::Abort(
122 "output_interval (or output_frequency) and "
123 "output_time_interval are both specified. timestep- and "
124 "time-based output parameters should not be used together; "
125 "please only specify one.");
126 }
127
128 if (!has_valid_time_int && m_enforce_dt) {
129 amrex::Abort(
130 "enforce_output_time_dt is true, but output_time_interval "
131 "has not been specified.");
132 }
133
134 // Because of default, turn off step interval when time interval is
135 // meant to replace it
136 if (has_valid_time_int && !(has_interval || has_frequency)) {
137 m_out_interval = -1;
138 }
139 }
140
142 [[nodiscard]] bool do_output_now(
143 const int ntime,
144 const int ntime0_in,
145 const amrex::Real time,
146 const amrex::Real time0_in,
147 const amrex::Real dt,
148 amrex::Real tol) const
149 {
150 // Choose smallest tolerance between incoming and local
151 tol = amrex::min<amrex::Real>(tol, m_out_time_tol * dt);
152
153 // Should the restart time always be used
154 int ntime0 = m_out_from_restart ? ntime0_in : 0;
155 amrex::Real time0 = m_out_from_restart ? time0_in : 0_rt;
156 // Has the manual start been specified
157 ntime0 = m_out_start_index >= 0 ? m_out_start_index : ntime0;
158 time0 = m_out_start_time > -0.5_rt ? m_out_start_time : time0;
159
160 const bool step_based =
161 (m_out_interval > 0) && ((ntime - m_out_delay >= 0) &&
162 ((ntime - ntime0) % m_out_interval == 0));
163 const bool time_based =
164 (m_out_time_interval > 0.0_rt) &&
165 ((time + tol - m_out_time_delay >= 0.0_rt) &&
166 (time - time0 + tol -
167 (std::floor((time - time0 + tol) / m_out_time_interval) *
169 dt));
170
171 return (step_based || time_based);
172 }
173
174 [[nodiscard]] amrex::Real output_time_interval() const
175 {
176 return m_out_time_interval;
177 }
178 [[nodiscard]] amrex::Real output_time_delay() const
179 {
180 return m_out_time_delay;
181 }
182 [[nodiscard]] amrex::Real enforce_dt_tolerance() const
183 {
184 return m_enforce_dt_tol;
185 }
186 [[nodiscard]] bool enforce_dt() const { return m_enforce_dt; }
187 [[nodiscard]] bool do_final_output() const { return m_do_final_output; }
188
189protected:
193 amrex::Real m_out_time_interval{-1.0_rt};
197 amrex::Real m_out_time_delay{0.0_rt};
203 amrex::Real m_out_start_time{-1.0_rt};
205 amrex::Real m_out_time_tol{1.0e-2_rt};
207 amrex::Real m_enforce_dt_tol{1.0e-3_rt};
209 bool m_enforce_dt{false};
211 bool m_do_final_output{false};
212};
213
224{
225public:
226 explicit PostProcessManager(CFDSim& sim);
227
229
230 void pre_init_actions();
231
238 void post_init_actions();
239
241 void post_advance_work();
242
244 void final_output();
245
246 void post_regrid_actions();
247
248private:
250
251 amrex::Vector<std::unique_ptr<PostProcessBase>> m_post;
252};
253
254} // namespace amr_wind
255
256#endif /* POSTPROCESSING_H */
Definition CFDSim.H:54
Definition PostProcessing.H:33
amrex::Real m_out_time_interval
Time interval for output.
Definition PostProcessing.H:193
virtual void pre_init_actions()=0
bool m_out_from_restart
Always consider restart time for calculating output.
Definition PostProcessing.H:199
amrex::Real m_enforce_dt_tol
Relative (to m_out_time_interval) tolerance for enforcing dt.
Definition PostProcessing.H:207
amrex::Real m_out_time_tol
Relative (to dt) tolerance for time interval output.
Definition PostProcessing.H:205
int m_out_delay
Time step delay for output.
Definition PostProcessing.H:195
bool m_do_final_output
Flag for output at simulation end - off by default.
Definition PostProcessing.H:211
int m_out_interval
Time step interval for output.
Definition PostProcessing.H:191
amrex::Real output_time_interval() const
Definition PostProcessing.H:174
virtual void initialize()=0
bool do_final_output() const
Definition PostProcessing.H:187
int m_out_start_index
Time step start for calculating step interval (restarts)
Definition PostProcessing.H:201
amrex::Real enforce_dt_tolerance() const
Definition PostProcessing.H:182
virtual void output_actions()=0
bool m_enforce_dt
Flag for enforcing time step based on output time.
Definition PostProcessing.H:209
amrex::Real m_out_start_time
Time start for calculating time interval (restarts)
Definition PostProcessing.H:203
amrex::Real output_time_delay() const
Definition PostProcessing.H:178
amrex::Real m_out_time_delay
Time delay for output.
Definition PostProcessing.H:197
static std::string base_identifier()
Definition PostProcessing.H:35
void populate_output_parameters(amrex::ParmParse &pp)
Definition PostProcessing.H:59
~PostProcessBase() override=default
virtual void post_regrid_actions()=0
Actions to perform post regrid.
virtual void post_advance_work()=0
bool enforce_dt() const
Definition PostProcessing.H:186
bool do_output_now(const int ntime, const int ntime0_in, const amrex::Real time, const amrex::Real time0_in, const amrex::Real dt, amrex::Real tol) const
Determine if output will happen this time step.
Definition PostProcessing.H:142
PostProcessManager(CFDSim &sim)
Definition PostProcessing.cpp:24
void pre_init_actions()
Definition PostProcessing.cpp:26
void post_advance_work()
Call all registered utilities to perform actions after a timestep.
Definition PostProcessing.cpp:69
~PostProcessManager()=default
void post_init_actions()
Definition PostProcessing.cpp:47
void post_regrid_actions()
Definition PostProcessing.cpp:100
CFDSim & m_sim
Definition PostProcessing.H:249
void final_output()
Call all registered utilities to output at final time.
Definition PostProcessing.cpp:84
amrex::Vector< std::unique_ptr< PostProcessBase > > m_post
Definition PostProcessing.H:251
This test case is intended as an evaluation of the momentum advection scheme.
Definition BCInterface.cpp:10