Exemplo n.º 1
0
        /// <summary>
        /// Конструктор.
        /// </summary>
        /// <param name="elements">Список элементов.</param>
        public FEMethod(IEnumerable <Triangle> elements)
        {
            // Узлы с неизвестными потенциалами.
            nullPoints = elements.SelectMany(p => p.Points).Distinct().Where(p => p.Potential == null).ToArray();

            // Идентификаторы узлов с неизвестными потенциалами.
            foreach (var p in nullPoints)
            {
                p.ID = n++;
            }

            // Расчет базисных функций и матрицы коеффициентов.
            foreach (var elem in elements)
            {
                elem.BasicFunctionElement();
            }

            // Построение разреженной СЛАУ.
            timeFill = Stopwatch.StartNew();
            FillSparseMatrix();
            timeFill.Stop();

            // Решение разреженной СЛАУ.
            timeSol = Stopwatch.StartNew();
            var conjugate = new BiConjugateGradientSolver <double>(matrixA);

            conjugate.Preconditioner = new IncompleteLUPreconditioner <double>(matrixA);
            var sol = conjugate.Solve(vectorB);

            timeSol.Stop();

            SetPotential(sol);

            matrixA.Dispose();
            vectorB.Dispose();
            sol.Dispose();
        }