CAE软件的API
因为CAE软件的使用者一般是非常专业的人士,所有往往都提供大量的API供高级用户做二次开发。以我们的产品为例,简单介绍一下API的情况。
首先,求解器部分的用户接口在我们的产品中不叫API,而是叫UPR(user programmable routines)。UPR支持的编程语言包括Fortran,C,和C++。编写UPR需要用户对求解器的工作原理非常熟悉,通过编程来介入和修改求解工作。
我想说的是CAE软件前处理和后处理的API,这部分使用起来更容易,也更常见。比如说我们的CFD软件,它的主要的计算结果分成两部分 - 二维结果和三维结果,分别在不同的环境中进行处理和显示。
对三维结果后处理编程,有不同的实现方式。第一种方式是使用批处理文件,因为在后处理GUI中的每一个操作(包括鼠标或者键盘操作)都有对应的一个命令,我们可以把手工动作分解,按照顺序写成批处理文件,然后在软件中运行批处理来代替人工操作。对于需要大量重复的操作,批处理的方法特别有效率。比如有些用户用我们的CFD软件来仿真汽车风洞试验,他们需要得到的结果往往都是固定位置处的流场速度切片,和压力场的切片。针对这样的需求,我曾经帮助一个用户写过Python脚本,使用这个脚本可以按照用户的要求生成一个批处理文件,然后用户就运行这个批处理文件来生成他需要的CFD仿真结果图片。第二种方式更加优雅,就是使用API模块,支持的编程语言是Python。它提供了一个Python模块,假设模块名字是postprocessing,那么在编写Python脚本就可以导入这个模块 - “import postprocessing”。这个模块提供了很多function功能,其中最有用的是command功能,可以通过运行Python脚本来运行GUI的操作命令。例如,将视图绕Z坐标轴旋转90度的命令是“canvas rotate axis z 90”,在Python脚本中运行这个操作,就可以写postprocessing.command(“canvas rotate axis z 90”)。
我当时准备交给马丁的作业就是打算使用这个API来做。因为已经有了现成的批处理脚本,我需要做的很简单,就是把批处理脚本里的每一个命令用command function封装起来,说实话这个活这样做的话一点难度都没有。当我开始写代码的时候,思路发散了开来,比如我想何不把Python脚本写成一个通用一点的命令?所以我在里面用上了argparse模块,可以在允许Python代码的时候输入大量的控制参数。写着写着又发现里面充满了大量重复的操作,我又想到“don't repeat yourself”,是不是把这个Python程序也封装成一个模块,提供一些function,然后用另外一个Python代码来调用它?结果就是我偏离了既定的路线,这个任务烂尾了。以上就是我第一次尝试没有成功的一些技术细解。另外,现在我仍然认为这些想法是有价值的,以后有时间了我还会继续探索这个后处理自动化代码。