Adjoint-based topology optimization for nanophotonic SERS substrates and other distributed emission problems.
using Pkg
Pkg.add(url="https://github.com/ianmatthewhammond/DistributedEmitterOpt.jl")using DistributedEmitterOpt
# Define geometry and generate mesh
geo = SymmetricGeometry(532.0; L=200.0, W=200.0)
meshfile = "design.msh"
genmesh(geo, meshfile; per_x=false, per_y=false)
# Configure physics
env = Environment(mat_design="Ag", mat_substrate="Ag", mat_fluid=1.33)
pde = MaxwellProblem(
env = env,
inputs = [FieldConfig(532.0; θ=0.0, pol=:y)],
outputs = [FieldConfig(600.0; θ=0.0, pol=:y)]
)
# Build optimization problem
prob = OptimizationProblem(pde, SERSObjective(), meshfile, UmfpackSolver();
per_x = false,
per_y = false,
foundry_mode = true
)
# Run optimization
init_uniform!(prob, 0.5)
g_opt, p_opt = optimize!(prob; max_iter=100)- Adjoint sensitivity analysis for efficient gradient computation
- β-continuation for smooth gray-to-binary transition
- 2D foundry mode (grid DOFs) and 3D FE mode (mesh DOFs)
- Multi-wavelength and multi-polarization support
- Anisotropic Raman polarizability tensors
- Linewidth constraints via Zygote AD
See the documentation for:
Built on Gridap.jl for finite elements and NLopt.jl for optimization.
MIT