Вопросы о Gmsh Python API

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

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

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


person D. de Vries    schedule 01.03.2019    source источник


Ответы (1)


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

Мне никогда не приходилось создавать файлы .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.

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

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

person Theom    schedule 15.05.2019