witwin-maxwell 0.4.0__tar.gz → 0.5.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/.github/workflows/publish-witwin-maxwell.yml +18 -1
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/.gitignore +11 -1
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/CHANGELOG.md +29 -1
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/FEATURE_LIST.md +56 -4
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/PKG-INFO +7 -4
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/README.md +1 -1
- witwin_maxwell-0.5.1/experiments/fdtd_data_generator/README.md +48 -0
- witwin_maxwell-0.5.1/experiments/fdtd_data_generator/REPORT.md +60 -0
- witwin_maxwell-0.5.1/experiments/fdtd_data_generator/generate.py +1201 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/pyproject.toml +5 -2
- witwin_maxwell-0.5.1/tests/api/public/test_batch_audit_regressions.py +145 -0
- witwin_maxwell-0.5.1/tests/api/public/test_batch_execution.py +190 -0
- witwin_maxwell-0.5.1/tests/api/public/test_batch_simulation.py +221 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/api/public/test_guard_census.py +4 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/api/public/test_public_api.py +8 -22
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/api/public/test_simulation_smoke.py +3 -4
- witwin_maxwell-0.5.1/tests/boundaries/absorbers/test_mur_state_transpose.py +78 -0
- witwin_maxwell-0.5.1/tests/fdtd/cuda/test_batch_memory_pool.py +43 -0
- witwin_maxwell-0.5.1/tests/fdtd/cuda/test_batch_observers.py +48 -0
- witwin_maxwell-0.5.1/tests/fdtd/cuda/test_batch_runtime.py +93 -0
- witwin_maxwell-0.5.1/tests/fdtd/cuda/test_batch_sources.py +45 -0
- witwin_maxwell-0.5.1/tests/fdtd/cuda/test_cuda_batch.py +127 -0
- witwin_maxwell-0.5.1/tests/fdtd/cuda/test_cuda_toolkit_discovery.py +28 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/_nccl_adjoint_worker.py +33 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_nccl_transport.py +1 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_parallel_public_api.py +6 -0
- witwin_maxwell-0.5.1/tests/fdtd/multi_gpu/test_time_consumer_consistency.py +91 -0
- witwin_maxwell-0.5.1/tests/fdtd/test_batch_audit_numerics.py +79 -0
- witwin_maxwell-0.5.1/tests/fdtd/test_batch_capacity_budget.py +73 -0
- witwin_maxwell-0.5.1/tests/fdtd/test_batch_coefficient_sharing.py +29 -0
- witwin_maxwell-0.5.1/tests/fdtd/test_batch_graph_pipeline.py +69 -0
- witwin_maxwell-0.5.1/tests/fdtd/test_batch_material_reuse.py +151 -0
- witwin_maxwell-0.5.1/tests/fdtd/test_batch_result_scene.py +44 -0
- witwin_maxwell-0.5.1/tests/fdtd/test_batch_selected_spectra.py +90 -0
- witwin_maxwell-0.5.1/tests/fdtd/test_batch_spectral_reuse.py +85 -0
- witwin_maxwell-0.5.1/tests/fdtd/test_batch_tuning.py +200 -0
- witwin_maxwell-0.5.1/tests/fdtd/test_capture_and_resume_state.py +117 -0
- witwin_maxwell-0.5.1/tests/fdtd/test_declared_drive_frequency.py +114 -0
- witwin_maxwell-0.5.1/tests/fdtd/test_parallel_batch.py +237 -0
- witwin_maxwell-0.5.1/tests/fdtd/test_resume_configuration_identity.py +34 -0
- witwin_maxwell-0.5.1/tests/fdtd/test_state_composition_regressions.py +190 -0
- witwin_maxwell-0.5.1/tests/fdtd/test_time_consumer_consistency.py +192 -0
- witwin_maxwell-0.5.1/tests/fdtd/test_time_planning.py +135 -0
- witwin_maxwell-0.5.1/tests/fdtd/test_time_step_stability.py +192 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/thin_wire/test_thin_wire_forward.py +1 -1
- witwin_maxwell-0.5.1/tests/gradients/test_batch_adjoint.py +302 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/test_fdtd_adjoint_bridge.py +7 -7
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/test_fdtd_adjoint_materials.py +22 -21
- witwin_maxwell-0.5.1/tests/gradients/test_fdtd_anisotropic_material_pullback.py +60 -0
- witwin_maxwell-0.5.1/tests/gradients/test_fdtd_mixed_boundary_consistency.py +62 -0
- witwin_maxwell-0.5.1/tests/gradients/test_fdtd_mur_adjoint.py +56 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/test_fdtd_rf_lumped_adjoint.py +6 -1
- witwin_maxwell-0.5.1/tests/gradients/test_fdtd_tensor_current_adjoint.py +68 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/test_fdtd_waveport_adjoint.py +5 -1
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/anisotropic/test_fdtd_full_anisotropy.py +9 -27
- witwin_maxwell-0.5.1/tests/materials/anisotropic/test_fdtd_reciprocal_tensor_stability.py +117 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/combinations/test_modulated_dispersive_nonlinear.py +6 -4
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/combinations/test_rotated_birefringent_dispersive_slab.py +9 -27
- witwin_maxwell-0.5.1/tests/materials/compiler/test_batch_material_compiler.py +87 -0
- witwin_maxwell-0.5.1/tests/materials/compiler/test_batch_material_identity.py +18 -0
- witwin_maxwell-0.5.1/tests/materials/compiler/test_inactive_material_storage.py +41 -0
- witwin_maxwell-0.5.1/tests/materials/compiler/test_local_material_cache.py +89 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/dispersive/test_custom_dispersive.py +7 -5
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/postprocess/scattering/test_mode_overlap.py +12 -9
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/postprocess/scattering/test_ring_resonator_s21.py +8 -4
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/circuits/test_circuit_independent_crosscheck.py +3 -1
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/circuits/test_fdtd_circuit_coupling.py +1 -1
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/circuits/test_fdtd_circuit_resume.py +3 -1
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/circuits/test_phase3_multiport.py +6 -1
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_network_delay_checkpoint.py +4 -1
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/numerics/test_port_spectral_stagger.py +6 -7
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/wave_validation/test_asymmetric_reciprocity_power_balance.py +4 -2
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/waveport/test_waveport_sweep.py +13 -14
- witwin_maxwell-0.5.1/tests/sources/current/test_full_tensor_current_contraction.py +101 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/mode/test_fdtd_anisotropic_aperture.py +4 -2
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/mode/test_fdtd_bent_mode_source.py +4 -2
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/mode/test_fdtd_broadband_mode_source.py +4 -3
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/mode/test_fdtd_complex_lossy_slab_mode.py +5 -1
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/mode/test_fdtd_mode_source.py +4 -3
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/mode/test_fdtd_pec_mode_solver.py +5 -6
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/mode/test_mode_solver_gradients.py +12 -9
- witwin_maxwell-0.5.1/tests/sources/mode/test_scalar_operator_layout.py +44 -0
- witwin_maxwell-0.5.1/tests/validation/physics/test_fdtd_material_wave_convergence.py +46 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/__init__.py +14 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/materials.py +281 -25
- witwin_maxwell-0.5.1/witwin/maxwell/execution/adjoint.py +143 -0
- witwin_maxwell-0.5.1/witwin/maxwell/execution/batch.py +336 -0
- witwin_maxwell-0.5.1/witwin/maxwell/execution/batch_runtime.py +1156 -0
- witwin_maxwell-0.5.1/witwin/maxwell/execution/capacity.py +166 -0
- witwin_maxwell-0.5.1/witwin/maxwell/execution/plan.py +264 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/execution/pool.py +80 -0
- witwin_maxwell-0.5.1/witwin/maxwell/execution/records.py +244 -0
- witwin_maxwell-0.5.1/witwin/maxwell/execution/tuning.py +197 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/adjoint/bridge.py +60 -25
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/adjoint/core.py +136 -59
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/adjoint/dispatch.py +28 -6
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/adjoint/seeds.py +21 -59
- witwin_maxwell-0.5.1/witwin/maxwell/fdtd/boundary/mur.py +60 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/boundary/runtime.py +22 -20
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/checkpoint.py +60 -1
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/build.py +17 -6
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/extension.cpp +51 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/kernels/adjoint.cu +78 -148
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/kernels/aniso.cu +68 -71
- witwin_maxwell-0.5.1/witwin/maxwell/fdtd/cuda/kernels/common.cu +166 -0
- witwin_maxwell-0.5.1/witwin/maxwell/fdtd/cuda/kernels/common.cuh +243 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/kernels/electric.cu +259 -35
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/kernels/magnetic.cu +146 -15
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/kernels/observers.cu +131 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/kernels/sources.cu +83 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/kernels/spectral.cu +30 -21
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/runtime/graph.py +56 -3
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/adjoint.py +18 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/shard_engine.py +1 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/solver.py +9 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/excitation/injection.py +92 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/excitation/modes/eigensolvers.py +10 -10
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/excitation/temporal.py +64 -2
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/material_pullback.py +19 -1
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/observers.py +161 -11
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/ports.py +15 -21
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/postprocess.py +6 -9
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/resume.py +45 -21
- witwin_maxwell-0.5.1/witwin/maxwell/fdtd/runtime/batch.py +216 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/runtime/breakdown.py +14 -2
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/runtime/initialization.py +39 -5
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/runtime/materials.py +99 -66
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/runtime/module_cache.py +5 -1
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/runtime/spectral.py +92 -148
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/runtime/stepping.py +76 -86
- witwin_maxwell-0.5.1/witwin/maxwell/fdtd/runtime/timeplan.py +109 -0
- witwin_maxwell-0.5.1/witwin/maxwell/fdtd/runtime/timestep.py +186 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/solver.py +5 -4
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/wire.py +6 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/media.py +3 -5
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/monitors.py +2 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/result.py +6 -1
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/scene.py +38 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/simulation.py +73 -48
- witwin_maxwell-0.4.0/witwin/maxwell/execution/capacity.py +0 -84
- witwin_maxwell-0.4.0/witwin/maxwell/execution/plan.py +0 -55
- witwin_maxwell-0.4.0/witwin/maxwell/execution/records.py +0 -144
- witwin_maxwell-0.4.0/witwin/maxwell/fdtd/cuda/kernels/common.cu +0 -74
- witwin_maxwell-0.4.0/witwin/maxwell/fdtd/cuda/kernels/common.cuh +0 -96
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/AGENTS.md +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/CLAUDE.md +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/LICENSE +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/hatch_build.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/scripts/build_fdtd_cuda_prebuilt.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/scripts/dev/fdtd/multi_gpu/bench_joint.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/scripts/dev/fdtd/native_cuda/bench_baseline.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/scripts/dev/fdtd/native_cuda/profile_scenario.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/scripts/dev/fdtd/native_cuda/snapshot_tool.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/scripts/perf_cuda_graph_dispersive.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/scripts/verify_cuda_binary_arches.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/TEST_LAYOUT.md +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/api/adapters/gds/test_gds_adapter.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/api/adapters/tidy3d/test_port_source_mapping.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/api/adapters/tidy3d/test_tidy3d_adapter.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/api/public/test_dependency_contract.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/api/public/test_thin_wire_api.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/boundaries/absorbers/test_boundary_variants.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/boundaries/boundary_physics/test_fdtd_boundary_physics.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/boundaries/boundary_physics/test_fdtd_pec_material.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/boundaries/boundary_specs/test_fdtd_boundaries.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/boundaries/cpml/test_fdtd_cpml.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/boundaries/symmetry/test_symmetry_generalization.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/breakdown/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/breakdown/_common.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/breakdown/test_breakdown_accumulator.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/breakdown/test_breakdown_compiler.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/breakdown/test_breakdown_energy.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/breakdown/test_breakdown_events.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/breakdown/test_breakdown_fdtd.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/breakdown/test_breakdown_guards.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/breakdown/test_breakdown_monitor.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/breakdown/test_breakdown_parity.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/breakdown/test_breakdown_state_machine.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/breakdown/test_component_stress.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/breakdown/test_smooth_breakdown_risk.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/conftest.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/core/constants/test_physical_constants.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/core/geometry/test_mesh_geometry.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/core/grid/test_autogrid.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/core/grid/test_fdtd_coords.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/core/grid/test_gridspec_custom.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/core/grid/test_nonuniform_placement.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/core/grid/test_nonuniform_uniform_equivalence.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/core/scene/test_scene.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/electrostatic/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/electrostatic/oracles.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/electrostatic/test_analytic.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/electrostatic/test_api.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/electrostatic/test_capacitance.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/electrostatic/test_conservation.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/electrostatic/test_floating.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/electrostatic/test_gradients.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/electrostatic/test_initial_condition.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/electrostatic/test_open_boundary.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/electrostatic/test_tensor_eps.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/esd/test_esd_circuit.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/esd/test_esd_circuit_e2e.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/esd/test_esd_circuit_energy.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/esd/test_esd_injection.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/esd/test_esd_waveform.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/esd/test_prebias.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdfd/test_ams.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdfd/test_direct_solver.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdfd/test_krylov.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdfd/test_matrix_cache.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdfd/test_preconditioners.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdfd/test_symmetric_formulation.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/cuda/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/cuda/_parity_backend.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/cuda/test_cuda_adjoint_native.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/cuda/test_cuda_common_parity.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/cuda/test_cuda_cpml_extension_parity.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/cuda/test_cuda_dispersive_parity.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/cuda/test_cuda_electric_boundary_parity.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/cuda/test_cuda_extension_load.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/cuda/test_cuda_graph.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/cuda/test_cuda_magnetic_parity.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/cuda/test_cuda_prebuilt_abi.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/cuda/test_cuda_sources_parity.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/cuda/test_cuda_spectral_observer_parity.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/cuda/test_cuda_wire_parity.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/cuda/torch_reference.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/_gpu_burner.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/_nccl_forward_worker.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/_nccl_rankdeath_worker.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/_nccl_transport_adjoint_worker.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/_nccl_transport_worker.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/conftest.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_adjoint_parity.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_adjoint_parity_cpml.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_adjoint_parity_stress.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_adjoint_replay.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_bench_joint_cli.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_bounded_standard_dispatch.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_capacity_cpml_stats.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_circuit_owner.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_cuda_graph_device_binding.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_ensemble_executor.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_ensemble_network_sweep.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_ensemble_run_many.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_guard_regressions.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_material_region_forward.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_monitor_merge_ownership.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_monitor_numerical.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_network_owner.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_numerical_matrix.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_partition.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_result_persistence.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_review_regressions.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_sharded_export.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_sharded_persistence.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_solver_acceptance.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_step_instrument.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_transport.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_transport_adjoint.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/multi_gpu/test_wire_owner.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/surface_impedance/test_surface_impedance_reference.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/test_cuda_graph.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/test_cuda_graph_capture_coverage.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/test_cuda_graph_complex_bloch.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/test_cuda_graph_dispersive.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/test_cuda_graph_nonlinear.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/test_cuda_graph_tfsf.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/test_cuda_graph_tfsf_slab.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/test_fdtd_autoshutoff.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/test_observer_quadrature.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/test_observer_time_stagger.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/thin_wire/test_thin_wire_compiler.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/thin_wire/test_thin_wire_lossy_forward.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/thin_wire/test_thin_wire_port_binding_gpu.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/thin_wire/test_thin_wire_reference.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/thin_wire/test_thin_wire_rotation_acceptance.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/thin_wire/test_wire_finite_conductivity.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/fdtd/thin_wire/test_wire_lossy_recurrence.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/README.md +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/e2e/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/e2e/test_fdtd_two_port_sparam_optimization.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/fdtd_adjoint_baselines.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/finite_difference_gate.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/test_fdfd_adjoint.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/test_fdtd_adjoint_p6_acceptance.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/test_fdtd_adjoint_rigorous.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/test_fdtd_circuit_adjoint.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/test_fdtd_cpml_psi_active_adjoint.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/test_fdtd_custom_source_adjoint.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/test_fdtd_mode_source_adjoint.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/test_fdtd_multisource_adjoint.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/test_fdtd_network_adjoint.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/test_fdtd_thin_wire_adjoint.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/test_fdtd_thin_wire_conductivity_adjoint.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/test_fdtd_thin_wire_port_adjoint.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/gradients/test_rf_postprocess_adjoint.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/combinations/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/combinations/test_aniso_pml_overlap_reflection.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/combinations/test_bloch_dispersive_forward.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/combinations/test_combination_matrix.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/combinations/test_diagonal_aniso_dispersive.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/combinations/test_lossy_anisotropic_slab.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/combinations/test_modulated_slab_cpml.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/combinations/test_mu_tensor_dispersion.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/combinations/test_multi_frequency_modulation.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/combinations/test_shg_dispersive_phase_matching.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/compiler/test_curved_subpixel_convergence.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/compiler/test_edge_native_sampling.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/compiler/test_fdfd_material_support.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/compiler/test_material_compiler.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/compiler/test_pec_conformal_alignment.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/compiler/test_pec_conformal_nonuniform.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/compiler/test_pec_material.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/compiler/test_polarized_averaging.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/compiler/test_polyslab.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/compiler/test_subpixel_gradients.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/compiler/test_subpixel_nonuniform.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/compiler/test_subpixel_normals.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/compiler/test_subpixel_spec.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/conductive/test_fdtd_conductive.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/conductive/test_fdtd_magnetic_conductive.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/dispersive/test_fdtd_dispersive.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/dispersive/test_fdtd_gain.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/dispersive/test_fdtd_sellmeier.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/ferrite/test_ferrite_reference.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/ferrite/test_gyromagnetic_compiler.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/ferrite/test_gyromagnetic_ferrite.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/ferrite/test_gyromagnetic_forward.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/ferrite/test_gyromagnetic_general_bias.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/modulation/test_fdtd_modulation.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/nonlinear/test_fdtd_nonlinear.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/perturbation/test_perturbation_medium.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/sheet/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/sheet/sheet_measurement.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/sheet/test_fdtd_graphene.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/sheet/test_fdtd_medium2d.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/sheet/test_lossy_metal.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/sheet/test_surface_impedance_funnel.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/surface_impedance/test_rational_surface_impedance.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/surface_impedance/test_surface_impedance_ade.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/surface_impedance/test_surface_impedance_resume.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/materials/surface_impedance/test_surface_impedance_runtime.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/monitors/diffraction/test_diffraction_monitor.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/monitors/emission/test_dipole_emission_monitor.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/monitors/material/test_permittivity_monitor.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/monitors/observers/test_fdtd_observers.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/monitors/time/test_fdtd_time_monitors.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/postprocess/directivity/test_directivity.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/postprocess/evaluation/test_fdtd_evaluation.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/postprocess/rcs/test_postprocess.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/postprocess/scattering/test_scattering_parameters.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rational/test_core.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rational/test_fit.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/antenna/test_antenna_benchmark_e2e.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/antenna/test_antenna_data.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/antenna/test_antenna_matching_block.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/antenna/test_result_antenna.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/array/test_array_codebook.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/array/test_array_contracts.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/array/test_array_fullwave.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/array/test_array_mimo.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/array/test_array_persistence.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/array/test_array_scene_gradient.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/array/test_array_scene_gradient_ensemble.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/circuits/test_circuit_conservation.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/circuits/test_circuit_contract.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/circuits/test_circuit_graph.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/circuits/test_circuit_hot_path_op_count.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/circuits/test_mna_runtime.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/circuits/test_phase4_batched_mna.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/circuits/test_phase4_circuit_cuda_graph.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/circuits/test_result_circuit_data.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/circuits/test_spice_parser.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/contracts/test_network_data_contract.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/contracts/test_port_conventions.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/contracts/test_port_geometry_contract.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/contracts/test_public_rf_api.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/contracts/test_wire_port_binding_api.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/lumped/test_fdtd_lumped_port_pec_gap.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/lumped/test_fdtd_lumped_runtime.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/lumped/test_fdtd_port_end_to_end.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/lumped/test_port_data_persistence.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/lumped/test_port_source_waveform.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/lumped/test_result_port_data.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/lumped/test_rlc_contract.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/lumped/test_rlc_discretization.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/lumped/test_scene_lumped_elements.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/lumped/test_simulation_port_excitation.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/fixtures/four_port_db.s4p +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/fixtures/one_port_ri.s1p +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/fixtures/two_port_ma.ts +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_embedded_network_persistence.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_finalize_state_norm_detach.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_network_algebra.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_network_block_contract.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_network_cascade.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_network_cascade_crosscheck.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_network_conservation.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_network_coupling_op_stream.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_network_delay.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_network_delay_integration.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_network_multiport_fdtd.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_network_multiport_runtime.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_network_observer_hot_path.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_network_persistence.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_network_physicality.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_network_runtime.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_network_sweep.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_touchstone.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/network/test_touchstone_import.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/nonlinear/_generate_goldens.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/nonlinear/_rectifier_fixtures.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/nonlinear/goldens/rectifier_goldens.pt +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/nonlinear/test_newton_core.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/nonlinear/test_nonlinear_device_contract.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/nonlinear/test_nonlinear_device_math.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/nonlinear/test_nonlinear_transient.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/numerics/test_tem_vi_prototype.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/performance/measure_port_overhead_s2b.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/performance/profile_port_hot_path.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/performance/test_no_feature_fast_path.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/performance/test_perf_variance_gate.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/performance/test_port_energy_diagnostics_default_off.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/performance/test_port_hot_path_op_count.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/power_loss/test_power_loss_data.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/terminal/test_terminal_port_contract.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/wave_validation/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/wave_validation/test_coax_contour_snap.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/wave_validation/test_interior_pec_operator.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/wave_validation/test_matched_s11_wave_level.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/wave_validation/test_microstrip_diffpair_wave_level.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/wave_validation/test_open_short_match_wave_level.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/wave_validation/test_planemonitor_waveport_passthrough.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/wave_validation/test_rf_reference_generation.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/wave_validation/test_rlc_resonance_wave_level.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/wave_validation/test_te10_mode_selection.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/wave_validation/test_transverse_operator.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/wave_validation/test_waveguide_wave_level.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/waveport/test_modal_port_data.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/waveport/test_mode_tracking.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/rf/waveport/test_waveport_contract.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sar/test_incident_power.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sar/test_mass_averaging.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sar/test_mass_density.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sar/test_normalization.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sar/test_phantom_benchmarks.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sar/test_phantom_convergence.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sar/test_point_sar.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sar/test_sar_combine.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sar/test_sar_gradients.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sar/test_sar_validation.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sar/test_soft_peak.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/definitions/test_astigmatic_gaussian_beam.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/definitions/test_custom_source_time.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/definitions/test_custom_uniform_sources.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/definitions/test_sources.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/incident/test_fdtd_incident.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/incident/test_soft_planewave_absolute_power.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/mode/test_fdtd_unidirectional_launch.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/mode/test_mode_eigensolver_physics.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/mode/test_mode_source_injection_physics.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/point/test_fdtd_source_normalization.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/point/test_fdtd_sources.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/tfsf/test_fdtd_grating_pulsed_bloch.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/tfsf/test_fdtd_grating_tfsf.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/sources/tfsf/test_fdtd_tfsf.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/support/benchmark_circuit_performance.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/support/benchmark_ensemble_speedup.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/support/benchmark_network_embedding.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/support/benchmark_rf_no_feature.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/support/benchmark_thin_wire_reverse.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/support/compare_no_feature_op_stream.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/support/network_coupling_op_stream.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/support/perf_variance_gate.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/support/port_hot_path_tally.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/support/test_benchmark_circuit_performance.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/support/test_benchmark_rf_no_feature_provenance.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/cross_solver/test_fdfd_vs_fdtd.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/physics/test_autogrid_physics.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/physics/test_autogrid_subpixel_thesis.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/physics/test_bloch_broadband_vs_cw.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/physics/test_dispersive_metasurface_bloch.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/physics/test_fdtd_boundary_tfsf_validation.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/physics/test_fdtd_physics_correctness.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/physics/test_layered_exterior_huygens_validation.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/physics/test_lossy_metal_sibc.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/physics/test_nonuniform_grid_physics.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/physics/test_pec_conformal.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/physics/test_postprocess_end_to_end_validation.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/physics/test_sibc_cylinder_convergence.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/physics/test_sibc_orientation.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/physics/test_sibc_staircase.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/physics/test_sibc_zero_impact.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/physics/test_soft_planewave_graded.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/physics/test_surface_impedance_broadband.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/tests/validation/physics/test_tfsf_nonuniform.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/adapters/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/adapters/gds.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/adapters/tidy3d.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/adjoint_inputs.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/antenna.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/array.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/array_execution.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/array_gradient.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/breakdown.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/breakdown_risk.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/breakdown_stress.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/circuit_devices.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/circuits.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/array.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/breakdown.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/circuits.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/delay.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/electrostatic.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/gyromagnetic.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/lumped.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/mass_density.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/mna.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/monitors.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/networks.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/nonlinear_devices.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/ports.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/power_loss.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/sources.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/structures.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/subpixel.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/surface_impedance.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/thin_wire.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/waveports.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/compiler/wire_impedance.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/constants.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/electrostatic/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/electrostatic/api.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/electrostatic/capacitance.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/electrostatic/initial_condition.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/electrostatic/runtime.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/esd.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/execution/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/execution/ensemble.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/execution/executor.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdfd/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdfd/adjoint/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdfd/adjoint/bridge.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdfd/ams.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdfd/krylov.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdfd/plotting.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdfd/postprocess.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdfd/solver.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/adjoint/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/adjoint/capabilities.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/adjoint/circuits.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/adjoint/native.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/adjoint/profiler.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/adjoint/reverse_common.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/boundary/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/boundary/bloch.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/boundary/common.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/boundary/cpml.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/circuits.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/coords.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/backend.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/kernels/boundary.cu +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/kernels/dispersive.cu +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/kernels/projection.cu +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/kernels/wire.cu +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/launch.h +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/runtime/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/runtime/dispatcher.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/cuda/tensors.h +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/delay.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/dispersion.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/_shared.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/capacity.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/circuits.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/counts.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/frequency_counts.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/instrumentation.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/interpolation.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/monitor_merge.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/nccl_transport.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/networks.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/output.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/persistence.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/source_corrections.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/source_rebuild.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/sources.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/transport.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/distributed/wire.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/evaluation.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/excitation/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/excitation/modes/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/excitation/modes/common.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/excitation/modes/tem.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/excitation/modes/vector.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/excitation/modes/yee.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/excitation/spatial.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/excitation/tfsf_apply.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/excitation/tfsf_common.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/excitation/tfsf_specs.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/excitation/tfsf_state.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/ferrite_reference.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/io.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/lumped.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/meshing/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/meshing/autogrid.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/networks.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/plotting.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/quadrature.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/runtime/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/runtime/gyromagnetic.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/surface_impedance_reference.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/thin_wire_reference.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd/wire_lossy.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/fdtd_parallel.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/geometry/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/geometry/polyslab.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/lumped.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/materials.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/network.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/network_math.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/network_sweep.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/ports.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/postprocess/RCS.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/postprocess/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/postprocess/antenna.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/postprocess/array.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/postprocess/diffraction.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/postprocess/directivity.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/postprocess/emission.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/postprocess/incident_power.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/postprocess/modal.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/postprocess/nfft.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/postprocess/power_loss.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/postprocess/sar.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/postprocess/sar_averaging.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/postprocess/sar_combine.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/postprocess/scattering_parameters.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/postprocess/stratton_chu.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/postprocess/waveports.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/power_loss.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/rational.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/sar.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/sources.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/thin_wire.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/touchstone.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/visualization/__init__.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/visualization/interactive.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/visualization/plots.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/waveforms.py +0 -0
- {witwin_maxwell-0.4.0 → witwin_maxwell-0.5.1}/witwin/maxwell/waveport_sweep.py +0 -0
|
@@ -233,7 +233,7 @@ jobs:
|
|
|
233
233
|
WITWIN_MAXWELL_FDTD_CUDA_BUILD_DIR: ${{ runner.temp }}/missing_prebuilt_build_dir
|
|
234
234
|
run: |
|
|
235
235
|
python -m pip uninstall -y witwin-maxwell || true
|
|
236
|
-
python -m pip install
|
|
236
|
+
python -m pip install "$PACKAGE_DIR"/dist/*.whl
|
|
237
237
|
python - <<'PY'
|
|
238
238
|
import importlib.util
|
|
239
239
|
import os
|
|
@@ -263,6 +263,17 @@ jobs:
|
|
|
263
263
|
assert path.parent.name == "prebuilt"
|
|
264
264
|
extension = module.build_extension()
|
|
265
265
|
print(f"Loaded packaged FDTD CUDA extension from {extension.__file__}")
|
|
266
|
+
|
|
267
|
+
# Import outside the checkout so missing runtime dependencies cannot
|
|
268
|
+
# be hidden by source-tree imports or the build-only ABI smoke test.
|
|
269
|
+
import subprocess
|
|
270
|
+
import tempfile
|
|
271
|
+
subprocess.run([
|
|
272
|
+
os.sys.executable, "-c",
|
|
273
|
+
"import witwin.maxwell as mw; from importlib.metadata import version; "
|
|
274
|
+
"assert mw.BatchExecution and mw.Scene and mw.Simulation; "
|
|
275
|
+
"print('Installed package:', version('witwin-maxwell'))",
|
|
276
|
+
], cwd=tempfile.gettempdir(), check=True)
|
|
266
277
|
PY
|
|
267
278
|
|
|
268
279
|
- name: Upload wheel artifact
|
|
@@ -343,6 +354,12 @@ jobs:
|
|
|
343
354
|
extension = module.build_extension()
|
|
344
355
|
assert Path(extension.__file__).resolve() == native_path.resolve()
|
|
345
356
|
assert extension.update_magnetic_hx_standard is not None
|
|
357
|
+
import ctypes
|
|
358
|
+
library = ctypes.CDLL(str(native_path))
|
|
359
|
+
for name in ("mw_batch_budget_create", "mw_batch_budget_exchange",
|
|
360
|
+
"mw_batch_budget_bytes", "mw_batch_budget_close",
|
|
361
|
+
"mw_batch_malloc", "mw_batch_free"):
|
|
362
|
+
assert getattr(library, name) is not None, name
|
|
346
363
|
print(f"Loaded {native_path.name} with torch {torch.__version__} on Python {os.sys.version.split()[0]}")
|
|
347
364
|
PY
|
|
348
365
|
|
|
@@ -241,5 +241,15 @@ benchmark/
|
|
|
241
241
|
.codex-tmp/
|
|
242
242
|
.test-tmp/
|
|
243
243
|
.tmp/
|
|
244
|
-
|
|
244
|
+
# Experiment outputs are enormous (90+ GB of generated datasets) and stay local. The generator
|
|
245
|
+
# *source* is not an output: it defines the dataset contract that downstream consumers depend on,
|
|
246
|
+
# so it is tracked explicitly. Add a file here rather than relaxing the rule -- `experiments/*`
|
|
247
|
+
# keeps every other directory excluded while still letting git descend far enough for these
|
|
248
|
+
# negations to apply.
|
|
249
|
+
experiments/*
|
|
250
|
+
!experiments/fdtd_data_generator/
|
|
251
|
+
experiments/fdtd_data_generator/*
|
|
252
|
+
!experiments/fdtd_data_generator/generate.py
|
|
253
|
+
!experiments/fdtd_data_generator/README.md
|
|
254
|
+
!experiments/fdtd_data_generator/REPORT.md
|
|
245
255
|
.worktrees/
|
|
@@ -4,6 +4,33 @@ All notable user-visible changes to WiTwin Maxwell are documented here. The proj
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.5.1] - 2026-09-08
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Experimental `Simulation.batch(...)` execution with reusable capacity-limited CUDA slots, batched field/CPML/source/observer updates, and ordinary owned `Result` objects.
|
|
12
|
+
- Local material compilation reuse, automatic resident capacity, private per-device CUDA allocation budgets, multi-GPU and dual-slot scheduling, and opt-in measured throughput tuning.
|
|
13
|
+
- PyTorch-native Batch checkpoint adjoints for supported density, dielectric geometry, and named source-scale inputs, including delayed backward after slot reuse or close.
|
|
14
|
+
- Reproducible Batch performance, memory, material-compilation, and device-scaling audits with numerical controls and process-contention records.
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- Material-aware time-step stability, source timing, complex CPML and Mur boundary histories, and capture/resume state consistency in FDTD.
|
|
19
|
+
- Batch parameter cache identity, iterator ownership, result scene snapshots, selected electric spectra, and redundant spectral allocations in retained adjoint state.
|
|
20
|
+
- Automatic worker capacity distribution and isolation of tuning RNG, module state, and cross-device tensor copies.
|
|
21
|
+
- Corrected the base dependency range to `witwin>=0.4,<0.5`, matching the published `PhysicalMaterial` contract instead of an unavailable version range.
|
|
22
|
+
- Preserved local compilation reuse when declared design replacements acquire new base-package structure/material identity tokens.
|
|
23
|
+
- Declared plotting/progress/notebook display import dependencies and extended release checks to installed-package imports and native Batch allocator exports.
|
|
24
|
+
|
|
25
|
+
### Limitations
|
|
26
|
+
|
|
27
|
+
- Batch remains experimental with a narrower capability set than ordinary FDTD. Fused batch reverse kernels, exact preplanning of all retained outputs, and exclusive multi-GPU throughput acceptance remain pending.
|
|
28
|
+
- See [0.5.1 release notes](docs/reference/release-notes-0.5.1.md) for validation evidence and the supported execution contract.
|
|
29
|
+
|
|
30
|
+
## [0.5.0] - Unpublished
|
|
31
|
+
|
|
32
|
+
- The version tag built CUDA wheels but failed the installed-package import gate because `IPython` was undeclared. No distributions were uploaded to PyPI.
|
|
33
|
+
|
|
7
34
|
## [0.4.0] - 2026-07-23
|
|
8
35
|
|
|
9
36
|
### Added
|
|
@@ -66,7 +93,8 @@ Detailed numerical conventions, pitfalls, final comparison values, and intention
|
|
|
66
93
|
|
|
67
94
|
- Previous public release.
|
|
68
95
|
|
|
69
|
-
[Unreleased]: https://github.com/witwin-ai/witwin-maxwell/compare/witwin-maxwell-v0.
|
|
96
|
+
[Unreleased]: https://github.com/witwin-ai/witwin-maxwell/compare/witwin-maxwell-v0.5.1...HEAD
|
|
97
|
+
[0.5.1]: https://github.com/witwin-ai/witwin-maxwell/compare/witwin-maxwell-v0.4.0...witwin-maxwell-v0.5.1
|
|
70
98
|
[0.4.0]: https://github.com/witwin-ai/witwin-maxwell/compare/witwin-maxwell-v0.3.0...witwin-maxwell-v0.4.0
|
|
71
99
|
[0.3.0]: https://github.com/witwin-ai/witwin-maxwell/compare/witwin-maxwell-v0.2.0...witwin-maxwell-v0.3.0
|
|
72
100
|
[0.2.0]: https://github.com/witwin-ai/witwin-maxwell/releases/tag/witwin-maxwell-v0.2.0
|
|
@@ -2,6 +2,41 @@
|
|
|
2
2
|
|
|
3
3
|
This document tracks the current user-visible capabilities of the `maxwell` package.
|
|
4
4
|
|
|
5
|
+
Release 0.5.1 introduces the experimental Batch execution tier and FDTD correctness repairs described in [the release notes](docs/reference/release-notes-0.5.1.md). Existing ordinary-simulation capabilities retain their documented scope; Batch support is specified separately below.
|
|
6
|
+
|
|
7
|
+
- Package installation requires `witwin>=0.4,<0.5` and uses its public `PhysicalMaterial` contract; the dependency range resolves against published base-package versions.
|
|
8
|
+
- Release wheels declare their plotting/progress/notebook display import dependencies. Publishing validates package imports outside the checkout and the native Batch allocator symbols across the platform/ABI matrix.
|
|
9
|
+
|
|
10
|
+
- Batch tuning isolates copyable `SceneModule` parameters, buffers and Python attributes per trial, preserves shared tensor storage, and starts each candidate from the same CPU/CUDA RNG state. Only the final ordinary preparation updates the caller's module state. Trial copies and scene materialization on another execution device use that device's private memory account. Arbitrary external side effects and allocations on producer devices outside the execution policy are outside this isolation/accounting contract.
|
|
11
|
+
|
|
12
|
+
- `python -m benchmark batch --scaling-audit WORKLOAD --devices cuda:0 cuda:1 --variants N --concurrency B --update-report` interleaves complete streamed runs on each GPU and all GPUs, including CPU output readiness, and checks spectra against independent simulations. Raw artifacts retain all timing samples and competing compute-process observations. The matching two-device 1.7x gate requires numerical agreement and observed exclusive compute access; foreign processes or sampler errors prevent acceptance. Periodic sampling cannot prove complete exclusivity or exclude display activity. Idle prepared comparison modes remain resident, so this workflow does not measure isolated memory use.
|
|
13
|
+
|
|
14
|
+
- Batch native checkpoint adjoints differentiate density templates, nonmagnetic, nonconductive dielectric structure geometry and named source scales, including zero/negative amplitudes, shared parameter reductions and gradients gathered from multiple devices. Native B-lane forward records independent checkpoints; reverse currently uses the existing native per-lane adjoint. Tapes retain immutable runtime snapshots and their allocation pools through delayed backward after slot reuse or close. Input version guards reject intervening tracked mutations; no_grad skips tapes, and SceneModule graphs refresh between runs and optimizer updates. Fixed time horizons and the existing native-adjoint boundary/material capability limits apply. Spectral normalization removes the unit-amplitude waveform envelope and preserves physical source amplitude. Missing permeability/conductivity/PEC-mask and material-region geometry gradient channels fail explicitly. Result solver statistics expose checkpoint counts/bytes and private-pool accounting after backward.
|
|
15
|
+
|
|
16
|
+
- Batch multi-GPU and dual-slot execution supports static or throughput dispatch, bounded completed-output queues, input/completion order, cancellation and persistent reuse. Each device shares one strict allocation account across worker and output pools. GPU output gathering preserves ownership and caller-stream ordering. Coordinated host submission protects CUDA Graph capture while previously submitted device work can overlap. Scene.clone(device=...) migrates nested geometry/material tensors without mutating the source scene and preserves PyTorch gradient paths. Dual-GPU numerical correctness is tested; throughput scaling requires a dedicated measurement window.
|
|
17
|
+
|
|
18
|
+
- `BatchExecution(tune=True)` measures complete streamed forward runs over finite B/Q/Graph-step candidates, with one warmup and three timed repeats. Reports include preparation cost, samples, per-device backing-memory peaks, capacity rejections, selected policy and tuning cost. The candidate set includes balanced cohort sizes and skips automatic dual slots when the device count already covers every cohort. Automatic dual slots require a successful single-slot baseline and a repeatable 5% gain; policies within 5% prefer lower memory. Trials publish no results, preserve caller RNG state and create gradient tapes without calling backward. Final execution uses a fresh context; explicit policies remain fixed, while automatic capacity retains bounded OOM reduction. The objective excludes backward and user-retained N-result storage, and tuning cost may outweigh savings for short one-shot tasks.
|
|
19
|
+
|
|
20
|
+
- Batch automatic capacity calibrates a prepared lane, bounds B by compatible-group size and available worker count to leave work for each device/slot, selects a conservative B and retries capacity failures with bounded B reduction before publishing the affected cohort. Explicit byte limits use a private native CUDA allocation pool: backing segments, cached blocks, Graph pool tensors and retained GPU outputs remain charged, providing a conservative hard upper bound on Batch-owned live tensor storage without replacing the process default allocator. Reports expose actual capacity, reductions and charged/peak bytes. CUDA context/library allocations are external to this pool; segment granularity may reject a request whose logical tensor sum is smaller than the limit. The native PyTorch caching allocator is required.
|
|
21
|
+
|
|
22
|
+
- Density-template Batch execution reuses one fixed material bank and samples only each changed region's conservative influence patch with global Yee coordinates, subpixel averaging and differentiation halos. Periodic axes retain their whole extent. Fixed material/grid/geometry values are checked before reuse; changed channels materialize dense runtime arrays while unchanged channels share bank storage. Local reuse currently covers fixed Box density regions with static edge-native materials; declared Box/Sphere structure movement and static material changes use conservative Box influence envelopes, while perturbation grids and trainable geometry use separate compiler paths.
|
|
23
|
+
|
|
24
|
+
- Experimental Batch forward execution through `Simulation.batch(...)`, `BatchExecution`, `BatchParameters`, `BatchVariation`, `BatchOutput`, and `BatchPlanReport`. `prepare()` now returns a reusable `PreparedBatch`; `run()` returns an ordered `BatchResult` containing ordinary Results. One or more CUDA devices with one or two persistent capacity-B field slots per device support real static-material FDTD, point sources, point/plane/flux monitors, dense/slab CPML, none/periodic/PEC/PMC boundaries, incomplete cohorts, density/source-scale template updates, and repeated runs. Native E/H and CPML kernels advance all resident lanes together; source patches batch lanes using reusable GPU waveform tables, original overlap order, periodic endpoint routing and native rounding, while point/plane/flux spectra batch lanes and frequencies using GPU phase, window and source-normalization recurrences, preserving the ordinary monitor preparation and export contract. Compiled spacing, CPML profiles and equal coefficients share verified storage; differing coefficients promote to per-lane storage, density templates reuse local patches, and independent scenes with declared material regions or supported structure envelopes reuse local compilation. Monitor-only multifrequency execution does not allocate full-field DFT. Requested electric spectra allocate and accumulate only the selected Yee components; omitted components use zero-byte descriptors in the native fused kernel. Finalization and adjoint seeds preserve this selection, and Result solver stats expose batch_dft_accumulator_bytes.
|
|
25
|
+
- `BatchResult.stack(selector, device=...)`, `save(directory)` and `load(directory, scenes=..., map_location=...)` preserve variant ordering and failures. `BatchItem` and context-managed `BatchResultIterator` provide demand-driven delivery, cancellation, failure records and explicit early close. Closed iterators retain their own final execution records when the prepared context is reused. Results own output storage and detached snapshots of declarative scene tensors and nested metadata, retain no live solver slot, and survive optimizer updates, repeated runs and `PreparedBatch.close()`. Adjoint frequency entries share one owned copy of each spectral bank instead of duplicating its per-frequency views. Full-field exports use canonical Result field keys, so `tensor("Ez")`, `field("E")` and frequency selection work like ordinary simulation results; gradient tapes separately retain the original inputs and version guards. Result plotting facades are created on demand so streamed GPU outputs release without waiting for cyclic garbage collection.
|
|
26
|
+
- Batch execution remains an incomplete optimization tier: `batch_size="auto"` selects capacity from a prepared-lane measurement, and `graph="auto"` attempts complete timestep CUDA Graph capture. RF ports, advanced material dynamics, magnetic full-field/material export fail explicitly. Structure envelopes prove containment using a design circumsphere inside the Box envelope insphere; this conservatively supports arbitrary rotations and rejects out-of-envelope or unsupported changes. Undeclared geometry changes use full-scene compilation. Fused B-lane reverse kernels, exact all-output preplanning and measured multi-GPU throughput acceptance remain pending. Dry plans remain unresolved; run reports expose `native_pipeline_eager`, `native_pipeline_graph` or mixed execution. Input Scene topology and fixed declarations must remain unchanged; tracked trainable tensor and template parameter updates are supported. Template caches retain input tensor identities and detect version-tracked PyTorch updates; inference tensors conservatively recompile each run. Untracked external storage or `.data` writes require a new input tensor. Concurrent iterator `next()` or `close()` calls reject while `next()` is active; request cancellation and wait for it to return before closing.
|
|
27
|
+
|
|
28
|
+
- Experimental batch baseline instrumentation: `python -m benchmark batch --inventory` lists three fixed workloads; `--audit WORKLOAD --device cuda:0` records single-run tensor storage ownership, prepare/completed manifests, allocator peaks and sampled driver memory under `benchmark/plots/batch/`. `--compare WORKLOAD --variants N` measures independent sequential, spawned-process and `run_many` baselines with cold startup, interleaved warm rounds, per-worker allocator peaks, sampled total device memory and per-variant complex spectrum comparisons. `--include-native` adds native Batch with resident B selected by `--concurrency`; `--native-graph off|auto|required` selects its graph policy, and warm rounds reuse its PreparedBatch. Reports preserve historical baselines in separate sections and distinguish timing-round memory (including idle sessions) from fresh isolated-memory rounds. Complete business throughput and memory acceptance remain pending.
|
|
29
|
+
|
|
30
|
+
- `python -m benchmark batch --tune-audit WORKLOAD --variants N --concurrency MAX_B --devices cuda:0 cuda:1 --update-report` records all public tuning candidates, independent hot repeats, spectrum parity and the 90% measured-candidate threshold. Raw JSON includes timing scope and tuning overhead; report sections survive ordinary regeneration. Multi-device scaling acceptance requires a separate exclusive-device comparison.
|
|
31
|
+
|
|
32
|
+
- Batch baseline sections in `benchmark/RESULTS.md` survive ordinary benchmark report regeneration.
|
|
33
|
+
- Complete Batch timestep CUDA Graph capture includes fields, CPML, source patches, boundary corrections, full-field DFT and spectral observers. `graph="required"` and `graph_steps=K` support exact tail chunks and shutoff check boundaries; repeated runs reuse fixed observer and selected full-field DFT storage and captures. Scalar waveform spectral schedules are cached; changed frequency/window/horizon declarations rebuild tables and storage generations invalidate captures when addresses change. Capture epochs serialize process-wide and exclude admission of registered Batch work; concurrent active participants cause auto policy to step eagerly and required policy to fail explicitly. Batch captures use thread-local capture error checking on owned slot buffers, allowing independent consumer-thread tensor allocations and operations; captured inputs and execution storage must remain unchanged. The ordinary graph runner retains global capture checking.
|
|
34
|
+
- Source-scale-only Batch templates compile one shared material bank across lanes, cohort changes and parameter updates. Density templates reuse local material patches; declared independent Scene variations can reuse verified local patches. Old cohort graph/source/observer owners release before new solver construction, reducing overlapping preparation allocations.
|
|
35
|
+
- Static compiled material arrays and physical material arrays share storage across resident lanes only after device, dtype, shape and value equality checks. Unequal dielectric regions remain independent; evolving fields and CPML histories always retain distinct lane storage.
|
|
36
|
+
- Inactive off-diagonal, nonlinear and modulation material channels use scalar-backed, read-only broadcast tensors until a blend activates them. Subpixel accumulation preserves compact zeros, while trainable occupancy retains its original autograd dependency. FDTD creates electric/magnetic dispersion templates only for material families with poles, avoiding unused whole-volume inverse-material arrays.
|
|
37
|
+
- Regional material compiler audits through `python -m benchmark batch --regional-audit local_spectrum` interleave full and local compilation, record patch extents and synchronized wall time, and compare all material tensor channels outside timing. The measurement excludes initial bank construction and FDTD stepping.
|
|
38
|
+
- Batch developer profiling through `python -m benchmark batch --profile WORKLOAD --concurrency B` separates uninstrumented latency, CPU dispatch scopes, CUDA activity and diagnostic field-only graph replay with spectrum parity checks. `--capacity-audit WORKLOAD --variants N --capacities 1 2 4 10` records actual solver reconstruction counts and costs across repeated cohorts. These diagnostic measurements do not enable the public graph scheduler or constitute business throughput acceptance.
|
|
39
|
+
|
|
5
40
|
## Maintenance Rule
|
|
6
41
|
|
|
7
42
|
- Update this file whenever a new user-visible feature, public API capability, or meaningful workflow is added, removed, or materially changed.
|
|
@@ -9,6 +44,8 @@ This document tracks the current user-visible capabilities of the `maxwell` pack
|
|
|
9
44
|
|
|
10
45
|
## Packaging And Platform Support
|
|
11
46
|
|
|
47
|
+
- Native FDTD extension preparation honors toolkit paths set after module import and reports toolkit discovery separately from process-level CUDA device access, including container and sandbox visibility.
|
|
48
|
+
|
|
12
49
|
- Prebuilt CUDA 12.8 wheels for CPython 3.10-3.14 on Linux x86_64 and Windows x86_64.
|
|
13
50
|
- Each wheel includes one Python-independent LibTorch Stable ABI FDTD library targeting PyTorch 2.10 or newer; the same binary is CI load-tested with PyTorch 2.10, 2.11, and 2.12 across CPython 3.10-3.14.
|
|
14
51
|
- Native CUDA images cover compute capabilities 7.0, 7.5, 8.0, 8.6, 8.9, 9.0, 10.0, 10.1, and 12.0, with compute 12.0 PTX retained for forward-compatible Blackwell execution.
|
|
@@ -40,7 +77,7 @@ This document tracks the current user-visible capabilities of the `maxwell` pack
|
|
|
40
77
|
- `BoundarySpec.bloch_wavevector="auto"` marker for solver-resolved Bloch phase workflows during FDTD preparation
|
|
41
78
|
- Public `BoundaryKind` literal type for boundary-mode selection across declarative scene APIs
|
|
42
79
|
- Shared `witwin.core.Structure` records pairing geometry and material, with `priority`, `enabled`, and `tags`
|
|
43
|
-
- `
|
|
80
|
+
- Declarative `Structure(geometry=..., material=...)` construction uses the shared structure contract
|
|
44
81
|
- `MaterialRegion` for density-based PyTorch-native material overlays: Box occupancy participates in the same per-subsample arithmetic or polarized interface averaging as an equivalent `Structure`, each Yee axis blends from its own current background toward the density-defined scalar `eps/mu`, density textures are sampled differentiably on-device, and the compiled model retains base/design tensors plus the nominal design mask
|
|
45
82
|
- Scene assembly with `Scene.add_structure(...)`, `Scene.add_source(...)`, `Scene.add_monitor(...)`, and `Scene.add_material_region(...)`
|
|
46
83
|
- Experimental linear-circuit declarations through `Scene.add_circuit(...)` and `Scene.compile_circuits()`: a `Circuit` owns deterministic node/device order with a unique ground node, reuses the public `Resistor` / `Capacitor` / `Inductor` types with circuit-node terminals, binds only existing lumped/terminal EM ports, and performs explicit floating-network, source-loop, branch-dependency, and dense-size diagnostics without a CPU solver fallback
|
|
@@ -49,7 +86,7 @@ This document tracks the current user-visible capabilities of the `maxwell` pack
|
|
|
49
86
|
- Experimental standalone nonlinear circuit transient (Phase 1, no FDTD coupling): `run_nonlinear_transient(...)` runs Newton in the transient loop over a fixed or non-uniform time grid, folding each device's stored-charge companion into the residual/Jacobian with the same trapezoidal (`2/dt`) / backward-Euler (`1/dt`) bilinear-transform convention as the linear reactive elements (`_charge_companion` / `advance_charge_state`, so the diode `junction_capacitance` and `VoltageDependentCapacitor` `Q(V)` are consumed and the charge history advances only on an accepted step). The transient runs a backward-Euler first step (trapezoidal startup) so a prescribed non-DC `initial_state` does not carry the `i_cap^0 = 0` first-step artifact. `solve_dc_operating_point(...)` finds the operating point with a geometric gmin continuation ladder ending exactly at `gmin=0` (no residual artificial conductance), treating capacitors as open at DC. A step in which a `PiecewiseLinearIV` device crosses a knot is re-solved with a local backward-Euler companion so the trapezoidal reactive companion does not ring on the conduction-slope kink, and that step's KCL residual and charge-history advance are taken under the same backward-Euler companion it was solved with. Under `failure='record_and_stop'` a non-convergent step (or DC start) truncates the trajectory rather than committing the unconverged iterate: `converged=False` with `stopped_step` recording the failing index. `multistart_dc(...)` sweeps seeds and deduplicates the converged DC operating points into a `MultistartReport` that distinguishes a unique operating point from multistability on an N-shaped negative-differential-resistance device (a benign non-convergence maps to `-1`; a non-finite device evaluation propagates as a device-model error rather than being masked). Verified CPU/fp64: diode DC I-V vs analytic Shockley `< 1e-5` across a bias sweep; half-wave and center-tapped full-wave rectifier steady-ripple output vs a frozen oversampled backward-Euler reference `< 1%` normalized RMS; every converged transient step meets the KCL residual tolerance; a linear-`Q(V)` capacitor discharge reproduces the analytic RC decay `< 1e-4`.
|
|
50
87
|
- Experimental standalone CUDA linear-MNA runtime through `compile_mna_system(...)`: double- or single-precision DC operating points and trapezoidal/backward-Euler transients cover shared R/L/C devices, independent and E/G/F/H controlled sources, mutual inductance, scheduled switches, constrained or zero DAE initialization, local backward-Euler damping at startup/breakpoints, reusable piecewise factorizations, trainable CUDA parameters, and torch-native `CircuitData` node voltages, physical branch currents, device powers, energy residuals, and solver diagnostics
|
|
51
88
|
- Experimental strong FDTD/circuit co-simulation for one circuit bound to one or more lumped/terminal ports through the ordinary `Scene -> Simulation.fdtd(...) -> Result` flow: `compile_coupled_mna_system(...)` condenses every exact Yee edge Norton operator into one GPU MNA/DAE solve at the same midpoint, supports controlled sources across bound ports and PULSE/SIN/PWL schedules, reuses the existing compiled terminal geometry and polarity, scatters solved currents before tail corrections, reuses piecewise LU factors and preallocated solve buffers, vectorizes fixed R/C networks, and publishes consistent port and `CircuitData` samples. Fixed built-in source/switch schedules support factor-class CUDA Graph replay, and `compile_batched_mna_factors(...)` provides an internal fixed-shape `[batch, unknown, unknown]` cached GPU solve primitive. `CircuitData.save/load` uses detached safe tensor-only snapshots; Result v2 persistence is a detached CPU snapshot that must be loaded only from trusted sources. `PreparedSimulation.run_until(...)` plus a fresh single-GPU `prepare().run(resume_from=...)` restores physical fields/CPML, port accumulators, circuit histories and result prefixes under a strict execution fingerprint. Spatial multi-GPU forward runs assign each wholly shard-owned bound port to one owner and the circuit graph to the owner of the minimum global reference edge, exchange one voltage/current scalar pair per remote port per step, keep same-shard ports on a zero-P2P fast path, and move final `PortData`/`CircuitData` once to `result_device`; full distributed field-shard checkpoint replay and distributed gradients remain deferred. Direct excitation or `PortSweep` of a bound port, a nonzero DC port current inconsistent with the zero initial Yee field, multi-circuit execution, resumable full-field/observer runs, and one port spanning an x split fail explicitly.
|
|
52
|
-
- Experimental single-device FDTD thin-wire workflow keeps immutable, physical-radius `ThinWire` centerlines separate from volume `Structure` geometry through `Scene.add_thin_wire(...)` / read-only `Scene.thin_wires`; PEC straight, bent, branched, named-junction, and closed-loop paths compile into one cached energy-paired current/charge graph and run through native CUDA sampling, recurrence, and sorted-transpose deposition without thin-cylinder voxelization. Physical polyline spans own circuit state while cell-local `WireFragment` records own conservative arbitrary-direction coupling, including uniform/custom/auto grids and legal interior paths under real-periodic boundaries; face-touching wraps and Bloch paths fail closed. Open and named-PEC-grounded endpoints are supported. Standard `LumpedPort` and `TerminalPort` declarations bind to wire nodes or a removed feed gap through `WireNodeRef` / `WirePortBinding`, retain Yee-staggered voltage/current phasors, and share the ordinary `Result.port(...)` and RF adjoint path. `WireMonitor` returns frequency-first device-resident current/charge/loss selections as differentiable `WireData`; wire `I/q` participate in schema-
|
|
89
|
+
- Experimental single-device FDTD thin-wire workflow keeps immutable, physical-radius `ThinWire` centerlines separate from volume `Structure` geometry through `Scene.add_thin_wire(...)` / read-only `Scene.thin_wires`; PEC straight, bent, branched, named-junction, and closed-loop paths compile into one cached energy-paired current/charge graph and run through native CUDA sampling, recurrence, and sorted-transpose deposition without thin-cylinder voxelization. Physical polyline spans own circuit state while cell-local `WireFragment` records own conservative arbitrary-direction coupling, including uniform/custom/auto grids and legal interior paths under real-periodic boundaries; face-touching wraps and Bloch paths fail closed. Open and named-PEC-grounded endpoints are supported. Standard `LumpedPort` and `TerminalPort` declarations bind to wire nodes or a removed feed gap through `WireNodeRef` / `WirePortBinding`, retain Yee-staggered voltage/current phasors, and share the ordinary `Result.port(...)` and RF adjoint path. `WireMonitor` returns frequency-first device-resident current/charge/loss selections as differentiable `WireData`; wire `I/q` participate in schema-v3 checkpoint/replay, and native standard/CPML reverse paths provide exact recurrence/deposition transposes plus fixed-stencil coordinate, physical-radius, local isotropic host-material, gap-weight, and source-amplitude gradients. The solver reports compressed state and a conservative joint Maxwell/wire CFL adjustment; differentiable runs require a fixed step below that joint bound. Spatial multi-GPU forward runs assign each cell-local sampling/deposition Yee edge to its owning shard and the whole compressed `I/q` recurrence plus every `WireMonitor` to the single owner of the minimum global sampling edge (declaration-order independent), reduce per-segment EMF partials to that owner with a deterministic rank-ordered sum, advance `I/q` owner-only, broadcast the advanced current back so every owned edge deposits exactly once, and move final `WireData` once to `result_device`: a physical segment may span any number of shards, its fragments split at each partition boundary, and the shared joint Maxwell/wire dt is taken from the full-domain single-GPU wire runtime so the step matches bitwise. A wire crossing the x split reproduces the single-GPU forward bitwise at a short horizon (deterministic reductions and per-edge deposition are bit-exact) while over long runs individual field phases drift by chaotic float32 halo-curl accumulation as in any distributed FDTD, yet the discrete lossless-loop energy invariant across the split stays tight. A trainable wire under multi-GPU (the Phase 7 adjoint bridge does not checkpoint or replay wire state), a distributed CPML or Mur absorbing boundary, and a wire mixed with an embedded network or lumped circuit fail closed at prepare. Finite-conductor wires now have a first-class material law `WireConductor.finite(conductivity, permeability=...)` and a per-unit-length series-impedance model (`witwin.maxwell.compiler.wire_impedance`): the exact analytic solid-round-wire skin-effect impedance `Z'(omega) = m/(2 pi a sigma) . I0(ma)/I1(ma)` with the exact DC resistance `1/(pi a^2 sigma)`, and a passive rational auxiliary-differential-equation fit of the excess impedance that reuses the shared network rational-fitting stack (`fit_rational`, `RationalModel.to_state_space`, bilinear `discretize`, and the pole-aware positive-real passivity certificate) rather than duplicating any pole fitting. The analytic AC resistance meets the 2% analytic gate against an independent evaluation and the ADE realizes the broadband impedance with a numerically certified non-growing discretization (not positive-real by construction: the improper skin-effect impedance carries an out-of-band direct term, so dissipativity is asserted per segment by the checked in-band positive-resistance condition plus a combined current/ADE spectral-radius `< 1` certificate, not guaranteed by construction). A finite-conductor wire now runs: the passive series impedance folds into the wire current update as an energy-consistent trapezoidal companion (`L dI/dt + R_dc I + ADE-excess = emf + potential drop`) whose PEC limit is the byte-identical lossless leapfrog, and the build adaptively selects the highest fit order whose combined current/ADE companion is certified non-growing (physical in-band positivity plus spectral radius `< 1`) or fails closed. The `ohmic_loss` monitor emits real per-frequency dissipation `0.5 Re(Z'(f)) length |I(f)|^2` (PEC segments report exactly zero), consistent with the recurrence's own dissipation. A finite conductor's field-coupled reverse/adjoint replay and checkpoint/resume fail closed (the ADE loss-state transpose and checkpoint schema, the field-coupled conductivity current sensitivity `dI/dsigma`, and distributed wire reverse/gradient communication remain deferred). The deterministic conductivity adjoint of the dissipation channel ships separately (see the next entry).
|
|
53
90
|
- Finite-conductor thin-wire conductivity adjoint (dissipation channel): the exact closed-form conductivity sensitivity of the analytic scaled-Bessel internal impedance, `d Z'(omega)/d sigma = (i omega mu)/(4 pi sigma) . (1 - (I0(ma)/I1(ma))^2)` (`witwin.maxwell.compiler.wire_impedance.internal_impedance_conductivity_gradient`), whose DC limit is exactly `d R_dc/d sigma = -1/(pi a^2 sigma^2)`. A PyTorch-native autograd path (`witwin.maxwell.fdtd.wire_lossy.analytic_ac_resistance`) makes a scalar conductivity leaf differentiate the per-unit-length AC resistance `Re(Z'(f; sigma))`, so an ohmic-dissipation objective `0.5 . Re(Z'(f; sigma)) . length . |I(f)|^2` has an exact conductivity gradient (validated against a float64 central difference of the analytic model, no rational fit involved), and `LossySegmentModel.conductivity_ac_resistance_gradient(frequencies)` returns the per-segment `d Re(Z')/d sigma` for the built model. This deterministic channel deliberately avoids the field-coupled current sensitivity, which stays fail closed because the recurrence's ADE coefficients come from a nondeterministic shared rational fit. A distributed (multi-GPU) forward carrying a finite-conductor wire fails closed rather than silently running it as a lossless PEC wire, because the distributed owner runtime builds only the lossless current update.
|
|
54
91
|
- Scene-level port assembly with type and unique-name validation through `Scene.add_port(...)`; `ModePort` continues to materialize through `Scene.resolved_sources()` / `Scene.resolved_monitors()`, while axis-aligned `LumpedPort` and `TerminalPort` declarations compile through `Scene.compile_ports()` into the same sparse Yee E-line/H-loop geometry without adding a second solver entrypoint. The first `TerminalPort` contract resolves two uniquely named, unrotated PEC `Box` structures across facing surfaces, uses the center of their transverse footprint overlap for voltage integration, and constructs its current contour from that overlap at the explicit reference plane
|
|
55
92
|
- Phase-0 RF conventions use explicit negative-to-positive voltage paths, right-hand-rule current loops, peak phasors with `exp(-i*omega*t)`, average power `0.5*Re(V*conj(I))`, and complex-reference Kurokawa power waves. `PortData` keeps an explicit frequency axis and reports V/I, a/b, impedance, incident/reflected/accepted power, return loss, and VSWR; `NetworkData` fixes `[frequency, output_port, input_port]` ordering, complex `z0[frequency, port]`, valid excitation columns, differentiable S/Z/Y conversion, and reference-impedance renormalization through `torch.linalg.solve`
|
|
@@ -104,9 +141,10 @@ This document tracks the current user-visible capabilities of the `maxwell` pack
|
|
|
104
141
|
- `PerturbationMedium(base, perturbation=..., eps_sensitivity=...)` shifts a base `Material`'s permittivity by an external perturbation field, `eps(x) = eps_base + eps_sensitivity * perturbation(x)` (for example a temperature or carrier-density map): the 3D torch `perturbation` grid maps over the structure's `Box` extent exactly like `MaterialRegion.density`, composes with the soft geometry occupancy, and is applied at compile time before ADE templating so dispersive bases see the shifted `eps_inf`; the map is PyTorch-native and differentiable, and a `perturbation` tensor with `requires_grad=True` is discovered as a trainable material input by the FDTD/FDFD gradient bridges (validated against per-element finite differences)
|
|
105
142
|
- Axis-aligned diagonal anisotropy through `DiagonalTensor3` for `epsilon_tensor`, `mu_tensor`, and `sigma_e_tensor`, plus symmetric positive-definite off-diagonal electric permittivity through `Tensor3x3`
|
|
106
143
|
- A `DiagonalTensor3` `epsilon_tensor` composes with electric dispersive poles in the same `Material`: each Yee axis carries its own background permittivity `eps_inf_i` while the shared isotropic pole susceptibility disperses all axes, giving the per-axis frequency permittivity `eps_i(omega) = eps_inf_i + chi(omega)` (birefringent background with material dispersion), validated against the analytic per-axis pole susceptibility and differentiable through the FDTD adjoint
|
|
107
|
-
-
|
|
144
|
+
- Full off-diagonal permittivity composes with isotropic electric dispersive poles in the same material. The reciprocal inverse-material operator acts on both the Yee curl and ADE current, preserving the crystal principal response under grid refinement. This combination remains forward-only; its coupled material adjoint is guarded.
|
|
108
145
|
- A full off-diagonal `Tensor3x3` `epsilon_tensor` structure may overlap the CPML absorber (an anisotropic crystal reaching the boundary): a dedicated native CUDA aniso CPML kernel coordinate-stretches every off-diagonal `curl(H)` derivative with a per-direction psi memory owned by the target Yee edge (the two transverse directions use the E-field node profiles, the edge's own half-point direction uses the H-field profile), which reduces exactly to the raw off-diagonal update outside the absorber and, inside it, restores the stability and absorption that the un-stretched coupling loses; validated by a homogeneous rotated birefringent crystal filling the domain whose post-pulse residual field energy stays within 2x of the isotropic-PML baseline (the un-stretched coupling diverges instead). The split-field graded-sigma absorbers (`absorber="pml"`/`"absorber"`) have no per-direction auxiliary memory to stretch the coupling, so an anisotropic overlap there is rejected with a physics-worded error; the adjoint likewise rejects an anisotropic structure overlapping the CPML because the reverse replay does not yet stretch the off-diagonal coupling
|
|
109
|
-
-
|
|
146
|
+
- Spatially varying positive-definite full permittivity tensors compile into a volume-weighted reciprocal Yee operator by inverting node tensors and scattering reciprocal cross-component contributions. The native update and transpose share the same four weights per target edge, including nonuniform grids. Electric conductivity uses node-local shifted inverses with a separate conservative global conductivity feedback bound; the local shift is not treated as an exact global implicit solve. Full-tensor conductive and dispersive runs remain forward-only. Active off-diagonal CPML memories are included in disk checkpoints.
|
|
147
|
+
- PointDipole, UniformCurrentSource and electric CustomCurrentSource drives inside full-tensor media apply the complete inverse-material operator, including transverse electric response. Constitutive source patches compile once and use the existing native injection path, including periodic wrapping. In supported real CPML adjoint scenes, material gradients include this source contraction at trainable material interfaces; the existing full-tensor adjoint boundary restrictions still apply.
|
|
110
148
|
- A `DiagonalTensor3` `mu_tensor` composes with magnetic dispersive poles in the same `Material` (the magnetic mirror of the diagonal-anisotropic electric-dispersion combination): each Yee edge carries its own background permeability `mu_inf_i` while the shared isotropic magnetic pole susceptibility disperses all axes, giving the per-axis frequency permeability `mu_i(omega) = mu_inf_i + chi_m(omega)` (a birefringent magnetic background with material dispersion), validated against the analytic per-axis magnetic pole susceptibility read from the magnetic ADE state; a full off-diagonal `Tensor3x3` magnetic tensor remains unsupported as a static tensor field, while a *non-reciprocal* off-diagonal permeability is instead provided by the dedicated `GyromagneticFerrite` material (below), which carries the gyrotropy in a local magnetization state rather than by widening `mu_tensor`
|
|
111
149
|
- `GyromagneticFerrite` first-class SI material for DC-biased ferrites (the framework's first non-reciprocal medium): `GyromagneticFerrite(eps_r, saturation_magnetization, bias_field=(x,y,z), gilbert_damping, gyromagnetic_ratio, mu_infinity, sigma_e)` defines a gyromagnetic (Polder) permeability from a linearized Landau-Lifshitz-Gilbert model, validated for `saturation_magnetization > 0`, `bias_field != 0`, `gilbert_damping >= 0`, and `gyromagnetic_ratio > 0`; `GyromagneticFerrite.from_cgs(saturation_4piMs_gauss=..., bias_Oe=...)` accepts CGS datasheet quantities and records the exact SI conversion in `cgs_conversion`, and `GyromagneticFerrite.from_resonance(resonance_frequency=..., saturation_magnetization=..., linewidth=...)` back-computes the bias and Gilbert damping from the gyromagnetic resonance; `permeability_tensor_at_freq(frequency)` / `polder_tensor(angular_frequency)` return the torch-native, differentiable complex 3x3 lab-frame Polder tensor `mu_r = mu*(I - b b^T) + mu_infinity*(b b^T) + i*kappa*[b]_x` (`exp(-i*omega*t)` convention, Hermitian when lossless and passive-absorptive when `gilbert_damping > 0`, off-diagonal `kappa` and the Faraday rotation flipping sign under bias reversal while the diagonal is unchanged); the full sign/unit conventions, LLG->Polder derivation, implicit-midpoint discretization, discrete-energy passivity proof, and frozen acceptance budget are recorded in `docs/reference/ferrite-physics-contract.md`. `Scene.compile_gyromagnetic_materials(dt=...)` lowers every ferrite structure into a `CompiledGyromagneticLayout` structure-of-arrays (active-cell indices, raw occupancy, per-cell bias unit vector and right-handed orthonormal local basis with an axis-aligned z/x/y fast path, `omega_0`/`omega_m`/`gilbert_damping`/`mu_infinity`, the dt-independent 2x2 magnetization-ADE matrices, and -- once `dt` is bound -- the implicit-midpoint Cayley propagator that is orthogonal when lossless and a strict contraction when lossy), with an explicit staircase partial-fill (the anti-symmetric gyrotropic tensor is never scalar-averaged) and a full off-diagonal `mu_r(f)` per-cell tensor accessor `CompiledGyromagneticLayout.permeability_tensor(frequency)`; the layout is cached per scene and serializable, and its per-cell state-space / propagator matrices agree bit-for-bit with the Phase-0 verification oracle. The FDTD time-domain solver runs a ferrite scene directly through the standard `Scene -> Simulation -> Result` path: the ferrite compiles as its diagonal background and the non-reciprocal off-diagonal permeability is produced by a local magnetization-ADE advanced at each ferrite cell (`gyromagnetic_enabled`), inserted into the magnetic update as `H -= dM/mu_infinity` (the magnetic mirror of the electric-side full-anisotropy correction). The forward advances an arbitrary bias -- an axis-aligned z/x/y fast path (where the two transverse magnetic components co-locate on the shared Yee overlap) plus a general per-cell path for an oblique or spatially-mixed bias -- is unconditionally stable and passive (the discrete magnetic energy does not grow at zero damping, monotonically decays for positive Gilbert damping), reproduces the frozen discrete Polder response and its bias-reversal non-reciprocity, composes with PML and electric conductivity, adds zero operations to a ferrite-free scene, and is CUDA-graph capturable (no per-step allocation or host synchronization); the field<->magnetization coupling is the implicit midpoint of the coupled system (the magnetization is driven by the time-centred pre/post-update H and the correction feeds back simultaneously via a precomputed per-cell 2x2 inverse), which is discretely non-growing in a lossless closed cavity unlike an explicit pre-update-advance / post-update-correct split; a general (non-axis-aligned) uniform bias and a scene mixing bias directions (mixed axes, opposed signs on one axis such as a +z/-z latching circulator, or differing magnitudes/materials) are supported through a per-cell general-bias path -- a pure coordinate rotation of the same contracted implicit-midpoint update (identity collocation reused), where the purely-local magnetization ADE makes a mixed-bias scene the direct sum of independent per-cell passive blocks with correct per-region handedness -- while only a Bloch-periodic ferrite run still fails closed (the real magnetization-ADE correction cannot carry the complex Bloch phase), and every non-FDTD-forward consumer of a ferrite scene fails closed rather than silently simulating a reciprocal medium: the frequency-domain (FDFD) solve, the differentiable adjoint (no reverse gyromagnetic core yet), and the multi-GPU distributed solve all reject a ferrite, while single-device checkpoint/resume round-trips the magnetization state
|
|
112
150
|
<!-- BEGIN g3-ferrite-general-bias (Plan 08 slice 2a/2b, general + mixed bias ferrite forward) -->
|
|
@@ -263,6 +301,16 @@ result = mw.Simulation.fdtd(scene, frequencies=[200e12]).run()
|
|
|
263
301
|
|
|
264
302
|
## FDTD Solver Workflow
|
|
265
303
|
|
|
304
|
+
- CUDA Graph preparation restores nonzero electric/magnetic ADE, Mur, wire and other carried state on both successful capture and warmup failure, using live device storage without expanding slab CPML buffers. Resume format v3 derives its complete physical-state layout from the checkpoint schema, including network recurrence, bidirectional delay, wire and real/imaginary Mur histories, and preserves nonlinear envelope diagnostics; incomplete older formats are rejected explicitly.
|
|
305
|
+
- Mur boundaries update both real and imaginary tangential fields, including mixed Bloch/Mur domains. Adjoint checkpoints and replay carry each face's histories, and the reverse applies the exact ordered discrete transpose, including shared corners, before the native Maxwell reverse step.
|
|
306
|
+
- One FDTD time plan includes every field source, modal/terminal drive and circuit waveform. Source permutations preserve automatic duration and sampling; pure CW apodized sampling uses `transient_cycles` and the slowest requested/source period, followed by `steady_cycles`. Pulses and mixed CW/pulse drives record their full response from step zero. Explicit `window="none"` retains full-response recording including startup. Continuing or unknown-support drives disable decay shutoff, and future pulses delay its earliest eligible step. Callable waveforms require explicit `time_steps`; metadata reports short runs, source completion, sampling and support. Source normalization requires a common incident waveform across all field/port drives; ambiguous circuit-driven normalization is rejected.
|
|
307
|
+
- Raw `FieldTimeMonitor` and `FluxTimeMonitor` records are returned identically by fixed and trainable FDTD runs, including time-only runs. These recording buffers are detached and carry `differentiable=False`; adjoint objective gradients use the supported spectral monitor outputs.
|
|
308
|
+
- Full-tensor stability bounds use a positive-definiteness check and the inverse matrix norm with linear preparation storage. Nonlinear envelope diagnostics inspect occupied chi2 edges; linear source cells cannot trigger that nonlinear bound. Resume identity includes material laws, face configuration, network dynamics and wire coefficients, while excluding nonlinear coefficient work buffers that are rebuilt every step.
|
|
309
|
+
|
|
310
|
+
- FDTD preparation selects the final time step from high-frequency Yee material bounds, declared density ranges, modulation minima, and strength-dependent electric/magnetic ADE response rates, with a 0.9 stability margin and separate material-response resolution. `TimeConfig(dt=...)` pins a validated step for optimization and reproducibility; automatic step selection is numerical configuration and field gradients hold dt fixed. A trainable `Simulation` freezes its first prepared step across parameter updates and rejects an update that makes it unsafe; comparisons across separate Simulation objects should explicitly share `TimeConfig.dt`. Material, boundary, source and port coefficients bind after the joint wire constraint, and distributed shards use the same globally validated step. Solver statistics expose the bounds and limiting factor. For chi2 or negative Kerr increments, an automatically bounded field envelope (or explicit `TimeConfig(max_electric_field=...)` per-component bound) limits the negative permittivity increment; device-resident peak tracking rejects runs that exceed it. Gain media retain their explicit opt-in and are not classified as passive.
|
|
311
|
+
|
|
312
|
+
- Mixed Bloch/CPML differentiable forward stepping uses independent real and imaginary magnetic absorption memory. Scalar mode operators, material potentials, and sparse eigenvector seeds use the same row-major aperture layout for rectangular grids and unequal transverse spacings.
|
|
313
|
+
|
|
266
314
|
- Time-domain simulation through `Simulation.fdtd(...)`
|
|
267
315
|
- CUDA-only solver execution; `Simulation.fdtd(...)` requires `Scene(device="cuda")`
|
|
268
316
|
- Compiled native CUDA kernels are the only FDTD runtime backend; the Torch reference path has been retired from the runtime and relocated to the CUDA parity tests
|
|
@@ -279,6 +327,9 @@ result = mw.Simulation.fdtd(scene, frequencies=[200e12]).run()
|
|
|
279
327
|
|
|
280
328
|
- Single- or multi-frequency DFT extraction through `frequency=` or `frequencies=[...]`
|
|
281
329
|
- Source temporal frequency (`source_time.frequency`) remains distinct from simulation / monitor extraction frequencies; Maxwell does not infer extraction frequencies implicitly
|
|
330
|
+
- Automatic FDTD time-step resolution includes declared field, port and circuit carriers, finite pulse ramps and widths, PWL knot intervals and exponential envelopes without changing the default carrier of another source. Explicit and optimization-locked time steps are shared by single-device and distributed adjoint preparation.
|
|
331
|
+
- Field and lumped-port spectral observers consume the same all-source sampling window and phase origin. Port-only incident-waveform normalization uses a unit-amplitude, zero-phase reference while retaining physical drive amplitude and phase; terminal adjoint seeds transpose the stored forward phase tables.
|
|
332
|
+
- Detached field-time recording preserves complex Bloch fields and is available in supported distributed point-monitor adjoint runs, including time-only output. Complex-field `FluxTimeMonitor` is rejected because a unique instantaneous flux is undefined; spectral `FluxMonitor` provides complex-field power measurements.
|
|
282
333
|
- ADE-based electric and magnetic dispersive-material updates for Debye, Drude, and Lorentz media
|
|
283
334
|
- Static isotropic or diagonal electric conductivity (`sigma_e`) in the time-domain update, folded into the per-component lossy-dielectric `Ca`/`Cb` coefficients via the standard semi-implicit trapezoidal scheme so simple lossy dielectrics no longer require a fitted Drude pole
|
|
284
335
|
- Static magnetic conductivity `Material(sigma_m=...)` [Ohm/m], the magnetic dual of `sigma_e`: the magnetic conduction current `sigma_m * H` on Faraday's law folds semi-implicitly into the per-component H-update decay/curl coefficients `Da = (1 - h)/(1 + h)`, `Db = (dt/mu)/(1 + h)` with `h = 0.5 * sigma_m * dt / mu` (the exact mirror of the `sigma_e` E-update fold), reducing to the lossless leapfrog where `sigma_m = 0` and composing multiplicatively with the CPML split-field decay; a magnetically-lossy slab attenuates a plane wave at the analytic rate `alpha = (omega/c) Im(sqrt(1 + i sigma_m/(omega mu0)))` (within 2%), and a matched lossy layer satisfying the impedance-match condition `sigma_m/mu0 = sigma_e/eps0` reflects below a same-thickness PML baseline (an unmatched electric-only layer of the same thickness reflects more). `sigma_m` folds into eps-independent H coefficients that the reverse replay already reads, so it is transparent to the FDTD adjoint (an eps design differentiates alongside a `sigma_m` structure); FDFD and Tidy3D export reject it (magnetically-lossy media are outside their model) rather than silently dropping it
|
|
@@ -639,6 +690,7 @@ Capability level: **differentiable-surrogate (non-physical, non-regulatory)**. T
|
|
|
639
690
|
|
|
640
691
|
- The delay-free embedded-network same-step coupling solve now applies the constant direct-loop operator through two precomputed composite matvecs, `branch_current = (M^-1 C) @ state + (M^-1 D) @ v`, instead of a per-step sequential pivoted-LU triangular substitution. The composite operators are formed once at prepare time by LU-solving the constant `C` and `D` against the loop matrix `M = I + D * diag(Z_f)` (not by naive matrix inversion), so the eager and CUDA-graph coupling paths become bitwise-identical and the per-step kernel-launch count of the connected 8-port/order-32 feedback block drops from 78 to 27 (65%). The op-stream before/after evidence is a reproducible artifact (`docs/assessments/e4-network-coupling-op-stream-2026-07-19.json`) and gate (`tests/rf/network/test_network_coupling_op_stream.py`); numerics are unchanged within the direct loop's floating-point roundoff bound and the existing multiport/ill-conditioned parity gates.
|
|
641
692
|
- Embedded networks with explicit port delay now checkpoint and resume correctly: the frozen FDTD checkpoint schema captures the bidirectional reference-plane rings, the Thiran fractional-delay filter memory, and the shared ring cursor, so `run_until(k)` + `run(resume_from=...)` reproduces the uninterrupted delayed-network fields and diagnostics bit-for-bit (`tests/rf/network/test_network_delay_checkpoint.py`). Previously a resumed delayed network silently restarted its reference planes from zero.
|
|
693
|
+
- Resume schema v4 also persists the seven breakdown histories and reconstructs the next-step conductivity coefficients without advancing timers or charging dissipation twice. Resume identity checks include gyromagnetic bias and compiled breakdown configuration; completed-step dynamic histories do not change configuration identity. Embedded graph capture restores gyromagnetic memory on success and failure, and Mur adjoints preserve the boundary histories alongside RF state.
|
|
642
694
|
- Differentiable adjoints of explicit-delay embedded networks remain fail-closed with a precise rejection reason (the bidirectional ring couples steps up to `max_delay_steps` apart, possibly across checkpoint segments, and the fractional-delay filter is an IIR recurrence, neither of which the segment-local network pullback reverses); forward runs including checkpoint/resume are fully supported.
|
|
643
695
|
- WavePort embedding stays fail-closed with an accurate rejection message: an embedded state-space network couples through a scalar voltage/current terminal on a single lumped Yee edge (LumpedPort or resolved TerminalPort), but a WavePort is a modal port with no scalar time-domain terminal (V, I) contract. This is a missing design contract, not a bug.
|
|
644
696
|
<!-- END e4b-network-coupling -->
|
|
@@ -1,15 +1,18 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: witwin-maxwell
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.1
|
|
4
4
|
Summary: Witwin Maxwell - Electromagnetic simulation (FDTD/FDFD)
|
|
5
5
|
Project-URL: License, https://witwin.ai/license
|
|
6
6
|
License-Expression: LicenseRef-Witwin-Research OR LicenseRef-Witwin-Commercial
|
|
7
7
|
License-File: LICENSE
|
|
8
8
|
Requires-Python: <3.15,>=3.10
|
|
9
|
+
Requires-Dist: ipython>=8
|
|
10
|
+
Requires-Dist: matplotlib>=3.7
|
|
9
11
|
Requires-Dist: numpy>=1.24
|
|
10
12
|
Requires-Dist: scipy>=1.10
|
|
11
13
|
Requires-Dist: torch>=2.10
|
|
12
|
-
Requires-Dist:
|
|
14
|
+
Requires-Dist: tqdm>=4.65
|
|
15
|
+
Requires-Dist: witwin<0.5,>=0.4
|
|
13
16
|
Provides-Extra: direct
|
|
14
17
|
Requires-Dist: nvidia-cudss-cu12; extra == 'direct'
|
|
15
18
|
Requires-Dist: nvmath-python[cu12]; extra == 'direct'
|
|
@@ -160,7 +163,7 @@ python -m benchmark planewave_vacuum
|
|
|
160
163
|
|
|
161
164
|
Benchmark assets live under `benchmark/scenes/`, `benchmark/cache/`, `benchmark/plots/`, and `benchmark/RESULTS.md`.
|
|
162
165
|
|
|
163
|
-
The release validation suite combines unit/API tests, native CUDA parity and adjoint tests, and numerical comparisons against an external reference solver. Cross-solver comparisons use common physical-domain coordinates, external PML on both sides, coordinate-aligned complex field slices, and solver-independent scalar observables. See [`benchmark/RESULTS.md`](benchmark/RESULTS.md) for the generated comparison table and the validation-status section of the [0.
|
|
166
|
+
The release validation suite combines unit/API tests, native CUDA parity and adjoint tests, and numerical comparisons against an external reference solver. Cross-solver comparisons use common physical-domain coordinates, external PML on both sides, coordinate-aligned complex field slices, and solver-independent scalar observables. See [`benchmark/RESULTS.md`](benchmark/RESULTS.md) for the generated comparison table and the validation-status section of the [0.5.1 release notes](docs/reference/release-notes-0.5.1.md) for what the evidence does and does not cover.
|
|
164
167
|
|
|
165
168
|
## Current Notes
|
|
166
169
|
|
|
@@ -140,7 +140,7 @@ python -m benchmark planewave_vacuum
|
|
|
140
140
|
|
|
141
141
|
Benchmark assets live under `benchmark/scenes/`, `benchmark/cache/`, `benchmark/plots/`, and `benchmark/RESULTS.md`.
|
|
142
142
|
|
|
143
|
-
The release validation suite combines unit/API tests, native CUDA parity and adjoint tests, and numerical comparisons against an external reference solver. Cross-solver comparisons use common physical-domain coordinates, external PML on both sides, coordinate-aligned complex field slices, and solver-independent scalar observables. See [`benchmark/RESULTS.md`](benchmark/RESULTS.md) for the generated comparison table and the validation-status section of the [0.
|
|
143
|
+
The release validation suite combines unit/API tests, native CUDA parity and adjoint tests, and numerical comparisons against an external reference solver. Cross-solver comparisons use common physical-domain coordinates, external PML on both sides, coordinate-aligned complex field slices, and solver-independent scalar observables. See [`benchmark/RESULTS.md`](benchmark/RESULTS.md) for the generated comparison table and the validation-status section of the [0.5.1 release notes](docs/reference/release-notes-0.5.1.md) for what the evidence does and does not cover.
|
|
144
144
|
|
|
145
145
|
## Current Notes
|
|
146
146
|
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# WiTwin Maxwell converged CW-FDTD data generator
|
|
2
|
+
|
|
3
|
+
This experiment creates random box, sphere, and cylinder scenes driven by a
|
|
4
|
+
continuous-wave point dipole, solves the 3-D FDTD transient, and exports the
|
|
5
|
+
converged complex 2 GHz phasor field.
|
|
6
|
+
|
|
7
|
+
Each sample contains:
|
|
8
|
+
|
|
9
|
+
- `sample_NNNNN.npz`: `field` shaped `(N,N,N,6)` and `permittivity` shaped
|
|
10
|
+
`(N,N,N)`, both `float32`;
|
|
11
|
+
- `sample_NNNNN_meta.json`: the exact scene, DFT window, solve attempts,
|
|
12
|
+
convergence certificate, timings, storage, and peak GPU memory;
|
|
13
|
+
- `summary.json`: aggregate convergence, runtime, and exact byte counts.
|
|
14
|
+
|
|
15
|
+
The field channels are `Ex_real`, `Ex_imag`, `Ey_real`, `Ey_imag`, `Ez_real`,
|
|
16
|
+
and `Ez_imag`. External CPML cells are cropped and staggered Yee components
|
|
17
|
+
are interpolated to physical-domain cell centers.
|
|
18
|
+
|
|
19
|
+
## Steady-state contract
|
|
20
|
+
|
|
21
|
+
The default run uses a fixed 80-cycle Hanning DFT window after at least five
|
|
22
|
+
domain round trips of transient propagation. A time probe is placed half a
|
|
23
|
+
wavelength from the source and at every object center. Two adjacent final
|
|
24
|
+
four-cycle windows are fitted to complex Ex/Ey/Ez phasors. Both the vector
|
|
25
|
+
phasor change and vector-energy-weighted sinusoid-fit residual must be at most
|
|
26
|
+
1%.
|
|
27
|
+
|
|
28
|
+
If a scene fails, the generator reruns it with a longer pre-DFT transient
|
|
29
|
+
while keeping the 80-cycle DFT window fixed. The wait doubles up to 640 cycles.
|
|
30
|
+
A sample that still fails is rejected and is never written. This prevents
|
|
31
|
+
early transient fields from entering a nominally steady dataset.
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
/home/xingyu/miniconda3/envs/maxwell/bin/python \
|
|
35
|
+
experiments/fdtd_data_generator/generate.py \
|
|
36
|
+
--num-samples 100 --grid-size 256 --gpus 0,1
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The default output is `dataset_256_steady`; the historical 256-step
|
|
40
|
+
Gaussian-pulse dataset in `dataset_256` is not overwritten. Generation is
|
|
41
|
+
resumable only for samples whose data size, configuration, generator contract,
|
|
42
|
+
and convergence certificate all match exactly. Existing partial or
|
|
43
|
+
incompatible samples cause an error instead of being overwritten.
|
|
44
|
+
|
|
45
|
+
Uncompressed NPZ is the default for predictable throughput. CUDA Graph is off
|
|
46
|
+
by default for stable long batches. `--time-steps` is a fixed-step diagnostic
|
|
47
|
+
override; normal dataset generation should use the automatic steady-state
|
|
48
|
+
runtime.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# 256³ FDTD dataset report
|
|
2
|
+
|
|
3
|
+
> **Historical transient result — not a steady-state dataset.** These files
|
|
4
|
+
> used a Gaussian pulse for only 256 steps (2.438 ns, 4.876 carrier cycles).
|
|
5
|
+
> The pulse had not reached any sample's nearest object by its peak; the
|
|
6
|
+
> resulting field was a localized source wave packet. Keep this report only
|
|
7
|
+
> for provenance. New converged CW results are written to
|
|
8
|
+
> `dataset_256_steady`.
|
|
9
|
+
|
|
10
|
+
## Result
|
|
11
|
+
|
|
12
|
+
- Completed samples: 100 / 100
|
|
13
|
+
- Field shape per sample: `(256, 256, 256, 6)`, `float32`
|
|
14
|
+
- Permittivity shape per sample: `(256, 256, 256)`, `float32`
|
|
15
|
+
- Field channels: Ex/Ey/Ez real and imaginary parts
|
|
16
|
+
- Output: uncompressed NPZ plus one JSON sidecar per sample
|
|
17
|
+
- Random seed scheme: `20260715 + sample_id`
|
|
18
|
+
|
|
19
|
+
## Simulation settings
|
|
20
|
+
|
|
21
|
+
- Solver: WiTwin Maxwell FDTD, full-field single-frequency DFT
|
|
22
|
+
- Frequency: 2.0 GHz
|
|
23
|
+
- Grid spacing: 0.0093685143125 m (16 points per wavelength)
|
|
24
|
+
- Physical domain: 2.398339664 m per side
|
|
25
|
+
- External CPML: 10 cells per face
|
|
26
|
+
- Time steps: 256
|
|
27
|
+
- Random scene: 1–4 boxes, spheres, or cylinders with relative permittivity 2–12
|
|
28
|
+
- Source: randomized Gaussian-pulse point dipole
|
|
29
|
+
- Output grid: external CPML cropped; Yee fields and permittivity interpolated to cell centers
|
|
30
|
+
|
|
31
|
+
## Timing
|
|
32
|
+
|
|
33
|
+
- Mean solve time: 1.703638 s/sample
|
|
34
|
+
- Solve range: 1.596418–2.366009 s/sample
|
|
35
|
+
- Mean complete sample time (scene + solve + save): 3.643796 s/sample
|
|
36
|
+
- Sum of complete sample times: 364.379564 s
|
|
37
|
+
- Two-GPU campaign wall time: 254.604915 s (4 min 14.60 s)
|
|
38
|
+
- Final resumable completion pass: 96.300185 s
|
|
39
|
+
- Stable non-CUDA-Graph GPU peak: about 6.092 GiB per worker
|
|
40
|
+
|
|
41
|
+
The campaign wall time includes the first real-sample benchmark, an initial
|
|
42
|
+
CUDA-Graph batch that exposed graph-memory accumulation after long repeated
|
|
43
|
+
scene creation, and the successful resumable non-graph completion pass. The
|
|
44
|
+
generator now defaults to the stable non-CUDA-Graph mode.
|
|
45
|
+
|
|
46
|
+
## Storage
|
|
47
|
+
|
|
48
|
+
- Data files: 46,976,256,800 bytes
|
|
49
|
+
- Sample metadata: 250,795 bytes
|
|
50
|
+
- Dataset payload + sample metadata: 46,976,507,595 bytes
|
|
51
|
+
- Entire dataset directory: 46,976,508,871 bytes
|
|
52
|
+
- Entire directory in binary units: 43.750283 GiB
|
|
53
|
+
- Per NPZ sample: 469,762,568 bytes (448.000496 MiB)
|
|
54
|
+
|
|
55
|
+
## Validation
|
|
56
|
+
|
|
57
|
+
All 100 sequential NPZ names and JSON sidecars are present. Every NPZ contains
|
|
58
|
+
exactly `field.npy` and `permittivity.npy` with the same byte size. Samples
|
|
59
|
+
0, 49, and 99 were fully loaded and verified for shape, dtype, and finite
|
|
60
|
+
values.
|