/// <summary> /// Funkcja zwraca wartość krytycznej osiowej siły ściskającej dla przekroju /// </summary> /// <param name="situation">Określa sytuację obliczeniową dla której przeprowadzone zostaną obliczenia</param> /// <returns>Wartość krytycznej osiowej siły ściskającej dla przekroju w kN</returns> public double ULS_SilaKrytycznaSciskajaca(DesignSituation situation) { double gammaC, gammaS; if (situation == DesignSituation.Accidental) { gammaC = 1.2; gammaS = 1.0; } else { gammaC = 1.5; gammaS = 1.15; } double alfaCC = 0.85; double lambda, eta; double fck = CurrentConcrete.fck; double epsilon = CurrentConcrete.epsilon_cu2; double Es = CurrentSteel.Es; double fyd = CurrentSteel.fyk / gammaS; if (fck <= 50) { eta = 1; lambda = 0.8; } else { eta = 1.0 - ((fck - 50) / 200); lambda = 0.8 - ((fck - 50) / 400); } return(((AcTotal * CurrentConcrete.fck / gammaC * alfaCC) / Forcefactor) + (AsTotal * CurrentSteel.SigmaS(epsilon, fyd)) / Forcefactor); }
public override double ULS_MomentKrytyczny(double NEd, DesignSituation situation) { double gammaC, gammaS; if (situation == DesignSituation.Accidental) { gammaC = 1.2; gammaS = 1.0; } else { gammaC = 1.5; gammaS = 1.15; } double alfaCC = 0.85; double D = this.D / 1000; // w metrach double a = A / 1000; // w metrach double Ab = this.Ab / 1000000; // w metrach kwadratowych double fiB = FiB / 1000; int noB = NoB; double fyk = CurrentSteel.fyk; // w MPa double Es = CurrentSteel.Es; // w MPa //double Ecm = currentConcrete.Ecm; // w MPa double fck = CurrentConcrete.fck; // w MPa double fcd = fck / gammaC * alfaCC; // w MPa double fyd = fyk / gammaS; double n = CurrentConcrete.n; double eps = 0.00001; double epsilonC2 = CurrentConcrete.epsilon_c2; double epsilonCU2 = CurrentConcrete.epsilon_cu2; double x1 = 0; double x2 = 100000 * D; double d; //wysokość użyteczna, zależna od wysokości strefy ściskanej x double As; //pole zbrojenia rozciąganego, zależne od wysokości strefy ściskanej x //obliczenia parametrów geometryczny dla przekroju okragłego double R = D / 2; //promień przekroju double rAs = R - a; //promień okręgu po którym rozmieszczone są pręty double[] di; //tablica z odległościami prętów od górnej krawędzi przekroju (ściskanej) bool[] ki; //tablica okreslajaca czy dany pret jest rozciagany (true), ściskany(false) di = RzednePretowUpEdge(); double Pc = 0; double PAs1 = 0; double PAs2 = 0; double x, range; int k = 100; double NRd = 0; //d = di.Max(); NEd = NEd / 1000; do { x = (x1 + x2) / 2; Pc = 0; //określenie wysokości użytecznej d która jest zależna od x As = 0; // sumaryczne pole powierzchni zbrojenia rozciaganego double Asd = 0; //moment statyczny zbrojenia rozciaganego wzgledem gornej krawedzi przekroju ki = CzyPretRozciagany(x); for (int i = 0; i < noB; i++) { Asd += Ab * Convert.ToUInt32(ki[i]) * di[i]; As += Ab * Convert.ToUInt32(ki[i]); } if (As == 0) { d = D; } else { d = Asd / As; //wysokość uzyteczna znana } range = Math.Min(x, D); for (int i = 0; i < k; i++) { double ri = d - range / k * (i + 0.5); double riT = d - range / k * (i); double riB = d - range / k * (i + 1); Pc += CurrentConcrete.SigmaC(fcd, EpsilonR(ri, x, d)) * (DlugoscOK(d - riT) + DlugoscOK(d - riB)) / 2 * range / k; } double[] PAsi = new double[noB]; PAs1 = 0; PAs2 = 0; for (int i = 0; i < noB; i++) { PAsi[i] = Ab * CurrentSteel.SigmaS(EpsilonR(d - di[i], x, d), fyd); if (!ki[i]) { PAs2 += PAsi[i]; } else { PAs1 += Ab * CurrentSteel.SigmaS(EpsilonR(0, x, d), fyd); } } NRd = Pc + PAs1 + PAs2; if (NRd >= NEd) { x2 = x; } else { x1 = x; } } while (Math.Abs(x1 - x2) > eps); double Pcz = 0; for (int i = 0; i < k; i++) { double ri = d - range / k * (i + 0.5); double sC = CurrentConcrete.SigmaC(fcd, EpsilonR(ri, x, d)); Pcz += sC * DlugoscOK(d - ri) * (range / k) * ri; } double[] MAs2i = new double[noB]; double MAs2 = 0; for (int i = 0; i < noB; i++) { MAs2i[i] = Convert.ToUInt32(!ki[i]) * Ab * CurrentSteel.SigmaS(EpsilonR(d - di[i], x, d), fyd) * (d - di[i]); MAs2 += MAs2i[i]; } double Ms1 = Pcz + MAs2; double MRd = Ms1 - NEd * (d - 0.5 * D); return(MRd * 1000); }
public override double ULS_MomentKrytyczny(double NEd, DesignSituation situation) { double gammaC, gammaS; if (situation == DesignSituation.Accidental) { gammaC = 1.2; gammaS = 1.0; } else { gammaC = 1.5; gammaS = 1.15; } double alfaCC = 0.85; double h = H / 1000; // w metrach double b = B / 1000; // w metrach double a1 = A1 / 1000; // w metrach double a2 = A2 / 1000; // w metrach double As1 = this.As1 / 1000000; // w metrach kwadratowych double As2 = this.As2 / 1000000; // w metrach kwadratowych double fyk = CurrentSteel.fyk; // w MPa double Es = CurrentSteel.Es; // w MPa //double Ecm = currentConcrete.Ecm; // w MPa double fck = CurrentConcrete.fck; // w MPa double fcd = fck / gammaC * alfaCC; // w MPa double fyd = fyk / gammaS; double n = CurrentConcrete.n; double eps = 0.00001; double d = h - a1; double epsilonC2 = CurrentConcrete.epsilon_c2; double epsilonCU2 = CurrentConcrete.epsilon_cu2; double x1 = 0; double x2 = 100000 * h; double rAs2 = d - a2; double Pc = 0; double x, range; int k = 100; double NRd = 0; NEd = NEd / 1000; do { x = (x1 + x2) / 2; Pc = 0; range = Math.Min(x, h); for (int i = 0; i < k; i++) { double ri = d - range / k * (i + 0.5); Pc += CurrentConcrete.SigmaC(fcd, EpsilonR(ri, x, d)) * b * range / k; } double PAs1 = As1 * CurrentSteel.SigmaS(EpsilonR(0, x, d), fyd); double PAs2 = As2 * CurrentSteel.SigmaS(EpsilonR(d - a2, x, d), fyd); NRd = Pc + PAs2 + PAs1; if (NRd >= NEd) { x2 = x; } else { x1 = x; } } while (Math.Abs(NEd - NRd) > eps); double Pcz = 0; for (int i = 0; i < k; i++) { double ri = d - range / k * (i + 0.5); double sC = CurrentConcrete.SigmaC(fcd, EpsilonR(ri, x, d)); Pcz += sC * b * (range / k) * ri; } double MAs2 = As2 * CurrentSteel.SigmaS(EpsilonR(d - a2, x, d), fyd) * (d - a2); double Ms1 = Pcz + MAs2; double MRd = Ms1 - NEd * (d - 0.5 * h); return(MRd * 1000); }