/// <summary> /// Returns the list of lines for calculation of punching shear perimeter properties /// </summary> /// <param name="Configuration">Configuration of punching perimeter</param> /// <param name="c_x">Column dimension parallel to X-axis</param> /// <param name="c_y">Column dimension parallel to Y-axis</param> /// <param name="d"> Effective depth of punching shear perimeter</param> /// <param name="b_xCant">Slab cantilever extension beyond column face (along axis X)</param> /// <param name="b_yCant">Slab cantilever extension beyond column face (along axis Y)</param> /// <returns></returns> public PunchingPerimeterData GetPerimeterData(PunchingPerimeterConfiguration Configuration, double c_x, double c_y, double d, double b_xCant, double b_yCant, Point2D ColumnCenter) { List <PerimeterLineSegment> PerimeterSegments = GetPerimeterSegments(Configuration, c_x, c_y, d, b_xCant, b_yCant); return(new PunchingPerimeterData(PerimeterSegments, ColumnCenter)); }
/// <summary> /// Two-way shear section /// </summary> /// <param name="Material">Concrete material</param> /// <param name="Segments">Shear perimeter segments</param> /// <param name="d">Effective slab section</param> /// <param name="b_x">Column dimension (normal to slab edge for edge column)</param> /// <param name="b_y">Column dimension (parallel to slab edge for edge column)</param> /// <param name="AtColumnFace">Identifies if the section is adjacent to column face (typical) or away from column face (as is the case with shear studs away from the face)</param> /// <param name="ColumnType">Identifies if the column is located at the interior, slab edge, or slab corner</param> public ConcreteSectionTwoWayShear(IConcreteMaterial Material, List <PerimeterLineSegment> Segments, double d, double b_x, double b_y, bool AtColumnFace, PunchingPerimeterConfiguration ColumnType, Point2D ColumnCenter) { this.Material = Material; this.Segments = Segments; this.d = d; this.b_x = b_x; this.b_y = b_y; this.AtColumnFace = AtColumnFace; this.ColumnType = ColumnType; this.ColumnCenter = ColumnCenter; }
/// <summary> /// Two-way shear section /// </summary> /// <param name="Material">Concrete material</param> /// <param name="Segments">Shear perimeter segments</param> /// <param name="d">Effective slab section</param> /// <param name="b_x">Column dimension (normal to slab edge for edge column)</param> /// <param name="b_y">Column dimension (parallel to slab edge for edge column)</param> /// <param name="AtColumnFace">Identifies if the section is adjacent to column face (typical) or away from column face (as is the case with shear studs away from the face)</param> /// <param name="ColumnType">Identifies if the column is located at the interior, slab edge, or slab corner</param> public ConcreteSectionTwoWayShear(IConcreteMaterial Material, List<PerimeterLineSegment> Segments, double d, double b_x, double b_y, bool AtColumnFace, PunchingPerimeterConfiguration ColumnType, Point2D ColumnCenter) { this.Material =Material ; this.Segments =Segments ; this.d =d ; this.b_x =b_x ; this.b_y =b_y ; this.AtColumnFace=AtColumnFace ; this.ColumnType = ColumnType ; this.ColumnCenter = ColumnCenter; }
/// <summary> /// Two-way shear section (constructor used for stress calculation) /// </summary> /// <param name="Material">Concrete material</param> /// <param name="Perimeter">Shear perimeter</param> /// <param name="d">Effective slab section</param> /// <param name="c_x">Column dimension (along X axis)</param> /// <param name="c_y">Column dimension (along Y axis)</param> /// <param name="ColumnType">Identifies if the column is located at the interior, slab edge, or slab corner</param> /// <param name="AtColumnFace">Identifies if the section is adjacent to column face (typical) or away from column face (as is the case with shear studs away from the face)</param> public ConcreteSectionTwoWayShear(IConcreteMaterial Material, PunchingPerimeterData Perimeter, double d, double c_x, double c_y, PunchingPerimeterConfiguration ColumnType, bool AtColumnFace = true) { this.Material = Material; this.Segments = Perimeter.Segments; this.d = d; this.c_x = c_x; this.c_y = c_y; this.ColumnType = ColumnType; this.ColumnCenter = Perimeter.ColumnCentroid; this.AtColumnFace = AtColumnFace; cen = PunchingPerimeterCentroid; CalculatePerimeterProperties(); }
/// <summary> /// Returns the list of lines for calculation of punching shear perimeter properties /// </summary> /// <param name="Configuration">Configuration of punching perimeter</param> /// <param name="c_x">Column dimension parallel to X-axis</param> /// <param name="c_y">Column dimension parallel to Y-axis</param> /// <param name="d"> Effective depth of punching shear perimeter</param> /// <returns></returns> public List<PerimeterLineSegment> GetPerimeterSegments(PunchingPerimeterConfiguration Configuration, double c_x, double c_y, double d) { double b_x; // punching perimeter dimension perpendicular to free edge double b_y; // punching perimeter dimension parallel to free edge Point2D p1 =null; Point2D p2 =null; Point2D p3 =null; Point2D p4 = null; if (Configuration == PunchingPerimeterConfiguration.Interior) { b_x = c_x + d; b_y = c_y + d; p1 = new Point2D(-b_x / 2.0, -b_y / 2.0); p2 = new Point2D(-b_x / 2.0, b_y / 2.0); p3 = new Point2D(b_x / 2.0, b_y / 2.0); p4 = new Point2D(b_x / 2.0, -b_y / 2.0); } else if (Configuration == PunchingPerimeterConfiguration.EdgeLeft || Configuration == PunchingPerimeterConfiguration.EdgeRight) { b_x = c_x + d / 2.0; b_y = c_y + d; p1 = new Point2D(-b_x / 2.0, -b_y / 2.0); p2 = new Point2D(-b_x / 2.0, b_y / 2.0); p3 = new Point2D(b_x / 2.0, b_y / 2.0); p4 = new Point2D(b_x / 2.0, -b_y / 2.0); } else if (Configuration == PunchingPerimeterConfiguration.EdgeTop || Configuration == PunchingPerimeterConfiguration.EdgeBottom) { b_x = c_x + d; b_y = c_y + d / 2.0; } else { b_x = c_x + d / 2.0; b_y = c_y + d/2.0; } p1 = new Point2D(-b_x / 2.0, -b_y / 2.0); p2 = new Point2D(-b_x / 2.0, b_y / 2.0); p3 = new Point2D(b_x / 2.0, b_y / 2.0); p4 = new Point2D(b_x / 2.0, -b_y / 2.0); switch (Configuration) { case PunchingPerimeterConfiguration.Interior: return new List<PerimeterLineSegment>() { new PerimeterLineSegment(p1,p2 ), new PerimeterLineSegment(p2,p3 ), new PerimeterLineSegment(p3,p4 ), new PerimeterLineSegment(p4,p1 ) }; break; case PunchingPerimeterConfiguration.EdgeLeft: return new List<PerimeterLineSegment>() { new PerimeterLineSegment(p1,p4 ), new PerimeterLineSegment(p4,p3 ), new PerimeterLineSegment(p3,p2 ), }; case PunchingPerimeterConfiguration.EdgeRight: return new List<PerimeterLineSegment>() { new PerimeterLineSegment(p4,p1 ), new PerimeterLineSegment(p1,p2 ), new PerimeterLineSegment(p2,p3 ), }; break; case PunchingPerimeterConfiguration.EdgeTop: return new List<PerimeterLineSegment>() { new PerimeterLineSegment(p2,p1 ), new PerimeterLineSegment(p1,p4 ), new PerimeterLineSegment(p4,p3 ), }; break; case PunchingPerimeterConfiguration.EdgeBottom: return new List<PerimeterLineSegment>() { new PerimeterLineSegment(p1,p2 ), new PerimeterLineSegment(p2,p3 ), new PerimeterLineSegment(p3,p4 ), }; break; default: throw new Exception("Unrecognized punching perimeter column type"); break; throw new Exception("Corner cases were not implemented"); } }
/// <summary> /// Returns the list of lines for calculation of punching shear perimeter properties /// </summary> /// <param name="Configuration">Configuration of punching perimeter</param> /// <param name="c_x">Column dimension parallel to X-axis</param> /// <param name="c_y">Column dimension parallel to Y-axis</param> /// <param name="d"> Effective depth of punching shear perimeter</param> /// <returns></returns> public List <PerimeterLineSegment> GetPerimeterSegments(PunchingPerimeterConfiguration Configuration, double c_x, double c_y, double d) { double b_x; // punching perimeter dimension perpendicular to free edge double b_y; // punching perimeter dimension parallel to free edge Point2D p1 = null; Point2D p2 = null; Point2D p3 = null; Point2D p4 = null; if (Configuration == PunchingPerimeterConfiguration.Interior) { b_x = c_x + d; b_y = c_y + d; p1 = new Point2D(-b_x / 2.0, -b_y / 2.0); p2 = new Point2D(-b_x / 2.0, b_y / 2.0); p3 = new Point2D(b_x / 2.0, b_y / 2.0); p4 = new Point2D(b_x / 2.0, -b_y / 2.0); } else if (Configuration == PunchingPerimeterConfiguration.EdgeLeft || Configuration == PunchingPerimeterConfiguration.EdgeRight) { b_x = c_x + d / 2.0; b_y = c_y + d; p1 = new Point2D(-b_x / 2.0, -b_y / 2.0); p2 = new Point2D(-b_x / 2.0, b_y / 2.0); p3 = new Point2D(b_x / 2.0, b_y / 2.0); p4 = new Point2D(b_x / 2.0, -b_y / 2.0); } else if (Configuration == PunchingPerimeterConfiguration.EdgeTop || Configuration == PunchingPerimeterConfiguration.EdgeBottom) { b_x = c_x + d; b_y = c_y + d / 2.0; } else { b_x = c_x + d / 2.0; b_y = c_y + d / 2.0; } p1 = new Point2D(-b_x / 2.0, -b_y / 2.0); p2 = new Point2D(-b_x / 2.0, b_y / 2.0); p3 = new Point2D(b_x / 2.0, b_y / 2.0); p4 = new Point2D(b_x / 2.0, -b_y / 2.0); switch (Configuration) { case PunchingPerimeterConfiguration.Interior: return(new List <PerimeterLineSegment>() { new PerimeterLineSegment(p1, p2), new PerimeterLineSegment(p2, p3), new PerimeterLineSegment(p3, p4), new PerimeterLineSegment(p4, p1) }); break; case PunchingPerimeterConfiguration.EdgeLeft: return(new List <PerimeterLineSegment>() { new PerimeterLineSegment(p1, p4), new PerimeterLineSegment(p4, p3), new PerimeterLineSegment(p3, p2), }); case PunchingPerimeterConfiguration.EdgeRight: return(new List <PerimeterLineSegment>() { new PerimeterLineSegment(p4, p1), new PerimeterLineSegment(p1, p2), new PerimeterLineSegment(p2, p3), }); break; case PunchingPerimeterConfiguration.EdgeTop: return(new List <PerimeterLineSegment>() { new PerimeterLineSegment(p2, p1), new PerimeterLineSegment(p1, p4), new PerimeterLineSegment(p4, p3), }); break; case PunchingPerimeterConfiguration.EdgeBottom: return(new List <PerimeterLineSegment>() { new PerimeterLineSegment(p1, p2), new PerimeterLineSegment(p2, p3), new PerimeterLineSegment(p3, p4), }); break; default: throw new Exception("Unrecognized punching perimeter column type"); break; throw new Exception("Corner cases were not implemented"); } }
List <PerimeterLineSegment> GetPerimeterSegments(PunchingPerimeterConfiguration Configuration, double c_x, double c_y, double d, double b_xCant = 0, double b_yCant = 0) { double b_x; // punching perimeter dimension perpendicular to free edge double b_y; // punching perimeter dimension parallel to free edge Point2D p1 = null; Point2D p2 = null; Point2D p3 = null; Point2D p4 = null; switch (Configuration) { case PunchingPerimeterConfiguration.Interior: b_x = c_x + d; b_y = c_y + d; p1 = new Point2D(-b_x / 2.0, -b_y / 2.0); p2 = new Point2D(-b_x / 2.0, b_y / 2.0); p3 = new Point2D(b_x / 2.0, b_y / 2.0); p4 = new Point2D(b_x / 2.0, -b_y / 2.0); break; case PunchingPerimeterConfiguration.EdgeLeft: b_y = c_y + d; p1 = new Point2D(-c_x / 2.0 - b_xCant, -b_y / 2.0); p2 = new Point2D(-c_x / 2.0 - b_xCant, b_y / 2.0); p3 = new Point2D(c_x / 2.0 + d / 2.0, b_y / 2.0); p4 = new Point2D(c_x / 2.0 + d / 2.0, -b_y / 2.0); break; case PunchingPerimeterConfiguration.EdgeRight: b_y = c_y + d; p1 = new Point2D(-c_x / 2.0 - d / 2.0, -b_y / 2.0); p2 = new Point2D(-c_x / 2.0 - d / 2.0, b_y / 2.0); p3 = new Point2D(c_x / 2.0 + b_xCant, b_y / 2.0); p4 = new Point2D(c_x / 2.0 + b_xCant, -b_y / 2.0); break; case PunchingPerimeterConfiguration.EdgeTop: b_x = c_x + d; p1 = new Point2D(-b_x / 2.0, -c_y / 2.0 - d / 2.0); p2 = new Point2D(-b_x / 2.0, c_y / 2.0 + b_yCant); p3 = new Point2D(b_x / 2.0, c_y / 2.0 + b_yCant); p4 = new Point2D(b_x / 2.0, -c_y / 2.0 - d / 2.0); break; case PunchingPerimeterConfiguration.EdgeBottom: b_x = c_x + d; p1 = new Point2D(-b_x / 2.0, -c_y / 2.0 - b_yCant); p2 = new Point2D(-b_x / 2.0, c_y / 2.0 + d / 2.0); p3 = new Point2D(b_x / 2.0, c_y / 2.0 + d / 2.0); p4 = new Point2D(b_x / 2.0, -c_y / 2.0 - b_yCant); break; case PunchingPerimeterConfiguration.CornerLeftTop: p1 = new Point2D(-c_x / 2.0 - b_xCant, -c_y / 2.0 - d / 2.0); p2 = new Point2D(-c_x / 2.0 - b_xCant, c_y / 2.0 + b_yCant); p3 = new Point2D(c_x / 2.0 + d / 2.0, c_y / 2.0 + b_yCant); p4 = new Point2D(c_x / 2.0 + d / 2.0, -c_y / 2.0 - d / 2.0); break; case PunchingPerimeterConfiguration.CornerRightTop: p1 = new Point2D(-c_x / 2.0 - d / 2.0, -c_y / 2.0 - d / 2.0); p2 = new Point2D(-c_x / 2.0 - d / 2.0, c_y / 2.0 + b_yCant); p3 = new Point2D(c_x / 2.0 + b_xCant, c_y / 2.0 + b_yCant); p4 = new Point2D(c_x / 2.0 + b_xCant, -c_y / 2.0 - d / 2.0); break; case PunchingPerimeterConfiguration.CornerRightBottom: p1 = new Point2D(-c_x / 2.0 - d / 2.0, -c_y / 2.0 - b_yCant); p2 = new Point2D(-c_x / 2.0 - d / 2.0, c_y / 2.0 + d / 2.0); p3 = new Point2D(c_x / 2.0 + b_xCant, c_y / 2.0 + d / 2.0); p4 = new Point2D(c_x / 2.0 + b_xCant, -c_y / 2.0 - b_yCant); break; case PunchingPerimeterConfiguration.CornerLeftBottom: p1 = new Point2D(-c_x / 2.0 - b_xCant, -c_y / 2.0 - b_yCant); p2 = new Point2D(-c_x / 2.0 - b_xCant, +c_y / 2.0 + d / 2.0); p3 = new Point2D(c_x / 2.0 + d / 2.0, c_y / 2.0 + b_yCant); p4 = new Point2D(c_x / 2.0 + d / 2.0, -c_y / 2.0 - b_yCant); break; default: break; } switch (Configuration) { case PunchingPerimeterConfiguration.Interior: return(new List <PerimeterLineSegment>() { new PerimeterLineSegment(p1, p2), new PerimeterLineSegment(p2, p3), new PerimeterLineSegment(p3, p4), new PerimeterLineSegment(p4, p1) }); break; case PunchingPerimeterConfiguration.EdgeLeft: return(new List <PerimeterLineSegment>() { new PerimeterLineSegment(p1, p4), new PerimeterLineSegment(p4, p3), new PerimeterLineSegment(p3, p2), }); case PunchingPerimeterConfiguration.EdgeRight: return(new List <PerimeterLineSegment>() { new PerimeterLineSegment(p4, p1), new PerimeterLineSegment(p1, p2), new PerimeterLineSegment(p2, p3), }); break; case PunchingPerimeterConfiguration.EdgeTop: return(new List <PerimeterLineSegment>() { new PerimeterLineSegment(p2, p1), new PerimeterLineSegment(p1, p4), new PerimeterLineSegment(p4, p3), }); break; case PunchingPerimeterConfiguration.EdgeBottom: return(new List <PerimeterLineSegment>() { new PerimeterLineSegment(p1, p2), new PerimeterLineSegment(p2, p3), new PerimeterLineSegment(p3, p4), }); break; case PunchingPerimeterConfiguration.CornerLeftTop: return(new List <PerimeterLineSegment>() { new PerimeterLineSegment(p3, p4), new PerimeterLineSegment(p4, p1), }); break; case PunchingPerimeterConfiguration.CornerRightTop: return(new List <PerimeterLineSegment>() { new PerimeterLineSegment(p4, p1), new PerimeterLineSegment(p1, p2), }); break; case PunchingPerimeterConfiguration.CornerLeftBottom: return(new List <PerimeterLineSegment>() { new PerimeterLineSegment(p2, p3), new PerimeterLineSegment(p3, p4), }); break; case PunchingPerimeterConfiguration.CornerRightBottom: return(new List <PerimeterLineSegment>() { new PerimeterLineSegment(p1, p2), new PerimeterLineSegment(p2, p3), }); break; default: throw new Exception("Unrecognized punching perimeter column type"); break; throw new Exception("Corner cases were not implemented"); } }
/// <summary> /// Two-way shear section (constructor used for stress calculation) /// </summary> /// <param name="Perimeter">Shear perimeter</param> /// <param name="d">Effective slab section</param> /// <param name="c_x">Column dimension (along X axis)</param> /// <param name="c_y">Column dimension (along Y axis)</param> /// <param name="ColumnType">Identifies if the column is located at the interior, slab edge, or slab corner</param> /// <param name="AtColumnFace">Identifies if the section is adjacent to column face (typical) or away from column face (as is the case with shear studs away from the face)</param> public ConcreteSectionTwoWayShear(PunchingPerimeterData Perimeter, double d, double c_x, double c_y, PunchingPerimeterConfiguration ColumnType, bool AtColumnFace = true) : this(null, Perimeter, d, c_x, c_y, ColumnType, AtColumnFace) { }
/// <summary> /// Two-way shear section /// </summary> /// <param name="Material">Concrete material</param> /// <param name="Segments">Shear perimeter segments</param> /// <param name="d">Effective slab section</param> /// <param name="b_x">Column dimension (normal to slab edge for edge column)</param> /// <param name="b_y">Column dimension (parallel to slab edge for edge column)</param> /// <param name="AtColumnFace">Identifies if the section is adjacent to column face (typical) or away from column face (as is the case with shear studs away from the face)</param> /// <param name="ColumnType">Identifies if the column is located at the interior, slab edge, or slab corner</param> public ConcreteSectionTwoWayShear(IConcreteMaterial Material, List <PerimeterLineSegment> Segments, double d, double b_x, double b_y, bool AtColumnFace, PunchingPerimeterConfiguration ColumnType) : this(Material, Segments, d, b_x, b_y, AtColumnFace, ColumnType, new Point2D(0.0, 0.0)) { }
/// <summary> /// Two-way shear section /// </summary> /// <param name="Material">Concrete material</param> /// <param name="Segments">Shear perimeter segments</param> /// <param name="d">Effective slab section</param> /// <param name="b_x">Column dimension (normal to slab edge for edge column)</param> /// <param name="b_y">Column dimension (parallel to slab edge for edge column)</param> /// <param name="AtColumnFace">Identifies if the section is adjacent to column face (typical) or away from column face (as is the case with shear studs away from the face)</param> /// <param name="ColumnType">Identifies if the column is located at the interior, slab edge, or slab corner</param> public ConcreteSectionTwoWayShear(IConcreteMaterial Material, List<PerimeterLineSegment> Segments, double d, double b_x, double b_y, bool AtColumnFace, PunchingPerimeterConfiguration ColumnType) :this(Material,Segments,d,b_x,b_y,AtColumnFace,ColumnType, new Point2D(0.0,0.0)) { }