đź§Ş Simulation Guide¶
This page shows how to run the two built‑in simulation classes, inspect their results, and understand the design rules behind them.
Prerequisite
You need an HFSS project (.aedt) in your working directory and you must know its design name and setup name.
The Quick‑Start guide can copy two ready‑made projects:
- simple_design.aedt —
my_design/Setup1(used in Example 1) - complex_design.aedt —
my_design/Setup1(used in Example 2)
Supported classes¶
Both share the same interface, so you can swap them with minimal code edits.
Example 1: Eigenmode analysis (simple design)¶
Save the snippet below to run_eigen.py and execute it.
It opens simple_design.aedt, runs Setup1, then prints the Q‑factor and frequency of mode 1.
from quansys.simulation import EigenmodeAnalysis
from quansys.workflow import PyaedtFileParameters
params = PyaedtFileParameters(
file_path="simple_design.aedt",
design_name="my_design",
non_graphical=True # headless HFSS
)
eigen = EigenmodeAnalysis(design_name="my_design", setup_name="Setup1")
with params.open_pyaedt_file() as hfss:
result = eigen.analyze(hfss)
print("Q‑factor (mode 1):", result.results[1].quality_factor)
print("Frequency (mode 1):", result.results[1].frequency)
Need lower‑level control?
PyaedtFileParameters handles HFSS launch and clean‑up, but you can use raw PyAEDT calls if you prefer.
Example 2: QuantumEPR analysis (complex design)¶
QuantumEPR post‑processes an eigenmode solution to compute χ‑matrix elements and participation ratios.
Steps
- Copy the complex bundle:
quansys example --type complex - Solve eigenmodes as in Example 1 (same design/setup names).
- Instantiate
QuantumEPRwith mode‑to‑label and junction metadata.
Key constructor arguments¶
| Argument | What it does | API |
|---|---|---|
modes_to_labels |
Mode labeling: simple dict OR ModesToLabels class |
ModesToLabels |
junctions_config |
Describe Josephson junctions parameters | ConfigJunction |
Full details: QuantumEPR API.
Mode Labeling Options¶
QuantumEPR accepts two formats for modes_to_labels:
- Simple dict:
{1: "q0", 2: "r0"}- when you know exact mode numbers - ModesToLabels class: Advanced inference strategies (see examples below)
Minimal script¶
from quansys.simulation import EigenmodeAnalysis, QuantumEPR
from quansys.workflow import PyaedtFileParameters
from quansys.simulation import ConfigJunction
params = PyaedtFileParameters(
file_path="complex_design.aedt",
design_name="my_design",
non_graphical=True
)
eigen = EigenmodeAnalysis(design_name="my_design", setup_name="Setup1")
# Simple dict: mode number → label
epr = QuantumEPR(
design_name="my_design",
setup_name="Setup1",
modes_to_labels={1: "q0", 2: "r0", 3: "bus"},
junctions_infos=[
ConfigJunction(
line_name="transmon_junction_line",
inductance_variable_name="junction_inductance"
)
]
)
with params.open_pyaedt_file() as hfss:
eigen.analyze(hfss) # solve eigenmodes
epr_result = epr.analyze(hfss)
print(f"χ(q0‑r0): {epr_result.results['chi_q0r0']}")
print(f"Total Q: {epr_result.results['Q_total']}")
QuantumEPR reuses the eigenmode solution already stored in HFSS, so the second call is quick.
The returned QuantumResults object offers .flatten() and .model_dump() just like classical results.
For automatic mode labelling, see ModesToLabels for detailed examples.
Mode‑count limit
A single QuantumEPR run can label at most three modes. If you need five labels, split them into two runs—e.g., one QuantumEPR with modes {q0,r0,bus} and another with {q1,q2}.
Access & save results¶
| Method | Returns | Typical use |
|---|---|---|
result.model_dump() |
nested dict | full archival |
result.model_dump_json() |
JSON string | logging, REST |
result.flatten() |
flat dict | DataFrame / CSV |
Use flatten() for aggregation; use model_dump() when you need every detail.
Design philosophy¶
Unified interface
- Every simulation class implements
.analyze(hfss)to execute. - Results are JSON‑serializable and provide
.flatten().
This consistency lets you string simulations together in larger automation pipelines.
Advanced note¶
CPU cores
EigenmodeAnalysis exposes a cores attribute to control CPU allocation—handy for cluster jobs.