.Net ( c# ) 与 Fortran 混合编程实例(二):杆系结构有限元法——平面桁架解答(1):总述

第一节  设计总说明

1.1  桁架结构基本信息输入

本程序采用读取文本文件的形式取得结构原始数据,由两个文本文件组成,一个存放杆件信息,另一个存放节点信息。输入格式如下:


bars.txt

(杆件编号),(起点节点编号),(终点节点编号),(杆件EA)

其中,“杆件编号、起点节点编号、终点节点编号”为整形,“杆件EA”为浮点型;


nodes.txt

(节点编号),(节点坐标x),(节点坐标y),(x方向约束),(y方向约束),(x方向荷载),(y方向荷载)

其中,“节点编号”为整形,“节点坐标x、y”为浮点型,“x、y约束”为布尔型(非0为真、即有约束,0为假、即无约束),“x、y荷载”为浮点型,未知的支座反力以 0 代替。


注意:杆件、节点的编号需严格按顺序递增。详见后文。


1.2  结构信息存放

分别读取两个文本的数据后(.Net 中读取文本信息参考.Net 中操作文本文件),考虑这些数据的全局性,采用静态类、静态数组存储。

    public static class ClassBasicInfo
    {
        public static int[,] BarsNodes;//杆件节点编号
        public static Single[] LinearStiffness;//杆件刚度
        public static Single[,] Coordinate;//节点坐标
        public static bool[,] Restraint;//节点约束
        public static Single[,] Loads;//节点荷载

        public static Single[,] TatalStiffnessMatrix;//总刚度矩阵
        public static Single[] TatalDisplacement;//总位移列阵
        public static Single[] TatalLoads;//总荷载列阵
        public static bool[] TatalRestraint;//总边界条件
    }


1.3  单元刚度矩阵

整体坐标下的单元刚度矩阵采用公式:

[K] = EA/L *     |   cos2       cos sin       -cos2       -cos sin  |

                         |                 sin2           -cos sin      -sin2       |

                         |                                     cos2         cos sin     |

                         |     对称                                              sin2      |


用一个 Fortran 子例程完成(.Net 与 Fortran 混合编程基础参考.Net(c#) 通过 Fortran 动态链接库,实现混合编程):

        [DllImport("FORTRANCAL/MatrixCal.dll")]
        public static extern void UnitStiffnessMatrix(ref Single EA, ref Single x1, ref Single x2, ref Single y1, ref Single y2, ref Single K);

参数分别代表:杆件EA,起点横坐标 x1,终点横坐标 x2,起点纵坐标 y1,终点纵坐标 y2,存放矩阵的二维数组 4×4 。

凭借两点四个坐标可以确定 cos sin L 三个量,返回整体坐标下的单刚到 K[,] 中。


1.4  整体刚度矩阵

对应杆件两端节点号存放入整体刚度矩阵中,详见后文。


1.5  总位移列阵、总荷载列阵、总边界列阵

其中,前两者为浮点型一维数组,总边界列阵为布尔型一维数组,维度都为 2 倍的节点数。


1.5  引入边界条件

通过判断 public static bool[] TatalRestraint;//总边界条件 来整合总刚度矩阵,使之可逆。

同时整合 总位移列阵、总荷载列阵,将有约束的(未知反力)的项去除。

详见后文。


1.6  求解基本方程 Ax = b

由 Fortran 计算

A 为引入边界条件整合后的总刚度矩阵,x 为所求的总位移列阵(已整合去除有约束项,后再用总边界列阵还原为 2 倍节点数的数组),b 为总荷载列阵。

线性方程求解参考.Net ( c# ) 与 Fortran 混合编程实例(一):求线性方程组的解。


        [DllImport("FORTRANCAL/MatrixCal.dll")]
        public static extern void MatrixNi(ref Single A, ref int n);

求总刚度矩阵 A 的逆矩阵


        [DllImport("FORTRANCAL/MatrixCal.dll")]
        public static extern void MatrixJie(ref Single A_, ref int n, ref Single b, ref Single x);

求得节点关键位移列阵 x


1.7  利用总边界列阵还原总位移列阵,并与奇异总刚度矩阵相乘取得总荷载列阵(包括未知反力)。

矩阵相乘由 Fortran 完成。

        [DllImport("FORTRANCAL/MatrixCal.dll")]
        public static extern void MatrixChen(ref Single A, ref int n, ref Single b, ref Single x);


1.8  程序方案

开发平台:VS2008 + CVF6

主程序为 windows console application,Main.exe

类库:

PlaceUsingTxt.dll                .Net 文件操作,读取文本文件中的原始数据。

Business.dll                    主要功能库,包括四个类

                                ClassBasicInfo                 静态类,存放结构原始信息;

                                ClassGetBasicInfo                    调用 PlaceUsingTxt.dll 完成从文本到静态类的数据存储一系列过程;

                                ClassCalculation                       负责取得未引入边界条件的总刚度矩阵,总荷载列阵,总边界列阵;

                                ClassBoundaryIn                     负责引入边界条件,整合总刚度矩阵(使之可逆),总荷载列阵(去除支座反力以 0 代替的项),计算关键位移,并形

                                                                                     成完整的总位移列阵,总荷载列阵,完成整个杆系结构有限元法基本方程构造与解的返回。

MatrixCal.dll                     Fortran 计算库,存放于相对路径的 FORTRANCAL 文件夹,负责矩阵相关计算。





你可能感兴趣的:(编程,.net,C#,架构设计,fortran)