/// <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(); }