Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_ErrorList.H
Go to the documentation of this file.
1#ifndef AMREX_ErrorList_H_
2#define AMREX_ErrorList_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_Array.H>
6#include <AMReX_ArrayLim.H>
7#include <AMReX_Geometry.H>
8#include <AMReX_MultiFab.H>
9#include <AMReX_Parser.H>
10#include <AMReX_REAL.H>
11#include <AMReX_TagBox.H>
12#include <AMReX_Vector.H>
13
14#include <iterator>
15#include <memory>
16#include <string>
17
18namespace amrex {
19
20
21extern "C"
22{
23
27 using ErrorFuncDefault = void (*)(int* tag, AMREX_ARLIM_P(tlo), AMREX_ARLIM_P(thi),
28 const int* tagval, const int* clearval,
29 amrex::Real* data, AMREX_ARLIM_P(data_lo), AMREX_ARLIM_P(data_hi),
30 const int* lo, const int * hi, const int* nvar,
31 const int* domain_lo, const int* domain_hi,
32 const amrex::Real* dx, const amrex::Real* xlo,
33 const amrex::Real* prob_lo, const amrex::Real* time,
34 const int* level);
35
36 using ErrorFunc2Default = void (*)(int* tag, AMREX_ARLIM_P(tlo), AMREX_ARLIM_P(thi),
37 const int* tagval, const int* clearval,
38 amrex::Real* data, AMREX_ARLIM_P(data_lo), AMREX_ARLIM_P(data_hi),
39 const int* lo, const int * hi, const int* nvar,
40 const int* domain_lo, const int* domain_hi,
41 const amrex::Real* dx, const int* level, const amrex::Real* avg);
42
43
67 using ErrorFunc3DDefault = void (*)(int* tag, const int* tlo, const int* thi,
68 const int* tagval, const int* clearval,
69 amrex::Real* data, const int* data_lo, const int* data_hi,
70 const int* lo, const int * hi, const int* nvar,
71 const int* domain_lo, const int* domain_hi,
72 const amrex::Real* dx, const amrex::Real* xlo,
73 const amrex::Real* prob_lo, const amrex::Real* time,
74 const int* level);
75
76}
77
78
89{
90public:
91 //
92 // Error types.
93 //
95 //
96 // Class wrapper around ErrorFuncDefault.
97 //
99 {
100 public:
101
106
112 // No explicit because some codes rely on it.
114
120 // No explicit because some codes rely on it.
122
127 [[nodiscard]] virtual ErrorFunc* clone () const;
128
132 virtual ~ErrorFunc () = default;
133
134 ErrorFunc (ErrorFunc const&) = default;
135 ErrorFunc (ErrorFunc &&) = delete;
136 ErrorFunc& operator= (ErrorFunc const&) = default;
138
142 virtual void operator () (int* tag, AMREX_ARLIM_P(tlo), AMREX_ARLIM_P(thi),
143 const int* tagval, const int* clearval,
144 Real* data, AMREX_ARLIM_P(data_lo), AMREX_ARLIM_P(data_hi),
145 const int* lo, const int * hi, const int* nvar,
146 const int* domain_lo, const int* domain_hi,
147 const Real* dx, const Real* xlo,
148 const Real* prob_lo, const Real* time,
149 const int* level) const;
150
173 virtual void operator () (int* tag, const int* tlo, const int* thi,
174 const int* tagval, const int* clearval,
175 Real* data, const int* dlo, const int* dhi,
176 const int* lo, const int * hi, const int* nvar,
177 const int* domain_lo, const int* domain_hi,
178 const Real* dx, const Real* xlo,
179 const Real* prob_lo, const Real* time,
180 const int* level) const;
181 protected:
182
185 };
187 {
188 public:
189
194
200 // No explicit because some codes rely on it.
202
207 [[nodiscard]] virtual ErrorFunc2* clone () const;
208
212 virtual ~ErrorFunc2 () = default;
213
214 ErrorFunc2 (ErrorFunc2 const&) = default;
215 ErrorFunc2 (ErrorFunc2 &&) = delete;
216 ErrorFunc2& operator= (ErrorFunc2 const&) = default;
218
220
240 virtual void operator () (int* tag, AMREX_ARLIM_P(tlo), AMREX_ARLIM_P(thi),
241 const int* tagval, const int* clearval,
242 Real* data, AMREX_ARLIM_P(data_lo), AMREX_ARLIM_P(data_hi),
243 const int* lo, const int * hi, const int* nvar,
244 const int* domain_lo, const int* domain_hi,
245 const Real* dx, const int* level, const Real* avg) const;
247 protected:
248
250 };
251
260 ErrorRec (std::string nm, int ng, ErrorType etyp,
261 const ErrorRec::ErrorFunc2& f2);
262
264 ErrorRec (std::string nm, int ng, ErrorType etyp,
265 const ErrorRec::ErrorFunc& f);
266
267 virtual ~ErrorRec ();
268
269 ErrorRec (ErrorRec const&) = delete;
270 ErrorRec (ErrorRec &&) = delete;
271 ErrorRec& operator= (ErrorRec const&) = delete;
273
277 [[nodiscard]] const std::string& name () const noexcept;
278
282 [[nodiscard]] int nGrow () const noexcept;
283
287 [[nodiscard]] ErrorType errType () const noexcept;
288
292 [[nodiscard]] virtual const ErrorRec::ErrorFunc& errFunc () const;
293 [[nodiscard]] virtual const ErrorRec::ErrorFunc2& errFunc2() const;
294
295private:
296
298 std::string derive_name;
299
301 int ngrow;
302
304 ErrorType err_type;
305
307 ErrorFunc* err_func;
308 ErrorFunc2* err_func2;
309};
310
311
318{
319public:
320 ErrorList() noexcept = default;
321
325 [[nodiscard]] int size () const noexcept;
326
335 void add (const std::string& name,
336 int nextra,
337 ErrorRec::ErrorType typ,
338 const ErrorRec::ErrorFunc& func);
339
341 void add (const std::string& name,
342 int nextra,
343 ErrorRec::ErrorType typ,
344 const ErrorRec::ErrorFunc2& func);
345
347 [[nodiscard]] const ErrorRec& operator[] (int k) const noexcept;
348
349 void clear (bool rs0 = false) { vec.clear(); if(rs0) { vec.resize(0); } }
350
351private:
352
354};
355
356std::ostream& operator << (std::ostream& os, const ErrorList& elst);
357
360 {
361 int m_max_level = 1000;
362 Real m_min_time = std::numeric_limits<Real>::lowest();
363 Real m_max_time = std::numeric_limits<Real>::max();
364 int m_volume_weighting = 0;
365 int m_derefine = 0;
367
368 AMRErrorTagInfo& SetMaxLevel (int max_level) noexcept {
369 m_max_level = max_level;
370 return *this;
371 }
373 m_min_time = min_time;
374 return *this;
375 }
377 m_max_time = max_time;
378 return *this;
379 }
380 AMRErrorTagInfo& SetRealBox (const amrex::RealBox& realbox) noexcept {
381 m_realbox = realbox;
382 return *this;
383 }
384 AMRErrorTagInfo& SetVolumeWeighting (int volume_weighting) noexcept {
385 m_volume_weighting = volume_weighting;
386 return *this;
387 }
388 AMRErrorTagInfo& SetDerefine (int derefine) noexcept {
389 m_derefine = derefine;
390 return *this;
391 }
392 };
393
398 {
399 public:
400
401 enum TEST {GRAD=0, RELGRAD, LESS, GREATER, VORT, BOX, USER, PARSER};
402
403 struct UserFunc
404 {
405 virtual ~UserFunc () = default;
406
407 UserFunc (UserFunc const&) = default;
408 UserFunc (UserFunc &&) = default;
409 UserFunc& operator= (UserFunc const&) = default;
410 UserFunc& operator= (UserFunc &&) = default;
411
412 virtual void operator() (const amrex::Box& bx,
414 amrex::Array4<char> const& tag,
415 amrex::Real time,
416 int level,
417 char tagval,
418 char clearval) = 0;
419 };
420
422 explicit AMRErrorTag (const AMRErrorTagInfo& info = AMRErrorTagInfo()) noexcept
423 : m_info(info), m_ngrow(SetNGrow()) {}
424
435 std::string field,
436 const AMRErrorTagInfo& info = AMRErrorTagInfo()) noexcept
437 : m_value((info.m_max_level > 0) ? info.m_max_level : 1, value),
438 m_test(test), m_field(std::move(field)), m_info(info),
439 m_ngrow(SetNGrow())
440 {
441 }
442
453 std::string field,
454 const AMRErrorTagInfo& info = AMRErrorTagInfo()) noexcept
455 : m_test(test), m_field(std::move(field)), m_info(info), m_ngrow(SetNGrow())
456 {
457 AMREX_ASSERT(!value.empty());
458 m_value.resize((info.m_max_level > 0) ? info.m_max_level : 1);
459 for (int i = 0; i < m_value.size() && i < value.size(); ++i) {
460 m_value[i] = value[i];
461 }
462 // If the user didn't provided a value for every level,
463 // assume the last value holds for all higher levels.
464 for (auto i = int(value.size()); i < m_value.size(); ++i) {
465 m_value[i] = value[value.size()-1];
466 }
467 }
468
478 std::string field,
479 int ngrow,
480 const AMRErrorTagInfo& info = AMRErrorTagInfo()) noexcept
481 : m_userfunc(userfunc), m_field(std::move(field)), m_info(info), m_ngrow(ngrow) {}
482
486 explicit AMRErrorTag (Parser parser,
487 const AMRErrorTagInfo& info = AMRErrorTagInfo());
488
502 void operator() (amrex::TagBoxArray& tb,
503 const amrex::MultiFab* mf,
504 char clearval,
505 char tagval,
506 amrex::Real time,
507 int level,
508 const amrex::Geometry& geom) const;
509
510 [[nodiscard]] int NGrow() const noexcept {return m_ngrow;}
511 [[nodiscard]] const std::string& Field () const noexcept {return m_field;}
512
513 [[nodiscard]] AMRErrorTagInfo& GetInfo () noexcept {return m_info;}
514 [[nodiscard]] AMRErrorTagInfo const& GetInfo () const noexcept {return m_info;}
515 void SetInfo (AMRErrorTagInfo const& info) noexcept
516 {
517 if (!m_value.empty() && info.m_max_level > std::ssize(m_value)) {
518 m_value.resize(info.m_max_level, m_value.back());
519 }
520 m_info = info;
521 }
522
523 protected:
524 [[nodiscard]] int SetNGrow () const noexcept;
525
526 Vector<Real> m_value;
527 TEST m_test{BOX};
528 UserFunc* m_userfunc = nullptr;
529 std::unique_ptr<Parser> m_parser;
531 std::string m_field;
533 int m_ngrow = 0;
534 };
535}
536
537#endif
#define AMREX_ARLIM_P(x)
Definition AMReX_ArrayLim.H:30
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
Runtime expression parser front-end and compiled executor helpers.
Tag storage used for AMR error estimation and refinement decisions.
Flexible tagging rule that supports gradients, thresholds, boxes, and user functors.
Definition AMReX_ErrorList.H:398
ParserExecutor< 4 > m_parser_exe
Definition AMReX_ErrorList.H:530
AMRErrorTagInfo & GetInfo() noexcept
Definition AMReX_ErrorList.H:513
AMRErrorTag(AMRErrorTag::UserFunc *userfunc, std::string field, int ngrow, const AMRErrorTagInfo &info=AMRErrorTagInfo()) noexcept
Construct a tag that delegates to a user functor.
Definition AMReX_ErrorList.H:477
int NGrow() const noexcept
Definition AMReX_ErrorList.H:510
AMRErrorTag(amrex::Real value, AMRErrorTag::TEST test, std::string field, const AMRErrorTagInfo &info=AMRErrorTagInfo()) noexcept
Construct a tag using a scalar threshold across all levels.
Definition AMReX_ErrorList.H:433
std::unique_ptr< Parser > m_parser
Definition AMReX_ErrorList.H:529
AMRErrorTagInfo m_info
Definition AMReX_ErrorList.H:532
AMRErrorTag(const AMRErrorTagInfo &info=AMRErrorTagInfo()) noexcept
Construct a tag with default BOX test and the supplied metadata.
Definition AMReX_ErrorList.H:422
AMRErrorTag(amrex::Vector< amrex::Real > const &value, AMRErrorTag::TEST test, std::string field, const AMRErrorTagInfo &info=AMRErrorTagInfo()) noexcept
Construct a tag with per-level threshold values.
Definition AMReX_ErrorList.H:451
int SetNGrow() const noexcept
std::string m_field
Definition AMReX_ErrorList.H:531
AMRErrorTag(Parser parser, const AMRErrorTagInfo &info=AMRErrorTagInfo())
AMRErrorTagInfo const & GetInfo() const noexcept
Definition AMReX_ErrorList.H:514
const std::string & Field() const noexcept
Definition AMReX_ErrorList.H:511
TEST
Definition AMReX_ErrorList.H:401
@ BOX
Definition AMReX_ErrorList.H:401
void SetInfo(AMRErrorTagInfo const &info) noexcept
Definition AMReX_ErrorList.H:515
A List of ErrorRecs.
Definition AMReX_ErrorList.H:318
ErrorList() noexcept=default
Definition AMReX_ErrorList.H:187
ErrorFunc2(ErrorFunc2Default inFunc)
A Constructor.
virtual ~ErrorFunc2()=default
Destructor.
ErrorFunc2 & operator=(ErrorFunc2 const &)=default
ErrorFunc2Default m_func
Definition AMReX_ErrorList.H:249
ErrorFunc2(ErrorFunc2 &&)=delete
virtual ErrorFunc2 * clone() const
Return a ptr to a clone of this object. It is the responsibility of the caller to delete the result.
ErrorFunc2(ErrorFunc2 const &)=default
ErrorFunc2()
Bogus constructor.
Definition AMReX_ErrorList.H:99
ErrorFunc(ErrorFunc &&)=delete
ErrorFunc(ErrorFunc3DDefault inFunc)
A Constructor.
ErrorFunc(ErrorFuncDefault inFunc)
A Constructor.
ErrorFunc(ErrorFunc const &)=default
ErrorFunc3DDefault m_func3D
Definition AMReX_ErrorList.H:184
ErrorFuncDefault m_func
Definition AMReX_ErrorList.H:183
ErrorFunc()
Bogus constructor.
virtual void operator()(int *tag, const int &, const int &, const int &, const int &, const int &, const int &, const int *tagval, const int *clearval, Real *data, const int &, const int &, const int &, const int &, const int &, const int &, const int *lo, const int *hi, const int *nvar, const int *domain_lo, const int *domain_hi, const Real *dx, const Real *xlo, const Real *prob_lo, const Real *time, const int *level) const
Tag cells using "regular" function.
virtual ErrorFunc * clone() const
Return a ptr to a clone of this object. It is the responsibility of the caller to delete the result.
ErrorFunc & operator=(ErrorFunc const &)=default
virtual ~ErrorFunc()=default
Destructor.
Error Record.
Definition AMReX_ErrorList.H:89
virtual const ErrorRec::ErrorFunc & errFunc() const
The extern "C" functions to do the error tagging.
ErrorRec(ErrorRec &&)=delete
ErrorRec(std::string nm, int ng, ErrorType etyp, const ErrorRec::ErrorFunc &f)
Construct an error record that uses the ErrorFunc interface (same parameters as above).
ErrorRec(ErrorRec const &)=delete
ErrorRec & operator=(ErrorRec const &)=delete
ErrorType errType() const noexcept
The type of the error tagging.
int nGrow() const noexcept
The number of extra zones needed for derivation.
virtual const ErrorRec::ErrorFunc2 & errFunc2() const
ErrorRec(std::string nm, int ng, ErrorType etyp, const ErrorRec::ErrorFunc2 &f2)
Construct an error record that uses the ErrorFunc2 interface.
virtual ~ErrorRec()
const std::string & name() const noexcept
The name of the quantity to derive.
ErrorType
Definition AMReX_ErrorList.H:94
@ UseAverage
Definition AMReX_ErrorList.H:94
@ Special
Definition AMReX_ErrorList.H:94
@ Standard
Definition AMReX_ErrorList.H:94
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:75
A collection (stored as an array) of FArrayBox objects.
Definition AMReX_MultiFab.H:40
Front-end for parsing scalar expressions into GPU/CPU executors.
Definition AMReX_Parser.H:126
A Box with real dimensions.
Definition AMReX_RealBox.H:28
An array of TagBoxes.
Definition AMReX_TagBox.H:151
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:28
Long size() const noexcept
Definition AMReX_Vector.H:53
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:79
Definition AMReX_Amr.cpp:50
std::ostream & operator<<(std::ostream &os, AmrMesh const &amr_mesh)
Stream helper; forwards to the friend declared inside AmrMesh.
Definition AMReX_AmrMesh.cpp:1306
void(*)(int *tag, const int &, const int &, const int &, const int &, const int &, const int &, const int *tagval, const int *clearval, amrex::Real *data, const int &, const int &, const int &, const int &, const int &, const int &, const int *lo, const int *hi, const int *nvar, const int *domain_lo, const int *domain_hi, const amrex::Real *dx, const int *level, const amrex::Real *avg) ErrorFunc2Default
Definition AMReX_ErrorList.H:41
void(*)(int *tag, const int &, const int &, const int &, const int &, const int &, const int &, const int *tagval, const int *clearval, amrex::Real *data, const int &, const int &, const int &, const int &, const int &, const int &, const int *lo, const int *hi, const int *nvar, const int *domain_lo, const int *domain_hi, const amrex::Real *dx, const amrex::Real *xlo, const amrex::Real *prob_lo, const amrex::Real *time, const int *level) ErrorFuncDefault
Type of extern "C" function called by ErrorRec to do tagging of cells for refinement.
Definition AMReX_ErrorList.H:34
void(*)(int *tag, const int *tlo, const int *thi, const int *tagval, const int *clearval, amrex::Real *data, const int *data_lo, const int *data_hi, const int *lo, const int *hi, const int *nvar, const int *domain_lo, const int *domain_hi, const amrex::Real *dx, const amrex::Real *xlo, const amrex::Real *prob_lo, const amrex::Real *time, const int *level) ErrorFunc3DDefault
Dimension agnostic version that always has three elements. Note that this is only implemented for the...
Definition AMReX_ErrorList.H:74
Optional knobs that control AMRErrorTag behavior (time window, level limits, etc.).
Definition AMReX_ErrorList.H:360
AMRErrorTagInfo & SetRealBox(const amrex::RealBox &realbox) noexcept
Definition AMReX_ErrorList.H:380
AMRErrorTagInfo & SetMaxTime(amrex::Real max_time) noexcept
Definition AMReX_ErrorList.H:376
AMRErrorTagInfo & SetDerefine(int derefine) noexcept
Definition AMReX_ErrorList.H:388
AMRErrorTagInfo & SetMaxLevel(int max_level) noexcept
Definition AMReX_ErrorList.H:368
AMRErrorTagInfo & SetMinTime(amrex::Real min_time) noexcept
Definition AMReX_ErrorList.H:372
RealBox m_realbox
Definition AMReX_ErrorList.H:366
AMRErrorTagInfo & SetVolumeWeighting(int volume_weighting) noexcept
Definition AMReX_ErrorList.H:384
Definition AMReX_ErrorList.H:404
virtual ~UserFunc()=default
UserFunc(UserFunc const &)=default
UserFunc(UserFunc &&)=default
A multidimensional array accessor.
Definition AMReX_Array4.H:283
Callable wrapper around a compiled parser expression with N variables.
Definition AMReX_Parser.H:36