Data Export and Analysis

Export Formats

Prismo supports multiple export formats for different use cases:

Format

Use Case

File Size

Speed

CSV

Spreadsheets, universal

Large

Slow

Parquet

Big data, Python analysis

10-100x smaller

10x faster

Touchstone

Circuit simulators

Compact

Fast

CSV Export

Basic Usage

from prismo import CSVExporter

exporter = CSVExporter(output_dir="./results")

Export Field Data

# Export electromagnetic fields
exporter.export_fields(
    filename="fields_t100",
    fields={
        'Ex': Ex_array,
        'Ey': Ey_array,
        'Ez': Ez_array,
        'Hx': Hx_array,
        'Hy': Hy_array,
        'Hz': Hz_array,
    },
    coordinates={'x': x_array, 'y': y_array, 'z': z_array},
    metadata={'time': 100e-15, 'wavelength': 1.55e-6}
)

Output columns: x, y, z, Ex, Ey, Ez, Hx, Hy, Hz, |E|, |H|

Export Spectra

exporter.export_spectrum(
    filename="transmission_spectrum",
    frequencies=freq_array,
    spectrum=transmission_array,
    metadata={'component': 'S21', 'units': 'linear'}
)

Export S-Parameters

exporter.export_sparameters(
    filename="device_sparameters",
    frequencies=frequencies,
    sparameters={
        'S11': s11_array,
        'S21': s21_array,
        'S12': s12_array,
        'S22': s22_array,
    },
    metadata={'device': 'directional_coupler'}
)

Parquet Export

More efficient for large datasets:

from prismo import ParquetExporter

exporter = ParquetExporter(
    output_dir="./results",
    compression='snappy'  # Options: 'snappy', 'gzip', 'lz4', 'zstd'
)

# Use same API as CSV
exporter.export_fields(...)
exporter.export_spectrum(...)
exporter.export_sparameters(...)

Reading Parquet Files

import polars as pl

# Simple read
df = pl.read_parquet("results/device_sparameters.parquet")

# Lazy read with filtering
df = exporter.read_with_filter(
    filepath="results/fields.parquet",
    filter_expr=pl.col('frequency_Hz') > 190e12,
    columns=['frequency_Hz', 'S21_magnitude']
)

# Process with Polars
transmission_db = -10 * np.log10(df['S21_magnitude'])

Touchstone Export

Standard format for circuit simulators (ADS, HFSS, etc.):

from prismo import export_touchstone

export_touchstone(
    filename="device.s2p",  # .s2p for 2-port
    frequencies=frequencies,
    s_matrix=s_matrix,  # Shape: (n_freq, n_ports, n_ports)
    z0=50.0,
    comments=[
        "Silicon photonic waveguide",
        "Operating wavelength: 1550 nm",
        "Simulated with Prismo FDTD"
    ]
)

The .s2p file can be directly imported into:

  • Keysight ADS

  • Ansys HFSS

  • Cadence

  • LTspice

  • Other RF/photonic circuit simulators

Metadata

All exporters support metadata for provenance tracking:

metadata = {
    'simulation_id': 'wg_001',
    'date': '2025-10-17',
    'device': 'silicon_waveguide',
    'dimensions': '500nm x 220nm',
    'wavelength_range': '1500-1600 nm',
    'backend': 'cupy',
    'grid_resolution': '20 nm',
    'pml_layers': 10,
}

exporter.export_sparameters(..., metadata=metadata)

Metadata is saved as:

  • Comments in CSV files (header lines starting with #)

  • Separate JSON file for Parquet (.meta.json)

  • Comments in Touchstone files (lines starting with !)

Best Practices

  1. Use Parquet for large datasets: 10-100x smaller files, much faster I/O

  2. Use CSV for small data: Easy to inspect in spreadsheets

  3. Use Touchstone for S-parameters: Standard format for circuit design

  4. Always include metadata: Makes results self-documenting

  5. Compress Parquet files: Use ‘snappy’ for speed, ‘zstd’ for size