函数对象是编译到动态库中的独立于求解器的代码,可以在仿真时间循环中执行,也可以在仿真完成后由后处理应用程序执行。函数对象通常在模拟运行时执行后处理计算,但也可以操作场或模拟参数。OpenFOAM 函数对象库可包含任意数量的函数对象,这些对象可在运行期间链接到应用程序:OpenFOAM 提供了在每个仿真案例中加载动态库的机制。函数对象的封装功能以预定义方式从求解器中获取,因此函数对象必须遵循固定的类接口。

与传输模型或边界条件一样,OpenFOAM函数对象被实现为类,被组织成类层次结构,并被编译成动态链接库。这允许用户通过配置文件选择任意数量的不同功能对象。OpenFOAM中函数对象的模块化层次结构的另一个好处是能够轻松地与他人共享函数对象库。函数对象实现完全自维持的计算,并且根本不涉及对应用程序代码的任何修改。不必对解算器或实用程序应用程序进行任何更改,也无需重新编译它们即可访问新的函数对象。这改进了遵循“开放-封闭”的OOD模式的代码的可重用性:功能对扩展是开放的,现有的实现对修改是封闭的。

从用户的角度来看,函数对象通常提供不影响求解器求解的功能,它们执行的运行时后处理任务通常应该独立于所选的求解器求解器。它们的目的是实施一般的后处理方法,例如计算任何场变量的平均值,与求解器代码分开。

作为一个假设的例子,考虑一个参数CFD优化研究,将稳态模拟的入口和出口边界之间的压降作为目标函数。使用函数对象,可以在每次迭代之后评估该压降,并且一旦压降满足一些期望的条件就终止模拟。与函数对象相反,使用后处理应用程序将需要完成每个模拟,可能涉及比收敛宏观压降所需的迭代更多的迭代,这取决于求解算法的收敛标准。