Updated PML tests to use new API

这个提交包含在:
Craig Warren
2022-11-02 21:22:53 +00:00
父节点 b9c93a0151
当前提交 513611c8c7
共有 17 个文件被更改,包括 364 次插入182 次删除

查看文件

@@ -1,14 +1,33 @@
import itertools
from operator import add
import os
import sys
# Copyright (C) 2015-2022: The University of Edinburgh, United Kingdom
# Authors: Craig Warren, Antonis Giannopoulos, and John Hartley
#
# This file is part of gprMax.
#
# gprMax is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# gprMax is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with gprMax. If not, see <http://www.gnu.org/licenses/>.
import itertools
import logging
import os
from operator import add
from pathlib import Path
from colorama import init, Fore, Style
init()
import h5py
import matplotlib.pyplot as plt
import numpy as np
logger = logging.getLogger(__name__)
# Create/setup plot figure
#colors = ['#E60D30', '#5CB7C6', '#A21797', '#A3B347'] # Plot colours from http://tools.medialab.sciences-po.fr/iwanthue/index.php
#colorIDs = ["#62a85b", "#9967c7", "#b3943f", "#6095cd", "#cb5c42", "#c95889"]
@@ -20,7 +39,7 @@ colors = itertools.cycle(colorIDs)
lines = itertools.cycle(('--', ':', '-.', '-'))
markers = ['o', 'd', '^', 's', '*']
basepath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'pml_3D_pec_plate')
basepath = Path(__file__).parent
path = 'rxs/rx1/'
refmodel = 'pml_3D_pec_plate_ref'
PMLIDs = ['CFS-PML', 'HORIPML-1', 'HORIPML-2', 'MRIPML-1', 'MRIPML-2']
@@ -30,19 +49,21 @@ testmodels = ['pml_3D_pec_plate_' + s for s in PMLIDs]
fig, ax = plt.subplots(subplot_kw=dict(xlabel='Iterations', ylabel='Error [dB]'), figsize=(20, 10), facecolor='w', edgecolor='w')
for x, model in enumerate(testmodels):
# Get output for model and reference files
fileref = h5py.File(os.path.join(basepath, refmodel + '.out'), 'r')
filetest = h5py.File(os.path.join(basepath, model + '.out'), 'r')
# Open output file and read iterations
fileref = h5py.File(basepath.joinpath(refmodel, '.h5'), 'r')
filetest = h5py.File(basepath.joinpath(model, '.h5'), 'r')
# Get available field output component names
outputsref = list(fileref[path].keys())
outputstest = list(filetest[path].keys())
if outputsref != outputstest:
raise GeneralError('Field output components do not match reference solution')
logger.exception('Field output components do not match reference solution')
raise ValueError
# Check that type of float used to store fields matches
if filetest[path + outputstest[0]].dtype != fileref[path + outputsref[0]].dtype:
print(Fore.RED + 'WARNING: Type of floating point number in test model ({}) does not match type in reference solution ({})\n'.format(filetest[path + outputstest[0]].dtype, fileref[path + outputsref[0]].dtype) + Style.RESET_ALL)
logger.warning(f'Type of floating point number in test model ({filetest[path + outputstest[0]].dtype}) '
f'does not match type in reference solution ({fileref[path + outputsref[0]].dtype})\n')
floattyperef = fileref[path + outputsref[0]].dtype
floattypetest = filetest[path + outputstest[0]].dtype
# print('Data type: {}'.format(floattypetest))
@@ -64,7 +85,8 @@ for x, model in enumerate(testmodels):
dataref[:, ID] = fileref[path + str(name)][:]
datatest[:, ID] = filetest[path + str(name)][:]
if np.any(np.isnan(datatest[:, ID])):
raise ValueError('Test data contains NaNs')
logger.exception('Test data contains NaNs')
raise ValueError
fileref.close()
filetest.close()
@@ -83,8 +105,8 @@ for x, model in enumerate(testmodels):
# Print maximum error value
start = 210
maxerrors.append(': {:.1f} [dB]'.format(np.amax(datadiffs[start::, 1])))
print('{}: Max. error {}'.format(model, maxerrors[x]))
maxerrors.append(f': {np.amax(datadiffs[start::, 1]):.1f} [dB]')
print(f'{model}: Max. error {maxerrors[x]}')
# Plot diffs (select column to choose field component, 0-Ex, 1-Ey etc..)
ax.plot(timeref[start::], datadiffs[start::, 1], color=next(colors), lw=2, ls=next(lines), label=model)
@@ -104,5 +126,5 @@ frame.set_alpha(0)
plt.show()
# Save a PDF/PNG of the figure
fig.savefig(basepath + '.pdf', dpi=None, format='pdf', bbox_inches='tight', pad_inches=0.1)
#fig.savefig(basepath + '.pdf', dpi=None, format='pdf', bbox_inches='tight', pad_inches=0.1)
#fig.savefig(savename + '.png', dpi=150, format='png', bbox_inches='tight', pad_inches=0.1)

查看文件

@@ -0,0 +1,143 @@
from pathlib import Path
import gprMax
import numpy as np
# File path for output
fn = Path(__file__)
parts = fn.parts
# Discretisation
dl = 0.001
# Domain
x = 0.051
y = 0.126
z = 0.026
domain = gprMax.Domain(p1=(x, y, z))
dxdydz = gprMax.Discretisation(p1=(dl, dl, dl))
time_window = gprMax.TimeWindow(iterations=2100)
tssf = gprMax.TimeStepStabilityFactor(f=0.99)
waveform = gprMax.Waveform(wave_type='gaussiandotnorm', amp=1, freq=9.42e9, id='mypulse')
hertzian_dipole = gprMax.HertzianDipole(polarisation='z',
p1=(0.013, 0.013, 0.014),
waveform_id='mypulse')
rx = gprMax.Rx(p1=(0.038, 0.114, 0.013))
plate = gprMax.Plate(p1=(0.013, 0.013, 0.013),
p2=(0.038, 0.113, 0.013), material_id='pec')
gv1 = gprMax.GeometryView(p1=(0, 0, 0), p2=(x, y, z), dl=(dl, dl, dl),
filename=Path(*parts[:-1], parts[-1] + '_n'), output_type='n')
gv2 = gprMax.GeometryView(p1=(0, 0, 0), p2=(x, y, z), dl=(dl, dl, dl),
filename=Path(*parts[:-1], parts[-1] + '_f'), output_type='f')
pmls = {'CFS-PML': {'pml_type': gprMax.PMLFormulation(pml='HORIPML'),
# Parameters from http://dx.doi.org/10.1109/TAP.2018.2823864
'pml_cfs': [gprMax.PMLCFS(alphascalingprofile='constant',
alphascalingdirection='forward',
alphamin=0.05, alphamax=0.05,
kappascalingprofile='quartic',
kappascalingdirection='forward',
kappamin=1, kappamax=8,
sigmascalingprofile='quartic',
sigmascalingdirection='forward',
sigmamin=0,
sigmamax=1.1 * ((4 + 1) / (150 * np.pi * dl)))]},
'HORIPML-1': {'pml_type': gprMax.PMLFormulation(pml='HORIPML'),
# Parameters from http://dx.doi.org/10.1109/TAP.2011.2180344
'pml_cfs': [gprMax.PMLCFS(alphascalingprofile='constant',
alphascalingdirection='forward',
alphamin=0, alphamax=0,
kappascalingprofile='quartic',
kappascalingdirection='forward',
kappamin=1, kappamax=12,
sigmascalingprofile='quartic',
sigmascalingdirection='forward',
sigmamin=0,
sigmamax=0.7 * ((4 + 1) / (150 * np.pi * dl)))]},
'HORIPML-2': {'pml_type': gprMax.PMLFormulation(pml='HORIPML'),
# Parameters from http://dx.doi.org/10.1109/TAP.2018.2823864
'pml_cfs': [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.275 / (150 * np.pi * dl)),
gprMax.PMLCFS(alphascalingprofile='sextic',
alphascalingdirection='forward',
alphamin=0.07, alphamax=0.07 + (0.275 / (150 * np.pi * dl)),
kappascalingprofile='cubic',
kappascalingdirection='forward',
kappamin=1, kappamax=8,
sigmascalingprofile='quadratic',
sigmascalingdirection='forward',
sigmamin=0,
sigmamax=2.75 / (150 * np.pi * dl))]},
'MRIPML-1': {'pml_type': gprMax.PMLFormulation(pml='MRIPML'),
# Parameters from Antonis' MATLAB script (M3Dparams.m)
'pml_cfs': [gprMax.PMLCFS(alphascalingprofile='constant',
alphascalingdirection='forward',
alphamin=0.05, alphamax=0.05,
kappascalingprofile='quartic',
kappascalingdirection='forward',
kappamin=1, kappamax=8,
sigmascalingprofile='quartic',
sigmascalingdirection='forward',
sigmamin=0,
sigmamax=1.1 * ((4 + 1) / (150 * np.pi * dl)))]},
'MRIPML-2': {'pml_type': gprMax.PMLFormulation(pml='MRIPML'),
# Parameters from http://dx.doi.org/10.1109/TAP.2018.2823864
'pml_cfs': [gprMax.PMLCFS(alphascalingprofile='quadratic',
alphascalingdirection='reverse',
alphamin=0, alphamax=0.15,
kappascalingprofile='quartic',
kappascalingdirection='forward',
kappamin=1, kappamax=12,
sigmascalingprofile='quartic',
sigmascalingdirection='forward',
sigmamin=0,
sigmamax=0.65 * ((4 + 1) / (150 * np.pi * dl))),
gprMax.PMLCFS(alphascalingprofile='linear',
alphascalingdirection='reverse',
alphamin=0.07, alphamax=0.8,
kappascalingprofile='constant',
kappascalingdirection='forward',
kappamin=0, kappamax=0,
sigmascalingprofile='quadratic',
sigmascalingdirection='forward',
sigmamin=0,
sigmamax=0.65 * ((2 + 1) / (150 * np.pi * dl)))]}
}
scenes = []
for k, v in pmls.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(tssf)
scene.add(waveform)
scene.add(hertzian_dipole)
scene.add(rx)
# scene.add(gv1)
# scene.add(gv2)
pml_cells = gprMax.PMLCells(thickness=10)
scene.add(pml_cells)
scene.add(v['pml_type'])
for pml_cfs in v['pml_cfs']:
scene.add(pml_cfs)
scenes.append(scene)
# Run model
gprMax.run(scenes=scenes, n=len(pmls), geometry_only=False, outputfile=fn)

二进制文件未显示。

二进制文件未显示。

二进制文件未显示。

二进制文件未显示。

二进制文件未显示。

二进制文件未显示。

查看文件

@@ -0,0 +1,70 @@
from pathlib import Path
import gprMax
import numpy as np
# File path for output
fn = Path(__file__)
parts = fn.parts
# Discretisation
dl = 0.001
# Domain
x = 0.201
y = 0.276
z = 0.176
domain = gprMax.Domain(p1=(x, y, z))
dxdydz = gprMax.Discretisation(p1=(dl, dl, dl))
time_window = gprMax.TimeWindow(iterations=2100)
tssf = gprMax.TimeStepStabilityFactor(f=0.99)
waveform = gprMax.Waveform(wave_type='gaussiandotnorm', amp=1, freq=9.42e9, id='mypulse')
hertzian_dipole = gprMax.HertzianDipole(polarisation='z',
p1=(0.088, 0.088, 0.089),
waveform_id='mypulse')
rx = gprMax.Rx(p1=(0.113, 0.189, 0.088))
plate = gprMax.Plate(p1=(0.088, 0.088, 0.088),
p2=(0.113, 0.188, 0.088), material_id='pec')
gv1 = gprMax.GeometryView(p1=(0, 0, 0), p2=(x, y, z), dl=(dl, dl, dl),
filename=Path(*parts[:-1], parts[-1] + '_n'), output_type='n')
gv2 = gprMax.GeometryView(p1=(0, 0, 0), p2=(x, y, z), dl=(dl, dl, dl),
filename=Path(*parts[:-1], parts[-1] + '_f'), output_type='f')
pml_type = gprMax.PMLFormulation(pml='HORIPML')
pml_cells = gprMax.PMLCells(thickness=10)
# Parameters from http://dx.doi.org/10.1109/TAP.2018.2823864
pml_cfs = gprMax.PMLCFS(alphascalingprofile='constant',
alphascalingdirection='forward',
alphamin=0.05, alphamax=0.05,
kappascalingprofile='quartic',
kappascalingdirection='forward',
kappamin=1, kappamax=8,
sigmascalingprofile='quartic',
sigmascalingdirection='forward',
sigmamin=0,
sigmamax=1.1 * ((4 + 1) / (150 * np.pi * dl)))
scene = gprMax.Scene()
title = gprMax.Title(name=fn.with_suffix('').name + '_ref')
scene.add(title)
scene.add(domain)
scene.add(dxdydz)
scene.add(time_window)
scene.add(tssf)
scene.add(waveform)
scene.add(hertzian_dipole)
scene.add(rx)
# scene.add(gv1)
# scene.add(gv2)
scene.add(pml_cells)
scene.add(pml_type)
scene.add(pml_cfs)
# Run model
gprMax.run(scenes=[scene], geometry_only=False, outputfile=fn)

113
tests/models_pmls/pml_basic.py 可执行文件
查看文件

@@ -0,0 +1,113 @@
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.PMLFormulation(pml='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_cells = gprMax.PMLCells(**v)
scene.add(pml_cells)
scene.add(pml_type)
scene.add(pml_cfs)
scenes.append(scene)
# Run model
gprMax.run(scenes=scenes, n=len(cases), geometry_only=False, outputfile=fn)

查看文件

@@ -1,10 +0,0 @@
#title: PML test none
#domain: 0.100 0.100 0.100
#dx_dy_dz: 0.001 0.001 0.001
#time_window: 3e-9
#waveform: gaussiandot 1 1e9 myWave
#hertzian_dipole: z 0.050 0.050 0.050 myWave
#rx: 0.070 0.070 0.070
#pml_cells: 0

查看文件

@@ -1,26 +0,0 @@
#title: PML test x0 slab
#domain: 0.100 0.100 0.100
#dx_dy_dz: 0.001 0.001 0.001
#time_window: 3e-9
#waveform: gaussiandot 1 1e9 myWave
#hertzian_dipole: z 0.050 0.050 0.050 myWave
#rx: 0.070 0.070 0.070
#pml_cells: 10 0 0 0 0 0
#pml_formulation: HORIPML
## Built-in 1st order PML
#pml_cfs: constant forward 0 0 constant forward 1 1 quartic forward 0 None
## PMLs from http://dx.doi.org/10.1109/TAP.2011.2180344
## Standard PML
pml_cfs: constant forward 0 0 quartic forward 1 11 quartic forward 0 7.427
## CFS PML
pml_cfs: constant forward 0.05 0.05 quartic forward 1 7 quartic forward 0 11.671
## 2nd order RIPML
pml_cfs: constant forward 0 0 constant forward 1 1 sextic forward 0 0.5836
pml_cfs: constant forward 0.05 0.05 cubic forward 1 8 quadratic forward 0 5.8357

查看文件

@@ -1,26 +0,0 @@
#title: PML test xmax slab
#domain: 0.100 0.100 0.100
#dx_dy_dz: 0.001 0.001 0.001
#time_window: 3e-9
#waveform: gaussiandot 1 1e9 myWave
#hertzian_dipole: z 0.050 0.050 0.050 myWave
#rx: 0.070 0.070 0.070
#pml_cells: 0 0 0 10 0 0
#pml_formulation: HORIPML
## Built-in 1st order PML
#pml_cfs: constant forward 0 0 constant forward 1 1 quartic forward 0 None
## PMLs from http://dx.doi.org/10.1109/TAP.2011.2180344
## Standard PML
pml_cfs: constant forward 0 0 quartic forward 1 11 quartic forward 0 7.427
## CFS PML
pml_cfs: constant forward 0.05 0.05 quartic forward 1 7 quartic forward 0 11.671
## 2nd order RIPML
pml_cfs: constant forward 0 0 constant forward 1 1 sextic forward 0 0.5836
pml_cfs: constant forward 0.05 0.05 cubic forward 1 8 quadratic forward 0 5.8357

查看文件

@@ -1,26 +0,0 @@
#title: PML test y0 slab
#domain: 0.100 0.100 0.100
#dx_dy_dz: 0.001 0.001 0.001
#time_window: 3e-9
#waveform: gaussiandot 1 1e9 myWave
#hertzian_dipole: z 0.050 0.050 0.050 myWave
#rx: 0.070 0.070 0.070
#pml_cells: 0 10 0 0 0 0
#pml_formulation: HORIPML
## Built-in 1st order PML
#pml_cfs: constant forward 0 0 constant forward 1 1 quartic forward 0 None
## PMLs from http://dx.doi.org/10.1109/TAP.2011.2180344
## Standard PML
pml_cfs: constant forward 0 0 quartic forward 1 11 quartic forward 0 7.427
## CFS PML
pml_cfs: constant forward 0.05 0.05 quartic forward 1 7 quartic forward 0 11.671
## 2nd order RIPML
pml_cfs: constant forward 0 0 constant forward 1 1 sextic forward 0 0.5836
pml_cfs: constant forward 0.05 0.05 cubic forward 1 8 quadratic forward 0 5.8357

查看文件

@@ -1,26 +0,0 @@
#title: PML test ymax slab
#domain: 0.100 0.100 0.100
#dx_dy_dz: 0.001 0.001 0.001
#time_window: 3e-9
#waveform: gaussiandot 1 1e9 myWave
#hertzian_dipole: z 0.050 0.050 0.050 myWave
#rx: 0.070 0.070 0.070
#pml_cells: 0 0 0 0 10 0
#pml_formulation: HORIPML
## Built-in 1st order PML
#pml_cfs: constant forward 0 0 constant forward 1 1 quartic forward 0 None
## PMLs from http://dx.doi.org/10.1109/TAP.2011.2180344
## Standard PML
pml_cfs: constant forward 0 0 quartic forward 1 11 quartic forward 0 7.427
## CFS PML
pml_cfs: constant forward 0.05 0.05 quartic forward 1 7 quartic forward 0 11.671
## 2nd order RIPML
pml_cfs: constant forward 0 0 constant forward 1 1 sextic forward 0 0.5836
pml_cfs: constant forward 0.05 0.05 cubic forward 1 8 quadratic forward 0 5.8357

查看文件

@@ -1,26 +0,0 @@
#title: PML test z0 slab
#domain: 0.100 0.100 0.100
#dx_dy_dz: 0.001 0.001 0.001
#time_window: 3e-9
#waveform: gaussiandot 1 1e9 myWave
#hertzian_dipole: z 0.050 0.050 0.050 myWave
#rx: 0.070 0.070 0.070
#pml_cells: 0 0 10 0 0 0
#pml_formulation: HORIPML
## Built-in 1st order PML
#pml_cfs: constant forward 0 0 constant forward 1 1 quartic forward 0 None
## PMLs from http://dx.doi.org/10.1109/TAP.2011.2180344
## Standard PML
pml_cfs: constant forward 0 0 quartic forward 1 11 quartic forward 0 7.427
## CFS PML
pml_cfs: constant forward 0.05 0.05 quartic forward 1 7 quartic forward 0 11.671
## 2nd order RIPML
pml_cfs: constant forward 0 0 constant forward 1 1 sextic forward 0 0.5836
pml_cfs: constant forward 0.05 0.05 cubic forward 1 8 quadratic forward 0 5.8357

查看文件

@@ -1,26 +0,0 @@
#title: PML test zmax slab
#domain: 0.100 0.100 0.100
#dx_dy_dz: 0.001 0.001 0.001
#time_window: 3e-9
#waveform: gaussiandot 1 1e9 myWave
#hertzian_dipole: z 0.050 0.050 0.050 myWave
#rx: 0.070 0.070 0.070
#pml_cells: 0 0 0 0 0 10
#pml_formulation: HORIPML
## Built-in 1st order PML
#pml_cfs: constant forward 0 0 constant forward 1 1 quartic forward 0 None
## PMLs from http://dx.doi.org/10.1109/TAP.2011.2180344
## Standard PML
pml_cfs: constant forward 0 0 quartic forward 1 11 quartic forward 0 7.427
## CFS PML
pml_cfs: constant forward 0.05 0.05 quartic forward 1 7 quartic forward 0 11.671
## 2nd order RIPML
pml_cfs: constant forward 0 0 constant forward 1 1 sextic forward 0 0.5836
pml_cfs: constant forward 0.05 0.05 cubic forward 1 8 quadratic forward 0 5.8357