@@ -3058,11 +3058,15 @@ namespace Step32
30583058 SolverCG<TrilinosWrappers::MPI::Vector> solver_CG (solver_control_pre);
30593059
30603060 TimerOutput timer (pcout, TimerOutput::summary, TimerOutput::wall_times);
3061+
3062+ // Before we solve the system, we assess the overhead introduced by the LinearOperator
3063+ // Check how much it should cost to multiply 100 times with the preconditioner
30613064 timer.enter_subsection (" raw" );
30623065 for (unsigned int i=0 ; i< 100 ; ++i)
30633066 preconditioner.vmult (distributed_stokes_solution, stokes_rhs);
30643067 timer.leave_subsection ();
30653068
3069+ // Now check with an optimized version of the same preconditioner
30663070 timer.enter_subsection (" raw opt" );
30673071 for (unsigned int i=0 ; i< 100 ; ++i)
30683072 preconditioner_opt.vmult (distributed_stokes_solution, stokes_rhs);
@@ -3076,12 +3080,9 @@ namespace Step32
30763080 auto ZeroP = linear_operator< TrilinosWrappers::MPI::Vector >( stokes_matrix.block (1 ,1 ) );
30773081
30783082 auto Mp = linear_operator< TrilinosWrappers::MPI::Vector >( stokes_preconditioner_matrix.block (1 ,1 ) );
3079- // auto Amg = linear_operator< TrilinosWrappers::MPI::Vector >( stokes_preconditioner_matrix.block(0,0) );
3080-
3081-
30823083
30833084 auto Schur_inv = inverse_operator ( Mp, solver_CG, *Mp_preconditioner);
3084- // auto A_inv = inverse_operator( A, solver_CG, *Amg_preconditioner);
3085+
30853086 auto Amg = linear_operator< TrilinosWrappers::MPI::Vector >( stokes_preconditioner_matrix.block (0 ,0 ),*Amg_preconditioner );
30863087 auto P00 = Amg;
30873088 auto P01 = Amg * Bt * Schur_inv;
@@ -3096,46 +3097,46 @@ namespace Step32
30963097 }
30973098 } );
30983099
3099- const auto DiagInv = block_diagonal_operator<2 , TrilinosWrappers::MPI::BlockVector >({ Amg, -1 *Schur_inv });
3100+ const auto DiagInv = block_diagonal_operator<2 , TrilinosWrappers::MPI::BlockVector >({{ Amg, -1 *Schur_inv } });
31003101
31013102 const auto P_inv = block_back_substitution<TrilinosWrappers::MPI::BlockVector>(Mat, DiagInv);
31023103
3104+ // And here check the LinearOperator version
31033105 timer.enter_subsection (" LO" );
31043106 for (unsigned int i=0 ; i< 100 ; ++i)
31053107 P_inv.vmult (distributed_stokes_solution, stokes_rhs);
31063108 timer.leave_subsection ();
3107- // exit(0);
3108- //
3109- // SolverFGMRES<TrilinosWrappers::MPI::BlockVector>
3110- // solver(solver_control, mem,
3111- // SolverFGMRES<TrilinosWrappers::MPI::BlockVector>::
3112- // AdditionalData(30, true));
3113- // solver.solve(stokes_matrix, distributed_stokes_solution, stokes_rhs,
3114- // preconditioner);
3115- //
3116- // n_iterations = solver_control.last_step();
3117- // }
3118-
3119- // catch (SolverControl::NoConvergence)
3120- // {
3121- // const LinearSolvers::BlockSchurPreconditioner<TrilinosWrappers::PreconditionAMG,
3122- // TrilinosWrappers::PreconditionJacobi>
3123- // preconditioner (stokes_matrix, stokes_preconditioner_matrix,
3124- // *Mp_preconditioner, *Amg_preconditioner,
3125- // true);
3126- //
3127- // SolverControl solver_control_refined (stokes_matrix.m(), solver_tolerance);
3128- // SolverFGMRES<TrilinosWrappers::MPI::BlockVector>
3129- // solver(solver_control_refined, mem,
3130- // SolverFGMRES<TrilinosWrappers::MPI::BlockVector>::
3131- // AdditionalData(50, true));
3132- // solver.solve(stokes_matrix, distributed_stokes_solution, stokes_rhs,
3133- // preconditioner);
3134- //
3135- // n_iterations = (solver_control.last_step() +
3136- // solver_control_refined.last_step());
3137- // }
31383109
3110+ try
3111+ {
3112+ SolverFGMRES<TrilinosWrappers::MPI::BlockVector>
3113+ solver (solver_control, mem,
3114+ SolverFGMRES<TrilinosWrappers::MPI::BlockVector>::
3115+ AdditionalData (30 , true ));
3116+ solver.solve (stokes_matrix, distributed_stokes_solution, stokes_rhs,
3117+ P_inv);
3118+
3119+ n_iterations = solver_control.last_step ();
3120+ }
3121+ catch (SolverControl::NoConvergence)
3122+ {
3123+ const LinearSolvers::BlockSchurPreconditioner<TrilinosWrappers::PreconditionAMG,
3124+ TrilinosWrappers::PreconditionJacobi>
3125+ preconditioner (stokes_matrix, stokes_preconditioner_matrix,
3126+ *Mp_preconditioner, *Amg_preconditioner,
3127+ true );
3128+
3129+ SolverControl solver_control_refined (stokes_matrix.m (), solver_tolerance);
3130+ SolverFGMRES<TrilinosWrappers::MPI::BlockVector>
3131+ solver (solver_control_refined, mem,
3132+ SolverFGMRES<TrilinosWrappers::MPI::BlockVector>::
3133+ AdditionalData (50 , true ));
3134+ solver.solve (stokes_matrix, distributed_stokes_solution, stokes_rhs,
3135+ P_inv);
3136+
3137+ n_iterations = (solver_control.last_step () +
3138+ solver_control_refined.last_step ());
3139+ }
31393140
31403141 stokes_constraints.distribute (distributed_stokes_solution);
31413142
0 commit comments