public SolverResult Solve <Tunknowns, Trhs>(Tunknowns _x, Trhs _rhs) where Tunknowns : IList <double> where Trhs : IList <double> { Init(); if (_x.Count != this.Matrix.RowPartitioning.LocalLength) { throw new ArgumentException("Mismatch in length of X vector."); } if (_rhs.Count != this.Matrix.RowPartitioning.LocalLength) { throw new ArgumentException("Mismatch in lenght of RHS vector."); } double[] x = _x as double[]; if (x == null) { x = _x.ToArray(); } double[] rhs = _rhs as double[]; if (x == null) { rhs = _rhs.ToArray(); } SolverResult R = new SolverResult(); Stopwatch stw = new Stopwatch(); stw.Start(); int ktype = (int)this.m_KrylovType; int maxI = this.m_MaxIterations; int ierr = 0; int Nrows = this.Matrix.RowPartitioning.LocalLength; int NoIter; Wrappers.ALMOND_UseSolver_d(ref Nrows, ref ktype, ref maxI, ref this.m_Tolerance, ref this.SolverHandle, x, rhs, out NoIter, out ierr); CheckErr(ierr); stw.Stop(); R.RunTime = stw.Elapsed; R.Converged = NoIter >= 0; R.NoOfIterations = Math.Abs(NoIter); if (!object.ReferenceEquals(x, _x)) { _x.SetV(x); } if (!object.ReferenceEquals(rhs, _rhs)) { _rhs.SetV(rhs); } return(R); }
void Init() { if (SolverHandle != IntPtr.Zero) { return; } int ierr; if (KernelsInitialized == false) { int occaPlatId = 0, occaDevId = 0; Wrappers.ALMOND_Init("OpenMP", ref occaPlatId, ref occaDevId, out ierr); Wrappers.ALMOND_buildAlmondKernels_d("C:\\Users\\florian\\Documents\\ALMOND", out ierr); CheckErr(ierr); KernelsInitialized = true; } var M = this.Matrix; int nnz = M.GetTotalNoOfNonZeros(); int[] ia = new int[nnz]; int[] ja = new int[nnz]; double[] aa = new double[nnz]; int c = 0; int i0 = M.RowPartitioning.i0, L = M.RowPartitioning.LocalLength; int LR; int[] col = null; double[] val = null; for (int i = 0; i < L; i++) { int iRow = i0 + i; LR = M.GetRow(iRow, ref col, ref val); for (int j = 0; j < LR; j++) { ia[c] = iRow; ja[c] = col[j]; aa[c] = val[j]; c++; } } Debug.Assert(c == nnz); int N = M.RowPartitioning.TotalLength; Wrappers.ALMOND_DefineMatrix_d(ref N, ref N, ref nnz, ia, ja, aa, out MatrixHandle, out ierr); CheckErr(ierr); Wrappers.ALMOND_CreateSolver_d(ref MatrixHandle, out SolverHandle, out ierr); CheckErr(ierr); }
public void Dispose() { if (SolverHandle != IntPtr.Zero) { int ierr; Wrappers.ALMOND_DeleteSolver_d(ref SolverHandle, out ierr); SolverHandle = IntPtr.Zero; } if (MatrixHandle != IntPtr.Zero) { int ierr; Wrappers.ALMOND_DeleteMatrix_d(ref MatrixHandle, out ierr); MatrixHandle = IntPtr.Zero; } }