Usage#
Everything runs through make; each target is a thin wrapper around the
prismo CLI.
make validate-gradient-containers # composed adjoint vs central finite differences
make run-containers # the optimization; outputs/ gets figures + checkpoint.json
make animate # rebuild doping_evolution.{gif,mp4} from the checkpoint
make probe-objective-containers RUN_ARGS="--design outputs/checkpoint.json"
Knobs are passed through RUN_ARGS (prismo run --help lists them all):
Option |
Meaning |
|---|---|
|
Optimize |
|
Initial junction topology. Default |
|
Geometry of the shared mesh [µm]. |
|
Characteristic mesh size [µm] of the shared mesh (coarser = faster). |
|
Which guided mode the eigensolve tracks (0 = fundamental). |
|
Density-filter radius [µm] and MMA controls. |
Outputs#
Every run prints Δn_eff (warm and cold re-solve), VπLπ, modal loss and
VπLπ·α, and writes to outputs/:
convergence.pdf— Δn_eff and VπLπ per iterationdoping_field.pdf— initial vs optimized signed design fieldmode_field.pdf—|E|of the tracked modedepletion_field.pdf— carriers swept out between 0 V and −5 V under the modebias_sweep.pdf— Δn_eff, α and VπLπ·α vs bias, seed vs optimized (--bias-sweep-points 0skips it)gradient_validation.pdf— relative error of the adjoint vs step sizeloss_convergence.pdf,tradeoff.pdf— loss-aware runsdoping_evolution.{gif,mp4}— net doping at every evaluationcheckpoint.json— best design + full history (prismo animatereplays it)
The vocabulary (design field, doping map, move limit, cold re-evaluation, …) is defined once in the Glossary; the reasoning behind the shared mesh, the pivoting eigensolve and the loss model is in Implementation choices.