| 149 | */ |
| 150 | template <typename Scalar, typename StorageIndex> |
| 151 | Index SparseLUImpl<Scalar,StorageIndex>::memInit(Index m, Index n, Index annz, Index lwork, Index fillratio, Index panel_size, GlobalLU_t& glu) |
| 152 | { |
| 153 | Index& num_expansions = glu.num_expansions; //No memory expansions so far |
| 154 | num_expansions = 0; |
| 155 | glu.nzumax = glu.nzlumax = (std::min)(fillratio * (annz+1) / n, m) * n; // estimated number of nonzeros in U |
| 156 | glu.nzlmax = (std::max)(Index(4), fillratio) * (annz+1) / 4; // estimated nnz in L factor |
| 157 | // Return the estimated size to the user if necessary |
| 158 | Index tempSpace; |
| 159 | tempSpace = (2*panel_size + 4 + LUNoMarker) * m * sizeof(Index) + (panel_size + 1) * m * sizeof(Scalar); |
| 160 | if (lwork == emptyIdxLU) |
| 161 | { |
| 162 | Index estimated_size; |
| 163 | estimated_size = (5 * n + 5) * sizeof(Index) + tempSpace |
| 164 | + (glu.nzlmax + glu.nzumax) * sizeof(Index) + (glu.nzlumax+glu.nzumax) * sizeof(Scalar) + n; |
| 165 | return estimated_size; |
| 166 | } |
| 167 | |
| 168 | // Setup the required space |
| 169 | |
| 170 | // First allocate Integer pointers for L\U factors |
| 171 | glu.xsup.resize(n+1); |
| 172 | glu.supno.resize(n+1); |
| 173 | glu.xlsub.resize(n+1); |
| 174 | glu.xlusup.resize(n+1); |
| 175 | glu.xusub.resize(n+1); |
| 176 | |
| 177 | // Reserve memory for L/U factors |
| 178 | do |
| 179 | { |
| 180 | if( (expand<ScalarVector>(glu.lusup, glu.nzlumax, 0, 0, num_expansions)<0) |
| 181 | || (expand<ScalarVector>(glu.ucol, glu.nzumax, 0, 0, num_expansions)<0) |
| 182 | || (expand<IndexVector> (glu.lsub, glu.nzlmax, 0, 0, num_expansions)<0) |
| 183 | || (expand<IndexVector> (glu.usub, glu.nzumax, 0, 1, num_expansions)<0) ) |
| 184 | { |
| 185 | //Reduce the estimated size and retry |
| 186 | glu.nzlumax /= 2; |
| 187 | glu.nzumax /= 2; |
| 188 | glu.nzlmax /= 2; |
| 189 | if (glu.nzlumax < annz ) return glu.nzlumax; |
| 190 | } |
| 191 | } while (!glu.lusup.size() || !glu.ucol.size() || !glu.lsub.size() || !glu.usub.size()); |
| 192 | |
| 193 | ++num_expansions; |
| 194 | return 0; |
| 195 | |
| 196 | } // end LuMemInit |
| 197 | |
| 198 | /** |
| 199 | * \brief Expand the existing storage |