43 template<
typename MATRIX>
47 this->clean_up_memory();
54 if (this->is_master_block_preconditioner())
57 if( this->gp_nmesh() == 0)
59 std::ostringstream err_msg;
60 err_msg <<
"There are no meshes set.\n" 61 <<
"Did you remember to call add_mesh(...)?";
63 OOMPH_CURRENT_FUNCTION,
64 OOMPH_EXCEPTION_LOCATION);
69 this->gp_preconditioner_set_all_meshes();
73 this->gp_preconditioner_block_setup();
76 unsigned nblock_types = this->nblock_types();
79 this->fill_in_subsidiary_preconditioners(nblock_types);
84 if(Use_two_level_parallelisation)
90 for(
unsigned i=0;
i<nblock_types;
i++)
93 this->get_block(
i, get_other_diag_ds(
i, nblock_types),
94 *block_diagonal_matrix_pt[
i]);
100 Preconditioner_array_pt->
101 setup_preconditioners(block_diagonal_matrix_pt,
102 this->Subsidiary_preconditioner_pt,
106 for(
unsigned i=0;
i<nblock_types;
i++)
108 delete block_diagonal_matrix_pt[
i];
109 block_diagonal_matrix_pt[
i] = 0;
114 this->Subsidiary_preconditioner_pt.clear();
121 for(
unsigned i=0;
i<nblock_types;
i++)
124 unsigned j = get_other_diag_ds(
i, nblock_types);
129 this->Subsidiary_preconditioner_pt[
i]->setup(&block);
131 oomph_info <<
"Took " << superlusetup_end - superlusetup_start
132 <<
"s to setup."<< std::endl;
141 template<
typename MATRIX>
146 unsigned n_block = this->nblock_types();
150 this->get_block_vectors(r, block_r);
153 if (!z.
built()) { z.
build(this->distribution_pt(),0.0); }
158 if (Use_two_level_parallelisation)
160 Preconditioner_array_pt->solve_preconditioners(block_r, block_z);
165 for (
unsigned i = 0;
i < n_block;
i++)
168 if (Doc_time_during_preconditioner_solve)
172 this->Subsidiary_preconditioner_pt[
i]->preconditioner_solve(block_r[
i],
174 if (Doc_time_during_preconditioner_solve)
177 <<
"-th block preconditioner: " 185 this->return_block_vectors(block_z,z);
192 template<
typename MATRIX>
197 this->clean_up_memory();
200 if (this->is_master_block_preconditioner())
203 if( this->gp_nmesh() == 0)
205 std::ostringstream err_msg;
206 err_msg <<
"There are no meshes set.\n" 207 <<
"Did you remember to call add_mesh(...)?";
209 OOMPH_CURRENT_FUNCTION,
210 OOMPH_EXCEPTION_LOCATION);
215 this->gp_preconditioner_set_all_meshes();
219 this->gp_preconditioner_block_setup();
222 unsigned nblock_types = this->nblock_types();
225 Off_diagonal_matrix_vector_products.resize(nblock_types,nblock_types,0);
228 this->fill_in_subsidiary_preconditioners(nblock_types);
231 for(
unsigned i = 0;
i < nblock_types;
i++)
236 this->Subsidiary_preconditioner_pt[
i]
237 ->setup(&block_matrix);
253 for(
unsigned j = l; j < u; j++)
262 this->setup_matrix_vector_product(
263 Off_diagonal_matrix_vector_products(
i,j),
276 unsigned n_block = this->nblock_types();
279 int start, end, step;
297 this->get_block_vectors(r,block_r);
303 for (
int i = start;
i != end;
i+=step)
307 (this->Subsidiary_preconditioner_pt[
i]) == 0)
310 this->Subsidiary_preconditioner_pt[
i]->
311 preconditioner_solve(block_r[i], block_z[i]);
324 this->return_block_vectors(block_r, r_updated);
327 this->Subsidiary_preconditioner_pt[
i]->
328 preconditioner_solve(r_updated, block_z_with_size_of_full_z);
332 this->get_block_vector(i, block_z_with_size_of_full_z, block_z[i]);
336 for (
int j = i + step; j !=end; j+=step)
339 Off_diagonal_matrix_vector_products(j,i)->multiply(block_z[i],temp);
345 this->return_block_vectors(block_z,z);
354 template<
typename MATRIX>
361 if(this->is_master_block_preconditioner())
364 if( this->gp_nmesh() == 0)
366 std::ostringstream err_msg;
367 err_msg <<
"There are no meshes set.\n" 368 <<
"Did you remember to call add_mesh(...)?";
370 OOMPH_CURRENT_FUNCTION,
371 OOMPH_EXCEPTION_LOCATION);
376 this->gp_preconditioner_set_all_meshes();
380 this->gp_preconditioner_block_setup();
383 unsigned nblock_types = this->nblock_types();
389 const bool want_block =
true;
390 for (
unsigned b_i = 0; b_i < nblock_types; b_i++)
392 for (
unsigned b_j = 0; b_j < nblock_types; b_j++)
394 required_blocks[b_i][b_j].select_block(b_i,b_j,want_block);
400 = this->get_concatenated_block(required_blocks);
403 this->fill_in_subsidiary_preconditioners(1);
404 preconditioner_pt()->setup(&exact_block_matrix);
410 template<
typename MATRIX>
416 this->get_block_ordered_preconditioner_vector(r,block_order_r);
422 preconditioner_pt()->preconditioner_solve(block_order_r,block_order_z);
425 this->return_block_ordered_preconditioner_vector(block_order_z,z);
void setup()
Setup the preconditioner.
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to r.
PreconditionerArray - NOTE - first implementation, a number of assumptions / simplifications were mad...
Block "anti-diagonal" preconditioner, i.e. same as block diagonal but along the other diagonal of the...
void build(const DoubleVector &old_vector)
Just copys the argument DoubleVector.
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to r.
void start(const unsigned &i)
(Re-)start i-th timer
double timer()
returns the time in seconds after some point in past
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to r.
void setup()
Setup the preconditioner.
Block diagonal preconditioner. By default SuperLU is used to solve the subsidiary systems...
Matrix vector product helper class - primarily a wrapper to Trilinos's Epetra matrix vector product m...
A vector in the mathematical sense, initially developed for linear algebra type applications. If MPI then this vector can be distributed - its distribution is described by the LinearAlgebraDistribution object at Distribution_pt. Data is stored in a C-style pointer vector (double*)
General purpose block triangular preconditioner By default this is Upper triangular. By default SuperLUPreconditioner (or SuperLUDistPreconditioner) is used to solve the subsidiary systems, but other preconditioners can be used by setting them using passing a pointer to a function of type SubsidiaryPreconditionerFctPt to the method subsidiary_preconditioner_function_pt().
A class for compressed row matrices. This is a distributable object.
LinearAlgebraDistribution * distribution_pt() const
access to the LinearAlgebraDistribution
virtual void setup()
Setup the preconditioner.