diff --git a/Manifest.toml b/Manifest.toml index f3074c911..135c36e16 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -1,5 +1,11 @@ # This file is machine-generated - editing it directly is not advised +[[ArrayInterface]] +deps = ["LinearAlgebra", "Requires", "SparseArrays"] +git-tree-sha1 = "981354dab938901c2b607a213e62d9defa50b698" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "1.2.1" + [[Base64]] uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" @@ -15,6 +21,12 @@ git-tree-sha1 = "c7361ce8a2129f20b0e05a89f7070820cfed6648" uuid = "b99e7846-7c00-51b0-8f62-c81ae34c0232" version = "0.5.6" +[[Calculus]] +deps = ["Compat"] +git-tree-sha1 = "bd8bbd105ba583a42385bd6dc4a20dad8ab3dc11" +uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" +version = "0.5.0" + [[CodecZlib]] deps = ["BinaryProvider", "Libdl", "TranscodingStreams"] git-tree-sha1 = "05916673a2627dd91b4969ff8ba6941bc85a960e" @@ -27,6 +39,12 @@ git-tree-sha1 = "50b3ae4d643dc27eaff69fb6be06ee094d5500c9" uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" version = "0.7.0" +[[CommonSubexpressions]] +deps = ["Test"] +git-tree-sha1 = "efdaf19ab11c7889334ca247ff4c9f7c322817b0" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.2.0" + [[Compat]] deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] git-tree-sha1 = "84aa74986c5b9b898b0d1acaf3258741ee64754f" @@ -47,6 +65,30 @@ uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" deps = ["Mmap"] uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +[[DiffEqDiffTools]] +deps = ["ArrayInterface", "LinearAlgebra", "Requires", "SparseArrays", "StaticArrays"] +git-tree-sha1 = "21b855cb29ec4594f9651e0e9bdc0cdcfdcd52c1" +uuid = "01453d9d-ee7c-5054-8395-0335cb756afa" +version = "1.3.0" + +[[DiffResults]] +deps = ["Compat", "StaticArrays"] +git-tree-sha1 = "34a4a1e8be7bc99bc9c611b895b5baf37a80584c" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "0.0.4" + +[[DiffRules]] +deps = ["Random", "Test"] +git-tree-sha1 = "dc0869fb2f5b23466b32ea799bd82c76480167f7" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "0.0.10" + +[[Distances]] +deps = ["LinearAlgebra", "Statistics"] +git-tree-sha1 = "23717536c81b63e250f682b0e0933769eecd1411" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.8.2" + [[Distributed]] deps = ["Random", "Serialization", "Sockets"] uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" @@ -57,6 +99,12 @@ git-tree-sha1 = "769ac4057ed875f433372e9a571a2cb86347d1be" uuid = "442a2c76-b920-505d-bb47-c5924d526838" version = "0.3.3" +[[ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "InteractiveUtils", "LinearAlgebra", "NaNMath", "Random", "SparseArrays", "SpecialFunctions", "StaticArrays", "Test"] +git-tree-sha1 = "4c4d727f1b7e0092134fabfab6396b8945c1ea5b" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.3" + [[InteractiveUtils]] deps = ["Markdown"] uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" @@ -79,6 +127,12 @@ git-tree-sha1 = "aeec7a341652d47bc773475a42952fa78eccd7cc" uuid = "9c8b4983-aa76-5018-a973-4c85ecc9e179" version = "0.8.0" +[[LineSearches]] +deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf", "Test"] +git-tree-sha1 = "54eb90e8dbe745d617c78dee1d6ae95c7f6f5779" +uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" +version = "7.0.1" + [[LinearAlgebra]] deps = ["Libdl"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" @@ -93,12 +147,36 @@ uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" [[Mmap]] uuid = "a63ad114-7e13-5084-954f-fe012c677804" +[[NLSolversBase]] +deps = ["Calculus", "DiffEqDiffTools", "DiffResults", "Distributed", "ForwardDiff"] +git-tree-sha1 = "c430bd3f2dfcffc30688cf4a9cb61535e8d85f65" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.4.1" + +[[NLsolve]] +deps = ["DiffEqDiffTools", "Distances", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "Printf", "Reexport"] +git-tree-sha1 = "c9578878f56f425a2160f5b436c7f79a154d154c" +uuid = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" +version = "4.1.0" + +[[NaNMath]] +deps = ["Compat"] +git-tree-sha1 = "ce3b85e484a5d4c71dd5316215069311135fa9f2" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "0.3.2" + [[OrderedCollections]] deps = ["Random", "Serialization", "Test"] git-tree-sha1 = "c4c13474d23c60d20a67b217f1d7f22a40edf8f1" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" version = "1.1.0" +[[Parameters]] +deps = ["OrderedCollections"] +git-tree-sha1 = "1dfd7cd50a8eb06ef693a4c2bbe945943cd000c5" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.11.0" + [[Parsers]] deps = ["Dates", "Test"] git-tree-sha1 = "ef0af6c8601db18c282d092ccbd2f01f3f0cd70b" @@ -139,6 +217,12 @@ git-tree-sha1 = "7b1d07f411bc8ddb7977ec7f377b97b158514fe0" uuid = "189a3867-3050-52da-a836-e630ba90ab69" version = "0.2.0" +[[Requires]] +deps = ["Test"] +git-tree-sha1 = "f6fbf4ba64d295e146e49e021207993b6b48c7d1" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "0.5.2" + [[SHA]] uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" diff --git a/Project.toml b/Project.toml index 5fa52890d..49e37ee62 100644 --- a/Project.toml +++ b/Project.toml @@ -8,6 +8,7 @@ Combinatorics = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" FastGaussQuadrature = "442a2c76-b920-505d-bb47-c5924d526838" JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" QuadGK = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" Reexport = "189a3867-3050-52da-a836-e630ba90ab69" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" diff --git a/src/Algebra/JuliaNLSolvers.jl b/src/Algebra/JuliaNLSolvers.jl new file mode 100644 index 000000000..2101d9202 --- /dev/null +++ b/src/Algebra/JuliaNLSolvers.jl @@ -0,0 +1,66 @@ +module JuliaNLSolvers + +using Gridap +using NLsolve + +export JuliaNLSolver + +import Gridap: solve! + +mutable struct JuliaNLSolver <: NonLinearSolver + ls::LinearSolver + kwargs::Dict +end + +function JuliaNLSolver(ls::LinearSolver;kwargs...) + @assert ! haskey(kwargs,:linsolve) "linsolve cannot be used here. It is managed internally" + JuliaNLSolver(ls,kwargs) +end + +function JuliaNLSolver(;kwargs...) + ls = LUSolver() + JuliaNLSolver(ls;kwargs...) +end + +mutable struct JuliaNLSolversCache + df::OnceDifferentiable + ss::SymbolicSetup + result +end + +function solve!(x::AbstractVector,nls::JuliaNLSolver,op::NonLinearOperator) + cache = _setup_cache(x,nls,op) + solve!(x,nls,op,cache) + cache +end + +function solve!( + x::AbstractVector,nls::JuliaNLSolver,op::NonLinearOperator,cache::JuliaNLSolversCache) + df = cache.df + ss = cache.ss + kwargs = nls.kwargs + function linsolve!(x,A,b) + ns = numerical_setup(ss,A) + solve!(x,ns,A,b) + end + r = nlsolve(df,x;linsolve=linsolve!,kwargs...) + cache.result = r + x[:] .= r.zero +end + +function _setup_cache(x0,nls,op) + + f!(r,x) = residual!(r,op,x) + j!(j,x) = jacobian!(j,op,x) + + f0 = residual(op,x0) + j0 = jacobian(op,x0) + + df = OnceDifferentiable(f!,j!,x0,f0,j0) + + ss = symbolic_setup(nls.ls,j0) + + JuliaNLSolversCache(df,ss,nothing) +end + +end # module diff --git a/src/Algebra/files.jl b/src/Algebra/files.jl index ae764a96f..97fea0564 100644 --- a/src/Algebra/files.jl +++ b/src/Algebra/files.jl @@ -4,3 +4,6 @@ include("LinearSolvers.jl") include("NonLinearSolvers.jl") @reexport using Gridap.NonLinearSolvers + +include("JuliaNLSolvers.jl") +@reexport using Gridap.JuliaNLSolvers diff --git a/test/AlgebraTests/JuliaNLSolversTests.jl b/test/AlgebraTests/JuliaNLSolversTests.jl new file mode 100644 index 000000000..848d62147 --- /dev/null +++ b/test/AlgebraTests/JuliaNLSolversTests.jl @@ -0,0 +1,21 @@ +module JuliaNLSolversTests + +using Test +using Gridap + +using ..NonLinearOperatorMocks + +op = NonLinearOperatorMock() + +nls = JuliaNLSolver(show_trace=false,method=:newton) + +x = solve(nls,op) +@test x ≈ [1.0, 3.0] + +cache = solve!(x,nls,op) + +solve!(x,nls,op,cache) + +cache.result + +end # module diff --git a/test/AlgebraTests/runtests.jl b/test/AlgebraTests/runtests.jl index 95f622486..455d2e4bc 100644 --- a/test/AlgebraTests/runtests.jl +++ b/test/AlgebraTests/runtests.jl @@ -8,4 +8,6 @@ include("NonLinearOperatorMocks.jl") @testset "NonLinearSolvers" begin include("NonLinearSolversTests.jl") end +@testset "JuliaNLSolvers" begin include("JuliaNLSolversTests.jl") end + end # module AlgebraTests