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; } }