From 7cb5820d48dd0ef7adbe666bbcdf8fd45cad4374 Mon Sep 17 00:00:00 2001 From: Pietro Incardona <incardon@mpi-cbg.de> Date: Mon, 3 Jul 2017 00:31:16 +0200 Subject: [PATCH] Latest modules --- example/Numerics/Vortex_in_cell/main_vic.cpp | 2 +- .../Vortex_in_cell/main_vic_petsc.cpp | 75 ++++++++++--------- .../Vortex_in_cell/main_vic_petsc2.cpp | 2 +- .../Vortex_in_cell/main_vic_petsc3.cpp | 2 +- openfpm_numerics | 2 +- 5 files changed, 45 insertions(+), 38 deletions(-) diff --git a/example/Numerics/Vortex_in_cell/main_vic.cpp b/example/Numerics/Vortex_in_cell/main_vic.cpp index 2605cea41..7481f1cad 100644 --- a/example/Numerics/Vortex_in_cell/main_vic.cpp +++ b/example/Numerics/Vortex_in_cell/main_vic.cpp @@ -18,7 +18,7 @@ #include "Solvers/petsc_solver.hpp" #include "Solvers/umfpack_solver.hpp" #include "interpolation/mp4_kernel.hpp" -#include "interpolation/interpolation.hpp" +#include "../../../openfpm_numerics/src/interpolation/interpolation.hpp" constexpr int x = 0; constexpr int y = 1; diff --git a/example/Numerics/Vortex_in_cell/main_vic_petsc.cpp b/example/Numerics/Vortex_in_cell/main_vic_petsc.cpp index 3d8071b36..ed2a4c73b 100644 --- a/example/Numerics/Vortex_in_cell/main_vic_petsc.cpp +++ b/example/Numerics/Vortex_in_cell/main_vic_petsc.cpp @@ -96,6 +96,7 @@ //! \cond [inclusion] \endcond +#include "../../../openfpm_numerics/src/interpolation/interpolation.hpp" #include "Grid/grid_dist_id.hpp" #include "Vector/vector_dist.hpp" #include "Matrix/SparseMatrix.hpp" @@ -103,7 +104,6 @@ #include "FiniteDifference/FDScheme.hpp" #include "Solvers/petsc_solver.hpp" #include "interpolation/mp4_kernel.hpp" -#include "interpolation/interpolation.hpp" #include "Solvers/petsc_solver_AMG_report.hpp" constexpr int x = 0; @@ -293,6 +293,7 @@ const bool poisson_nn_helm::boundary[] = {PERIODIC,PERIODIC,PERIODIC}; //! \cond [poisson_syseq] \endcond + /*! \page Vortex_in_cell_petsc Vortex in Cell 3D * * # Step 2: Helmotz-hodge projection # {#vic_hlm_proj} @@ -406,7 +407,7 @@ const bool poisson_nn_helm::boundary[] = {PERIODIC,PERIODIC,PERIODIC}; * domain simulation domain * */ -void helmotz_hodge_projection(grid_type & gr, const Box<3,float> & domain) +void helmotz_hodge_projection(grid_type & gr, const Box<3,float> & domain, petsc_solver<double> & solver, petsc_solver<double>::return_type & x_ , bool init) { /////////////////////////////////////////////////////////////// @@ -476,25 +477,29 @@ void helmotz_hodge_projection(grid_type & gr, const Box<3,float> & domain) //! \cond [solve_petsc] \endcond - // Create a PETSC solver to get the solution x - petsc_solver<double> solver; - - // Set the conjugate-gradient as method to solve the linear solver - solver.setSolver(KSPBCGS); + if (init == true) + { + // Set the conjugate-gradient as method to solve the linear solver + solver.setSolver(KSPBCGS); - // Set the absolute tolerance to determine that the method is converged - solver.setAbsTol(0.1); + // Set the absolute tolerance to determine that the method is converged + solver.setAbsTol(0.1); - // Set the maximum number of iterations - solver.setMaxIter(500); + // Set the maximum number of iterations + solver.setMaxIter(500); - timer tm_solve; - tm_solve.start(); + 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()); + // Give to the solver A and b, return x, the solution + solver.solve(fd.getA(),x_,fd.getB()); - tm_solve.stop(); + tm_solve.stop(); + } + else + { + solver.solve(x_,fd.getB()); + } // copy the solution x to the grid psi fd.template copy<phi>(x_,psi); @@ -633,7 +638,7 @@ void remesh(particles_type & vd, grid_type & gr,Box<3,float> & domain) * */ -void comp_vel(Box<3,float> & domain, grid_type & g_vort,grid_type & g_vel, petsc_solver<double>::return_type (& phi_s)[3]) +void comp_vel(Box<3,float> & domain, grid_type & g_vort,grid_type & g_vel, petsc_solver<double>::return_type (& phi_s)[3],petsc_solver<double> & solver) { //! \cond [poisson_obj_eq] \endcond @@ -690,16 +695,7 @@ void comp_vel(Box<3,float> & domain, grid_type & g_vort,grid_type & g_vel, petsc // impose the poisson equation using gr_ps = vorticity for the right-hand-side (on the full domain) fd.template impose_dit<phi>(poisson(),gr_ps,gr_ps.getDomainIterator()); - // Create an PETSC solver - petsc_solver<double> solver; - - solver.setSolver(KSPBCGS); solver.setAbsTol(0.01); - solver.setMaxIter(500); - - // Get the sparse matrix that represent the left-hand-side - // of the equation - SparseMatrix<double,int,PETSC_BASE> & A = fd.getA(); // Get the vector that represent the right-hand-side Vector<double,PETSC_BASE> & b = fd.getB(); @@ -710,14 +706,14 @@ void comp_vel(Box<3,float> & domain, grid_type & g_vort,grid_type & g_vel, petsc // 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); + solver.solve(phi_s[i],b); tm_solve.stop(); // Calculate the residual solError serr; - serr = solver.get_residual_error(A,phi_s[i],b); + serr = solver.get_residual_error(phi_s[i],b); Vcluster & v_cl = create_vcluster(); if (v_cl.getProcessUnitID() == 0) @@ -1034,7 +1030,8 @@ template<typename grid, typename vector> void do_step(vector & particles, grid & g_dvort, Box<3,float> & domain, interpolate<particles_type,grid_type,mp4_kernel<float>> & inte, - petsc_solver<double>::return_type (& phi_s)[3]) + petsc_solver<double>::return_type (& phi_s)[3], + petsc_solver<double> & solver) { constexpr int rhs = 0; @@ -1049,7 +1046,7 @@ template<typename grid, typename vector> void do_step(vector & particles, //! \cond [step_56] \endcond // Calculate velocity from vorticity - comp_vel(domain,g_vort,g_vel,phi_s); + comp_vel(domain,g_vort,g_vel,phi_s,solver); calc_rhs(g_vort,g_vel,g_dvort); //! \cond [step_56] \endcond @@ -1163,6 +1160,7 @@ int main(int argc, char* argv[]) // It store the solution to compute velocity // It is used as initial guess every time we call the solver Vector<double,PETSC_BASE> phi_s[3]; + Vector<double,PETSC_BASE> x_; // Parallel object Vcluster & v_cl = create_vcluster(); @@ -1174,8 +1172,14 @@ int main(int argc, char* argv[]) // initialize the ring step 1 init_ring(g_vort,domain); + x_.resize(g_vort.size(),g_vort.getLocalDomainSize()); + x_.setZero(); + + // Create a PETSC solver to get the solution x + petsc_solver<double> solver; + // Do the helmotz projection step 2 - helmotz_hodge_projection(g_vort,domain); + helmotz_hodge_projection(g_vort,domain,solver,x_,true); // initialize the particle on a mesh step 3 remesh(particles,g_vort,domain); @@ -1233,13 +1237,16 @@ int main(int argc, char* argv[]) for ( ; i < 10001 ; i++) { // do step 4-5-6-7 - 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,solver); + + openfpm_finalize(); + return 0; // do step 8 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,solver); // do step 13 rk_step2(particles); @@ -1250,7 +1257,7 @@ int main(int argc, char* argv[]) g_vort.template ghost_put<add_,vorticity>(); // helmotz-hodge projection - helmotz_hodge_projection(g_vort,domain); + helmotz_hodge_projection(g_vort,domain,solver,x_,false); remesh(particles,g_vort,domain); diff --git a/example/Numerics/Vortex_in_cell/main_vic_petsc2.cpp b/example/Numerics/Vortex_in_cell/main_vic_petsc2.cpp index 22d153abc..9ab52d9a2 100644 --- a/example/Numerics/Vortex_in_cell/main_vic_petsc2.cpp +++ b/example/Numerics/Vortex_in_cell/main_vic_petsc2.cpp @@ -18,7 +18,7 @@ #include "Solvers/petsc_solver.hpp" #include "Solvers/umfpack_solver.hpp" #include "interpolation/mp4_kernel.hpp" -#include "interpolation/interpolation.hpp" +#include "../../../openfpm_numerics/src/interpolation/interpolation.hpp" constexpr int x = 0; constexpr int y = 1; diff --git a/example/Numerics/Vortex_in_cell/main_vic_petsc3.cpp b/example/Numerics/Vortex_in_cell/main_vic_petsc3.cpp index 56452eab9..13972fb05 100644 --- a/example/Numerics/Vortex_in_cell/main_vic_petsc3.cpp +++ b/example/Numerics/Vortex_in_cell/main_vic_petsc3.cpp @@ -18,7 +18,7 @@ #include "Solvers/petsc_solver.hpp" #include "Solvers/umfpack_solver.hpp" #include "interpolation/mp4_kernel.hpp" -#include "interpolation/interpolation.hpp" +#include "../../../openfpm_numerics/src/interpolation/interpolation.hpp" constexpr int x = 0; constexpr int y = 1; diff --git a/openfpm_numerics b/openfpm_numerics index 0f84683a5..e8cb410eb 160000 --- a/openfpm_numerics +++ b/openfpm_numerics @@ -1 +1 @@ -Subproject commit 0f84683a560d059a1de5fe83554794c21f71a710 +Subproject commit e8cb410eba653c121428df63a440da58920d5f27 -- GitLab