Source code for pyxfem.core.gmsh_mesh_generator

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Dec  5 14:08:33 2023

@author: nchevaug
"""
from typing import Tuple

import gmsh
[docs] def square(length=2., relh=1., transfinite = False)-> Tuple[str, dict]: """ generate a gmsh mesh model of a square of lenght L and mesh density lc """ modelname = 'ref_square_lc_'+str(relh) gmsh.model.add(modelname) gmsh.model.geo.addPoint(-length/2., -length/2., 0, relh, 1) gmsh.model.geo.addPoint(length/2., -length/2., 0, relh, 2) gmsh.model.geo.addPoint(length/2., length/2., 0, relh, 3) gmsh.model.geo.addPoint(-length/2., length/2., 0, relh, 4) gmsh.model.geo.addLine(1, 2, 1) gmsh.model.geo.addLine(2, 3, 2) gmsh.model.geo.addLine(3, 4, 3) gmsh.model.geo.addLine(4, 1, 4) gmsh.model.geo.addCurveLoop([1, 2, 3, 4], 1) gmsh.model.geo.addPlaneSurface([1], 1) gmsh.model.geo.synchronize() if transfinite : gmsh.model.mesh.setTransfiniteSurface(1, arrangement="Alternate Left") phys_dict = dict() phys_dict['Omega'] = (2, gmsh.model.addPhysicalGroup(2, [1], -1, name='Omega')) phys_dict['bottom'] = (1, gmsh.model.addPhysicalGroup(1, [1], -1, name='bottom')) phys_dict['right'] = (1, gmsh.model.addPhysicalGroup(1, [2], -1, name='right')) phys_dict['top'] = (1, gmsh.model.addPhysicalGroup(1, [3], -1, name='top')) phys_dict['left'] = (1, gmsh.model.addPhysicalGroup(1, [4], -1, name='left')) phys_dict['corner'] = (0, gmsh.model.addPhysicalGroup(0, [1], -1, name='corner')) gmsh.model.mesh.generate() return modelname, phys_dict
[docs] def reg_rectangle(L, H, Nx, Ny)-> Tuple[str, dict]: """ generate a gmsh mesh model of a rectangle with regular mesh of lenght L and mesh density lc """ modelname = 'reg_rectangle' gmsh.model.add(modelname) gmsh.model.geo.addPoint(-L/2., -H/2., 0, 1., 1) gmsh.model.geo.addPoint(L/2., -H/2., 0, 1., 2) gmsh.model.geo.addPoint(L/2., H/2., 0, 1., 3) gmsh.model.geo.addPoint(-L/2., H/2., 0, 1., 4) gmsh.model.geo.addLine(1, 2, 1) gmsh.model.geo.addLine(2, 3, 2) gmsh.model.geo.addLine(3, 4, 3) gmsh.model.geo.addLine(4, 1, 4) gmsh.model.geo.addCurveLoop([1, 2, 3, 4], 1) gmsh.model.geo.addPlaneSurface([1], 1) gmsh.model.geo.synchronize() gmsh.model.mesh.setTransfiniteCurve(1, Nx) gmsh.model.mesh.setTransfiniteCurve(2, Ny) gmsh.model.mesh.setTransfiniteCurve(3, Nx) gmsh.model.mesh.setTransfiniteCurve(4, Ny) gmsh.model.mesh.setTransfiniteSurface(1, arrangement="AlternateLeft") #gmsh.model.mesh.setTransfiniteSurface(1) phys_dict = dict() phys_dict['Omega'] = (2, gmsh.model.addPhysicalGroup(2, [1], -1, name='Omega')) phys_dict['bottom'] = (1, gmsh.model.addPhysicalGroup(1, [1], -1, name='bottom')) phys_dict['right'] = (1, gmsh.model.addPhysicalGroup(1, [2], -1, name='right')) phys_dict['top'] = (1, gmsh.model.addPhysicalGroup(1, [3], -1, name='top')) phys_dict['left'] = (1, gmsh.model.addPhysicalGroup(1, [4], -1, name='left')) phys_dict['corner'] = (0, gmsh.model.addPhysicalGroup(0, [1], -1, name='corner')) gmsh.model.mesh.generate() return modelname, phys_dict
[docs] def square_with_inner_seg(length:float=2., relh1:float=1., relh2:float=0.1, xc0=(-0.5, 0.), xc1=(0.5,0.))-> Tuple[str, dict]: """ generate a gmsh mesh model of a square of lenght L and mesh density relh that embed a segment between xc0 ans xc1 """ modelname = 'square__with_inner_seg' gmsh.model.add(modelname) gmsh.model.geo.addPoint(-length/2., -length/2., 0, relh1, 1) gmsh.model.geo.addPoint(length/2., -length/2., 0, relh1, 2) gmsh.model.geo.addPoint(length/2., length/2., 0, relh1, 3) gmsh.model.geo.addPoint(-length/2., length/2., 0, relh1, 4) gmsh.model.geo.addLine(1, 2, 1) gmsh.model.geo.addLine(2, 3, 2) gmsh.model.geo.addLine(3, 4, 3) gmsh.model.geo.addLine(4, 1, 4) gmsh.model.geo.addPoint( xc0[0], xc0[1], 0., relh2, 5) gmsh.model.geo.addPoint( xc1[0], xc1[1], 0., relh2, 6) # gmsh.model.geo.addPoint( 0.1, -0.2, 0., relh/10., 7) # gmsh.model.geo.addPoint( 0.2, -0.5, 0., relh/10., 8) gmsh.model.geo.addLine(5, 6, 5) # gmsh.model.geo.addLine(5, 7, 5) # gmsh.model.geo.addLine(6, 7, 6) # gmsh.model.geo.addLine(8, 7, 7) gmsh.model.geo.addCurveLoop([1, 2, 3, 4], 1) gmsh.model.geo.addPlaneSurface([1], 1) gmsh.model.geo.synchronize() gmsh.model.mesh.embed(1, [5], 2, 1) #gmsh.model.mesh.embed(1, [5, 6, 7], 2, 1) phys_dict = dict() phys_dict['Omega'] = (2, gmsh.model.addPhysicalGroup(2, [1], -1, name='Omega')) phys_dict['Crack'] = (1, gmsh.model.addPhysicalGroup(1, [5], -1, name='Crack')) phys_dict['Top'] = (1, gmsh.model.addPhysicalGroup(1, [3], -1, name='Top')) phys_dict['Bottom'] = (1, gmsh.model.addPhysicalGroup(1, [1], -1, name='Bottom')) gmsh.model.mesh.generate() return modelname, phys_dict
[docs] def two_square(length=2., relh=1.)-> Tuple[str, dict]: """ generate a gmsh mesh model of a square of lenght L and mesh density lc """ modelname = 'ref_square_lc_'+str(relh) gmsh.model.add(modelname) gmsh.model.geo.addPoint(-length, -length/2., 0, relh, 1) gmsh.model.geo.addPoint(0, -length/2., 0, relh, 2) gmsh.model.geo.addPoint(0, length/2., 0, relh, 3) gmsh.model.geo.addPoint(-length, length/2., 0, relh, 4) gmsh.model.geo.addPoint(length, -length/2., 0, relh, 5) gmsh.model.geo.addPoint(length, length/2., 0, relh, 6) gmsh.model.geo.addLine(1, 2, 1) gmsh.model.geo.addLine(2, 3, 2) gmsh.model.geo.addLine(3, 4, 3) gmsh.model.geo.addLine(4, 1, 4) gmsh.model.geo.addLine(2, 5, 5) gmsh.model.geo.addLine(5, 6, 6) gmsh.model.geo.addLine(6, 3, 7) gmsh.model.geo.addCurveLoop([1, 2, 3, 4], 1) gmsh.model.geo.addCurveLoop([5, 6, 7, -2], 2) gmsh.model.geo.addPlaneSurface([1], 1) gmsh.model.geo.addPlaneSurface([2], 2) gmsh.model.geo.synchronize() phys_dict = dict() phys_dict['Omega1'] = (2, gmsh.model.addPhysicalGroup(2, [1], -1, name='Omega1')) phys_dict['Omega2'] = (2, gmsh.model.addPhysicalGroup(2, [2], -1, name='Omega2')) phys_dict['midline'] = (2, gmsh.model.addPhysicalGroup(1, [2], -1, name='midline')) phys_dict['leftline'] = (2, gmsh.model.addPhysicalGroup(1, [4], -1, name='leftline')) phys_dict['rightline'] = (2, gmsh.model.addPhysicalGroup(1, [6], -1, name='rightline')) phys_dict['topline'] = (2, gmsh.model.addPhysicalGroup(1, [3,7], -1, name='topline')) phys_dict['bottomline'] = (2, gmsh.model.addPhysicalGroup(1, [1,5], -1, name='bottomline')) gmsh.model.mesh.generate() return modelname, phys_dict
[docs] def disk_in_ref_square(length=2., radius=.5, relh=1.)-> Tuple[str, dict]: """ generate a gmsh mesh model of a square of lenght L containing a centerd disk of radius r and mesh density lc """ modelname = 'disk_in_ref_square' gmsh.model.add(modelname) gmsh.model.geo.addPoint(-length/2., -length/2., 0, relh, 1) gmsh.model.geo.addPoint(length/2., -length/2., 0, relh, 2) gmsh.model.geo.addPoint(length/2., length/2., 0, relh, 3) gmsh.model.geo.addPoint(-length/2., length/2., 0, relh, 4) lc2 = 1.*relh gmsh.model.geo.addPoint(0., 0., 0, lc2, 5) gmsh.model.geo.addPoint(0., -radius, 0, lc2, 6) gmsh.model.geo.addPoint(radius, 0., 0, lc2, 7) gmsh.model.geo.addPoint(0., radius, 0, lc2, 8) gmsh.model.geo.addPoint(-radius, 0., 0, lc2, 9) gmsh.model.geo.addLine(1, 2, 1) gmsh.model.geo.addLine(2, 3, 2) gmsh.model.geo.addLine(3, 4, 3) gmsh.model.geo.addLine(4, 1, 4) gmsh.model.geo.addCircleArc(6, 5, 7, 5) gmsh.model.geo.addCircleArc(7, 5, 8, 6) gmsh.model.geo.addCircleArc(8, 5, 9, 7) gmsh.model.geo.addCircleArc(9, 5, 6, 8) gmsh.model.geo.addCurveLoop([1, 2, 3, 4], 1) gmsh.model.geo.addCurveLoop([5, 6, 7, 8], 2) gmsh.model.geo.addPlaneSurface([1, -2], 1) gmsh.model.geo.addPlaneSurface([2], 2) gmsh.model.geo.synchronize() phys_dict = dict() phys_dict['Omega'] = (2, gmsh.model.addPhysicalGroup(2, [1, 2], -1, name='Omega')) phys_dict['bottom'] = (1, gmsh.model.addPhysicalGroup(1, [1], -1, name='bottom')) phys_dict['right'] = (1, gmsh.model.addPhysicalGroup(1, [2], -1, name='right')) phys_dict['top'] = (1, gmsh.model.addPhysicalGroup(1, [3], -1, name='top')) phys_dict['left'] = (1, gmsh.model.addPhysicalGroup(1, [4], -1, name='left')) gmsh.model.mesh.generate() return modelname, phys_dict
[docs] def hole_in_square(length=2., radius=.5, relh=.1)-> Tuple[str, dict]: """ generate a gmsh mesh model of a square of lenght L containing a centered circular hole of radius r. mesh density is lc """ modelname = 'CircularHoleInRefSquare' gmsh.model.add(modelname) gmsh.model.geo.addPoint(-length/2., -length/2., 0, relh, 1) gmsh.model.geo.addPoint(length/2., -length/2., 0, relh, 2) gmsh.model.geo.addPoint(length/2., length/2., 0, relh, 3) gmsh.model.geo.addPoint(-length/2., length/2., 0, relh, 4) ratio = (3.14*radius)/length lc2 = ratio*relh gmsh.model.geo.addPoint(0., 0., 0, lc2, 5) gmsh.model.geo.addPoint(0., -radius, 0, lc2, 6) gmsh.model.geo.addPoint(radius, 0., 0, lc2, 7) gmsh.model.geo.addPoint(0., radius, 0, lc2, 8) gmsh.model.geo.addPoint(-radius, 0., 0, lc2, 9) gmsh.model.geo.addLine(1, 2, 1) gmsh.model.geo.addLine(2, 3, 2) gmsh.model.geo.addLine(3, 4, 3) gmsh.model.geo.addLine(4, 1, 4) gmsh.model.geo.addCircleArc(7, 5, 6, 5) gmsh.model.geo.addCircleArc(6, 5, 9, 6) gmsh.model.geo.addCircleArc(9, 5, 8, 7) gmsh.model.geo.addCircleArc(8, 5, 7, 8) gmsh.model.geo.addCurveLoop([1, 2, 3, 4], 1) gmsh.model.geo.addCurveLoop([5, 6, 7, 8], 2) gmsh.model.geo.addPlaneSurface([1, 2], 1) gmsh.model.geo.synchronize() phys_dict = dict() phys_dict['Omega'] = (2, gmsh.model.addPhysicalGroup(2, [1], -1, name='Omega')) phys_dict['bottom'] = (1, gmsh.model.addPhysicalGroup(1, [1], -1, name='bottom')) phys_dict['right'] = (1, gmsh.model.addPhysicalGroup(1, [2], -1, name='right')) phys_dict['top'] = (1, gmsh.model.addPhysicalGroup(1, [3], -1, name='top')) phys_dict['left'] = (1, gmsh.model.addPhysicalGroup(1, [4], -1, name='left')) phys_dict['circle'] = (1, gmsh.model.addPhysicalGroup(1, [5, 6, 7, 8], -1, name='circle')) gmsh.model.mesh.generate() return modelname, phys_dict
[docs] def hole_in_square_2(length=2., radius=.5, relh=.1)-> Tuple[str, dict]: """ generate a gmsh mesh model of a square of lenght L containing a centered circular hole of radius r. mesh density is lc """ modelname = 'CircularHoleInRefSquare' gmsh.model.add(modelname) gmsh.model.geo.addPoint(-length/2., -length/2., 0, relh, 1) gmsh.model.geo.addPoint(0, -length/2., 0, relh, 10) gmsh.model.geo.addPoint(length/2., -length/2., 0, relh, 2) gmsh.model.geo.addPoint(length/2., length/2., 0, relh, 3) gmsh.model.geo.addPoint(-length/2., length/2., 0, relh, 4) gmsh.model.geo.addPoint(0, length/2., 0, relh, 20) ratio = (3.14*radius)/length lc2 = ratio*relh gmsh.model.geo.addPoint(0., 0., 0, lc2, 5) gmsh.model.geo.addPoint(0., -radius, 0, lc2, 6) gmsh.model.geo.addPoint(radius, 0., 0, lc2, 7) gmsh.model.geo.addPoint(0., radius, 0, lc2, 8) gmsh.model.geo.addPoint(-radius, 0., 0, lc2, 9) gmsh.model.geo.addLine(1, 10, 1) gmsh.model.geo.addLine(10, 2, 20) gmsh.model.geo.addLine(10, 6, 40) gmsh.model.geo.addLine(8, 20, 50) gmsh.model.geo.addLine(2, 3, 2) gmsh.model.geo.addLine(3, 20, 3) gmsh.model.geo.addLine(20, 4, 30) gmsh.model.geo.addLine(4, 1, 4) gmsh.model.geo.addCircleArc(7, 5, 6, 5) gmsh.model.geo.addCircleArc(6, 5, 9, 6) gmsh.model.geo.addCircleArc(9, 5, 8, 7) gmsh.model.geo.addCircleArc(8, 5, 7, 8) gmsh.model.geo.addCurveLoop([1, 40, 6, 7, 50, 30, 4], 1) gmsh.model.geo.addCurveLoop([20, 2, 3, -50, 8, 5, -40], 2) gmsh.model.geo.addPlaneSurface([1], 1) gmsh.model.geo.addPlaneSurface([2], 2) gmsh.model.geo.synchronize() phys_dict = dict() phys_dict['Omega'] = (2, gmsh.model.addPhysicalGroup(2, [1,2], -1, name='Omega')) phys_dict['bottom'] = (1, gmsh.model.addPhysicalGroup(1, [1,20], -1, name='bottom')) phys_dict['right'] = (1, gmsh.model.addPhysicalGroup(1, [2], -1, name='right')) phys_dict['top'] = (1, gmsh.model.addPhysicalGroup(1, [3,30], -1, name='top')) phys_dict['left'] = (1, gmsh.model.addPhysicalGroup(1, [4], -1, name='left')) phys_dict['circle'] = (1, gmsh.model.addPhysicalGroup(1, [5, 6, 7, 8], -1, name='circle')) gmsh.model.mesh.generate() return modelname, phys_dict
[docs] def crack_in_square(relh=1., L=1.,)-> Tuple[str, dict]: """ generate a gmsh mesh model of a square of lenght 2L containing an horizontal crack from left to square center """ modelname = 'square_with_crack' #relh2 = relh*np.pi gmsh.model.add(modelname) gmsh.model.geo.addPoint(-L, -L, 0, relh, 1) gmsh.model.geo.addPoint(L, -L, 0, relh, 2) gmsh.model.geo.addPoint(L, L, 0, relh, 3) gmsh.model.geo.addPoint(-L, L, 0, relh, 4) gmsh.model.geo.addPoint(-L, 1.e-6, 0, relh, 5) gmsh.model.geo.addPoint(0., 0., 0., relh, 6) gmsh.model.geo.addPoint(-L, -1.e-6, 0, relh, 7) gmsh.model.geo.addLine(1, 2, 1) gmsh.model.geo.addLine(2, 3, 2) gmsh.model.geo.addLine(3, 4, 3) gmsh.model.geo.addLine(4, 5, 4) gmsh.model.geo.addLine(5, 6, 5) gmsh.model.geo.addLine(6, 7, 6) gmsh.model.geo.addLine(7, 1, 7) gmsh.model.geo.addCurveLoop([1, 2, 3, 4, 5, 6, 7], 1) gmsh.model.geo.addPlaneSurface([1], 1) gmsh.model.geo.synchronize() gmsh.model.addPhysicalGroup(2, [1], -1, name='Omega') phys_dict = dict() phys_dict['Omega'] = (2, gmsh.model.addPhysicalGroup(2, [1], -1, name='Omega')) phys_dict['dOmega_ext'] = (1, gmsh.model.addPhysicalGroup(1,[1,2,3,4,7], -1, name='dOmega_ext')) phys_dict['dOmega_crack'] = (1, gmsh.model.addPhysicalGroup(1,[5,6], -1, name='dOmega_crack')) phys_dict['top'] = gmsh.model.addPhysicalGroup(1, [3], -1, name='top') phys_dict['bottom'] = gmsh.model.addPhysicalGroup(1, [1], -1, name='bottom') #phys_dict['dOmega_left'] = (1, gmsh.model.addPhysicalGroup(1, [7], -1, name='dOmega_left')) #phys_dict['dOmega_right'] = (1, gmsh.model.addPhysicalGroup(1, [3, 4], -1, name='dOmega_right')) #phys_dict['dOmega_left'] = (1, gmsh.model.addPhysicalGroup(1, [7], -1, name='dOmega_left')) gmsh.model.mesh.generate() return modelname, phys_dict
[docs] def crack_in_square_contour(relh=1., l=1., r=0.5)-> Tuple[str, dict]: """ generate a gmsh mesh model of a square of lenght 2L containing an horizontal crack from left to square center and a circular contour for inter-*actions integral of radius R """ modelname = 'square_with_crack' eps = 1.e-10 gmsh.model.add(modelname) gmsh.model.geo.addPoint(-l, -l, 0, relh, 1) gmsh.model.geo.addPoint(l, -l, 0, relh, 2) gmsh.model.geo.addPoint(l, l, 0, relh, 3) gmsh.model.geo.addPoint(-l, l, 0, relh, 4) gmsh.model.geo.addPoint(-l, +eps, 0, relh, 5) gmsh.model.geo.addPoint(0., 0., 0., relh, 6) gmsh.model.geo.addPoint(-l, -eps, 0, relh, 7) gmsh.model.geo.addPoint(-r, +eps, 0, relh, 8) gmsh.model.geo.addPoint(0, r, 0, relh, 9) gmsh.model.geo.addPoint(r, 0, 0, relh, 10) gmsh.model.geo.addPoint(0, -r, 0, relh, 11) gmsh.model.geo.addPoint(-r, -eps, 0, relh, 12) gmsh.model.geo.addLine(1, 2, 1) gmsh.model.geo.addLine(2, 3, 2) gmsh.model.geo.addLine(3, 4, 3) gmsh.model.geo.addLine(4, 5, 4) gmsh.model.geo.addLine(5, 8, 5) gmsh.model.geo.addLine(8, 6, 6) gmsh.model.geo.addLine(6, 12, 7) gmsh.model.geo.addLine(12, 7, 8) gmsh.model.geo.addLine(7, 1, 9) gmsh.model.geo.addCircleArc(8, 6, 9, 11) gmsh.model.geo.addCircleArc(9, 6, 10, 12) gmsh.model.geo.addCircleArc(10, 6, 11, 13) gmsh.model.geo.addCircleArc(11, 6, 12, 14) gmsh.model.geo.addCurveLoop([1, 2, 3, 4, 5, 11, 12, 13, 14, 8, 9], 1) gmsh.model.geo.addPlaneSurface([1], 1) #gmsh.model.geo.addCurveLoop([-6, 11, 12, 13, 14, -7], 2) gmsh.model.geo.addCurveLoop([ -11, -12, -13, -14, 7, 6], 2) gmsh.model.geo.addPlaneSurface([2], 2) gmsh.model.geo.synchronize() phys_dict={} phys_dict['Omega'] = (2, gmsh.model.addPhysicalGroup(2, [1,2], -1, name='Omega')) phys_dict['Omega_ext'] = (2, gmsh.model.addPhysicalGroup(2, [1], -1, name='Omega_ext')) phys_dict['Omega_in'] = (2, gmsh.model.addPhysicalGroup(2, [2], -1, name='Omega_in')) phys_dict['bottom'] = (1, gmsh.model.addPhysicalGroup(1, [1], -1, name='bottom')) phys_dict['right'] = (1, gmsh.model.addPhysicalGroup(1, [2], -1, name='right')) phys_dict['top'] = (1, gmsh.model.addPhysicalGroup(1, [3], -1, name='top')) phys_dict['left_top'] = (1, gmsh.model.addPhysicalGroup(1, [4], -1, name='left_top')) phys_dict['left_bottom'] = (1, gmsh.model.addPhysicalGroup(1, [9], -1, name='left_bottom')) phys_dict['crack'] = (1, gmsh.model.addPhysicalGroup(1, [5,6,7,8], -1, name='crack')) phys_dict['contour'] = (1, gmsh.model.addPhysicalGroup(1, [11,12,13,14], -1, name='contour')) gmsh.model.mesh.generate() return modelname, phys_dict
[docs] def l_shape(relh=1.)-> Tuple[str, dict]: """ generate a gmsh mesh model of a L shaped domain, divided in 3 squares """ modelname = 'L' gmsh.model.add(modelname) gmsh.model.geo.addPoint(0., 0., 0., relh, 1) gmsh.model.geo.addPoint(0., -1., 0., relh, 2) gmsh.model.geo.addPoint(1., -1., 0., relh, 3) gmsh.model.geo.addPoint(1., 0., 0., relh, 4) gmsh.model.geo.addPoint(1., 1., 0., relh, 5) gmsh.model.geo.addPoint(0., 1., 0., relh, 6) gmsh.model.geo.addPoint(-1., 1., 0., relh, 7) gmsh.model.geo.addPoint(-1., 0., 0., relh, 8) gmsh.model.geo.addLine(1, 2, 1) gmsh.model.geo.addLine(2, 3, 2) gmsh.model.geo.addLine(3, 4, 3) gmsh.model.geo.addLine(4, 5, 4) gmsh.model.geo.addLine(5, 6, 5) gmsh.model.geo.addLine(6, 7, 6) gmsh.model.geo.addLine(7, 8, 7) gmsh.model.geo.addLine(8, 1, 8) gmsh.model.geo.addLine(1, 6, 9) gmsh.model.geo.addLine(1, 4, 10) gmsh.model.geo.addCurveLoop([1, 2, 3, -10], 1) gmsh.model.geo.addCurveLoop([10, 4, 5, -9], 2) gmsh.model.geo.addCurveLoop([9, 6, 7, 8], 3) gmsh.model.geo.addPlaneSurface([1], 1) gmsh.model.geo.addPlaneSurface([2], 2) gmsh.model.geo.addPlaneSurface([3], 3) gmsh.model.geo.synchronize() phys_dict = dict() phys_dict['dOmega_left'] = (1, gmsh.model.addPhysicalGroup(1, [7], -1, name='dOmega_left')) phys_dict['dOmega_right'] = (1, gmsh.model.addPhysicalGroup(1, [3, 4], -1, name='dOmega_right')) phys_dict['dOmega_other'] = (1, gmsh.model.addPhysicalGroup(1, [1, 2, 5, 6, 8], -1, name='dOmega_other')) phys_dict['dOmega8'] = (1, gmsh.model.addPhysicalGroup(1, [8], -1, name='dOmega8')) phys_dict['Omega'] = (2, gmsh.model.addPhysicalGroup(2, [1, 2, 3], -1, name='Omega')) phys_dict['Omega1'] = (2, gmsh.model.addPhysicalGroup(2, [1], -1, name='Omega1')) phys_dict['Omega2'] = (2, gmsh.model.addPhysicalGroup(2, [2], -1, name='Omega2')) phys_dict['Omega3'] = (2, gmsh.model.addPhysicalGroup(2, [3], -1, name='Omega3')) gmsh.model.mesh.generate() #gmsh.model.mesh.setNode(7, np.array([-1,0.,0.]), np.array([], dtype=np.float64)) return modelname, phys_dict
[docs] def ref_tri(relh=1)-> Tuple[str, dict]: """ generate a gmsh mesh model of the reference triangle """ modelname = 'ref_tri' gmsh.model.add(modelname) gmsh.model.geo.addPoint(0., 0., 0., relh, 1) gmsh.model.geo.addPoint(1., 0., 0., relh, 2) gmsh.model.geo.addPoint(0., 1., 0., relh, 3) gmsh.model.geo.addLine(1, 2, 1) gmsh.model.geo.addLine(2, 3, 2) gmsh.model.geo.addLine(3, 1, 3) gmsh.model.geo.addCurveLoop([1, 2, 3], 1) gmsh.model.geo.addPlaneSurface([1], 1) gmsh.model.geo.synchronize() phys_dict = dict() phys_dict['Omega'] = gmsh.model.addPhysicalGroup(2, [1], -1, name='Omega') phys_dict['Omega'] = gmsh.model.addPhysicalGroup(1, [1], -1, name='bottom') phys_dict['Omega'] = gmsh.model.addPhysicalGroup(1, [2], -1, name='right') phys_dict['Omega'] = gmsh.model.addPhysicalGroup(1, [3], -1, name='left') gmsh.model.mesh.generate() return modelname, phys_dict
[docs] def cylinder(radius:float, height:float, relh:float=1.)-> Tuple[str, dict]: ''' Construct a cylinder in the Z direction (just the surface)''' modelname = 'cylinder' gmsh.model.add(modelname) gmsh.model.geo.addPoint(0., 0., 0., relh, 1) gmsh.model.geo.addPoint(radius, 0., 0., relh, 2) gmsh.model.geo.addPoint(0., radius, 0., relh, 3) gmsh.model.geo.addPoint(-radius, 0., 0., relh, 4) gmsh.model.geo.addPoint(0., -radius, 0., relh, 5) 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) gmsh.model.geo.extrude([(1, 1), (1, 2), (1, 3), (1,4)],0.,0., height) #print(out_dimtags) bottom_geo = [1,2,3,4] top_geo = [5,9,13,17] surf_geo = [8, 12, 16, 20] gmsh.model.geo.synchronize() phys_dict = dict() phys_dict['omega'] = gmsh.model.addPhysicalGroup(2, surf_geo, -1, name='omega') phys_dict['bottom'] = gmsh.model.addPhysicalGroup(1, bottom_geo, -1, name='bottom') phys_dict['top'] = gmsh.model.addPhysicalGroup(1, top_geo, -1, name='top') # phys_dict['Omega'] = gmsh.model.addPhysicalGroup(1, [3], -1, name='left') gmsh.model.mesh.generate() return modelname, phys_dict
[docs] def structured_cylinder( radius: float, height: float, n_theta_quarter: int = 10, n_z: int = 20, relh: float = 1.0, ) -> Tuple[str, dict]: modelname = "cylinder" gmsh.model.add(modelname) # 1. Base points gmsh.model.geo.addPoint(0.0, 0.0, 0.0, relh, 1) gmsh.model.geo.addPoint(radius, 0.0, 0.0, relh, 2) gmsh.model.geo.addPoint(0.0, radius, 0.0, relh, 3) gmsh.model.geo.addPoint(-radius, 0.0, 0.0, relh, 4) gmsh.model.geo.addPoint(0.0, -radius, 0.0, relh, 5) # 2. Base arcs arc_tags = [1, 2, 3, 4] gmsh.model.geo.addCircleArc(2, 1, 3, arc_tags[0]) gmsh.model.geo.addCircleArc(3, 1, 4, arc_tags[1]) gmsh.model.geo.addCircleArc(4, 1, 5, arc_tags[2]) gmsh.model.geo.addCircleArc(5, 1, 2, arc_tags[3]) # 3. Transfinite base curves for tag in arc_tags: gmsh.model.geo.mesh.setTransfiniteCurve(tag, n_theta_quarter + 1) # 4. Extrude one curve at a time to accurately isolate top vs. lateral lines top_geo = [] surf_geo = [] lat_lines = set() for arc in arc_tags: out = gmsh.model.geo.extrude( [(1, arc)], 0.0, 0.0, height, numElements=[n_z], recombine=False, ) # out layout for a curve extrusion: # out[0] -> (2, surface_tag) # out[1] -> (1, top_curve_tag) # out[2:] -> (1, lateral_edge_tags) print(out) surf_geo.append(out[1][1]) top_geo.append(out[0][1]) for dim, tag in out[2:]: if dim == 1: lat_lines.add(tag) bottom_geo = arc_tags # 5. Transfinite surfaces for structured triangle mesh for s_tag in surf_geo: gmsh.model.geo.mesh.setTransfiniteSurface(s_tag, arrangement="Alternate") gmsh.model.geo.synchronize() # 6. Physical groups phys_dict = {} # phys_dict["omega"] = gmsh.model.addPhysicalGroup( # 2, surf_geo, -1, name="omega" # ) phys_dict["bottom"] = gmsh.model.addPhysicalGroup( 1, bottom_geo, -1, name="bottom" ) phys_dict["top"] = gmsh.model.addPhysicalGroup(1, top_geo, -1, name="top") gmsh.model.mesh.generate() return modelname, phys_dict
if __name__ == '__main__': gmsh.initialize() #crack_in_square_contour(relh=0.05, L=1., R=0.5) crack_in_square(relh=0.05, L=1.) gmsh.fltk.run() gmsh.finalize()