之后,波前矩阵里剩下的节点数,即第3列减去第4列。可以看出,两次达到
最大波前,分别当循环到第7单元和第10单元时。
读到这里,对照前面那个有限元网格,您要是能够理解这个表中所有数字的来龙去脉,您就理解了波前法!剩下的,是一些技术上的细节,可以通过阅读下列全
部程序来最后彻底“抠”懂。 这些技术细节里,比较难懂的,是如何将单元刚度矩阵装配入波前矩阵。单元刚度矩阵是个4阶矩阵,即4x4矩阵,代表了单元4个节点之间的相互影响。例如,第1行里的4列元素,是单元4个节点对单元第1节点的影响;第2行里
的4列元素,是那4个节点对单元第2节点的影响;余类推。 每个单元节点的局部编号都是1、2、3、4,但它们的总节点编号是不同的,而且是唯一的。单元节点的局部编号与其总节点编号的对应关系,在本文的程序中,由二维数组ICO给出。在用普通高斯消去法解方程时,任给一个单元刚度矩阵,我们可以通过ICO表,查到该单元4个节点的总编号。而节点总编号与总刚度矩阵 K 的行与列之间具有一一对应的关系。第1节点占据第1行第1列,第2节点占据第2行第2列,……,第n节点占据第n行第n列。所以,使用普通高斯消去法解方程时,把单元刚度矩阵装配进总刚度矩阵的算法很简单,如本文第一个程序的第122行所示,只一行程序便可实现。打个比方,这种情况下的总刚度矩阵 K,就像占地广阔的大观园,有许多房子,《红楼梦》里的所有人等,例如金陵十二钗,各有各的住所,还有许多空地(相当于K里的零元
素),可供黛玉葬花,姐妹们赏月吟诗。 波前法的装配算法则要复杂得多。因为波前矩阵小,不能同时装下所有节点的所有元素。这种情况,就如同旅店。世界上所有旅店是住不下装得下世界上所有居民的,旅客必须有进有出才行。节点进出波前矩阵,就如同旅客进出旅馆。有的旅客住的时间长,有的短。节点在波前矩阵呆的时间也一样,有长有短。随着节点的进进出出,波前矩阵的每一行和列都可能先后被不同节点占用,就像旅馆里的每个房间都会被不同旅客先后住过。所以,波前矩阵的行与列,与总节点编号之间,不再有像使用普通高斯消去法解方程时那样的一一对应的固定关系。单元矩阵的某一行、某一列的元素,应该放到波前矩阵的哪一行、哪一列,是动态分
配的。有两种可能:如果某节点已经存在于波前矩阵中,那么就把该节点在单元矩阵中的元素加到波前矩阵的相应元素上(因而需要知道它在哪里);反之,如果某节点还没进入过波前矩阵,那么就在波前矩阵给它分配一个自由的行与列。在下面的程序中,我们使用一维数组freeLines来记录波前矩阵每一行(同时也是每一列。我们假定行数等于列数,也就是说,一个节点占据了第 n 行,它也就占据了第 n 列)的状态:0 表示自由;大于 0 表示已占用(即占用该行的节点) 。我们还使用一维数组GlobalID2FrontId来记录每一节点在波前矩阵占据的行数(=列数)。也就是说,给出一个节点的总编号,就能在GlobalID2FrontId中查到它在波前矩阵中的位置。这个位置如果是零,就表示该节点还没进入过波
前矩阵。这些算法的具体实施可见下列程序中的第148-168行。
程序四:使用波前法解线性方程组的二维热传导有限元程
序