Содержание ↓
Глава 10

Входной файл МКЭ‑Ф

Файл — последовательность именованных текстовых секций. Этот раздел полностью заменяет прежнее корневое руководство и соответствует текущему парсеру 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. Элементы

ТипСекция и записьУзловые ССМодель
112elems_112
112,node1,node2,A,E,rho
[ux,uy]Плоский ферменный стержень, только осевая сила.
113elems_113
113,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Только uxuy и thetaZ у рамы
3Только uyux и thetaZ у рамы
4thetaZ у рамыux, uy

У ферменного узла тип 4 совпадает с полным закреплением, поскольку поворотной СС нет. Последние три поля зарезервированы и обязаны равняться нулю: ненулевые заданные перемещения не поддерживаются. Если две записи закрепляют одну глобальную СС повторно, partitionDOFs сообщает MKEF:DuplicateConstraint.

7. Узловые нагрузки

У фермы используются [Fx,Fy], у рамы — [Fx,Fy,Mz]. Поле Mz в ферменной записи всё равно присутствует и должно быть нулём.

Секция / типЗаписьRunStaticRunTransient
bcforce_stat / 1010,node,Fx,Fy,MzПостоянная статическая нагрузка.Исторически совместимый прямоугольный импульс только при t=dt; дискретный импульс F0·dt.
bcforce_harm / 1111,node,Fx,Fy,Mz,frequencyHzНе поддерживается.F(t)=F0·sin(2πft); f строго положительна.
bcforce_pulse / 1212,node,Fx,Fy,MzНе поддерживается.Явный одношаговый импульс при t=dt.
bcforce_step / 1313,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(). Настроенный переходный запуск использует нулевые начальные перемещения и скорости.

Запуск файла через GUI

Выполните из корня репозитория docker compose up --build (или docker-compose up --build), откройте http://127.0.0.1:8080/preprocessor/ и загрузите TXT-файл кнопкой Open TXT. Для старого файла без секции analysis сначала выберите вид расчёта и, при необходимости, параметры переходного процесса. Кнопка Run analysis сериализует проверенную модель, вызывает RunSelected() в контейнере Octave и открывает результат без ручного переноса файлов.

11. Результаты и проверки

РасчётКлючевые поля ответа
RunStaticdisplacements, reactions, equilibriumResidual, elementResults, полная нагрузка и списки СС.
RunModalfrequenciesHz, полные modeShapes с нулями на опорах и редуцированные матрицы.
RunTransienttime, 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:MissingAnalysisConfigurationRunSelected вызван для старого файла без секции 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. Повторы диагностируются по узлу и СС.

CaseRollerFrame.txt

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

Подробное описание: глава 4b

После элементов допускается повторяемая секция 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.

Полное описание формата v6 · Контрольная балка