download
raw
2.39 kB
"""
Utilisation de Gmsh pour créer des maillages complexes pour FEniCS
Gmsh est l'outil standard pour les géométries complexes
"""
import gmsh
from dolfinx.io import gmshio
from mpi4py import MPI
import numpy as np
# Initialiser Gmsh
gmsh.initialize()
gmsh.model.add("complex_structure")
# Exemple 1: Disque avec trou (2D)
# ----------------------------------
lc = 0.1 # Taille caractéristique des éléments
# Centre du disque extérieur
gmsh.model.geo.addPoint(0, 0, 0, lc, 1)
# Points du cercle extérieur (rayon 1)
gmsh.model.geo.addPoint(1, 0, 0, lc, 2)
gmsh.model.geo.addPoint(0, 1, 0, lc, 3)
gmsh.model.geo.addPoint(-1, 0, 0, lc, 4)
gmsh.model.geo.addPoint(0, -1, 0, lc, 5)
# Arcs du cercle extérieur
gmsh.model.geo.addCircleArc(2, 1, 3, 1)
gmsh.model.geo.addCircleArc(3, 1, 4, 2)
gmsh.model.geo.addCircleArc(4, 1, 5, 3)
gmsh.model.geo.addCircleArc(5, 1, 2, 4)
# Curve loop extérieure
gmsh.model.geo.addCurveLoop([1, 2, 3, 4], 1)
# Trou intérieur (rayon 0.3)
gmsh.model.geo.addPoint(0.3, 0, 0, lc, 10)
gmsh.model.geo.addPoint(0, 0.3, 0, lc, 11)
gmsh.model.geo.addPoint(-0.3, 0, 0, lc, 12)
gmsh.model.geo.addPoint(0, -0.3, 0, lc, 13)
gmsh.model.geo.addCircleArc(10, 1, 11, 10)
gmsh.model.geo.addCircleArc(11, 1, 12, 11)
gmsh.model.geo.addCircleArc(12, 1, 13, 12)
gmsh.model.geo.addCircleArc(13, 1, 10, 13)
# Curve loop intérieure
gmsh.model.geo.addCurveLoop([10, 11, 12, 13], 2)
# Surface avec trou
gmsh.model.geo.addPlaneSurface([1, 2], 1)
# Synchroniser
gmsh.model.geo.synchronize()
# Définir des groupes physiques (pour les conditions aux limites)
gmsh.model.addPhysicalGroup(1, [1, 2, 3, 4], 1, name="outer_boundary")
gmsh.model.addPhysicalGroup(1, [10, 11, 12, 13], 2, name="inner_boundary")
gmsh.model.addPhysicalGroup(2, [1], 1, name="domain")
# Générer le maillage 2D
gmsh.model.mesh.generate(2)
# Optionnel: raffiner le maillage
# gmsh.model.mesh.refine()
# Sauvegarder (optionnel)
gmsh.write("disk_with_hole.msh")
# Importer dans DOLFINx
domain, cell_markers, facet_markers = gmshio.model_to_mesh(
gmsh.model, MPI.COMM_WORLD, 0, gdim=2
)
print(f"Nombre de cellules: {domain.topology.index_map(2).size_local}")
print(f"Nombre de facettes marquées: {len(facet_markers.values)}")
# Finaliser Gmsh
gmsh.finalize()
# Maintenant vous pouvez utiliser 'domain' dans vos calculs FEniCS
# avec 'facet_markers' pour appliquer les conditions aux limites

Xet Storage Details

Size:
2.39 kB
·
Xet hash:
8fd10d23d54c5d81dac860cd89e9082ede3aafc76bd39b62afc7d716321f5abf

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.