From 24429930104c22786b109a53579aefcd7e770475 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 18:14:42 +0000 Subject: [PATCH 1/2] Move AlgebraicMultigrid wiring to package extension Agent-Logs-Url: https://github.com/sintefmath/Jutul.jl/sessions/201f43f3-688f-4842-86bd-734d17b34769 Co-authored-by: moyner <454871+moyner@users.noreply.github.com> --- Project.toml | 6 ++- .../JutulAlgebraicMultigridExt.jl | 34 ++++++++++++ src/Jutul.jl | 1 - src/ext/algebraicmultigrid_ext.jl | 53 +++++++++++++++++++ src/ext/extensions.jl | 1 + src/linsolve/precond/amg.jl | 19 ------- src/linsolve/precond/precond.jl | 2 - test/test_systems/heat_2d.jl | 1 + 8 files changed, 93 insertions(+), 24 deletions(-) create mode 100644 ext/JutulAlgebraicMultigridExt/JutulAlgebraicMultigridExt.jl create mode 100644 src/ext/algebraicmultigrid_ext.jl diff --git a/Project.toml b/Project.toml index 2df4f4e93..80fbd4d89 100644 --- a/Project.toml +++ b/Project.toml @@ -4,7 +4,6 @@ version = "0.4.23" authors = ["Olav Møyner "] [deps] -AlgebraicMultigrid = "2169fc97-5a83-5252-b627-83903c6c433c" Crayons = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" @@ -40,6 +39,7 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" TimerOutputs = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" [weakdeps] +AlgebraicMultigrid = "2169fc97-5a83-5252-b627-83903c6c433c" AMGCLWrap = "4f76b812-4ba5-496d-b042-d70715554288" GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" Gmsh = "705231aa-382f-11e9-3f0c-b7cb4346fdeb" @@ -55,6 +55,7 @@ PartitionedArrays = "5a9dfac6-5c52-46f7-8278-5e2210713be9" WriteVTK = "64499a7a-5c06-52f2-abe2-ccb03c286192" [extensions] +JutulAlgebraicMultigridExt = "AlgebraicMultigrid" JutulAMGCLWrapExt = "AMGCLWrap" JutulGLMakieExt = "GLMakie" JutulGmshExt = "Gmsh" @@ -107,6 +108,7 @@ WriteVTK = "1" julia = "1.7" [extras] +AlgebraicMultigrid = "2169fc97-5a83-5252-b627-83903c6c433c" CPUSummary = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" Gmsh = "705231aa-382f-11e9-3f0c-b7cb4346fdeb" @@ -121,4 +123,4 @@ NetworkLayout = "46757867-2c16-5918-afeb-47bfcb05e46a" PartitionedArrays = "5a9dfac6-5c52-46f7-8278-5e2210713be9" [targets] -test = ["KaHyPar", "HYPRE", "LBFGSB"] +test = ["AlgebraicMultigrid", "KaHyPar", "HYPRE", "LBFGSB"] diff --git a/ext/JutulAlgebraicMultigridExt/JutulAlgebraicMultigridExt.jl b/ext/JutulAlgebraicMultigridExt/JutulAlgebraicMultigridExt.jl new file mode 100644 index 000000000..fc77b858c --- /dev/null +++ b/ext/JutulAlgebraicMultigridExt/JutulAlgebraicMultigridExt.jl @@ -0,0 +1,34 @@ +module JutulAlgebraicMultigridExt + using Jutul + using AlgebraicMultigrid + using SparseArrays + using LinearAlgebra + using Polyester + + import LinearAlgebra: ldiv!, lu, mul! + import Jutul: AMGPreconditioner, + update_preconditioner!, + partial_update_preconditioner!, + operator_nrows, + StaticSparsityMatrixCSR, + SPAI0Preconditioner, + ILUZeroPreconditioner, + JacobiPreconditioner, + default_executor, + get_factorization, + nthreads, + minbatch, + colvals, + sparse_indirection, + @tic + + function Jutul.check_algebraicmultigrid_availability_impl() + return true + end + + function Jutul.amg_default_cycle_impl() + return AlgebraicMultigrid.V() + end + + include(joinpath(@__DIR__, "..", "..", "src", "linsolve", "precond", "amg.jl")) +end diff --git a/src/Jutul.jl b/src/Jutul.jl index 52d39f1b2..579621005 100644 --- a/src/Jutul.jl +++ b/src/Jutul.jl @@ -20,7 +20,6 @@ module Jutul using ILUZero using LinearOperators using Krylov - using AlgebraicMultigrid # Misc. utils using ExprTools diff --git a/src/ext/algebraicmultigrid_ext.jl b/src/ext/algebraicmultigrid_ext.jl new file mode 100644 index 000000000..068bd412f --- /dev/null +++ b/src/ext/algebraicmultigrid_ext.jl @@ -0,0 +1,53 @@ +mutable struct AMGPreconditioner{T} <: JutulPreconditioner + method_kwarg + cycle + factor + dim + hierarchy + smoothers + smoother_type::Symbol + npre::Int + npost::Int +end + +function AMGPreconditioner(method::Symbol; smoother_type = :default, cycle = nothing, npre = 1, npost = npre, kwarg...) + check_algebraicmultigrid_availability() + @assert method == :smoothed_aggregation || method == :ruge_stuben || method == :aggregation + if isnothing(cycle) + cycle = amg_default_cycle_impl() + end + return AMGPreconditioner{method}(kwarg, cycle, nothing, nothing, nothing, nothing, smoother_type, npre, npost) +end + +""" + check_algebraicmultigrid_availability(; throw = true) + +Check if AlgebraicMultigrid extension is available. If `throw=true` this will be +an error, otherwise a Boolean indicating if the extension is available will be +returned. +""" +function check_algebraicmultigrid_availability(; throw = true) + ok = true + try + ok = check_algebraicmultigrid_availability_impl() + catch e + if throw + if e isa MethodError + error("AlgebraicMultigrid is not available. To fix: using Pkg; Pkg.add(\"AlgebraicMultigrid\") and then call import AlgebraicMultigrid to enable AlgebraicMultigrid.") + else + rethrow(e) + end + else + ok = false + end + end + return ok +end + +function amg_default_cycle_impl + +end + +function check_algebraicmultigrid_availability_impl + +end diff --git a/src/ext/extensions.jl b/src/ext/extensions.jl index c24cbd496..669da4f6b 100644 --- a/src/ext/extensions.jl +++ b/src/ext/extensions.jl @@ -1,3 +1,4 @@ +include("algebraicmultigrid_ext.jl") include("amgclwrap_ext.jl") include("makie_ext.jl") include("glmakie_ext.jl") diff --git a/src/linsolve/precond/amg.jl b/src/linsolve/precond/amg.jl index 9cf256af0..032ec937f 100644 --- a/src/linsolve/precond/amg.jl +++ b/src/linsolve/precond/amg.jl @@ -1,23 +1,4 @@ -""" -AMG on CPU (Julia native) -""" -mutable struct AMGPreconditioner{T} <: JutulPreconditioner - method_kwarg - cycle - factor - dim - hierarchy - smoothers - smoother_type::Symbol - npre::Int - npost::Int - function AMGPreconditioner(method::Symbol; smoother_type = :default, cycle = AlgebraicMultigrid.V(), npre = 1, npost = npre, kwarg...) - @assert method == :smoothed_aggregation || method == :ruge_stuben || method == :aggregation - new{method}(kwarg, cycle, nothing, nothing, nothing, nothing, smoother_type, npre, npost) - end -end - matrix_for_amg(A) = A matrix_for_amg(A::StaticSparsityMatrixCSR) = copy(A.At') diff --git a/src/linsolve/precond/precond.jl b/src/linsolve/precond/precond.jl index dcc89bf37..04cfa65e3 100644 --- a/src/linsolve/precond/precond.jl +++ b/src/linsolve/precond/precond.jl @@ -4,10 +4,8 @@ abstract type JutulPreconditioner end abstract type DiagonalPreconditioner <: JutulPreconditioner end include("utils.jl") -include("amg.jl") include("diagonal.jl") include("ilu.jl") include("spai.jl") include("jacobi.jl") include("various.jl") - diff --git a/test/test_systems/heat_2d.jl b/test/test_systems/heat_2d.jl index 701700d74..7be058a72 100644 --- a/test/test_systems/heat_2d.jl +++ b/test/test_systems/heat_2d.jl @@ -1,4 +1,5 @@ using Jutul +using AlgebraicMultigrid using Test function test_heat_2d(nx = 3, ny = nx; kwarg...) From f75bae6d05ba0ce8c3ca1308bf55d55f46317b9e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 18:15:36 +0000 Subject: [PATCH 2/2] Fix AlgebraicMultigrid extension import for local helper dispatch Agent-Logs-Url: https://github.com/sintefmath/Jutul.jl/sessions/201f43f3-688f-4842-86bd-734d17b34769 Co-authored-by: moyner <454871+moyner@users.noreply.github.com> --- ext/JutulAlgebraicMultigridExt/JutulAlgebraicMultigridExt.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/ext/JutulAlgebraicMultigridExt/JutulAlgebraicMultigridExt.jl b/ext/JutulAlgebraicMultigridExt/JutulAlgebraicMultigridExt.jl index fc77b858c..b4ffb1844 100644 --- a/ext/JutulAlgebraicMultigridExt/JutulAlgebraicMultigridExt.jl +++ b/ext/JutulAlgebraicMultigridExt/JutulAlgebraicMultigridExt.jl @@ -19,7 +19,6 @@ module JutulAlgebraicMultigridExt nthreads, minbatch, colvals, - sparse_indirection, @tic function Jutul.check_algebraicmultigrid_availability_impl()