Nektar++
Static Public Member Functions | Static Public Attributes | Protected Member Functions | Protected Attributes | List of all members
Nektar::MetricL2 Class Reference

#include <MetricL2.h>

Inheritance diagram for Nektar::MetricL2:
[legend]

Static Public Member Functions

static MetricSharedPtr create (TiXmlElement *metric, bool generate)
 
- Static Public Member Functions inherited from Nektar::MetricRegex
static MetricSharedPtr create (TiXmlElement *metric, bool generate)
 

Static Public Attributes

static std::string type
 
static std::string defaultTolerance = "1e-12"
 
- Static Public Attributes inherited from Nektar::MetricRegex
static std::string type
 

Protected Member Functions

 MetricL2 (TiXmlElement *metric, bool generate)
 
void v_Generate (std::istream &pStdout, std::istream &pStderr) override
 Virtual function to generate the metric. Should be redefined in derived classes. More...
 
- Protected Member Functions inherited from Nektar::MetricRegex
 MetricRegex (TiXmlElement *metric, bool generate)
 Constructor. More...
 
bool v_Test (std::istream &pStdout, std::istream &pStderr) override
 Test output against a regex expression and set of matches. More...
 
void v_Generate (std::istream &pStdout, std::istream &pStderr) override
 Test output against a regex expression and set of matches. More...
 
virtual bool v_Test (std::istream &pStdout, std::istream &pStderr)=0
 Virtual function to test the metric. Should be redefined in derived classes. More...
 
virtual void v_Generate (std::istream &pStdout, std::istream &pSrderr)=0
 Virtual function to generate the metric. Should be redefined in derived classes. More...
 

Protected Attributes

std::map< std::string, std::string > m_varTolerance
 
- Protected Attributes inherited from Nektar::MetricRegex
std::regex m_regex
 Storage for the boost regex. More...
 
std::vector< std::vector< MetricRegexFieldValue > > m_matches
 Stores the multiple matches defined in each <MATCH> tag. More...
 
bool m_unordered = false
 If true, regex matches may be in any order in output. More...
 
bool m_useStderr = false
 If true, use stderr for testing/generation instead of stdout. More...
 
- Protected Attributes inherited from Nektar::Metric
int m_id
 Stores the ID of this metric. More...
 
std::string m_type
 Stores the type of this metric (uppercase). More...
 
bool m_generate
 Determines whether to generate this metric or not. More...
 
bool m_average = false
 Indicates whether a metric supports averaging results from multiple runs. More...
 
TiXmlElement * m_metric
 Pointer to XML structure containing metric definition. More...
 

Additional Inherited Members

- Public Member Functions inherited from Nektar::MetricRegex
 ~MetricRegex () override
 
- Public Member Functions inherited from Nektar::Metric
 Metric (TiXmlElement *metric, bool generate)
 Constructor. More...
 
virtual ~Metric ()=default
 
bool Test (std::istream &pStdout, std::istream &pStderr)
 Calls a metric's v_Test function (or v_Generate if m_generate). More...
 
void Generate (std::istream &pStdout, std::istream &pStderr)
 
std::string GetType ()
 Return metric type. More...
 
int GetID ()
 Return metric ID. More...
 
bool SupportsAverage () const
 Return whether this metric supports averaging results from multiple runs. More...
 

Detailed Description

Definition at line 43 of file MetricL2.h.

Constructor & Destructor Documentation

◆ MetricL2()

Nektar::MetricL2::MetricL2 ( TiXmlElement *  metric,
bool  generate 
)
protected

Definition at line 45 of file MetricL2.cpp.

46 : MetricRegex(metric, generate)
47{
48 // Set up the regular expression. This (optionally) matches a variable
49 // name if it exists: first field is variable name, second field is L2
50 // error.
51 m_regex = "^L 2 error\\s*(?:\\(variable "
52 "(\\w+)\\))?\\s*:\\s*([+-]?\\d.+\\d|-?\\d|[+-]?nan|[+-]?inf).*";
53
54 // Find the L2 error to match against.
55 TiXmlElement *value = metric->FirstChildElement("value");
56 ASSERTL0(value || m_generate, "Missing value tag for L2 metric!");
57 while (value)
58 {
59 // Set up a match with two fields which correspond with the
60 // subexpression above. The first is the variable name, second is
61 // the L2 error.
62 ASSERTL0(value->Attribute("tolerance"),
63 "Missing tolerance in L2 metric");
64 ASSERTL0(!EmptyString(value->GetText()), "Missing value in L2 metric.");
65
66 MetricRegexFieldValue var;
67 if (value->Attribute("variable"))
68 {
69 var.m_value = value->Attribute("variable");
70 }
71
72 MetricRegexFieldValue val;
73 val.m_value = value->GetText();
74 val.m_useTolerance = true;
75 val.m_tolerance = atof(value->Attribute("tolerance"));
76
77 if (!m_generate)
78 {
79 std::vector<MetricRegexFieldValue> tmp(2);
80 tmp[0] = var;
81 tmp[1] = val;
82 m_matches.push_back(tmp);
83 }
84 else
85 {
86 m_varTolerance[var.m_value] = value->Attribute("tolerance");
87 }
88
89 value = value->NextSiblingElement("value");
90 }
91}
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:208
bool m_generate
Determines whether to generate this metric or not.
Definition: Metric.h:96
std::map< std::string, std::string > m_varTolerance
Definition: MetricL2.h:57
MetricRegex(TiXmlElement *metric, bool generate)
Constructor.
Definition: MetricRegex.cpp:51
std::vector< std::vector< MetricRegexFieldValue > > m_matches
Stores the multiple matches defined in each <MATCH> tag.
Definition: MetricRegex.h:84
std::regex m_regex
Storage for the boost regex.
Definition: MetricRegex.h:82
bool EmptyString(const char *s)
Check to see whether the given string s is empty (or null).
Definition: Metric.h:50

References ASSERTL0, Nektar::EmptyString(), Nektar::Metric::m_generate, Nektar::MetricRegex::m_matches, Nektar::MetricRegex::m_regex, Nektar::MetricRegexFieldValue::m_tolerance, Nektar::MetricRegexFieldValue::m_useTolerance, Nektar::MetricRegexFieldValue::m_value, and m_varTolerance.

Referenced by create().

Member Function Documentation

◆ create()

static MetricSharedPtr Nektar::MetricL2::create ( TiXmlElement *  metric,
bool  generate 
)
inlinestatic

Definition at line 46 of file MetricL2.h.

47 {
48 return MetricSharedPtr(new MetricL2(metric, generate));
49 }
MetricL2(TiXmlElement *metric, bool generate)
Definition: MetricL2.cpp:45
std::shared_ptr< Metric > MetricSharedPtr
A shared pointer to an EquationSystem object.
Definition: Metric.h:124

References MetricL2().

◆ v_Generate()

void Nektar::MetricL2::v_Generate ( std::istream &  pStdout,
std::istream &  pSrderr 
)
overrideprotectedvirtual

Virtual function to generate the metric. Should be redefined in derived classes.

Parameters
pStdoutReference to test output stream.
pSrderrReference to test error stream.

Implements Nektar::Metric.

Definition at line 93 of file MetricL2.cpp.

94{
95 // Run MetricRegex to generate matches.
96 MetricRegex::v_Generate(pStdout, pStderr);
97
98 // First remove all existing values.
99 m_metric->Clear();
100
101 // Now create new values.
102 for (int i = 0; i < m_matches.size(); ++i)
103 {
104 ASSERTL0(m_matches[i].size() == 2,
105 "Wrong number of matches for regular expression.");
106
107 bool tolSet = false;
108 std::string tol = MetricL2::defaultTolerance;
109 TiXmlElement *value = new TiXmlElement("value");
110
111 // See if there is a tolerance found already for this variable
112 // (including empty variables).
113 std::map<std::string, std::string>::iterator it =
114 m_varTolerance.find(m_matches[i][0].m_value);
115
116 if (it != m_varTolerance.end())
117 {
118 tol = it->second;
119 tolSet = true;
120 }
121
122 if (m_matches[i][0].m_value.size() > 0)
123 {
124 value->SetAttribute("variable", m_matches[i][0].m_value);
125
126 if (m_matches[i][0].m_value == "p" && !tolSet)
127 {
128 // Set lower tolerance for pressure fields automatically if
129 // we haven't already got a tolerance from the existing
130 // file.
131 tol = "1e-8";
132 }
133 }
134
135 value->SetAttribute("tolerance", tol);
136 value->LinkEndChild(new TiXmlText(m_matches[i][1].m_value));
137 m_metric->LinkEndChild(value);
138 }
139}
TiXmlElement * m_metric
Pointer to XML structure containing metric definition.
Definition: Metric.h:101
static std::string defaultTolerance
Definition: MetricL2.h:52
void v_Generate(std::istream &pStdout, std::istream &pStderr) override
Test output against a regex expression and set of matches.

References ASSERTL0, defaultTolerance, Nektar::MetricRegex::m_matches, Nektar::Metric::m_metric, m_varTolerance, and Nektar::MetricRegex::v_Generate().

Member Data Documentation

◆ defaultTolerance

std::string Nektar::MetricL2::defaultTolerance = "1e-12"
static

Definition at line 52 of file MetricL2.h.

Referenced by v_Generate().

◆ m_varTolerance

std::map<std::string, std::string> Nektar::MetricL2::m_varTolerance
protected

Definition at line 57 of file MetricL2.h.

Referenced by MetricL2(), and v_Generate().

◆ type

std::string Nektar::MetricL2::type
static
Initial value:
=
std::string RegisterCreatorFunction(std::string key, CreatorFunction func)
Definition: Metric.h:133
static MetricSharedPtr create(TiXmlElement *metric, bool generate)
Definition: MetricL2.h:46
MetricFactory & GetMetricFactory()
Definition: Metric.cpp:42

Definition at line 51 of file MetricL2.h.