From 02e7cd2374f3fc817a890f69f255a50b7de4a27d Mon Sep 17 00:00:00 2001 From: austin Date: Wed, 11 Dec 2024 13:20:03 -0500 Subject: [PATCH] multigrid residual checking --- src/main/c/src/fluid/sim/grid2/velocity.c | 5 +- src/main/c/src/math/ode/multigrid.c | 81 +++++++++++++-------- src/main/c/src/util/vector.c | 31 +++----- src/test/c/fluid/sim/grid2/add_dens_tests.c | 2 +- 4 files changed, 66 insertions(+), 53 deletions(-) diff --git a/src/main/c/src/fluid/sim/grid2/velocity.c b/src/main/c/src/fluid/sim/grid2/velocity.c index cc4cc859..128f4157 100644 --- a/src/main/c/src/fluid/sim/grid2/velocity.c +++ b/src/main/c/src/fluid/sim/grid2/velocity.c @@ -180,11 +180,14 @@ LIBRARY_API void fluid_grid2_solveProjection( //perform iteration of v cycle multigrid method float residual = 1; int iteration = 0; - while(iteration < FLUID_GRID2_LINEARSOLVERTIMES && residual > FLUID_GRID2_REALLY_SMALL_VALUE){ + while(iteration < FLUID_GRID2_LINEARSOLVERTIMES && (residual > FLUID_GRID2_REALLY_SMALL_VALUE || residual < -FLUID_GRID2_REALLY_SMALL_VALUE)){ residual = solver_multigrid_iterate(p,div,a,c); fluid_grid2_set_bounds(FLUID_GRID2_BOUND_NO_DIR,p); iteration++; } + if(residual > FLUID_GRID2_REALLY_SMALL_VALUE || residual < -FLUID_GRID2_REALLY_SMALL_VALUE){ + printf("Projection residual didn't converge! %f \n",residual); + } // solver_conjugate_gradient_solve_serial(p,div,a,c); diff --git a/src/main/c/src/math/ode/multigrid.c b/src/main/c/src/math/ode/multigrid.c index c2b1dfc9..c6293673 100644 --- a/src/main/c/src/math/ode/multigrid.c +++ b/src/main/c/src/math/ode/multigrid.c @@ -29,6 +29,9 @@ static float * halfGridPhi0 = NULL; static float * quarterGridPhi = NULL; static float * quarterGridPhi0 = NULL; + +float solver_multigrid_calculate_residual(float * phi, float * phi0, float a, float c); + /** * Relaxes an ODE matrix by 1 iteration of multigrid method * @param phi The phi array @@ -150,43 +153,59 @@ float solver_multigrid_iterate(float * phi, float * phi0, float a, float c){ //gauss-seidel at highest res solver_gauss_seidel_iterate_parallel(phi,phi0,a,c,DIM); + + return solver_multigrid_calculate_residual(phi,phi0,a,c); +} + + +/** + * Calculates the residual of the grid + */ +float solver_multigrid_calculate_residual(float * phi, float * phi0, float a, float c){ //calculate residual __m256 aScalar = _mm256_set1_ps(a); __m256 cScalar = _mm256_set1_ps(c); __m256 collector = _mm256_setzero_ps(); __m256 vector; + float vec_sum_storage[8]; float residual = 1; //transform u direction - // int i, j, k; - // for(k=1; kd0[CENTER_LOC][IX(5,5,5)] = MAX_FLUID_VALUE;