本帖最后由 Rainyboy 于 2010-12-30 23:21 编辑
第一个报告的故事 Rainyboy “大学需要什么啊?大学需要大楼吗?大学需要……”讲台上的老师斜戴着老花眼镜,以便在看讲稿的时候取下来,在看台下的时候戴上去。说到这里的时候,他扶了扶眼镜,环视了一周,发现了各种半醒的、迷惑的、戏谑的、谨慎的、事不关己的眼神,大概他觉得有些无趣吧,没有再吊大家的胃口(实际上,又有谁意识到他刚才的停顿了呢),自己说出了答案“大学需要故事!”。 说实话,当时我以为他要说那句狗血无比的“大学需要大师”,然后顾影自怜地说点什么孤芳自赏的话呢。这是我第一次见到王老师,和他手里的《参考消息》报。
实际上,王老师可以称得上是威名远扬,自古以来,只有勇士才敢在本科阶段选他老人家开的有限元基础课,在选课的前一学期,学长的话就传遍的各个寝室的卧谈会:“专业课,选什么都可以,除了有限元”;据说一部分勇士们成了烈士:“某某届挂了20%”;还有被奉为经典的八卦:“她老婆更狠,居然挂自己的研究生,真是灭绝师太!”。 说来真是少年轻狂,我选了王老师的课,然而能容下150人的教室里只坐了9个人。王老师花了几分钟时间,反复确认了确实只有9个人选了他的课。然后,王老师脸上露出一种“好吧就这么着吧人多人少的反正你们要是学不好我照样挂”的表情,开始了讲对他的第若干堂、我的第一堂有限元课。令人略微吃惊的是,他打开的居然是一个文档文件,而不是屏幕演示文件,这个文档像正式的报告那样结构清晰,图、表、公式格式严整,王老师说:“你们以后交上来的大作业都得写成这种风格,而且绝对不能出现错别字!”。
由于大多数人的避重就轻,本来的大课成了小班教学,王老师网开一面,让我们自己选择是做大作业还是参加考试作为最终成绩的考核。出我以外,另外8个人都选择了考试,我当时自以为在编程方面所向无敌,所以选择了大作业:实现一个包含杆单元,弹簧单元和平面三角形单元的有限元程序。后来的事实证明,正是这是一个“错误”的选择,在长达两个月的过程中,每一次下课,我都在教室后面铺开我的笔记本电脑,然后给他展示我的程序,供他逐一批判。那是怎样毫不留情的批判啊,每次他指出程序中的若干功能缺失,若干处笨拙的实现时,眼中传递出的都是“别以为你写出一个千疮百孔的程序就怎么地了,你还差得远”的态度。对我来说,这不啻一盆迎头浇下的冰水,让我彻底明白了自己的浅薄的自满。然而当时的我也许只有一个优点,那就是不怕挑战,我不断地修改我的有限元程序,王老师挑出的毛病终于越来越少。 我想不到的是,最后一堂课,王老师给了我20分钟时间给大家讲如何编写一个这样简单的有限元程序。我的大作业也成了一本不厚也不薄的报告,王老师举着它说,这是我见过的最完美的一个大作业,我要留下来给后来的同学看。在这本名为《面对对象的有限元程序设计》报告的前言里,记录我在压力下的成长:
前言
这是有限元课程程序设计大作业的第五个版本,虽然当前的版本远未臻至完美,但已经改进和修正了前四个版本的代码中存在的种种问题。第一个版本的构造属于策略性的失误,居然还储存了单元刚度矩阵;第二个版本达到了作业的基本要求,但是总刚度矩阵采用的储存方式过于松散;第三个版本采用了变半带宽的压缩方式,但是代码的重用性和库类之间的关系混乱,可读性,重用性都存在问题;第四个版本,修正了上述一切,除了——引入边界条件。因此,在此基础上的第五版,没有上述的设计缺陷。
借助于面对对象编程思想,我对每个对象的方法进行了抽象。我再一次重新设计了库类继承关系,并仿造MFC中广泛采用的做法,引入了内部链表,重载操作符,严格封装数据。并且广泛采用参数化编程的思想,在公用基础类Element的代码中,真正实现了“除了0和1,没有其它常数”的代码风格。在一切可能的地方运用动态分配技术,按需分配空间,力图避免可能的缓冲区溢出。
在前处理只后,求解方程组之前,有限元程序的核心技术在于,如何储存足够少的参数产生每一个单元刚度矩阵,并且把它们叠加到总刚度矩阵之上。而且相传这个矩阵可以巨大到让任何直接按行列方式储存的尝试都有发生缓冲区溢出错误或者无法分配空间的危险,因此还要重点考察这类程带状的,对称的大矩阵的压缩储存和读取方式。
总之,在二位老师的热情帮助下,历时8周,我最终完成了此次大作业,编写了核心代码,并且生成了一个运行于Windows环境下的图形界面,正文的叙述,一部分是程序注释,一部分是我在笔记本上所勾画的设计框架,整理为几个大的部分,附录的代码删除了所有的注释,但是要运行查看结果,只是那10个文件是不够的,若要执行简单的测试,请参考第五部分的“测试代码”,关于图形界面的实现代码,鉴于MFC的代码对于这里所要讨论的问题来说过于冗长和复杂,因此没有过多的提及。
经过五个版本的历练,我对Visual C++编译器的各种调试工具的使用也熟悉了不少。通过对前4个版本的修改和批判,我对面对对象编程的理解和C++语言的使用又被提升到了一个新的高度,对有限元核心思想的理解大大的加深了。能够将所学用于实践,这是最令人高兴的事情了。
最后,再次感谢**老师和**老师对我的指导以及给我这次历练机会! 各位看官也许对我如此厚颜无耻的引用感到愤慨,但是对于我而言却有特殊的意义,每一次看到这个报告,就会在记忆中翻阅这一段故事。在故事的开始,是迷惘的前途,是转瞬即逝的机遇,少年集束的心气对严师的剑拔弩张;故事的发展,是面临人生第一条由选择产生的曲折的路,充满了挑战和质疑,又有一些荒诞,让你恨恨地,咬紧牙也要迎着寒冷的风冲刺;故事的结尾,是你以为战胜了什么,其实你战胜的不过是自己的幼稚,你迎来的是一个全新的自己。 我从心底感谢王老师,但是课程已经结束了,新的征程还在前方等着我,这一段故事在我心中逐渐封尘……
直到我接到了王老师的电话,2008暑假,彼时我正作为奥运志愿者,每天在安检大棚里对着汹涌的人潮数以百次地重复着:“Welcome to Beijing”以及“请大家排好队”。有些时候也能跳出循环,说一些别的:“阿姨,咱们场馆规定家长只能带2岁以下的小孩,您的小孩……是的,我看到他还躺在婴儿车里……但是他看上去显然已经5岁了……您别生气,后面的观众请这边来……我们的经理在那边,有问题的话请您去咨询吧!” 接到王老师的电话是在某个下午,我恰好轮休在寝室。一开始我甚至没有意识到是王老师,因为我并没有给他留电话。王老师还对他日后的研究生来了一段简短的自我介绍:“小范啊,我是W啊,你的有限元老师啊!”。大脑在搜索,嘴巴迟钝地说着:“哦……”(其实,心里的第一反应是:怎么?大作业又被发现有新问题了?!) 王老师继续说:“暑假有时间吗?我这里有一个小项目,是关于某种联轴器的设计。以你的有限元知识基础,当然还要学习很多新东西啦,但是已经可以完成这项任务了,怎么样,想尝试一下么?这个项目……” 如你所知,新的旅程又开始了……
目前为止,与大牛们相比,我做过的项目不多,积累的经验也少的可怜。然而我每天都在成长,不停地成长,从我在王老师的“压迫”下完成的第一个报告开始,我完成了自己生涯的一个又一个小小的里程碑,王老师现在已经不怎么批评我了……然而每当我企图陷入自满的情绪裹足不前时,总会担心在世界的什么地方,有一个与当年的王老师一样的存在,我的骄傲在他眼里不值一提,我的漏洞还远多于我的致密,我仿佛看到他眼中的“别以为你做出一个千疮百孔的项目就怎么地了,你还差得远”,不敢有丝毫放松……
2010年12月30日,基于当年王老师邀请我所做项目的论文终于印在了《北航学报》上,这是一个小小的轮回,从第一个报告到第一篇论文,这点成长也许是细微的,却是值得纪念和讲述的——这就是故事,关于王老师和我的故事,关于成长的故事。王老师也许没有意识到,与灯光球场上挥洒的青春和图书馆彻夜亮起的灯光一道,他也正在成为H大学成其为“大学”的众多故事之一……
|