GreenTensor / guides · документация
← Лендинг Studio Расчётчик GitHub

GreenTensor · документация

Открытая Python-библиотека для расчёта рассеяния электромагнитных волн на многослойных сферически-симметричных структурах методом тензорных функций Грина (TGF). Это руководство описывает класс задач, формат входных данных и содержит готовые туториалы.

Введение

GreenTensor решает задачу рассеяния плоской ЭМ-волны на сфере, состоящей из произвольного числа концентрических слоёв с независимыми диэлектрической ε и магнитной μ проницаемостями. В основе лежит разложение поля по сферическим гармоникам и рекуррентный пересчёт направленных импедансов  Z̄ₙ(rₗ) и Ȳₙ(rₗ) от центра наружу через все слои — это даёт аналитически замкнутое решение без объёмной 3D-сетки.

Когда библиотека уместна

  • Структура сферически-симметрична (в полярной/сферической системе координат не зависит от θ и φ).
  • Слои локально однородны и изотропны (ε, μ — комплексные скаляры).
  • Среда линейная (нет нелинейных эффектов, насыщения, гистерезиса).
  • Источник — плоская волна (или произвольный набор плоских волн через суперпозицию).

Когда взять что-то другое

  • Не сфера: куб, цилиндр, произвольная форма → MoM, FEM, FDTD (HFSS, CST, Comsol, Meep).
  • Анизотропные/ферритовые материалы → full-wave решатели с тензорными ε, μ.
  • Связь с другими телами рядом → метод GMT (gigantic moment of T-matrix) или MoM.
+
Главное преимущество. Для своего класса задач метод даёт результат в 10³–10⁴ раз быстрее, чем full-wave решатели на МКЭ — потому что не дискретизируется объём. Хорошо подходит для верификации MoM/FEM-кодов.

Какие задачи можно решать

Библиотека предоставляет два класса: RCSCalculator — расчёт диаграммы рассеяния на одной частоте, и ScatteringCalculator — параметрический свип по электрическому размеру.

2.1 Бистатическая ЭПР (RCS) на одной частоте

Для заданных k₀a и структуры слоёв возвращает амплитудно-угловую зависимость рассеянного поля по углу θ от 0° до 360° для:

  • линейной поляризации: E_θ(θ) и E_φ(θ);
  • круговой поляризации: со-поляризованная E_op и кросс-поляризованная E_kp.

Все четыре результата нормированы в dB к собственному максимуму. Из них пересчитывается бистатическое сечение рассеяния в дБ:  σ_dB(θ) = 10·log₁₀(4π·|E(θ)|²/|E_inc|²).

2.2 Параметрический свип по k₀a

Для одной фиксированной структуры слоёв возвращает интегральные сечения как функции электрического размера. Это удобно для:

  • оценки резонансов на разных частотах;
  • выбора оптимального диапазона частот для линз и поглотителей;
  • построения «частотной подписи» цели (Mie-резонансы).
ВеличинаОписание
σ_sПолное сечение рассеяния (Total Scattering Cross-Section).
σ_θ, σ_φПарциальные вклады по поляризациям θ и φ.
σ_rРадиолокационное (back-scatter) сечение, θ = 180°.
σ_pСечение в попутном направлении, θ = 0°.

2.3 Типовые приложения

Антенны

Линза Люнеберга

Ступенчатое приближение градиентного профиля ε(r), оценка ширины луча и уровня боковых лепестков. Подходит для оптимизации числа слоёв при 3D-печати.

Радиолокация

ЭПР металлических сфер

Эталонная задача для верификации (Mie-теория) и градуировки калибровочных целей радиолокатора.

Биомедицина

Модель головы человека

Многослойная модель «мозг – череп – кожа» для оценки SAR и валидации полевых решателей в задачах bio-EM на 1–6 ГГц.

Метаматериалы

Поглотители Salisbury / Jaumann

Ступенчатые многослойные диэлектрические покрытия с потерями для оценки ослабления в обратном направлении в широком диапазоне.

Геометрия задачи

Структура задаётся вектором радиусов a = [a₁, a₂, …, aₙ], где aₖ — внешний радиус k-го слоя в безразмерных единицах (нормированных на радиус внешней оболочки). Длина вектора n совпадает с количеством слоёв в eps и miy.

a = [a₁ < a₂ < … < aₙ]
aₙ = 1 (внешний радиус сферы)
n ≥ 2 (минимум — один материал + вакуум)

3.1 Соглашения

  • Изнутри наружу. Первый элемент a[0] — внутренний слой (ядро), последний a[-1] = 1 — внешний (вакуум).
  • Безразмерность. Все радиусы делятся на R — внешний радиус сферы. Электрический размер k₀a — это волновое число k₀ умноженное на R; он передаётся как параметр расчёта, а не зашит в геометрию.
  • Строгая монотонность. aₖ < aₖ₊₁, без совпадающих радиусов.
  • Внешний слой = вакуум. Удобное соглашение API; реализация рассчитывает поля над сферой как над «слоем n+1 = свободное пространство».

3.2 Примеры

Однородная сфера (простейший случай)

# PEC-сфера радиуса R: 2 слоя — металл + внешний вакуум.
a   = [0.999, 1.0]                # внутренний радиус почти равен внешнему
eps = [-1.7e7j, 1.0]              # большое мнимое ε ≈ PEC; внешний слой — вакуум
miy = [1.0,    1.0]

Линза Люнеберга, 4 слоя

a   = [0.53, 0.75, 0.93, 1.00]  # границы слоёв изнутри наружу
eps = [1.86, 1.57, 1.28, 1.00]  # падение ε(r) от центра к краю
miy = [1.0,  1.0,  1.0,  1.0]   # немагнитные материалы

Биомедицинская модель головы (3 слоя, ~1 ГГц)

a   = [0.85,    0.92,   1.00]   # внутренний/мозг, череп, кожа+вакуум
eps = [45-13j, 11-2j, 1.0]    # комплексные ε при ~1 ГГц
miy = [1.0,    1.0,   1.0]
!
Частая ошибка. Не задавайте все a числами в метрах или миллиметрах — это нарушит нормировку. Радиусы безразмерные:  aₖ = rₖ / R, где R — внешний радиус. Само значение  R появляется только через параметр расчёта k₀ = k·R.

Источник излучения

Источник — плоская монохроматическая ЭМ-волна, падающая вдоль оси  z (θ_inc = 0°). Сферическая симметрия задачи позволяет ограничиться одним направлением падения — диаграмма рассеяния по углу θ от 0° до 360° даёт исчерпывающее описание.

Einc(r) = E₀ · ê · exp(−j·k₀·z),  |E₀| = 1

4.1 Электрический размер k₀a

Это безразмерная связка волнового числа и геометрии. Через неё сразу видно режим:

РежимУсловиеПоведение
Рэлейk₀a < 0.5Сечение растёт как (k₀a)⁴, рассеяние почти изотропное.
Mie / резонанс0.5 ≤ k₀a ≤ 10Острые резонансы, главные лепестки в θ = 0° и 180°.
Геометрическая оптикаk₀a > 10Лучевая картина, сечение → πa² + дифракционные поправки.

В коде k₀a подаётся как параметр k0 (он уже включает множитель R):

rcs = RCSCalculator(k0=5, toch=10, n=4, a=a, eps=eps, miy=miy)

4.2 Поляризация

Падающая волна разложена по двум каноническим базисам — программа считает все одновременно:

  • Линейная. E_θ (TM, вертикальная поляризация),  E_φ (TE, горизонтальная).
  • Круговая. Со-поляризованная (op, опорная) и кросс-поляризованная (kp). Удобно для оценки деполяризации.

4.3 Параметр φ (азимут)

Управляет ориентацией плоскости наблюдения для линейной поляризации. По умолчанию  φ = π/2 (плоскость yz), что соответствует стандартному E-плану / H-плану измерений в антенной технике. Менять обычно не требуется — для сферически-симметричных задач все азимутальные плоскости эквивалентны с точностью до переименования E_θ ↔ E_φ.

i
Если нужны диаграммы для других плоскостей или сложного источника (фокусированный гауссов пучок, токовая антенна) — раскладывайте источник по плоским волнам и суммируйте результаты по принципу суперпозиции.

Материальные свойства

Каждый слой описывается комплексными скалярными ε и μ в гауссовой нормировке (относительные проницаемости):

ε = ε′ − j·ε″,   μ = μ′ − j·μ″
tan δ = ε″ / ε′

5.1 Знак мнимой части

Используется соглашение e+jωt: положительная мнимая часть соответствует усилению, отрицательная — потерям (физически нормальные материалы). Для металла принимаем ε″ < 0 и большую по модулю; для вакуума ε″ = 0.

5.2 Типовые значения

МатериалεμКомментарий
Вакуум / воздух1.01.0Внешний слой обязательно.
PLA / ABS (3D-печать)2.67 − 0.024j1.0Матрица для линз с переменной плотностью.
Тефлон (PTFE)2.11.0Низкие потери в СВЧ.
Феррит (NiZn)12 − 0.5j15 − 5jМагнитные потери.
PEC (эталонный металл)−1.7·10⁷j1.0Аппроксимация идеального проводника.
Алюминий @ 10 ГГц1 − 1.7·10⁷j1.0Реальная Drude-модель.
Биоткани @ 1 ГГц10–60 − (1–15)j1.0Зависит от типа ткани (Gabriel, IFAC).

5.3 Соглашения по μ

Для немагнитных материалов всегда μ = 1 + 0j — это покрывает 99% задач в СВЧ. Магнитные слои (ферриты, гиромагнетики при работе вне резонанса) подаются как обычные комплексные скаляры.

!
Анизотропию библиотека не поддерживает. Если у материала ε тензор (например, феррит во внешнем поле или одноосный кристалл), TGF-метод в текущем виде не применим — нужен full-wave решатель.

Точность расчёта

Поле раскладывается в ряд по сферическим гармоникам. Параметр toch определяет количество удерживаемых членов. Слишком маленький toch — ряд не сходится; слишком большой — растут численные погрешности и время расчёта.

6.1 Эмпирическое правило

toch ≈ k₀a + 4·(k₀a)1/3 + 2   (критерий Wiscombe)
k₀aМинимум tochРекомендуется
≤ 146
1–368
3–6810
6–101215
10–201822

6.2 Как проверить сходимость

Сделайте два расчёта при toch и toch + 4. Если уровни главных лепестков диаграммы совпадают на 0.5 dB — точности достаточно. Если расходятся — увеличивайте.

+
В веб-расчётчике начинайте с toch = 10. Для линз Люнеберга с  k₀a = 5 этого хватает. Для крупных металлических сфер (k₀a > 10) — поднимайте до 18–22.

Туториал · Линза Люнеберга

Цель — рассчитать диаграмму направленности 4-слойной 3D-печатной линзы Люнеберга при  k₀a = 5 (рабочий X-диапазон) и оценить положение главного луча и уровень боковых лепестков.

Постановка

Идеальная линза Люнеберга имеет градиентный профиль ε(r) = 2 − (r/R)². Для 3D-печати его аппроксимируем 4 ступенчатыми слоями постоянного ε. Радиусы и проницаемости подобраны методом минимаксного приближения профиля.

ПараметрЗначение
k₀5 (k₀ · R, X-диапазон)
toch10
n4 (3 слоя + вакуум)
a[0.53, 0.75, 0.93, 1.00]
eps[1.86, 1.57, 1.28, 1.00]
miy[1, 1, 1, 1]

Запуск в Python

from greentensor import RCSCalculator
import matplotlib.pyplot as plt

rcs = RCSCalculator(
    k0=5, toch=10, n=4,
    a=[0.53, 0.75, 0.93, 1.0],
    eps=[1.86, 1.57, 1.28, 1.0],
    miy=[1, 1, 1, 1],
)
rcs.run_calculation()
rcs.plot_results()  # полярная и декартова диаграммы

Запуск в браузере

Откройте веб-расчётчик и выберите пресет «Люнеберг·4»:

Запустить «Люнеберг·4» в расчётчике

Что должно получиться

  • Главный луч в направлении θ ≈ 0° (попутное направление).
  • Уровень боковых лепестков около −15…−18 dB.
  • Симметрия диаграммы относительно оси падения.
  • Время расчёта в браузере — 0.5–0.7 секунды.

Что менять для эксперимента

  • Число слоёв: сравните 4 vs 9 слоёв — увидите, как падает уровень боковых лепестков.
  • k₀a: при k₀a = 2 главный луч расширяется, при k₀a = 10 — сужается.
  • Потери: добавьте ε″ = 0.024 (типичные потери PLA) — амплитуда упадёт примерно на 0.3 dB на слой.

Туториал · Металлическая сфера

Эталонная задача для верификации: ЭПР сплошной металлической сферы должна совпадать с классическим решением Mie. Используется как калибровочная цель в радиолокации.

PEC-аппроксимация

В TGF-формализме идеальный проводник задаётся материалом с очень большой по модулю мнимой ε. Эмпирически достаточно |ε″| ≈ 10⁷ — дальнейшее увеличение не меняет результат, только ускоряет численные переполнения.

ПараметрЗначение
k₀0.5 (Рэлеевский режим)
n3
a[0.1, 0.2, 1.0]
eps[−1.7·10⁷j, −1.7·10⁷j, 1.0]
miy[1, 1, 1]
Запустить «Металлическая сфера»

Сравнение с теорией Mie

Проверьте полное сечение через свип:  ScatteringCalculator(toch=10, k0a_start=0.25, k0a_stop=5, k0a_step=0.05). Должны увидеть классические Mie-резонансы:

  • при k₀a ≈ 1.0 — первый локальный максимум (резонанс электрический);
  • при k₀a ≈ 1.4 — следующий пик (магнитодипольный);
  • сходимость к σ_geo = π·a² (реальный размер) при k₀a → ∞.

Туториал · Биомедицинская модель головы

Трёхслойная сферическая модель «мозг – череп – кожа» позволяет быстро прикинуть диаграмму рассеяния головы на частоте 1 ГГц — типичная задача для проверки SAR-моделей и сертификации сотовых антенн.

СлойРадиус (норм.)ε при 1 ГГцИсточник
Мозг0–0.8545 − 13jGabriel (1996)
Череп0.85–0.9211 − 2jGabriel (1996)
Кожа + воздух0.92–1.001.0

Постановка

rcs = RCSCalculator(
    k0=2.0, toch=10, n=3,
    a=[0.85, 0.92, 1.0],
    eps=[45-13j, 11-2j, 1.0],
    miy=[1, 1, 1],
)
rcs.run_calculation()
Запустить «Модель головы»

На что обратить внимание

  • Сильное затухание во влажных тканях — диаграмма «мягкая», без острых лепестков.
  • Паразитное back-scatter резонирует на размерах кратно длине волны в мозге ( λ_brain ≈ λ₀ / √Re(ε) ≈ 0.15·λ₀).
  • Параметры ε сильно зависят от частоты — для расчёта на других частотах берите из базы IT'IS или из таблиц Gabriel.
!
Это не SAR. Модель даёт внешнее рассеянное поле. Для расчёта поглощённой мощности внутри тканей нужна другая постановка — поле внутри слоёв через те же ряды Mie, но с пересчётом коэффициентов проникновения. В планах библиотеки.

Туториал · Параметрический свип k₀a

Когда нужно понять как структура работает в полосе — не на одной частоте, а на диапазоне — используйте ScatteringCalculator. Он крутит  k₀a в заданном диапазоне и для каждой точки делает полный расчёт ЭПР.

Постановка

from greentensor import ScatteringCalculator, RCSCalculator

sc = ScatteringCalculator(
    toch=10,
    k0a_start=0.25, k0a_stop=5.0, k0a_step=0.05,
)
# подменяем дефолтную геометрию на свою (4-слойный Люнеберг):
sc.rcs_calculator = RCSCalculator(
    toch=10, n=4,
    a=[0.53, 0.75, 0.93, 1.0],
    eps=[1.86, 1.57, 1.28, 1.0],
    miy=[1]*4,
)
k0a, sigma_s, sigma_r, sigma_p, sigma_theta, sigma_phi = sc.calculate()

Что строить

  • σ_s(k₀a) — общий уровень рассеяния. Резонансы видны как пики.
  • σ_r(k₀a) — back-scatter. Главный практический показатель «заметности» цели.
  • σ_p(k₀a) — forward. Полезно для линз/просветляющих покрытий: чем выше пропускание, тем выше σ_p.
  • σ_θ, σ_φ — раздельно по поляризациям, видно, какая поляризация эффективнее рассеивается.

Сколько точек брать

Шаг k₀a_step = 0.05 при диапазоне 0.25…5.0 даёт 96 точек — это около 30–60 секунд в браузере. Для предварительного просмотра уменьшите до 0.1 (24 точки, 8–15 с). Для публикационных графиков — 0.02 (240 точек, ~2 минуты).

+
В браузере свип запускается в основном потоке: страница на время расчёта подвиснет. Если делаете много точек — переключитесь на десктопный Python.

Python API · краткий справочник

Установка

# из PyPI
pip install GreenTensor

# или из исходников с примерами
git clone https://github.com/Den1sovDm1triy/GreenTensor.git
cd GreenTensor && pip install -e .

Импорт

from greentensor import RCSCalculator, ScatteringCalculator

RCSCalculator

ПараметрТипОписание
k0floatЭлектрический размер k₀·R.
tochintЧисло членов ряда (см. §6).
nintКоличество слоёв (= len(a)).
phifloatАзимут плоскости наблюдения, рад. По умолчанию π/2.
alist[float]Радиусы изнутри наружу, последний = 1.0.
epslist[complex]Диэлектрические проницаемости.
miylist[complex]Магнитные проницаемости.

Атрибуты результата (после run_calculation)

АтрибутТипОписание
tetanp.ndarrayУглы θ, рад, от −π до +π после нормировки.
DN_NORM_lin_dB_tetanp.ndarrayE_θ нормированная, dB.
DN_NORM_lin_dB_phinp.ndarrayE_φ нормированная, dB.
DN_NORM_circle_dB_opnp.ndarrayСо-поляр. круговая, dB.
DN_NORM_circle_dB_kpnp.ndarrayКросс-поляр. круговая, dB.
Mn, Nnnp.ndarrayКоэффициенты разложения (для своих визуализаций).

ScatteringCalculator

ПараметрТипОписание
tochintЧисло членов ряда.
k0a_startfloatНачало диапазона.
k0a_stopfloatКонец диапазона.
k0a_stepfloatШаг.
rcs_calculatorRCSCalculatorДоступ к нижележащему калькулятору; присвойте свой, чтобы задать произвольную геометрию.

Возврат calculate()

Кортеж массивов длины N = (k0a_stop − k0a_start) / k0a_step + 1(k0a, σ_s, σ_r, σ_p, σ_θ, σ_φ).

Веб-расчётчик

Для быстрых проверок и демонстраций существует браузерная версия — она запускает тот же calc.py, что и десктопная библиотека, через Pyodide (CPython + numpy + scipy в WebAssembly).

Открыть веб-расчётчик

Что отличается

  • Никакой установки. Работает в любом современном браузере. Первая загрузка ~10–12 МБ (CPython + numpy + scipy), дальше всё из кеша.
  • Локальный расчёт. Данные не уходят с устройства, можно работать офлайн после первой загрузки.
  • 3D-редактор. Слои визуализируются в реальном времени — цвет шара меняется по ε.
  • Ограничение производительности. Pyodide примерно в 2–4 раза медленнее десктопного CPython. Для свипа на 200+ точек удобнее Python локально.

Когда какой инструмент брать

Веб-расчётчик

Подходит для

Демонстраций, обучения, разовых прикидок, экспорта CSV для отчётов, проверок гипотез до полноценного эксперимента.

Python

Подходит для

Параметрических исследований, оптимизации (десятки тысяч расчётов), интеграции в пайплайны, batch-ового сравнения с full-wave.

Ограничения и теоретическая база

Что метод не умеет

  • Несферические тела. Куб, цилиндр, эллипсоид — нужны MoM/FEM/FDTD.
  • Анизотропные материалы. Тензорные ε, μ. См. метод T-матрицы или объёмные методы.
  • Переменные параметры внутри слоя. Каждый слой — однородный. Градиент аппроксимируется ступенчато (увеличением числа слоёв).
  • Близкое поле и резонансы внутри слоёв. Возвращается рассеянное поле в дальней зоне. Поле внутри слоёв сейчас не выводится в публичном API.
  • Несколько тел. Только одна сферически-симметричная структура. Для систем тел нужен формализм многократного рассеяния (T-матрица).

Откуда взялся метод

Реализация продолжает линию работ школы Б. А. Панченко (УрФУ, кафедра ВЧСРТ): плоский → цилиндрический → сферический случай в едином TGF-фреймворке. Опорные источники:

  • Панченко Б.А. Рассеяние и поглощение электромагнитных волн неоднородными сферическими телами. М.: Радиотехника, 2013.
  • Bohren C.F., Huffman D.R. Absorption and Scattering of Light by Small Particles. Wiley, 1983 — классическая Mie-теория, к которой сводится частный случай однородной сферы.
  • Greenwood A.D., Jin J.-M. A novel efficient algorithm for scattering from a complex BOR using mixed FE and EBC. IEEE Trans. AP, 1999 — для сравнения с гибридным методом.

Литература и ссылки

Публикации с использованием библиотеки

  • Denisov D.V., Skumatenko I.O., Fadeev V.O., Shesterov M.A. GreenTensor Electromagnetic Library for Calculate Scattering on Multilayer Spherical Structures. IEEE EDM 2024. DOI: 10.1109/EDM61683.2024.10615009
  • Denisov D.V., Skumatenko I.O., Shesterov M.A. GreenTensor Electromagnetic Library for Calculating Scattering Patterns on a Human Head Model. IEEE USBEREIT 2024. DOI: 10.1109/USBEREIT61901.2024.10584060

Исходники и данные

Связь

Вопросы и сотрудничество: dv.denisov@urfu.ru. Pull-request'ы и отчёты об ошибках — через GitHub Issues.