248 Integer m_build_position;
250 std::vector<std::pair<BaseInserter*, Integer>> m_inserter_vector;
254 m_build_position = -1;
255 m_inserter_vector.reserve(1);
258 typedef std::pair<Integer, Integer> BuildPos;
262 typedef std::map<Integer, InsBuildPos> RowCols;
264 UniqueArray<RowCols> row_cols;
266 if (m_parallel_mng == NULL) {
271 m_myrank = m_parallel_mng->commRank();
272 m_nproc = m_parallel_mng->commSize();
276 m_offset.resize(m_nproc + 1);
278 Arccore::MessagePassing::mpAllGather(m_parallel_mng,
279 ConstArrayView<Integer>(1, &m_local_offset), m_offset.subView(0, m_nproc));
281 m_offset[m_nproc] = m_global_size;
287 IsLocal(
const ConstArrayView<Integer> offset,
const Integer myrank)
291 bool operator()(Arccore::Integer col)
const
293 return (col >= m_offset[m_myrank]) && (col < m_offset[m_myrank + 1]);
297 const ConstArrayView<Integer> m_offset;
298 const Integer m_myrank;
299 } isLocal(m_offset, m_myrank);
302 profile.init(m_local_size);
304 m_row_size.resize(m_local_size);
305 m_ghost_row_size.resize(m_local_size);
306 m_ghost_row_size.fill(0);
307 UniqueArray<Integer>& upper_diag_offset = profile.getUpperDiagOffset();
308 if (m_order_row_cols_opt) {
309 profile.setDiagFirst(
false);
310 upper_diag_offset.resize(m_local_size);
312 row_cols.resize(m_local_size);
315 profile.setDiagFirst(
true);
317 row_cols.resize(m_local_size);
318 for (Integer row = 0; row < m_local_size; ++row) {
319 row_cols[row][m_local_offset + row].first = 0;
324 for (
auto iter = m_inserters.begin(); iter != m_inserters.end(); ++iter) {
329 m_trace->info() <<
"Inserter id=" << ins->
getId() <<
" count=" << ins->
count();
330 for (Integer i = 0; i < ins->
count(); ++i) {
331 Integer row = ins->m_row_index[i] - m_local_offset;
332 Integer col = ins->m_col_index[i];
333 if (row == m_local_size) {
338 m_trace->info() <<
"Ghost Row : " << i <<
" " << ins->m_row_index[i];
342 std::pair<typename RowCols::iterator, bool> finder = row_cols[row].insert(col);
344 std::pair<typename RowCols::iterator, bool> finder =
345 row_cols[row].insert(std::pair<Integer, InsBuildPos>(col, InsBuildPos()));
347 auto inner_iter = finder.first;
349 Integer k = m_row_size[row];
350 Integer gk = m_ghost_row_size[row];
352 VALUE_OF(inner_iter) = k - gk;
357 VALUE_OF(inner_iter) = gk;
359 ++m_ghost_row_size[row];
370 ArrayView<Integer> row_offsets =
371 m_matrix_impl->internal()->getCSRProfile().getRowOffset();
373 for (Integer row = 0; row < m_local_size; ++row) {
374 row_offsets[row] = m_matrix_size;
375 m_matrix_size += m_row_size[row];
377 row_offsets[m_local_size] = m_matrix_size;
379 UniqueArray<Integer> kcols;
380 if (m_order_row_cols_opt)
381 kcols.resize(m_matrix_size);
384 ArrayView<Integer> cols = profile.getCols();
386 m_matrix_impl->allocate();
387 m_matrix_impl->internal()->getValues().fill(0.);
391 if (m_order_row_cols_opt) {
392 for (Integer row = 0; row < m_local_size; ++row) {
393 Integer ghost_offset = m_row_size[row] - m_ghost_row_size[row];
395 for (
typename RowCols::iterator iter = row_cols[row].begin();
396 iter != row_cols[row].end(); ++iter) {
397 Integer col_uid = KEY_OF(iter);
399 if (!isLocal(col_uid))
400 VALUE_OF(iter) += ghost_offset;
401 cols[offset + ordered_idx] = col_uid;
402 kcols[offset + VALUE_OF(iter)] = offset + ordered_idx;
403 if (col_uid == row + m_local_offset) {
404 upper_diag_offset[row] = offset + ordered_idx;
409 offset += m_row_size[row];
413 for (Integer row = 0; row < m_local_size; ++row) {
415 m_trace->info() <<
"ROW(" << row <<
")";
416 Integer ghost_offset = m_row_size[row] - m_ghost_row_size[row];
418 for (
typename RowCols::iterator iter = row_cols[row].begin();
419 iter != row_cols[row].end(); ++iter) {
420 Integer col_uid = KEY_OF(iter);
422 if (!isLocal(col_uid))
423 VALUE_OF(iter) += ghost_offset;
424 cols[offset + VALUE_OF(iter)] = col_uid;
427 offset += m_row_size[row];
431 for (
auto iter = m_inserters.begin(); iter != m_inserters.end(); ++iter) {
433 for (Integer i = 0; i < ins->
count(); ++i) {
434 Integer row = ins->m_row_index[i] - m_local_offset;
435 if (row == m_local_size) {
440 Integer col = ins->m_col_index[i];
441 Integer ghost_offset =
442 (isLocal(col) ? 0 : m_row_size[row] - m_ghost_row_size[row]);
443 if (m_order_row_cols_opt) {
444 Integer build_pos = ins->
m_data_index[i] + ghost_offset;
445 ins->
m_data_index[i] = kcols[row_offsets[row] + build_pos];
448 ins->
m_data_index[i] += row_offsets[row] + ghost_offset;
453 if (m_matrix_impl->block())
454 neq = m_matrix_impl->block()->
size();
455 const Integer block_size = neq * neq;
456 ins->setMatrixValues(m_matrix_impl->internal()->getDataPtr(), block_size);
457 ins->m_col_index.dispose();
458 ins->m_row_index.dispose();
462 m_matrix_impl->parallelStart(m_offset, m_parallel_mng);
464 m_matrix_impl->sequentialStart();
466 profile.getColOrdering() = SimpleCSRInternal::CSRStructInfo::eOwnAndGhost;
467 m_col_ordering = eOwnAndGhost;
470 m_row_size.resize(0);
471 m_ghost_row_size.resize(0);