Вопросы по API Gmsh Python - PullRequest
       49

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

0 голосов
/ 01 марта 2019

Я пытаюсь написать скрипт, который будет автоматически связывать геометрии для анализа 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, как мне затем обратиться к трем новым точкам, через которые проходит масштабированный сплайн, например, если я хочу провести линию между начальной точкой исходного сплайна и точкоймасштабированный сплайн?

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

1 Ответ

0 голосов
/ 15 мая 2019

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

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

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

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

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

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

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

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

...