文件
gprMax/testing/models_pmls/pml_basic.py

118 行
4.1 KiB
Python
可执行文件

from pathlib import Path
import gprMax
# File path for output
fn = Path(__file__)
# Discretisation
dl = 0.001
# Domain
x = 0.100
y = 0.100
z = 0.100
domain = gprMax.Domain(p1=(x, y, z))
dxdydz = gprMax.Discretisation(p1=(dl, dl, dl))
time_window = gprMax.TimeWindow(time=3e-9)
waveform = gprMax.Waveform(wave_type="gaussian", amp=1, freq=1e9, id="mypulse")
hertzian_dipole = gprMax.HertzianDipole(polarisation="z", p1=(0.050, 0.050, 0.050), waveform_id="mypulse")
rx = gprMax.Rx(p1=(0.070, 0.070, 0.070))
# PML cases
thick = 10 # thickness
cases = {
"off": {"x0": 0, "y0": 0, "z0": 0, "xmax": 0, "ymax": 0, "zmax": 0},
"x0": {"x0": thick, "y0": 0, "z0": 0, "xmax": 0, "ymax": 0, "zmax": 0},
"y0": {"x0": 0, "y0": thick, "z0": 0, "xmax": 0, "ymax": 0, "zmax": 0},
"z0": {"x0": 0, "y0": 0, "z0": thick, "xmax": 0, "ymax": 0, "zmax": 0},
"xmax": {"x0": 0, "y0": 0, "z0": 0, "xmax": thick, "ymax": 0, "zmax": 0},
"ymax": {"x0": 0, "y0": 0, "z0": 0, "xmax": 0, "ymax": thick, "zmax": 0},
"zmax": {"x0": 0, "y0": 0, "z0": 0, "xmax": 0, "ymax": 0, "zmax": thick},
}
# PML formulation
pml_type = gprMax.PMLProps(formulation="HORIPML")
## Built-in 1st order PML
pml_cfs = gprMax.PMLCFS(
alphascalingprofile="constant",
alphascalingdirection="forward",
alphamin=0,
alphamax=0,
kappascalingprofile="constant",
kappascalingdirection="forward",
kappamin=1,
kappamax=1,
sigmascalingprofile="quartic",
sigmascalingdirection="forward",
sigmamin=0,
sigmamax=None,
)
## PMLs from http://dx.doi.org/10.1109/TAP.2011.2180344
## Standard PML
# pml_cfs = gprMax.PMLCFS(alphascalingprofile='constant',
# alphascalingdirection='forward',
# alphamin=0, alphamax=0,
# kappascalingprofile='quartic',
# kappascalingdirection='forward',
# kappamin=1, kappamax=11,
# sigmascalingprofile='quartic',
# sigmascalingdirection='forward',
# sigmamin=0, sigmamax=7.427)
## CFS PML
# pml_cfs = gprMax.PMLCFS(alphascalingprofile='constant',
# alphascalingdirection='forward',
# alphamin=0.05, alphamax=0.05,
# kappascalingprofile='quartic',
# kappascalingdirection='forward',
# kappamin=1, kappamax=7,
# sigmascalingprofile='quartic',
# sigmascalingdirection='forward',
# sigmamin=0, sigmamax=11.671)
## 2nd order RIPML
# pml_cfs1 = gprMax.PMLCFS(alphascalingprofile='constant',
# alphascalingdirection='forward',
# alphamin=0, alphamax=0,
# kappascalingprofile='constant',
# kappascalingdirection='forward',
# kappamin=1, kappamax=1,
# sigmascalingprofile='sextic',
# sigmascalingdirection='forward',
# sigmamin=0, sigmamax=0.5836)
# pml_cfs2 = gprMax.PMLCFS(alphascalingprofile='constant',
# alphascalingdirection='forward',
# alphamin=0.05, alphamax=0.05,
# kappascalingprofile='cubic',
# kappascalingdirection='forward',
# kappamin=1, kappamax=8,
# sigmascalingprofile='quadratic',
# sigmascalingdirection='forward',
# sigmamin=0, sigmamax=5.8357)
scenes = []
for k, v in cases.items():
scene = gprMax.Scene()
title = gprMax.Title(name=fn.with_suffix("").name + "_" + k)
scene.add(title)
scene.add(domain)
scene.add(dxdydz)
scene.add(time_window)
scene.add(waveform)
scene.add(hertzian_dipole)
scene.add(rx)
pml = gprMax.PMLProps(formulation="HORIPML", **v)
scene.add(pml)
scene.add(pml_cfs)
scenes.append(scene)
# Run model
gprMax.run(scenes=scenes, n=len(cases), geometry_only=False, outputfile=fn)