Nektar++
Public Member Functions | Static Public Member Functions | List of all members
Nektar::ParseUtils Class Reference

#include <ParseUtils.h>

Public Member Functions

template<>
bool GenerateVector (const std::string &str, std::vector< std::string > &out)
 Specialised version of ParseUtils::GenerateVector for std::string. More...
 

Static Public Member Functions

static bool GenerateSeqVector (const std::string &str, std::vector< unsigned int > &out)
 Takes a comma-separated compressed string and converts it to entries in a vector. More...
 
template<typename T >
static bool GenerateVector (const std::string &str, std::vector< T > &out)
 Takes a comma-separated string and converts it to entries in a vector. More...
 
template<typename T >
static std::string GenerateSeqString (const std::vector< T > &v)
 Generate a compressed comma-separated string representation of a vector of unsigned integers. More...
 
static bool GenerateVariableSet (const std::string &str, const std::vector< std::string > &variables, std::set< int > &out)
 Generate a set of variable locations. More...
 

Detailed Description

Definition at line 47 of file ParseUtils.h.

Member Function Documentation

◆ GenerateSeqString()

template<typename T >
static std::string Nektar::ParseUtils::GenerateSeqString ( const std::vector< T > &  v)
inlinestatic

Generate a compressed comma-separated string representation of a vector of unsigned integers.

This utility routine takes entries of v and returns a string sequence. For example,

std::vector<unsigned int> vec = {1,2,3,4,6,7,8,5,2,3};
std::string output = ParseUtils::GenerateVector(vec);

will produce an output string containing 1-4,6-8,5,2,3.

Parameters
vVector of unsigned integers.
Returns
Compressed comma separated string.

Definition at line 72 of file ParseUtils.h.

73  {
74  static_assert(std::is_integral<T>::value && std::is_unsigned<T>::value,
75  "Unsigned integer type required.");
76 
77  if (v.size() == 0)
78  {
79  return "";
80  }
81 
82  std::ostringstream ss;
83  auto first = v[0], last = v[0];
84 
85  ss << v[0];
86 
87  for (auto &i : v)
88  {
89  if (i != last + 1 && i != last)
90  {
91  if (last != first)
92  {
93  ss << '-' << last;
94  }
95  ss << ',' << i;
96  first = i;
97  }
98  last = i;
99  }
100 
101  if (last != first)
102  {
103  ss << '-' << last;
104  }
105 
106  return ss.str();
107  }

Referenced by Nektar::SolverUtils::DriverAdaptive::ReplaceExpansion(), Nektar::LibUtilities::FieldIOXml::v_Write(), and Nektar::LibUtilities::FieldIOXml::WriteMultiFldFileIDs().

◆ GenerateSeqVector()

bool Nektar::ParseUtils::GenerateSeqVector ( const std::string &  str,
std::vector< unsigned int > &  out 
)
static

Takes a comma-separated compressed string and converts it to entries in a vector.

This routine is the inverse of ParseUtils::GenerateSeqString. For example,

std::string input = "1-4,6-8,5,2,3";
std::vector<unsigned int> output;
ParseUtils::GenerateSeqString(input, output);

produces an output vector with the entries {1,2,3,4,6,7,8,5,2,3}.

Parameters
strInput CSV string of unsigned integers.
outOutput vector.
See also
ParseUtils::GenerateSeqString

Definition at line 105 of file ParseUtils.cpp.

107 {
108  PushBackFunctor<unsigned int> f1(out), f2(out);
109 
110  auto it = str.begin();
111  bool success = qi::phrase_parse(
112  it, str.end(),
113  ((qi::uint_ >> '-' >> qi::uint_)[f2] | qi::uint_[f1]) % ',',
114  qi::ascii::space);
115 
116  return success && it == str.end();
117 }

Referenced by Nektar::SolverUtils::FilterIntegral::FilterIntegral(), Nektar::LibUtilities::FieldIOXml::ImportFieldDefs(), Nektar::LibUtilities::FieldIOXml::ImportMultiFldFileIDs(), Nektar::SpatialDomains::BoundaryConditions::ReadBoundaryConditions(), Nektar::Collections::CollectionOptimisation::ReadCollOps(), Nektar::SpatialDomains::MeshPartition::ReadExpansions(), Nektar::SolverUtils::FilterAeroForces::v_Initialise(), Nektar::FilterMovingBody::v_Initialise(), and Nektar::FieldUtils::ProcessInnerProduct::v_Process().

◆ GenerateVariableSet()

bool Nektar::ParseUtils::GenerateVariableSet ( const std::string &  str,
const std::vector< std::string > &  variables,
std::set< int > &  out 
)
static

Generate a set of variable locations.

This utility routine takes entries of str and returns a integer set that contains locations of parsed variables in variables. For example,

str = "0,1,w,p";
variables = {"u", "v", "w", "p"};

will produce an set out = {0,1,2,3}.

Parameters
strA string of variables separated by comma.
variablesA vector of variables
Returns
out A set of locations of parsed variables in variables.

Definition at line 166 of file ParseUtils.cpp.

169 {
170  out.clear();
171  std::vector<std::string> vars;
173  "Failed to interpret variable numbers or names from " + str);
174  for (std::string s : vars)
175  {
176  int v = -1;
177  try
178  {
179  v = boost::lexical_cast<int>(s);
180  }
181  catch (const boost::bad_lexical_cast &)
182  {
183  auto index = find(variables.begin(), variables.end(), s);
184  v = index - variables.begin();
185  }
186  if (v < 0 || v >= variables.size())
187  {
188  WARNINGL0(false, "Warning: variable " + s + " not found");
189  }
190  else
191  {
192  out.insert(v);
193  }
194  }
195  return true;
196 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:215
#define WARNINGL0(condition, msg)
Definition: ErrorUtil.hpp:222
static bool GenerateVector(const std::string &str, std::vector< T > &out)
Takes a comma-separated string and converts it to entries in a vector.
Definition: ParseUtils.cpp:131
InputIterator find(InputIterator first, InputIterator last, InputIterator startingpoint, const EqualityComparable &value)
Definition: StdRegions.hpp:444

References ASSERTL0, Nektar::StdRegions::find(), GenerateVector(), and WARNINGL0.

Referenced by Nektar::FieldUtils::ProcessGrad::ParserOptions(), Nektar::FieldUtils::ProcessHalfModeToFourier::v_Process(), Nektar::FieldUtils::ProcessInterpField::v_Process(), and Nektar::FieldUtils::ProcessInterpPoints::v_Process().

◆ GenerateVector() [1/2]

template<>
bool Nektar::ParseUtils::GenerateVector ( const std::string &  str,
std::vector< std::string > &  out 
)

Specialised version of ParseUtils::GenerateVector for std::string.

This routine specialises for the std::string data type as this type is not supported by boost::spirit::qi::auto_.

Definition at line 157 of file ParseUtils.cpp.

159 {
160  auto it = str.begin();
161  bool success = qi::phrase_parse(it, str.end(), +~qi::char_(",") % ',',
162  qi::ascii::space, out);
163  return success && it == str.end();
164 }

◆ GenerateVector() [2/2]

template<typename T >
template bool Nektar::ParseUtils::GenerateVector< float > ( const std::string &  str,
std::vector< T > &  out 
)
static

Takes a comma-separated string and converts it to entries in a vector.

This routine splits up a comma-separated string and returns a vector with the entries. Template specialisations should be defined in this file (and not in the header file) as the use of boost::spirit::qi makes compilation times quite slow.

Parameters
strInput CSV string.
outOutput vector.

Definition at line 131 of file ParseUtils.cpp.

132 {
133  auto it = str.begin();
134  bool success =
135  qi::phrase_parse(it, str.end(), qi::auto_ % ',', qi::ascii::space, out);
136  return success && it == str.end();
137 }

Referenced by Nektar::SolverUtils::ForcingAbsorption::CalcAbsorption(), Nektar::FieldUtils::ProcessInterpPoints::calcCp0(), Nektar::FieldUtils::ProcessInterpPtsToPts::calcCp0(), Nektar::FieldUtils::ProcessInterpPoints::CreateFieldPts(), Nektar::FieldUtils::ProcessInterpPtsToPts::CreateFieldPts(), Nektar::SolverUtils::FilterHistoryPoints::FilterHistoryPoints(), GenerateVariableSet(), Nektar::LibUtilities::FieldIOHdf5::ImportFieldDef(), Nektar::LibUtilities::FieldIOXml::ImportFieldDefs(), Nektar::SpatialDomains::MeshPartition::ReadExpansions(), Nektar::SpatialDomains::Movement::ReadZones(), Nektar::IncNavierStokes::SetUpWomersley(), Nektar::LibUtilities::CsvIO::v_ImportFieldData(), Nektar::LibUtilities::PtsIO::v_ImportFieldData(), Nektar::SolverUtils::Coupling::v_Init(), Nektar::FieldUtils::InputDat::v_Process(), Nektar::FieldUtils::InputXml::v_Process(), Nektar::FieldUtils::ProcessBodyFittedVelocity::v_Process(), Nektar::FieldUtils::ProcessBoundaryExtract::v_Process(), Nektar::FieldUtils::ProcessC0Projection::v_Process(), Nektar::FieldUtils::ProcessInnerProduct::v_Process(), Nektar::FieldUtils::ProcessInterpField::v_Process(), Nektar::FieldUtils::ProcessInterpPoints::v_Process(), Nektar::FieldUtils::ProcessRemoveField::v_Process(), and Nektar::FieldUtils::ProcessWallNormalData::v_Process().