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