/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>
5
7#include "AMReX_ParmParse.H"
8
16
17namespace amr_wind {
18
19class CFDSim;
20
30 : public Factory<PostProcessBase, CFDSim&, const std::string&>
31{
32public:
33 static std::string base_identifier() { return "PostProcessBase"; }
34
35 ~PostProcessBase() override = default;
36
37 virtual void pre_init_actions() = 0;
38
44 virtual void initialize() = 0;
45
48 virtual void post_advance_work() = 0;
49
52 virtual void output_actions() = 0;
53
55 virtual void post_regrid_actions() = 0;
56
57 void populate_output_parameters(amrex::ParmParse& pp)
58 {
59 pp.query("output_interval", m_out_interval);
60 pp.query("output_time_interval", m_out_time_interval);
61 pp.query("output_delay", m_out_delay);
62 pp.query("output_time_delay", m_out_time_delay);
63 pp.query("enforce_output_time_dt", m_enforce_dt);
64 pp.query("enforce_output_time_dt_reltol", m_enforce_dt_tol);
65
66 // Check for presence of arguments
67 const bool has_interval = pp.contains("output_interval");
68 const bool has_time_int = pp.contains("output_time_interval");
69 const bool has_frequency = pp.contains("output_frequency");
70
71 if (has_frequency) {
72 if (has_interval) {
73 amrex::Print()
74 << "WARNING: output_interval and output_frequency "
75 "(legacy argument) are both specified; "
76 "output_frequency will be ignored.\n";
77 } else {
78 pp.get("output_frequency", m_out_interval);
79 amrex::Print()
80 << "WARNING: legacy input argument of output_frequency has "
81 "been specified; the code will function as normal, but "
82 "the new input argument of output_interval is "
83 "preferred.\n";
84 }
85 }
86
87 // Because of default, interval is valid unless turned off;
88 // time_interval is invalid unless turned on
89 const bool has_valid_interval =
90 (has_interval || has_frequency) ? m_out_interval > 0 : true;
91 const bool has_valid_interval_present =
92 (has_interval || has_frequency) ? m_out_interval > 0 : false;
93 const bool has_valid_time_int =
94 has_time_int ? m_out_time_interval > 0. : false;
95
96 if (!(has_valid_interval || has_valid_time_int)) {
97 amrex::Abort(
98 "post_processing output timing parameters are specified, but "
99 "none are valid. Please specify an output_interval (or "
100 "output_frequency) greater than 0 or an output_time_interval "
101 "greater than 0.0, or rely on the default output_interval.");
102 }
103
104 if (has_valid_interval_present && has_valid_time_int) {
105 amrex::Abort(
106 "output_interval (or output_frequency) and "
107 "output_time_interval are both specified. timestep- and "
108 "time-based output parameters should not be used together; "
109 "please only specify one.");
110 }
111
112 if (!has_valid_time_int && m_enforce_dt) {
113 amrex::Abort(
114 "enforce_output_time_dt is true, but output_time_interval "
115 "has not been specified.");
116 }
117
118 // Because of default, turn off step interval when time interval is
119 // meant to replace it
120 if (has_valid_time_int && !(has_interval || has_frequency)) {
121 m_out_interval = -1;
122 }
123 }
124
127 const int ntime,
128 const amrex::Real time,
129 const amrex::Real dt,
130 amrex::Real tol) const
131 {
132
133 // Choose smallest tolerance between incoming and local
134 tol = std::min(tol, m_out_time_tol * dt);
135
136 const bool step_based =
137 (m_out_interval > 0) &&
138 ((ntime - m_out_delay >= 0) && (ntime % m_out_interval == 0));
139 const bool time_based =
140 (m_out_time_interval > 0.) &&
141 ((time + tol - m_out_time_delay >= 0.) &&
142 (time + tol -
143 std::floor((time + tol) / m_out_time_interval) *
145 dt));
146
147 return (step_based || time_based);
148 }
149
150 amrex::Real output_time_interval() const { return m_out_time_interval; }
151 amrex::Real output_time_delay() const { return m_out_time_delay; }
152 amrex::Real enforce_dt_tolerance() const { return m_enforce_dt_tol; }
153 bool enforce_dt() const { return m_enforce_dt; }
154
155protected:
159 amrex::Real m_out_time_interval{-1.};
163 amrex::Real m_out_time_delay{0.};
165 amrex::Real m_out_time_tol{1e-8};
167 amrex::Real m_enforce_dt_tol{1e-3};
169 bool m_enforce_dt{false};
170};
171
182{
183public:
184 explicit PostProcessManager(CFDSim& sim);
185
187
188 void pre_init_actions();
189
196 void post_init_actions();
197
199 void post_advance_work();
200
202 void final_output();
203
204 void post_regrid_actions();
205
206private:
208
209 amrex::Vector<std::unique_ptr<PostProcessBase>> m_post;
210};
211
212} // namespace amr_wind
213
214#endif /* POSTPROCESSING_H */
Definition CFDSim.H:54
Definition PostProcessing.H:31
amrex::Real m_out_time_interval
Time interval for output.
Definition PostProcessing.H:159
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:167
amrex::Real m_out_time_tol
Relative (to dt) tolerance for time interval output.
Definition PostProcessing.H:165
int m_out_delay
Time step delay for output.
Definition PostProcessing.H:161
int m_out_interval
Time step interval for output.
Definition PostProcessing.H:157
amrex::Real output_time_interval() const
Definition PostProcessing.H:150
virtual void initialize()=0
amrex::Real enforce_dt_tolerance() const
Definition PostProcessing.H:152
virtual void output_actions()=0
bool m_enforce_dt
Flag for enforcing time step based on output time.
Definition PostProcessing.H:169
amrex::Real output_time_delay() const
Definition PostProcessing.H:151
amrex::Real m_out_time_delay
Time delay for output.
Definition PostProcessing.H:163
static std::string base_identifier()
Definition PostProcessing.H:33
void populate_output_parameters(amrex::ParmParse &pp)
Definition PostProcessing.H:57
~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:126
virtual void post_advance_work()=0
bool enforce_dt() const
Definition PostProcessing.H:153
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:207
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:209
This test case is intended as an evaluation of the momentum advection scheme.
Definition BCInterface.cpp:7