Физическая модель (Core/Model)

Calculation — корневой объект задачи

Core/Model/Calculation.m — handle-класс, объединяющий постановку задачи и её результат:

Поле

Смысл

TaskName

имя задачи (используется в т.ч. для имени лог-файла)

Structure

объект SuperconductorLayer — что считаем

InitialConditions

параметры расчёта (наследник InitialConditions, разный для каждого представления)

CalculatedPhysicalProperties

результат (наследник CalculatedPhysicalProperties); пуст до завершения пайплайна

IsCalculated

флаг завершения расчёта

CalculationTime

строка длительности расчёта (dd.hh:mm:ss)

Методы:

Метод

Зачем

Calculation(taskName, structure, initialConditions, calcProps)

конструктор; calcProps необязателен — пайплайн создаст его сам при первом запуске, если не передан

Save(path)

сохранить весь объект в один .mat файл. На практике удобнее SaverCalculation (см. ниже) или скриптовый слой (Шаг 5. Сохранение и загрузка результатов), которые раскладывают результат по папкам с манифестом, а не пишут один неразмеченный объект

SetCalculatedProperties(props)

явно подставить результат и выставить IsCalculated=true, проверив, что props — действительно наследник CalculatedPhysicalProperties (а не что попало). Нужен, когда результат приходит не из штатного пайплайна (например, после SeriesLoader)

Структура и материал

SuperconductorLayer (Core/Model/Structures/Layers) — сегодня всегда один слой: Name, Material, Length_nm, T (температура) — и вычисляемое (dependent) свойство Length_SI (перевод нм → м, чтобы формулы материала, работающие в СИ, не нужно было пересчитывать вручную в каждом месте, где встречается длина). Многослойные структуры физически пока не реализованы (см. Варианты расширения).

Material — объект-наследник SuperconductorPhysicalConstants (Core/Model/Materials/Superconductors). Разделение «просто данные» и «вычисляемые/dependent» здесь осмысленное:

Свойство

Смысл

FermiEnergy_SI, Sigma_SI, VelocityFermy_SI, FreePathLength_SI, Tcritical_SI, CrossSectionalArea_SI

справочные константы материала (задаются в конструкторе конкретного материала, например AluminumPhysicalConstants)

CouplingConstant

безразмерная константа связи N(0)V (по умолчанию 1/5, можно переопределить)

DiffusionCoefficient_SI (dependent)

\(D = v_F l / 3\) — вычисляется на лету из VelocityFermy_SI и FreePathLength_SI, чтобы нельзя было забыть пересчитать при смене одного из них

FermiWaveVector_SI, FermiDensityOfStates_SI (dependent)

то же самое: производные величины, а не независимые поля — меньше шанс рассинхронизации

Методы:

Метод

Зачем

CalcInitialOrderParameter(T)

параметр порядка Δ(T) в приближении БКШ: \(\Delta = 1{.}76\,k_B T_c \tanh(1{.}74\sqrt{T_c/T - 1})\) — нужен как начальное приближение и как масштаб нормировки энергии

CalcConstantG(T)

нормировочная константа, связывающая коэффициент диффузии и Δ(T); используется в уравнении Узаделя как параметр ОДУ (ConstantG в солверах, см. Численное ядро)

CalcBulkConductance_SI(L)

объёмная проводимость образца длины L: \(G = \sigma A / L\) — нужна для граничных условий на контакте

Начальные условия

InitialConditions (абстрактный, value-класс) — общий предок, конкретизируется на представление. Оба наследника хранят одинаковый набор скалярных параметров задачи (SpinMixingAngle, MisorientationAngle_Degrees, PairingInteractionConstant, SelfConsistencySteps, OrderParameterTolerance, InelasticScatteringConstant) плюс Split (сетка, см. ниже); SCFIEnergyBasedInitialConditions дополнительно хранит IsTripleLayer (переключает граничные условия S-FI / FI-S-FI). Это ровно те параметры, что видны в декларативном CalculationConfig (Шаг 2. Все настройки конфигурации) — скриптовый слой просто копирует одноимённые поля при сборке.

Метод: set.MisorientationAngle_Degrees — при присваивании угла в градусах автоматически пересчитывает и кладёт в приватное поле значение в радианах, доступное через dependent-свойство MisorientationAngle_Rad. Смысл — солверы физически работают в радианах, а человеку удобнее задавать градусы; хранить обе величины независимо было бы источником рассинхронизации при ручном редактировании одной без другой.

Расчётная сетка (Splitting)

Splitting (абстрактный, handle) — координатная сетка Zmas на [zStart, zEnd] из zN точек, плюс вторая ось Emas из eN точек (смысл которой зависит от представления).

Методы базового класса:

Метод

Зачем

UniformZ() / UniformE()

построить равномерную сетку по соответствующей оси; вызывается автоматически из CreateSplitting, если сгущение не запрошено

setZGrid(zStart, zEnd, zN) / setEGrid(eStart, eEnd, eN)

переопределить границы/число точек оси после создания объекта, с автоматическим перестроением сетки

CreateSplitting() (абстрактный, protected)

каждый наследник реализует по-своему — здесь и вшита разница между представлениями (что значит «вторая ось»)

Наследники:

  • EnergyBasedSplitting — вторая ось - энергия. Методы SetZrefinement(one, second, between) / SetErefinement(one, second, between) сгущают сетку на заданном интервале — там, где физика меняется быстрее всего (например, вблизи щели), не тратя узлы сетки равномерно по всему диапазону. Дополнительно — SetOmegaGrid(start, end, n) строит сетку частот ω, нужную только проводимости (см. Шаг 3. Какие величины считать).

  • MatsubaraSplitting — вторая ось не энергия, а частоты Мацубары (Omas, задаются методом SetOmegaSplitting) — это основная «энергетическая» ось представления Мацубары, не вспомогательная величина. Метод SetRefinement(one, second, between) — сгущение координатной сетки, аналог SetZrefinement.

Важно

Смысл Omas/OmegaGrid разный в двух представлениях: для EnergyBased это отдельная сетка частот для проводимости (опциональная), для Matsubara — это и есть основная сетка частот расчёта. Скриптовый слой прячет это различие за одним полем GridConfig.OmegaGrid, но физический смысл нужно держать в голове.

Состояние и результаты

PhysicsPipelineState (абстрактный) — набор булевых флагов готовности этапов (IsSolved, IsGreenReady, IsDoSReady, IsSpinDoSReady, IsMagnetizationReady, IsFreeEnergyReady, IsConductivityReady). Конкретизация — SCFIEnergyBasedState / SCFIMatsubaraPhysicsPipelineState; конструктор просто выставляет все флаги в false. Смысл существования этого класса — не хранить «посчитано/не посчитано» неявно (проверкой isempty на поле результата), а иметь явный, читаемый статус, который каждая физическая процедура (Численное ядро) выставляет в true сама, по мере готовности своей величины.

Он существует в двух экземплярах на расчёт: начальный (InitialConditions.PhysicsPipelineStartState) и конечный (CalculatedPhysicalProperties.PhysicsPipelineEndState) — именно второй обновляют физические процедуры.

CalculatedPhysicalProperties (абстрактный, handle) — контейнер результата. Для EnergyBased (SFIEnergyBasedCalculatedPhysicalProperties):

Поле

Что это

RiccattiTensor

тензор параметров Риккати (объект Riccati, см. Численное ядро)

RetardedGreenMatrix

запаздывающая функция Грина

OrderParameter, OrderParameterHistory

Δ(z) на последнем шаге и история по итерациям самосогласования

DensityOfStates, SpinResolvedDensityOfStates_Up/Down

плотность состояний N(z,ε), спин-разрешённая N↑/N↓(z,ε)

Magnetization

индуцированная намагниченность M(z)

FreeEnergy, FreeEnergyFromCord

свободная энергия (скаляр и разбивка по z)

ConductivityTensor

объект Conductivity с полем ConductFull (σ(z,ω))

LastStep

номер шага, на котором остановился самосогласованный цикл

Метод: IsComplete() — проверяет, что ключевые поля (тензор Риккати, функция Грина, параметр порядка) не пусты. Используется скриптовым слоем (и стоит использовать в своих скриптах) как быстрая проверка «расчёт реально что-то посчитал», не заглядывая в каждое поле по отдельности.