От входного файла до проверяемого результата
Текущая МКЭ‑Ф — GNU Octave-программа с функциональным численным ядром. Данные модели создаются один раз, решатели возвращают новые структуры результатов, а графика и печать не участвуют в вычислении.
Границы ответственности
| Слой | Задача | Основной код |
|---|---|---|
| Ввод | Чтение секций до EOF, проверка записей и создание элементов. | FEMesh.m, createStructuralElement.m |
| Сборка | Накопление элементных вкладов в разреженные глобальные K и M. | assembleGlobalMatrices.m |
| Модель | Снимок матриц, карты СС, опор, нагрузок и данных элементов. | createAnalysisModel.m |
| Численное ядро | Редукция СС, решение и создание новой структуры ответа. | solveStatic.m, solveModal.m, solveTransient.m |
| Результаты | Реакции, равновесие, локальные усилия и спектр. | calculateStaticEquilibrium.m, recoverElementResults.m, computeSingleSidedSpectrum.m |
| Совместимость и представление | Привычные команды RunStatic, RunModal, RunTransient, необязательные печать и графики. | StructFEProblem.m, plotTransientResult.m |
Корневая функция setup явно добавляет каталоги src/model,
src/analysis, src/results и scripts в путь Octave.
Поставляемые модели находятся в examples/cases, готовые данные
постпроцессора — в examples/results, а новые результаты записываются
в игнорируемый каталог output.
addpath(pwd);
setup;
problem = StructFEProblem(fullfile( ...
"examples", "cases", "CaseBeam.txt"));
model = problem.GetAnalysisModel();
staticResult = solveStatic(model);
modalResult = solveModal(model);
Контейнерный интерфейс запускается из корня проекта командой docker compose up --build или docker-compose up --build. В препроцессоре создайте модель либо откройте TXT-файл с секцией analysis и нажмите Run analysis. Backend всегда вызывает фиксированный RunSelected(); браузер не передаёт имена скриптов, пути или выражения Octave.
Вызов решателя не меняет model, problem.K или problem.M. Нагрузки строятся с нуля на каждый запуск, поэтому повторный расчёт и перестановка видов анализа не должны менять ответ.
Элементы и разреженная сборка
Элемент — обычная структура значений, а не изменяемый объект-наследник. createStructuralElement создаёт общий контракт для типов 112 и 113: type, nodeNumbers, properties, единый вектор dofs, матрицы и сохранённые length и transformation. Одна и та же карта СС используется при сборке и восстановлении усилий.
assembleGlobalMatrices сначала формирует триплеты «строка — столбец — значение», затем одним вызовом sparse создаёт глобальные матрицы. При совпадении адресов Octave суммирует вклады. Память определяется числом элементных коэффициентов, а не квадратом числа СС.
Элементная математика сосредоточена в одном конструкторе структуры; решатели не знают формул конкретного элемента, а восстановление результата использует уже сохранённые матрицы и преобразование.
Валидация и работа без GUI
FEMesh проверяет открытие файла, порядок секций, число полей, конечность чисел, номера узлов, свойства элементов, типы нагрузок и запрет смешанной сетки. onCleanup закрывает файл и при ошибке. Сообщение парсера содержит имя файла и строку; полный контракт приведён в главе 10.
По умолчанию verbose=false и plotting=false. Поэтому создание задачи и все три расчёта работают локально в терминале без графического дисплея. Отрисовка сетки и истории — отдельные действия; axis equal не искажает геометрию сетки.
octave --no-gui --quiet --eval "addpath(pwd); setup; run_octave_tests;"
Порядок проверки
run_octave_smoke_testsчитает поставляемые задачи, проверяет разреженную сборку и запускает доступные виды анализа.run_verification_testsпроверяет элементные и глобальные инварианты, независимые формулы, реакции, нагрузки и порядок вызовов.- Специализированные файлы проверяют матрицы элементов, сборку, модальный пример Mario Paz, Ньюмарка, усилия и ввод.
- Лабораторные справочника добавляют учебные, но исполняемые проверки реального производственного кода.
Матрицы, частоты и формы Illustrative Example 11.1 из Mario Paz и William Leigh восстановлены и проверяются отдельным тестом. Старые снимки вывода и расхождение с ANSYS по-прежнему не объявлены оракулами: эталонами служат опубликованный пример, аналитические решения и явно записанные инварианты.
Версии 2017 года и текущая программа
Статьи автора фиксируют происхождение проекта, но описывают MATLAB-архитектуру своего времени. Их имена классов, точки останова, порядок изменения матриц и численные расхождения нельзя переносить в текущую инструкцию.
| Исторический материал | Что он фиксирует | Текущий эквивалент |
|---|---|---|
| «МКЭ‑Ф — метод Ньюмарка», v0.4 | Переход к методу Ньюмарка и старый MATLAB-вызов переходного расчёта. | solveTransient, начальные условия, полные истории и проверяемая схема β=1/4, γ=1/2. |
| «Матрица масс и матрица жёсткости», v0.6.0 | Типы 112/113, согласованная масса и прежняя иерархия FiniteElementStructural/Beam2DElement/Truss2DElement. | createStructuralElement возвращает структуру; единая триплетная сборка заменяет изменяемые классы и методы Assembler. |
| «Расчёт рамы в МКЭ‑Ф», период v0.6.0 | Происхождение задачи ANSYSBeamStatic01.txt и историческое сравнение с Beam188. | Файл остаётся регрессионным входом, но 5%-ное расхождение старой статьи не считается требуемым результатом. |
Метка «период v0.6.0» для статьи о раме — хронологическая привязка: на следующий день автор прямо назвал актуальную версию v0.6.0. Сама статья о раме номер версии не печатает.
Карта выполненного плана улучшений
Ниже сохранены все отмеченные выполненными пункты прежнего ToDo.md. Для каждого указан действующий код и проверка; где промежуточное решение позже заменено, указан его нынешний эквивалент.
1. Совместимость GNU Octave и локальная проверка
- Минимальная версия GNU Octave 8.4 и локальная проверка на 11.3 указаны в главе о локальном запуске; точка проверки —
run_octave_tests.m. - Команда без графического интерфейса реализована в
run_octave_smoke_tests.mи запускается разработчиком локально. - Все поставляемые задачи собираются, а статика, моды, импульс и гармоника запускаются в
run_octave_smoke_tests.m; матричные инварианты повторяются вtests/run_verification_tests.m. - Промежуточные конкретные резервные методы старого абстрактного класса позже заменены структурами в
createStructuralElement.m; интерфейс проверяетtests/test_element_matrices.m. - Проверка массивов однородных элементов handle-классов стала неактуальна после перехода на структуры; их массив создаёт
FEMesh.mи проверяет smoke-тест. - Необязательные печать и графика реализованы в
StructFEProblem.m; значения по умолчанию проверяетtests/test_input_validation.m. - UTF‑8 закреплён в
.editorconfig; чтение русских файлов фактически проходит во всех smoke-тестах. - Поддерживаемые Octave операции и повторное решение сосредоточены в
solveTransient.mиvalidateReducedSystem.m; их проверяетtests/test_newmark_transient.m. - Небольшая функция локального запуска —
run_octave_smoke_tests.m; успешное завершение является самой проверкой. - Одноаргументный конструктор сохранён в
StructFEProblem.m, а настройки работы без графического интерфейса проверены вtests/test_input_validation.m.
2. Самодостаточная проверочная база
- Набор проверок только для Octave находится в
tests/run_verification_tests.mи включён черезrun_octave_tests.m. - Размеры, конечность, симметрия K/M проверяет
testMatrixInvariantsв том же файле иtests/test_element_matrices.m. - Формулы FL/(EA) и PL³/(3EI) проверяют
testSingleAxialTrussиtestCantileverBeam. - Реакции, масса, одношаговый импульс и гармонические отсчёты проверяет
tests/run_verification_tests.m. - Все поставляемые файлы служат регрессионными проверками отсутствия аварий в
run_octave_smoke_tests.m. - Явные абсолютные и относительные допуски реализуют вспомогательные функции
assertCloseиassertRelativeSmallв тестах. - Полный локальный набор запускается через
run_octave_tests.m. - Пример Mario Paz проверяется по опубликованным матрицам, частотам и формам в
tests/test_mario_paz_modal.m; пример ANSYS остаётся только сведением о происхождении проекта.
3. Матрицы элементов
- Симметричный коэффициент
-22*Lсогласованной массы рамного элемента находится вcreateStructuralElement.m; симметрию проверяетtests/test_element_matrices.m. - Коэффициенты EA/L, 12EI/L³, 6EI/L² записаны напрямую там же и сравниваются с независимой матрицей в том же тесте.
- Нулевая длина и неположительные A, E, ρ, I отклоняются в
createStructuralElement.m;testInvalidElementDataпроверяет ошибки. - Горизонтальная, вертикальная и наклонная ориентации проверяются функциями
testTrussOrientationsиtestBeamOrientations. - Симметрия, ранг, твёрдые моды, инвариантность поворота и масса проверяются в
tests/test_element_matrices.m.
4. Функциональное ядро
- Модель отделяет данные от ответа в
createAnalysisModel.m;testFunctionalAnalysisCoreпроверяет неизменность. - Чистые точки входа —
solveStatic.m,solveModal.m,solveTransient.m; фасад делегирует им вStructFEProblem.m. - K и M не редактируются: это явно проверяет
testFunctionalAnalysisCore. - Новые нагрузки для каждого запуска создают
buildStaticLoad.mиbuildTransientLoad.m; повторные вызовы сравнивает тот же тест. - Два одинаковых запуска сравниваются в
testFunctionalAnalysisCore. - Независимость от порядка статики, мод и динамики проверяется там же.
- Именованные поля формируют три
solve*.m; наличие ключевых полей проверяет тот же тест. - Построение графика вынесено в
plotTransientResult.m, печать оставлена фасаду; работу без графического интерфейса проверяют smoke-тест иtests/test_input_validation.m.
5. Редукция свободных СС
fixedDOFsиfreeDOFsстроитpartitionDOFs.m; карту проверяетtestFreeDOFReduction.- Редуцированные K и M используют три решателя; соответствующие срезы проверяются в
tests/run_verification_tests.m. - Фиктивные нулевые моды устранены в
solveModal.m; положительность частот проверяетtestFreeDOFReduction. - Нагрузка на закреплённой СС сохраняется в
solveStatic.m; реакцию проверяет тот же тест. - Глобальное равновесие вычисляет
calculateStaticEquilibrium.m; bar/cantilever tests проверяют нулевую невязку. - Повторные, неверные и недостаточные связи отклоняют
partitionDOFs.mиvalidateReducedSystem.m; ошибки проверяетtestConstraintValidation.
6. Семантика узловых нагрузок
- Индексную сборку по СС выполняет
getNodalLoadComponents.mвместе с функциями построения нагрузок; несколько записей проверяетtestNodalLoadSemantics. - Третья компонента рамы трактуется как Mz, а у фермы отклоняется; код и тест те же.
- Исторический тип 10 даёт один прямоугольный шаг в
buildTransientLoad.m; точный отсчёт проверяетtestNodalLoadSemantics. - Явный
bcforce_pulse/тип 12 читаетFEMesh.m; входной файлCaseExplicitPulseBeam.txtпроверяется в тесте нагрузок. bcforce_step/тип 13 реализован теми же файлами; входной файлCaseStepBeam.txtпроверяет постоянную историю.- Суммирование нескольких нагрузок в одном и разных узлах проверяет
testNodalLoadSemantics.
7. Переходный расчёт Ньюмарка
- Средние ускорения β=1/4, γ=1/2 реализованы в
solveTransient.m; параметры проверяетtests/test_newmark_transient.m. - Сетка с первым столбцом t=0 реализована там же и проверяется в
testFreeVibrationAndInitialState. - Начальные u, v и ускорение из равновесия реализованы там же; проверяются тем же тестом и сценариями ошибочного ввода.
- Истории размера
stepCount+1предвыделяются вsolveTransient.m; размер проверяет тест переходного анализа. - Постоянная эффективная матрица факторизуется один раз там же; согласованность ответа проверяет весь набор тестов переходного расчёта.
- FFT и одностороннюю нормировку выполняет
computeSingleSidedSpectrum.m; пик проверяетtestSingleSidedSpectrum. - Истории и спектр возвращаются независимо от графики; поля проверяют тесты переходного анализа, построение вынесено в
plotTransientResult.m. - Аналитический SDOF, энергия и сходимость проверяются в
testFreeVibrationAndInitialState,testImpulseResponseAndConvergenceиtestBeamImpulseRefinement.
8. Восстановление результатов
- Совместимое имя
StressCalc.mделегирует новой реализацииrecoverElementResults.m; интерфейс проверяетtests/test_result_recovery.m. - Деформацию, напряжение и осевую силу стержня вычисляет
recoverElementResults.m; прямой и повёрнутый стержни проверяются там же. - Локальные концевые усилия рамы возвращает та же функция; эпюры сознательно отложены до появления распределённых нагрузок, а консоль проверяет
testCantileverEndForces. - Одностержневой и консольный эталоны находятся в
tests/test_result_recovery.m.
9. Упрощение и ускорение сборки
- Выбор структур и чистых функций реализован в
createStructuralElement.m; интерфейс проверяют тесты матриц и восстановления результатов. - Пункт о семантике значений классов закрыт удалением изменяемой иерархии; отсутствие элементов handle-классов следует из структур
FEMesh.allMeshElemsи проверяется smoke-тестом. - Единый интерфейс полей используется
assembleGlobalMatrices.mиrecoverElementResults.m; оба пути покрыты отдельными тестами. - Один
element.dofsсоздаётcreateStructuralElement.m; карту и суммирование проверяетtests/test_sparse_assembly.m. - Триплетные sparse-матрицы создаёт
assembleGlobalMatrices.m;testSuppliedCasesAreSparseиtestLargeTrussChainпроверяют результат. - Длина и преобразование кешируются в структуре элемента; тесты матриц и восстановления результатов используют и проверяют эти данные.
- Сохранение базовых результатов контролируют полный набор проверок и smoke-тесты.
10. Ввод, документация и представление
- Цикл чтения до конца файла находится в
FEMesh.m; повторные секции и неизвестный маркер проверяетtests/test_input_validation.m. fopen,onCleanupи номера строк реализованы там же; ошибки открытия и неверные записи проверяет тот же тест.- Повторные опоры и нагрузки дописываются в
FEMesh.m;CaseRepeatedSections.txtпроверяет количество и сумму. - Номера узлов, связность, число свойств и выбор СС графика проверяют
FEMesh.m/StructFEProblem.m; тестовые входные файлы иtestPlotSelectionAndDefaultsпроверяют ошибки. - Смешанные типы отклоняются как
MKEF:UnsupportedMixedMesh;CaseMixedElements.txtпроверяет строку ошибки. - Необязательные графика и печать находятся в
StructFEProblem.m, аaxis equal— вFEMesh.m; значения по умолчанию проверяет тест входных данных. - Единицы, СС, нагрузки, ограничения, источники и команды сохранены в этом справочнике, прежде всего в главе 10; исполняемое подтверждение дают лабораторные и полный набор тестов.
Диагностика расчёта
| Симптом | Вероятная причина | Что проверить |
|---|---|---|
MKEF:SingularStiffness | Механизм, отсоединённый узел или недостаточные опоры. | Связность, длины элементов, fixedDOFs; не «лечите» механизм добавлением единиц в K. |
MKEF:SingularMass или неверная модальная задача | Неположительная/вырожденная редуцированная масса. | ρ, A, I, свободные СС и связность. |
| Неожиданный знак реакции или усилия | Смешаны глобальная и локальная системы либо сила на конструкцию и сила на элемент. | element.transformation, порядок localEndForces и главу 8. |
| Неожиданный динамический импульс | Тип 10 принят за постоянную ступень. | Для явного импульса используйте тип 12, для ступени — тип 13; см. главу 4. |
| Ошибка с именем файла и строкой | Нарушен формат секции. | Сверьте запись с главой 10; не удаляйте номер строки из отчёта об ошибке. |
Исходный код главы
FEMesh.m— парсер, валидация и данные сетки;createAnalysisModel.mиStructFEProblem.m— граница модели и совместимого фасада;assembleGlobalMatrices.m— разреженная сборка;run_octave_tests.mиtests/run_verification_tests.m— общие точки проверки.
История проекта
- Даниил Денисов, «МКЭ‑Ф — метод Ньюмарка», 25 ноября 2017, версия 0.4.
- Даниил Денисов, «Матрица масс и матрица жёсткости», 20 декабря 2017, версия 0.6.0.
- Даниил Денисов, «Расчёт рамы в МКЭ‑Ф», 19 декабря 2017, период версии 0.6.0.