コード例 #1
0
        /*Применение изменений, последовавших в ходе алгоритма Ктахилла-Макки*/
        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);
            }
        }
コード例 #2
0
ファイル: MainForm.cs プロジェクト: Ana555/finite_elements
        private void button2_Click(object sender, EventArgs e)
        {
            cd.SetChangedPoints(changedPoints.ToArray(), false);
            Solver s = new Solver();

            s.Solve(cd);
            pbMain.Refresh();
            /* Создать Solver и вызывать Solver.Solve() */
            /* Поменять CommmonData.Coords в соответствии с решением */
            /* Вызвать DrawArea. Пока просто вызвать перерисовку pbMain.Refresh()*/
            Solver solver = new Solver();

            changedPoints = new List <int>(cd.ChangedPoints);
            double[] deltas = solver.Solve(cd);
            if (deltas != null)
            {
                int j;
                for (int i = 0; i < deltas.Length; i += 2)
                {
                    j = i / 2;
                    if (!changedPoints.Contains(j))
                    {
                        cd.Coords[i / 2].Dx += deltas[i];
                        cd.Coords[i / 2].Dy += deltas[i + 1];
                    }
                }
            }
            pbMain.Refresh();
            for (int i = 0; i < cd.NTotalNodes; i++)
            {
                cd.Coords[i].X += cd.Coords[i].Dx;
                cd.Coords[i].Y += cd.Coords[i].Dy;
                cd.Coords[i].Dx = 0;
                cd.Coords[i].Dy = 0;
            }
            changedPoints = new List <int>();
            cd.ChangedPointsClear();
            cd.SetChangedPoints(changedPoints.ToArray(), false);
            pbMain.Refresh();
        }
コード例 #3
0
        /*Применение изменений, последовавших в ходе алгоритма Ктахилла-Макки*/
        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);
            }
        }