Вопросы по 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
.
Здесь у вас есть частичный ответ на следующий вопрос, поскольку теги скопированных объектов будут содержаться в вашей возвращаемой переменной.
Надеюсь, что это поможет вам или другим!