示例#1
0
 public virtual void InitValidations(double b, double h, IBetonModel beton, ReinforcementTypeModelEC armatura, double d1, double d2)
 {
     if (b <= 0)
     {
         throw new Exception("b must be greater 0");
     }
     if (h < 0)
     {
         throw new Exception("h must be greater or equal to 0");
     }
     if (d1 <= 0)
     {
         throw new Exception("d1 must be greater 0");
     }
     if (d2 <= 0)
     {
         throw new Exception("d2 must be greater 0");
     }
     if (2 * d1 >= h && h != 0)
     {
         throw new Exception("2 x d1 must be smoller then h");
     }
     if (beton == null)
     {
         throw new Exception("Beton not defined!");
     }
     if (armatura == null)
     {
         throw new Exception("Armatura not defined!");
     }
 }
        public void Calc()
        {
            double Msd = forces.Msd;
            double Nu  = forces.Nsd;
            double Mu;
            //double Du = 0;
            double b_eff = geometry.b_eff;
            double b_w   = geometry.b;   // sirina donje ivice grede
            double h_f   = geometry.h_f; //debljina ploce
            double d     = geometry.d;   //visina preseka - d1
            double s;
            double δ = h_f / d;

            IBetonModel beton = material.beton;

            IReinforcementTypeModel arm = material.armatura;
            double s_min = 0, s_max = coeffService.GetNew(material.beton.εcu2, -0.7).ξ;
            var    kof1 = coeffService.GetNew();
            var    kof2 = coeffService.GetNew();

            bool done = false;

            s = δ;
            var x = 0.0;

            //var μSd = (Msd * 100) / (b_eff * Math.Pow(d, 2) * beton.fcd / 10);
            //var kof_test = coeffService.GetByμ(μSd);
            //if (kof_test.ξ <= s)
            //{
            //    var kof = kof_test;
            //    x = kof.ξ * d;
            //    Mu = Msd;
            //}
            do
            {
                i++;
                s = s_min + (s_max - s_min) / 2;
                kof1.SetByξ(s);
                x = s * d;
                var Du1 = kof1.αv * b_eff * s * d * beton.fcd / 10;
                var zb1 = d * (1 - kof1.ka * s);

                double Du2 = 0;
                double zb2 = 0;

                var Ebd = ((s - δ) / s) * kof1.εc;

                ///ako je napon u betonu manji odnosno gegativan
                ///od nule znaci da ima pritiska
                ///u suprotnom ostaje zatezanje ne uzimamo u obzir kada je
                ///beton u pitanju
                if (Ebd <= 0)
                {
                    kof2.SetByEcEs1(Ebd, material.armatura.eps_ud);

                    Du2 = kof2.αv * (b_eff - b_w) * (x - h_f) * beton.fcd / 10;
                    zb2 = d - h_f - kof2.ka * (x - h_f);
                }



                //if (s_min * geometry.d < geometry.h_f)
                //{
                //    Mu = Msd;
                //    break;
                //}
                Mu = Du1 * zb1 / 100 - Du2 * zb2 / 100;

                if (i > 200)
                {
                    break;
                }

                if (Mu / Msd < 1.01)
                {
                    s_min = s;
                }
                if (Math.Round(Mu / Msd, 2) > 1.01)
                {
                    s_max = s;
                }
                if (Math.Round(Mu / Msd, 2) == 1.01)
                {
                    done = true;
                    break;
                }
            } while (!done);

            if (i > 200 && done == false)
            {
                throw new Exception($"Can't calculate! {i}");
            }
            var bi = Mu * 100 / (kof1.μRd * Math.Pow(d, 2) * beton.fcd / 10);


            model = new BendingRectangularCrossSectionEC2
                    (
                new ForcesBendingAndCompressison(Mu, Nu),
                new ElementGeometry
            {
                b    = bi > geometry.b_eff ? geometry.b_eff : bi,
                h    = geometry.h,
                d1   = geometry.d1,
                d2   = geometry.d2,
                unit = UnitDimesionType.cm,
            },
                new Material {
                armatura = arm, beton = beton
            }
                    );
            ;
        }