changeset 167:3895c8d4c066

Improved assembling of the matrix.
author gedeone-octave <marcovass89@hotmail.it>
date Sun, 06 Oct 2013 22:23:40 +0100
parents 40ae9e5dfb93
children 67944f307560
files src/assemble.cc src/assemble_system.cc
diffstat 2 files changed, 49 insertions(+), 54 deletions(-) [+]
line wrap: on
line diff
--- a/src/assemble.cc	Sat Oct 05 22:27:03 2013 +0100
+++ b/src/assemble.cc	Sun Oct 06 22:23:40 2013 +0100
@@ -97,41 +97,41 @@
                             error ("assemble: unknown argument type");
                         }
 
-//                    It provides an estimation for excess of nnz elements
+//                    It provides an upper boung for the nnz elements
                       boost::tuples::tuple<const std::size_t*, const std::size_t*, const double*, int> aa = A.data ();
                       int nnz = aa.get<3> ();
                       std::size_t nr = A.size (0), nc = A.size (1);
                       std::vector<double> data_tmp;
                       std::vector<std::size_t> cidx_tmp;
 
-                      octave_idx_type dims = nnz, nz = 0, ii = 0;
-                      ColumnVector ridx (dims), cidx (dims), data (dims);
+                      dim_vector dims (nnz, 1);
+                      octave_idx_type nz = 0, ii = 0;
+                      Array<octave_idx_type> ridx (dims, 0), cidx (dims, 0);
+                      Array<double> data (dims, 0);
+
+                      octave_idx_type* orow = ridx.fortran_vec ();
+                      octave_idx_type* oc = cidx.fortran_vec ();
+                      double* ov = data.fortran_vec ();
 
                       for (std::size_t i = 0; i < nr; ++i)
                        {
                          A.getrow (i, cidx_tmp, data_tmp);
                          nz += cidx_tmp.size ();
-                         if (dims < nz)
-                           {
-                             dims = 1.2 * ((nr * nz) / (i + 1));;
-                             ridx.resize (dims);
-                             cidx.resize (dims);
-                             data.resize (dims);
-                           }
 
                          for (octave_idx_type j = 0; j < cidx_tmp.size (); ++j)
                            {
-                             ridx.xelem (ii + j) = i + 1;
-                             cidx.xelem (ii + j) = cidx_tmp [j] + 1;
-                             data.xelem (ii + j) = data_tmp [j];
+                             orow [ii + j] = i;
+                             oc [ii + j] = cidx_tmp [j];
+                             ov [ii + j] = data_tmp [j];
                            }
 
                          ii = nz;
                        }
 
-                      ridx.resize (ii);
-                      cidx.resize (ii);
-                      data.resize (ii);
+                      dims(0) = ii;
+                      ridx.resize (dims);
+                      cidx.resize (dims);
+                      data.resize (dims);
 
                       SparseMatrix sm (data, ridx, cidx, nr, nc);
                       retval(0) = sm;
--- a/src/assemble_system.cc	Sat Oct 05 22:27:03 2013 +0100
+++ b/src/assemble_system.cc	Sun Oct 06 22:23:40 2013 +0100
@@ -100,43 +100,41 @@
                             error ("assemble_system: unknown argument type");
                         }
 
-//                    It provides an estimation for excess of nnz elements
+//                    It provides an upper boung for the nnz elements
                       boost::tuples::tuple<const std::size_t*, const std::size_t*, const double*, int> aa = A.data ();
                       int nnz = aa.get<3> ();
-
-                      std::cout << "Assembling Matrix from the bilinear form..."
-                        << std::endl;
                       std::size_t nr = A.size (0), nc = A.size (1);
                       std::vector<double> data_tmp;
                       std::vector<std::size_t> cidx_tmp;
 
-                      octave_idx_type dims = nnz, nz = 0, ii = 0;
-                      ColumnVector ridx (dims), cidx (dims), data (dims);
+                      dim_vector dims (nnz, 1);
+                      octave_idx_type nz = 0, ii = 0;
+                      Array<octave_idx_type> ridx (dims, 0), cidx (dims, 0);
+                      Array<double> data (dims, 0);
+
+                      octave_idx_type* orow = ridx.fortran_vec ();
+                      octave_idx_type* oc = cidx.fortran_vec ();
+                      double* ov = data.fortran_vec ();
 
                       for (std::size_t i = 0; i < nr; ++i)
                        {
                          A.getrow (i, cidx_tmp, data_tmp);
                          nz += cidx_tmp.size ();
-                         if (dims < nz)
-                           {
-                             dims = 1.2 * ((nr * nz) / (i + 1));;
-                             ridx.resize (dims);
-                             cidx.resize (dims);
-                             data.resize (dims);
-                           }
 
                          for (octave_idx_type j = 0; j < cidx_tmp.size (); ++j)
                            {
-                             ridx.xelem (ii + j) = i + 1;
-                             cidx.xelem (ii + j) = cidx_tmp [j] + 1;
-                             data.xelem (ii + j) = data_tmp [j];
+                             orow [ii + j] = i;
+                             oc [ii + j] = cidx_tmp [j];
+                             ov [ii + j] = data_tmp [j];
                            }
+
                          ii = nz;
                        }
 
-                      ridx.resize (ii);
-                      cidx.resize (ii);
-                      data.resize (ii);
+                      dims(0) = ii;
+                      ridx.resize (dims);
+                      cidx.resize (dims);
+                      data.resize (dims);
 
                       SparseMatrix sm (data, ridx, cidx, nr, nc);
                       retval(0) = sm;
@@ -210,44 +208,41 @@
                             error ("assemble_system: unknown argument type");
                         }
 
-//                    It provides an estimation for excess of nnz elements
+//                    It provides an upper boung for the nnz elements
                       boost::tuples::tuple<const std::size_t*, const std::size_t*, const double*, int> aa = A.data ();
                       int nnz = aa.get<3> ();
-
-                      std::cout << "Assembling Matrix from the bilinear form..."
-                        << std::endl;
                       std::size_t nr = A.size (0), nc = A.size (1);
                       std::vector<double> data_tmp;
                       std::vector<std::size_t> cidx_tmp;
 
-                      octave_idx_type dims = nnz, nz = 0, ii = 0;
-                      ColumnVector ridx (dims), cidx (dims), data (dims);
+                      dim_vector dims (nnz, 1);
+                      octave_idx_type nz = 0, ii = 0;
+                      Array<octave_idx_type> ridx (dims, 0), cidx (dims, 0);
+                      Array<double> data (dims, 0);
+
+                      octave_idx_type* orow = ridx.fortran_vec ();
+                      octave_idx_type* oc = cidx.fortran_vec ();
+                      double* ov = data.fortran_vec ();
 
                       for (std::size_t i = 0; i < nr; ++i)
                        {
                          A.getrow (i, cidx_tmp, data_tmp);
                          nz += cidx_tmp.size ();
-                         if (dims < nz)
-                           {
-                             dims = 1.2 * ((nr * nz) / (i + 1));;
-                             ridx.resize (dims);
-                             cidx.resize (dims);
-                             data.resize (dims);
-                           }
 
                          for (octave_idx_type j = 0; j < cidx_tmp.size (); ++j)
                            {
-                             ridx.xelem (ii + j) = i + 1;
-                             cidx.xelem (ii + j) = cidx_tmp [j] + 1;
-                             data.xelem (ii + j) = data_tmp [j];
+                             orow [ii + j] = i;
+                             oc [ii + j] = cidx_tmp [j];
+                             ov [ii + j] = data_tmp [j];
                            }
 
                          ii = nz;
                        }
 
-                      ridx.resize (ii);
-                      cidx.resize (ii);
-                      data.resize (ii);
+                      dims(0) = ii;
+                      ridx.resize (dims);
+                      cidx.resize (dims);
+                      data.resize (dims);
 
                       SparseMatrix sm (data, ridx, cidx, nr, nc);
                       retval(0) = sm;