public ValidationResult Validate()
        {
            var val = new ValidationResult();

            val.Title = "I Beam torsion with triangle element";

            var span = val.Span = new HtmlTag("span");

            {//report
                span.Add("p").Text("Validate an I Beam nodal displacement and reactions and internal forces");
                span.Add("h3").Text("Validate with");
                span.Add("paragraph").Text("Abaqus");
                span.Add("h3").Text("Validate objective");


                span.Add("paragraph").Text("compare nodal displacement for a model consist of Triangle Elements");

                span.Add("h3").Text("Model Definition");

                span.Add("paragraph")
                .Text("An I shaped beam, totally fixed on one side and under a couple force on other side")
                .AddClosedTag("br");

                span.Add("h3").Text("Validation Result");
            }
            //var magic = 0;

            //example #13 p175


            #region creating model

            //var l = UnitConverter.In2M(40);
            //var w = UnitConverter.In2M(10);
            //var h = UnitConverter.In2M(5);
            var t = 0.25;     // UnitConverter.In2M(0.25);

            var e  = 10000.0; // UnitConverter.Ksi2Pas(10000); //10'000 ksi
            var no = 0.3;

            var mat = new Materials.UniformIsotropicMaterial(e, no);
            var sec = new Sections.UniformParametric2DSection(t);

            var model = AbaqusInputFileReader.AbaqusInputToBFE("Case_01V2\\data1\\job-1.inp");

            {                                    //inp file is imerial unit, bfe is metric
                foreach (var nde in model.Nodes) //location
                {
                    var lc = nde.Location;

                    lc.X = UnitConverter.In2M(lc.X);
                    lc.Y = UnitConverter.In2M(lc.Y);
                    lc.Z = UnitConverter.In2M(lc.Z);

                    //nde.Location = lc;


                    if (nde.Constraints == Constraints.RotationFixed)
                    {
                        nde.Constraints = Constraints.Released;
                    }
                }

                foreach (var nde in model.Nodes)//loads
                {
                    foreach (var ld in nde.Loads)
                    {
                        var f = ld.Force;

                        f.Fx = UnitConverter.Kip2N(f.Fx);
                        f.Fy = UnitConverter.Kip2N(f.Fy);
                        f.Fz = UnitConverter.Kip2N(f.Fz);

                        //ld.Force = f;
                    }
                }
            }


            foreach (var elm in model.Elements)
            {
                if (elm is TriangleElement tri)
                {
                    tri.Material = mat;
                    tri.Section  = sec;

                    tri.MembraneFormulation = MembraneFormulation.PlaneStress;
                    tri.Behavior            = PlaneElementBehaviours.FullThinShell;
                }
            }

            #endregion

            model.Trace.Listeners.Add(new Common.ConsoleTraceListener());
            new ModelWarningChecker().CheckModel(model);

            model.Solve_MPC();

            var bfeNodalDisp = model.Nodes.ToDictionary(i => i.Index, i => i.GetNodalDisplacement());

            //Dictionary<int, Displacement> abqNodalDisp;

            List <object[]> disp;
            List <object[]> stresses;

            using (var str = System.IO.File.OpenRead("Case_01V2\\data1\\node-disp.rpt"))
                disp =
                    AbaqusOutputFileReader.ReadTable(str,
                                                     AbaqusOutputFileReader.ColType.String,
                                                     AbaqusOutputFileReader.ColType.Real,
                                                     AbaqusOutputFileReader.ColType.Real,
                                                     AbaqusOutputFileReader.ColType.Real,
                                                     AbaqusOutputFileReader.ColType.Real,
                                                     AbaqusOutputFileReader.ColType.Real,
                                                     AbaqusOutputFileReader.ColType.Real);

            using (var str = System.IO.File.OpenRead("Case_01V2\\data1\\element-stress.rpt"))
                stresses =
                    AbaqusOutputFileReader.ReadTable(str,
                                                     AbaqusOutputFileReader.ColType.String,
                                                     AbaqusOutputFileReader.ColType.Int,
                                                     AbaqusOutputFileReader.ColType.Real,
                                                     AbaqusOutputFileReader.ColType.Real,
                                                     AbaqusOutputFileReader.ColType.Real,
                                                     AbaqusOutputFileReader.ColType.Real,
                                                     AbaqusOutputFileReader.ColType.Real,
                                                     AbaqusOutputFileReader.ColType.Real,
                                                     AbaqusOutputFileReader.ColType.Real,
                                                     AbaqusOutputFileReader.ColType.Real);

            var strs = stresses.Select(i => new
            {
                Label   = (string)i[0],
                IntPt   = (int)i[1],
                S11Loc1 = (double)i[2],
                S11Loc2 = (double)i[3],
                S22Loc1 = (double)i[4],
                S22Loc2 = (double)i[5],
                S33Loc1 = (double)i[6],
                S33Loc2 = (double)i[7],
                S12Loc1 = (double)i[8],
                S12Loc2 = (double)i[9],
            }).ToArray();

            var disps = disp.Select(i => new
            {
                Label        = (string)i[0],
                Displacement = new Displacement((double)i[1], (double)i[2], (double)i[3], (double)i[4], (double)i[5], (double)i[6])
            }).ToArray();

            var strss = strs.Select(i => new
            {
                Label = i.Label,
                ptr   = i.IntPt,
                st    = new CauchyStressTensor(i.S11Loc1, i.S22Loc1, i.S33Loc1)
                {
                    S12 = -i.S12Loc1, S21 = -i.S12Loc1
                },                                                                                                  //top stress
                sb = new CauchyStressTensor(i.S11Loc2, i.S22Loc2, i.S33Loc2)
                {
                    S12 = -i.S12Loc2, S21 = -i.S12Loc2
                },                                                                                                  //bot stress
                sm = new CauchyStressTensor(0.5 * i.S11Loc2 + 0.5 * i.S11Loc1, 0.5 * i.S22Loc2 + 0.5 * i.S22Loc1, 0.5 * i.S33Loc2 + 0.5 * i.S33Loc1)
                {
                    S12 = -0.5 * i.S12Loc2 + -0.5 * i.S12Loc1, S21 = -0.5 * i.S12Loc2 + -0.5 * i.S12Loc1
                },                                                                                                                                                                                                                            //mid stress
            }).ToArray();


            var maxAbsErr = Vector.Zero;

            var nodalErrs = new List <double>();
            var elmErrs   = new List <double>();

            var mids = new int[] { 42, 57, 58, 59, 60, 61, 62, 63, 34 };
            var sup  = new int[] { 6, 11, 3, 34, 7, 2, 10 };
            var rest = Enumerable.Range(1, 63).Where(i => !mids.Contains(i) && !sup.Contains(i)).ToArray();

            var abqNodalDisp = disps.ToDictionary(i => i.Label, i => i.Displacement);


            foreach (var key in bfeNodalDisp.Keys)
            {
                var test_bfe = bfeNodalDisp[key];
                var ref_abq  = abqNodalDisp[(key + 1).ToString()];

                if (mids.Contains(key + 1) && !sup.Contains(key + 1))
                {
                    test_bfe.DY = ref_abq.DY;
                    Guid.NewGuid();
                }


                if (key == 60)
                {
                    Guid.NewGuid();
                }

                var d = ref_abq - test_bfe;

                var du = d.Displacements;
                var dr = d.Rotations;

                var ru = du.Length / ref_abq.Displacements.Length;
                var rr = dr.Length / ref_abq.Rotations.Length;

                if (d.Displacements.Length > maxAbsErr.Length)
                {
                    maxAbsErr = d.Displacements;
                }

                nodalErrs.Add(ru);

                var r1 = test_bfe.DX / ref_abq.DX;
                var r2 = test_bfe.DY / ref_abq.DY;
                var r3 = test_bfe.DZ / ref_abq.DZ;
            }


            foreach (var key in bfeNodalDisp.Keys)
            {
                var test_bfe = bfeNodalDisp[key];
                var ref_abq  = abqNodalDisp[(key + 1).ToString()];

                var nde = model.Nodes[key];

                //nde.SetNodalDisplacement(LoadCase.DefaultLoadCase, ref_abq);
            }

            //errs.Sort();


            var midErrs = mids.Select(i => nodalErrs[i - 1]).ToArray();
            var supErrs = sup.Select(i => nodalErrs[i - 1]).ToArray();
            var restErr = rest.Select(i => nodalErrs[i - 1]).ToArray();

            var restMax = restErr.Max();



            //var elm2 = model.Elements[64];


            var p1t = new double[] { 1 / 6.0, 1 / 6.0, 1 };
            var p1m = new double[] { 1 / 6.0, 1 / 6.0, 0 };
            var p1b = new double[] { 1 / 6.0, 1 / 6.0, -1 };

            var p2t = new double[] { 4 / 6.0, 1 / 6.0, 1 };
            var p2m = new double[] { 4 / 6.0, 1 / 6.0, 0 };
            var p2b = new double[] { 4 / 6.0, 1 / 6.0, -1 };

            var p3t = new double[] { 1 / 6.0, 4 / 6.0, 1 };
            var p3m = new double[] { 1 / 6.0, 4 / 6.0, 0 };
            var p3b = new double[] { 1 / 6.0, 4 / 6.0, -1 };


            var problems = new int[] { 82, 84, 86, 88, 90, 92, 94, 96 };
            var trs      = new Matrix(3, 3);

            trs[0, 1] = 1;
            trs[1, 0] = -1;
            trs[2, 2] = 1;



            foreach (var elm in model.Elements)
            {
                if (elm is TriangleElement tri)
                {
                    var trns = tri.GetTransformationManager();


                    var s1t = tri.GetLocalInternalStress(p1t);
                    var s1m = tri.GetLocalInternalStress(p1m);
                    var s1b = tri.GetLocalInternalStress(p1b);

                    var s2t = tri.GetLocalInternalStress(p2t);
                    var s2m = tri.GetLocalInternalStress(p2m);
                    var s2b = tri.GetLocalInternalStress(p2b);

                    var s3t = tri.GetLocalInternalStress(p3t);
                    var s3m = tri.GetLocalInternalStress(p3m);
                    var s3b = tri.GetLocalInternalStress(p3b);

                    if (tri.Label == "94")
                    {
                        Guid.NewGuid();
                    }

                    if (problems.Contains(tri.label.ToInt()))
                    {
                        s1m = CauchyStressTensor.Transform(s1m, trs);
                        s2m = CauchyStressTensor.Transform(s2m, trs);
                        s3m = CauchyStressTensor.Transform(s3m, trs);

                        s1t = CauchyStressTensor.Transform(s1t, trs);
                        s2t = CauchyStressTensor.Transform(s2t, trs);
                        s3t = CauchyStressTensor.Transform(s3t, trs);

                        s1b = CauchyStressTensor.Transform(s1b, trs);
                        s2b = CauchyStressTensor.Transform(s2b, trs);
                        s3b = CauchyStressTensor.Transform(s3b, trs);
                    }

                    var tag = tri.label;

                    var as1 = strss.FirstOrDefault(i => i.ptr == 1 && i.Label == tag);
                    var as2 = strss.FirstOrDefault(i => i.ptr == 2 && i.Label == tag);
                    var as3 = strss.FirstOrDefault(i => i.ptr == 3 && i.Label == tag);

                    var fnc = new Func <CauchyStressTensor, double[]>(i => new double[] { i.S11, i.S22, i.S33, i.S12 });

                    var e1t = ErrorUtil.GetRelativeError(as1.sb, -s1t, fnc);
                    var e1m = ErrorUtil.GetRelativeError(as1.sm, -s1m, fnc);
                    var e1b = ErrorUtil.GetRelativeError(as1.st, -s1b, fnc);

                    var e2t = ErrorUtil.GetRelativeError(as2.sb, -s2t, fnc);
                    var e2m = ErrorUtil.GetRelativeError(as2.sm, -s2m, fnc);
                    var e2b = ErrorUtil.GetRelativeError(as2.st, -s2b, fnc);

                    var e3t = ErrorUtil.GetRelativeError(as3.sb, -s3t, fnc);
                    var e3m = ErrorUtil.GetRelativeError(as3.sm, -s3m, fnc);
                    var e3b = ErrorUtil.GetRelativeError(as3.st, -s3b, fnc);

                    var eMax =
                        CalcUtil.NormInf(e1t, e1b, e2t, e2b, e3t, e3b);
                    //CalcUtil.NormInf(e1m, e2m, e3m);//max abs value

                    if (tri.Label == "51")
                    {
                        Guid.NewGuid();
                    }

                    elmErrs.Add(eMax);
                }
            }



            var maxStress = elmErrs.Max();
            var avg       = elmErrs.Average();

            var tmp = Enumerable.Range(0, elmErrs.Count).Select(i => Tuple.Create(i + 1, elmErrs[i])).OrderBy(i => - i.Item2).ToList();

            elmErrs.Sort();

            Guid.NewGuid();

            /*
             * {//nodal displacements
             *
             *  span.Add("h4").Text("Nodal Displacements");
             *  span.Add("paragraph").Text(string.Format("Validation output for nodal displacements:"));
             *
             *  var da = 1 / 0.0254 * A.GetNodalDisplacement().Displacements; // [inch]
             *  var db = 1 / 0.0254 * B.GetNodalDisplacement().Displacements; // [inch]
             *
             *  var d50 = 1 / 0.0254 * n50.GetNodalDisplacement().Displacements; // [inch]
             *  var d56 = 1 / 0.0254 * n56.GetNodalDisplacement().Displacements; // [inch]
             *  var d57 = 1 / 0.0254 * n57.GetNodalDisplacement().Displacements; // [inch]
             *
             *  var sap2000Da = new Vector(-0.014921, 0.085471, 0.146070); //tbl 7.14
             *  var sap2000Db = new Vector(-0.014834, -0.085475, -0.144533); //tbl 7.14
             *
             *  var abaqusDa = new Vector(-15.4207E-03, 88.2587E-03, 150.910E-03); //node 9
             *  var abaqusDb = new Vector(-15.3246E-03, -88.2629E-03, -148.940E-03); //node 5
             *
             *  var abaqus8 = new Vector(-120.875E-06, 88.3894E-03, -1.01662E-03); //node 8
             *  var abaqus12 = new Vector(15.3931E-03, 89.1206E-03, -149.515E-03); //node 12
             *  var abaqus41 = new Vector(-189.084E-06, 72.3778E-03, -734.918E-06); //node 41
             *
             *
             *  span.Add("paragraph").Text(string.Format("Validation output for nodal displacements:"));
             *
             *  span.Add("paragraph").Text(string.Format("Err at node A (displacement): {0:0.00}%", Util.GetErrorPercent(da, abaqusDa))).AddClosedTag("br"); ;
             *  span.Add("paragraph").Text(string.Format("Err at node B (displacement): {0:0.00}%", Util.GetErrorPercent(db, abaqusDb))).AddClosedTag("br"); ;
             *
             *  span.Add("paragraph").Text(string.Format("Err at node 41 (57) (displacement): {0:0.00}%", Util.GetErrorPercent(d50, abaqus41))).AddClosedTag("br"); ;
             *  span.Add("paragraph").Text(string.Format("Err at node 12 (56) (displacement): {0:0.00}%", Util.GetErrorPercent(d56, abaqus12))).AddClosedTag("br"); ;
             *  span.Add("paragraph").Text(string.Format("Err at node 08 (50) (displacement): {0:0.00}%", Util.GetErrorPercent(d57, abaqus8))).AddClosedTag("br"); ;
             * }
             *
             * {//element stress
             *  {
             *      var e81 = model.Elements[85] as TriangleElement;
             *
             *      var tr = e81.GetTransformationManager();
             *
             *      //t = 1/t;
             *
             *      var am = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 1 / 6.0, 0) * (1 / t));
             *      var at = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 1 / 6.0, +1) * (1 / t));
             *      var ab = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 1 / 6.0, -1) * (1 / t));
             *
             *      var bm = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 4 / 6.0, 1 / 6.0, 0) * (1 / t));
             *      var bt = tr.TransformGlobalToLocal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 4 / 6.0, 1 / 6.0, +1) * (1 / t));
             *      var bb = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 4 / 6.0, 1 / 6.0, -1) * (1 / t));
             *
             *      var cm = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 4 / 6.0, 0) * (1 / t));
             *      var ct = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 4 / 6.0, +1) * (1 / t));
             *      var cb = tr.TransformLocalToGlobal(e81.GetLocalInternalStress(LoadCase.DefaultLoadCase, 1 / 6.0, 4 / 6.0, -1) * (1 / t));
             *
             *      var abacus_at = new CauchyStressTensor() { S11 = 103.814E-03, S22 = 249.185E-03, S12 = 1.03438, S21 = 1.03438 } * -1e9;
             *      var abacus_bt = new CauchyStressTensor() { S11 = -34.7168E-03, S22 = -538.942E-03, S12 = 1.03438, S21 = 1.08243 } * -1e9;
             *      var abacus_ct = new CauchyStressTensor() { S11 = -201.062E-03, S22 = -1.18348, S12 = 747.243E-03, S21 = 747.243E-03 } * -1e9;
             *
             *      var e1 = Util.GetErrorPercent(at, abacus_ct);
             *      var e2 = Util.GetErrorPercent(bt, abacus_at);
             *      var e3 = Util.GetErrorPercent(ct, abacus_bt);
             *
             *      span.Add("paragraph").Text(string.Format("Validation output for element stress:"));
             *
             *      span.Add("paragraph").Text(string.Format("Err at p1 element 81 (stress): {0:0.00}%", e1)).AddClosedTag("br");
             *      span.Add("paragraph").Text(string.Format("Err at p2 element 81 (stress): {0:0.00}%", e2)).AddClosedTag("br");
             *      span.Add("paragraph").Text(string.Format("Err at p3 element 81 (stress): {0:0.00}%", e3)).AddClosedTag("br");
             *
             *      //in abaqus e81 connected to 8-12-41
             *      //in bfe e85 connected to 57-56-50
             *  }
             *
             * }
             */
            return(val);
        }
Beispiel #2
0
        public ValidationResult Validate()
        {
            //build model from Abaqus input file
            string RunningPath = AppDomain.CurrentDomain.BaseDirectory;
            string FileName    = string.Format("Case_03\\Job-10.inp", Path.GetFullPath(Path.Combine(RunningPath, @"..\..\")));
            var    abaqusModel = AbaqusInputFileReader.AbaqusInputToBFE(FileName);

            foreach (var elm in abaqusModel.Elements)
            {
                if (elm is TetrahedronElement hx)
                {
                    hx.Material = Materials.UniformIsotropicMaterial.CreateFromYoungPoisson(210e9, 0.25);
                }
            }

            //comparison
            var val  = new ValidationResult();
            var span = val.Span = new HtmlTag("span");

            val.Title = "Console beam with tetrahedron elements";

            {//report
                span.Add("p").Text("Validation of a simple clamped beam, loaded on the other side.");
                span.Add("h3").Text("Validate with");
                span.Add("paragraph").Text("ABAQUS from Abaqus inc. available from www.simulia.com");
                span.Add("h3").Text("Validate objective");
                span.Add("paragraph").Text("compare nodal displacement for a model consist of tetrahedron elements");

                span.Add("h3").Text("Model Definition");

                /*
                 *
                 * model.MpcElements.Add(rigid);
                 * model.Trace.Listeners.Add(new ConsoleTraceListener());
                 * model.Solve_MPC();
                 *
                 *
                 * var delta = f * l * l * l / (3 * e * I);
                 *
                 * var t = cnt.FirstOrDefault().GetNodalDisplacement();
                 *
                 * var ratio = delta / t.DX;*/

                span.Add("paragraph")
                .Text("Look at `intro.md` file in this folder")
                .AddClosedTag("br");

                span.Add("h3").Text("Validation Result");
//>>>>>>> 8f73e9cf4109d3eac9e87e27ab66e1661bd0a2fd
            }

            abaqusModel.Trace.Listeners.Add(new BriefFiniteElementNet.Common.ConsoleTraceListener());
            new ModelWarningChecker().CheckModel(abaqusModel);


            //Display
            //ModelVisualizer.TestShowVisualizer(model);
            abaqusModel.Solve_MPC();

            var abqlocDic  = new Dictionary <int, Point>();
            var abqdispDic = new Dictionary <int, Displacement>();

            {
                string FileName2 = string.Format("Case_03\\output\\NodalDisp.txt", Path.GetFullPath(Path.Combine(RunningPath, @"..\..\")));

                var lines = System.IO.File.ReadAllLines(FileName2);

                foreach (var ln in lines)
                {
                    var patt1 = @"^(\s+)(\S+)(\s+)(\d+)(\s+)(\S+)(\s+)(\S+)(\s+)(\S+)(\s+)(\S+)(\s+)(\S+)(\s+)(\S+)$";

                    var patt2 = @"^(\s+)(\S+)(\s+)(\d+)(\s+)(\S+)(\s+)(\S+)(\s+)(\S+)(\s+)(\S+)$";

                    var mtch1 = Regex.Match(ln, patt1);

                    var mtch2 = Regex.Match(ln, patt2);

                    if (mtch1.Success)
                    {
                        var id = int.Parse(mtch1.Groups[4].Value);
                        var x  = double.Parse(mtch1.Groups[6].Value);
                        var y  = double.Parse(mtch1.Groups[8].Value);
                        var z  = double.Parse(mtch1.Groups[10].Value);

                        var loc = new Point(x, y, z);

                        abqlocDic[id] = loc;
                    }

                    if (mtch2.Success)
                    {
                        var id = int.Parse(mtch2.Groups[4].Value);
                        var dx = double.Parse(mtch2.Groups[8].Value);
                        var dy = double.Parse(mtch2.Groups[10].Value);
                        var dz = double.Parse(mtch2.Groups[12].Value);

                        var vec = new Vector(dx, dy, dz);

                        abqdispDic[id] = new Displacement(vec, Vector.Zero);
                    }
                }
            }

            //BFE results
            var bFEResults = new Dictionary <int, Displacement>();
            var errors     = new List <double>();

            for (var i = 0; i < abaqusModel.Nodes.Count; i++)
            {
                //bFEResults.Add(i, abaqusModel.Nodes[i].GetNodalDisplacement());
                var bfed = abaqusModel.Nodes[i].GetNodalDisplacement();
                var abqd = abqdispDic[i + 1];// abaqusModel.Nodes[i].GetNodalDisplacement();

                var err = Util.GetAbsError(abqd.Displacements, bfed.Displacements);
                errors.Add(err);
            }

            var max = errors.Max();
            var avg = errors.Average();

            var maxDisp = abqdispDic.Max(i => i.Value.Displacements.Length);
            var avgDisp = abqdispDic.Average(i => i.Value.Displacements.Length);


            span.Add("paragraph").Text(string.Format("Validation output for nodal displacements:")).AddClosedTag("br");

            span.Add("paragraph").Text(string.Format("Maximum ABS Error: {0:g2}", max)).AddClosedTag("br");
            span.Add("paragraph").Text(string.Format("Average AVG Error: {0:g2}", avg)).AddClosedTag("br");

            span.Add("paragraph").Text(string.Format("Maximum displacement: {0:g2} m", maxDisp)).AddClosedTag("br");
            span.Add("paragraph").Text(string.Format("Average displacement: {0:g2} m", avgDisp)).AddClosedTag("br");

            return(val);
        }
Beispiel #3
0
        public ValidationResult Validate()
        {
            //build model from Abaqus input file
            string RunningPath = AppDomain.CurrentDomain.BaseDirectory;
            string FileName    = string.Format("{0}Resources\\Job-10.inp", Path.GetFullPath(Path.Combine(RunningPath, @"..\..\")));
            var    abaqusModel = AbaqusInputFileReader.AbaqusInputToBFE(FileName);
            //comparison
            var val  = new ValidationResult();
            var span = val.Span = new HtmlTag("span");

            val.Title = "Clamped beam with tetrahedron elements";

            {//report
                span.Add("p").Text("Validation of a simple clamped beam, loaded on the other side.");
                span.Add("h3").Text("Validate with");
                span.Add("paragraph").Text("ABAQUS from Abaqus inc. available from www.simulia.com");
                span.Add("h3").Text("Validate objective");
                span.Add("paragraph").Text("compare nodal displacement for a model consist of tetrahedron elements");

                span.Add("h3").Text("Model Definition");

                /*
                 *
                 * model.MpcElements.Add(rigid);
                 * model.Trace.Listeners.Add(new ConsoleTraceListener());
                 * model.Solve_MPC();
                 *
                 *
                 * var delta = f * l * l * l / (3 * e * I);
                 *
                 * var t = cnt.FirstOrDefault().GetNodalDisplacement();
                 *
                 * var ratio = delta / t.DX;*/

                span.Add("paragraph")
                .Text("Look at `intro.md` file in this folder")
                .AddClosedTag("br");

                span.Add("h3").Text("Validation Result");
//>>>>>>> 8f73e9cf4109d3eac9e87e27ab66e1661bd0a2fd
            }

            abaqusModel.Trace.Listeners.Add(new BriefFiniteElementNet.Common.ConsoleTraceListener());
            new ModelWarningChecker().CheckModel(abaqusModel);


            //Display
            //ModelVisualizer.TestShowVisualizer(model);
            abaqusModel.Solve_MPC();

            //List of result displacements from Abaqus
            Dictionary <int, Displacement> abaqusResults = new Dictionary <int, Displacement>();

            abaqusResults.Add(67, new Displacement(-795.863E-09, -288.503E-06, 131.482E-09));
            abaqusResults.Add(169, new Displacement(-434.254E-09, -246.688E-06, -431.229E-09));
            abaqusResults.Add(172, new Displacement(-549.082E-09, -204.906E-06, -491.084E-09));
            abaqusResults.Add(175, new Displacement(-622.334E-09, -164.843E-06, -380.641E-09));
            abaqusResults.Add(178, new Displacement(-602.786E-09, -127.49E-06, -333.347E-09));
            abaqusResults.Add(181, new Displacement(-655.981E-09, -93.343E-06, -441.491E-09));
            abaqusResults.Add(184, new Displacement(-899.89E-09, -63.0811E-06, -65.9539E-09));
            abaqusResults.Add(187, new Displacement(-244.578E-09, -37.7898E-06, -108.451E-09));
            abaqusResults.Add(190, new Displacement(85.1779E-09, -17.7659E-06, -252.828E-09));
            abaqusResults.Add(193, new Displacement(-518.751E-09, -4.53149E-06, -291.286E-09));
            abaqusResults.Add(49, new Displacement(-12.2049E-33, 108.099E-33, 147.403E-33));

            //BFE results
            Dictionary <int, Displacement> bFEResults = new Dictionary <int, Displacement>();

            bFEResults.Add(67, abaqusModel.Nodes[67].GetNodalDisplacement());
            bFEResults.Add(169, abaqusModel.Nodes[169].GetNodalDisplacement());
            bFEResults.Add(172, abaqusModel.Nodes[172].GetNodalDisplacement());
            bFEResults.Add(175, abaqusModel.Nodes[175].GetNodalDisplacement());
            bFEResults.Add(178, abaqusModel.Nodes[178].GetNodalDisplacement());
            bFEResults.Add(181, abaqusModel.Nodes[181].GetNodalDisplacement());
            bFEResults.Add(184, abaqusModel.Nodes[184].GetNodalDisplacement());
            bFEResults.Add(187, abaqusModel.Nodes[187].GetNodalDisplacement());
            bFEResults.Add(190, abaqusModel.Nodes[190].GetNodalDisplacement());
            bFEResults.Add(193, abaqusModel.Nodes[193].GetNodalDisplacement());
            bFEResults.Add(49, abaqusModel.Nodes[49].GetNodalDisplacement());

            //Errors
            List <double> errors = new List <double>();

            foreach (var item in abaqusResults)
            {
                errors.Add(Util.GetErrorPercent(bFEResults[item.Key], item.Value));
            }
            var max = errors.Max();
            var avg = errors.Average();

            span.Add("paragraph").Text(string.Format("Validation output for nodal displacements:(36 nodes)")).AddClosedTag("br");

            span.Add("paragraph").Text(string.Format("Maximum Error: {0:g2}%", max)).AddClosedTag("br");
            span.Add("paragraph").Text(string.Format("Average Error: {0:g2}%", avg)).AddClosedTag("br");

            return(val);
        }