{ "cells": [ { "cell_type": "markdown", "execution_count": null, "id": "e216b98f", "metadata": { "papermill": { "duration": 0.003146, "end_time": "2026-08-04T16:50:14.215422+00:00", "exception": false, "start_time": "2026-08-04T16:50:14.212276+00:00", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "# Waveguide Box\n", "\n", "A simple hollow rectangular waveguide with two waveports.\n", "\n", "We build a single box, use **selectors** (build123d / cadquery-style) to pick the two end faces, define entities for the PEC volume and the two waveport surfaces, then generate the mesh, write the Palace config, run the simulation, and plot the S parameters." ] }, { "cell_type": "code", "execution_count": 1, "id": "a2184d13", "metadata": { "execution": { "iopub.execute_input": "2026-08-04T16:50:14.221666Z", "iopub.status.busy": "2026-08-04T16:50:14.221470Z", "iopub.status.idle": "2026-08-04T16:50:14.776127Z", "shell.execute_reply": "2026-08-04T16:50:14.775416Z" }, "papermill": { "duration": 0.559123, "end_time": "2026-08-04T16:50:14.777201+00:00", "exception": false, "start_time": "2026-08-04T16:50:14.218078+00:00", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "import gmsh\n", "\n", "from palacetoolkit.geometry import Selector\n", "from palacetoolkit.mesh import (\n", " Entity,\n", " run_entity_pipeline,\n", " create_graded_mesh,\n", " generate_3d_mesh,\n", ")\n", "from palacetoolkit.simulation import (\n", " generate_palace_config_from_entities,\n", " run_palace,\n", ")\n", "from palacetoolkit.postpro import s_params, resonant_frequency\n", "from palacetoolkit.viz import view_mesh " ] }, { "cell_type": "markdown", "execution_count": null, "id": "9805464a", "metadata": { "papermill": { "duration": 0.002593, "end_time": "2026-08-04T16:50:14.782826+00:00", "exception": false, "start_time": "2026-08-04T16:50:14.780233+00:00", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "## Geometry parameters\n", "\n", "Standard WR-90 waveguide dimensions (X-band) as an example." ] }, { "cell_type": "code", "execution_count": 2, "id": "c27265c6", "metadata": { "execution": { "iopub.execute_input": "2026-08-04T16:50:14.789206Z", "iopub.status.busy": "2026-08-04T16:50:14.788921Z", "iopub.status.idle": "2026-08-04T16:50:14.792259Z", "shell.execute_reply": "2026-08-04T16:50:14.791536Z" }, "papermill": { "duration": 0.00723, "end_time": "2026-08-04T16:50:14.792778+00:00", "exception": false, "start_time": "2026-08-04T16:50:14.785548+00:00", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "width = 22.86e-3 # a (broad wall)\n", "height = 10.16e-3 # b (narrow wall)\n", "length = 150.0e-3 # waveguide length along x\n", "\n", "# Frequency sweep\n", "freq_min = 8 # 8 GHz\n", "freq_max = 12 # 12 GHz\n", "freq_step = 0.1 # 100 MHz steps" ] }, { "cell_type": "markdown", "execution_count": null, "id": "2fc8f9cf", "metadata": { "papermill": { "duration": 0.002579, "end_time": "2026-08-04T16:50:14.798055+00:00", "exception": false, "start_time": "2026-08-04T16:50:14.795476+00:00", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "## Build the box" ] }, { "cell_type": "code", "execution_count": 3, "id": "0f9278fa", "metadata": { "execution": { "iopub.execute_input": "2026-08-04T16:50:14.804262Z", "iopub.status.busy": "2026-08-04T16:50:14.804080Z", "iopub.status.idle": "2026-08-04T16:50:14.809030Z", "shell.execute_reply": "2026-08-04T16:50:14.808433Z" }, "papermill": { "duration": 0.008765, "end_time": "2026-08-04T16:50:14.809538+00:00", "exception": false, "start_time": "2026-08-04T16:50:14.800773+00:00", "status": "completed" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Box volume tag: 1\n" ] } ], "source": [ "gmsh.initialize()\n", "gmsh.option.setNumber(\"General.Terminal\", 1)\n", "gmsh.model.add(\"waveguide_box\")\n", "\n", "# Box from x=0 to x=length, y=0 to y=width, z=0 to z=height\n", "box_dimtag = gmsh.model.occ.addBox(0, 0, 0, length, width, height)\n", "gmsh.model.occ.synchronize()\n", "print(f\"Box volume tag: {box_dimtag}\")" ] }, { "cell_type": "markdown", "execution_count": null, "id": "0a892f96", "metadata": { "papermill": { "duration": 0.002589, "end_time": "2026-08-04T16:50:14.814927+00:00", "exception": false, "start_time": "2026-08-04T16:50:14.812338+00:00", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "## Select the two waveport faces\n", "\n", "Using the `Selector` API bound to the box volume — pick the faces at `x=0` and `x=length`." ] }, { "cell_type": "code", "execution_count": 4, "id": "fa41cbdd", "metadata": { "execution": { "iopub.execute_input": "2026-08-04T16:50:14.821285Z", "iopub.status.busy": "2026-08-04T16:50:14.821104Z", "iopub.status.idle": "2026-08-04T16:50:14.825955Z", "shell.execute_reply": "2026-08-04T16:50:14.825459Z" }, "papermill": { "duration": 0.008991, "end_time": "2026-08-04T16:50:14.826673+00:00", "exception": false, "start_time": "2026-08-04T16:50:14.817682+00:00", "status": "completed" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Port 1 (x=0): dim=2, tag=1\n", "Port 2 (x=length): dim=2, tag=2\n" ] } ], "source": [ "# Bind the selector to the box volume — only its boundary faces are considered.\n", "sel = Selector((3, box_dimtag))\n", "\n", "# cadquery-style: faces at a given coordinate\n", "port1_faces = sel.faces_at_x(0.0)\n", "port2_faces = sel.faces_at_x(length)\n", "\n", "assert len(port1_faces) == 1, f\"Expected 1 face at x=0, got {len(port1_faces)}\"\n", "assert len(port2_faces) == 1, f\"Expected 1 face at x=length, got {len(port2_faces)}\"\n", "\n", "port1 = port1_faces[0]\n", "port2 = port2_faces[0]\n", "\n", "print(f\"Port 1 (x=0): dim={port1.dim}, tag={port1.tag}\")\n", "print(f\"Port 2 (x=length): dim={port2.dim}, tag={port2.tag}\")" ] }, { "cell_type": "markdown", "execution_count": null, "id": "c4e6aa04", "metadata": { "papermill": { "duration": 0.002758, "end_time": "2026-08-04T16:50:14.832245+00:00", "exception": false, "start_time": "2026-08-04T16:50:14.829487+00:00", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "## Define entities\n", "\n", "The box volume is a **dielectric** (vacuum, εᵣ=1). The two end faces are waveports. The exterior walls (`box__None`) will be treated as PEC automatically — any physical group not matching an entity definition and not containing \"substrate\" defaults to absorbing, so we need to explicitly mark the exterior as PEC." ] }, { "cell_type": "code", "execution_count": 5, "id": "5df9a4aa", "metadata": { "execution": { "iopub.execute_input": "2026-08-04T16:50:14.838633Z", "iopub.status.busy": "2026-08-04T16:50:14.838467Z", "iopub.status.idle": "2026-08-04T16:50:14.844781Z", "shell.execute_reply": "2026-08-04T16:50:14.844116Z" }, "papermill": { "duration": 0.010224, "end_time": "2026-08-04T16:50:14.845273+00:00", "exception": false, "start_time": "2026-08-04T16:50:14.835049+00:00", "status": "completed" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Physical group 'box' (dim=3): pg=1, tags=[1]\n", " Physical group 'waveport_1' (dim=2): pg=2, tags=[1]\n", " Physical group 'waveport_2' (dim=2): pg=3, tags=[2]\n", " Physical group 'box__None' (dim=2): pg=4, tags=[3, 4, 5, 6]\n", "Physical group map: {'waveport_1': 2, 'waveport_2': 3, 'box__None': 4, 'box': 1}\n" ] } ], "source": [ "entities = [\n", " Entity(\n", " name=\"box\",\n", " dim=3,\n", " btype=\"dielectric\",\n", " mesh_order=0,\n", " tags=[box_dimtag],\n", " eps_r=1.0,\n", " mu_r=1.0,\n", " loss_tan=0.0,\n", " ),\n", " Entity(\n", " name=\"waveport_1\",\n", " dim=2,\n", " btype=\"waveport\",\n", " mesh_order=1,\n", " tags=[port1.tag],\n", " mode=1,\n", " excitation=True,\n", " ),\n", " Entity(\n", " name=\"waveport_2\",\n", " dim=2,\n", " btype=\"waveport\",\n", " mesh_order=2,\n", " tags=[port2.tag],\n", " mode=1,\n", " excitation=False,\n", " ),\n", " # PEC walls — the exterior surface of the box\n", " Entity(\n", " name=\"box__None\",\n", " dim=2,\n", " btype=\"pec\",\n", " mesh_order=3,\n", " tags=[],\n", " ),\n", "]\n", "\n", "pg_map = run_entity_pipeline(entities)\n", "print(\"Physical group map:\", pg_map)" ] }, { "cell_type": "markdown", "execution_count": null, "id": "04bc34a5", "metadata": { "papermill": { "duration": 0.002814, "end_time": "2026-08-04T16:50:14.850928+00:00", "exception": false, "start_time": "2026-08-04T16:50:14.848114+00:00", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "## Mesh generation" ] }, { "cell_type": "code", "execution_count": 6, "id": "cdc7ab2c", "metadata": { "execution": { "iopub.execute_input": "2026-08-04T16:50:14.857649Z", "iopub.status.busy": "2026-08-04T16:50:14.857473Z", "iopub.status.idle": "2026-08-04T16:50:14.867539Z", "shell.execute_reply": "2026-08-04T16:50:14.866938Z" }, "papermill": { "duration": 0.014147, "end_time": "2026-08-04T16:50:14.868030+00:00", "exception": false, "start_time": "2026-08-04T16:50:14.853883+00:00", "status": "completed" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " ignoring 4 curves from {'box__None'}\n", " global: 8 curves, SizeMin=4166666.6667\n", " ppw_near=6 ppw_far=3\n", " SizeMax=8333333.3333 transition=6250000.0000\n", "Mesh saved to waveguide_box.msh\n", " Nodes: 9\n", " Elements: 44\n", "Mesh written to waveguide_box.msh\n" ] } ], "source": [ "mesh_file = \"waveguide_box.msh\"\n", "\n", "# Operating wavelength at the highest frequency (12 GHz)\n", "c = 3e8\n", "wavelength = c / freq_max\n", "\n", "# Graded mesh: refine near geometric curves, ignore the box exterior\n", "create_graded_mesh(\n", " wavelength=wavelength,\n", " ppw_near=6,\n", " ppw_far=3,\n", " ignore_entities=[\"box\"],\n", ")\n", "\n", "generate_3d_mesh(entities, output_file=mesh_file)\n", "gmsh.finalize()\n", "print(f\"Mesh written to {mesh_file}\")" ] }, { "cell_type": "code", "execution_count": 7, "id": "2816b6c5", "metadata": { "execution": { "iopub.execute_input": "2026-08-04T16:50:14.873957Z", "iopub.status.busy": "2026-08-04T16:50:14.873814Z", "iopub.status.idle": "2026-08-04T16:50:15.400623Z", "shell.execute_reply": "2026-08-04T16:50:15.399846Z" }, "papermill": { "duration": 0.530607, "end_time": "2026-08-04T16:50:15.401242+00:00", "exception": false, "start_time": "2026-08-04T16:50:14.870635+00:00", "status": "completed" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loading mesh file: waveguide_box.msh\n", "Groups to render transparent: air_sphere__None\n", "\n", "Mesh loaded successfully with 2 cell blocks\n", "Found 12 triangles total\n", "Physical group tags in mesh: {2: 'waveport_1', 3: 'waveport_2', 4: 'box__None'}\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "view_mesh(mesh_file, transparent_groups= \"air_sphere__None\")" ] }, { "cell_type": "markdown", "execution_count": null, "id": "0f2368d3", "metadata": { "papermill": { "duration": 0.002708, "end_time": "2026-08-04T16:50:15.407072+00:00", "exception": false, "start_time": "2026-08-04T16:50:15.404364+00:00", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "## Palace configuration & simulation\n", "\n", "Build the Palace JSON config from the entity definitions and run the driven simulation." ] }, { "cell_type": "code", "execution_count": 8, "id": "66e29ac7", "metadata": { "execution": { "iopub.execute_input": "2026-08-04T16:50:15.413641Z", "iopub.status.busy": "2026-08-04T16:50:15.413465Z", "iopub.status.idle": "2026-08-04T16:50:16.213572Z", "shell.execute_reply": "2026-08-04T16:50:16.212903Z" }, "papermill": { "duration": 0.804467, "end_time": "2026-08-04T16:50:16.214372+00:00", "exception": false, "start_time": "2026-08-04T16:50:15.409905+00:00", "status": "completed" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Palace config written to waveguide_box.json\n" ] }, { "data": { "text/html": [ "
Palace simulation output
  Running: /home/runner/.cache/palacetoolkit/runtime/palace-cpu-v0.17.0/bin/palace --serial /home/runner/work/PalaceToolkit/PalaceToolkit/docs/examples/waveguide_box.json\n",
       ">> /home/runner/.cache/palacetoolkit/runtime/palace-cpu-v0.17.0/bin/palace-x86_64.bin /home/runner/work/PalaceToolkit/PalaceToolkit/docs/examples/waveguide_box.json\n",
       "\n",
       "_____________     _______\n",
       "_____   __   \\____ __   /____ ____________\n",
       "____   /_/  /  __ ` /  /  __ ` /  ___/  _ \\\n",
       "___   _____/  /_/  /  /  /_/  /  /__/  ___/\n",
       "  /__/     \\___,__/__/\\___,__/\\_____\\_____/\n",
       "\n",
       "Git changeset ID: v0.17.0-272-gb22f654ab\n",
       "Running with 1 MPI process, 1 OpenMP thread\n",
       "Device configuration: omp,cpu\n",
       "Memory configuration: host-std\n",
       "libCEED backend: /cpu/self/xsmm/blocked\n",
       "\n",
       "\n",
       "Characteristic length and time scales:\n",
       " Lc = 1.500e-04 m, tc = 5.003e-04 ns\n",
       "Finished partitioning mesh into 1 subdomain\n",
       "\n",
       "Mesh curvature order: 1\n",
       "Mesh bounding box:\n",
       " (Xmin, Ymin, Zmin) = (+0.000e+00, +0.000e+00, +0.000e+00) m\n",
       " (Xmax, Ymax, Zmax) = (+1.500e-04, +2.286e-05, +1.016e-05) m\n",
       "\n",
       "Parallel Mesh Stats:\n",
       "\n",
       "                minimum     average     maximum       total\n",
       " vertices             9           9           9           9\n",
       " edges               26          26          26          26\n",
       " faces               30          30          30          30\n",
       " elements            12          12          12          12\n",
       " neighbors            0           0           0\n",
       "\n",
       "            minimum     maximum\n",
       " h          0.19398     0.19398\n",
       " kappa       9.3178     30.1488\n",
       "\n",
       "Estimated current per-rank memory usage is: Min. 44.4M, Max. 44.4M, Avg. 44.4M, Total 44.4M\n",
       "Estimated current per-node memory usage is: Min. 44.4M, Max. 44.4M, Avg. 44.4M, Total 44.4M\n",
       "\n",
       "Configuring Robin impedance BC for wave ports at attributes:\n",
       " 2: Index = 1, mode = 1, d = 0.000e+00 m,  n = (-1.0,+0.0,+0.0)\n",
       " 3: Index = 2, mode = 1, d = 0.000e+00 m,  n = (+1.0,+0.0,+0.0)\n",
       "\n",
       "Configuring wave port excitation source term at attributes:\n",
       " 2: Index = 1\n",
       "\n",
       "Configuring Dirichlet PEC BC at attributes:\n",
       " 4\n",
       "\n",
       "Computing adaptive fast frequency response for:\n",
       "Excitation with index 1 has contributions from:\n",
       " Wave port  1\n",
       "\n",
       "Beginning PROM construction offline phase:\n",
       " 41 points for frequency sweep over [8.000e+00, 1.200e+01] GHz\n",
       "\n",
       "Assembling system matrices, number of global unknowns:\n",
       " H1 (p = 2): 35, ND (p = 2): 112, RT (p = 2): 126\n",
       " Operator assembly level: Partial\n",
       " Mesh geometries:\n",
       "  Tetrahedron: P = 20, Q = 14 (quadrature order = 4)\n",
       "\n",
       "Assembling multigrid hierarchy:\n",
       " Level 0 (p = 1): 26 unknowns\n",
       " Level 1 (p = 2): 112 unknowns\n",
       " Level 0 (auxiliary) (p = 1): 9 unknowns\n",
       " Level 1 (auxiliary) (p = 2): 35 unknowns\n",
       "\n",
       "  Residual norms for GMRES solve\n",
       "  0 (restart 0) KSP residual norm 3.999143e+04\n",
       "  1 (restart 0) KSP residual norm 1.249658e+02\n",
       "  2 (restart 0) KSP residual norm 3.999507e-01\n",
       "  3 (restart 0) KSP residual norm 6.613403e-03\n",
       "  4 (restart 0) KSP residual norm 3.386006e-03\n",
       "  5 (restart 0) KSP residual norm 1.497672e-03\n",
       "  6 (restart 0) KSP residual norm 3.555882e-04\n",
       "GMRES solver converged in 6 iterations (avg. reduction factor: 4.552e-02)\n",
       " Field energy E (1.347e-05 J) + H (9.736e-12 J) = 1.347e-05 J\n",
       "\n",
       "  Residual norms for GMRES solve\n",
       "  0 (restart 0) KSP residual norm 2.177030e+04\n",
       "  1 (restart 0) KSP residual norm 6.802859e+01\n",
       "  2 (restart 0) KSP residual norm 2.177238e-01\n",
       "  3 (restart 0) KSP residual norm 5.660557e-03\n",
       "  4 (restart 0) KSP residual norm 4.061564e-03\n",
       "  5 (restart 0) KSP residual norm 1.834908e-03\n",
       "  6 (restart 0) KSP residual norm 4.331512e-04\n",
       "  7 (restart 0) KSP residual norm 3.793034e-04\n",
       "  8 (restart 0) KSP residual norm 1.445923e-04\n",
       "GMRES solver converged in 8 iterations (avg. reduction factor: 9.501e-02)\n",
       " Field energy E (3.992e-06 J) + H (6.558e-12 J) = 3.992e-06 J\n",
       "\n",
       "  Residual norms for GMRES solve\n",
       "  0 (restart 0) KSP residual norm 2.996128e+04\n",
       "  1 (restart 0) KSP residual norm 9.362363e+01\n",
       "  2 (restart 0) KSP residual norm 2.996324e-01\n",
       "  3 (restart 0) KSP residual norm 5.908429e-03\n",
       "  4 (restart 0) KSP residual norm 3.704208e-03\n",
       "  5 (restart 0) KSP residual norm 1.649504e-03\n",
       "  6 (restart 0) KSP residual norm 3.870514e-04\n",
       "  7 (restart 0) KSP residual norm 3.553825e-04\n",
       "  8 (restart 0) KSP residual norm 1.304682e-04\n",
       "GMRES solver converged in 8 iterations (avg. reduction factor: 9.013e-02)\n",
       "\n",
       "Greedy iteration 1 (n = 2): ω* = 9.698e+00 GHz (3.049e-02), error = 4.513e-08, memory = 1/2\n",
       " Field energy E (7.560e-06 J) + H (8.114e-12 J) = 7.560e-06 J\n",
       "\n",
       "  Residual norms for GMRES solve\n",
       "  0 (restart 0) KSP residual norm 2.487382e+04\n",
       "  1 (restart 0) KSP residual norm 7.772641e+01\n",
       "  2 (restart 0) KSP residual norm 2.487557e-01\n",
       "  3 (restart 0) KSP residual norm 5.706660e-03\n",
       "  4 (restart 0) KSP residual norm 3.913219e-03\n",
       "  5 (restart 0) KSP residual norm 1.755272e-03\n",
       "  6 (restart 0) KSP residual norm 4.128008e-04\n",
       "  7 (restart 0) KSP residual norm 3.716555e-04\n",
       "  8 (restart 0) KSP residual norm 1.384912e-04\n",
       "GMRES solver converged in 8 iterations (avg. reduction factor: 9.294e-02)\n",
       "\n",
       "Greedy iteration 2 (n = 3): ω* = 1.098e+01 GHz (3.452e-02), error = 2.388e-08, memory = 2/2\n",
       " Field energy E (5.211e-06 J) + H (7.167e-12 J) = 5.211e-06 J\n",
       "\n",
       "Adaptive sampling converged with 4 frequency samples:\n",
       " n = 4, error = 2.388e-08, tol = 1.000e-03, memory = 2/2\n",
       " Sampled frequencies (GHz): 8.000e+00, 1.200e+01, 9.698e+00, 1.098e+01\n",
       " Sample errors: inf, inf, 4.513e-08, 2.388e-08\n",
       " Total offline phase elapsed time: 9.15e-02 s\n",
       "\n",
       "Beginning fast frequency sweep online phase\n",
       "\n",
       "It 1/41: ω/2π = 8.000e+00 GHz (total elapsed time = 9.16e-02 s)\n",
       "\n",
       " Sol. ||E|| = 4.009162e+04\n",
       " Field energy E (1.347e-05 J) + H (9.837e-12 J) = 1.347e-05 J\n",
       " S[1][1] = -1.000e+00-6.771e+05i, |S[1][1]| = +1.166e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+7.624e+02i, |S[2][1]| = +5.764e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       " Wrote fields to disk (Paraview) at step 1\n",
       "\n",
       "It 2/41: ω/2π = 8.100e+00 GHz (total elapsed time = 9.96e-02 s)\n",
       "\n",
       " Sol. ||E|| = 3.935286e+04\n",
       " Field energy E (1.298e-05 J) + H (9.716e-12 J) = 1.298e-05 J\n",
       " S[1][1] = -1.000e+00-6.605e+05i, |S[1][1]| = +1.164e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+7.437e+02i, |S[2][1]| = +5.743e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 3/41: ω/2π = 8.200e+00 GHz (total elapsed time = 1.02e-01 s)\n",
       "\n",
       " Sol. ||E|| = 3.863478e+04\n",
       " Field energy E (1.251e-05 J) + H (9.598e-12 J) = 1.251e-05 J\n",
       " S[1][1] = -1.000e+00-6.445e+05i, |S[1][1]| = +1.162e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+7.257e+02i, |S[2][1]| = +5.721e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 4/41: ω/2π = 8.300e+00 GHz (total elapsed time = 1.03e-01 s)\n",
       "\n",
       " Sol. ||E|| = 3.793853e+04\n",
       " Field energy E (1.206e-05 J) + H (9.482e-12 J) = 1.206e-05 J\n",
       " S[1][1] = -1.000e+00-6.290e+05i, |S[1][1]| = +1.160e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+7.083e+02i, |S[2][1]| = +5.700e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 5/41: ω/2π = 8.400e+00 GHz (total elapsed time = 1.05e-01 s)\n",
       "\n",
       " Sol. ||E|| = 3.726260e+04\n",
       " Field energy E (1.164e-05 J) + H (9.369e-12 J) = 1.164e-05 J\n",
       " S[1][1] = -1.000e+00-6.141e+05i, |S[1][1]| = +1.158e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+6.915e+02i, |S[2][1]| = +5.680e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 6/41: ω/2π = 8.500e+00 GHz (total elapsed time = 1.07e-01 s)\n",
       "\n",
       " Sol. ||E|| = 3.660695e+04\n",
       " Field energy E (1.123e-05 J) + H (9.258e-12 J) = 1.123e-05 J\n",
       " S[1][1] = -1.000e+00-5.998e+05i, |S[1][1]| = +1.156e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+6.753e+02i, |S[2][1]| = +5.659e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       " Wrote fields to disk (Paraview) at step 6\n",
       "\n",
       "It 7/41: ω/2π = 8.600e+00 GHz (total elapsed time = 1.15e-01 s)\n",
       "\n",
       " Sol. ||E|| = 3.597074e+04\n",
       " Field energy E (1.084e-05 J) + H (9.151e-12 J) = 1.084e-05 J\n",
       " S[1][1] = -1.000e+00-5.859e+05i, |S[1][1]| = +1.154e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+6.597e+02i, |S[2][1]| = +5.639e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 8/41: ω/2π = 8.700e+00 GHz (total elapsed time = 1.16e-01 s)\n",
       "\n",
       " Sol. ||E|| = 3.536222e+04\n",
       " Field energy E (1.048e-05 J) + H (9.051e-12 J) = 1.048e-05 J\n",
       " S[1][1] = -1.000e+00-5.728e+05i, |S[1][1]| = +1.152e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+6.448e+02i, |S[2][1]| = +5.619e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 9/41: ω/2π = 8.800e+00 GHz (total elapsed time = 1.18e-01 s)\n",
       "\n",
       " Sol. ||E|| = 3.474970e+04\n",
       " Field energy E (1.012e-05 J) + H (8.942e-12 J) = 1.012e-05 J\n",
       " S[1][1] = -1.000e+00-5.595e+05i, |S[1][1]| = +1.150e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+6.300e+02i, |S[2][1]| = +5.599e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 10/41: ω/2π = 8.900e+00 GHz (total elapsed time = 1.20e-01 s)\n",
       "\n",
       " Sol. ||E|| = 3.416767e+04\n",
       " Field energy E (9.783e-06 J) + H (8.843e-12 J) = 9.783e-06 J\n",
       " S[1][1] = -1.000e+00-5.471e+05i, |S[1][1]| = +1.148e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+6.160e+02i, |S[2][1]| = +5.579e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 11/41: ω/2π = 9.000e+00 GHz (total elapsed time = 1.22e-01 s)\n",
       "\n",
       " Sol. ||E|| = 3.359848e+04\n",
       " Field energy E (9.460e-06 J) + H (8.744e-12 J) = 9.460e-06 J\n",
       " S[1][1] = -1.000e+00-5.349e+05i, |S[1][1]| = +1.146e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+6.024e+02i, |S[2][1]| = +5.560e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       " Wrote fields to disk (Paraview) at step 11\n",
       "\n",
       "It 12/41: ω/2π = 9.100e+00 GHz (total elapsed time = 1.29e-01 s)\n",
       "\n",
       " Sol. ||E|| = 3.304731e+04\n",
       " Field energy E (9.152e-06 J) + H (8.648e-12 J) = 9.152e-06 J\n",
       " S[1][1] = -1.000e+00-5.233e+05i, |S[1][1]| = +1.144e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+5.892e+02i, |S[2][1]| = +5.541e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 13/41: ω/2π = 9.200e+00 GHz (total elapsed time = 1.31e-01 s)\n",
       "\n",
       " Sol. ||E|| = 3.251459e+04\n",
       " Field energy E (8.859e-06 J) + H (8.557e-12 J) = 8.859e-06 J\n",
       " S[1][1] = -1.000e+00-5.121e+05i, |S[1][1]| = +1.142e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+5.766e+02i, |S[2][1]| = +5.522e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 14/41: ω/2π = 9.300e+00 GHz (total elapsed time = 1.33e-01 s)\n",
       "\n",
       " Sol. ||E|| = 3.198682e+04\n",
       " Field energy E (8.574e-06 J) + H (8.462e-12 J) = 8.574e-06 J\n",
       " S[1][1] = -1.000e+00-5.010e+05i, |S[1][1]| = +1.140e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+5.642e+02i, |S[2][1]| = +5.503e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 15/41: ω/2π = 9.400e+00 GHz (total elapsed time = 1.35e-01 s)\n",
       "\n",
       " Sol. ||E|| = 3.147823e+04\n",
       " Field energy E (8.304e-06 J) + H (8.372e-12 J) = 8.304e-06 J\n",
       " S[1][1] = -1.000e+00-4.904e+05i, |S[1][1]| = +1.138e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+5.522e+02i, |S[2][1]| = +5.484e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 16/41: ω/2π = 9.500e+00 GHz (total elapsed time = 1.37e-01 s)\n",
       "\n",
       " Sol. ||E|| = 3.098299e+04\n",
       " Field energy E (8.044e-06 J) + H (8.285e-12 J) = 8.044e-06 J\n",
       " S[1][1] = -1.000e+00-4.802e+05i, |S[1][1]| = +1.136e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+5.407e+02i, |S[2][1]| = +5.466e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       " Wrote fields to disk (Paraview) at step 16\n",
       "\n",
       "It 17/41: ω/2π = 9.600e+00 GHz (total elapsed time = 1.44e-01 s)\n",
       "\n",
       " Sol. ||E|| = 3.049963e+04\n",
       " Field energy E (7.795e-06 J) + H (8.198e-12 J) = 7.795e-06 J\n",
       " S[1][1] = -1.000e+00-4.702e+05i, |S[1][1]| = +1.134e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+5.295e+02i, |S[2][1]| = +5.448e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 18/41: ω/2π = 9.700e+00 GHz (total elapsed time = 1.46e-01 s)\n",
       "\n",
       " Sol. ||E|| = 3.002928e+04\n",
       " Field energy E (7.557e-06 J) + H (8.114e-12 J) = 7.557e-06 J\n",
       " S[1][1] = -1.000e+00-4.606e+05i, |S[1][1]| = +1.133e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+5.186e+02i, |S[2][1]| = +5.430e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 19/41: ω/2π = 9.800e+00 GHz (total elapsed time = 1.48e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.957232e+04\n",
       " Field energy E (7.329e-06 J) + H (8.032e-12 J) = 7.329e-06 J\n",
       " S[1][1] = -1.000e+00-4.513e+05i, |S[1][1]| = +1.131e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+5.081e+02i, |S[2][1]| = +5.412e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 20/41: ω/2π = 9.900e+00 GHz (total elapsed time = 1.50e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.912382e+04\n",
       " Field energy E (7.108e-06 J) + H (7.950e-12 J) = 7.108e-06 J\n",
       " S[1][1] = -1.000e+00-4.421e+05i, |S[1][1]| = +1.129e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+4.979e+02i, |S[2][1]| = +5.394e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 21/41: ω/2π = 1.000e+01 GHz (total elapsed time = 1.52e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.868730e+04\n",
       " Field energy E (6.896e-06 J) + H (7.870e-12 J) = 6.896e-06 J\n",
       " S[1][1] = -1.000e+00-4.333e+05i, |S[1][1]| = +1.127e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+4.879e+02i, |S[2][1]| = +5.377e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       " Wrote fields to disk (Paraview) at step 21\n",
       "\n",
       "It 22/41: ω/2π = 1.010e+01 GHz (total elapsed time = 1.60e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.826513e+04\n",
       " Field energy E (6.695e-06 J) + H (7.793e-12 J) = 6.695e-06 J\n",
       " S[1][1] = -1.000e+00-4.249e+05i, |S[1][1]| = +1.126e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+4.784e+02i, |S[2][1]| = +5.360e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 23/41: ω/2π = 1.020e+01 GHz (total elapsed time = 1.62e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.784774e+04\n",
       " Field energy E (6.499e-06 J) + H (7.715e-12 J) = 6.499e-06 J\n",
       " S[1][1] = -1.000e+00-4.165e+05i, |S[1][1]| = +1.124e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+4.690e+02i, |S[2][1]| = +5.342e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 24/41: ω/2π = 1.030e+01 GHz (total elapsed time = 1.64e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.744422e+04\n",
       " Field energy E (6.312e-06 J) + H (7.641e-12 J) = 6.312e-06 J\n",
       " S[1][1] = -1.000e+00-4.085e+05i, |S[1][1]| = +1.122e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+4.599e+02i, |S[2][1]| = +5.325e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 25/41: ω/2π = 1.040e+01 GHz (total elapsed time = 1.65e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.704857e+04\n",
       " Field energy E (6.131e-06 J) + H (7.567e-12 J) = 6.131e-06 J\n",
       " S[1][1] = -1.000e+00-4.006e+05i, |S[1][1]| = +1.121e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+4.511e+02i, |S[2][1]| = +5.309e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 26/41: ω/2π = 1.050e+01 GHz (total elapsed time = 1.67e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.666312e+04\n",
       " Field energy E (5.958e-06 J) + H (7.495e-12 J) = 5.958e-06 J\n",
       " S[1][1] = -1.000e+00-3.930e+05i, |S[1][1]| = +1.119e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+4.426e+02i, |S[2][1]| = +5.292e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       " Wrote fields to disk (Paraview) at step 26\n",
       "\n",
       "It 27/41: ω/2π = 1.060e+01 GHz (total elapsed time = 1.75e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.628667e+04\n",
       " Field energy E (5.791e-06 J) + H (7.424e-12 J) = 5.791e-06 J\n",
       " S[1][1] = -1.000e+00-3.857e+05i, |S[1][1]| = +1.117e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+4.343e+02i, |S[2][1]| = +5.276e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 28/41: ω/2π = 1.070e+01 GHz (total elapsed time = 1.77e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.591890e+04\n",
       " Field energy E (5.630e-06 J) + H (7.355e-12 J) = 5.630e-06 J\n",
       " S[1][1] = -1.000e+00-3.785e+05i, |S[1][1]| = +1.116e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+4.262e+02i, |S[2][1]| = +5.259e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 29/41: ω/2π = 1.080e+01 GHz (total elapsed time = 1.79e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.556005e+04\n",
       " Field energy E (5.475e-06 J) + H (7.287e-12 J) = 5.475e-06 J\n",
       " S[1][1] = -1.000e+00-3.715e+05i, |S[1][1]| = +1.114e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+4.183e+02i, |S[2][1]| = +5.243e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 30/41: ω/2π = 1.090e+01 GHz (total elapsed time = 1.81e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.520882e+04\n",
       " Field energy E (5.325e-06 J) + H (7.220e-12 J) = 5.325e-06 J\n",
       " S[1][1] = -1.000e+00-3.647e+05i, |S[1][1]| = +1.112e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+4.107e+02i, |S[2][1]| = +5.227e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 31/41: ω/2π = 1.100e+01 GHz (total elapsed time = 1.83e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.486551e+04\n",
       " Field energy E (5.181e-06 J) + H (7.154e-12 J) = 5.181e-06 J\n",
       " S[1][1] = -1.000e+00-3.581e+05i, |S[1][1]| = +1.111e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+4.032e+02i, |S[2][1]| = +5.211e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       " Wrote fields to disk (Paraview) at step 31\n",
       "\n",
       "It 32/41: ω/2π = 1.110e+01 GHz (total elapsed time = 1.90e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.453075e+04\n",
       " Field energy E (5.043e-06 J) + H (7.090e-12 J) = 5.043e-06 J\n",
       " S[1][1] = -1.000e+00-3.517e+05i, |S[1][1]| = +1.109e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+3.960e+02i, |S[2][1]| = +5.195e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 33/41: ω/2π = 1.120e+01 GHz (total elapsed time = 1.92e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.420258e+04\n",
       " Field energy E (4.909e-06 J) + H (7.026e-12 J) = 4.909e-06 J\n",
       " S[1][1] = -1.000e+00-3.454e+05i, |S[1][1]| = +1.108e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+3.890e+02i, |S[2][1]| = +5.180e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 34/41: ω/2π = 1.130e+01 GHz (total elapsed time = 1.94e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.388211e+04\n",
       " Field energy E (4.780e-06 J) + H (6.964e-12 J) = 4.780e-06 J\n",
       " S[1][1] = -1.000e+00-3.394e+05i, |S[1][1]| = +1.106e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+3.821e+02i, |S[2][1]| = +5.164e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 35/41: ω/2π = 1.140e+01 GHz (total elapsed time = 1.96e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.356843e+04\n",
       " Field energy E (4.655e-06 J) + H (6.903e-12 J) = 4.655e-06 J\n",
       " S[1][1] = -1.000e+00-3.334e+05i, |S[1][1]| = +1.105e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+3.754e+02i, |S[2][1]| = +5.149e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 36/41: ω/2π = 1.150e+01 GHz (total elapsed time = 1.98e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.326230e+04\n",
       " Field energy E (4.535e-06 J) + H (6.843e-12 J) = 4.535e-06 J\n",
       " S[1][1] = -1.000e+00-3.277e+05i, |S[1][1]| = +1.103e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+3.690e+02i, |S[2][1]| = +5.134e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       " Wrote fields to disk (Paraview) at step 36\n",
       "\n",
       "It 37/41: ω/2π = 1.160e+01 GHz (total elapsed time = 2.06e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.296189e+04\n",
       " Field energy E (4.418e-06 J) + H (6.784e-12 J) = 4.418e-06 J\n",
       " S[1][1] = -1.000e+00-3.220e+05i, |S[1][1]| = +1.102e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+3.626e+02i, |S[2][1]| = +5.119e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 38/41: ω/2π = 1.170e+01 GHz (total elapsed time = 2.08e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.266772e+04\n",
       " Field energy E (4.306e-06 J) + H (6.726e-12 J) = 4.306e-06 J\n",
       " S[1][1] = -1.000e+00-3.165e+05i, |S[1][1]| = +1.100e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+3.564e+02i, |S[2][1]| = +5.104e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 39/41: ω/2π = 1.180e+01 GHz (total elapsed time = 2.10e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.238032e+04\n",
       " Field energy E (4.197e-06 J) + H (6.669e-12 J) = 4.197e-06 J\n",
       " S[1][1] = -1.000e+00-3.112e+05i, |S[1][1]| = +1.099e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+3.504e+02i, |S[2][1]| = +5.089e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 40/41: ω/2π = 1.190e+01 GHz (total elapsed time = 2.12e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.210057e+04\n",
       " Field energy E (4.093e-06 J) + H (6.614e-12 J) = 4.093e-06 J\n",
       " S[1][1] = -1.000e+00-3.060e+05i, |S[1][1]| = +1.097e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+3.446e+02i, |S[2][1]| = +5.075e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       "It 41/41: ω/2π = 1.200e+01 GHz (total elapsed time = 2.13e-01 s)\n",
       "\n",
       " Sol. ||E|| = 2.182483e+04\n",
       " Field energy E (3.992e-06 J) + H (6.559e-12 J) = 3.992e-06 J\n",
       " S[1][1] = -1.000e+00-3.010e+05i, |S[1][1]| = +1.096e+02, arg(S[1][1]) = -9.000e+01\n",
       " S[2][1] = -0.000e+00+3.389e+02i, |S[2][1]| = +5.060e+01, arg(S[2][1]) = +9.000e+01\n",
       "\n",
       " Wrote fields to disk (Paraview) at step 41\n",
       "\n",
       "Completed 0 iterations of adaptive mesh refinement (AMR):\n",
       " Indicator norm = 8.816e-01, global unknowns = 112\n",
       " Max. iterations = 0, tol. = 1.000e-02\n",
       "\n",
       "Estimated peak per-rank memory usage is: Min. 74.1M, Max. 74.1M, Avg. 74.1M, Total 74.1M\n",
       "Estimated peak per-node memory usage is: Min. 74.1M, Max. 74.1M, Avg. 74.1M, Total 74.1M\n",
       "\n",
       "Elapsed Time Report (s)           Min.        Max.        Avg.\n",
       "==============================================================\n",
       "Initialization                   0.001       0.001       0.001\n",
       "  Mesh Preprocessing             0.000       0.000       0.000\n",
       "Operator Construction            0.014       0.014       0.014\n",
       "  Wave Ports                     0.056       0.056       0.056\n",
       "Linear Solve                     0.002       0.002       0.002\n",
       "  Setup                          0.016       0.016       0.016\n",
       "  Preconditioner                 0.036       0.036       0.036\n",
       "  Coarse Solve                   0.001       0.001       0.001\n",
       "PROM Construction                0.012       0.012       0.012\n",
       "PROM Solve                       0.000       0.000       0.000\n",
       "Estimation                       0.000       0.000       0.000\n",
       "  Construction                   0.002       0.002       0.002\n",
       "  Solve                          0.023       0.023       0.023\n",
       "Postprocessing                   0.016       0.016       0.016\n",
       "  Paraview                       0.052       0.052       0.052\n",
       "Disk IO                          0.001       0.001       0.001\n",
       "--------------------------------------------------------------\n",
       "Total                            0.522       0.522       0.522\n",
       "\n",
       "Peak Memory                   Per-Node       Total   Total HWM\n",
       "==============================================================\n",
       "Initialization                    2.7M        2.7M        2.7M\n",
       "  Mesh Preprocessing              1.4M        1.4M        4.1M\n",
       "Operator Construction            16.4M       16.4M       20.6M\n",
       "  Wave Ports                      1.7M        1.7M       22.3M\n",
       "Linear Solve                    128.0K      128.0K       22.4M\n",
       "  Setup                         512.0K      512.0K       22.9M\n",
       "  Preconditioner                  2.5M        2.5M       25.4M\n",
       "  Coarse Solve                  896.0K      896.0K       26.3M\n",
       "PROM Construction               256.0K      256.0K       26.6M\n",
       "PROM Solve                      256.0K      256.0K       26.8M\n",
       "Estimation                        0.0K        0.0K       26.8M\n",
       "  Construction                    6.8M        6.8M       33.6M\n",
       "  Solve                           0.0K        0.0K       33.6M\n",
       "Postprocessing                    0.0K        0.0K       33.6M\n",
       "  Paraview                      384.0K      384.0K       34.0M\n",
       "Disk IO                           2.1M        2.1M       36.1M\n",
       "--------------------------------------------------------------\n",
       "Total                            48.7M       48.7M       48.7M
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "config_path = \"waveguide_box.json\"\n", "\n", "config = generate_palace_config_from_entities(\n", " entity_defs=[e.to_dict() for e in entities],\n", " pg_map=pg_map,\n", " mesh_file=mesh_file,\n", " output_file=config_path,\n", " sim_type=\"driven\",\n", " freq_min=freq_min,\n", " freq_max=freq_max,\n", " freq_step=freq_step,\n", " L0=1e-3,\n", " solver_order=2,\n", ")\n", "\n", "run_palace(config_path)" ] }, { "cell_type": "markdown", "execution_count": null, "id": "f33aab9d", "metadata": { "papermill": { "duration": 0.003058, "end_time": "2026-08-04T16:50:16.220859+00:00", "exception": false, "start_time": "2026-08-04T16:50:16.217801+00:00", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "## S parameters" ] }, { "cell_type": "code", "execution_count": 9, "id": "8ad8d012", "metadata": { "execution": { "iopub.execute_input": "2026-08-04T16:50:16.230396Z", "iopub.status.busy": "2026-08-04T16:50:16.230224Z", "iopub.status.idle": "2026-08-04T16:50:16.245115Z", "shell.execute_reply": "2026-08-04T16:50:16.244558Z" }, "papermill": { "duration": 0.01949, "end_time": "2026-08-04T16:50:16.245879+00:00", "exception": false, "start_time": "2026-08-04T16:50:16.226389+00:00", "status": "completed" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Resonant frequency (min |S11|): 12.000 GHz\n" ] } ], "source": [ "from pathlib import Path\n", "\n", "notebook_dir = Path().resolve()\n", "csv_file = str(notebook_dir / \"postpro\" / \"waveguide_box\" / \"port-S.csv\")\n", "\n", "fig, ax = s_params(csv_file)\n", "f = resonant_frequency(csv_file)\n", "print(f\"Resonant frequency (min |S11|): {f:.3f} GHz\")" ] } ], "metadata": { "kernelspec": { "display_name": ".venv (3.12.3.final.0)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.13" }, "papermill": { "default_parameters": {}, "duration": 3.144613, "end_time": "2026-08-04T16:50:16.664506+00:00", "environment_variables": {}, "exception": null, "input_path": "docs/examples/waveguide_box.ipynb", "output_path": "docs/examples/waveguide_box.ipynb", "parameters": {}, "start_time": "2026-08-04T16:50:13.519893+00:00", "version": "2.7.0" } }, "nbformat": 4, "nbformat_minor": 5 }