/*
         * private Matrix GetVariableMatrixOnElement(FiniteElement element, double ksi, double eta)
         * {
         *  Matrix VariableMatrix = new Matrix(4, 4);
         *  Vector du = previousRes.DU(ksi, eta, element);
         *  double d1u1 = du[0];
         *  double d3u3 = du[1];
         *  double d3u1 = du[2];
         *  double d1u3 = du[3];
         *
         *  VariableMatrix[0, 0] = 1.5 * M1 * d1u1 + 0.5 * M2 * d3u3;
         *  VariableMatrix[0, 1] = M2 * d3u3 + M2 * d1u1;
         *  VariableMatrix[0, 2] = M2 * d3u1 + G13 * (2 * d3u1 + d1u3);
         *  VariableMatrix[0, 3] = M1 * d1u3 + G13 * d1u1;
         *
         *  VariableMatrix[1, 1] = 1.5 * M3 * d3u3 + 0.5 * M2 * d1u1;
         *  VariableMatrix[1, 2] = M3 * d3u1 + G13 * d1u3;
         *  VariableMatrix[1, 3] = M2 * d1u3 + G13 * (2 * d1u3 + d3u1);
         *
         *  VariableMatrix[2, 2] = 0.5 * M3 * d3u3 + (0.5 * M2 + G13)*d1u1;
         *  VariableMatrix[2, 3] = G13 * (d3u3 + d1u1);
         *
         *  VariableMatrix[3, 3] = 0.5 * M1 * d1u1 + (0.5 * M2 + G13) * d3u3;
         *
         *  return VariableMatrix;
         * }*/

        private Matrix GetLocalDerivativeMatrix(FiniteElement element, double ksi, double eta)
        {
            Matrix LocalDerivativeMatrix = new Matrix(8, 4);

            Matrix gradNksieta = new Matrix(2, 4);

            gradNksieta[0, 0] = (eta - 1) * 0.25;
            gradNksieta[1, 0] = (ksi - 1) * 0.25;
            gradNksieta[0, 1] = (1 - eta) * 0.25;
            gradNksieta[1, 1] = (-ksi - 1) * 0.25;
            gradNksieta[0, 2] = (eta + 1) * 0.25;
            gradNksieta[1, 2] = (ksi + 1) * 0.25;
            gradNksieta[0, 3] = (-eta - 1) * 0.25;
            gradNksieta[1, 3] = (1 - ksi) * 0.25;

            Jacobian J = new Jacobian();

            J.Element = element;

            Matrix gradN = J.GetInverseJacobian(ksi, eta) * gradNksieta;

            LocalDerivativeMatrix[0, 0] = LocalDerivativeMatrix[1, 3] = gradN[0, 0];
            LocalDerivativeMatrix[2, 0] = LocalDerivativeMatrix[3, 3] = gradN[0, 1];
            LocalDerivativeMatrix[4, 0] = LocalDerivativeMatrix[5, 3] = gradN[0, 2];
            LocalDerivativeMatrix[6, 0] = LocalDerivativeMatrix[7, 3] = gradN[0, 3];

            LocalDerivativeMatrix[1, 1] = LocalDerivativeMatrix[0, 2] = gradN[1, 0];
            LocalDerivativeMatrix[3, 1] = LocalDerivativeMatrix[2, 2] = gradN[1, 1];
            LocalDerivativeMatrix[5, 1] = LocalDerivativeMatrix[4, 2] = gradN[1, 2];
            LocalDerivativeMatrix[7, 1] = LocalDerivativeMatrix[6, 2] = gradN[1, 3];

            return(LocalDerivativeMatrix);
        }
        private Matrix LocalStiffnessMatrixFunction(double ksi, double eta)
        {
            Matrix derivativeMatrix = GetLocalDerivativeMatrix(elementCurrent, ksi, eta);

            Jacobian J = new Jacobian();

            J.Element = elementCurrent;
            //Matrix VariableMatrixOnElement = GetVariableMatrixOnElement(elementCurrent, ksi, eta);

            return(derivativeMatrix * ConstMatrix * Matrix.Transpose(derivativeMatrix) * J.GetJacobianDeterminant(ksi, eta));
        }
        private Matrix LocalVectorFunction(double ksi, double eta)
        {
            Matrix derivativeMatrix = GetLocalDerivativeMatrix(elementCurrent, ksi, eta);

            Jacobian J = new Jacobian();

            J.Element = elementCurrent;
            Matrix VariableVectorOnElement = GetVariableVectorOnElement(elementCurrent, ksi, eta);

            return(derivativeMatrix * VariableVectorOnElement * J.GetJacobianDeterminant(ksi, eta));
        }