public static double BRBNcre_chev(
        [ExcelArgument(Name = "modeNum", Description = "Mode number")] double modeNum,
        [ExcelArgument(Name = "Kg1", Description = "Gusset rotational stiffness")] double Kg1,
        [ExcelArgument(Name = "Kg2", Description = "Gusset rotational stiffness")] double Kg2,
        [ExcelArgument(Name = "Kr1", Description = "Restrainer end rotational stiffness")] double Kr1,
        [ExcelArgument(Name = "Kr2", Description = "Restrainer end rotational stiffness")] double Kr2,
        [ExcelArgument(Name = "ξ1L0", Description = "Connection buckling length")] double ξ1L0,
        [ExcelArgument(Name = "ξ2L0", Description = "Connection buckling length")] double ξ2L0,
        [ExcelArgument(Name = "γ1EIr", Description = "Connection flexural stiffness")] double γ1EIr,
        [ExcelArgument(Name = "γ2EIr", Description = "Connection flexural stiffness")] double γ2EIr,
        [ExcelArgument(Name = "L0", Description = "Full brace buckling length")] double L0,
        [ExcelArgument(Name = "EIr", Description = "Restrainer flexural stiffness")] double EIr,
        [ExcelArgument(Name = "Tolerance", Description = "Load increment [default = 1·force unit]")] object _tol)
    {
        // increments are based on N/Ncr0
        double tol  = Check <double>(_tol, 1);
        double Ncr0 = BRBNcr0(ξ1L0, γ1EIr);

        double ke = ElasticBuckling.ke_crit(N => ElasticBuckling.det_chev(N,
                                                                          BRBnorm_K(Kg1, ξ1L0, γ1EIr), BRBnorm_K(Kg2, ξ2L0, γ2EIr),
                                                                          BRBnorm_K(Kr1, ξ1L0, γ1EIr), BRBnorm_K(Kr2, ξ2L0, γ2EIr),
                                                                          ξ1L0 / L0, ξ2L0 / L0, γ1EIr / EIr, γ2EIr / EIr),
                                            modeNum, tol / Ncr0, 1);

        if (double.IsInfinity(ke))
        {
            return(0);
        }
        else
        {
            return(Ncr0 / Pow(ke, 2));
        }
    }
    public static double BRBNcre_one(
        [ExcelArgument(Name = "Kg", Description = "Gusset rotational stiffness")] double Kg,
        [ExcelArgument(Name = "Kr", Description = "Restrainer end rotational stiffness")] double Kr,
        [ExcelArgument(Name = "ξL0", Description = "Connection buckling length")] double ξL0,
        [ExcelArgument(Name = "γEIr", Description = "Connection flexural stiffness")] double γEIr,
        [ExcelArgument(Name = "L0", Description = "Full brace buckling length")] double L0,
        [ExcelArgument(Name = "EIr", Description = "Restrainer flexural stiffness")] double EIr,
        [ExcelArgument(Name = "Tolerance", Description = "Load increment [default = 1·force unit]")] object _tol)
    {
        // increments are based on N/Ncr0
        double tol  = Check <double>(_tol, 1);
        double Ncr0 = BRBNcr0(ξL0, γEIr);

        double ke = ElasticBuckling.ke_crit(N => ElasticBuckling.det_one(N,
                                                                         BRBnorm_K(Kg, ξL0, γEIr), BRBnorm_K(Kr, ξL0, γEIr), ξL0 / L0, γEIr / EIr),
                                            1, tol / Ncr0, 1);

        if (double.IsInfinity(ke))
        {
            return(0);
        }
        else
        {
            return(Ncr0 / Pow(ke, 2));
        }
    }
    public static double BRBke_asym2(
        [ExcelArgument(Name = "κg", Description = "Normalized gusset rotational stiffness (Kg·ξL0/γEIr)")] double κg,
        [ExcelArgument(Name = "κr", Description = "Normalized restrainer end rotational stiffness (Kr·ξL0/γEIr)")] double κr,
        [ExcelArgument(Name = "ξ", Description = "Ratio of connection to full buckling length (ξL0/L0)")] double ξ,
        [ExcelArgument(Name = "γ", Description = "Ratio of connection to restrainer flexural stiffness (γEIr/EIr)")] double γ,
        [ExcelArgument(Name = "Tolerance", Description = "Load increment = tol·Ncr0 [default = 0.0001]")] object _tol,
        [ExcelArgument(Name = "Mode", Description = "Mode number [default = 1]")] object _mode,
        [ExcelArgument(Name = "Maximum", Description = "Maximum [default = 2.0]")] object _max)
    {
        // increments are based on N/Ncr0
        double tol  = Check <double>(_tol, 0.0001);
        double mode = Check <double>(_mode, 1);
        double max  = Check <double>(_max, 2);

        return(ElasticBuckling.ke_crit(N => ElasticBuckling.det_asym_rigidrest(N, κg, κr, ξ, γ), mode, tol, max));
    }
    public static double BRBcgSym(
        [ExcelArgument(Name = "ke", Description = "Effective length factor (NcrB=π²γEIr/(ke·ξL0)²)")] double ke,
        [ExcelArgument(Name = "κg", Description = "Normalized gusset rotational stiffness (Kg·ξL0/γEIr)")] double κg,
        [ExcelArgument("Return absolute value [default = true]", Name = "absolute")] object _absolute)
    {
        bool absolute = Check <bool>(_absolute, true);

        if (!absolute)
        {
            return(ElasticBuckling.CgSym(ke, κg));
        }
        else
        {
            return(Abs(ElasticBuckling.CgSym(ke, κg)));
        }
    }
    public static double BRBke_chev(
        [ExcelArgument(Name = "modeNum", Description = "Mode number")] double modeNum,
        [ExcelArgument(Name = "κg1", Description = "Normalized gusset rotational stiffness (Kg1·ξ1L0/γ1EIr)")] double κg1,
        [ExcelArgument(Name = "κg2", Description = "Normalized gusset rotational stiffness (Kg2·ξ2L0/γ2EIr)")] double κg2,
        [ExcelArgument(Name = "κr1", Description = "Normalized restrainer end rotational stiffness (Kr1·ξ1L0/γ1EIr)")] double κr1,
        [ExcelArgument(Name = "κr2", Description = "Normalized restrainer end rotational stiffness (Kr2·ξ2L0/γ2EIr)")] double κr2,
        [ExcelArgument(Name = "ξ1", Description = "Ratio of connection to full buckling length (ξ1L0/L0)")] double ξ1,
        [ExcelArgument(Name = "ξ2", Description = "Ratio of connection to full buckling length (ξ2L0/L0)")] double ξ2,
        [ExcelArgument(Name = "γ1", Description = "Ratio of connection to restrainer flexural stiffness (γ1EIr/EIr)")] double γ1,
        [ExcelArgument(Name = "γ2", Description = "Ratio of connection to restrainer flexural stiffness (γ2EIr/EIr)")] double γ2,
        [ExcelArgument(Name = "Tolerance", Description = "Load increment = tol·Ncr0 [default = 0.0001]")] object _tol,
        [ExcelArgument(Name = "Maximum", Description = "Maximum [default = 2.0]")] object _max)

    {
        // increments are based on N/Ncr0
        double tol = Check <double>(_tol, 0.0001);
        double max = Check <double>(_max, 2);

        return(ElasticBuckling.ke_crit(N => ElasticBuckling.det_chev(N, κg1, κg2, κr1, κr2, ξ1, ξ2, γ1, γ2), modeNum, tol, max));
    }