Hallo,
I am confused about selecting solvers in chorin's projection method. As the matrix obtained in first step(velocity) is not positive definite so i am thinking about using gmres but i have no idea for implementing preconditioner in this case.
chorin's method is in attachment.
This is how i am implementing in code:-
void Navierstokes<dim>::solve ()
{
std::cout<< " Solving...."<<std::endl;
std::cout<<" Assembling Velocity matrix...."<<std::endl;
assemble_velocity ();
int vel_max_its = 1000;
double vel_eps = 1e-8;
int vel_Krylov_size = 30;
{
SolverControl solver_control (vel_max_its, vel_eps*velocity_rhs.l2_norm());
SolverGMRES<Vector<double>> gmres (solver_control,
SolverGMRES<>::AdditionalData (vel_Krylov_size));
gmres.solve (velocity_matrix, velocity_solution, velocity_rhs, preconditioner_velocity);
}
std::cout<<" Assembling pressure matrix and rhs...."<<std::endl;
assemble_pressure ();
assemble_pressure_rhs ();
{
SolverControl solver_control (pressure_matrix.m(),
1e-6*pressure_rhs.l2_norm());
SolverControl solver_control (1000, 1e-12);
SolverCG<> solver (solver_control);
solver.solve (pressure_matrix, pressure_solution, pressure_rhs,
PreconditionIdentity());
std::cout << " " << solver_control.last_step()
<< " CG iterations needed to obtain convergence."
<< std::endl;
}
std::cout<<" Assembling update velocity matrix...."<<std::endl;
assemble_update ();
assemble_update_rhs ();
{
SolverControl solver_control (vel_max_its, vel_eps*velocity_rhs.l2_norm());
SolverGMRES<Vector<double>> solver (solver_control);
solver.solve (update_matrix, update_velocity_solution, update_velocity_rhs, PreconditionIdentity());
}
}
Thanks,
Pankaj