Skip to content

Local-Global Solver API#144

Merged
termi-official merged 87 commits intomainfrom
do/local-global-solver
Mar 28, 2025
Merged

Local-Global Solver API#144
termi-official merged 87 commits intomainfrom
do/local-global-solver

Conversation

@termi-official
Copy link
Copy Markdown
Collaborator

@termi-official termi-official commented Sep 4, 2024

Feature List

  • Local variable handler
  • Custom quadrature rules via semidiscretize
  • MultiLevelNewtonRaphson
  • Stiff DAE solver baseline (via wrapper API)

TODOs

  • Fix naming inconsistencies between local and internal
  • Provide caches for the local solve
  • Communication of convergence information between outer and inner solver
  • Streamline multilevel setup Don't know how.

@termi-official termi-official marked this pull request as draft September 4, 2024 17:50
@termi-official
Copy link
Copy Markdown
Collaborator Author

termi-official commented Jan 8, 2025

Found some snippets. Probably part of this PR.

# Ferrite-specific
struct MaterialCache{M, DH, CV, FV}
    material::M
    dh::DH
    cv::CV
    fv::FV
end

# Standard assembly loop for global problem
function stress!(du, u, q, cache::MaterialCache, t)
    K = allocate_matrix(cache.dh)
    f = zeros(ndofs(cache.dh))
    # Allocate the element stiffness matrix
    n_basefuncs = getnbasefunctions(cache.cv)
    ke = zeros(n_basefuncs, n_basefuncs)
    fe = zeros(n_basefuncs)
    # Create an assembler
    assembler = start_assemble(K, f)
    # Loop over all cells
    for cell in CellIterator(cache.dh)
        # Update the shape function gradients based on the cell coordinates
        reinit!(cache.cv, cell)
        # Reset the element stiffness matrix
        fill!(ke, 0.0)
        fill!(fe, 0.0)
        # Compute element contribution
        assemble_cell!(ke, fe, u, q, cell, cache.cv, material)
        # Assemble ke into K
        assemble!(assembler, celldofs(cell), ke, fe)
    end
    for face in FacetIterator(cache.dh, getfacetset(cache.dh.grid,"right"))
        # Update the facetvalues to the correct facet number
        reinit!(cache.fv, face)
        # Reset the temporary array for the next facet
        fill!(fe, 0.0)
        # Access the cell's coordinates
        cell_coordinates = getcoordinates(face)
        for qp in 1:getnquadpoints(cache.fv)
            # Calculate the global coordinate of the quadrature point.
            x = spatial_coordinate(cache.fv, qp, cell_coordinates)
            tₚ = cache.material.traction(x, t)
            # Get the integration weight for the current quadrature point.= getdetJdV(cache.fv, qp)
            for i in 1:getnbasefunctions(cache.fv)
                Nᵢ = shape_value(cache.fv, qp, i)
                fe[i] += tₚ * Nᵢ *end
        end
        # Add the local contributions to the correct indices in the global external force vector
        assemble!(f, celldofs(face), fe)
    end
    du .= K*u .- f
end

function stress_Ju!(K, u, q, cache::MaterialCache, t)
    # Allocate the element stiffness matrix
    n_basefuncs = getnbasefunctions(cache.cv)
    ke = zeros(n_basefuncs, n_basefuncs)
    # Create an assembler
    assembler = start_assemble(K; fillzero=false)
    # Loop over all cells
    for cell in CellIterator(dh)
        # Update the shape function gradients based on the cell coordinates
        reinit!(cache.cv, cell)
        # Reset the element stiffness matrix
        fill!(ke, 0.0)
        # Compute element contribution
        assemble_cell_Ju!(ke, u, q, cell, cache.cv, cache.material)
        # Assemble ke into K
        assemble!(assembler, celldofs(cell), ke)
    end
end

function stress_Jq!(K, u, q, cache::MaterialCache, t)
    # Allocate the element stiffness matrix
    n_basefuncs = getnbasefunctions(cache.cv)
    ke = zeros(n_basefuncs, n_basefuncs)
    # Create an assembler
    assembler = start_assemble(K)
    # Loop over all cells
    for cell in CellIterator(dh)
        # Update the shape function gradients based on the cell coordinates
        reinit!(cache.cv, cell)
        # Reset the element stiffness matrix
        fill!(ke, 0.0)
        # Compute element contribution
        assemble_cell_Jq!(ke, u, q, cell, cache.cv, cache.material)
        # Assemble ke into K
        assemble!(assembler, celldofs(cell), ke)
    end
end

@termi-official termi-official linked an issue Jan 18, 2025 that may be closed by this pull request
@termi-official termi-official force-pushed the do/local-global-solver branch from 93cabd5 to 7d52878 Compare March 26, 2025 21:39
@termi-official termi-official force-pushed the do/local-global-solver branch from 31c644a to 7d7e574 Compare March 27, 2025 20:30
@termi-official termi-official marked this pull request as ready for review March 27, 2025 23:32
@termi-official termi-official requested a review from Copilot March 27, 2025 23:32
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR introduces documentation and API reference updates for the new Local-Global Solver API along with dependency updates. Key changes include:

  • Addition of a new section on Thunderbolt operators in the topics/operators.md file.
  • Creation of detailed nonlinear solver documentation describing the Multi-Level Newton-Raphson method.
  • Updating the API reference to include the MultiLevelNewtonRaphsonSolver.
  • Numerous dependency version bumps and git-tree-sha1 updates in Manifest.toml files.

Reviewed Changes

Copilot reviewed 19 out of 34 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
docs/src/topics/operators.md Added a new TLDT section with descriptive text on Thunderbolt operators.
docs/src/topics/nonlinear-solver.md New comprehensive documentation for the Multi-Level Newton-Raphson method.
docs/src/api-reference/solver.md Updated API reference to include MultiLevelNewtonRaphsonSolver.
docs/Manifest.toml Dependency version and hash updates.
bak/examples/Manifest.toml Similar dependency updates as in the main docs Manifest.
Files not reviewed (15)
  • bak/examples/conduction-velocity-benchmark.jl: Language not supported
  • benchmarks/benchmarks-multilevel.jl: Language not supported
  • docs/make.jl: Language not supported
  • docs/src/assets/references.bib: Language not supported
  • docs/src/literate-tutorials/cm01_simple-active-stress.jl: Language not supported
  • docs/src/literate-tutorials/cm03_3d0d-coupling.jl: Language not supported
  • src/Thunderbolt.jl: Language not supported
  • src/discretization/fem.jl: Language not supported
  • src/ferrite-addons/InternalVariableHandler.jl: Language not supported
  • src/ferrite-addons/transfer_operators.jl: Language not supported
  • src/modeling/common.jl: Language not supported
  • src/modeling/core/element_interface.jl: Language not supported
  • src/modeling/coupler/tying.jl: Language not supported
  • src/modeling/electrophysiology/ecg.jl: Language not supported
  • src/modeling/functions.jl: Language not supported

Comment thread docs/src/topics/operators.md Outdated
Comment thread docs/src/topics/nonlinear-solver.md Outdated
@termi-official termi-official force-pushed the do/local-global-solver branch from fb28ea0 to 526f538 Compare March 28, 2025 12:15
@termi-official termi-official force-pushed the do/local-global-solver branch from 526f538 to 2209570 Compare March 28, 2025 12:24
@termi-official termi-official merged commit 7eafcc1 into main Mar 28, 2025
5 checks passed
@termi-official termi-official deleted the do/local-global-solver branch March 28, 2025 16:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Multilevel Newton Solver

2 participants