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