static void Main(string[] args)
        {
            bool testSuccessfull = true;

            CommonData data = new CommonData();
            foreach (string f in Directory.GetFiles("..\\..\\..\\..\\samples"))
            {
                try
                {
                    data.Load(f);
                    Console.WriteLine("File {0} was read successfully", f);
                }
                catch (Exception e)
                {
                    testSuccessfull = false;
                    Console.WriteLine("Error during reading file {0}!!!", f);
                    Console.WriteLine(e.ToString());
                    Console.WriteLine();
                    Console.WriteLine("Press Enter to continue...");
                    Console.ReadLine();
                }
            }

            Console.WriteLine();
            if (testSuccessfull)
            {
                Console.WriteLine("Test has finished successfully. Press Enter to continue...");
            }
            else
            {
                Console.WriteLine("Test has failed. Press Enter to continue...");
            }
            Console.ReadLine();
        }
        /*Применение изменений, последовавших в ходе алгоритма Ктахилла-Макки*/
        void applyCuthillMcKee(CommonData c, int[] newTopsNum)
        {
            List<int> l = newTopsNum.ToList<int>();
            List<int[]> newConnMatrix = new List<int[]>();
            int[] connString;
            for (int i = 0; i < c.NTotalNodes; i++)
            {
                connString = new int[c.NTotalNodes];
                int oldTop = l[i];
                connString[i] = 1;
                for (int j = 0; j < c.NTotalNodes; j++)
                {
                    if ((oldTop != j) && (c.M[oldTop][j] == 1))
                    {
                        connString[l.IndexOf(j)] = 1;
                    }
                }
                newConnMatrix.Add(connString);
            }
            Point[] newCoord = new Point[c.NTotalNodes];
            for(int i = 0; i < c.NTotalNodes; i++)
            {
                newCoord[i] = c.Coords[l[i]];
            }
            int[] newBoundExternal = new int[c.NExternalNodes];
            int k = 0;
            foreach (int i in c.BoundExternal)
            {
                newBoundExternal[k] = l.IndexOf(i);
                k++;
            }
            int[] newBoundInternal = new int[c.NInternalNodes];
            k = 0;
            foreach (int i in c.BoundInternal)
            {
                newBoundInternal[k] = l.IndexOf(i);
                k++;
            }

            int[] newChangedPoints = new int[c.ChangedPoints.Length];
            k = 0;
            foreach (int i in c.ChangedPoints)
            {
                newChangedPoints[k] = l.IndexOf(i);
                k++;
            }
            if (getBandWidthOfConnectivityMatrix(c.M)>getBandWidthOfConnectivityMatrix(newConnMatrix.ToArray()))
            {
                c.M = newConnMatrix.ToArray();
                c.BoundExternal = newBoundExternal;
                c.BoundInternal = newBoundInternal;
                c.Coords = newCoord;
                c.SetChangedPoints(newChangedPoints, true);
            }
        }
        /* Основная процедура решения. Возвращает массив координат точек после деформации */
        public double[] Solve(CommonData cd)
        {
            /* Вызываем Катхилла-Макки для перенумерации */
            /* Инициализируем глобальную матрицу жесткости K */
            /* Для каждого элемента считаем матрицу жесткости с одновременным занесением в глобальную матрицу жесткости */
            /* Преобразовать K к L-U виду */
            /* Посчитать f с учетом граничных условий (CommonData.u) */
            /* Решаем методом Холецкого LU*x=f и возвращаем результат */

            bool ok;
            int[] m = CuthillMcKee(cd.M, out ok);
            if (ok)
            {
                applyCuthillMcKee(cd, m);
            }
            int L = getBandWidthOfConnectivityMatrix(cd.M);
            int[][] tr = GetTriangles(cd.NTotalNodes, cd.Coords, cd.M);
            return Solve_main(L, cd.NTotalNodes, tr.Length, cd.Coords, tr, cd.u, cd.E, cd.v);
        }
 private void tsmiLoad_Click(object sender, EventArgs e)
 {
     if (ofdLoad.ShowDialog() == DialogResult.OK)
     {
         cd = new CommonData();
         cd.Load(ofdLoad.FileName);
         GetExtremePosition();
         changedPoints = new List<int>();
         tsmiCalculate.Enabled = true;
         pbMain.Refresh();
     }
 }
        private double[] RunSolverTest(string f, double[] u)
        {
            Console.WriteLine("Loading data from {0}...", f);

            try
            {
                CommonData data = new CommonData();
                data.Load(test_samples_dir + f);
                for (int i = 0; i < u.Length; i+=2)
                {
                    data.Coords[i / 2].Dx = u[i];
                    data.Coords[i / 2].Dy = u[i+1];
                }
                Console.WriteLine("Data is loaded");
                Solver s = new Solver();
                return s.Solve(data);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
                return null;
            }
        }