src/gyptis/geometry/scattering2d.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Benjamin Vial
# This file is part of gyptis
# Version: 1.0.2
# License: MIT
# See the documentation at gyptis.gitlab.io
from .geometry import *
from .geometry import _newer_gmsh
class BoxPML2D(Geometry):
def __init__(
self,
box_size=(1, 1),
box_center=(0, 0),
pml_width=(0.2, 0.2),
Rcalc=0,
**kwargs,
):
super().__init__(
dim=2,
**kwargs,
)
self.box_size = box_size
self.box_center = box_center
self.pml_width = pml_width
self.Rcalc = Rcalc
def _addrect_center(rect_size):
corner = -np.array(rect_size) / 2
corner = tuple(corner) + (0,)
return self.add_rectangle(*corner, *rect_size)
def _translate(tag, t):
translation = tuple(t) + (0,)
self.translate(self.dimtag(tag), *translation)
def _add_pml(s, t):
pml = _addrect_center(s)
_translate(pml, t)
return pml
box = _addrect_center(self.box_size)
s = (self.pml_width[0], self.box_size[1])
t = np.array([self.pml_width[0] / 2 + self.box_size[0] / 2, 0])
pmlxp = _add_pml(s, t)
pmlxm = _add_pml(s, -t)
s = (self.box_size[0], self.pml_width[1])
t = np.array([0, self.pml_width[1] / 2 + self.box_size[1] / 2])
pmlyp = _add_pml(s, t)
pmlym = _add_pml(s, -t)
s = (self.pml_width[0], self.pml_width[1])
t = np.array(
[
self.pml_width[0] / 2 + self.box_size[0] / 2,
self.pml_width[1] / 2 + self.box_size[1] / 2,
]
)
pmlxypp = _add_pml(s, t)
pmlxymm = _add_pml(s, -t)
pmlxypm = _add_pml(s, (-t[0], t[1]))
pmlxymp = _add_pml(s, (t[0], -t[1]))
all_dom = [
box,
pmlxp,
pmlxm,
pmlyp,
pmlym,
pmlxypp,
pmlxypm,
pmlxymm,
pmlxymp,
]
_translate(all_dom, self.box_center)
self.box = box
self.pmls = all_dom[1:]
self.fragment(self.box, self.pmls)
self.pml_physical = [
"pmlx",
"pmly",
"pmlxy",
]
if Rcalc > 0:
cyl_calc = self.add_circle(*self.box_center, 0, Rcalc)
box, cyl_calc = self.fragment(box, cyl_calc)
self.box = [box, cyl_calc]
self.add_physical(box, "box")
self.add_physical([pmlxp, pmlxm], "pmlx")
self.add_physical([pmlyp, pmlym], "pmly")
self.add_physical([pmlxypp, pmlxypm, pmlxymm, pmlxymp], "pmlxy")
if Rcalc > 0:
bnds = self.get_boundaries("box")
self.calc_bnds = bnds[0]
self.add_physical(self.calc_bnds, "calc_bnds", dim=1)
def build(self, *args, **kwargs):
if _newer_gmsh:
if self.Rcalc > 0:
bnds = self.get_boundaries("box")
self.calc_bnds = bnds[-2]
self.add_physical(self.calc_bnds, "calc_bnds", dim=1)
super().build(*args, **kwargs)