Кроме того, мне нужно, чтобы код был совместим с текущей базой кода, которую я использую. , который ожидает данные ASCII, которые я получаю при сохранении сетки в формате ASCII. Я считаю, что если я смогу прочитать двоичный файл и преобразовать его в ASCII в памяти, я смогу обманом заставить другую библиотеку, которую я использую, использовать ее. Надеюсь, это все равно будет быстрее, чем чтение данных в формате ASCII (хотя я пока не знаю, будет ли это правдой).
Итак, мои вопросы:
- Какую двоичную кодировку использует Gmsh для файлов сохранения?
Как можно прочитать файл двоичной сетки обратно в Python и преобразовать в ASCII?< /li>
Код: Выделить всё
import gmsh
import sys
binary = True
if binary:
argv = ["","-bin"]
else:
argv = []
gmsh.initialize(argv=argv)
gmsh.model.add("t1")
lc = 1e-2
gmsh.model.geo.addPoint(0, 0, 0, lc, 1)
gmsh.model.geo.addPoint(.1, 0, 0, lc, 2)
gmsh.model.geo.addPoint(.1, .3, 0, lc, 3)
p4 = gmsh.model.geo.addPoint(0, .3, 0, lc)
gmsh.model.geo.addLine(1, 2, 1)
gmsh.model.geo.addLine(3, 2, 2)
gmsh.model.geo.addLine(3, p4, 3)
gmsh.model.geo.addLine(4, 1, p4)
gmsh.model.geo.addCurveLoop([4, 1, -2, 3], 1)
gmsh.model.geo.addPlaneSurface([1], 1)
gmsh.model.geo.synchronize()
gmsh.model.addPhysicalGroup(1, [1, 2, 4], 5)
gmsh.model.addPhysicalGroup(2, [1], name="My surface")
gmsh.model.mesh.generate(2)
if binary:
gmsh.write("t1_binary.msh")
else:
gmsh.write("t1_ascii.msh")
gmsh.finalize()
Код: Выделить всё
mesh_file = []
with open("t1_binary.msh", "rb") as f:
for line in f.readlines():
print(line)
mesh_file.append(line.decode())
Я использую Linux и попробовал запустить файл t1_binary.msh, чтобы посмотреть, даст ли это мне какую-нибудь полезную информацию, но все, что я получил, это t1_binary.msh: data (т. е. это не помогло). не предоставляю никакой информации о двоичном формате).
Обработка комментариев:
Вы пробовали просмотреть исходный код gmsh.write()?
Да, я пытался изучить этот код. Функция write gmsh.py (ссылка) вызывает lib.gmshWrite (я думаю, это: ссылка), которая является C++. Эта функция C++ вызывает gmsh::write (я думаю, это: ссылка), которая, похоже, вызывает gmshWrite, совершая полный круг. Я не уверен, что вижу неправильные определения функций.
Какой тип вывода ASCII вы ожидаете? Это двоичные данные, а не текст, верно?
Я ожидаю, что смогу восстановить данные ASCII, сохраненные в t1_ascii.msh, когда я установите для двоичного файла значение False.
Подробнее здесь: https://stackoverflow.com/questions/790 ... ed-to-asci