예제 #1
0
 private void ClearClicked(object sender, RoutedEventArgs e)
 {
     fem = null;
     this.Canvas.Children.Clear();
     DrawXYArrow();
 }
예제 #2
0
        private void Example1Clicked(object sender, RoutedEventArgs e)
        {
            // 初期化
            ClearClicked(null, null);

            double thickness = 1.0;
            double young     = 210000;
            double poisson   = 0.3;

            // 要素を作成する
            List <TriangularElement> elems = new List <TriangularElement>();
            {
                // 要素1
                {
                    Node[] nodes = new Node[3];
                    nodes[0].No    = 1;
                    nodes[0].Point = new System.Windows.Vector(0.0, 0.0);
                    nodes[1].No    = 2;
                    nodes[1].Point = new System.Windows.Vector(1.0, 0.0);
                    nodes[2].No    = 5;
                    nodes[2].Point = new System.Windows.Vector(1.0, 1.0);
                    elems.Add(new TriangularElement(nodes, thickness, young, poisson));
                }
                // 要素2
                {
                    Node[] nodes = new Node[3];
                    nodes[0].No    = 2;
                    nodes[0].Point = new System.Windows.Vector(1.0, 0.0);
                    nodes[1].No    = 3;
                    nodes[1].Point = new System.Windows.Vector(2.0, 0.0);
                    nodes[2].No    = 4;
                    nodes[2].Point = new System.Windows.Vector(2.0, 1.0);
                    elems.Add(new TriangularElement(nodes, thickness, young, poisson));
                }
                // 要素3
                {
                    Node[] nodes = new Node[3];
                    nodes[0].No    = 2;
                    nodes[0].Point = new System.Windows.Vector(1.0, 0.0);
                    nodes[1].No    = 4;
                    nodes[1].Point = new System.Windows.Vector(2.0, 1.0);
                    nodes[2].No    = 5;
                    nodes[2].Point = new System.Windows.Vector(1.0, 1.0);
                    elems.Add(new TriangularElement(nodes, thickness, young, poisson));
                }
                // 要素4
                {
                    Node[] nodes = new Node[3];
                    nodes[0].No    = 1;
                    nodes[0].Point = new System.Windows.Vector(0.0, 0.0);
                    nodes[1].No    = 5;
                    nodes[1].Point = new System.Windows.Vector(1.0, 1.0);
                    nodes[2].No    = 6;
                    nodes[2].Point = new System.Windows.Vector(0.0, 1.0);
                    elems.Add(new TriangularElement(nodes, thickness, young, poisson));
                }
            }

            // 境界条件を設定する
            // 変位
            List <double> disp = new List <double>();

            for (int i = 0; i < 12; i++)
            {
                disp.Add(0);
            }
            DenseVector DispVector = DenseVector.OfArray(disp.ToArray());
            // 荷重
            List <double> force = new List <double>();

            for (int i = 0; i < 12; i++)
            {
                force.Add(0);
            }
            force[7] = -10000;
            DenseVector ForceVector = DenseVector.OfArray(force.ToArray());
            // 拘束
            List <bool> Rest = new List <bool>();

            {
                for (int i = 0; i < 12; i++)
                {
                    Rest.Add(false);
                }
                Rest[0]  = true;
                Rest[1]  = true;
                Rest[10] = true;
            }
            fem = new Triangular2DFEM(6, elems);
            fem.setBoundaryCondition(DispVector, ForceVector, Rest);

            // モデルを描画する
            for (int i = 0; i < elems.Count; i++)
            {
                DrawElement(elems[i], Brushes.LightGreen, Brushes.Blue, 1.0);
            }
        }
예제 #3
0
        private void Example2Clicked(object sender, RoutedEventArgs e)
        {
            // 初期化
            ClearClicked(null, null);

            double thickness = 0.01;
            double young     = 210000;
            double poisson   = 0.0;

            // 要素を作成する
            List <TriangularElement> elems = new List <TriangularElement>();
            {
                // 節点を作成する
                Node[] nodes = new Node[55];
                {
                    for (int i = 0; i < 11; i++)
                    {
                        nodes[i].No    = i + 1;
                        nodes[i].Point = new System.Windows.Vector(5.0 * i, 0.0);
                    }
                    for (int i = 11; i < 22; i++)
                    {
                        nodes[i].No    = i + 1;
                        nodes[i].Point = new System.Windows.Vector(5.0 * (i - 11), 0.5);
                    }
                    for (int i = 22; i < 33; i++)
                    {
                        nodes[i].No    = i + 1;
                        nodes[i].Point = new System.Windows.Vector(5.0 * (i - 22), 1.0);
                    }
                    for (int i = 33; i < 44; i++)
                    {
                        nodes[i].No    = i + 1;
                        nodes[i].Point = new System.Windows.Vector(5.0 * (i - 33), 1.5);
                    }
                    for (int i = 44; i < 55; i++)
                    {
                        nodes[i].No    = i + 1;
                        nodes[i].Point = new System.Windows.Vector(5.0 * (i - 44), 2.0);
                    }
                }

                // 要素を作成する
                // 1段目
                {
                    for (int i = 0; i < 10; i++)
                    {
                        Node[] elemNodes = new Node[3];
                        elemNodes[0] = nodes[i];
                        elemNodes[1] = nodes[i + 1];
                        elemNodes[2] = nodes[i + 12];
                        elems.Add(new TriangularElement(elemNodes, thickness, young, poisson));
                    }
                    for (int i = 0; i < 10; i++)
                    {
                        Node[] elemNodes = new Node[3];
                        elemNodes[0] = nodes[i];
                        elemNodes[1] = nodes[i + 12];
                        elemNodes[2] = nodes[i + 11];
                        elems.Add(new TriangularElement(elemNodes, thickness, young, poisson));
                    }
                }
                // 2段目
                {
                    for (int i = 11; i < 21; i++)
                    {
                        Node[] elemNodes = new Node[3];
                        elemNodes[0] = nodes[i];
                        elemNodes[1] = nodes[i + 1];
                        elemNodes[2] = nodes[i + 12];
                        elems.Add(new TriangularElement(elemNodes, thickness, young, poisson));
                    }
                    for (int i = 11; i < 21; i++)
                    {
                        Node[] elemNodes = new Node[3];
                        elemNodes[0] = nodes[i];
                        elemNodes[1] = nodes[i + 12];
                        elemNodes[2] = nodes[i + 11];
                        elems.Add(new TriangularElement(elemNodes, thickness, young, poisson));
                    }
                }
                // 3段目
                {
                    for (int i = 22; i < 32; i++)
                    {
                        Node[] elemNodes = new Node[3];
                        elemNodes[0] = nodes[i];
                        elemNodes[1] = nodes[i + 1];
                        elemNodes[2] = nodes[i + 12];
                        elems.Add(new TriangularElement(elemNodes, thickness, young, poisson));
                    }
                    for (int i = 22; i < 32; i++)
                    {
                        Node[] elemNodes = new Node[3];
                        elemNodes[0] = nodes[i];
                        elemNodes[1] = nodes[i + 12];
                        elemNodes[2] = nodes[i + 11];
                        elems.Add(new TriangularElement(elemNodes, thickness, young, poisson));
                    }
                }
                // 4段目
                {
                    for (int i = 33; i < 43; i++)
                    {
                        Node[] elemNodes = new Node[3];
                        elemNodes[0] = nodes[i];
                        elemNodes[1] = nodes[i + 1];
                        elemNodes[2] = nodes[i + 12];
                        elems.Add(new TriangularElement(elemNodes, thickness, young, poisson));
                    }
                    for (int i = 33; i < 43; i++)
                    {
                        Node[] elemNodes = new Node[3];
                        elemNodes[0] = nodes[i];
                        elemNodes[1] = nodes[i + 12];
                        elemNodes[2] = nodes[i + 11];
                        elems.Add(new TriangularElement(elemNodes, thickness, young, poisson));
                    }
                }

                // 境界条件を設定する
                // 変位
                List <double> disp = new List <double>();
                for (int i = 0; i < nodes.Length * 2; i++)
                {
                    disp.Add(0);
                }
                DenseVector DispVector = DenseVector.OfArray(disp.ToArray());
                // 荷重
                List <double> force = new List <double>();
                for (int i = 0; i < nodes.Length * 2; i++)
                {
                    force.Add(0);
                }
                force[65] = -10;
                DenseVector ForceVector = DenseVector.OfArray(force.ToArray());
                // 拘束
                List <bool> Rest = new List <bool>();
                {
                    for (int i = 0; i < nodes.Length * 2; i++)
                    {
                        Rest.Add(false);
                    }
                    // 節点1
                    Rest[0] = true;
                    Rest[1] = true;
                    // 節点12
                    Rest[22] = true;
                    Rest[23] = true;
                    // 節点23
                    Rest[44] = true;
                    Rest[45] = true;
                    // 節点34
                    Rest[66] = true;
                    Rest[67] = true;
                    // 節点45
                    Rest[88] = true;
                    Rest[89] = true;
                }
                fem = new Triangular2DFEM(nodes.Length, elems);
                fem.setBoundaryCondition(DispVector, ForceVector, Rest);

                // モデルを描画する
                for (int i = 0; i < elems.Count; i++)
                {
                    DrawElement(elems[i], Brushes.LightGreen, Brushes.Blue, 1.0);
                }
            }
        }