diff --git a/.gitignore b/.gitignore
index 6b6bc50..de64ef5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,3 +10,4 @@ lcov.info
/docs/Manifest.toml
/docs/build/
/docs/site/
+/examples/*.html
diff --git a/README.md b/README.md
index 37bad6e..1cae8cf 100644
--- a/README.md
+++ b/README.md
@@ -22,21 +22,18 @@ extensions for
[ExaFMMt.jl](https://github.com/JoshuaTetzner/ExaFMMt.jl), which are loaded
automatically once these packages are available.
+Planned extensions include interfaces to additional FMM backends — a
+native Julia implementation and GPU-accelerated variants — as well as support
+for two-dimensional problems.
+
## Correction-Factor Matrix Method
For a boundary-element matrix $A$, the far field is approximated by an
FMM-backed map $A_\mathrm{FMM}$. The near interactions are evaluated with the
boundary-element quadrature and corrected for the part already represented by
-the FMM:
-
-$$Ax \approx A_\mathrm{FMM}\,x + \left(A_\mathrm{near} - A_\mathrm{FMM,near}\right)x.$$
+the FMM [1]:
-The sparse correction blocks are selected from an
-[H2Trees.jl](https://github.com/djukic14/H2Trees.jl) tree. A matrix-vector
-product evaluates the FMM map first and then adds the sparse near correction.
-Transpose and adjoint products follow the corresponding `LinearMaps.jl`
-interfaces. Further details are given in the
-[documentation](https://JoshuaTetzner.github.io/CorrectionFactorMatrixMethod.jl/dev/details/method/).
+$$\boldsymbol{A}\boldsymbol{x} \approx \boldsymbol{A}_\mathrm{FMM}\,\boldsymbol{x} + \left(\boldsymbol{A}_\mathrm{near} - \boldsymbol{A}_\mathrm{FMM,near}\right)\boldsymbol{x}.$$
## Installation
@@ -63,18 +60,10 @@ mesh = meshsphere(1.0, 0.4)
space = raviartthomas(mesh)
operator = Maxwell3D.singlelayer(; wavenumber=1.0)
-matrix = CFMM.assemble(operator, space)
+matrix = CFMM.assemble(operator, space, space)
result = matrix * rand(scalartype(operator), numfunctions(space))
```
-[`CFMM.assemble`](https://JoshuaTetzner.github.io/CorrectionFactorMatrixMethod.jl/dev/manual/manual/)
-constructs an optimized tree automatically. Existing trees and all lower-level
-FMM, quadrature, and scheduler options can be supplied as keywords. The
-returned operator implements the `LinearMaps.jl` interface, so it can be passed
-straight to an iterative solver. Runnable EFIE and MFIE examples are in the
-[`examples/`](examples) directory and in the
-[documentation](https://JoshuaTetzner.github.io/CorrectionFactorMatrixMethod.jl/dev/).
-
## References
- [1] Adelman, Ross, Nail A. Gumerov, and Ramani Duraiswami. *FMM/GPU-Accelerated Boundary Element Method for Computational Magnetics and Electrostatics.* IEEE Transactions on Magnetics 53, no. 12 (December 2017): 1–11. [https://doi.org/10.1109/TMAG.2017.2725951](https://doi.org/10.1109/TMAG.2017.2725951).
diff --git a/docs/make.jl b/docs/make.jl
index cd0608f..4b5b813 100644
--- a/docs/make.jl
+++ b/docs/make.jl
@@ -24,6 +24,7 @@ makedocs(;
["General Usage" => "manual/manual.md", "Examples" => "manual/examples.md"],
"Details" => [
"Correction-Factor Method" => "details/method.md",
+ "Supported Operators" => "details/operators.md",
"Package Extensions" => "details/extensions.md",
],
"Contributing" => "contributing.md",
diff --git a/docs/render_examples.jl b/docs/render_examples.jl
new file mode 100644
index 0000000..5d63d7b
--- /dev/null
+++ b/docs/render_examples.jl
@@ -0,0 +1,28 @@
+# Regenerate the pre-rendered plot assets embedded in the documentation.
+# Run from the package root:
+#
+# julia --startup-file=no docs/render_examples.jl
+#
+# Commit the generated files in docs/src/assets/examples/ afterwards.
+
+using Pkg: Pkg
+Pkg.activate(joinpath(@__DIR__, "..", "examples"))
+Pkg.develop(; path=joinpath(@__DIR__, ".."))
+Pkg.instantiate()
+
+using BEAST
+using CompScienceMeshes
+using CorrectionFactorMatrixMethod
+using ExaFMMt
+using Krylov
+using LinearAlgebra
+using PlotlyJS
+
+outdir = joinpath(@__DIR__, "src", "assets", "examples")
+mkpath(outdir)
+ENV["CFMM_OUTPUT_DIR"] = outdir
+
+include(joinpath(@__DIR__, "..", "examples", "efie.jl"))
+include(joinpath(@__DIR__, "..", "examples", "mfie.jl"))
+
+@info "Plots written to $outdir"
diff --git a/docs/src/assets/examples/efie_results.html b/docs/src/assets/examples/efie_results.html
new file mode 100644
index 0000000..35d0b91
--- /dev/null
+++ b/docs/src/assets/examples/efie_results.html
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/src/assets/examples/mfie_results.html b/docs/src/assets/examples/mfie_results.html
new file mode 100644
index 0000000..767a1ec
--- /dev/null
+++ b/docs/src/assets/examples/mfie_results.html
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/src/contributing.md b/docs/src/contributing.md
index 9f0c262..9bd2991 100644
--- a/docs/src/contributing.md
+++ b/docs/src/contributing.md
@@ -1,7 +1,95 @@
# Contributing
-Development work targets the `dev` branch. Open a pull request from `dev` to
-`main` for stable changes, and merge it with a merge commit.
+## What is currently implemented
+
+CorrectionFactorMatrixMethod.jl provides a matrix-free BEM framework for
+**three-dimensional** problems. The following is in place:
+
+- **Core machinery**: correction-factor assembly driven by an `H2Trees.BlockTree`,
+ sparse near-field correction via `BlockSparseMatrices.jl`, and a
+ `LinearMaps.jl`-compatible `PetrovGalerkinCFMM` operator supporting forward,
+ transpose, and adjoint products.
+- **BEAST extension** (`CFMMBEAST`): quadrature, collocation, and corrected-kernel
+ assembly for all BEAST `IntegralOperator` types; specialisations for
+ Helmholtz 3D (V, K, K', W) with Lagrange C0D1 basis functions and Maxwell 3D
+ (T/EFIE, K/MFIE) with Raviart–Thomas basis functions.
+- **ExaFMMt extension** (`CFMMExaFMMt`): operator-parameter mapping to
+ `LaplaceFMMOptions`, `ModifiedHelmholtzFMMOptions`, and `HelmholtzFMMOptions`;
+ Helmholtz operators with zero wavenumber automatically reduce to the Laplace
+ path.
+
+For a complete list of tested operator–basis combinations see the
+[Supported Operators](@ref) page.
+
+## What could be added
+
+Contributions are welcome in any of the following areas:
+
+### Additional FMM backends
+
+The `FMMFunctor` interface is designed to be extended. Adding a new FMM
+library requires implementing:
+
+- `CorrectionFactorMatrixMethod.setup(spoints, tpoints, options)` — set up the
+ FMM from source and target point matrices.
+- `CorrectionFactorMatrixMethod.fmmresult(fmm, x)` — evaluate the FMM
+ map for a given input vector.
+
+Potential targets include:
+
+- **A native Julia FMM**: A pure-Julia implementation would remove the binary
+ dependency on ExaFMMt and simplify installation, particularly on HPC
+ systems.
+- **FMMLIB2D / FMMLIB3D**: The Fortran-based FMM libraries wrapped for Julia
+ could serve as an alternative backend.
+- **GPU-accelerated FMMs**: An extension that drives a GPU FMM (e.g. via CUDA)
+ would be a natural fit for the GPU near-field assembler already used for
+ BEAST.
+
+### Two-dimensional operator support
+
+The current collocation and operator implementations target 3D surfaces only.
+Extending to 2D would require:
+
+- A 2D `sources` / `potentials` implementation for 1D boundary curves.
+- Operators for the 2D Helmholtz and Laplace kernels
+ (``G(\boldsymbol{x},\boldsymbol{y}) = \tfrac{i}{4} H_0^{(1)}(k|\boldsymbol{x}-\boldsymbol{y}|)``).
+- A 2D-capable FMM backend (e.g. FMMLIB2D).
+
+### Additional BEM library integrations
+
+The `CFMMBEAST` extension can serve as a blueprint for integrating other
+Julia BEM libraries. Any library that can provide quadrature data and
+block assemblers in the same style can be added as a new extension.
+
+### Further operator–basis combinations
+
+Some operator–basis pairings (e.g. Helmholtz operators with
+Raviart–Thomas basis functions, or Maxwell operators with Lagrange
+basis functions for mixed formulations) are architecturally supported but not
+yet tested. Contributions that add and verify such combinations are welcome.
+
+## Regenerating documentation plots
+
+The interactive plots on the Examples page are pre-rendered HTML files stored
+in `docs/src/assets/examples/` and committed to the repository. The CI build
+only serves these static files; it does not re-run the examples.
+
+After changing any file in `examples/`, regenerate the plots from the
+repository root:
+
+```sh
+julia --startup-file=no docs/render_examples.jl
+```
+
+Then commit the updated HTML files alongside your example changes. Running the
+test suite locally will emit a `@warn` if the HTML files are older than the
+example scripts, so you will not accidentally forget this step.
+
+## Development workflow
+
+Development targets the `dev` branch. Open a pull request from `dev` to
+`main` for stable releases and merge with a merge commit.
Run the package checks locally with:
@@ -20,4 +108,5 @@ include("docs/make.jl")
```
Code must pass the formatter, Aqua, JET, and ExplicitImports checks included in
-the test suite.
+the test suite. The formatter is configured with the `blue` style at a column
+margin of 92.
diff --git a/docs/src/details/method.md b/docs/src/details/method.md
index 38dfc24..b42a219 100644
--- a/docs/src/details/method.md
+++ b/docs/src/details/method.md
@@ -6,8 +6,8 @@ the boundary-element quadrature and corrected for the interactions already
represented by the FMM:
```math
-A x \approx A_{\mathrm{FMM}}x +
-\left(A_{\mathrm{near}} - A_{\mathrm{FMM,near}}\right)x.
+\boldsymbol{A}\boldsymbol{x} \approx \boldsymbol{A}_{\mathrm{FMM}}\boldsymbol{x} +
+\left(\boldsymbol{A}_{\mathrm{near}} - \boldsymbol{A}_{\mathrm{FMM,near}}\right)\boldsymbol{x}.
```
The sparse correction blocks are selected from an `H2Trees.BlockTree`.
diff --git a/docs/src/details/operators.md b/docs/src/details/operators.md
new file mode 100644
index 0000000..43f4426
--- /dev/null
+++ b/docs/src/details/operators.md
@@ -0,0 +1,69 @@
+# Supported Operators
+
+All operators currently implemented target **three-dimensional** problems.
+Two-dimensional support is a planned future extension.
+
+The CFMM wrapper is constructed via [`CFMM.assemble`](@ref) (or the lower-level
+[`PetrovGalerkinCFMM`](@ref)) once the `CFMMBEAST` and `CFMMExaFMMt` extensions
+are loaded.
+
+## Helmholtz 3D (scalar)
+
+These operators act on scalar basis functions.
+The current implementation supports **Lagrange C0D1** (`lagrangec0d1`) basis
+functions on triangulated surfaces.
+
+The Helmholtz Green's function is
+
+```math
+G(\boldsymbol{x},\boldsymbol{y}) = \frac{e^{ik|\boldsymbol{x}-\boldsymbol{y}|}}{4\pi|\boldsymbol{x}-\boldsymbol{y}|},
+\quad k \in \mathbb{C}.
+```
+
+Setting `wavenumber = 0` recovers the Laplace Green's function
+``G_0(\boldsymbol{x},\boldsymbol{y}) = 1/(4\pi|\boldsymbol{x}-\boldsymbol{y}|)``; the ExaFMMt backend
+automatically switches to `LaplaceFMMOptions` in that case.
+
+| Operator | BEAST constructor | Mathematical form |
+|:---------|:------------------|:------------------|
+| Single-layer (V) | `Helmholtz3D.singlelayer(; wavenumber)` | ``(V u)(\boldsymbol{x}) = \int_\Gamma G(\boldsymbol{x},\boldsymbol{y})\,u(\boldsymbol{y})\,\mathrm{d}S(\boldsymbol{y})`` |
+| Double-layer (K) | `Helmholtz3D.doublelayer(; wavenumber)` | ``(K u)(\boldsymbol{x}) = \int_\Gamma \partial_{\boldsymbol{n}(\boldsymbol{y})} G(\boldsymbol{x},\boldsymbol{y})\,u(\boldsymbol{y})\,\mathrm{d}S(\boldsymbol{y})`` |
+| Transposed double-layer (K') | `Helmholtz3D.doublelayer_transposed(; wavenumber)` | ``(K' u)(\boldsymbol{x}) = \int_\Gamma \partial_{\boldsymbol{n}(\boldsymbol{x})} G(\boldsymbol{x},\boldsymbol{y})\,u(\boldsymbol{y})\,\mathrm{d}S(\boldsymbol{y})`` |
+| Hypersingular (W) | `Helmholtz3D.hypersingular(; wavenumber)` | ``(W u)(\boldsymbol{x}) = -\partial_{\boldsymbol{n}(\boldsymbol{x})} \int_\Gamma \partial_{\boldsymbol{n}(\boldsymbol{y})} G(\boldsymbol{x},\boldsymbol{y})\,u(\boldsymbol{y})\,\mathrm{d}S(\boldsymbol{y})`` |
+
+All four operators are tested with `lagrangec0d1` basis functions (Petrov–Galerkin,
+square systems). Other scalar basis function types may work but are not
+currently verified.
+
+## Maxwell 3D (vector)
+
+These operators act on vector basis functions.
+The current implementation supports **Raviart–Thomas** (`raviartthomas`) basis
+functions on triangulated surfaces.
+
+| Operator | BEAST constructor | Mathematical form |
+|:---------|:------------------|:------------------|
+| Single-layer / EFIE (T) | `Maxwell3D.singlelayer(; wavenumber)` | ``(\mathcal{T}\boldsymbol{u})(\boldsymbol{x}) = \alpha\!\int_\Gamma G\,\boldsymbol{u}\,\mathrm{d}S + \beta\,\nabla\!\int_\Gamma G\,\nabla_\Gamma\!\cdot\boldsymbol{u}\,\mathrm{d}S`` |
+| Double-layer / MFIE (K) | `Maxwell3D.doublelayer(; wavenumber)` | ``(\mathcal{K}\boldsymbol{u})(\boldsymbol{x}) = \int_\Gamma \nabla G(\boldsymbol{x},\boldsymbol{y})\times\boldsymbol{u}(\boldsymbol{y})\,\mathrm{d}S(\boldsymbol{y})`` |
+
+Both operators are tested with `raviartthomas` basis functions (Petrov–Galerkin,
+square systems).
+
+## Tested basis-function / operator combinations
+
+The table below summarises which combinations are covered by the automated
+test suite. A ✓ means the forward product, the transpose, and the adjoint
+are all verified against a dense BEAST assembly.
+
+| Operator | `lagrangec0d1` | `raviartthomas` |
+|:---------|:--------------:|:---------------:|
+| `Helmholtz3D.singlelayer` | ✓ | — |
+| `Helmholtz3D.doublelayer` | ✓ | — |
+| `Helmholtz3D.doublelayer_transposed` | ✓ | — |
+| `Helmholtz3D.hypersingular` | ✓ | — |
+| `Maxwell3D.singlelayer` | — | ✓ |
+| `Maxwell3D.doublelayer` | — | ✓ |
+
+Combinations marked — are not supported by the current operator
+implementation (the scalar Helmholtz operators require scalar basis functions;
+the vector Maxwell operators require vector basis functions).
diff --git a/docs/src/manual/examples.md b/docs/src/manual/examples.md
index 9b84c2b..fe4b135 100644
--- a/docs/src/manual/examples.md
+++ b/docs/src/manual/examples.md
@@ -36,16 +36,26 @@ space = raviartthomas(mesh)
wavenumber = 1.0
operator = Maxwell3D.singlelayer(; wavenumber)
excitation = Maxwell3D.planewave(;
- direction=ẑ, polarization=x̂, wavenumber
+ direction=ẑ, polarization=x̂, wavenumber
)
rhs = assemble((n × excitation) × n, space)
-matrix = CFMM.assemble(operator, space)
+matrix = CFMM.assemble(operator, space, space)
current, stats = Krylov.gmres(
matrix, rhs; rtol=1.0e-4, itmax=200, history=true, verbose=1
)
```
+Far-field pattern (top left), scattered electric field magnitude in the ``yz``
+plane (top right), and surface-current magnitude (bottom):
+
+```@raw html
+
+```
+
The complete runnable example, including the plots, is in
`examples/efie.jl`.
@@ -67,7 +77,7 @@ wavenumber = frequency * √(permittivity * permeability)
operator = Maxwell3D.doublelayer(; wavenumber)
excitation = Maxwell3D.planewave(;
- direction=ẑ, polarization=x̂, wavenumber
+ direction=ẑ, polarization=x̂, wavenumber
)
magneticfield = -1 / (im * permeability * frequency) * curl(excitation)
rhs = assemble((n × magneticfield) × n, testspace)
@@ -80,5 +90,15 @@ current, stats = Krylov.gmres(
)
```
+Far-field pattern (top left), scattered electric field magnitude in the ``yz``
+plane (top right), and surface-current magnitude (bottom):
+
+```@raw html
+
+```
+
The complete runnable example, including the plots, is in
`examples/mfie.jl`.
diff --git a/examples/Manifest.toml b/examples/Manifest.toml
new file mode 100644
index 0000000..f0887cb
--- /dev/null
+++ b/examples/Manifest.toml
@@ -0,0 +1,1524 @@
+# This file is machine-generated - editing it directly is not advised
+
+julia_version = "1.12.6"
+manifest_format = "2.0"
+project_hash = "2c93076334f39792b022990275c95d8c2a013e46"
+
+[[deps.AbstractFFTs]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef"
+uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c"
+version = "1.5.0"
+
+ [deps.AbstractFFTs.extensions]
+ AbstractFFTsChainRulesCoreExt = "ChainRulesCore"
+ AbstractFFTsTestExt = "Test"
+
+ [deps.AbstractFFTs.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
+
+[[deps.AbstractTrees]]
+git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177"
+uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"
+version = "0.4.5"
+
+[[deps.Accessors]]
+deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"]
+git-tree-sha1 = "7063ad1083578215c7c4bf410368150abe8d5524"
+uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"
+version = "0.1.45"
+
+ [deps.Accessors.extensions]
+ AxisKeysExt = "AxisKeys"
+ IntervalSetsExt = "IntervalSets"
+ LinearAlgebraExt = "LinearAlgebra"
+ StaticArraysExt = "StaticArrays"
+ StructArraysExt = "StructArrays"
+ TestExt = "Test"
+ UnitfulExt = "Unitful"
+
+ [deps.Accessors.weakdeps]
+ AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5"
+ IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
+ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+ StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
+ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
+ Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
+
+[[deps.ArgTools]]
+uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f"
+version = "1.1.2"
+
+[[deps.ArnoldiMethod]]
+deps = ["LinearAlgebra", "Random", "StaticArrays"]
+git-tree-sha1 = "d57bd3762d308bded22c3b82d033bff85f6195c6"
+uuid = "ec485272-7323-5ecc-a04f-4719b315124d"
+version = "0.4.0"
+
+[[deps.ArrayLayouts]]
+deps = ["FillArrays", "LinearAlgebra", "StaticArrays"]
+git-tree-sha1 = "e0b47732a192dd59b9d079a06d04235e2f833963"
+uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
+version = "1.12.2"
+weakdeps = ["SparseArrays"]
+
+ [deps.ArrayLayouts.extensions]
+ ArrayLayoutsSparseArraysExt = "SparseArrays"
+
+[[deps.Artifacts]]
+uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"
+version = "1.11.0"
+
+[[deps.AssetRegistry]]
+deps = ["JSON", "Pidfile", "SHA"]
+git-tree-sha1 = "902b85010203830d4bc02259f5450d2e16b316d8"
+uuid = "bf4720bc-e11a-5d0c-854e-bdca1663c893"
+version = "0.1.1"
+
+[[deps.BEAST]]
+deps = ["AbstractTrees", "BlockArrays", "CollisionDetection", "Combinatorics", "CompScienceMeshes", "Compat", "ConvolutionOperators", "Distributed", "ExtendableSparse", "FFTW", "FastGaussQuadrature", "FillArrays", "GraphsColoring", "Infiltrator", "InteractiveUtils", "IterativeSolvers", "Krylov", "LiftedMaps", "LinearAlgebra", "LinearMaps", "NestedUnitRanges", "OhMyThreads", "ProgressMeter", "Requires", "SauterSchwab3D", "SauterSchwabQuadrature", "SharedArrays", "SparseArrays", "SpecialFunctions", "StaticArrays", "Suppressor", "TestItems", "WiltonInts84"]
+git-tree-sha1 = "32b6bd07ccafda486cbeb5cb593604a203902d0f"
+uuid = "bb4162c7-ba94-5a20-af32-d8ec4428bdd1"
+version = "2.10.0"
+weakdeps = ["PlotlyBase"]
+
+ [deps.BEAST.extensions]
+ PlotlyBaseExt = ["PlotlyBase"]
+
+[[deps.BangBang]]
+deps = ["Accessors", "ConstructionBase", "InitialValues", "LinearAlgebra"]
+git-tree-sha1 = "cceb62468025be98d42a5dc581b163c20896b040"
+uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66"
+version = "0.4.9"
+
+ [deps.BangBang.extensions]
+ BangBangChainRulesCoreExt = "ChainRulesCore"
+ BangBangDataFramesExt = "DataFrames"
+ BangBangStaticArraysExt = "StaticArrays"
+ BangBangStructArraysExt = "StructArrays"
+ BangBangTablesExt = "Tables"
+ BangBangTypedTablesExt = "TypedTables"
+
+ [deps.BangBang.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+ StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
+ Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
+ TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9"
+
+[[deps.Base64]]
+uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
+version = "1.11.0"
+
+[[deps.BitFlags]]
+git-tree-sha1 = "bbe1079eecf9c9fbb52765193ad2bae27ae09bc8"
+uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35"
+version = "0.1.10"
+
+[[deps.Blink]]
+deps = ["Base64", "Distributed", "HTTP", "JSExpr", "JSON", "Lazy", "Logging", "MacroTools", "Mustache", "Mux", "Pkg", "Reexport", "Sockets", "WebIO"]
+git-tree-sha1 = "bc93511973d1f949d45b0ea17878e6cb0ad484a1"
+uuid = "ad839575-38b3-5650-b840-f874b8c74a25"
+version = "0.12.9"
+
+[[deps.BlockArrays]]
+deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra"]
+git-tree-sha1 = "8aa3a63ca1da72b5282db3017e14b33faed9ce97"
+uuid = "8e7c35d0-a365-5155-bbbb-fb81a777f24e"
+version = "1.9.4"
+
+ [deps.BlockArrays.extensions]
+ BlockArraysAdaptExt = "Adapt"
+ BlockArraysBandedMatricesExt = "BandedMatrices"
+
+ [deps.BlockArrays.weakdeps]
+ Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
+ BandedMatrices = "aae01518-5342-5314-be14-df237901396f"
+
+[[deps.BlockSparseMatrices]]
+deps = ["Graphs", "GraphsColoring", "LinearAlgebra", "LinearMaps", "OhMyThreads", "SparseArrays"]
+git-tree-sha1 = "dc6c3beba79e7468ce87d39f46bf8125ba4d2d30"
+uuid = "1ef78180-cc57-4e70-b6ec-c3e471307147"
+version = "0.3.1"
+
+ [deps.BlockSparseMatrices.extensions]
+ BlockUnicodePlots = ["UnicodePlots"]
+
+ [deps.BlockSparseMatrices.weakdeps]
+ UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228"
+
+[[deps.BoundingSphere]]
+deps = ["InteractiveUtils", "LinearAlgebra", "Random", "Statistics"]
+git-tree-sha1 = "9f45d48e55111126a87a8aea1ddffe9ac2e3fbc3"
+uuid = "747eb165-47b8-53f2-ad32-9704a7dfc50a"
+version = "0.2.0"
+
+[[deps.Bzip2_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e"
+uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0"
+version = "1.0.9+0"
+
+[[deps.Cairo_jll]]
+deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"]
+git-tree-sha1 = "1fa950ebc3e37eccd51c6a8fe1f92f7d86263522"
+uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a"
+version = "1.18.7+0"
+
+[[deps.ChunkSplitters]]
+git-tree-sha1 = "1c52c8e2673edc030191177ff1aee42d25149acb"
+uuid = "ae650224-84b6-46f8-82ea-d812ca08434e"
+version = "3.2.0"
+
+[[deps.ClusterTrees]]
+deps = ["DelimitedFiles", "LinearAlgebra", "Pkg"]
+git-tree-sha1 = "4114d60c95974edf9272d88571d14abeed598942"
+uuid = "5100927d-02aa-593a-b4f9-7235df19f0db"
+version = "0.2.1"
+
+[[deps.CodecZlib]]
+deps = ["TranscodingStreams", "Zlib_jll"]
+git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9"
+uuid = "944b1d66-785c-5afd-91f1-9de20f533193"
+version = "0.7.8"
+
+[[deps.CollisionDetection]]
+deps = ["Compat", "LinearAlgebra", "StaticArrays"]
+git-tree-sha1 = "4af0e30f357fab30313c87b631b095de2e7d42b1"
+uuid = "2b5bf9a6-f3f8-5352-af9c-82bb4af718d8"
+version = "0.1.8"
+
+[[deps.ColorSchemes]]
+deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"]
+git-tree-sha1 = "b0fd3f56fa442f81e0a47815c92245acfaaa4e34"
+uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4"
+version = "3.31.0"
+
+[[deps.ColorTypes]]
+deps = ["FixedPointNumbers", "Random"]
+git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe"
+uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f"
+version = "0.12.1"
+weakdeps = ["StyledStrings"]
+
+ [deps.ColorTypes.extensions]
+ StyledStringsExt = "StyledStrings"
+
+[[deps.ColorVectorSpace]]
+deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"]
+git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1"
+uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4"
+version = "0.11.0"
+weakdeps = ["SpecialFunctions"]
+
+ [deps.ColorVectorSpace.extensions]
+ SpecialFunctionsExt = "SpecialFunctions"
+
+[[deps.Colors]]
+deps = ["ColorTypes", "FixedPointNumbers", "Reexport"]
+git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74"
+uuid = "5ae59095-9a9b-59fe-a467-6f913c188581"
+version = "0.13.1"
+
+[[deps.Combinatorics]]
+git-tree-sha1 = "c761b00e7755700f9cdf5b02039939d1359330e1"
+uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa"
+version = "1.1.0"
+
+[[deps.CompScienceMeshes]]
+deps = ["ClusterTrees", "CollisionDetection", "Combinatorics", "Compat", "DataStructures", "DelimitedFiles", "FastGaussQuadrature", "Gmsh", "GmshTools", "LinearAlgebra", "Permutations", "Requires", "SparseArrays", "StaticArrays", "TestItems"]
+git-tree-sha1 = "24009979f0c51bb4bca8a79c9881a40b1821208e"
+uuid = "3e66a162-7b8c-5da0-b8f8-124ecd2c3ae1"
+version = "0.11.0"
+
+[[deps.Compat]]
+deps = ["TOML", "UUIDs"]
+git-tree-sha1 = "9d8a54ce4b17aa5bdce0ea5c34bc5e7c340d16ad"
+uuid = "34da2185-b29b-5c13-b0c7-acf172513d20"
+version = "4.18.1"
+weakdeps = ["Dates", "LinearAlgebra"]
+
+ [deps.Compat.extensions]
+ CompatLinearAlgebraExt = "LinearAlgebra"
+
+[[deps.CompilerSupportLibraries_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae"
+version = "1.3.0+1"
+
+[[deps.CompositionsBase]]
+git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad"
+uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b"
+version = "0.1.2"
+weakdeps = ["InverseFunctions"]
+
+ [deps.CompositionsBase.extensions]
+ CompositionsBaseInverseFunctionsExt = "InverseFunctions"
+
+[[deps.ConcurrentUtilities]]
+deps = ["Serialization", "Sockets"]
+git-tree-sha1 = "21d088c496ea22914fe80906eb5bce65755e5ec8"
+uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb"
+version = "2.5.1"
+
+[[deps.ConstructionBase]]
+git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb"
+uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
+version = "1.6.0"
+
+ [deps.ConstructionBase.extensions]
+ ConstructionBaseIntervalSetsExt = "IntervalSets"
+ ConstructionBaseLinearAlgebraExt = "LinearAlgebra"
+ ConstructionBaseStaticArraysExt = "StaticArrays"
+
+ [deps.ConstructionBase.weakdeps]
+ IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
+ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+
+[[deps.ConvolutionOperators]]
+deps = ["LinearAlgebra", "LinearMaps"]
+git-tree-sha1 = "ae44e38013c05c7ec59f428b4ea7ad7d34926b63"
+uuid = "15927181-a1bb-497c-b745-8dbf505c019d"
+version = "0.4.1"
+
+[[deps.CorrectionFactorMatrixMethod]]
+deps = ["BlockSparseMatrices", "H2Trees", "LinearAlgebra", "LinearMaps", "MKL", "OhMyThreads", "SparseArrays"]
+path = "/home/jt286/.julia/dev/CorrectionFactorMatrixMethod/docs/.."
+uuid = "1b32fdd5-07c8-465a-bf7d-415ac82a78be"
+version = "0.1.0"
+weakdeps = ["BEAST", "CompScienceMeshes", "ExaFMMt"]
+
+ [deps.CorrectionFactorMatrixMethod.extensions]
+ CFMMBEAST = ["BEAST", "CompScienceMeshes"]
+ CFMMExaFMMt = ["ExaFMMt", "BEAST"]
+
+[[deps.DataAPI]]
+git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe"
+uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a"
+version = "1.16.0"
+
+[[deps.DataStructures]]
+deps = ["OrderedCollections"]
+git-tree-sha1 = "6fb53a69613a0b2b68a0d12671717d307ab8b24e"
+uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
+version = "0.19.5"
+
+[[deps.DataValueInterfaces]]
+git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6"
+uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464"
+version = "1.0.0"
+
+[[deps.Dates]]
+deps = ["Printf"]
+uuid = "ade2ca70-3891-5945-98fb-dc099432e06a"
+version = "1.11.0"
+
+[[deps.DelimitedFiles]]
+deps = ["Mmap"]
+git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae"
+uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab"
+version = "1.9.1"
+
+[[deps.Distributed]]
+deps = ["Random", "Serialization", "Sockets"]
+uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b"
+version = "1.11.0"
+
+[[deps.DocStringExtensions]]
+git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c"
+uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
+version = "0.9.5"
+
+[[deps.Downloads]]
+deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"]
+uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6"
+version = "1.7.0"
+
+[[deps.ExaFMMt]]
+deps = ["Exafmmt_jll", "LinearAlgebra", "LinearMaps"]
+git-tree-sha1 = "18262aa2d00ee10477a4b9901bf37bbfa983035b"
+uuid = "add1291b-d076-47cc-8667-64576de04ee0"
+version = "0.1.2"
+
+[[deps.Exafmmt_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "FFTW_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl", "Pkg", "libblastrampoline_jll"]
+git-tree-sha1 = "9115c47d970a73fd080ffd99a9212f7650d51370"
+uuid = "eacd9ca4-7f43-55e5-94d9-9be91740ea79"
+version = "0.1.1+0"
+
+[[deps.ExceptionUnwrapping]]
+deps = ["Test"]
+git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a"
+uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4"
+version = "0.1.11"
+
+[[deps.Expat_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "c307cd83373868391f3ac30b41530bc5d5d05d08"
+uuid = "2e619515-83b5-522b-bb60-26c02a35a201"
+version = "2.8.1+0"
+
+[[deps.ExtendableSparse]]
+deps = ["DocStringExtensions", "ILUZero", "LinearAlgebra", "Printf", "SciMLPublic", "SparseArrays", "Sparspak", "StaticArrays"]
+git-tree-sha1 = "8528367ecb8eeb91f5564815226fd0e7123525c7"
+uuid = "95c220a8-a1cf-11e9-0c77-dbfce5f500b3"
+version = "2.3.0"
+
+ [deps.ExtendableSparse.extensions]
+ ExtendableSparseIncompleteLUExt = "IncompleteLU"
+ ExtendableSparseLinearSolveExt = "LinearSolve"
+
+ [deps.ExtendableSparse.weakdeps]
+ IncompleteLU = "40713840-3770-5561-ab4c-a76e7d0d7895"
+ LinearSolve = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae"
+
+[[deps.FFTW]]
+deps = ["AbstractFFTs", "FFTW_jll", "Libdl", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"]
+git-tree-sha1 = "97f08406df914023af55ade2f843c39e99c5d969"
+uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341"
+version = "1.10.0"
+
+[[deps.FFTW_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "6866aec60ef98e3164cd8d6855225684207e9dff"
+uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a"
+version = "3.3.12+0"
+
+[[deps.FLTK_jll]]
+deps = ["Artifacts", "Fontconfig_jll", "FreeType2_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll", "Xorg_libXfixes_jll", "Xorg_libXft_jll", "Xorg_libXinerama_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"]
+git-tree-sha1 = "72a4842f93e734f378cf381dae2ca4542f019d23"
+uuid = "4fce6fc7-ba6a-5f4c-898f-77e99806d6f8"
+version = "1.3.8+0"
+
+[[deps.FastGaussQuadrature]]
+deps = ["LinearAlgebra", "SpecialFunctions", "StaticArrays"]
+git-tree-sha1 = "4916117dd032ec5959b7633aedbbac408ca5ddeb"
+uuid = "442a2c76-b920-505d-bb47-c5924d526838"
+version = "1.3.0"
+
+[[deps.FileWatching]]
+uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee"
+version = "1.11.0"
+
+[[deps.FillArrays]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "2f979084d1e13948a3352cf64a25df6bd3b4dca3"
+uuid = "1a297f60-69ca-5386-bcde-b61e274b549b"
+version = "1.16.0"
+
+ [deps.FillArrays.extensions]
+ FillArraysPDMatsExt = "PDMats"
+ FillArraysSparseArraysExt = "SparseArrays"
+ FillArraysStaticArraysExt = "StaticArrays"
+ FillArraysStatisticsExt = "Statistics"
+
+ [deps.FillArrays.weakdeps]
+ PDMats = "90014a1f-27ba-587c-ab20-58faa44d9150"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+ Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
+
+[[deps.FixedPointNumbers]]
+deps = ["Random", "Statistics"]
+git-tree-sha1 = "59af96b98217c6ef4ae0dfe065ac7c20831d1a84"
+uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93"
+version = "0.8.6"
+
+[[deps.Fontconfig_jll]]
+deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"]
+git-tree-sha1 = "f85dac9a96a01087df6e3a749840015a0ca3817d"
+uuid = "a3f928ae-7b40-5064-980b-68af3947d34b"
+version = "2.17.1+0"
+
+[[deps.FreeType2_jll]]
+deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"]
+git-tree-sha1 = "70329abc09b886fd2c5d94ad2d9527639c421e3e"
+uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7"
+version = "2.14.3+1"
+
+[[deps.FunctionalCollections]]
+deps = ["Test"]
+git-tree-sha1 = "04cb9cfaa6ba5311973994fe3496ddec19b6292a"
+uuid = "de31a74c-ac4f-5751-b3fd-e18cd04993ca"
+version = "0.5.0"
+
+[[deps.GLU_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg"]
+git-tree-sha1 = "65af046f4221e27fb79b28b6ca89dd1d12bc5ec7"
+uuid = "bd17208b-e95e-5925-bf81-e2f59b3e5c61"
+version = "9.0.1+0"
+
+[[deps.GMP_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "781609d7-10c4-51f6-84f2-b8444358ff6d"
+version = "6.3.0+2"
+
+[[deps.GettextRuntime_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll"]
+git-tree-sha1 = "45288942190db7c5f760f59c04495064eedf9340"
+uuid = "b0724c58-0f36-5564-988d-3bb0596ebc4a"
+version = "0.22.4+0"
+
+[[deps.Glib_jll]]
+deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"]
+git-tree-sha1 = "24f6def62397474a297bfcec22384101609142ed"
+uuid = "7746bdde-850d-59dc-9ae8-88ece973131d"
+version = "2.86.3+0"
+
+[[deps.Gmsh]]
+deps = ["gmsh_jll"]
+git-tree-sha1 = "6d815101e62722f4e323514c9fc704007d4da2e3"
+uuid = "705231aa-382f-11e9-3f0c-b7cb4346fdeb"
+version = "0.3.1"
+
+[[deps.GmshTools]]
+deps = ["Libdl", "gmsh_jll"]
+git-tree-sha1 = "299aa66053646db77f8aa7fafcebe0f9e5c0d1dc"
+uuid = "82e2f556-b1bd-5f1a-9576-f93c0da5f0ee"
+version = "0.5.2"
+
+[[deps.Graphs]]
+deps = ["ArnoldiMethod", "DataStructures", "Inflate", "LinearAlgebra", "Random", "SimpleTraits", "SparseArrays", "Statistics"]
+git-tree-sha1 = "7eb45fe833a5b7c51cf6d89c5a841d5967e44be3"
+uuid = "86223c79-3864-5bf0-83f7-82e725a168b6"
+version = "1.14.0"
+weakdeps = ["Distributed", "SharedArrays"]
+
+ [deps.Graphs.extensions]
+ GraphsSharedArraysExt = "SharedArrays"
+
+[[deps.GraphsColoring]]
+deps = ["DataStructures", "SparseArrays"]
+git-tree-sha1 = "4aad683dd8f0ad4073572c7214c6812456fdf797"
+uuid = "ed38bb8a-6120-4024-8d1e-8789784f251b"
+version = "0.2.0"
+weakdeps = ["Graphs"]
+
+ [deps.GraphsColoring.extensions]
+ GraphsColoringGraphs = ["Graphs"]
+
+[[deps.GrundmannMoeller]]
+deps = ["LinearAlgebra", "StaticArrays", "Test"]
+git-tree-sha1 = "e264cf5f081091e4af712a911d3b620567c565e3"
+uuid = "36aa67b7-9d79-4e90-bbc0-05abd90a007e"
+version = "0.1.2"
+
+[[deps.H2Trees]]
+deps = ["BoundingSphere", "Graphs", "LinearAlgebra", "StaticArrays"]
+git-tree-sha1 = "1dbb13138ced81aaf187b4c71ace92a274264316"
+uuid = "9db26ae3-82ff-4374-85e9-9ed87405fd16"
+version = "0.3.0"
+
+ [deps.H2Trees.extensions]
+ H2BEASTTrees = ["BEAST"]
+ H2MetisTrees = ["Metis"]
+ H2ParallelKMeansTrees = ["ParallelKMeans"]
+ H2PlotlyJSTrees = "PlotlyJS"
+
+ [deps.H2Trees.weakdeps]
+ BEAST = "bb4162c7-ba94-5a20-af32-d8ec4428bdd1"
+ CompScienceMeshes = "3e66a162-7b8c-5da0-b8f8-124ecd2c3ae1"
+ Metis = "2679e427-3c69-5b7f-982b-ece356f1e94b"
+ NURBS = "dde13934-061e-461b-aa91-2c0fad390a0d"
+ ParallelKMeans = "42b8e9d4-006b-409a-8472-7f34b3fb58af"
+ PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a"
+
+[[deps.HDF5_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "MPIABI_jll", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "aws_c_s3_jll", "dlfcn_win32_jll", "libaec_jll", "mpif_jll"]
+git-tree-sha1 = "45337643a2d97262d5fe72ce1f13e8a662d13d62"
+uuid = "0234f1f7-429e-5d53-9886-15a909be8d59"
+version = "2.1.2+0"
+
+[[deps.HTTP]]
+deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"]
+git-tree-sha1 = "51059d23c8bb67911a2e6fd5130229113735fc7e"
+uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3"
+version = "1.11.0"
+
+[[deps.HashArrayMappedTries]]
+git-tree-sha1 = "2eaa69a7cab70a52b9687c8bf950a5a93ec895ae"
+uuid = "076d061b-32b6-4027-95e0-9a2c6f6d7e74"
+version = "0.2.0"
+
+[[deps.Hiccup]]
+deps = ["MacroTools", "Test"]
+git-tree-sha1 = "6187bb2d5fcbb2007c39e7ac53308b0d371124bd"
+uuid = "9fb69e20-1954-56bb-a84f-559cc56a8ff7"
+version = "0.2.2"
+
+[[deps.Hwloc_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "XML2_jll", "Xorg_libpciaccess_jll"]
+git-tree-sha1 = "c35847ca5b4997fc8418836354a56c459bcf48d8"
+uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8"
+version = "2.14.0+0"
+
+[[deps.ILUZero]]
+deps = ["LinearAlgebra", "SparseArrays"]
+git-tree-sha1 = "b007cfc7f9bee9a958992d2301e9c5b63f332a90"
+uuid = "88f59080-6952-5380-9ea5-54057fb9a43f"
+version = "0.2.0"
+
+[[deps.Infiltrator]]
+deps = ["InteractiveUtils", "Markdown", "REPL", "UUIDs"]
+git-tree-sha1 = "0330ef9ac27dc069bf97fa5ab1a4391be4fcc4f6"
+uuid = "5903a43b-9cc3-4c30-8d17-598619ec4e9b"
+version = "1.9.11"
+
+[[deps.Inflate]]
+git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d"
+uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9"
+version = "0.1.5"
+
+[[deps.InitialValues]]
+git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3"
+uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c"
+version = "0.3.1"
+
+[[deps.IntelOpenMP_jll]]
+deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"]
+git-tree-sha1 = "ec1debd61c300961f98064cfb21287613ad7f303"
+uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0"
+version = "2025.2.0+0"
+
+[[deps.InteractiveUtils]]
+deps = ["Markdown"]
+uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240"
+version = "1.11.0"
+
+[[deps.InverseFunctions]]
+git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb"
+uuid = "3587e190-3f89-42d0-90ee-14403ec27112"
+version = "0.1.17"
+weakdeps = ["Dates", "Test"]
+
+ [deps.InverseFunctions.extensions]
+ InverseFunctionsDatesExt = "Dates"
+ InverseFunctionsTestExt = "Test"
+
+[[deps.IrrationalConstants]]
+git-tree-sha1 = "b2d91fe939cae05960e760110b328288867b5758"
+uuid = "92d709cd-6900-40b7-9082-c6be49f344b6"
+version = "0.2.6"
+
+[[deps.IterativeSolvers]]
+deps = ["LinearAlgebra", "Printf", "Random", "RecipesBase", "SparseArrays"]
+git-tree-sha1 = "59545b0a2b27208b0650df0a46b8e3019f85055b"
+uuid = "42fd0dbc-a981-5370-80f2-aaf504508153"
+version = "0.9.4"
+
+[[deps.IteratorInterfaceExtensions]]
+git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856"
+uuid = "82899510-4779-5014-852e-03e436cf321d"
+version = "1.0.0"
+
+[[deps.JLLWrappers]]
+deps = ["Artifacts", "Preferences"]
+git-tree-sha1 = "7204148362dafe5fe6a273f855b8ccbe4df8173e"
+uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210"
+version = "1.8.0"
+
+[[deps.JSExpr]]
+deps = ["JSON", "MacroTools", "Observables", "WebIO"]
+git-tree-sha1 = "b413a73785b98474d8af24fd4c8a975e31df3658"
+uuid = "97c1335a-c9c5-57fe-bc5d-ec35cebe8660"
+version = "0.5.4"
+
+[[deps.JSON]]
+deps = ["Dates", "Mmap", "Parsers", "Unicode"]
+git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a"
+uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
+version = "0.21.4"
+
+[[deps.JpegTurbo_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "c0c9b76f3520863909825cbecdef58cd63de705a"
+uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8"
+version = "3.1.5+0"
+
+[[deps.JuliaSyntaxHighlighting]]
+deps = ["StyledStrings"]
+uuid = "ac6e5ff7-fb65-4e79-a425-ec3bc9c03011"
+version = "1.12.0"
+
+[[deps.Kaleido_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "43032da5832754f58d14a91ffbe86d5f176acda9"
+uuid = "f7e6163d-2fa5-5f23-b69c-1db539e41963"
+version = "0.2.1+0"
+
+[[deps.Krylov]]
+deps = ["LinearAlgebra", "Printf", "SparseArrays"]
+git-tree-sha1 = "fc2e5bc665dfa1be33fac60b5762d462bccfae7b"
+uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7"
+version = "0.10.8"
+
+[[deps.LLVMOpenMP_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "eb62a3deb62fc6d8822c0c4bef73e4412419c5d8"
+uuid = "1d63c593-3942-5779-bab2-d838dc0a180e"
+version = "18.1.8+0"
+
+[[deps.LaTeXStrings]]
+git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c"
+uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f"
+version = "1.4.0"
+
+[[deps.Lazy]]
+deps = ["MacroTools"]
+git-tree-sha1 = "1370f8202dac30758f3c345f9909b97f53d87d3f"
+uuid = "50d2b5c4-7a5e-59d5-8109-a42b560f39c0"
+version = "0.15.1"
+
+[[deps.LazyArtifacts]]
+deps = ["Artifacts", "Pkg"]
+uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3"
+version = "1.11.0"
+
+[[deps.LibCURL]]
+deps = ["LibCURL_jll", "MozillaCACerts_jll"]
+uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21"
+version = "0.6.4"
+
+[[deps.LibCURL_jll]]
+deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll", "Zlib_jll", "nghttp2_jll"]
+uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0"
+version = "8.15.0+0"
+
+[[deps.LibGit2]]
+deps = ["LibGit2_jll", "NetworkOptions", "Printf", "SHA"]
+uuid = "76f85450-5226-5b5a-8eaa-529ad045b433"
+version = "1.11.0"
+
+[[deps.LibGit2_jll]]
+deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll"]
+uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5"
+version = "1.9.0+0"
+
+[[deps.LibSSH2_jll]]
+deps = ["Artifacts", "Libdl", "OpenSSL_jll"]
+uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8"
+version = "1.11.3+1"
+
+[[deps.Libdl]]
+uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb"
+version = "1.11.0"
+
+[[deps.Libffi_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "c8da7e6a91781c41a863611c7e966098d783c57a"
+uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490"
+version = "3.4.7+0"
+
+[[deps.Libglvnd_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"]
+git-tree-sha1 = "d36c21b9e7c172a44a10484125024495e2625ac0"
+uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29"
+version = "1.7.1+1"
+
+[[deps.Libiconv_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809"
+uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531"
+version = "1.18.0+0"
+
+[[deps.Libmount_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "cc3ad4faf30015a3e8094c9b5b7f19e85bdf2386"
+uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9"
+version = "2.42.0+0"
+
+[[deps.Libuuid_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "d620582b1f0cbe2c72dd1d5bd195a9ce73370ab1"
+uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700"
+version = "2.42.0+0"
+
+[[deps.LiftedMaps]]
+deps = ["BlockArrays", "LinearAlgebra", "LinearMaps", "TestItems"]
+git-tree-sha1 = "c281c917c5cfe380fddaefc7665116167252613e"
+uuid = "d22a30c1-52ac-4762-a8c9-5838452405e0"
+version = "0.5.2"
+
+[[deps.LinearAlgebra]]
+deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"]
+uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
+version = "1.12.0"
+
+[[deps.LinearElasticity_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "71e8ee0f9fe0e86a8f8c7f28361e5118eab2f93f"
+uuid = "18c40d15-f7cd-5a6d-bc92-87468d86c5db"
+version = "5.0.0+0"
+
+[[deps.LinearMaps]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "7f6be2e4cdaaf558623d93113d6ddade7b916209"
+uuid = "7a12625a-238d-50fd-b39a-03d52299707e"
+version = "3.11.4"
+
+ [deps.LinearMaps.extensions]
+ LinearMapsChainRulesCoreExt = "ChainRulesCore"
+ LinearMapsSparseArraysExt = "SparseArrays"
+ LinearMapsStatisticsExt = "Statistics"
+
+ [deps.LinearMaps.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+ Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
+
+[[deps.LogExpFunctions]]
+deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"]
+git-tree-sha1 = "bba2d9aa057d8f126415de240573e86a8f39d2a1"
+uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688"
+version = "1.0.1"
+
+ [deps.LogExpFunctions.extensions]
+ LogExpFunctionsChainRulesCoreExt = "ChainRulesCore"
+ LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables"
+ LogExpFunctionsInverseFunctionsExt = "InverseFunctions"
+
+ [deps.LogExpFunctions.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0"
+ InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112"
+
+[[deps.Logging]]
+uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"
+version = "1.11.0"
+
+[[deps.LoggingExtras]]
+deps = ["Dates", "Logging"]
+git-tree-sha1 = "f00544d95982ea270145636c181ceda21c4e2575"
+uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36"
+version = "1.2.0"
+
+[[deps.METIS_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "2eefa8baa858871ae7770c98c3c2a7e46daba5b4"
+uuid = "d00139f3-1899-568f-a2f0-47f597d42d70"
+version = "5.1.3+0"
+
+[[deps.MKL]]
+deps = ["Artifacts", "Libdl", "LinearAlgebra", "Logging", "MKL_jll"]
+git-tree-sha1 = "7babad0b8cb353d15ed85090342d3c63af5f6819"
+uuid = "33e6dc65-8f57-5167-99aa-e5a354878fb2"
+version = "0.9.1"
+
+[[deps.MKL_jll]]
+deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"]
+git-tree-sha1 = "282cadc186e7b2ae0eeadbd7a4dffed4196ae2aa"
+uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7"
+version = "2025.2.0+0"
+
+[[deps.MMG_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "LinearElasticity_jll", "Pkg", "SCOTCH_jll"]
+git-tree-sha1 = "70a59df96945782bb0d43b56d0fbfdf1ce2e4729"
+uuid = "86086c02-e288-5929-a127-40944b0018b7"
+version = "5.6.0+0"
+
+[[deps.MPIABI_jll]]
+deps = ["Artifacts", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"]
+git-tree-sha1 = "9be143b6045719e8fb019d2b3bc2aebad1184fef"
+uuid = "b5ada748-db0f-5fc0-8972-9331c762740c"
+version = "0.1.5+0"
+
+[[deps.MPICH_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "Libdl", "MPIPreferences", "TOML"]
+git-tree-sha1 = "07dbec8aab01696edc0151a401a6cdfe95b9b885"
+uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4"
+version = "5.0.1+0"
+
+[[deps.MPIPreferences]]
+deps = ["Libdl", "Preferences"]
+git-tree-sha1 = "8e98d5d80b87403c311fd51e8455d4546ba7a5f8"
+uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267"
+version = "0.1.12"
+
+[[deps.MPItrampoline_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"]
+git-tree-sha1 = "675df097f8eeb28998b2cfe3b25655af73d5f7df"
+uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748"
+version = "5.5.6+0"
+
+[[deps.MacroTools]]
+git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522"
+uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
+version = "0.5.16"
+
+[[deps.Markdown]]
+deps = ["Base64", "JuliaSyntaxHighlighting", "StyledStrings"]
+uuid = "d6f4376e-aef5-505a-96c1-9c027394607a"
+version = "1.11.0"
+
+[[deps.MbedTLS]]
+deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"]
+git-tree-sha1 = "8785729fa736197687541f7053f6d8ab7fc44f92"
+uuid = "739be429-bea8-5141-9913-cc70e7f3736d"
+version = "1.1.10"
+
+[[deps.MbedTLS_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "ff69a2b1330bcb730b9ac1ab7dd680176f5896b8"
+uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1"
+version = "2.28.1010+0"
+
+[[deps.MicrosoftMPI_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "bc95bf4149bf535c09602e3acdf950d9b4376227"
+uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf"
+version = "10.1.4+3"
+
+[[deps.Mmap]]
+uuid = "a63ad114-7e13-5084-954f-fe012c677804"
+version = "1.11.0"
+
+[[deps.MozillaCACerts_jll]]
+uuid = "14a3606d-f60d-562e-9121-12d972cd8159"
+version = "2025.11.4"
+
+[[deps.Mustache]]
+deps = ["Printf", "Tables"]
+git-tree-sha1 = "3cbd5dda543bc59f2e482607ccf84b633724fc32"
+uuid = "ffc61752-8dc7-55ee-8c37-f3e9cdd09e70"
+version = "1.0.21"
+
+[[deps.Mux]]
+deps = ["AssetRegistry", "Base64", "HTTP", "Hiccup", "MbedTLS", "Pkg", "Sockets"]
+git-tree-sha1 = "7295d849103ac4fcbe3b2e439f229c5cc77b9b69"
+uuid = "a975b10e-0019-58db-a62f-e48ff68538c9"
+version = "1.0.2"
+
+[[deps.NestedUnitRanges]]
+deps = ["AbstractTrees", "ArrayLayouts", "BlockArrays"]
+git-tree-sha1 = "203935f862a28d6bf18a607502287ed42f7a5178"
+uuid = "032820ab-dc03-4b49-91f4-7d58d4da98b3"
+version = "0.2.4"
+
+[[deps.NetworkOptions]]
+uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908"
+version = "1.3.0"
+
+[[deps.OCCT_jll]]
+deps = ["Artifacts", "FreeType2_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libX11_jll", "Xorg_libXext_jll", "Xorg_libXfixes_jll", "Xorg_libXft_jll", "Xorg_libXinerama_jll", "Xorg_libXrender_jll"]
+git-tree-sha1 = "b4d728dcd7f9c42862180d2ee881eeb4b471a02a"
+uuid = "baad4e97-8daa-5946-aac2-2edac59d34e1"
+version = "7.9.3+0"
+
+[[deps.Observables]]
+git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225"
+uuid = "510215fc-4207-5dde-b226-833fc4488ee2"
+version = "0.5.5"
+
+[[deps.OffsetArrays]]
+git-tree-sha1 = "117432e406b5c023f665fa73dc26e79ec3630151"
+uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
+version = "1.17.0"
+
+ [deps.OffsetArrays.extensions]
+ OffsetArraysAdaptExt = "Adapt"
+
+ [deps.OffsetArrays.weakdeps]
+ Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
+
+[[deps.OhMyThreads]]
+deps = ["BangBang", "ChunkSplitters", "ScopedValues", "StableTasks", "TaskLocalValues"]
+git-tree-sha1 = "9a07c25c438110500d871fd5309649ec6791ef57"
+uuid = "67456a42-1dca-4109-a031-0a68de7e3ad5"
+version = "0.8.6"
+weakdeps = ["Markdown", "ProgressMeter"]
+
+ [deps.OhMyThreads.extensions]
+ MarkdownExt = "Markdown"
+ ProgressMeterExt = "ProgressMeter"
+
+[[deps.OpenBLAS_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"]
+uuid = "4536629a-c528-5b80-bd46-f80d51c5b363"
+version = "0.3.29+0"
+
+[[deps.OpenLibm_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "05823500-19ac-5b8b-9628-191a04bc5112"
+version = "0.8.7+0"
+
+[[deps.OpenMPI_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML", "Zlib_jll"]
+git-tree-sha1 = "6d6c0ca4824268c1a7dca1f4721c535ac63d9074"
+uuid = "fe0851c0-eecd-5654-98d4-656369965a5c"
+version = "5.0.11+0"
+
+[[deps.OpenSSL]]
+deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "NetworkOptions", "OpenSSL_jll", "Sockets"]
+git-tree-sha1 = "1d1aaa7d449b58415f97d2839c318b70ffb525a0"
+uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c"
+version = "1.6.1"
+
+[[deps.OpenSSL_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95"
+version = "3.5.4+0"
+
+[[deps.OpenSpecFun_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335"
+uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e"
+version = "0.5.6+0"
+
+[[deps.OrderedCollections]]
+git-tree-sha1 = "94ba93778373a53bfd5a0caaf7d809c445292ff4"
+uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
+version = "1.8.2"
+
+[[deps.PCRE2_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15"
+version = "10.44.0+1"
+
+[[deps.Parameters]]
+deps = ["OrderedCollections", "UnPack"]
+git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe"
+uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a"
+version = "0.12.3"
+
+[[deps.Parsers]]
+deps = ["Dates", "PrecompileTools", "UUIDs"]
+git-tree-sha1 = "32a4e09c5f29402573d673901778a0e03b0807b9"
+uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
+version = "2.8.6"
+
+[[deps.Permutations]]
+deps = ["Combinatorics", "LinearAlgebra", "Random"]
+git-tree-sha1 = "b1f03a4943c62552a12c7f95965b76c3f91cf5b7"
+uuid = "2ae35dd2-176d-5d53-8349-f30d82d94d4f"
+version = "0.4.23"
+
+[[deps.Pidfile]]
+deps = ["FileWatching", "Test"]
+git-tree-sha1 = "2d8aaf8ee10df53d0dfb9b8ee44ae7c04ced2b03"
+uuid = "fa939f87-e72e-5be4-a000-7fc836dbe307"
+version = "1.3.0"
+
+[[deps.Pixman_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"]
+git-tree-sha1 = "e4a6721aa89e62e5d4217c0b21bd714263779dda"
+uuid = "30392449-352a-5448-841d-b1acce4e97dc"
+version = "0.46.4+0"
+
+[[deps.Pkg]]
+deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"]
+uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
+version = "1.12.1"
+weakdeps = ["REPL"]
+
+ [deps.Pkg.extensions]
+ REPLExt = "REPL"
+
+[[deps.PlotlyBase]]
+deps = ["ColorSchemes", "Colors", "Dates", "DelimitedFiles", "DocStringExtensions", "JSON", "LaTeXStrings", "Logging", "Parameters", "Pkg", "REPL", "Requires", "Statistics", "UUIDs"]
+git-tree-sha1 = "6256ab3ee24ef079b3afa310593817e069925eeb"
+uuid = "a03496cd-edff-5a9b-9e67-9cda94a718b5"
+version = "0.8.23"
+
+ [deps.PlotlyBase.extensions]
+ DataFramesExt = "DataFrames"
+ DistributionsExt = "Distributions"
+ IJuliaExt = "IJulia"
+ JSON3Ext = "JSON3"
+
+ [deps.PlotlyBase.weakdeps]
+ DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
+ Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
+ IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a"
+ JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1"
+
+[[deps.PlotlyJS]]
+deps = ["Base64", "Blink", "DelimitedFiles", "JSExpr", "JSON", "Kaleido_jll", "Markdown", "Pkg", "PlotlyBase", "PlotlyKaleido", "REPL", "Reexport", "Requires", "WebIO"]
+git-tree-sha1 = "4bf6c08295346efba58bb2d5f8c52984efed7f27"
+uuid = "f0f68f2c-4968-5e81-91da-67840de0976a"
+version = "0.18.18"
+
+ [deps.PlotlyJS.extensions]
+ CSVExt = "CSV"
+ DataFramesExt = ["DataFrames", "CSV"]
+ IJuliaExt = "IJulia"
+ JSON3Ext = "JSON3"
+
+ [deps.PlotlyJS.weakdeps]
+ CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
+ DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
+ IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a"
+ JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1"
+
+[[deps.PlotlyKaleido]]
+deps = ["Artifacts", "Base64", "JSON", "Kaleido_jll"]
+git-tree-sha1 = "c7a270d11881c0709052f8e3def3d60d551e99f3"
+uuid = "f2990250-8cf9-495f-b13a-cce12b45703c"
+version = "2.3.1"
+
+[[deps.PrecompileTools]]
+deps = ["Preferences"]
+git-tree-sha1 = "edbeefc7a4889f528644251bdb5fc9ab5348bc2c"
+uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a"
+version = "1.3.4"
+
+[[deps.Preferences]]
+deps = ["TOML"]
+git-tree-sha1 = "8b770b60760d4451834fe79dd483e318eee709c4"
+uuid = "21216c6a-2e73-6563-6e65-726566657250"
+version = "1.5.2"
+
+[[deps.Printf]]
+deps = ["Unicode"]
+uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"
+version = "1.11.0"
+
+[[deps.ProgressMeter]]
+deps = ["Distributed", "Printf"]
+git-tree-sha1 = "fbb92c6c56b34e1a2c4c36058f68f332bec840e7"
+uuid = "92933f4c-e287-5a05-a399-4b506db050ca"
+version = "1.11.0"
+
+[[deps.REPL]]
+deps = ["InteractiveUtils", "JuliaSyntaxHighlighting", "Markdown", "Sockets", "StyledStrings", "Unicode"]
+uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"
+version = "1.11.0"
+
+[[deps.Random]]
+deps = ["SHA"]
+uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
+version = "1.11.0"
+
+[[deps.RecipesBase]]
+deps = ["PrecompileTools"]
+git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff"
+uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
+version = "1.3.4"
+
+[[deps.Reexport]]
+git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b"
+uuid = "189a3867-3050-52da-a836-e630ba90ab69"
+version = "1.2.2"
+
+[[deps.Requires]]
+deps = ["UUIDs"]
+git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64"
+uuid = "ae029012-a4dd-5104-9daa-d747884805df"
+version = "1.3.1"
+
+[[deps.SCOTCH_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
+git-tree-sha1 = "7110b749766853054ce8a2afaa73325d72d32129"
+uuid = "a8d0f55d-b80e-548d-aff6-1a04c175f0f9"
+version = "6.1.3+0"
+
+[[deps.SHA]]
+uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"
+version = "0.7.0"
+
+[[deps.SauterSchwab3D]]
+deps = ["FastGaussQuadrature", "GrundmannMoeller", "LinearAlgebra", "ShunnHamQuadrature", "StaticArrays"]
+git-tree-sha1 = "8166c8fe142d92db613704c322e2eaf67d3676e4"
+uuid = "0a13313b-1c00-422e-8263-562364ed9544"
+version = "0.2.0"
+
+[[deps.SauterSchwabQuadrature]]
+deps = ["FastGaussQuadrature", "LinearAlgebra", "StaticArrays", "TestItems"]
+git-tree-sha1 = "cf7f7fe18daaa4696f879c822277d8970076a7ea"
+uuid = "535c7bfe-2023-5c1d-b712-654ef9d93a38"
+version = "2.4.2"
+
+[[deps.SciMLPublic]]
+git-tree-sha1 = "2b1b64add566435a768abdb3b053cac17d19ff3c"
+uuid = "431bcebd-1456-4ced-9d72-93c2757fff0b"
+version = "1.2.1"
+
+[[deps.ScopedValues]]
+deps = ["HashArrayMappedTries", "Logging"]
+git-tree-sha1 = "67a144433c4ce877ee6d1ada69a124d6b1ecf7be"
+uuid = "7e506255-f358-4e82-b7e4-beb19740aa63"
+version = "1.6.2"
+
+[[deps.Serialization]]
+uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b"
+version = "1.11.0"
+
+[[deps.SharedArrays]]
+deps = ["Distributed", "Mmap", "Random", "Serialization"]
+uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383"
+version = "1.11.0"
+
+[[deps.ShunnHamQuadrature]]
+deps = ["LinearAlgebra", "StaticArrays"]
+git-tree-sha1 = "dfa53166b13cd6f352d54c99a24124321ef95282"
+uuid = "164309f2-5039-4884-b6c7-6da8aa5c66ad"
+version = "0.1.0"
+
+[[deps.SimpleBufferStream]]
+git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1"
+uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7"
+version = "1.2.0"
+
+[[deps.SimpleTraits]]
+deps = ["InteractiveUtils", "MacroTools"]
+git-tree-sha1 = "7ddb0b49c109481b046972c0e4ab02b2127d6a75"
+uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d"
+version = "0.9.6"
+
+[[deps.Sockets]]
+uuid = "6462fe0b-24de-5631-8697-dd941f90decc"
+version = "1.11.0"
+
+[[deps.SparseArrays]]
+deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"]
+uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+version = "1.12.0"
+
+[[deps.Sparspak]]
+deps = ["Libdl", "LinearAlgebra", "Logging", "OffsetArrays", "Printf", "SparseArrays", "Test"]
+git-tree-sha1 = "c942cb0b0e929a28eb6fedd5a3cbfb4440633d53"
+uuid = "e56a9233-b9d6-4f03-8d0f-1825330902ac"
+version = "0.3.15"
+
+[[deps.SpecialFunctions]]
+deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"]
+git-tree-sha1 = "6547cbdd8ce32efba0d21c5a40fa96d1a3548f9f"
+uuid = "276daf66-3868-5448-9aa4-cd146d93841b"
+version = "2.8.0"
+
+ [deps.SpecialFunctions.extensions]
+ SpecialFunctionsChainRulesCoreExt = "ChainRulesCore"
+
+ [deps.SpecialFunctions.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+
+[[deps.StableTasks]]
+git-tree-sha1 = "c4f6610f85cb965bee5bfafa64cbeeda55a4e0b2"
+uuid = "91464d47-22a1-43fe-8b7f-2d57ee82463f"
+version = "0.1.7"
+
+[[deps.StaticArrays]]
+deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"]
+git-tree-sha1 = "246a8bb2e6667f832eea063c3a56aef96429a3db"
+uuid = "90137ffa-7385-5640-81b9-e52037218182"
+version = "1.9.18"
+
+ [deps.StaticArrays.extensions]
+ StaticArraysChainRulesCoreExt = "ChainRulesCore"
+ StaticArraysStatisticsExt = "Statistics"
+
+ [deps.StaticArrays.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
+
+[[deps.StaticArraysCore]]
+git-tree-sha1 = "6ab403037779dae8c514bad259f32a447262455a"
+uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c"
+version = "1.4.4"
+
+[[deps.Statistics]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0"
+uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
+version = "1.11.1"
+weakdeps = ["SparseArrays"]
+
+ [deps.Statistics.extensions]
+ SparseArraysExt = ["SparseArrays"]
+
+[[deps.StyledStrings]]
+uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b"
+version = "1.11.0"
+
+[[deps.SuiteSparse_jll]]
+deps = ["Artifacts", "Libdl", "libblastrampoline_jll"]
+uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c"
+version = "7.8.3+2"
+
+[[deps.Suppressor]]
+deps = ["Logging"]
+git-tree-sha1 = "6dbb5b635c5437c68c28c2ac9e39b87138f37c0a"
+uuid = "fd094767-a336-5f1f-9728-57cf17d0bbfb"
+version = "0.2.8"
+
+[[deps.TOML]]
+deps = ["Dates"]
+uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76"
+version = "1.0.3"
+
+[[deps.TableTraits]]
+deps = ["IteratorInterfaceExtensions"]
+git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39"
+uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c"
+version = "1.0.1"
+
+[[deps.Tables]]
+deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"]
+git-tree-sha1 = "0f38a06c83f0007bbab3cf911262841c9a0f07e0"
+uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
+version = "1.13.0"
+
+[[deps.Tar]]
+deps = ["ArgTools", "SHA"]
+uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e"
+version = "1.10.0"
+
+[[deps.TaskLocalValues]]
+git-tree-sha1 = "67e469338d9ce74fc578f7db1736a74d93a49eb8"
+uuid = "ed4db957-447d-4319-bfb6-7fa9ae7ecf34"
+version = "0.1.3"
+
+[[deps.TensorCore]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6"
+uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50"
+version = "0.1.1"
+
+[[deps.Test]]
+deps = ["InteractiveUtils", "Logging", "Random", "Serialization"]
+uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
+version = "1.11.0"
+
+[[deps.TestItems]]
+git-tree-sha1 = "42fd9023fef18b9b78c8343a4e2f3813ffbcefcb"
+uuid = "1c621080-faea-4a02-84b6-bbd5e436b8fe"
+version = "1.0.0"
+
+[[deps.TranscodingStreams]]
+git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742"
+uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
+version = "0.11.3"
+
+[[deps.URIs]]
+git-tree-sha1 = "bef26fb046d031353ef97a82e3fdb6afe7f21b1a"
+uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4"
+version = "1.6.1"
+
+[[deps.UUIDs]]
+deps = ["Random", "SHA"]
+uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"
+version = "1.11.0"
+
+[[deps.UnPack]]
+git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b"
+uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed"
+version = "1.0.2"
+
+[[deps.Unicode]]
+uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5"
+version = "1.11.0"
+
+[[deps.WebIO]]
+deps = ["AssetRegistry", "Base64", "Distributed", "FunctionalCollections", "JSON", "Logging", "Observables", "Pkg", "Random", "Requires", "Sockets", "UUIDs", "WebSockets", "Widgets"]
+git-tree-sha1 = "0eef0765186f7452e52236fa42ca8c9b3c11c6e3"
+uuid = "0f1e0344-ec1d-5b48-a673-e5cf874b6c29"
+version = "0.8.21"
+
+[[deps.WebSockets]]
+deps = ["Base64", "Dates", "HTTP", "Logging", "Sockets"]
+git-tree-sha1 = "4162e95e05e79922e44b9952ccbc262832e4ad07"
+uuid = "104b5d7c-a370-577a-8038-80a2059c5097"
+version = "1.6.0"
+
+[[deps.Widgets]]
+deps = ["Colors", "Dates", "Observables", "OrderedCollections"]
+git-tree-sha1 = "e9aeb174f95385de31e70bd15fa066a505ea82b9"
+uuid = "cc8bc4a8-27d6-5769-a93b-9d913e69aa62"
+version = "0.6.7"
+
+[[deps.WiltonInts84]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "30444f863e76cc609b52d5b8e3e047acd7deaccf"
+uuid = "a3e2863e-c0ee-5ff6-a523-307a4cdc8724"
+version = "0.2.8"
+
+[[deps.XML2_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"]
+git-tree-sha1 = "80d3930c6347cfce7ccf96bd3bafdf079d9c0390"
+uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a"
+version = "2.13.9+0"
+
+[[deps.Xorg_libX11_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"]
+git-tree-sha1 = "808090ede1d41644447dd5cbafced4731c56bd2f"
+uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc"
+version = "1.8.13+0"
+
+[[deps.Xorg_libXau_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "aa1261ebbac3ccc8d16558ae6799524c450ed16b"
+uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec"
+version = "1.0.13+0"
+
+[[deps.Xorg_libXdmcp_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "52858d64353db33a56e13c341d7bf44cd0d7b309"
+uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05"
+version = "1.1.6+0"
+
+[[deps.Xorg_libXext_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"]
+git-tree-sha1 = "1a4a26870bf1e5d26cd585e38038d399d7e65706"
+uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3"
+version = "1.3.8+0"
+
+[[deps.Xorg_libXfixes_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"]
+git-tree-sha1 = "75e00946e43621e09d431d9b95818ee751e6b2ef"
+uuid = "d091e8ba-531a-589c-9de9-94069b037ed8"
+version = "6.0.2+0"
+
+[[deps.Xorg_libXft_jll]]
+deps = ["Artifacts", "Fontconfig_jll", "JLLWrappers", "Libdl", "Xorg_libXrender_jll"]
+git-tree-sha1 = "d893c27836da7986c3248997a2a9535e5e4d8a95"
+uuid = "2c808117-e144-5220-80d1-69d4eaa9352c"
+version = "2.3.9+0"
+
+[[deps.Xorg_libXinerama_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll"]
+git-tree-sha1 = "0ba01bc7396896a4ace8aab67db31403c71628f4"
+uuid = "d1454406-59df-5ea1-beac-c340f2130bc3"
+version = "1.1.7+0"
+
+[[deps.Xorg_libXrender_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"]
+git-tree-sha1 = "7ed9347888fac59a618302ee38216dd0379c480d"
+uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa"
+version = "0.9.12+0"
+
+[[deps.Xorg_libpciaccess_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"]
+git-tree-sha1 = "58972370b81423fc546c56a60ed1a009450177c3"
+uuid = "a65dc6b1-eb27-53a1-bb3e-dea574b5389e"
+version = "0.19.0+0"
+
+[[deps.Xorg_libxcb_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXau_jll", "Xorg_libXdmcp_jll"]
+git-tree-sha1 = "bfcaf7ec088eaba362093393fe11aa141fa15422"
+uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b"
+version = "1.17.1+0"
+
+[[deps.Xorg_xtrans_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "a63799ff68005991f9d9491b6e95bd3478d783cb"
+uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10"
+version = "1.6.0+0"
+
+[[deps.Zlib_jll]]
+deps = ["Libdl"]
+uuid = "83775a58-1f1d-513f-b197-d71354ab007a"
+version = "1.3.1+2"
+
+[[deps.aws_c_auth_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_cal_jll", "aws_c_http_jll", "aws_c_sdkutils_jll"]
+git-tree-sha1 = "8cab83c96af80a1be968251ce1a0548a7545484d"
+uuid = "2b3700d1-4306-52e2-a478-c162f0c514be"
+version = "0.9.6+0"
+
+[[deps.aws_c_cal_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_common_jll"]
+git-tree-sha1 = "22c0f42f4a1f0dc5dcfa8fd267c4ac407c455e7a"
+uuid = "70f11efc-bab2-57f1-b0f3-22aad4e67c4b"
+version = "0.9.13+0"
+
+[[deps.aws_c_common_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "a759cb9bf456ad792cc7898a81ae333cce9ef02a"
+uuid = "73048d1d-b8c4-5092-a58d-866c5e8d1e50"
+version = "0.12.6+0"
+
+[[deps.aws_c_compression_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_common_jll"]
+git-tree-sha1 = "7910c72f45f44afd297c39fe43b99c56d5ed22ec"
+uuid = "73a04cd5-f3d7-5bac-9290-e8adb709f224"
+version = "0.3.2+0"
+
+[[deps.aws_c_http_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_compression_jll", "aws_c_io_jll"]
+git-tree-sha1 = "e358d5a001ef7afbd4f8c5225322512819cda2f2"
+uuid = "3254fc65-9028-534d-aa9d-d76d128babc6"
+version = "0.10.13+0"
+
+[[deps.aws_c_io_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_cal_jll", "aws_c_common_jll", "s2n_tls_jll"]
+git-tree-sha1 = "7e481d474b2087ee8bbf55b81bf9119f21e396d9"
+uuid = "13c41daa-f319-5298-b5eb-5754e0170d52"
+version = "0.26.3+0"
+
+[[deps.aws_c_s3_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_auth_jll", "aws_c_common_jll", "aws_c_http_jll", "aws_checksums_jll", "s2n_tls_jll"]
+git-tree-sha1 = "3e9917ab25114feba657e71be41cad068b9f6595"
+uuid = "bd1f34fb-993f-5903-a121-aaf302eed6d4"
+version = "0.11.5+0"
+
+[[deps.aws_c_sdkutils_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_common_jll"]
+git-tree-sha1 = "c43dfba2c1ab9ea9f02f2c80e86fa16f6460244e"
+uuid = "1282aa60-004d-510b-9f52-12498d409daa"
+version = "0.2.4+1"
+
+[[deps.aws_checksums_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_common_jll"]
+git-tree-sha1 = "2570c8e23f4771a087b12a47edcaaa670ac05a01"
+uuid = "b2a88e68-78e7-5e94-8c20-c02986ec140e"
+version = "0.2.10+0"
+
+[[deps.dlfcn_win32_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "e141d67ffe550eadfb5af1bdbdaf138031e4805f"
+uuid = "c4b69c83-5512-53e3-94e6-de98773c479f"
+version = "1.4.2+0"
+
+[[deps.gmsh_jll]]
+deps = ["Artifacts", "Cairo_jll", "CompilerSupportLibraries_jll", "FLTK_jll", "FreeType2_jll", "GLU_jll", "GMP_jll", "HDF5_jll", "JLLWrappers", "JpegTurbo_jll", "LLVMOpenMP_jll", "Libdl", "Libglvnd_jll", "METIS_jll", "MMG_jll", "OCCT_jll", "Xorg_libX11_jll", "Xorg_libXext_jll", "Xorg_libXfixes_jll", "Xorg_libXft_jll", "Xorg_libXinerama_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"]
+git-tree-sha1 = "4b81ac8f1fe6a1a473ac9b980de24e9143fa6211"
+uuid = "630162c2-fc9b-58b3-9910-8442a8a132e6"
+version = "4.15.2+0"
+
+[[deps.libaec_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "60f4792734488db6f42e2c7699f1d4594780bd03"
+uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0"
+version = "1.1.7+0"
+
+[[deps.libblastrampoline_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "8e850b90-86db-534c-a0d3-1478176c7d93"
+version = "5.15.0+0"
+
+[[deps.libpng_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"]
+git-tree-sha1 = "e51150d5ab85cee6fc36726850f0e627ad2e4aba"
+uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f"
+version = "1.6.58+0"
+
+[[deps.mpif_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIABI_jll", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "TOML"]
+git-tree-sha1 = "a8083ee0737c243c8f40a4ba86a0956997facb73"
+uuid = "9aeb927a-4695-514f-a259-621a69f20ec0"
+version = "0.1.7+0"
+
+[[deps.nghttp2_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d"
+version = "1.64.0+1"
+
+[[deps.oneTBB_jll]]
+deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"]
+git-tree-sha1 = "da8c1f6eee04831f14edcfa5dae611d309807e57"
+uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e"
+version = "2022.3.0+0"
+
+[[deps.p7zip_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"]
+uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"
+version = "17.7.0+0"
+
+[[deps.s2n_tls_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "64ae051c6f03044eb7d98027d1b552b4e21e650c"
+uuid = "cddc5d3d-934d-5d3a-9747-62fc12ea3f48"
+version = "1.7.3+0"
diff --git a/examples/efie.jl b/examples/efie.jl
index 033f476..27b8790 100644
--- a/examples/efie.jl
+++ b/examples/efie.jl
@@ -8,7 +8,7 @@ using PlotlyJS
include("plotresults.jl")
-mesh = meshsphere(1.0, 0.4)
+mesh = meshsphere(1.0, 0.1)
space = raviartthomas(mesh)
wavenumber = 1.0
@@ -16,10 +16,11 @@ operator = Maxwell3D.singlelayer(; wavenumber)
excitation = Maxwell3D.planewave(; direction=ẑ, polarization=x̂, wavenumber)
rhs = assemble((n × excitation) × n, space)
-matrix = CFMM.assemble(operator, space)
+matrix = CFMM.assemble(operator, space, space)
current, stats = Krylov.gmres(matrix, rhs; rtol=1.0e-4, itmax=200, history=true, verbose=1)
@show stats
@show norm(matrix * current - rhs) / norm(rhs)
-plotresults(current, space, excitation, wavenumber, joinpath(@__DIR__, "efie_results.html"))
+outdir = get(ENV, "CFMM_OUTPUT_DIR", @__DIR__)
+plotresults(current, space, excitation, wavenumber, joinpath(outdir, "efie_results.html"))
diff --git a/examples/mfie.jl b/examples/mfie.jl
index 0a85958..a88b6f4 100644
--- a/examples/mfie.jl
+++ b/examples/mfie.jl
@@ -8,7 +8,7 @@ using PlotlyJS
include("plotresults.jl")
-mesh = meshsphere(1.0, 0.4)
+mesh = meshsphere(1.0, 0.1)
trialspace = raviartthomas(mesh)
testspace = buffachristiansen(mesh)
@@ -30,6 +30,7 @@ current, stats = Krylov.gmres(matrix, rhs; rtol=1.0e-4, itmax=200, history=true,
@show stats
@show norm(matrix * current - rhs) / norm(rhs)
+outdir = get(ENV, "CFMM_OUTPUT_DIR", @__DIR__)
plotresults(
- current, trialspace, excitation, wavenumber, joinpath(@__DIR__, "mfie_results.html")
+ current, trialspace, excitation, wavenumber, joinpath(outdir, "mfie_results.html")
)
diff --git a/ext/CFMMExaFMMt/fmmoptions.jl b/ext/CFMMExaFMMt/fmmoptions.jl
index 93209ee..16bdd0b 100644
--- a/ext/CFMMExaFMMt/fmmoptions.jl
+++ b/ext/CFMMExaFMMt/fmmoptions.jl
@@ -3,15 +3,16 @@ function exafmmoptions(
) where {T<:Val{0}}
return LaplaceFMMOptions(; p=fmm.p, ncrit=fmm.ncrit)
end
-#TODO: Write unit tests for the ModifiedHelmholtzFMMOptions
function exafmmoptions(
gamma::T, fmm::CorrectionFactorMatrixMethod.ExaFMMtFunctor
) where {T<:Real}
+ iszero(gamma) && return LaplaceFMMOptions(; p=fmm.p, ncrit=fmm.ncrit)
return ModifiedHelmholtzFMMOptions(gamma; p=fmm.p, ncrit=fmm.ncrit)
end
function exafmmoptions(
gamma::T, fmm::CorrectionFactorMatrixMethod.ExaFMMtFunctor
) where {T<:Complex}
+ iszero(gamma) && return LaplaceFMMOptions(; p=fmm.p, ncrit=fmm.ncrit)
return HelmholtzFMMOptions(-gamma / im; p=fmm.p, ncrit=fmm.ncrit)
end
diff --git a/src/CFMM/assemble.jl b/src/CFMM/assemble.jl
index 3230458..502a841 100644
--- a/src/CFMM/assemble.jl
+++ b/src/CFMM/assemble.jl
@@ -20,7 +20,6 @@ using ..CorrectionFactorMatrixMethod:
"""
assemble(operator, testspace, trialspace; kwargs...)
- assemble(operator, space; kwargs...)
Assemble a matrix-free correction-factor FMM operator.
@@ -59,8 +58,4 @@ function assemble(
)
end
-function assemble(operator, space; kwargs...)
- return assemble(operator, space, space; kwargs...)
-end
-
end
diff --git a/src/kernelmatrix/abstractcorrectedkernelmatrix.jl b/src/kernelmatrix/abstractcorrectedkernelmatrix.jl
index 076c32a..18893b1 100644
--- a/src/kernelmatrix/abstractcorrectedkernelmatrix.jl
+++ b/src/kernelmatrix/abstractcorrectedkernelmatrix.jl
@@ -2,5 +2,7 @@ abstract type AbstractCorrectedKernelMatrix{T} end
function AbstractCorrectedKernelMatrix(operator, testspace, trialspace; args...) end
-function (::AbstractCorrectedKernelMatrix)(matrixblock, tdata, sdata) end
+function (::AbstractCorrectedKernelMatrix)(matrixblock, tdata, sdata)
+ return nothing
+end
Base.eltype(::AbstractCorrectedKernelMatrix{T}) where {T} = T
diff --git a/test/CFMMBEAST/test_CFMMBEAST.jl b/test/CFMMBEAST/test_CFMMBEAST.jl
index 6fd2fe1..6a5026f 100644
--- a/test/CFMMBEAST/test_CFMMBEAST.jl
+++ b/test/CFMMBEAST/test_CFMMBEAST.jl
@@ -84,5 +84,7 @@
)
@test matrix isa matrixtype
@test size(matrix) == (length(space), length(space))
+ @test size(matrix, 1) == length(space)
+ @test size(matrix, 2) == length(space)
end
end
diff --git a/test/CFMMExaFMMt/test_CFMMExaFMMt.jl b/test/CFMMExaFMMt/test_CFMMExaFMMt.jl
index a82abd9..1ad64bb 100644
--- a/test/CFMMExaFMMt/test_CFMMExaFMMt.jl
+++ b/test/CFMMExaFMMt/test_CFMMExaFMMt.jl
@@ -7,6 +7,10 @@
@test options isa ExaFMMt.FMMOptions
@test (options.p, options.ncrit) == (8, 32)
+ # Helmholtz with wavenumber=0 must reduce to the Laplace path
+ @test functor(Helmholtz3D.singlelayer(; wavenumber=0.0)) isa ExaFMMt.LaplaceFMMOptions
+ @test functor(Helmholtz3D.hypersingular(; wavenumber=0.0)) isa ExaFMMt.LaplaceFMMOptions
+
sources = [0.0 0.0 0.0; 1.0 0.0 0.0]
targets = [0.0 1.0 0.0; 1.0 1.0 0.0]
fmm = CFM.setup(sources, targets, options)
diff --git a/test/runtests.jl b/test/runtests.jl
index d2c5a50..6da894e 100644
--- a/test/runtests.jl
+++ b/test/runtests.jl
@@ -53,4 +53,21 @@ end
nothing
end
+# Warn locally if pre-rendered documentation plots are older than their source.
+# Git sets identical mtimes on checkout so this only fires after a local edit.
+let
+ repo = dirname(@__DIR__)
+ scripts = map(
+ f -> joinpath(repo, "examples", f), ["efie.jl", "mfie.jl", "plotresults.jl"]
+ )
+ assets = joinpath(repo, "docs", "src", "assets", "examples")
+ newest = maximum(mtime, scripts)
+ for name in ["efie_results.html", "mfie_results.html"]
+ html = joinpath(assets, name)
+ isfile(html) &&
+ mtime(html) < newest &&
+ @warn "$name may be stale — run: julia --startup-file=no docs/render_examples.jl"
+ end
+end
+
@run_package_tests verbose = true
diff --git a/test/test_core.jl b/test/test_core.jl
index d52d715..bcffe0b 100644
--- a/test/test_core.jl
+++ b/test/test_core.jl
@@ -26,6 +26,10 @@ end
struct TestFMMFunctor <: CFM.FMMFunctor end
+# Minimal concrete subtype with no callable override — exercises the base stub.
+struct MinimalKernelMatrix{T} <: CFM.AbstractCorrectedKernelMatrix{T} end
+Base.size(::MinimalKernelMatrix) = (0, 0)
+
CFM.scalartype(::TestCorrectionOperator) = Float64
function CFM.AbstractCorrectedKernelMatrix(
@@ -57,6 +61,9 @@ end
beastmatrix = CFM.BEASTCorrectedKernelMatrix{ComplexF64}(assembler, assembler)
@test eltype(beastmatrix) == ComplexF64
@test size(beastmatrix) == (3, 4)
+ @test size(beastmatrix, 1) == 3
+ @test size(beastmatrix, 2) == 4
+ @test_throws ErrorException size(beastmatrix, 3)
testspace = [SVector(x, 0.0, 0.0) for x in 0.0:3.0]
trialspace = [SVector(x, 0.0, 0.0) for x in 0.5:1.0:2.5]
@@ -94,11 +101,18 @@ end
options = CFM.FMMFunctor(; p=10, ncrit=64)
@test (options.p, options.ncrit) == (10, 64)
@test CFM.defaultminvalues(options) == 64
+ @test CFM.defaultminvalues(TestFMMFunctor()) == 50 # base FMMFunctor fallback
matrix = [2.0 1.0; -1.0 3.0]
vector = [1.0, 2.0]
@test CFM.FMM(matrix) * vector == matrix * vector
@test transpose(CFM.FMM(matrix, transpose(matrix))) * vector ==
transpose(matrix) * vector
+ # Adjoint is not implemented; use complex types to exercise the error branch
+ # (for real element types LinearMaps silently routes adjoint through transpose)
+ cmatrix = ComplexF64[2.0 1.0; -1.0 3.0]
+ cvector = ComplexF64[1.0, 2.0]
+ @test_throws ErrorException adjoint(CFM.FMM(cmatrix, transpose(cmatrix))) * cvector
+ @test_throws ErrorException adjoint(CFM.FMM(cmatrix)) * cvector
far = LinearMap(matrix)
correction = LinearMap([0.5 -0.5; 1.0 0.0])
@@ -108,4 +122,19 @@ end
@test cfmm * vector == (far + correction) * vector
@test transpose(cfmm) * vector == transpose(far + correction) * vector
@test adjoint(cfmm) * vector == adjoint(far + correction) * vector
+
+ # Stubs that error when no extension is loaded — verify the error is thrown.
+ @test isnothing(CFM.AbstractCorrectedKernelMatrix(nothing, nothing, nothing))
+ @test isnothing(MinimalKernelMatrix{Float64}()(nothing, nothing, nothing))
+ @test isnothing(CFM.scalartype(nothing))
+ @test_throws ErrorException CFM.defaultnearquadstrat(nothing, nothing, nothing)
+ @test_throws ErrorException CFM.FMMFunctor()(nothing)
+ @test CFM.alpha(nothing) == 1.0
+ @test CFM.beta(nothing) == 1.0
+ @test_throws ErrorException CFM.sources(nothing, 2)
+ @test_throws ErrorException CFM.potentials(Matrix{Float64}(undef, 0, 0), nothing)
+ @test_throws ErrorException CFM.curlpotentials(Matrix{Float64}(undef, 0, 0), nothing)
+ @test_throws ErrorException CFM.divpotentials(Matrix{Float64}(undef, 0, 0), nothing)
+ @test_throws ErrorException CFM.normals(nothing)
+ @test_throws ErrorException CFM.setup(nothing, nothing, nothing)
end
diff --git a/test/test_operators.jl b/test/test_operators.jl
index b25cb95..6119261 100644
--- a/test/test_operators.jl
+++ b/test/test_operators.jl
@@ -22,4 +22,25 @@
dense = assemble(operator, problem.testspace, problem.trialspace)
x = ones(ComplexF64, size(matrix, 2))
@test isapprox(matrix * x, dense * x; rtol=problem.tolerance)
+
+ # Static (Laplace, gamma=Val(0)) operators have Float64 scalar type.
+ # testoperator uses ComplexF64 vectors, triggering the real/complex
+ # multiplication branch in each HH3D operator.
+ for operator in (
+ Helmholtz3D.singlelayer(),
+ Helmholtz3D.doublelayer(),
+ Helmholtz3D.doublelayer_transposed(),
+ Helmholtz3D.hypersingular(),
+ )
+ testoperator(operator, scalarproblems)
+ end
+
+ # Matching spaces use the symmetric FMM.
+ scalar_problem = last(scalarproblems)
+ operator = Helmholtz3D.singlelayer(; wavenumber=k)
+ square_matrix = CFMM.assemble(
+ operator, scalar_problem.testspace, scalar_problem.testspace
+ )
+ @test square_matrix.fmm.fmm isa CorrectionFactorMatrixMethod.SymmetricFMM
+ @test_throws MethodError CFMM.assemble(operator, scalar_problem.testspace)
end