#!/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()