27 #ifndef OOMPH_BLOCK_PRECONDITION_HEADER
28 #define OOMPH_BLOCK_PRECONDITION_HEADER
33 #include <oomph-lib-config.h>
134 this->
build(0, 0,
false);
149 std::ostringstream err_msg;
150 err_msg <<
"Trying to construct a BlockSelector object with:\n"
151 <<
"replacement_block_pt != 0 and wanted == false"
152 <<
"If you require the block, please set wanted == true.\n";
173 std::ostringstream warning_msg;
174 warning_msg <<
"Warning: BlockSelector destructor is called but...\n"
175 <<
"replacement_block_pt() is not null.\n"
176 <<
"Please remember to null this via the function\n"
177 <<
"BlockSelector::null_replacement_block_pt()\n"
196 std::ostringstream err_msg;
197 err_msg <<
"Trying to select block with:\n"
198 <<
"replacement_block_pt != 0 and wanted == false"
199 <<
"If you require the block, please set wanted == true.\n"
223 std::ostringstream warning_msg;
224 warning_msg <<
"Trying to set Wanted = false, but replacement_block_pt "
226 <<
"Please call null_replacement_block_pt()\n"
227 <<
"(remember to free memory if necessary)\n"
252 std::ostringstream err_msg;
253 err_msg <<
"Trying to set replacement_block_pt, but Wanted == false.\n"
254 <<
"Please call want_block()\n"
310 o_stream <<
"Row_index = " << block_selector.
row_index() <<
"\n"
311 <<
"Column_index = " << block_selector.
column_index() <<
"\n"
312 <<
"Wanted = " << block_selector.
wanted() <<
"\n"
313 <<
"Replacement_block_pt = ";
342 std::ostringstream err_msg;
344 <<
"Trying to set replacement_block_pt, but Wanted == false.\n"
345 <<
"Please either not set the replacement_block_pt or call the "
347 <<
"do_not_want_block()\n"
420 template<
typename MATRIX>
532 std::ostringstream error_msg;
533 error_msg <<
"Matrix is not correct type.";
675 MATRIX& output_matrix,
676 const bool& ignore_replacement_block =
false)
const
682 if ((i > n_block_types) || (
j > n_block_types))
684 std::ostringstream err_msg;
685 err_msg <<
"Requested block(" <<
i <<
"," <<
j <<
")"
687 <<
"but nblock_types() is " << n_block_types <<
".\n"
688 <<
"Maybe your argument to block_setup(...) is incorrect?"
780 if (ndofblock_in_row == 1 && ndofblock_in_col == 1)
792 ignore_replacement_block)
797 ignore_replacement_block);
816 ndofblock_in_row, ndofblock_in_col, 0);
829 for (
unsigned row_dofblock = 0; row_dofblock < ndofblock_in_row;
834 const unsigned wanted_dof_row =
837 for (
unsigned col_dofblock = 0; col_dofblock < ndofblock_in_col;
842 const unsigned wanted_dof_col =
846 tmp_blocks_pt(row_dofblock, col_dofblock) =
852 if ((tmp_blocks_pt(row_dofblock, col_dofblock) == 0) ||
853 ignore_replacement_block)
857 new_block[row_dofblock][col_dofblock] = 1;
866 *tmp_blocks_pt(row_dofblock, col_dofblock),
867 ignore_replacement_block);
931 for (
unsigned row_dof_i = 0; row_dof_i < ndofblock_in_row; row_dof_i++)
936 tmp_row_dist_pt[row_dof_i] =
941 tmp_row_dist_pt[row_dof_i] =
950 for (
unsigned col_dof_i = 0; col_dof_i < ndofblock_in_col; col_dof_i++)
955 tmp_col_dist_pt[col_dof_i] =
960 tmp_col_dist_pt[col_dof_i] =
967 tmp_row_dist_pt, tmp_col_dist_pt, tmp_blocks_pt, output_matrix);
970 for (
unsigned row_i = 0; row_i < ndofblock_in_row; row_i++)
972 for (
unsigned col_i = 0; col_i < ndofblock_in_col; col_i++)
974 if (new_block[row_i][col_i])
976 delete tmp_blocks_pt(row_i, col_i);
990 const bool& ignore_replacement_block =
false)
const
992 MATRIX output_matrix;
993 get_block(
i,
j, output_matrix, ignore_replacement_block);
994 return output_matrix;
1014 MATRIX* in_matrix_pt,
1015 MATRIX& output_matrix)
1052 MATRIX& output_block,
1053 const bool& ignore_replacement_block =
false)
const;
1139 unsigned const para_selected_block_nrow = selected_block.
nrow();
1140 unsigned const para_selected_block_ncol = selected_block.
ncol();
1144 if (para_selected_block_nrow == 0)
1146 std::ostringstream error_msg;
1147 error_msg <<
"selected_block has nrow = 0.\n";
1156 if ((para_selected_block_nrow > para_nblocks) ||
1157 (para_selected_block_ncol > para_nblocks))
1159 std::ostringstream error_msg;
1160 error_msg <<
"Trying to concatenate a " << para_selected_block_nrow
1161 <<
" by " << para_selected_block_ncol <<
" block matrix,\n"
1162 <<
"but there are only " << para_nblocks <<
" block types.\n";
1173 for (
unsigned row_i = 0; row_i < para_selected_block_nrow; row_i++)
1175 const unsigned col_0_row_index = selected_block[row_i][0].row_index();
1177 for (
unsigned col_i = 0; col_i < para_selected_block_ncol; col_i++)
1179 const unsigned para_b_i = selected_block[row_i][col_i].row_index();
1180 const unsigned para_b_j = selected_block[row_i][col_i].column_index();
1182 if (col_0_row_index != para_b_i)
1184 std::ostringstream err_msg;
1185 err_msg <<
"Block index for block(" << row_i <<
"," << col_i <<
") "
1186 <<
"contains block indices (" << para_b_i <<
"," << para_b_j
1188 <<
"But the row index for the first column is "
1189 << col_0_row_index <<
", they must be the same!\n";
1199 for (
unsigned col_i = 0; col_i < para_selected_block_ncol; col_i++)
1201 const unsigned row_0_col_index =
1202 selected_block[0][col_i].column_index();
1204 for (
unsigned row_i = 0; row_i < para_selected_block_nrow; row_i++)
1206 const unsigned para_b_i = selected_block[row_i][col_i].row_index();
1207 const unsigned para_b_j = selected_block[row_i][col_i].column_index();
1209 if (row_0_col_index != para_b_j)
1211 std::ostringstream err_msg;
1212 err_msg <<
"Block index for block(" << row_i <<
"," << col_i <<
") "
1213 <<
"contains block indices (" << para_b_i <<
"," << para_b_j
1215 <<
"But the col index for the first row is "
1216 << row_0_col_index <<
", they must be the same!\n";
1232 for (
unsigned row_i = 0; row_i < para_selected_block_nrow; row_i++)
1234 const unsigned para_b_i = selected_block[row_i][0].row_index();
1235 const unsigned para_b_j = selected_block[row_i][0].column_index();
1236 if (para_b_i > para_nblocks)
1238 std::ostringstream err_msg;
1239 err_msg <<
"Block index for block(" << row_i <<
",0) "
1240 <<
"contains block indices (" << para_b_i <<
"," << para_b_j
1242 <<
"But there are only " << para_nblocks
1243 <<
" nblock_types().\n";
1251 for (
unsigned col_i = 0; col_i < para_selected_block_ncol; col_i++)
1253 const unsigned para_b_i = selected_block[0][col_i].row_index();
1254 const unsigned para_b_j = selected_block[0][col_i].column_index();
1255 if (para_b_j > para_nblocks)
1257 std::ostringstream err_msg;
1258 err_msg <<
"Block index for block(0," << col_i <<
") "
1259 <<
"contains block indices (" << para_b_i <<
"," << para_b_j
1261 <<
"But there are only " << para_nblocks
1262 <<
" nblock_types().\n";
1270 std::set<unsigned> row_index_set;
1271 for (
unsigned row_i = 0; row_i < para_selected_block_nrow; row_i++)
1273 std::pair<std::set<unsigned>::iterator,
bool> row_index_set_ret;
1275 const unsigned row_i_index = selected_block[row_i][0].row_index();
1277 row_index_set_ret = row_index_set.insert(row_i_index);
1279 if (!row_index_set_ret.second)
1281 std::ostringstream err_msg;
1282 err_msg <<
"The row " << row_i_index <<
" is already inserted.\n";
1290 std::set<unsigned> col_index_set;
1291 for (
unsigned col_i = 0; col_i < para_selected_block_ncol; col_i++)
1293 std::pair<std::set<unsigned>::iterator,
bool> col_index_set_ret;
1295 const unsigned col_i_index = selected_block[0][col_i].column_index();
1297 col_index_set_ret = col_index_set.insert(col_i_index);
1299 if (!col_index_set_ret.second)
1301 std::ostringstream err_msg;
1302 err_msg <<
"The col " << col_i_index <<
" is already inserted.\n";
1312 for (
unsigned block_i = 0; block_i < para_selected_block_nrow; block_i++)
1314 for (
unsigned block_j = 0; block_j < para_selected_block_ncol;
1318 selected_block[block_i][block_j].replacement_block_pt();
1320 if (tmp_block_pt != 0)
1322 if (!tmp_block_pt->
built())
1324 std::ostringstream err_msg;
1325 err_msg <<
"The matrix pointed to by block(" << block_i <<
","
1326 << block_j <<
") is not built.\n";
1335 const unsigned row_selected_block =
1336 selected_block[block_i][block_j].row_index();
1341 if (*tmp_block_dist_pt != *another_tmp_block_dist_pt)
1343 std::ostringstream err_msg;
1344 err_msg <<
"block_distribution_pt " << row_selected_block <<
"\n"
1345 <<
"does not match the distribution from the block_pt() "
1346 <<
" in selected_block[" << block_i <<
"][" << block_j
1365 for (
unsigned block_i = 0; block_i < para_selected_block_nrow; block_i++)
1367 for (
unsigned block_j = 0; block_j < para_selected_block_ncol;
1372 selected_block[block_i][block_j].replacement_block_pt();
1374 if (tmp_block_pt != 0)
1376 const unsigned tmp_block_ncol = tmp_block_pt->
ncol();
1378 const unsigned selected_block_col =
1379 selected_block[block_i][block_j].column_index();
1382 const unsigned another_tmp_block_ncol =
1385 if (tmp_block_ncol != another_tmp_block_ncol)
1387 std::ostringstream err_msg;
1388 err_msg <<
"block_pt in selected_block[" << block_i <<
"]["
1390 <<
"has ncol = " << tmp_block_ncol <<
".\n"
1391 <<
"But the corresponding block_distribution_pt("
1392 << selected_block_col
1393 <<
") has nrow = " << another_tmp_block_ncol <<
").\n";
1404 MATRIX output_matrix;
1407 const unsigned nblock_row = selected_block.
nrow();
1408 const unsigned nblock_col = selected_block.
ncol();
1418 for (
unsigned row_i = 0; row_i < nblock_row; row_i++)
1420 const unsigned selected_row_index =
1421 selected_block[row_i][0].row_index();
1424 block_row_index[row_i] = selected_row_index;
1429 for (
unsigned col_i = 0; col_i < nblock_col; col_i++)
1431 const unsigned selected_col_index =
1432 selected_block[0][col_i].column_index();
1435 block_col_index[col_i] = selected_col_index;
1453 output_matrix.build(iter->second);
1461 output_matrix.build(tmp_dist_pt);
1487 for (
unsigned block_i = 0; block_i < nblock_row; block_i++)
1489 for (
unsigned block_j = 0; block_j < nblock_col; block_j++)
1491 const bool block_wanted = selected_block[block_i][block_j].wanted();
1496 selected_block[block_i][block_j].replacement_block_pt();
1498 if (tmp_block_pt == 0)
1500 new_block[block_i][block_j] = 1;
1505 const unsigned tmp_block_i = block_row_index[block_i];
1506 const unsigned tmp_block_j = block_col_index[block_j];
1510 tmp_block_i, tmp_block_j, *block_pt(block_i, block_j));
1514 block_pt(block_i, block_j) = tmp_block_pt;
1522 row_dist_pt, col_dist_pt, block_pt, output_matrix);
1525 for (
unsigned block_i = 0; block_i < nblock_row; block_i++)
1527 for (
unsigned block_j = 0; block_j < nblock_col; block_j++)
1529 if (new_block[block_i][block_j])
1531 delete block_pt(block_i, block_j);
1536 return output_matrix;
1675 std::ostringstream error_msg;
1677 <<
"The Block_to_dof_map_coarse vector is not setup for \n"
1678 <<
"this block preconditioner.\n\n"
1680 <<
"This vector is always set up within block_setup(...).\n"
1681 <<
"If block_setup() is already called, then perhaps there is\n"
1682 <<
"something wrong with your block preconditionable elements.\n"
1700 std::ostringstream err_msg;
1704 err_msg <<
"No meshes have been set for this block preconditioner!\n"
1705 <<
"Set one with set_nmesh(...), set_mesh(...)" << std::endl;
1708 for (
unsigned m = 0;
m <
n;
m++)
1712 err_msg <<
"The mesh pointer to mesh " <<
m <<
" is null!\n"
1713 <<
"Set a non-null one with set_mesh(...)" << std::endl;
1736 std::ostringstream error_msg;
1738 <<
"The Doftype_coarsen_map_coarse vector is not setup for \n"
1739 <<
"this SUBSIDIARY block preconditioner.\n\n"
1741 <<
"For SUBSIDARY block preconditioners at any level, this\n"
1742 <<
"vector is set up in the function \n"
1743 <<
"turn_into_subsidiary_block_preconditioner(...).\n\n"
1745 <<
"Being a SUBSIDIARY block preconditioner means that \n"
1746 <<
"(Master_block_preconditioner_pt == 0) is true.\n"
1747 <<
"The Master_block_preconditioner_pt MUST be set in the "
1749 <<
"turn_into_subsidiary_block_preconditioner(...).\n\n"
1751 <<
"Somewhere, the Master_block_preconditioner_pt pointer is\n"
1752 <<
"set but not by the function\n"
1753 <<
"turn_into_subsidiary_block_preconditioner(...).\n"
1787 std::ostringstream error_msg;
1788 error_msg <<
"The mesh_pt() function should not be called on a\n"
1789 <<
"subsidiary block preconditioner." << std::endl;
1800 std::ostringstream error_msg;
1801 error_msg <<
"Mesh pointer " << mesh_i_pt <<
" is null.";
1834 unsigned block_i = 0;
1855 if (internal_dof_block_number >= 0)
1863 unsigned block_proc =
1868 const unsigned ndof_in_block =
1872 for (
unsigned dof_i = 0; dof_i < ndof_in_block; dof_i++)
1883 internal_dof_block_number)
1904 const unsigned&
b)
const
1909 std::ostringstream error_msg;
1910 error_msg <<
"Block distributions are not set up.\n"
1911 <<
"Have you called block_setup(...)?\n"
1918 std::ostringstream error_msg;
1919 error_msg <<
"You requested the distribution for the block " <<
b
1922 <<
" block types.\n"
1938 std::ostringstream error_msg;
1939 error_msg <<
"Block distributions are not set up.\n"
1940 <<
"Have you called block_setup(...)?\n"
1947 std::ostringstream error_msg;
1948 error_msg <<
"You requested the distribution for the block " <<
b
1951 <<
" block types.\n"
1967 std::ostringstream error_msg;
1968 error_msg <<
"You requested the distribution for the dof block " <<
b
1970 <<
"But there are only " <<
ndof_types() <<
" DOF types.\n"
1983 std::ostringstream error_msg;
1984 error_msg <<
"Internal block distributions are not set up.\n"
1985 <<
"Have you called block_setup(...)?\n"
2001 std::ostringstream error_msg;
2002 error_msg <<
"Dof block distributions are not set up.\n"
2003 <<
"Have you called block_setup(...)?\n"
2042 std::ostringstream err_msg;
2043 err_msg <<
"A subsidiary block preconditioner should not care about\n"
2044 <<
"anything to do with meshes.";
2096 const unsigned& precision = 8)
const
2100 for (
unsigned i = 0;
i < nblocks;
i++)
2102 for (
unsigned j = 0;
j < nblocks;
j++)
2126 #ifdef OOMPH_HAS_MPI
2127 Index_in_dof_block_sparse.clear();
2128 Dof_number_sparse.clear();
2129 Global_index_sparse.clear();
2130 Index_in_dof_block_sparse.clear();
2131 Dof_number_sparse.clear();
2146 std::ostringstream error_message;
2147 error_message <<
"This block preconditioner does not have "
2148 <<
"a master preconditioner.";
2166 for (
unsigned b = 0;
b < nblock;
b++)
2178 #ifdef OOMPH_HAS_MPI
2180 unsigned nr = Rows_to_send_for_get_block.nrow();
2181 unsigned nc = Rows_to_send_for_get_block.ncol();
2182 for (
unsigned p = 0;
p < nc;
p++)
2184 delete[] Rows_to_send_for_get_ordered[
p];
2185 delete[] Rows_to_recv_for_get_ordered[
p];
2186 for (
unsigned b = 0;
b < nr;
b++)
2188 delete[] Rows_to_recv_for_get_block(
b,
p);
2189 delete[] Rows_to_send_for_get_block(
b,
p);
2192 Rows_to_recv_for_get_block.resize(0, 0);
2193 Nrows_to_recv_for_get_block.resize(0, 0);
2194 Rows_to_send_for_get_block.resize(0, 0);
2195 Nrows_to_send_for_get_block.resize(0, 0);
2196 Rows_to_recv_for_get_ordered.clear();
2197 Nrows_to_recv_for_get_ordered.clear();
2198 Rows_to_send_for_get_ordered.clear();
2199 Nrows_to_send_for_get_ordered.clear();
2219 for (
unsigned dist_i = 0; dist_i < n_existing_block_dist; dist_i++)
2230 for (
unsigned i = 0;
i < n_existing_block_dist;
i++)
2232 preconditioner_matrix_key[
i] =
i;
2243 if (iter->first != preconditioner_matrix_key)
2245 delete iter->second;
2259 for (
unsigned dof_i = 0; dof_i < ndof_block_dist; dof_i++)
2272 oomph_info <<
"===========================================" << std::endl;
2273 oomph_info <<
"Block Preconditioner Documentation" << std::endl
2284 oomph_info <<
"Master DOF number " << d <<
" : "
2300 oomph_info <<
"Master block preconditioner distribution:" << std::endl;
2302 oomph_info <<
"Internal preconditioner matrix distribution:" << std::endl;
2305 oomph_info <<
"Preconditioner matrix distribution:" << std::endl;
2309 oomph_info <<
"Internal block " <<
b <<
" distribution:" << std::endl;
2314 oomph_info <<
"Block " <<
b <<
" distribution:" << std::endl;
2328 oomph_info <<
"===========================================" << std::endl;
2346 if (
i >= n_dof_types)
2348 std::ostringstream err_msg;
2349 err_msg <<
"Trying to get the most fine grain dof types in dof type "
2350 <<
i <<
",\nbut there are only " << n_dof_types
2351 <<
" number of dof types.\n";
2366 if (
i >= n_dof_types)
2368 std::ostringstream err_msg;
2369 err_msg <<
"Trying to get the number of most fine grain dof types "
2370 <<
"in dof type " <<
i <<
",\n"
2371 <<
"but there are only " << n_dof_types
2372 <<
" number of dof types.\n";
2401 const unsigned nblock = block_col_indices.size();
2405 const unsigned col_index = block_col_indices[0];
2416 matvec_prod_pt->
setup(block_pt, iter->second);
2421 for (
unsigned b = 0;
b < nblock;
b++)
2431 matvec_prod_pt->
setup(block_pt, tmp_dist_pt);
2440 const unsigned& block_col_index)
2527 std::ostringstream err_msg;
2529 <<
"(Internal_nblock_types == 0) is true. \n"
2530 <<
"Did you remember to call the function block_setup(...)?\n\n"
2532 <<
"This variable is always set up within block_setup(...).\n"
2533 <<
"If block_setup() is already called, then perhaps there is\n"
2534 <<
"something wrong with your block preconditionable elements.\n"
2542 std::ostringstream err_msg;
2544 <<
"The number of internal block types and "
2545 <<
"internal dof types does not match... \n\n"
2546 <<
"Internally, the number of block types and the number of dof "
2547 <<
"types must be the same.\n"
2573 std::ostringstream error_msg;
2575 <<
"(Internal_ndof_types == 0) is true.\n"
2576 <<
"This means that the Master_block_preconditioner_pt pointer is\n"
2577 <<
"set but possibly not by the function\n"
2578 <<
"turn_into_subsidiary_block_preconditioner(...).\n\n"
2580 <<
"This goes against the block preconditioning framework "
2582 <<
"Many machinery relies on the look up lists set up by the \n"
2583 <<
"function turn_into_subsidiary_block_preconditioner(...) \n"
2584 <<
"between the parent and child block preconditioners.\n"
2597 for (
unsigned i = 0;
i <
nmesh();
i++)
2679 MATRIX& output_block)
const;
2712 if (internal_dof_block_number >= 0)
2720 internal_dof_block_number)
2735 const unsigned&
b)
const
2740 std::ostringstream error_msg;
2741 error_msg <<
"Internal block distributions are not set up.\n"
2742 <<
"Have you called block_setup(...)?\n"
2749 std::ostringstream error_msg;
2750 error_msg <<
"You requested the distribution for the internal block "
2753 <<
" block types.\n"
2774 const unsigned max_block_number =
2775 *std::max_element(block_vec_number.begin(), block_vec_number.end());
2778 if (max_block_number >= nblocks)
2780 std::ostringstream err_msg;
2781 err_msg <<
"Cannot insert into Auxiliary_block_distribution_pt\n"
2782 <<
"because " << max_block_number <<
" is equal to or \n"
2783 <<
"greater than " << nblocks <<
".\n";
2800 std::ostringstream err_msg;
2801 err_msg <<
"Cannot insert into Auxiliary_block_distribution_pt\n"
2802 <<
"because the first in the pair already exists.\n";
2809 std::make_pair(block_vec_number, dist_pt));
2816 const MATRIX* block_matrix_pt)
const;
2826 template<
typename myType>
2829 const bool sorted =
false)
const
2834 std::lower_bound(vec.begin(), vec.end(),
val);
2836 return (low == vec.end() || *low !=
val) ? -1 : (low - vec.begin());
2840 int pos = std::find(vec.begin(), vec.end(),
val) - vec.begin();
2841 return (pos <
int(vec.size()) && pos >= 0) ? pos : -1;
2868 const bool& allow_multiple_element_type_in_mesh =
false)
2874 std::ostringstream err_msg;
2875 err_msg <<
"The mesh pointer has space for " <<
nmesh() <<
" meshes.\n"
2876 <<
"Cannot store a mesh at entry " <<
i <<
"\n"
2877 <<
"Has set_nmesh(...) been called?";
2885 std::ostringstream err_msg;
2886 err_msg <<
"Tried to set the " <<
i
2887 <<
"-th mesh pointer, but it is null.";
2898 unsigned(allow_multiple_element_type_in_mesh);
2912 const unsigned& block_j,
2919 std::ostringstream err_msg;
2920 err_msg <<
"nblock_types() is 0, has block_setup(...) been called?\n";
2927 unsigned para_ndof_types = this->
ndof_types();
2929 if ((block_i >= para_ndof_types) || (block_j >= para_ndof_types))
2931 std::ostringstream err_msg;
2932 err_msg <<
"Replacement dof block (" << block_i <<
"," << block_j
2933 <<
") is outside of range:\n"
2957 std::ostringstream err_msg;
2958 err_msg <<
"Replacing block(" << block_i <<
"," << block_i <<
")\n"
2959 <<
" but the pointer is NULL." << std::endl;
2967 std::ostringstream err_msg;
2968 err_msg <<
"Replacement block(" << block_i <<
"," << block_i <<
")"
2969 <<
" is not built." << std::endl;
2979 const unsigned para_dof_block_i = block_i;
2984 std::ostringstream err_msg;
2985 err_msg <<
"The distribution of the replacement dof_block_pt\n"
2986 <<
"is different from the Dof_block_distribution_pt["
2987 << para_dof_block_i <<
"].\n";
2994 const unsigned para_dof_block_j = block_j;
2996 unsigned para_required_ncol =
2998 if (para_replacement_block_ncol != para_required_ncol)
3000 std::ostringstream err_msg;
3001 err_msg <<
"Replacement dof block has ncol = "
3002 << para_replacement_block_ncol <<
".\n"
3003 <<
"But required ncol is " << para_required_ncol <<
".\n";
3027 #ifdef OOMPH_HAS_MPI
3029 for (
unsigned i = 0,
n =
nmesh();
i <
n;
i++)
3031 if (
mesh_pt(
i)->is_mesh_distributed())
3049 #ifdef OOMPH_HAS_MPI
3053 if (i_dof >=
first_row && i_dof <= last_row)
3061 get_index_of_value<unsigned>(Global_index_sparse, i_dof,
true);
3064 return Dof_number_sparse[index];
3070 std::ostringstream error_message;
3071 error_message <<
"Proc " << my_rank
3072 <<
": Requested internal_dof_number(...) for global DOF "
3074 <<
"cannot be found.\n";
3097 return static_cast<int>(
i);
3117 #ifdef OOMPH_HAS_MPI
3121 if (i_dof >=
first_row && i_dof <= last_row)
3129 get_index_of_value<unsigned>(Global_index_sparse, i_dof,
true);
3132 return Index_in_dof_block_sparse[index];
3137 std::ostringstream error_message;
3138 error_message <<
"Requested internal_index_in_dof(...) for global DOF "
3140 <<
"cannot be found.\n";
3169 if (
b >= i_nblock_types)
3171 std::ostringstream err_msg;
3172 err_msg <<
"Trying to get internal block dimension for \n"
3173 <<
"internal block " <<
b <<
".\n"
3174 <<
"But there are only " << i_nblock_types
3175 <<
" internal dof types.\n";
3191 if (
i >= i_n_dof_types)
3193 std::ostringstream err_msg;
3194 err_msg <<
"Trying to get internal dof block dimension for \n"
3195 <<
"internal dof block " <<
i <<
".\n"
3196 <<
"But there are only " << i_n_dof_types
3197 <<
" internal dof types.\n";
3422 #ifdef OOMPH_HAS_MPI
3477 #ifdef OOMPH_HAS_MPI
Array< int, Dynamic, 1 > v
Definition: Array_initializer_list_vector_cxx11.cpp:1
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
RowVector3d w
Definition: Matrix_resize_int.cpp:3
float * p
Definition: Tutorial_Map_using.cpp:9
Scalar * b
Definition: benchVecAdd.cpp:17
Definition: block_preconditioner.h:422
const LinearAlgebraDistribution * master_distribution_pt() const
Definition: block_preconditioner.h:2017
Vector< Vector< unsigned > > Doftype_coarsen_map_coarse
Definition: block_preconditioner.h:3326
void internal_return_block_vector(const unsigned &n, const DoubleVector &b, DoubleVector &v) const
Definition: block_preconditioner.cc:4293
BlockPreconditioner(const BlockPreconditioner &)=delete
Broken copy constructor.
unsigned Internal_nblock_types
Definition: block_preconditioner.h:3362
Vector< unsigned > Index_in_dof_block_dense
Definition: block_preconditioner.h:3415
bool block_output_on() const
Test if output of blocks is on or not.
Definition: block_preconditioner.h:2088
void turn_on_recursive_debug_flag()
Definition: block_preconditioner.h:545
unsigned nmesh() const
Definition: block_preconditioner.h:1816
const LinearAlgebraDistribution * internal_block_distribution_pt(const unsigned &b) const
Access function to the internal block distributions.
Definition: block_preconditioner.h:2734
void return_block_vector(const unsigned &n, const DoubleVector &b, DoubleVector &v) const
Definition: block_preconditioner.cc:4489
unsigned internal_index_in_dof(const unsigned &i_dof) const
Definition: block_preconditioner.h:3113
LinearAlgebraDistribution * dof_block_distribution_pt(const unsigned &b)
Access function to the dof-level block distributions.
Definition: block_preconditioner.h:1962
Vector< LinearAlgebraDistribution * > Dof_block_distribution_pt
Definition: block_preconditioner.h:3341
void turn_on_debug_flag()
Toggles on the debug flag.
Definition: block_preconditioner.h:562
Vector< Vector< unsigned > > Block_to_dof_map_fine
Mapping for the block types to the most fine grain dof types.
Definition: block_preconditioner.h:3288
void document()
Definition: block_preconditioner.h:2269
void internal_return_block_vectors(const Vector< unsigned > &block_vec_number, const Vector< DoubleVector > &s, DoubleVector &v) const
Definition: block_preconditioner.cc:3684
Vector< unsigned > Doftype_in_master_preconditioner_coarse
Definition: block_preconditioner.h:3411
Vector< unsigned > Allow_multiple_element_type_in_mesh
Definition: block_preconditioner.h:3345
void get_dof_level_block(const unsigned &i, const unsigned &j, MATRIX &output_block, const bool &ignore_replacement_block=false) const
Vector< unsigned > Dof_number_dense
Definition: block_preconditioner.h:3420
Vector< LinearAlgebraDistribution * > Internal_block_distribution_pt
Storage for the default distribution for each internal block.
Definition: block_preconditioner.h:3337
unsigned Internal_ndof_types
Definition: block_preconditioner.h:3368
const LinearAlgebraDistribution * internal_preconditioner_matrix_distribution_pt() const
Definition: block_preconditioner.h:3251
Vector< Vector< unsigned > > doftype_coarsen_map_fine() const
Definition: block_preconditioner.h:2334
const Mesh * mesh_pt(const unsigned &i) const
Definition: block_preconditioner.h:1782
unsigned master_nrow() const
Definition: block_preconditioner.h:3222
Vector< unsigned > get_fine_grain_dof_types_in(const unsigned &i) const
Definition: block_preconditioner.h:2341
Vector< unsigned > Ndof_types_in_mesh
Definition: block_preconditioner.h:3356
unsigned ndof_types_in_mesh(const unsigned &i) const
Definition: block_preconditioner.h:2037
void disable_block_output_to_files()
Turn off output of blocks (by clearing the basefilename string).
Definition: block_preconditioner.h:2082
void turn_off_debug_flag()
Toggles off the debug flag.
Definition: block_preconditioner.h:568
unsigned Nrow
Definition: block_preconditioner.h:3393
MATRIX get_block(const unsigned &i, const unsigned &j, const bool &ignore_replacement_block=false) const
Definition: block_preconditioner.h:988
void block_matrix_test(const unsigned &i, const unsigned &j, const MATRIX *block_matrix_pt) const
Definition: block_preconditioner.cc:5839
unsigned internal_ndof_types() const
Definition: block_preconditioner.h:2564
unsigned nfine_grain_dof_types_in(const unsigned &i) const
Definition: block_preconditioner.h:2361
MATRIX get_concatenated_block(const VectorMatrix< BlockSelector > &selected_block)
Definition: block_preconditioner.h:1134
Vector< unsigned > Dof_dimension
Definition: block_preconditioner.h:3457
MapMatrix< unsigned, CRDoubleMatrix * > replacement_dof_block_pt() const
Access function to the replaced dof-level blocks.
Definition: block_preconditioner.h:2381
LinearAlgebraDistribution * Internal_preconditioner_matrix_distribution_pt
Definition: block_preconditioner.h:3519
Vector< LinearAlgebraDistribution * > Block_distribution_pt
The distribution for the blocks.
Definition: block_preconditioner.h:3277
Vector< Vector< unsigned > > Block_number_to_dof_number_lookup
Definition: block_preconditioner.h:3468
void setup_matrix_vector_product(MatrixVectorProduct *matvec_prod_pt, CRDoubleMatrix *block_pt, const unsigned &block_col_index)
Definition: block_preconditioner.h:2438
void internal_return_block_ordered_preconditioner_vector(const DoubleVector &w, DoubleVector &v) const
Definition: block_preconditioner.cc:4850
void get_blocks(DenseMatrix< bool > &required_blocks, DenseMatrix< MATRIX * > &block_matrix_pt) const
Definition: block_preconditioner.cc:2537
void return_concatenated_block_vector(const Vector< unsigned > &block_vec_number, const DoubleVector &b, DoubleVector &v) const
Takes concatenated block ordered vector, b, and copies its.
Definition: block_preconditioner.cc:2774
static bool Run_block_matrix_test
Definition: block_preconditioner.h:3527
bool any_mesh_distributed() const
Definition: block_preconditioner.h:3025
void return_block_vectors(const Vector< unsigned > &block_vec_number, const Vector< DoubleVector > &s, DoubleVector &v) const
Definition: block_preconditioner.cc:3443
unsigned internal_master_dof_number(const unsigned &b) const
Definition: block_preconditioner.h:3238
void get_block(const unsigned &i, const unsigned &j, MATRIX &output_matrix, const bool &ignore_replacement_block=false) const
Definition: block_preconditioner.h:673
void set_master_matrix_pt(MATRIX *in_matrix_pt)
Set the matrix_pt in the upper-most master preconditioner.
Definition: block_preconditioner.h:998
BlockPreconditioner()
Constructor.
Definition: block_preconditioner.h:425
const LinearAlgebraDistribution * preconditioner_matrix_distribution_pt() const
Definition: block_preconditioner.h:3267
int index_in_block(const unsigned &i_dof) const
Definition: block_preconditioner.h:1850
BlockPreconditioner< MATRIX > * Master_block_preconditioner_pt
Definition: block_preconditioner.h:3399
const LinearAlgebraDistribution * block_distribution_pt(const unsigned &b) const
Access function to the block distributions (const version).
Definition: block_preconditioner.h:1903
void clear_block_preconditioner_base()
Definition: block_preconditioner.h:2159
virtual ~BlockPreconditioner()
Destructor.
Definition: block_preconditioner.h:506
Vector< Vector< unsigned > > Global_index
Definition: block_preconditioner.h:3463
unsigned internal_nblock_types() const
Definition: block_preconditioner.h:2522
void get_block_vector(const unsigned &n, const DoubleVector &v, DoubleVector &b) const
Definition: block_preconditioner.cc:4186
bool is_master_block_preconditioner() const
Definition: block_preconditioner.h:2068
unsigned nblock_types() const
Return the number of block types.
Definition: block_preconditioner.h:1670
Vector< unsigned > Ndof_in_block
Number of types of degree of freedom associated with each block.
Definition: block_preconditioner.h:3474
Vector< const Mesh * > Mesh_pt
Definition: block_preconditioner.h:3352
void set_replacement_dof_block(const unsigned &block_i, const unsigned &block_j, CRDoubleMatrix *replacement_dof_block_pt)
Definition: block_preconditioner.h:2911
int block_number(const unsigned &i_dof) const
Return the block number corresponding to a global index i_dof.
Definition: block_preconditioner.h:1822
void turn_off_recursive_debug_flag()
Definition: block_preconditioner.h:554
void operator=(const BlockPreconditioner &)=delete
Broken assignment operator.
std::string Output_base_filename
Definition: block_preconditioner.h:3531
void return_block_ordered_preconditioner_vector(const DoubleVector &w, DoubleVector &v) const
Definition: block_preconditioner.cc:5046
MATRIX * matrix_pt() const
Definition: block_preconditioner.h:520
bool is_subsidiary_block_preconditioner() const
Definition: block_preconditioner.h:2061
void insert_auxiliary_block_distribution(const Vector< unsigned > &block_vec_number, LinearAlgebraDistribution *dist_pt)
Definition: block_preconditioner.h:2769
void get_block_other_matrix(const unsigned &i, const unsigned &j, MATRIX *in_matrix_pt, MATRIX &output_matrix)
Definition: block_preconditioner.h:1012
Vector< Vector< unsigned > > Doftype_coarsen_map_fine
Definition: block_preconditioner.h:3334
void post_block_matrix_assembly_partial_clear()
Definition: block_preconditioner.h:2120
std::map< Vector< unsigned >, LinearAlgebraDistribution * > Auxiliary_block_distribution_pt
Definition: block_preconditioner.h:3387
void set_block_output_to_files(const std::string &basefilename)
Definition: block_preconditioner.h:2076
bool Debug_flag
Definition: block_preconditioner.h:3380
unsigned ndof_types() const
Return the total number of DOF types.
Definition: block_preconditioner.h:1694
BlockPreconditioner< MATRIX > * master_block_preconditioner_pt() const
Access function to the master block preconditioner pt.
Definition: block_preconditioner.h:2141
void turn_into_subsidiary_block_preconditioner(BlockPreconditioner< MATRIX > *master_block_prec_pt, const Vector< unsigned > &doftype_in_master_preconditioner_coarse)
Definition: block_preconditioner.cc:2376
int internal_dof_number(const unsigned &i_dof) const
Definition: block_preconditioner.h:3045
void internal_get_block(const unsigned &i, const unsigned &j, MATRIX &output_block) const
unsigned internal_dof_block_dimension(const unsigned &i) const
Definition: block_preconditioner.h:3187
unsigned internal_block_dimension(const unsigned &b) const
Definition: block_preconditioner.h:3165
int get_index_of_value(const Vector< myType > &vec, const myType val, const bool sorted=false) const
Definition: block_preconditioner.h:2827
LinearAlgebraDistribution * block_distribution_pt(const unsigned b)
Access function to the block distributions (non-const version).
Definition: block_preconditioner.h:1933
void internal_get_block_vectors(const Vector< unsigned > &block_vec_number, const DoubleVector &v, Vector< DoubleVector > &s) const
Definition: block_preconditioner.cc:3131
MapMatrix< unsigned, CRDoubleMatrix * > Replacement_dof_block_pt
The replacement dof-level blocks.
Definition: block_preconditioner.h:3274
void get_block_vectors(const Vector< unsigned > &block_vec_number, const DoubleVector &v, Vector< DoubleVector > &s) const
Definition: block_preconditioner.cc:2939
LinearAlgebraDistribution * Preconditioner_matrix_distribution_pt
Definition: block_preconditioner.h:3523
void setup_matrix_vector_product(MatrixVectorProduct *matvec_prod_pt, CRDoubleMatrix *block_pt, const Vector< unsigned > &block_col_indices)
Definition: block_preconditioner.h:2397
void output_blocks_to_files(const std::string &basefilename, const unsigned &precision=8) const
Definition: block_preconditioner.h:2095
Vector< Vector< unsigned > > Block_to_dof_map_coarse
Definition: block_preconditioner.h:3285
void set_nmesh(const unsigned &n)
Definition: block_preconditioner.h:2851
Vector< unsigned > Dof_number_to_block_number_lookup
Vector to the mapping from DOF number to block number.
Definition: block_preconditioner.h:3471
void internal_get_block_vector(const unsigned &n, const DoubleVector &v, DoubleVector &b) const
Definition: block_preconditioner.cc:4009
bool Recursive_debug_flag
Definition: block_preconditioner.h:3375
Vector< unsigned > Doftype_in_master_preconditioner_fine
Definition: block_preconditioner.h:3404
int internal_block_number(const unsigned &i_dof) const
Definition: block_preconditioner.h:2689
virtual void block_setup()
Definition: block_preconditioner.cc:2483
void get_concatenated_block_vector(const Vector< unsigned > &block_vec_number, const DoubleVector &v, DoubleVector &b)
Definition: block_preconditioner.cc:2608
void set_mesh(const unsigned &i, const Mesh *const mesh_pt, const bool &allow_multiple_element_type_in_mesh=false)
Definition: block_preconditioner.h:2866
void internal_get_block_ordered_preconditioner_vector(const DoubleVector &v, DoubleVector &w) const
Definition: block_preconditioner.cc:4599
void get_block_ordered_preconditioner_vector(const DoubleVector &v, DoubleVector &w)
Definition: block_preconditioner.cc:4793
int internal_index_in_block(const unsigned &i_dof) const
Definition: block_preconditioner.h:2705
Definition: block_preconditioner.h:124
void null_replacement_block_pt()
Set Replacement_block_pt to null.
Definition: block_preconditioner.h:241
void do_not_want_block()
Indicate that we do not want the block (set Wanted to false).
Definition: block_preconditioner.h:218
void want_block()
Indicate that we require the block (set Wanted to true).
Definition: block_preconditioner.h:212
const unsigned & column_index() const
returns the column index.
Definition: block_preconditioner.h:290
virtual ~BlockSelector()
Default destructor.
Definition: block_preconditioner.h:168
void build(const unsigned &row_index, const unsigned &column_index, const bool &wanted, CRDoubleMatrix *replacement_block_pt=0)
Definition: block_preconditioner.h:326
void select_block(const unsigned &row_index, const unsigned &column_index, const bool &wanted, CRDoubleMatrix *replacement_block_pt=0)
Select a block.
Definition: block_preconditioner.h:188
BlockSelector(const unsigned &row_index, const unsigned &column_index, const bool &wanted, CRDoubleMatrix *replacement_block_pt=0)
Definition: block_preconditioner.h:141
friend std::ostream & operator<<(std::ostream &o_stream, const BlockSelector &block_selector)
Definition: block_preconditioner.h:307
BlockSelector()
Definition: block_preconditioner.h:128
const unsigned & row_index() const
returns the row index.
Definition: block_preconditioner.h:278
void set_column_index(const unsigned &column_index)
Set the column index.
Definition: block_preconditioner.h:284
const bool & wanted() const
returns whether the block is wanted or not.
Definition: block_preconditioner.h:296
void set_row_index(const unsigned &row_index)
Set the row index.
Definition: block_preconditioner.h:272
CRDoubleMatrix * Replacement_block_pt
Pointer to the block.
Definition: block_preconditioner.h:369
CRDoubleMatrix * replacement_block_pt() const
Returns Replacement_block_pt.
Definition: block_preconditioner.h:266
bool Wanted
Bool to indicate if we require this block.
Definition: block_preconditioner.h:366
unsigned Column_index
Column index of the block.
Definition: block_preconditioner.h:363
unsigned Row_index
Row index of the block.
Definition: block_preconditioner.h:360
void set_replacement_block_pt(CRDoubleMatrix *replacement_block_pt)
set Replacement_block_pt.
Definition: block_preconditioner.h:247
Definition: matrices.h:888
unsigned long ncol() const
Return the number of columns of the matrix.
Definition: matrices.h:1008
bool built() const
Definition: matrices.h:1210
Definition: matrices.h:386
void clear_distribution()
Definition: linear_algebra_distribution.h:522
LinearAlgebraDistribution * distribution_pt() const
access to the LinearAlgebraDistribution
Definition: linear_algebra_distribution.h:457
unsigned nrow_local() const
access function for the num of local rows on this processor.
Definition: linear_algebra_distribution.h:469
unsigned first_row() const
access function for the first row on this processor
Definition: linear_algebra_distribution.h:481
Definition: double_vector.h:58
Definition: linear_algebra_distribution.h:64
unsigned first_row() const
Definition: linear_algebra_distribution.h:261
unsigned nrow() const
access function to the number of global rows.
Definition: linear_algebra_distribution.h:186
unsigned nrow_local() const
Definition: linear_algebra_distribution.h:193
unsigned rank_of_global_row(const unsigned i) const
return the processor rank of the global row number i
Definition: linear_algebra_distribution.h:387
Definition: map_matrix.h:508
Definition: matrix_vector_product.h:51
void setup(CRDoubleMatrix *matrix_pt, const LinearAlgebraDistribution *col_dist_pt=0)
Definition: matrix_vector_product.cc:41
unsigned ndof_types() const
Return number of dof types in mesh.
Definition: mesh.cc:8764
int my_rank() const
my rank
Definition: communicator.h:176
Definition: oomph_definitions.h:222
Definition: oomph_definitions.h:267
Definition: preconditioner.h:54
virtual DoubleMatrixBase * matrix_pt() const
Get function for matrix pointer.
Definition: preconditioner.h:150
virtual const OomphCommunicator * comm_pt() const
Get function for comm pointer.
Definition: preconditioner.h:171
virtual void set_matrix_pt(DoubleMatrixBase *matrix_pt)
Set the matrix pointer.
Definition: preconditioner.h:165
Definition: vector_matrix.h:79
const unsigned ncol() const
Definition: vector_matrix.h:146
const unsigned nrow() const
returns the number of rows. This is the outer Vector size.
Definition: vector_matrix.h:107
static constexpr lastp1_t end
Definition: IndexedViewHelper.h:79
RealScalar s
Definition: level1_cplx_impl.h:130
int * m
Definition: level2_cplx_impl.h:294
string filename
Definition: MergeRestartFiles.py:39
val
Definition: calibrate.py:119
void deep_copy(const CRDoubleMatrix *const in_matrix_pt, CRDoubleMatrix &out_matrix)
Create a deep copy of the matrix pointed to by in_matrix_pt.
Definition: matrices.h:3490
void concatenate_without_communication(const Vector< LinearAlgebraDistribution * > &row_distribution_pt, const Vector< LinearAlgebraDistribution * > &col_distribution_pt, const DenseMatrix< CRDoubleMatrix * > &matrix_pt, CRDoubleMatrix &result_matrix)
Definition: matrices.cc:5223
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
void concatenate(const Vector< LinearAlgebraDistribution * > &in_distribution_pt, LinearAlgebraDistribution &out_distribution)
Definition: linear_algebra_distribution.cc:367
std::string to_string(T object, unsigned float_precision=8)
Definition: oomph_utilities.h:189
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
OomphInfo oomph_info
Definition: oomph_definitions.cc:319
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2