Пример #1
0
 public ConcreteSectionIterationData(LinearStrainDistribution StrainDistribution, LinearStrainDistribution PreviousStrainDistribution,
                                     SectionAnalysisResult Result)
 {
     this.StrainDistribution         = StrainDistribution;
     this.PreviousStrainDistribution = PreviousStrainDistribution;
     this.Result = Result;
 }
        private LinearStrainDistribution GetStrainMaxTensionMaxCompression(FlexuralCompressionFiberPosition CompressionFiberPosition)
        {

            //Calulate limit strain for the lowest rebar point
            //Distinguish between top and bottom tension cases
            double StrainDistributionHeight = 0.0;
            //double MaxStrain = CalculateMaximumSteelStrain(CompressionFiberPosition);
            double MaxStrain = this.MaxSteelStrain;

            LinearStrainDistribution MaxMaxDistribution;
            StrainDistributionHeight = GetStrainDistributionHeight(CompressionFiberPosition);

            if (CompressionFiberPosition == FlexuralCompressionFiberPosition.Top)
            {
                var LowestPointY = LongitudinalBars.Min(yVal => yVal.Coordinate.Y);
                var PointsAtLowestY = LongitudinalBars.Where(point => point.Coordinate.Y == LowestPointY).Select(point => point);
                var LimitStrain = PointsAtLowestY.Min(point => point.Rebar.Material.GetUltimateStrain(point.Rebar.Diameter));
                MaxStrain = LimitStrain;
                MaxMaxDistribution = new LinearStrainDistribution
                (StrainDistributionHeight, this.MaxConcreteStrain, -MaxStrain);
            }
            else
            {
                var HighestPointY = LongitudinalBars.Max(yVal => yVal.Coordinate.Y);
                var PointsAtHighestY = LongitudinalBars.Where(point => point.Coordinate.Y == HighestPointY).Select(point => point);
                var LimitStrain = PointsAtHighestY.Min(point => point.Rebar.Material.GetUltimateStrain(point.Rebar.Diameter));
                MaxStrain = LimitStrain;
                MaxMaxDistribution = new LinearStrainDistribution
                (StrainDistributionHeight, -MaxStrain, this.MaxConcreteStrain);
            }

            return MaxMaxDistribution;
        }
        public IStrainCompatibilityAnalysisResult GetNominalFlexuralCapacity
            (FlexuralCompressionFiberPosition CompressionFiberPosition)
        {
            //Step 1: Assume strain distribution with all bars below section centroid yielding
            LinearStrainDistribution TrialStrainDistribution = GetInitialStrainEstimate(CompressionFiberPosition);
            SectionAnalysisResult    TrialSectionResult      = GetSectionResult(TrialStrainDistribution, CompressionFiberPosition);
            double Mn = 0;

            //check id T and C force are equal

            //if T<>C
            if (GetAnalysisResultConverged(TrialSectionResult, ConvergenceToleranceStrain) == false)
            {
                SectionAnalysisResult IteratedResult = null;
                try
                {
                    TCIterationBound bound = GetSolutionBoundaries(TrialSectionResult, TrialStrainDistribution);     //make sure solution exists
                    IteratedResult = FindPureMomentResult(CompressionFiberPosition, bound, ConvergenceToleranceStrain);
                    RebarPointResult controllingBar = GetMaxSteelStrainPoint(TrialSectionResult.TensionRebarResults);
                    Mn = IteratedResult.Moment;
                    return(new ConcreteSectionFlexuralAnalysisResult(Mn, IteratedResult.StrainDistribution, controllingBar));
                }
                catch (SectionAnalysisFailedToConvergeException)
                {
                    throw new SectionFailedToConvergeException();
                }
            }
            //if T=C
            else
            {
                IStrainCompatibilityAnalysisResult result = GetResult(TrialSectionResult);
                return(result);
            }
        }
Пример #4
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 GetStrainDistributionBasedOn_a(double a, FlexuralCompressionFiberPosition CompressionFiberPosition)
        {
            double c = a / Section.Material.beta1;
            double StrainDistributionHeight = GetStrainDistributionHeight(CompressionFiberPosition);

            double epsilon_c = this.MaxConcreteStrain;
            double epsilon_s = epsilon_c - (epsilon_c / c) * StrainDistributionHeight;

            LinearStrainDistribution strainDistribution = null;

            switch (CompressionFiberPosition)
            {
            case FlexuralCompressionFiberPosition.Top:
                strainDistribution = new LinearStrainDistribution(StrainDistributionHeight, epsilon_c, epsilon_s);
                break;

            case FlexuralCompressionFiberPosition.Bottom:
                strainDistribution = new LinearStrainDistribution(StrainDistributionHeight, epsilon_s, epsilon_c);
                break;

            default:
                throw new CompressionFiberPositionException();
            }

            return(strainDistribution);
        }
Пример #6
0
        protected virtual List <RebarPointResult> CalculateRebarResults(LinearStrainDistribution StrainDistribution)
        {
            List <RebarPointResult> ResultList = new List <RebarPointResult>();

            double c    = StrainDistribution.NeutralAxisTopDistance;
            double h    = StrainDistribution.Height;
            double YMax = Section.SliceableShape.YMax;
            double YMin = Section.SliceableShape.YMin;
            double XMax = Section.SliceableShape.XMax;
            double XMin = Section.SliceableShape.XMin;

            double sectionHeight           = Section.SliceableShape.YMax - Section.SliceableShape.YMin;
            double distTopToSecNeutralAxis = sectionHeight - Section.SliceableShape.y_Bar;

            foreach (RebarPoint rbrPnt in LongitudinalBars)
            {
                double BarDistanceToTop = YMax - rbrPnt.Coordinate.Y;
                double BarDistanceToNa  = BarDistanceToTop - distTopToSecNeutralAxis;
                double Strain           = StrainDistribution.GetStrainAtPointOffsetFromTop(BarDistanceToTop);
                double Force;
                double Stress;


                Force  = rbrPnt.Rebar.GetForce(Strain);
                Stress = rbrPnt.Rebar.GetStress(Strain);
                ResultList.Add(new RebarPointResult(Stress, Strain, Force, BarDistanceToNa, rbrPnt));
            }


            return(ResultList);
        }
Пример #7
0
        protected override TCIterationBound GetSolutionBoundaries(SectionAnalysisResult result,
                                                                  LinearStrainDistribution ApproximationStrainDistribution)
        {
            double prestressForce = this.GetPrestressForceEffective();

            if (prestressForce == 0)
            {
                //TODO: add check for prstressing if needed
                //throw new NotPrestressedBeamException();
            }
            //prestressed beam strain iteration is different (from regular RC) from regular concrete because we are assuming that
            //the maximum depth of compression zone is 0.6d. Therefore this determines the start of iterations

            TCIterationBound bound = new TCIterationBound();

            switch (currentCompressionFiberPosition)
            {
            case FlexuralCompressionFiberPosition.Top:
                bound.MinStrain = ApproximationStrainDistribution.BottomFiberStrain;
                break;

            case FlexuralCompressionFiberPosition.Bottom:
                bound.MinStrain = ApproximationStrainDistribution.TopFiberStrain;
                break;

            default:
                throw new CompressionFiberPositionException();
            }
            bound.MaxStrain = CalculateMaximumSteelStrain(currentCompressionFiberPosition);
            return(bound);
        }
 public ConcreteSectionIterationData(LinearStrainDistribution StrainDistribution, LinearStrainDistribution PreviousStrainDistribution, 
     SectionAnalysisResult Result)
 {
     this.StrainDistribution = StrainDistribution;
     this.PreviousStrainDistribution = PreviousStrainDistribution;
     this.Result = Result;
 }
        protected override LinearStrainDistribution GetInitialStrainEstimate(FlexuralCompressionFiberPosition CompressionFiberPosition)
        {
            currentCompressionFiberPosition = CompressionFiberPosition; //store this off for getting iteration limits
            double StrainDistributionHeight = GetStrainDistributionHeight(CompressionFiberPosition);
            double c = StrainDistributionHeight * 0.6; 
            //this is AASHTO criteria for when it's OK to use assumption that
            //mild rebar yields, beyond that need to use strain compatibility
            double epsilon_c = StrainUltimateConcrete.Value;
            double epsilon_s = epsilon_c - (epsilon_c / c) * StrainDistributionHeight;

            LinearStrainDistribution strainDistribution = null;
            switch (CompressionFiberPosition)
            {
                case FlexuralCompressionFiberPosition.Top:
                    strainDistribution = new LinearStrainDistribution(StrainDistributionHeight, epsilon_c, epsilon_s);
                    break;
                case FlexuralCompressionFiberPosition.Bottom:
                    strainDistribution = new LinearStrainDistribution(StrainDistributionHeight, epsilon_s, epsilon_c);
                    break;
                default:
                    throw new CompressionFiberPositionException();
            }

            return strainDistribution;

        }
        private LinearStrainDistribution GetStrainMaxTensionMaxCompression(FlexuralCompressionFiberPosition CompressionFiberPosition)
        {
            //Calulate limit strain for the lowest rebar point
            //Distinguish between top and bottom tension cases
            double StrainDistributionHeight = 0.0;
            //double MaxStrain = CalculateMaximumSteelStrain(CompressionFiberPosition);
            double MaxStrain = this.MaxSteelStrain;

            LinearStrainDistribution MaxMaxDistribution;

            StrainDistributionHeight = GetStrainDistributionHeight(CompressionFiberPosition);

            if (CompressionFiberPosition == FlexuralCompressionFiberPosition.Top)
            {
                var LowestPointY    = LongitudinalBars.Min(yVal => yVal.Coordinate.Y);
                var PointsAtLowestY = LongitudinalBars.Where(point => point.Coordinate.Y == LowestPointY).Select(point => point);
                var LimitStrain     = PointsAtLowestY.Min(point => point.Rebar.Material.GetUltimateStrain(point.Rebar.Diameter));
                MaxStrain          = LimitStrain;
                MaxMaxDistribution = new LinearStrainDistribution
                                         (StrainDistributionHeight, this.MaxConcreteStrain, -MaxStrain);
            }
            else
            {
                var HighestPointY    = LongitudinalBars.Max(yVal => yVal.Coordinate.Y);
                var PointsAtHighestY = LongitudinalBars.Where(point => point.Coordinate.Y == HighestPointY).Select(point => point);
                var LimitStrain      = PointsAtHighestY.Min(point => point.Rebar.Material.GetUltimateStrain(point.Rebar.Diameter));
                MaxStrain          = LimitStrain;
                MaxMaxDistribution = new LinearStrainDistribution
                                         (StrainDistributionHeight, -MaxStrain, this.MaxConcreteStrain);
            }

            return(MaxMaxDistribution);
        }
        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);
        }
        protected IMoveableSection GetCompressedConcreteSection(LinearStrainDistribution StrainDistribution, FlexuralCompressionFiberPosition compFiberPos, double SlicingPlaneOffset)
        {
            IMoveableSection  compressedPortion = null;
            ISliceableSection sec = this.Section.SliceableShape as ISliceableSection;

            if (StrainDistribution.TopFiberStrain >= 0 && StrainDistribution.BottomFiberStrain >= 0)
            {
                compressedPortion = this.Section.SliceableShape;
            }
            else
            {
                switch (compFiberPos)
                {
                case FlexuralCompressionFiberPosition.Top:
                    compressedPortion = sec.GetTopSliceSection(SlicingPlaneOffset, SlicingPlaneOffsetType.Top);
                    break;

                case FlexuralCompressionFiberPosition.Bottom:
                    compressedPortion = sec.GetBottomSliceSection(SlicingPlaneOffset, SlicingPlaneOffsetType.Bottom);
                    break;

                default:
                    throw new CompressionFiberPositionException();
                }
            }

            return(compressedPortion);
        }
Пример #13
0
        protected override TCIterationBound GetSolutionBoundaries(SectionAnalysisResult result, 
            LinearStrainDistribution ApproximationStrainDistribution)
            {
                double prestressForce = this.GetPrestressForceEffective();
                if (prestressForce == 0)
                {
                    //TODO: add check for prstressing if needed
                    //throw new NotPrestressedBeamException();
                }
            //prestressed beam strain iteration is different (from regular RC) from regular concrete because we are assuming that
            //the maximum depth of compression zone is 0.6d. Therefore this determines the start of iterations

                TCIterationBound bound = new TCIterationBound();
                switch (currentCompressionFiberPosition)
                {
                    case FlexuralCompressionFiberPosition.Top:
                        bound.MinStrain = ApproximationStrainDistribution.BottomFiberStrain;
                        break;
                    case FlexuralCompressionFiberPosition.Bottom:
                        bound.MinStrain = ApproximationStrainDistribution.TopFiberStrain;
                        break;
                    default:
                        throw new CompressionFiberPositionException();
                    
                }
                bound.MaxStrain = CalculateMaximumSteelStrain(currentCompressionFiberPosition);
                return bound;
            }
        private double DeltaTCCalculationFunction(double SteelStrain)
        {
            //function of CurrentCompressionFiberPosition
            //1. create trial strain
            LinearStrainDistribution iteratedStrainDistribution = null;

            switch (currentCompressionFiberPosition)
            {
            case FlexuralCompressionFiberPosition.Top:
                iteratedStrainDistribution = new LinearStrainDistribution(StrainHeight, this.MaxConcreteStrain, SteelStrain);
                break;

            case FlexuralCompressionFiberPosition.Bottom:
                iteratedStrainDistribution = new LinearStrainDistribution(StrainHeight, SteelStrain, this.MaxConcreteStrain);
                break;

            default:
                throw new CompressionFiberPositionException();
            }
            //2. Calculate result
            SectionAnalysisResult iteratedResult = GetSectionResult(iteratedStrainDistribution, currentCompressionFiberPosition);
            //3. calculate difference between T and C
            double T = iteratedResult.TForce;
            double C = iteratedResult.CForce;

            return(Math.Abs(T) - Math.Abs(C));
        }
        protected virtual  List<RebarPointResult> CalculateRebarResults(LinearStrainDistribution StrainDistribution )
        {
            List<RebarPointResult> ResultList = new List<RebarPointResult>();

            double c = StrainDistribution.NeutralAxisTopDistance;
            double h = StrainDistribution.Height;
            double YMax = Section.SliceableShape.YMax;
            double YMin = Section.SliceableShape.YMin;
            double XMax = Section.SliceableShape.XMax;
            double XMin = Section.SliceableShape.XMin;

            double sectionHeight = Section.SliceableShape.YMax - Section.SliceableShape.YMin;
            double distTopToSecNeutralAxis = sectionHeight - Section.SliceableShape.y_Bar;

                foreach (RebarPoint rbrPnt in LongitudinalBars)
                {
                    double BarDistanceToTop = YMax - rbrPnt.Coordinate.Y;
                    double BarDistanceToNa = BarDistanceToTop - distTopToSecNeutralAxis;
                    double Strain = StrainDistribution.GetStrainAtPointOffsetFromTop(BarDistanceToTop);
                    double Force;
                    double Stress;


                            Force = rbrPnt.Rebar.GetForce(Strain);
                            Stress = rbrPnt.Rebar.GetStress(Strain);
                            ResultList.Add(new RebarPointResult(Stress, Strain, Force, BarDistanceToNa, rbrPnt));


                } 


            return ResultList;
        }
Пример #16
0
        protected override LinearStrainDistribution GetInitialStrainEstimate(FlexuralCompressionFiberPosition CompressionFiberPosition)
        {
            currentCompressionFiberPosition = CompressionFiberPosition; //store this off for getting iteration limits
            double StrainDistributionHeight = GetStrainDistributionHeight(CompressionFiberPosition);
            double c = StrainDistributionHeight * 0.6;
            //this is AASHTO criteria for when it's OK to use assumption that
            //mild rebar yields, beyond that need to use strain compatibility
            double epsilon_c = StrainUltimateConcrete.Value;
            double epsilon_s = epsilon_c - (epsilon_c / c) * StrainDistributionHeight;

            LinearStrainDistribution strainDistribution = null;

            switch (CompressionFiberPosition)
            {
            case FlexuralCompressionFiberPosition.Top:
                strainDistribution = new LinearStrainDistribution(StrainDistributionHeight, epsilon_c, epsilon_s);
                break;

            case FlexuralCompressionFiberPosition.Bottom:
                strainDistribution = new LinearStrainDistribution(StrainDistributionHeight, epsilon_s, epsilon_c);
                break;

            default:
                throw new CompressionFiberPositionException();
            }

            return(strainDistribution);
        }
        protected virtual TCIterationBound GetSolutionBoundaries(SectionAnalysisResult result, LinearStrainDistribution ApproximationStrainDistribution)
        {
            double t = Math.Abs(result.TForce);
            double c = Math.Abs(result.CForce);

            SectionAnalysisResult    secondResult = new SectionAnalysisResult();
            TCIterationBound         data         = new TCIterationBound();
            LinearStrainDistribution secondApproximationStrainDistribution = null;
            double MaxSteelStrain = CalculateMaximumSteelStrain(currentCompressionFiberPosition);

            //Step 1: create adjusted strain distribution
            if (t > c)
            {
                if (currentCompressionFiberPosition == FlexuralCompressionFiberPosition.Top)
                {
                    secondApproximationStrainDistribution = new LinearStrainDistribution(ApproximationStrainDistribution.Height,
                                                                                         ApproximationStrainDistribution.TopFiberStrain, this.MaxConcreteStrain);
                }
                else
                {
                    secondApproximationStrainDistribution = new LinearStrainDistribution(ApproximationStrainDistribution.Height,
                                                                                         this.MaxConcreteStrain, ApproximationStrainDistribution.BottomFiberStrain);
                }
            }
            else
            {
                if (currentCompressionFiberPosition == FlexuralCompressionFiberPosition.Top)
                {
                    secondApproximationStrainDistribution = new LinearStrainDistribution(ApproximationStrainDistribution.Height,
                                                                                         ApproximationStrainDistribution.TopFiberStrain, MaxSteelStrain);
                }
                else
                {
                    secondApproximationStrainDistribution = new LinearStrainDistribution(ApproximationStrainDistribution.Height,
                                                                                         MaxSteelStrain, ApproximationStrainDistribution.BottomFiberStrain);
                }
            }

            //Step 2: Fill in data for output
            if (currentCompressionFiberPosition == FlexuralCompressionFiberPosition.Top)
            {
                data.MinStrain = -Math.Max(Math.Abs(ApproximationStrainDistribution.BottomFiberStrain), Math.Abs(secondApproximationStrainDistribution.BottomFiberStrain));
                data.MaxStrain = -Math.Min(Math.Abs(ApproximationStrainDistribution.BottomFiberStrain), Math.Abs(secondApproximationStrainDistribution.BottomFiberStrain));
            }
            else
            {
                data.MinStrain = -Math.Max(Math.Abs(ApproximationStrainDistribution.TopFiberStrain), Math.Abs(secondApproximationStrainDistribution.TopFiberStrain));
                data.MaxStrain = -Math.Min(Math.Abs(ApproximationStrainDistribution.TopFiberStrain), Math.Abs(secondApproximationStrainDistribution.TopFiberStrain));
            }

            return(data);
        }
 protected double GetDistanceToNeutralAxis(LinearStrainDistribution StrainDistribution, FlexuralCompressionFiberPosition CompressionFiberPosition)
 {
     double c = StrainDistribution.NeutralAxisTopDistance;
      switch (CompressionFiberPosition)
     {
         case FlexuralCompressionFiberPosition.Top:
             return c;
             break;
         case FlexuralCompressionFiberPosition.Bottom:
             return StrainDistribution.Height-c;
             break;
         default:
             throw new CompressionFiberPositionException();
     }
     return c;
 }
        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;
        }
        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 double GetDistanceToNeutralAxis(LinearStrainDistribution StrainDistribution, FlexuralCompressionFiberPosition CompressionFiberPosition)
        {
            double c = StrainDistribution.NeutralAxisTopDistance;

            switch (CompressionFiberPosition)
            {
            case FlexuralCompressionFiberPosition.Top:
                return(c);

                break;

            case FlexuralCompressionFiberPosition.Bottom:
                return(StrainDistribution.Height - c);

                break;

            default:
                throw new CompressionFiberPositionException();
            }
            return(c);
        }
        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 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);
        }
Пример #25
0
        private void UpdateValuesFromResult(IStrainCompatibilityAnalysisResult nominalResult,
                                            FlexuralCompressionFiberPosition FlexuralCompressionFiberPosition, double beta1)
        {
            LinearStrainDistribution strainDistribution = nominalResult.StrainDistribution;

            double d = strainDistribution.Height;

            if (FlexuralCompressionFiberPosition == FlexuralCompressionFiberPosition.Top)
            {
                this.a    = strainDistribution.NeutralAxisTopDistance * beta1;
                epsilon_t = strainDistribution.BottomFiberStrain;
            }
            else
            {
                this.a    = (d - strainDistribution.NeutralAxisTopDistance) * beta1;
                epsilon_t = strainDistribution.TopFiberStrain;
            }

            IRebarMaterial controllingBarMaterial = nominalResult.ControllingTensionBar.Point.Rebar.Material;

            epsilon_ty = controllingBarMaterial.YieldStrain;
        }
        protected virtual SectionAnalysisResult FindPureMomentResult(FlexuralCompressionFiberPosition CompressionFiberPosition,
                                                                     TCIterationBound bound, double StrainConvergenceTolerance = 0.00001)
        {
            currentCompressionFiberPosition = CompressionFiberPosition;           //store this off because it will be necessary during iteration
            StrainHeight = GetStrainDistributionHeight(CompressionFiberPosition); //store this off because it will be necessary during iteration


            double SteelStrain = 0;
            double StrainMax   = bound.MaxStrain;
            double StrainMin   = bound.MinStrain;

            double targetTCDelta = 0;
            LinearStrainDistribution finalStrainDistribution = null;

            //SteelStrain = RootFinding.Brent(new FunctionOfOneVariable(GetTandCDeltaForSteelStrainIteration), TCDeltaMin, TCDeltaMax, StrainConvergenceTolerance, targetTCDelta);
            SteelStrain = RootFinding.Brent(new FunctionOfOneVariable(DeltaTCCalculationFunction), StrainMin, StrainMax, StrainConvergenceTolerance, targetTCDelta);
            switch (CompressionFiberPosition)
            {
            case FlexuralCompressionFiberPosition.Top:

                finalStrainDistribution = new LinearStrainDistribution(StrainHeight, this.MaxConcreteStrain, SteelStrain);

                break;

            case FlexuralCompressionFiberPosition.Bottom:

                finalStrainDistribution = new LinearStrainDistribution(StrainHeight, SteelStrain, this.MaxConcreteStrain);

                break;

            default:
                throw new CompressionFiberPositionException();
            }

            SectionAnalysisResult finalResult = GetSectionResult(finalStrainDistribution, CompressionFiberPosition);

            return(finalResult);
        }
        private double SectionAxialForceResultantFunction(double SteelStrain)
        {
            //Create trial strain
            LinearStrainDistribution iteratedStrainDistribution = null;

            switch (currentCompressionFiberPosition)
            {
            case FlexuralCompressionFiberPosition.Top:
                iteratedStrainDistribution = new LinearStrainDistribution(StrainHeight, this.MaxConcreteStrain, SteelStrain);
                break;

            case FlexuralCompressionFiberPosition.Bottom:
                iteratedStrainDistribution = new LinearStrainDistribution(StrainHeight, SteelStrain, this.MaxConcreteStrain);
                break;

            default:
                throw new CompressionFiberPositionException();
            }
            //Calculate result
            SectionAnalysisResult iteratedResult = GetSectionResult(iteratedStrainDistribution, currentCompressionFiberPosition);

            return(iteratedResult.AxialForce);
        }
        protected virtual SectionAnalysisResult FindMomentResultInPresenceOfAxialForce(FlexuralCompressionFiberPosition CompressionFiberPosition,
                                                                                       double P, double MaxSteelStrain, double StrainConvergenceTolerance = 0.00001)
        {
            currentCompressionFiberPosition = CompressionFiberPosition;           //store this off because it will be necessary during iteration
            StrainHeight = GetStrainDistributionHeight(CompressionFiberPosition); //store this off because it will be necessary during iteration

            double StrainMin = MaxSteelStrain;
            double StrainMax = StrainUltimateConcrete.Value;

            double targetP = P;
            LinearStrainDistribution finalStrainDistribution = null;

            double SteelStrain = RootFinding.Brent(new FunctionOfOneVariable(SectionAxialForceResultantFunction), StrainMin, StrainMax,
                                                   StrainConvergenceTolerance, targetP);

            switch (CompressionFiberPosition)
            {
            case FlexuralCompressionFiberPosition.Top:

                finalStrainDistribution = new LinearStrainDistribution(StrainHeight, this.MaxConcreteStrain, SteelStrain);

                break;

            case FlexuralCompressionFiberPosition.Bottom:

                finalStrainDistribution = new LinearStrainDistribution(StrainHeight, SteelStrain, this.MaxConcreteStrain);

                break;

            default:
                throw new CompressionFiberPositionException();
            }

            SectionAnalysisResult finalResult = GetSectionResult(finalStrainDistribution, CompressionFiberPosition);

            return(finalResult);
        }
        protected virtual LinearStrainDistribution GetStrainDistributionBasedOn_a(double a, FlexuralCompressionFiberPosition CompressionFiberPosition)
        {

            double c = a / Section.Material.beta1;
            double StrainDistributionHeight = GetStrainDistributionHeight(CompressionFiberPosition);

            double epsilon_c = this.MaxConcreteStrain;
            double epsilon_s = epsilon_c - (epsilon_c / c) * StrainDistributionHeight;

            LinearStrainDistribution strainDistribution = null;
            switch (CompressionFiberPosition)
            {
                case FlexuralCompressionFiberPosition.Top:
                    strainDistribution = new LinearStrainDistribution(StrainDistributionHeight, epsilon_c, epsilon_s);
                    break;
                case FlexuralCompressionFiberPosition.Bottom:
                    strainDistribution = new LinearStrainDistribution(StrainDistributionHeight, epsilon_s, epsilon_c);
                    break;
                default:
                    throw new CompressionFiberPositionException();
            }

            return strainDistribution;
        }
 public ConcreteSectionCompressionAnalysisResult(double Moment, LinearStrainDistribution StrainDistribution, RebarPointResult controllingTensionBar)
     : base(Moment, StrainDistribution, controllingTensionBar)
 {
 }
 protected virtual ForceMomentContribution GetTensionForceResultant(LinearStrainDistribution StrainDistribution)
 {
     ForceMomentContribution rebarContribution = GetRebarResultant(StrainDistribution, ResultantType.Tension);
     return rebarContribution;
 }
        protected virtual ForceMomentContribution GetCompressionForceConcreteResultant(LinearStrainDistribution StrainDistribution, FlexuralCompressionFiberPosition compFiberPosition)
        {
            ForceMomentContribution concreteContrib = GetConcreteForceResultant(StrainDistribution, compFiberPosition);

            return concreteContrib;
        }
        protected IMoveableSection GetCompressedConcreteSection(LinearStrainDistribution StrainDistribution, FlexuralCompressionFiberPosition compFiberPos, double SlicingPlaneOffset)
        {
            IMoveableSection compressedPortion = null;
            ISliceableSection sec = this.Section.SliceableShape as ISliceableSection;

            if (StrainDistribution.TopFiberStrain >= 0 && StrainDistribution.BottomFiberStrain >= 0)
            {
                compressedPortion = this.Section.SliceableShape;
            }
            else
            {
                switch (compFiberPos)
                {
                    case FlexuralCompressionFiberPosition.Top:
                        compressedPortion = sec.GetTopSliceSection(SlicingPlaneOffset, SlicingPlaneOffsetType.Top); 
                        break;
                    case FlexuralCompressionFiberPosition.Bottom:
                        compressedPortion = sec.GetBottomSliceSection(SlicingPlaneOffset,SlicingPlaneOffsetType.Bottom); 
                        break;
                    default:
                        throw new CompressionFiberPositionException();
                }
            }

            return compressedPortion;
        }
 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;
 }
Пример #35
0
 public ConcreteSectionFlexuralAnalysisResult(double Moment, LinearStrainDistribution StrainDistribution, RebarPointResult controllingTensionBar) : base(Moment, StrainDistribution)
 {
     this.ControllingTensionBar = controllingTensionBar;
 }
        public ConcreteSectionCompressionAnalysisResult(double Moment, LinearStrainDistribution StrainDistribution, RebarPointResult controllingTensionBar)
            : base( Moment,  StrainDistribution,  controllingTensionBar)
        {

        }
        private double DeltaTCCalculationFunction(double SteelStrain)
        {
            //function of CurrentCompressionFiberPosition
            //1. create trial strain
            LinearStrainDistribution iteratedStrainDistribution = null;
            switch (currentCompressionFiberPosition)
            {
                case FlexuralCompressionFiberPosition.Top:
                        iteratedStrainDistribution = new LinearStrainDistribution(StrainHeight, this.MaxConcreteStrain, SteelStrain);
                    break;
                case FlexuralCompressionFiberPosition.Bottom:
                        iteratedStrainDistribution = new LinearStrainDistribution(StrainHeight, SteelStrain, this.MaxConcreteStrain);
                    break;
                default:
                    throw new CompressionFiberPositionException();
            }
            //2. Calculate result
            SectionAnalysisResult iteratedResult = GetSectionResult(iteratedStrainDistribution, currentCompressionFiberPosition);
            //3. calculate difference between T and C
                double T = iteratedResult.TForce;
                double C = iteratedResult.CForce;

            return Math.Abs(T)-Math.Abs(C);
        }
        private double SectionAxialForceResultantFunction(double SteelStrain)
        {
            //Create trial strain
            LinearStrainDistribution iteratedStrainDistribution = null;
            switch (currentCompressionFiberPosition)
            {
                case FlexuralCompressionFiberPosition.Top:
                    iteratedStrainDistribution = new LinearStrainDistribution(StrainHeight, this.MaxConcreteStrain, SteelStrain);
                    break;
                case FlexuralCompressionFiberPosition.Bottom:
                    iteratedStrainDistribution = new LinearStrainDistribution(StrainHeight, SteelStrain, this.MaxConcreteStrain);
                    break;
                default:
                    throw new CompressionFiberPositionException();
            }
            //Calculate result
            SectionAnalysisResult iteratedResult = GetSectionResult(iteratedStrainDistribution, currentCompressionFiberPosition);

            return iteratedResult.AxialForce;
        }
        protected virtual TCIterationBound GetSolutionBoundaries(SectionAnalysisResult result, LinearStrainDistribution ApproximationStrainDistribution)
        {
            double t = Math.Abs(result.TForce);
            double c = Math.Abs(result.CForce);

            SectionAnalysisResult secondResult = new SectionAnalysisResult();
            TCIterationBound data = new TCIterationBound();
            LinearStrainDistribution secondApproximationStrainDistribution = null;
            double MaxSteelStrain = CalculateMaximumSteelStrain(currentCompressionFiberPosition);

            //Step 1: create adjusted strain distribution
            if (t>c)
            {
                if (currentCompressionFiberPosition == FlexuralCompressionFiberPosition.Top)
                {
                    secondApproximationStrainDistribution = new LinearStrainDistribution(ApproximationStrainDistribution.Height,
                        ApproximationStrainDistribution.TopFiberStrain, this.MaxConcreteStrain);
                }
                else
                {
                    secondApproximationStrainDistribution = new LinearStrainDistribution(ApproximationStrainDistribution.Height,
                         this.MaxConcreteStrain, ApproximationStrainDistribution.BottomFiberStrain);
                }
                
            }
            else
            {
                if (currentCompressionFiberPosition == FlexuralCompressionFiberPosition.Top)
                {
                    secondApproximationStrainDistribution = new LinearStrainDistribution(ApproximationStrainDistribution.Height,
                        ApproximationStrainDistribution.TopFiberStrain, MaxSteelStrain);
                }
                else
                {
                    secondApproximationStrainDistribution = new LinearStrainDistribution(ApproximationStrainDistribution.Height,
                     MaxSteelStrain, ApproximationStrainDistribution.BottomFiberStrain);
                }
                
            }

            //Step 2: Fill in data for output
            if (currentCompressionFiberPosition == FlexuralCompressionFiberPosition.Top)
            {
                data.MinStrain = -Math.Max(Math.Abs(ApproximationStrainDistribution.BottomFiberStrain), Math.Abs(secondApproximationStrainDistribution.BottomFiberStrain));
                data.MaxStrain = -Math.Min(Math.Abs(ApproximationStrainDistribution.BottomFiberStrain), Math.Abs(secondApproximationStrainDistribution.BottomFiberStrain));    
            }
            else
            {
                data.MinStrain = -Math.Max(Math.Abs(ApproximationStrainDistribution.TopFiberStrain), Math.Abs(secondApproximationStrainDistribution.TopFiberStrain));
                data.MaxStrain = -Math.Min(Math.Abs(ApproximationStrainDistribution.TopFiberStrain), Math.Abs(secondApproximationStrainDistribution.TopFiberStrain));   
            }

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

            return(steelContrib);
        }
        protected virtual SectionAnalysisResult FindPureMomentResult(FlexuralCompressionFiberPosition CompressionFiberPosition,
             TCIterationBound bound,  double StrainConvergenceTolerance = 0.00001)
        {
            currentCompressionFiberPosition = CompressionFiberPosition; //store this off because it will be necessary during iteration
            StrainHeight = GetStrainDistributionHeight(CompressionFiberPosition);//store this off because it will be necessary during iteration


            double SteelStrain = 0;
            double StrainMax = bound.MaxStrain;
            double StrainMin = bound.MinStrain;

            double targetTCDelta = 0;
            LinearStrainDistribution finalStrainDistribution = null;

            //SteelStrain = RootFinding.Brent(new FunctionOfOneVariable(GetTandCDeltaForSteelStrainIteration), TCDeltaMin, TCDeltaMax, StrainConvergenceTolerance, targetTCDelta);
            SteelStrain = RootFinding.Brent(new FunctionOfOneVariable(DeltaTCCalculationFunction), StrainMin, StrainMax, StrainConvergenceTolerance, targetTCDelta);
            switch (CompressionFiberPosition)
            {
                case FlexuralCompressionFiberPosition.Top:
                    
                        finalStrainDistribution = new LinearStrainDistribution(StrainHeight, this.MaxConcreteStrain, SteelStrain);

                    break;
                case FlexuralCompressionFiberPosition.Bottom:

                        finalStrainDistribution = new LinearStrainDistribution(StrainHeight, SteelStrain, this.MaxConcreteStrain);

                    break;
                default:
                    throw new CompressionFiberPositionException();
            }

            SectionAnalysisResult finalResult = GetSectionResult(finalStrainDistribution, CompressionFiberPosition);
            return finalResult;
        }
        protected virtual ForceMomentContribution GetCompressionForceConcreteResultant(LinearStrainDistribution StrainDistribution, FlexuralCompressionFiberPosition compFiberPosition)
        {
            ForceMomentContribution concreteContrib = GetConcreteForceResultant(StrainDistribution, compFiberPosition);

            return(concreteContrib);
        }
        protected virtual SectionAnalysisResult FindMomentResultInPresenceOfAxialForce(FlexuralCompressionFiberPosition CompressionFiberPosition,
          double P,   double MaxSteelStrain,  double StrainConvergenceTolerance = 0.00001)
        {
            currentCompressionFiberPosition = CompressionFiberPosition; //store this off because it will be necessary during iteration
            StrainHeight = GetStrainDistributionHeight(CompressionFiberPosition);//store this off because it will be necessary during iteration

            double StrainMin = MaxSteelStrain;
            double StrainMax = StrainUltimateConcrete.Value;
                 
            double targetP = P;
            LinearStrainDistribution finalStrainDistribution = null;

            double SteelStrain = RootFinding.Brent(new FunctionOfOneVariable(SectionAxialForceResultantFunction), StrainMin, StrainMax, 
            StrainConvergenceTolerance, targetP);
            switch (CompressionFiberPosition)
            {
                case FlexuralCompressionFiberPosition.Top:
                    
                        finalStrainDistribution = new LinearStrainDistribution(StrainHeight, this.MaxConcreteStrain, SteelStrain);

                    break;
                case FlexuralCompressionFiberPosition.Bottom:

                        finalStrainDistribution = new LinearStrainDistribution(StrainHeight, SteelStrain, this.MaxConcreteStrain);

                    break;
                default:
                    throw new CompressionFiberPositionException();
            }

            SectionAnalysisResult finalResult = GetSectionResult(finalStrainDistribution, CompressionFiberPosition);
            return finalResult;
        }
        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;
        }
 public SectionFlexuralAnalysisResult(double Moment, LinearStrainDistribution StrainDistribution)
 {
     this.moment             = Moment;
     this.strainDistribution = StrainDistribution;
 }
 protected double GetCompressionBlockDepth(LinearStrainDistribution StrainDistribution, FlexuralCompressionFiberPosition CompressionFiberPosition)
 {
     double c = GetDistanceToNeutralAxis(StrainDistribution, CompressionFiberPosition);
     return this.GetCompressionBlockDepth(c);
 }
 public SectionFlexuralAnalysisResult( double Moment, LinearStrainDistribution StrainDistribution)
 {
     this.moment = Moment;
     this.strainDistribution = StrainDistribution;
 }
        protected virtual ForceMomentContribution GetCompressionForceRebarResultant(LinearStrainDistribution StrainDistribution, FlexuralCompressionFiberPosition compFiberPosition)
        {
            ForceMomentContribution steelContrib = GetRebarResultant(StrainDistribution, ResultantType.Compression);

            return steelContrib;
        }
        protected virtual ForceMomentContribution GetTensionForceResultant(LinearStrainDistribution StrainDistribution)
        {
            ForceMomentContribution rebarContribution = GetRebarResultant(StrainDistribution, ResultantType.Tension);

            return(rebarContribution);
        }
 ForceMomentContribution GetConcreteParabolicStressForceResultant(LinearStrainDistribution StrainDistribution)
 {
     throw new NotImplementedException();
 }   
 public ConcreteSectionFlexuralAnalysisResult(double Moment, LinearStrainDistribution StrainDistribution, RebarPointResult controllingTensionBar): base(Moment,StrainDistribution)
 {
     this.ControllingTensionBar = controllingTensionBar;
 }
 ForceMomentContribution GetConcreteParabolicStressForceResultant(LinearStrainDistribution StrainDistribution)
 {
     throw new NotImplementedException();
 }
        protected double GetCompressionBlockDepth(LinearStrainDistribution StrainDistribution, FlexuralCompressionFiberPosition CompressionFiberPosition)
        {
            double c = GetDistanceToNeutralAxis(StrainDistribution, CompressionFiberPosition);

            return(this.GetCompressionBlockDepth(c));
        }