Skip to content

Commit 3a211ad

Browse files
committed
feat: wrap GridapPETSc
1 parent 536d99b commit 3a211ad

File tree

4 files changed

+39
-7
lines changed

4 files changed

+39
-7
lines changed

Project.toml

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ SymbolicIndexingInterface = "2efcf032-c050-4f8e-a9bb-153293bab1f5"
3434
[weakdeps]
3535
FastLevenbergMarquardt = "7a0df574-e128-4d35-8cbd-3d84502bf7ce"
3636
FixedPointAcceleration = "817d07cb-a79a-5c30-9a31-890123675176"
37+
Gridap = "56d4f2e9-7ea1-5844-9cf6-b9c51ca7ce8e"
38+
GridapPETSc = "bcdc36c2-0c3e-11ea-095a-c9dadae499f1"
3739
LeastSquaresOptim = "0fc2ff8b-aaa3-5acd-a817-1944a5e08891"
3840
LineSearches = "d3d80556-e9d4-5f37-9878-2ab0fcc64255"
3941
MINPACK = "4854310b-de5a-5eb6-a2a5-c1dee2bd17f9"
@@ -45,9 +47,16 @@ SIAMFANLEquations = "084e46ad-d928-497d-ad5e-07fa361a48c4"
4547
SpeedMapping = "f1835b91-879b-4a3f-a438-e4baacf14412"
4648
Sundials = "c3572dad-4567-51f8-b174-8c6c989267f4"
4749

50+
[sources]
51+
NonlinearSolveBase = {path = "lib/NonlinearSolveBase"}
52+
NonlinearSolveFirstOrder = {path = "lib/NonlinearSolveFirstOrder"}
53+
NonlinearSolveQuasiNewton = {path = "lib/NonlinearSolveQuasiNewton"}
54+
NonlinearSolveSpectralMethods = {path = "lib/NonlinearSolveSpectralMethods"}
55+
4856
[extensions]
4957
NonlinearSolveFastLevenbergMarquardtExt = "FastLevenbergMarquardt"
5058
NonlinearSolveFixedPointAccelerationExt = "FixedPointAcceleration"
59+
NonlinearSolveGridapPETScExt = ["Gridap", "GridapPETSc"]
5160
NonlinearSolveLeastSquaresOptimExt = "LeastSquaresOptim"
5261
NonlinearSolveMINPACKExt = "MINPACK"
5362
NonlinearSolveNLSolversExt = "NLSolvers"
@@ -153,9 +162,3 @@ Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
153162

154163
[targets]
155164
test = ["Aqua", "BandedMatrices", "BenchmarkTools", "CUDA", "Enzyme", "ExplicitImports", "FastLevenbergMarquardt", "FixedPointAcceleration", "Hwloc", "InteractiveUtils", "LeastSquaresOptim", "LineSearches", "MINPACK", "NLSolvers", "NLsolve", "NaNMath", "NonlinearProblemLibrary", "OrdinaryDiffEqTsit5", "PETSc", "Pkg", "PolyesterForwardDiff", "Random", "ReTestItems", "SIAMFANLEquations", "SparseConnectivityTracer", "SpeedMapping", "StableRNGs", "StaticArrays", "Sundials", "Test", "Zygote"]
156-
157-
[sources]
158-
NonlinearSolveBase = {path = "lib/NonlinearSolveBase"}
159-
NonlinearSolveFirstOrder = {path = "lib/NonlinearSolveFirstOrder"}
160-
NonlinearSolveQuasiNewton = {path = "lib/NonlinearSolveQuasiNewton"}
161-
NonlinearSolveSpectralMethods = {path = "lib/NonlinearSolveSpectralMethods"}

ext/NonlinearSolveGridapPETScExt.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module NonlinearSolveGridapPETScExt
2+
3+
using Gridap: Gridap
4+
using GridapPETSc: GridapPETSc
5+
6+
using NonlinearSolveBase: NonlinearSolveBase
7+
using NonlinearSolve: NonlinearSolve, GridapPETScSNES
8+
9+
end

ext/NonlinearSolvePETScExt.jl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ function SciMLBase.__solve(
1717
maxiters = 1000, alias_u0::Bool = false, termination_condition = nothing,
1818
show_trace::Val = Val(false), kwargs...
1919
)
20+
if !MPI.Initialized()
21+
@warn "MPI not initialized. Initializing MPI with MPI.Init()." maxlog = 1
22+
MPI.Init()
23+
end
24+
2025
# XXX: https://petsc.org/release/manualpages/SNES/SNESSetConvergenceTest/
2126
NonlinearSolveBase.assert_extension_supported_termination_condition(
2227
termination_condition, alg; abs_norm_supported = false
@@ -68,8 +73,10 @@ function SciMLBase.__solve(
6873
PETSc.setfunction!(snes, f!, PETSc.VecSeq(zero(u0)))
6974

7075
njac = Ref{Int}(-1)
71-
if alg.autodiff !== missing || prob.f.jac !== nothing
76+
# `missing` -> let PETSc compute the Jacobian using finite differences
77+
if alg.autodiff !== missing
7278
autodiff = alg.autodiff === missing ? nothing : alg.autodiff
79+
7380
if prob.u0 isa Number
7481
jac! = NonlinearSolveBase.construct_extension_jac(
7582
prob, alg, prob.u0, prob.u0; autodiff

src/extension_algs.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,3 +488,16 @@ function PETScSNES(; petsclib = missing, autodiff = nothing, mpi_comm = missing,
488488
end
489489
return PETScSNES(petsclib, mpi_comm, autodiff, kwargs)
490490
end
491+
492+
# TODO: Docs
493+
@concrete struct GridapPETScSNES <: AbstractNonlinearSolveAlgorithm
494+
autodiff
495+
snes_options
496+
end
497+
498+
function GridapPETScSNES(; autodiff = nothing, kwargs...)
499+
if Base.get_extension(@__MODULE__, :NonlinearSolveGridapPETScExt) === nothing
500+
error("`GridapPETScSNES` requires `GridapPETSc.jl` to be loaded")
501+
end
502+
return GridapPETScSNES(autodiff, kwargs)
503+
end

0 commit comments

Comments
 (0)