Шаг 5. Сохранение и загрузка результатов

Как включить сохранение

Сохранение — по cfg.SaveOptions. Пусто (по умолчанию) — расчёт остаётся только в памяти. Минимально нужен OutputDir:

cfg.SaveOptions = struct('OutputDir', 'C:\Results\MyStudy');

Полный набор опций (передаются в SaverCalculation, см. Численное ядро):

Поле

По умолчанию

Смысл

OutputDir

'./Results'

базовая папка; реальный путь для каждого расчёта — глубже, см. ниже

SaveFullState

true (для скриптового слоя)

сохранять весь Calculation целиком (все физические свойства), а не только Δ(z). У самого SaverCalculation по умолчанию falseCalculationRunner переопределяет на true, если не задано явно, иначе SeriesLoader не сможет восстановить ничего, кроме параметра порядка

SaveGreenMatrix, SaveRiccatiTensor

false

сохранять функцию Грина / тензор Риккати отдельными файлами (тяжёлые данные)

SaveGapHistory

false

сохранять историю сходимости Δ(z) по итерациям

Format

'mat'

формат лёгких данных ('mat' или 'json')

Куда реально ложится результат

OutputDir/
└── <метка_времени>_<имя_базовой_задачи>/     ← SeriesFolder, общий на всю серию
    ├── manifest.txt                          ← кто есть кто (см. ниже)
    ├── <TaskName элемента 1>/
    │   ├── calc_<timestamp>.mat               ← лёгкие данные (Δ(z), LastStep, ...)
    │   └── calc_<timestamp>_fullstate.mat     ← весь Calculation (если SaveFullState=true)
    └── <TaskName элемента 2>/
        └── ...

Папка серии (SeriesFolder) создаётся один раз на весь вызов ParameterSeries.Expand — одинакова у всех элементов, чтобы результаты разных серий (и повторных запусков одной и той же) не перемешивались в одном OutputDir. Для одиночного CalculationRunner.Run без серии (cfg.SeriesFolder пуст) — просто OutputDir/TaskName/, без промежуточной папки.

manifest.txt

Обновляется автоматически после каждого запущенного элемента серии (и CalculationRunner.RunMany, и CalculationQueue это делают сами — руками звать не нужно):

Серия: 2026-07-28_015803_ManifestCheck
Базовая задача: ManifestCheck_SpinMixingAngle=0
Представление: EnergyBased, материал: Aluminum, длина: 50 нм
Обновлено: 2026-07-28 01:58:08
Элементов: 2

[done   ] ManifestCheck_SpinMixingAngle=0                         -> ManifestCheck_SpinMixingAngle=0/
[done   ] ManifestCheck_SpinMixingAngle=0.1                       -> ManifestCheck_SpinMixingAngle=0.1/

Упавшие элементы попадают туда же со статусом [error  ] и текстом ошибки в скобках.

Загрузка результатов обратно

SeriesLoader — без повторного счёта, в новой сессии MATLAB, если папка результатов доступна на диске:

items = SeriesLoader.LoadForSeries(cfgs(1));   % путь берётся из конфига
% или напрямую по пути:
items = SeriesLoader.Load('C:\Results\MyStudy\2026-07-28_015803_ManifestCheck');

for i = 1:numel(items)
    fprintf('%s: max|Delta|=%.4g\n', items(i).TaskName, max(abs(items(i).OrderParameter)));
end

Каждый элемент items(i):

Поле

Смысл

TaskName, Folder

имя элемента и путь до его подпапки

OrderParameter, LastStep

лёгкие данные, есть всегда, если элемент вообще сохранился

Calculation

объект Calculation целиком (если сохранён с SaveFullState=true, что по умолчанию) — через него доступны CalculatedPhysicalProperties.DensityOfStates, .Magnetization, .ConductivityTensor и всё остальное

Status

"loaded" | "noData" (подпапка есть, .mat не найден)

Пример — построить график намагниченности по всем элементам серии через базовые функции визуализации (Шаг 6. Построение графиков):

items = SeriesLoader.LoadForSeries(cfgs(1));
ax = CalculationPlotter.PlotMagnetization(items(1).Calculation);
hold(ax, 'on');
for i = 2:numel(items)
    CalculationPlotter.PlotMagnetization(items(i).Calculation, 'Axes', ax);
end
legend(ax, [items.TaskName]);

LoadForSeries принимает любую CalculationConfig этой серии — не обязательно первую и не обязательно из той же переменной cfgs, что и при запуске: подойдёт, например, q.Items(1).Config после CalculationQueue.Load в совершенно новой сессии.