Олег Бутин, ведущий математик-программист, НТЦ «АПМ», делится опытом использования геометрического ядра C3D Modeler при построении расчетных моделей специалистами научно-технического центра «АПМ», который является ведущим российским разработчиком и поставщиком ПО для инженерных расчетов, а также партнером компании АСКОН по консорциуму «РазвИТие».
Компания НТЦ «АПМ» более 30 лет присутствует на рынке и специализируется на разработке CAE-систем для строительства, машиностроения, приборостроения и смежных областей. Центр осуществляет полный цикл работы с моделями от создания до анализа, а также выполняет расчеты на заказ. Линейка продуктов компании «АПМ» состоит из APM WinMachine (CAE-система автоматизированного расчета и проектирования механического оборудования и конструкций), APM FEM (плагин, встраиваемый в КОМПАС-3D для выполнения пространственного анализа) и APM Civil Engineering (предназначен для создания моделей конструкций, выполнения необходимых расчетов и визуализации полученных результатов преимущественно в строительной отрасли).
Примеры, о которых пойдет речь, получены в процессе эксплуатации продукта, который называется APM Studio и входит в пакет APM WinMachine.
Он предназначен для моделирования физических процессов, для прочностных расчетов деталей машин, механизмов, а также для их конструирования. Из этого следует, что в продукте есть собственный редактор, который позволяет создавать ряд моделей с нуля. Здесь мы подключаем первый блок функциональности C3D для создания двумерных и трехмерных объектов, которые используем для наших моделей. Инструментарий C3D-ядра необходим для создания кривых, поверхностей, выдавливания, вращения, копирования объектов, выполнения булевых операций над объектами и т. д.
После того как модель создана или импортирована из другой системы, наивно полагать, что для достижения положительного результата будет достаточно нажать кнопку «Создать расчетную модель» или «Построить расчетную сетку».
На иллюстрации показано, к чему может привести такой подход. Его итогом стала сетка с некими странными артефактами, которые можно наблюдать на слайде слева. Разобравшись, становится очевидно, что у модели каким-то образом появилось короткое ребро, которое стало виной неутешительного исхода. Именно в этом случае мы обращаемся к ядру C3D Modeler, а именно к функции EdgeModifiedSolid. Учитывая простоту топологии модели, функция успешно справляется с поставленной задачей, и на слайде справа видно, что артефакт исчез, а сетка стала более равномерной.
Аналогично можно проиллюстрировать применение функции FaceModifiedSolid уже для поверхностей. На слайде слева представлена некая деталь, в которой
есть множество мелких отверстий. Если строить сетку напрямую на этой модели, то сетка включит множество мелких элементов вокруг отверстий. Если они не нужны для целей моделирования, то можно убрать их с помощью функции FaceModifiedSolid. Сетка станет более равномерной, она будет содержать существенно меньше элементов, и это повысит эффективность нашей работы.
Функцию FaceModifiedSolid мы используем для удаления фасок, скруглений на моделях, которые не существенны для наших расчетов. На иллюстрации слева модель имеет некие фаски, включая связанные цепочки фасок, которые, как правило, сложнее для анализа. Справа продемонстрирован результат успешного выполнения операции по удалению этих фасок. Соответственно, моделирование приобретает более рациональный характер.
Похожим образом можно проиллюстрировать удаление мелких деталей, мелких объектов. Примером служит гравировка на детали, которую конструктор выполнил, но которая для цели прочностного расчета кажется несущественной. FaceModifiedSolid отлично справилась с удалением таких мелких объектов с учетом сложности представленной топологии.
Следующий пример функциональности ядра, которую мы используем, заключается в преобразовании твердотельных моделей в поверхностные. Создавая модели, конструктор обычно строит их как твердые тела, исходя из эстетических соображений и необходимости отображения технологического процесса. Однако для расчетчиков такая информация зачастую бывает избыточной и даже вредной. Причина проста: если напрямую солидную модель представлять в виде расчетной сетки, то сетка будет иметь неоправданно много элементов. Расчет серьезно усложнится и, возможно, даже утратит исходную точность за счет ограничения решателей. Для преодоления проблемы служит функция ядра MedianShell, которая, как видно на иллюстрации, способна даже разветвленную модель перевести в совокупность малого количества пластин, которые впоследствии можно эффективно моделировать как пластинчатые элементы.
Не секрет, что, когда происходит преобразование солида в набор пластин, между такими пластинами часто появляются зазоры. Нарушаются контакты, которые сложно учесть в виде граничных условий при моделировании. Тогда на помощь приходит функция геометрического ядра ExtensionShell, которая позволяет продлить грани до пересечения с другими частями модели и, соответственно, установить между ними контакт, который можно учитывать в дальнейшем.
Не менее важной является задача выявления контактных поверхностей для последующего учета в расчете. На слайде слева показан пример выявления контакта типа «поверхность-поверхность» с помощью функции FindTouchedFaces, которая показывает грани, находящиеся в контакте с заданной точностью, в том числе с разных солидов. В данном случае были найдены малиновая и оранжевая грани. Устанавливая контакт между ними в ограниченных условиях, в расчете можно, например, строить совместную сетку для этих деталей, несмотря на то что изначально это были разные солиды. Эта опция повышает удобство и востребована расчетчиками.
При поиске контакта «ребро-поверхность» или контакта между ребрами мы пользуемся функциями, которые анализируют близость геометрических объектов, например расстояние от кривой до поверхности.
Полезной для нас оказалась и функция MassInertiaProperties. Часто поведение какой-то конкретной части модели не важно для анализа модели в целом. Не требуется переводить ее в расчетную модель, аппроксимировать конечными элементами — достаточно просто учесть ее как некое абсолютно твердое тело или даже точечную массу. В этом случае у нас есть возможность указать ядру получение для такой детали ее массово-инерционных характеристик, после чего мы ее просто учитываем. Не строим для нее сетку, а лишь учитываем ее в нашей расчетной модели как некие граничные условия. Это помогает в работе.
В последнее время мы осваиваем функцию разрезания солидов на части, в частности для построения расчетных сеток, потому что чем проще топология детали, тем более специфические и специализированные методы построения сеток можно на ней использовать. Как следствие, тем лучшего качества будут сетки. На иллюстрации представлено геометрическое тело достаточно сложной формы и топологии. На этом болте нужно построить специфическую сетку, но не ясно, с чего следует начать.
Функция SolidCutting — разрезание солида — позволяет разрезать данный солид либо плоскостью, которая является основанием его шляпки, либо продолжением его рабочей цилиндрической поверхности.
Оценим результат. В первом случаем мы получаем цилиндр и шайбу. Во втором — цилиндр и втулку. Оба варианта нас устраивают, модель фундаментально «упрощена». Мы представили ее в виде двух частей, с которыми в дальнейшем можно работать независимо.
Следуем хронологическому порядку: мы построили модель, удалили артефакты, «упростили» ее, дальше мы начинаем непосредственно построение сеток. Для этого мы аппроксимируем кривые модели их конечным элементом представления — ломаными, затем — поверхности, после строим сетку в объеме. Нами востребован если не полный набор функций, которые даются ядром для работы с кривыми и поверхностями, то большая их часть. Это необходимо и для определения параметров кривых и поверхностей, в частности.
Что касается поверхностей, мы представляем грани модели, их поверхности в виде неких полиномиальных сеток и активно используем функцию работы с поверхностями, получения их параметров.
Распространенная проблема — возникновение различных артефактов. Обычно это касается моделей, импортированных из других CAD-систем, в которых присутствуют разные артефакты геометрии, такие как самопересечения ребер, нестыковки ребер, частично или полностью выраженные контуры на ребрах. Это приводит к тому, что грань может содержать щепкоподобные части — большая часть грани должна быть учтена при построении сетки, а некоторые части вырождаются в линию. Случается, что грань вырождается в линию целиком.
Еще одна распространенная ситуация — пересечения кривых контура (либо в месте гладкой стыковки, либо в месте стыковки под углом).
Нередко приходится сталкиваться с макроскопическими пересечениями в рамках всего контура. Растет потребность в функционале, который позволяет выявлять такие артефакты, подсвечивать их и в дальнейшем «лечить». За «лечение» может отвечать ядро или конвертер, но эти процессы скрыты от построителей расчетной модели. Надеемся, что вместе с развитием функциональности ядра мы также будем двигаться в этом направлении.
Похоже складывается ситуация с гранями. Даже если модель имеет абсолютно правильную топологию и проблемы с математикой поверхностей отсутствуют, все равно периодически появляются расхождения с конструкторами, которые требуют разрешения. Данный функционал востребован пользователями и будет всё более востребован в будущем, а потому мы заинтересованы в совершенствовании процесса «лечения».
Обратимся к иллюстрации. Иногда возникают артефакты, при которых на стыке образуется маленькая грань. С одной стороны, она корректна, но с другой, при помощи имеющихся функций ядра ее невозможно удалить в большинстве случаев. Из этого следует, что либо мы будем искать иные пути применения существующих функций, либо сами функции будут оптимизированы.
На иллюстрации продемонстрированы острые углы в модели, которые также хотелось бы «лечить» заменой нескольких граней на одну.
Еще один частный случай — схождение граней по касательной с углами, стремящимися к нулю. Важно, чтобы встроенный функционал ядра помогал нам избавляться от этого без лишних усилий. Процесс развития ядра в этом направлении уже запущен.
Хотелось бы выразить благодарность разработчикам ядра за его гибкость и широкий набор функций по редактированию моделей, по их «упрощению». В то же время есть ряд пожеланий по его дальнейшему улучшению.
Под расширением понятий «упрощения» подразумевается функционал, который позволяет «сливать» в одну множество гладко стыкующихся граней, под «ремонтом» — автоматизированный поиск подобных мест, под автоматизацией «упрощения» и удаления мелких объектов — их удаление целиком путем одного клика. Пока приходится удалять мелкие объекты по частям, и это приходится делать фрагмент за фрагментом.
Автоматизация при преобразовании тонких деталей в оболочке означает потребность в если не в автоматическом, то в полуавтоматическом распознавании. Эта опция востребована, когда часть модели нужно оставить в виде солидов, а часть — представить в виде пластин. При этом при разрезании необходимо сохранять топологическую связь между исходным солидом и подсолидами, полученными при разрезании. Сейчас мы опираемся на инструмент MbName, но возникают ситуации, когда проследить цепочку соответствия исходной детали и получившихся из нее не представляется возможным. Специалистами C3D Labs уже ведется работа в этом направлении, и мы благодарим разработчиков за то, что они прислушиваются к нашим просьбам и делают ядро всё лучше и лучше.
Олег Бутин,
ведущий математик-программист,
НТЦ «АПМ»