工业软件林林总总,种类甚多。本文只涉及我熟悉的的科学计算,更具体一点就是非线性方程的求解软件。至于线性方程的求解则太过平凡,不在本文论及范围之内。不过即使只限于这类软件,光以这类软件的数量而论,也是一个庞大的数字。 我们用大佬Niklaus Wirth的名言Algorithms Data Structures = Programs来图示一下现状
世界各地的学者,研究者,工程师们开发了无数的计算软件,但是它们之间基本上没有联系,但是有一点例外:他们都调用为数有限的外部线性方程求解器的一个或数个,而不是自有。而时间倒回三十年前,这样的软件都是自含线性方程求解器的。比如那时的有限元教科书一般会有一章专门讲解线性方程求解器编程。遵循"不要再次发明车轮"的原则,更何况现今这些专业的求解器比自研求解器要强太多,不自己开发线性方程求解器是现今的共识。但是非线性方程求解器软件的状况并非如此,比如常用的Newton-Raphson的算法实装被人重复开发了何止成千上万次,好在这种算法较简单(真的如此吗?),并不要花费太多开发时间。
本文的目的就是介绍一种有效的软件设计以避免非线性方程求解器软件的重复开发。
我们需要一种方法把算法隔离出来,使算法类不依赖于具体问题类型和数据结构。
虽然被要求求解各种各样的复杂问题,非线性问题求解器其实对具体问题提出的要求并不多,不外是要求返回函数值,函数导数值之类。这样的问题:虽然待求子系统很复杂,但是需要访问的接口的功能简单,很适合于采用四人帮的外观设计模式(Facade Design Pattern)。这种模式的实装方法如图2所示,我们在算法1,算法2等和具体的物理问题Mehcanics, Acoutics等之间导入一个窗口中间层Interface用于隐藏复杂的物理问题的细节,具体的算法只需要从窗口取得有限的信息即可。
开源软件Thyra提供了相应的实装。在下面一节,我们将介绍采用开源软件Thyra
的具体实装。
非线性问题的求解过程可以概略如下:非线性问题求解器向具体物理模型输入某些变量,具体物理模型向非线性问题求解器返回某些变量。Thyra的具体实装如下
请注意该图对应图2中的Interface类,也就是外观模式中给用户提供的窗口。用户需要定义自己的Thyra::ModelEvaluator的继承类给出createInArgs, createOutArgs, evalModel的具体实装。在该窗口的另一侧(图2左侧所示算法类),需要非线性问题求解器开发者提供非线性问题求解器实装。
用户需要在自己的ModelEvalutor中定义自己的createInArgs实装。
用户需要在自己的ModelEvalutor中定义自己的createOutArgs, createW实装,并在evalModel函数中输出计算结果。
非线性问题的算法实际上是一个复杂的数学问题。本着专业的问题交给专业人士来解决的原则,这样的软件的开发应该交给数学专家来解决。其具体实现方法则需要利用现代的软件工程技术来对相应的计算功能进行功能隔离。
开源软件Thyra提供了这样的实装。