From 64dd5e9e51a1fc2d43b53c6466e75c6d6439dfe4 Mon Sep 17 00:00:00 2001 From: JordiManyer Date: Sun, 9 Mar 2025 17:40:29 +1100 Subject: [PATCH 1/3] Added Geometry and AMR tutorials --- deps/build.jl | 7 +- src/geometry_dev.jl | 389 ++++++++++++++++++ src/poisson_amr.jl | 200 +++++++++ ...nfitted_poisson.jl => poisson_unfitted.jl} | 0 4 files changed, 594 insertions(+), 2 deletions(-) create mode 100644 src/geometry_dev.jl create mode 100644 src/poisson_amr.jl rename src/{unfitted_poisson.jl => poisson_unfitted.jl} (100%) diff --git a/deps/build.jl b/deps/build.jl index 5d1373e8..1470ef80 100644 --- a/deps/build.jl +++ b/deps/build.jl @@ -18,14 +18,17 @@ files = [ "Isotropic damage model" => "isotropic_damage.jl", "Fluid-Structure Interaction"=>"fsi_tutorial.jl", "Electromagnetic scattering in 2D"=>"emscatter.jl", - "Low-level API Poisson equation"=>"poisson_dev_fe.jl", "On using DrWatson.jl"=>"validation_DrWatson.jl", "Interpolation of CellFields"=>"interpolation_fe.jl", "Poisson equation on parallel distributed-memory computers"=>"poisson_distributed.jl", "Transient Poisson equation"=>"transient_linear.jl", "Transient nonlinear equation"=>"transient_nonlinear.jl", "Topology optimization"=>"TopOptEMFocus.jl", - "Unfitted Poisson"=>"unfitted_poisson.jl"] + "Poisson on unfitted meshes"=>"poisson_unfitted.jl", + "Poisson with AMR"=>"poisson_amr.jl", + "Low-level API - Poisson equation"=>"poisson_dev_fe.jl", + "Low-level API - Geometry" => "geometry_dev.jl", +] Sys.rm(notebooks_dir;recursive=true,force=true) for (i,(title,filename)) in enumerate(files) diff --git a/src/geometry_dev.jl b/src/geometry_dev.jl new file mode 100644 index 00000000..459fb9e1 --- /dev/null +++ b/src/geometry_dev.jl @@ -0,0 +1,389 @@ +# +# In this tutorial, we will learn +# +# - How the `DiscreteModel` and its components work. +# - How to extract topological information from a `GridTopology`. +# - How to extract geometrical information from a `Grid`. +# - How periodicity is handled in Gridap, and the difference between nodes and vertices. +# - How to create a periodic model from scratch, use the example of a Mobius strip. +# +# ## Required Packages + +using Gridap +using Gridap.Geometry, Gridap.ReferenceFEs, Gridap.Arrays +using Plots + +# +# ## Table of Contents +# 1. Utility Functions +# 2. The DiscreteModel Structure +# 3. Working with Topology +# 4. Geometric Mappings +# 5. High-order Grids +# 6. Periodicity in Gridap +# +# ## 1. Utility Functions +# We begin by defining helper functions that will be essential throughout this tutorial. +# These functions help us visualize and work with our mesh structures. + +# Convert a CartesianDiscreteModel to an UnstructuredDiscreteModel for more generic handling +function cartesian_model(args...; kwargs...) + UnstructuredDiscreteModel(CartesianDiscreteModel(args...; kwargs...)) +end + +# Visualization function to plot nodes with their IDs +# Input: node_coords - Array of node coordinates +# node_ids - Array of corresponding node IDs +function plot_node_numbering(node_coords, node_ids) + x = map(c -> c[1], node_coords) + y = map(c -> c[2], node_coords) + a = text.(node_ids, halign=:left, valign=:bottom) + scatter(x, y, series_annotations = a, legend=false) + hline!(unique(x), linestyle=:dash, color=:grey) + vline!(unique(y), linestyle=:dash, color=:grey) +end + +# Overloaded method to plot node numbering directly from a model +# This function extracts the necessary information from the model and calls the base plotting function +function plot_node_numbering(model) + D = num_cell_dims(model) + topo = get_grid_topology(model) + node_coords = Geometry.get_node_coordinates(model) + cell_node_ids = get_cell_node_ids(model) + cell_vertex_ids = Geometry.get_faces(topo, D, 0) + + node_to_vertex = zeros(Int, length(node_coords)) + for (nodes,vertices) in zip(cell_node_ids, cell_vertex_ids) + node_to_vertex[nodes] .= vertices + end + + plot_node_numbering(node_coords, node_to_vertex) +end + +# +# ## 2. The DiscreteModel Structure +# +# The `DiscreteModel` in Gridap is a fundamental structure that represents a discretized +# computational domain. It consists of three main components, each serving a specific purpose: +# +# - The `GridTopology`: Defines the connectivity of the mesh elements +# * Stores how vertices, edges, faces, and cells are connected +# * Enables neighbor queries and traversal of the mesh +# * Pure topological information, no geometric data +# +# - The `Grid`: Contains the geometric information of the mesh +# * Stores coordinates of mesh nodes +# * Provides mappings between reference and physical elements +# * Handles curved elements and high-order geometries +# +# - The `FaceLabeling`: Manages mesh labels and markers +# * Identifies boundary regions +# * Tags different material regions +# * Essential for applying boundary conditions +# +# ### Key Concept: Nodes vs. Vertices +# +# One of the most important distinctions in Gridap is between nodes and vertices: +# +# - **Vertices** (Topological entities): +# * 0-dimensional entities in the `GridTopology` +# * Define the connectivity of the mesh +# * Used for neighbor queries and mesh traversal +# * Number of vertices depends only on topology +# +# - **Nodes** (Geometric entities): +# * Control points stored in the `Grid` +# * Define the geometry of elements +# * Used for interpolation and mapping +# * Number of nodes depends on the geometric order +# +# While nodes and vertices often coincide in simple meshes, they differ in two important cases: +# 1. Periodic meshes: Where multiple nodes may correspond to the same vertex +# 2. High-order meshes: Where additional nodes are needed to represent curved geometries +# +# ## 3. Working with Topology +# +# Let's explore how to extract and work with topological information. We'll start by creating +# a simple 3x3 cartesian mesh: + +model = cartesian_model((0,1,0,1),(3,3)) + +# First, let's get the topology component and count the mesh entities: + +topo = get_grid_topology(model) + +n_vertices = num_faces(topo,0) # Number of vertices (0-dimensional entities) +n_edges = num_faces(topo,1) # Number of edges (1-dimensional entities) +n_cells = num_faces(topo,2) # Number of cells (2-dimensional entities) + +# ### Connectivity Queries +# Gridap provides various methods to query the connectivity between different mesh entities. +# Here are some common queries: + +# Get vertices of each cell (cell → vertex connectivity) +cell_to_vertices = get_faces(topo,2,0) + +# Get edges of each cell (cell → edge connectivity) +cell_to_edges = get_faces(topo,2,1) + +# Get cells adjacent to each edge (edge → cell connectivity) +edge_to_cells = get_faces(topo,1,2) + +# Get vertices of each edge (edge → vertex connectivity) +edge_to_vertices = get_faces(topo,1,0) + +# ### Advanced Connectivity: Finding Cell Neighbors +# +# Finding cells that share entities (like vertices or edges) requires more work. +# A direct query for cell-to-cell connectivity returns an identity map: + +cell_to_cells = get_faces(topo,2,2) # Returns identity table + +# To find actual cell neighbors, we need to traverse through lower-dimensional entities. +# Here's a utility function that builds a face-to-face connectivity graph: + +function get_face_to_face_graph(topo,Df) + n_faces = num_faces(topo,Df) + face_to_vertices = get_faces(topo,Df,0) # Get vertices of each face + vertex_to_faces = get_faces(topo,0,Df) # Get faces incident to each vertex + + face_to_face = Vector{Vector{Int}}(undef,n_faces) + for face in 1:n_faces + nbors = Int[] + # Find faces sharing vertices with current face + for vertex in face_to_vertices[face] + append!(nbors,vertex_to_faces[vertex]) + end + # Remove self-reference and duplicates + face_to_face[face] = filter(!isequal(face),unique(nbors)) + end + + return face_to_face +end + +# Now we can find neighboring cells and edges: +cell_to_cells = get_face_to_face_graph(topo,2) # Cells sharing vertices +edge_to_edges = get_face_to_face_graph(topo,1) # Edges sharing vertices + +# +# ## 4. Geometric Mappings +# +# The geometry of our mesh is defined by mappings from reference elements to physical space. +# Let's explore how these mappings work in Gridap: + +grid = get_grid(model) + +# First, we extract the basic geometric information: +cell_map = get_cell_map(grid) # Mapping from reference to physical space +cell_to_nodes = get_cell_node_ids(grid) # Node IDs for each cell +node_coordinates = get_node_coordinates(grid) # Physical coordinates of nodes + +# ### Computing Cell-wise Node Coordinates +# +# There are two ways to get the coordinates of nodes for each cell: +# +# 1. Using standard Julia mapping: +cell_to_node_coords = map(nodes -> node_coordinates[nodes], cell_to_nodes) + +# 2. Using Gridap's lazy evaluation system (more efficient for large meshes): +cell_to_node_coords = lazy_map(Broadcasting(Reindex(node_coordinates)),cell_to_nodes) + +# ### Geometric Mappings +# +# The mapping from reference to physical space is defined by cell-wise linear combination of: +# 1. Reference element shape functions (basis) +# 2. Physical node coordinates (coefficients) + +cell_reffes = get_cell_reffe(grid) # Get reference elements for each cell +cell_basis = lazy_map(get_shapefuns,cell_reffes) # Get basis functions +cell_map = lazy_map(linear_combination,cell_to_node_coords,cell_basis) + +# ## 5. High-order Grids +# +# High-order geometric representations are essential for accurately modeling curved boundaries +# and complex geometries. Let's explore this by creating a curved mesh: +# +# ### Example: Creating a Half-Cylinder +# +# First, we define a mapping that transforms our planar mesh into a half-cylinder: + +function F(x) + θ = x[1]*pi # Map x-coordinate to angle [0,π] + z = x[2] # Keep y-coordinate as height + VectorValue(cos(θ),sin(θ),z) # Convert to cylindrical coordinates +end + +# Apply the mapping to our node coordinates: +new_node_coordinates = map(F,node_coordinates) + +# Create new cell mappings with the transformed coordinates: +new_cell_to_node_coords = lazy_map(Broadcasting(Reindex(new_node_coordinates)),cell_to_nodes) +new_cell_map = lazy_map(linear_combination,new_cell_to_node_coords,cell_basis) + +# Create a new grid with the transformed geometry: +reffes, cell_types = compress_cell_data(cell_reffes) +new_grid = UnstructuredGrid(new_node_coordinates,cell_to_nodes,reffes,cell_types) + +# Save for visualization: +writevtk(new_grid,"half_cylinder_linear") + +# +# If we visualize the result, we'll notice that despite applying a curved mapping, +# our half-cylinder looks faceted. This is because we're still using linear elements +# (straight edges) to approximate the curved geometry. +# +# ### Solution: High-order Elements +# +# To accurately represent curved geometries, we need high-order elements: + +# Create quadratic reference elements: +order = 2 # Polynomial order +new_reffes = [LagrangianRefFE(Float64,QUAD,order)] # Quadratic quadrilateral elements +new_cell_reffes = expand_cell_data(new_reffes,cell_types) + +# Create a finite element space to handle the high-order geometry: +space = FESpace(model,new_cell_reffes) +new_cell_to_nodes = get_cell_dof_ids(space) + +# Get the quadratic nodes in the reference element: +cell_dofs = lazy_map(get_dof_basis,new_cell_reffes) +cell_basis = lazy_map(get_shapefuns,new_cell_reffes) +cell_to_ref_coordinates = lazy_map(get_nodes,cell_dofs) + +# Map the reference nodes to the physical space: +cell_to_phys_coordinates = lazy_map(evaluate,cell_map,cell_to_ref_coordinates) + +# Create the high-order node coordinates: +new_n_nodes = maximum(maximum,new_cell_to_nodes) +new_node_coordinates = zeros(VectorValue{2,Float64},new_n_nodes) +for (cell,nodes) in enumerate(new_cell_to_nodes) + for (i,node) in enumerate(nodes) + new_node_coordinates[node] = cell_to_phys_coordinates[cell][i] + end +end + +# Apply our cylindrical mapping to the high-order nodes: +new_node_coordinates = map(F,new_node_coordinates) + +# Create the high-order grid: +new_grid = UnstructuredGrid(new_node_coordinates,new_cell_to_nodes,new_reffes,cell_types) +writevtk(new_grid,"half_cylinder_quadratic") + +# The resulting mesh now accurately represents the curved geometry of the half-cylinder, +# with quadratic elements properly capturing the curvature (despite paraview still showing +# a linear interpolation between the nodes). + +# +# ## 6. Periodicity in Gridap +# +# Periodic boundary conditions are essential in many applications, such as: +# - Modeling crystalline materials +# - Simulating fluid flow in periodic domains +# - Analyzing electromagnetic wave propagation +# +# Gridap handles periodicity through a clever approach: +# 1. In the topology: Periodic vertices are "glued" together, creating a single topological entity +# 2. In the geometry: The corresponding nodes maintain their distinct physical positions +# +# This separation between topology and geometry allows us to: +# - Maintain the correct geometric representation +# - Automatically enforce periodic boundary conditions +# - Avoid mesh distortion at periodic boundaries +# +# ### Visualizing Periodicity +# +# Let's examine how periodicity affects the mesh structure through three examples: + +# 1. Standard non-periodic mesh: +model = cartesian_model((0,1,0,1),(3,3)) +plot_node_numbering(model) + +# 2. Mesh with periodicity in x-direction: +model = cartesian_model((0,1,0,1),(3,3),isperiodic=(true,false)) +plot_node_numbering(model) + +# 3. Mesh with periodicity in both directions: +model = cartesian_model((0,1,0,1),(3,3),isperiodic=(true,true)) +plot_node_numbering(model) + +# Notice how the vertex numbers (displayed at node positions) show the topological +# connectivity, while the nodes remain at their physical positions. +# +# ### Creating a Möbius Strip +# +# We'll create it by: +# 1. Starting with a rectangular mesh +# 2. Making it periodic in one direction +# 3. Adding a twist before connecting the ends +# +# #### Step 1: Create Base Mesh +# +# Start with a 3x3 cartesian mesh: + +nc = (3,3) # Number of cells in each direction +model = cartesian_model((0,1,0,1),nc) + +# Extract geometric and topological information: +node_coords = get_node_coordinates(model) # Physical positions +cell_node_ids = get_cell_node_ids(model) # Node connectivity +cell_type = get_cell_type(model) # Element type +reffes = get_reffes(model) # Reference elements + +# #### Step 2: Create Periodic Topology +# +# To create the Möbius strip, we need to: +# 1. Identify vertices to be connected +# 2. Reverse one edge to create the twist +# 3. Ensure proper connectivity + +# Create initial vertex numbering: +np = nc .+ 1 # Number of points in each direction +mobius_ids = collect(LinearIndices(np)) + +# Create the twist by reversing the last row: +mobius_ids[end,:] = reverse(mobius_ids[1,:]) + +# Map cell nodes to the new vertex numbering: +cell_vertex_ids = map(nodes -> mobius_ids[nodes], cell_node_ids) + +# #### Step 3: Clean Up Vertex Numbering +# +# The new vertex IDs aren't contiguous (some numbers are duplicated due to periodicity). +# We need to create a clean mapping: + +# Find unique vertices and create bidirectional mappings: +vertex_to_node = unique(vcat(cell_vertex_ids...)) +node_to_vertex = find_inverse_index_map(vertex_to_node) + +# Renumber vertices to be contiguous: +cell_vertex_ids = map(nodes -> node_to_vertex[nodes], cell_vertex_ids) + +# Convert to the Table format required by Gridap: +cell_vertex_ids = Table(cell_vertex_ids) + +# Get coordinates for the vertices: +vertex_coords = node_coords[vertex_to_node] +polys = map(get_polytope,reffes) + +# #### Step 4: Create the Model +# +# Now we can create our Möbius strip model: + +# Create topology with periodic connections: +topo = UnstructuredGridTopology( + vertex_coords, cell_vertex_ids, cell_type, polytopes +) + +# Create grid (geometry remains unchanged): +grid = UnstructuredGrid( + node_coords, cell_node_ids, reffes, cell_type +) + +# Add basic face labels: +labels = FaceLabeling(topo) + +# Combine into final model: +mobius = UnstructuredDiscreteModel(grid,topo,labels) + +# Visualize the vertex numbering: +plot_node_numbering(mobius) diff --git a/src/poisson_amr.jl b/src/poisson_amr.jl new file mode 100644 index 00000000..441b34bc --- /dev/null +++ b/src/poisson_amr.jl @@ -0,0 +1,200 @@ +# +# In this tutorial, we will learn: +# +# - How to use adaptive mesh refinement (AMR) with Gridap +# - How to set up a Poisson problem on an L-shaped domain +# - How to implement error estimation and marking strategies +# - How to visualize the AMR process and results +# +# ## Problem Overview +# +# We will solve the Poisson equation on an L-shaped domain using adaptive mesh refinement. +# The L-shaped domain is known to introduce a singularity at its reentrant corner, +# making it an excellent test case for AMR. The problem is: +# +# ```math +# \begin{aligned} +# -\Delta u &= f &&\text{in } \Omega \\ +# u &= g &&\text{on } \partial\Omega +# \end{aligned} +# ``` +# +# where Ω is the L-shaped domain, and we choose an exact solution with a singularity +# to demonstrate the effectiveness of AMR. +# +# ## Error Estimation and AMR Process +# +# We use a residual-based a posteriori error estimator η. For each element K in the mesh, +# the local error indicator ηK is computed as: +# +# ```math +# \eta_K^2 = h_K^2\|f + \Delta u_h\|_{L^2(K)}^2 + h_K\|\jump{\nabla u_h \cdot n}\|_{L^2(\partial K)}^2 +# ``` +# +# where: +# - h_K is the diameter of element K +# - u_h is the computed finite element solution +# - The first term measures the element residual +# - The second term measures the jump in the normal derivative across element boundaries +# +# The AMR process follows these steps in each iteration: +# +# 1. **Solve**: Compute the finite element solution u_h on the current mesh +# 2. **Estimate**: Calculate error indicators ηK for each element +# 3. **Mark**: Use Dörfler marking to select elements for refinement +# - Sort elements by error indicator +# - Mark elements containing a fixed fraction (here 80%) of total error +# 4. **Refine**: Refine selected elements to obtain a new mesh. In this example, +# we will be using the newest vertex bisection (NVB) method to keep the mesh +# conforming (without any hanging nodes). +# +# This adaptive loop continues until either: +# - A maximum number of iterations is reached +# - The estimated error falls below a threshold +# - The solution achieves desired accuracy +# +# The process automatically concentrates mesh refinement in regions of high error, +# particularly around the reentrant corner where the solution has reduced regularity. +# This results in better accuracy per degree of freedom compared to uniform refinement. +# +# ## Required Packages + +using Gridap, Gridap.Geometry, Gridap.Adaptivity +using DataStructures + +# ## Problem Setup +# +# We define an exact solution that contains a singularity at the corner (0.5, 0.5) +# of the L-shaped domain. This singularity will demonstrate how AMR automatically +# refines the mesh in regions of high error. + +ϵ = 1e-2 +r(x) = ((x[1]-0.5)^2 + (x[2]-0.5)^2)^(1/2) +u_exact(x) = 1.0 / (ϵ + r(x)) + +# Create an L-shaped domain by removing a quadrant from a unit square. +# The domain is [0,1]² \ [0.5,1]×[0.5,1] +function LShapedModel(n) + model = CartesianDiscreteModel((0,1,0,1),(n,n)) + cell_coords = map(mean,get_cell_coordinates(model)) + l_shape_filter(x) = (x[1] < 0.5) || (x[2] < 0.5) + mask = map(l_shape_filter,cell_coords) + return simplexify(DiscreteModelPortion(model,mask)) +end + +# Define the L2 norm for error estimation. +# These will be used to compute both local and global error measures. +l2_norm(he,xh,dΩ) = ∫(he*(xh*xh))*dΩ +l2_norm(xh,dΩ) = ∫(xh*xh)*dΩ + +# ## AMR Step Function +# +# The `amr_step` function performs a single step of the adaptive mesh refinement process: +# 1. Solves the Poisson problem on the current mesh +# 2. Estimates the error using residual-based error indicators +# 3. Marks cells for refinement using Dörfler marking +# 4. Refines the mesh using newest vertex bisection (NVB) + +function amr_step(model,u_exact;order=1) + # Create FE spaces with Dirichlet boundary conditions on all boundaries + reffe = ReferenceFE(lagrangian,Float64,order) + V = TestFESpace(model,reffe;dirichlet_tags=["boundary"]) + U = TrialFESpace(V,u_exact) + + # Setup integration measures + Ω = Triangulation(model) + Γ = Boundary(model) + Λ = Skeleton(model) + + dΩ = Measure(Ω,4*order) + dΓ = Measure(Γ,2*order) + dΛ = Measure(Λ,2*order) + + # Compute cell sizes for error estimation + hK = CellField(sqrt.(collect(get_array(∫(1)dΩ))),Ω) + + # Get normal vectors for boundary and interface terms + nΓ = get_normal_vector(Γ) + nΛ = get_normal_vector(Λ) + + # Define the weak form + ∇u(x) = ∇(u_exact)(x) + f(x) = -Δ(u_exact)(x) + a(u,v) = ∫(∇(u)⋅∇(v))dΩ + l(v) = ∫(f*v)dΩ + + # Define the residual error estimator + # It includes volume residual, boundary jump, and interface jump terms + ηh(u) = l2_norm(hK*(f + Δ(u)),dΩ) + # Volume residual + l2_norm(hK*(∇(u) - ∇u)⋅nΓ,dΓ) + # Boundary jump + l2_norm(jump(hK*∇(u)⋅nΛ),dΛ) # Interface jump + + # Solve the FE problem + op = AffineFEOperator(a,l,U,V) + uh = solve(op) + + # Compute error indicators + η = estimate(ηh,uh) + + # Mark cells for refinement using Dörfler marking + # This strategy marks cells containing a fixed fraction (0.8) of the total error + m = DorflerMarking(0.8) + I = Adaptivity.mark(m,η) + + # Refine the mesh using newest vertex bisection + method = Adaptivity.NVBRefinement(model) + amodel = refine(method,model;cells_to_refine=I) + fmodel = Adaptivity.get_model(amodel) + + # Compute the global error for convergence testing + error = sum(l2_norm(uh - u_exact,dΩ)) + return fmodel, uh, η, I, error +end + +# ## Main AMR Loop +# +# We perform multiple AMR steps, refining the mesh iteratively and solving +# the problem on each refined mesh. This demonstrates how the error decreases +# as the mesh is adaptively refined in regions of high error. + +nsteps = 5 +order = 1 +model = LShapedModel(10) + +last_error = Inf +for i in 1:nsteps + # Perform one AMR step + fmodel, uh, η, I, error = amr_step(model,u_exact;order) + + # Create indicator field for refined cells + is_refined = map(i -> ifelse(i ∈ I, 1, -1), 1:num_cells(model)) + + # Visualize results + Ω = Triangulation(model) + writevtk( + Ω,"model_$(i-1)",append=false, + cellfields = [ + "uh" => uh, # Computed solution + "η" => CellField(η,Ω), # Error indicators + "is_refined" => CellField(is_refined,Ω), # Refinement markers + "u_exact" => CellField(u_exact,Ω), # Exact solution + ], + ) + + # Print error information and verify convergence + println("Error: $error, Error η: $(sum(η))") + @test (i < 3) || (error < last_error) + last_error = error + model = fmodel +end + +# ## Conclusion +# +# In this tutorial, we have demonstrated how to: +# 1. Implement adaptive mesh refinement for the Poisson equation +# 2. Use residual-based error estimation to identify regions needing refinement +# 3. Apply Dörfler marking to select cells for refinement +# 4. Visualize the AMR process and solution convergence +# +# The results show how AMR automatically refines the mesh near the singularity, +# leading to more efficient and accurate solutions compared to uniform refinement. diff --git a/src/unfitted_poisson.jl b/src/poisson_unfitted.jl similarity index 100% rename from src/unfitted_poisson.jl rename to src/poisson_unfitted.jl From c66a1e204531fba3f93a01b8c1b8381814f8b9d2 Mon Sep 17 00:00:00 2001 From: JordiManyer Date: Sun, 9 Mar 2025 18:16:23 +1100 Subject: [PATCH 2/3] Minor --- src/geometry_dev.jl | 6 ++---- src/poisson_amr.jl | 36 ++++++++++++++++-------------------- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/geometry_dev.jl b/src/geometry_dev.jl index 459fb9e1..4ed0129e 100644 --- a/src/geometry_dev.jl +++ b/src/geometry_dev.jl @@ -150,12 +150,10 @@ function get_face_to_face_graph(topo,Df) face_to_face = Vector{Vector{Int}}(undef,n_faces) for face in 1:n_faces nbors = Int[] - # Find faces sharing vertices with current face for vertex in face_to_vertices[face] - append!(nbors,vertex_to_faces[vertex]) + append!(nbors,vertex_to_faces[vertex]) # Add incident faces end - # Remove self-reference and duplicates - face_to_face[face] = filter(!isequal(face),unique(nbors)) + face_to_face[face] = filter(!isequal(face),unique(nbors)) # Remove self-reference and duplicates end return face_to_face diff --git a/src/poisson_amr.jl b/src/poisson_amr.jl index 441b34bc..d3b926d8 100644 --- a/src/poisson_amr.jl +++ b/src/poisson_amr.jl @@ -28,12 +28,12 @@ # the local error indicator ηK is computed as: # # ```math -# \eta_K^2 = h_K^2\|f + \Delta u_h\|_{L^2(K)}^2 + h_K\|\jump{\nabla u_h \cdot n}\|_{L^2(\partial K)}^2 +# \eta_K^2 = h_K^2\|f + \Delta u_h\|_{L^2(K)}^2 + h_K\|\lbrack\!\lbrack \nabla u_h \cdot n \rbrack\!\rbrack \|_{L^2(\partial K)}^2 # ``` # # where: -# - h_K is the diameter of element K -# - u_h is the computed finite element solution +# - `h_K` is the diameter of element K +# - `u_h` is the computed finite element solution # - The first term measures the element residual # - The second term measures the jump in the normal derivative across element boundaries # @@ -96,12 +96,12 @@ l2_norm(xh,dΩ) = ∫(xh*xh)*dΩ # 4. Refines the mesh using newest vertex bisection (NVB) function amr_step(model,u_exact;order=1) - # Create FE spaces with Dirichlet boundary conditions on all boundaries + "Create FE spaces with Dirichlet boundary conditions on all boundaries" reffe = ReferenceFE(lagrangian,Float64,order) V = TestFESpace(model,reffe;dirichlet_tags=["boundary"]) U = TrialFESpace(V,u_exact) - # Setup integration measures + "Setup integration measures" Ω = Triangulation(model) Γ = Boundary(model) Λ = Skeleton(model) @@ -110,43 +110,43 @@ function amr_step(model,u_exact;order=1) dΓ = Measure(Γ,2*order) dΛ = Measure(Λ,2*order) - # Compute cell sizes for error estimation + "Compute cell sizes for error estimation" hK = CellField(sqrt.(collect(get_array(∫(1)dΩ))),Ω) - # Get normal vectors for boundary and interface terms + "Get normal vectors for boundary and interface terms" nΓ = get_normal_vector(Γ) nΛ = get_normal_vector(Λ) - # Define the weak form + "Define the weak form" ∇u(x) = ∇(u_exact)(x) f(x) = -Δ(u_exact)(x) a(u,v) = ∫(∇(u)⋅∇(v))dΩ l(v) = ∫(f*v)dΩ - # Define the residual error estimator - # It includes volume residual, boundary jump, and interface jump terms + "Define the residual error estimator + It includes volume residual, boundary jump, and interface jump terms" ηh(u) = l2_norm(hK*(f + Δ(u)),dΩ) + # Volume residual l2_norm(hK*(∇(u) - ∇u)⋅nΓ,dΓ) + # Boundary jump l2_norm(jump(hK*∇(u)⋅nΛ),dΛ) # Interface jump - # Solve the FE problem + "Solve the FE problem" op = AffineFEOperator(a,l,U,V) uh = solve(op) - # Compute error indicators + "Compute error indicators" η = estimate(ηh,uh) - # Mark cells for refinement using Dörfler marking - # This strategy marks cells containing a fixed fraction (0.8) of the total error + "Mark cells for refinement using Dörfler marking + This strategy marks cells containing a fixed fraction (0.8) of the total error" m = DorflerMarking(0.8) I = Adaptivity.mark(m,η) - # Refine the mesh using newest vertex bisection + "Refine the mesh using newest vertex bisection" method = Adaptivity.NVBRefinement(model) amodel = refine(method,model;cells_to_refine=I) fmodel = Adaptivity.get_model(amodel) - # Compute the global error for convergence testing + "Compute the global error for convergence testing" error = sum(l2_norm(uh - u_exact,dΩ)) return fmodel, uh, η, I, error end @@ -163,13 +163,10 @@ model = LShapedModel(10) last_error = Inf for i in 1:nsteps - # Perform one AMR step fmodel, uh, η, I, error = amr_step(model,u_exact;order) - # Create indicator field for refined cells is_refined = map(i -> ifelse(i ∈ I, 1, -1), 1:num_cells(model)) - # Visualize results Ω = Triangulation(model) writevtk( Ω,"model_$(i-1)",append=false, @@ -181,7 +178,6 @@ for i in 1:nsteps ], ) - # Print error information and verify convergence println("Error: $error, Error η: $(sum(η))") @test (i < 3) || (error < last_error) last_error = error From cf5207f0ac271a657be2a0482932612503327ce3 Mon Sep 17 00:00:00 2001 From: JordiManyer Date: Sun, 9 Mar 2025 18:43:03 +1100 Subject: [PATCH 3/3] Added images --- assets/amr/result.png | Bin 0 -> 43136 bytes assets/geometry/mobius.png | Bin 0 -> 23191 bytes assets/geometry/nodes_fullperiodic.png | Bin 0 -> 22384 bytes assets/geometry/nodes_halfperiodic.png | Bin 0 -> 23112 bytes assets/geometry/nodes_nonperiodic.png | Bin 0 -> 23794 bytes src/geometry_dev.jl | 6 +++++- src/poisson_amr.jl | 8 +++++--- 7 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 assets/amr/result.png create mode 100644 assets/geometry/mobius.png create mode 100644 assets/geometry/nodes_fullperiodic.png create mode 100644 assets/geometry/nodes_halfperiodic.png create mode 100644 assets/geometry/nodes_nonperiodic.png diff --git a/assets/amr/result.png b/assets/amr/result.png new file mode 100644 index 0000000000000000000000000000000000000000..15e4b20f3df4fc98e203781a537e838ed6c29247 GIT binary patch literal 43136 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 K-CS*4$o~Mp8V`~H literal 0 HcmV?d00001 diff --git a/assets/geometry/mobius.png b/assets/geometry/mobius.png new file mode 100644 index 0000000000000000000000000000000000000000..0fcbcdce415bce992aad2ebbae9bf38b2280011b GIT binary patch literal 23191 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 U8l(JGCrYD<-1T1y^!%NQw+9!Ve*gdg literal 0 HcmV?d00001 diff --git a/assets/geometry/nodes_fullperiodic.png b/assets/geometry/nodes_fullperiodic.png new file mode 100644 index 0000000000000000000000000000000000000000..4922969c686d029fd1b6c03b6ba0dcd3ba9ff2bf GIT binary patch literal 22384 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 Ti7mj>a2Y&Z{an^LB{Ts5yjm?5 literal 0 HcmV?d00001 diff --git a/assets/geometry/nodes_halfperiodic.png b/assets/geometry/nodes_halfperiodic.png new file mode 100644 index 0000000000000000000000000000000000000000..72410bf29e767555a0329c02efdfc64bcf7cc398 GIT binary patch literal 23112 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 literal 0 HcmV?d00001 diff --git a/assets/geometry/nodes_nonperiodic.png b/assets/geometry/nodes_nonperiodic.png new file mode 100644 index 0000000000000000000000000000000000000000..2d90167d5d0c66b92a0b8dddd86c6e74cbf64924 GIT binary patch literal 23794 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