位于路径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. 云服务器怎么添加虚拟内存,云服务器怎么添加虚拟内存
  2. Java中的注解到底是如何工作的?
  3. python怎么读excel文件-Python读写Excel文件方法介绍
  4. ASP.NET基础教程-DataGrid表格控件-模板列的使用
  5. 现有CSDN博客的排名机制
  6. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(七)
  7. ICLR 2020:从去噪自编码器到生成模型
  8. mpvue中使用小程序云开发总结
  9. ClassNotFoundException: javax.validation.ValidatorFactory
  10. C#基础概念二十五问[转]
  11. 浅谈WebView的使用
  12. ubuntu16.04下ROS操作系统学习笔记(三 / 四)ROS基础-ROS中的关键组件
  13. Conflux吐槽君:IOTA物联网电磁炉-让PoW的耗电没有遗憾
  14. SHIFT-JIS编码范围
  15. JAVA当前时间timestamp_java获取获得Timestamp类型的当前系统时间
  16. 基于Raft深度优化,腾讯云金融级消息队列CMQ高可靠算法详解
  17. tesserocr的安装
  18. 数据载入、Pandas基础和探索性数据分析
  19. 电子原理 半波整流与桥式整流Protues仿真电路
  20. 战双帕弥什qq登录服务器未响应是什么意思,战双帕弥什qq登录

热门文章

  1. PMP试题 | 每日一练,快速提分 8.6
  2. 信息系统项目管理师备考资料-第三版(4)
  3. QT5.15.2__wind10 64 源码编译
  4. 欧文分校计算机新sat多少分录取,加州大学欧文分校SAT成绩要求介绍 入学信息早知道...
  5. 使用roolup构建你的lib
  6. RTX服务器信息存档,Rtx/RTX服务器端基本应用(一)
  7. Python爬虫网站图片并下载到本地
  8. 【深度学习】深度学习基础-Warm_up训练策略
  9. java实时获取汇率
  10. CTFHub | Refer注入