597 if constexpr (is_sequential_matrix<Matrix>())
599 using Number =
typename Matrix::value_type;
604 for (
unsigned int i = 0; i < nsteps; i++)
609 for (
unsigned int row = 0; row < matrix.m(); ++row)
611 for (
auto it = matrix.begin(row); it != matrix.end(row); ++it)
613 row_norms[row] +=
std::abs(it->value());
614 col_norms[it->column()] +=
std::abs(it->value());
623 for (
unsigned int row = 0; row < matrix.m(); ++row)
625 for (
auto it = matrix.begin(row); it != matrix.end(row); ++it)
630 col_norms[it->column()]));
634 for (
unsigned int col = 0; col < matrix.n(); ++col)
641#ifdef DEAL_II_WITH_TRILINOS
642 std::is_same_v<Matrix, TrilinosWrappers::SparseMatrix> ||
644#ifdef DEAL_II_WITH_PETSC
645 std::is_same_v<Matrix, PETScWrappers::MPI::SparseMatrix> ||
649 using Number =
typename Matrix::value_type;
653 std::map<types::global_dof_index, double>
654 partial_column_norms;
656 for (
unsigned int i = 0; i < nsteps; i++)
660 partial_column_norms.clear();
665 for (
auto it = matrix.begin(row); it != matrix.end(row); ++it)
667 local_row_norms[local_row_idx] +=
std::abs(it->value());
668 partial_column_norms[it->column()] +=
std::abs(it->value());
672 std::map<
unsigned int,
673 std::vector<std::pair<types::global_dof_index, double>>>
685 for (
const auto &[sender_rank, pairs] : received_data)
687 for (
const auto &[global_col, contribution] : pairs)
689 unsigned int local_idx =
691 local_col_norms[local_idx] += contribution;
698 matrix.get_mpi_communicator()))
702 for (
unsigned int i = 0; i < local_row_norms.
size(); ++i)
704 for (
unsigned int i = 0; i < local_col_norms.
size(); ++i)
708 std::map<
unsigned int,
709 std::vector<std::pair<types::global_dof_index, double>>>
716 auto received_column_norms =
720 std::map<types::global_dof_index, double> ghost_column_norms_lookup;
721 for (
const auto &[sender_rank, pairs] : received_column_norms)
723 for (
const auto &[col_id, norm_val] : pairs)
725 ghost_column_norms_lookup[col_id] = norm_val;
733 auto row_size = matrix.row_length(row);
734 std::vector<Number> values(row_size);
735 std::vector<types::global_dof_index> columns(row_size);
736 unsigned int idx = 0;
737 for (
auto it = matrix.begin(row); it != matrix.end(row); ++it)
741 unsigned int local_col_idx =
743 columns[idx] = it->column();
745 it->value() /
std::sqrt(local_col_norms[local_col_idx] *
746 local_row_norms[local_row_idx]);
752 ghost_column_norms_lookup[it->column()];
753 columns[idx] = it->column();
756 std::sqrt(col_norms * local_row_norms[local_row_idx]);
760 matrix.set(row, columns, values);
761 if constexpr (std::is_same_v<Matrix,
765#ifdef DEAL_II_WITH_TRILINOS
766 if constexpr (std::is_same_v<Matrix, TrilinosWrappers::SparseMatrix>)
780 if constexpr (is_sequential_matrix<Matrix>())
782 using Number =
typename Matrix::value_type;
787 for (
unsigned int i = 0; i < nsteps; i++)
792 for (
unsigned int row = 0; row < matrix.m(); ++row)
794 for (
auto it = matrix.begin(row); it != matrix.end(row); ++it)
798 col_norms[it->column()] =
809 for (
unsigned int row = 0; row < matrix.m(); ++row)
811 for (
auto it = matrix.begin(row); it != matrix.end(row); ++it)
816 col_norms[it->column()]));
820 for (
unsigned int col = 0; col < matrix.n(); ++col)
827#ifdef DEAL_II_WITH_TRILINOS
828 std::is_same_v<Matrix, TrilinosWrappers::SparseMatrix> ||
830#ifdef DEAL_II_WITH_PETSC
831 std::is_same_v<Matrix, PETScWrappers::MPI::SparseMatrix> ||
835 using Number =
typename Matrix::value_type;
839 std::map<types::global_dof_index, double>
840 partial_column_norms;
842 for (
unsigned int i = 0; i < nsteps; i++)
846 partial_column_norms.clear();
851 for (
auto it = matrix.begin(row); it != matrix.end(row); ++it)
853 local_row_norms[local_row_idx] =
854 std::max(local_row_norms[local_row_idx],
856 partial_column_norms[it->column()] =
857 std::max(partial_column_norms[it->column()],
862 std::map<
unsigned int,
863 std::vector<std::pair<types::global_dof_index, double>>>
875 for (
const auto &[sender_rank, pairs] : received_data)
877 for (
const auto &[global_col, contribution] : pairs)
879 unsigned int local_idx =
881 local_col_norms[local_idx] =
882 std::max(local_col_norms[local_idx], contribution);
889 matrix.get_mpi_communicator()))
892 for (
unsigned int i = 0; i < local_row_norms.
size(); ++i)
894 for (
unsigned int i = 0; i < local_col_norms.
size(); ++i)
898 std::map<
unsigned int,
899 std::vector<std::pair<types::global_dof_index, double>>>
906 auto received_column_norms =
910 std::map<types::global_dof_index, double> ghost_column_norms_lookup;
911 for (
const auto &[sender_rank, pairs] : received_column_norms)
913 for (
const auto &[col_id, norm_val] : pairs)
915 ghost_column_norms_lookup[col_id] = norm_val;
923 auto row_size = matrix.row_length(row);
924 std::vector<Number> values(row_size);
925 std::vector<types::global_dof_index> columns(row_size);
926 unsigned int idx = 0;
927 for (
auto it = matrix.begin(row); it != matrix.end(row); ++it)
931 unsigned int local_col_idx =
933 columns[idx] = it->column();
935 it->value() /
std::sqrt(local_col_norms[local_col_idx] *
936 local_row_norms[local_row_idx]);
942 ghost_column_norms_lookup[it->column()];
943 columns[idx] = it->column();
946 std::sqrt(col_norms * local_row_norms[local_row_idx]);
950 matrix.set(row, columns, values);
951 if constexpr (std::is_same_v<Matrix,
955#ifdef DEAL_II_WITH_TRILINOS
956 if constexpr (std::is_same_v<Matrix, TrilinosWrappers::SparseMatrix>)
970 if constexpr (is_sequential_matrix<Matrix>())
972 using Number =
typename Matrix::value_type;
983 for (
unsigned int row = 0; row < matrix.m(); ++row)
984 for (
auto it = matrix.begin(row); it != matrix.end(row); ++it)
985 row_norms[row] +=
std::abs(it->value());
987 for (
unsigned int i = 0; i < nsteps; i++)
991 for (
unsigned int row = 0; row < matrix.m(); ++row)
993 for (
auto it = matrix.begin(row); it != matrix.end(row);
998 it->value() / row_norms[row]);
999 col_norms[it->column()] +=
std::abs(it->value());
1010 for (
unsigned int row = 0; row < matrix.m(); ++row)
1012 for (
auto it = matrix.begin(row); it != matrix.end(row);
1017 it->value() / col_norms[it->column()]);
1018 row_norms[row] +=
std::abs(it->value());
1021 for (
unsigned int col = 0; col < matrix.n(); ++col)
1037 for (
unsigned int row = 0; row < matrix.m(); ++row)
1038 for (
auto it = matrix.begin(row); it != matrix.end(row); ++it)
1042 for (
unsigned int i = 0; i < nsteps; i++)
1046 for (
unsigned int row = 0; row < matrix.m(); ++row)
1048 for (
auto it = matrix.begin(row); it != matrix.end(row);
1053 it->value() / row_norms[row]);
1054 col_norms[it->column()] =
1067 for (
unsigned int row = 0; row < matrix.m(); ++row)
1069 for (
auto it = matrix.begin(row); it != matrix.end(row);
1074 it->value() / col_norms[it->column()]);
1079 for (
unsigned int col = 0; col < matrix.n(); ++col)
1096#ifdef DEAL_II_WITH_TRILINOS
1097 std::is_same_v<Matrix, TrilinosWrappers::SparseMatrix> ||
1099#ifdef DEAL_II_WITH_PETSC
1100 std::is_same_v<Matrix, PETScWrappers::MPI::SparseMatrix> ||
1104 using Number =
typename Matrix::value_type;
1108 std::map<types::global_dof_index, double>
1109 partial_column_norms;
1116 local_row_norms = 0;
1120 for (
auto it = matrix.begin(row); it != matrix.end(row); ++it)
1121 local_row_norms[local_row_idx] +=
std::abs(it->value());
1124 for (
unsigned int i = 0; i < nsteps; i++)
1127 local_col_norms = 0;
1128 partial_column_norms.clear();
1133 auto row_size = matrix.row_length(row);
1134 std::vector<Number> values(row_size);
1135 std::vector<types::global_dof_index> columns(row_size);
1136 unsigned int idx = 0;
1137 for (
auto it = matrix.begin(row); it != matrix.end(row);
1140 partial_column_norms[it->column()] +=
std::abs(
1141 it->value() / local_row_norms[local_row_idx]);
1142 columns[idx] = it->column();
1144 it->value() / local_row_norms[local_row_idx];
1147 matrix.set(row, columns, values);
1148 if constexpr (std::is_same_v<
1154 local_row_norms[local_row_idx];
1156#ifdef DEAL_II_WITH_TRILINOS
1157 if constexpr (std::is_same_v<Matrix,
1165 std::vector<std::pair<types::global_dof_index, double>>>
1172 auto received_data =
1177 for (
const auto &[sender_rank, pairs] : received_data)
1179 for (
const auto &[global_col, contribution] : pairs)
1181 unsigned int local_idx =
1183 local_col_norms[local_idx] += contribution;
1190 matrix.get_mpi_communicator()))
1194 local_row_norms = 0;
1199 std::vector<std::pair<types::global_dof_index, double>>>
1206 auto received_column_norms =
1210 std::map<types::global_dof_index, double>
1211 ghost_column_norms_lookup;
1212 for (
const auto &[sender_rank, pairs] : received_column_norms)
1214 for (
const auto &[col_id, norm_val] : pairs)
1216 ghost_column_norms_lookup[col_id] = norm_val;
1223 auto row_size = matrix.row_length(row);
1224 std::vector<Number> values(row_size);
1225 std::vector<types::global_dof_index> columns(row_size);
1226 unsigned int idx = 0;
1227 for (
auto it = matrix.begin(row); it != matrix.end(row);
1232 unsigned int local_col_idx =
1235 local_row_norms[local_row_idx] +=
std::abs(
1236 it->value() / local_col_norms[local_col_idx]);
1238 columns[idx] = it->column();
1240 it->value() / local_col_norms[local_col_idx];
1246 ghost_column_norms_lookup[it->column()];
1248 local_row_norms[local_row_idx] +=
1251 columns[idx] = it->column();
1252 values[idx] = it->value() / col_norms;
1256 matrix.set(row, columns, values);
1257 if constexpr (std::is_same_v<
1262#ifdef DEAL_II_WITH_TRILINOS
1263 if constexpr (std::is_same_v<Matrix,
1267 for (
unsigned int i = 0; i < local_col_norms.
size(); ++i)
1272 matrix.get_mpi_communicator()))
1281 local_row_norms = 0;
1285 for (
auto it = matrix.begin(row); it != matrix.end(row); ++it)
1286 local_row_norms[local_row_idx] =
1287 std::max(local_row_norms[local_row_idx],
1291 for (
unsigned int i = 0; i < nsteps; i++)
1294 local_col_norms = 0;
1295 partial_column_norms.clear();
1300 auto row_size = matrix.row_length(row);
1301 std::vector<Number> values(row_size);
1302 std::vector<types::global_dof_index> columns(row_size);
1303 unsigned int idx = 0;
1304 for (
auto it = matrix.begin(row); it != matrix.end(row);
1307 partial_column_norms[it->column()] =
1308 std::max(partial_column_norms[it->column()],
1310 local_row_norms[local_row_idx]));
1311 columns[idx] = it->column();
1313 it->value() / local_row_norms[local_row_idx];
1316 matrix.set(row, columns, values);
1317 if constexpr (std::is_same_v<
1323 local_row_norms[local_row_idx];
1325#ifdef DEAL_II_WITH_TRILINOS
1326 if constexpr (std::is_same_v<Matrix,
1334 std::vector<std::pair<types::global_dof_index, double>>>
1341 auto received_data =
1346 for (
const auto &[sender_rank, pairs] : received_data)
1348 for (
const auto &[global_col, contribution] : pairs)
1350 unsigned int local_idx =
1352 local_col_norms[local_idx] =
1353 std::max(local_col_norms[local_idx], contribution);
1360 matrix.get_mpi_communicator()))
1364 local_row_norms = 0;
1369 std::vector<std::pair<types::global_dof_index, double>>>
1376 auto received_column_norms =
1380 std::map<types::global_dof_index, double>
1381 ghost_column_norms_lookup;
1382 for (
const auto &[sender_rank, pairs] : received_column_norms)
1384 for (
const auto &[col_id, norm_val] : pairs)
1386 ghost_column_norms_lookup[col_id] = norm_val;
1393 auto row_size = matrix.row_length(row);
1394 std::vector<Number> values(row_size);
1395 std::vector<types::global_dof_index> columns(row_size);
1396 unsigned int idx = 0;
1397 for (
auto it = matrix.begin(row); it != matrix.end(row);
1402 unsigned int local_col_idx =
1405 local_row_norms[local_row_idx] =
1406 std::max(local_row_norms[local_row_idx],
1409 local_col_norms[local_col_idx]));
1411 columns[idx] = it->column();
1413 it->value() / local_col_norms[local_col_idx];
1419 ghost_column_norms_lookup[it->column()];
1421 local_row_norms[local_row_idx] =
1422 std::max(local_row_norms[local_row_idx],
1423 std::abs(it->value() / col_norms));
1425 columns[idx] = it->column();
1426 values[idx] = it->value() / col_norms;
1430 matrix.set(row, columns, values);
1431 if constexpr (std::is_same_v<
1436#ifdef DEAL_II_WITH_TRILINOS
1437 if constexpr (std::is_same_v<Matrix,
1441 for (
unsigned int i = 0; i < local_col_norms.
size(); ++i)
1447 matrix.get_mpi_communicator()))