From 914d6ba0e7eb27803572b0e8b6665ff6b4bdd500 Mon Sep 17 00:00:00 2001 From: Pietro Incardona <incardon@mpi-cbg.de> Date: Sat, 17 Jun 2017 16:17:49 +0200 Subject: [PATCH] Testing solvers CG --- example/Numerics/Vortex_in_cell/CG.hpp | 6 ++- .../Vortex_in_cell/main_vic_petsc.cpp | 49 ++++++++++++++----- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/example/Numerics/Vortex_in_cell/CG.hpp b/example/Numerics/Vortex_in_cell/CG.hpp index 98eedd529..3868718b6 100644 --- a/example/Numerics/Vortex_in_cell/CG.hpp +++ b/example/Numerics/Vortex_in_cell/CG.hpp @@ -145,6 +145,8 @@ void CG(void (* A)(grid_type_scal & in, grid_type_scal & out), grid_type_scal & A(x,Ap); x_plus_alpha_p(r,Ap,-1); + std::cout << "It init: " << " " << sqrt(norm(r)) << std::endl; + // r0 = p0 copy(r,p); @@ -157,9 +159,9 @@ void CG(void (* A)(grid_type_scal & in, grid_type_scal & out), grid_type_scal & float r_norm = norm(rn); - std::cout << "It: " << i << " " << r_norm << std::endl; + std::cout << "It: " << i << " " << sqrt(r_norm) << std::endl; - if (r_norm < 0.1) + if (sqrt(r_norm) < 0.1) return; float beta_c = beta(r,rn); diff --git a/example/Numerics/Vortex_in_cell/main_vic_petsc.cpp b/example/Numerics/Vortex_in_cell/main_vic_petsc.cpp index 0179103a0..9978ef3e2 100644 --- a/example/Numerics/Vortex_in_cell/main_vic_petsc.cpp +++ b/example/Numerics/Vortex_in_cell/main_vic_petsc.cpp @@ -133,6 +133,10 @@ float nu = 0.0001535; float dt = 0.006; +#ifdef SE_CLASS1 +DIOCANE +#endif + // All the properties by index constexpr unsigned int vorticity = 0; constexpr unsigned int velocity = 0; @@ -516,14 +520,21 @@ void helmotz_hodge_projection(grid_type & gr, const Box<3,float> & domain) solver.setSolver(KSPCG); // Set the absolute tolerance to determine that the method is converged - solver.setAbsTol(0.001); + solver.setAbsTol(0.1); // Set the maximum number of iterations solver.setMaxIter(500); + solver.log_monitor(); + + timer tm_solve; + tm_solve.start(); + // Give to the solver A and b, return x, the solution auto x_ = solver.solve(fd.getA(),fd.getB()); + tm_solve.stop(); + //////////////// CG Call ////////////////////////// // Here we create a distributed grid to store the result of the helmotz projection @@ -540,8 +551,16 @@ void helmotz_hodge_projection(grid_type & gr, const Box<3,float> & domain) ++zit; } + timer tm_solve2; + + tm_solve2.start(); + CG(OpA,sol,psi); + tm_solve2.stop(); + + std::cout << "Time to solve: " << tm_solve2.getwct() << " " << tm_solve.getwct() << std::endl; + /////////////////////////////////////////////////// // copy the solution x to the grid psi @@ -753,11 +772,16 @@ void comp_vel(Box<3,float> & domain, grid_type & g_vort,grid_type & g_vel, petsc // Get the vector that represent the right-hand-side Vector<double,PETSC_BASE> & b = fd.getB(); + timer tm_solve; + tm_solve.start(); + // Give to the solver A and b in this case we are giving // an intitial guess phi_s calculated in the previous // time step solver.solve(A,phi_s[i],b); + tm_solve.stop(); + //////////////// CG Call ////////////////////////// // Here we create a distributed grid to store the result of the helmotz projection @@ -774,8 +798,16 @@ void comp_vel(Box<3,float> & domain, grid_type & g_vort,grid_type & g_vel, petsc ++zit; } + timer tm_solve2; + tm_solve2.start(); + CG(OpA,sol,gr_ps); + tm_solve2.stop(); + + std::cout << "Time to solve: " << tm_solve2.getwct() << " " << tm_solve.getwct() << std::endl; + + /////////////////////////////////////////////////// // Calculate the residual @@ -790,13 +822,6 @@ void comp_vel(Box<3,float> & domain, grid_type & g_vort,grid_type & g_vel, petsc // copy the solution to grid fd.template copy<phi>(phi_s[i],gr_ps); - /////////////// DEBUG /////////////// - - gr_ps.write("Solution_petsc_" + std::to_string(i)); - sol.write("Solution_my_" + std::to_string(i)); - - ///////////////////////////////////// - //! \cond [solve_poisson_comp] \endcond //! \cond [copy_to_phi_v] \endcond @@ -816,8 +841,6 @@ void comp_vel(Box<3,float> & domain, grid_type & g_vort,grid_type & g_vel, petsc //! \cond [copy_to_phi_v] \endcond } - exit(0); - //! \cond [curl_phi_v] \endcond phi_v.ghost_get<phi>(); @@ -1303,7 +1326,7 @@ int main(int argc, char* argv[]) } // Time Integration - for ( ; i < 10001 ; i++) + for ( ; i < 1 ; i++) { // do step 4-5-6-7 do_step(particles,g_vort,g_vel,g_dvort,domain,inte,phi_s); @@ -1312,7 +1335,7 @@ int main(int argc, char* argv[]) rk_step1(particles); // do step 9-10-11-12 - do_step(particles,g_vort,g_vel,g_dvort,domain,inte,phi_s); +/* do_step(particles,g_vort,g_vel,g_dvort,domain,inte,phi_s); // do step 13 rk_step2(particles); @@ -1330,7 +1353,7 @@ int main(int argc, char* argv[]) // every 100 steps write the output if (i % 100 == 0) {check_point_and_save(particles,g_vort,g_vel,g_dvort,i);} - +*/ } openfpm_finalize(); -- GitLab