188 const SparsityPatternType &sparsity_pattern)
193 sparsity_pattern.n_rows()),
194 sparsity_pattern.n_rows());
196 sparsity_pattern.n_cols()),
197 sparsity_pattern.n_cols());
199 Assert(sparsity_pattern.n_rows() == local_rows.
size(),
201 "SparsityPattern and IndexSet have different number of rows"));
203 sparsity_pattern.n_cols() == local_columns.
size(),
205 "SparsityPattern and IndexSet have different number of columns"));
207 ExcMessage(
"PETSc only supports contiguous row/column ranges"));
219 row_owners == sparsity_pattern.n_rows(),
222 "Each row has to be owned by exactly one owner (n_rows()=") +
223 std::to_string(sparsity_pattern.n_rows()) +
224 " but sum(local_rows.n_elements())=" +
225 std::to_string(row_owners) +
")"));
227 col_owners == sparsity_pattern.n_cols(),
230 "Each column has to be owned by exactly one owner (n_cols()=") +
231 std::to_string(sparsity_pattern.n_cols()) +
232 " but sum(local_columns.n_elements())=" +
233 std::to_string(col_owners) +
")"));
239 PetscErrorCode ierr = MatCreate(communicator, &
matrix);
242 ierr = MatSetSizes(
matrix,
245 sparsity_pattern.n_rows(),
246 sparsity_pattern.n_cols());
252 ierr = MatSetType(
matrix, MATAIJ);
276 const PetscInt local_row_end =
286 std::vector<PetscInt> rowstart_in_window(local_row_end -
291 unsigned int n_cols = 0;
292 for (PetscInt i = local_row_start; i < local_row_end; ++i)
294 const PetscInt
row_length = sparsity_pattern.row_length(i);
295 rowstart_in_window[i + 1 - local_row_start] =
296 rowstart_in_window[i - local_row_start] +
row_length;
299 colnums_in_window.resize(n_cols + 1, -1);
305 PetscInt *ptr = colnums_in_window.data();
306 for (PetscInt i = local_row_start; i < local_row_end; ++i)
307 for (
typename SparsityPatternType::iterator p =
308 sparsity_pattern.begin(i);
309 p != sparsity_pattern.end(i);
322 ierr = MatMPIAIJSetPreallocationCSR(
matrix,
323 rowstart_in_window.data(),
324 colnums_in_window.data(),
326 ierr = MatSeqAIJSetPreallocationCSR(
matrix,
327 rowstart_in_window.data(),
328 colnums_in_window.data(),
336 ierr = MatSeqAIJSetPreallocationCSR(
matrix, &i, &i,
nullptr);
338 ierr = MatMPIAIJSetPreallocationCSR(
matrix, &i, &i,
nullptr);
354 const SparsityPatternType &sparsity_pattern,
355 const std::vector<size_type> &local_rows_per_process,
356 const std::vector<size_type> &local_columns_per_process,
357 const unsigned int this_process,
358 const bool preset_nonzero_locations)
360 Assert(local_rows_per_process.size() == local_columns_per_process.size(),
362 local_columns_per_process.size()));
368 sparsity_pattern.n_rows()),
369 sparsity_pattern.n_rows());
371 sparsity_pattern.n_cols()),
372 sparsity_pattern.n_cols());
382 for (
unsigned int p = 0; p < this_process; ++p)
383 local_row_start += local_rows_per_process[p];
385 local_row_start + local_rows_per_process[this_process];
390 PetscErrorCode ierr = MatCreate(communicator, &
matrix);
393 ierr = MatSetSizes(
matrix,
394 local_rows_per_process[this_process],
395 local_columns_per_process[this_process],
396 sparsity_pattern.n_rows(),
397 sparsity_pattern.n_cols());
403 ierr = MatSetType(
matrix, MATAIJ);
419 if (preset_nonzero_locations ==
true)
432 std::vector<PetscInt> rowstart_in_window(local_row_end -
438 for (
size_type i = local_row_start; i < local_row_end; ++i)
441 const auto row_start =
442 rowstart_in_window[i - local_row_start] +
row_length;
443 const auto petsc_row_start =
static_cast<PetscInt
>(row_start);
445 rowstart_in_window[i + 1 - local_row_start] = petsc_row_start;
448 colnums_in_window.resize(n_cols + 1, -1);
454 PetscInt *ptr = colnums_in_window.data();
455 for (
size_type i = local_row_start; i < local_row_end; ++i)
456 for (
typename SparsityPatternType::iterator p =
457 sparsity_pattern.begin(i);
458 p != sparsity_pattern.end(i);
461 const auto petsc_column =
static_cast<PetscInt
>(p->column());
475 ierr = MatSeqAIJSetPreallocationCSR(
matrix,
476 rowstart_in_window.data(),
477 colnums_in_window.data(),
479 ierr = MatMPIAIJSetPreallocationCSR(
matrix,
480 rowstart_in_window.data(),
481 colnums_in_window.data(),
497 const IndexSet &local_active_columns,
498 const SparsityPatternType &sparsity_pattern)
503 sparsity_pattern.n_rows()),
504 sparsity_pattern.n_rows());
506 sparsity_pattern.n_cols()),
507 sparsity_pattern.n_cols());
509# if DEAL_II_PETSC_VERSION_GTE(3, 10, 0)
510 Assert(sparsity_pattern.n_rows() == local_rows.
size(),
512 "SparsityPattern and IndexSet have different number of rows."));
514 sparsity_pattern.n_cols() == local_columns.
size(),
516 "SparsityPattern and IndexSet have different number of columns"));
518 ExcMessage(
"PETSc only supports contiguous row/column ranges"));
530 row_owners == sparsity_pattern.n_rows(),
533 "Each row has to be owned by exactly one owner (n_rows()=") +
534 std::to_string(sparsity_pattern.n_rows()) +
535 " but sum(local_rows.n_elements())=" +
536 std::to_string(row_owners) +
")"));
538 col_owners == sparsity_pattern.n_cols(),
541 "Each column has to be owned by exactly one owner (n_cols()=") +
542 std::to_string(sparsity_pattern.n_cols()) +
543 " but sum(local_columns.n_elements())=" +
544 std::to_string(col_owners) +
")"));
553 std::vector<PetscInt> idx_glob_row(n_local_active_rows);
554 std::vector<PetscInt> idx_glob_col(n_local_active_cols);
565 IS is_glob_row, is_glob_col;
567 ISLocalToGlobalMapping l2gmap_row;
568 ierr = ISCreateGeneral(communicator,
574 ierr = ISLocalToGlobalMappingCreateIS(is_glob_row, &l2gmap_row);
576 ierr = ISDestroy(&is_glob_row);
579 ISLocalToGlobalMappingViewFromOptions(l2gmap_row,
nullptr,
"-view_map");
583 ISLocalToGlobalMapping l2gmap_col;
584 ierr = ISCreateGeneral(communicator,
590 ierr = ISLocalToGlobalMappingCreateIS(is_glob_col, &l2gmap_col);
592 ierr = ISDestroy(&is_glob_col);
595 ISLocalToGlobalMappingViewFromOptions(l2gmap_col,
nullptr,
"-view_map");
599 ierr = MatCreateIS(communicator,
603 sparsity_pattern.n_rows(),
604 sparsity_pattern.n_cols(),
609 ierr = ISLocalToGlobalMappingDestroy(&l2gmap_row);
611 ierr = ISLocalToGlobalMappingDestroy(&l2gmap_col);
628 ierr = MatISGetLocalMat(
matrix, &local_matrix);
630 ierr = MatSetType(local_matrix,
639 const PetscInt local_row_start = 0;
640 const PetscInt local_row_end = local_active_rows.
n_elements();
645 std::vector<PetscInt> rowstart_in_window(local_row_end -
649 unsigned int global_row_index = 0;
651 unsigned int n_cols = 0;
652 unsigned int global_row_index = 0;
653 for (PetscInt i = local_row_start; i < local_row_end; ++i)
657 sparsity_pattern.row_length(global_row_index);
658 rowstart_in_window[i + 1 - local_row_start] =
659 rowstart_in_window[i - local_row_start] +
row_length;
662 colnums_in_window.resize(n_cols + 1, -1);
669 std::map<unsigned int, unsigned int> loc_act_cols_inv;
670 for (
unsigned int i = 0; i < local_active_columns.
n_elements(); ++i)
676 PetscInt *ptr = colnums_in_window.data();
677 for (PetscInt i = local_row_start; i < local_row_end; ++i)
680 for (
typename SparsityPatternType::iterator p =
681 sparsity_pattern.begin(global_row_index);
682 p != sparsity_pattern.end(global_row_index);
684 *ptr = loc_act_cols_inv[p->column()];
691 ierr = MatSeqAIJSetPreallocationCSR(local_matrix,
692 rowstart_in_window.data(),
693 colnums_in_window.data(),
700 ierr = MatSeqAIJSetPreallocationCSR(local_matrix, &i, &i,
nullptr);
709 ierr = MatISRestoreLocalMat(
matrix, &local_matrix);
716 (void)local_active_rows;
718 (void)local_active_columns;
719 (void)sparsity_pattern;
722 "BDDC preconditioner requires PETSc 3.10.0 or newer"));