¿Cómo generar malla en Python con el módulo Gmsh?

En este artículo, cubriremos cómo generar mallas usando el módulo Gmsh en Python.

¿Qué es Malla?

Una estructura conectada en 2D, 3D o multidimensional que se compone de puntos, líneas y curvas se denomina malla. En el mundo real, las mallas se componen de muchos materiales diferentes, como metales, fibras y materiales dúctiles. Por ejemplo, la imagen se muestra a continuación:

Malla 3D:

 

Métodos:

Método                                                                                 Parámetro                                                 

Descripción

     

inicializar() Ninguna Inicializar el gmsh
añadir_punto()                   x, y, z, lc Cree un punto en (x, y, z) con el tamaño de malla de destino (lc) cerca del punto
añadir line() punto A, punto B Crear una línea desde el punto A hasta el punto B
añadir_curva_bucle() lista de lineas Crea una cara que esté formada por líneas.
añadir_superficie_plano() lista de caras Crear una superficie en la cara y conectar superficies de cara
sincronizar() Ninguna Cree las estructuras de datos Gmsh relevantes a partir del modelo Gmsh. Las sincronizaciones se pueden llamar en cualquier momento, pero para reducir el tiempo de procesamiento es mejor llamar después de agregar puntos, líneas, curvas, superficies, etc.
generar() Ninguna Generar la malla
escribe() Nombre del modelo Cree una malla del nombre de modelo dado, por ejemplo, «GFG.msh»
correr() Ninguna Crea una interfaz gráfica de usuario
finalizar() Ninguna  Finaliza la API Gmsh

Después de comprender la malla y las funciones, es hora de crear la malla anterior. Entonces, sin más demora, entremos de inmediato.

Módulo requerido:

Librería gmsh: Es un script de promoción y wrapper API Python para gmsh.

pip install gmsh

Biblioteca Sys: Es un script de promoción y contenedor API Python para sys.

pip install sys

Implementación paso a paso

Paso 1: importar módulos, inicializar gmsh.

Python3

# Import modules:
import gmsh
import sys
  
# Initialize gmsh:
gmsh.initialize()

Paso 2: La malla anterior se compone de tres formas, un cubo y dos pentágonos. Así que primero creamos un cubo y luego ambos pentágonos. Para crear un cubo necesitamos crear 8 puntos, 12 aristas/líneas, 6 caras y sus superficies. Para crear puntos, use el código que se proporciona a continuación. 

Python3

# Import modules:
import gmsh
import sys
  
# Initialize gmsh:
gmsh.initialize()
  
# cube points:
lc = 1e-2
point1 = gmsh.model.geo.add_point(0, 0, 0, lc)
point2 = gmsh.model.geo.add_point(1, 0, 0, lc)
point3 = gmsh.model.geo.add_point(1, 1, 0, lc)
point4 = gmsh.model.geo.add_point(0, 1, 0, lc)
point5 = gmsh.model.geo.add_point(0, 1, 1, lc)
point6 = gmsh.model.geo.add_point(0, 0, 1, lc)
point7 = gmsh.model.geo.add_point(1, 0, 1, lc)
point8 = gmsh.model.geo.add_point(1, 1, 1, lc)
  
# Create the relevant Gmsh data structures 
# from Gmsh model.
gmsh.model.geo.synchronize()
  
# Generate mesh:
gmsh.model.mesh.generate()
  
# Write mesh data:
gmsh.write("GFG.msh")
  
# Creates  graphical user interface
if 'close' not in sys.argv:
    gmsh.fltk.run()
  
# It finalize the Gmsh API
gmsh.finalize()

Producción:

Paso 3 : después de crear puntos, podemos crear líneas a partir de estos puntos utilizando el método add_line(). Para crear líneas, use el código que se proporciona a continuación.

Python3

# Import modules:
import gmsh
import sys
  
# Initialize gmsh:
gmsh.initialize()
  
# cube points:
lc = 1e-2
point1 = gmsh.model.geo.add_point(0, 0, 0, lc)
point2 = gmsh.model.geo.add_point(1, 0, 0, lc)
point3 = gmsh.model.geo.add_point(1, 1, 0, lc)
point4 = gmsh.model.geo.add_point(0, 1, 0, lc)
point5 = gmsh.model.geo.add_point(0, 1, 1, lc)
point6 = gmsh.model.geo.add_point(0, 0, 1, lc)
point7 = gmsh.model.geo.add_point(1, 0, 1, lc)
point8 = gmsh.model.geo.add_point(1, 1, 1, lc)
  
# Edge of cube:
line1 = gmsh.model.geo.add_line(point1, point2)
line2 = gmsh.model.geo.add_line(point2, point3)
line3 = gmsh.model.geo.add_line(point3, point4)
line4 = gmsh.model.geo.add_line(point4, point1)
line5 = gmsh.model.geo.add_line(point5, point6)
line6 = gmsh.model.geo.add_line(point6, point7)
line7 = gmsh.model.geo.add_line(point7, point8)
line8 = gmsh.model.geo.add_line(point8, point5)
line9 = gmsh.model.geo.add_line(point4, point5)
line10 = gmsh.model.geo.add_line(point6, point1)
line11 = gmsh.model.geo.add_line(point7, point2)
line12 = gmsh.model.geo.add_line(point3, point8)
  
# Create the relevant Gmsh data structures 
# from Gmsh model.
gmsh.model.geo.synchronize()
  
# Generate mesh:
gmsh.model.mesh.generate()
  
# Write mesh data:
gmsh.write("GFG.msh")
  
# Creates  graphical user interface
if 'close' not in sys.argv:
    gmsh.fltk.run()
  
# It finalize the Gmsh API
gmsh.finalize()

Producción: 

 

Paso 4: A continuación, creamos caras y superficies, pero antes de eso, uno debe comprender dos métodos más claramente que son add_curve_loop() y add_plane_surface(). En el resultado anterior, parece que se generan caras, pero no es cierto. Entonces, para crear caras sólidas, usamos add_curve_loop() y luego usamos el método add_plane_surface() para obtener una cara sólida con diferentes colores. 

  • add_curve_loop([line1, line2, line3, line4]) : Requería una lista de líneas en formato de bucle cerrado. Por ejemplo: [línea1 (punto 1 a punto 2) -> línea 2 (punto 2 a punto 3) -> línea 3 (punto 3 a punto 4) -> línea 4 (punto 4 a punto 1)], de esta manera el punto 1 está conectado al punto 4. Entonces se produce una cara del cuadrado anterior. Si nos movemos en direcciones opuestas a la línea, es decir, línea1 = (punto1 a punto2) y si nos movemos desde (punto2 a punto1), entonces línea1 se escribe como «-línea1» en la función add_curve_loop() debido a la dirección opuesta. 

 

  • add_plane_surface() : si solo se pasa una cara como parámetro, la función crea una única superficie en la cara. Si se pasan dos caras como parámetros en la lista, la función conecta las caras si es posible, es decir, si las caras se encuentran en el mismo plano.

 

 

Después de comprender ambos métodos, se puede crear un cubo utilizando el código que se proporciona a continuación.

Python3

# Import modules:
import gmsh
import sys
  
# Initialize gmsh:
gmsh.initialize()
  
# cube points:
lc = 1e-2
point1 = gmsh.model.geo.add_point(0, 0, 0, lc)
point2 = gmsh.model.geo.add_point(1, 0, 0, lc)
point3 = gmsh.model.geo.add_point(1, 1, 0, lc)
point4 = gmsh.model.geo.add_point(0, 1, 0, lc)
point5 = gmsh.model.geo.add_point(0, 1, 1, lc)
point6 = gmsh.model.geo.add_point(0, 0, 1, lc)
point7 = gmsh.model.geo.add_point(1, 0, 1, lc)
point8 = gmsh.model.geo.add_point(1, 1, 1, lc)
  
# Edge of cube:
line1 = gmsh.model.geo.add_line(point1, point2)
line2 = gmsh.model.geo.add_line(point2, point3)
line3 = gmsh.model.geo.add_line(point3, point4)
line4 = gmsh.model.geo.add_line(point4, point1)
line5 = gmsh.model.geo.add_line(point5, point6)
line6 = gmsh.model.geo.add_line(point6, point7)
line7 = gmsh.model.geo.add_line(point7, point8)
line8 = gmsh.model.geo.add_line(point8, point5)
line9 = gmsh.model.geo.add_line(point4, point5)
line10 = gmsh.model.geo.add_line(point6, point1)
line11 = gmsh.model.geo.add_line(point7, point2)
line12 = gmsh.model.geo.add_line(point3, point8)
  
# faces of cube:
face1 = gmsh.model.geo.add_curve_loop([line1, line2, line3, line4])
face2 = gmsh.model.geo.add_curve_loop([line5, line6, line7, line8])
face3 = gmsh.model.geo.add_curve_loop([line9, line5, line10, -line4])
face4 = gmsh.model.geo.add_curve_loop([line9, -line8, -line12, line3])
face5 = gmsh.model.geo.add_curve_loop([line6, line11, -line1, -line10])
face6 = gmsh.model.geo.add_curve_loop([line11, line2, line12, -line7])
  
# surfaces of cube:
gmsh.model.geo.add_plane_surface([face1])
gmsh.model.geo.add_plane_surface([face2])
gmsh.model.geo.add_plane_surface([face3])
gmsh.model.geo.add_plane_surface([face4])
gmsh.model.geo.add_plane_surface([face5])
gmsh.model.geo.add_plane_surface([face6])
  
# Create the relevant Gmsh data structures 
# from Gmsh model.
gmsh.model.geo.synchronize()
  
# Generate mesh:
gmsh.model.mesh.generate()
  
# Write mesh data:
gmsh.write("GFG.msh")
  
# Creates  graphical user interface
if 'close' not in sys.argv:
    gmsh.fltk.run()
  
# It finalize the Gmsh API
gmsh.finalize()

Producción: 

 

Paso 5: ahora el paso final es crear ambos pentágonos y conectarlos. Para hacerlo, uno debería necesitar crear sus puntos y líneas usando la medida adecuada. Es mejor dibujar figuras en papel primero y luego codificar los puntos de acuerdo. Aquí creamos dos pentágonos, uno más grande y otro más pequeño usando las funciones add_point(), add_line(). Después de eso, crearemos superficies de ambos pentágonos usando add_curve_loop() y luego conectaremos la cara más grande y más pequeña del pentágono con la cara del cubo usando add_plane_surface. Por último, conectaremos ambas caras del pentágono entre sí usando la función add_plane_surface(). 

Python3

# Import modules:
import gmsh
import sys
  
# Initialize gmsh:
gmsh.initialize()
  
# cube points:
lc = 1e-2
point1 = gmsh.model.geo.add_point(0, 0, 0, lc)
point2 = gmsh.model.geo.add_point(1, 0, 0, lc)
point3 = gmsh.model.geo.add_point(1, 1, 0, lc)
point4 = gmsh.model.geo.add_point(0, 1, 0, lc)
point5 = gmsh.model.geo.add_point(0, 1, 1, lc)
point6 = gmsh.model.geo.add_point(0, 0, 1, lc)
point7 = gmsh.model.geo.add_point(1, 0, 1, lc)
point8 = gmsh.model.geo.add_point(1, 1, 1, lc)
  
# Edge of cube:
line1 = gmsh.model.geo.add_line(point1, point2)
line2 = gmsh.model.geo.add_line(point2, point3)
line3 = gmsh.model.geo.add_line(point3, point4)
line4 = gmsh.model.geo.add_line(point4, point1)
line5 = gmsh.model.geo.add_line(point5, point6)
line6 = gmsh.model.geo.add_line(point6, point7)
line7 = gmsh.model.geo.add_line(point7, point8)
line8 = gmsh.model.geo.add_line(point8, point5)
line9 = gmsh.model.geo.add_line(point4, point5)
line10 = gmsh.model.geo.add_line(point6, point1)
line11 = gmsh.model.geo.add_line(point7, point2)
line12 = gmsh.model.geo.add_line(point3, point8)
  
# faces of cube:
face1 = gmsh.model.geo.add_curve_loop([line1, line2, line3, line4])
face2 = gmsh.model.geo.add_curve_loop([line5, line6, line7, line8])
face3 = gmsh.model.geo.add_curve_loop([line9, line5, line10, -line4])
face4 = gmsh.model.geo.add_curve_loop([line9, -line8, -line12, line3])
face5 = gmsh.model.geo.add_curve_loop([line6, line11, -line1, -line10])
face6 = gmsh.model.geo.add_curve_loop([line11, line2, line12, -line7])
  
# surfaces of cube:
gmsh.model.geo.add_plane_surface([face1])
gmsh.model.geo.add_plane_surface([face2])
gmsh.model.geo.add_plane_surface([face3])
gmsh.model.geo.add_plane_surface([face4])
gmsh.model.geo.add_plane_surface([face5])
gmsh.model.geo.add_plane_surface([face6])
  
# Points of bigger petagon:
point9 = gmsh.model.geo.add_point(0.3, 0.3, -2, lc)
point10 = gmsh.model.geo.add_point(0.7, 0.3, -2, lc)
point11 = gmsh.model.geo.add_point(0.7, 0.5, -2, lc)
point12 = gmsh.model.geo.add_point(0.5, 0.7, -2, lc)
point13 = gmsh.model.geo.add_point(0.3, 0.5, -2, lc)
  
# Points of smaller petagon:
point14 = gmsh.model.geo.add_point(0.4, 0.4, 2, lc)
point15 = gmsh.model.geo.add_point(0.6, 0.4, 2, lc)
point16 = gmsh.model.geo.add_point(0.6, 0.5, 2, lc)
point17 = gmsh.model.geo.add_point(0.5, 0.6, 2, lc)
point18 = gmsh.model.geo.add_point(0.4, 0.5, 2, lc)
  
# lines of bigger pentagon:
line13 = gmsh.model.geo.add_line(point9, point10)
line14 = gmsh.model.geo.add_line(point10, point11)
line15 = gmsh.model.geo.add_line(point11, point12)
line16 = gmsh.model.geo.add_line(point12, point13)
line17 = gmsh.model.geo.add_line(point13, point9)
  
# lines of smaller pentagon:
line18 = gmsh.model.geo.add_line(point14, point15)
line19 = gmsh.model.geo.add_line(point15, point16)
line20 = gmsh.model.geo.add_line(point16, point17)
line21 = gmsh.model.geo.add_line(point17, point18)
line22 = gmsh.model.geo.add_line(point18, point14)
  
# face of bigger pentagon.
face7 = gmsh.model.geo.add_curve_loop([line13, line14, line15, line16, line17])
  
# face of smaller pentagon.
face8 = gmsh.model.geo.add_curve_loop([line18, line19, line20, line21, line22])
  
# connection of cube faces with pentagon
# and bigger pentagon with smaller.
gmsh.model.geo.add_plane_surface([face1, face7])
gmsh.model.geo.add_plane_surface([face2, face8])
gmsh.model.geo.add_plane_surface([face7, face8])
  
# Create the relevant Gmsh data structures 
# from Gmsh model.
gmsh.model.geo.synchronize()
  
# Generate mesh:
gmsh.model.mesh.generate()
  
# Write mesh data:
gmsh.write("GFG.msh")
  
# Creates  graphical user interface
if 'close' not in sys.argv:
    gmsh.fltk.run()
  
# It finalize the Gmsh API
gmsh.finalize()

Salida :

 

Publicación traducida automáticamente

Artículo escrito por siddharthsingh7898 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *