Входной файл МКЭ‑Ф
Файл — последовательность именованных текстовых секций. Этот раздел полностью заменяет прежнее корневое руководство и соответствует текущему парсеру FEMesh.
1. Область применения
Программа решает линейные задачи малых перемещений в глобальной плоскости X–Y:
- плоские фермы из стержней типа 112;
- плоские рамы Эйлера–Бернулли из элементов типа 113;
- статический, модальный и недемпфированный переходный расчёты.
В одном файле нельзя смешивать типы 112 и 113: у их узлов разное число СС. Поддерживаются статические равномерные и линейные нагрузки на рамы 113. Не реализованы другие элементные нагрузки, ненулевые заданные перемещения, пластичность, геометрическая нелинейность, демпфирование и деформация сдвига рамного элемента.
2. Единицы
Решатель не преобразует единицы. Все величины должны образовывать одну согласованную систему; рекомендуется СИ.
| Величина | Поле | Рекомендуемая единица |
|---|---|---|
| Координаты и поступательные перемещения | X, Y, Z, ux, uy | м |
| Площадь | A | м² |
| Модуль Юнга и напряжение | E, axialStress | Па |
| Плотность | rho | кг/м³ |
| Момент инерции площади | I | м⁴ |
| Силы | Fx, Fy | Н |
| Момент | Mz | Н·м |
| Время и частота | time, frequencyHz | с, Гц |
Координата Z читается для совместимости формата, но расчёт остаётся двумерным. Компонент uz и Fz нет; третья СС рамного узла — поворот thetaZ, а сопряжённая нагрузка — момент Mz.
3. Общие правила синтаксиса
Парсер читает файл до конца. Пустые строки и строки, первый непробельный символ которых #, пропускаются. После обычного маркера секции идёт целое число записей, затем ровно столько непустых строк данных. Необязательная секция analysis является исключением и содержит одну конфигурационную запись.
section_marker
record_count
comma,separated,record
...
Рекомендуемый порядок: analysis, nodes, затем elems_112 или elems_113, затем bcfix и секции нагрузок. Узлы обязаны предшествовать элементам, элементы — опорам и нагрузкам.
| Секция | Можно повторять | Правило |
|---|---|---|
analysis | Нет | Необязательная конфигурация для RunSelected. |
nodes | Нет | Ровно одна непустая секция. |
elems_112 или elems_113 | Да | Записи добавляются; тип во всех секциях должен совпадать. |
bcfix | Да | Записи добавляются; допустимо ноль записей. |
Любая bcforce_* | Да | Записи всех секций добавляются и при построении нагрузки суммируются. |
Поля внутри записи разделяются запятыми; пробелы около значения допустимы. Количество полей проверяется строго. Числа должны быть конечными, а идентификаторы и количества — целыми там, где это требуется.
3.1. Конфигурация расчёта
analysis
static
analysis
modal
analysis
transient,timeStep,duration,monitorNode,monitorDOF
Секция необязательна для обратной совместимости и может появиться только один раз. Для переходного расчёта шаг времени положителен, длительность покрывает хотя бы один шаг, а контрольный узел и локальная СС находятся в диапазоне модели. RunSelected запускает указанный расчёт; без секции следует использовать прежние явные методы.
Статика допускает узловые нагрузки типа 10 и равномерные и линейные элементные нагрузки типов 20 и 21, модальный расчёт — ни одной нагрузки, переходный расчёт — типы 10–13. Тип 10 в переходной задаче сохраняет историческую семантику одношагового импульса.
4. Узлы
nodes
<количество узлов>
X,Y,Z
...
Номера назначаются порядком строк: первая запись — узел 1, вторая — узел 2. Каждая строка содержит ровно три конечных числа. Номер узла в файле отдельно не задаётся.
5. Элементы
| Тип | Секция и запись | Узловые СС | Модель |
|---|---|---|---|
| 112 | elems_112112,node1,node2,A,E,rho | [ux,uy] | Плоский ферменный стержень, только осевая сила. |
| 113 | elems_113113,node1,node2,A,E,rho,I | [ux,uy,thetaZ] | Плоская рама Эйлера–Бернулли, согласованная масса. |
node1 и node2 — различные целые номера существующих узлов. A, E, rho, а для типа 113 и I должны быть положительными конечными числами. Совпадающие координаты концов также отклоняются как нулевая длина.
После первого типа элемента число СС на узел уже определено. Встреча другого типа завершает чтение ошибкой MKEF:UnsupportedMixedMesh; автоматического согласования ферменного и рамного узла нет.
6. Опоры
bcfix
<количество записей>
type,node,0,0,0
type | Свободно | Закреплено |
|---|---|---|
| 1 | — | Все СС узла |
| 2 | Только ux | uy и thetaZ у рамы |
| 3 | Только uy | ux и thetaZ у рамы |
| 4 | thetaZ у рамы | ux, uy |
У ферменного узла тип 4 совпадает с полным закреплением, поскольку поворотной СС нет. Последние три поля зарезервированы и обязаны равняться нулю: ненулевые заданные перемещения не поддерживаются. Если две записи закрепляют одну глобальную СС повторно, partitionDOFs сообщает MKEF:DuplicateConstraint.
7. Узловые нагрузки
У фермы используются [Fx,Fy], у рамы — [Fx,Fy,Mz]. Поле Mz в ферменной записи всё равно присутствует и должно быть нулём.
| Секция / тип | Запись | RunStatic | RunTransient |
|---|---|---|---|
bcforce_stat / 10 | 10,node,Fx,Fy,Mz | Постоянная статическая нагрузка. | Исторически совместимый прямоугольный импульс только при t=dt; дискретный импульс F0·dt. |
bcforce_harm / 11 | 11,node,Fx,Fy,Mz,frequencyHz | Не поддерживается. | F(t)=F0·sin(2πft); f строго положительна. |
bcforce_pulse / 12 | 12,node,Fx,Fy,Mz | Не поддерживается. | Явный одношаговый импульс при t=dt. |
bcforce_step / 13 | 13,node,Fx,Fy,Mz | Не поддерживается. | Постоянная ступень во всех столбцах, включая t=0. |
Повторные секции, нагрузки в одном узле и нагрузки, попавшие в одну глобальную СС, суммируются. В одной модели можно прочитать разные временные типы, но выбранный решатель обязан их поддерживать: RunStatic принимает только тип 10 и иначе выдаёт MKEF:TimeDependentLoadInStaticAnalysis.
8. Полный пример рамы
# Консоль длиной 0,5 м с силой +100 Н по Y
nodes
2
0,0,0
0.5,0,0
elems_113
1
113,1,2,0.0001,2e11,7800,0.33e-8
bcfix
1
1,1,0,0,0
bcforce_stat
1
10,2,0,100,0
Эквивалентный файл находится в каталоге примеров как examples/cases/Case1ElementBeam.txt. Запуск:
problem = StructFEProblem(fullfile( ...
"examples", "cases", "Case1ElementBeam.txt"));
result = problem.RunStatic();
result.displacements
result.reactions
result.elementResults(1).localEndForces
По умолчанию графика и диагностическая печать выключены. Их можно включить явно:
options = struct("verbose", true, "plotting", true);
problem = StructFEProblem(fullfile( ...
"examples", "cases", "Case1ElementBeam.txt"), options);
9. Аннотированный переходный пример
Наиболее содержательный компактный файл в каталоге примеров — CasePreprocessorTransient.txt. Он показывает конфигурацию расчёта, узлы, рамные элементы, два типа закрепления и гармоническую нагрузку. Комментарии ниже входят в сам файл и безопасны для парсера:
# Вид расчёта задаётся во входном файле и используется методом RunSelected().
analysis
# transient,timeStep,duration,monitorNode,monitorDOF
# Шаг 0.0001 с, длительность 0.001 с; контролируется uy (локальная СС 2) узла 3.
transient,0.0001,0.001,3,2
# Узлы нумеруются порядком строк. Формат каждой записи: X,Y,Z.
nodes
3
# Узел 1: левый конец балки.
0,0,0
# Узел 2: середина балки.
1,0,0
# Узел 3: правый конец балки.
2,0,0
# Два рамных элемента Эйлера–Бернулли типа 113.
# Формат: 113,node1,node2,A,E,rho,I.
elems_113
2
# Элемент 1 соединяет узлы 1 и 2.
113,1,2,0.0004,2e11,7800,5.33e-8
# Элемент 2 соединяет узлы 2 и 3; свойства совпадают с элементом 1.
113,2,3,0.0004,2e11,7800,5.33e-8
# Граничные условия. Формат: type,node,0,0,0.
bcfix
2
# Тип 1: в узле 1 закреплены ux, uy и thetaZ.
1,1,0,0,0
# Тип 4: в узле 2 закреплены ux и uy, а thetaZ остаётся свободной.
4,2,0,0,0
# Гармоническая узловая нагрузка типа 11.
# Формат: 11,node,Fx,Fy,Mz,frequencyHz.
bcforce_harm
1
# В узле 3 действует Fy(t) = -1000*sin(2*pi*135*t) Н.
11,3,0,-1000,0,135
| Фрагмент | Как его интерпретирует программа |
|---|---|
transient,0.0001,0.001,3,2 | Метод Ньюмарка делает 10 шагов по 0,0001 с и формирует 11 состояний вместе с t=0. Для графика и спектра выбирается uy узла 3. |
Три строки после nodes | Создают узлы 1–3 на оси X. Отдельных идентификаторов в записи нет: номер равен позиции строки. |
113,1,2,… и 113,2,3,… | Создают два рамных элемента с площадью 0,0004 м², модулем Юнга 2·10¹¹ Па, плотностью 7800 кг/м³ и моментом инерции 5,33·10⁻⁸ м⁴. |
1,1,0,0,0 | Полная заделка узла 1: закреплены ux, uy и thetaZ. |
4,2,0,0,0 | В узле 2 закреплены обе поступательные СС, но оставлен свободным поворот thetaZ. |
11,3,0,-1000,0,135 | К узлу 3 приложена гармоническая сила по отрицательному направлению Y с амплитудой 1000 Н и частотой 135 Гц. |
Парсер пропускает пустые строки и строки, у которых первый непробельный символ — #. Поэтому после nodes число 3 означает три строки координат, хотя между ними находятся пояснения. Комментарий должен занимать отдельную строку: комментарии в конце числовой записи форматом не предусмотрены.
Файл можно выполнить без передачи параметров анализа из кода:
addpath(pwd);
setup;
problem = StructFEProblem(fullfile( ...
"examples", "cases", "CasePreprocessorTransient.txt"));
result = problem.RunSelected();
result.time
result.displacements
result.spectrumFrequencyHz
result.displacementAmplitudeSpectrum
10. Модальный и переходный расчёты
problem = StructFEProblem(fullfile( ...
"examples", "cases", "CaseBeam.txt"));
modalResult = problem.RunModal();
modalResult.frequenciesHz
problem = StructFEProblem(fullfile( ...
"examples", "cases", "CaseBeamDyn.txt"));
dynamicResult = problem.RunTransient(1e-4, 1e-2, 3, 2);
Последние два аргумента — узел 3 и локальная СС 2 (uy) для необязательного графика. Их целочисленность и диапазон проверяются даже при plotting=false. При включённой графике строятся перемещение и односторонний амплитудный спектр выбранной СС.
Все истории используют сетку t = 0, dt, …, N·dt, где N=fix(duration/dt). Первый столбец соответствует t=0, последний — фактическому N·dt; число столбцов равно N+1.
initial = struct( ...
"initialDisplacement", u0, ...
"initialVelocity", v0);
dynamicResult = problem.RunTransient(1e-4, 1e-2, 3, 2, initial);
Векторы u0 и v0 имеют полный размер модели и нули на закреплённых СС. Начальное ускорение вычисляется из равновесия. Интегрирование использует метод средних ускорений Ньюмарка с β=1/4 и γ=1/2.
Если файл содержит секцию analysis, тот же расчёт запускается как result = problem.RunSelected(). Настроенный переходный запуск использует нулевые начальные перемещения и скорости.
Выполните из корня репозитория docker compose up --build (или docker-compose up --build), откройте http://127.0.0.1:8080/preprocessor/ и загрузите TXT-файл кнопкой Open TXT. Для старого файла без секции analysis сначала выберите вид расчёта и, при необходимости, параметры переходного процесса. Кнопка Run analysis сериализует проверенную модель, вызывает RunSelected() в контейнере Octave и открывает результат без ручного переноса файлов.
11. Результаты и проверки
| Расчёт | Ключевые поля ответа |
|---|---|
RunStatic | displacements, reactions, equilibriumResidual, elementResults, полная нагрузка и списки СС. |
RunModal | frequenciesHz, полные modeShapes с нулями на опорах и редуцированные матрицы. |
RunTransient | time, loadHistory, displacements, velocities, accelerations, reactions, spectrum. |
В результатах стержня положительные axialStrain, axialStress и axialForce означают растяжение. У рамы localEndForces упорядочен как [N1,V1,M1,N2,V2,M2].
octave --no-gui --quiet --eval "addpath(pwd); setup; run_octave_tests;"
12. Диагностика входа
Ошибка чтения имеет вид identifier: filename:line: detail. Основные идентификаторы:
| Идентификатор | Причина |
|---|---|
MKEF:InputFileOpenFailed | Файл не найден, недоступен или не может быть открыт. |
MKEF:UnknownInputMarker | Неизвестное имя секции или опечатка. |
MKEF:InputSectionOrder | Элемент встретился до узлов либо опора/нагрузка — до элементов. |
MKEF:DuplicateInputSection | Повторена секция nodes или analysis. |
MKEF:MalformedInput | Неверное число полей, нечисловое/бесконечное значение, тип записи, узел, частота или свойства. |
MKEF:UnexpectedEndOfFile | Объявленное число записей больше фактического. |
MKEF:IncompleteInput | Нет узлов или элементов. |
MKEF:UnsupportedMixedMesh | В одном файле встретились типы 112 и 113. |
MKEF:UnsupportedConstraintValue | В последних трёх полях bcfix есть ненулевое заданное перемещение. |
MKEF:UnsupportedLoadComponent | Для ферменного узла задан ненулевой Mz. |
MKEF:AnalysisLoadMismatch | Тип нагрузки несовместим с настроенным видом расчёта. |
MKEF:MissingAnalysisConfiguration | RunSelected вызван для старого файла без секции analysis. |
Сначала откройте указанную строку файла, затем проверьте маркер, число записей и точное количество полей. Если парсер прошёл, но решатель сообщил сингулярность, проверяйте уже не синтаксис, а связность и достаточность опор.
13. Код, тесты и источники
FEMesh.m— единственный действующий контракт синтаксического разбора;preprocessor/index.html— автономный редактор с координатной сеткой, точным вводом узлов и каноническим экспортом файлов этого формата;tests/test_input_validation.m— повторные секции, неверные записи, смешанная сетка, неизвестный маркер, открытие и выбор графика;CaseRepeatedSections.txt— исполняемый пример повторных секций;- Henri P. Gavin, Numerical Integration in Structural Dynamics — внешний материал по схеме Ньюмарка;
- Mario Paz, William Leigh, Structural Dynamics: Theory and Computation, 5-е изд., 2004, DOI 10.1007/978-1-4615-0481-8 — источник геометрии, матриц, частот и форм
CaseFig11.7p363 MarioPaz.txt, проверяемых вtests/test_mario_paz_modal.m.
Равномерные элементные нагрузки
Для статического расчёта рам 113 добавьте после элементов секцию eload_uniform. После количества записей каждая строка имеет вид 20,elementId,coordinateSystem,qx,qy. Система 1 — локальная, 2 — глобальная XY; интенсивность задаётся на единицу фактической длины элемента. Локальная ось x направлена от первого узла ко второму, y повёрнута от неё на +90°.
eload_uniform
1
20,1,2,0,-1000
Секции можно повторять; нагрузки на один элемент суммируются. Все числа должны быть конечными; обе нулевые компоненты, отсутствующий элемент, элемент 112 и анализ modal/transient отклоняются. Задать одновременно узловую силу или момент можно обычной секцией bcforce_stat.
Пример: консоль длиной 2 м под qY = −1000 Н/м. Реакции: Fy = 2000 Н, Mz = 2000 Н·м; прогиб свободного конца −0,001 м, поворот −0,000666667 рад.
Редактирование и удаление в препроцессоре
Выберите рамный элемент и нажмите Add element load. Таблица Element loads содержит систему координат и компоненты. Переключение Local/Global пересчитывает компоненты, сохраняя направление нагрузки.
Любая фактическая правка концов, A, E, rho или I элемента удаляет его распределённые нагрузки. Изменение координат узла снимает распределённые нагрузки всех примыкающих элементов, сохраняя узловые нагрузки и закрепления. Повторный ввод прежнего значения ничего не удаляет.
Удаление узла каскадно удаляет его элементы, их распределённые нагрузки и условия самого узла. Остальные узлы остаются, номера ссылок обновляются. Удаление элемента не удаляет его узлы. Одно Undo восстанавливает всю операцию. Удалённый узел наблюдения transient необходимо выбрать заново.
Линейное распределение
Добавьте после элементов повторяемую секцию eload_linear: число записей и строки 21,elementId,coordinateSystem,qx1,qy1,qx2,qy2. Например:
eload_linear
1
21,1,2,0,-300,0,-900
На элементе 1 глобальная qY меняется от −300 у узла 1 элемента до −900 у узла 2. Нулевые компоненты одного конца дают треугольник. Компоненты должны быть конечными; запрещена только полностью нулевая запись. Действуют те же ограничения: статика, рама 113, вся длина элемента. Для частичной нагрузки разбейте стержень на элементы. Можно смешивать и повторять оба блока; нагрузки суммируются.
В таблице Element loads выберите Uniform или Linear. Линейный режим показывает четыре поля с номерами концевых узлов. Переход к Linear копирует равномерные значения на оба конца; обратный переход берёт средние. Переключение осей преобразует оба концевых вектора. Результаты с типом 21 используют JSON v5; старые задачи сохраняют версии v1–v4.
Примеры: трапеция, треугольник, с шарнирами, с MPC.
SPC: ux, uy, thetaZ
Опоры хранятся как маски fixUx/fixUy/fixThetaZ. Типы 1–4 сохраняют прежний смысл; новые типы: 5 — только ux, 6 — только uy, 7 — только thetaZ. Для фермы тип 7 запрещён, а экспорт использует только типы 1, 3 и 2. При смене семейства маски сохраняются; перед переходом к ферме нужно убрать thetaZ. Повторы диагностируются по узлу и СС.
MPC
Повторяемая секция mpc содержит число уравнений и строки depNode,depDOF,rhs,masterCount,node,dof,coefficient,... . Коды СС: 1=ux, 2=uy, 3=thetaZ. rhs допускается только 0. Пример ниже задаёт uy(3)=0.5uy(1)+0.5uy(2). Номера уравнений следуют порядку записи во всех секциях. Диагностика указывает номер уравнения и исходную строку.
mpc
1
3,2,0,2,1,2,0.5,2,2,0.5Подробное описание MPC · JSON v3 · CaseMPCFrame.txt · CaseMPCTruss.txt
Концевые освобождения Mz
После элементов допускается повторяемая секция releases: число записей и строки elementId,end,Mz, где end равен 1 или 2. Компоненты N/V, дубликаты и освобождения фермы не поддерживаются. Редактор пишет одну секцию в порядке элемент/конец. Смена освобождения сохраняет распределённую нагрузку; удаление элемента удаляет его освобождения.
JSON v4 · CaseReleaseStatic · CaseReleaseModal · CaseReleaseTransient
Каталог сечений
В препроцессоре откройте «Sections», создайте именованное сечение и задайте размеры в единицах длины модели. Доступны прямоугольник (b, h), сплошной круг (d), швеллер, тавр и двутавр (b, h, tw, tf). Скругления и уклоны полок не учитываются; уголок не поддерживается.
Кнопка «Assign section» рядом с «Add element load» включает режим назначения сечений. Выберите сечение и ориентацию в боковой панели, затем нажимайте на элементы схемы. Режим остаётся активным для последовательного назначения; Esc возвращает к «Select / pan». «Manage sections» открывает каталог. Выбор режима и его настроек не меняет модель до нажатия на элемент. Также можно выбрать элемент на схеме и нажать «Assign to selected element» в карточке сечения. Список «Assigned to» показывает назначения. Также в таблице элементов можно выбрать сечение и поворот 0°, 90°, 180° или 270°. Площадь A и рабочий момент инерции I вычисляются автоматически; E и плотность остаются свойствами элемента. Изменение сечения обновляет все его назначения и сохраняет нагрузки. После изменений запустите расчёт заново. Undo/redo восстанавливает каталог и назначения. Снятие назначения оставляет текущие A и I для ручного редактирования; удалить используемое сечение нельзя.
sections
1
{"id":1,"name":"Прямоугольник","type":"rectangle","dimensions":{"b":0.1,"h":0.2}}
element_sections
1
1,1,90Каждая строка каталога — JSON; назначение — elementId,sectionId,angle. Блоки необязательны и могут повторяться после элементов. Идентификаторы сечений уникальны, элемент имеет не более одного назначения. Характеристики из геометрии заменяют A/I числовой записи элемента до сборки матриц. Для тавра tf < h, для двутавра и швеллера 2tf < h; всегда tw < b.