private static BoundaryCondition MapBoundaryCondition(XElement Xsegment, int numberOfCollocationPoints)
        {
            var XboundaryCondition = Xsegment.Element(BoundaryConditionElementName);
            BoundaryConditionType               boundaryConditionType;
            BoundaryConditionValueType          boundaryConditionValueType;
            TimeIntervalBoundaryConditionHelper timeIntervalValueBoundaryConditionHelper = null;
            RobinBoundaryConditionHelper        robinBoundaryConditionHelper             = null;

            if (XboundaryCondition.Attribute(BoundaryConditionTypeAttributeName).Value == "q")
            {
                boundaryConditionType = BoundaryConditionType.HeatFlux;
            }
            else
            {
                boundaryConditionType = BoundaryConditionType.Temperature;
            }

            var boundaryConditionExpression           = String.Empty;
            var valueBoundaryConditionXElement        = XboundaryCondition.Elements(valueBoundaryConditionElementName);
            var timeIntervalBoundaryConditionXElement = XboundaryCondition.Elements(timeIntervalBoundaryConditionElementName);
            var robinBoundaryConditionXElement        = XboundaryCondition.Elements(robinBoundaryConditionElementName);

            if (robinBoundaryConditionXElement.Count() > 0)
            {
                robinBoundaryConditionHelper = MapRobinBoundaryCondition(robinBoundaryConditionXElement.First());
                boundaryConditionValueType   = BoundaryConditionValueType.ConvectionRadiation;
            }
            else if (timeIntervalBoundaryConditionXElement.Count() > 0)
            {
                timeIntervalValueBoundaryConditionHelper = MapTimeIntervalValueBoundaryCondition(timeIntervalBoundaryConditionXElement);
                boundaryConditionValueType = BoundaryConditionValueType.TimeIntervalValue;
            }
            else if (valueBoundaryConditionXElement.Count() > 0)
            {
                boundaryConditionExpression = valueBoundaryConditionXElement.First().Value.Replace(".", ",");
                boundaryConditionValueType  = BoundaryConditionValueType.Value;
            }
            else
            {
                throw new AggregateException("Wrong boundary condition");
            }

            var boundaryCondition = new BoundaryCondition(boundaryConditionType, numberOfCollocationPoints, boundaryConditionExpression, boundaryConditionValueType, timeIntervalValueBoundaryConditionHelper, robinBoundaryConditionHelper);

            return(boundaryCondition);
        }
        public BoundaryCondition(BoundaryConditionType BoundaryConditionType, int degree, string expression, BoundaryConditionValueType boundaryConditionValueType, TimeIntervalBoundaryConditionHelper timeIntervalValueBoundaryConditionHelper, RobinBoundaryConditionHelper robinBoundaryConditionHelper)
        {
            this.BoundaryConditionType = BoundaryConditionType;
            this.degree = degree;
            this.boundaryConditionValueType               = boundaryConditionValueType;
            this.robinBoundaryConditionHelper             = robinBoundaryConditionHelper;
            this.timeIntervalValueBoundaryConditionHelper = timeIntervalValueBoundaryConditionHelper;
            if (expression != string.Empty)
            {
                var engine = new CalculationEngine();
                this.BoundaryValueExpression = engine.Build(expression);
            }

            CreateBoundaryConditionVector(degree, new double[] { });
        }