你已经派生过 gprMax
镜像自地址
https://gitee.com/sunhf/gprMax.git
已同步 2025-08-08 07:24:19 +08:00
Merge branch 'mpi' into refactor-create-internal-objects
这个提交包含在:
@@ -23,6 +23,7 @@ import numpy as np
|
||||
import gprMax.config as config
|
||||
|
||||
from ..cython.geometry_primitives import build_box
|
||||
from ..hash_cmds_geometry import check_averaging
|
||||
from ..materials import Material
|
||||
from .cmds_geometry import UserObjectGeometry, rotate_2point_object
|
||||
|
||||
@@ -87,6 +88,7 @@ class Box(UserObjectGeometry):
|
||||
try:
|
||||
# Try user-specified averaging
|
||||
averagebox = self.kwargs["averaging"]
|
||||
averagebox = check_averaging(averagebox)
|
||||
except KeyError:
|
||||
# Otherwise go with the grid default
|
||||
averagebox = grid.averagevolumeobjects
|
||||
|
@@ -21,6 +21,7 @@ import logging
|
||||
import numpy as np
|
||||
|
||||
from ..cython.geometry_primitives import build_cone
|
||||
from ..hash_cmds_geometry import check_averaging
|
||||
from ..materials import Material
|
||||
from .cmds_geometry import UserObjectGeometry
|
||||
|
||||
@@ -61,10 +62,11 @@ class Cone(UserObjectGeometry):
|
||||
# Check averaging
|
||||
try:
|
||||
# Try user-specified averaging
|
||||
averagecylinder = self.kwargs["averaging"]
|
||||
averagecone = self.kwargs["averaging"]
|
||||
averagecone = check_averaging(averagecone)
|
||||
except KeyError:
|
||||
# Otherwise go with the grid default
|
||||
averagecylinder = grid.averagevolumeobjects
|
||||
averagecone = grid.averagevolumeobjects
|
||||
|
||||
# Check materials have been specified
|
||||
# Isotropic case
|
||||
@@ -110,7 +112,7 @@ class Cone(UserObjectGeometry):
|
||||
|
||||
# Isotropic case
|
||||
if len(materials) == 1:
|
||||
averaging = materials[0].averagable and averagecylinder
|
||||
averaging = materials[0].averagable and averagecone
|
||||
numID = numIDx = numIDy = numIDz = materials[0].numID
|
||||
|
||||
# Uniaxial anisotropic case
|
||||
|
@@ -21,6 +21,7 @@ import logging
|
||||
import numpy as np
|
||||
|
||||
from ..cython.geometry_primitives import build_cylinder
|
||||
from ..hash_cmds_geometry import check_averaging
|
||||
from ..materials import Material
|
||||
from .cmds_geometry import UserObjectGeometry
|
||||
|
||||
@@ -59,6 +60,7 @@ class Cylinder(UserObjectGeometry):
|
||||
try:
|
||||
# Try user-specified averaging
|
||||
averagecylinder = self.kwargs["averaging"]
|
||||
averagecylinder = check_averaging(averagecylinder)
|
||||
except KeyError:
|
||||
# Otherwise go with the grid default
|
||||
averagecylinder = grid.averagevolumeobjects
|
||||
|
@@ -21,6 +21,7 @@ import logging
|
||||
import numpy as np
|
||||
|
||||
from ..cython.geometry_primitives import build_cylindrical_sector
|
||||
from ..hash_cmds_geometry import check_averaging
|
||||
from ..materials import Material
|
||||
from .cmds_geometry import UserObjectGeometry
|
||||
|
||||
@@ -74,6 +75,7 @@ class CylindricalSector(UserObjectGeometry):
|
||||
try:
|
||||
# Try user-specified averaging
|
||||
averagecylindricalsector = self.kwargs["averaging"]
|
||||
averagecylindricalsector = check_averaging(averagecylindricalsector)
|
||||
except KeyError:
|
||||
# Otherwise go with the grid default
|
||||
averagecylindricalsector = grid.averagevolumeobjects
|
||||
|
@@ -21,6 +21,7 @@ import logging
|
||||
import numpy as np
|
||||
|
||||
from ..cython.geometry_primitives import build_ellipsoid
|
||||
from ..hash_cmds_geometry import check_averaging
|
||||
from ..materials import Material
|
||||
from .cmds_geometry import UserObjectGeometry
|
||||
|
||||
@@ -60,6 +61,7 @@ class Ellipsoid(UserObjectGeometry):
|
||||
try:
|
||||
# Try user-specified averaging
|
||||
averageellipsoid = self.kwargs["averaging"]
|
||||
averageellipsoid = check_averaging(averageellipsoid)
|
||||
except KeyError:
|
||||
# Otherwise go with the grid default
|
||||
averageellipsoid = grid.averagevolumeobjects
|
||||
|
@@ -21,6 +21,7 @@ import logging
|
||||
import numpy as np
|
||||
|
||||
from ..cython.geometry_primitives import build_sphere
|
||||
from ..hash_cmds_geometry import check_averaging
|
||||
from ..materials import Material
|
||||
from .cmds_geometry import UserObjectGeometry
|
||||
|
||||
@@ -55,6 +56,7 @@ class Sphere(UserObjectGeometry):
|
||||
try:
|
||||
# Try user-specified averaging
|
||||
averagesphere = self.kwargs["averaging"]
|
||||
averagesphere = check_averaging(averagesphere)
|
||||
except KeyError:
|
||||
# Otherwise go with the grid default
|
||||
averagesphere = grid.averagevolumeobjects
|
||||
|
@@ -21,6 +21,7 @@ import logging
|
||||
import numpy as np
|
||||
|
||||
from ..cython.geometry_primitives import build_triangle
|
||||
from ..hash_cmds_geometry import check_averaging
|
||||
from ..materials import Material
|
||||
from .cmds_geometry import UserObjectGeometry, rotate_point
|
||||
|
||||
@@ -80,6 +81,7 @@ class Triangle(UserObjectGeometry):
|
||||
try:
|
||||
# Try user-specified averaging
|
||||
averagetriangularprism = self.kwargs["averaging"]
|
||||
averagetriangularprism = check_averaging(averagetriangularprism)
|
||||
except KeyError:
|
||||
# Otherwise go with the grid default
|
||||
averagetriangularprism = grid.averagevolumeobjects
|
||||
|
@@ -40,6 +40,9 @@ class Scene:
|
||||
"""Scene stores all of the user created objects."""
|
||||
|
||||
def __init__(self):
|
||||
self.multiple_cmds: List[UserObjectMulti] = []
|
||||
self.single_cmds: List[UserObjectSingle] = []
|
||||
self.geometry_cmds: List[UserObjectGeometry] = []
|
||||
self.multiple_cmds: List[UserObjectMulti] = []
|
||||
self.single_cmds: List[UserObjectSingle] = []
|
||||
self.geometry_cmds: List[UserObjectGeometry] = []
|
||||
@@ -105,6 +108,9 @@ class Scene:
|
||||
subgrid_cmds = [
|
||||
sg_cmd for sg_cmd in self.multiple_cmds if isinstance(sg_cmd, SubGridUserBase)
|
||||
]
|
||||
subgrid_cmds = [
|
||||
sg_cmd for sg_cmd in self.multiple_cmds if isinstance(sg_cmd, SubGridUserBase)
|
||||
]
|
||||
|
||||
# Iterate through the user command objects under the subgrid user object
|
||||
for sg_cmd in subgrid_cmds:
|
||||
|
@@ -43,6 +43,8 @@ class SubGridBase(UserObjectMulti):
|
||||
super().__init__(**kwargs)
|
||||
self.children_multiple: List[UserObjectMulti] = []
|
||||
self.children_geometry: List[UserObjectGeometry] = []
|
||||
self.children_multiple: List[UserObjectMulti] = []
|
||||
self.children_geometry: List[UserObjectGeometry] = []
|
||||
|
||||
def add(self, node: Union[UserObjectMulti, UserObjectGeometry]):
|
||||
"""Adds other user objects. Geometry and multi only."""
|
||||
|
@@ -0,0 +1,15 @@
|
||||
#title: Wire antenna - half-wavelength dipole in free-space
|
||||
#domain: 0.050 0.050 0.200
|
||||
#dx_dy_dz: 0.001 0.001 0.001
|
||||
#time_window: 60e-9
|
||||
|
||||
#waveform: gaussian 1 1e9 mypulse
|
||||
#transmission_line: z 0.025 0.025 0.100 73 mypulse
|
||||
|
||||
## 150mm length
|
||||
#edge: 0.025 0.025 0.025 0.025 0.025 0.175 pec
|
||||
|
||||
## 1mm gap at centre of dipole
|
||||
#edge: 0.025 0.025 0.100 0.025 0.025 0.101 free_space
|
||||
|
||||
geometry_view: 0.020 0.020 0.020 0.030 0.030 0.180 0.001 0.001 0.001 antenna_wire_dipole_fs f
|
@@ -59,6 +59,7 @@ testmodels = [
|
||||
"hertzian_dipole_fs",
|
||||
"hertzian_dipole_hs",
|
||||
"hertzian_dipole_dispersive",
|
||||
"antenna_wire_dipole_fs",
|
||||
"magnetic_dipole_fs",
|
||||
]
|
||||
|
||||
@@ -92,7 +93,11 @@ for i, model in enumerate(testmodels):
|
||||
# Arrays for storing time
|
||||
float_or_double = filetest[path + outputstest[0]].dtype
|
||||
timetest = (
|
||||
np.linspace(0, (filetest.attrs["Iterations"] - 1) * filetest.attrs["dt"], num=filetest.attrs["Iterations"])
|
||||
np.linspace(
|
||||
0,
|
||||
(filetest.attrs["Iterations"] - 1) * filetest.attrs["dt"],
|
||||
num=filetest.attrs["Iterations"],
|
||||
)
|
||||
/ 1e-9
|
||||
)
|
||||
timeref = timetest
|
||||
@@ -112,7 +117,10 @@ for i, model in enumerate(testmodels):
|
||||
|
||||
# Analytical solution of a dipole in free space
|
||||
dataref = hertzian_dipole_fs(
|
||||
filetest.attrs["Iterations"], filetest.attrs["dt"], filetest.attrs["dx_dy_dz"], rxposrelative
|
||||
filetest.attrs["Iterations"],
|
||||
filetest.attrs["dt"],
|
||||
filetest.attrs["dx_dy_dz"],
|
||||
rxposrelative,
|
||||
)
|
||||
filetest.close()
|
||||
|
||||
@@ -145,18 +153,28 @@ for i, model in enumerate(testmodels):
|
||||
# Arrays for storing time
|
||||
timeref = np.zeros((fileref.attrs["Iterations"]), dtype=float_or_doubleref)
|
||||
timeref = (
|
||||
np.linspace(0, (fileref.attrs["Iterations"] - 1) * fileref.attrs["dt"], num=fileref.attrs["Iterations"])
|
||||
np.linspace(
|
||||
0,
|
||||
(fileref.attrs["Iterations"] - 1) * fileref.attrs["dt"],
|
||||
num=fileref.attrs["Iterations"],
|
||||
)
|
||||
/ 1e-9
|
||||
)
|
||||
timetest = np.zeros((filetest.attrs["Iterations"]), dtype=float_or_doubletest)
|
||||
timetest = (
|
||||
np.linspace(0, (filetest.attrs["Iterations"] - 1) * filetest.attrs["dt"], num=filetest.attrs["Iterations"])
|
||||
np.linspace(
|
||||
0,
|
||||
(filetest.attrs["Iterations"] - 1) * filetest.attrs["dt"],
|
||||
num=filetest.attrs["Iterations"],
|
||||
)
|
||||
/ 1e-9
|
||||
)
|
||||
|
||||
# Arrays for storing field data
|
||||
dataref = np.zeros((fileref.attrs["Iterations"], len(outputsref)), dtype=float_or_doubleref)
|
||||
datatest = np.zeros((filetest.attrs["Iterations"], len(outputstest)), dtype=float_or_doubletest)
|
||||
datatest = np.zeros(
|
||||
(filetest.attrs["Iterations"], len(outputstest)), dtype=float_or_doubletest
|
||||
)
|
||||
for ID, name in enumerate(outputsref):
|
||||
dataref[:, ID] = fileref[path + str(name)][:]
|
||||
datatest[:, ID] = filetest[path + str(name)][:]
|
||||
@@ -172,7 +190,10 @@ for i, model in enumerate(testmodels):
|
||||
for i in range(len(outputstest)):
|
||||
maxi = np.amax(np.abs(dataref[:, i]))
|
||||
datadiffs[:, i] = np.divide(
|
||||
np.abs(dataref[:, i] - datatest[:, i]), maxi, out=np.zeros_like(dataref[:, i]), where=maxi != 0
|
||||
np.abs(dataref[:, i] - datatest[:, i]),
|
||||
maxi,
|
||||
out=np.zeros_like(dataref[:, i]),
|
||||
where=maxi != 0,
|
||||
) # Replace any division by zero with zero
|
||||
|
||||
# Calculate power (ignore warning from taking a log of any zero values)
|
||||
@@ -262,8 +283,12 @@ for i, model in enumerate(testmodels):
|
||||
# bbox_inches='tight', pad_inches=0.1)
|
||||
# fig2.savefig(savediffs.with_suffix('.pdf'), dpi=None, format='pdf',
|
||||
# bbox_inches='tight', pad_inches=0.1)
|
||||
fig1.savefig(file.with_suffix(".png"), dpi=150, format="png", bbox_inches="tight", pad_inches=0.1)
|
||||
fig2.savefig(filediffs.with_suffix(".png"), dpi=150, format="png", bbox_inches="tight", pad_inches=0.1)
|
||||
fig1.savefig(
|
||||
file.with_suffix(".png"), dpi=150, format="png", bbox_inches="tight", pad_inches=0.1
|
||||
)
|
||||
fig2.savefig(
|
||||
filediffs.with_suffix(".png"), dpi=150, format="png", bbox_inches="tight", pad_inches=0.1
|
||||
)
|
||||
|
||||
# Summary of results
|
||||
for name, data in sorted(testresults.items()):
|
||||
|
在新工单中引用
屏蔽一个用户