2026-04-19 00:22:42 -07:00
<!doctype html>
< html lang = "en" class = "no-js" >
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width,initial-scale=1" >
< meta name = "description" content = "Electromagnetic simulation tools" >
< link rel = "canonical" href = "https://mpxd.net/docs/meanas/api/waveguides/" >
< link rel = "prev" href = "../fdfd/" >
< link rel = "next" href = "../fdtd/" >
< link rel = "icon" href = "../../assets/images/favicon.png" >
< meta name = "generator" content = "mkdocs-1.6.1, mkdocs-material-9.7.6" >
< title > waveguides - meanas< / title >
< link rel = "stylesheet" href = "../../assets/stylesheets/main.484c7ddc.min.css" >
2026-04-20 17:38:01 -07:00
< link rel = "stylesheet" href = "../../assets/stylesheets/palette.ab4e12ef.min.css" >
2026-04-19 00:22:42 -07:00
< link rel = "stylesheet" href = "../../css/print-site.css" >
< link rel = "stylesheet" href = "../../css/print-site-material.css" >
< link rel = "stylesheet" href = "../../assets/_mkdocstrings.css" >
< link rel = "stylesheet" href = "../../stylesheets/extra.css" >
< script > _ _md _scope = new URL ( "../.." , location ) , _ _md _hash = e => [ ... e ] . reduce ( ( ( e , _ ) => ( e << 5 ) - e + _ . charCodeAt ( 0 ) ) , 0 ) , _ _md _get = ( e , _ = localStorage , t = _ _md _scope ) => JSON . parse ( _ . getItem ( t . pathname + "." + e ) ) , _ _md _set = ( e , _ , t = localStorage , a = _ _md _scope ) => { try { t . setItem ( a . pathname + "." + e , JSON . stringify ( _ ) ) } catch ( e ) { } } < / script >
< / head >
2026-04-20 17:38:01 -07:00
< body dir = "ltr" data-md-color-scheme = "slate" data-md-color-primary = "blue-grey" data-md-color-accent = "cyan" >
2026-04-19 00:22:42 -07:00
< input class = "md-toggle" data-md-toggle = "drawer" type = "checkbox" id = "__drawer" autocomplete = "off" >
< input class = "md-toggle" data-md-toggle = "search" type = "checkbox" id = "__search" autocomplete = "off" >
< label class = "md-overlay" for = "__drawer" > < / label >
< div data-md-component = "skip" >
< a href = "#waveguides" class = "md-skip" >
Skip to content
< / a >
< / div >
< div data-md-component = "announce" >
< / div >
< header class = "md-header md-header--shadow" data-md-component = "header" >
< nav class = "md-header__inner md-grid" aria-label = "Header" >
< a href = "../.." title = "meanas" class = "md-header__button md-logo" aria-label = "meanas" data-md-component = "logo" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54" / > < / svg >
< / a >
< label class = "md-header__button md-icon" for = "__drawer" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z" / > < / svg >
< / label >
< div class = "md-header__title" data-md-component = "header-title" >
< div class = "md-header__ellipsis" >
< div class = "md-header__topic" >
< span class = "md-ellipsis" >
meanas
< / span >
< / div >
< div class = "md-header__topic" data-md-component = "header-topic" >
< span class = "md-ellipsis" >
waveguides
< / span >
< / div >
< / div >
< / div >
2026-04-20 17:38:01 -07:00
< form class = "md-header__option" data-md-component = "palette" >
< input class = "md-option" data-md-color-media = "" data-md-color-scheme = "slate" data-md-color-primary = "blue-grey" data-md-color-accent = "cyan" aria-label = "Switch to light mode" type = "radio" name = "__palette" id = "__palette_0" >
< label class = "md-header__button md-icon" title = "Switch to light mode" for = "__palette_1" hidden >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z" / > < / svg >
< / label >
< input class = "md-option" data-md-color-media = "" data-md-color-scheme = "default" data-md-color-primary = "teal" data-md-color-accent = "indigo" aria-label = "Switch to dark mode" type = "radio" name = "__palette" id = "__palette_1" >
< label class = "md-header__button md-icon" title = "Switch to dark mode" for = "__palette_0" hidden >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31" / > < / svg >
< / label >
< / form >
2026-04-19 00:22:42 -07:00
< script > var palette = _ _md _get ( "__palette" ) ; if ( palette && palette . color ) { if ( "(prefers-color-scheme)" === palette . color . media ) { var media = matchMedia ( "(prefers-color-scheme: light)" ) , input = document . querySelector ( media . matches ? "[data-md-color-media='(prefers-color-scheme: light)']" : "[data-md-color-media='(prefers-color-scheme: dark)']" ) ; palette . color . media = input . getAttribute ( "data-md-color-media" ) , palette . color . scheme = input . getAttribute ( "data-md-color-scheme" ) , palette . color . primary = input . getAttribute ( "data-md-color-primary" ) , palette . color . accent = input . getAttribute ( "data-md-color-accent" ) } for ( var [ key , value ] of Object . entries ( palette . color ) ) document . body . setAttribute ( "data-md-color-" + key , value ) } < / script >
< label class = "md-header__button md-icon" for = "__search" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5" / > < / svg >
< / label >
< div class = "md-search" data-md-component = "search" role = "dialog" >
< label class = "md-search__overlay" for = "__search" > < / label >
< div class = "md-search__inner" role = "search" >
< form class = "md-search__form" name = "search" >
< input type = "text" class = "md-search__input" name = "query" aria-label = "Search" placeholder = "Search" autocapitalize = "off" autocorrect = "off" autocomplete = "off" spellcheck = "false" data-md-component = "search-query" required >
< label class = "md-search__icon md-icon" for = "__search" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5" / > < / svg >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z" / > < / svg >
< / label >
< nav class = "md-search__options" aria-label = "Search" >
< button type = "reset" class = "md-search__icon md-icon" title = "Clear" aria-label = "Clear" tabindex = "-1" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" / > < / svg >
< / button >
< / nav >
< / form >
< div class = "md-search__output" >
< div class = "md-search__scrollwrap" tabindex = "0" data-md-scrollfix >
< div class = "md-search-result" data-md-component = "search-result" >
< div class = "md-search-result__meta" >
Initializing search
< / div >
< ol class = "md-search-result__list" role = "presentation" > < / ol >
< / div >
< / div >
< / div >
< / div >
< / div >
< div class = "md-header__source" >
< a href = "https://mpxd.net/code/jan/meanas" title = "Go to repository" class = "md-source" data-md-component = "source" >
< div class = "md-source__icon md-icon" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 448 512" > <!-- ! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --> < path d = "M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4" / > < / svg >
< / div >
< div class = "md-source__repository" >
meanas
< / div >
< / a >
< / div >
< / nav >
< / header >
< div class = "md-container" data-md-component = "container" >
< main class = "md-main" data-md-component = "main" >
< div class = "md-main__inner md-grid" >
< div class = "md-sidebar md-sidebar--primary" data-md-component = "sidebar" data-md-type = "navigation" >
< div class = "md-sidebar__scrollwrap" >
< div class = "md-sidebar__inner" >
< nav class = "md-nav md-nav--primary" aria-label = "Navigation" data-md-level = "0" >
< label class = "md-nav__title" for = "__drawer" >
< a href = "../.." title = "meanas" class = "md-nav__button md-logo" aria-label = "meanas" data-md-component = "logo" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54" / > < / svg >
< / a >
meanas
< / label >
< div class = "md-nav__source" >
< a href = "https://mpxd.net/code/jan/meanas" title = "Go to repository" class = "md-source" data-md-component = "source" >
< div class = "md-source__icon md-icon" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 448 512" > <!-- ! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --> < path d = "M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4" / > < / svg >
< / div >
< div class = "md-source__repository" >
meanas
< / div >
< / a >
< / div >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../.." class = "md-nav__link" >
< span class = "md-ellipsis" >
Home
< / span >
< / a >
< / li >
< li class = "md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle " type = "checkbox" id = "__nav_2" checked >
< div class = "md-nav__link md-nav__container" >
< a href = "../" class = "md-nav__link " >
< span class = "md-ellipsis" >
API
< / span >
< / a >
< label class = "md-nav__link " for = "__nav_2" id = "__nav_2_label" tabindex = "" >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav class = "md-nav" data-md-level = "1" aria-labelledby = "__nav_2_label" aria-expanded = "true" >
< label class = "md-nav__title" for = "__nav_2" >
< span class = "md-nav__icon md-icon" > < / span >
API
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../meanas/" class = "md-nav__link" >
< span class = "md-ellipsis" >
meanas
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../eigensolvers/" class = "md-nav__link" >
< span class = "md-ellipsis" >
eigensolvers
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../fdfd/" class = "md-nav__link" >
< span class = "md-ellipsis" >
fdfd
< / span >
< / a >
< / li >
< li class = "md-nav__item md-nav__item--active" >
< input class = "md-nav__toggle md-toggle" type = "checkbox" id = "__toc" >
< label class = "md-nav__link md-nav__link--active" for = "__toc" >
< span class = "md-ellipsis" >
waveguides
< / span >
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< a href = "./" class = "md-nav__link md-nav__link--active" >
< span class = "md-ellipsis" >
waveguides
< / span >
< / a >
< nav class = "md-nav md-nav--secondary" aria-label = "Table of contents" >
< label class = "md-nav__title" for = "__toc" >
< span class = "md-nav__icon md-icon" > < / span >
Table of contents
< / label >
< ul class = "md-nav__list" data-md-component = "toc" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-module" > < / code > waveguide_2d
< / span >
< / a >
< nav class = "md-nav" aria-label = " waveguide_2d" >
< ul class = "md-nav__list" >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.operator_e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > operator_e
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.operator_h" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > operator_h
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.normalized_fields_e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > normalized_fields_e
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.normalized_fields_h" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > normalized_fields_h
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.exy2h" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > exy2h
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.hxy2e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > hxy2e
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.hxy2h" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > hxy2h
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.exy2e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > exy2e
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.e2h" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > e2h
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.h2e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > h2e
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.curl_e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > curl_e
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.curl_h" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > curl_h
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.h_err" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > h_err
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.e_err" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > e_err
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.sensitivity" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > sensitivity
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.solve_modes" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > solve_modes
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.solve_mode" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > solve_mode
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.inner_product" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > inner_product
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_3d" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-module" > < / code > waveguide_3d
< / span >
< / a >
< nav class = "md-nav" aria-label = " waveguide_3d" >
< ul class = "md-nav__list" >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_3d.solve_mode" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > solve_mode
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_3d.compute_source" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > compute_source
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_3d.compute_overlap_e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > compute_overlap_e
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_3d.expand_e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > expand_e
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-module" > < / code > waveguide_cyl
< / span >
< / a >
< nav class = "md-nav" aria-label = " waveguide_cyl" >
< ul class = "md-nav__list" >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl.cylindrical_operator" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > cylindrical_operator
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl.solve_modes" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > solve_modes
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl.solve_mode" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > solve_mode
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl.linear_wavenumbers" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > linear_wavenumbers
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl.exy2h" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > exy2h
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl.exy2e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > exy2e
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl.e2h" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > e2h
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl.dxes2T" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > dxes2T
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl.normalized_fields_e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > normalized_fields_e
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item" >
< a href = "../fdtd/" class = "md-nav__link" >
< span class = "md-ellipsis" >
fdtd
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../fdmath/" class = "md-nav__link" >
< span class = "md-ellipsis" >
fdmath
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< / ul >
< / nav >
< / div >
< / div >
< / div >
< div class = "md-sidebar md-sidebar--secondary" data-md-component = "sidebar" data-md-type = "toc" >
< div class = "md-sidebar__scrollwrap" >
< div class = "md-sidebar__inner" >
< nav class = "md-nav md-nav--secondary" aria-label = "Table of contents" >
< label class = "md-nav__title" for = "__toc" >
< span class = "md-nav__icon md-icon" > < / span >
Table of contents
< / label >
< ul class = "md-nav__list" data-md-component = "toc" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-module" > < / code > waveguide_2d
< / span >
< / a >
< nav class = "md-nav" aria-label = " waveguide_2d" >
< ul class = "md-nav__list" >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.operator_e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > operator_e
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.operator_h" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > operator_h
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.normalized_fields_e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > normalized_fields_e
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.normalized_fields_h" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > normalized_fields_h
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.exy2h" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > exy2h
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.hxy2e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > hxy2e
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.hxy2h" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > hxy2h
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.exy2e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > exy2e
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.e2h" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > e2h
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.h2e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > h2e
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.curl_e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > curl_e
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.curl_h" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > curl_h
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.h_err" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > h_err
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.e_err" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > e_err
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.sensitivity" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > sensitivity
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.solve_modes" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > solve_modes
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.solve_mode" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > solve_mode
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_2d.inner_product" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > inner_product
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_3d" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-module" > < / code > waveguide_3d
< / span >
< / a >
< nav class = "md-nav" aria-label = " waveguide_3d" >
< ul class = "md-nav__list" >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_3d.solve_mode" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > solve_mode
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_3d.compute_source" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > compute_source
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_3d.compute_overlap_e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > compute_overlap_e
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_3d.expand_e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > expand_e
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-module" > < / code > waveguide_cyl
< / span >
< / a >
< nav class = "md-nav" aria-label = " waveguide_cyl" >
< ul class = "md-nav__list" >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl.cylindrical_operator" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > cylindrical_operator
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl.solve_modes" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > solve_modes
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl.solve_mode" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > solve_mode
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl.linear_wavenumbers" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > linear_wavenumbers
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl.exy2h" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > exy2h
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl.exy2e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > exy2e
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl.e2h" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > e2h
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl.dxes2T" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > dxes2T
< / span >
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#meanas.fdfd.waveguide_cyl.normalized_fields_e" class = "md-nav__link" >
< span class = "md-ellipsis" >
< code class = "doc-symbol doc-symbol-toc doc-symbol-function" > < / code > normalized_fields_e
< / span >
< / a >
< / li >
< / ul >
< / nav >
< / li >
< / ul >
< / nav >
< / div >
< / div >
< / div >
< div class = "md-content" data-md-component = "content" >
< article class = "md-content__inner md-typeset" >
< h1 id = "waveguides" > waveguides< a class = "headerlink" href = "#waveguides" title = "Permanent link" > ¶ < / a > < / h1 >
< div class = "doc doc-object doc-module" >
< h2 id = "meanas.fdfd.waveguide_2d" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-module" > < / code > < span class = "doc doc-object-name doc-module-name" > meanas.fdfd.waveguide_2d< / span >
< a href = "#meanas.fdfd.waveguide_2d" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h2 >
< div class = "doc doc-contents first" >
< p > Operators and helper functions for waveguides with unchanging cross-section.< / p >
< p > The propagation direction is chosen to be along the z axis, and all fields
are given an implicit z-dependence of the form < code > exp(-1 * wavenumber * z)< / code > .< / p >
< p > As the z-dependence is known, all the functions in this file assume a 2D grid
(i.e. < code > dxes = [[[dx_e[0], dx_e[1], ...], [dy_e[0], ...]], [[dx_h[0], ...], [dy_h[0], ...]]]< / code > ).< / p >
< p > ===============< / p >
< p > Consider Maxwell's equations in continuous space, in the frequency domain. Assuming
a structure with some (x, y) cross-section extending uniformly into the z dimension,
with a diagonal < span class = "arithmatex" > \(\epsilon\)< / span > tensor, we have< / p >
< div class = "arithmatex" > \[
\begin{aligned}
2026-04-19 16:40:30 -07:00
\nabla \times \vec{E}(x, y, z) & = -\imath \omega \mu \vec{H} \\
\nabla \times \vec{H}(x, y, z) & = \imath \omega \epsilon \vec{E} \\
\vec{E}(x,y,z) & = (\vec{E}_t(x, y) + E_z(x, y)\vec{z}) e^{-\imath \beta z} \\
\vec{H}(x,y,z) & = (\vec{H}_t(x, y) + H_z(x, y)\vec{z}) e^{-\imath \beta z} \\
2026-04-19 00:22:42 -07:00
\end{aligned}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > Expanding the first two equations into vector components, we get< / p >
< div class = "arithmatex" > \[
\begin{aligned}
2026-04-19 16:40:30 -07:00
-\imath \omega \mu_{xx} H_x & = \partial_y E_z - \partial_z E_y \\
-\imath \omega \mu_{yy} H_y & = \partial_z E_x - \partial_x E_z \\
-\imath \omega \mu_{zz} H_z & = \partial_x E_y - \partial_y E_x \\
\imath \omega \epsilon_{xx} E_x & = \partial_y H_z - \partial_z H_y \\
\imath \omega \epsilon_{yy} E_y & = \partial_z H_x - \partial_x H_z \\
\imath \omega \epsilon_{zz} E_z & = \partial_x H_y - \partial_y H_x \\
2026-04-19 00:22:42 -07:00
\end{aligned}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > Substituting in our expressions for < span class = "arithmatex" > \(\vec{E}\)< / span > , < span class = "arithmatex" > \(\vec{H}\)< / span > and discretizing:< / p >
< div class = "arithmatex" > \[
\begin{aligned}
2026-04-19 16:40:30 -07:00
-\imath \omega \mu_{xx} H_x & = \tilde{\partial}_y E_z + \imath \beta E_y \\
-\imath \omega \mu_{yy} H_y & = -\imath \beta E_x - \tilde{\partial}_x E_z \\
-\imath \omega \mu_{zz} H_z & = \tilde{\partial}_x E_y - \tilde{\partial}_y E_x \\
\imath \omega \epsilon_{xx} E_x & = \hat{\partial}_y H_z + \imath \beta H_y \\
\imath \omega \epsilon_{yy} E_y & = -\imath \beta H_x - \hat{\partial}_x H_z \\
\imath \omega \epsilon_{zz} E_z & = \hat{\partial}_x H_y - \hat{\partial}_y H_x \\
2026-04-19 00:22:42 -07:00
\end{aligned}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > Rewrite the last three equations as< / p >
< div class = "arithmatex" > \[
\begin{aligned}
2026-04-19 16:40:30 -07:00
\imath \beta H_y & = \imath \omega \epsilon_{xx} E_x - \hat{\partial}_y H_z \\
\imath \beta H_x & = -\imath \omega \epsilon_{yy} E_y - \hat{\partial}_x H_z \\
\imath \omega E_z & = \frac{1}{\epsilon_{zz}} \hat{\partial}_x H_y - \frac{1}{\epsilon_{zz}} \hat{\partial}_y H_x \\
2026-04-19 00:22:42 -07:00
\end{aligned}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > Now apply < span class = "arithmatex" > \(\imath \beta \tilde{\partial}_x\)< / span > to the last equation,
then substitute in for < span class = "arithmatex" > \(\imath \beta H_x\)< / span > and < span class = "arithmatex" > \(\imath \beta H_y\)< / span > :< / p >
< div class = "arithmatex" > \[
\begin{aligned}
2026-04-19 16:40:30 -07:00
\imath \beta \tilde{\partial}_x \imath \omega E_z & = \imath \beta \tilde{\partial}_x \frac{1}{\epsilon_{zz}} \hat{\partial}_x H_y
2026-04-19 00:22:42 -07:00
- \imath \beta \tilde{\partial}_x \frac{1}{\epsilon_{zz}} \hat{\partial}_y H_x \\
2026-04-19 16:40:30 -07:00
& = \tilde{\partial}_x \frac{1}{\epsilon_{zz}} \hat{\partial}_x ( \imath \omega \epsilon_{xx} E_x - \hat{\partial}_y H_z)
2026-04-19 00:22:42 -07:00
- \tilde{\partial}_x \frac{1}{\epsilon_{zz}} \hat{\partial}_y (-\imath \omega \epsilon_{yy} E_y - \hat{\partial}_x H_z) \\
2026-04-19 16:40:30 -07:00
& = \tilde{\partial}_x \frac{1}{\epsilon_{zz}} \hat{\partial}_x ( \imath \omega \epsilon_{xx} E_x)
2026-04-19 00:22:42 -07:00
- \tilde{\partial}_x \frac{1}{\epsilon_{zz}} \hat{\partial}_y (-\imath \omega \epsilon_{yy} E_y) \\
2026-04-19 16:40:30 -07:00
\imath \beta \tilde{\partial}_x E_z & = \tilde{\partial}_x \frac{1}{\epsilon_{zz}} \hat{\partial}_x (\epsilon_{xx} E_x)
2026-04-19 00:22:42 -07:00
+ \tilde{\partial}_x \frac{1}{\epsilon_{zz}} \hat{\partial}_y (\epsilon_{yy} E_y) \\
\end{aligned}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > With a similar approach (but using < span class = "arithmatex" > \(\imath \beta \tilde{\partial}_y\)< / span > instead), we can get< / p >
< div class = "arithmatex" > \[
\begin{aligned}
2026-04-19 16:40:30 -07:00
\imath \beta \tilde{\partial}_y E_z & = \tilde{\partial}_y \frac{1}{\epsilon_{zz}} \hat{\partial}_x (\epsilon_{xx} E_x)
2026-04-19 00:22:42 -07:00
+ \tilde{\partial}_y \frac{1}{\epsilon_{zz}} \hat{\partial}_y (\epsilon_{yy} E_y) \\
\end{aligned}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > We can combine this equation for < span class = "arithmatex" > \(\imath \beta \tilde{\partial}_y E_z\)< / span > with
the unused < span class = "arithmatex" > \(\imath \omega \mu_{xx} H_x\)< / span > and < span class = "arithmatex" > \(\imath \omega \mu_{yy} H_y\)< / span > equations to get< / p >
< div class = "arithmatex" > \[
\begin{aligned}
2026-04-19 16:40:30 -07:00
-\imath \omega \mu_{xx} \imath \beta H_x & = -\beta^2 E_y + \imath \beta \tilde{\partial}_y E_z \\
-\imath \omega \mu_{xx} \imath \beta H_x & = -\beta^2 E_y + \tilde{\partial}_y (
2026-04-19 00:22:42 -07:00
\frac{1}{\epsilon_{zz}} \hat{\partial}_x (\epsilon_{xx} E_x)
+ \frac{1}{\epsilon_{zz}} \hat{\partial}_y (\epsilon_{yy} E_y)
)\\
\end{aligned}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > and< / p >
< div class = "arithmatex" > \[
\begin{aligned}
2026-04-19 16:40:30 -07:00
-\imath \omega \mu_{yy} \imath \beta H_y & = \beta^2 E_x - \imath \beta \tilde{\partial}_x E_z \\
-\imath \omega \mu_{yy} \imath \beta H_y & = \beta^2 E_x - \tilde{\partial}_x (
2026-04-19 00:22:42 -07:00
\frac{1}{\epsilon_{zz}} \hat{\partial}_x (\epsilon_{xx} E_x)
+ \frac{1}{\epsilon_{zz}} \hat{\partial}_y (\epsilon_{yy} E_y)
)\\
\end{aligned}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > However, based on our rewritten equation for < span class = "arithmatex" > \(\imath \beta H_x\)< / span > and the so-far unused
equation for < span class = "arithmatex" > \(\imath \omega \mu_{zz} H_z\)< / span > we can also write< / p >
< div class = "arithmatex" > \[
\begin{aligned}
2026-04-19 16:40:30 -07:00
-\imath \omega \mu_{xx} (\imath \beta H_x) & = -\imath \omega \mu_{xx} (-\imath \omega \epsilon_{yy} E_y - \hat{\partial}_x H_z) \\
& = -\omega^2 \mu_{xx} \epsilon_{yy} E_y + \imath \omega \mu_{xx} \hat{\partial}_x (
2026-04-19 00:22:42 -07:00
\frac{1}{-\imath \omega \mu_{zz}} (\tilde{\partial}_x E_y - \tilde{\partial}_y E_x)) \\
2026-04-19 16:40:30 -07:00
& = -\omega^2 \mu_{xx} \epsilon_{yy} E_y
2026-04-19 00:22:42 -07:00
-\mu_{xx} \hat{\partial}_x \frac{1}{\mu_{zz}} (\tilde{\partial}_x E_y - \tilde{\partial}_y E_x) \\
\end{aligned}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > and, similarly,< / p >
< div class = "arithmatex" > \[
\begin{aligned}
2026-04-19 16:40:30 -07:00
-\imath \omega \mu_{yy} (\imath \beta H_y) & = \omega^2 \mu_{yy} \epsilon_{xx} E_x
2026-04-19 00:22:42 -07:00
+\mu_{yy} \hat{\partial}_y \frac{1}{\mu_{zz}} (\tilde{\partial}_x E_y - \tilde{\partial}_y E_x) \\
\end{aligned}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > By combining both pairs of expressions, we get< / p >
< div class = "arithmatex" > \[
\begin{aligned}
\beta^2 E_x - \tilde{\partial}_x (
\frac{1}{\epsilon_{zz}} \hat{\partial}_x (\epsilon_{xx} E_x)
+ \frac{1}{\epsilon_{zz}} \hat{\partial}_y (\epsilon_{yy} E_y)
2026-04-19 16:40:30 -07:00
) & = \omega^2 \mu_{yy} \epsilon_{xx} E_x
2026-04-19 00:22:42 -07:00
+\mu_{yy} \hat{\partial}_y \frac{1}{\mu_{zz}} (\tilde{\partial}_x E_y - \tilde{\partial}_y E_x) \\
-\beta^2 E_y + \tilde{\partial}_y (
\frac{1}{\epsilon_{zz}} \hat{\partial}_x (\epsilon_{xx} E_x)
+ \frac{1}{\epsilon_{zz}} \hat{\partial}_y (\epsilon_{yy} E_y)
2026-04-19 16:40:30 -07:00
) & = -\omega^2 \mu_{xx} \epsilon_{yy} E_y
2026-04-19 00:22:42 -07:00
-\mu_{xx} \hat{\partial}_x \frac{1}{\mu_{zz}} (\tilde{\partial}_x E_y - \tilde{\partial}_y E_x) \\
\end{aligned}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > Using these, we can construct the eigenvalue problem< / p >
< div class = "arithmatex" > \[
\beta^2 \begin{bmatrix} E_x \\
E_y \end{bmatrix} =
2026-04-19 16:40:30 -07:00
(\omega^2 \begin{bmatrix} \mu_{yy} \epsilon_{xx} & 0 \\
0 & \mu_{xx} \epsilon_{yy} \end{bmatrix} +
2026-04-19 00:22:42 -07:00
\begin{bmatrix} -\mu_{yy} \hat{\partial}_y \\
\mu_{xx} \hat{\partial}_x \end{bmatrix} \mu_{zz}^{-1}
2026-04-19 16:40:30 -07:00
\begin{bmatrix} -\tilde{\partial}_y & \tilde{\partial}_x \end{bmatrix} +
2026-04-19 00:22:42 -07:00
\begin{bmatrix} \tilde{\partial}_x \\
\tilde{\partial}_y \end{bmatrix} \epsilon_{zz}^{-1}
2026-04-19 16:40:30 -07:00
\begin{bmatrix} \hat{\partial}_x \epsilon_{xx} & \hat{\partial}_y \epsilon_{yy} \end{bmatrix})
2026-04-19 00:22:42 -07:00
\begin{bmatrix} E_x \\
E_y \end{bmatrix}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > In the literature, < span class = "arithmatex" > \(\beta\)< / span > is usually used to denote the lossless/real part of the propagation constant,
but in < code > meanas< / code > it is allowed to be complex.< / p >
< p > An equivalent eigenvalue problem can be formed using the < span class = "arithmatex" > \(H_x\)< / span > and < span class = "arithmatex" > \(H_y\)< / span > fields, if those are more convenient.< / p >
< p > Note that < span class = "arithmatex" > \(E_z\)< / span > was never discretized, so < span class = "arithmatex" > \(\beta\)< / span > will need adjustment to account for numerical dispersion
if the result is introduced into a space with a discretized z-axis.< / p >
< div class = "doc doc-children" >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_2d.operator_e" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > operator_e< / span >
< a href = "#meanas.fdfd.waveguide_2d.operator_e" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > operator_e< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > mu< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > sparse< / span > < span class = "o" > .< / span > < span class = "n" > sparray< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Waveguide operator of the form< / p >
< div class = "highlight" > < pre > < span > < / span > < code > omega**2 * mu * epsilon +
mu * [[-Dy], [Dx]] / mu * [-Dy, Dx] +
[[Dx], [Dy]] / epsilon * [Dx, Dy] * epsilon
< / code > < / pre > < / div >
< p > for use with a field vector of the form < code > cat([E_x, E_y])< / code > .< / p >
< p > More precisely, the operator is< / p >
< div class = "arithmatex" > \[
2026-04-19 16:40:30 -07:00
\omega^2 \begin{bmatrix} \mu_{yy} \epsilon_{xx} & 0 \\
0 & \mu_{xx} \epsilon_{yy} \end{bmatrix} +
2026-04-19 00:22:42 -07:00
\begin{bmatrix} -\mu_{yy} \hat{\partial}_y \\
\mu_{xx} \hat{\partial}_x \end{bmatrix} \mu_{zz}^{-1}
2026-04-19 16:40:30 -07:00
\begin{bmatrix} -\tilde{\partial}_y & \tilde{\partial}_x \end{bmatrix} +
2026-04-19 00:22:42 -07:00
\begin{bmatrix} \tilde{\partial}_x \\
\tilde{\partial}_y \end{bmatrix} \epsilon_{zz}^{-1}
2026-04-19 16:40:30 -07:00
\begin{bmatrix} \hat{\partial}_x \epsilon_{xx} & \hat{\partial}_y \epsilon_{yy} \end{bmatrix}
2026-04-19 00:22:42 -07:00
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > < span class = "arithmatex" > \(\tilde{\partial}_x\)< / span > and < span class = "arithmatex" > \(\hat{\partial}_x\)< / span > are the forward and backward derivatives along x,
and each < span class = "arithmatex" > \(\epsilon_{xx}\)< / span > , < span class = "arithmatex" > \(\mu_{yy}\)< / span > , etc. is a diagonal matrix containing the vectorized material
property distribution.< / p >
< p > This operator can be used to form an eigenvalue problem of the form
< code > operator_e(...) @ [E_x, E_y] = wavenumber**2 * [E_x, E_y]< / code > < / p >
< p > which can then be solved for the eigenmodes of the system (an < code > exp(-i * wavenumber * z)< / code >
z-dependence is assumed for the fields).< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > The angular frequency of the system.< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized dielectric constant grid< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > mu< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > | None< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized magnetic permeability grid (default 1 everywhere)< / p >
< / div >
< / td >
< td >
< code > None< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "scipy.sparse.sparray" > sparray< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Sparse matrix representation of the operator.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_2d.operator_h" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > operator_h< / span >
< a href = "#meanas.fdfd.waveguide_2d.operator_h" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > operator_h< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > mu< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > sparse< / span > < span class = "o" > .< / span > < span class = "n" > sparray< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Waveguide operator of the form< / p >
< div class = "highlight" > < pre > < span > < / span > < code > omega**2 * epsilon * mu +
epsilon * [[-Dy], [Dx]] / epsilon * [-Dy, Dx] +
[[Dx], [Dy]] / mu * [Dx, Dy] * mu
< / code > < / pre > < / div >
< p > for use with a field vector of the form < code > cat([H_x, H_y])< / code > .< / p >
< p > More precisely, the operator is< / p >
< div class = "arithmatex" > \[
2026-04-19 16:40:30 -07:00
\omega^2 \begin{bmatrix} \epsilon_{yy} \mu_{xx} & 0 \\
0 & \epsilon_{xx} \mu_{yy} \end{bmatrix} +
2026-04-19 00:22:42 -07:00
\begin{bmatrix} -\epsilon_{yy} \tilde{\partial}_y \\
\epsilon_{xx} \tilde{\partial}_x \end{bmatrix} \epsilon_{zz}^{-1}
2026-04-19 16:40:30 -07:00
\begin{bmatrix} -\hat{\partial}_y & \hat{\partial}_x \end{bmatrix} +
2026-04-19 00:22:42 -07:00
\begin{bmatrix} \hat{\partial}_x \\
\hat{\partial}_y \end{bmatrix} \mu_{zz}^{-1}
2026-04-19 16:40:30 -07:00
\begin{bmatrix} \tilde{\partial}_x \mu_{xx} & \tilde{\partial}_y \mu_{yy} \end{bmatrix}
2026-04-19 00:22:42 -07:00
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > < span class = "arithmatex" > \(\tilde{\partial}_x\)< / span > and < span class = "arithmatex" > \(\hat{\partial}_x\)< / span > are the forward and backward derivatives along x,
and each < span class = "arithmatex" > \(\epsilon_{xx}\)< / span > , < span class = "arithmatex" > \(\mu_{yy}\)< / span > , etc. is a diagonal matrix containing the vectorized material
property distribution.< / p >
< p > This operator can be used to form an eigenvalue problem of the form
< code > operator_h(...) @ [H_x, H_y] = wavenumber**2 * [H_x, H_y]< / code > < / p >
< p > which can then be solved for the eigenmodes of the system (an < code > exp(-i * wavenumber * z)< / code >
z-dependence is assumed for the fields).< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > The angular frequency of the system.< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized dielectric constant grid< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > mu< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > | None< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized magnetic permeability grid (default 1 everywhere)< / p >
< / div >
< / td >
< td >
< code > None< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "scipy.sparse.sparray" > sparray< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Sparse matrix representation of the operator.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_2d.normalized_fields_e" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > normalized_fields_e< / span >
< a href = "#meanas.fdfd.waveguide_2d.normalized_fields_e" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > normalized_fields_e< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > e_xy< / span > < span class = "p" > :< / span > < span class = "n" > vcfdfield2< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "n" > mu< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-8" name = "__codelineno-0-8" href = "#__codelineno-0-8" > < / a > < span class = "n" > prop_phase< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span > < span class = "o" > =< / span > < span class = "mi" > 0< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-9" name = "__codelineno-0-9" href = "#__codelineno-0-9" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span > < span class = "n" > vcfdslice_t< / span > < span class = "p" > ,< / span > < span class = "n" > vcfdslice_t< / span > < span class = "p" > ]< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Given a vector < code > e_xy< / code > containing the vectorized E_x and E_y fields,
returns normalized, vectorized E and H fields for the system.< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > e_xy< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vcfdfield2 (meanas.fdmath.vcfdfield2)" href = "../fdmath/#meanas.fdmath.types.vcfdfield2" > vcfdfield2< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vector containing E_x and E_y fields< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber assuming fields have z-dependence of < code > exp(-i * wavenumber * z)< / code > .
It should satisfy < code > operator_e() @ e_xy == wavenumber**2 * e_xy< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > The angular frequency of the system< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized dielectric constant grid< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > mu< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > | None< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized magnetic permeability grid (default 1 everywhere)< / p >
< / div >
< / td >
< td >
< code > None< / code >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > prop_phase< / code >
< / td >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Phase shift < code > (dz * corrected_wavenumber)< / code > over 1 cell in propagation direction.
Default 0 (continuous propagation direction, i.e. dz-> 0).< / p >
< / div >
< / td >
< td >
< code > 0< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "meanas.fdmath.vcfdslice_t" > vcfdslice_t< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > < code > (e, h)< / code > , where each field is vectorized, normalized,< / p >
< / div >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > < span title = "meanas.fdmath.vcfdslice_t" > vcfdslice_t< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > and contains all three vector components.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< details class = "notes" open >
< summary > Notes< / summary >
< p > < code > e_xy< / code > is only the transverse electric eigenvector. This helper first
reconstructs the full three-component < code > E< / code > and < code > H< / code > fields with < code > exy2e(...)< / code >
and < code > exy2h(...)< / code > , then normalizes them to unit forward power using
< code > _normalized_fields(...)< / code > .< / p >
< p > The normalization target is< / p >
< div class = "arithmatex" > \[
\Re\left[\mathrm{inner\_product}(e, h, \mathrm{conj\_h}=True)\right] = 1,
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > so the returned fields represent a unit-power forward mode under the
discrete Yee-grid Poynting inner product.< / p >
< / details >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_2d.normalized_fields_h" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > normalized_fields_h< / span >
< a href = "#meanas.fdfd.waveguide_2d.normalized_fields_h" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > normalized_fields_h< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > h_xy< / span > < span class = "p" > :< / span > < span class = "n" > vcfdfield2< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "n" > mu< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-8" name = "__codelineno-0-8" href = "#__codelineno-0-8" > < / a > < span class = "n" > prop_phase< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span > < span class = "o" > =< / span > < span class = "mi" > 0< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-9" name = "__codelineno-0-9" href = "#__codelineno-0-9" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span > < span class = "n" > vcfdslice_t< / span > < span class = "p" > ,< / span > < span class = "n" > vcfdslice_t< / span > < span class = "p" > ]< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Given a vector < code > h_xy< / code > containing the vectorized H_x and H_y fields,
returns normalized, vectorized E and H fields for the system.< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > h_xy< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vcfdfield2 (meanas.fdmath.vcfdfield2)" href = "../fdmath/#meanas.fdmath.types.vcfdfield2" > vcfdfield2< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vector containing H_x and H_y fields< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber assuming fields have z-dependence of < code > exp(-i * wavenumber * z)< / code > .
It should satisfy < code > operator_h() @ h_xy == wavenumber**2 * h_xy< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > The angular frequency of the system< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized dielectric constant grid< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > mu< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > | None< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized magnetic permeability grid (default 1 everywhere)< / p >
< / div >
< / td >
< td >
< code > None< / code >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > prop_phase< / code >
< / td >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Phase shift < code > (dz * corrected_wavenumber)< / code > over 1 cell in propagation direction.
Default 0 (continuous propagation direction, i.e. dz-> 0).< / p >
< / div >
< / td >
< td >
< code > 0< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "meanas.fdmath.vcfdslice_t" > vcfdslice_t< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > < code > (e, h)< / code > , where each field is vectorized, normalized,< / p >
< / div >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > < span title = "meanas.fdmath.vcfdslice_t" > vcfdslice_t< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > and contains all three vector components.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< details class = "notes" open >
< summary > Notes< / summary >
< p > This is the < code > H_x/H_y< / code > analogue of < code > normalized_fields_e(...)< / code > . The final
normalized mode should describe the same physical solution, but because
the overall complex phase and sign are chosen heuristically,
< code > normalized_fields_e(...)< / code > and < code > normalized_fields_h(...)< / code > need not return
identical representatives for nearly symmetric modes.< / p >
< / details >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_2d.exy2h" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > exy2h< / span >
< a href = "#meanas.fdfd.waveguide_2d.exy2h" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > exy2h< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > mu< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > sparse< / span > < span class = "o" > .< / span > < span class = "n" > sparray< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Operator which transforms the vector < code > e_xy< / code > containing the vectorized E_x and E_y fields,
into a vectorized H containing all three H components< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber assuming fields have z-dependence of < code > exp(-i * wavenumber * z)< / code > .
It should satisfy < code > operator_e() @ e_xy == wavenumber**2 * e_xy< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > The angular frequency of the system< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized dielectric constant grid< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > mu< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > | None< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized magnetic permeability grid (default 1 everywhere)< / p >
< / div >
< / td >
< td >
< code > None< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "scipy.sparse.sparray" > sparray< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Sparse matrix representing the operator.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_2d.hxy2e" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > hxy2e< / span >
< a href = "#meanas.fdfd.waveguide_2d.hxy2e" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > hxy2e< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > mu< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > sparse< / span > < span class = "o" > .< / span > < span class = "n" > sparray< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Operator which transforms the vector < code > h_xy< / code > containing the vectorized H_x and H_y fields,
into a vectorized E containing all three E components< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber assuming fields have z-dependence of < code > exp(-i * wavenumber * z)< / code > .
It should satisfy < code > operator_h() @ h_xy == wavenumber**2 * h_xy< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > The angular frequency of the system< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized dielectric constant grid< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > mu< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > | None< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized magnetic permeability grid (default 1 everywhere)< / p >
< / div >
< / td >
< td >
< code > None< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "scipy.sparse.sparray" > sparray< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Sparse matrix representing the operator.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_2d.hxy2h" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > hxy2h< / span >
< a href = "#meanas.fdfd.waveguide_2d.hxy2h" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > hxy2h< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > mu< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > sparse< / span > < span class = "o" > .< / span > < span class = "n" > sparray< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Operator which transforms the vector < code > h_xy< / code > containing the vectorized H_x and H_y fields,
into a vectorized H containing all three H components< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber assuming fields have z-dependence of < code > exp(-i * wavenumber * z)< / code > .
It should satisfy < code > operator_h() @ h_xy == wavenumber**2 * h_xy< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > mu< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > | None< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized magnetic permeability grid (default 1 everywhere)< / p >
< / div >
< / td >
< td >
< code > None< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "scipy.sparse.sparray" > sparray< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Sparse matrix representing the operator.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_2d.exy2e" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > exy2e< / span >
< a href = "#meanas.fdfd.waveguide_2d.exy2e" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > exy2e< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > sparse< / span > < span class = "o" > .< / span > < span class = "n" > sparray< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Operator which transforms the vector < code > e_xy< / code > containing the vectorized E_x and E_y fields,
into a vectorized E containing all three E components< / p >
< p > From the operator derivation (see module docs), we have< / p >
< div class = "arithmatex" > \[
\imath \omega \epsilon_{zz} E_z = \hat{\partial}_x H_y - \hat{\partial}_y H_x \\
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > as well as the intermediate equations< / p >
< div class = "arithmatex" > \[
\begin{aligned}
2026-04-19 16:40:30 -07:00
\imath \beta H_y & = \imath \omega \epsilon_{xx} E_x - \hat{\partial}_y H_z \\
\imath \beta H_x & = -\imath \omega \epsilon_{yy} E_y - \hat{\partial}_x H_z \\
2026-04-19 00:22:42 -07:00
\end{aligned}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > Combining these, we get< / p >
< div class = "arithmatex" > \[
\begin{aligned}
2026-04-19 16:40:30 -07:00
E_z & = \frac{1}{- \omega \beta \epsilon_{zz}} ((
2026-04-19 00:22:42 -07:00
\hat{\partial}_y \hat{\partial}_x H_z
-\hat{\partial}_x \hat{\partial}_y H_z)
+ \imath \omega (\hat{\partial}_x \epsilon_{xx} E_x + \hat{\partial}_y \epsilon{yy} E_y))
2026-04-19 16:40:30 -07:00
& = \frac{1}{\imath \beta \epsilon_{zz}} (\hat{\partial}_x \epsilon_{xx} E_x + \hat{\partial}_y \epsilon{yy} E_y)
2026-04-19 00:22:42 -07:00
\end{aligned}
\]< / div >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber assuming fields have z-dependence of < code > exp(-i * wavenumber * z)< / code >
It should satisfy < code > operator_e() @ e_xy == wavenumber**2 * e_xy< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized dielectric constant grid< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "scipy.sparse.sparray" > sparray< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Sparse matrix representing the operator.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_2d.e2h" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > e2h< / span >
< a href = "#meanas.fdfd.waveguide_2d.e2h" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > e2h< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > mu< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > sparse< / span > < span class = "o" > .< / span > < span class = "n" > sparray< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Returns an operator which, when applied to a vectorized E eigenfield, produces
the vectorized H eigenfield slice.< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber assuming fields have z-dependence of < code > exp(-i * wavenumber * z)< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > The angular frequency of the system< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > mu< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > | None< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized magnetic permeability grid (default 1 everywhere)< / p >
< / div >
< / td >
< td >
< code > None< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "scipy.sparse.sparray" > sparray< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Sparse matrix representation of the operator.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_2d.h2e" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > h2e< / span >
< a href = "#meanas.fdfd.waveguide_2d.h2e" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > h2e< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > sparse< / span > < span class = "o" > .< / span > < span class = "n" > sparray< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Returns an operator which, when applied to a vectorized H eigenfield, produces
the vectorized E eigenfield slice.< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber assuming fields have z-dependence of < code > exp(-i * wavenumber * z)< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > The angular frequency of the system< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized dielectric constant grid< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "scipy.sparse.sparray" > sparray< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Sparse matrix representation of the operator.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_2d.curl_e" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > curl_e< / span >
< a href = "#meanas.fdfd.waveguide_2d.curl_e" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > curl_e< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > sparse< / span > < span class = "o" > .< / span > < span class = "n" > sparray< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Discretized curl operator for use with the waveguide E field slice.< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber assuming fields have z-dependence of < code > exp(-i * wavenumber * z)< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "scipy.sparse.sparray" > sparray< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Sparse matrix representation of the operator.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_2d.curl_h" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > curl_h< / span >
< a href = "#meanas.fdfd.waveguide_2d.curl_h" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > curl_h< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > sparse< / span > < span class = "o" > .< / span > < span class = "n" > sparray< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Discretized curl operator for use with the waveguide H field slice.< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber assuming fields have z-dependence of < code > exp(-i * wavenumber * z)< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "scipy.sparse.sparray" > sparray< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Sparse matrix representation of the operator.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_2d.h_err" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > h_err< / span >
< a href = "#meanas.fdfd.waveguide_2d.h_err" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > h_err< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > h< / span > < span class = "p" > :< / span > < span class = "n" > vcfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "n" > mu< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-8" name = "__codelineno-0-8" href = "#__codelineno-0-8" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > float< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Calculates the relative error in the H field< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > h< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vcfdslice (meanas.fdmath.vcfdslice)" href = "../fdmath/#meanas.fdmath.types.vcfdslice" > vcfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized H field< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber assuming fields have z-dependence of < code > exp(-i * wavenumber * z)< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > The angular frequency of the system< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized dielectric constant grid< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > mu< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > | None< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized magnetic permeability grid (default 1 everywhere)< / p >
< / div >
< / td >
< td >
< code > None< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Relative error < code > norm(A_h @ h) / norm(h)< / code > .< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_2d.e_err" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > e_err< / span >
< a href = "#meanas.fdfd.waveguide_2d.e_err" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > e_err< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > e< / span > < span class = "p" > :< / span > < span class = "n" > vcfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "n" > mu< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-8" name = "__codelineno-0-8" href = "#__codelineno-0-8" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > float< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Calculates the relative error in the E field< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > e< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vcfdslice (meanas.fdmath.vcfdslice)" href = "../fdmath/#meanas.fdmath.types.vcfdslice" > vcfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized E field< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber assuming fields have z-dependence of < code > exp(-i * wavenumber * z)< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > The angular frequency of the system< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized dielectric constant grid< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > mu< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > | None< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized magnetic permeability grid (default 1 everywhere)< / p >
< / div >
< / td >
< td >
< code > None< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Relative error < code > norm(A_e @ e) / norm(e)< / code > .< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_2d.sensitivity" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > sensitivity< / span >
< a href = "#meanas.fdfd.waveguide_2d.sensitivity" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > sensitivity< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > e_norm< / span > < span class = "p" > :< / span > < span class = "n" > vcfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > h_norm< / span > < span class = "p" > :< / span > < span class = "n" > vcfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-8" name = "__codelineno-0-8" href = "#__codelineno-0-8" > < / a > < span class = "n" > mu< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-9" name = "__codelineno-0-9" href = "#__codelineno-0-9" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > vcfdslice_t< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Given a waveguide structure (< code > dxes< / code > , < code > epsilon< / code > , < code > mu< / code > ) and mode fields
(< code > e_norm< / code > , < code > h_norm< / code > , < code > wavenumber< / code > , < code > omega< / code > ), calculates the sensitivity of the wavenumber
< span class = "arithmatex" > \(\beta\)< / span > to changes in the dielectric structure < span class = "arithmatex" > \(\epsilon\)< / span > .< / p >
< p > The output is a vector of the same size as < code > vec(epsilon)< / code > , with each element specifying the
sensitivity of < code > wavenumber< / code > to changes in the corresponding element in < code > vec(epsilon)< / code > , i.e.< / p >
2026-04-19 16:40:30 -07:00
< div class = "arithmatex" > \[ sens_{i} = \frac{\partial\beta}{\partial\epsilon_i} \]< / div >
2026-04-19 00:22:42 -07:00
< p > An adjoint approach is used to calculate the sensitivity; the derivation is provided here:< / p >
< p > Starting with the eigenvalue equation< / p >
2026-04-19 16:40:30 -07:00
< div class = "arithmatex" > \[ \beta^2 E_{xy} = A_E E_{xy} \]< / div >
2026-04-19 00:22:42 -07:00
< p > where < span class = "arithmatex" > \(A_E\)< / span > is the waveguide operator from < code > operator_e()< / code > , and < span class = "arithmatex" > \(E_{xy} = \begin{bmatrix} E_x \\
E_y \end{bmatrix}\)< / span > ,
we can differentiate with respect to one of the < span class = "arithmatex" > \(\epsilon\)< / span > elements (i.e. at one Yee grid point), < span class = "arithmatex" > \(\epsilon_i\)< / span > :< / p >
< div class = "arithmatex" > \[
(2 \beta) \partial_{\epsilon_i}(\beta) E_{xy} + \beta^2 \partial_{\epsilon_i} E_{xy}
= \partial_{\epsilon_i}(A_E) E_{xy} + A_E \partial_{\epsilon_i} E_{xy}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > We then multiply by < span class = "arithmatex" > \(H_{yx}^\star = \begin{bmatrix}H_y^\star \\ -H_x^\star \end{bmatrix}\)< / span > from the left:< / p >
< div class = "arithmatex" > \[
(2 \beta) \partial_{\epsilon_i}(\beta) H_{yx}^\star E_{xy} + \beta^2 H_{yx}^\star \partial_{\epsilon_i} E_{xy}
= H_{yx}^\star \partial_{\epsilon_i}(A_E) E_{xy} + H_{yx}^\star A_E \partial_{\epsilon_i} E_{xy}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > However, < span class = "arithmatex" > \(H_{yx}^\star\)< / span > is actually a left-eigenvector of < span class = "arithmatex" > \(A_E\)< / span > . This can be verified by inspecting
the form of < code > operator_h< / code > (< span class = "arithmatex" > \(A_H\)< / span > ) and comparing its conjugate transpose to < code > operator_e< / code > (< span class = "arithmatex" > \(A_E\)< / span > ). Also, note
< span class = "arithmatex" > \(H_{yx}^\star \cdot E_{xy} = H^\star \times E\)< / span > recalls the mode orthogonality relation. See doi:10.5194/ars-9-85-201
for a similar approach. Therefore,< / p >
< div class = "arithmatex" > \[
H_{yx}^\star A_E \partial_{\epsilon_i} E_{xy} = \beta^2 H_{yx}^\star \partial_{\epsilon_i} E_{xy}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > and we can simplify to< / p >
< div class = "arithmatex" > \[
\partial_{\epsilon_i}(\beta)
= \frac{1}{2 \beta} \frac{H_{yx}^\star \partial_{\epsilon_i}(A_E) E_{xy} }{H_{yx}^\star E_{xy}}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > This expression can be quickly calculated for all < span class = "arithmatex" > \(i\)< / span > by writing out the various terms of
< span class = "arithmatex" > \(\partial_{\epsilon_i} A_E\)< / span > and recognizing that the vector-matrix-vector products (i.e. scalars)
< span class = "arithmatex" > \(sens_i = \vec{v}_{left} \partial_{\epsilon_i} (\epsilon_{xyz}) \vec{v}_{right}\)< / span > , indexed by < span class = "arithmatex" > \(i\)< / span > , can be expressed as
elementwise multiplications < span class = "arithmatex" > \(\vec{sens} = \vec{v}_{left} \star \vec{v}_{right}\)< / span > < / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > e_norm< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vcfdslice (meanas.fdmath.vcfdslice)" href = "../fdmath/#meanas.fdmath.types.vcfdslice" > vcfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Normalized, vectorized E_xyz field for the mode. E.g. as returned by < code > normalized_fields_e< / code > .< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > h_norm< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vcfdslice (meanas.fdmath.vcfdslice)" href = "../fdmath/#meanas.fdmath.types.vcfdslice" > vcfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Normalized, vectorized H_xyz field for the mode. E.g. as returned by < code > normalized_fields_e< / code > .< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Propagation constant for the mode. The z-axis is assumed to be continuous (i.e. without numerical dispersion).< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > The angular frequency of the system.< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized dielectric constant grid< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > mu< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > | None< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized magnetic permeability grid (default 1 everywhere)< / p >
< / div >
< / td >
< td >
< code > None< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "meanas.fdmath.vcfdslice_t" > vcfdslice_t< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Sparse matrix representation of the operator.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_2d.solve_modes" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > solve_modes< / span >
< a href = "#meanas.fdfd.waveguide_2d.solve_modes" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > solve_modes< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > mode_numbers< / span > < span class = "p" > :< / span > < span class = "n" > Sequence< / span > < span class = "p" > [< / span > < span class = "nb" > int< / span > < span class = "p" > ],< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > mu< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "n" > mode_margin< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "o" > =< / span > < span class = "mi" > 2< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-8" name = "__codelineno-0-8" href = "#__codelineno-0-8" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span >
< a id = "__codelineno-0-9" name = "__codelineno-0-9" href = "#__codelineno-0-9" > < / a > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > numpy< / span > < span class = "o" > .< / span > < span class = "n" > complex128< / span > < span class = "p" > ],< / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > numpy< / span > < span class = "o" > .< / span > < span class = "n" > complex128< / span > < span class = "p" > ]< / span >
< a id = "__codelineno-0-10" name = "__codelineno-0-10" href = "#__codelineno-0-10" > < / a > < span class = "p" > ]< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Given a 2D region, attempts to solve for the eigenmode with the specified mode numbers.< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > mode_numbers< / code >
< / td >
< td >
< code > < span title = "collections.abc.Sequence" > Sequence< / span > [< span title = "int" > int< / span > ]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > List of 0-indexed mode numbers to solve for< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Angular frequency of the simulation< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Dielectric constant< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > mu< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > | None< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Magnetic permeability (default 1 everywhere)< / p >
< / div >
< / td >
< td >
< code > None< / code >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > mode_margin< / code >
< / td >
< td >
< code > < span title = "int" > int< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > The eigensolver will actually solve for < code > (max(mode_number) + mode_margin)< / code >
modes, but only return the target mode. Increasing this value can improve the solver's
ability to find the correct mode. Default 2.< / p >
< / div >
< / td >
< td >
< code > 2< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th > < th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td > < code > e_xys< / code > < / td > < td >
< code > < span title = "numpy.typing.NDArray" > NDArray< / span > [< span title = "numpy.complex128" > complex128< / span > ]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > NDArray of vfdfield_t specifying fields. First dimension is mode number.< / p >
< / div >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td > < code > wavenumbers< / code > < / td > < td >
< code > < span title = "numpy.typing.NDArray" > NDArray< / span > [< span title = "numpy.complex128" > complex128< / span > ]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > list of wavenumbers< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_2d.solve_mode" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > solve_mode< / span >
< a href = "#meanas.fdfd.waveguide_2d.solve_mode" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > solve_mode< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > mode_number< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "p" > ,< / span > < span class = "o" > *< / span > < span class = "n" > args< / span > < span class = "p" > :< / span > < span class = "n" > Any< / span > < span class = "p" > ,< / span > < span class = "o" > **< / span > < span class = "n" > kwargs< / span > < span class = "p" > :< / span > < span class = "n" > Any< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span > < span class = "n" > vcfdfield2_t< / span > < span class = "p" > ,< / span > < span class = "nb" > complex< / span > < span class = "p" > ]< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Wrapper around < code > solve_modes()< / code > that solves for a single mode.< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > mode_number< / code >
< / td >
< td >
< code > < span title = "int" > int< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > 0-indexed mode number to solve for< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > *args< / code >
< / td >
< td >
< code > < span title = "typing.Any" > Any< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > passed to < code > solve_modes()< / code > < / p >
< / div >
< / td >
< td >
< code > ()< / code >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > **kwargs< / code >
< / td >
< td >
< code > < span title = "typing.Any" > Any< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > passed to < code > solve_modes()< / code > < / p >
< / div >
< / td >
< td >
< code > {}< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "tuple" > tuple< / span > [< span title = "meanas.fdmath.vcfdfield2_t" > vcfdfield2_t< / span > , < span title = "complex" > complex< / span > ]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > (e_xy, wavenumber)< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_2d.inner_product" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > inner_product< / span >
< a href = "#meanas.fdfd.waveguide_2d.inner_product" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > inner_product< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > e1< / span > < span class = "p" > :< / span > < span class = "n" > vcfdfield2< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > h2< / span > < span class = "p" > :< / span > < span class = "n" > vcfdfield2< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > prop_phase< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span > < span class = "o" > =< / span > < span class = "mi" > 0< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > conj_h< / span > < span class = "p" > :< / span > < span class = "nb" > bool< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "n" > trapezoid< / span > < span class = "p" > :< / span > < span class = "nb" > bool< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-8" name = "__codelineno-0-8" href = "#__codelineno-0-8" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > complex< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Compute the discrete waveguide overlap / Poynting inner product.< / p >
< p > This is the 2D transverse integral corresponding to the time-averaged
longitudinal Poynting flux,< / p >
< div class = "arithmatex" > \[
\frac{1}{2}\int (E_x H_y - E_y H_x) \, dx \, dy
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > with the Yee-grid staggering and optional propagation-phase adjustment used
by the waveguide helpers in this module.< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > e1< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vcfdfield2 (meanas.fdmath.vcfdfield2)" href = "../fdmath/#meanas.fdmath.types.vcfdfield2" > vcfdfield2< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized electric field, typically from < code > exy2e(...)< / code > or
< code > normalized_fields_e(...)< / code > .< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > h2< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vcfdfield2 (meanas.fdmath.vcfdfield2)" href = "../fdmath/#meanas.fdmath.types.vcfdfield2" > vcfdfield2< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized magnetic field, typically from < code > hxy2h(...)< / code > ,
< code > exy2h(...)< / code > , or one of the normalization helpers.< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Two-dimensional Yee-grid spacing lists < code > [dx_e, dx_h]< / code > .< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > prop_phase< / code >
< / td >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Phase advance over one propagation cell. This is used to
shift the H field into the same longitudinal reference plane as the
E field.< / p >
< / div >
< / td >
< td >
< code > 0< / code >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > conj_h< / code >
< / td >
< td >
< code > < span title = "bool" > bool< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Whether to conjugate < code > h2< / code > before forming the overlap. Use
< code > True< / code > for the usual time-averaged power normalization.< / p >
< / div >
< / td >
< td >
< code > False< / code >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > trapezoid< / code >
< / td >
< td >
< code > < span title = "bool" > bool< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Whether to use trapezoidal quadrature instead of the default
rectangular Yee-cell sum.< / p >
< / div >
< / td >
< td >
< code > False< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Complex overlap / longitudinal power integral.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< / div >
< / div >
< / div >
< div class = "doc doc-object doc-module" >
< h2 id = "meanas.fdfd.waveguide_3d" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-module" > < / code > < span class = "doc doc-object-name doc-module-name" > meanas.fdfd.waveguide_3d< / span >
< a href = "#meanas.fdfd.waveguide_3d" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h2 >
< div class = "doc doc-contents first" >
< p > Tools for working with waveguide modes in 3D domains.< / p >
< p > This module relies heavily on < code > waveguide_2d< / code > and mostly just transforms
its parameters into 2D equivalents and expands the results back into 3D.< / p >
< p > The intended workflow is:< / p >
< ol >
< li > Select a single-cell slice normal to the propagation axis.< / li >
< li > Solve the corresponding 2D mode problem with < code > solve_mode(...)< / code > .< / li >
< li > Turn that mode into a one-sided source with < code > compute_source(...)< / code > .< / li >
< li > Build an overlap window with < code > compute_overlap_e(...)< / code > for port readout.< / li >
< / ol >
< p > < code > polarity< / code > is part of the public convention throughout this module:< / p >
< ul >
< li > < code > +1< / code > means forward propagation toward increasing index along < code > axis< / code > < / li >
< li > < code > -1< / code > means backward propagation toward decreasing index along < code > axis< / code > < / li >
< / ul >
< p > That same convention controls which side of the selected slice is used for the
overlap window and how the expanded field is phased.< / p >
< div class = "doc doc-children" >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_3d.solve_mode" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > solve_mode< / span >
< a href = "#meanas.fdfd.waveguide_3d.solve_mode" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > solve_mode< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > mode_number< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > axis< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > polarity< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "n" > slices< / span > < span class = "p" > :< / span > < span class = "n" > Sequence< / span > < span class = "p" > [< / span > < span class = "nb" > slice< / span > < span class = "p" > ],< / span >
< a id = "__codelineno-0-8" name = "__codelineno-0-8" href = "#__codelineno-0-8" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > fdfield< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-9" name = "__codelineno-0-9" href = "#__codelineno-0-9" > < / a > < span class = "n" > mu< / span > < span class = "p" > :< / span > < span class = "n" > fdfield< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-10" name = "__codelineno-0-10" href = "#__codelineno-0-10" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > dict< / span > < span class = "p" > [< / span > < span class = "nb" > str< / span > < span class = "p" > ,< / span > < span class = "nb" > complex< / span > < span class = "o" > |< / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > complexfloating< / span > < span class = "p" > ]]< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Given a 3D grid, selects a slice from the grid and attempts to
solve for an eigenmode propagating through that slice.< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > mode_number< / code >
< / td >
< td >
< code > < span title = "int" > int< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Number of the mode, 0-indexed< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Angular frequency of the simulation< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists_t
module-attribute
(meanas.fdmath.dx_lists_t)" href="../fdmath/#meanas.fdmath.types.dx_lists_t">dx_lists_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > axis< / code >
< / td >
< td >
< code > < span title = "int" > int< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Propagation axis (0=x, 1=y, 2=z)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > polarity< / code >
< / td >
< td >
< code > < span title = "int" > int< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Propagation direction (+1 for +ve, -1 for -ve)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > slices< / code >
< / td >
< td >
< code > < span title = "collections.abc.Sequence" > Sequence< / span > [< span title = "slice" > slice< / span > ]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > < code > epsilon[tuple(slices)]< / code > is used to select the portion of the grid to use
2026-04-20 17:38:01 -07:00
as the waveguide cross-section. < code > slices[axis]< / code > must select exactly one item.< / p >
2026-04-19 00:22:42 -07:00
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " fdfield (meanas.fdmath.fdfield)" href = "../fdmath/#meanas.fdmath.types.fdfield" > fdfield< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Dielectric constant< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > mu< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " fdfield (meanas.fdmath.fdfield)" href = "../fdmath/#meanas.fdmath.types.fdfield" > fdfield< / a > | None< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Magnetic permeability (default 1 everywhere)< / p >
< / div >
< / td >
< td >
< code > None< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "dict" > dict< / span > [< span title = "str" > str< / span > , < span title = "complex" > complex< / span > | < span title = "numpy.typing.NDArray" > NDArray< / span > [< span title = "numpy.complexfloating" > complexfloating< / span > ]]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Dictionary containing:< / p >
< / div >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > < span title = "dict" > dict< / span > [< span title = "str" > str< / span > , < span title = "complex" > complex< / span > | < span title = "numpy.typing.NDArray" > NDArray< / span > [< span title = "numpy.complexfloating" > complexfloating< / span > ]]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< ul >
< li > < code > E< / code > : full-grid electric field for the solved mode< / li >
< / ul >
< / div >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > < span title = "dict" > dict< / span > [< span title = "str" > str< / span > , < span title = "complex" > complex< / span > | < span title = "numpy.typing.NDArray" > NDArray< / span > [< span title = "numpy.complexfloating" > complexfloating< / span > ]]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< ul >
< li > < code > H< / code > : full-grid magnetic field for the solved mode< / li >
< / ul >
< / div >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > < span title = "dict" > dict< / span > [< span title = "str" > str< / span > , < span title = "complex" > complex< / span > | < span title = "numpy.typing.NDArray" > NDArray< / span > [< span title = "numpy.complexfloating" > complexfloating< / span > ]]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< ul >
< li > < code > wavenumber< / code > : propagation constant corrected for the discretized
propagation axis< / li >
< / ul >
< / div >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > < span title = "dict" > dict< / span > [< span title = "str" > str< / span > , < span title = "complex" > complex< / span > | < span title = "numpy.typing.NDArray" > NDArray< / span > [< span title = "numpy.complexfloating" > complexfloating< / span > ]]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< ul >
< li > < code > wavenumber_2d< / code > : propagation constant of the reduced 2D eigenproblem< / li >
< / ul >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< details class = "notes" open >
< summary > Notes< / summary >
< p > The returned fields are normalized through the < code > waveguide_2d< / code >
normalization convention before being expanded back to 3D.< / p >
< / details >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_3d.compute_source" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > compute_source< / span >
< a href = "#meanas.fdfd.waveguide_3d.compute_source" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > compute_source< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > E< / span > < span class = "p" > :< / span > < span class = "n" > cfdfield< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > axis< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "n" > polarity< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-8" name = "__codelineno-0-8" href = "#__codelineno-0-8" > < / a > < span class = "n" > slices< / span > < span class = "p" > :< / span > < span class = "n" > Sequence< / span > < span class = "p" > [< / span > < span class = "nb" > slice< / span > < span class = "p" > ],< / span >
< a id = "__codelineno-0-9" name = "__codelineno-0-9" href = "#__codelineno-0-9" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > fdfield< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-10" name = "__codelineno-0-10" href = "#__codelineno-0-10" > < / a > < span class = "n" > mu< / span > < span class = "p" > :< / span > < span class = "n" > fdfield< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-11" name = "__codelineno-0-11" href = "#__codelineno-0-11" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > cfdfield_t< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Given an eigenmode obtained by < code > solve_mode< / code > , returns the current source distribution
necessary to position a unidirectional source at the slice location.< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > E< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " cfdfield (meanas.fdmath.cfdfield)" href = "../fdmath/#meanas.fdmath.types.cfdfield" > cfdfield< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > E-field of the mode< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber of the mode< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Angular frequency of the simulation< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists_t
module-attribute
(meanas.fdmath.dx_lists_t)" href="../fdmath/#meanas.fdmath.types.dx_lists_t">dx_lists_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > axis< / code >
< / td >
< td >
< code > < span title = "int" > int< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Propagation axis (0=x, 1=y, 2=z)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > polarity< / code >
< / td >
< td >
< code > < span title = "int" > int< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Propagation direction (+1 for +ve, -1 for -ve)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > slices< / code >
< / td >
< td >
< code > < span title = "collections.abc.Sequence" > Sequence< / span > [< span title = "slice" > slice< / span > ]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > < code > epsilon[tuple(slices)]< / code > is used to select the portion of the grid to use
as the waveguide cross-section. < code > slices[axis]< / code > should select only one item.< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > mu< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " fdfield (meanas.fdmath.fdfield)" href = "../fdmath/#meanas.fdmath.types.fdfield" > fdfield< / a > | None< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Magnetic permeability (default 1 everywhere)< / p >
< / div >
< / td >
< td >
< code > None< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "meanas.fdmath.cfdfield_t" > cfdfield_t< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > < code > J< / code > distribution for a one-sided electric-current source.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< details class = "notes" open >
< summary > Notes< / summary >
< p > The source is built from the expanded mode field and a boundary-source
operator. The resulting current is intended to be injected with the
same sign convention used elsewhere in the package:< / p >
< p > < code > E -= dt * J / epsilon< / code > < / p >
< / details >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_3d.compute_overlap_e" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > compute_overlap_e< / span >
< a href = "#meanas.fdfd.waveguide_3d.compute_overlap_e" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > compute_overlap_e< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > E< / span > < span class = "p" > :< / span > < span class = "n" > cfdfield_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > axis< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > polarity< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "n" > slices< / span > < span class = "p" > :< / span > < span class = "n" > Sequence< / span > < span class = "p" > [< / span > < span class = "nb" > slice< / span > < span class = "p" > ],< / span >
< a id = "__codelineno-0-8" name = "__codelineno-0-8" href = "#__codelineno-0-8" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-9" name = "__codelineno-0-9" href = "#__codelineno-0-9" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > cfdfield_t< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Build an overlap field for projecting another 3D electric field onto a mode.< / p >
< p > The returned field is intended for the discrete overlap expression< / p >
< div class = "arithmatex" > \[
\sum \mathrm{overlap\_e} \; E_\mathrm{other}^*
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > where the sum is over the full Yee-grid field storage.< / p >
< p > The construction uses a two-cell window immediately upstream of the selected
slice:< / p >
< ul >
< li > for < code > polarity=+1< / code > , the two cells just before < code > slices[axis].start< / code > < / li >
< li > for < code > polarity=-1< / code > , the two cells just after < code > slices[axis].stop< / code > < / li >
< / ul >
< p > The window is clipped to the simulation domain if necessary. A clipped but
non-empty window raises < code > RuntimeWarning< / code > ; an empty window raises
< code > ValueError< / code > .< / p >
< p > The derivation below assumes reflection symmetry and the standard waveguide
overlap relation involving< / p >
< div class = "arithmatex" > \[
\int ((E \times H_\mathrm{mode}) + (E_\mathrm{mode} \times H)) \cdot dn.
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > E x H_mode + E_mode x H
-> Ex Hmy - EyHmx + Emx Hy - Emy Hx (Z-prop)
Ex we/B Emx + Ex i/B dy Hmz - Ey (-we/B Emy) - Ey i/B dx Hmz
we/B (Ex Emx + Ey Emy) + i/B (Ex dy Hmz - Ey dx Hmz)
we/B (Ex Emx + Ey Emy) + i/B (Ex dy (dx Emy - dy Emx) - Ey dx (dx Emy - dy Emx))
we/B (Ex Emx + Ey Emy) + i/B (Ex dy dx Emy - Ex dy dy Emx - Ey dx dx Emy - Ey dx dy Emx)< / p >
< p > Ex j/wu (-jB Emx - dx Emz) - Ey j/wu (dy Emz + jB Emy)
B/wu (Ex Emx + Ey Emy) - j/wu (Ex dx Emz + Ey dy Emz)< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > E< / code >
< / td >
< td >
< code > < span title = "meanas.fdmath.cfdfield_t" > cfdfield_t< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > E-field of the mode< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber of the mode< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists_t
module-attribute
(meanas.fdmath.dx_lists_t)" href="../fdmath/#meanas.fdmath.types.dx_lists_t">dx_lists_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > axis< / code >
< / td >
< td >
< code > < span title = "int" > int< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Propagation axis (0=x, 1=y, 2=z)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > polarity< / code >
< / td >
< td >
< code > < span title = "int" > int< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Propagation direction (+1 for +ve, -1 for -ve)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > slices< / code >
< / td >
< td >
< code > < span title = "collections.abc.Sequence" > Sequence< / span > [< span title = "slice" > slice< / span > ]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > < code > epsilon[tuple(slices)]< / code > is used to select the portion of the grid to use
as the waveguide cross-section. slices[axis] should select only one item.< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "meanas.fdmath.cfdfield_t" > cfdfield_t< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > < code > overlap_e< / code > normalized so that < code > numpy.sum(overlap_e * E.conj()) == 1< / code > < / p >
< / div >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > < span title = "meanas.fdmath.cfdfield_t" > cfdfield_t< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > over the retained overlap window.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_3d.expand_e" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > expand_e< / span >
< a href = "#meanas.fdfd.waveguide_3d.expand_e" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > expand_e< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > E< / span > < span class = "p" > :< / span > < span class = "n" > cfdfield< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > axis< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > polarity< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "n" > slices< / span > < span class = "p" > :< / span > < span class = "n" > Sequence< / span > < span class = "p" > [< / span > < span class = "nb" > slice< / span > < span class = "p" > ],< / span >
< a id = "__codelineno-0-8" name = "__codelineno-0-8" href = "#__codelineno-0-8" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > cfdfield_t< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Given an eigenmode obtained by < code > solve_mode< / code > , expands the E-field from the 2D
slice where the mode was calculated to the entire domain (along the propagation
axis). This assumes the epsilon cross-section remains constant throughout the
entire domain; it is up to the caller to truncate the expansion to any regions
where it is valid.< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > E< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " cfdfield (meanas.fdmath.cfdfield)" href = "../fdmath/#meanas.fdmath.types.cfdfield" > cfdfield< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > E-field of the mode< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber of the mode< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists_t
module-attribute
(meanas.fdmath.dx_lists_t)" href="../fdmath/#meanas.fdmath.types.dx_lists_t">dx_lists_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > axis< / code >
< / td >
< td >
< code > < span title = "int" > int< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Propagation axis (0=x, 1=y, 2=z)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > polarity< / code >
< / td >
< td >
< code > < span title = "int" > int< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Propagation direction (+1 for +ve, -1 for -ve)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > slices< / code >
< / td >
< td >
< code > < span title = "collections.abc.Sequence" > Sequence< / span > [< span title = "slice" > slice< / span > ]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > < code > epsilon[tuple(slices)]< / code > is used to select the portion of the grid to use
as the waveguide cross-section. slices[axis] should select only one item.< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "meanas.fdmath.cfdfield_t" > cfdfield_t< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > < code > E< / code > , with the original field expanded along the specified < code > axis< / code > .< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< details class = "notes" open >
< summary > Notes< / summary >
< p > This helper assumes that the waveguide cross-section remains constant
along the propagation axis and applies the phase factor< / p >
< div class = "arithmatex" > \[
e^{-i \, \mathrm{polarity} \, wavenumber \, \Delta z}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > to each copied slice.< / p >
< / details >
< / div >
< / div >
< / div >
< / div >
< / div >
< div class = "doc doc-object doc-module" >
< h2 id = "meanas.fdfd.waveguide_cyl" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-module" > < / code > < span class = "doc doc-object-name doc-module-name" > meanas.fdfd.waveguide_cyl< / span >
< a href = "#meanas.fdfd.waveguide_cyl" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h2 >
< div class = "doc doc-contents first" >
< p > Operators and helper functions for cylindrical waveguides with unchanging cross-section.< / p >
< p > Waveguide operator is derived according to 10.1364/OL.33.001848.< / p >
< p > As in < code > waveguide_2d< / code > , the propagation dependence is separated from the
transverse solve. Here the propagation coordinate is the bend angle < code > \theta< / code > ,
and the fields are assumed to have the form< / p >
< div class = "arithmatex" > \[
\vec{E}(r, y, \theta), \vec{H}(r, y, \theta) \propto e^{-\imath m \theta},
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > where < code > m< / code > is the angular wavenumber returned by < code > solve_mode(s)< / code > . It is often
convenient to introduce the corresponding linear wavenumber< / p >
< div class = "arithmatex" > \[
\beta = \frac{m}{r_{\min}},
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > so that the cylindrical problem resembles the straight-waveguide problem with
additional metric factors.< / p >
< p > Those metric factors live on the staggered radial Yee grids. If the left edge of
the computational window is at < code > r = r_{\min}< / code > , define the electric-grid and
magnetic-grid radial sample locations by< / p >
< div class = "arithmatex" > \[
\begin{aligned}
2026-04-19 16:40:30 -07:00
r_a(n) & = r_{\min} + \sum_{j \le n} \Delta r_{e, j}, \\
r_b\!\left(n + \tfrac{1}{2}\right) & = r_{\min} + \tfrac{1}{2}\Delta r_{e, n}
+ \sum_{j < n } \ Delta r_ { h , j } ,
2026-04-19 00:22:42 -07:00
\end{aligned}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > and from them the diagonal metric matrices< / p >
< div class = "arithmatex" > \[
\begin{aligned}
2026-04-19 16:40:30 -07:00
T_a & = \operatorname{diag}(r_a / r_{\min}), \\
T_b & = \operatorname{diag}(r_b / r_{\min}).
2026-04-19 00:22:42 -07:00
\end{aligned}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > With the same forward/backward derivative notation used in < code > waveguide_2d< / code > , the
coordinate-transformed discrete curl equations used here are< / p >
< div class = "arithmatex" > \[
\begin{aligned}
2026-04-19 16:40:30 -07:00
-\imath \omega \mu_{rr} H_r & = \tilde{\partial}_y E_z + \imath \beta T_a^{-1} E_y, \\
-\imath \omega \mu_{yy} H_y & = -\imath \beta T_b^{-1} E_r
2026-04-19 00:22:42 -07:00
- T_b^{-1} \tilde{\partial}_r (T_a E_z), \\
2026-04-19 16:40:30 -07:00
-\imath \omega \mu_{zz} H_z & = \tilde{\partial}_r E_y - \tilde{\partial}_y E_r, \\
\imath \beta H_y & = -\imath \omega T_b \epsilon_{rr} E_r - T_b \hat{\partial}_y H_z, \\
\imath \beta H_r & = \imath \omega T_a \epsilon_{yy} E_y
2026-04-19 00:22:42 -07:00
- T_b T_a^{-1} \hat{\partial}_r (T_b H_z), \\
2026-04-19 16:40:30 -07:00
\imath \omega E_z & = T_a \epsilon_{zz}^{-1}
2026-04-19 00:22:42 -07:00
\left(\hat{\partial}_r H_y - \hat{\partial}_y H_r\right).
\end{aligned}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > The first three equations are the cylindrical analogue of the straight-guide
relations for < code > H_r< / code > , < code > H_y< / code > , and < code > H_z< / code > . The next two are the metric-weighted
versions of the straight-guide identities for < code > \imath \beta H_y< / code > and
< code > \imath \beta H_r< / code > , and the last equation plays the same role as the
longitudinal < code > E_z< / code > reconstruction in < code > waveguide_2d< / code > .< / p >
< p > Following the same elimination steps as in < code > waveguide_2d< / code > , apply
< code > \imath \beta \tilde{\partial}_r< / code > and < code > \imath \beta \tilde{\partial}_y< / code > to the
equation for < code > E_z< / code > , substitute for < code > \imath \beta H_r< / code > and < code > \imath \beta H_y< / code > ,
and then eliminate < code > H_z< / code > with< / p >
< div class = "arithmatex" > \[
H_z = \frac{1}{-\imath \omega \mu_{zz}}
\left(\tilde{\partial}_r E_y - \tilde{\partial}_y E_r\right).
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > This yields the transverse electric eigenproblem implemented by
< code > cylindrical_operator(...)< / code > :< / p >
< div class = "arithmatex" > \[
\beta^2
\begin{bmatrix} E_r \\ E_y \end{bmatrix}
=
\left(
\omega^2
\begin{bmatrix}
2026-04-19 16:40:30 -07:00
T_b^2 \mu_{yy} \epsilon_{xx} & 0 \\
0 & T_a^2 \mu_{xx} \epsilon_{yy}
2026-04-19 00:22:42 -07:00
\end{bmatrix}
+
\begin{bmatrix}
-T_b \mu_{yy} \hat{\partial}_y \\
T_a \mu_{xx} \hat{\partial}_x
\end{bmatrix}
T_b \mu_{zz}^{-1}
\begin{bmatrix}
2026-04-19 16:40:30 -07:00
-\tilde{\partial}_y & \tilde{\partial}_x
2026-04-19 00:22:42 -07:00
\end{bmatrix}
+
\begin{bmatrix}
\tilde{\partial}_x \\
\tilde{\partial}_y
\end{bmatrix}
T_a \epsilon_{zz}^{-1}
\begin{bmatrix}
2026-04-19 16:40:30 -07:00
\hat{\partial}_x T_b \epsilon_{xx} &
2026-04-19 00:22:42 -07:00
\hat{\partial}_y T_a \epsilon_{yy}
\end{bmatrix}
\right)
\begin{bmatrix} E_r \\ E_y \end{bmatrix}.
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > Since < code > \beta = m / r_{\min}< / code > , the solver implemented in this file returns the
angular wavenumber < code > m< / code > , while the operator itself is most naturally written in
terms of the linear quantity < code > \beta< / code > . The helpers below reconstruct the full
field components from the solved transverse eigenvector and then normalize the
mode to unit forward power with the same discrete longitudinal Poynting inner
product used by < code > waveguide_2d< / code > .< / p >
< p > As in the straight-waveguide case, all functions here assume a 2D grid:< / p >
< p > < code > dxes = [[[dr_e_0, dr_e_1, ...], [dy_e_0, ...]], [[dr_h_0, ...], [dy_h_0, ...]]]< / code > .< / p >
< div class = "doc doc-children" >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_cyl.cylindrical_operator" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > cylindrical_operator< / span >
< a href = "#meanas.fdfd.waveguide_cyl.cylindrical_operator" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > cylindrical_operator< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > rmin< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > sparse< / span > < span class = "o" > .< / span > < span class = "n" > sparray< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Cylindrical coordinate waveguide operator of the form< / p >
< div class = "arithmatex" > \[
2026-04-19 16:40:30 -07:00
(\omega^2 \begin{bmatrix} T_b T_b \mu_{yy} \epsilon_{xx} & 0 \\
0 & T_a T_a \mu_{xx} \epsilon_{yy} \end{bmatrix} +
2026-04-19 00:22:42 -07:00
\begin{bmatrix} -T_b \mu_{yy} \hat{\partial}_y \\
T_a \mu_{xx} \hat{\partial}_x \end{bmatrix} T_b \mu_{zz}^{-1}
2026-04-19 16:40:30 -07:00
\begin{bmatrix} -\tilde{\partial}_y & \tilde{\partial}_x \end{bmatrix} +
2026-04-19 00:22:42 -07:00
\begin{bmatrix} \tilde{\partial}_x \\
\tilde{\partial}_y \end{bmatrix} T_a \epsilon_{zz}^{-1}
2026-04-19 16:40:30 -07:00
\begin{bmatrix} \hat{\partial}_x T_b \epsilon_{xx} & \hat{\partial}_y T_a \epsilon_{yy} \end{bmatrix})
2026-04-19 00:22:42 -07:00
\begin{bmatrix} E_r \\
E_y \end{bmatrix}
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > for use with a field vector of the form < code > [E_r, E_y]< / code > .< / p >
< p > This operator can be used to form an eigenvalue problem of the form
A @ [E_r, E_y] = beta**2 * [E_r, E_y]< / p >
< p > which can then be solved for the eigenmodes of the system
(an < code > exp(-i * angular_wavenumber * theta)< / code > theta-dependence is assumed for
the fields, with < code > beta = angular_wavenumber / rmin< / code > ).< / p >
< p > (NOTE: See module docs and 10.1364/OL.33.001848)< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > The angular frequency of the system< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized dielectric constant grid< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > rmin< / code >
< / td >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Radius at the left edge of the simulation domain (at minimum 'x')< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "scipy.sparse.sparray" > sparray< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Sparse matrix representation of the operator< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_cyl.solve_modes" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > solve_modes< / span >
< a href = "#meanas.fdfd.waveguide_cyl.solve_modes" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > solve_modes< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > mode_numbers< / span > < span class = "p" > :< / span > < span class = "n" > Sequence< / span > < span class = "p" > [< / span > < span class = "nb" > int< / span > < span class = "p" > ],< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > rmin< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "n" > mode_margin< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "o" > =< / span > < span class = "mi" > 2< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-8" name = "__codelineno-0-8" href = "#__codelineno-0-8" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span >
< a id = "__codelineno-0-9" name = "__codelineno-0-9" href = "#__codelineno-0-9" > < / a > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > numpy< / span > < span class = "o" > .< / span > < span class = "n" > complex128< / span > < span class = "p" > ],< / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > numpy< / span > < span class = "o" > .< / span > < span class = "n" > complex128< / span > < span class = "p" > ]< / span >
< a id = "__codelineno-0-10" name = "__codelineno-0-10" href = "#__codelineno-0-10" > < / a > < span class = "p" > ]< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Given a 2d (r, y) slice of epsilon, attempts to solve for the eigenmode
of the bent waveguide with the specified mode number.< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
2026-04-20 17:38:01 -07:00
< code > mode_numbers< / code >
2026-04-19 00:22:42 -07:00
< / td >
< td >
2026-04-20 17:38:01 -07:00
< code > < span title = "collections.abc.Sequence" > Sequence< / span > [< span title = "int" > int< / span > ]< / code >
2026-04-19 00:22:42 -07:00
< / td >
< td >
< div class = "doc-md-description" >
2026-04-20 17:38:01 -07:00
< p > Mode numbers to solve, 0-indexed.< / p >
2026-04-19 00:22:42 -07:00
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Angular frequency of the simulation< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters [dx_e, dx_h] as described in meanas.fdmath.types.
2026-04-20 17:38:01 -07:00
The first coordinate is assumed to be r, the second is y.< / p >
2026-04-19 00:22:42 -07:00
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Dielectric constant< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > rmin< / code >
< / td >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Radius of curvature for the simulation. This should be the minimum value of
2026-04-20 17:38:01 -07:00
r within the simulation domain.< / p >
2026-04-19 00:22:42 -07:00
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th > < th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td > < code > e_xys< / code > < / td > < td >
< code > < span title = "numpy.typing.NDArray" > NDArray< / span > [< span title = "numpy.complex128" > complex128< / span > ]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > NDArray of vfdfield_t specifying fields. First dimension is mode number.< / p >
< / div >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td > < code > angular_wavenumbers< / code > < / td > < td >
< code > < span title = "numpy.typing.NDArray" > NDArray< / span > [< span title = "numpy.complex128" > complex128< / span > ]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > list of wavenumbers in 1/rad units.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_cyl.solve_mode" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > solve_mode< / span >
< a href = "#meanas.fdfd.waveguide_cyl.solve_mode" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > solve_mode< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > mode_number< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "p" > ,< / span > < span class = "o" > *< / span > < span class = "n" > args< / span > < span class = "p" > :< / span > < span class = "n" > Any< / span > < span class = "p" > ,< / span > < span class = "o" > **< / span > < span class = "n" > kwargs< / span > < span class = "p" > :< / span > < span class = "n" > Any< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span > < span class = "n" > vcfdslice< / span > < span class = "p" > ,< / span > < span class = "nb" > complex< / span > < span class = "p" > ]< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Wrapper around < code > solve_modes()< / code > that solves for a single mode.< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > mode_number< / code >
< / td >
< td >
< code > < span title = "int" > int< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > 0-indexed mode number to solve for< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > *args< / code >
< / td >
< td >
< code > < span title = "typing.Any" > Any< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > passed to < code > solve_modes()< / code > < / p >
< / div >
< / td >
< td >
< code > ()< / code >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > **kwargs< / code >
< / td >
< td >
< code > < span title = "typing.Any" > Any< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > passed to < code > solve_modes()< / code > < / p >
< / div >
< / td >
< td >
< code > {}< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "tuple" > tuple< / span > [< a class = "autorefs autorefs-internal" title = " vcfdslice (meanas.fdmath.vcfdslice)" href = "../fdmath/#meanas.fdmath.types.vcfdslice" > vcfdslice< / a > , < span title = "complex" > complex< / span > ]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > (e_xy, angular_wavenumber)< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_cyl.linear_wavenumbers" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > linear_wavenumbers< / span >
< a href = "#meanas.fdfd.waveguide_cyl.linear_wavenumbers" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > linear_wavenumbers< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > e_xys< / span > < span class = "p" > :< / span > < span class = "nb" > list< / span > < span class = "p" > [< / span > < span class = "n" > vcfdfield2_t< / span > < span class = "p" > ],< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > angular_wavenumbers< / span > < span class = "p" > :< / span > < span class = "n" > ArrayLike< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > rmin< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > numpy< / span > < span class = "o" > .< / span > < span class = "n" > complex128< / span > < span class = "p" > ]< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Calculate linear wavenumbers (1/distance) based on angular wavenumbers (1/rad)
and the mode's energy distribution.< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > e_xys< / code >
< / td >
< td >
< code > < span title = "list" > list< / span > [< span title = "meanas.fdmath.vcfdfield2_t" > vcfdfield2_t< / span > ]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized mode fields with shape (num_modes, 2 * x *y)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > angular_wavenumbers< / code >
< / td >
< td >
< code > < span title = "numpy.typing.ArrayLike" > ArrayLike< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumbers assuming fields have theta-dependence of
< code > exp(-i * angular_wavenumber * theta)< / code > . They should satisfy
< code > operator_e() @ e_xy == (angular_wavenumber / rmin) ** 2 * e_xy< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized dielectric constant grid with shape (3, x, y)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > rmin< / code >
< / td >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Radius at the left edge of the simulation domain (at minimum 'x')< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "numpy.typing.NDArray" > NDArray< / span > [< span title = "numpy.complex128" > complex128< / span > ]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > NDArray containing the calculated linear (1/distance) wavenumbers< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_cyl.exy2h" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > exy2h< / span >
< a href = "#meanas.fdfd.waveguide_cyl.exy2h" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > exy2h< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > angular_wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > rmin< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "n" > mu< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-8" name = "__codelineno-0-8" href = "#__codelineno-0-8" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > sparse< / span > < span class = "o" > .< / span > < span class = "n" > sparray< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Operator which transforms the vector < code > e_xy< / code > containing the vectorized E_r and E_y fields,
into a vectorized H containing all three H components< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > angular_wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber assuming fields have theta-dependence of
< code > exp(-i * angular_wavenumber * theta)< / code > . It should satisfy
< code > operator_e() @ e_xy == (angular_wavenumber / rmin) ** 2 * e_xy< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > The angular frequency of the system< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > rmin< / code >
< / td >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Radius at the left edge of the simulation domain (at minimum 'x')< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized dielectric constant grid< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > mu< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > | None< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized magnetic permeability grid (default 1 everywhere)< / p >
< / div >
< / td >
< td >
< code > None< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "scipy.sparse.sparray" > sparray< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Sparse matrix representing the operator.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_cyl.exy2e" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > exy2e< / span >
< a href = "#meanas.fdfd.waveguide_cyl.exy2e" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > exy2e< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > angular_wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > rmin< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > sparse< / span > < span class = "o" > .< / span > < span class = "n" > sparray< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Operator which transforms the vector < code > e_xy< / code > containing the vectorized E_r and E_y fields,
into a vectorized E containing all three E components< / p >
< p > Unlike the straight waveguide case, the H_z components do not cancel and must be calculated
from E_r and E_y in order to then calculate E_z.< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > angular_wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber assuming fields have theta-dependence of
< code > exp(-i * angular_wavenumber * theta)< / code > . It should satisfy
< code > operator_e() @ e_xy == (angular_wavenumber / rmin) ** 2 * e_xy< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > The angular frequency of the system< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > rmin< / code >
< / td >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Radius at the left edge of the simulation domain (at minimum 'x')< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized dielectric constant grid< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "scipy.sparse.sparray" > sparray< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Sparse matrix representing the operator.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_cyl.e2h" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > e2h< / span >
< a href = "#meanas.fdfd.waveguide_cyl.e2h" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > e2h< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > angular_wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > rmin< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > mu< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > sparse< / span > < span class = "o" > .< / span > < span class = "n" > sparray< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Returns an operator which, when applied to a vectorized E eigenfield, produces
the vectorized H eigenfield.< / p >
2026-04-19 16:40:30 -07:00
< p > This operator is created directly from the initial coordinate-transformed equations:< / p >
< div class = "arithmatex" > \[
2026-04-19 00:22:42 -07:00
\begin{aligned}
2026-04-19 16:40:30 -07:00
-\imath \omega \mu_{rr} H_r & = \tilde{\partial}_y E_z + \imath \beta T_a^{-1} E_y, \\
-\imath \omega \mu_{yy} H_y & = -\imath \beta T_b^{-1} E_r
- T_b^{-1} \tilde{\partial}_r (T_a E_z), \\
-\imath \omega \mu_{zz} H_z & = \tilde{\partial}_r E_y - \tilde{\partial}_y E_r,
2026-04-19 00:22:42 -07:00
\end{aligned}
2026-04-19 16:40:30 -07:00
\]< / div >
2026-04-19 00:22:42 -07:00
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > angular_wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber assuming fields have theta-dependence of
< code > exp(-i * angular_wavenumber * theta)< / code > . It should satisfy
< code > operator_e() @ e_xy == (angular_wavenumber / rmin) ** 2 * e_xy< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > The angular frequency of the system< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > rmin< / code >
< / td >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Radius at the left edge of the simulation domain (at minimum 'x')< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > mu< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > | None< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized magnetic permeability grid (default 1 everywhere)< / p >
< / div >
< / td >
< td >
< code > None< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "scipy.sparse.sparray" > sparray< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Sparse matrix representation of the operator.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_cyl.dxes2T" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > dxes2T< / span >
< a href = "#meanas.fdfd.waveguide_cyl.dxes2T" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > dxes2T< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span > < span class = "n" > rmin< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > numpy< / span > < span class = "o" > .< / span > < span class = "n" > float64< / span > < span class = "p" > ],< / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > numpy< / span > < span class = "o" > .< / span > < span class = "n" > float64< / span > < span class = "p" > ]]< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Construct the cylindrical metric matrices < span class = "arithmatex" > \(T_a\)< / span > and < span class = "arithmatex" > \(T_b\)< / span > .< / p >
< p > < code > T_a< / code > is sampled on the E-grid radial locations, while < code > T_b< / code > is sampled on
the staggered H-grid radial locations. These are the diagonal matrices that
convert the straight-waveguide algebra into its cylindrical counterpart.< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > rmin< / code >
< / td >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Radius at the left edge of the simulation domain (at minimum 'x')< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "tuple" > tuple< / span > [< span title = "numpy.typing.NDArray" > NDArray< / span > [< span title = "numpy.float64" > float64< / span > ], < span title = "numpy.typing.NDArray" > NDArray< / span > [< span title = "numpy.float64" > float64< / span > ]]< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Sparse diagonal matrices < code > (T_a, T_b)< / code > .< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "doc doc-object doc-function" >
< h3 id = "meanas.fdfd.waveguide_cyl.normalized_fields_e" class = "doc doc-heading" >
< code class = "doc-symbol doc-symbol-heading doc-symbol-function" > < / code > < span class = "doc doc-object-name doc-function-name" > normalized_fields_e< / span >
< a href = "#meanas.fdfd.waveguide_cyl.normalized_fields_e" class = "headerlink" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "doc-signature highlight" > < pre > < span > < / span > < code > < a id = "__codelineno-0-1" name = "__codelineno-0-1" href = "#__codelineno-0-1" > < / a > < span class = "nf" > normalized_fields_e< / span > < span class = "p" > (< / span >
< a id = "__codelineno-0-2" name = "__codelineno-0-2" href = "#__codelineno-0-2" > < / a > < span class = "n" > e_xy< / span > < span class = "p" > :< / span > < span class = "n" > vcfdfield2< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-3" name = "__codelineno-0-3" href = "#__codelineno-0-3" > < / a > < span class = "n" > angular_wavenumber< / span > < span class = "p" > :< / span > < span class = "nb" > complex< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-4" name = "__codelineno-0-4" href = "#__codelineno-0-4" > < / a > < span class = "n" > omega< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-5" name = "__codelineno-0-5" href = "#__codelineno-0-5" > < / a > < span class = "n" > dxes< / span > < span class = "p" > :< / span > < span class = "n" > dx_lists2_t< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > rmin< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a > < span class = "n" > epsilon< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-8" name = "__codelineno-0-8" href = "#__codelineno-0-8" > < / a > < span class = "n" > mu< / span > < span class = "p" > :< / span > < span class = "n" > vfdslice< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-9" name = "__codelineno-0-9" href = "#__codelineno-0-9" > < / a > < span class = "n" > prop_phase< / span > < span class = "p" > :< / span > < span class = "nb" > float< / span > < span class = "o" > =< / span > < span class = "mi" > 0< / span > < span class = "p" > ,< / span >
< a id = "__codelineno-0-10" name = "__codelineno-0-10" href = "#__codelineno-0-10" > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span > < span class = "n" > vcfdslice_t< / span > < span class = "p" > ,< / span > < span class = "n" > vcfdslice_t< / span > < span class = "p" > ]< / span >
< / code > < / pre > < / div >
< div class = "doc doc-contents " >
< p > Given a vector < code > e_xy< / code > containing the vectorized E_r and E_y fields,
returns normalized, vectorized E and H fields for the system.< / p >
< p > < span class = "doc-section-title" > Parameters:< / span > < / p >
< table >
< thead >
< tr >
< th > Name< / th >
< th > Type< / th >
< th > Description< / th >
< th > Default< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > e_xy< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vcfdfield2 (meanas.fdmath.vcfdfield2)" href = "../fdmath/#meanas.fdmath.types.vcfdfield2" > vcfdfield2< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vector containing E_r and E_y fields< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > angular_wavenumber< / code >
< / td >
< td >
< code > < span title = "complex" > complex< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Wavenumber assuming fields have theta-dependence of
< code > exp(-i * angular_wavenumber * theta)< / code > . It should satisfy
< code > operator_e() @ e_xy == (angular_wavenumber / rmin) ** 2 * e_xy< / code > < / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > omega< / code >
< / td >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > The angular frequency of the system< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > dxes< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " dx_lists2_t
module-attribute
(meanas.fdmath.dx_lists2_t)" href="../fdmath/#meanas.fdmath.types.dx_lists2_t">dx_lists2_t< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Grid parameters < code > [dx_e, dx_h]< / code > as described in < code > meanas.fdmath.types< / code > (2D)< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > rmin< / code >
< / td >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Radius at the left edge of the simulation domain (at minimum 'x')< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > epsilon< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized dielectric constant grid< / p >
< / div >
< / td >
< td >
< em > required< / em >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > mu< / code >
< / td >
< td >
< code > < a class = "autorefs autorefs-internal" title = " vfdslice (meanas.fdmath.vfdslice)" href = "../fdmath/#meanas.fdmath.types.vfdslice" > vfdslice< / a > | None< / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Vectorized magnetic permeability grid (default 1 everywhere)< / p >
< / div >
< / td >
< td >
< code > None< / code >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > prop_phase< / code >
< / td >
< td >
< code > < span title = "float" > float< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > Phase shift < code > (dz * corrected_wavenumber)< / code > over 1 cell in propagation direction.
Default 0 (continuous propagation direction, i.e. dz-> 0).< / p >
< / div >
< / td >
< td >
< code > 0< / code >
< / td >
< / tr >
< / tbody >
< / table >
< p > < span class = "doc-section-title" > Returns:< / span > < / p >
< table >
< thead >
< tr >
< th > Type< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr class = "doc-section-item" >
< td >
< code > < span title = "meanas.fdmath.vcfdslice_t" > vcfdslice_t< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > < code > (e, h)< / code > , where each field is vectorized, normalized,< / p >
< / div >
< / td >
< / tr >
< tr class = "doc-section-item" >
< td >
< code > < span title = "meanas.fdmath.vcfdslice_t" > vcfdslice_t< / span > < / code >
< / td >
< td >
< div class = "doc-md-description" >
< p > and contains all three vector components.< / p >
< / div >
< / td >
< / tr >
< / tbody >
< / table >
< details class = "notes" open >
< summary > Notes< / summary >
< p > The normalization step is delegated to < code > _normalized_fields(...)< / code > , which
enforces unit forward power under the discrete inner product< / p >
< div class = "arithmatex" > \[
\frac{1}{2}\int (E_r H_y^* - E_y H_r^*) \, dr \, dy.
\]< / div >
2026-04-19 16:40:30 -07:00
2026-04-19 00:22:42 -07:00
< p > The angular wavenumber < code > m< / code > is first converted into the full three-component
fields, then the overall complex phase and sign are fixed so the result is
reproducible for symmetric modes.< / p >
< / details >
< / div >
< / div >
< / div >
< / div >
< / div >
< / article >
< / div >
< script > var target = document . getElementById ( location . hash . slice ( 1 ) ) ; target && target . name && ( target . checked = target . name . startsWith ( "__tabbed_" ) ) < / script >
< / div >
< button type = "button" class = "md-top md-icon" data-md-component = "top" hidden >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z" / > < / svg >
Back to top
< / button >
< / main >
< footer class = "md-footer" >
< div class = "md-footer-meta md-typeset" >
< div class = "md-footer-meta__inner md-grid" >
< div class = "md-copyright" >
Made with
< a href = "https://squidfunk.github.io/mkdocs-material/" target = "_blank" rel = "noopener" >
Material for MkDocs
< / a >
< / div >
< / div >
< / div >
< / footer >
< / div >
< div class = "md-dialog" data-md-component = "dialog" >
< div class = "md-dialog__inner md-typeset" > < / div >
< / div >
< script id = "__config" type = "application/json" > { "annotate" : null , "base" : "../.." , "features" : [ "navigation.indexes" , "navigation.sections" , "navigation.top" , "content.code.copy" , "toc.follow" ] , "search" : "../../assets/javascripts/workers/search.2c215733.min.js" , "tags" : null , "translations" : { "clipboard.copied" : "Copied to clipboard" , "clipboard.copy" : "Copy to clipboard" , "search.result.more.one" : "1 more on this page" , "search.result.more.other" : "# more on this page" , "search.result.none" : "No matching documents" , "search.result.one" : "1 matching document" , "search.result.other" : "# matching documents" , "search.result.placeholder" : "Type to start searching" , "search.result.term.missing" : "Missing" , "select.version" : "Select version" } , "version" : null } < / script >
< script src = "../../assets/javascripts/bundle.79ae519e.min.js" > < / script >
< script src = "../../js/print-site.js" > < / script >
< script src = "../../javascripts/mathjax.js" > < / script >
< script src = "../../assets/vendor/mathjax/startup.js" > < / script >
< / body >
< / html >