libmesh解析
本工作只是尝试解析原libmesh的代码,供学习使用
全部  命名空间 文件 函数 变量 类型定义 枚举 枚举值 友元 
Public 成员函数 | Protected 成员函数 | Protected 属性 | Private 成员函数 | Private 属性 | 所有成员列表
libMesh::ParsedFunction< Output, OutputGradient > 模板类 参考

通过解析数学表达式生成(通过 FParser)的函数。所有重写的虚拟函数在 function_base.h 中都有文档说明。 更多...

#include <parsed_function.h>

类 libMesh::ParsedFunction< Output, OutputGradient > 继承关系图:
[图例]

Public 成员函数

 ParsedFunction (std::string expression, const std::vector< std::string > *additional_vars=nullptr, const std::vector< Output > *initial_vals=nullptr)
 构造函数。使用给定的数学表达式创建一个 ParsedFunction。 更多...
 
 ParsedFunction (const ParsedFunction &)
 
ParsedFunctionoperator= (const ParsedFunction &)
 
 ParsedFunction (ParsedFunction &&)=default
 
ParsedFunctionoperator= (ParsedFunction &&)=default
 
virtual ~ParsedFunction ()=default
 
void reparse (std::string expression)
 重新解析 ParsedFunction 的数学表达式。 更多...
 
virtual Output operator() (const Point &p, const Real time=0) override
 计算 ParsedFunction 在给定点上的值。 更多...
 
virtual bool has_derivatives ()
 查询是否成功生成了自动导数。 更多...
 
virtual Output dot (const Point &p, const Real time=0)
 计算 ParsedFunction 在给定点上的点乘结果。 更多...
 
virtual OutputGradient gradient (const Point &p, const Real time=0)
 计算 ParsedFunction 在给定点上的梯度。 更多...
 
virtual void operator() (const Point &p, const Real time, DenseVector< Output > &output) override
 计算 ParsedFunction 在给定点上的输出并存储在输出向量中。 更多...
 
virtual Output component (unsigned int i, const Point &p, Real time) override
 计算 ParsedFunction 的特定分量在给定点上的值。 更多...
 
const std::string & expression ()
 获取 ParsedFunction 的数学表达式。 更多...
 
virtual Output & getVarAddress (std::string_view variable_name)
 获取一个解析变量的地址,以便提供参数化的值。 更多...
 
virtual std::unique_ptr
< FunctionBase< Output > > 
clone () const override
 克隆 ParsedFunction 对象。 更多...
 
Output get_inline_value (std::string_view inline_var_name) const
 获取内联变量的值。 更多...
 
void set_inline_value (std::string_view inline_var_name, Output newval)
 Changes the value of an inline variable. 更多...
 
 ParsedFunction (std::string, const std::vector< std::string > *=nullptr, const std::vector< Output > *=nullptr)
 
 ParsedFunction (ParsedFunction &&)=delete
 LIBMESH_HAVE_FPARSER时,这个类没有实现, 所以让通过删除特殊函数来显式地实现它。 更多...
 
 ParsedFunction (const ParsedFunction &)=delete
 
ParsedFunctionoperator= (const ParsedFunction &)=delete
 
ParsedFunctionoperator= (ParsedFunction &&)=delete
 
virtual ~ParsedFunction ()=default
 
virtual Output operator() (const Point &, const Real=0)
 
virtual void operator() (const Point &, const Real, DenseVector< Output > &)
 用于时间无关的矢量值函数的评估函数。 将输出值设置在传入的 output DenseVector 中。 更多...
 
virtual void init ()
 实际的初始化过程。 更多...
 
virtual void clear ()
 清除函数。 更多...
 
virtual Output & getVarAddress (std::string_view)
 
virtual std::unique_ptr
< FunctionBase< Output > > 
clone () const
 
void operator() (const Point &p, DenseVector< Output > &output)
 Evaluation function for time-independent vector-valued functions. 更多...
 
bool initialized () const
 
void set_is_time_dependent (bool is_time_dependent)
 设置函数是否依赖时间的函数。 这仅应该由无法本地确定时间依赖性的子类使用。 在这种情况下,应在构造之后立即使用这个函数。 更多...
 
bool is_time_dependent () const
 

Protected 成员函数

void partial_reparse (std::string expression)
 重新解析数学表达式,仅对表达式进行轻微更改。 更多...
 
std::size_t find_name (std::string_view varname, std::string_view expr) const
 解析出变量名的辅助函数。 更多...
 
bool expression_is_time_dependent (std::string_view expression) const
 检查表达式是否与时间有关。 更多...
 

Protected 属性

const FunctionBase_master
 指向我们的主函数对象的const指针,初始化为 nullptr。 可能存在需要多个函数的情况,但为了节省内存,一个主函数对象可以处理一些集中的数据。 更多...
 
bool _initialized
 init() 被调用以确保一切都准备好后,可以调用 operator() (...) 时为 true。 更多...
 
bool _is_time_dependent
 成员变量用于缓存函数是否真正依赖于时间。 更多...
 

Private 成员函数

void set_spacetime (const Point &p, const Real time=0)
 设置 _spacetime 参数向量。 更多...
 
Output eval (FunctionParserADBase< Output > &parser, std::string_view libmesh_dbg_var(function_name), unsigned int libmesh_dbg_var(component_idx)) const
 评估第 i 个 FunctionParser 并检查结果。 更多...
 

Private 属性

std::string _expression
 存储数学表达式的字符串表示。 更多...
 
std::vector< std::string > _subexpressions
 存储在数学表达式中找到的子表达式的字符串表示。 更多...
 
std::vector< std::unique_ptr
< FunctionParserADBase< Output > > > 
parsers
 存储用于计算数学表达式的解析器的集合。 更多...
 
std::vector< Output > _spacetime
 存储空间-时间参数向量的值。 更多...
 
std::vector< std::unique_ptr
< FunctionParserADBase< Output > > > 
dx_parsers
 存储用于计算导数的解析器的集合。 更多...
 
std::vector< std::unique_ptr
< FunctionParserADBase< Output > > > 
dy_parsers
 存储用于计算二维场景中 y 方向导数的解析器的集合。 更多...
 
std::vector< std::unique_ptr
< FunctionParserADBase< Output > > > 
dz_parsers
 存储用于计算三维场景中 z 方向导数的解析器的集合。 更多...
 
std::vector< std::unique_ptr
< FunctionParserADBase< Output > > > 
dt_parsers
 存储用于计算时间导数的解析器的集合。 更多...
 
bool _valid_derivatives
 用于跟踪导数是否有效的标志。 更多...
 
std::string variables
 存储函数中可以解析和处理的变量名称和值。 更多...
 
std::vector< std::string > _additional_vars
 存储附加变量的名称,这些变量可以在函数中进行解析和处理。 更多...
 
std::vector< Output > _initial_vals
 存储函数中变量的初始值。 更多...
 
Output _dummy
 

详细描述

template<typename Output = Number, typename OutputGradient = Gradient>
class libMesh::ParsedFunction< Output, OutputGradient >

通过解析数学表达式生成(通过 FParser)的函数。所有重写的虚拟函数在 function_base.h 中都有文档说明。

作者
Roy Stogner
日期
2012 由 std::string 定义的函数。

在文件 parsed_function.h58 行定义.

构造及析构函数说明

template<typename Output, typename OutputGradient >
libMesh::ParsedFunction< Output, OutputGradient >::ParsedFunction ( std::string  expression,
const std::vector< std::string > *  additional_vars = nullptr,
const std::vector< Output > *  initial_vals = nullptr 
)
inlineexplicit

构造函数。使用给定的数学表达式创建一个 ParsedFunction。

参数
expression数学表达式的字符串表示。
additional_vars可选参数,附加的变量名(字符串向量),默认为空。
initial_vals可选参数,初始值(输出向量),默认为空。

在文件 parsed_function.h317 行定义.

参考 libMesh::FunctionBase< Output >::_initialized , 以及 libMesh::ParsedFunction< Output, OutputGradient >::reparse().

319  :
320  _expression (), // overridden by parse()
321  // 调整时空向量的大小,以考虑空间、时间和传递的任何其他变量
322  _spacetime (LIBMESH_DIM+1 + (additional_vars ? additional_vars->size() : 0)),
323  _valid_derivatives (true),
324  _additional_vars (additional_vars ? *additional_vars : std::vector<std::string>()),
325  _initial_vals (initial_vals ? *initial_vals : std::vector<Output>())
326 {
327  // time-dependence established in reparse function
328  this->reparse(std::move(expression));
329  this->_initialized = true;
330 }
std::vector< Output > _spacetime
存储空间-时间参数向量的值。
std::vector< std::string > _additional_vars
存储附加变量的名称,这些变量可以在函数中进行解析和处理。
bool _initialized
当 init() 被调用以确保一切都准备好后,可以调用 operator() (...) 时为 true。
std::string _expression
存储数学表达式的字符串表示。
bool _valid_derivatives
用于跟踪导数是否有效的标志。
void reparse(std::string expression)
重新解析 ParsedFunction 的数学表达式。
std::vector< Output > _initial_vals
存储函数中变量的初始值。
const std::string & expression()
获取 ParsedFunction 的数学表达式。
template<typename Output, typename OutputGradient >
libMesh::ParsedFunction< Output, OutputGradient >::ParsedFunction ( const ParsedFunction< Output, OutputGradient > &  other)
inline

在文件 parsed_function.h335 行定义.

参考 libMesh::ParsedFunction< Output, OutputGradient >::_expression, libMesh::FunctionBase< Output >::_initialized , 以及 libMesh::ParsedFunction< Output, OutputGradient >::reparse().

335  :
336  FunctionBase<Output>(other),
337  _expression(other._expression),
338  _subexpressions(other._subexpressions),
339  _spacetime(other._spacetime),
340  _valid_derivatives(other._valid_derivatives),
341  variables(other.variables),
342  _additional_vars(other._additional_vars),
343  _initial_vals(other._initial_vals)
344 {
345  // 可以通过重新解析表达式从头生成解析器
346  this->reparse(this->_expression);
347  this->_initialized = true;
348 }
std::vector< Output > _spacetime
存储空间-时间参数向量的值。
std::vector< std::string > _additional_vars
存储附加变量的名称,这些变量可以在函数中进行解析和处理。
bool _initialized
当 init() 被调用以确保一切都准备好后,可以调用 operator() (...) 时为 true。
std::vector< std::string > _subexpressions
存储在数学表达式中找到的子表达式的字符串表示。
std::string _expression
存储数学表达式的字符串表示。
bool _valid_derivatives
用于跟踪导数是否有效的标志。
void reparse(std::string expression)
重新解析 ParsedFunction 的数学表达式。
std::vector< Output > _initial_vals
存储函数中变量的初始值。
std::string variables
存储函数中可以解析和处理的变量名称和值。
template<typename Output = Number, typename OutputGradient = Gradient>
libMesh::ParsedFunction< Output, OutputGradient >::ParsedFunction ( ParsedFunction< Output, OutputGradient > &&  )
default
template<typename Output = Number, typename OutputGradient = Gradient>
virtual libMesh::ParsedFunction< Output, OutputGradient >::~ParsedFunction ( )
virtualdefault
template<typename Output = Number, typename OutputGradient = Gradient>
libMesh::ParsedFunction< Output, OutputGradient >::ParsedFunction ( std::string  ,
const std::vector< std::string > *  = nullptr,
const std::vector< Output > *  = nullptr 
)
inline

在文件 parsed_function.h845 行定义.

847  : _dummy(0)
848  {
849  libmesh_not_implemented();
850  }
template<typename Output = Number, typename OutputGradient = Gradient>
libMesh::ParsedFunction< Output, OutputGradient >::ParsedFunction ( ParsedFunction< Output, OutputGradient > &&  )
delete

LIBMESH_HAVE_FPARSER时,这个类没有实现, 所以让通过删除特殊函数来显式地实现它。

template<typename Output = Number, typename OutputGradient = Gradient>
libMesh::ParsedFunction< Output, OutputGradient >::ParsedFunction ( const ParsedFunction< Output, OutputGradient > &  )
delete
template<typename Output = Number, typename OutputGradient = Gradient>
virtual libMesh::ParsedFunction< Output, OutputGradient >::~ParsedFunction ( )
virtualdefault

成员函数说明

template<typename Output = Number, typename OutputGradient = Gradient>
virtual void libMesh::ParsedFunction< Output, OutputGradient >::clear ( )
inlinevirtual

清除函数。

这个函数可以用来清除函数对象的状态,以备重新使用。

重载 libMesh::FunctionBase< Output > .

在文件 parsed_function.h871 行定义.

871 {}
template<typename Output , typename OutputGradient >
std::unique_ptr< FunctionBase< Output > > libMesh::ParsedFunction< Output, OutputGradient >::clone ( ) const
inlineoverridevirtual

克隆 ParsedFunction 对象。

返回
ParsedFunction 的克隆对象。

实现了 libMesh::FunctionBase< Output >.

在文件 parsed_function.h489 行定义.

490 {
491  return std::make_unique<ParsedFunction>(_expression,
493  &_initial_vals);
494 }
std::vector< std::string > _additional_vars
存储附加变量的名称,这些变量可以在函数中进行解析和处理。
std::string _expression
存储数学表达式的字符串表示。
std::vector< Output > _initial_vals
存储函数中变量的初始值。
template<typename Output = Number, typename OutputGradient = Gradient>
virtual std::unique_ptr<FunctionBase<Output> > libMesh::ParsedFunction< Output, OutputGradient >::clone ( ) const
inlinevirtual
返回
函数的新副本。

新副本应该足够“深”,以允许在不同线程中独立销毁和同时评估副本。

实现了 libMesh::FunctionBase< Output >.

在文件 parsed_function.h873 行定义.

874  {
875  return std::make_unique<ParsedFunction<Output>>("");
876  }
template<typename Output , typename OutputGradient >
Output libMesh::ParsedFunction< Output, OutputGradient >::component ( unsigned int  i,
const Point &  p,
Real  time 
)
inlineoverridevirtual

计算 ParsedFunction 的特定分量在给定点上的值。

参数
i要计算的分量的索引。
p要计算分量值的点。
time时间值。
返回
计算结果的分量值。
The vector component i at coordinate p and time time.

重载 libMesh::FunctionBase< Output > .

在文件 parsed_function.h455 行定义.

458 {
459  set_spacetime(p, time);
460  libmesh_assert_less (i, parsers.size());
461 
462  // _spacetime中的其余位置目前在构建时是固定的,但可能会被动态化
463  libmesh_assert_less(i, parsers.size());
464  return eval(*parsers[i], "f", i);
465 }
Output eval(FunctionParserADBase< Output > &parser, std::string_view libmesh_dbg_var(function_name), unsigned int libmesh_dbg_var(component_idx)) const
评估第 i 个 FunctionParser 并检查结果。
std::vector< std::unique_ptr< FunctionParserADBase< Output > > > parsers
存储用于计算数学表达式的解析器的集合。
void set_spacetime(const Point &p, const Real time=0)
设置 _spacetime 参数向量。
template<typename Output , typename OutputGradient >
Output libMesh::ParsedFunction< Output, OutputGradient >::dot ( const Point &  p,
const Real  time = 0 
)
inlinevirtual

计算 ParsedFunction 在给定点上的点乘结果。

参数
p要计算点乘结果的点。
time时间值(可选,默认为0)。
返回
点乘结果的值。

在文件 parsed_function.h404 行定义.

405 {
406  set_spacetime(p, time);
407  return eval(*dt_parsers[0], "df/dt", 0);
408 }
Output eval(FunctionParserADBase< Output > &parser, std::string_view libmesh_dbg_var(function_name), unsigned int libmesh_dbg_var(component_idx)) const
评估第 i 个 FunctionParser 并检查结果。
void set_spacetime(const Point &p, const Real time=0)
设置 _spacetime 参数向量。
std::vector< std::unique_ptr< FunctionParserADBase< Output > > > dt_parsers
存储用于计算时间导数的解析器的集合。
template<typename Output = Number, typename OutputGradient = Gradient>
Output libMesh::ParsedFunction< Output, OutputGradient >::eval ( FunctionParserADBase< Output > &  parser,
std::string_view   libmesh_dbg_varfunction_name,
unsigned int   libmesh_dbg_varcomponent_idx 
) const
inlineprivate

评估第 i 个 FunctionParser 并检查结果。

参数
parser要评估的 FunctionParser。
function_name函数的名称。
component_idx组件的索引。
返回
评估结果的值。

在文件 parsed_function.h779 行定义.

参考 libMesh::err.

782 {
783  Output result = parser.Eval(_spacetime.data());
784  int error_code = parser.EvalError();
785  if (error_code)
786  {
787  libMesh::err << "ERROR: FunctionParser is unable to evaluate component "
788  << component_idx
789  << " for '"
790  << function_name;
791 
792  for (auto i : index_range(parsers))
793  if (parsers[i].get() == &parser)
794  libMesh::err << "' of expression '"
795  << _subexpressions[i];
796 
797  libMesh::err << "' with arguments:\n";
798  for (const auto & item : _spacetime)
799  libMesh::err << '\t' << item << '\n';
800  libMesh::err << '\n';
801 
802  // 目前没有API来报告错误消息,我们将手动完成
803  std::string error_message = "Reason: ";
804 
805  switch (error_code)
806  {
807  case 1:
808  error_message += "Division by zero";
809  break;
810  case 2:
811  error_message += "Square Root error (negative value)";
812  break;
813  case 3:
814  error_message += "Log error (negative value)";
815  break;
816  case 4:
817  error_message += "Trigonometric error (asin or acos of illegal value)";
818  break;
819  case 5:
820  error_message += "Maximum recursion level reached";
821  break;
822  default:
823  error_message += "Unknown";
824  break;
825  }
826  libmesh_error_msg(error_message);
827  }
828 
829  return result;
830 }
std::vector< Output > _spacetime
存储空间-时间参数向量的值。
std::vector< std::unique_ptr< FunctionParserADBase< Output > > > parsers
存储用于计算数学表达式的解析器的集合。
std::vector< std::string > _subexpressions
存储在数学表达式中找到的子表达式的字符串表示。
OStreamProxy err
template<typename Output = Number, typename OutputGradient = Gradient>
const std::string& libMesh::ParsedFunction< Output, OutputGradient >::expression ( )
inline

获取 ParsedFunction 的数学表达式。

返回
数学表达式的字符串表示。

在文件 parsed_function.h153 行定义.

153 { return _expression; }
std::string _expression
存储数学表达式的字符串表示。
template<typename Output , typename OutputGradient >
bool libMesh::ParsedFunction< Output, OutputGradient >::expression_is_time_dependent ( std::string_view  expression) const
inlineprotected

检查表达式是否与时间有关。

参数
expression要检查的数学表达式的字符串表示。
返回
如果表达式与时间有关则返回 true,否则返回 false。

在文件 parsed_function.h745 行定义.

746 {
747  bool is_time_dependent = false;
748 
749  // 根据定义,对于基于functionbase的对象,时间是“t”,所以只需要看看这个表达式中是否有变量“t”。
750  if (this->find_name(std::string("t"), expression) != std::string::npos)
751  is_time_dependent = true;
752 
753  return is_time_dependent;
754 }
bool is_time_dependent() const
std::size_t find_name(std::string_view varname, std::string_view expr) const
解析出变量名的辅助函数。
const std::string & expression()
获取 ParsedFunction 的数学表达式。
template<typename Output , typename OutputGradient >
std::size_t libMesh::ParsedFunction< Output, OutputGradient >::find_name ( std::string_view  varname,
std::string_view  expr 
) const
inlineprotected

解析出变量名的辅助函数。

参数
varname要解析的变量名。
expr要解析的表达式。
返回
变量名在表达式中的位置。

在文件 parsed_function.h723 行定义.

725 {
726  const std::size_t namesize = varname.size();
727  std::size_t varname_i = expr.find(varname);
728 
729  while ((varname_i != std::string::npos) &&
730  (((varname_i > 0) &&
731  (std::isalnum(expr[varname_i-1]) ||
732  (expr[varname_i-1] == '_'))) ||
733  ((varname_i+namesize < expr.size()) &&
734  (std::isalnum(expr[varname_i+namesize]) ||
735  (expr[varname_i+namesize] == '_')))))
736  {
737  varname_i = expr.find(varname, varname_i+1);
738  }
739 
740  return varname_i;
741 }
template<typename Output , typename OutputGradient >
Output libMesh::ParsedFunction< Output, OutputGradient >::get_inline_value ( std::string_view  inline_var_name) const
inline

获取内联变量的值。

参数
inline_var_name内联变量的名称。
返回
内联变量的值。
注解
只有当内联变量的值独立于输入变量, 内联变量没有在任何子表达式中被重新定义, 以及内联变量在它出现的任何子表达式中取相同的值时才正确。

在文件 parsed_function.h499 行定义.

参考 libMesh::Real.

参考自 libMesh::ParsedFunctionParameter< T >::get().

500 {
501  libmesh_assert_greater (_subexpressions.size(), 0);
502 
503 #ifndef NDEBUG
504  bool found_var_name = false;
505 #endif
506  Output old_var_value(0.);
507 
508  for (const auto & subexpression : _subexpressions)
509  {
510  const std::size_t varname_i =
511  find_name(inline_var_name, subexpression);
512  if (varname_i == std::string::npos)
513  continue;
514 
515  const std::size_t assignment_i =
516  subexpression.find(":", varname_i+1);
517 
518  libmesh_assert_not_equal_to(assignment_i, std::string::npos);
519 
520  libmesh_assert_equal_to(subexpression[assignment_i+1], '=');
521  for (std::size_t i = varname_i+1; i != assignment_i; ++i)
522  libmesh_assert_equal_to(subexpression[i], ' ');
523 
524  std::size_t end_assignment_i =
525  subexpression.find(";", assignment_i+1);
526 
527  libmesh_assert_not_equal_to(end_assignment_i, std::string::npos);
528 
529  std::string new_subexpression =
530  subexpression.substr(0, end_assignment_i+1).append(inline_var_name);
531 
532 #ifdef LIBMESH_HAVE_FPARSER
533  // Parse and evaluate the new subexpression.
534  // Add the same constants as we used originally.
535  FunctionParserADBase<Output> fp;
536  fp.AddConstant("NaN", std::numeric_limits<Real>::quiet_NaN());
537  fp.AddConstant("pi", std::acos(Real(-1)));
538  fp.AddConstant("e", std::exp(Real(1)));
539  libmesh_error_msg_if
540  (fp.Parse(new_subexpression, variables) != -1, // -1 for success
541  "ERROR: FunctionParser is unable to parse modified expression: "
542  << new_subexpression << '\n' << fp.ErrorMsg());
543 
544  Output new_var_value = this->eval(fp, new_subexpression, 0);
545 #ifdef NDEBUG
546  return new_var_value;
547 #else
548  if (found_var_name)
549  {
550  libmesh_assert_equal_to(old_var_value, new_var_value);
551  }
552  else
553  {
554  old_var_value = new_var_value;
555  found_var_name = true;
556  }
557 #endif
558 
559 #else
560  libmesh_error_msg("ERROR: This functionality requires fparser!");
561 #endif
562  }
563 
564  libmesh_assert(found_var_name);
565  return old_var_value;
566 }
Output eval(FunctionParserADBase< Output > &parser, std::string_view libmesh_dbg_var(function_name), unsigned int libmesh_dbg_var(component_idx)) const
评估第 i 个 FunctionParser 并检查结果。
std::vector< std::string > _subexpressions
存储在数学表达式中找到的子表达式的字符串表示。
std::size_t find_name(std::string_view varname, std::string_view expr) const
解析出变量名的辅助函数。
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::string variables
存储函数中可以解析和处理的变量名称和值。
template<typename Output , typename OutputGradient >
Output & libMesh::ParsedFunction< Output, OutputGradient >::getVarAddress ( std::string_view  variable_name)
inlinevirtual

获取一个解析变量的地址,以便提供参数化的值。

参数
variable_name要获取地址的变量名。
返回
变量的地址。
已解析变量的地址,以便可以提供参数化值

在文件 parsed_function.h473 行定义.

474 {
475  const std::vector<std::string>::iterator it =
476  std::find(_additional_vars.begin(), _additional_vars.end(), variable_name);
477 
478  libmesh_error_msg_if(it == _additional_vars.end(),
479  "ERROR: Requested variable not found in parsed function");
480 
481  // 迭代器算术(我们的目标地址离数组末尾有多远?)
482  return _spacetime[_spacetime.size() - (_additional_vars.end() - it)];
483 }
std::vector< Output > _spacetime
存储空间-时间参数向量的值。
std::vector< std::string > _additional_vars
存储附加变量的名称,这些变量可以在函数中进行解析和处理。
template<typename Output = Number, typename OutputGradient = Gradient>
virtual Output& libMesh::ParsedFunction< Output, OutputGradient >::getVarAddress ( std::string_view  )
inlinevirtual

在文件 parsed_function.h872 行定义.

872 { return _dummy; }
template<typename Output , typename OutputGradient >
OutputGradient libMesh::ParsedFunction< Output, OutputGradient >::gradient ( const Point &  p,
const Real  time = 0 
)
inlinevirtual

计算 ParsedFunction 在给定点上的梯度。

参数
p要计算梯度的点。
time时间值(可选,默认为0)。
返回
计算结果的梯度。

在文件 parsed_function.h413 行定义.

414 {
415  OutputGradient grad;
416  set_spacetime(p, time);
417 
418  grad(0) = eval(*dx_parsers[0], "df/dx", 0);
419 #if LIBMESH_DIM > 1
420  grad(1) = eval(*dy_parsers[0], "df/dy", 0);
421 #endif
422 #if LIBMESH_DIM > 2
423  grad(2) = eval(*dz_parsers[0], "df/dz", 0);
424 #endif
425 
426  return grad;
427 }
Output eval(FunctionParserADBase< Output > &parser, std::string_view libmesh_dbg_var(function_name), unsigned int libmesh_dbg_var(component_idx)) const
评估第 i 个 FunctionParser 并检查结果。
void set_spacetime(const Point &p, const Real time=0)
设置 _spacetime 参数向量。
std::vector< std::unique_ptr< FunctionParserADBase< Output > > > dy_parsers
存储用于计算二维场景中 y 方向导数的解析器的集合。
std::vector< std::unique_ptr< FunctionParserADBase< Output > > > dx_parsers
存储用于计算导数的解析器的集合。
std::vector< std::unique_ptr< FunctionParserADBase< Output > > > dz_parsers
存储用于计算三维场景中 z 方向导数的解析器的集合。
template<typename Output = Number, typename OutputGradient = Gradient>
virtual bool libMesh::ParsedFunction< Output, OutputGradient >::has_derivatives ( )
inlinevirtual

查询是否成功生成了自动导数。

返回
如果成功生成了自动导数,返回 true;否则返回 false。

在文件 parsed_function.h103 行定义.

103 { return _valid_derivatives; }
bool _valid_derivatives
用于跟踪导数是否有效的标志。
template<typename Output = Number, typename OutputGradient = Gradient>
virtual void libMesh::ParsedFunction< Output, OutputGradient >::init ( )
inlinevirtual

实际的初始化过程。

这个函数可以用来进行函数对象的初始化工作。

重载 libMesh::FunctionBase< Output > .

在文件 parsed_function.h870 行定义.

870 {}
template<typename Output >
bool libMesh::FunctionBase< Output >::initialized ( ) const
inlineinherited
返回
在坐标 p 和时间 time 处的向量的分量 i。

子类可以选择重写这个函数以提高效率,因为默认实现基于向量评估,通常是不必要的低效率。

参数
i分量的索引。
p坐标点。
time时间。
注解
默认实现调用带有大小为 i+1 的DenseVector的operator(),如果operator() 在该限制之外进行访问,将导致意外行为。

在文件 function_base.h216 行定义.

217 {
218  return (this->_initialized);
219 }
bool _initialized
当 init() 被调用以确保一切都准备好后,可以调用 operator() (...) 时为 true。
template<typename Output >
bool libMesh::FunctionBase< Output >::is_time_dependent ( ) const
inlineinherited
返回
当前对象表示的函数是否实际上是时间相关的,是返回 true ,否则返回 false。

这个函数用于查询函数对象是否依赖于时间。有些函数对象的时间依赖性是从外部确定的,因此可以使用这个函数设置。

在文件 function_base.h232 行定义.

参考自 libMesh::CompositeFunction< Output >::attach_subfunction().

233 {
234  return (this->_is_time_dependent);
235 }
bool _is_time_dependent
成员变量用于缓存函数是否真正依赖于时间。
template<typename Output , typename OutputGradient >
Output libMesh::ParsedFunction< Output, OutputGradient >::operator() ( const Point &  p,
const Real  time = 0 
)
inlineoverridevirtual

计算 ParsedFunction 在给定点上的值。

参数
p要计算值的点。
time时间值(可选,默认为0)。
返回
计算结果的值。

实现了 libMesh::FunctionBase< Output >.

在文件 parsed_function.h395 行定义.

396 {
397  set_spacetime(p, time);
398  return eval(*parsers[0], "f", 0);
399 }
Output eval(FunctionParserADBase< Output > &parser, std::string_view libmesh_dbg_var(function_name), unsigned int libmesh_dbg_var(component_idx)) const
评估第 i 个 FunctionParser 并检查结果。
std::vector< std::unique_ptr< FunctionParserADBase< Output > > > parsers
存储用于计算数学表达式的解析器的集合。
void set_spacetime(const Point &p, const Real time=0)
设置 _spacetime 参数向量。
template<typename Output>
void libMesh::FunctionBase< Output >::operator() ( const Point &  p,
DenseVector< Output > &  output 
)
inlineinherited

Evaluation function for time-independent vector-valued functions.

Sets output values in the passed-in output DenseVector.

在文件 function_base.h252 行定义.

254 {
255  // 调用时间相关的函数,时间设为0。
256  this->operator()(p, 0., output);
257 }
virtual Output operator()(const Point &p, const Real time=0.)=0
template<typename Output, typename OutputGradient >
void libMesh::ParsedFunction< Output, OutputGradient >::operator() ( const Point &  p,
const Real  time,
DenseVector< Output > &  output 
)
inlineoverridevirtual

计算 ParsedFunction 在给定点上的输出并存储在输出向量中。

参数
p要计算输出的点。
time时间值。
output存储计算结果的输出向量。

实现了 libMesh::FunctionBase< Output >.

在文件 parsed_function.h433 行定义.

436 {
437  set_spacetime(p, time);
438 
439  unsigned int size = output.size();
440 
441  libmesh_assert_equal_to (size, parsers.size());
442 
443  // 剩余的时空位置目前是固定的,但有可能是动态的
444  for (unsigned int i=0; i != size; ++i)
445  output(i) = eval(*parsers[i], "f", i);
446 }
Output eval(FunctionParserADBase< Output > &parser, std::string_view libmesh_dbg_var(function_name), unsigned int libmesh_dbg_var(component_idx)) const
评估第 i 个 FunctionParser 并检查结果。
std::vector< std::unique_ptr< FunctionParserADBase< Output > > > parsers
存储用于计算数学表达式的解析器的集合。
void set_spacetime(const Point &p, const Real time=0)
设置 _spacetime 参数向量。
virtual unsigned int size() const overridefinal
Definition: dense_vector.h:111
template<typename Output = Number, typename OutputGradient = Gradient>
virtual Output libMesh::ParsedFunction< Output, OutputGradient >::operator() ( const Point &  p,
const Real  time = 0 
)
inlinevirtual
返回
坐标 p 和时间 time (默认为0)处的标量函数值。

这是一个纯虚函数,因此必须重写它。

实现了 libMesh::FunctionBase< Output >.

在文件 parsed_function.h862 行定义.

864  { return 0.; }
template<typename Output = Number, typename OutputGradient = Gradient>
virtual void libMesh::ParsedFunction< Output, OutputGradient >::operator() ( const Point &  p,
const Real  time,
DenseVector< Output > &  output 
)
inlinevirtual

用于时间无关的矢量值函数的评估函数。 将输出值设置在传入的 output DenseVector 中。

参数
p坐标点。
output输出的向量。

实现了 libMesh::FunctionBase< Output >.

在文件 parsed_function.h866 行定义.

868  {}
template<typename Output , typename OutputGradient >
ParsedFunction< Output, OutputGradient > & libMesh::ParsedFunction< Output, OutputGradient >::operator= ( const ParsedFunction< Output, OutputGradient > &  other)
inline

在文件 parsed_function.h355 行定义.

356 {
357  // Use copy-and-swap idiom
358  ParsedFunction<Output,OutputGradient> tmp(other);
359  std::swap(tmp, *this);
360  return *this;
361 }
template<typename Output = Number, typename OutputGradient = Gradient>
ParsedFunction& libMesh::ParsedFunction< Output, OutputGradient >::operator= ( ParsedFunction< Output, OutputGradient > &&  )
default
template<typename Output = Number, typename OutputGradient = Gradient>
ParsedFunction& libMesh::ParsedFunction< Output, OutputGradient >::operator= ( const ParsedFunction< Output, OutputGradient > &  )
delete
template<typename Output = Number, typename OutputGradient = Gradient>
ParsedFunction& libMesh::ParsedFunction< Output, OutputGradient >::operator= ( ParsedFunction< Output, OutputGradient > &&  )
delete
template<typename Output , typename OutputGradient >
void libMesh::ParsedFunction< Output, OutputGradient >::partial_reparse ( std::string  expression)
inlineprotected

重新解析数学表达式,仅对表达式进行轻微更改。

参数
expression新的数学表达式的字符串表示。

在文件 parsed_function.h636 行定义.

参考 libMesh::Real.

637 {
638  _expression = std::move(expression);
639  _subexpressions.clear();
640  parsers.clear();
641 
642  size_t nextstart = 0, end = 0;
643 
644  while (end != std::string::npos)
645  {
646  // 如果超出了字符串的末尾,就不能再创建子解析器了
647  if (nextstart >= _expression.size())
648  break;
649 
650  // 如果在一个用大括号分隔的section的开头,那么只解析该section:
651  if (_expression[nextstart] == '{')
652  {
653  nextstart++;
654  end = _expression.find('}', nextstart);
655  }
656  // 否则解析整个东西
657  else
658  end = std::string::npos;
659 
660  // 我们要么需要整个字符串的末尾(end == npos),要么需要中间的子字符串。
661  _subexpressions.push_back
662  (_expression.substr(nextstart, (end == std::string::npos) ?
663  std::string::npos : end - nextstart));
664 
665  // Fparser可能会在空表达式上崩溃
666  libmesh_error_msg_if(_subexpressions.back().empty(),
667  "ERROR: FunctionParser is unable to parse empty expression.\n");
668 
669  // 解析(并尽可能优化)子表达式。添加一些基本常量,以达到真正的精度。
670  auto fp = std::make_unique<FunctionParserADBase<Output>>();
671  fp->AddConstant("NaN", std::numeric_limits<Real>::quiet_NaN());
672  fp->AddConstant("pi", std::acos(Real(-1)));
673  fp->AddConstant("e", std::exp(Real(1)));
674  libmesh_error_msg_if
675  (fp->Parse(_subexpressions.back(), variables) != -1, // -1 for success
676  "ERROR: FunctionParser is unable to parse expression: "
677  << _subexpressions.back() << '\n' << fp->ErrorMsg());
678 
679  // use of derivatives is optional. suppress error output on the console
680  // use the has_derivatives() method to check if AutoDiff was successful.
681  // also enable immediate optimization
682  fp->SetADFlags(FunctionParserADBase<Output>::ADSilenceErrors |
683  FunctionParserADBase<Output>::ADAutoOptimize);
684 
685  // 优化原始函数
686  fp->Optimize();
687 
688  // 通过自动微分生成导数
689  auto dx_fp = std::make_unique<FunctionParserADBase<Output>>(*fp);
690  if (dx_fp->AutoDiff("x") != -1) // -1 for success
691  _valid_derivatives = false;
692  dx_parsers.push_back(std::move(dx_fp));
693 #if LIBMESH_DIM > 1
694  auto dy_fp = std::make_unique<FunctionParserADBase<Output>>(*fp);
695  if (dy_fp->AutoDiff("y") != -1) // -1 for success
696  _valid_derivatives = false;
697  dy_parsers.push_back(std::move(dy_fp));
698 #endif
699 #if LIBMESH_DIM > 2
700  auto dz_fp = std::make_unique<FunctionParserADBase<Output>>(*fp);
701  if (dz_fp->AutoDiff("z") != -1) // -1 for success
702  _valid_derivatives = false;
703  dz_parsers.push_back(std::move(dz_fp));
704 #endif
705  auto dt_fp = std::make_unique<FunctionParserADBase<Output>>(*fp);
706  if (dt_fp->AutoDiff("t") != -1) // -1 for success
707  _valid_derivatives = false;
708  dt_parsers.push_back(std::move(dt_fp));
709 
710  // 如果在末尾,使用nextstart=maxSize。否则从下一个字符开始。
711  nextstart = (end == std::string::npos) ?
712  std::string::npos : end + 1;
713 
714  // Store fp for later use
715  parsers.push_back(std::move(fp));
716  }
717 }
std::vector< std::unique_ptr< FunctionParserADBase< Output > > > parsers
存储用于计算数学表达式的解析器的集合。
std::vector< std::string > _subexpressions
存储在数学表达式中找到的子表达式的字符串表示。
std::string _expression
存储数学表达式的字符串表示。
std::vector< std::unique_ptr< FunctionParserADBase< Output > > > dy_parsers
存储用于计算二维场景中 y 方向导数的解析器的集合。
std::vector< std::unique_ptr< FunctionParserADBase< Output > > > dt_parsers
存储用于计算时间导数的解析器的集合。
bool _valid_derivatives
用于跟踪导数是否有效的标志。
std::vector< std::unique_ptr< FunctionParserADBase< Output > > > dx_parsers
存储用于计算导数的解析器的集合。
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::vector< std::unique_ptr< FunctionParserADBase< Output > > > dz_parsers
存储用于计算三维场景中 z 方向导数的解析器的集合。
const std::string & expression()
获取 ParsedFunction 的数学表达式。
std::string variables
存储函数中可以解析和处理的变量名称和值。
template<typename Output , typename OutputGradient >
void libMesh::ParsedFunction< Output, OutputGradient >::reparse ( std::string  expression)
inline

重新解析 ParsedFunction 的数学表达式。

参数
expression新的数学表达式的字符串表示。

在文件 parsed_function.h367 行定义.

参考自 libMesh::ParsedFunction< Output, OutputGradient >::ParsedFunction().

368 {
369  variables = "x";
370 #if LIBMESH_DIM > 1
371  variables += ",y";
372 #endif
373 #if LIBMESH_DIM > 2
374  variables += ",z";
375 #endif
376  variables += ",t";
377 
378  // 如果传递了额外的变量,将它们附加到我们发送给函数解析器的字符串中。也把它们加到时空向量的末尾
379  for (auto i : index_range(_additional_vars))
380  {
381  variables += "," + _additional_vars[i];
382  // 将额外变量初始化为传入或zeroNote的向量:initial_vals向量可以比additional_vars向量短
383  _spacetime[LIBMESH_DIM+1 + i] =
384  (i < _initial_vals.size()) ? _initial_vals[i] : 0;
385  }
386 
388 
389  this->partial_reparse(std::move(expression));
390 }
void partial_reparse(std::string expression)
重新解析数学表达式,仅对表达式进行轻微更改。
std::vector< Output > _spacetime
存储空间-时间参数向量的值。
std::vector< std::string > _additional_vars
存储附加变量的名称,这些变量可以在函数中进行解析和处理。
bool _is_time_dependent
成员变量用于缓存函数是否真正依赖于时间。
bool expression_is_time_dependent(std::string_view expression) const
检查表达式是否与时间有关。
std::vector< Output > _initial_vals
存储函数中变量的初始值。
const std::string & expression()
获取 ParsedFunction 的数学表达式。
std::string variables
存储函数中可以解析和处理的变量名称和值。
template<typename Output, typename OutputGradient >
void libMesh::ParsedFunction< Output, OutputGradient >::set_inline_value ( std::string_view  inline_var_name,
Output  newval 
)
inline

Changes the value of an inline variable.

注解
以后,变量值将采取给定的常数,独立于输入变量,在每个子表达式中,它已经定义。
当前仅在内联变量未在任何一个子表达式中重新定义时起作用。 更改内联变量的值。
参数
inline_var_name要更改的内联变量的名称。
newval新的内联变量值。

在文件 parsed_function.h572 行定义.

参考自 libMesh::ParsedFunctionParameter< T >::set().

574 {
575  libmesh_assert_greater (_subexpressions.size(), 0);
576 
577 #ifndef NDEBUG
578  bool found_var_name = false;
579 #endif
580  for (auto & subexpression : _subexpressions)
581  {
582  const std::size_t varname_i =
583  find_name(inline_var_name, subexpression);
584  if (varname_i == std::string::npos)
585  continue;
586 
587 #ifndef NDEBUG
588  found_var_name = true;
589 #endif
590  const std::size_t assignment_i =
591  subexpression.find(":", varname_i+1);
592 
593  libmesh_assert_not_equal_to(assignment_i, std::string::npos);
594 
595  libmesh_assert_equal_to(subexpression[assignment_i+1], '=');
596  for (std::size_t i = varname_i+1; i != assignment_i; ++i)
597  libmesh_assert_equal_to(subexpression[i], ' ');
598 
599  std::size_t end_assignment_i =
600  subexpression.find(";", assignment_i+1);
601 
602  libmesh_assert_not_equal_to(end_assignment_i, std::string::npos);
603 
604  std::ostringstream new_subexpression;
605  new_subexpression << subexpression.substr(0, assignment_i+2)
606  << std::setprecision(std::numeric_limits<Output>::digits10+2)
607 #ifdef LIBMESH_USE_COMPLEX_NUMBERS
608  << '(' << newval.real() << '+'
609  << newval.imag() << 'i' << ')'
610 #else
611  << newval
612 #endif
613  << subexpression.substr(end_assignment_i,
614  std::string::npos);
615  subexpression = new_subexpression.str();
616  }
617 
618  libmesh_assert(found_var_name);
619 
620  std::string new_expression;
621 
622  for (const auto & subexpression : _subexpressions)
623  {
624  new_expression += '{';
625  new_expression += subexpression;
626  new_expression += '}';
627  }
628 
629  this->partial_reparse(new_expression);
630 }
void partial_reparse(std::string expression)
重新解析数学表达式,仅对表达式进行轻微更改。
std::vector< std::string > _subexpressions
存储在数学表达式中找到的子表达式的字符串表示。
std::size_t find_name(std::string_view varname, std::string_view expr) const
解析出变量名的辅助函数。
template<typename Output >
void libMesh::FunctionBase< Output >::set_is_time_dependent ( bool  is_time_dependent)
inlineinherited

设置函数是否依赖时间的函数。 这仅应该由无法本地确定时间依赖性的子类使用。 在这种情况下,应在构造之后立即使用这个函数。

在文件 function_base.h224 行定义.

225 {
227 }
bool is_time_dependent() const
bool _is_time_dependent
成员变量用于缓存函数是否真正依赖于时间。
template<typename Output , typename OutputGradient >
void libMesh::ParsedFunction< Output, OutputGradient >::set_spacetime ( const Point &  p,
const Real  time = 0 
)
inlineprivate

设置 _spacetime 参数向量。

参数
p要设置参数向量的点。
time时间值(可选,默认为0)。

在文件 parsed_function.h760 行定义.

762 {
763  _spacetime[0] = p(0);
764 #if LIBMESH_DIM > 1
765  _spacetime[1] = p(1);
766 #endif
767 #if LIBMESH_DIM > 2
768  _spacetime[2] = p(2);
769 #endif
770  _spacetime[LIBMESH_DIM] = time;
771 
772  // _spacetime中的其余位置目前在构建时是固定的,但可能会被动态化
773 }
std::vector< Output > _spacetime
存储空间-时间参数向量的值。

类成员变量说明

template<typename Output = Number, typename OutputGradient = Gradient>
std::vector<std::string> libMesh::ParsedFunction< Output, OutputGradient >::_additional_vars
private

存储附加变量的名称,这些变量可以在函数中进行解析和处理。

在文件 parsed_function.h304 行定义.

template<typename Output = Number, typename OutputGradient = Gradient>
Output libMesh::ParsedFunction< Output, OutputGradient >::_dummy
private
template<typename Output = Number, typename OutputGradient = Gradient>
std::string libMesh::ParsedFunction< Output, OutputGradient >::_expression
private

存储数学表达式的字符串表示。

在文件 parsed_function.h250 行定义.

参考自 libMesh::ParsedFunction< T >::expression() , 以及 libMesh::ParsedFunction< Output, OutputGradient >::ParsedFunction().

template<typename Output = Number, typename OutputGradient = Gradient>
std::vector<Output> libMesh::ParsedFunction< Output, OutputGradient >::_initial_vals
private

存储函数中变量的初始值。

在文件 parsed_function.h309 行定义.

template<typename Output>
bool libMesh::FunctionBase< Output >::_initialized
protectedinherited

init() 被调用以确保一切都准备好后,可以调用 operator() (...) 时为 true。

这个成员变量用于跟踪函数对象是否已经完成初始化,如果已经准备好进行评估,则为 true。

在文件 function_base.h191 行定义.

参考自 libMesh::AnalyticFunction< Output >::AnalyticFunction(), libMesh::ConstFunction< Output >::ConstFunction(), libMesh::ParsedFunction< Output, OutputGradient >::ParsedFunction() , 以及 libMesh::WrappedFunction< Output >::WrappedFunction().

template<typename Output>
bool libMesh::FunctionBase< Output >::_is_time_dependent
protectedinherited

成员变量用于缓存函数是否真正依赖于时间。

在文件 function_base.h197 行定义.

参考自 libMesh::CompositeFunction< Output >::attach_subfunction() , 以及 libMesh::ConstFunction< Output >::ConstFunction().

template<typename Output>
const FunctionBase* libMesh::FunctionBase< Output >::_master
protectedinherited

指向我们的主函数对象的const指针,初始化为 nullptr。 可能存在需要多个函数的情况,但为了节省内存,一个主函数对象可以处理一些集中的数据。

这个成员变量用于指向主函数对象的指针,有时候多个函数对象需要共享一些数据,可以通过主函数对象来管理。

在文件 function_base.h184 行定义.

template<typename Output = Number, typename OutputGradient = Gradient>
std::vector<Output> libMesh::ParsedFunction< Output, OutputGradient >::_spacetime
private

存储空间-时间参数向量的值。

在文件 parsed_function.h265 行定义.

template<typename Output = Number, typename OutputGradient = Gradient>
std::vector<std::string> libMesh::ParsedFunction< Output, OutputGradient >::_subexpressions
private

存储在数学表达式中找到的子表达式的字符串表示。

在文件 parsed_function.h255 行定义.

template<typename Output = Number, typename OutputGradient = Gradient>
bool libMesh::ParsedFunction< Output, OutputGradient >::_valid_derivatives
private

用于跟踪导数是否有效的标志。

在文件 parsed_function.h294 行定义.

参考自 libMesh::ParsedFunction< T >::has_derivatives().

template<typename Output = Number, typename OutputGradient = Gradient>
std::vector<std::unique_ptr<FunctionParserADBase<Output> > > libMesh::ParsedFunction< Output, OutputGradient >::dt_parsers
private

存储用于计算时间导数的解析器的集合。

在文件 parsed_function.h289 行定义.

template<typename Output = Number, typename OutputGradient = Gradient>
std::vector<std::unique_ptr<FunctionParserADBase<Output> > > libMesh::ParsedFunction< Output, OutputGradient >::dx_parsers
private

存储用于计算导数的解析器的集合。

在文件 parsed_function.h270 行定义.

template<typename Output = Number, typename OutputGradient = Gradient>
std::vector<std::unique_ptr<FunctionParserADBase<Output> > > libMesh::ParsedFunction< Output, OutputGradient >::dy_parsers
private

存储用于计算二维场景中 y 方向导数的解析器的集合。

在文件 parsed_function.h276 行定义.

template<typename Output = Number, typename OutputGradient = Gradient>
std::vector<std::unique_ptr<FunctionParserADBase<Output> > > libMesh::ParsedFunction< Output, OutputGradient >::dz_parsers
private

存储用于计算三维场景中 z 方向导数的解析器的集合。

在文件 parsed_function.h283 行定义.

template<typename Output = Number, typename OutputGradient = Gradient>
std::vector<std::unique_ptr<FunctionParserADBase<Output> > > libMesh::ParsedFunction< Output, OutputGradient >::parsers
private

存储用于计算数学表达式的解析器的集合。

在文件 parsed_function.h260 行定义.

template<typename Output = Number, typename OutputGradient = Gradient>
std::string libMesh::ParsedFunction< Output, OutputGradient >::variables
private

存储函数中可以解析和处理的变量名称和值。

在文件 parsed_function.h299 行定义.


该类的文档由以下文件生成: