Пример #1
0
        public void ReinforcedPlate()
        {
            var k3d    = new Toolkit();
            var logger = new MessageLogger();

            double length = 1.0;
            var    mesh   = new Mesh3();

            mesh.AddVertex(new Point3(0, length, 0));
            mesh.AddVertex(new Point3(0, 0, 0));
            mesh.AddVertex(new Point3(length, 0, 0));
            mesh.AddVertex(new Point3(length, length, 0));
            mesh.AddFace(new Face3(0, 1, 3));
            mesh.AddFace(new Face3(1, 2, 3));

            var crosec = k3d.CroSec.ReinforcedConcreteStandardShellConst(25, 0, null, new List <double> {
                4, 4, -4, -4
            }, 0);
            var shells = k3d.Part.MeshToShell(new List <Mesh3> {
                mesh
            }, null, new List <CroSec> {
                crosec
            }, logger, out var nodes);

            // create supports
            var supportConditions = new List <bool>()
            {
                true, true, true, true, true, true
            };
            var supports = new List <Support>
            {
                k3d.Support.Support(0, supportConditions),
                k3d.Support.Support(1, supportConditions),
            };

            // create a Point-load
            var loads = new List <Load>
            {
                k3d.Load.PointLoad(2, new Vector3(), new Vector3(0, 25, 0)),
                k3d.Load.PointLoad(3, new Vector3(), new Vector3(0, 25, 0))
            };

            // create the model
            var model = k3d.Model.AssembleModel(shells, supports, loads,
                                                out var info, out var mass, out var cog, out var message, out var warning);

            model = k3d.Algorithms.OptiReinf(model, out var maxDisplacements, out var compliances, out message, out var reinfMass);

            k3d.Results.ShellForcesLocal(model, null, "0",
                                         out var nxx, out var nyy, out var nxy,
                                         out var mxx, out var myy, out var mxy,
                                         out var vx, out var vy);
            Assert.AreEqual(mxx[0][0][0], 50.082245640312429, 1E-5);
            Assert.AreEqual(mxx[0][0][1], 49.91775435968767, 1E-5);

            var crosec_shell = model.elems[0].crosec as CroSec_Shell;
            var reinf_thick  = crosec_shell.elem_crosecs[0].layers[1].height;

            Assert.AreEqual(reinf_thick, 0.00046824411288599481, 1E-5);
        }
Пример #2
0
        public void Shell()
        {
            var    k3d    = new Toolkit();
            var    logger = new MessageLogger();
            double length = 1.0;
            var    mesh   = new Mesh3();
            var    p0     = new Point3(0, length, 0);
            var    p1     = new Point3(0, 0, 0);

            mesh.AddVertex(p0);
            mesh.AddVertex(p1);
            mesh.AddVertex(new Point3(length, 0, 0));
            mesh.AddVertex(new Point3(length, length, 0));
            mesh.AddFace(new Face3(0, 1, 3));
            mesh.AddFace(new Face3(1, 2, 3));

            var crosec = k3d.CroSec.ShellConst(25, 0);
            var shells = k3d.Part.MeshToShell(new List <Mesh3> {
                mesh
            }, null, new List <CroSec> {
                crosec
            }, logger, out var nodes);


            // create supports
            var supports = new List <Support>
            {
                k3d.Support.Support(p0, new List <bool>()
                {
                    true, true, true, true, true, true
                }),
                k3d.Support.Support(p1, new List <bool>()
                {
                    true, true, true, true, true, true
                }),
            };


            // create the model
            var model = k3d.Model.AssembleModel(shells, supports, new List <Load>(),
                                                out var info, out var mass, out var cog, out var message, out var warning);

            // calculate the natural vibrations
            int    from_shape_ind = 1;
            int    shapes_num     = 1;
            int    max_iter       = 100;
            double eps            = 1e-8;
            var    disp_dummy     = new List <double>();
            var    scaling        = EigenShapesScalingType.matrix;

            model = k3d.Algorithms.NaturalVibes(model, from_shape_ind, shapes_num, max_iter, eps, disp_dummy, scaling,
                                                out List <double> nat_frequencies, out List <double> modal_masses, out List <Vector3> participation_facs,
                                                out List <double> participation_facs_disp, out model);

            Assert.AreEqual(nat_frequencies[0], 624.44918408731951, 1e-8);
        }
        private static Karamba.Models.Model MakeNonConvexModel()
        {
            var k3d  = new Toolkit();
            var mesh = new Mesh3();

            mesh.AddVertex(0, 0, 0);
            mesh.AddVertex(1, 0, 0);
            mesh.AddVertex(1, 1, 0);
            mesh.AddVertex(0, 1, 0);
            mesh.AddVertex(1, 2, 0);
            mesh.AddVertex(0, 2, 0);
            mesh.AddFace(0, 1, 2);
            mesh.AddFace(3, 2, 4);
            mesh.AddFace(3, 4, 5);

            var supportConditions = new List <bool>()
            {
                true, true, true, true, true, true
            };
            var supports = new List <Support>
            {
                k3d.Support.Support(0, supportConditions),
                k3d.Support.Support(3, supportConditions),
                k3d.Support.Support(5, supportConditions)
            };

            var loads = new List <Load>
            {
                k3d.Load.PointLoad(4, new Vector3(0, 0, -5)),
                k3d.Load.PointLoad(2, new Vector3(0, 0, -5)),
                k3d.Load.PointLoad(1, new Vector3(0, 0, -5)),
            };

            var logger = new MessageLogger();
            var crosec = k3d.CroSec.ReinforcedConcreteStandardShellConst(25, 0, null, new List <double> {
                4, 4, -4, -4
            }, 0);
            var shells = k3d.Part.MeshToShell(new List <Mesh3> {
                mesh
            }, null, new List <CroSec> {
                crosec
            }, logger, out var nodes);
            var model = k3d.Model.AssembleModel(shells, supports, loads,
                                                out var info, out var mass, out var cog, out var message, out var any_warning);

            model = k3d.Algorithms.AnalyzeThI(model, out var maxDisplacements, out var gravityForce, out var elasticEnergy, out var warning);
            return(model);
        }
Пример #4
0
        // [Category("QuickTests")]
        public void FindSupportNode()
        {
            var nFaces     = 1;
            var length     = 10.0;
            var xIncMesh   = length / nFaces;
            var limit_dist = xIncMesh / 100.0;

            // create the mesh
            var mesh = new Mesh3((nFaces + 1) * 2, nFaces);

            mesh.AddVertex(new Point3(0, -0.5, 0));
            mesh.AddVertex(new Point3(0, 0.5, 0));
            for (var faceInd = 0; faceInd < nFaces; ++faceInd)
            {
                mesh.AddVertex(new Point3((faceInd + 1) * xIncMesh, -0.5, 0));
                mesh.AddVertex(new Point3((faceInd + 1) * xIncMesh, 0.5, 0));
                var nV = mesh.Vertices.Count;
                mesh.AddFace(nV - 4, nV - 3, nV - 1, nV - 2);
            }

            // create a shell
            MeshToShell.solve(new List <Point3>(), new List <Mesh3>()
            {
                mesh
            }, limit_dist, new List <string>(), new List <Color>(), new List <CroSec>(), true,
                              out List <Point3> outPoints, out List <BuilderShell> outBuilderShells, out MessageLogger outLogger);

            // create two supports
            var support1 = new Support(new Point3(0, -0.5, 0), new List <bool>()
            {
                true, true, true, true, true, true
            }, Plane3.Default);
            var support2 = new Support(new Point3(0, 0.5, 0), new List <bool>()
            {
                true, true, true, true, true, true
            }, Plane3.Default);

            // create a gravity load
            var gravityLoad = new GravityLoad(new Vector3(0, 0, -1));

            // assemble the model
            var modelBuilder = new ModelBuilder(limit_dist);
            var model        = modelBuilder.build(new List <Point3>(), new List <FemMaterial>(), new List <CroSec>(),
                                                  new List <Support>()
            {
                support1, support2
            }, new List <Load>()
            {
                gravityLoad
            }, outBuilderShells, new List <ElemSet>(),
                                                  new List <Joint>(), new MessageLogger()
                                                  );

            ThIAnalyze.solve(model, out var outMaxDisp, out var outG, out var outComp, out var warning, out model);

            // Assert.AreEqual(outMaxDisp[0], 53.621934860880543, 1E-5);
            Assert.AreEqual(outMaxDisp[0], 53.62193486094136, 1E-5);
        }
Пример #5
0
 private Mesh3 MakeMesh()
 {
     Mesh3 mesh = new Mesh3();
     mesh.AddVertex(0, 0, 0);
     mesh.AddVertex(1, 0, 0);
     mesh.AddVertex(0, 1, 0.5);
     mesh.AddFace(0, 1, 2);
     return mesh;
 }
Пример #6
0
        public void TSection_2Elems()
        {
            var k3d = new Toolkit();

            var logger = new MessageLogger();

            double Lx     = 1.0;
            double Ly     = 2.0;
            double Lz     = 3.0;
            var    points = new List <Point3> {
                new Point3(0, Ly, 0), new Point3(0, 0, 0),
                new Point3(Lx, 0, 0),
                new Point3(0, 0, Lz)
            };

            var mesh = new Mesh3();

            foreach (var point in points)
            {
                mesh.AddVertex(point);
            }
            mesh.AddFace(new Face3(0, 1, 2));
            mesh.AddFace(new Face3(1, 2, 3));

            var material = k3d.Material.IsotropicMaterial("", "", 200000, 100000, 100000, 0, 0, 0, 0, 0);
            var crosec   = k3d.CroSec.ShellConst(0.1, 0, material);
            var shells   = k3d.Part.MeshToShell(
                new List <Mesh3> {
                mesh
            }, null, new List <CroSec> {
                crosec
            }, true, logger, out var nodes,
                0.005, null, points);

            // create supports
            var supportConditions_1 = new List <bool>()
            {
                true, true, true, true, true, true
            };
            var supports = new List <Support>
            {
                k3d.Support.Support(points[0], supportConditions_1),
                k3d.Support.Support(points[1], supportConditions_1),
                k3d.Support.Support(points[2], supportConditions_1)
            };

            // create a Point-load
            double Fx    = 100.0;
            var    loads = new List <Load>
            {
                k3d.Load.PointLoad(points[3], new Vector3(Fx, 0, 0), new Vector3()),
            };

            double c      = 0.1;
            var    joints = new List <Joint>()
            {
                new JointLine(new List <string> {
                    ""
                },
                              new PolyLine3(new List <Point3> {
                    points[1], points[2]
                }),
                              -Vector3.ZAxis, null, Math.PI * 0.25, new double?[] { c })
            };

            // create the model
            var model = k3d.Model.AssembleModel(shells, supports, loads,
                                                out var info, out var mass, out var cog, out var message, out var warning, joints);

            // var model = k3d.Model.AssembleModel(shells, supports, loads,
            //    out var info, out var mass, out var cog, out var message, out var warning, joints, points);
            // var model = k3d.Model.AssembleModel(shells, supports, loads,
            //    out var info, out var mass, out var cog, out var message, out var warning);

            ThIAnalyze.solve(model, out var outMaxDisp, out var outG, out var outComp, out var warning_msg, out model);

            var dispTarget = Fx / Lx / c;
            var dispCalc   = outMaxDisp[0];

            Assert.AreEqual(dispCalc, dispTarget, 1);
        }
Пример #7
0
        public void Membrane_Triangle_InPlaneSpringOnOneSide()
        {
            var k3d = new Toolkit();

            var logger = new MessageLogger();

            double L      = 1.0;
            var    points = new List <Point3> {
                new Point3(0, 0.5 * L, 0), new Point3(0, -0.5 * L, 0), new Point3(L, 0, 0)
            };

            var mesh = new Mesh3();

            foreach (var point in points)
            {
                mesh.AddVertex(point);
            }
            mesh.AddFace(new Face3(0, 1, 2));

            var material = k3d.Material.IsotropicMaterial("", "", 200000, 100000, 100000, 0, 0, 0, 0, 0);
            var crosec   = k3d.CroSec.ShellConst(0.01, 0, material);
            var shells   = k3d.Part.MeshToShell(new List <Mesh3> {
                mesh
            }, null, new List <CroSec> {
                crosec
            }, false, logger, out var out_nodes);

            // create supports
            var supportConditions_1 = new List <bool>()
            {
                true, true, true, true, true, true
            };
            var supports = new List <Support>
            {
                k3d.Support.Support(points[0], supportConditions_1),
                k3d.Support.Support(points[1], supportConditions_1),
            };

            // create a Point-load
            double fx    = 100.0;
            var    loads = new List <Load>
            {
                k3d.Load.PointLoad(points[2], new Vector3(fx, 0, 0), new Vector3()),
            };

            double cx     = 2.0;
            var    joints = new List <Joint>()
            {
                new JointLine(new List <string> {
                    ""
                },
                              new PolyLine3(new List <Point3> {
                    points[1], points[0]
                }),
                              -Vector3.XAxis, Vector3.ZAxis, Math.PI * 0.5, new double?[] { null, cx })
            };

            // create the model
            var model = k3d.Model.AssembleModel(shells, supports, loads,
                                                out var info, out var mass, out var cog, out var message, out var warning, joints);

            // var model = k3d.Model.AssembleModel(shells, supports, loads,
            //     out var info, out var mass, out var cog, out var message, out var warning);

            ThIAnalyze.solve(model, out var outMaxDisp, out var outG, out var outComp, out var warning_msg, out model);

            var h = (model.elems[0].crosec as CroSec_Shell).getHeight();
            var E = model.elems[0].crosec.material.E();
            // var c_inv_tot = 2 * L / (E * h);
            var c_inv_tot  = 2 * L / (E * h) + 1 / cx / L;
            var dispTarget = Math.Abs(fx) / L * c_inv_tot;
            var dispCalc   = outMaxDisp[0];

            Assert.AreEqual(dispCalc, dispTarget, 1);
        }
Пример #8
0
        public void DeformationTestIsotropicShellInPlane()
        {
            var nFaces     = 1;
            var length     = 1.0;
            var xIncMesh   = length / nFaces;
            var limit_dist = xIncMesh / 100.0;

            var y0 = 0.0;
            var y1 = 1.0;

            // create the mesh
            var mesh = new Mesh3((nFaces + 1) * 2, nFaces);

            mesh.AddVertex(new Point3(0, y0, 0));
            mesh.AddVertex(new Point3(0, y1, 0));
            for (var faceInd = 0; faceInd < nFaces; ++faceInd)
            {
                mesh.AddVertex(new Point3((faceInd + 1) * xIncMesh, y0, 0));
                mesh.AddVertex(new Point3((faceInd + 1) * xIncMesh, y1, 0));
                var nV = mesh.Vertices.Count;
                mesh.AddFace(nV - 4, nV - 3, nV - 1, nV - 2);
            }

            // create a shell
            MeshToShell.solve(new List <Point3>(), new List <Mesh3>()
            {
                mesh
            }, limit_dist, new List <string>(), new List <Color>(), new List <CroSec>(), true,
                              out List <Point3> outPoints, out List <BuilderShell> outBuilderShells, out MessageLogger outLogger);

            // create two supports
            var support1 = new Support(new Point3(0, y0, 0), new List <bool>()
            {
                true, true, true, true, true, true
            }, Plane3.Default);
            var support2 = new Support(new Point3(0, y1, 0), new List <bool>()
            {
                true, false, true, true, true, true
            }, Plane3.Default);

            // create two point loads
            var pl1 = new PointLoad(mesh.Vertices.Count - 2, new Vector3(25, 0, 0), new Vector3(), false);
            var pl2 = new PointLoad(mesh.Vertices.Count - 1, new Vector3(25, 0, 0), new Vector3(), false);

            // assemble the model
            var modelBuilder = new ModelBuilder(limit_dist);
            var model        = modelBuilder.build(new List <Point3>(), new List <FemMaterial>(), new List <CroSec>(),
                                                  new List <Support>()
            {
                support1, support2
            }, new List <Load>()
            {
                pl1, pl2
            }, outBuilderShells, new List <ElemSet>(),
                                                  new List <Joint>(), new MessageLogger()
                                                  );

            ThIAnalyze.solve(model, out var outMaxDisp, out var outG, out var outComp, out var warning, out model);

            Assert.AreEqual(outMaxDisp[0], 2.4858889456113236E-05, 1E-5);
        }
Пример #9
0
        public void Initialize()
        {
            var k3d = new Toolkit();

            var mesh = new Mesh3();

            mesh.AddVertex(0, 0, 0);
            mesh.AddVertex(0, 1, 0);
            mesh.AddVertex(1, 0, 0);
            mesh.AddVertex(1, 1, 0);
            mesh.AddFace(0, 2, 3);
            mesh.AddFace(0, 3, 1);

            var supportConditions = new List <bool>()
            {
                true, true, true, true, true, true
            };
            var supports = new List <Support>
            {
                k3d.Support.Support(new Point3(0, 0, 0), supportConditions),
                k3d.Support.Support(new Point3(0, 1, 0), supportConditions),
            };

            var loads = new List <Load>
            {
                k3d.Load.PointLoad(new Point3(1, 1, 0), new Vector3(-5, 0, -5)),
                k3d.Load.PointLoad(new Point3(1, 0, 0), new Vector3(-5, 0, -5)),
            };

            var logger = new MessageLogger();
            var crosec = k3d.CroSec.ReinforcedConcreteStandardShellConst(1);//20, 0, null, new List<double> { 4, 4, -4, -4 }, 0);
            var shells = k3d.Part.MeshToShell(new List <Mesh3> {
                mesh
            }, null, new List <CroSec> {
                crosec
            }, logger, out var nodes);
            var model = k3d.Model.AssembleModel(shells, supports, loads, out var info, out var mass, out var cog, out var message, out var any_warning);


            model             = k3d.Algorithms.AnalyzeThI(model, out var maxDisplacements, out var gravityForce, out var elasticEnergy, out var warning);
            _model            = model;
            _inputPolyline    = new PolyLine3(new Point3(0.5, -0.5, 1), new Point3(0.5, 1.5, 1));
            _projectionVector = new Vector3(0, 0, -1);
            _tol             = 1E-12;
            _delta           = 0.02;
            _outputPolylines = new List <PolyLine3>()
            {
                new PolyLine3
                (
                    new Point3(0.5, 0, 0),
                    new Point3(0.5, 0.5, 0),
                    new Point3(0.5, 1, 0)
                )
            };
            _outputCrossedFaces = new List <List <int> >()
            {
                new List <int>()
                {
                    0, 1
                }
            };
        }
Пример #10
0
        public void MeshLoadProfiling()
        {
            var k3d    = new Toolkit();
            var logger = new MessageLogger();

            int    nBeams      = 20;
            int    nFaces      = 1500;
            double lengthBeams = 10.0;
            double xIncBeam    = lengthBeams / nBeams;
            double xIncMesh    = lengthBeams / nFaces;
            double limit_dist  = xIncBeam / 100.0;

            // create beams
            var lines = new List <Line3>();
            var nodeI = new Point3(0, 0, 0);

            for (int beamInd = 0; beamInd < nBeams; ++beamInd)
            {
                var nodeK = new Point3(nodeI.X + xIncBeam, 0, 0);
                lines.Add(new Line3(nodeI, nodeK));
                nodeI = nodeK;
            }

            var builderElements = k3d.Part.LineToBeam(lines, new List <string>(), new List <CroSec>(), logger, out List <Point3> outPoints);

            // create a MeshLoad
            var mesh = new Mesh3((nFaces + 1) * 2, nFaces);

            mesh.AddVertex(new Point3(0, -0.5, 0));
            mesh.AddVertex(new Point3(0, 0.5, 0));
            for (var faceInd = 0; faceInd < nFaces; ++faceInd)
            {
                mesh.AddVertex(new Point3((faceInd + 1) * xIncMesh, -0.5, 0));
                mesh.AddVertex(new Point3((faceInd + 1) * xIncMesh, 0.5, 0));
                var nV = mesh.Vertices.Count;
                mesh.AddFace(nV - 4, nV - 3, nV - 1, nV - 2);
            }
            UnitsConversionFactory ucf = UnitsConversionFactory.Conv();
            UnitConversion         m   = ucf.m();
            var baseMesh = m.toBaseMesh(mesh);

            // create a mesh load
            var load = k3d.Load.MeshLoad(new List <Vector3>()
            {
                new Vector3(0, 0, -1)
            }, baseMesh);

            // create a support
            var support = k3d.Support.Support(new Point3(0, 0, 0), k3d.Support.SupportFixedConditions);

            // assemble the model
            var model = k3d.Model.AssembleModel(builderElements, new List <Support>()
            {
                support
            }, new List <Load>()
            {
                load
            },
                                                out var info, out var mass, out var cog, out var message, out var runtimeWarning);

            // calculate the model
            model = k3d.Algorithms.AnalyzeThI(model, out var outMaxDisp, out var outG, out var outComp, out var warning);
            Assert.AreEqual(outMaxDisp[0], 2.8232103119228276, 1E-5);
        }
Пример #11
0
        public void Initialize()
        {
            //Create Mesh
            var mesh = new Mesh3();

            mesh.AddVertex(0, 0, 0);
            mesh.AddVertex(0, 1, 0);
            mesh.AddVertex(0, 2, 0);
            mesh.AddVertex(1, 0, 0);
            mesh.AddVertex(1, 1, 0);
            mesh.AddVertex(1, 2, 0);
            mesh.AddVertex(2, 0, 0);
            mesh.AddVertex(2, 1, 0);
            mesh.AddVertex(2, 2, 0);

            mesh.AddFace(0, 3, 4);
            mesh.AddFace(1, 4, 5);
            mesh.AddFace(3, 6, 7);
            mesh.AddFace(4, 7, 8);
            mesh.AddFace(0, 4, 1);
            mesh.AddFace(1, 5, 2);
            mesh.AddFace(3, 7, 4);
            mesh.AddFace(4, 8, 5);

            //Create Model
            var k3d = new Toolkit();
            var supportConditions = new List <bool>()
            {
                true, true, true, true, true, true
            };
            var supports = new List <Support>
            {
                k3d.Support.Support(new Point3(0, 0, 0), supportConditions),
                k3d.Support.Support(new Point3(0, 1, 0), supportConditions),
                k3d.Support.Support(new Point3(0, 2, 0), supportConditions)
            };

            var loads = new List <Load>
            {
                k3d.Load.PointLoad(new Point3(2, 2, 0), new Vector3(0, 0, -5)),
                k3d.Load.PointLoad(new Point3(2, 1, 0), new Vector3(0, 0, -5)),
                k3d.Load.PointLoad(new Point3(2, 0, 0), new Vector3(0, 0, -5)),
            };

            var logger = new MessageLogger();
            var crosec = k3d.CroSec.ReinforcedConcreteStandardShellConst(25, 0, null, new List <double> {
                4, 4, -4, -4
            }, 0);
            var shells = k3d.Part.MeshToShell(new List <Mesh3> {
                mesh
            }, null, new List <CroSec> {
                crosec
            }, logger, out var nodes);

            var model = k3d.Model.AssembleModel(shells, supports, loads,
                                                out var info, out var mass, out var cog, out var message, out var any_warning);

            model = k3d.Algorithms.AnalyzeThI(model, out var maxDisplacements,
                                              out var gravityForce, out var elasticEnergy, out var warning);

            //Create projection Vector
            Vector3 proj_vect = new Vector3(0, 0, -1);

            //Create other definition
            var tol   = 1E-12;
            var delta = 0.02;


            _model            = model;
            _projectionVector = proj_vect;
            _tol   = tol;
            _delta = delta;
        }
        public void Initialize()
        {
            //Create Mesh
            var mesh = new Mesh3();

            mesh.AddVertex(0, 0, 0);
            mesh.AddVertex(0, 1, 0);
            mesh.AddVertex(1, 0, 0);
            mesh.AddVertex(1, 1, 0);
            mesh.AddVertex(2, 0, 0);
            mesh.AddVertex(2, 1, 0);
            mesh.AddVertex(0, 0, 0);
            mesh.AddVertex(1, 0, 0);
            mesh.AddVertex(2, 0, 0);
            mesh.AddVertex(0, 0, 1);
            mesh.AddVertex(1, 0, 1);
            mesh.AddVertex(2, 0, 1);
            mesh.AddVertex(0, 0, 2);
            mesh.AddVertex(1, 0, 2);
            mesh.AddVertex(2, 0, 2);
            mesh.AddVertex(2, 0, 0);
            mesh.AddVertex(2, 1, 0);
            mesh.AddVertex(2, 0, 1);
            mesh.AddVertex(2, 1, 1);
            mesh.AddVertex(2, 0, 2);
            mesh.AddVertex(2, 1, 2);
            mesh.AddVertex(2, 1, 0);
            mesh.AddVertex(1, 1, 0);
            mesh.AddVertex(0, 1, 0);
            mesh.AddVertex(2, 1, 1);
            mesh.AddVertex(1, 1, 1);
            mesh.AddVertex(0, 1, 1);
            mesh.AddVertex(2, 1, 2);
            mesh.AddVertex(1, 1, 2);
            mesh.AddVertex(0, 1, 2);
            mesh.AddVertex(0, 1, 0);
            mesh.AddVertex(0, 0, 0);
            mesh.AddVertex(0, 1, 1);
            mesh.AddVertex(0, 0, 1);
            mesh.AddVertex(0, 1, 2);
            mesh.AddVertex(0, 0, 2);
            mesh.AddVertex(0, 0, 2);
            mesh.AddVertex(1, 0, 2);
            mesh.AddVertex(2, 0, 2);
            mesh.AddVertex(0, 1, 2);
            mesh.AddVertex(1, 1, 2);
            mesh.AddVertex(2, 1, 2);
            mesh.AddFace(0, 1, 3);
            mesh.AddFace(2, 3, 5);
            mesh.AddFace(6, 7, 10);
            mesh.AddFace(7, 8, 11);
            mesh.AddFace(9, 10, 13);
            mesh.AddFace(10, 11, 14);
            mesh.AddFace(15, 16, 18);
            mesh.AddFace(17, 18, 20);
            mesh.AddFace(21, 22, 25);
            mesh.AddFace(22, 23, 26);
            mesh.AddFace(24, 25, 28);
            mesh.AddFace(25, 26, 29);
            mesh.AddFace(30, 31, 33);
            mesh.AddFace(32, 33, 35);
            mesh.AddFace(36, 37, 40);
            mesh.AddFace(37, 38, 41);
            mesh.AddFace(0, 3, 2);
            mesh.AddFace(2, 5, 4);
            mesh.AddFace(6, 10, 9);
            mesh.AddFace(7, 11, 10);
            mesh.AddFace(9, 13, 12);
            mesh.AddFace(10, 14, 13);
            mesh.AddFace(15, 18, 17);
            mesh.AddFace(17, 20, 19);
            mesh.AddFace(21, 25, 24);
            mesh.AddFace(22, 26, 25);
            mesh.AddFace(24, 28, 27);
            mesh.AddFace(25, 29, 28);
            mesh.AddFace(30, 33, 32);
            mesh.AddFace(32, 35, 34);
            mesh.AddFace(36, 40, 39);
            mesh.AddFace(37, 41, 40);

            //Create Model
            var k3d = new Toolkit();
            var supportConditions = new List <bool>()
            {
                true, true, true, true, true, true
            };
            var supports = new List <Support>
            {
                k3d.Support.Support(new Point3(0, 0, 0), supportConditions),
                k3d.Support.Support(new Point3(0, 1, 0), supportConditions),
                k3d.Support.Support(new Point3(1, 0, 0), supportConditions),
                k3d.Support.Support(new Point3(1, 1, 0), supportConditions),
                k3d.Support.Support(new Point3(2, 0, 0), supportConditions),
                k3d.Support.Support(new Point3(2, 1, 0), supportConditions)
            };
            var loads = new List <Load>
            {
                k3d.Load.PointLoad(new Point3(0, 0, 2), new Vector3(1000, 0, 0)),
                k3d.Load.PointLoad(new Point3(1, 0, 2), new Vector3(1000, 0, 0)),
                k3d.Load.PointLoad(new Point3(2, 0, 2), new Vector3(1000, 0, 0)),
                k3d.Load.PointLoad(new Point3(2, 1, 2), new Vector3(1000, 0, 0)),
                k3d.Load.PointLoad(new Point3(1, 1, 2), new Vector3(1000, 0, 0)),
                k3d.Load.PointLoad(new Point3(0, 1, 2), new Vector3(1000, 0, 0))
            };

            var logger = new MessageLogger();
            var crosec = k3d.CroSec.ReinforcedConcreteStandardShellConst(25, 0, null, new List <double> {
                4, 4, -4, -4
            }, 0);
            var shells = k3d.Part.MeshToShell(new List <Mesh3> {
                mesh
            }, null, new List <CroSec> {
                crosec
            }, logger, out var nodes);

            var model = k3d.Model.AssembleModel(shells, supports, loads,
                                                out var info, out var mass, out var cog, out var message, out var any_warning);

            model = k3d.Algorithms.AnalyzeThI(model, out var maxDisplacements,
                                              out var gravityForce, out var elasticEnergy, out var warning);

            //Create projection Vector
            Vector3 proj_vect = new Vector3(0, 1, 0);

            //Create other definition
            var tol   = 1E-12;
            var delta = 0.02;

            _model            = model;
            _projectionVector = proj_vect;
            _tol   = tol;
            _delta = delta;
        }