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 }); }
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; }