Вопросы по API Gmsh Python

Я пытаюсь написать скрипт, который будет автоматически объединять геометрии для анализа CFD с помощью API-интерфейса Gmsh Python. Есть несколько проблем, с которыми я сталкиваюсь:

Прежде всего, я хотел бы иметь возможность писать файлы сценариев Gmsh (.geo) для целей отладки. Я просмотрел исходный код API-интерфейса Gmsh и обнаружил, что расширение .geo_unrolled поддерживается для gmsh.write() функция, но не только .geo. Это расширение в основном работает, но кажется, что любые операции создания сетки (например, помечать кривые как трансфинитные) или преобразования (такие как расширение) не записываются в выходной файл при использовании gmsh.write('test.geo_unrolled'), Я предполагаю, что это как-то связано с _unrolled частью. Но есть ли способ получить полный скрипт Gmsh из API?

Во-вторых, когда я пытаюсь сделать копию сплайна, как в этом примере:

p1 = gmsh.model.geo.addPoint(-1, 0.5, 0, 0.1)
p2 = gmsh.model.geo.addPoint(0, 1, 0, 0.1)
p3 = gmsh.model.geo.addPoint(1, 0.5, 0, 0.1)
s1 = gmsh.model.geo.addSpline([p1, p2, p3])
s2 = gmsh.model.geo.copy([s1])

я получил ValueError: ('gmshModelGeoCopy returned non-zero error code: ', 1), Код ошибки, 1, кажется, указывает на то, что тег исходного сплайна (s1) не может быть найден, когда copy() называется. Я что-то здесь упускаю? Я пытался, например, позвонить gmsh.model.geo.synchronize() прежде чем пытаться позвонить copy(), но это не имело никакого эффекта.

Наконец, когда я использую преобразование расширения в графическом интерфейсе Gmsh, используя Модули - Геометрия - Элементарные сущности - Преобразование - Масштаб, отмечая опцию Применить масштабирование при копировании в диалоговом окне, на приведенном выше примере сплайна, я действительно получаю масштабированную версию кривая, как и ожидалось, включая три точки. Предполагая, что я смог сделать то же самое с помощью API, как мне затем обратиться к трем новым точкам, через которые проходит масштабированный сплайн, например, если я хочу провести линию между начальной точкой исходного сплайна и точкой масштабированный сплайн?

В конце я хочу сделать следующее: нарисовать сплайн через список точек, создать масштабированную копию этого сплайна, нарисовать линии между начальной и конечной точками и создать плоскую поверхность, ограниченную двумя сплайнами, и линий. Есть ли лучший способ сделать это, чем то, что я пытаюсь сделать с дилатацией?

0 ответов

Возможно, уже слишком поздно, но никогда не знаешь.

Мне никогда не приходилось создавать файлы.geo с помощью API. Но я нашел это обсуждение в архиве списка рассылки Gmsh, что может быть полезно.

Что касается вашей ошибки с copy, вы должны указать размер копируемого объекта, а не только тег (см. документацию, которая относится кdimTag). То же самое и с преобразованиями, такими какrotate, symmetrize и т. д. Использование следующего должно работать:

s2 = gmsh.model.geo.copy([(1, s1)])

NB: при копировании только одной сущности я думаю, что либо внутренние круглые скобки, либо скобки излишни, а в противном случае вам нужно предоставить список кортежей формы [(dim_1, tag_1), (dim_2, tag_2), ..., (dim_n, tag_n)].

Имейте в виду, что copyвернет переменную того же типа (список кортежей), т.е. в вашем случае переменнаяs2 будет [(1, tag_s2)]. Поэтому вы можете не захотеть использовать одно и то же имя переменной, так как для получения тега вам придется использоватьs2[0][1] вместо просто s2.

Здесь у вас есть частичный ответ на следующий вопрос, поскольку теги скопированных объектов будут содержаться в вашей возвращаемой переменной.

Надеюсь, что это поможет вам или другим!

Другие вопросы по тегам