CAE编程高手之路:从软件开源代码使用及改造说起

文章发布:上海安世亚太官方订阅号(搜索:PeraShanghai)

联系我们:021-58403100

原作者:三只青蛙

导读屈指数一数,我从事cae程序工作十几年了,没有什么成绩,只有教训和眼泪。十几年间几乎没有周末和假日,没有娱乐和休闲,也没有了爱好。我希望能把自己的一些经验写下来,对充满活力的年轻人有一丝助力和借鉴。让他们成长之路更短,略微更平坦一些……


写在前面


4月26日,工信部信息技术发展司副司长王建伟表示,2021年将着力突破CAD、CAE等工业软件,推进操作系统与芯片、数据库、中间件及各类应用软件的集成、适配、优化,引导企业提升产品化发展能力。现如今,无论国家和民间,都在把工业软件作为一个重要的发展方向,提出了各种目标和口号。

CAE软件作为工业软件的重要组成部分,更是得到了十足的重视。

CAE编程高手之路:从软件开源代码使用及改造说起的图1

倪光南院士在天津工业APP大会发言

(1) 有的是教训和眼泪

屈指数一数,我从事cae程序工作十几年了,没有什么成绩,有的只是教训和眼泪。十几年间,几乎没有周末和假日,没有娱乐和休闲,也没有了爱好。回头想想,其实很多很多的路,是在仿徨和犹豫中度过的,总在犹豫,总在反复,总在时时刻刻的考虑,是不是那样写更好,是不是不应该这么写。是的,有很多很多的后悔的作为。

也有无数的一步可以跨过的沟,我却是绕过来趟过来的。

很荣幸,我还活着,还在做着这个工作,希望能把自己的一些看法,一些想法,一些理解,写下来,对希望充满活力的年轻人有一丝助力和借鉴。使得成长的路更短,略微更平坦一些。最近的时间比较紧,在完成目前工作后,会加速的做这些事情。

(2) 以资本的方式去硬砸这个产业

在这个系列的文章里,我只谈CAE的程序问题,不去触碰CAE的产业问题,也许那不是我关心的事情。我只想说一句在这里,我是反对以资本的方式去硬砸这个产业的。这个东西是个需要时间积累的东西,很难想象可以用资本能够击穿。

我的工作生涯里,有50%的时间在做计算,50%的内容在做前后处理。前面的写作我只会涉及计算,以后会再写一些前后处理方面的东西。即使计算方面, 针对不同的专业,也是千番不同。我想大家可以和我交流的,大多也是更为基础的程序代码方法和算法方法,更多的东西,我想我也肯定无从了解。


为什么CAE程序

会感觉很困难


首先这个问题, 是确定的,是的,真的很难, 学习成本极高。

(1) 综合性强

也就是跨学科了吧,只拿做计算的来说吧,学好本专业已经不容易了,还要学好计算机程序编写。至于计算机程序的编制, 需要学习的还有数值方法,矩阵论,甚至图论等……, 几乎所有的数学都要学差不多,不一定要会证明和很深,但是大多数都要理解,才能写出精巧的程序。这个问题,我想以后慢慢做一些框图来解释。给写不同程序的人,不同的建议,要准备什么书,储备什么知识等。

其实,看过太多的开源的很多的程序,可以看出,都是学力学的人写的,虽然写的整齐漂亮,但是还是很多不符合计算机原理的,我们不能拿着当做圣经。也有很多程序,可以看出是计算机的按照学力学的要求去写的,写的啰里啰嗦,整理规整,似乎增一分则肥,减一分则瘦,实则编排乱七八糟,这些程序不应作为学习的目标。别人的程序,看的多了,自然都会有深刻的理解,都会看的出来,但是改成自己的,却需要更深入的理解,仍然是非常痛苦的事情。

(2) 1+1<=2, 两块砖头的结合需要砂浆

我这里指的是团队建设,一加一等于二,没有问题的,那仅仅是个理想的相加,现实中,要筑起一道墙,一块一块的砖头叠加一起,是没有意义的,需要砂浆来粘合,需要时间来凝固,需要浇水来养护。

很多时候,我们要求一个学力学的,和一个学计算机的去合作完成一个程序,大多数时候都是失败,我不知道老外这种事情的管理是如何的。我知道的,中国人在这种的合作上,大多是失败的。我想老外也差不多。

成功的少数案例,就是学力学的会写程序了,学计算机的也懂力学了,而且懂的程度很深。并没有一条很好的途径,使得两者在互相了解对方知识很少的情况下完成这件事情。但是最后的结果,仅仅是完成,还是有问题的,起码在代码上,可以轻易的看出,是学力学的模仿计算机写的,还是计算机的不懂装懂的按照学力学的说的写的。

(3) 被忽视的二级算法

CAE编程高手之路:从软件开源代码使用及改造说起的图2

CAE专业和计算机代码之间,是需要二级算法的。所谓的二级算法,大多衍生于数值方法那门课的内容,也有更多的需要完整的学一门新课。大多数有兴趣有动力来做CAE程序的人,基本都把自己的专业部分学的很好了,理解的很透,但是一旦上手开始写,又觉得无所适从。其实,这中间还差很多很多东西,二级算法书上不会讲,基本都是要自己悟的,基本,大多数人选择从开源的程序学习进入。以后我想专门的来讨论开源软件的读改问题。

在计算机专业和cae专业之间,人员的磨合,代码的精进,都是基于二级算法的建立和改进的。这也就是经验的集合吧。论文上的东西都差不多的其实,大部分是公开的,我们和成熟商软的距离,就差这个其实。


成长之路之计算机语言


这是一个大项。作者仅仅熟悉c++和fortran语言,所以仅仅能从这两门语言的角度进行。

(1) 语言是不相同的 

CAE编程高手之路:从软件开源代码使用及改造说起的图3

程序在本质上是相同的。那是编程二进制之后的事情了。所以有一种说法, 所以用哪种语言都一样。学好了,都能写出好的程序,这是对的。这里的不同,说的是,其实每一门语言,都有自己独特的地方和优势,你用那门语言去写,就要利用好那门语言的优势,才能写出好的程序。才能感到那门语言的魅力。

在结构化程序上,大多数语言是可以互相调用的,基本是相同的。很多书也如是说。

但是,还要精心的考虑,很多事情,并不是相通的。

C++的行存储和fortran的列存储,就会给互相调用带来很多的困扰空间。C++的指针和fortran指针并不是一个概念。Fortran的“class”和C++的也完全不是一个东西,有了“class”的fortran程序是不能供C++使用的。你要fortran面对对象到底,还是以后要和C++混用,要一开始就想清楚。这仅仅是一个例子,每种语言学到深处,都是有它自己的精妙所在的。而一旦你用了它精妙的部分,大概率的和其他程序不会相同。这也是很多人争论用哪种原因好的原因。

(2) 关于c++和fortran

CAE编程高手之路:从软件开源代码使用及改造说起的图4

真的很希望计算机就一种语言,起码不用那么纠结,我想做计算的大多数用这两种语言,已经足够纠结,现在出现了更多的,python,perl等。纠结更加纠结。我和大多数的人一样,很多时间花在了纠结上。纠结用哪一种语言。

现在呢,我还在纠结偶尔,还是没彻底解决。两种语言,我都算精通了,不是语言的事情了。但是在做某件事情的时候,往往希望基于某个东西去做,那个既有东西的功能的好坏,也包含了语言的选择,成为了一个纠结的选项。在语言的单独选项上,我更偏向于c++语言。以后的程序都是趋向于大型化,利用C++更好管理,这是学C++的人的借口。其实新的fortran也能很容易的大型代码的管理,单独做计算的,无论程序多大,我想fortan已经足够。我偏向c++,是因为同时在做前后处理。

(3) 学习的顺序

大多数做cae计算程序的人,都是边学边干的,这一点不可避免。我是这么过来的。

  1. 但是我现在建议初编者,拿出3-4个月的时间,忘记CAE计算,就所用程序语言本身,去做专业的学习,无论fortran还是c++,或者其他。

  2. 这不算弯路,你脑子中有更多的储备,遇到cae计算问题,就会有更多的灵感,也会有更多的经验,去更快的处理。

  3. 不要有一种想法,就是CAE还是理论问题,程序语言本身,我学到一定程度就够了,某种程度上,做CAE程序的,要计算机比学计算机的还要学的深入。

  4. 这一切,都是因为CAE的程序更注重效率。编译原理,其实对于学力学的人,却是必学的。计算机的却可以学了忘掉其实。

用一个计算机的本身问题,来解释这个事情吧:

  • 冯*诺依曼体系下的计算机,大多有这样的问题,就是ALU少于FPU。

  • 也就是判断大多数时候是计算的瓶颈,而不是浮点运算。

  • 我们边学边干,更不停的一会思考力学问题,一会思考程序问题,相当于不停的在两者之间判断切换,会搞的脑子很乱,很多人甚至崩溃不干了,也是这样一个道理。

  • 这样做还有一个后果,就是会不断的会翻前面的程序,不断的修正,迭代以前的程序。

所以,我建议在学程序本身的时候,要忘记CAE, 不要想这个我以后用不到,那个我用到了再说,先搞定一头再说,多余的学到的语言知识,是你写精巧程序的灵感的来源。

(4) CAE程序高手的晋级的几个阶段

每个人学语言都有这样几个阶段。每个阶段的成就感是必要的。

CAE编程高手之路:从软件开源代码使用及改造说起的图5
  • 初学,很感兴趣,兴趣在结构化的循环控制和实现自己的算法, 基本一个小程序都是用来计算,都是干货。

  • 更深入的时候,发现管理性的代码越来越多。一个大型程序,基本管理性的代码要占到60%可能,功能性代码占比却逐步减少。基本每一个搞专业的都会有一种烦躁感。很多人专业搞的非常好,但是就是客服不了这一种烦躁感,很多年都没有把自己的东西写出好的软件程序。这一步也许是成长最重要的部分。

  • 编辑器的操作是另一个部分,这一步其实更多的人在一起工作更好,会一起获取更多的使用经验,编译器的熟悉程序关系到编写的效率,也是一个必须要过的关。

  • 因为工作问题,会去翻更多的别人的代码,这一步要小心,我是这么过来的,在翻别人东西的时候,有时会被别的兴趣去吸引,走偏了方向,尤其是技术控,自己也有自控能力。可能完成导师和老板的任务更重要,感兴趣的以后慢慢再说。

  • 学会忍受寂寞,接下来就是在迷茫和清晰之间无限的循环了。

一个CAE软件工程师,最后计算机软件的知识,可能占到总体知识的60%,而力学知识仅仅会占到40%,这是自然的。我们大部分不再搞研究工作,即使搞研究工作,大量的计算机知识会更有利也:

■ 思维上要做好转换。写计算软件,最重要的增大知识的广度,不是深度,是更好的实现自己专业知识,不是学更多的转月知识,不能陷入无限的学习循环。

■ 大概率的,到真正写程序的时候,所有人都会发现自己认为学过的东西根本不会,像是没学过。

■ 回去认真的复习以前的东西,人会在一个阶段觉得自己的思路特别清晰,感觉工作就要完成了。

■ 真正做几天,又会别的问题发生,人又会限于迷茫,这一切循环往复。

■ 忍受住寂寞,甚至学会忍受寂寞,基本上就是高手之路走了一半了。


不同的数值方法和专业


现在存在的数值方法种类是很多的,有限元,离散元,有限差分,有限体积,非连续变形,粒子法,近场动力学。。。。等。作者对上述方法都有涉猎,都略看过一点。近年也在师兄的的帮助下开发一种新方法,希望完成有限元和离散元的统一,真正实现离散-连续的平滑化。这一切都在进行,有些缓慢。人生短暂,最终还是希望搞学术,不再混迹于江湖。

(1) 代码架构

对于不同的数值方法,都有不同领域的用途。每种方法写起来,除了算法本身的问题,也有不同的编写套路。我想所谓的这些方法“套路”,其实就是软件程序的架构和实现细节。我对有限元和离散元的套路知道个大概。即使同样的的有限元程序,因为目标的专业不同,架构和套路也是千奇百怪。以后慢慢会很多不同的代码套路讲给大家,每个作者做这些代码的时候,真的是有自己非常深入的考虑。我们有幸学习别人的东西,是一件很幸福的事情。

希望以后总结下,用某种方式发布出来。把各个软件的架构和目标,都讲给希望学习CAE程序的人。

  • 我目前在做的工作,就遇到了新的有限元编写的不同套路的问题,多了几个月来学习,使得工作有些拖拉,但是也算是给自己一些好的补充。

  • 看看每个代码,基本理论来源都雷同,但是每一个细节都不相同,在二级算法的考虑上,都有自己的独到之处。

  • 如果你编写代码的套路,独树一帜,和其他都不同,说明真的理解了,是真正的原创。

说了这么多,举一个简单的例子吧,单元数据的计算,对于建筑结构软件类软件来说,做设计的人都知道,同尺寸通材料的梁柱很多的,在某些时候,把这些都分好类,计算一个,就等于计算好了很多根。这个某些时候比并行化好用。更好的例子,以后慢慢把我的经验讲给大家。

(2) 不同数值方法的编程技巧

不同的计算方法,编写都有不同的技巧问题,我熟悉有限元的,和离散元的。希望以后和更多人交流。这个暂时不展开说。繁而杂的东西。

(3) 从论文到代码

一篇论文的编写,作者大概最后写出的方式大概不会太多。公式是一定的。不会有更多的差异,但是这篇实现到代码的时候,可能会有千百种方式。我想分成下面几种情况:

  • 第一,自己能深刻理解的论文+自己熟悉的代码架构,可以做到完美实现,并且会有创新的思路。

  • 第二,自己不能深刻理解的论文+自己熟悉的代码架构,可以做到反复实验下的实现,不会有创新的思路。

  • 第三,自己能深刻理解的论文+自己不熟悉的代码架构,可以做到实现精确的计算,往往不能实现深刻灵活的功能。

  • 第四,自己不能深刻理解的论文+自己不熟悉的代码架构,这个…基本什么不能实现。

很多人更关心第二项,不能理解的也能实现。这个确实有,以后会写一些相关的经验文章,来说明技巧。但是不建议大家这么做。知其然,不知其所以然,最终还是很难进一步写下去的。

但是有一点是肯定的,熟悉代码可以帮助更好的熟悉理论,熟悉理论可以帮助更好的熟悉些代码,俩者是相辅相成的。

CAE编程高手之路:从软件开源代码使用及改造说起的图6

关注【上海安世亚太】官方微信,获取更多原创最新文章、活动资讯,还有限时免费资料分享,等你来拿!

(4条)
默认 最新
大神都是很深邃的👍
评论 点赞 1
径入深幽岸方明!好!
评论 点赞 1

查看更多评论 >

点赞 7 评论 4 收藏 15
关注