位于路径src/OpenFOAM/primitives/Scalar

标量,其实就是浮点数。但是浮点数具有不同的精度,最终文件将根据宏的设置决定程序使用哪种精度

文件依赖关系如下:

注意这里大小写的scalar是两个文件,大写的Scalar是各个精度的浮点数的依赖文件,而这些具体的精度的实现又是小写的scalar的实现

floatScalar

这里给出其中一个文件的具体实现方式,其余的类似
头文件内容如下:

typedef float floatScalar;定义最大最小的浮点数
floatScalarVGreat  floatScalarVSmall
floatScalarSmall   floatScalarGreat
floatScalarRootVGreat  floatScalarRootVSmall
floatScalarRootGreat  floatScalarRootSmall给定函数readScalar(const char* buf, floatScalar& s)
{char* endPtr;s = strtof(buf, &endPtr);return (*endPtr == '\0');
}//注意这里很重要
#define Scalar floatScalar
#define ScalarVGreat floatScalarVGreat
#define ScalarVSmall floatScalarVSmall
#define ScalarRootVGreat floatScalarRootVGreat
#define ScalarRootVSmall floatScalarRootVSmall
#define readScalar readFloatScalar其他若干基础函数

.C文件的内容如下

#define Scalar floatScalar
#define ScalarVGreat floatScalarVGreat
#define ScalarVSmall floatScalarVSmall
#define ScalarRootVGreat floatScalarRootVGreat
#define ScalarRootVSmall floatScalarRootVSmall
#define readScalar readFloatScalar
#include "Scalar.C"   //这里添加了大写的Scalar.C
#undef Scalar
#undef ScalarVSmall
#undef ScalarVSmall
#undef ScalarRootVGreat
#undef ScalarRootVSmall
#undef readScalar

实际上这些宏定义在Scalar.C中被使用,因为不同的浮点精度要实现相同的功能,所以通过将类名称统一成Scalar,就可以给出统一的代码。比如说,如果是doubleScalar,那么.C文件中的内容为:

#define Scalar doubleScalar
#define ScalarVGreat doubleScalarVGreat
#define ScalarVSmall doubleScalarVSmall
#define ScalarRootVGreat doubleScalarRootVGreat
#define ScalarRootVSmall doubleScalarRootVSmall
#define readScalar readDoubleScalar
#include "Scalar.C"
#undef Scalar
#undef ScalarVGreat
#undef ScalarVSmall
#undef ScalarRootVGreat
#undef ScalarRootVSmall
#undef readScalar

Scalar

头文件内容如下:

class pTraits<Scalar>  //pTraits是用来帮基础类实现构造函数和文件流函数的模板
{Scalar p_;  //Scalar在前面已经宏定义为对应的类型
public:typedef Scalar cmptType;typedef label labelType;static const direction dim = 3;   //- Dimensionality of spacestatic const direction rank = 0;  //- Rank of Scalar is 0static const direction nComponents = 1; //- Number of components in Scalar is 1若干支持性的成员变量构造函数和析构函数
};
sign minMod pow dot等等功能性函数
readScalar  >>  <<等文件流操作

.C文件中只给出了对应的函数的实现以及成员变量的初始化

const char* const pTraits<Scalar>::typeName = "scalar";
const Scalar pTraits<Scalar>::zero = 0.0;
const Scalar pTraits<Scalar>::one = 1.0;
const Scalar pTraits<Scalar>::min = -ScalarVGreat;
const Scalar pTraits<Scalar>::max = ScalarVGreat;
const Scalar pTraits<Scalar>::rootMin = -ScalarRootVGreat;
const Scalar pTraits<Scalar>::rootMax = ScalarRootVGreat;其他非inline函数的实现

相当于所有的浮点精度有相同的功能,这些功能通过将类型统一定义为Scalar然后统一实现

这里有一个我不太明白的点,这里的标量在openFOAM是指单个的数据,所以
static const direction nComponents = 1; //- Number of components in Scalar is 1
但是这里还给出了维度,这个代表三维空间吗?等后续理解了再来修改
static const direction dim = 3; //- Dimensionality of space

scalar

其实这个文件是我们平时在其他程序中添加的头文件,头文件内容如下:

#if defined(WM_SP)
// Define scalar as a float
namespace Foam
{typedef floatScalar scalar;static const scalar great = floatScalarGreat;static const scalar rootGreat = floatScalarRootGreat;static const scalar vGreat = floatScalarVGreat;static const scalar rootVGreat = floatScalarRootVGreat;static const scalar small = floatScalarSmall;static const scalar rootSmall = floatScalarRootSmall;static const scalar vSmall = floatScalarVSmall;static const scalar rootVSmall = floatScalarRootVSmall;
}
#elif defined(WM_DP)
// Define scalar as a double
namespace Foam
{typedef doubleScalar scalar;....
}
#elif defined(WM_LP)
// Define scalar as a long double
namespace Foam
{typedef longDoubleScalar scalar;...
}
#else#error "Precision not set, please set either WM_SP, WM_DP or WM_LP"
#endif//- Deprecated limit constant for backward-compatibility
namespace Foam
{static const scalar GREAT = great;static const scalar ROOTGREAT = rootGreat;static const scalar VGREAT = vGreat;static const scalar ROOTVGREAT = rootVGreat;static const scalar SMALL = small;static const scalar ROOTSMALL = rootSmall;static const scalar VSMALL = vSmall;static const scalar ROOTVSMALL = rootVSmall;
}若干Gamma函数相关的函数

.C文件则是其中非inline函数的实现。

就是说根据我们定义的宏为WM_SP还是WM_DP还是WM_LP,决定我们最终使用哪个精度作为scalar的最终精度。文件只不过另外添加了一些函数

文件流的操作

最后讲讲scalar.H中的一个文件流操作,这个非常常用,所以单独拿出来说:

scalar readScalar(Istream& is)
{scalar rs;is >> rs;return rs;
}

我们提供一个文件流,这里创建了一个标量rs,然后将文件流>>rs,注意这里的>>进行了操作符重定义。然后将得到的标量rs返回。

openFOAM中的Scalar相关推荐

  1. 在OpenFOAM中标记某些区域自适应加密

    OpenFOAM中自带的自适应加密只支持三维的,这里分两种情况,一种是三维的自适应加密,一种是二维的自适应加密 一.三维情况 1.1 更改求解器 算例 不过这样的加密是三维的,如果是二维的加密看下边 ...

  2. OpenFOAM中slip和noslip介绍(滑移条件无滑移条件)【翻译】

    OpenFOAM中slip和noslip介绍(滑移条件&无滑移条件)[翻译] 翻译自:CFD-online 帖子地址:http://www.cfd-online.com/Forums/open ...

  3. OpenFOAM中:点,线,面,体的概念区别(尤其是face和patch的区别)

    OpenFOAM中:点,线,面,体的概念区别(尤其是face和patch的区别) 个人理解如下: face:有序点(point)的集合,物理面的概念 patch:边界面(face)的集合(非内部面), ...

  4. OpenFOAM 中边界条件的设定【转载】

    转载自:http://blog.sina.com.cn/s/blog_a0b4201d0102v7jt.html 用习惯了FLUENT的操作界面,再使用OpenFOAM就会觉得非常繁琐.遇到的第一个问 ...

  5. OpenFOAM 中的 RTS 机制

    OpenFOAM 中的 RTS 实现,使用了很多宏定义展开,所以不容易理解.不过,也有分析文章,用了简单的例子,分析了编译展开后的代码,应该是说得比较好的. OpenFoam RTS 实现分析,如下: ...

  6. 在OpenFOAM中获取每个网格的Skewness

    常用的网格划分软件中关于网格偏度(Skewness)只有统计结果,通常只能看到平均值.最大值及粗略的分布情况,而无法看到每一个网格单元对应的Skewness.因此,这里我希望借助OpenFOAM建立一 ...

  7. openfoam中网格自适应功能dynamicRefineFvMesh

    最近看到有些视频介绍openfoam中的网格自适应功能,照着网上的设置,并没有发现网格会被自动加密,原因是使用的openfoam 版本不同,有些操作和案例位置已经发生变化.这个在初学者中很容易引起很多 ...

  8. openFOAM中时间步长计算参数是怎样读进程序的——初步理解框架

    内容如题,在阅读完大量的基础代码之后,我们现在可以尝试解读一下chemFOAM中的程序流程.因为内容很多,所以会分好几个子标题讲完. 我们使用openFOAM的过程中,通常是从tutorials中找到 ...

  9. OpenCV 中的 Scalar 类、Vec类

    转 自 http://www.bubuko.com/infodetail-1533054.html 文章目录 Scalar 类 Vec 类 Scalar 类 typedef Scalar_<do ...

最新文章

  1. Android SQLite调试
  2. Django运行报错Invalid HTTP_HOST header: ‘0.0.0.0:8000‘. You may need to add ‘0.0.0.0‘ to ALLOWED_HOSTS.
  3. CentOS7中关闭selinux
  4. step4 . day6 线程与线程的创建
  5. Boost使用几条简单笔记
  6. syslog-ng 配置说明
  7. android新材料设计,android - 如何实现新材料BottomAppBar为BottomNavigationView - SO中文参考 - www.soinside.com...
  8. redis复制原理和应用
  9. python数据按照分组进行频率分布_python 等频率切分数据
  10. java删除数组里的两个_java – 如何从两个数组列表中删除常用值
  11. java socketserver多线程_JAVA I/O(五)多线程网络Socket和ServerSocket
  12. 命名问题导致的一个bug
  13. 编译32位_实战经验:在Windows平台编译x264
  14. 深度干货!一文读懂人脸识别技术(建议收藏)
  15. MTK6763平台手机 在国外无法成功注册VOLTE。求解
  16. Access的BOM开发(2)基础信息
  17. 宗海图cad_技术绘制论文,关于CAD技术机械制图关键技术相关参考文献资料-免费论文范文...
  18. Adobe flash professional CS5的序列号
  19. mongodb关机重启
  20. ROS 相关学习资源汇总

热门文章

  1. out.flush()
  2. 外卖优惠券小程序搭建天天领券返利分销系统公众号返利机器人模式
  3. 谁锁了我的帐号?(AD账号的锁定状态查询)
  4. 利用C语言写一个U盘小偷程序
  5. DO - varying
  6. 标准差-经验法则-中心极限定理
  7. HDU 6194 string string string
  8. 最小二乘法线性拟合和2次曲线拟合算法
  9. 文件或目录损坏且无法读取 解决方法
  10. 江苏高考时间2021成绩查询,2021年江苏高考成绩什么时候出来 公布时间