public static GaussianIntegrator CreateFor1DProblem(Func <double, Matrix> function, double x0, double x1,
                                                            int sampling)
        {
            var buf = new GaussianIntegrator();

            buf.A1 = x0;
            buf.A2 = x1;

            buf.F1 = gama => 0;
            buf.F2 = gama => 1;

            buf.G1 = (eta, gama) => 0;
            buf.G2 = (eta, gama) => 1;

            buf.GammaPointCount = sampling;
            buf.XiPointCount    = buf.EtaPointCount = 1;

            buf.H = new FunctionMatrixFunction((xi, eta, gama) => function(gama));

            return(buf);
        }
        /// <inheritdoc/>
        public Matrix CalcLocalStiffnessMatrix(Element targetElement)
        {
            var intg = new BriefFiniteElementNet.Integration.GaussianIntegrator();
            var tri  = targetElement as TriangleElement;

            intg.A2 = 1;
            intg.A1 = 0;

            intg.F2 = (gama => 1);
            intg.F1 = (gama => 0);

            intg.G2 = ((eta, gama) => 1 - eta);
            intg.G1 = ((eta, gama) => 0);

            intg.XiPointCount    = intg.EtaPointCount = 3;
            intg.GammaPointCount = 1;

            intg.H = new FunctionMatrixFunction((xi, eta, gamma) =>
            {
                var b = GetBMatrixAt(targetElement, xi, eta);

                var d = this.GetDMatrixAt(targetElement, xi, eta);

                var j = GetJMatrixAt(targetElement, xi, eta);

                var detJ = j.Determinant();

                var ki = b.Transpose() * d * b;

                ki.Scale(Math.Abs(j.Determinant()));
                //eq 3.27: thickness* bT * d * b;
                ki.Scale(tri.Section.GetThicknessAt(new double[] { xi, eta }));

                return(ki);
            });

            var res = intg.Integrate();

            return(res);
        }
        public Matrix CalcLocalStiffnessMatrix(Element targetElement)
        {
            var intg = new BriefFiniteElementNet.Integration.GaussianIntegrator(); // using eq. 3.50 [1] / eq 8 [3]
            var quad = targetElement as QuadrilaturalElement;

            intg.A2 = 1.0;
            intg.A1 = 0.0;

            intg.F2 = (gama => + 1.0);
            intg.F1 = (gama => - 1.0);

            intg.G2 = (eta, gama) => + 1.0;
            intg.G1 = (eta, gama) => - 1.0;

            intg.XiPointCount    = intg.EtaPointCount = 3; // ref [2]
            intg.GammaPointCount = 1;

            intg.H = new FunctionMatrixFunction((xi, eta, gamma) =>
            {
                var b = GetBMatrixAt(targetElement, xi, eta);

                var d = this.GetDMatrixAt(targetElement, xi, eta);

                var j = GetJMatrixAt(targetElement, xi, eta);

                var detJ = j.Determinant();

                var ki = b.Transpose() * d * b;

                ki.Scale(Math.Abs(j.Determinant()));
                ki.Scale(quad.Section.GetThicknessAt(new double[] { xi, eta }));

                return(ki);
            });

            var res = intg.Integrate();

            return(res);
        }
        /// <inheritdoc/>
        public Matrix CalcLocalStiffnessMatrix(Element targetElement)
        {
            var intg = new BriefFiniteElementNet.Integration.GaussianIntegrator();

            intg.A2 = 1;
            intg.A1 = 0;

            intg.F2 = (gama => 1);
            intg.F1 = (gama => 0);

            intg.G2 = ((eta, gama) => 1 - eta);
            intg.G1 = ((eta, gama) => 0);

            intg.XiPointCount    = intg.EtaPointCount = 3;
            intg.GammaPointCount = 1;

            intg.H = new FunctionMatrixFunction((xi, eta, gamma) =>
            {
                var b = GetBMatrixAt(targetElement, xi, eta);

                var d = this.GetDMatrixAt(targetElement, xi, eta);

                var j = GetJMatrixAt(targetElement, xi, eta);

                var detJ = j.Determinant();

                var ki = b.Transpose() * d * b;

                ki.MultiplyByConstant(Math.Abs(j.Determinant()));

                return(ki);
            });

            var res = intg.Integrate();

            return(res);
        }