Mercurial > fem-fenics-eugenio
diff src/assemble.cc @ 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 |
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;