@@ -386,6 +386,13 @@ namespace aspect
386
386
virtual unsigned int n_iterations () const =0;
387
387
388
388
};
389
+
390
+
391
+ /* *
392
+ * Given a diagonal matrix stored as a vector,
393
+ * create an operator that represents its action.
394
+ */
395
+
389
396
template <typename Range,
390
397
typename Domain,
391
398
typename Payload>
@@ -402,10 +409,11 @@ namespace aspect
402
409
dest = src;
403
410
dest.scale (diagonal);
404
411
};
405
- // std::cout << "ok" << std::endl;
406
412
return return_op;
407
413
}
408
414
415
+
416
+
409
417
/* *
410
418
* This class approximates the Schur Complement inverse operator
411
419
* by S^{-1} = (BC^{-1}B^T)^{-1}(BC^{-1}AD^{-1}B^T)(BD^{-1}B^T)^{-1},
@@ -483,11 +491,11 @@ namespace aspect
483
491
SolverControl solver_control (5000 , 1e-6 * src.l2_norm (), false , true );
484
492
SolverCG<TrilinosWrappers::MPI::Vector> solver (solver_control);
485
493
// Solve with Schur Complement approximation
486
- auto Op_A= LinearOperator<TrilinosWrappers::MPI::Vector>(system_matrix.block (0 ,0 ));
487
- auto Op_BT = LinearOperator<TrilinosWrappers::MPI::Vector>(system_matrix.block (0 ,1 ));
488
- auto Op_B = LinearOperator<TrilinosWrappers::MPI::Vector>(system_matrix.block (1 ,0 ));
489
- auto Op_C = diag_operator (Op_A,inverse_lumped_mass_matrix);
490
- auto matrix = Op_B*Op_C *Op_BT;
494
+ const auto Op_A = LinearOperator<TrilinosWrappers::MPI::Vector>(system_matrix.block (0 ,0 ));
495
+ const auto Op_BT = LinearOperator<TrilinosWrappers::MPI::Vector>(system_matrix.block (0 ,1 ));
496
+ const auto Op_B = LinearOperator<TrilinosWrappers::MPI::Vector>(system_matrix.block (1 ,0 ));
497
+ const auto Op_C_inv = diag_operator (Op_A,inverse_lumped_mass_matrix);
498
+ const auto BC_invBT = Op_B*Op_C_inv *Op_BT;
491
499
492
500
493
501
@@ -504,7 +512,7 @@ namespace aspect
504
512
system_matrix.block (1 ,0 ).vmult (ptmp,wtmp);
505
513
506
514
dst=0 ;
507
- solver.solve (matrix ,
515
+ solver.solve (BC_invBT ,
508
516
dst,
509
517
ptmp,
510
518
mp_preconditioner);
0 commit comments