Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
 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;
     }
 }