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