31 #ifndef OOMPH_SIMPLE_BLOCK_PRECONDITIONERS
32 #define OOMPH_SIMPLE_BLOCK_PRECONDITIONERS
37 #include <oomph-lib-config.h>
51 template<
typename MATRIX>
119 template<
typename MATRIX>
123 this->clean_up_my_memory();
127 if (Multi_poisson_mesh_pt == 0)
129 std::stringstream err;
130 err <<
"Please set pointer to mesh using set_multi_poisson_mesh(...).\n";
139 this->set_mesh(0,Multi_poisson_mesh_pt);
145 unsigned nblock_types = this->nblock_types();
148 Diagonal_block_preconditioner_pt.resize(nblock_types);
149 for (
unsigned i=0;
i<nblock_types;
i++)
155 for (
unsigned i=0;
i<nblock_types;
i++)
165 Diagonal_block_preconditioner_pt[
i]->setup(&
block);
182 template<
typename MATRIX>
187 unsigned nblock_types = this->nblock_types();
192 this->get_block_vectors(
r,block_r);
196 for (
unsigned i = 0;
i < nblock_types;
i++)
198 Diagonal_block_preconditioner_pt[
i]->preconditioner_solve(block_r[
i],
203 this->return_block_vectors(block_z,z);
209 template<
typename MATRIX>
213 unsigned n_block = Diagonal_block_preconditioner_pt.size();
214 for (
unsigned i=0;
i<n_block;
i++)
216 if(Diagonal_block_preconditioner_pt[
i]!=0)
218 delete Diagonal_block_preconditioner_pt[
i];
219 Diagonal_block_preconditioner_pt[
i]=0;
237 template<
typename MATRIX>
302 template<
typename MATRIX>
306 this->clean_up_my_memory();
309 if (Multi_poisson_mesh_pt == 0)
311 std::stringstream err;
312 err <<
"Please set pointer to mesh using set_multi_poisson_mesh(...).\n";
321 this->set_mesh(0,Multi_poisson_mesh_pt);
325 unsigned n_dof_types = this->ndof_types();
328 std::stringstream
tmp;
329 tmp <<
"This preconditioner only works for problems with 2 dof types\n"
330 <<
"Yours has " << n_dof_types;
341 unsigned nblock_types = this->nblock_types();
345 std::stringstream
tmp;
346 tmp <<
"There are supposed to be two block types.\n"
347 <<
"Yours has " << nblock_types;
356 Diagonal_block_preconditioner_pt.resize(nblock_types);
359 for (
unsigned i=0;
i<nblock_types;
i++)
365 for (
unsigned i=0;
i<nblock_types;
i++)
374 Diagonal_block_preconditioner_pt[
i]->setup(&
block);
391 template<
typename MATRIX>
396 unsigned nblock_types = this->nblock_types();
401 this->get_block_vectors(
r,block_r);
405 for (
unsigned i = 0;
i < nblock_types;
i++)
407 Diagonal_block_preconditioner_pt[
i]->preconditioner_solve(block_r[
i],
412 this->return_block_vectors(block_z,z);
418 template<
typename MATRIX>
422 unsigned n_block = Diagonal_block_preconditioner_pt.size();
423 for (
unsigned i=0;
i<n_block;
i++)
425 if(Diagonal_block_preconditioner_pt[
i]!=0)
427 delete Diagonal_block_preconditioner_pt[
i];
428 Diagonal_block_preconditioner_pt[
i]=0;
446 template<
typename MATRIX>
511 template<
typename MATRIX>
515 this->clean_up_my_memory();
518 if (Multi_poisson_mesh_pt == 0)
520 std::stringstream err;
521 err <<
"Please set pointer to mesh using set_multi_poisson_mesh(...).\n";
530 this->set_mesh(0,Multi_poisson_mesh_pt);
535 unsigned n_dof_types = this->ndof_types();
538 std::stringstream
tmp;
539 tmp <<
"This preconditioner only works for problems with 1 dof types\n"
540 <<
"Yours has " << n_dof_types;
551 const unsigned nblock_types = this->nblock_types();
554 std::stringstream
tmp;
555 tmp <<
"There are supposed to be 1 block type.\n"
556 <<
"Yours has " << nblock_types;
573 Subsidiary_preconditioner_pt->setup(&
block);
586 template<
typename MATRIX>
592 this->get_block_vector(0,
r,block_r);
596 Subsidiary_preconditioner_pt->preconditioner_solve(block_r, block_z);
599 this->return_block_vector(0,block_z,z);
605 template<
typename MATRIX>
609 if(Subsidiary_preconditioner_pt!=0)
611 delete Subsidiary_preconditioner_pt;
612 Subsidiary_preconditioner_pt=0;
632 template<
typename MATRIX>
703 template<
typename MATRIX>
707 this->clean_up_my_memory();
710 if (Multi_poisson_mesh_pt == 0)
712 std::stringstream err;
713 err <<
"Please set pointer to mesh using set_multi_poisson_mesh(...).\n";
722 this->set_mesh(0,Multi_poisson_mesh_pt);
727 unsigned n_dof_types = this->ndof_types();
730 std::cout <<
"CoarseTwoIntoOne ndof_types: " << n_dof_types << std::endl;
734 std::stringstream
tmp;
735 tmp <<
"This preconditioner only works for problems with 2 dof types\n"
736 <<
"Yours has " << n_dof_types;
749 unsigned n_block_types = this->nblock_types();
751 std::cout <<
"CoarseTwoIntoOne nblock_types: "
752 << n_block_types << std::endl;
754 if (n_block_types!=2)
756 std::stringstream
tmp;
757 tmp <<
"There are supposed to be two block types.\n"
758 <<
"Yours has " << n_block_types;
769 Subsidiary_preconditioner_pt = block_prec_pt;
788 const unsigned n_sub_dof_types = 1;
796 doftype_coarsening[0].resize(2);
797 doftype_coarsening[0][0]=0;
798 doftype_coarsening[0][1]=1;
802 dof_map,doftype_coarsening);
807 block_prec_pt->
setup(this->matrix_pt());
818 template<
typename MATRIX>
825 Subsidiary_preconditioner_pt->preconditioner_solve(
r,z);
831 template<
typename MATRIX>
835 if(Subsidiary_preconditioner_pt!=0)
837 delete Subsidiary_preconditioner_pt;
838 Subsidiary_preconditioner_pt=0;
852 template<
typename MATRIX>
919 template<
typename MATRIX>
923 this->clean_up_my_memory();
926 if (Multi_poisson_mesh_pt == 0)
928 std::stringstream err;
929 err <<
"Please set pointer to mesh using set_multi_poisson_mesh(...).\n";
938 this->set_mesh(0,Multi_poisson_mesh_pt);
944 unsigned nblock_types = this->nblock_types();
949 Off_diagonal_matrix_vector_product_pt.resize(nblock_types,nblock_types,0);
950 Block_preconditioner_pt.resize(nblock_types);
953 for(
unsigned i = 0;
i < nblock_types;
i++)
968 Block_preconditioner_pt[
i]->setup(&
block);
979 for(
unsigned j=
i+1;
j<nblock_types;
j++)
990 this->setup_matrix_vector_product(
991 Off_diagonal_matrix_vector_product_pt(
i,
j),&block_matrix,
j);
1012 unsigned n_block = this->nblock_types();
1018 this->get_block_vectors(
r,block_r);
1025 for (
int i=n_block-1;
i>-1;
i--)
1028 for (
unsigned j=
i+1;
j<n_block;
j++)
1031 Off_diagonal_matrix_vector_product_pt(
i,
j)->multiply(block_z[
j],temp);
1036 this->Block_preconditioner_pt[
i]->
1037 preconditioner_solve(block_r[
i], block_z[
i]);
1041 this->return_block_vectors(block_z,z);
1047 template<
typename MATRIX>
1051 for(
unsigned i=0,ni=Off_diagonal_matrix_vector_product_pt.nrow();
i<ni;
i++)
1053 for(
unsigned j=0,nj=Off_diagonal_matrix_vector_product_pt.ncol();
j<nj;
j++)
1055 if(Off_diagonal_matrix_vector_product_pt(
i,
j) != 0)
1057 delete Off_diagonal_matrix_vector_product_pt(
i,
j);
1058 Off_diagonal_matrix_vector_product_pt(
i,
j) = 0;
1064 unsigned n_block = Block_preconditioner_pt.size();
1065 for (
unsigned i=0;
i<n_block;
i++)
1067 if(Block_preconditioner_pt[
i]!=0)
1069 delete Block_preconditioner_pt[
i];
1070 Block_preconditioner_pt[
i]=0;
1084 template<
typename MATRIX>
1122 virtual void setup();
1148 template<
typename MATRIX>
1152 this->clean_up_my_memory();
1155 if (Multi_poisson_mesh_pt == 0)
1157 std::stringstream err;
1158 err <<
"Please set pointer to mesh using set_multi_poisson_mesh(...).\n";
1167 this->set_mesh(0,Multi_poisson_mesh_pt);
1170 unsigned n_dof_types = this->ndof_types();
1177 std::stringstream
tmp;
1178 tmp <<
"This preconditioner only works for problems with 5 dof types\n"
1179 <<
"Yours has " << n_dof_types;
1191 dof_to_block_map[0]=0;
1192 dof_to_block_map[1]=0;
1193 dof_to_block_map[2]=1;
1194 dof_to_block_map[3]=1;
1195 dof_to_block_map[4]=1;
1196 this->block_setup(dof_to_block_map);
1200 << this->nblock_types() <<
" block types\n";
1210 this->get_block(0,0,
block);
1213 First_subsidiary_preconditioner_pt->setup(&
block);
1217 this->get_block(1,1,
block);
1220 Second_subsidiary_preconditioner_pt->setup(&
block);
1232 template<
typename MATRIX>
1237 unsigned n_block = this->nblock_types();
1241 this->get_block_vectors(
r,block_r);
1247 First_subsidiary_preconditioner_pt->preconditioner_solve(block_r[0],
1251 Second_subsidiary_preconditioner_pt->preconditioner_solve(block_r[1],
1255 this->return_block_vectors(block_z,z);
1262 template<
typename MATRIX>
1266 if(First_subsidiary_preconditioner_pt!=0)
1268 delete First_subsidiary_preconditioner_pt;
1269 First_subsidiary_preconditioner_pt = 0;
1271 if(Second_subsidiary_preconditioner_pt!=0)
1273 delete Second_subsidiary_preconditioner_pt;
1274 Second_subsidiary_preconditioner_pt = 0;
1287 template<
typename MATRIX>
1363 template<
typename MATRIX>
1367 this->clean_up_my_memory();
1370 if (Multi_poisson_mesh_pt == 0)
1372 std::stringstream err;
1373 err <<
"Please set pointer to mesh using set_multi_poisson_mesh(...).\n";
1382 this->set_mesh(0,Multi_poisson_mesh_pt);
1385 unsigned n_dof_types = this->ndof_types();
1391 std::stringstream
tmp;
1392 tmp <<
"This preconditioner only works for problems with 5 dof types\n"
1393 <<
"Yours has " << n_dof_types;
1404 dof_to_block_map[0]=0;
1405 dof_to_block_map[1]=0;
1406 dof_to_block_map[2]=1;
1407 dof_to_block_map[3]=1;
1408 dof_to_block_map[4]=1;
1409 this->block_setup(dof_to_block_map);
1420 this->get_block(0,0,
block);
1423 First_subsidiary_preconditioner_pt->setup(&
block);
1429 this->get_block(1,1,
block);
1432 Second_subsidiary_preconditioner_pt->setup(&
block);
1447 unsigned block_column_index=1;
1448 this->setup_matrix_vector_product(
1449 Off_diagonal_matrix_vector_product_pt,&block_matrix,block_column_index);
1461 template<
typename MATRIX>
1466 unsigned n_block = this->nblock_types();
1470 this->get_block_vectors(
r,block_r);
1476 Second_subsidiary_preconditioner_pt->preconditioner_solve(block_r[1],
1482 Off_diagonal_matrix_vector_product_pt->multiply(block_z[1],temp);
1486 First_subsidiary_preconditioner_pt->preconditioner_solve(block_r[0],
1490 this->return_block_vectors(block_z,z);
1497 template<
typename MATRIX>
1501 if (Off_diagonal_matrix_vector_product_pt != 0)
1503 delete Off_diagonal_matrix_vector_product_pt;
1504 Off_diagonal_matrix_vector_product_pt = 0;
1508 if(First_subsidiary_preconditioner_pt!=0)
1510 delete First_subsidiary_preconditioner_pt;
1511 First_subsidiary_preconditioner_pt = 0;
1513 if(Second_subsidiary_preconditioner_pt!=0)
1515 delete Second_subsidiary_preconditioner_pt;
1516 Second_subsidiary_preconditioner_pt = 0;
1531 template<
typename MATRIX>
1562 (
"TwoPlusThreeUpperTriangularWithOneLevelSubsidiary");
1570 "TwoPlusThreeUpperTriangularWithOneLevelSubsidiary");
1611 template<
typename MATRIX>
1615 this->clean_up_my_memory();
1618 if (Multi_poisson_mesh_pt == 0)
1620 std::stringstream err;
1621 err <<
"Please set pointer to mesh using set_multi_poisson_mesh(...).\n";
1630 this->set_mesh(0,Multi_poisson_mesh_pt);
1633 unsigned n_dof_types = this->ndof_types();
1639 std::stringstream
tmp;
1640 tmp <<
"This preconditioner only works for problems with 5 dof types\n"
1641 <<
"Yours has " << n_dof_types;
1652 dof_to_block_map[0]=0;
1653 dof_to_block_map[1]=0;
1654 dof_to_block_map[2]=1;
1655 dof_to_block_map[3]=1;
1656 dof_to_block_map[4]=1;
1657 this->block_setup(dof_to_block_map);
1665 First_subsidiary_preconditioner_pt=block_prec_pt;
1675 unsigned n_sub_dof_types=2;
1682 block_prec_pt->
setup(this->matrix_pt());
1689 Second_subsidiary_preconditioner_pt=block_prec_pt;
1699 unsigned n_sub_dof_types=3;
1707 block_prec_pt->
setup(this->matrix_pt());
1723 unsigned block_column_index=1;
1724 this->setup_matrix_vector_product(
1725 Off_diagonal_matrix_vector_product_pt,&block_matrix,block_column_index);
1733 template<
typename MATRIX>
1745 Second_subsidiary_preconditioner_pt->preconditioner_solve(z,
y);
1752 this->get_block_vector(1,
y,block_y);
1757 Off_diagonal_matrix_vector_product_pt->multiply(block_y,temp);
1762 this->get_block_vector(0,z,block_z);
1774 this->return_block_vector(0,block_z,big_z);
1784 First_subsidiary_preconditioner_pt->preconditioner_solve(big_z,
y);
1790 template<
typename MATRIX>
1795 if(Off_diagonal_matrix_vector_product_pt!= 0)
1797 delete Off_diagonal_matrix_vector_product_pt;
1798 Off_diagonal_matrix_vector_product_pt = 0;
1802 if(First_subsidiary_preconditioner_pt!=0)
1804 delete First_subsidiary_preconditioner_pt;
1805 First_subsidiary_preconditioner_pt = 0;
1807 if(Second_subsidiary_preconditioner_pt!=0)
1809 delete Second_subsidiary_preconditioner_pt;
1810 Second_subsidiary_preconditioner_pt = 0;
1826 template<
typename MATRIX>
1905 template<
typename MATRIX>
1909 this->clean_up_my_memory();
1912 if (Multi_poisson_mesh_pt == 0)
1914 std::stringstream err;
1915 err <<
"Please set pointer to mesh using set_multi_poisson_mesh(...).\n";
1924 this->set_mesh(0,Multi_poisson_mesh_pt);
1929 unsigned n_dof_types = this->ndof_types();
1932 std::stringstream
tmp;
1933 tmp <<
"This preconditioner only works for problems with 3 dof types\n"
1934 <<
"Yours has " << n_dof_types;
1945 dof_to_block_map[0]=0;
1946 dof_to_block_map[1]=0;
1947 dof_to_block_map[2]=1;
1948 this->block_setup(dof_to_block_map);
1957 First_subsidiary_preconditioner_pt=block_prec_pt;
1966 unsigned n_sub_dof_types=2;
1975 block_prec_pt->
setup(this->matrix_pt());
1983 Second_subsidiary_preconditioner_pt=block_prec_pt;
1992 unsigned n_sub_dof_types=1;
2000 block_prec_pt->
setup(this->matrix_pt());
2015 unsigned block_column_index=1;
2016 this->setup_matrix_vector_product(
2017 Off_diagonal_matrix_vector_product_pt,&block_matrix,block_column_index);
2030 template<
typename MATRIX>
2042 Second_subsidiary_preconditioner_pt->preconditioner_solve(
r,z);
2047 this->get_block_vector(1,z,z_1);
2048 Off_diagonal_matrix_vector_product_pt->multiply(z_1,temp);
2052 this->get_block_vector(0,
r,r_0);
2062 this->return_block_vector(0,r_0,big_r);
2071 First_subsidiary_preconditioner_pt->preconditioner_solve(big_r,z);
2077 template<
typename MATRIX>
2081 if(First_subsidiary_preconditioner_pt!=0)
2083 delete First_subsidiary_preconditioner_pt;
2084 First_subsidiary_preconditioner_pt = 0;
2086 if(Second_subsidiary_preconditioner_pt!=0)
2088 delete Second_subsidiary_preconditioner_pt;
2089 Second_subsidiary_preconditioner_pt = 0;
2091 if(Off_diagonal_matrix_vector_product_pt!=0)
2093 delete Off_diagonal_matrix_vector_product_pt;
2094 Off_diagonal_matrix_vector_product_pt = 0;
2107 template<
typename MATRIX>
2138 "TwoPlusThreeUpperTriangularWithTwoLevelSubsidiary");
2146 "TwoPlusThreeUpperTriangularWithTwoLevelSubsidiary");
2187 template<
typename MATRIX>
2191 this->clean_up_my_memory();
2194 if (Multi_poisson_mesh_pt == 0)
2196 std::stringstream err;
2197 err <<
"Please set pointer to mesh using set_multi_poisson_mesh(...).\n";
2206 this->set_mesh(0,Multi_poisson_mesh_pt);
2209 unsigned n_dof_types = this->ndof_types();
2215 std::stringstream
tmp;
2216 tmp <<
"This preconditioner only works for problems with 5 dof types\n"
2217 <<
"Yours has " << n_dof_types;
2229 dof_to_block_map[0]=0;
2230 dof_to_block_map[1]=0;
2231 dof_to_block_map[2]=1;
2232 dof_to_block_map[3]=1;
2233 dof_to_block_map[4]=1;
2234 this->block_setup(dof_to_block_map);
2237 oomph_info <<
"Preconditioner has " << this->nblock_types()
2238 <<
" block types\n";
2246 First_subsidiary_preconditioner_pt=block_prec_pt;
2255 unsigned n_sub_dof_types=2;
2264 block_prec_pt->
setup(this->matrix_pt());
2271 Second_subsidiary_preconditioner_pt=block_prec_pt;
2280 unsigned n_sub_dof_types=3;
2290 block_prec_pt->
setup(this->matrix_pt());
2304 unsigned block_column_index=1;
2305 this->setup_matrix_vector_product(
2306 Off_diagonal_matrix_vector_product_pt,&block_matrix,block_column_index);
2321 template<
typename MATRIX>
2333 Second_subsidiary_preconditioner_pt->preconditioner_solve(
r,z);
2336 unsigned n_block = this->nblock_types();
2341 this->get_block_vectors(
r,block_r);
2347 this->get_block_vectors(z,block_z);
2349 Off_diagonal_matrix_vector_product_pt->multiply(block_z[1],temp);
2358 this->return_block_vector(0,block_r[0],big_r);
2367 First_subsidiary_preconditioner_pt->preconditioner_solve(big_r,z);
2373 template<
typename MATRIX>
2378 if(Off_diagonal_matrix_vector_product_pt!= 0)
2380 delete Off_diagonal_matrix_vector_product_pt;
2381 Off_diagonal_matrix_vector_product_pt = 0;
2385 if(First_subsidiary_preconditioner_pt!=0)
2387 delete First_subsidiary_preconditioner_pt;
2388 First_subsidiary_preconditioner_pt = 0;
2390 if(Second_subsidiary_preconditioner_pt!=0)
2392 delete Second_subsidiary_preconditioner_pt;
2393 Second_subsidiary_preconditioner_pt = 0;
2413 template<
typename MATRIX>
2445 broken_copy(
"TwoPlusThreeUpperTriangularWithReplace");
2494 template<
typename MATRIX>
2498 this->clean_up_my_memory();
2501 if (Multi_poisson_mesh_pt == 0)
2503 std::stringstream err;
2504 err <<
"Please set pointer to mesh using set_multi_poisson_mesh(...).\n";
2513 this->set_mesh(0,Multi_poisson_mesh_pt);
2516 const unsigned n_dof_types = this->ndof_types();
2522 std::stringstream
tmp;
2523 tmp <<
"This preconditioner only works for problems with 5 dof types\n"
2524 <<
"Yours has " << n_dof_types;
2535 dof_to_block_map[0] = 0;
2536 dof_to_block_map[1] = 0;
2537 dof_to_block_map[2] = 1;
2538 dof_to_block_map[3] = 1;
2539 dof_to_block_map[4] = 1;
2540 this->block_setup(dof_to_block_map);
2545 const unsigned nblocks = this->nblock_types();
2548 std::stringstream
tmp;
2549 tmp <<
"Expected number of block types is 2.\n"
2550 <<
"Yours has " << nblocks <<
".\n"
2551 <<
"Perhaps your argument to block_setup(...) is not correct.\n";
2562 Replacement_matrix_pt.resize(n_dof_types,n_dof_types,0);
2567 for(
unsigned i=0;
i<n_dof_types;
i++)
2569 for(
unsigned j=0;
j<n_dof_types;
j++)
2574 bool modify_existing_matrix=
true;
2575 if (modify_existing_matrix)
2579 this->get_dof_level_block(
i,
j,(*Replacement_matrix_pt(
i,
j)));
2582 unsigned nnz=Replacement_matrix_pt(
i,
j)->nnz();
2583 for (
unsigned k=0;
k<nnz;
k++)
2585 Replacement_matrix_pt(
i,
j)->value()[
k]=0.0;
2595 this->dof_block_distribution_pt(
i);
2598 const unsigned long dof_block_nrow_local
2603 const unsigned long dof_block_ncol
2604 = this->dof_block_distribution_pt(
j)->nrow();
2616 replacement_row_start.resize(dof_block_nrow_local+1,0);
2618 Replacement_matrix_pt(
i,
j)=
2622 replacement_column_index,
2623 replacement_row_start);
2627 this->set_replacement_dof_block(
i,
j,Replacement_matrix_pt(
i,
j));
2637 First_subsidiary_preconditioner_pt=block_prec_pt;
2645 unsigned n_sub_dof_types=2;
2654 block_prec_pt->
setup(this->matrix_pt());
2661 Second_subsidiary_preconditioner_pt=block_prec_pt;
2669 unsigned n_sub_dof_types=3;
2679 block_prec_pt->
setup(this->matrix_pt());
2693 unsigned block_column_index=1;
2694 this->setup_matrix_vector_product(
2695 Off_diagonal_matrix_vector_product_pt,&block_matrix,block_column_index);
2711 template<
typename MATRIX>
2720 Second_subsidiary_preconditioner_pt->preconditioner_solve(
r,z);
2725 this->get_block_vector(0,
r,r_0);
2728 this->get_block_vector(1,z,z_1);
2732 Off_diagonal_matrix_vector_product_pt->multiply(z_1,temp);
2741 this->return_block_vector(0,r_0,big_r);
2750 First_subsidiary_preconditioner_pt->preconditioner_solve(big_r,z);
2757 template<
typename MATRIX>
2762 if(First_subsidiary_preconditioner_pt!=0)
2764 delete First_subsidiary_preconditioner_pt;
2765 First_subsidiary_preconditioner_pt = 0;
2767 if(Second_subsidiary_preconditioner_pt!=0)
2769 delete Second_subsidiary_preconditioner_pt;
2770 Second_subsidiary_preconditioner_pt = 0;
2774 for(
unsigned i=0,ni=Replacement_matrix_pt.nrow();
i<ni;
i++)
2776 for(
unsigned j=0,nj=Replacement_matrix_pt.ncol();
j<nj;
j++)
2778 if(Replacement_matrix_pt(
i,
j)!=0)
2780 delete Replacement_matrix_pt(
i,
j);
2781 Replacement_matrix_pt(
i,
j)=0;
2787 if(Off_diagonal_matrix_vector_product_pt != 0)
2789 delete Off_diagonal_matrix_vector_product_pt;
2790 Off_diagonal_matrix_vector_product_pt = 0;
2805 template<
typename MATRIX>
2837 "CoarseTwoPlusTwoPlusOne");
2845 "CoarseTwoPlusTwoPlusOne");
2852 virtual void setup();
2884 template<
typename MATRIX>
2888 this->clean_up_my_memory();
2891 if (Multi_poisson_mesh_pt == 0)
2893 std::stringstream err;
2894 err <<
"Please set pointer to mesh using set_multi_poisson_mesh(...).\n";
2903 this->set_mesh(0,Multi_poisson_mesh_pt);
2906 unsigned n_dof_types = this->ndof_types();
2910 std::stringstream
tmp;
2911 tmp <<
"This preconditioner only works for problems with 5 dof types\n"
2912 <<
"Yours has " << n_dof_types;
2924 dof_to_block_map[0] = 0;
2925 dof_to_block_map[1] = 0;
2926 dof_to_block_map[2] = 1;
2927 dof_to_block_map[3] = 1;
2928 dof_to_block_map[4] = 1;
2929 this->block_setup(dof_to_block_map);
2933 Replacement_matrix_pt.resize(n_dof_types,n_dof_types,0);
2934 for(
unsigned i=0;
i<n_dof_types;
i++)
2936 for(
unsigned j=0;
j<n_dof_types;
j++)
2942 this->dof_block_distribution_pt(
i);
2945 const unsigned long dof_block_nrow = dof_block_dist_pt->
nrow_local();
2951 const unsigned long dof_block_ncol
2952 = this->dof_block_distribution_pt(
j)->nrow();
2963 replacement_row_start.resize(dof_block_nrow+1,0);
2965 Replacement_matrix_pt(
i,
j)=
2968 replacement_column_index, replacement_row_start);
2971 this->set_replacement_dof_block(
i,
j,Replacement_matrix_pt(
i,
j));
2983 First_subsidiary_preconditioner_pt=block_prec_pt;
2991 const unsigned n_sub_dof_types=2;
3000 block_prec_pt->
setup(this->matrix_pt());
3007 Second_subsidiary_preconditioner_pt=block_prec_pt;
3031 const unsigned n_sub_dof_types=2;
3035 doftype_coarsening[0].resize(2);
3038 doftype_coarsening[0][0]=0;
3039 doftype_coarsening[0][1]=1;
3042 doftype_coarsening[1].resize(1);
3045 doftype_coarsening[1][0]=2;
3049 turn_into_subsidiary_block_preconditioner(
this,dof_map,
3050 doftype_coarsening);
3055 block_prec_pt->
setup(this->matrix_pt());
3070 unsigned block_column_index=1;
3071 this->setup_matrix_vector_product(
3072 Off_diagonal_matrix_vector_product_pt,&block_matrix,block_column_index);
3087 template<
typename MATRIX>
3096 Second_subsidiary_preconditioner_pt->preconditioner_solve(
r,z);
3100 this->get_block_vector(0,
r,r_0);
3104 this->get_block_vector(1,z,z_1);
3108 Off_diagonal_matrix_vector_product_pt->multiply(z_1,temp);
3118 this->return_block_vector(0,r_0,big_r);
3127 First_subsidiary_preconditioner_pt->preconditioner_solve(big_r,z);
3133 template<
typename MATRIX>
3138 if(First_subsidiary_preconditioner_pt!=0)
3140 delete First_subsidiary_preconditioner_pt;
3141 First_subsidiary_preconditioner_pt = 0;
3143 if(Second_subsidiary_preconditioner_pt!=0)
3145 delete Second_subsidiary_preconditioner_pt;
3146 Second_subsidiary_preconditioner_pt = 0;
3150 for(
unsigned i=0,ni=Replacement_matrix_pt.nrow();
i<ni;
i++)
3152 for(
unsigned j=0,nj=Replacement_matrix_pt.ncol();
j<nj;
j++)
3154 if(Replacement_matrix_pt(
i,
j)!=0)
3156 delete Replacement_matrix_pt(
i,
j);
3157 Replacement_matrix_pt(
i,
j)=0;
3163 if(Off_diagonal_matrix_vector_product_pt!= 0)
3165 delete Off_diagonal_matrix_vector_product_pt;
3166 Off_diagonal_matrix_vector_product_pt = 0;
3184 template<
typename MATRIX>
3216 "OnePlusFourWithTwoCoarse");
3224 "OnePlusFourWithTwoCoarse");
3231 virtual void setup();
3264 template<
typename MATRIX>
3268 this->clean_up_my_memory();
3271 if (Multi_poisson_mesh_pt == 0)
3273 std::stringstream err;
3274 err <<
"Please set pointer to mesh using set_multi_poisson_mesh(...).\n";
3283 this->set_mesh(0,Multi_poisson_mesh_pt);
3286 unsigned n_dof_types = this->ndof_types();
3290 std::stringstream
tmp;
3291 tmp <<
"This preconditioner only works for problems with 5 dof types\n"
3292 <<
"Yours has " << n_dof_types;
3303 dof_to_block_map[0] = 0;
3304 dof_to_block_map[1] = 1;
3305 dof_to_block_map[2] = 1;
3306 dof_to_block_map[3] = 1;
3307 dof_to_block_map[4] = 1;
3308 this->block_setup(dof_to_block_map);
3311 Replacement_matrix_pt.resize(n_dof_types,n_dof_types,0);
3312 for(
unsigned i=0;
i<n_dof_types;
i++)
3314 for(
unsigned j=0;
j<n_dof_types;
j++)
3320 this->dof_block_distribution_pt(
i);
3323 const unsigned long dof_block_nrow = dof_block_dist_pt->
nrow_local();
3329 const unsigned long dof_block_ncol
3330 = this->dof_block_distribution_pt(
j)->nrow();
3341 replacement_row_start.resize(dof_block_nrow+1,0);
3343 Replacement_matrix_pt(
i,
j)=
3344 new CRDoubleMatrix(dof_block_dist_pt, dof_block_ncol, replacement_value,
3345 replacement_column_index, replacement_row_start);
3348 this->set_replacement_dof_block(
i,
j,Replacement_matrix_pt(
i,
j));
3361 First_subsidiary_preconditioner_pt=block_prec_pt;
3369 unsigned n_sub_dof_types=1;
3377 block_prec_pt->
setup(this->matrix_pt());
3387 Second_subsidiary_preconditioner_pt=block_prec_pt;
3413 const unsigned n_sub_dof_types=2;
3417 doftype_coarsening[0].resize(2);
3420 doftype_coarsening[0][0]=0;
3421 doftype_coarsening[0][1]=1;
3424 doftype_coarsening[1].resize(2);
3427 doftype_coarsening[1][0]=2;
3428 doftype_coarsening[1][1]=3;
3432 turn_into_subsidiary_block_preconditioner(
this,dof_map,
3433 doftype_coarsening);
3438 block_prec_pt->
setup(this->matrix_pt());
3452 unsigned block_column_index=1;
3453 this->setup_matrix_vector_product(
3454 Off_diagonal_matrix_vector_product_pt,&block_matrix, block_column_index);
3467 template<
typename MATRIX>
3476 Second_subsidiary_preconditioner_pt->preconditioner_solve(
r,z);
3481 this->get_block_vector(0,
r,r_0);
3484 this->get_block_vector(1,z,z_1);
3488 Off_diagonal_matrix_vector_product_pt->multiply(z_1,temp);
3498 this->return_block_vector(0,r_0,big_r);
3506 First_subsidiary_preconditioner_pt->preconditioner_solve(big_r,z);
3512 template<
typename MATRIX>
3517 if(First_subsidiary_preconditioner_pt!=0)
3519 delete First_subsidiary_preconditioner_pt;
3520 First_subsidiary_preconditioner_pt = 0;
3522 if(Second_subsidiary_preconditioner_pt!=0)
3524 delete Second_subsidiary_preconditioner_pt;
3525 Second_subsidiary_preconditioner_pt = 0;
3529 for(
unsigned i=0,ni=Replacement_matrix_pt.nrow();
i<ni;
i++)
3531 for(
unsigned j=0,nj=Replacement_matrix_pt.ncol();
j<nj;
j++)
3533 if(Replacement_matrix_pt(
i,
j)!=0)
3535 delete Replacement_matrix_pt(
i,
j);
3536 Replacement_matrix_pt(
i,
j)=0;
3542 if(Off_diagonal_matrix_vector_product_pt!= 0)
3544 delete Off_diagonal_matrix_vector_product_pt;
3545 Off_diagonal_matrix_vector_product_pt = 0;
int i
Definition: BiCGSTAB_step_by_step.cpp:9
m m block(1, 0, 2, 2)<< 4
Definition: block_preconditioner.h:422
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
Definition: matrices.h:888
Definition: multi_poisson_block_preconditioners.h:634
CoarseTwoIntoOne(const CoarseTwoIntoOne &)
Broken copy constructor.
Definition: multi_poisson_block_preconditioners.h:656
Mesh * Multi_poisson_mesh_pt
Definition: multi_poisson_block_preconditioners.h:697
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Definition: multi_poisson_block_preconditioners.h:820
void setup()
Setup the preconditioner.
Definition: multi_poisson_block_preconditioners.h:704
virtual void clean_up_my_memory()
clean up the memory
Definition: multi_poisson_block_preconditioners.h:832
CoarseTwoIntoOne()
Constructor for CoarseTwoIntoOne.
Definition: multi_poisson_block_preconditioners.h:639
void set_multi_poisson_mesh(Mesh *multi_poisson_mesh_pt)
Specify the mesh that contains multi-poisson elements.
Definition: multi_poisson_block_preconditioners.h:685
void operator=(const CoarseTwoIntoOne &)
Broken assignment operator.
Definition: multi_poisson_block_preconditioners.h:662
Preconditioner * Subsidiary_preconditioner_pt
Pointer to the preconditioners/inexact solvers.
Definition: multi_poisson_block_preconditioners.h:693
~CoarseTwoIntoOne()
Destructor - delete the diagonal solvers (subsidiary preconditioners)
Definition: multi_poisson_block_preconditioners.h:647
Definition: multi_poisson_block_preconditioners.h:2808
DenseMatrix< CRDoubleMatrix * > Replacement_matrix_pt
Definition: multi_poisson_block_preconditioners.h:2871
void operator=(const CoarseTwoPlusTwoPlusOne &)
Broken assignment operator.
Definition: multi_poisson_block_preconditioners.h:2841
virtual void clean_up_my_memory()
clean up the memory
Definition: multi_poisson_block_preconditioners.h:3135
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to r, i.e. return z such that P z = r.
Definition: multi_poisson_block_preconditioners.h:3089
Mesh * Multi_poisson_mesh_pt
Definition: multi_poisson_block_preconditioners.h:2878
Preconditioner * First_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:2864
void set_multi_poisson_mesh(Mesh *multi_poisson_mesh_pt)
Specify the mesh that contains multi-poisson elements.
Definition: multi_poisson_block_preconditioners.h:2855
CoarseTwoPlusTwoPlusOne(const CoarseTwoPlusTwoPlusOne &)
Broken copy constructor.
Definition: multi_poisson_block_preconditioners.h:2834
Preconditioner * Second_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:2868
~CoarseTwoPlusTwoPlusOne()
Destructor - delete the diagonal solvers (subsidiary preconditioners)
Definition: multi_poisson_block_preconditioners.h:2824
CoarseTwoPlusTwoPlusOne()
Constructor for CoarseTwoPlusTwoPlusOne.
Definition: multi_poisson_block_preconditioners.h:2813
MatrixVectorProduct * Off_diagonal_matrix_vector_product_pt
Matrix vector product operator.
Definition: multi_poisson_block_preconditioners.h:2874
virtual void setup()
Setup the preconditioner.
Definition: multi_poisson_block_preconditioners.h:2885
Definition: matrices.h:386
Definition: multi_poisson_block_preconditioners.h:53
Diagonal(const Diagonal &)
Broken copy constructor.
Definition: multi_poisson_block_preconditioners.h:75
Diagonal()
Constructor for Diagonal preconditioner.
Definition: multi_poisson_block_preconditioners.h:58
~Diagonal()
Definition: multi_poisson_block_preconditioners.h:66
virtual void clean_up_my_memory()
clean up the memory
Definition: multi_poisson_block_preconditioners.h:210
void setup()
Setup the preconditioner.
Definition: multi_poisson_block_preconditioners.h:120
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to r, i.e. return solution of P z = r.
Definition: multi_poisson_block_preconditioners.h:184
void operator=(const Diagonal &)
Broken assignment operator.
Definition: multi_poisson_block_preconditioners.h:81
Vector< Preconditioner * > Diagonal_block_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:108
void set_multi_poisson_mesh(Mesh *multi_poisson_mesh_pt)
Specify the mesh that contains multi-poisson elements.
Definition: multi_poisson_block_preconditioners.h:99
Mesh * Multi_poisson_mesh_pt
Definition: multi_poisson_block_preconditioners.h:112
LinearAlgebraDistribution * distribution_pt() const
access to the LinearAlgebraDistribution
Definition: linear_algebra_distribution.h:457
Definition: double_vector.h:58
Definition: linear_algebra_distribution.h:64
unsigned nrow_local() const
Definition: linear_algebra_distribution.h:193
Definition: matrix_vector_product.h:51
Definition: multi_poisson_block_preconditioners.h:3187
DenseMatrix< CRDoubleMatrix * > Replacement_matrix_pt
Definition: multi_poisson_block_preconditioners.h:3250
OnePlusFourWithTwoCoarse(const OnePlusFourWithTwoCoarse &)
Broken copy constructor.
Definition: multi_poisson_block_preconditioners.h:3213
Preconditioner * First_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:3243
Mesh * Multi_poisson_mesh_pt
Definition: multi_poisson_block_preconditioners.h:3257
OnePlusFourWithTwoCoarse()
Constructor for OnePlusFourWithTwoCoarse.
Definition: multi_poisson_block_preconditioners.h:3192
void set_multi_poisson_mesh(Mesh *multi_poisson_mesh_pt)
Specify the mesh that contains multi-poisson elements.
Definition: multi_poisson_block_preconditioners.h:3234
Preconditioner * Second_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:3247
virtual void setup()
Setup the preconditioner.
Definition: multi_poisson_block_preconditioners.h:3265
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to r, i.e. return z such that P z = r.
Definition: multi_poisson_block_preconditioners.h:3469
void operator=(const OnePlusFourWithTwoCoarse &)
Broken assignment operator.
Definition: multi_poisson_block_preconditioners.h:3220
~OnePlusFourWithTwoCoarse()
Destructor - delete the diagonal solvers (subsidiary preconditioners)
Definition: multi_poisson_block_preconditioners.h:3203
MatrixVectorProduct * Off_diagonal_matrix_vector_product_pt
Matrix vector product operators for the off diagonal.
Definition: multi_poisson_block_preconditioners.h:3253
virtual void clean_up_my_memory()
clean up the memory
Definition: multi_poisson_block_preconditioners.h:3514
Definition: oomph_definitions.h:222
Definition: preconditioner.h:54
Definition: multi_poisson_block_preconditioners.h:448
virtual void clean_up_my_memory()
clean up the memory
Definition: multi_poisson_block_preconditioners.h:606
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to r, i.e. return solution of P z = r.
Definition: multi_poisson_block_preconditioners.h:588
Mesh * Multi_poisson_mesh_pt
Definition: multi_poisson_block_preconditioners.h:505
~SimpleOneDofOnly()
Destructor - delete the diagonal solvers (subsidiary preconditioners)
Definition: multi_poisson_block_preconditioners.h:461
void operator=(const SimpleOneDofOnly &)
Broken assignment operator.
Definition: multi_poisson_block_preconditioners.h:476
void setup()
Setup the preconditioner.
Definition: multi_poisson_block_preconditioners.h:512
Preconditioner * Subsidiary_preconditioner_pt
Pointer to the preconditioners/inexact solver.
Definition: multi_poisson_block_preconditioners.h:501
SimpleOneDofOnly()
Constructor for SimpleOneDofOnly.
Definition: multi_poisson_block_preconditioners.h:453
void set_multi_poisson_mesh(Mesh *multi_poisson_mesh_pt)
Specify the mesh that contains multi-poisson elements.
Definition: multi_poisson_block_preconditioners.h:493
SimpleOneDofOnly(const SimpleOneDofOnly &)
Broken copy constructor.
Definition: multi_poisson_block_preconditioners.h:470
Definition: multi_poisson_block_preconditioners.h:239
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to r, i.e. return solution of P z = r.
Definition: multi_poisson_block_preconditioners.h:393
virtual void clean_up_my_memory()
Clean up the memory.
Definition: multi_poisson_block_preconditioners.h:419
void setup()
Setup the preconditioner.
Definition: multi_poisson_block_preconditioners.h:303
Vector< Preconditioner * > Diagonal_block_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:291
SimpleTwoDofOnly()
Constructor for SimpleTwoDofOnly.
Definition: multi_poisson_block_preconditioners.h:244
SimpleTwoDofOnly(const SimpleTwoDofOnly &)
Broken copy constructor.
Definition: multi_poisson_block_preconditioners.h:260
Mesh * Multi_poisson_mesh_pt
Definition: multi_poisson_block_preconditioners.h:295
~SimpleTwoDofOnly()
Destructor - clean up memory.
Definition: multi_poisson_block_preconditioners.h:251
void set_multi_poisson_mesh(Mesh *multi_poisson_mesh_pt)
Specify the mesh that contains multi-poisson elements.
Definition: multi_poisson_block_preconditioners.h:282
void operator=(const SimpleTwoDofOnly &)
Broken assignment operator.
Definition: multi_poisson_block_preconditioners.h:266
An interface to allow SuperLU to be used as an (exact) Preconditioner.
Definition: SuperLU_preconditioner.h:40
Definition: multi_poisson_block_preconditioners.h:1829
void operator=(const TwoPlusOneUpperTriangularPreconditioner &)
Broken assignment operator.
Definition: multi_poisson_block_preconditioners.h:1862
MatrixVectorProduct * Off_diagonal_matrix_vector_product_pt
Matrix vector product operators for the off diagonals.
Definition: multi_poisson_block_preconditioners.h:1894
Preconditioner * First_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:1887
TwoPlusOneUpperTriangularPreconditioner(const TwoPlusOneUpperTriangularPreconditioner &)
Broken copy constructor.
Definition: multi_poisson_block_preconditioners.h:1856
~TwoPlusOneUpperTriangularPreconditioner()
Destructor - delete the diagonal solvers (subsidiary preconditioners)
Definition: multi_poisson_block_preconditioners.h:1845
Mesh * Multi_poisson_mesh_pt
Definition: multi_poisson_block_preconditioners.h:1898
Preconditioner * Second_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:1891
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to r, i.e. return z such that P z = r.
Definition: multi_poisson_block_preconditioners.h:2032
virtual void clean_up_my_memory()
Cleanup function.
Definition: multi_poisson_block_preconditioners.h:2078
void setup()
Setup the preconditioner.
Definition: multi_poisson_block_preconditioners.h:1906
TwoPlusOneUpperTriangularPreconditioner()
Constructor for TwoPlusOneUpperTriangularPreconditioner.
Definition: multi_poisson_block_preconditioners.h:1834
void set_multi_poisson_mesh(Mesh *multi_poisson_mesh_pt)
Specify the mesh that contains multi-poisson elements.
Definition: multi_poisson_block_preconditioners.h:1878
Definition: multi_poisson_block_preconditioners.h:1534
TwoPlusThreeUpperTriangularWithOneLevelSubsidiary()
Constructor.
Definition: multi_poisson_block_preconditioners.h:1539
void operator=(const TwoPlusThreeUpperTriangularWithOneLevelSubsidiary &)
Broken assignment operator.
Definition: multi_poisson_block_preconditioners.h:1566
void set_multi_poisson_mesh(Mesh *multi_poisson_mesh_pt)
Specify the mesh that contains multi-poisson elements.
Definition: multi_poisson_block_preconditioners.h:1584
Preconditioner * Second_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:1600
void clean_up_my_memory()
Clean up the memory.
Definition: multi_poisson_block_preconditioners.h:1792
MatrixVectorProduct * Off_diagonal_matrix_vector_product_pt
Pointer to matrix vector product operators for the off diagonal block.
Definition: multi_poisson_block_preconditioners.h:1592
TwoPlusThreeUpperTriangularWithOneLevelSubsidiary(const TwoPlusThreeUpperTriangularWithOneLevelSubsidiary &)
Broken copy constructor.
Definition: multi_poisson_block_preconditioners.h:1559
Preconditioner * First_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:1596
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to r.
Definition: multi_poisson_block_preconditioners.h:1735
Mesh * Multi_poisson_mesh_pt
Definition: multi_poisson_block_preconditioners.h:1604
void setup()
Setup the preconditioner.
Definition: multi_poisson_block_preconditioners.h:1612
virtual ~TwoPlusThreeUpperTriangularWithOneLevelSubsidiary()
Destructor - delete the preconditioner matrices.
Definition: multi_poisson_block_preconditioners.h:1549
Definition: multi_poisson_block_preconditioners.h:2416
DenseMatrix< CRDoubleMatrix * > Replacement_matrix_pt
Definition: multi_poisson_block_preconditioners.h:2482
void setup()
Setup the preconditioner.
Definition: multi_poisson_block_preconditioners.h:2495
virtual void clean_up_my_memory()
Clean up the memory.
Definition: multi_poisson_block_preconditioners.h:2759
void operator=(const TwoPlusThreeUpperTriangularWithReplace &)
Broken assignment operator.
Definition: multi_poisson_block_preconditioners.h:2449
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to r, i.e. return z such that P z = r.
Definition: multi_poisson_block_preconditioners.h:2713
TwoPlusThreeUpperTriangularWithReplace(const TwoPlusThreeUpperTriangularWithReplace &)
Broken copy constructor.
Definition: multi_poisson_block_preconditioners.h:2442
TwoPlusThreeUpperTriangularWithReplace()
Constructor for TwoPlusThreeUpperTriangularWithReplace.
Definition: multi_poisson_block_preconditioners.h:2421
Preconditioner * Second_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:2475
void set_multi_poisson_mesh(Mesh *multi_poisson_mesh_pt)
Specify the mesh that contains multi-poisson elements.
Definition: multi_poisson_block_preconditioners.h:2462
~TwoPlusThreeUpperTriangularWithReplace()
Destructor clean up memory.
Definition: multi_poisson_block_preconditioners.h:2432
Mesh * Multi_poisson_mesh_pt
Definition: multi_poisson_block_preconditioners.h:2486
MatrixVectorProduct * Off_diagonal_matrix_vector_product_pt
Definition: multi_poisson_block_preconditioners.h:2479
Preconditioner * First_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:2471
Definition: multi_poisson_block_preconditioners.h:2110
virtual ~TwoPlusThreeUpperTriangularWithTwoLevelSubsidiary()
Destructor - delete the preconditioner matrices.
Definition: multi_poisson_block_preconditioners.h:2125
virtual void clean_up_my_memory()
clean up the memory
Definition: multi_poisson_block_preconditioners.h:2375
Mesh * Multi_poisson_mesh_pt
Definition: multi_poisson_block_preconditioners.h:2180
void operator=(const TwoPlusThreeUpperTriangularWithTwoLevelSubsidiary &)
Broken assignment operator.
Definition: multi_poisson_block_preconditioners.h:2142
TwoPlusThreeUpperTriangularWithTwoLevelSubsidiary(const TwoPlusThreeUpperTriangularWithTwoLevelSubsidiary &)
Broken copy constructor.
Definition: multi_poisson_block_preconditioners.h:2135
TwoPlusThreeUpperTriangularWithTwoLevelSubsidiary()
Constructor.
Definition: multi_poisson_block_preconditioners.h:2115
void set_multi_poisson_mesh(Mesh *multi_poisson_mesh_pt)
Specify the mesh that contains multi-poisson elements.
Definition: multi_poisson_block_preconditioners.h:2160
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to r.
Definition: multi_poisson_block_preconditioners.h:2323
Preconditioner * First_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:2172
MatrixVectorProduct * Off_diagonal_matrix_vector_product_pt
Pointer to matrix vector product operator.
Definition: multi_poisson_block_preconditioners.h:2168
void setup()
Setup the preconditioner.
Definition: multi_poisson_block_preconditioners.h:2188
Preconditioner * Second_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:2176
Definition: multi_poisson_block_preconditioners.h:1290
void operator=(const TwoPlusThreeUpperTriangular &)
Broken assignment operator.
Definition: multi_poisson_block_preconditioners.h:1320
MatrixVectorProduct * Off_diagonal_matrix_vector_product_pt
Pointer to matrix vector product operator for the single off diagonals.
Definition: multi_poisson_block_preconditioners.h:1344
TwoPlusThreeUpperTriangular(const TwoPlusThreeUpperTriangular &)
Broken copy constructor.
Definition: multi_poisson_block_preconditioners.h:1314
Preconditioner * First_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:1348
virtual ~TwoPlusThreeUpperTriangular()
Destructor - delete the preconditioner matrices.
Definition: multi_poisson_block_preconditioners.h:1305
Mesh * Multi_poisson_mesh_pt
Definition: multi_poisson_block_preconditioners.h:1356
TwoPlusThreeUpperTriangular()
Constructor.
Definition: multi_poisson_block_preconditioners.h:1295
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to r.
Definition: multi_poisson_block_preconditioners.h:1463
virtual void clean_up_my_memory()
clean up the memory
Definition: multi_poisson_block_preconditioners.h:1498
void setup()
Setup the preconditioner.
Definition: multi_poisson_block_preconditioners.h:1364
Preconditioner * Second_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:1352
void set_multi_poisson_mesh(Mesh *multi_poisson_mesh_pt)
Specify the mesh that contains multi-poisson elements.
Definition: multi_poisson_block_preconditioners.h:1336
Definition: multi_poisson_block_preconditioners.h:1086
virtual void setup()
Setup the preconditioner.
Definition: multi_poisson_block_preconditioners.h:1149
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to r, i.e. return z such that P z = r.
Definition: multi_poisson_block_preconditioners.h:1234
Preconditioner * Second_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:1138
~TwoPlusThree()
Destructor - delete the diagonal solvers (subsidiary preconditioners)
Definition: multi_poisson_block_preconditioners.h:1098
void operator=(const TwoPlusThree &)
Broken assignment operator.
Definition: multi_poisson_block_preconditioners.h:1113
Mesh * Multi_poisson_mesh_pt
Definition: multi_poisson_block_preconditioners.h:1142
Preconditioner * First_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:1134
void set_multi_poisson_mesh(Mesh *multi_poisson_mesh_pt)
Specify the mesh that contains multi-poisson elements.
Definition: multi_poisson_block_preconditioners.h:1125
TwoPlusThree(const TwoPlusThree &)
Broken copy constructor.
Definition: multi_poisson_block_preconditioners.h:1107
virtual void clean_up_my_memory()
clean up the memory
Definition: multi_poisson_block_preconditioners.h:1263
TwoPlusThree()
Constructor for TwoPlusThree.
Definition: multi_poisson_block_preconditioners.h:1090
Definition: multi_poisson_block_preconditioners.h:854
Vector< Preconditioner * > Block_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:908
void operator=(const UpperTriangular &)
Broken assignment operator.
Definition: multi_poisson_block_preconditioners.h:880
void setup()
Setup the preconditioner.
Definition: multi_poisson_block_preconditioners.h:920
UpperTriangular(const UpperTriangular &)
Broken copy constructor.
Definition: multi_poisson_block_preconditioners.h:874
virtual void clean_up_my_memory()
clean up the memory
Definition: multi_poisson_block_preconditioners.h:1048
void set_multi_poisson_mesh(Mesh *multi_poisson_mesh_pt)
Specify the mesh that contains multi-poisson elements.
Definition: multi_poisson_block_preconditioners.h:896
Mesh * Multi_poisson_mesh_pt
Definition: multi_poisson_block_preconditioners.h:912
virtual ~UpperTriangular()
Destructor - delete the preconditioner matrices.
Definition: multi_poisson_block_preconditioners.h:865
DenseMatrix< MatrixVectorProduct * > Off_diagonal_matrix_vector_product_pt
Pointers to matrix vector product operators for the off diagonals.
Definition: multi_poisson_block_preconditioners.h:904
UpperTriangular()
Constructor.
Definition: multi_poisson_block_preconditioners.h:859
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to r.
Definition: multi_poisson_block_preconditioners.h:1009
Definition: oomph-lib/src/generic/Vector.h:58
Scalar * y
Definition: level1_cplx_impl.h:128
char char char int int * k
Definition: level2_impl.h:374
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
void broken_assign(const std::string &class_name)
Issue error message and terminate execution.
Definition: oomph_utilities.cc:195
void broken_copy(const std::string &class_name)
Issue error message and terminate execution.
Definition: oomph_utilities.cc:212
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