吾生有涯 学海无涯
析模有界 知识无界

白话为何要使用求解器模块

在OpenFOAM 11版本之前,OpenFOAM的应用是以各种各样的求解器程序体现的,如icoFoam、interFoam等。每一种求解器都对应着某种特定的应用场景,当应用场景发生改变时,就需要开发新的求解器。

下面以最简单的程序代码来举例说明为何要用求解器模块。

1 散装程序

比如今天要算个加法计算,编写了一段程序代码,姑且将其命名为add.c。

#include 
using namespace std;

int main(int argc, char **argv)
{
int a = 2, b=4;
int c = a + b;
cout << c << endl;
return 0;
}

编译完成后得到了一个可执行文件add.exe,它的功能很明确,用来计算2+4的和。当然,这个程序通过对程序主入口进行简单的修改,也可以用来计算3+5的和。但是如果明天想要算个乘法,就得对上面的代码进行修改。

比如再重新创建一个新的源代码,命名mul.c。

#include 
using namespace std;

int main(int argc, char **argv)
{
int a = 2, b=4;
int c = a * b;
cout << c << endl;
return 0;
}

编译完成后得到可执行程序mul.exe,该程序可以计算乘法。这种方式最大的好处是,每个程序都是独立可用的,有明确的功能目标。但是这可苦了程序开发的人,万一后天要算除法呢?大后天又要算个加减乘除混合运算呢?但需求是无穷无尽的,不可能为了一点点细小的改动就去把主函数抄一遍,尤其是当主函数非常复杂的时候。

那么此时最好的做法是将程序功能模块和主函数分开。

2 模块程序

最简单的模块设计是将功能包装成函数和类,这样程序功能就可以从主函数中独立出来。下次遇到新的功能需求时,就可以不修改主函数,而仅仅只需要创建或修改功能模块即可。用户在创建新的功能模块时,需要了解主函数与功能模块之间的调用接口。

如上面的程序可以改写成下面的代码:

#include 
using namespace std;

int add(int a, int b)
{
return a+b;
}

int mul(int a, int b)
{
return a*b;
}

int main(int argc, char **argv)
{
int a = 2, b=4;
int c = add(a,b);
int d = mul(a,b);
cout << c << endl;
cout << d << endl;
return 0;
}

如果下次有新的功能需求,要计算除法,此时只需要添加新的功能函数即可。

double div(int a, int b)
{
return (double)a/b;
}

上面是函数式的模块,当然也可以将功能模块包装成类的形式,这样程序会更紧凑(将函数参数以成员变量的形式独立出来,函数不用带有相同的参数),但本质上并无不同。

#include 
using namespace std;

class compute
{

private:
int a;
int b;

public:
compute(int x, int y)
{
this->a = x;
this->b = y;
}

int add()
{
return a + b;
}

int mul()
{
return a * b;
}

double div()
{
return (double)a / b;
}
};


int main()
{
compute c(2, 3);
cout << "Addition: " << c.add() << endl;
cout << "Multiplication: " << c.mul() << endl;
cout << "Division: " << c.div() << endl;
return 0;
}

如果采用类进行程序功能组织的话,有新需求的时候也可以考虑使用类继承。


OpenFOAM 11之前的版本均为散装模式,11.0之后进入模块模式,其中主函数放置在foamRun中,各功能模块分散于其他文件中,编译后以动态链接库的形式被主函数调用。用户开发时无需关注foamRun中的代码,只需要将注意力集中于自己的功能模块即可。

com版到目前为止所有版本依然为散装模式。

散装模式不利于工程应用。工程中的需求往往很杂乱,今天算流动,明天可能要加个传热,后天没准又要算个流固耦合。如果采用散装模式,对每种需求都需要开发对应的求解器,这些求解器之间彼此独立,多场耦合计算也不太方便。程序开发过程中存在大量的重复代码,整体不太优雅。

(完)

本篇文章来源于微信公众号: CFD之道

赞(0) 打赏
版权声明:未经允许,请勿随意用于商业用途。
文章名称:《白话为何要使用求解器模块》
文章链接:https://www.topcfd.cn/39519/
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
分享到

说两句 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者吧

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册