/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("enforce_output_time_dt", m_enforce_dt);
66 pp.query("enforce_output_time_dt_reltol", m_enforce_dt_tol);
67
68 // Check for presence of arguments
69 const bool has_interval = pp.contains("output_interval");
70 const bool has_time_int = pp.contains("output_time_interval");
71 const bool has_frequency = pp.contains("output_frequency");
72
73 if (has_frequency) {
74 if (has_interval) {
75 amrex::Print()
76 << "WARNING: output_interval and output_frequency "
77 "(legacy argument) are both specified; "
78 "output_frequency will be ignored.\n";
79 } else {
80 pp.get("output_frequency", m_out_interval);
81 amrex::Print()
82 << "WARNING: legacy input argument of output_frequency has "
83 "been specified; the code will function as normal, but "
84 "the new input argument of output_interval is "
85 "preferred.\n";
86 }
87 }
88
89 // Because of default, interval is valid unless turned off;
90 // time_interval is invalid unless turned on
91 const bool has_valid_interval =
92 (has_interval || has_frequency) ? m_out_interval > 0 : true;
93 const bool has_valid_interval_present =
94 (has_interval || has_frequency) ? m_out_interval > 0 : false;
95 const bool has_valid_time_int =
96 has_time_int ? m_out_time_interval > 0. : false;
97
98 if (!(has_valid_interval || has_valid_time_int)) {
99 amrex::Abort(
100 "post_processing output timing parameters are specified, but "
101 "none are valid. Please specify an output_interval (or "
102 "output_frequency) greater than 0 or an output_time_interval "
103 "greater than 0.0_rt, or rely on the default output_interval.");
104 }
105
106 if (has_valid_interval_present && has_valid_time_int) {
107 amrex::Abort(
108 "output_interval (or output_frequency) and "
109 "output_time_interval are both specified. timestep- and "
110 "time-based output parameters should not be used together; "
111 "please only specify one.");
112 }
113
114 if (!has_valid_time_int && m_enforce_dt) {
115 amrex::Abort(
116 "enforce_output_time_dt is true, but output_time_interval "
117 "has not been specified.");
118 }
119
120 // Because of default, turn off step interval when time interval is
121 // meant to replace it
122 if (has_valid_time_int && !(has_interval || has_frequency)) {
123 m_out_interval = -1;
124 }
125 }
126
129 const int ntime,
130 const amrex::Real time,
131 const amrex::Real dt,
132 amrex::Real tol) const
133 {
134 // Choose smallest tolerance between incoming and local
135 tol = amrex::min<amrex::Real>(tol, m_out_time_tol * dt);
136
137 const bool step_based =
138 (m_out_interval > 0) &&
139 ((ntime - m_out_delay >= 0) && (ntime % m_out_interval == 0));
140 const bool time_based =
141 (m_out_time_interval > 0.0_rt) &&
142 ((time + tol - m_out_time_delay >= 0.0_rt) &&
143 (time + tol -
144 std::floor((time + tol) / m_out_time_interval) *
146 dt));
147
148 return (step_based || time_based);
149 }
150
151 amrex::Real output_time_interval() const { return m_out_time_interval; }
152 amrex::Real output_time_delay() const { return m_out_time_delay; }
153 amrex::Real enforce_dt_tolerance() const { return m_enforce_dt_tol; }
154 bool enforce_dt() const { return m_enforce_dt; }
155
156protected:
160 amrex::Real m_out_time_interval{-1.0_rt};
164 amrex::Real m_out_time_delay{0.0_rt};
166 amrex::Real m_out_time_tol{
167 std::numeric_limits<amrex::Real>::epsilon() * 1.0e4_rt};
168
169 amrex::Real m_enforce_dt_tol{1.0e-3_rt};
171 bool m_enforce_dt{false};
172};
173
184{
185public:
186 explicit PostProcessManager(CFDSim& sim);
187
189
190 void pre_init_actions();
191
198 void post_init_actions();
199
201 void post_advance_work();
202
204 void final_output();
205
206 void post_regrid_actions();
207
208private:
210
211 amrex::Vector<std::unique_ptr<PostProcessBase>> m_post;
212};
213
214} // namespace amr_wind
215
216#endif /* POSTPROCESSING_H */
Definition CFDSim.H:54
Definition PostProcessing.H:33
amrex::Real m_out_time_interval
Time interval for output.
Definition PostProcessing.H:160
virtual void pre_init_actions()=0
amrex::Real m_enforce_dt_tol
Relative (to m_out_time_interval) tolerance for enforcing dt.
Definition PostProcessing.H:169
amrex::Real m_out_time_tol
Relative (to dt) tolerance for time interval output.
Definition PostProcessing.H:166
int m_out_delay
Time step delay for output.
Definition PostProcessing.H:162
int m_out_interval
Time step interval for output.
Definition PostProcessing.H:158
amrex::Real output_time_interval() const
Definition PostProcessing.H:151
virtual void initialize()=0
amrex::Real enforce_dt_tolerance() const
Definition PostProcessing.H:153
virtual void output_actions()=0
bool m_enforce_dt
Flag for enforcing time step based on output time.
Definition PostProcessing.H:171
amrex::Real output_time_delay() const
Definition PostProcessing.H:152
amrex::Real m_out_time_delay
Time delay for output.
Definition PostProcessing.H:164
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.
bool do_output_now(const int ntime, const amrex::Real time, const amrex::Real dt, amrex::Real tol) const
Determine if output will happen this time step.
Definition PostProcessing.H:128
virtual void post_advance_work()=0
bool enforce_dt() const
Definition PostProcessing.H:154
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:68
~PostProcessManager()=default
void post_init_actions()
Definition PostProcessing.cpp:47
void post_regrid_actions()
Definition PostProcessing.cpp:96
CFDSim & m_sim
Definition PostProcessing.H:209
void final_output()
Call all registered utilities to output at final time.
Definition PostProcessing.cpp:82
amrex::Vector< std::unique_ptr< PostProcessBase > > m_post
Definition PostProcessing.H:211
This test case is intended as an evaluation of the momentum advection scheme.
Definition BCInterface.cpp:10