From f34010346938bfcd246fbf3b78d146201040f275 Mon Sep 17 00:00:00 2001 From: juddmehr Date: Mon, 24 Feb 2025 15:33:39 -0700 Subject: [PATCH] add options for preconditioning elliptic grid --- src/preprocess/geometry/wake_geometry.jl | 86 ++++++++++++------------ src/utilities/options.jl | 5 ++ 2 files changed, 48 insertions(+), 43 deletions(-) diff --git a/src/preprocess/geometry/wake_geometry.jl b/src/preprocess/geometry/wake_geometry.jl index fb02e41..d15afaf 100644 --- a/src/preprocess/geometry/wake_geometry.jl +++ b/src/preprocess/geometry/wake_geometry.jl @@ -368,56 +368,56 @@ function relax_grid!( tabchar=" ", ntab=1, ) - - # if verbose - # println(tabchar^ntab * "Preconditioning Elliptic Grid System using SLOR") - # end - # # - Relax grid to allow Newton solve a tractable starting point - # - # relax_grid!( - # wake_grid; - # iteration_limit=grid_solver_options.iteration_limit, - # atol=grid_solver_options.atol, - # converged=grid_solver_options.converged, - # verbose=verbose, - # tabchar="\t", - # ntab=1, - # ) + if grid_solver_options.precondition + if verbose + println(tabchar^ntab * "Preconditioning Elliptic Grid System using SLOR") + end + # - Relax grid to allow Newton solve a tractable starting point - # + relax_grid!( + wake_grid; + iteration_limit=grid_solver_options.iteration_limit, + atol=grid_solver_options.atol, + converged=grid_solver_options.converged, + verbose=verbose, + tabchar="\t", + ntab=1, + ) + end # - Converge grid with NLsolve - # - # reset convergence flag - grid_solver_options.converged[1] = false + if !grid_solver_options.converged[1] - if verbose - println( - tabchar^ntab * - "Solving Elliptic Grid System using $(grid_solver_options.algorithm) Method", + # reset convergence flag + grid_solver_options.converged[1] = false + + if verbose + println( + tabchar^ntab * + "Solving Elliptic Grid System using $(grid_solver_options.algorithm) Method", + ) + end + + # solve + solve_elliptic_grid!( + wake_grid; + algorithm=grid_solver_options.algorithm, + atol=grid_solver_options.atol, + iteration_limit=grid_solver_options.iteration_limit, + grid_solver_options.converged, + grid_solver_options.residual_value, + grid_solver_options.iterations, + verbose=verbose, ) + else + if verbose + println( + tabchar^ntab * + "Preconditioning Elliptic Grid System converged within final tolerance, skipping non-linear solve.", + ) + end end - # # precondition - # relax_grid!( - # wake_grid; - # iteration_limit=grid_solver_options.iteration_limit, - # atol=grid_solver_options.atol, - # converged=grid_solver_options.converged, - # verbose=verbose, - # tabchar="\t", - # ntab=1, - # ) - - # solve - solve_elliptic_grid!( - wake_grid; - algorithm=grid_solver_options.algorithm, - atol=grid_solver_options.atol, - iteration_limit=grid_solver_options.iteration_limit, - grid_solver_options.converged, - grid_solver_options.residual_value, - grid_solver_options.iterations, - verbose=verbose, - ) - return wake_grid end diff --git a/src/utilities/options.jl b/src/utilities/options.jl index 352d851..24f5b4f 100644 --- a/src/utilities/options.jl +++ b/src/utilities/options.jl @@ -652,14 +652,19 @@ Options for Newton elliptic grid solver. - `atol::Float = 3e-10` : absolute convergence tolerance - `algorithm::Symbol = :newton` : algorithm to use in NLsolve.jl - `autodiff::Symbol = :forward` : differentiation method to use in NLsolve.jl +- `precondition = false` : flag to precondition with SLOR +- `precondition_max_iterations = 3` : number of precondition iterations - `converged::AbstractArray{Bool}` = [false] - `iterations::AbstractArray{Int} = [0]` : iteration counter +- `residual_value::AbstractArray{Int} = [0]` : residual value """ @kwdef struct GridSolverOptions{TB,TF,TI,TSym} <: GridSolverOptionsType iteration_limit::TI = 30 atol::TF = 3e-10 algorithm::TSym = :newton autodiff::TSym = :forward + precondition::TB = false + precondition_max_iterations::TI = 3 converged::AbstractArray{TB} = [false] iterations::AbstractArray{TI} = [0] residual_value::AbstractArray{TF} = [0.0]