public static void Run() { double youngModulus = 200.0e06; double poissonRatio = 0.3; double nodalLoad = 25.0; // Create a new elastic 3D material var material = new ElasticMaterial() { YoungModulus = youngModulus, PoissonRatio = poissonRatio, }; // Node creation IList <Node> nodes = CreateNodes(); // Model creation Model model = new Model(); // Add a single subdomain to the model model.SubdomainsDictionary.Add(0, new Subdomain(subdomainID)); // Add nodes to the nodes dictonary of the model for (int i = 0; i < nodes.Count; ++i) { model.NodesDictionary.Add(i + 1, nodes[i]); } // Constrain bottom nodes of the model model.NodesDictionary[1].Constraints.Add(new Constraint { DOF = StructuralDof.TranslationX }); model.NodesDictionary[1].Constraints.Add(new Constraint { DOF = StructuralDof.TranslationY }); model.NodesDictionary[1].Constraints.Add(new Constraint { DOF = StructuralDof.RotationZ }); model.NodesDictionary[2].Constraints.Add(new Constraint { DOF = StructuralDof.TranslationY, Amount = -4.16666666666667E-07 }); //Create a new Beam2D element var beam = new EulerBeam2D(youngModulus) { SectionArea = 1, MomentOfInertia = .1 }; var element = new Element() { ID = 1, ElementType = beam }; //// Add nodes to the created element element.AddNode(model.NodesDictionary[1]); element.AddNode(model.NodesDictionary[2]); //var a = beam.StiffnessMatrix(element); // Add Hexa element to the element and subdomains dictionary of the model model.ElementsDictionary.Add(element.ID, element); model.SubdomainsDictionary[subdomainID].Elements.Add(element); // Add nodal load values at the top nodes of the model //model.Loads.Add(new Load() { Amount = -nodalLoad, Node = model.NodesDictionary[2], DOF = DOFType.Y }); // Solver var solverBuilder = new SkylineSolver.Builder(); ISolver solver = solverBuilder.BuildSolver(model); // Structural problem provider var provider = new ProblemStructural(model, solver); // Linear static analysis var childAnalyzer = new LinearAnalyzer(model, solver, provider); var parentAnalyzer = new StaticAnalyzer(model, solver, provider, childAnalyzer); // Output requests var logFactory = new TotalDisplacementsLog.Factory(model.SubdomainsDictionary[subdomainID]); logFactory.WatchDof(model.NodesDictionary[2], StructuralDof.TranslationX); logFactory.WatchDof(model.NodesDictionary[2], StructuralDof.RotationZ); childAnalyzer.LogFactories[subdomainID] = logFactory; // Run the analysis parentAnalyzer.Initialize(); parentAnalyzer.Solve(); // Choose dof types X, Y, rotZ to log for node 5 var logger = (TotalDisplacementsLog)(childAnalyzer.Logs[subdomainID][0]); //There is a list of logs for each subdomain and we want the first one double[] results = { logger.GetDisplacementAt(model.NodesDictionary[2], StructuralDof.TranslationX), logger.GetDisplacementAt(model.NodesDictionary[2], StructuralDof.RotationZ) }; double[] expected = new double[] { 0, -4.16666666666667E-07, -6.25E-07 }; for (int i = 0; i < expected.Length - 1; i++) { //if (Math.Abs(expected[i] - results[i]) > 1e-14) //{ // throw new SystemException("Failed beam2D test, results don't coincide for dof no: " + i + ", expected displacement: " + expected[i] + ", calculated displacement: " + results[i]); //} Console.WriteLine(results[i]); } Console.WriteLine("ran beam2d2 test"); }
public static void Run() { double youngMod = 10e6; //double poisson = 0.3; double loadX = 500; double loadY = 300; double sectionArea = 1.5; IList <Node> nodes = TrussExample.CreateNodes(); var model = new Model(); model.SubdomainsDictionary.Add(0, new Subdomain(subdomainID)); for (int i = 0; i < nodes.Count; i++) { model.NodesDictionary.Add(i + 1, nodes[i]); } model.NodesDictionary[1].Constraints.Add(new Constraint { DOF = StructuralDof.TranslationX }); model.NodesDictionary[1].Constraints.Add(new Constraint { DOF = StructuralDof.TranslationY }); model.NodesDictionary[2].Constraints.Add(new Constraint { DOF = StructuralDof.TranslationX }); model.NodesDictionary[2].Constraints.Add(new Constraint { DOF = StructuralDof.TranslationY }); var element1 = new Element() { ID = 1, ElementType = new Rod2D(youngMod) { Density = 1, SectionArea = sectionArea } }; var element2 = new Element() { ID = 2, ElementType = new Rod2D(youngMod) { Density = 1, SectionArea = sectionArea } }; element1.AddNode(model.NodesDictionary[1]); element1.AddNode(model.NodesDictionary[3]); element2.AddNode(model.NodesDictionary[2]); element2.AddNode(model.NodesDictionary[3]); model.ElementsDictionary.Add(element1.ID, element1); model.ElementsDictionary.Add(element2.ID, element2); model.SubdomainsDictionary[subdomainID].Elements.Add(element1); model.SubdomainsDictionary[subdomainID].Elements.Add(element2); model.Loads.Add(new Load() { Amount = loadX, Node = model.NodesDictionary[3], DOF = StructuralDof.TranslationX }); model.Loads.Add(new Load() { Amount = loadY, Node = model.NodesDictionary[3], DOF = StructuralDof.TranslationY }); // Solver var solverBuilder = new SkylineSolver.Builder(); ISolver solver = solverBuilder.BuildSolver(model); // Structural problem provider var provider = new ProblemStructural(model, solver); // Linear static analysis var childAnalyzer = new LinearAnalyzer(model, solver, provider); var parentAnalyzer = new StaticAnalyzer(model, solver, provider, childAnalyzer); // Output requests var logFactory = new TotalDisplacementsLog.Factory(model.SubdomainsDictionary[subdomainID]); logFactory.WatchDof(model.NodesDictionary[3], StructuralDof.TranslationX); logFactory.WatchDof(model.NodesDictionary[3], StructuralDof.TranslationY); childAnalyzer.LogFactories[subdomainID] = logFactory; // Run the analysis parentAnalyzer.Initialize(); parentAnalyzer.Solve(); // Print output var logger = (TotalDisplacementsLog)(childAnalyzer.Logs[subdomainID][0]); //There is a list of logs for each subdomain and we want the first one double ux = logger.GetDisplacementAt(model.NodesDictionary[3], StructuralDof.TranslationX); double uy = logger.GetDisplacementAt(model.NodesDictionary[3], StructuralDof.TranslationY); Console.WriteLine($"Displacements of Node 3: Ux = {ux}, Uy = {uy}"); }