private void ssor(IDenseRowAccessMatrix A, double[] xdata) { int n = A.RowCount; // M = (D+L) D^{-1} (D+L)^T // Solves (1/omega)*(D+L) y = b for (int i = 0; i < n; ++i) { // Do nothing if we get a divide by zero if (Math.Abs(diag[i]) == 0.0) { continue; } double[] Arow = A.GetRow(i); double sum = 0; for (int j = 0; j < i; ++j) { sum += Arow[j] * xdata[j]; } xdata[i] = (omega / diag[i]) * (xdata[i] - sum); } // Solves (omega/(2-omega))*D^{-1} z = y for (int i = 0; i < n; ++i) { // No need to do anything if (Math.Abs(diag[i]) == 0.0) { continue; } xdata[i] = (2 - omega) / omega * diag[i] * xdata[i]; } // Solves (1/omega)*(D+L)^T x = z for (int i = n - 1; i >= 0; --i) { // Do nothing if we get a divide by zero if (Math.Abs(diag[i]) == 0.0) { continue; } double[] Arow = A.GetRow(i); double sum = 0; for (int j = i + 1; j < n; ++j) { sum += Arow[j] * xdata[j]; } xdata[i] = (omega / diag[i]) * (xdata[i] - sum); } }
private void sor(IDenseRowAccessMatrix A, double[] bdata, double[] xdata) { for (int i = 0; i < A.RowCount; ++i) { double[] Arow = A.GetRow(i); double newVal = 0, diagVal = 0.0; for (int j = 0; j < Arow.Length; ++j) { if (j != i) { newVal += Arow[j] * xdata[j]; } else { diagVal = Arow[j]; } } newVal = (bdata[i] - newVal) / diagVal; xdata[i] += omega * (newVal - xdata[i]); } }