Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
ee44746
Add Superconductor sheet boundary configuration
dnpham23 Sep 1, 2026
e96edae
Add SuperconductorSheetOperator
dnpham23 Sep 1, 2026
fbc1c48
Include kinetic sheet term in curl-curl stiffness matrix
dnpham23 Sep 1, 2026
1da2aba
Include kinetic sheet energy in extracted inductance
dnpham23 Sep 1, 2026
e2eb346
Add microstrip kinetic inductance validation example
dnpham23 Sep 1, 2026
2f38a66
Add LondonPCShift option and London-aware AMSSingularOperator default
dnpham23 Sep 2, 2026
ca7b1d5
Add curl-free cut cohomology generator for London flux drive
dnpham23 Sep 2, 2026
e7a1bb1
Solve London flux films via range-space two-solve with fluxoid constr…
dnpham23 Sep 2, 2026
3a4f672
Apply London two-solve and cross-energy correction in magnetostatic d…
dnpham23 Sep 2, 2026
faf1004
Add square/circular/double hole examples and document total inductance
dnpham23 Sep 2, 2026
a7dd633
Add London hole regression cases and replace circular with square washer
dnpham23 Sep 2, 2026
44920ec
Update ring_disk mixed current-flux refs for kinetic inductance
dnpham23 Sep 2, 2026
7ea55cc
Make London flux two-solve partition-stable and fail loudly on non-co…
dnpham23 Sep 3, 2026
b5a4197
Route bare magnetostatic FluxLoopPEC films through the London two-solve
dnpham23 Sep 4, 2026
76b20bd
Orient the London fluxoid functional by the flux loop direction
dnpham23 Sep 4, 2026
e478174
Allow nonconformal adaptation with London flux loop excitation
dnpham23 Sep 4, 2026
9103bd1
Add PALACE_LONDON_AH=angle diagnostic generator
dnpham23 Sep 4, 2026
3024349
Make the London cut generator non-conformal-safe (a_h = Grad ψ − a_an…
dnpham23 Sep 8, 2026
8133491
Move circular_hole_london_flux reference into a base/ subdir
dnpham23 Sep 8, 2026
3e09e48
Halt AMR gracefully when a London solve does not converge
dnpham23 Sep 8, 2026
e78edb2
Halt AMR when the London kinetic penalty energy spikes
dnpham23 Sep 9, 2026
4915e0a
Docs: use L_ksq subscript to match the code label
dnpham23 Sep 10, 2026
de554ca
Merge remote-tracking branch 'upstream/main' into dnpham23/total-indu…
dnpham23 Sep 10, 2026
4cd626c
Rename FluxLoop key FluxLoopPEC to FilmAttributes; clang-format sources
dnpham23 Sep 10, 2026
3cc800a
Merge remote-tracking branch 'upstream/main' into dnpham23/total-indu…
dnpham23 Sep 10, 2026
d0761b0
Remove diagnostic env-var generator modes; add PecPenetrationDepth to…
dnpham23 Sep 10, 2026
de5107e
Delete dead non-London flux-loop code paths
dnpham23 Sep 10, 2026
a313580
Fix CI style: bump schema to 2-0-0; format docs and mesh scripts
dnpham23 Sep 10, 2026
abc0a5d
Remove dead non-London and regularization paths; graceful phi_h halt;…
dnpham23 Sep 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions docs/src/developer/notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -226,10 +226,11 @@ several *Palace* releases. The table below records the schema version shipped by
*Palace* release; a listed version applies from that release until the next row. Add a
row when a release is cut, recording the schema version at that boundary.

| Schema version | *Palace* release | Notes |
|:--------------:|:----------------:|:---------------------------------- |
| `1-0-0` | `0.17` | First explicitly-versioned schema. |
| `1-6-0` | `0.18` | |
| Schema version | *Palace* release | Notes |
|:--------------:|:----------------:|:-------------------------------------------------------------------------------------------------------------------- |
| `1-0-0` | `0.17` | First explicitly-versioned schema. |
| `1-6-0` | `0.18` | |
| `2-0-0` | `0.18` | Rename FluxLoop `FluxLoopPEC` to `FilmAttributes`; add `Superconductor` boundary and FluxLoop `PecPenetrationDepth`. |

#### When and how to bump (PR checklist)

Expand Down
414 changes: 236 additions & 178 deletions docs/src/examples/circular_hole.md

Large diffs are not rendered by default.

10 changes: 9 additions & 1 deletion examples/circular_hole/circular_hole.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,19 @@
{
"Attributes": [2, 3, 4, 5, 6, 7]
},
"Superconductor":
[
{
"Attributes": [8], // London film: total (geometric + kinetic) inductance
"PenetrationDepth": 0.4, // λ (μm); L_ksq = μ₀ λ² / d
"Thickness": 0.1 // d (μm)
}
],
"FluxLoop":
[
{
"Index": 1,
"FluxLoopPEC": [8],
"FilmAttributes": [8],
"HoleAttributes": [9],
"FluxAmounts": [1.0], // nondimensional flux-loop excitation amplitude
"Direction": "+Z"
Expand Down
12 changes: 10 additions & 2 deletions examples/circular_hole/double_circular_hole_multi_flux.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,18 +43,26 @@
{
"Attributes": [2, 3, 4, 5, 6, 7]
},
"Superconductor":
[
{
"Attributes": [8], // shared London film carrying both holes
"PenetrationDepth": 0.4, // λ (μm); L_ksq = μ₀ λ² / d
"Thickness": 0.1 // d (μm)
}
],
"FluxLoop":
[
{
"Index": 1,
"FluxLoopPEC": [8],
"FilmAttributes": [8],
"HoleAttributes": [9],
"FluxAmounts": [1.0], // nondimensional flux-loop excitation amplitude
"Direction": [0.0, 0.0, 1.0]
},
{
"Index": 2,
"FluxLoopPEC": [8],
"FilmAttributes": [8],
"HoleAttributes": [10],
"FluxAmounts": [1.0], // nondimensional flux-loop excitation amplitude
"Direction": [0.0, 0.0, 1.0]
Expand Down
14 changes: 11 additions & 3 deletions examples/circular_hole/double_circular_hole_multi_planes.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
{
"Type": "Magnetostatic",
"Verbose": 2,
"Output": "postpro_multi_flux"
"Output": "postpro_multi_planes"
},
"Model":
{
Expand Down Expand Up @@ -43,18 +43,26 @@
{
"Attributes": [2, 3, 4, 5, 6, 7]
},
"Superconductor":
[
{
"Attributes": [8, 10], // two separated London films, one hole each
"PenetrationDepth": 0.4, // λ (μm); L_ksq = μ₀ λ² / d
"Thickness": 0.1 // d (μm)
}
],
"FluxLoop":
[
{
"Index": 1,
"FluxLoopPEC": [8],
"FilmAttributes": [8],
"HoleAttributes": [9],
"FluxAmounts": [1.0], // nondimensional flux-loop excitation amplitude
"Direction": [0.0, 0.0, 1.0]
},
{
"Index": 2,
"FluxLoopPEC": [10],
"FilmAttributes": [10],
"HoleAttributes": [11],
"FluxAmounts": [1.0],
"Direction": [0.0, 0.0, 1.0]
Expand Down
Binary file added examples/circular_hole/mesh/rect_hole.msh
Binary file not shown.
236 changes: 236 additions & 0 deletions examples/circular_hole/mesh/rect_hole_mesh.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,236 @@
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0

using Gmsh: gmsh

"""
generate_rect_hole_mesh(;
filename = "rect_hole.msh",
dx = 2.0, dy = 5.0, # hole side lengths
W = 3.0, # film border width (outer film = (dx+2W) x (dy+2W))
L_outer = 30.0, # computational box size
mesh_size_coarse = 3.0,
mesh_size_medium = 0.5,
mesh_size_fine = 0.2,
verbose = 5, gui = false)

Rectangular superconducting film with a central rectangular hole (Khapaev 1997,
Supercond. Sci. Technol. 10 389, table 1 / figure 3). Attribute scheme matches
circular_hole: domain=1, box walls=2-7, film=8, hole=9.
"""
function generate_rect_hole_mesh(;
filename::AbstractString="rect_hole.msh",
dx::Real=2.0,
dy::Real=5.0,
W::Real=3.0,
L_outer::Real=30.0,
mesh_size_coarse::Real=3.0,
mesh_size_medium::Real=0.5,
mesh_size_fine::Real=0.2,
verbose::Integer=5,
gui::Bool=false
)
gmsh.initialize()
gmsh.option.setNumber("General.Verbosity", verbose)
gmsh.model.add("rect_hole")
gmsh.option.setNumber("Mesh.MshFileVersion", 2.2)

cx, cy, cz = 0.5, 0.5, 0.5
hx, hy = dx / 2, dy / 2 # hole half-sides
fx, fy = dx / 2 + W, dy / 2 + W # film half-sides

cube_pts = [
gmsh.model.geo.addPoint(
cx - L_outer / 2,
cy - L_outer / 2,
cz - L_outer / 2,
mesh_size_coarse
),
gmsh.model.geo.addPoint(
cx + L_outer / 2,
cy - L_outer / 2,
cz - L_outer / 2,
mesh_size_coarse
),
gmsh.model.geo.addPoint(
cx + L_outer / 2,
cy + L_outer / 2,
cz - L_outer / 2,
mesh_size_coarse
),
gmsh.model.geo.addPoint(
cx - L_outer / 2,
cy + L_outer / 2,
cz - L_outer / 2,
mesh_size_coarse
),
gmsh.model.geo.addPoint(
cx - L_outer / 2,
cy - L_outer / 2,
cz + L_outer / 2,
mesh_size_coarse
),
gmsh.model.geo.addPoint(
cx + L_outer / 2,
cy - L_outer / 2,
cz + L_outer / 2,
mesh_size_coarse
),
gmsh.model.geo.addPoint(
cx + L_outer / 2,
cy + L_outer / 2,
cz + L_outer / 2,
mesh_size_coarse
),
gmsh.model.geo.addPoint(
cx - L_outer / 2,
cy + L_outer / 2,
cz + L_outer / 2,
mesh_size_coarse
)
]

outer_pts = [
gmsh.model.geo.addPoint(cx - fx, cy - fy, cz, mesh_size_medium),
gmsh.model.geo.addPoint(cx + fx, cy - fy, cz, mesh_size_medium),
gmsh.model.geo.addPoint(cx + fx, cy + fy, cz, mesh_size_medium),
gmsh.model.geo.addPoint(cx - fx, cy + fy, cz, mesh_size_medium)
]
inner_pts = [
gmsh.model.geo.addPoint(cx - hx, cy - hy, cz, mesh_size_fine),
gmsh.model.geo.addPoint(cx + hx, cy - hy, cz, mesh_size_fine),
gmsh.model.geo.addPoint(cx + hx, cy + hy, cz, mesh_size_fine),
gmsh.model.geo.addPoint(cx - hx, cy + hy, cz, mesh_size_fine)
]

cube_lines = [
gmsh.model.geo.addLine(cube_pts[1], cube_pts[2]),
gmsh.model.geo.addLine(cube_pts[2], cube_pts[3]),
gmsh.model.geo.addLine(cube_pts[3], cube_pts[4]),
gmsh.model.geo.addLine(cube_pts[4], cube_pts[1]),
gmsh.model.geo.addLine(cube_pts[5], cube_pts[6]),
gmsh.model.geo.addLine(cube_pts[6], cube_pts[7]),
gmsh.model.geo.addLine(cube_pts[7], cube_pts[8]),
gmsh.model.geo.addLine(cube_pts[8], cube_pts[5]),
gmsh.model.geo.addLine(cube_pts[1], cube_pts[5]),
gmsh.model.geo.addLine(cube_pts[2], cube_pts[6]),
gmsh.model.geo.addLine(cube_pts[3], cube_pts[7]),
gmsh.model.geo.addLine(cube_pts[4], cube_pts[8])
]
outer_lines = [
gmsh.model.geo.addLine(outer_pts[1], outer_pts[2]),
gmsh.model.geo.addLine(outer_pts[2], outer_pts[3]),
gmsh.model.geo.addLine(outer_pts[3], outer_pts[4]),
gmsh.model.geo.addLine(outer_pts[4], outer_pts[1])
]
inner_lines = [
gmsh.model.geo.addLine(inner_pts[1], inner_pts[2]),
gmsh.model.geo.addLine(inner_pts[2], inner_pts[3]),
gmsh.model.geo.addLine(inner_pts[3], inner_pts[4]),
gmsh.model.geo.addLine(inner_pts[4], inner_pts[1])
]

outer_loop = gmsh.model.geo.addCurveLoop(outer_lines)
inner_loop = gmsh.model.geo.addCurveLoop(inner_lines)
disk_surface = gmsh.model.geo.addPlaneSurface([outer_loop, inner_loop])
hole_surface = gmsh.model.geo.addPlaneSurface([inner_loop])

cube_loops = [
gmsh.model.geo.addCurveLoop([
cube_lines[1],
cube_lines[2],
cube_lines[3],
cube_lines[4]
]),
gmsh.model.geo.addCurveLoop([
cube_lines[5],
cube_lines[6],
cube_lines[7],
cube_lines[8]
]),
gmsh.model.geo.addCurveLoop([
cube_lines[9],
cube_lines[5],
-cube_lines[10],
-cube_lines[1]
]),
gmsh.model.geo.addCurveLoop([
cube_lines[10],
cube_lines[6],
-cube_lines[11],
-cube_lines[2]
]),
gmsh.model.geo.addCurveLoop([
cube_lines[11],
cube_lines[7],
-cube_lines[12],
-cube_lines[3]
]),
gmsh.model.geo.addCurveLoop([
cube_lines[12],
cube_lines[8],
-cube_lines[9],
-cube_lines[4]
])
]
cube_surfaces = [gmsh.model.geo.addPlaneSurface([loop]) for loop in cube_loops]

surface_loop =
gmsh.model.geo.addSurfaceLoop([cube_surfaces..., disk_surface, hole_surface])
volume = gmsh.model.geo.addVolume([surface_loop])
gmsh.model.geo.synchronize()

gmsh.model.mesh.field.add("Distance", 1)
gmsh.model.mesh.field.setNumbers(1, "CurvesList", inner_lines)
gmsh.model.mesh.field.add("Threshold", 2)
gmsh.model.mesh.field.setNumber(2, "InField", 1)
gmsh.model.mesh.field.setNumber(2, "SizeMin", mesh_size_fine)
gmsh.model.mesh.field.setNumber(2, "SizeMax", mesh_size_medium)
gmsh.model.mesh.field.setNumber(2, "DistMin", 0.3)
gmsh.model.mesh.field.setNumber(2, "DistMax", 1.5)

gmsh.model.mesh.field.add("Distance", 3)
gmsh.model.mesh.field.setNumbers(3, "CurvesList", outer_lines)
gmsh.model.mesh.field.add("Threshold", 4)
gmsh.model.mesh.field.setNumber(4, "InField", 3)
gmsh.model.mesh.field.setNumber(4, "SizeMin", mesh_size_medium)
gmsh.model.mesh.field.setNumber(4, "SizeMax", mesh_size_coarse)
gmsh.model.mesh.field.setNumber(4, "DistMin", 0.5)
gmsh.model.mesh.field.setNumber(4, "DistMax", 3.0)

gmsh.model.mesh.field.add("Constant", 6)
gmsh.model.mesh.field.setNumber(6, "VIn", mesh_size_coarse)
gmsh.model.mesh.field.setNumber(6, "VOut", mesh_size_coarse)
gmsh.model.mesh.field.setNumbers(6, "SurfacesList", cube_surfaces)

gmsh.model.mesh.field.add("Min", 5)
gmsh.model.mesh.field.setNumbers(5, "FieldsList", [2, 4])
gmsh.model.mesh.field.add("Max", 7)
gmsh.model.mesh.field.setNumbers(7, "FieldsList", [5, 6])
gmsh.model.mesh.field.setAsBackgroundMesh(7)

gmsh.model.addPhysicalGroup(3, [volume], 1, "domain")
gmsh.model.addPhysicalGroup(2, [cube_surfaces[1]], 2, "cube_wall_m_xy")
gmsh.model.addPhysicalGroup(2, [cube_surfaces[2]], 3, "cube_wall_p_xy")
gmsh.model.addPhysicalGroup(2, [cube_surfaces[3]], 4, "cube_wall_m_xz")
gmsh.model.addPhysicalGroup(2, [cube_surfaces[4]], 5, "cube_wall_p_yz")
gmsh.model.addPhysicalGroup(2, [cube_surfaces[5]], 6, "cube_wall_p_xz")
gmsh.model.addPhysicalGroup(2, [cube_surfaces[6]], 7, "cube_wall_m_yz")
gmsh.model.addPhysicalGroup(2, [disk_surface], 8, "film_surface")
gmsh.model.addPhysicalGroup(2, [hole_surface], 9, "hole_surface")

gmsh.option.setNumber("Mesh.Binary", 1)
gmsh.option.setNumber("Mesh.Algorithm", 6)
gmsh.option.setNumber("Mesh.Algorithm3D", 1)
gmsh.model.mesh.removeDuplicateNodes()
gmsh.model.mesh.generate(3)
gmsh.write(filename)

println("Generated mesh: ", filename)
println(" hole = ", dx, " x ", dy, ", border W = ", W)
println(" outer film = ", dx + 2W, " x ", dy + 2W, ", box = ", L_outer)
println("Domain: 1 Box walls: 2-7 Film: 8 Hole: 9")

gui && gmsh.fltk.run()
return gmsh.finalize()
end
Binary file added examples/circular_hole/mesh/square_hole.msh
Binary file not shown.
Loading
Loading