示例#1
0
        protected ForceMomentContribution GetApproximateRebarResultant(BarCoordinateFilter CoordinateFilter, BarCoordinateLimitFilterType LimitFilterType,
                                                                       double CutoffCoordinate)
        {
            ForceMomentContribution resultant = new ForceMomentContribution();

            double            barLimitForce       = 0;
            double            barLimitForceMoment = 0;
            List <RebarPoint> filteredBars        = GetFilteredBars(CutoffCoordinate, CoordinateFilter, LimitFilterType);

            foreach (var bar in filteredBars)
            {
                if (CoordinateFilter == BarCoordinateFilter.X) // && LimitFilterType == BarCoordinateLimitFilterType.Maximum)
                {
                    barLimitForce       = bar.Rebar.GetDesignForce();
                    barLimitForceMoment = barLimitForce * bar.Coordinate.X;
                }

                else
                {
                    barLimitForce       = bar.Rebar.GetDesignForce();
                    barLimitForceMoment = barLimitForce * bar.Coordinate.Y;
                }
            }


            ForceMomentContribution barResultant = new ForceMomentContribution()
            {
                Force = barLimitForce, Moment = barLimitForceMoment
            };

            resultant += barResultant;


            return(resultant);
        }
示例#2
0
        protected ForceMomentContribution GetRebarResultant(LinearStrainDistribution StrainDistribution, ResultantType resType)
        {
            ForceMomentContribution resultant = new ForceMomentContribution();
            //tension is negative
            List <RebarPointResult> RebarResults = CalculateRebarResults(StrainDistribution);

            foreach (var barResult in RebarResults)
            {
                if (resType == ResultantType.Tension)
                {
                    if (barResult.Strain < 0)
                    {
                        resultant.Force  += barResult.Force;
                        resultant.Moment += Math.Abs(barResult.Force * barResult.DistanceToNeutralAxis);
                    }
                }
                else
                {
                    if (barResult.Strain > 0)
                    {
                        resultant.Force  += barResult.Force;
                        resultant.Moment += Math.Abs(barResult.Force * barResult.DistanceToNeutralAxis);
                    }
                }
            }
            resultant.RebarResults = RebarResults;
            return(resultant);
        }
        protected virtual LinearStrainDistribution GetInitialStrainEstimate(FlexuralCompressionFiberPosition CompressionFiberPosition)
        {
            //Find rebar resultant force
            // for initial estimate include only rebar below the centroid line
            // as a reasonable estimate for most regular beams
            double centroidY = Section.SliceableShape.YMin + Section.SliceableShape.y_Bar;
            ForceMomentContribution rebarResultant = null;

            switch (CompressionFiberPosition)
            {
            case FlexuralCompressionFiberPosition.Top:
                rebarResultant = GetApproximateRebarResultant(BarCoordinateFilter.Y, BarCoordinateLimitFilterType.Maximum, centroidY);
                break;

            case FlexuralCompressionFiberPosition.Bottom:
                rebarResultant = GetApproximateRebarResultant(BarCoordinateFilter.Y, BarCoordinateLimitFilterType.Minimum, centroidY);
                break;

            default:
                throw new CompressionFiberPositionException();
            }

            //Get corresponding strain
            double a = GetCompressionBlockDepth(rebarResultant.Force, CompressionFiberPosition);
            LinearStrainDistribution strainDistribution = GetStrainDistributionBasedOn_a(a, CompressionFiberPosition);

            return(strainDistribution);
        }
 public static ForceMomentContribution operator +(ForceMomentContribution a, ForceMomentContribution b)
 {
     ForceMomentContribution forceContrib = new ForceMomentContribution();
         forceContrib.Force = a.Force + b.Force;
         forceContrib.Moment = a.Moment + b.Moment;
     return forceContrib;
 }
        public static ForceMomentContribution operator +(ForceMomentContribution a, ForceMomentContribution b)
        {
            ForceMomentContribution forceContrib = new ForceMomentContribution();

            forceContrib.Force  = a.Force + b.Force;
            forceContrib.Moment = a.Moment + b.Moment;
            return(forceContrib);
        }
示例#6
0
        protected ForceMomentContribution GetRebarResultant(BarCoordinateFilter CoordinateFilter, BarCoordinateLimitFilterType LimitFilter, double CutoffCoordinate)
        {
            ForceMomentContribution resultant = new ForceMomentContribution();

            foreach (var bar in longitBars)
            {
                double barLimitForce       = 0;
                double barLimitForceMoment = 0;

                if (CoordinateFilter == BarCoordinateFilter.X && LimitFilter == BarCoordinateLimitFilterType.Maximum)
                {
                    if (bar.Coordinate.X <= CutoffCoordinate)
                    {
                        barLimitForce       = bar.Rebar.GetDesignForce();
                        barLimitForceMoment = barLimitForce * bar.Coordinate.X;
                    }
                }

                if (CoordinateFilter == BarCoordinateFilter.Y && LimitFilter == BarCoordinateLimitFilterType.Maximum)
                {
                    if (bar.Coordinate.Y <= CutoffCoordinate)
                    {
                        barLimitForce       = bar.Rebar.GetDesignForce();
                        barLimitForceMoment = barLimitForce * bar.Coordinate.Y;
                    }
                }

                if (CoordinateFilter == BarCoordinateFilter.X && LimitFilter == BarCoordinateLimitFilterType.Minimum)
                {
                    if (bar.Coordinate.X >= CutoffCoordinate)
                    {
                        barLimitForce       = bar.Rebar.GetDesignForce();
                        barLimitForceMoment = barLimitForce * bar.Coordinate.X;
                    }
                }

                if (CoordinateFilter == BarCoordinateFilter.Y && LimitFilter == BarCoordinateLimitFilterType.Minimum)
                {
                    if (bar.Coordinate.Y >= CutoffCoordinate)
                    {
                        barLimitForce       = bar.Rebar.GetDesignForce();
                        barLimitForceMoment = barLimitForce * bar.Coordinate.Y;
                    }
                }

                ForceMomentContribution barResultant = new ForceMomentContribution()
                {
                    Force = barLimitForce, Moment = barLimitForceMoment
                };
                resultant += barResultant;
            }

            return(resultant);
        }
        protected ForceMomentContribution GetConcreteWhitneyForceResultant(LinearStrainDistribution StrainDistribution, FlexuralCompressionFiberPosition compFiberPosition)
        {
            ForceMomentContribution ConcreteCompressionContribution = new ForceMomentContribution();

            // CalculateBeta and compression block height
            double c = GetDistanceToNeutralAxis(StrainDistribution, compFiberPosition);
            double h = Section.SliceableShape.YMax - Section.SliceableShape.YMin;
            double a;

            if (c == double.PositiveInfinity)
            {
                a = h;
            }
            else
            {
                a = GetCompressionBlockDepth(c);
                if (a > h)
                {
                    a = h;
                }
            }


            double            CentroidYToTopEdge = (Section.SliceableShape.YMax - Section.SliceableShape.YMin) - Section.SliceableShape.y_Bar;
            double            neutralAxisToBottomOfCompressedShapeOffset = CentroidYToTopEdge - a;
            IMoveableSection  compressedPortion = null;
            ISliceableSection sec = this.Section.SliceableShape as ISliceableSection;

            if (sec != null)
            {
                compressedPortion = GetCompressedConcreteSection(StrainDistribution, compFiberPosition, a);
            }
            double A  = compressedPortion.A;
            double fc = Section.Material.SpecifiedCompressiveStrength;

            double ConcreteResultantForce = A * 0.85 * fc;

            ConcreteCompressionContribution.Force = ConcreteResultantForce;


            double concreteForceCentroidDistance = compressedPortion.GetElasticCentroidCoordinate().Y;

            ConcreteCompressionContribution.Moment = concreteForceCentroidDistance * ConcreteResultantForce;

            return(ConcreteCompressionContribution);
        }
        ForceMomentContribution GetConcreteForceResultant(LinearStrainDistribution StrainDistribution, FlexuralCompressionFiberPosition compFiberPosition)
        {
            ForceMomentContribution concreteForceResultant = null;

            if (compFiberPosition == FlexuralCompressionFiberPosition.Top)
            {
                if (StrainDistribution.TopFiberStrain < this.MaxConcreteStrain)
                {
                    concreteForceResultant = GetConcreteParabolicStressForceResultant(StrainDistribution);
                }
                else
                {
                    if (StrainDistribution.TopFiberStrain == this.MaxConcreteStrain)
                    {
                        concreteForceResultant = GetConcreteWhitneyForceResultant(StrainDistribution, compFiberPosition);
                    }
                    else
                    {
                        throw new UltimateConcreteStrainExceededException();
                    }
                }
            }
            else
            {
                if (StrainDistribution.BottomFiberStrain < this.MaxConcreteStrain)
                {
                    concreteForceResultant = GetConcreteParabolicStressForceResultant(StrainDistribution);
                }
                else
                {
                    if (StrainDistribution.BottomFiberStrain == this.MaxConcreteStrain)
                    {
                        concreteForceResultant = GetConcreteWhitneyForceResultant(StrainDistribution, compFiberPosition);
                    }
                    else
                    {
                        throw new UltimateConcreteStrainExceededException();
                    }
                }
            }

            return(concreteForceResultant);
        }
        protected virtual SectionAnalysisResult GetSectionResult(LinearStrainDistribution StrainDistribution, FlexuralCompressionFiberPosition compFiberPosition)
        {
            ForceMomentContribution CForceRebarResultant    = GetCompressionForceConcreteResultant(StrainDistribution, compFiberPosition);
            ForceMomentContribution CForceConcreteResultant = GetCompressionForceRebarResultant(StrainDistribution, compFiberPosition);

            ForceMomentContribution CForceResultant = CForceRebarResultant + CForceConcreteResultant;

            ForceMomentContribution TForceResultant = GetTensionForceResultant(StrainDistribution);
            SectionAnalysisResult   result          = new SectionAnalysisResult()
            {
                AxialForce              = CForceResultant.Force + TForceResultant.Force,
                CForce                  = CForceResultant.Force,
                TForce                  = TForceResultant.Force,
                Moment                  = CForceResultant.Moment + TForceResultant.Moment,
                Rotation                = 0,
                StrainDistribution      = StrainDistribution,
                CompressionRebarResults = CForceRebarResultant.RebarResults,
                TensionRebarResults     = TForceResultant.RebarResults
            };

            return(result);
        }
    protected ForceMomentContribution GetApproximateRebarResultant(BarCoordinateFilter CoordinateFilter, BarCoordinateLimitFilterType LimitFilterType,
    double CutoffCoordinate)
    {
        ForceMomentContribution resultant = new ForceMomentContribution();

            double barLimitForce = 0;
            double barLimitForceMoment = 0;
            List<RebarPoint> filteredBars = GetFilteredBars(CutoffCoordinate, CoordinateFilter, LimitFilterType);

            foreach (var bar in filteredBars)
            {

                if (CoordinateFilter == BarCoordinateFilter.X) // && LimitFilterType == BarCoordinateLimitFilterType.Maximum)
                {

                    barLimitForce = bar.Rebar.GetDesignForce();
                    barLimitForceMoment = barLimitForce * bar.Coordinate.X;

                }

                else
                {

                    barLimitForce = bar.Rebar.GetDesignForce();
                    barLimitForceMoment = barLimitForce * bar.Coordinate.Y;

                }
            }


            ForceMomentContribution barResultant = new ForceMomentContribution() { Force = barLimitForce, Moment = barLimitForceMoment };
            resultant += barResultant;
        

        return resultant;

    }
    protected ForceMomentContribution GetRebarResultant(BarCoordinateFilter CoordinateFilter, BarCoordinateLimitFilterType LimitFilter, double CutoffCoordinate)
    {
        ForceMomentContribution resultant = new ForceMomentContribution();

            foreach (var bar in longitBars)
            {
                double barLimitForce = 0;
                double barLimitForceMoment = 0;

                if (CoordinateFilter == BarCoordinateFilter.X && LimitFilter == BarCoordinateLimitFilterType.Maximum)
                {
                    if (bar.Coordinate.X <= CutoffCoordinate)
                    {
                        barLimitForce = bar.Rebar.GetDesignForce();
                        barLimitForceMoment = barLimitForce * bar.Coordinate.X;
                    }
                }

                if (CoordinateFilter == BarCoordinateFilter.Y && LimitFilter == BarCoordinateLimitFilterType.Maximum)
                {
                    if (bar.Coordinate.Y <= CutoffCoordinate)
                    {
                        barLimitForce = bar.Rebar.GetDesignForce();
                        barLimitForceMoment = barLimitForce * bar.Coordinate.Y;
                    }
                }

                if (CoordinateFilter == BarCoordinateFilter.X && LimitFilter == BarCoordinateLimitFilterType.Minimum)
                {
                    if (bar.Coordinate.X >= CutoffCoordinate)
                    {
                        barLimitForce = bar.Rebar.GetDesignForce();
                        barLimitForceMoment = barLimitForce * bar.Coordinate.X;
                    }
                }

                if (CoordinateFilter == BarCoordinateFilter.Y && LimitFilter == BarCoordinateLimitFilterType.Minimum)
                {
                    if (bar.Coordinate.Y >= CutoffCoordinate)
                    {
                        barLimitForce = bar.Rebar.GetDesignForce();
                        barLimitForceMoment = barLimitForce * bar.Coordinate.Y;
                    }
                }

                ForceMomentContribution barResultant = new ForceMomentContribution(){ Force = barLimitForce, Moment=barLimitForceMoment};
                resultant += barResultant;
            }

            return resultant;

    }
 protected ForceMomentContribution GetRebarResultant(LinearStrainDistribution StrainDistribution, ResultantType resType )
 {
     ForceMomentContribution resultant = new ForceMomentContribution();
     //tension is negative
     List<RebarPointResult> RebarResults = CalculateRebarResults(StrainDistribution);
     foreach (var barResult in RebarResults)
     {
         if (resType == ResultantType.Tension)
         {
             if (barResult.Strain < 0)
             {
                 resultant.Force += barResult.Force;
                 resultant.Moment += Math.Abs(barResult.Force * barResult.DistanceToNeutralAxis);
             }
         }
         else
         {
             if (barResult.Strain > 0)
             {
                 resultant.Force += barResult.Force;
                 resultant.Moment += Math.Abs(barResult.Force * barResult.DistanceToNeutralAxis);
             }
         }
     }
     resultant.RebarResults = RebarResults;
     return resultant;
 }
        protected virtual ForceMomentContribution GetTensionForceResultant(LinearStrainDistribution StrainDistribution)
        {
            ForceMomentContribution rebarContribution = GetRebarResultant(StrainDistribution, ResultantType.Tension);

            return(rebarContribution);
        }
        protected virtual ForceMomentContribution GetCompressionForceRebarResultant(LinearStrainDistribution StrainDistribution, FlexuralCompressionFiberPosition compFiberPosition)
        {
            ForceMomentContribution steelContrib = GetRebarResultant(StrainDistribution, ResultantType.Compression);

            return(steelContrib);
        }
        protected virtual ForceMomentContribution GetCompressionForceConcreteResultant(LinearStrainDistribution StrainDistribution, FlexuralCompressionFiberPosition compFiberPosition)
        {
            ForceMomentContribution concreteContrib = GetConcreteForceResultant(StrainDistribution, compFiberPosition);

            return(concreteContrib);
        }
        protected ForceMomentContribution GetConcreteWhitneyForceResultant(LinearStrainDistribution StrainDistribution, FlexuralCompressionFiberPosition compFiberPosition)
        {
            ForceMomentContribution ConcreteCompressionContribution = new ForceMomentContribution();

            // CalculateBeta and compression block height
            double c = GetDistanceToNeutralAxis(StrainDistribution, compFiberPosition);
            double h = Section.SliceableShape.YMax - Section.SliceableShape.YMin;
            double a;
            
            if (c == double.PositiveInfinity)
            {
                a = h;
            }
            else
            {
                a = GetCompressionBlockDepth(c);
                if (a>h)
                {
                    a = h;
                }
            }


            double CentroidYToTopEdge = (Section.SliceableShape.YMax-Section.SliceableShape.YMin)-Section.SliceableShape.y_Bar;
            double neutralAxisToBottomOfCompressedShapeOffset = CentroidYToTopEdge - a;
            IMoveableSection compressedPortion = null;
            ISliceableSection sec = this.Section.SliceableShape as ISliceableSection;
            if (sec != null)
            {
                compressedPortion = GetCompressedConcreteSection(StrainDistribution,compFiberPosition, a);
            }
            double A = compressedPortion.A;
            double fc = Section.Material.SpecifiedCompressiveStrength;

            double ConcreteResultantForce = A * 0.85 * fc;
            ConcreteCompressionContribution.Force = ConcreteResultantForce;


            double concreteForceCentroidDistance = compressedPortion.GetElasticCentroidCoordinate().Y;
            ConcreteCompressionContribution.Moment = concreteForceCentroidDistance * ConcreteResultantForce;

            return ConcreteCompressionContribution;
        }