示例#1
0
        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);
        }