toop_project.src.Matrix.SparseMatrix.LU C# (CSharp) Method

LU() public method

public LU ( ) : BaseMatrix
return BaseMatrix
        public override BaseMatrix LU()
        {
            var matrixILU = new SparseMatrix (ia, ja, al.Clone() as double[], au.Clone() as double[], di.Clone() as double[]);
            for (int i = 0; i < matrixILU.Size; i++)
            {
                int i0 = matrixILU.ia[i];
                int i1 = matrixILU.ia[i + 1];
                double S = 0;
                for (int k = i0; k < i1; k++)
                {
                    double Sl = 0, Su = 0;
                    int iind = i0;
                    int j = matrixILU.ja[k];
                    int j0 = matrixILU.ia[j];
                    int j1 = matrixILU.ia[j + 1];
                    if (j1 - j0 != 0)
                    {
                        int jind = j0;
                        while (iind < k)
                        {
                            if (matrixILU.ja[jind] > matrixILU.ja[iind])
                                iind++;
                            else
                                if (matrixILU.ja[jind] < matrixILU.ja[iind])
                                jind++;
                            else
                            {
                                Sl += matrixILU.al[iind] * matrixILU.au[jind];
                                Su += matrixILU.au[iind] * matrixILU.al[jind];
                                iind++;
                                jind++;
                            }
                        }
                    }
                    matrixILU.au[k] = (matrixILU.au[k] - Su) / matrixILU.di[j];
                    matrixILU.al[k] = (matrixILU.al[k] - Sl);
                    if (double.IsInfinity(matrixILU.au[k]))
                        throw new Exception(String.Concat("Предобусловливание LU : деление на 0 для расчёта элемента (", j + 1, ",", i + 1, ")"));
                    if (double.IsNaN(matrixILU.au[k]))
                        throw new Exception(String.Concat("Предобусловливание LU : неопределённость 0/0 для элемента (", j+1, ",", i+1,")"));
                    S += matrixILU.au[k] * matrixILU.al[k]; // диагональ в U!!!!!
                }
                matrixILU.di[i] = matrixILU.di[i] - S;
            }
            return matrixILU;
        }