zoukankan      html  css  js  c++  java
  • .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 文件夹,负责矩阵相关计算。





  • 相关阅读:
    通道分离与合并
    opencv颜色表操作
    opencv trackbar
    像素操作
    opencv 像素读写
    py 时间与日期
    py 字典
    py 元组
    py 列表
    课后作业-阅读任务-阅读提问-3
  • 原文地址:https://www.cnblogs.com/silyvin/p/9106924.html
Copyright © 2011-2022 走看看