FEALPy:以开源社群的力量,打造中国自己的工业仿真共性基础算法库

 

我是湘潭大学的魏华祎, 2017 年决定开发一款自主开源的偏微分方程数值解软件包:FEALPy。 本文将对 FEALPy 开发的背景与动机、发展现状以及对未来的发展规划进行详细介绍,以期 让更多的人可以了解FEALPy、使用FEALPy、并深度参与到 FEALPy 的发展当中来。

工业仿真技术的核心–偏微分方程数值解

在数学中,偏微分方程(Partial Differential Equation, PDE) 是一种刻画多变量函数及其各阶偏导数关系的方程, 如著名的 Laplace 方程

\[\frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} + \frac{\partial^2 u}{\partial z^2} = 0,\]

其中 $u=u(x, y, z)$ 是一个未知的多变量函数。

偏微分方程本身是对自然界中各种变化规律的一种近似的数学描述,定量刻画了变化现象中的不变关系, 如质量守恒、动量守恒、能量守恒等。它普遍存在于物理学和工程学等现代科学中,是一类 应用最广泛的数学模型。高效求解偏微分方程,已经成为人类深刻理解各种自然现象、发现规律 并利用规律改造自然的有力工具。

但在实际应用中出现的绝大多数偏微分方程,都无法写出解析解,所以只能求助于数值求解。 于是,如何克服偏微分方程本身的无限性带来的挑战,设计出高效、高精度并适合在计算机上实现的 数值计算方法成为了偏微分方程数值解主要研究内容。由于有大量的应用背景,偏微分方程数值解 也成为计算数学这个数学学科分支中一个非常重要的研究方向。

以偏微分方程数值求解为算法核心而形成的工业仿真技术(也称为计算机辅助工程,简称 CAE),目前已经成为先进制造业信息化和智能化的核心手段。借助工业仿真技术, 可有效提升产品质量,大幅缩减产品的研发周期,并显著降低工业产品的设计、制造、维护和 使用成本,可以为工业制造企业及其客户带来巨大的收益。

中国的工业仿真软件现状与问题

工业仿真技术实际发挥作用的载体是工业仿真软件, 也称为 CAE 软件,它们是对工业产品的设计、制造、 维护及使用过程模拟仿真的关键基础设施。从国际著名的商业 CAE 软件长达四五十年的发展历史中可以看到, CAE 软件发展的本质就是将数学算法和工业知识软件化的过程, 而且这种软件化的过程明显具备“不可压缩”的特征。 这里的“不可压缩”是指,工业仿真软件的发展必须伴随着 工业崛起而成长,且成长过程中既需要需要经过长期的 数学算法和工业知识的沉淀积累、不断追求精益求精, 也需要政府、学界和工业界长期的协同支持。

但由于种种原因,中国市场上主流的 CAE 软件,无论是商用还是开源,大多数来自西方发达 国家。它们在中国市场占有绝对优势,垄断了大部分的核心技术和人才。而当前中国国产 CAE 软 件在总体上还存在基础薄弱创新不足人才短缺应用困难的问题,发展和 应用水平与西方发达国家差距巨大。 

中国作为全球唯一一个具备完整工业体系的国家,这种对国外商业 CAE 软件严重依赖,已经为 工业仿真基础算法科研、人才培养以及先进工业制造业的高质量发展带了来巨大的问题和隐患

如在计算数学、土木、机械、航空等理工科专业中,做计算仿真的科研人员大量使用国外的 商业 CAE 软件(大多数还是盗版的),常常无法做到对底层算法的深刻理解,也无法做到基本的自主可控, 导致国家和企业投入大量研究经费及人力物力,所获得的科研成果和经验,很难进行系统地积累集成,而没有长期系统的积累集成, 是无法培育出真正重大创新和突破的。

同样在这些理工科专业的人才培养当中,也因 为大量基于这些国外的商业 CAE 软件进行课程建设、教学和论文写作,导致大部分学生只是学 会了这些商业 CAE 软件的操作方法,而不是真正理解背后的数学算法原理。最后我们的人才培养系统变成了 国外商业 CAE 软件的培训班,一直在无偿地源源不断地为这些软件培养忠实的用户。

这些人才最后又大量进入我国的工业设计制造部门,又因为只会使用 这些国外的商业 CAE 软件,没有能力、也没有长期的耐心和投入来开发自主可控的 CAE 软件,从员 工到领导都更倾向于购买国外的商业 CAE 软件。而在没有能力购买的情况下,又会冒着极大的法律 风险使用盗版软件。还有一部分人才会进入国外的商业 CAE 软件公司,继续向我们的科研院所 和工业设计制造部门大力推销这些国外的商业 CAE 软件。

对国外商业 CAE 软件的过度依赖,造成的最大问题,是我们的工业设计制造部门没有自主可控 的软件平台,用于集成沉淀工业生产过程中获得大量工业设计制造经验和知识。这些宝贵的经验和知识,要么过分依 赖于特定技术人员,从而很多会随着这些人员的离职、退休或去世而又消失不见,给相关企业造 成巨大的损失;要么会反馈集成到国外的商业 CAE 软件当中,让它们变的更强,更有竞争力,进一步 挤占国产 CAE 软件的生存和发展空间。最后我们的工业设计制造部门又要花巨资,购买这些国外的 软件,才能继续使用这些本由自己总结的经验和知识。

过分依赖国外的商业 CAE 软件是我国“制造业大而不强”问题的核心体现。为应对国际自由贸易环境 面临的重大挑战,解决“制造业大而不强”、核心技术被人“卡脖子”的严峻现状,亟需我们对工业 软件的自主性和安全性重视起来,从各个层面支持自主可控工业软件的发展。而自主可控工业软件 的广泛和深入应用,也会对中国制造业的安全和高质量发展提供强有力的基础支撑。  

其实中国计算数学科研工作者对很多工业仿真共性基础算法的发展都做出了极大的贡献。其中以有限元算法 最为典型,它虽然最初起源于国外土木工程和航空工程中的弹性和结构 分析问题的研究,但中国老一代和新一代计算数学科研工作者,很早并一直都在为其发展做出卓越的 贡献。早在1965 年,中国计算数学专家冯康先生,基于五十年代至六十年代大型水坝计算研究的 实践经验,发表了《基于变分原理的差分格式》一文,奠定了有限元计算方法的严格数学理论,为后世 有限元计算方法的实际应用提供了理论保证。同时在以冯康先生为代表老一代杰出代表的悉心培养下, 中国涌现出了一大批在国际计算数学领域有重大影响力中青年专家,做出了很多有原创性的算法科研成果。

中国计算数学学术研究的蓬勃发展,与国产工业仿真软件发展人才匮乏、技术薄弱、无力与国外软件竞争的现状,形成了强烈的反差。 究其原因,这与中国长期以发论文为主导的科研评价体制有莫大的关系。但发论文本身没什么毛病,因为它是学术研究同行间交流学术思想和 科研成果的重要手段。但计算数学做为一门应用背景很强的交叉学科,除了以论文形式发表算法科研成果外,还担负着培养 工业仿真基础算法人才、发展工业仿真基础算法软件的重任。

但在这种以发论文主导的科研评价体制的引导下,大量基础算法科研人员 的研究止步于论文的发表,甚至只是为发论文而发论文,导致大量优秀的算法研究成果仅仅停留在论文里, 无法有效转化为真正有用的算法代码、形成真正的生产力。而算法研究 成果在代码层面不可见、不可用、不好用,对算法自身的演化发展也极其不利。因为在只有论文的情况下, 其他的科研人员、学生和算法工程师很难对其快速消化吸收并实现,更不用说改进创新了,从而又严重制约了 算法本身的进一步发展。

做自己的工业仿真共性基础算法库

对于一个渺小的个体来说,上面这些对中国仿真软件发展现状及其带来的问题的认识和思考,是非常来之不易的, 中间经历了很多非常痛苦的学习实践。

做为一个农村出来的人,在上大学之前,只是在高三的时候见过几次电脑。现在还清晰的记得, 当时那个教我们电脑的老师,在第一堂课上是一直在盯着天花板讲课的。那时见到的电脑,用的是微软 XP 系统,没有网络。课上老师也只是教一教如何开机打字而已。那时的我,对于计算机 可以干什么,数学与工业应用有什么关系,其它操作系统的存在,网络的存在,开源的存在, 都没有任何点滴的概念。

我于 2002 年参加高考,被河南大学的数学与应用数学专业录取。收到通知书时,对什么是应用数学 也是一脸的茫然和无知,当时在农村那种环境下根本没有什么渠道去了解相关的信息。

开始大学的学习后,才发现自己根本适应不了那种非常抽象的数学学习,无论怎么努力 成绩也赶不到前面去。再加上父亲的生病去世,心里一直承受着非常巨大的压力和痛苦。想想那时唯一能 让自己压力释放的机会就是每天的运动,踢球和跑步,也只有让自己累透了,才能好好睡一觉。

大二跟风报了计算机二级的考试,在全身心投入准备考试的过程中,突然发现编程的过程能让我获得那种 超级专注的感觉,进入那种所谓“心流”的状态。自己会不断的想着如何去解决编程中遇到的问题,而且那种思考是真正进入 了潜意识的。最后考试时,感觉答题很顺利,通过志在必得。但当晚上躺在床上的一瞬间,突然脑子里就弹出 一个念头,就是考试中的那个 C 语言程序,我写错了!结果当然是没有拿到二级证书。虽然后面再也没有考 过计算机类的证书,但那一段非常宝贵的学习体验,给大学那灰暗的日子增加了一丝光明,自己似乎找到了可以拯救大学生活的一线希望。

之后,我又通过数学建模课程学习了 Matlab 语言,还通过选修课学习了一点汇编语言。最后听说参加数学建模竞赛,需要会写程序的人,于是自己又报名参加 数学建模竞赛的培训。一个小插曲是报名之后自己差点没有被录上,因为自己的大二的学分析考试只拿了 60 分。

数学建模的指导老师是王秀琴老师,是一个极好、极其负责的人。她在自己的本职工作之外, 花了大量时间和精力指导我们,为我们创造了非常好的实验条件,让我们可以更多的接触到电脑。 王老师做为一个快退休的人,在每次数学建模竞赛的三天三夜里,都和年轻人一样,不顾自己的 疲惫,熬夜帮助我们答疑解惑。在生活上,对我们的关心也是无微不至。我清晰的记得,自己在培训期间生病住院, 王老师也是第一时间跑到医院看我,并帮我垫付了所有的医疗费用。

在王老师的带领下,我更加系统的学习了 Matlab,两次数学建模竞赛都是编程的主力。虽然最后没有获得什么像样的成绩,但我知道自己确实 有实实在在的成长。在参加数学建模的过程中,也认识了很多其它班的优秀同学,收获了难得的友谊。 更重要的是,我更加确定了自己的潜能在哪里,于是在考研的时候就选择考计算数学的研究生。

可是考研却失败了,败在了数学分析上。考试时看哪一题都不太会,我都急哭了。 但我告诉自己,不管怎样不能放弃,要把自己知道的都写上。最后虽然总分过了大连理工的分数线, 但数学分析单科却差了一分。还好,找到了湘潭大学的调剂信息,最后来到了这里。

但是计算数学研究生专业的学习并没有让我轻松多少。老师上课还是以那种全黑板的理论证明、公式 推导为主,缺少对数学理论背后思想动机的介绍,也根本没有什么正式的编程实践课程。为了跟上 老师的讲课,课后还招集了几个同学搞讨论班,但感觉最后还是没有学到什么实质的东西。无奈之中, 研一下学期,自己去学校附近的一个小软件公司实习(没有实习工资的那种),最后还干脆搬去住到了 公司办公室里,因为那里有电脑用。在那里,我自学了 C++ 和微软的 MFC 图形界面编程框架, 最后自己能够用 MFC 写出一个简单的画图软件。但公司除了老板,和一个不经常在计算机博士外,剩下的就是我了。 由于看不到什么前途,自己那一段时间还总是生病,就离开了那里。

研二的时候,我们终于分到电脑用了,但因为没有机房,只能把电脑放在宿舍里。那时虽然 学了有限元,但是根本不知道如何写有限元的程序。虽然拿到一些有限元的代码,自己却很难看懂, 也不会编译。以前用的 VC++,自己也只会点点按钮,根本不知道背后发生了什么。有限元理论也没学好, 编程又没有人指导,可以想象那时是多么痛苦。

最后拯救我的是北大的李弱老师,那时黄云清老师和陈艳萍老师专门邀请他来湘大讲他开发的 AFEPack。李老师简单的几次课,让我很震撼,他基于 AFEPack 用简短的几行代码就能把有限元程序写出来, 把有限元算法的过程讲的清清楚楚、明明白白。这时我才真正入门有限元编程,也是第一次接触到 Linux 系统,也是第一次分清了什么编辑器,什么是编译器,什么叫开源。

在有了自己的电脑和李老师的指导后,研二剩下的时间,除了睡觉、吃饭和运动,我把几乎全部的时间都用在了编程上。 基于 AFEPack,我不但学会了写有限元程序,也学会了在 Linux 下编译安装软件包,更重要的是可以深入到代码的底层, 自由自在地探索有限元程序设计知识。让我印象深刻的是,我写一个混合元的自适应程序,但收敛阶一直不对, 我一直追到 AFEPack 底层的有限元模板文件,整整死磕了两个月都没有搞明白出现问题原因。有一天,我准备躺下睡觉时, 突然想明白,是因为三角形网格自适应时,一分为二单元上的自由度设置不对造成。压力在这个单元上应该有两个自由度 但 AFEPack 有限元模板只设置一个。修改完那个模板文件,一运行结果就完全对了,当时兴奋的那种感觉至今难忘。

掌握了 AFEPack 后,我就成了师兄、师姐还有同学写论文实验程序的帮手,一直都在帮别人写程序。 唯一的问题是,我硕士阶段却没有发什么论文出来。其实自己还是写了一篇的,但最后觉得不好也没有投出去。 还好,我的硕士导师陈艳萍老师把我推荐给黄云清老师,顺利开始了自己的博士生涯。 当时恰好遇到博士津贴提高到一千多,这意味着自己不用每个月花家里的生活费了,这样就能让母亲轻松一点。

更幸运的是,博士开始前的暑假,黄老师请了美国加州大学欧文分校的陈龙老师一起来指导我。在遇到陈龙老师 之前,我自认为自己 Matlab 学的非常好。但见到陈龙老师的写的向量化运算代码后,就又被震惊到了, 因为我以前都是用循环写 Matlab 程序的。还好前面已经有非常好的基础,很快就掌握向量化编程技巧。 2010 年底还去陈龙老师那里访问了学习了一年,有了更多面对面讨论的机会,自己基于 Matlab 语言有限元编程能力也有了质的提高, 并且可以向陈龙老师的 iFEM 贡献代码了。最后还发了两篇比较好的论文。回国后,黄老师欣然的同意了我的留校工作请求,并于 2012 年 7 月开始自己的教师生涯。 基于博士阶段的工作,拿到了青年基金项目,也顺利评上副教授。

毕业后,自己就开始参与军工方面的项目,这时才突然发现,自己以前根本不是编程能力强,而只是能写 点可以运行的程序而已。由于以前写的程序是零散的、不能复用的,造成每遇到一个新的项目,或者要写新的论文,很多程序都要重写一遍, 根本没有任何所谓的软件设计、系统集成测试等现代化的编程经验和实践。于是又开始不断踩坑痛苦实践过程,不断拿各 种各样的开源软件安装测试,读英文文档,剖析代码,然后在这些软件基础上再写自己的代码。最后项目虽然结题了,但 这些代码和努力实际上并没有真正发挥什么作用,这是最让我沮丧的事情。

所以工作后的这些年,一直在困惑自己到到该怎么办。很多的痛苦挣扎之后,慢慢意识到自己精力是有限的,能力也是有限的,不 可能同时做好所有的事情,所以我首先必须放弃很多次要的东西,真正专注到自己喜欢善长的事情上来。 对自己来说, 还是喜欢做点比较具体的事情,可以给别人有所直接帮助的事情,因为那会给我带来真正的快乐。所以我必须 找一个能最终解决问题的切入点,真正从根本上解决自己的问题。

从自身角度来讲,解决自己问题的关键在于要让自己从一个编程者,变成一个真正的软件设计开发者。首要的任务,就是为自己设计一个 简单易用的软件平台,用于集成项目、论文、课程建设、本科毕业论文指导等等工作相关的算法代码。打造这样一个软件平台, 等同于创造一个强大的助手,它任劳任怨,不需要你发工资。而对它的每一次改进,都会让它变的更强大。它对我的工作有用, 到一定阶段也必然会对其他人有用,可以帮助其他人在成长过程中少经历一些痛苦,少走一些弯路,成长地更快更好。

也就是在这个时候,我开始接触 Python 以及 Numpy、scipy 这些科学计算的软件包。在不断的学习实践,发现 Python 真是一门简单易用的语言

在另一方面,自己没有把过多的心思花在论文上,产出论 文非常少,后面直接影响评职称和申请人才计划这些事情。

从中国大学数学教育的角度讲,做为数学专业出身的编程爱好者,自己在数学与编程间的彷徨、痛苦和挣扎,并不是一种偶然现象。 这与中国大学数学科研和人才培养体制僵化有很大的关系。因为现在在很多大学的数学院系里,计算机课程内容依然陈旧,优秀的编程教育师资依然匮乏。 以我的观察,从上大学到现在将近 20 年时间,仍然没有什么明显的变化。本来数学和计算机是天作之合,同时掌握两者的人绝对能所向无敌, 做科研一定是能手,到公司一是骨干。但我们的很多大学的数学学院却在不断培养大量害怕编程的学生,或者在误导学生对编程的认识。 那么

从中国工业仿真软件产业的角度来讲,招数学系的人来,不怎么懂软件设计和编程;招计算机的人来,又不懂数学算法,

在国外商业 CAE 软件占垄断支配地位以及计算数学旧有巨大惯性下,解决工业仿真基础算法科研、人才培养及国产 CAE 软件发展瓶颈问题的突破口在哪里?

我认为答案就在于基于中国优秀 的工业仿真基础算法研究能力和成果,借助开源社群的思想和实践经验,吸引一批充满激情和创造力的算法科研工作者、学生和工程师, 共同打造几款开源且“自主可控”的工业仿真共性基础算法库,用于支撑工业仿真基础算法的科研、人才培养以及促进先进算法 向工业界的传播。

基于以上的考虑,开发 FEALPy 就是这样一次初步的尝试。FEALPy 做为一款开源的偏微分方程数值解算法库,其首要目标是追求 简单易用,并且不受操作系统或软件平台太多限制。所以 FEALPy 完全采用 Python 语言开发,并充分利用 Python 的对象化和 Numpy 的数组化 编程技术,重构偏微分方程数值解核心的数据结构和算法,以达到模块化和接口标准化的目的。在实现 FEALPy 高可维护和高可扩展的同时,让用户能够以“乐高积木”的方式快速搭建自己的数值实验程序,并可以根据需要灵活替换其中的模块。 FEALPy 即可用于支撑相关领域的基础科研和人才培养工作,又可用于 CAE 应用原型软件的快速开发验证工作。

FEALPy 主要定位于解决工业仿真基础算法科研和人才培养中缺少自主可控算法软件平台的问题, 借助开源社区的力量,为广大算法科研工作者及学生提供一个简单易用、开放共享的实践学习平台。

FEALPy 的发展现状

FEALPy 的发展展望

结语

参考文献

  • 硕士
  • 博士
  • 工作

  • 李弱:AFEPack
  • 陈龙:iFEM
  • 胡俊:胡张元的实现

从个人学习成长的角度,展示开发 FEALPy 的动机

个人有能力,国家有需要,促进了 FEALPy 的出现