public void Calculate_X_DNDX_DetJacobian(Vector Xi, Node_ND[] ElementNodes, out Vector X, out Matrix_Jagged DNDX, out double Det_Jac)
        {
            Vector[] Xp = Get_ElementNodal_X(ElementNodes);
            Vector   N;

            Vector[] dNdXi = Calculate_DerivativesOfShapeFunctions_WRTXi(Xi, out N);

            X = Interpolate_Variable(Xp, N);

            Matrix_Jagged DNDXi = new Matrix_Jagged(dNdXi).Transpose();
            Matrix_Jagged DXDXi = Interpolate_DerivativeOfVariable_WRTXi(Xp, dNdXi);
            Matrix_Jagged DXiDX = DXDXi.Invert(out Det_Jac);

            DNDX = DNDXi * DXiDX;
        }
        public virtual Matrix_Jagged Calculate_InverseJacobian_DXiDX(Vector Xi, Node_ND[] ElementNodes)
        {
            Matrix_Jagged DXDXi = Calculate_Jacobian_DXDXi(Xi, ElementNodes);

            return(DXDXi.Invert());
        }
 public virtual Matrix_Jagged Calculate_InverseJacobian_DXiDX(Vector Xi, Node_ND[] ElementNodes, out Matrix_Jagged DXDXi, out double Det_Jacobian)
 {
     DXDXi = Calculate_Jacobian_DXDXi(Xi, ElementNodes);
     return(DXDXi.Invert(out Det_Jacobian));
 }
 public virtual void Calculate_dNdXi_DXDXi_DXiDX_DetJac(Vector Xi, Node_ND[] ElementNodes, out Vector[] dNdXi, out Matrix_Jagged DXDXi, out Matrix_Jagged DXiDX, out double DetJac)
 {
     Calculate_dNdXi_DXDXi(Xi, ElementNodes, out dNdXi, out DXDXi);
     DXiDX = DXDXi.Invert(out DetJac);
 }