Beispiel #1
0
 public FiniteElement(FEM2D.Node node0, FEM2D.Node node1, FEM2D.Node node2)
 {
     var feNode0 = new Node(node0.Position, node1.Position, node2.Position, node0.Index, node0.IsInside);
     var feNode1 = new Node(node1.Position, node2.Position, node0.Position, node1.Index, node1.IsInside);
     var feNode2 = new Node(node2.Position, node0.Position, node1.Position, node2.Index, node2.IsInside);
     Nodes = new ReadOnlyCollection<Node>(new[] { feNode0, feNode1, feNode2 });
 }
Beispiel #2
0
        public static double Integrate(Func<Vector2, double> function, FEM2D.FiniteElement finiteElement)
        {
            // Gaussian quadrature coefficents
            var w = new[] { 0.225,
                            0.125939180544827152595683945500181333657639231912257007644510,
                            0.125939180544827152595683945500181333657639231912257007644510,
                            0.125939180544827152595683945500181333657639231912257007644510,
                            0.132394152788506180737649387833151999675694101421076325688822,
                            0.132394152788506180737649387833151999675694101421076325688822,
                            0.132394152788506180737649387833151999675694101421076325688822 };

            var t = new[] { new Vector2(0.333333333333333333333333333333333333333333333333333333333333,
                                        0.333333333333333333333333333333333333333333333333333333333333),
                            new Vector2(0.101286507323456338800987361915123828055575156890876627305353,
                                        0.101286507323456338800987361915123828055575156890876627305353),
                            new Vector2(0.797426985353087322398025276169752343888849686218246745389292,
                                        0.101286507323456338800987361915123828055575156890876627305353),
                            new Vector2(0.101286507323456338800987361915123828055575156890876627305353,
                                        0.797426985353087322398025276169752343888849686218246745389292),
                            new Vector2(0.470142064105115089770441209513447600515853414537694801266074,
                                        0.470142064105115089770441209513447600515853414537694801266074),
                            new Vector2(0.470142064105115089770441209513447600515853414537694801266074,
                                        0.059715871789769820459117580973104798968293170924610397467850),
                            new Vector2(0.059715871789769820459117580973104798968293170924610397467850,
                                        0.470142064105115089770441209513447600515853414537694801266074) };

            double sum = 0;
            Vector2 x0 = finiteElement.Nodes[0].Position,
                    u = finiteElement.Nodes[1].Position - x0,
                    v = finiteElement.Nodes[2].Position - x0;

            for (int i = 0; i < 7; i++)
            {
                var baricentricPoint = x0 + t[i].x * u + t[i].y * v;
                sum += w[i] * function(baricentricPoint);
            }

            var area = Math.Abs(u.x*v.y - u.y*v.x) / 2;
            return sum * area;
        }