16 #ifndef dealii__schur_complement_h 17 #define dealii__schur_complement_h 19 #include <deal.II/base/config.h> 20 #include <deal.II/base/exceptions.h> 21 #include <deal.II/lac/vector_memory.h> 22 #include <deal.II/lac/linear_operator.h> 23 #include <deal.II/lac/packaged_operation.h> 25 #ifdef DEAL_II_WITH_CXX11 27 DEAL_II_NAMESPACE_OPEN
226 template <
typename Range_1,
typename Domain_1,
227 typename Range_2,
typename Domain_2>
242 return_op.
vmult_add = [A_inv,B,C,D](Range_2 &dst_g,
const Domain_2 &src_y)
248 Range_1 &tmp_f = *(vector_memory_f.
alloc());
249 Range_2 &tmp_g = *(vector_memory_g.
alloc());
250 Domain_1 &tmp_x = *(vector_memory_x.
alloc());
253 B.reinit_range_vector(tmp_f,
true);
255 C.reinit_range_vector(tmp_g,
true);
261 B.vmult (tmp_f, src_y);
264 A_inv.
vmult (tmp_x, tmp_f);
269 ExcMessage(
"No convergence in A_inv vmult operation"));
271 C.vmult (tmp_g, tmp_x);
274 vector_memory_x.
free(&tmp_x);
275 vector_memory_g.
free(&tmp_g);
276 vector_memory_f.
free(&tmp_f);
279 const auto vmult_add = return_op.
vmult_add;
280 return_op.
vmult = [vmult_add](Range_2 &dst_g,
const Domain_2 &src_y)
283 vmult_add(dst_g, src_y);
286 return_op.
Tvmult_add = [A_inv,B,C,D](Domain_2 &dst_g,
const Range_2 &src_y)
292 Domain_1 &tmp_f = *(vector_memory_f.
alloc());
293 Domain_2 &tmp_g = *(vector_memory_g.
alloc());
294 Range_1 &tmp_x = *(vector_memory_x.
alloc());
297 C.reinit_domain_vector(tmp_f,
true);
299 B.reinit_domain_vector(tmp_g,
true);
305 C.Tvmult (tmp_f, src_y);
308 A_inv.
Tvmult (tmp_x, tmp_f);
313 ExcMessage(
"No convergence in A_inv Tvmult operation"));
315 B.Tvmult (tmp_g, tmp_x);
318 vector_memory_x.
free(&tmp_x);
319 vector_memory_g.
free(&tmp_g);
320 vector_memory_f.
free(&tmp_f);
324 return_op.
Tvmult = [Tvmult_add](Domain_2 &dst_g,
const Range_2 &src_y)
327 Tvmult_add(dst_g, src_y);
363 template <
typename Range_1,
typename Domain_1,
378 return_comp.
apply_add = [A_inv,C,f,g](Range_2 &g_star)
384 Range_1 &tmp_f1 = *(vector_memory_f.
alloc());
385 Range_2 &tmp_g1 = *(vector_memory_g.
alloc());
386 Range_2 &tmp_g2 = *(vector_memory_g.
alloc());
390 C.reinit_range_vector(tmp_g1,
true);
396 A_inv.
vmult(tmp_f1, f);
401 ExcMessage(
"No convergence in A_inv vmult operation"));
403 C.vmult(tmp_g1, tmp_f1);
408 vector_memory_g.
free(&tmp_g2);
409 vector_memory_g.
free(&tmp_g1);
410 vector_memory_f.
free(&tmp_f1);
413 const auto apply_add = return_comp.
apply_add;
414 return_comp.
apply = [apply_add](Range_2 &g_star)
444 template <
typename Range_1,
typename Domain_1,
459 return_comp.
apply_add = [A_inv,B,y,f](Domain_1 &x)
463 Range_1 &tmp_f1 = *(vector_memory_f.
alloc());
464 Range_1 &tmp_f2 = *(vector_memory_f.
alloc());
467 B.reinit_range_vector(tmp_f1,
true);
481 ExcMessage(
"No convergence in A_inv vmult operation"));
484 vector_memory_f.
free(&tmp_f2);
485 vector_memory_f.
free(&tmp_f1);
488 const auto apply_add = return_comp.
apply_add;
489 return_comp.
apply = [apply_add](Domain_1 &x)
500 DEAL_II_NAMESPACE_CLOSE
502 #endif // DEAL_II_WITH_CXX11 PackagedOperation< Domain_1 > postprocess_schur_solution(const LinearOperator< Range_1, Domain_1 > &A_inv, const LinearOperator< Range_1, Domain_2 > &B, const Domain_2 &y, const Range_1 &f)
std::function< void(Range &v)> apply
std::function< void(Range &v, bool omit_zeroing_entries)> reinit_vector
::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
std::function< void(Range &v, bool omit_zeroing_entries)> reinit_range_vector
std::function< void(Domain &v, const Range &u)> Tvmult_add
virtual VectorType * alloc()
LinearOperator< Range_2, Domain_2 > schur_complement(const LinearOperator< Domain_1, Range_1 > &A_inv, const LinearOperator< Range_1, Domain_2 > &B, const LinearOperator< Range_2, Domain_1 > &C, const LinearOperator< Range_2, Domain_2 > &D)
virtual void free(const VectorType *const)
std::function< void(Domain &v, bool omit_zeroing_entries)> reinit_domain_vector
std::function< void(Range &v)> apply_add
std::function< void(Range &v, const Domain &u)> vmult
std::function< void(Range &v, const Domain &u)> vmult_add
std::function< void(Domain &v, const Range &u)> Tvmult
PackagedOperation< Range_2 > condense_schur_rhs(const LinearOperator< Range_1, Domain_1 > &A_inv, const LinearOperator< Range_2, Domain_1 > &C, const Range_1 &f, const Range_2 &g)