--- license: mit tags: - physics - electromagnetic-simulation - flow-matching - photonics - silicon-photonics - fdtd - pde library_name: pytorch --- # PIC-Flow A physics-embedded flow-matching neural surrogate that replaces FDTD for full-field electromagnetic prediction of silicon photonic devices. Given a permittivity map ε(x,y), a source-port mask, and a free-space wavelength λ, PIC-Flow generates the complex field E_z in a single multi-step ODE integration — typically in well under a second on a single A100, vs. seconds-to-minutes for CPU FDTD. This repo hosts the **FM + phase + residual** checkpoint from epoch 300 (the headline model from the paper). All training code, dataset-generation tooling, and inference notebooks live in the GitHub repo: [Rizzo-Integrated-Photonic-Systems-Lab/PIC-Flow](https://github.com/Rizzo-Integrated-Photonic-Systems-Lab/PIC-Flow). ## Files | Path | Description | |---|---| | `checkpoints/phase_residual_300.pt` | FM+phase+residual U-Net, epoch 300, ~1 GB. | ## Quick usage ```bash pip install huggingface_hub torch numpy ``` ```python from huggingface_hub import hf_hub_download import torch ckpt_path = hf_hub_download( "RizzoLab/PIC-Flow", "checkpoints/phase_residual_300.pt", ) ckpt = torch.load(ckpt_path, map_location="cpu", weights_only=False) # ckpt["state_dict"] -> model weights (real-valued U-Net, 63.3M params) # ckpt["stats"] -> field/permittivity normalization stats # ckpt["args"] -> training hyperparameters ``` End-to-end inference (load model, build conditioning, run flow-matching sampler) is covered by [`tools/predict_parametric_device.py`](https://github.com/Rizzo-Integrated-Photonic-Systems-Lab/PIC-Flow/blob/main/tools/predict_parametric_device.py) and [`notebooks/03_inference.ipynb`](https://github.com/Rizzo-Integrated-Photonic-Systems-Lab/PIC-Flow/blob/main/notebooks/03_inference.ipynb) in the GitHub repo. ## Model - **Architecture**: real-valued U-Net, 63.3M parameters. Real and imaginary E_z components enter as separate input channels; the permittivity and source-mask maps are visible at every layer; the flow-matching integration time `t` and the wavelength `λ` enter as scalar conditioning inputs. - **Generative framework**: conditional flow matching (Lipman et al., 2023). Inference integrates a learned velocity field from Gaussian noise to a physically valid E_z using Euler or Heun ODE steps. - **Physics constraint**: masked Helmholtz residual loss `L_res` (PML, source, and dielectric-interface pixels excluded), with a per-sample compliance metric `ρ_R = sqrt(L_res) × 100%`. ## Training data - 22,500 Meep FDTD simulations at λ = 1.55 µm - Three device families: 2×2 MMIs, Y-branches, directional couplers (7,500 each) - Latin-hypercube parameter sweeps over geometric variables per family - 18,000 / 2,250 / 2,250 train / val / test split Training: 300 epochs on 12 NVIDIA V100 GPUs, identical hyperparameters across the three ablation runs (FM only, FM+phase, FM+phase+residual). ## Performance On the held-out test split (200-step Heun sampler): | Device family | ρ_R | |---|---| | 2×2 MMI | 2.7% | | Y-branch | 2.5% | | Directional coupler | 2.2% | Out-of-distribution (same checkpoint, geometries never seen during training): | Device | ρ_R | |---|---| | Aggressive Euler S-bend (tight R, large offset) | 12% | | Short, steep taper | 4.0% | | Long, wide taper | 3.6% | | Cascaded 1×3 Y-branch (new device class) | 9.1% | Wall clock on a single NVIDIA A100 (fp16 autocast, vs. 16-thread Meep FDTD on the same node): | Sampler | Wall time | Speedup | ρ_R | |---|---|---|---| | FDTD (reference) | 5.61 s | 1.0× | (reference) | | Euler 100 step | 2.19 s | 2.6× | 1.9% | | Euler 20 step | 440 ms | 12.7× | 3.0% | | Euler 5 step | 110 ms | 50.6× | 5.5% | ## Citation ```bibtex @article{Quaratiello2026PICFlow, author = {Joseph Quaratiello and Anthony Rizzo}, title = {A Physics-Embedded Flow-Matching Model for Electromagnetic Prediction of Silicon Photonic Devices}, journal = {arXiv}, year = {2026} } ``` ## License MIT. See [LICENSE](https://github.com/Rizzo-Integrated-Photonic-Systems-Lab/PIC-Flow/blob/main/LICENSE) in the GitHub repo.