Ejemplo n.º 1
0
        private static void TestCapacity()
        {
            var factory = new ThermalElement2DFactory(thickness, new ThermalMaterial(density, specialHeatCoeff, thermalConductivity));
            ThermalElement2D element = factory.CreateElement(CellType.Tri3, nodeSet0);
            IMatrix          M       = element.BuildCapacityMatrix();

            var expectedM = Matrix.CreateFromArray(new double[, ]
            {
                { 2, 1, 1 },
                { 1, 2, 1 },
                { 1, 1, 2 }
            });

            Assert.True(expectedM.Equals(M, 1e-10));
        }
Ejemplo n.º 2
0
        private static void TestConductivity()
        {
            var factory = new ThermalElement2DFactory(thickness, new ThermalMaterial(density, specialHeatCoeff, thermalConductivity));
            ThermalElement2D element = factory.CreateElement(CellType.Tri3, nodeSet0);
            IMatrix          K       = element.BuildConductivityMatrix();

            var expectedK = Matrix.CreateFromArray(new double[, ]
            {
                { 1.0, -0.5, -0.5 },
                { -0.5, 0.5, 0.0 },
                { -0.5, 0.0, 0.5 }
            });

            Assert.True(expectedK.Equals(K, 1e-10));
        }
Ejemplo n.º 3
0
        private static void TestConductivity()
        {
            var factory = new ThermalElement2DFactory(thickness, new ThermalMaterial(density, specialHeatCoeff, thermalConductivity, thermalConvection));
            ThermalElement2D element = factory.CreateElement(CellType.Quad4, nodeSet0);
            IMatrix          K       = element.BuildDiffusionConductivityMatrix();

            var expectedK = Matrix.CreateFromArray(new double[, ]
            {
                { 2.0 / 3, -1.0 / 6, -1.0 / 3, -1 / 6.0 },
                { -1 / 6.0, 2.0 / 3, -1.0 / 6, -1.0 / 3 },
                { -1.0 / 3, -1.0 / 6, 2.0 / 3, -1.0 / 6 },
                { -1 / 6.0, -1.0 / 3, -1.0 / 6, 2.0 / 3 }
            });

            Assert.True(expectedK.Equals(K, 1e-10));
        }
        private static void AddHostElements(Model model)
        {
            // Material
            double density = 1.0;
            double c       = 1.0;
            double h       = 0;

            // Generate mesh
            var meshGenerator = new UniformMeshGenerator2D <Node>(minX, minY, maxX, maxY, numElementsX, numElementsY);

            (IReadOnlyList <Node> vertices, IReadOnlyList <CellConnectivity <Node> > cells) =
                meshGenerator.CreateMesh((id, x, y, z) => new Node(id: id, x: x, y:  y, z: z));

            // Add nodes to the model
            for (int n = 0; n < vertices.Count; ++n)
            {
                model.NodesDictionary.Add(n, vertices[n]);
            }

            // Add the elements to the model
            var elementFactory = new ThermalElement2DFactory(1.0, new ThermalMaterial(density, c, conductivityMatrix, h));

            for (int e = 0; e < cells.Count; ++e)
            {
                ThermalElement2D element = elementFactory.CreateElement(cells[e].CellType, cells[e].Vertices);
                var elementWrapper       = new Element()
                {
                    ID = e + hostElementsIDStart, ElementType = element
                };
                foreach (Node node in element.Nodes)
                {
                    elementWrapper.AddNode(node);
                }
                model.ElementsDictionary.Add(elementWrapper.ID, elementWrapper);
                model.SubdomainsDictionary[subdomainID].Elements.Add(elementWrapper);
            }
        }
Ejemplo n.º 5
0
        private static Model CreateModel()
        {
            var model = new Model();

            // Subdomains
            model.SubdomainsDictionary.Add(0, new Subdomain(subdomainID));

            // Material
            double density = 1.0;
            double k       = 1.0;
            double c       = 1.0;

            // Nodes
            int numNodes = 9;
            var nodes    = new Node[numNodes];

            nodes[0] = new Node(id: 0, x: 0.0, y: 0.0);
            nodes[1] = new Node(id: 1, x: 1.0, y: 0.0);
            nodes[2] = new Node(id: 2, x: 2.0, y: 0.0);
            nodes[3] = new Node(id: 3, x: 0.0, y: 1.0);
            nodes[4] = new Node(id: 4, x: 1.0, y: 1.0);
            nodes[5] = new Node(id: 5, x: 2.0, y: 1.0);
            nodes[6] = new Node(id: 6, x: 0.0, y: 2.0);
            nodes[7] = new Node(id: 7, x: 1.0, y: 2.0);
            nodes[8] = new Node(id: 8, x: 2.0, y: 2.0);

            for (int i = 0; i < numNodes; ++i)
            {
                model.NodesDictionary[i] = nodes[i];
            }

            // Elements
            int numElements    = 4;
            var elementFactory = new ThermalElement2DFactory(1.0, new ThermalMaterial(density, c, k));
            var elements       = new ThermalElement2D[4];

            elements[0] = elementFactory.CreateElement(CellType.Quad4, new Node[] { nodes[0], nodes[1], nodes[4], nodes[3] });
            elements[1] = elementFactory.CreateElement(CellType.Quad4, new Node[] { nodes[1], nodes[2], nodes[5], nodes[4] });
            elements[2] = elementFactory.CreateElement(CellType.Quad4, new Node[] { nodes[3], nodes[4], nodes[7], nodes[6] });
            elements[3] = elementFactory.CreateElement(CellType.Quad4, new Node[] { nodes[4], nodes[5], nodes[8], nodes[7] });

            for (int i = 0; i < numElements; ++i)
            {
                var elementWrapper = new Element()
                {
                    ID = i, ElementType = elements[i]
                };
                foreach (var node in elements[i].Nodes)
                {
                    elementWrapper.AddNode(node);
                }

                model.ElementsDictionary[i] = elementWrapper;
                model.SubdomainsDictionary[subdomainID].Elements.Add(elementWrapper);
            }

            // Dirichlet BC
            model.NodesDictionary[0].Constraints.Add(new Constraint()
            {
                DOF = ThermalDof.Temperature, Amount = 100.0
            });
            model.NodesDictionary[3].Constraints.Add(new Constraint()
            {
                DOF = ThermalDof.Temperature, Amount = 100.0
            });
            model.NodesDictionary[6].Constraints.Add(new Constraint()
            {
                DOF = ThermalDof.Temperature, Amount = 100.0
            });

            // Neumann BC
            double q = 50.0;

            model.Loads.Add(new Load()
            {
                Amount = q / 2.0, Node = model.NodesDictionary[2], DOF = ThermalDof.Temperature
            });
            model.Loads.Add(new Load()
            {
                Amount = q, Node = model.NodesDictionary[5], DOF = ThermalDof.Temperature
            });
            model.Loads.Add(new Load()
            {
                Amount = q / 2.0, Node = model.NodesDictionary[8], DOF = ThermalDof.Temperature
            });

            return(model);
        }