public IAnalysisBeam CreateBeamInstance(string BeamCaseId, LoadBeam load, ICalcLog Log)
        {
            double L = d.L;
            double LoadDimension_a = d.a_load;

            Beam bm = null;

            if (BeamCaseId.StartsWith("C1") == true)
            {
                bm = new BeamSimple(d.L, load, Log);
            }
            else if (BeamCaseId.StartsWith("C2") == true)
            {
                bm = new BeamSimpleWithOverhang(L, LoadDimension_a, load, Log);
            }
            else if (BeamCaseId.StartsWith("C3") == true)
            {
                bm = new BeamPinnedFixed(L, load, Log);
            }
            else if (BeamCaseId.StartsWith("C4") == true)
            {
                bm = new BeamFixedFixed(L, load, Log);
            }
            else //else if (BeamCaseId.StartsWith("C5") == true)
            {
                bm = new BeamCantilever(L, load, Log);
            }

            bm.ModulusOfElasticity = d.E;
            bm.MomentOfInertia     = d.I;

            return(bm);
        }
        //note for overhang beam a is the overhang with 
        //1 exception of concentrated load between supports
        public ConcentratedLoadOverhang(BeamSimpleWithOverhang beam, double P, double a)
	    {
                this.beam = beam;
                L = beam.Length;
                this.P = P;
                this.a = a;
                X1Calculated = false;
        }
 //note for overhang beam a is the overhang with
 //1 exception of concentrated load between supports
 public ConcentratedLoadBetweenSupports(BeamSimpleWithOverhang beam, double P, double a)
 {
     this.beam = beam;
     L         = beam.Length;
     this.P    = P;
     this.a    = a;
     this.b    = L - a;
 }
            //note for overhang beam a is the overhang with 
            //1 exception of concentrated load between supports
            public ConcentratedLoadBetweenSupports(BeamSimpleWithOverhang beam, double P, double a)
	        {
                this.beam = beam;
                L = beam.Length;
                this.P = P;
                this.a = a;
                this.b = L - a;
            }
 //note for overhang beam a is the overhang with
 //1 exception of concentrated load between supports
 public UniformLoadFull(BeamSimpleWithOverhang beam, double w)
 {
     this.beam    = beam;
     L            = beam.Length;
     this.w       = w;
     this.a       = beam.OverhangLength;
     X1Calculated = false;
 }
 //note for overhang beam a is the overhang with
 //1 exception of concentrated load between supports
 public DistributedLoadOverhang(BeamSimpleWithOverhang beam, double w)
 {
     this.beam    = beam;
     L            = beam.Length;
     this.w       = w;
     this.a       = beam.OverhangLength;
     X1Calculated = false;
 }
 //note for overhang beam a is the overhang with 
 //1 exception of concentrated load between supports
 public UniformLoadFull(BeamSimpleWithOverhang beam, double w)
 {
     this.beam = beam;
     L = beam.Length;
     this.w = w;
     this.a = beam.OverhangLength;
     X1Calculated = false;
 }
 //note for overhang beam a is the overhang with
 //1 exception of concentrated load between supports
 public ConcentratedLoadOverhang(BeamSimpleWithOverhang beam, double P, double a)
 {
     this.beam    = beam;
     L            = beam.Length;
     this.P       = P;
     this.a       = a;
     X1Calculated = false;
 }
 //note for overhang beam a is the overhang with 
 //1 exception of concentrated load between supports
 public DistributedLoadOverhang(BeamSimpleWithOverhang beam, double w)
 {
     this.beam = beam;
     L = beam.Length;
     this.w = w;
     this.a = beam.OverhangLength;
     X1Calculated = false;
 }
        public BeamCase GetCase(LoadBeam load, IAnalysisBeam beam)
        {
            this.beam = beam as BeamSimpleWithOverhang;
            BeamCase BeamLoadCase = null;

            if (load is LoadConcentrated)
            {
                BeamLoadCase = GetConcentratedLoadCase(load);
            }
            else if (load is LoadDistributed)
            {
                BeamLoadCase = GetDistributedLoadCase(load);
            }

            return BeamLoadCase;
        }
        public BeamCase GetCase(LoadBeam load, IAnalysisBeam beam)
        {
            this.beam = beam as BeamSimpleWithOverhang;
            BeamCase BeamLoadCase = null;

            if (load is LoadConcentrated)
            {
                BeamLoadCase = GetConcentratedLoadCase(load);
            }
            else if (load is LoadDistributed)
            {
                BeamLoadCase = GetDistributedLoadCase(load);
            }

            return(BeamLoadCase);
        }
 //note for overhang beam a is the overhang with
 //1 exception of concentrated load between supports
 public DistributedLoadBetweenSupports(BeamSimpleWithOverhang beam, double w)
 {
     this.beam = beam;
     L         = beam.Length;
     this.w    = w;
 }
 //note for overhang beam a is the overhang with 
 //1 exception of concentrated load between supports
 public DistributedLoadBetweenSupports(BeamSimpleWithOverhang beam, double w)
 {
     this.beam = beam;
     L = beam.Length;
     this.w = w;
 }