Пример #1
0
        public static Dictionary <string, object> TwoWayShearStressFromMomentAndShear(double M_ux, double M_uy, double V_u, PunchingShearPerimeter PunchingShearPerimeter, string PunchingPerimeterConfiguration,
                                                                                      double gamma_vx, double gamma_vy, bool AllowShearRedistribution = false)
        {
            //Default values
            double v_u_Max = 0;
            double v_u_Min = 0;



            //Calculation logic:
            PunchingShearPerimeter p = PunchingShearPerimeter;

            PunchingPerimeterConfiguration Configuration;
            bool IsValidInputString = Enum.TryParse(p.Configuration, true, out Configuration);

            if (IsValidInputString == false)
            {
                throw new Exception("Failed to convert string. Examples of acceptable values are Interior, EdgeLeft, CornerLeftTop. Please check input");
            }



            ConcreteSectionTwoWayShear sec = new ConcreteSectionTwoWayShear(p.PerimeterData, p.d, p.c_x, p.c_y, Configuration, false);

            //Check gamma's
            double v_uConcentric = sec.GetConcentricShearStress(V_u);
            double phi_v_c       = sec.GetTwoWayStrengthForUnreinforcedConcrete() / 1000.0; //convert to ksi

            if (gamma_vx == 1.0 && v_uConcentric > 0.75 * phi_v_c)
            {
                throw new Exception("gamma_vx cannot be 1.0 if stress due to concentric shear force exceeds 75% of concrete shear strength");
            }
            if (gamma_vy == 1.0 && v_uConcentric > 0.75 * phi_v_c)
            {
                throw new Exception("gamma_vy cannot be 1.0 if stress due to concentric shear force exceeds 75% of concrete shear strength");
            }

            ResultOfShearStressDueToMoment result = sec.GetCombinedShearStressDueToMomementAndShear(M_ux, M_uy, V_u, gamma_vx, gamma_vy, AllowShearRedistribution);

            v_u_Max  = result.v_max;
            v_u_Min  = result.v_min;
            gamma_vx = result.gamma_vx;
            gamma_vy = result.gamma_vy;

            return(new Dictionary <string, object>
            {
                { "v_u_Max", v_u_Max }
                , { "v_u_Min", v_u_Min }
                , { "gamma_vx", gamma_vx }
                , { "gamma_vy", gamma_vy }
            });
        }
Пример #2
0
        /// <summary>
        /// Shear stress due to unbalanced moment going into the column-slab intersection through varying shear distribution per 421.1R-13 section 8.4.4.2.3
        /// </summary>
        /// <param name="M_ux_bar">Moment around X axis normal to slab edge or in the direction of corner bisecting ray. This moment must be reported at punching perimeter centoid.</param>
        /// <param name="M_uy_bar">Moment around Y axis parallel to slab edge or in the direction normal to corner bisecting ray. This moment must be reported at punching perimeter centoid.</param>
        /// <param name="V_u">Punching shear force</param>
        /// <param name="gamma_v_x">Portion of unbalanced moment around X axis (normal to slab edge) to be transferred by shear</param>
        /// <param name="gamma_v_y">Portion of unbalanced moment around Y axis (parallel to slab edge or in the direction normal to corner bisecting ray) to be transferred by shear</param>
        /// <param name="AllowSinglePointStressRedistribution">Determines if the reduction of peak stress if the maximum stress occurs at a single point (per ACI 421.1R-13)</param>
        /// <returns>Maximum and minimum stress (maximum is additive to the concentic shear) </returns>
        public ResultOfShearStressDueToMoment GetCombinedShearStressDueToMomementAndShear(double M_ux_bar, double M_uy_bar,
                                                                                          double V_u, double gamma_v_x = 0, double gamma_v_y = 0, bool AllowSinglePointStressRedistribution = false)
        {
            //ColumnCenter = GetColumnCenter();



            double y_O     = GetPunchingPerimeterEccentricityY();
            double x_O     = GetPunchingPerimeterEccentricityX();
            double M_x_bar = M_ux_bar; //+ V_u * y_O; Ignore beneficial effects of shear force eccentricity because for high-shear low moment cases the moment reverses
            double M_y_bar = M_uy_bar; //+V_u * x_O; Ignore beneficial effects of shear force eccentricity because for high-shear low moment cases the moment reverses



            //calculate gammas


            //double gamma_vx = Get_gamma_vx(l_x, l_y);
            //double gamma_vy = Get_gamma_vy(l_x, l_y);


            double gamma_vx;
            double gamma_vy;

            if (gamma_v_x > 1.0 || gamma_v_y > 1)
            {
                throw new Exception("Invalid value for gamma_v_x or gamma_v_y. One of these values is more than 1.0");
            }
            else if (gamma_v_x < 0.0 || gamma_v_y < 0.0)
            {
                throw new Exception("Invalid value for gamma_v_x or gamma_v_y. One of these values less than 0.0");
            }
            else
            {
                //gamma_vx = Get_gamma_vx(l_x, l_y);
                //gamma_vy = Get_gamma_vy(l_x, l_y);
                gamma_vx = gamma_v_x;
                gamma_vy = gamma_v_y;
            }



            List <double> shearStressValues = new List <double>();

            //Find cutoff points for redistribution case
            var PointsI = RotatedSegments.Select(seg => seg.PointI).ToList();
            var PointsJ = RotatedSegments.Select(seg => seg.PointJ).ToList();

            PointsI.AddRange(PointsJ);

            //List<Point2D> UniquePoints = PointsI.Distinct().ToList();

            List <Point2D> UniquePoints = new List <Point2D>();

            foreach (var p in PointsI)
            {
                if (!UniquePoints.Contains(p))
                {
                    UniquePoints.Add(p);
                }
            }

            double YMax = UniquePoints.Max(p => p.Y);
            double YMin = UniquePoints.Min(p => p.Y);

            double XMax = UniquePoints.Max(p => p.X);
            double XMin = UniquePoints.Min(p => p.X);

            bool   IsSinglePointY = false;
            double YMaxCutoff     = 0.0;
            double YMinCutoff     = 0.0;

            bool   IsSinglePointX = false;
            double XMaxCutoff     = 0.0;
            double XMinCutoff     = 0.0;


            if (UniquePoints.Where(p => p.Y == YMax).ToList().Count == 1)
            {
                YMaxCutoff = YMax - 0.4 * d;
            }
            else
            {
                YMaxCutoff = YMax;
            }

            if (UniquePoints.Where(p => p.Y == YMin).ToList().Count == 1)
            {
                YMinCutoff = YMin + 0.4 * d;
            }
            else
            {
                YMinCutoff = YMin;
            }

            if (UniquePoints.Where(p => p.X == XMax).ToList().Count == 1)
            {
                XMaxCutoff = XMax - 0.4 * d;
            }
            else
            {
                XMaxCutoff = XMax;
            }

            if (UniquePoints.Where(p => p.X == XMin).ToList().Count == 1)
            {
                XMinCutoff = XMin + 0.4 * d;
            }
            else
            {
                XMinCutoff = XMin;
            }
            //double x = Math.Abs(point.X - PunchingPerimeterCentroid.X);
            //double y = Math.Abs(point.Y - PunchingPerimeterCentroid.Y);

            foreach (var p in UniquePoints)
            {
                double X = 0.0;
                double Y = 0.0;

                if (AllowSinglePointStressRedistribution == false)
                {
                    X = p.X;
                    Y = p.Y;
                }
                else
                {
                    X = p.X > XMaxCutoff ? XMaxCutoff : p.X;
                    X = p.X < XMinCutoff ? XMinCutoff : p.Y;

                    Y = p.Y > YMaxCutoff ? YMaxCutoff : p.Y;
                    Y = p.Y < YMinCutoff ? YMinCutoff : p.Y;
                }

                //Calculate    properties with respect to Principal axis
                double J_x = GetJx(RotatedSegments);   // d times product of inertia of assumed shear critical section about PRINCIPAL axes x
                double J_y = GetJy(RotatedSegments);   // d times product of inertia of assumed shear critical section about PRINCIPAL axes y

                //Adjust moments for principal axis orientation (ACCOUNTING FOR THE LOCAL AXIS PER ACI 421)
                //Follow Fig B.1 (a) (b) and (c) for sign convention
                double M_y;
                double M_x;
                if (thetaRad != 0)
                {
                    M_y = M_x_bar * Math.Sin(thetaRad) + M_y_bar * Math.Cos(thetaRad);
                    M_x = M_x_bar * Math.Cos(thetaRad) - M_y_bar * Math.Sin(thetaRad);
                }
                else
                {
                    M_y = M_y_bar;
                    M_x = M_x_bar;
                }

                double v_u_I = GetShearStressFromMomentAndShear(M_x, M_y, V_u, J_x, J_y, A_c, gamma_vx, gamma_vy, X, Y);
                shearStressValues.Add(v_u_I);
            }

            double v_min = shearStressValues.Min();
            double v_max = shearStressValues.Max();

            ResultOfShearStressDueToMoment result = new ResultOfShearStressDueToMoment(v_max, v_min, gamma_vx, gamma_vy);

            return(result);
        }